[RFC] building postgres with meson

Started by Andres Freundover 4 years ago392 messages
#1Andres Freund
andres@anarazel.de
17 attachment(s)

Hi,

For the last year or so I've on and off tinkered with $subject. I think
it's in a state worth sharing now. First, let's look at a little
comparison.

My workstation:

non-cached configure:
current: 11.80s
meson: 6.67s

non-cached build (world-bin):
current: 40.46s
ninja: 7.31s

no-change build:
current: 1.17s
ninja: 0.06s

test world:
current: 105s
meson: 63s

What actually started to motivate me however were the long times windows
builds took to come back with testsresults. On CI, with the same machine
config:

build:
current: 202s (doesn't include genbki etc)
meson+ninja: 140s
meson+msbuild: 206s

test:
current: 1323s (many commands)
meson: 903s (single command)

(note that the test comparison isn't quite fair - there's a few tests
missing, but it's just small contrib ones afaik)

The biggest difference to me however is not the speed, but how readable
the output is.

Running the tests with meson in a terminal, shows the number of tests
that completed out of how many total, how much time has passed, how long
the currently running tests already have been running.

At the end of a testrun a count of tests is shown:

188/189 postgresql:tap+pg_basebackup / pg_basebackup/t/010_pg_basebackup.pl OK 39.51s 110 subtests passed
189/189 postgresql:isolation+snapshot_too_old / snapshot_too_old/isolation OK 62.93s

Ok: 188
Expected Fail: 0
Fail: 1
Unexpected Pass: 0
Skipped: 0
Timeout: 0

Full log written to /tmp/meson/meson-logs/testlog.txt

The log has the output of the tests and ends with:

Summary of Failures:
120/189 postgresql:tap+recovery / recovery/t/007_sync_rep.pl ERROR 7.16s (exit status 255 or signal 127 SIGinvalid)

Quite the difference to make check-world -jnn output.

So, now that the teasing is done, let me explain a bit what lead me down
this path:

Autoconf + make is not being actively developed. Especially autoconf is
*barely* in maintenance mode - despite many shortcomings and bugs. It's
also technology that very few want to use - autoconf m4 is scary, and
it's scarier for people that started more recently than a lot of us
committers for example.

Recursive make as we use it is hard to get right. One reason the clean
make build is so slow compared to meson is that we had to resort to
.NOTPARALLEL to handle dependencies in a bunch of places. And despite
that, I quite regularly see incremental build failures that can be
resolved by retrying the build.

While we have incremental build via --enable-depend, they don't work
that reliable (i.e. misses necessary rebuilds) and yet is often too
aggressive. More modern build system can keep track of the precise
command used to build a target and rebuild it when that command changes.

We also don't just have the autoconf / make buildsystem, there's also
the msvc project generator - something most of us unix-y folks do not
like to touch. I think that, combined with there being no easy way to
run all tests, and it being just different, really hurt our windows
developer appeal (and subsequently the quality of postgres on
windows). I'm not saying this to ding the project generator - that was
well before there were decent "meta" buildsystems out there (and in some
ways it is a small one itself).

The last big issue I have with the current situation is that there's no
good test integration. make check-world output is essentially unreadable
/ not automatically parseable. Which led to the buildfarm having a
separate list of things it needs to test, so that failures can be
pinpointed and paired with appropriate logs. That approach unfortunately
doesn't scale well to multi-core CPUs, slowing down the buildfarm by a
fair bit.

This all led to me to experiment with improvements. I tried a few
somewhat crazy but incremental things like converting our buildsystem to
non-recursive make (I got it to build the backend, but it's too hard to
do manually I think), or to not run tests during the recursive make
check-world, but to append commands to a list of tests, that then is run
by a helper (can kinda be made to work). In the end I concluded that
the amount of time we'd need to invest to maintain our more-and-more
custom buildsystem going forward doesn't make sense.

Which lead me to look around and analyze which other buildsystems there
are that could make some sense for us. The halfway decent list includes,
I think:
1) cmake
2) bazel
3) meson

cmake would be a decent choice, I think. However, I just can't fully
warm up to it. Something about it just doesn't quite sit right with
me. That's not a good enough reason to prevent others from suggesting to
use it, but it's good enough to justify not investing a lot of time in
it myself.

Bazel has some nice architectural properties. But it requires a JVM to
run - I think that basically makes it insuitable for us. And the build
information seems quite arduous to maintain too.

Which left me with meson. It is a meta-buildsystem that can do the
actual work of building via ninja (the most common one, also targeted by
cmake), msbuild (visual studio project files, important for GUI work)
and xcode projects (I assume that's for a macos IDE, but I haven't tried
to use it). Meson roughly does what autoconf+automake did, in a
python-esque DSL, and outputs build-instructions for ninja / msbuild /
xcode. One interesting bit is that meson itself is written in python (
and fairly easy to contribute too - I got a few changes in now).

I don't think meson is perfect architecturally - e.g. its insistence on
not having functions ends up making it a bit harder to not end up
duplicating code. There's some user-interface oddities that are now hard
to fix fully, due to the faily wide usage. But all-in-all it's pretty
nice to use.

Its worth calling out that a lot of large open source projects have been
/ are migrating to meson. qemu/kvm, mesa (core part of graphics stack on
linux and also widely used in other platforms), a good chunk of GNOME,
and quite a few more. Due to that it seems unlikely to be abandoned
soon.

As far as I can tell the only OS that postgres currently supports that
meson doesn't support is HPUX. It'd likely be fairly easy to add
gcc-on-hpux support, a chunk more to add support for the proprietary
ones.

The attached patch (meson support is 0016, the rest is prerequisites
that aren't that interesting at this stage) converts most of postgres to
meson. There's a few missing contrib modules, only about half the
optional library dependencies are implemented, and I've only built on
x64. It builds on freebsd, linux, macos and windows (both ninja and
msbuild) and cross builds from linux to windows. Thomas helped make the
freebsd / macos pieces a reality, thanks!

I took a number of shortcuts (although there used to be a *lot*
more). So this shouldn't be reviewed to the normal standard of the
community - it's a prototype. But I think it's in a complete enough
shape that it allows to do a well-informed evaluation.

What doesn't yet work/ build:

- plenty optional libraries, contrib, NLS, docs build

- PGXS - and I don't yet know what to best do about it. One
backward-compatible way would be to continue use makefiles for pgxs,
but do the necessary replacement of Makefile.global.in via meson (and
not use that for postgres' own build). But that doesn't really
provide a nicer path for building postgres extensions on windows, so
it'd definitely not be a long-term path.

- JIT bitcode generation for anything but src/backend.

- anything but modern-ish x86. That's proably a small amount of work,
but something that needs to be done.

- exporting all symbols for extension modules on windows (the stuff for
postgres is implemented). Instead I marked the relevant symbols als
declspec(dllexport). I think we should do that regardless of the
buildsystem change. Restricting symbol visibility via gcc's
-fvisibility=hidden for extensions results in a substantially reduced
number of exported symbols, and even reduces object size (and I think
improves the code too). I'll send an email about that separately.

There's a lot more stuff to talk about, but I'll stop with a small bit
of instructions below:

Demo / instructions:
# Get code
git remote add andres git@github.com:anarazel/postgres.git
git fetch andres
git checkout --track andres/meson

# setup build directory
meson setup build --buildtype debug
cd build

# build (uses automatically as many cores as available)
ninja

# change configuration, build again
meson configure -Dssl=openssl
ninja

# run all tests
meson test

# run just recovery tests
meson test --suite setup --suite recovery

# list tests
meson test --list

Greetings,

Andres Freund

Attachments:

v3-0001-ci-backend-windows-DONTMERGE-crash-reporting-back.patchtext/x-diff; charset=us-asciiDownload
From a9b4a00a55d29fbfc96b81b0dd568a0cf9f61c20 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 9 Sep 2021 17:49:39 -0700
Subject: [PATCH v3 01/17] ci: backend: windows: DONTMERGE: crash reporting
 (backend).

---
 src/backend/main/main.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index ad84a45e28c..65a325723fd 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -26,6 +26,10 @@
 #include <sys/param.h>
 #endif
 
+#if defined(WIN32)
+#include <crtdbg.h>
+#endif
+
 #if defined(_M_AMD64) && _MSC_VER == 1800
 #include <math.h>
 #include <versionhelpers.h>
@@ -238,7 +242,15 @@ startup_hacks(const char *progname)
 		}
 
 		/* In case of general protection fault, don't show GUI popup box */
-		SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+		SetErrorMode(SEM_FAILCRITICALERRORS /* | SEM_NOGPFAULTERRORBOX */);
+
+		_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+		_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+		_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+		_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+#ifndef __MINGW64__
+		_set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG, _CALL_REPORTFAULT | _WRITE_ABORT_MSG);
+#endif
 
 #if defined(_M_AMD64) && _MSC_VER == 1800
 
-- 
2.23.0.385.gbc12974a89

v3-0002-ci-Add-CI-for-FreeBSD-Linux-MacOS-and-Windows-uti.patchtext/x-diff; charset=us-asciiDownload
From 7a364ae12c87f2523576f1a309ef688962f3d047 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 15 Mar 2021 09:25:15 -0700
Subject: [PATCH v3 02/17] ci: Add CI for FreeBSD, Linux, MacOS and Windows,
 utilizing cirrus-ci.

---
 .cirrus.yml                     | 395 ++++++++++++++++++++++++++++++++
 .dockerignore                   |   3 +
 ci/docker/linux_debian_bullseye |  13 ++
 ci/docker/windows_vs_2019       | 105 +++++++++
 ci/freebsd_gcp_repartition.sh   |  28 +++
 ci/pg_ci_base.conf              |  12 +
 ci/windows_build_config.pl      |  10 +
 7 files changed, 566 insertions(+)
 create mode 100644 .cirrus.yml
 create mode 100644 .dockerignore
 create mode 100644 ci/docker/linux_debian_bullseye
 create mode 100644 ci/docker/windows_vs_2019
 create mode 100755 ci/freebsd_gcp_repartition.sh
 create mode 100644 ci/pg_ci_base.conf
 create mode 100644 ci/windows_build_config.pl

diff --git a/.cirrus.yml b/.cirrus.yml
new file mode 100644
index 00000000000..f75bdce6dec
--- /dev/null
+++ b/.cirrus.yml
@@ -0,0 +1,395 @@
+env:
+  # accelerate initial clone, but a bit of depth so that concurrent tasks work
+  CIRRUS_CLONE_DEPTH: 100
+  # Useful to be able to analyse what in a script takes long
+  CIRRUS_LOG_TIMESTAMP: true
+  # target to test, for all but windows
+  CHECK: check-world
+  CHECKFLAGS: -Otarget
+  PGCTLTIMEOUT: 120
+  CCACHE_MAXSIZE: "500M"
+  TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
+  PG_TEST_EXTRA: kerberos ldap ssl
+
+
+task:
+  name: FreeBSD
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
+  compute_engine_instance:
+    image_project: pg-vm-images-aio
+    image: family/pg-aio-freebsd-13-0
+    platform: freebsd
+    cpu: 2
+    memory: 2G
+    disk: 50
+  env:
+    CCACHE_DIR: "/tmp/ccache_dir"
+
+  ccache_cache:
+    folder: "/tmp/ccache_dir"
+  sysinfo_script:
+    - export || true
+  sysconfig_script:
+    - sudo sysctl kern.corefile='/tmp/%N.%P.core'
+  repartition_script:
+    - ci/freebsd_gcp_repartition.sh
+  create_user_script:
+    - pw useradd postgres
+    - chown -R postgres:postgres .
+    - mkdir -p /tmp/ccache_dir
+    - chown -R postgres:postgres /tmp/ccache_dir
+
+  configure_script: |
+    su postgres -c './configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-ssl=openssl \
+      --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+      --with-uuid=bsd \
+      \
+      --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+      CC="ccache cc"'
+  build_script:
+    - su postgres -c 'gmake -s -j3 && gmake -s -j3 -C contrib'
+  upload_caches:
+    - ccache
+
+  tests_script:
+    - su postgres -c 'time gmake -s -j2 ${CHECK} ${CHECKFLAGS}'
+
+  on_failure:
+    cores_script: |
+      for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do
+        binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECPATH | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ;
+        echo dumping $corefile for $binary ;
+        gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile;
+      done
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: Linux
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+  compute_engine_instance:
+    image_project: pg-vm-images-aio
+    image: family/pg-aio-bullseye
+    platform: linux
+    cpu: 4
+    memory: 2G
+    nested_virtualization: false
+  env:
+    CCACHE_DIR: "/tmp/ccache_dir"
+    DEBUGINFOD_URLS: "https://debuginfod.debian.net"
+
+  ccache_cache:
+    folder: "/tmp/ccache_dir"
+
+  sysinfo_script:
+    - id
+    - uname -a
+    - cat /proc/cmdline
+    - lsblk
+    - ulimit -a -H
+    - ulimit -a -S
+    - export
+  sysconfig_script:
+    - useradd -m postgres
+    - chown -R postgres:postgres .
+    - mkdir -p /tmp/ccache_dir
+    - chown -R postgres:postgres /tmp/ccache_dir
+    - echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
+    - su postgres -c 'ulimit -l -H'
+    - su postgres -c 'ulimit -l -S'
+    - echo '/tmp/%e-%s-%p.core' > /proc/sys/kernel/core_pattern
+
+  configure_script: |
+    su postgres -c './configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-gssapi \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      --with-llvm \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-ssl=openssl \
+      --with-systemd \
+      --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"'
+  build_script:
+    - su postgres -c 'make -s -j4 && make -s -j4 -C contrib'
+  upload_caches:
+    - ccache
+
+  tests_script: |
+    su postgres -c '\
+      ulimit -c unlimited; \
+      make -s ${CHECK} ${CHECKFLAGS} -j8 \
+      '
+
+  on_failure:
+    cores_script: |
+      for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do
+        binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECFN | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ;
+        echo dumping $corefile for $binary ;
+        gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile ;
+      done
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: macOS
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
+  osx_instance:
+    image: big-sur-base
+  env:
+    CIRRUS_WORKING_DIR: ${HOME}/pgsql/
+    TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
+    CCACHE_DIR: ${HOME}/ccache
+    HOMEBREW_CACHE: ${HOME}/homebrew-cache
+    PERL5LIB: ${HOME}/perl5/lib/perl5
+
+  sysinfo_script:
+    - id
+    - export
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+  homebrew_cache:
+    folder: ${HOMEBREW_CACHE}
+  perl_cache:
+    folder: ~/perl5
+
+  cpan_install_script:
+    - perl -mIPC::Run -e 1 || cpan -T IPC::Run
+    - perl -mIO::Pty -e 1 || cpan -T IO::Pty
+  upload_caches:
+    - perl
+  core_install_script:
+    - sudo chmod 777 /cores
+  homebrew_install_script:
+    - brew install make coreutils ccache icu4c lz4 tcl-tk openldap
+  upload_caches:
+    - homebrew
+
+  configure_script: |
+    LIBS="/usr/local/lib:$LIBS"
+    INCLUDES="/usr/local/include:$INCLUDES"
+
+    INCLUDES="/usr/local/opt/openssl/include:$INCLUDES"
+    LIBS="/usr/local/opt/openssl/lib:$LIBS"
+
+    PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
+    INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES"
+    LIBS="/usr/local/opt/icu4c/lib:$LIBS"
+
+    LIBS="/usr/local/opt/openldap/lib:$LIBS"
+    INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
+
+    export PKG_CONFIG_PATH
+
+    ./configure \
+      --prefix=$HOME/install \
+      --with-includes="$INCLUDES" \
+      --with-libs="$LIBS" \
+      \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      \
+      --with-lz4 \
+      --with-perl \
+      --with-python \
+      --with-ssl=openssl \
+      --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc" CFLAGS="-O0 -ggdb"
+  build_script:
+    - gmake -s -j12 && gmake -s -j12 -C contrib
+  upload_caches:
+    - ccache
+
+  tests_script:
+    - ulimit -c unlimited
+    - ulimit -n 1024
+    - gmake -s -j12 ${CHECK} ${CHECKFLAGS}
+
+  on_failure:
+    cores_script: |
+      for corefile in $(find /cores/ -name 'core.*' 2>/dev/null) ; do
+        lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit' ;
+      done
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: Windows
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*'
+  windows_container:
+    dockerfile: ci/docker/windows_vs_2019
+    cpu: 4
+    memory: 4G
+  env:
+    PROVE_FLAGS: -j10
+    # The default working dir is in a directory msbuild complains about
+    CIRRUS_WORKING_DIR: "c:/cirrus"
+    TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
+    # Avoid re-installing over and over
+    NO_TEMP_INSTALL: 1
+
+  sysinfo_script:
+    - chcp
+    - systeminfo
+    - powershell -Command get-psdrive -psprovider filesystem
+    - ps: Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug'
+    - set
+
+  configure_script:
+    - copy ci\windows_build_config.pl src\tools\msvc\config.pl
+    - vcvarsall x64
+    - perl src/tools/msvc/mkvcbuild.pl
+  build_script:
+    - vcvarsall x64
+    # Disable file tracker, we're never going to rebuild...
+    - msbuild -m /p:TrackFileAccess=false pgsql.sln
+  tempinstall_script:
+    # Installation on windows currently only completely works from src\tools\msvc
+    - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install
+
+  check_test_script:
+    - perl src/tools/msvc/vcregress.pl check parallel
+  startcreate_test_script:
+    - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log
+    - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf
+    - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log
+  plcheck_test_script:
+    - perl src/tools/msvc/vcregress.pl plcheck
+  isolationcheck_test_script:
+    - perl src/tools/msvc/vcregress.pl isolationcheck
+  modulescheck_test_script:
+    - perl src/tools/msvc/vcregress.pl modulescheck
+  contribcheck_test_script:
+    - perl src/tools/msvc/vcregress.pl contribcheck
+  stop_test_script:
+    - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log
+  ssl_test_script:
+    - set with_ssl=openssl
+    - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\
+  subscriptioncheck_test_script:
+    - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\
+  authentication_test_script:
+    - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\
+  recoverycheck_test_script:
+    - perl src/tools/msvc/vcregress.pl recoverycheck
+  bincheck_test_script:
+    - perl src/tools/msvc/vcregress.pl bincheck
+  upgradecheck_test_script:
+    - perl src/tools/msvc/vcregress.pl upgradecheck
+  ecpgcheck_test_script:
+    # tries to build additional stuff
+    - vcvarsall x64
+    # References ecpg_regression.proj in the current dir
+    - cd src\tools\msvc
+    - perl vcregress.pl ecpgcheck
+
+  always:
+    cores_script:
+      - cat crashlog.txt || true
+    dump_artifacts:
+      path: "crashlog.txt"
+      type: text/plain
+
+  on_failure:
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: CompilerWarnings
+  depends_on:
+    - Linux
+  # task that did not run count as a success, so we need to recheck Linux' condition here :/
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+  container:
+    dockerfile: ci/docker/linux_debian_bullseye
+  env:
+    CCACHE_SIZE: "4GB"
+    CCACHE_DIR: "/tmp/ccache_dir"
+  ccache_cache:
+    folder: "/tmp/ccache_dir"
+  setup_script:
+    - echo "COPT=-Werror" > src/Makefile.custom
+    - gcc -v
+    - clang -v
+  # gcc with asserts disabled
+  always:
+    gcc_warning_script:
+      - ./configure --cache gcc.cache CC="ccache gcc"
+      - time make -s -j4 clean && time make -s -j4
+  # gcc with asserts enabled
+  always:
+    gcc_a_warning_script:
+      - ./configure --cache gcc.cache --enable-cassert CC="ccache gcc"
+      - time make -s -j4 clean && time make -s -j4
+  # clang with asserts disabled
+  always:
+    clang_warning_script:
+      - ./configure --cache clang.cache CC="ccache clang"
+      - time make -s -j4 clean && time make -s -j4
+  # clang with asserts enabled
+  always:
+    clang_a_warning_script:
+      - ./configure --cache clang.cache --enable-cassert CC="ccache clang"
+      - time make -s -j4 clean && time make -s -j4
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000000..3fceab2e97b
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,3 @@
+# Ignore everything, except ci/
+*
+!ci/*
diff --git a/ci/docker/linux_debian_bullseye b/ci/docker/linux_debian_bullseye
new file mode 100644
index 00000000000..f6c1782f16b
--- /dev/null
+++ b/ci/docker/linux_debian_bullseye
@@ -0,0 +1,13 @@
+FROM debian:bullseye
+RUN \
+  apt-get -y update && \
+  apt-get -y upgrade && \
+  DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+    git build-essential gcc g++ libreadline-dev flex bison make perl libipc-run-perl \
+    libio-pty-perl clang llvm-dev libperl-dev libpython3-dev tcl-dev libldap2-dev \
+    libicu-dev docbook-xml docbook-xsl fop libxml2-utils xsltproc krb5-admin-server \
+    krb5-kdc krb5-user slapd ldap-utils libssl-dev pkg-config locales-all liblz4-dev \
+    libsystemd-dev libxml2-dev libxslt1-dev python3-dev libkrb5-dev libpam-dev \
+    libkrb5-*-heimdal uuid-dev gettext \
+    liburing-dev python3-distutils ccache && \
+  apt-get clean
diff --git a/ci/docker/windows_vs_2019 b/ci/docker/windows_vs_2019
new file mode 100644
index 00000000000..e09ca0d5825
--- /dev/null
+++ b/ci/docker/windows_vs_2019
@@ -0,0 +1,105 @@
+# escape=`
+
+# We used to use the visual studio container, but it's too outdated now
+FROM cirrusci/windowsservercore:2019
+
+SHELL ["powershell", "-NoLogo", "-NoProfile", "-Command"]
+
+
+RUN `
+    New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio' ; `
+    New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' ; `
+    New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' -Name KeepDownloadedPayloads -Value 0 -PropertyType DWord
+
+
+# Install commandline debugger and log all crashes to c:\cirrus\crashlog.txt
+#
+# Done manually as doing this via chocolatey / the installer directly, ends up
+# with a lot of unnecessary chaff, making the layer unnecessarily large.
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    curl.exe -sSL -o 'windsdksetup.exe' https://download.microsoft.com/download/9/7/9/97982c1d-d687-41be-9dd3-6d01e52ceb68/windowssdk/winsdksetup.exe ; `
+    Start-Process -Wait -FilePath ".\windsdksetup.exe" `
+      -ArgumentList '/Features OptionId.WindowsDesktopDebuggers /layout c:\t\sdk /quiet /norestart /log c:\t\sdk.log' `
+      ; `
+    `
+    Start-Process -Wait -FilePath msiexec.exe `
+      -ArgumentList '/a \"C:\t\sdk\Installers\X64 Debuggers And Tools-x64_en-us.msi\" /qb /log install2.log' `
+    ; `
+    C:\Windows` Kits\10\Debuggers\x64\cdb.exe -version ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t\* -Force -Recurse ; `
+    Remove-Item C:\t -Force -Recurse ; `
+    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Debugger' -Value '\"C:\Windows Kits\10\Debuggers\x64\cdb.exe\" -p %ld -e %ld -g -kqm -c \".lines -e; .symfix+ ;.logappend c:\cirrus\crashlog.txt ; !peb; ~*kP ; .logclose ; q \"' ; `
+    New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Auto' -Value 1 -PropertyType DWord ; `
+    Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger; `
+    setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m
+
+
+# Install perl, python, flex and bison.
+#
+# Done manually as choco takes a lot longer. I think it's download issues with
+# powershell's download stuff? That's wy curl.exe is directly used here at least...
+#
+# Using perl 5.26.3.1 for now, as newer versions don't currently work correctly
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    `
+    curl.exe -sSL -o perl.zip `
+        https://strawberryperl.com/download/5.26.3.1/strawberry-perl-5.26.3.1-64bit-portable.zip ; `
+    7z.exe x .\perl.zip -xr!c -oc:\strawberry ; `
+    `
+    curl.exe -sSL -o python.exe https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe ; `
+    Start-Process -Wait -FilePath ".\python.exe" `
+      -ArgumentList `
+        '/quiet', 'SimpleInstall=1', 'PrependPath=1', 'CompileAll=1', `
+        'TargetDir=c:\python\', 'InstallAllUsers=1', 'Shortcuts=0', `
+        'Include_docs=0', 'Include_tcltk=0', 'Include_tests=0' `
+      ; `
+    `
+    curl.exe -sSL -o winflexbison.zip `
+        https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip ; `
+    7z.exe x .\winflexbison.zip -oc:\winflexbison ; `
+    Rename-Item -Path c:\winflexbison\win_flex.exe c:\winflexbison\flex.exe ; `
+    Rename-Item -Path c:\winflexbison\win_bison.exe c:\winflexbison\bison.exe ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse ; `
+    setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m
+
+
+# Install visual studio
+#
+# Adding VS path to vcvarsall.bat so user of container doesn't need to know the full path
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    curl.exe -sSL -o c:\t\vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe ; `
+    Start-Process -Wait `
+        -FilePath c:\t\vs_buildtools.exe `
+        -ArgumentList `
+          '--quiet', '--wait', '--norestart', '--nocache', `
+          '--installPath', 'c:\BuildTools', `
+          '--add', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', `
+          '--add', 'Microsoft.VisualStudio.Component.Windows10SDK.20348'  ; `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse ; `
+    Remove-Item -Force -Recurse ${Env:TEMP}\*; `
+    Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\"  ; `
+    setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m
+
+
+# Install openssl
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    `
+    curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; `
+    Start-Process -Wait -FilePath ".\openssl-setup.exe" `
+      -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse
diff --git a/ci/freebsd_gcp_repartition.sh b/ci/freebsd_gcp_repartition.sh
new file mode 100755
index 00000000000..2d5e1738998
--- /dev/null
+++ b/ci/freebsd_gcp_repartition.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+set -e
+set -x
+
+# The default filesystem on freebsd gcp images is very slow to run tests on,
+# due to its 32KB block size
+#
+# XXX: It'd probably better to fix this in the image, using something like
+# https://people.freebsd.org/~lidl/blog/re-root.html
+
+# fix backup partition table after resize
+gpart recover da0
+gpart show da0
+# kill swap, so we can delete a partition
+swapoff -a || true
+# (apparently we can only have 4!?)
+gpart delete -i 3 da0
+gpart add -t freebsd-ufs -l data8k -a 4096 da0
+gpart show da0
+newfs -U -b 8192 /dev/da0p3
+
+# Migrate working directory
+du -hs $CIRRUS_WORKING_DIR
+mv $CIRRUS_WORKING_DIR $CIRRUS_WORKING_DIR.orig
+mkdir $CIRRUS_WORKING_DIR
+mount -o noatime /dev/da0p3 $CIRRUS_WORKING_DIR
+cp -r $CIRRUS_WORKING_DIR.orig/* $CIRRUS_WORKING_DIR/
diff --git a/ci/pg_ci_base.conf b/ci/pg_ci_base.conf
new file mode 100644
index 00000000000..637e3cfb343
--- /dev/null
+++ b/ci/pg_ci_base.conf
@@ -0,0 +1,12 @@
+# Tends to produce too many core files, taking a long time
+restart_after_crash = false
+
+# So that tests using the "manually" started postgres on windows can use
+# prepared statements
+max_prepared_transactions=10
+
+# Settings that make logs more useful
+log_line_prefix='%m [%p][%b][%v:%x] '
+log_checkpoints = true
+log_connections = true
+log_disconnections = true
diff --git a/ci/windows_build_config.pl b/ci/windows_build_config.pl
new file mode 100644
index 00000000000..bf0660416fa
--- /dev/null
+++ b/ci/windows_build_config.pl
@@ -0,0 +1,10 @@
+use strict;
+use warnings;
+
+our $config;
+
+$config->{"tap_tests"} = 1;
+$config->{"asserts"} = 1;
+$config->{"openssl"} = "c:/openssl/1.1.1l/";
+
+1;
-- 
2.23.0.385.gbc12974a89

v3-0003-fixup-ci-Add-CI-for-FreeBSD-Linux-MacOS-and-Windo.patchtext/x-diff; charset=us-asciiDownload
From dadd0b04a94be8bd1b3f3dba1ce378bcdadbd2f9 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 8 Oct 2021 23:29:08 -0700
Subject: [PATCH v3 03/17] fixup! ci: Add CI for FreeBSD, Linux, MacOS and
 Windows, utilizing cirrus-ci.

---
 ci/docker/windows_vs_2019 | 62 +++++++++++++++++++++------------------
 1 file changed, 34 insertions(+), 28 deletions(-)

diff --git a/ci/docker/windows_vs_2019 b/ci/docker/windows_vs_2019
index e09ca0d5825..a4fcaceae96 100644
--- a/ci/docker/windows_vs_2019
+++ b/ci/docker/windows_vs_2019
@@ -6,12 +6,6 @@ FROM cirrusci/windowsservercore:2019
 SHELL ["powershell", "-NoLogo", "-NoProfile", "-Command"]
 
 
-RUN `
-    New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio' ; `
-    New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' ; `
-    New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' -Name KeepDownloadedPayloads -Value 0 -PropertyType DWord
-
-
 # Install commandline debugger and log all crashes to c:\cirrus\crashlog.txt
 #
 # Done manually as doing this via chocolatey / the installer directly, ends up
@@ -19,7 +13,11 @@ RUN `
 RUN `
     mkdir c:\t ; `
     cd c:\t ; `
+    `
+    setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m ; `
+    `
     curl.exe -sSL -o 'windsdksetup.exe' https://download.microsoft.com/download/9/7/9/97982c1d-d687-41be-9dd3-6d01e52ceb68/windowssdk/winsdksetup.exe ; `
+    echo 'starting sdk installation (for debugger)' ; `
     Start-Process -Wait -FilePath ".\windsdksetup.exe" `
       -ArgumentList '/Features OptionId.WindowsDesktopDebuggers /layout c:\t\sdk /quiet /norestart /log c:\t\sdk.log' `
       ; `
@@ -29,13 +27,12 @@ RUN `
     ; `
     C:\Windows` Kits\10\Debuggers\x64\cdb.exe -version ; `
     `
-    cd c:\ ; `
-    Remove-Item C:\t\* -Force -Recurse ; `
-    Remove-Item C:\t -Force -Recurse ; `
     Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Debugger' -Value '\"C:\Windows Kits\10\Debuggers\x64\cdb.exe\" -p %ld -e %ld -g -kqm -c \".lines -e; .symfix+ ;.logappend c:\cirrus\crashlog.txt ; !peb; ~*kP ; .logclose ; q \"' ; `
     New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Auto' -Value 1 -PropertyType DWord ; `
-    Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger; `
-    setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m
+    Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse
 
 
 # Install perl, python, flex and bison.
@@ -48,11 +45,16 @@ RUN `
     mkdir c:\t ; `
     cd c:\t ; `
     `
+    echo 'adding to path, before setup below, so changes are not overwritten' ; `
+    setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m ; `
+    `
     curl.exe -sSL -o perl.zip `
         https://strawberryperl.com/download/5.26.3.1/strawberry-perl-5.26.3.1-64bit-portable.zip ; `
+    echo 'installing perl' ; `
     7z.exe x .\perl.zip -xr!c -oc:\strawberry ; `
     `
     curl.exe -sSL -o python.exe https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe ; `
+    echo 'installing python' ; `
     Start-Process -Wait -FilePath ".\python.exe" `
       -ArgumentList `
         '/quiet', 'SimpleInstall=1', 'PrependPath=1', 'CompileAll=1', `
@@ -62,13 +64,27 @@ RUN `
     `
     curl.exe -sSL -o winflexbison.zip `
         https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip ; `
+    echo 'installing winflexbison' ; `
     7z.exe x .\winflexbison.zip -oc:\winflexbison ; `
     Rename-Item -Path c:\winflexbison\win_flex.exe c:\winflexbison\flex.exe ; `
     Rename-Item -Path c:\winflexbison\win_bison.exe c:\winflexbison\bison.exe ; `
     `
     cd c:\ ; `
-    Remove-Item C:\t -Force -Recurse ; `
-    setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m
+    Remove-Item C:\t -Force -Recurse
+
+
+# Install openssl
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    `
+    curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; `
+    echo 'staring openssl installation' ; `
+    Start-Process -Wait -FilePath ".\openssl-setup.exe" `
+      -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse
 
 
 # Install visual studio
@@ -77,7 +93,10 @@ RUN `
 RUN `
     mkdir c:\t ; `
     cd c:\t ; `
+    setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m ; `
+    `
     curl.exe -sSL -o c:\t\vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe ; `
+    echo 'starting visual studio installation' ; `
     Start-Process -Wait `
         -FilePath c:\t\vs_buildtools.exe `
         -ArgumentList `
@@ -85,21 +104,8 @@ RUN `
           '--installPath', 'c:\BuildTools', `
           '--add', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', `
           '--add', 'Microsoft.VisualStudio.Component.Windows10SDK.20348'  ; `
+    `
     cd c:\ ; `
     Remove-Item C:\t -Force -Recurse ; `
     Remove-Item -Force -Recurse ${Env:TEMP}\*; `
-    Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\"  ; `
-    setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m
-
-
-# Install openssl
-RUN `
-    mkdir c:\t ; `
-    cd c:\t ; `
-    `
-    curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; `
-    Start-Process -Wait -FilePath ".\openssl-setup.exe" `
-      -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; `
-    `
-    cd c:\ ; `
-    Remove-Item C:\t -Force -Recurse
+    Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\"
-- 
2.23.0.385.gbc12974a89

v3-0004-meson-prereq-output-and-depencency-tracking-work.patchtext/x-diff; charset=us-asciiDownload
From 3c0caccb8d9686538385cbb617a73a2d9b2476bd Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 8 Mar 2021 13:47:39 -0800
Subject: [PATCH v3 04/17] meson: prereq: output and depencency tracking work.

---
 src/backend/utils/misc/Makefile  |  5 ++++-
 src/backend/utils/misc/guc.c     |  2 +-
 src/bin/initdb/initdb.c          |  5 +++--
 src/bin/psql/Makefile            |  4 ++--
 src/bin/psql/create_help.pl      | 16 ++++++++++++----
 src/tools/msvc/MSBuildProject.pm |  9 +++++++--
 src/tools/msvc/Mkvcbuild.pm      |  3 +++
 src/tools/msvc/Solution.pm       |  2 +-
 src/tools/msvc/pgflex.pl         |  4 ++--
 9 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 1d5327cf644..14861fd96b2 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -37,8 +37,11 @@ endif
 
 include $(top_srcdir)/src/backend/common.mk
 
+guc-file.c.h: guc-file.l
+	flex -o $@ $<
+
 # guc-file is compiled as part of guc
-guc.o: guc-file.c
+guc.o: guc-file.c.h
 
 # Note: guc-file.c is not deleted by 'make clean',
 # since we want to ship it in distribution tarballs.
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index d2ce4a84506..3786ae11a08 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -12559,4 +12559,4 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
 	return true;
 }
 
-#include "guc-file.c"
+#include "guc-file.c.h"
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 1ed4808d53f..9067a06e58a 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1368,8 +1368,9 @@ bootstrap_template1(void)
 
 	if (strcmp(headerline, *bki_lines) != 0)
 	{
-		pg_log_error("input file \"%s\" does not belong to PostgreSQL %s",
-					 bki_file, PG_VERSION);
+		pg_log_error("input file \"%s\" does not belong to PostgreSQL %s (expect %s, is %s)",
+					 bki_file, PG_VERSION,
+					 headerline, *bki_lines);
 		fprintf(stderr,
 				_("Check your installation or specify the correct path "
 				  "using the option -L.\n"));
diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile
index d00881163c0..3851da1c8ef 100644
--- a/src/bin/psql/Makefile
+++ b/src/bin/psql/Makefile
@@ -56,7 +56,7 @@ sql_help.c: sql_help.h
 	touch $@
 
 sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml)
-	$(PERL) $< $(REFDOCDIR) $*
+	$(PERL) $< $(REFDOCDIR) . $*
 
 psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
 psqlscanslash.c: FLEX_NO_BACKUP=yes
@@ -81,7 +81,7 @@ clean distclean:
 # files removed here are supposed to be in the distribution tarball,
 # so do not clean them in the clean/distclean rules
 maintainer-clean: distclean
-	rm -f sql_help.h sql_help.c psqlscanslash.c
+	rm -f sql_help.h sql_help.c sql_help.dep psqlscanslash.c
 
 check:
 	$(prove_check)
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
index 83324239740..40eb6ac2d3f 100644
--- a/src/bin/psql/create_help.pl
+++ b/src/bin/psql/create_help.pl
@@ -23,9 +23,12 @@ use strict;
 use warnings;
 
 my $docdir = $ARGV[0] or die "$0: missing required argument: docdir\n";
-my $hfile = $ARGV[1] . '.h'
+my $outdir = $ARGV[1] or die "$0: missing required argument: outdir\n";
+
+my $hfile = $ARGV[2] . '.h'
   or die "$0: missing required argument: output file\n";
-my $cfile = $ARGV[1] . '.c';
+my $cfile = $ARGV[2] . '.c';
+my $depfile = $ARGV[2] . '.dep';
 
 my $hfilebasename;
 if ($hfile =~ m!.*/([^/]+)$!)
@@ -43,10 +46,12 @@ $define =~ s/\W/_/g;
 
 opendir(DIR, $docdir)
   or die "$0: could not open documentation source dir '$docdir': $!\n";
-open(my $hfile_handle, '>', $hfile)
+open(my $hfile_handle, '>', $outdir . '/' . $hfile)
   or die "$0: could not open output file '$hfile': $!\n";
-open(my $cfile_handle, '>', $cfile)
+open(my $cfile_handle, '>', $outdir . '/' . $cfile)
   or die "$0: could not open output file '$cfile': $!\n";
+open(my $depfile_handle, '>', $outdir . '/' . $depfile)
+  or die "$0: could not open output file '$depfile': $!\n";
 
 print $hfile_handle "/*
  * *** Do not change this file by hand. It is automatically
@@ -98,6 +103,8 @@ foreach my $file (sort readdir DIR)
 	my ($cmdid, @cmdnames, $cmddesc, $cmdsynopsis);
 	$file =~ /\.sgml$/ or next;
 
+	print $depfile_handle "$cfile $hfile: $docdir/$file\n";
+
 	open(my $fh, '<', "$docdir/$file") or next;
 	my $filecontent = join('', <$fh>);
 	close $fh;
@@ -216,4 +223,5 @@ print $hfile_handle "
 
 close $cfile_handle;
 close $hfile_handle;
+close $depfile_handle;
 closedir DIR;
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index fdd22e89eb2..036e44fcb83 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -211,14 +211,19 @@ EOF
 			}
 			else    #if ($grammarFile =~ /\.l$/)
 			{
+				if ($outputFile eq 'src/backend/utils/misc/guc-file.c')
+				{
+					$outputFile = 'src/backend/utils/misc/guc-file.c.h';
+				}
+
 				print $f <<EOF;
     <CustomBuild Include="$grammarFile">
       <Message Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">Running flex on $grammarFile</Message>
-      <Command Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile"</Command>
+      <Command Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" "$outputFile"</Command>
       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
       <Message Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">Running flex on $grammarFile</Message>
-      <Command Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile"</Command>
+      <Command Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" "$outputFile"</Command>
       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
     </CustomBuild>
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 4362bd44fd1..b8e62c6d3f7 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -330,6 +330,7 @@ sub mkvcbuild
 	$pgregress_ecpg->AddFile('src/test/regress/pg_regress.c');
 	$pgregress_ecpg->AddIncludeDir('src/port');
 	$pgregress_ecpg->AddIncludeDir('src/test/regress');
+	$pgregress_ecpg->AddDefine('DLSUFFIX=".dll"');
 	$pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$pgregress_ecpg->AddLibrary('ws2_32.lib');
 	$pgregress_ecpg->AddDirResourceFile('src/interfaces/ecpg/test');
@@ -345,6 +346,7 @@ sub mkvcbuild
 	$isolation_tester->AddIncludeDir('src/port');
 	$isolation_tester->AddIncludeDir('src/test/regress');
 	$isolation_tester->AddIncludeDir('src/interfaces/libpq');
+	$isolation_tester->AddDefine('DLSUFFIX=".dll"');
 	$isolation_tester->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$isolation_tester->AddLibrary('ws2_32.lib');
 	$isolation_tester->AddDirResourceFile('src/test/isolation');
@@ -356,6 +358,7 @@ sub mkvcbuild
 	$pgregress_isolation->AddFile('src/test/regress/pg_regress.c');
 	$pgregress_isolation->AddIncludeDir('src/port');
 	$pgregress_isolation->AddIncludeDir('src/test/regress');
+	$pgregress_isolation->AddDefine('DLSUFFIX=".dll"');
 	$pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$pgregress_isolation->AddLibrary('ws2_32.lib');
 	$pgregress_isolation->AddDirResourceFile('src/test/isolation');
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 165a93987ac..721f690ae46 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -688,7 +688,7 @@ sub GenerateFiles
 	{
 		print "Generating sql_help.h...\n";
 		chdir('src/bin/psql');
-		system("perl create_help.pl ../../../doc/src/sgml/ref sql_help");
+		system("perl create_help.pl ../../../doc/src/sgml/ref . sql_help");
 		chdir('../../..');
 	}
 
diff --git a/src/tools/msvc/pgflex.pl b/src/tools/msvc/pgflex.pl
index 0728b85d4de..19f26ff213f 100644
--- a/src/tools/msvc/pgflex.pl
+++ b/src/tools/msvc/pgflex.pl
@@ -29,6 +29,8 @@ unless ($verparts[0] == 2
 }
 
 my $input = shift;
+my $output = shift;
+
 if ($input !~ /\.l$/)
 {
 	print "Input must be a .l file\n";
@@ -40,8 +42,6 @@ elsif (!-e $input)
 	exit 1;
 }
 
-(my $output = $input) =~ s/\.l$/.c/;
-
 # get flex flags from make file
 my $makefile = dirname($input) . "/Makefile";
 my ($mf, $make);
-- 
2.23.0.385.gbc12974a89

v3-0005-meson-prereq-move-snowball_create.sql-creation-in.patchtext/x-diff; charset=us-asciiDownload
From 3735dde29b192404e3e52c2989ec990a39d3e513 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 8 Mar 2021 14:59:22 -0800
Subject: [PATCH v3 05/17] meson: prereq: move snowball_create.sql creation
 into perl file.

FIXME: deduplicate with Install.pm
---
 src/backend/snowball/Makefile           |  27 +-----
 src/backend/snowball/snowball_create.pl | 110 ++++++++++++++++++++++++
 2 files changed, 113 insertions(+), 24 deletions(-)
 create mode 100644 src/backend/snowball/snowball_create.pl

diff --git a/src/backend/snowball/Makefile b/src/backend/snowball/Makefile
index 50b9199910c..259104f8eb3 100644
--- a/src/backend/snowball/Makefile
+++ b/src/backend/snowball/Makefile
@@ -119,29 +119,8 @@ all: all-shared-lib $(SQLSCRIPT)
 
 include $(top_srcdir)/src/Makefile.shlib
 
-$(SQLSCRIPT): Makefile snowball_func.sql.in snowball.sql.in
-	echo '-- Language-specific snowball dictionaries' > $@
-	cat $(srcdir)/snowball_func.sql.in >> $@
-	@set -e; \
-	set $(LANGUAGES) ; \
-	while [ "$$#" -gt 0 ] ; \
-	do \
-		lang=$$1; shift; \
-		nonascdictname=$$lang; \
-		ascdictname=$$1; shift; \
-		if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \
-			stop=", StopWords=$${lang}" ; \
-		else \
-			stop=""; \
-		fi; \
-		cat $(srcdir)/snowball.sql.in | \
-			sed -e "s#_LANGNAME_#$$lang#g" | \
-			sed -e "s#_DICTNAME_#$${lang}_stem#g" | \
-			sed -e "s#_CFGNAME_#$$lang#g" | \
-			sed -e "s#_ASCDICTNAME_#$${ascdictname}_stem#g" | \
-			sed -e "s#_NONASCDICTNAME_#$${nonascdictname}_stem#g" | \
-			sed -e "s#_STOPWORDS_#$$stop#g" ; \
-	done >> $@
+$(SQLSCRIPT): snowball_create.pl Makefile snowball_func.sql.in snowball.sql.in
+	$(PERL) $< --input ${srcdir} --output .
 
 install: all installdirs install-lib
 	$(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)'
@@ -171,4 +150,4 @@ uninstall: uninstall-lib
 	done
 
 clean distclean maintainer-clean: clean-lib
-	rm -f $(OBJS) $(SQLSCRIPT)
+	rm -f $(OBJS) $(SQLSCRIPT) snowball_create.dep
diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl
new file mode 100644
index 00000000000..d9d79f3668f
--- /dev/null
+++ b/src/backend/snowball/snowball_create.pl
@@ -0,0 +1,110 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $output_path = '';
+my $makefile_path = '';
+my $input_path = '';
+
+GetOptions(
+	'output:s'   => \$output_path,
+	'input:s'    => \$input_path) || usage();
+
+# Make sure input_path ends in a slash if needed.
+if ($input_path ne '' && substr($input_path, -1) ne '/')
+{
+	$output_path .= '/';
+}
+
+# Make sure output_path ends in a slash if needed.
+if ($output_path ne '' && substr($output_path, -1) ne '/')
+{
+	$output_path .= '/';
+}
+
+GenerateTsearchFiles();
+
+sub usage
+{
+	die <<EOM;
+Usage: snowball_create.pl --input/-i <path> --input <path>
+    --output        Output directory (default '.')
+    --input         Input directory
+
+snowball_create.pl creates snowball.sql from snowball.sql.in
+EOM
+}
+
+sub GenerateTsearchFiles
+{
+	my $target = shift;
+	my $output_file = "$output_path/snowball_create.sql";
+
+	print "Generating tsearch script...";
+	my $F;
+	my $D;
+	my $tmpl = read_file("$input_path/snowball.sql.in");
+	my $mf   = read_file("$input_path/Makefile");
+
+	open($D, '>', "$output_path/snowball_create.dep")
+	  || die "Could not write snowball_create.dep";
+
+	print $D "$output_file: $input_path/Makefile\n";
+	print $D "$output_file: $input_path/snowball.sql.in\n";
+	print $D "$output_file: $input_path/snowball_func.sql.in\n";
+
+	$mf =~ s{\\\r?\n}{}g;
+	$mf =~ /^LANGUAGES\s*=\s*(.*)$/m
+	  || die "Could not find LANGUAGES line in snowball Makefile\n";
+	my @pieces = split /\s+/, $1;
+	open($F, '>', $output_file)
+	  || die "Could not write snowball_create.sql";
+
+	print $F "-- Language-specific snowball dictionaries\n";
+
+	print $F read_file("$input_path/snowball_func.sql.in");
+
+	while ($#pieces > 0)
+	{
+		my $lang    = shift @pieces || last;
+		my $asclang = shift @pieces || last;
+		my $txt     = $tmpl;
+		my $stop    = '';
+		my $stopword_path = "$input_path/stopwords/$lang.stop";
+
+		if (-s "$stopword_path")
+		{
+			$stop = ", StopWords=$lang";
+
+			print $D "$output_file: $stopword_path\n";
+		}
+
+		$txt =~ s#_LANGNAME_#${lang}#gs;
+		$txt =~ s#_DICTNAME_#${lang}_stem#gs;
+		$txt =~ s#_CFGNAME_#${lang}#gs;
+		$txt =~ s#_ASCDICTNAME_#${asclang}_stem#gs;
+		$txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs;
+		$txt =~ s#_STOPWORDS_#$stop#gs;
+		print $F $txt;
+		print ".";
+	}
+	close($F);
+	close($D);
+	print "\n";
+	return;
+}
+
+
+sub read_file
+{
+	my $filename = shift;
+	my $F;
+	local $/ = undef;
+	open($F, '<', $filename) || die "Could not open file $filename\n";
+	my $txt = <$F>;
+	close($F);
+
+	return $txt;
+}
-- 
2.23.0.385.gbc12974a89

v3-0006-meson-prereq-add-output-path-arg-in-generate-lwlo.patchtext/x-diff; charset=us-asciiDownload
From ff46bc3dd368d11043d6089b2da2f82c1c28f631 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 10 Mar 2021 01:43:07 -0800
Subject: [PATCH v3 06/17] meson: prereq: add output path arg in
 generate-lwlocknames.pl

---
 src/backend/storage/lmgr/generate-lwlocknames.pl | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl
index 8a44946594d..315156b29f1 100644
--- a/src/backend/storage/lmgr/generate-lwlocknames.pl
+++ b/src/backend/storage/lmgr/generate-lwlocknames.pl
@@ -5,15 +5,21 @@
 
 use strict;
 use warnings;
+use Getopt::Long;
+
+my $output_path = '.';
 
 my $lastlockidx = -1;
 my $continue    = "\n";
 
+GetOptions(
+	'output:s'       => \$output_path);
+
 open my $lwlocknames, '<', $ARGV[0] or die;
 
 # Include PID in suffix in case parallel make runs this multiple times.
-my $htmp = "lwlocknames.h.tmp$$";
-my $ctmp = "lwlocknames.c.tmp$$";
+my $htmp = "$output_path/lwlocknames.h.tmp$$";
+my $ctmp = "$output_path/lwlocknames.c.tmp$$";
 open my $h, '>', $htmp or die "Could not open $htmp: $!";
 open my $c, '>', $ctmp or die "Could not open $ctmp: $!";
 
@@ -65,7 +71,7 @@ printf $h "#define NUM_INDIVIDUAL_LWLOCKS		%s\n", $lastlockidx + 1;
 close $h;
 close $c;
 
-rename($htmp, 'lwlocknames.h') || die "rename: $htmp: $!";
-rename($ctmp, 'lwlocknames.c') || die "rename: $ctmp: $!";
+rename($htmp, "$output_path/lwlocknames.h") || die "rename: $htmp to $output_path/lwlocknames.h: $!";
+rename($ctmp, "$output_path/lwlocknames.c") || die "rename: $ctmp: $!";
 
 close $lwlocknames;
-- 
2.23.0.385.gbc12974a89

v3-0007-meson-prereq-add-src-tools-gen_versioning_script..patchtext/x-diff; charset=us-asciiDownload
From 442cee8d3c2b32d59696e2114f97de062f798293 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 10 Mar 2021 15:11:13 -0800
Subject: [PATCH v3 07/17] meson: prereq: add
 src/tools/gen_versioning_script.pl.

Currently the logic is all in src/Makefile.shlib. This adds a sketch
of a generation script that can be used from meson.
---
 src/tools/gen_versioning_script.pl | 58 ++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100644 src/tools/gen_versioning_script.pl

diff --git a/src/tools/gen_versioning_script.pl b/src/tools/gen_versioning_script.pl
new file mode 100644
index 00000000000..862b5e14aad
--- /dev/null
+++ b/src/tools/gen_versioning_script.pl
@@ -0,0 +1,58 @@
+use strict;
+use warnings;
+
+my $format = $ARGV[0] or die "$0: missing required argument: format\n";
+my $input = $ARGV[1] or die "$0: missing required argument: input\n";
+my $output = $ARGV[2] or die "$0: missing required argument: output\n";
+
+#FIXME: handle format argument, so we can reuse the one script for several platforms
+if (not ($format eq 'gnu' or $format eq 'darwin'))
+{
+	die "$0: $format is not yet handled (only gnu is)\n";
+}
+
+open(my $input_handle, '<', $input)
+  or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+  or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+	print $output_handle "{
+  global:
+";
+}
+
+while (<$input_handle>)
+{
+	if (/^#/)
+	{
+		# don't do anything with a comment
+	}
+	elsif (/^([^\s]+)\s+([^\s]+)/)
+	{
+		if ($format eq 'gnu')
+		{
+			print $output_handle "    $1;\n";
+		}
+		elsif ($format eq 'darwin')
+		{
+			print $output_handle "    _$1\n";
+		}
+	}
+	else
+	{
+		die "$0: unexpected line $_\n";
+	}
+}
+
+if ($format eq 'gnu')
+{
+	print $output_handle "  local: *;
+};
+";
+}
+
+exit(0);
-- 
2.23.0.385.gbc12974a89

v3-0008-meson-prereq-generate-errcodes.pl-accept-output-f.patchtext/x-diff; charset=us-asciiDownload
From aa5915c8bab7ef119d34d350dbeaf17ec59c16e3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 27 Sep 2021 00:14:09 -0700
Subject: [PATCH v3 08/17] meson: prereq: generate-errcodes.pl: accept output
 file

---
 src/backend/utils/Makefile             |  2 +-
 src/backend/utils/generate-errcodes.pl | 13 ++++++++-----
 src/tools/msvc/Solution.pm             |  2 +-
 3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index ef8df254826..469caf0d704 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -52,7 +52,7 @@ fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/ca
 	touch $@
 
 errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
-	$(PERL) $(srcdir)/generate-errcodes.pl $< > $@
+	$(PERL) $(srcdir)/generate-errcodes.pl $< $@
 
 ifneq ($(enable_dtrace), yes)
 probes.h: Gen_dummy_probes.sed
diff --git a/src/backend/utils/generate-errcodes.pl b/src/backend/utils/generate-errcodes.pl
index c5cdd388138..57ec2a5ca21 100644
--- a/src/backend/utils/generate-errcodes.pl
+++ b/src/backend/utils/generate-errcodes.pl
@@ -6,11 +6,13 @@
 use strict;
 use warnings;
 
-print
+open my $errcodes, '<', $ARGV[0] or die;
+open my $out, '>', $ARGV[1] or die;
+
+print $out
   "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n";
-print "/* there is deliberately not an #ifndef ERRCODES_H here */\n";
+print $out "/* there is deliberately not an #ifndef ERRCODES_H here */\n";
 
-open my $errcodes, '<', $ARGV[0] or die;
 
 while (<$errcodes>)
 {
@@ -25,7 +27,7 @@ while (<$errcodes>)
 	{
 		my $header = $1;
 		$header =~ s/^\s+//;
-		print "\n/* $header */\n";
+		print $out "\n/* $header */\n";
 		next;
 	}
 
@@ -40,7 +42,8 @@ while (<$errcodes>)
 	# And quote them
 	$sqlstate =~ s/([^,])/'$1'/g;
 
-	print "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n";
+	print $out "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n";
 }
 
 close $errcodes;
+close $out;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 721f690ae46..aba59a270b4 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -658,7 +658,7 @@ sub GenerateFiles
 	{
 		print "Generating errcodes.h...\n";
 		system(
-			'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt > src/backend/utils/errcodes.h'
+			'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt src/backend/utils/errcodes.h'
 		);
 		copyFile('src/backend/utils/errcodes.h',
 			'src/include/utils/errcodes.h');
-- 
2.23.0.385.gbc12974a89

v3-0009-meson-prereq-remove-unhelpful-chattiness-in-snowb.patchtext/x-diff; charset=us-asciiDownload
From f78a0f77bcb97fc1dc2fa6d9ee3143f8b95561d4 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 27 Sep 2021 15:41:24 -0700
Subject: [PATCH v3 09/17] meson: prereq: remove unhelpful chattiness in
 snowball_create.pl.

---
 src/backend/snowball/snowball_create.pl | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl
index d9d79f3668f..285cf4f5d90 100644
--- a/src/backend/snowball/snowball_create.pl
+++ b/src/backend/snowball/snowball_create.pl
@@ -42,7 +42,6 @@ sub GenerateTsearchFiles
 	my $target = shift;
 	my $output_file = "$output_path/snowball_create.sql";
 
-	print "Generating tsearch script...";
 	my $F;
 	my $D;
 	my $tmpl = read_file("$input_path/snowball.sql.in");
@@ -88,11 +87,9 @@ sub GenerateTsearchFiles
 		$txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs;
 		$txt =~ s#_STOPWORDS_#$stop#gs;
 		print $F $txt;
-		print ".";
 	}
 	close($F);
 	close($D);
-	print "\n";
 	return;
 }
 
-- 
2.23.0.385.gbc12974a89

v3-0010-meson-prereq-Can-we-get-away-with-not-export-all-.patchtext/x-diff; charset=us-asciiDownload
From 8d3ca1659baf70926fb034f4043d3d90669f242b Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 29 Sep 2021 00:29:10 -0700
Subject: [PATCH v3 10/17] meson: prereq: Can we get away with not
 export-all'ing libraries?

---
 configure                                  | 49 ++++++++++++++++++++++
 configure.ac                               | 10 +++++
 contrib/hstore/hstore.h                    | 16 +++----
 contrib/ltree/ltree.h                      | 40 +++++++++---------
 src/Makefile.global.in                     |  1 +
 src/Makefile.shlib                         | 12 ++++++
 src/include/c.h                            | 15 +++++--
 src/include/fmgr.h                         |  6 ++-
 src/include/jit/jit.h                      |  2 +-
 src/include/pg_config.h.in                 |  3 ++
 src/include/replication/output_plugin.h    |  2 +
 src/pl/plpython/plpy_elog.h                |  8 ++--
 src/pl/plpython/plpy_typeio.h              | 18 ++++----
 src/pl/plpython/plpy_util.h                |  8 ++--
 src/test/modules/test_shm_mq/test_shm_mq.h |  2 +-
 src/test/modules/worker_spi/worker_spi.c   |  2 +-
 src/tools/msvc/Solution.pm                 |  1 +
 17 files changed, 142 insertions(+), 53 deletions(-)

diff --git a/configure b/configure
index 4ffefe46552..a62008e5ac5 100755
--- a/configure
+++ b/configure
@@ -735,6 +735,7 @@ CPP
 CFLAGS_SL
 BITCODE_CXXFLAGS
 BITCODE_CFLAGS
+CFLAGS_SL_MOD
 CFLAGS_VECTORIZE
 CFLAGS_UNROLL_LOOPS
 PERMIT_DECLARATION_AFTER_STATEMENT
@@ -6421,6 +6422,54 @@ fi
   if test -n "$NOT_THE_CFLAGS"; then
     CFLAGS="$CFLAGS -Wno-stringop-truncation"
   fi
+
+  # If the compiler knows how to hide symbols, use that. But only for shared libraries,
+  # for postgres itself that'd be too verbose for now.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD" >&5
+$as_echo_n "checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD... " >&6; }
+if ${pgac_cv_prog_CC_cflags__fvisibility_hidden+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  pgac_save_CFLAGS=$CFLAGS
+pgac_save_CC=$CC
+CC=${CC}
+CFLAGS="${CFLAGS_SL_MOD} -fvisibility=hidden"
+ac_save_c_werror_flag=$ac_c_werror_flag
+ac_c_werror_flag=yes
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  pgac_cv_prog_CC_cflags__fvisibility_hidden=yes
+else
+  pgac_cv_prog_CC_cflags__fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_c_werror_flag=$ac_save_c_werror_flag
+CFLAGS="$pgac_save_CFLAGS"
+CC="$pgac_save_CC"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__fvisibility_hidden" >&5
+$as_echo "$pgac_cv_prog_CC_cflags__fvisibility_hidden" >&6; }
+if test x"$pgac_cv_prog_CC_cflags__fvisibility_hidden" = x"yes"; then
+  CFLAGS_SL_MOD="${CFLAGS_SL_MOD} -fvisibility=hidden"
+fi
+
+
+  if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then
+
+$as_echo "#define HAVE_VISIBILITY_ATTRIBUTE 1" >>confdefs.h
+
+  fi
+
 elif test "$ICC" = yes; then
   # Intel's compiler has a bug/misoptimization in checking for
   # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.
diff --git a/configure.ac b/configure.ac
index 44ee3ebe2f1..973f83db52c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -541,6 +541,15 @@ if test "$GCC" = yes -a "$ICC" = no; then
   if test -n "$NOT_THE_CFLAGS"; then
     CFLAGS="$CFLAGS -Wno-stringop-truncation"
   fi
+
+  # If the compiler knows how to hide symbols, use that. But only for shared libraries,
+  # for postgres itself that'd be too verbose for now.
+  PGAC_PROG_CC_VAR_OPT(CFLAGS_SL_MOD, [-fvisibility=hidden])
+  if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then
+     AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE, 1,
+               [Define to 1 if your compiler knows the visibility("hidden") attribute.])
+  fi
+
 elif test "$ICC" = yes; then
   # Intel's compiler has a bug/misoptimization in checking for
   # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.
@@ -564,6 +573,7 @@ fi
 
 AC_SUBST(CFLAGS_UNROLL_LOOPS)
 AC_SUBST(CFLAGS_VECTORIZE)
+AC_SUBST(CFLAGS_SL_MOD)
 
 # Determine flags used to emit bitcode for JIT inlining. Need to test
 # for behaviour changing compiler flags, to keep compatibility with
diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h
index bf4a565ed9b..625134c9f69 100644
--- a/contrib/hstore/hstore.h
+++ b/contrib/hstore/hstore.h
@@ -147,7 +147,7 @@ typedef struct
 	} while (0)
 
 /* DatumGetHStoreP includes support for reading old-format hstore values */
-extern HStore *hstoreUpgrade(Datum orig);
+extern PGDLLEXPORT HStore *hstoreUpgrade(Datum orig);
 
 #define DatumGetHStoreP(d) hstoreUpgrade(d)
 
@@ -168,14 +168,14 @@ typedef struct
 	bool		needfree;		/* need to pfree the value? */
 } Pairs;
 
-extern int	hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen);
-extern HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen);
+extern PGDLLEXPORT int	hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen);
+extern PGDLLEXPORT HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen);
 
-extern size_t hstoreCheckKeyLen(size_t len);
-extern size_t hstoreCheckValLen(size_t len);
+extern PGDLLEXPORT size_t hstoreCheckKeyLen(size_t len);
+extern PGDLLEXPORT size_t hstoreCheckValLen(size_t len);
 
-extern int	hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen);
-extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
+extern PGDLLEXPORT int	hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen);
+extern PGDLLEXPORT Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
 
 #define HStoreContainsStrategyNumber	7
 #define HStoreExistsStrategyNumber		9
@@ -194,7 +194,7 @@ extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
 #if HSTORE_POLLUTE_NAMESPACE
 #define HSTORE_POLLUTE(newname_,oldname_) \
 	PG_FUNCTION_INFO_V1(oldname_);		  \
-	Datum newname_(PG_FUNCTION_ARGS);	  \
+	extern PGDLLEXPORT Datum newname_(PG_FUNCTION_ARGS);	  \
 	Datum oldname_(PG_FUNCTION_ARGS) { return newname_(fcinfo); } \
 	extern int no_such_variable
 #else
diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h
index 5b4be5e680a..d8bcdedbdbe 100644
--- a/contrib/ltree/ltree.h
+++ b/contrib/ltree/ltree.h
@@ -176,30 +176,30 @@ typedef struct
 
 
 /* use in array iterator */
-Datum		ltree_isparent(PG_FUNCTION_ARGS);
-Datum		ltree_risparent(PG_FUNCTION_ARGS);
-Datum		ltq_regex(PG_FUNCTION_ARGS);
-Datum		ltq_rregex(PG_FUNCTION_ARGS);
-Datum		lt_q_regex(PG_FUNCTION_ARGS);
-Datum		lt_q_rregex(PG_FUNCTION_ARGS);
-Datum		ltxtq_exec(PG_FUNCTION_ARGS);
-Datum		ltxtq_rexec(PG_FUNCTION_ARGS);
-Datum		_ltq_regex(PG_FUNCTION_ARGS);
-Datum		_ltq_rregex(PG_FUNCTION_ARGS);
-Datum		_lt_q_regex(PG_FUNCTION_ARGS);
-Datum		_lt_q_rregex(PG_FUNCTION_ARGS);
-Datum		_ltxtq_exec(PG_FUNCTION_ARGS);
-Datum		_ltxtq_rexec(PG_FUNCTION_ARGS);
-Datum		_ltree_isparent(PG_FUNCTION_ARGS);
-Datum		_ltree_risparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_isparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_risparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltq_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltq_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		lt_q_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		lt_q_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltxtq_exec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltxtq_rexec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltq_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltq_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_lt_q_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_lt_q_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltxtq_exec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltxtq_rexec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltree_isparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltree_risparent(PG_FUNCTION_ARGS);
 
 /* Concatenation functions */
-Datum		ltree_addltree(PG_FUNCTION_ARGS);
-Datum		ltree_addtext(PG_FUNCTION_ARGS);
-Datum		ltree_textadd(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_addltree(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_addtext(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_textadd(PG_FUNCTION_ARGS);
 
 /* Util function */
-Datum		ltree_in(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_in(PG_FUNCTION_ARGS);
 
 bool		ltree_execute(ITEM *curitem, void *checkval,
 						  bool calcnot, bool (*chkcond) (void *checkval, ITEM *val));
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index a1da1ea4eeb..a4ab27ae145 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -259,6 +259,7 @@ SUN_STUDIO_CC = @SUN_STUDIO_CC@
 CXX = @CXX@
 CFLAGS = @CFLAGS@
 CFLAGS_SL = @CFLAGS_SL@
+CFLAGS_SL_MOD = @CFLAGS_SL_MOD@
 CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@
 CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@
 CFLAGS_SSE42 = @CFLAGS_SSE42@
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 551023c6fb0..d36782aa942 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -253,6 +253,18 @@ ifeq ($(PORTNAME), win32)
 endif
 
 
+# If the shared library doesn't have an export file, mark all symbols not
+# explicitly exported using PGDLLEXPORT as hidden. We can't pass these flags
+# when building a library with explicit exports, as the symbols would be
+# hidden before the linker script / exported symbol list takes effect.
+#
+# XXX: This probably isn't the best location, but not clear instead?
+ifeq ($(SHLIB_EXPORTS),)
+  LDFLAGS += $(CFLAGS_SL_MOD)
+  override CFLAGS += $(CFLAGS_SL_MOD)
+  override CXXFLAGS += $(CFLAGS_SL_MOD)
+endif
+
 
 ##
 ## BUILD
diff --git a/src/include/c.h b/src/include/c.h
index c8ede082739..9b539a2657b 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -1312,11 +1312,18 @@ extern long long strtoll(const char *str, char **endptr, int base);
 extern unsigned long long strtoull(const char *str, char **endptr, int base);
 #endif
 
-/* no special DLL markers on most ports */
-#ifndef PGDLLIMPORT
-#define PGDLLIMPORT
+/*
+ * If the platform knows __attribute__((visibility("*"))), i.e. gcc like
+ * compilers, we use that.
+ */
+#if !defined(PGDLLIMPORT) && defined(HAVE_VISIBILITY_ATTRIBUTE)
+#define PGDLLIMPORT __attribute__((visibility("default")))
+#define PGDLLEXPORT __attribute__((visibility("default")))
 #endif
-#ifndef PGDLLEXPORT
+
+/* No special DLL markers on the remaining ports. */
+#if !defined(PGDLLIMPORT)
+#define PGDLLIMPORT
 #define PGDLLEXPORT
 #endif
 
diff --git a/src/include/fmgr.h b/src/include/fmgr.h
index ab7b85c86e1..679443cca19 100644
--- a/src/include/fmgr.h
+++ b/src/include/fmgr.h
@@ -413,7 +413,7 @@ typedef const Pg_finfo_record *(*PGFInfoFunction) (void);
  *	info function, since authors shouldn't need to be explicitly aware of it.
  */
 #define PG_FUNCTION_INFO_V1(funcname) \
-extern Datum funcname(PG_FUNCTION_ARGS); \
+extern PGDLLEXPORT Datum funcname(PG_FUNCTION_ARGS); \
 extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \
 const Pg_finfo_record * \
 CppConcat(pg_finfo_,funcname) (void) \
@@ -424,6 +424,10 @@ CppConcat(pg_finfo_,funcname) (void) \
 extern int no_such_variable
 
 
+extern PGDLLEXPORT void _PG_init(void);
+extern PGDLLEXPORT void _PG_fini(void);
+
+
 /*-------------------------------------------------------------------------
  *		Support for verifying backend compatibility of loaded modules
  *
diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h
index b634df30b98..74617ad1b64 100644
--- a/src/include/jit/jit.h
+++ b/src/include/jit/jit.h
@@ -63,7 +63,7 @@ typedef struct JitContext
 
 typedef struct JitProviderCallbacks JitProviderCallbacks;
 
-extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
+extern PGDLLEXPORT void _PG_jit_provider_init(JitProviderCallbacks *cb);
 typedef void (*JitProviderInit) (JitProviderCallbacks *cb);
 typedef void (*JitProviderResetAfterErrorCB) (void);
 typedef void (*JitProviderReleaseContextCB) (JitContext *context);
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 15ffdd895aa..e3ab1c7752f 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -710,6 +710,9 @@
 /* Define to 1 if you have the <uuid/uuid.h> header file. */
 #undef HAVE_UUID_UUID_H
 
+/* Define to 1 if your compiler knows the visibility("hidden") attribute. */
+#undef HAVE_VISIBILITY_ATTRIBUTE
+
 /* Define to 1 if you have the `wcstombs_l' function. */
 #undef HAVE_WCSTOMBS_L
 
diff --git a/src/include/replication/output_plugin.h b/src/include/replication/output_plugin.h
index 810495ed0e4..a087f14dadd 100644
--- a/src/include/replication/output_plugin.h
+++ b/src/include/replication/output_plugin.h
@@ -35,6 +35,8 @@ typedef struct OutputPluginOptions
  */
 typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb);
 
+extern PGDLLEXPORT void _PG_output_plugin_init(struct OutputPluginCallbacks *cb);
+
 /*
  * Callback that gets called in a user-defined plugin. ctx->private_data can
  * be set to some private data.
diff --git a/src/pl/plpython/plpy_elog.h b/src/pl/plpython/plpy_elog.h
index e02ef4ffe9f..aeade82ce10 100644
--- a/src/pl/plpython/plpy_elog.h
+++ b/src/pl/plpython/plpy_elog.h
@@ -34,13 +34,13 @@ extern PyObject *PLy_exc_spi_error;
 	} while(0)
 #endif							/* HAVE__BUILTIN_CONSTANT_P */
 
-extern void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
+extern PGDLLEXPORT void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
 
-extern void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
+extern PGDLLEXPORT void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
 
-extern void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural,
+extern PGDLLEXPORT void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural,
 									 unsigned long n,...) pg_attribute_printf(2, 5) pg_attribute_printf(3, 5);
 
-extern void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata);
+extern PGDLLEXPORT void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata);
 
 #endif							/* PLPY_ELOG_H */
diff --git a/src/pl/plpython/plpy_typeio.h b/src/pl/plpython/plpy_typeio.h
index d11e6ae1b89..87e3b2c464e 100644
--- a/src/pl/plpython/plpy_typeio.h
+++ b/src/pl/plpython/plpy_typeio.h
@@ -147,29 +147,29 @@ struct PLyObToDatum
 };
 
 
-extern PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val);
-extern Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val,
+extern PGDLLEXPORT PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val);
+extern PGDLLEXPORT Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val,
 								bool *isnull);
 
-extern PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple,
+extern PGDLLEXPORT PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple,
 									  TupleDesc desc, bool include_generated);
 
-extern void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
+extern PGDLLEXPORT void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
 								 Oid typeOid, int32 typmod,
 								 struct PLyProcedure *proc);
-extern void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt,
+extern PGDLLEXPORT void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt,
 								  Oid typeOid, int32 typmod,
 								  struct PLyProcedure *proc);
 
-extern void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc,
 								  struct PLyProcedure *proc);
-extern void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc,
 								   struct PLyProcedure *proc);
 
-extern void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc,
 									struct PLyProcedure *proc);
 
 /* conversion from Python objects to C strings --- exported for transforms */
-extern char *PLyObject_AsString(PyObject *plrv);
+extern PGDLLEXPORT char *PLyObject_AsString(PyObject *plrv);
 
 #endif							/* PLPY_TYPEIO_H */
diff --git a/src/pl/plpython/plpy_util.h b/src/pl/plpython/plpy_util.h
index c9ba7edc0ec..6927601e0be 100644
--- a/src/pl/plpython/plpy_util.h
+++ b/src/pl/plpython/plpy_util.h
@@ -8,12 +8,12 @@
 
 #include "plpython.h"
 
-extern PyObject *PLyUnicode_Bytes(PyObject *unicode);
-extern char *PLyUnicode_AsString(PyObject *unicode);
+extern PGDLLEXPORT PyObject *PLyUnicode_Bytes(PyObject *unicode);
+extern PGDLLEXPORT char *PLyUnicode_AsString(PyObject *unicode);
 
 #if PY_MAJOR_VERSION >= 3
-extern PyObject *PLyUnicode_FromString(const char *s);
-extern PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
+extern PGDLLEXPORT PyObject *PLyUnicode_FromString(const char *s);
+extern PGDLLEXPORT PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
 #endif
 
 #endif							/* PLPY_UTIL_H */
diff --git a/src/test/modules/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h
index a6661218347..a7a36714a48 100644
--- a/src/test/modules/test_shm_mq/test_shm_mq.h
+++ b/src/test/modules/test_shm_mq/test_shm_mq.h
@@ -40,6 +40,6 @@ extern void test_shm_mq_setup(int64 queue_size, int32 nworkers,
 							  shm_mq_handle **input);
 
 /* Main entrypoint for a worker. */
-extern void test_shm_mq_main(Datum) pg_attribute_noreturn();
+extern PGDLLEXPORT void test_shm_mq_main(Datum) pg_attribute_noreturn();
 
 #endif
diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c
index 0b6246676b6..e267bc3cffa 100644
--- a/src/test/modules/worker_spi/worker_spi.c
+++ b/src/test/modules/worker_spi/worker_spi.c
@@ -47,7 +47,7 @@ PG_MODULE_MAGIC;
 PG_FUNCTION_INFO_V1(worker_spi_launch);
 
 void		_PG_init(void);
-void		worker_spi_main(Datum) pg_attribute_noreturn();
+PGDLLEXPORT void worker_spi_main(Datum) pg_attribute_noreturn();
 
 /* GUC variables */
 static int	worker_spi_naptime = 10;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index aba59a270b4..811d6fcc5b2 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -432,6 +432,7 @@ sub GenerateFiles
 		HAVE_WINLDAP_H                           => undef,
 		HAVE_WCSTOMBS_L                          => 1,
 		HAVE_WCTYPE_H                            => 1,
+		HAVE_VISIBILITY_ATTRIBUTE                => undef,
 		HAVE_WRITEV                              => undef,
 		HAVE_X509_GET_SIGNATURE_NID              => 1,
 		HAVE_X86_64_POPCNTQ                      => undef,
-- 
2.23.0.385.gbc12974a89

v3-0011-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patchtext/x-diff; charset=us-asciiDownload
From 9f1027a30568d7142ed3a57129b8c84494a8eb1f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 30 Sep 2021 10:20:24 -0700
Subject: [PATCH v3 11/17] meson: prereq: Handle DLSUFFIX in msvc builds
 similar to other build envs.

---
 src/include/port/win32_port.h | 3 ---
 src/tools/msvc/Mkvcbuild.pm   | 3 +++
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h
index c1c4831595a..72b2d2b5a01 100644
--- a/src/include/port/win32_port.h
+++ b/src/include/port/win32_port.h
@@ -529,9 +529,6 @@ typedef unsigned short mode_t;
 #define W_OK 2
 #define R_OK 4
 
-/* Pulled from Makefile.port in MinGW */
-#define DLSUFFIX ".dll"
-
 #endif							/* _MSC_VER */
 
 #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || \
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index b8e62c6d3f7..47b5c43357a 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -195,6 +195,7 @@ sub mkvcbuild
 		'syncrep_gram.y');
 	$postgres->AddFiles('src/backend/utils/adt', 'jsonpath_scan.l',
 		'jsonpath_gram.y');
+	$postgres->AddDefine('DLSUFFIX=".dll"');
 	$postgres->AddDefine('BUILDING_DLL');
 	$postgres->AddLibrary('secur32.lib');
 	$postgres->AddLibrary('ws2_32.lib');
@@ -298,6 +299,7 @@ sub mkvcbuild
 	my $libecpg = $solution->AddProject('libecpg', 'dll', 'interfaces',
 		'src/interfaces/ecpg/ecpglib');
 	$libecpg->AddDefine('FRONTEND');
+	$libecpg->AddDefine('DLSUFFIX=".dll"');
 	$libecpg->AddIncludeDir('src/interfaces/ecpg/include');
 	$libecpg->AddIncludeDir('src/interfaces/libpq');
 	$libecpg->AddIncludeDir('src/port');
@@ -845,6 +847,7 @@ sub mkvcbuild
 	$pgregress->AddFile('src/test/regress/pg_regress.c');
 	$pgregress->AddFile('src/test/regress/pg_regress_main.c');
 	$pgregress->AddIncludeDir('src/port');
+	$pgregress->AddDefine('DLSUFFIX=".dll"');
 	$pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$pgregress->AddLibrary('ws2_32.lib');
 	$pgregress->AddDirResourceFile('src/test/regress');
-- 
2.23.0.385.gbc12974a89

v3-0012-prereq-Move-sed-expression-from-regress-python3-m.patchtext/x-diff; charset=us-asciiDownload
From 69e6ddf1d840d0d39005d559774626982c974bd1 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 3 Oct 2021 10:56:21 -0700
Subject: [PATCH v3 12/17] prereq: Move sed expression from
 regress-python3-mangle.mk into its own file.

---
 src/pl/plpython/regress-python3-mangle.mk  | 17 ++---------------
 src/pl/plpython/regress-python3-mangle.sed | 13 +++++++++++++
 2 files changed, 15 insertions(+), 15 deletions(-)
 create mode 100644 src/pl/plpython/regress-python3-mangle.sed

diff --git a/src/pl/plpython/regress-python3-mangle.mk b/src/pl/plpython/regress-python3-mangle.mk
index a785818a172..a5c155e73de 100644
--- a/src/pl/plpython/regress-python3-mangle.mk
+++ b/src/pl/plpython/regress-python3-mangle.mk
@@ -14,21 +14,8 @@ REGRESS := $(foreach test,$(REGRESS),$(if $(filter $(test),$(REGRESS_PLPYTHON3_M
 pgregress-python3-mangle:
 	$(MKDIR_P) sql/python3 expected/python3 results/python3
 	for file in $(patsubst %,$(srcdir)/sql/%.sql,$(REGRESS_PLPYTHON3_MANGLE)) $(patsubst %,$(srcdir)/expected/%*.out,$(REGRESS_PLPYTHON3_MANGLE)); do \
-	  sed \
-	      -e "s/<type 'exceptions\.\([[:alpha:]]*\)'>/<class '\1'>/g" \
-	      -e "s/<type 'long'>/<class 'int'>/g" \
-	      -e "s/\([0-9][0-9]*\)L/\1/g" \
-	      -e 's/\([ [{]\)u"/\1"/g' \
-	      -e "s/\([ [{]\)u'/\1'/g" \
-	      -e "s/def next/def __next__/g" \
-	      -e "s/LANGUAGE plpythonu/LANGUAGE plpython3u/g" \
-	      -e "s/LANGUAGE plpython2u/LANGUAGE plpython3u/g" \
-	      -e "s/EXTENSION plpythonu/EXTENSION plpython3u/g" \
-	      -e "s/EXTENSION plpython2u/EXTENSION plpython3u/g" \
-	      -e "s/EXTENSION \([^ ]*\)_plpythonu/EXTENSION \1_plpython3u/g" \
-	      -e "s/EXTENSION \([^ ]*\)_plpython2u/EXTENSION \1_plpython3u/g" \
-	      -e 's/installing required extension "plpython2u"/installing required extension "plpython3u"/g' \
-	    $$file >`echo $$file | sed 's,^.*/\([^/][^/]*/\)\([^/][^/]*\)$$,\1python3/\2,'` || exit; \
+	  sed -f $(top_srcdir)/src/pl/plpython/regress-python3-mangle.sed $$file > \
+	    `echo $$file | sed 's,^.*/\([^/][^/]*/\)\([^/][^/]*\)$$,\1python3/\2,'` || exit; \
 	done
 
 check installcheck: pgregress-python3-mangle
diff --git a/src/pl/plpython/regress-python3-mangle.sed b/src/pl/plpython/regress-python3-mangle.sed
new file mode 100644
index 00000000000..d2fde24e0bf
--- /dev/null
+++ b/src/pl/plpython/regress-python3-mangle.sed
@@ -0,0 +1,13 @@
+s/<type 'exceptions\.\([[:alpha:]]*\)'>/<class '\1'>/g
+s/<type 'long'>/<class 'int'>/g
+s/\([0-9][0-9]*\)L/\1/g
+s/\([ [{]\)u"/\1"/g
+s/\([ [{]\)u'/\1'/g
+s/def next/def __next__/g
+s/LANGUAGE plpythonu/LANGUAGE plpython3u/g
+s/LANGUAGE plpython2u/LANGUAGE plpython3u/g
+s/EXTENSION plpythonu/EXTENSION plpython3u/g
+s/EXTENSION plpython2u/EXTENSION plpython3u/g
+s/EXTENSION \([^ ]*\)_plpythonu/EXTENSION \1_plpython3u/g
+s/EXTENSION \([^ ]*\)_plpython2u/EXTENSION \1_plpython3u/g
+s/installing required extension "plpython2u"/installing required extension "plpython3u"/g
-- 
2.23.0.385.gbc12974a89

v3-0013-Adapt-src-test-ldap-t-001_auth.pl-to-work-with-op.patchtext/x-diff; charset=us-asciiDownload
From 79eaef1e6a8039119d9e7a13671c8f94fecee2c3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 9 Oct 2021 16:42:22 -0700
Subject: [PATCH v3 13/17] Adapt src/test/ldap/t/001_auth.pl to work with
 openldap 2.5.

ldapsearch's deprecated -h/-p arguments were removed, need to use -H now.

Discussion: https://postgr.es/m/20211009233850.wvr6apcrw2ai6cnj@alap3.anarazel.de
Backpatch: 11-, where the tests were added.
---
 src/test/ldap/t/001_auth.pl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index f670bc5e0d5..a025a641b02 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -130,8 +130,8 @@ while (1)
 	last
 	  if (
 		system_log(
-			"ldapsearch", "-h", $ldap_server, "-p",
-			$ldap_port,   "-s", "base",       "-b",
+			"ldapsearch", "-H", "$ldap_url",  "-s",
+			"base",       "-b",
 			$ldap_basedn, "-D", $ldap_rootdn, "-y",
 			$ldap_pwfile, "-n", "'objectclass=*'") == 0);
 	die "cannot connect to slapd" if ++$retries >= 300;
-- 
2.23.0.385.gbc12974a89

v3-0014-wip-don-t-run-ldap-tests-on-windows.patchtext/x-diff; charset=us-asciiDownload
From fddca5d028897e5a5f1d5affe3c426e9721a2655 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 10 Oct 2021 13:49:12 -0700
Subject: [PATCH v3 14/17] wip: don't run ldap tests on windows.

---
 src/test/ldap/t/001_auth.pl | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index a025a641b02..c921a3d4872 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -6,6 +6,13 @@ use warnings;
 use TestLib;
 use PostgresNode;
 use Test::More;
+use Config;
+
+if ($Config{osname} eq 'MSWin32')
+{
+	plan skip_all => 'ldap tests ';
+	exit;
+}
 
 if ($ENV{with_ldap} eq 'yes')
 {
-- 
2.23.0.385.gbc12974a89

v3-0015-wip-split-TESTDIR-into-two.patchtext/x-diff; charset=us-asciiDownload
From 7eed3612b84eba13730c13eaf59cb0d7bdae9d81 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 1 Oct 2021 16:37:52 -0700
Subject: [PATCH v3 15/17] wip: split TESTDIR into two.

---
 src/Makefile.global.in               |  3 +++
 src/bin/psql/t/010_tab_completion.pl | 34 ++++++++++++++--------------
 src/test/perl/TestLib.pm             |  2 +-
 src/tools/msvc/vcregress.pl          |  1 +
 4 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index a4ab27ae145..7505e3fa79d 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -450,6 +450,7 @@ define prove_installcheck
 rm -rf '$(CURDIR)'/tmp_check
 $(MKDIR_P) '$(CURDIR)'/tmp_check
 cd $(srcdir) && \
+   TESTOUTDIR='$(CURDIR)/tmp_check' \
    TESTDIR='$(CURDIR)' PATH="$(bindir):$$PATH" PGPORT='6$(DEF_PGPORT)' \
    top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
@@ -460,6 +461,7 @@ define prove_installcheck
 rm -rf '$(CURDIR)'/tmp_check
 $(MKDIR_P) '$(CURDIR)'/tmp_check
 cd $(srcdir) && \
+   TESTOUTDIR='$(CURDIR)/tmp_check' \
    TESTDIR='$(CURDIR)' PATH="$(bindir):$$PATH" PGPORT='6$(DEF_PGPORT)' \
    top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
@@ -471,6 +473,7 @@ define prove_check
 rm -rf '$(CURDIR)'/tmp_check
 $(MKDIR_P) '$(CURDIR)'/tmp_check
 cd $(srcdir) && \
+   TESTOUTDIR='$(CURDIR)/tmp_check' \
    TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 8695d225451..9123ac4c1f0 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -67,23 +67,23 @@ delete $ENV{LS_COLORS};
 # to run in the build directory so that we can use relative paths to
 # access the tmp_check subdirectory; otherwise the output from filename
 # completion tests is too variable.
-if ($ENV{TESTDIR})
+if ($ENV{TESTOUTDIR})
 {
-	chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+	chdir "$ENV{TESTOUTDIR}" or die "could not chdir to \"$ENV{TESTOUTDIR}\": $!";
 }
 
 # Create some junk files for filename completion testing.
 my $FH;
-open $FH, ">", "tmp_check/somefile"
-  or die("could not create file \"tmp_check/somefile\": $!");
+open $FH, ">", "somefile"
+  or die("could not create file \"somefile\": $!");
 print $FH "some stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile123"
-  or die("could not create file \"tmp_check/afile123\": $!");
+open $FH, ">", "afile123"
+  or die("could not create file \"afile123\": $!");
 print $FH "more stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile456"
-  or die("could not create file \"tmp_check/afile456\": $!");
+open $FH, ">", "afile456"
+  or die("could not create file \"afile456\": $!");
 print $FH "other stuff\n";
 close $FH;
 
@@ -180,16 +180,16 @@ clear_query();
 
 # check filename completion
 check_completion(
-	"\\lo_import tmp_check/some\t",
-	qr|tmp_check/somefile |,
+	"\\lo_import some\t",
+	qr|somefile |,
 	"filename completion with one possibility");
 
 clear_query();
 
 # note: readline might print a bell before the completion
 check_completion(
-	"\\lo_import tmp_check/af\t",
-	qr|tmp_check/af\a?ile|,
+	"\\lo_import af\t",
+	qr|af\a?ile|,
 	"filename completion with multiple possibilities");
 
 clear_query();
@@ -198,15 +198,15 @@ clear_query();
 # note: broken versions of libedit want to backslash the closing quote;
 # not much we can do about that
 check_completion(
-	"COPY foo FROM tmp_check/some\t",
-	qr|'tmp_check/somefile\\?' |,
+	"COPY foo FROM some\t",
+	qr|'somefile\\?' |,
 	"quoted filename completion with one possibility");
 
 clear_line();
 
 check_completion(
-	"COPY foo FROM tmp_check/af\t",
-	qr|'tmp_check/afile|,
+	"COPY foo FROM af\t",
+	qr|'afile|,
 	"quoted filename completion with multiple possibilities");
 
 # some versions of readline/libedit require two tabs here, some only need one
@@ -214,7 +214,7 @@ check_completion(
 # the quotes might appear, too
 check_completion(
 	"\t\t",
-	qr|afile123'? +'?(tmp_check/)?afile456|,
+	qr|afile123'? +'?afile456|,
 	"offer multiple file choices");
 
 clear_line();
diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm
index 06aae1760eb..b3ae976d85c 100644
--- a/src/test/perl/TestLib.pm
+++ b/src/test/perl/TestLib.pm
@@ -187,7 +187,7 @@ INIT
 	# Determine output directories, and create them.  The base path is the
 	# TESTDIR environment variable, which is normally set by the invoking
 	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check";
+	$tmp_check = $ENV{TESTOUTDIR} ? "$ENV{TESTOUTDIR}" : "tmp_check";
 	$log_path = "$tmp_check/log";
 
 	mkdir $tmp_check;
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index 35e8f67f013..d2f5ef1118a 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -248,6 +248,7 @@ sub tap_check
 	$ENV{REGRESS_SHLIB} = "$topdir/src/test/regress/regress.dll";
 
 	$ENV{TESTDIR} = "$dir";
+	$ENV{TESTOUTDIR} = "$dir/tmp_check";
 
 	rmtree('tmp_check');
 	system(@args);
-- 
2.23.0.385.gbc12974a89

v3-0016-meson-Add-draft-of-a-meson-based-buildsystem.patchtext/x-diff; charset=utf-8Download
From b41aabee7aa54ec2f8e0c1fd770c0ee52b09ca12 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 10 Sep 2021 09:51:51 -0700
Subject: [PATCH v3 16/17] meson: Add draft of a meson based buildsystem.

Author: Andres Freund
Author: Thomas Munro
---
 contrib/adminpack/meson.build                 |   20 +
 contrib/amcheck/meson.build                   |   35 +
 contrib/auth_delay/meson.build                |    4 +
 contrib/auto_explain/meson.build              |   13 +
 contrib/bloom/meson.build                     |   38 +
 contrib/bool_plperl/meson.build               |   37 +
 contrib/btree_gin/meson.build                 |   51 +
 contrib/btree_gist/meson.build                |   79 +
 contrib/citext/meson.build                    |   29 +
 contrib/cube/meson.build                      |   42 +
 contrib/dblink/meson.build                    |   29 +
 contrib/dict_int/meson.build                  |   19 +
 contrib/dict_xsyn/meson.build                 |   26 +
 contrib/earthdistance/meson.build             |   20 +
 contrib/file_fdw/meson.build                  |   19 +
 contrib/fuzzystrmatch/meson.build             |   23 +
 contrib/hstore/meson.build                    |   36 +
 contrib/hstore_plperl/meson.build             |   38 +
 contrib/hstore_plpython/expected/meson.build  |   15 +
 contrib/hstore_plpython/meson.build           |   44 +
 contrib/hstore_plpython/sql/meson.build       |   17 +
 contrib/jsonb_plperl/meson.build              |   37 +
 contrib/jsonb_plpython/expected/meson.build   |   15 +
 contrib/jsonb_plpython/meson.build            |   44 +
 contrib/jsonb_plpython/sql/meson.build        |   17 +
 contrib/meson.build                           |   63 +
 contrib/oid2name/meson.build                  |   14 +
 contrib/pageinspect/meson.build               |   45 +
 contrib/pg_prewarm/meson.build                |   16 +
 contrib/pg_stat_statements/meson.build        |   31 +
 contrib/pg_trgm/meson.build                   |   33 +
 contrib/pg_visibility/meson.build             |   25 +
 contrib/postgres_fdw/meson.build              |   31 +
 contrib/spi/meson.build                       |   43 +
 contrib/test_decoding/meson.build             |   69 +
 contrib/tsm_system_rows/meson.build           |   22 +
 contrib/tsm_system_time/meson.build           |   22 +
 contrib/unaccent/meson.build                  |   30 +
 contrib/vacuumlo/meson.build                  |   14 +
 contrib/xml2/meson.build                      |   30 +
 conversion_helpers.txt                        |    6 +
 meson.build                                   | 1901 +++++++++++++++++
 meson_options.txt                             |   81 +
 src/backend/access/brin/meson.build           |   12 +
 src/backend/access/common/meson.build         |   18 +
 src/backend/access/gin/meson.build            |   17 +
 src/backend/access/gist/meson.build           |   13 +
 src/backend/access/hash/meson.build           |   12 +
 src/backend/access/heap/meson.build           |   11 +
 src/backend/access/index/meson.build          |    6 +
 src/backend/access/meson.build                |   13 +
 src/backend/access/nbtree/meson.build         |   13 +
 src/backend/access/rmgrdesc/meson.build       |   26 +
 src/backend/access/spgist/meson.build         |   13 +
 src/backend/access/table/meson.build          |    6 +
 src/backend/access/tablesample/meson.build    |    5 +
 src/backend/access/transam/meson.build        |   28 +
 src/backend/bootstrap/meson.build             |   12 +
 src/backend/catalog/meson.build               |   41 +
 src/backend/commands/meson.build              |   50 +
 src/backend/executor/meson.build              |   67 +
 src/backend/foreign/meson.build               |    3 +
 src/backend/jit/llvm/meson.build              |   41 +
 src/backend/jit/meson.build                   |    3 +
 src/backend/lib/meson.build                   |   12 +
 src/backend/libpq/meson.build                 |   28 +
 src/backend/main/meson.build                  |    2 +
 src/backend/meson.build                       |  191 ++
 src/backend/nodes/meson.build                 |   17 +
 src/backend/optimizer/geqo/meson.build        |   17 +
 src/backend/optimizer/meson.build             |    5 +
 src/backend/optimizer/path/meson.build        |   11 +
 src/backend/optimizer/plan/meson.build        |   10 +
 src/backend/optimizer/prep/meson.build        |    7 +
 src/backend/optimizer/util/meson.build        |   16 +
 src/backend/parser/meson.build                |   43 +
 src/backend/partitioning/meson.build          |    5 +
 src/backend/port/meson.build                  |   28 +
 src/backend/port/win32/meson.build            |    6 +
 src/backend/postmaster/meson.build            |   15 +
 src/backend/regex/meson.build                 |   15 +
 .../replication/libpqwalreceiver/meson.build  |   13 +
 src/backend/replication/logical/meson.build   |   14 +
 src/backend/replication/meson.build           |   42 +
 src/backend/replication/pgoutput/meson.build  |   11 +
 src/backend/rewrite/meson.build               |    9 +
 src/backend/snowball/meson.build              |   83 +
 src/backend/statistics/meson.build            |    6 +
 src/backend/storage/buffer/meson.build        |    7 +
 src/backend/storage/file/meson.build          |    8 +
 src/backend/storage/freespace/meson.build     |    5 +
 src/backend/storage/ipc/meson.build           |   20 +
 src/backend/storage/large_object/meson.build  |    3 +
 src/backend/storage/lmgr/meson.build          |   18 +
 src/backend/storage/meson.build               |    9 +
 src/backend/storage/page/meson.build          |    5 +
 src/backend/storage/smgr/meson.build          |    4 +
 src/backend/storage/sync/meson.build          |    4 +
 src/backend/tcop/meson.build                  |    8 +
 src/backend/tsearch/meson.build               |   21 +
 src/backend/utils/activity/meson.build        |    5 +
 src/backend/utils/adt/meson.build             |  118 +
 src/backend/utils/cache/meson.build           |   16 +
 src/backend/utils/error/meson.build           |    4 +
 src/backend/utils/fmgr/meson.build            |    8 +
 src/backend/utils/hash/meson.build            |    4 +
 src/backend/utils/init/meson.build            |    4 +
 .../utils/mb/conversion_procs/meson.build     |   38 +
 src/backend/utils/mb/meson.build              |    9 +
 src/backend/utils/meson.build                 |   13 +
 src/backend/utils/misc/meson.build            |   28 +
 src/backend/utils/mmgr/meson.build            |   10 +
 src/backend/utils/mmgr/proxy.c                |  217 ++
 src/backend/utils/resowner/meson.build        |    3 +
 src/backend/utils/sort/meson.build            |    7 +
 src/backend/utils/time/meson.build            |    4 +
 src/bin/initdb/meson.build                    |   24 +
 src/bin/meson.build                           |   20 +
 src/bin/pg_amcheck/meson.build                |   22 +
 src/bin/pg_archivecleanup/meson.build         |   14 +
 src/bin/pg_basebackup/meson.build             |   44 +
 src/bin/pg_checksums/meson.build              |   16 +
 src/bin/pg_config/meson.build                 |   14 +
 src/bin/pg_controldata/meson.build            |   14 +
 src/bin/pg_ctl/meson.build                    |   17 +
 src/bin/pg_dump/meson.build                   |   69 +
 src/bin/pg_resetwal/meson.build               |   15 +
 src/bin/pg_rewind/meson.build                 |   34 +
 src/bin/pg_test_fsync/meson.build             |   14 +
 src/bin/pg_test_timing/meson.build            |   14 +
 src/bin/pg_upgrade/meson.build                |   26 +
 src/bin/pg_verifybackup/meson.build           |   25 +
 src/bin/pg_waldump/meson.build                |   23 +
 src/bin/pgbench/meson.build                   |   38 +
 src/bin/pgevent/meson.build                   |    1 +
 src/bin/psql/meson.build                      |   46 +
 src/bin/scripts/meson.build                   |   46 +
 src/common/meson.build                        |  140 ++
 src/fe_utils/meson.build                      |   27 +
 src/include/catalog/meson.build               |  113 +
 src/include/meson.build                       |   50 +
 src/include/parser/meson.build                |   10 +
 src/include/pch/c_pch.h                       |    1 +
 src/include/pch/postgres_pch.h                |    1 +
 src/include/pg_config_ext.h.meson             |    7 +
 src/include/storage/meson.build               |   15 +
 src/include/utils/meson.build                 |   22 +
 src/interfaces/libpq/meson.build              |   99 +
 src/meson.build                               |   10 +
 src/pl/meson.build                            |    4 +
 src/pl/plperl/meson.build                     |   81 +
 src/pl/plpgsql/meson.build                    |    1 +
 src/pl/plpgsql/src/meson.build                |   67 +
 src/pl/plpython/expected/meson.build          |   14 +
 src/pl/plpython/meson.build                   |  100 +
 src/pl/plpython/sql/meson.build               |   15 +
 src/port/meson.build                          |  146 ++
 src/test/authentication/meson.build           |    9 +
 src/test/isolation/meson.build                |   49 +
 src/test/kerberos/meson.build                 |   12 +
 src/test/ldap/meson.build                     |    9 +
 src/test/meson.build                          |   19 +
 src/test/modules/brin/meson.build             |   19 +
 src/test/modules/commit_ts/meson.build        |   20 +
 src/test/modules/delay_execution/meson.build  |   15 +
 src/test/modules/dummy_index_am/meson.build   |   20 +
 src/test/modules/dummy_seclabel/meson.build   |   20 +
 src/test/modules/libpq_pipeline/meson.build   |   21 +
 src/test/modules/meson.build                  |   25 +
 src/test/modules/plsample/meson.build         |   20 +
 src/test/modules/snapshot_too_old/meson.build |   11 +
 src/test/modules/spgist_name_ops/meson.build  |   20 +
 .../ssl_passphrase_callback/meson.build       |   45 +
 src/test/modules/test_bloomfilter/meson.build |   20 +
 src/test/modules/test_ddl_deparse/meson.build |   40 +
 src/test/modules/test_extensions/meson.build  |   38 +
 .../modules/test_ginpostinglist/meson.build   |   20 +
 src/test/modules/test_integerset/meson.build  |   20 +
 src/test/modules/test_misc/meson.build        |    8 +
 src/test/modules/test_parser/meson.build      |   20 +
 src/test/modules/test_pg_dump/meson.build     |   24 +
 src/test/modules/test_predtest/meson.build    |   20 +
 src/test/modules/test_rbtree/meson.build      |   20 +
 src/test/modules/test_regex/meson.build       |   21 +
 src/test/modules/test_rls_hooks/meson.build   |   19 +
 src/test/modules/test_shm_mq/meson.build      |   24 +
 src/test/modules/unsafe_tests/meson.build     |    9 +
 src/test/modules/worker_spi/meson.build       |   23 +
 src/test/recovery/meson.build                 |   33 +
 src/test/regress/meson.build                  |   57 +
 src/test/ssl/meson.build                      |   10 +
 src/test/subscription/meson.build             |   33 +
 src/timezone/meson.build                      |   50 +
 src/timezone/tznames/meson.build              |   20 +
 src/tools/find_meson                          |   20 +
 src/tools/irlink                              |   28 +
 src/tools/msvc/export2def.pl                  |   22 +
 src/tools/msvc/gendef2.pl                     |  177 ++
 src/tools/testwrap                            |   22 +
 199 files changed, 7430 insertions(+)
 create mode 100644 contrib/adminpack/meson.build
 create mode 100644 contrib/amcheck/meson.build
 create mode 100644 contrib/auth_delay/meson.build
 create mode 100644 contrib/auto_explain/meson.build
 create mode 100644 contrib/bloom/meson.build
 create mode 100644 contrib/bool_plperl/meson.build
 create mode 100644 contrib/btree_gin/meson.build
 create mode 100644 contrib/btree_gist/meson.build
 create mode 100644 contrib/citext/meson.build
 create mode 100644 contrib/cube/meson.build
 create mode 100644 contrib/dblink/meson.build
 create mode 100644 contrib/dict_int/meson.build
 create mode 100644 contrib/dict_xsyn/meson.build
 create mode 100644 contrib/earthdistance/meson.build
 create mode 100644 contrib/file_fdw/meson.build
 create mode 100644 contrib/fuzzystrmatch/meson.build
 create mode 100644 contrib/hstore/meson.build
 create mode 100644 contrib/hstore_plperl/meson.build
 create mode 100644 contrib/hstore_plpython/expected/meson.build
 create mode 100644 contrib/hstore_plpython/meson.build
 create mode 100644 contrib/hstore_plpython/sql/meson.build
 create mode 100644 contrib/jsonb_plperl/meson.build
 create mode 100644 contrib/jsonb_plpython/expected/meson.build
 create mode 100644 contrib/jsonb_plpython/meson.build
 create mode 100644 contrib/jsonb_plpython/sql/meson.build
 create mode 100644 contrib/meson.build
 create mode 100644 contrib/oid2name/meson.build
 create mode 100644 contrib/pageinspect/meson.build
 create mode 100644 contrib/pg_prewarm/meson.build
 create mode 100644 contrib/pg_stat_statements/meson.build
 create mode 100644 contrib/pg_trgm/meson.build
 create mode 100644 contrib/pg_visibility/meson.build
 create mode 100644 contrib/postgres_fdw/meson.build
 create mode 100644 contrib/spi/meson.build
 create mode 100644 contrib/test_decoding/meson.build
 create mode 100644 contrib/tsm_system_rows/meson.build
 create mode 100644 contrib/tsm_system_time/meson.build
 create mode 100644 contrib/unaccent/meson.build
 create mode 100644 contrib/vacuumlo/meson.build
 create mode 100644 contrib/xml2/meson.build
 create mode 100644 conversion_helpers.txt
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 src/backend/access/brin/meson.build
 create mode 100644 src/backend/access/common/meson.build
 create mode 100644 src/backend/access/gin/meson.build
 create mode 100644 src/backend/access/gist/meson.build
 create mode 100644 src/backend/access/hash/meson.build
 create mode 100644 src/backend/access/heap/meson.build
 create mode 100644 src/backend/access/index/meson.build
 create mode 100644 src/backend/access/meson.build
 create mode 100644 src/backend/access/nbtree/meson.build
 create mode 100644 src/backend/access/rmgrdesc/meson.build
 create mode 100644 src/backend/access/spgist/meson.build
 create mode 100644 src/backend/access/table/meson.build
 create mode 100644 src/backend/access/tablesample/meson.build
 create mode 100644 src/backend/access/transam/meson.build
 create mode 100644 src/backend/bootstrap/meson.build
 create mode 100644 src/backend/catalog/meson.build
 create mode 100644 src/backend/commands/meson.build
 create mode 100644 src/backend/executor/meson.build
 create mode 100644 src/backend/foreign/meson.build
 create mode 100644 src/backend/jit/llvm/meson.build
 create mode 100644 src/backend/jit/meson.build
 create mode 100644 src/backend/lib/meson.build
 create mode 100644 src/backend/libpq/meson.build
 create mode 100644 src/backend/main/meson.build
 create mode 100644 src/backend/meson.build
 create mode 100644 src/backend/nodes/meson.build
 create mode 100644 src/backend/optimizer/geqo/meson.build
 create mode 100644 src/backend/optimizer/meson.build
 create mode 100644 src/backend/optimizer/path/meson.build
 create mode 100644 src/backend/optimizer/plan/meson.build
 create mode 100644 src/backend/optimizer/prep/meson.build
 create mode 100644 src/backend/optimizer/util/meson.build
 create mode 100644 src/backend/parser/meson.build
 create mode 100644 src/backend/partitioning/meson.build
 create mode 100644 src/backend/port/meson.build
 create mode 100644 src/backend/port/win32/meson.build
 create mode 100644 src/backend/postmaster/meson.build
 create mode 100644 src/backend/regex/meson.build
 create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
 create mode 100644 src/backend/replication/logical/meson.build
 create mode 100644 src/backend/replication/meson.build
 create mode 100644 src/backend/replication/pgoutput/meson.build
 create mode 100644 src/backend/rewrite/meson.build
 create mode 100644 src/backend/snowball/meson.build
 create mode 100644 src/backend/statistics/meson.build
 create mode 100644 src/backend/storage/buffer/meson.build
 create mode 100644 src/backend/storage/file/meson.build
 create mode 100644 src/backend/storage/freespace/meson.build
 create mode 100644 src/backend/storage/ipc/meson.build
 create mode 100644 src/backend/storage/large_object/meson.build
 create mode 100644 src/backend/storage/lmgr/meson.build
 create mode 100644 src/backend/storage/meson.build
 create mode 100644 src/backend/storage/page/meson.build
 create mode 100644 src/backend/storage/smgr/meson.build
 create mode 100644 src/backend/storage/sync/meson.build
 create mode 100644 src/backend/tcop/meson.build
 create mode 100644 src/backend/tsearch/meson.build
 create mode 100644 src/backend/utils/activity/meson.build
 create mode 100644 src/backend/utils/adt/meson.build
 create mode 100644 src/backend/utils/cache/meson.build
 create mode 100644 src/backend/utils/error/meson.build
 create mode 100644 src/backend/utils/fmgr/meson.build
 create mode 100644 src/backend/utils/hash/meson.build
 create mode 100644 src/backend/utils/init/meson.build
 create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
 create mode 100644 src/backend/utils/mb/meson.build
 create mode 100644 src/backend/utils/meson.build
 create mode 100644 src/backend/utils/misc/meson.build
 create mode 100644 src/backend/utils/mmgr/meson.build
 create mode 100644 src/backend/utils/mmgr/proxy.c
 create mode 100644 src/backend/utils/resowner/meson.build
 create mode 100644 src/backend/utils/sort/meson.build
 create mode 100644 src/backend/utils/time/meson.build
 create mode 100644 src/bin/initdb/meson.build
 create mode 100644 src/bin/meson.build
 create mode 100644 src/bin/pg_amcheck/meson.build
 create mode 100644 src/bin/pg_archivecleanup/meson.build
 create mode 100644 src/bin/pg_basebackup/meson.build
 create mode 100644 src/bin/pg_checksums/meson.build
 create mode 100644 src/bin/pg_config/meson.build
 create mode 100644 src/bin/pg_controldata/meson.build
 create mode 100644 src/bin/pg_ctl/meson.build
 create mode 100644 src/bin/pg_dump/meson.build
 create mode 100644 src/bin/pg_resetwal/meson.build
 create mode 100644 src/bin/pg_rewind/meson.build
 create mode 100644 src/bin/pg_test_fsync/meson.build
 create mode 100644 src/bin/pg_test_timing/meson.build
 create mode 100644 src/bin/pg_upgrade/meson.build
 create mode 100644 src/bin/pg_verifybackup/meson.build
 create mode 100644 src/bin/pg_waldump/meson.build
 create mode 100644 src/bin/pgbench/meson.build
 create mode 100644 src/bin/pgevent/meson.build
 create mode 100644 src/bin/psql/meson.build
 create mode 100644 src/bin/scripts/meson.build
 create mode 100644 src/common/meson.build
 create mode 100644 src/fe_utils/meson.build
 create mode 100644 src/include/catalog/meson.build
 create mode 100644 src/include/meson.build
 create mode 100644 src/include/parser/meson.build
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/postgres_pch.h
 create mode 100644 src/include/pg_config_ext.h.meson
 create mode 100644 src/include/storage/meson.build
 create mode 100644 src/include/utils/meson.build
 create mode 100644 src/interfaces/libpq/meson.build
 create mode 100644 src/meson.build
 create mode 100644 src/pl/meson.build
 create mode 100644 src/pl/plperl/meson.build
 create mode 100644 src/pl/plpgsql/meson.build
 create mode 100644 src/pl/plpgsql/src/meson.build
 create mode 100644 src/pl/plpython/expected/meson.build
 create mode 100644 src/pl/plpython/meson.build
 create mode 100644 src/pl/plpython/sql/meson.build
 create mode 100644 src/port/meson.build
 create mode 100644 src/test/authentication/meson.build
 create mode 100644 src/test/isolation/meson.build
 create mode 100644 src/test/kerberos/meson.build
 create mode 100644 src/test/ldap/meson.build
 create mode 100644 src/test/meson.build
 create mode 100644 src/test/modules/brin/meson.build
 create mode 100644 src/test/modules/commit_ts/meson.build
 create mode 100644 src/test/modules/delay_execution/meson.build
 create mode 100644 src/test/modules/dummy_index_am/meson.build
 create mode 100644 src/test/modules/dummy_seclabel/meson.build
 create mode 100644 src/test/modules/libpq_pipeline/meson.build
 create mode 100644 src/test/modules/meson.build
 create mode 100644 src/test/modules/plsample/meson.build
 create mode 100644 src/test/modules/snapshot_too_old/meson.build
 create mode 100644 src/test/modules/spgist_name_ops/meson.build
 create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
 create mode 100644 src/test/modules/test_bloomfilter/meson.build
 create mode 100644 src/test/modules/test_ddl_deparse/meson.build
 create mode 100644 src/test/modules/test_extensions/meson.build
 create mode 100644 src/test/modules/test_ginpostinglist/meson.build
 create mode 100644 src/test/modules/test_integerset/meson.build
 create mode 100644 src/test/modules/test_misc/meson.build
 create mode 100644 src/test/modules/test_parser/meson.build
 create mode 100644 src/test/modules/test_pg_dump/meson.build
 create mode 100644 src/test/modules/test_predtest/meson.build
 create mode 100644 src/test/modules/test_rbtree/meson.build
 create mode 100644 src/test/modules/test_regex/meson.build
 create mode 100644 src/test/modules/test_rls_hooks/meson.build
 create mode 100644 src/test/modules/test_shm_mq/meson.build
 create mode 100644 src/test/modules/unsafe_tests/meson.build
 create mode 100644 src/test/modules/worker_spi/meson.build
 create mode 100644 src/test/recovery/meson.build
 create mode 100644 src/test/regress/meson.build
 create mode 100644 src/test/ssl/meson.build
 create mode 100644 src/test/subscription/meson.build
 create mode 100644 src/timezone/meson.build
 create mode 100644 src/timezone/tznames/meson.build
 create mode 100755 src/tools/find_meson
 create mode 100644 src/tools/irlink
 create mode 100644 src/tools/msvc/export2def.pl
 create mode 100644 src/tools/msvc/gendef2.pl
 create mode 100755 src/tools/testwrap

diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..457a6089445
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,20 @@
+autoinc = shared_module('adminpack',
+  ['adminpack.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'adminpack.control',
+  'adminpack--1.0.sql',
+  'adminpack--1.0--1.1.sql',
+  'adminpack--1.1--2.0.sql',
+  'adminpack--2.0--2.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'adminpack',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': ['adminpack'],
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..7d6a7bc8385
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,35 @@
+amcheck = shared_module('amcheck', [
+    'verify_heapam.c',
+    'verify_nbtree.c',
+  ],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'amcheck.control',
+  'amcheck--1.0.sql',
+  'amcheck--1.0--1.1.sql',
+  'amcheck--1.1--1.2.sql',
+  'amcheck--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'check',
+    'check_btree',
+    'check_heap'
+  ],
+}
+
+tap_tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_verify_heapam.pl',
+  ],
+}
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..941bb6f39a4
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,4 @@
+autoinc = shared_module('auth_delay',
+  ['auth_delay.c'],
+  kwargs: contrib_mod_args,
+)
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..321896efa2c
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,13 @@
+auto_explain = shared_module('auto_explain',
+  files('auto_explain.c'),
+  kwargs: contrib_mod_args,
+)
+
+tap_tests += {
+  'name': 'auto_explain',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_auto_explain.pl',
+  ]
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..5c5d33c7f7a
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,38 @@
+bloom_sources = files(
+  'blcost.c',
+  'blinsert.c',
+  'blscan.c',
+  'blutils.c',
+  'blvacuum.c',
+  'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+  bloom_sources,
+  c_pch: '../../src/include/pch/c_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'bloom.control',
+  'bloom--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'bloom'
+  ],
+}
+
+tap_tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_wal.pl',
+  ],
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..e15dc5285eb
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,37 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+bool_plperl_sources = files(
+  'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+  bool_plperl_sources,
+  include_directories: [plperl_inc, include_directories('.')],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'bool_plperl.control',
+  'bool_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'bool_plperlu.control',
+  'bool_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'bool_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'bool_plperl',
+    'bool_plperlu',
+  ],
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..d25ece7500e
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,51 @@
+btree_gin = shared_module('btree_gin',
+  files('btree_gin.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gin.control',
+  'btree_gin--1.0.sql',
+  'btree_gin--1.0--1.1.sql',
+  'btree_gin--1.1--1.2.sql',
+  'btree_gin--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'btree_gin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'install_btree_gin',
+    'int2',
+    'int4',
+    'int8',
+    'float4',
+    'float8',
+    'money',
+    'oid',
+    'timestamp',
+    'timestamptz',
+    'time',
+    'timetz',
+    'date',
+    'interval',
+    'macaddr',
+    'macaddr8',
+    'inet',
+    'cidr',
+    'text',
+    'varchar',
+    'char',
+    'bytea',
+    'bit',
+    'varbit',
+    'numeric',
+    'enum',
+    'uuid',
+    'name',
+    'bool',
+    'bpchar',
+  ],
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..8ee0faea401
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,79 @@
+btree_gist_sources = files(
+  'btree_bit.c',
+  'btree_bytea.c',
+  'btree_cash.c',
+  'btree_date.c',
+  'btree_enum.c',
+  'btree_float4.c',
+  'btree_float8.c',
+  'btree_gist.c',
+  'btree_inet.c',
+  'btree_int2.c',
+  'btree_int4.c',
+  'btree_int8.c',
+  'btree_interval.c',
+  'btree_macaddr.c',
+  'btree_macaddr8.c',
+  'btree_numeric.c',
+  'btree_oid.c',
+  'btree_text.c',
+  'btree_time.c',
+  'btree_ts.c',
+  'btree_utils_num.c',
+  'btree_utils_var.c',
+  'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+  btree_gist_sources,
+  c_pch: '../../src/include/pch/c_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gist.control',
+  'btree_gist--1.0--1.1.sql',
+  'btree_gist--1.1--1.2.sql',
+  'btree_gist--1.2.sql',
+  'btree_gist--1.2--1.3.sql',
+  'btree_gist--1.3--1.4.sql',
+  'btree_gist--1.4--1.5.sql',
+  'btree_gist--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'btree_gist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'init',
+    'int2',
+    'int4',
+    'int8',
+    'float4',
+    'float8',
+    'cash',
+    'oid',
+    'timestamp',
+    'timestamptz',
+    'time',
+    'timetz',
+    'date',
+    'interval',
+    'macaddr',
+    'macaddr8',
+    'inet',
+    'cidr',
+    'text',
+    'varchar',
+    'char',
+    'bytea',
+    'bit',
+    'varbit',
+    'numeric',
+    'uuid',
+    'not_equal',
+    'enum',
+  ],
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..f2e9ff2117d
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,29 @@
+citext_sources = files(
+  'citext.c',
+)
+
+citext = shared_module('citext',
+  citext_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'citext.control',
+  'citext--1.0--1.1.sql',
+  'citext--1.1--1.2.sql',
+  'citext--1.2--1.3.sql',
+  'citext--1.3--1.4.sql',
+  'citext--1.4.sql',
+  'citext--1.4--1.5.sql',
+  'citext--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'citext',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'citext'
+  ],
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..49276aed644
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,42 @@
+cube_sources = files(
+  'cube.c',
+)
+
+# cubescan is compiled as part of cubeparse
+cubescan = custom_target('cubescan',
+  input: ['cubescan.l'],
+  output: ['cubescan.c'],
+  command: [flex, '-CFe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+cube_sources += custom_target('cubeparse',
+  input: 'cubeparse.y',
+  output: 'cubeparse.c',
+  depends: cubescan,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+cube = shared_module('cube',
+  cube_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'cube.control',
+  'cube--1.0--1.1.sql',
+  'cube--1.1--1.2.sql',
+  'cube--1.2.sql',
+  'cube--1.2--1.3.sql',
+  'cube--1.3--1.4.sql',
+  'cube--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'cube',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'cube',
+    'cube_sci',
+  ],
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..7ac253700c9
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,29 @@
+dblink_sources = files(
+  'dblink.c',
+)
+
+dblink = shared_module('dblink',
+  dblink_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'dblink.control',
+  'dblink--1.0--1.1.sql',
+  'dblink--1.1--1.2.sql',
+  'dblink--1.2.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dblink',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'paths',
+    'dblink'
+  ],
+  'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..7c23b275c5a
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,19 @@
+dict_int = shared_module('dict_int',
+  files('dict_int.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_int.control',
+  'dict_int--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dict_int',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'dict_int'
+  ],
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..7cbabba02f1
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,26 @@
+dict_xsyn = shared_module('dict_xsyn',
+  files('dict_xsyn.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_xsyn.control',
+  'dict_xsyn--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'xsyn_sample.rules',
+  kwargs: contrib_data_args + {
+    'install_dir': get_option('datadir') / 'tsearch_data'
+  }
+)
+
+regress_tests += {
+  'name': 'dict_xsyn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'dict_xsyn'
+  ],
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..d56abf4f260
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,20 @@
+earthdistance = shared_module('earthdistance',
+  files('earthdistance.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'earthdistance.control',
+  'earthdistance--1.0--1.1.sql',
+  'earthdistance--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'earthdistance',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'earthdistance'
+  ],
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..0cd3348dfd0
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,19 @@
+file_fdw = shared_module('file_fdw',
+  files('file_fdw.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'file_fdw.control',
+  'file_fdw--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'file_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'file_fdw'
+  ],
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..d1e75479668
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,23 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+  files(
+    'fuzzystrmatch.c',
+    'dmetaphone.c'
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'fuzzystrmatch.control',
+  'fuzzystrmatch--1.0--1.1.sql',
+  'fuzzystrmatch--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'fuzzystrmatch',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'fuzzystrmatch'
+  ],
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..661e61f9692
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,36 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+  files(
+    'hstore_compat.c',
+    'hstore_gin.c',
+    'hstore_gist.c',
+    'hstore_io.c',
+    'hstore_op.c',
+    'hstore_subs.c',
+  ),
+  c_pch: '../../src/include/pch/c_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'hstore.control',
+  'hstore--1.1--1.2.sql',
+  'hstore--1.3--1.4.sql',
+  'hstore--1.4.sql',
+  'hstore--1.4--1.5.sql',
+  'hstore--1.5--1.6.sql',
+  'hstore--1.6--1.7.sql',
+  'hstore--1.7--1.8.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'hstore',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'hstore'
+  ],
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..48231cb1c9e
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,38 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+hstore_plperl_sources = files(
+  'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+  hstore_plperl_sources,
+  include_directories: [plperl_inc, hstore_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plperl.control',
+  'hstore_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'hstore_plperlu.control',
+  'hstore_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'hstore_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'hstore_plperl',
+    'hstore_plperlu',
+    'create_transform',
+  ],
+}
diff --git a/contrib/hstore_plpython/expected/meson.build b/contrib/hstore_plpython/expected/meson.build
new file mode 100644
index 00000000000..5a33c3752ef
--- /dev/null
+++ b/contrib/hstore_plpython/expected/meson.build
@@ -0,0 +1,15 @@
+foreach r2 : hstore_plpython_regress
+  # string.replace is only in meson 0.58
+  r3 = 'plpython3' + r2.split('plpython')[1]
+
+  s2 = '@0@.out'.format(r2)
+  s3 = '@0@.out'.format(r3)
+  hstore_plpython3_deps += custom_target(s3,
+    input: '@0@.out'.format(r2),
+    output: '@0@.out'.format(r3),
+    capture: true,
+    command: plpython_regress_cmd,
+    build_by_default: false,
+    install: false,
+  )
+endforeach
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..3c47a71e430
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,44 @@
+if not python3.found()
+  subdir_done()
+endif
+
+hstore_plpython_sources = files(
+  'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+  hstore_plpython_sources,
+  include_directories: [plpython_inc, hstore_inc, ],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plpythonu.control',
+  'hstore_plpython2u.control',
+  'hstore_plpython3u.control',
+  'hstore_plpythonu--1.0.sql',
+  'hstore_plpython2u--1.0.sql',
+  'hstore_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = ['hstore_plpython']
+
+hstore_plpython3_regress = []
+hstore_plpython3_deps = []
+
+# FIXME: this is an abysmal hack
+subdir('sql')
+subdir('expected')
+
+regress_tests += {
+  'name': 'hstore_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': hstore_plpython3_regress,
+  'deps': hstore_plpython3_deps,
+  'regress_args': ['--inputdir', meson.current_build_dir(), '--load-extension=hstore'],
+}
diff --git a/contrib/hstore_plpython/sql/meson.build b/contrib/hstore_plpython/sql/meson.build
new file mode 100644
index 00000000000..612980fd37c
--- /dev/null
+++ b/contrib/hstore_plpython/sql/meson.build
@@ -0,0 +1,17 @@
+# Convert plpython2 regression tests to plpython3 ones
+foreach r2 : hstore_plpython_regress
+  # string.replace is only in meson 0.58
+  r3 = 'plpython3' + r2.split('plpython')[1]
+  hstore_plpython3_regress += r3
+
+  s2 = '@0@.sql'.format(r2)
+  s3 = '@0@.sql'.format(r3)
+  hstore_plpython3_deps += custom_target(s3,
+    input: '@0@.sql'.format(r2),
+    output: '@0@.sql'.format(r3),
+    capture: true,
+    command: plpython_regress_cmd,
+    build_by_default: false,
+    install: false,
+  )
+endforeach
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..c34090e5f5c
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,37 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+  'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+  jsonb_plperl_sources,
+  include_directories: [plperl_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plperl.control',
+  'jsonb_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'jsonb_plperlu.control',
+  'jsonb_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'jsonb_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'jsonb_plperl',
+    'jsonb_plperlu',
+  ],
+}
diff --git a/contrib/jsonb_plpython/expected/meson.build b/contrib/jsonb_plpython/expected/meson.build
new file mode 100644
index 00000000000..3840bdd92e5
--- /dev/null
+++ b/contrib/jsonb_plpython/expected/meson.build
@@ -0,0 +1,15 @@
+foreach r2 : jsonb_plpython_regress
+  # string.replace is only in meson 0.58
+  r3 = 'plpython3' + r2.split('plpython')[1]
+
+  s2 = '@0@.out'.format(r2)
+  s3 = '@0@.out'.format(r3)
+  jsonb_plpython3_deps += custom_target(s3,
+    input: '@0@.out'.format(r2),
+    output: '@0@.out'.format(r3),
+    capture: true,
+    command: plpython_regress_cmd,
+    build_by_default: false,
+    install: false,
+  )
+endforeach
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..21abebf41b7
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,44 @@
+if not python3.found()
+  subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+  'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+  jsonb_plpython_sources,
+  include_directories: [plpython_inc],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plpythonu.control',
+  'jsonb_plpython2u.control',
+  'jsonb_plpython3u.control',
+  'jsonb_plpythonu--1.0.sql',
+  'jsonb_plpython2u--1.0.sql',
+  'jsonb_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = ['jsonb_plpython']
+
+jsonb_plpython3_regress = []
+jsonb_plpython3_deps = []
+
+# FIXME: this is an abysmal hack
+subdir('sql')
+subdir('expected')
+
+regress_tests += {
+  'name': 'jsonb_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': jsonb_plpython3_regress,
+  'deps': jsonb_plpython3_deps,
+  'regress_args': ['--inputdir', meson.current_build_dir()],
+}
diff --git a/contrib/jsonb_plpython/sql/meson.build b/contrib/jsonb_plpython/sql/meson.build
new file mode 100644
index 00000000000..4b29029192a
--- /dev/null
+++ b/contrib/jsonb_plpython/sql/meson.build
@@ -0,0 +1,17 @@
+# Convert plpython2 regression tests to plpython3 ones
+foreach r2 : jsonb_plpython_regress
+  # string.replace is only in meson 0.58
+  r3 = 'plpython3' + r2.split('plpython')[1]
+  jsonb_plpython3_regress += r3
+
+  s2 = '@0@.sql'.format(r2)
+  s3 = '@0@.sql'.format(r3)
+  jsonb_plpython3_deps += custom_target(s3,
+    input: '@0@.sql'.format(r2),
+    output: '@0@.sql'.format(r3),
+    capture: true,
+    command: plpython_regress_cmd,
+    build_by_default: false,
+    install: false,
+  )
+endforeach
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..0d5f7315ebb
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,63 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = get_option('datadir') / 'extension'
+contrib_data_args = {
+  'install_dir': contrib_data_dir
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('bloom')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+# TODO: intagg
+# TODO: intarray
+# TODO: isn
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+# TODO: lo
+# TODO: ltree
+# TODO: ltree_plpython
+subdir('oid2name')
+# TODO: old_snapshot
+subdir('pageinspect')
+# TODO: passwordcheck
+# TODO: pg_buffercache
+# TODO: pgcrypto
+# TODO: pg_freespacemap
+subdir('pg_prewarm')
+# TODO: pgrowlocks
+subdir('pg_stat_statements')
+# TODO: pgstattuple
+# TODO: pg_surgery
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('postgres_fdw')
+# TODO: seg
+# TODO: sepgsql
+subdir('spi')
+# TODO: sslinfo
+# TODO: start-scripts
+# TODO: tablefunc
+# TODO: tcn
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+# TODO: uuid-ossp
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..bee34d2137c
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,14 @@
+executable('oid2name',
+  ['oid2name.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'oid2name',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_basic.pl',
+  ]
+}
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..4bd5b1784e0
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,45 @@
+pageinspect = shared_module('pageinspect',
+  files(
+    'brinfuncs.c',
+    'btreefuncs.c',
+    'fsmfuncs.c',
+    'ginfuncs.c',
+    'gistfuncs.c',
+    'hashfuncs.c',
+    'heapfuncs.c',
+    'rawpage.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pageinspect--1.0--1.1.sql',
+  'pageinspect--1.1--1.2.sql',
+  'pageinspect--1.2--1.3.sql',
+  'pageinspect--1.3--1.4.sql',
+  'pageinspect--1.4--1.5.sql',
+  'pageinspect--1.5--1.6.sql',
+  'pageinspect--1.5.sql',
+  'pageinspect--1.6--1.7.sql',
+  'pageinspect--1.7--1.8.sql',
+  'pageinspect--1.8--1.9.sql',
+  'pageinspect--1.9--1.10.sql',
+  'pageinspect.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'pageinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'page',
+    'btree',
+    'brin',
+    'gin',
+    'gist',
+    'hash',
+    'checksum',
+    'oldextversions',
+  ],
+}
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..c93ccc2db6d
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,16 @@
+pg_prewarm = shared_module('pg_prewarm',
+  files(
+    'autoprewarm.c',
+    'pg_prewarm.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_prewarm--1.0--1.1.sql',
+  'pg_prewarm--1.1--1.2.sql',
+  'pg_prewarm--1.1.sql',
+  'pg_prewarm.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..6ed70ac0f18
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,31 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+  files('pg_stat_statements.c'),
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_stat_statements.control',
+  'pg_stat_statements--1.4.sql',
+  'pg_stat_statements--1.8--1.9.sql',
+  'pg_stat_statements--1.7--1.8.sql',
+  'pg_stat_statements--1.6--1.7.sql',
+  'pg_stat_statements--1.5--1.6.sql',
+  'pg_stat_statements--1.4--1.5.sql',
+  'pg_stat_statements--1.3--1.4.sql',
+  'pg_stat_statements--1.2--1.3.sql',
+  'pg_stat_statements--1.1--1.2.sql',
+  'pg_stat_statements--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'pg_stat_statements',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'pg_stat_statements'
+  ],
+  'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..0a56926ad6b
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,33 @@
+pg_trgm = shared_module('pg_trgm',
+  files(
+    'trgm_gin.c',
+    'trgm_gist.c',
+    'trgm_op.c',
+    'trgm_regexp.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_trgm--1.0--1.1.sql',
+  'pg_trgm--1.1--1.2.sql',
+  'pg_trgm--1.2--1.3.sql',
+  'pg_trgm--1.3--1.4.sql',
+  'pg_trgm--1.3.sql',
+  'pg_trgm--1.4--1.5.sql',
+  'pg_trgm--1.5--1.6.sql',
+  'pg_trgm.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'pg_trgm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'pg_trgm',
+    'pg_word_trgm',
+    'pg_strict_word_trgm',
+  ],
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..68a7e1cf28c
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,25 @@
+pg_visibility = shared_module('pg_visibility',
+  files(
+    'pg_visibility.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_visibility--1.0--1.1.sql',
+  'pg_visibility--1.1.sql',
+  'pg_visibility--1.1--1.2.sql',
+  'pg_visibility.control',
+  kwargs: contrib_data_args,
+)
+
+
+regress_tests += {
+  'name': 'pg_visibility',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'pg_visibility'
+  ],
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..507d01448b1
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,31 @@
+postgres_fdw_sources = files(
+  'connection.c',
+  'deparse.c',
+  'option.c',
+  'postgres_fdw.c',
+  'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'postgres_fdw.control',
+  'postgres_fdw--1.0.sql',
+  'postgres_fdw--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'postgres_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'postgres_fdw'
+  ],
+  'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+}
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..51bc96ea657
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,43 @@
+autoinc = shared_module('autoinc',
+  ['autoinc.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+  ['insert_username.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('insert_username.control', 'insert_username--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+
+moddatetime = shared_module('moddatetime',
+  ['moddatetime.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('moddatetime.control', 'moddatetime--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+  ['refint.c'],
+  kwargs: contrib_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+  },
+)
+
+install_data('refint.control', 'refint--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..d26b43cbe79
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,69 @@
+test_decoding_sources = files(
+  'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+  test_decoding_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+regress_tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'ddl',
+    'xact',
+    'rewrite',
+    'toast',
+    'permissions',
+    'decoding_in_xact',
+    'decoding_into_rel',
+    'binary',
+    'prepared',
+    'replorigin',
+    'time',
+    'messages',
+    'spill',
+    'slot',
+    'truncate',
+    'stream',
+    'stats',
+    'twophase',
+    'twophase_stream',
+  ],
+  'regress_args': [
+    '--temp-config', files('logical.conf')
+  ]
+}
+
+isolation_tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'mxact',
+    'delayed_startup',
+    'ondisk_startup',
+    'concurrent_ddl_dml',
+    'oldest_xmin',
+    'snapshot_transfer',
+    'subxact_without_top',
+    'concurrent_stream',
+    'twophase_snapshot',
+  ],
+  'regress_args': [
+    '--temp-config', files('logical.conf')
+  ]
+}
+
+
+tap_tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_repl_stats.pl',
+  ],
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..2c8f4487f8d
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,22 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+  files(
+    'tsm_system_rows.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_rows--1.0.sql',
+  'tsm_system_rows.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'tsm_system_rows',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'tsm_system_rows',
+  ],
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..df9c4aa4b51
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,22 @@
+tsm_system_time = shared_module('tsm_system_time',
+  files(
+    'tsm_system_time.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_time--1.0.sql',
+  'tsm_system_time.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'tsm_system_time',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'tsm_system_time',
+  ],
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..e77bf790d8c
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,30 @@
+unaccent = shared_module('unaccent',
+  files(
+    'unaccent.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'unaccent--1.0--1.1.sql',
+  'unaccent--1.1.sql',
+  'unaccent.control',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'unaccent.rules',
+   install_dir: get_option('datadir') / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+regress_tests += {
+  'name': 'unaccent',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'unaccent',
+  ],
+  'regress_args': ['--encoding=UTF8'],
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..99e76daacf9
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,14 @@
+executable('vacuumlo',
+  ['vacuumlo.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'vacuumlo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_basic.pl',
+  ]
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..6f8a26e4f0a
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,30 @@
+if not libxml.found()
+  subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+  files(
+    'xpath.c',
+    'xslt_proc.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args + {
+    'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'xml2--1.0--1.1.sql',
+  'xml2--1.1.sql',
+  'xml2.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'xml2',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'xml2',
+  ],
+}
diff --git a/conversion_helpers.txt b/conversion_helpers.txt
new file mode 100644
index 00000000000..e5879b4fe77
--- /dev/null
+++ b/conversion_helpers.txt
@@ -0,0 +1,6 @@
+convert list of files to quoted-one-per-line:
+
+	?\b\(\(?:\w\|\d\|_\|-\)+\)\.o ?\(?:\\
+\)? →   '\1.c',
+
+
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..c9d123bdac3
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,1901 @@
+project('postgresql',
+  ['c'],
+  version: '15devel',
+  license: 'PostgreSQL',
+  meson_version: '>=0.54',
+  default_options: [
+    'warning_level=2',
+    'b_pie=true',
+    'b_pch=false',
+    'buildtype=release',
+  ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+fs = import('fs')
+
+thread_dep = dependency('threads')
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+  pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+  pg_version_arr = pg_version.split('beta')
+elif pg_version.contains('rc')
+  pg_version_arr = pg_version.split('rc')
+else
+  pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+
+cc = meson.get_compiler('c')
+
+cdata = configuration_data()
+
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', 'https://www.postgresql.org/')
+
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+  pg_version, target_machine.cpu_family(), cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set('PG_VERSION_NUM', (pg_version_major*10000)+pg_version_minor)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Search paths
+#
+# NB: Arguments added globally (via the below, or CFLAGS etc) are not taken
+# into account for configuration-time checks (so they are more
+# isolated). Flags that have to be taken into account for configure checks
+# have to be explicitly specified in configure tests.
+###############################################################
+
+g_inc = []
+g_c_args = []
+g_l_args = []
+
+if host_machine.system() == 'darwin'
+  # XXX, should this be required?
+  xcrun = find_program('xcrun', native: true, required: true)
+
+  sysroot = run_command(xcrun, '--show-sdk-path', check: true).stdout().strip()
+  message('sysroot is >@0@<'.format(sysroot))
+
+  g_c_args += ['-isysroot', sysroot]
+  g_l_args += ['-isysroot', sysroot]
+endif
+
+if host_machine.system() == 'linux' or host_machine.system() == 'cygwin'
+  g_c_args += '-D_GNU_SOURCE'
+endif
+
+g_c_inc = []
+
+g_c_inc += include_directories(get_option('extra_include_dirs'))
+g_c_lib = get_option('extra_lib_dirs')
+
+add_project_arguments(g_c_args, language: ['c', 'cpp'])
+add_project_link_arguments(g_l_args, language: ['c', 'cpp'])
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true)
+flex = find_program(get_option('FLEX'), native: true)
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'))
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+touch = find_program('touch', native: true)
+
+# Internal programs
+find_meson = find_program('src/tools/find_meson', native: true)
+testwrap = find_program('src/tools/testwrap', native: true)
+
+bisonflags = []
+if bison.found()
+  bison_version_c = run_command(bison, '--version', check: true)
+  # bison version string helpfully is something like
+  # >>bison (GNU bison) 3.8.1<<
+  bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+  if bison_version.version_compare('>=3.0')
+    bisonflags += ['-Wno-deprecated']
+  endif
+endif
+
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# FIXME: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(find_meson)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+  error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+    meson_binpath_r.returncode(),
+    meson_binpath_r.stdout(),
+    meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+  error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+  if i == 0
+    meson_binpath = e
+  else
+    meson_args += e
+  endif
+  i += 1
+endforeach
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert'))
+
+cdata.set('BLCKSZ', 8192, description: '''
+ Size of a disk block --- this also limits the size of a tuple.  You
+ can set it bigger if you need bigger tuples (although TOAST should
+ reduce the need to have large tuples, since fields can be spread
+ across multiple tuples).
+
+ BLCKSZ must be a power of 2.  The maximum possible value of BLCKSZ
+ is currently 2^15 (32768).  This is determined by the 15-bit widths
+ of the lp_off and lp_len fields in ItemIdData (see
+ include/storage/itemid.h).
+
+ Changing BLCKSZ requires an initdb.
+''')
+
+cdata.set('XLOG_BLCKSZ', 8192)
+cdata.set('RELSEG_SIZE', 131072)
+cdata.set('DEF_PGPORT', 5432)
+cdata.set_quoted('DEF_PGPORT_STR', '5432')
+cdata.set_quoted('PG_KRB_SRVNAM', 'postgres')
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+if not gssapiopt.disabled()
+  gssapi = dependency('krb5-gssapi', required: gssapiopt)
+
+  if gssapi.found() and \
+    cc.check_header('gssapi/gssapi.h', args: g_c_args, dependencies: gssapi, required: gssapiopt)
+
+    if not cc.has_function('gss_init_sec_context', args: g_c_args, dependencies: gssapi)
+      error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+    endif
+    cdata.set('ENABLE_GSS', 1)
+  endif
+
+else
+  gssapi = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if not ldapopt.disabled()
+
+  if host_machine.system() == 'windows'
+    ldap = cc.find_library('wldap32')
+    ldap_r = ldap
+  else
+    ldap = dependency('ldap', required: false)
+
+    # Before 2.5 openldap didn't have a pkg-config file..
+    if ldap.found()
+      ldap_r = ldap
+    else
+      ldap = cc.find_library('ldap', required: ldapopt)
+      ldap_r = cc.find_library('ldap_r', required: ldapopt)
+
+      # Use ldap_r for FE if available, else assume ldap is thread-safe.
+      # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+      if ldap.found() and not ldap_r.found()
+        ldap_r = ldap
+      endif
+    endif
+
+    if ldap.found() and cc.has_function('ldap_initialize', args: g_c_args, dependencies: [ldap, thread_dep])
+      cdata.set('HAVE_LDAP_INITIALIZE', 1)
+    endif
+  endif
+
+  if ldap.found()
+    cdata.set('USE_LDAP', 1)
+  endif
+
+else
+  ldap_r = ldap = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+  llvm = dependency('llvm', version : '>=3.9', method: 'config-tool', required: llvmopt)
+
+  if llvm.found()
+
+    cdata.set('USE_LLVM', 1)
+
+    add_languages('cpp', required : true, native: false)
+    cpp = meson.get_compiler('cpp')
+
+    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+    ccache = find_program('ccache', required: false)
+    clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+
+    # FIXME: the includes hardcoded here suck
+    llvm_irgen_args = [
+      '-c', '-o', '@OUTPUT@', '@INPUT@',
+      '-flto=thin', '-emit-llvm',
+      '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+      '-I', '@SOURCE_ROOT@/src/include',
+      '-I', '@BUILD_ROOT@/src/include',
+      '-I', '@BUILD_ROOT@/src/backend/utils/misc',
+      '-I', '@CURRENT_SOURCE_DIR@',
+      '-O2',
+      '-Wno-ignored-attributes',
+      '-Wno-empty-body',
+    ]
+
+    if ccache.found()
+      llvm_irgen_command = ccache
+      llvm_irgen_args = [clang.path()] + llvm_irgen_args
+    else
+      llvm_irgen_command = clang
+    endif
+
+    llvm_irgen_kw = {
+      'command': [llvm_irgen_command] + llvm_irgen_args,
+      'depfile': '@BASENAME@.c.bc.d',
+    }
+
+    irlink = find_program('src/tools/irlink', native: true)
+
+    llvm_irlink_kw = {
+      'command':[
+        irlink,
+        '@SOURCE_ROOT@',
+        '@BUILD_ROOT@',
+        llvm_lto,
+        '-o', '@OUTPUT0@',
+        '@PRIVATE_DIR@',
+        '@INPUT@',
+      ],
+      'install': true,
+      'install_dir': get_option('libdir'),
+    }
+
+  endif
+else
+  llvm = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+if not get_option('icu').disabled()
+  icu = dependency('icu-uc', required: get_option('icu').enabled())
+  icu_i18n = dependency('icu-i18n', required: get_option('icu').enabled())
+
+  if icu.found()
+    cdata.set('USE_ICU', 1)
+  endif
+
+else
+  icu = dependency('', required : false)
+  icu_i18n = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+  libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+  if libxml.found()
+    cdata.set('USE_LIBXML', 1)
+  endif
+else
+  libxml = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+  libxslt = dependency('libxslt', required: libxsltopt)
+
+  if libxslt.found()
+    cdata.set('USE_LIBXSLT', 1)
+  endif
+else
+  libxslt = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+  lz4 = dependency('liblz4', required: lz4opt)
+
+  if lz4.found()
+    cdata.set('USE_LZ4', 1)
+    cdata.set('HAVE_LIBLZ4', 1)
+  endif
+
+else
+  lz4 = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('perl')
+perl_dep = dependency('', required: false)
+
+if perlopt.disabled()
+  perl_may_work = false
+else
+  perl_may_work = true
+
+  perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+
+  # FIXME: include copy-edited comments from perl.m4
+
+  perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+  archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+  privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+  useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+  libperl = run_command(perl_conf_cmd, 'libperl', check: true).stdout()
+
+  perl_inc = include_directories('@0@/CORE'.format(archlibexp))
+
+  perl_ccflags = []
+
+  if useshrplib != 'true'
+    if perlopt.enabled()
+      warning('need a shared perl')
+      perl_may_work = false
+    else
+      error('need a shared perl')
+    endif
+  endif
+
+  message('perl libperl: @0@'.format(libperl))
+
+  if host_machine.system() == 'darwin'
+    perl_ccflags += ['-iwithsysroot', '@0@/CORE'.format(archlibexp)]
+  endif
+
+  # FIXME macOS may need sysroot muckery
+
+  # XXX: On my system the cc.find_library() is actually enough to get a working
+  # plperl. Would be nice to get rid of the nasty stuff below.
+  if perl_may_work and \
+      cc.has_header('perl.h', args: g_c_args + perl_ccflags,
+                    include_directories: perl_inc, required: perlopt)
+    foreach p : ['perl', 'libperl', libperl, libperl.strip('lib'), fs.stem(libperl), fs.stem(libperl).strip('lib')]
+      perl_dep_int = cc.find_library(p,
+        dirs: ['@0@/CORE'.format(archlibexp)],
+        required: false)
+      if perl_dep_int.found()
+        break
+      endif
+    endforeach
+
+    if not perl_dep_int.found()
+      perl_may_work = false
+    endif
+  else
+    perl_may_work = false
+  endif
+
+  if perl_may_work
+    perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+    message('CCFLAGS recommended by Perl: @0@'.format(perl_ccflags_r))
+
+    foreach flag : perl_ccflags_r.split(' ')
+      if flag.startswith('-D') and \
+        (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+        perl_ccflags += flag
+      endif
+    endforeach
+
+    if host_machine.system() == 'windows'
+      perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+    endif
+
+    message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+    # perl.m4 sayeth:
+    #
+    # We are after Embed's ldopts, but without the subset mentioned in
+    # Config's ccdlflags;
+    #
+    # FIXME: andres sayeth: But why?
+
+    ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+    ccdlflags = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().strip()
+
+    ccdlflags_dict = {}
+
+    foreach ccdlflag : ccdlflags.split(' ')
+      ccdlflags_dict += {ccdlflag: 1}
+    endforeach
+
+    perl_ldopts = []
+    foreach ldopt : ldopts.split(' ')
+      if ldopt == ''
+        continue
+      elif ccdlflags_dict.has_key(ldopt)
+        continue
+      # strawberry perl unhelpfully has that in ldopts
+      elif ldopt == '-s'
+        continue
+      endif
+
+      perl_ldopts += ldopt.strip('"')
+    endforeach
+
+    # FIXME: check if windows handling is necessary
+
+    message('LDFLAGS for embedding perl: "@0@" (ccdlflags: "@1@", ldopts: "@2@")'.format(
+      ' '.join(perl_ldopts), ccdlflags, ldopts))
+
+    if perl_dep_int.found()
+      perl_dep = declare_dependency(
+        include_directories: perl_inc,
+        compile_args: perl_ccflags,
+        link_args: perl_ldopts,
+        version: perlversion,
+      )
+    endif
+  endif # perl_may_work
+
+  if perlopt.enabled() and not perl_may_work
+    error('could not find working perl')
+  endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('python')
+if not pyopt.disabled()
+  pm = import('python')
+  python3_inst = pm.find_installation(required: pyopt.enabled())
+  python3 = python3_inst.dependency(embed: true, required: pyopt.enabled())
+else
+  python3 = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: Readline
+#
+# FIXME: editline support
+###############################################################
+
+if not get_option('readline').disabled()
+  readline = dependency('readline', required: false)
+  if not readline.found()
+    readline = cc.find_library('readline',
+      required: get_option('readline').enabled())
+  endif
+
+  if readline.found()
+    cdata.set('HAVE_LIBREADLINE', 1)
+
+    if cc.has_header('readline/history.h', args: g_c_args, dependencies: [readline], required: false)
+      history_h = 'readline/history.h'
+      cdata.set('HAVE_READLINE_HISTORY_H', 1)
+      cdata.set('HAVE_READLINE_H', false)
+    elif cc.has_header('history.h', args: g_c_args, dependencies: [readline], required: false)
+      history_h = 'history.h'
+      cdata.set('HAVE_READLINE_HISTORY_H', false)
+      cdata.set('HAVE_HISTORY_H', 1)
+    else
+      error('''readline header not found
+If you have readline already installed, see see meson-log/meson-log.txt for details on the
+failure.  It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.''')
+    endif
+
+    if cc.has_header('readline/readline.h', args: g_c_args, dependencies: [readline], required: false)
+      readline_h = 'readline/readline.h'
+      cdata.set('HAVE_READLINE_READLINE_H', 1)
+    elif cc.has_header('readline.h', args: g_c_args, dependencies: [readline], required: false)
+      readline_h = 'readline.h'
+      cdata.set('HAVE_READLINE_H', 1)
+    else
+      error('''readline header not found
+If you have readline already installed, see see meson-log/meson-log.txt for details on the
+failure.  It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.''')
+    endif
+
+    check_funcs = [
+      'rl_completion_matches',
+      'rl_filename_completion_function',
+      'rl_reset_screen_size',
+      'append_history',
+      'history_truncate_file',
+    ]
+
+    foreach func : check_funcs
+      cdata.set('HAVE_'+func.to_upper(),
+        cc.has_function(func, args: g_c_args, dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    check_vars = [
+      'rl_completion_append_character',
+      'rl_completion_suppress_quote',
+      'rl_filename_quote_characters',
+      'rl_filename_quoting_function',
+    ]
+
+    foreach var : check_vars
+      cdata.set('HAVE_'+var.to_upper(),
+        cc.has_header_symbol(readline_h, var, args: g_c_args, dependencies: [readline]) ? 1 : false)
+    endforeach
+  endif
+else
+  readline = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+  # Try to find openssl via pkg-config et al, if that doesn't work, look for
+  # the library names that we know about.
+
+  # via pkg-config et al
+  ssl = dependency('openssl', required: false)
+
+  # via library + headers
+  if not ssl.found()
+    ssl_lib = cc.find_library('ssl',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc,
+      has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+    crypto_lib = cc.find_library('crypto',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc)
+    ssl_int = [ssl_lib, crypto_lib]
+
+    ssl = declare_dependency(dependencies: ssl_int,
+                             include_directories: g_c_inc)
+  else
+    cc.has_header('openssl/ssl.h', args: g_c_args, dependencies: ssl, required: true)
+    cc.has_header('openssl/err.h', args: g_c_args, dependencies: ssl, required: true)
+
+    ssl_int = [ssl]
+  endif
+
+  cdata.set_quoted('WITH_SSL', get_option('ssl'))
+
+  check_funcs = [
+    ['CRYPTO_new_ex_data', {'required': true}],
+    ['SSL_new', {'required': true}],
+
+    # Function introduced in OpenSSL 1.0.2.
+    ['X509_get_signature_nid'],
+
+    # Functions introduced in OpenSSL 1.1.0. We used to check for
+    # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+    # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+    # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+    # functions.
+    ['OPENSSL_init_ssl'],
+    ['BIO_get_data'],
+    ['BIO_meth_new'],
+    ['ASN1_STRING_get0_data'],
+    ['HMAC_CTX_new'],
+    ['HMAC_CTX_free'],
+
+    # OpenSSL versions before 1.1.0 required setting callback functions, for
+    # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+    # function was removed.
+    ['CRYPTO_lock'],
+  ]
+
+  foreach c : check_funcs
+    func = c.get(0)
+    val = cc.has_function(func, args: g_c_args, dependencies: ssl_int)
+    if not val and c.get(1, {}).get('required', false)
+      error('openssl function @0@ is required'.format(func))
+    endif
+    cdata.set('HAVE_'+func.to_upper(), val ? 1 : false)
+  endforeach
+
+  cdata.set('USE_OPENSSL', 1,
+            description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+
+  cdata.set('OPENSSL_API_COMPAT', 0x10001000,
+            description: 'Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.')
+else
+  ssl = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = dependency('', required : false)
+if not zlibopt.disabled()
+  zlib_t = dependency('zlib', required: zlibopt)
+
+  if zlib_t.type_name() == 'internal'
+    # if fallback was used, we don't need to test if headers are present (they
+    # aren't built yet, so we can't test)
+    zlib = zlib_t
+  elif not zlib_t.found()
+    warning('did not find zlib')
+  elif not cc.has_header('zlib.h', args: g_c_args, dependencies: [zlib_t], required: zlibopt.enabled())
+    warning('zlib header not found')
+  elif not cc.has_type('z_streamp', args: g_c_args, dependencies: [zlib_t], prefix: '#include <zlib.h>')
+    if zlibopt.enabled()
+      error('zlib version is too old')
+    else
+      warning('zlib version is too old')
+    endif
+  else
+    zlib = zlib_t
+  endif
+
+  if zlib.found()
+    cdata.set('HAVE_LIBZ', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+sizeof_long = cc.sizeof('long', args: g_c_args)
+if sizeof_long == 8
+  cdata.set('HAVE_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long int')
+  cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: g_c_args) == 8
+  cdata.set('HAVE_LONG_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long long int')
+  cdata.set_quoted('INT64_MODIFIER', 'll')
+elif
+  error('do not know how to get a 64bit int')
+endif
+
+
+cdata.set('MAXIMUM_ALIGNOF', 8)
+cdata.set('ALIGNOF_SHORT', cc.alignment('short', args: g_c_args))
+cdata.set('ALIGNOF_INT', cc.alignment('int', args: g_c_args))
+cdata.set('ALIGNOF_LONG', cc.alignment('long', args: g_c_args))
+cdata.set('ALIGNOF_DOUBLE', cc.alignment('double', args: g_c_args))
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: g_c_args))
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang).  If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+    static inline int foo(void)
+    {
+      void *labeladdrs[] = {&&my_label};
+      goto *labeladdrs[0];
+      my_label:
+      return 1;
+    }''',
+    args: g_c_args)
+  cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# XXX: for now just assume that compiler knows __func__ - it's C99 after all.
+cdata.set('HAVE_FUNCNAME__FUNC', 1)
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+    int main(int arg, char **argv)
+    {
+        ({ _Static_assert(1, "foo"); })
+    }
+    ''',
+    args: g_c_args)
+  cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: g_c_args) \
+  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: g_c_args) \
+  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: g_c_args) == 1
+  cdata.set('HAVE__BOOL', 1)
+  cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = 'extern void pgac_write(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));'
+foreach a : printf_attributes
+  if cc.compiles(testsrc.format(a), args: g_c_args + ['-Werror'], name: 'format ' + a)
+    cdata.set('PG_PRINTF_ATTRIBUTE', a)
+    break
+  endif
+endforeach
+
+if cc.has_function_attribute('visibility:default') and \
+  cc.has_function_attribute('visibility:hidden')
+  cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+endif
+
+
+if cc.has_function('__builtin_unreachable', args: g_c_args)
+  cdata.set('HAVE__BUILTIN_UNREACHABLE', 1)
+endif
+
+if cc.has_function('__builtin_constant_p', args: g_c_args)
+  cdata.set('HAVE__BUILTIN_CONSTANT_P', 1)
+
+  if host_machine.cpu_family() == 'ppc' or host_machine.cpu_family() == 'ppc64'
+    # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+    if cc.compiles('''
+      static inline int
+      addi(int ra, int si)
+      {
+          int res = 0;
+          if (__builtin_constant_p(si))
+              __asm__ __volatile__(
+                  " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+          return res;
+      }
+      int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+      ''',
+      args: g_c_args)
+      cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+    endif
+  endif
+endif
+
+
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+    #include <cpuid.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+    }
+    ''', name: '__get_cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+    #include <intrin.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __cpuid(exx, 1);
+    }
+    ''', name: '__cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__CPUID', 1)
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+  # Disable strict-aliasing rules; needed for gcc 3.3+
+  '-fno-strict-aliasing',
+  # Disable optimizations that assume no overflow; needed for gcc 4.3+
+  '-fwrapv',
+  '-fexcess-precision=standard'
+]
+
+add_project_arguments(cc.get_supported_arguments(common_functional_flags), language: 'c')
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+
+common_warning_flags = [
+  '-Wmissing-prototypes',
+  '-Wpointer-arith',
+  '-Werror=vla',
+  '-Wendif-labels',
+  '-Wmissing-format-attribute',
+  '-Wimplicit-fallthrough=3',
+  '-Wcast-function-type',
+  '-Wformat-security',
+]
+
+add_project_arguments(cc.get_supported_arguments(common_warning_flags), language: 'c')
+
+if llvm.found()
+  add_project_arguments(cpp.get_supported_arguments(common_warning_flags), language: 'cpp')
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+  add_project_arguments('-Wdeclaration-after-statement', language: 'c')
+  using_declaration_after_statement_warning = true
+else
+  using_declaration_after_statement_warning = false
+endif
+
+
+# We want to suppress a few unhelpful warnings - but gcc won't
+# complain about unrecognized -Wno-foo switches, so we have to test
+# for the positive form and if that works, add the negative form
+
+negative_warning_flags = [
+  'unused-command-line-argument',
+  'format-truncation',
+  'stringop-truncation',
+
+  # FIXME: from andres's local config
+  'clobbered',
+  'missing-field-initializers',
+  'sign-compare',
+  'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+  if cc.has_argument('-W'+w)
+    add_project_arguments('-Wno-'+w, language: 'c')
+  endif
+
+  if llvm.found() and cpp.has_argument('-W'+w)
+    add_project_arguments('-Wno-'+w, language: 'cpp')
+  endif
+endforeach
+
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+  add_project_arguments('/wd4018', '/wd4244', '/wd4273', '/wd4102', '/wd4090', '/wd4267',
+    language: 'c')
+  add_project_arguments('/DWIN32', '/DWINDOWS', '/D__WINDOWS__', '/D__WIN32__',
+    '/DWIN32_STACK_RLIMIT=4194304', '/D_CRT_SECURE_NO_DEPRECATE', '/D_CRT_NONSTDC_NO_DEPRECATE',
+        language: 'c')
+endif
+
+
+###############################################################
+# Atomics
+###############################################################
+
+cdata.set('HAVE_SPINLOCKS', 1)
+
+if get_option('atomics')
+  cdata.set('HAVE_ATOMICS', 1)
+
+  atomic_checks = [
+    {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+     'desc': '__sync_lock_test_and_set(char)',
+     'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+     'desc': '__sync_lock_test_and_set(int32)',
+     'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+     'desc': '__sync_val_compare_and_swap(int32)',
+     'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+# FIXME: int64 reference
+    {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+     'desc': '__sync_val_compare_and_swap(int64)',
+     'test': '''
+long val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+     'desc': ' __atomic_compare_exchange_n(int32)',
+     'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+# FIXME: int64 reference
+    {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+     'desc': ' __atomic_compare_exchange_n(int64)',
+     'test': '''
+long val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+  ]
+
+  foreach check : atomic_checks
+    test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+    cdata.set(check['name'],
+      cc.links(test, name: check['desc'], args: g_c_args))
+  endforeach
+
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+header_checks = [
+  ['atomic.h'],
+  ['stdbool.h'],
+  ['copyfile.h'],
+  ['execinfo.h'],
+  ['getopt.h'],
+  ['ifaddrs.h'],
+  ['langinfo.h'],
+  ['mbarrier.h'],
+  ['poll.h'],
+  ['sys/epoll.h'],
+  ['sys/event.h'],
+  ['sys/ipc.h'],
+  ['sys/prctl.h'],
+  ['sys/procctl.h'],
+  ['sys/pstat.h'],
+  ['sys/resource.h'],
+  ['sys/select.h'],
+  ['sys/sem.h'],
+  ['sys/shm.h'],
+  ['sys/sockio.h'],
+  ['sys/tas.h'],
+  ['sys/uio.h'],
+  ['sys/un.h'],
+  ['termios.h'],
+  ['ucred.h'],
+  # FIXME: openbsd workaround
+  ['sys/ucred.h'],
+  ['wctype.h'],
+  ['netinet/tcp.h'],
+  ['net/if.h'],
+  ['crtdefs.h'],
+]
+
+foreach c : header_checks
+  varname = 'HAVE_'+c.get(0).underscorify().to_upper()
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  found = cc.has_header(c.get(0), include_directories: g_inc, args: g_c_args)
+  cdata.set(varname, found ? 1 : false,
+            description: 'Define to 1 if you have the <@0@> header file.'.format(c))
+endforeach
+
+
+
+decl_checks = [
+  ['F_FULLFSYNC', 'fcntl.h'],
+  ['RTLD_GLOBAL', 'dlfcn.h'],
+  ['RTLD_NOW', 'dlfcn.h'],
+  ['fdatasync', 'unistd.h'],
+  ['posix_fadvise', 'fcntl.h'],
+  ['sigwait', 'signal.h'],
+  ['strlcat', 'string.h'],
+  ['strlcpy', 'string.h'],
+  ['strnlen', 'string.h'],
+  ['strsignal', 'string.h'],
+  ['strtoll', 'stdlib.h'], ['strtoull', 'stdlib.h'], # strto[u]ll may exist but not be declared
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+  ['preadv', 'sys/uio.h'],
+  ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+  varname = 'HAVE_DECL_'+c.get(0).underscorify().to_upper()
+
+  found = cc.has_header_symbol(c.get(1), c.get(0), args: g_c_args, kwargs: c.get(2, {}))
+  cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@\', and to 0 if you
+  don't.'''.format(c))
+endforeach
+
+
+
+# XXX: this is borked, HAVE_SYS_UCRED_H not defined
+if cc.has_type('struct cmsgcred',
+    include_directories: g_inc,
+    args: g_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '-DHAVE_SYS_UCRED_H' : ''],
+    prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+  cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+  cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_function('getopt', args: g_c_args) and \
+   cc.has_function('getopt_long', args: g_c_args) and \
+   cc.has_type('struct option', args: g_c_args, prefix: '#include <getopt.h>')
+  cdata.set('HAVE_GETOPT', 1)
+  cdata.set('HAVE_GETOPT_LONG', 1)
+  cdata.set('HAVE_STRUCT_OPTION', 1)
+else
+  warning('not yet implemented')
+endif
+
+
+foreach c : ['opterr', 'optreset']
+  varname = 'HAVE_INT_'+c.underscorify().to_upper()
+
+  if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+    extern int @0@;
+    @0@ = 1;
+}
+'''.format(c), name: c, args: g_c_args)
+    cdata.set(varname, 1)
+  else
+    cdata.set(varname, false)
+  endif
+endforeach
+
+
+if cc.has_type('struct sockaddr_storage', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', 'ss_family', args: g_c_args,
+  prefix: '''#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', '__ss_family', args: g_c_args,
+  prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY', 1)
+endif
+
+if cc.has_type('struct sockaddr_un', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/un.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_UN', 1)
+endif
+
+if cc.has_type('struct addrinfo', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+''')
+  cdata.set('HAVE_STRUCT_ADDRINFO', 1)
+endif
+
+if host_machine.system() == 'windows'
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1)
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1)
+endif
+
+if cc.has_type('struct sockaddr_in6', args: g_c_args, prefix: '''
+#include <netinet/in.h>''')
+  cdata.set('HAVE_IPV6', 1)
+endif
+
+
+if cc.has_member('struct tm', 'tm_zone', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+  cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+    return timezone / 60;
+}
+''', name: 'Check if the global variable `timezone\' exists', args: g_c_args,)
+  cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+  cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+# FIXME: sys/ipc.h, sys/sem.h includes were conditional
+if cc.has_type('union semun', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+''')
+  cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+  char buf[100];
+  switch (strerror_r(1, buf, sizeof(buf)))
+  { case 0: break; default: break; }
+}''', args: g_c_args)
+  cdata.set('STRERROR_R_INT', 1)
+else
+  cdata.set('STRERROR_R_INT', false)
+endif
+
+# FIXME
+cdata.set('pg_restrict', '__restrict')
+
+# FIXME
+if host_machine.system() == 'windows'
+  cdata.set('ACCEPT_TYPE_ARG1', 'unsigned int')
+  cdata.set('ACCEPT_TYPE_ARG2', 'struct sockaddr *')
+  cdata.set('ACCEPT_TYPE_ARG3', 'int')
+  cdata.set('ACCEPT_TYPE_RETURN', 'unsigned int PASCAL')
+else
+  cdata.set('ACCEPT_TYPE_ARG1', 'int')
+  cdata.set('ACCEPT_TYPE_ARG2', 'struct sockaddr')
+  cdata.set('ACCEPT_TYPE_ARG3', 'socklen_t')
+  cdata.set('ACCEPT_TYPE_RETURN', 'int')
+endif
+
+cdata.set('HAVE_STRUCT_ADDRINFO', 1)
+
+
+cdata.set('MEMSET_LOOP_LIMIT', 1024)
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+    PS_STRINGS->ps_nargvstr = 1;
+    PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+  name: 'PS_STRINGS', args: g_c_args)
+  cdata.set('HAVE_PS_STRINGS', 1)
+else
+  cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+# FIXME: this clearly needs to be cleaned up.
+if cc.get_id() != 'msvc'
+  # FIXME: Need to actually test
+  add_project_arguments('-msse4.2', language: 'c')
+  cdata.set('USE_SSE42_CRC32C', false)
+  cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+else
+  cdata.set('USE_SSE42_CRC32C', false)
+  cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+endif
+
+
+m_dep = cc.find_library('m', required : false)
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps = [m_dep]
+
+rt_dep = cc.find_library('rt', required : false)
+
+dl_dep = cc.find_library('dl', required : false)
+
+util_dep = cc.find_library('util', required : false)
+posix4_dep = cc.find_library('posix4', required : false)
+
+getopt_dep = cc.find_library('getopt', required : false)
+gnugetopt_dep = cc.find_library('gnugetopt', required : false)
+
+execinfo_dep = cc.find_library('execinfo', required : false)
+
+func_checks = [
+  ['_configthreadlocale'],
+  ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+  ['clock_gettime', {'dependencies': [rt_dep, posix4_dep]}],
+  ['copyfile'],
+  ['dlopen', {'dependencies': [dl_dep]}],
+  ['explicit_bzero'],
+  ['fdatasync', {'dependencies': [rt_dep, posix4_dep]}],
+  ['fls'],
+  ['getaddrinfo'],
+  ['gethostbyname_r', {'dependencies': [thread_dep]}],
+  ['getifaddrs'],
+  ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getopt_long',{'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getpeereid'],
+  ['getpeerucred'],
+  ['getpwuid_r', {'dependencies': [thread_dep]}],
+  ['getrlimit'],
+  ['getrusage'],
+  ['gettimeofday'], # XXX: This seems to be in the autoconf case
+  ['inet_aton'],
+  ['kqueue'],
+  ['link'],
+  ['mbstowcs_l'],
+  ['memset_s'],
+  ['mkdtemp'],
+  ['poll'],
+  ['posix_fadvise'],
+  ['posix_fallocate'],
+  ['ppoll'],
+  ['pread'],
+  ['pstat'],
+  ['pthread_is_threaded_np'],
+  ['pwrite'],
+  ['random'],
+  ['readlink'],
+  ['readv'],
+  ['setenv'], # FIXME: windows handling
+  ['setproctitle', {'dependencies': [util_dep]}],
+  ['setproctitle_fast'],
+  ['setsid'],
+  ['shm_open', {'dependencies': [rt_dep]}],
+  ['shm_unlink', {'dependencies': [rt_dep]}],
+  ['srandom'],
+  ['strchrnul'],
+  ['strerror_r', {'dependencies': [thread_dep]}],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+  ['strsignal'],
+  ['strtof'], # strsignal is checked separately
+  ['strtoll'], ['__strtoll'], ['strtoq'],
+  ['strtoull'], ['__strtoull'], ['strtouq'],
+  ['symlink'],
+  ['sync_file_range'],
+  ['syncfs'],
+  ['unsetenv'],
+  ['uselocale'],
+  ['wcstombs_l'],
+  ['writev'],
+]
+
+foreach c : func_checks
+  func = c.get(0)
+  kwargs = c.get(1, {})
+  deps = kwargs.get('dependencies', [])
+
+  varname = 'HAVE_'+func.underscorify().to_upper()
+
+  found = cc.has_function(func, args: g_c_args,
+                          kwargs: kwargs + {'dependencies': []})
+
+  if not found
+    foreach dep : deps
+      if not dep.found()
+        continue
+      endif
+      found = cc.has_function(func, args: g_c_args,
+                              kwargs: kwargs + {'dependencies': [dep]})
+      if found
+        os_deps += dep
+        break
+      endif
+    endforeach
+  endif
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  cdata.set(varname, found  ? 1 : false,
+            description: 'Define to 1 if you have the `@0@\' function.'.format(c))
+endforeach
+
+
+
+
+
+if host_machine.system() == 'linux' or host_machine.system() == 'freebsd'
+  dlsuffix = '.so'
+elif host_machine.system() == 'darwin'
+  dlsuffix = '.dylib'
+elif host_machine.system() == 'windows'
+  dlsuffix = '.dll'
+else
+  error('not yet')
+endif
+
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+if host_machine.system() == 'windows'
+   cdata.set('USE_WIN32_SEMAPHORES', 1)
+   cdata.set('USE_WIN32_SHARED_MEMORY', 1)
+elif host_machine.system() == 'darwin'
+   cdata.set('USE_SYSV_SEMAPHORES', 1)
+   cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+else
+   cdata.set('USE_UNNAMED_POSIX_SEMAPHORES', 1)
+   cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+endif
+
+
+if host_machine.system() == 'windows'
+  cdata.set('HAVE_IPV6', 1)
+  cdata.set('HAVE_SYMLINK', 1)
+  cdata.set('WIN32_STACK_RLIMIT', 4194304)
+  cdata.set('HAVE__CONFIGTHREADLOCALE', 1)
+endif
+
+if cc.get_id() == 'msvc'
+  add_project_link_arguments(
+    '/fixed:no',
+    '/dynamicbase',
+    '/nxcompat',
+    language : ['c', 'cpp'],
+  )
+endif
+
+if host_machine.system() == 'windows'
+  os_deps += cc.find_library('ws2_32', required: true)
+endif
+
+
+###############################################################
+# Threading
+###############################################################
+
+# Probably not worth implementing other cases anymore
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+if thread_dep.found()
+  if cc.has_function('pthread_is_threaded_np', args: g_c_args, dependencies: [thread_dep])
+    cdata.set('HAVE_PTHREAD_IS_THREADED_NP', 1)
+  endif
+  if cc.has_function('pthread_barrier_wait', args: g_c_args, dependencies: [thread_dep])
+    cdata.set('HAVE_PTHREAD_BARRIER_WAIT', 1)
+  endif
+endif
+
+
+###############################################################
+# Build
+###############################################################
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+test_deps = []
+backend_targets = []
+
+
+# List of tap tests we later generate test() invocations for. The main
+# reason for doing it that way instead of having test() invocations
+# everywhere is that they end up being too large. A second benefit is
+# that it'd make it easier to generate data for another runner.
+tap_tests = []
+isolation_tests = []
+regress_tests = []
+
+
+# Default options for targets
+
+default_target_args = {
+  'implicit_include_directories': false,
+  'install': true,
+}
+
+default_lib_args = default_target_args + {
+  'name_prefix': 'lib',
+}
+
+internal_lib_args = default_lib_args + {
+  'build_by_default': false,
+  'install': false,
+}
+
+default_mod_args = default_lib_args + {
+  'name_prefix': '',
+}
+
+default_bin_args = default_target_args + {
+}
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+generated_headers = []
+generated_backend_headers = []
+
+postgres_inc = [include_directories('src/include')]
+
+if host_machine.system() == 'windows'
+  postgres_inc += include_directories('src/include/port/win32')
+
+  if cc.get_id() == 'msvc'
+    postgres_inc += include_directories('src/include/port/win32_msvc')
+  endif
+endif
+
+subdir('src/include')
+
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+backend_common_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_shlib, common_shlib],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+subdir('src/interfaces/libpq')
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_static, common_static, fe_utils],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+backend_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: [os_deps, ssl, lz4, icu, icu_i18n, ldap, gssapi, libxml],
+)
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+  compile_args: [],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: [os_deps, ssl, lz4, icu, icu_i18n, ldap, gssapi, libxml],
+)
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+  if host_machine.system() == 'windows'
+    if prefix.split(':\\').length() == 1
+        # just a drive
+        test_prefix = ''
+    else
+        test_prefix = prefix.split(':\\')[1]
+    endif
+  else
+    test_prefix = prefix.substring(1)
+  endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+test('tmp_install',
+    meson_bin, args: meson_args + ['install', '--quiet', '--only-changed', '--no-rebuild'],
+    env: {'DESTDIR':test_install_destdir},
+    priority: 100,
+    is_parallel: false,
+    suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport=40000
+
+test_env = environment()
+
+if host_machine.system() == 'darwin'
+  library_path_var = 'DYLD_LIBRARY_PATH'
+elif host_machine.system() == 'aix'
+  library_path_var = 'LIBPATH'
+else
+  library_path_var = 'LD_LIBRARY_PATH'
+endif
+
+test_env.prepend('PATH', test_install_location / get_option('bindir'))
+test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
+test_env.set('PG_REGRESS', meson.build_root() / 'src/test/regress/pg_regress')
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+# Define all 'pg_regress' style tests
+foreach t : regress_tests
+  test_command = [
+    pg_regress,
+    '--temp-instance', test_result_dir / t['name'] / 'pg_regress' / 'tmp_check',
+    '--inputdir', t['sd'],
+    '--outputdir', test_result_dir / t['name'] / 'pg_regress',
+    '--bindir', '',
+    '--dlpath', t['bd'],
+    '--max-concurrent-tests=20',
+    '--port=@0@'.format(testport),
+  ]
+
+  if t.has_key('regress_args')
+     test_command += t['regress_args']
+  endif
+
+  if t.has_key('schedule')
+     test_command += ['--schedule', t['schedule'],]
+  else
+     test_command += t['sql']
+  endif
+
+  test_kwargs = {
+    'suite': ['pg_regress', t['name']],
+    'priority': 10,
+    'timeout': 300,
+    'depends': test_deps + t.get('deps', []),
+    'env': test_env,
+    'workdir': t['sd'],
+    'args': [
+      meson.build_root(),
+      t['bd'],
+      t['name'],
+      'pg_regress',
+      test_command,
+    ]
+  }
+
+  # Allow test definition to override arguments
+  if t.has_key('test_kwargs')
+     test_kwargs += t['test_kwargs']
+  endif
+
+  test(t['name'] / 'pg_regress',
+    testwrap,
+    kwargs: test_kwargs,
+  )
+
+  testport = testport + 1
+endforeach
+
+
+# Define all 'isolationtester' style tests
+foreach t : isolation_tests
+  test_command = [
+    pg_isolation_regress,
+    '--temp-instance', test_result_dir / t['name'] / 'isolation' / 'tmp_check',
+    '--inputdir', t['sd'],
+    '--outputdir', test_result_dir / t['name'] / 'isolation',
+    '--bindir', '',
+    '--dlpath', t['bd'],
+    '--max-concurrent-tests=20',
+    '--port=@0@'.format(testport),
+  ]
+
+  if t.has_key('regress_args')
+     test_command += t['regress_args']
+  endif
+
+  if t.has_key('schedule')
+     test_command += ['--schedule', t['schedule'],]
+  else
+     test_command += t['specs']
+  endif
+
+  test_kwargs = {
+    'suite': ['isolation', t['name']],
+    'priority': 20,
+    'timeout': 300,
+    'depends': test_deps + t.get('deps', []),
+    'workdir': t['sd'],
+    'env': test_env,
+    'args': [
+      meson.build_root(),
+      t['bd'],
+      t['name'],
+      'isolation',
+      test_command,
+    ]
+  }
+
+  # Allow test definition to override arguments
+  if t.has_key('test_kwargs')
+     test_kwargs += t['test_kwargs']
+  endif
+
+  test(t['name'] / 'isolation',
+    testwrap,
+    kwargs: test_kwargs,
+  )
+
+  testport = testport + 1
+endforeach
+
+
+# Define all 'tap' style tests
+# FIXME: dependencies for each test
+foreach t : tap_tests
+  env = test_env
+
+  foreach name, value : t.get('env', {})
+    if name == 'PATH'
+      # FIXME: manually setting PATH again, because repeated prepend didn't work
+      # before meson 0.58.
+      env.prepend('PATH', value, test_install_location / get_option('bindir'))
+    else
+      env.set(name, value)
+    endif
+  endforeach
+
+  foreach onetap : t['tests']
+    test(t['name'] / onetap,
+      testwrap,
+      workdir: t['sd'],
+      args: [
+        meson.build_root(),
+        t['bd'],
+        t['name'],
+        onetap,
+        'perl',
+        '-I', meson.source_root() / 'src/test/perl',
+        '-I', t['sd'],
+        t['sd'] / onetap
+      ],
+      protocol: 'tap',
+      suite: ['tap', t['name']],
+      env: env,
+      depends: test_deps + t.get('deps', []),
+      timeout: 300,
+      )
+  endforeach
+endforeach
+
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+  summary({
+    'Data Block Size' : cdata.get('BLCKSZ'),
+    'WAL Block Size' : cdata.get('XLOG_BLCKSZ')
+    }, section: 'Data Layout'
+  )
+
+  summary(
+    {
+      'host system' : '@0@ @1@'.format(host_machine.system(), host_machine.cpu_family()),
+      'build system' : '@0@ @1@'.format(build_machine.system(), build_machine.cpu_family()),
+    },
+    section: 'System'
+  )
+
+  summary(
+    {
+      'linker': '@0@'.format(cc.get_linker_id()),
+      'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+    },
+    section: 'Compiler'
+  )
+
+  if llvm.found()
+    summary(
+      {
+        'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version())
+      },
+      section: 'Compiler')
+  endif
+
+  summary(
+    {
+      'bison' : '@0@ @1@'.format(bison.full_path(), bison_version),
+    },
+    section: 'Programs'
+  )
+
+  summary(
+    {
+      'GSS': gssapi,
+      'LDAP': ldap,
+      'LLVM': llvm,
+      'icu': icu,
+      'libxml': libxml,
+      'libxslt': libxslt,
+      'lz4': lz4,
+      'perl': perl_dep,
+      'python3': python3,
+      'readline': readline,
+      'ssl': ssl,
+      'zlib': zlib,
+    },
+    section: 'External Libraries'
+  )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..d4c7f717ff8
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,81 @@
+# Data layout influencing options
+option('BLCKSZ', type : 'combo', choices : ['1', '2', '4', '8', '16', '32'], value : '8',
+  description: 'set table block size in kB')
+
+
+# You get it
+option('cassert', type : 'boolean', value: false,
+  description: 'enable assertion checks (for debugging)')
+
+option('atomics', type : 'boolean', value: true,
+  description: 'whether to use atomic operations')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array',
+  description: 'non-default directories to be searched for headers')
+option('extra_lib_dirs', type : 'array',
+  description: 'non-default directories to be searched for libs')
+
+
+# External dependencies
+
+option('gssapi', type : 'feature', value: 'auto',
+  description: 'GSSAPI support')
+
+option('ldap', type : 'feature', value: 'auto',
+  description: 'LDAP support')
+
+option('llvm', type : 'feature', value: 'disabled',
+  description: 'whether to use llvm')
+
+option('icu', type : 'feature', value: 'auto',
+  description: 'ICU support')
+
+option('libxml', type : 'feature', value: 'auto',
+  description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+  description: 'XSLT support in contrib/xml2')
+
+option('lz4', type : 'feature', value: 'auto',
+  description: 'LZ4 support')
+
+option('perl', type : 'feature', value: 'auto',
+  description: 'build Perl modules (PL/Perl)')
+
+option('python', type : 'feature', value: 'auto',
+  description: 'build Python modules (PL/Python)')
+
+option('readline', type : 'feature', value : 'auto',
+  description: 'use GNU Readline or BSD Libedit for editing')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'], value : 'none',
+  description: 'use LIB for SSL/TLS support (openssl)')
+
+option('zlib', type : 'feature', value: 'auto',
+  description: 'whether to use zlib')
+
+
+# Programs
+option('BISON', type : 'string', value: 'bison',
+  description: 'path to bison binary')
+
+option('FLEX', type : 'string', value: 'flex',
+  description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+  description: 'path to gzip binary')
+
+option('PERL', type : 'string', value: 'perl',
+  description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+  description: 'path to prove binary')
+
+option('SED', type : 'string', value: 'gsed',
+  description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+  description: 'path to tar binary')
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'brin.c',
+  'brin_bloom.c',
+  'brin_inclusion.c',
+  'brin_minmax.c',
+  'brin_minmax_multi.c',
+  'brin_pageops.c',
+  'brin_revmap.c',
+  'brin_tuple.c',
+  'brin_validate.c',
+  'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'attmap.c',
+  'bufmask.c',
+  'detoast.c',
+  'heaptuple.c',
+  'indextuple.c',
+  'printsimple.c',
+  'printtup.c',
+  'relation.c',
+  'reloptions.c',
+  'scankey.c',
+  'session.c',
+  'syncscan.c',
+  'toast_compression.c',
+  'toast_internals.c',
+  'tupconvert.c',
+  'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'ginarrayproc.c',
+  'ginbtree.c',
+  'ginbulk.c',
+  'gindatapage.c',
+  'ginentrypage.c',
+  'ginfast.c',
+  'ginget.c',
+  'gininsert.c',
+  'ginlogic.c',
+  'ginpostinglist.c',
+  'ginscan.c',
+  'ginutil.c',
+  'ginvacuum.c',
+  'ginvalidate.c',
+  'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'gist.c',
+  'gistbuild.c',
+  'gistbuildbuffers.c',
+  'gistget.c',
+  'gistproc.c',
+  'gistscan.c',
+  'gistsplit.c',
+  'gistutil.c',
+  'gistvacuum.c',
+  'gistvalidate.c',
+  'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'hash.c',
+  'hash_xlog.c',
+  'hashfunc.c',
+  'hashinsert.c',
+  'hashovfl.c',
+  'hashpage.c',
+  'hashsearch.c',
+  'hashsort.c',
+  'hashutil.c',
+  'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'heapam.c',
+  'heapam_handler.c',
+  'heapam_visibility.c',
+  'heaptoast.c',
+  'hio.c',
+  'pruneheap.c',
+  'rewriteheap.c',
+  'vacuumlazy.c',
+  'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'amapi.c',
+  'amvalidate.c',
+  'genam.c',
+  'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'nbtcompare.c',
+  'nbtdedup.c',
+  'nbtinsert.c',
+  'nbtpage.c',
+  'nbtree.c',
+  'nbtsearch.c',
+  'nbtsort.c',
+  'nbtsplitloc.c',
+  'nbtutils.c',
+  'nbtvalidate.c',
+  'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+  'brindesc.c',
+  'clogdesc.c',
+  'committsdesc.c',
+  'dbasedesc.c',
+  'genericdesc.c',
+  'gindesc.c',
+  'gistdesc.c',
+  'hashdesc.c',
+  'heapdesc.c',
+  'logicalmsgdesc.c',
+  'mxactdesc.c',
+  'nbtdesc.c',
+  'relmapdesc.c',
+  'replorigindesc.c',
+  'seqdesc.c',
+  'smgrdesc.c',
+  'spgdesc.c',
+  'standbydesc.c',
+  'tblspcdesc.c',
+  'xactdesc.c',
+  'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'spgdoinsert.c',
+  'spginsert.c',
+  'spgkdtreeproc.c',
+  'spgproc.c',
+  'spgquadtreeproc.c',
+  'spgscan.c',
+  'spgtextproc.c',
+  'spgutils.c',
+  'spgvacuum.c',
+  'spgvalidate.c',
+  'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'table.c',
+  'tableam.c',
+  'tableamapi.c',
+  'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bernoulli.c',
+  'system.c',
+  'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..fe3703e0f21
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'clog.c',
+  'commit_ts.c',
+  'generic_xlog.c',
+  'multixact.c',
+  'parallel.c',
+  'rmgr.c',
+  'slru.c',
+  'subtrans.c',
+  'timeline.c',
+  'transam.c',
+  'twophase.c',
+  'twophase_rmgr.c',
+  'varsup.c',
+  'xact.c',
+  'xlog.c',
+  'xlogarchive.c',
+  'xlogfuncs.c',
+  'xloginsert.c',
+  'xlogutils.c',
+)
+
+# used by frontend programs to built a frontend xlogreader
+xlogreader_sources = files(
+  'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..55c0be68cc4
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+bootscanner = custom_target('bootscanner',
+  input: ['bootscanner.l'],
+  output: ['bootscanner.c'],
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
+
+generated_backend_sources += custom_target('bootparse',
+  input: ['bootparse.y', bootscanner[0]],
+  output: ['bootparse.c'],
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..2cc23582e35
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,41 @@
+backend_sources += files(
+  'aclchk.c',
+  'catalog.c',
+  'dependency.c',
+  'heap.c',
+  'index.c',
+  'indexing.c',
+  'namespace.c',
+  'objectaccess.c',
+  'objectaddress.c',
+  'partition.c',
+  'pg_aggregate.c',
+  'pg_cast.c',
+  'pg_class.c',
+  'pg_collation.c',
+  'pg_constraint.c',
+  'pg_conversion.c',
+  'pg_db_role_setting.c',
+  'pg_depend.c',
+  'pg_enum.c',
+  'pg_inherits.c',
+  'pg_largeobject.c',
+  'pg_namespace.c',
+  'pg_operator.c',
+  'pg_proc.c',
+  'pg_publication.c',
+  'pg_range.c',
+  'pg_shdepend.c',
+  'pg_subscription.c',
+  'pg_type.c',
+  'storage.c',
+  'toasting.c',
+)
+
+
+install_data(
+  'information_schema.sql',
+  'sql_features.txt',
+  'system_functions.sql',
+  'system_views.sql',
+  install_dir: 'share/')
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..8e73b29a263
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,50 @@
+backend_sources += files(
+  'aggregatecmds.c',
+  'alter.c',
+  'amcmds.c',
+  'analyze.c',
+  'async.c',
+  'cluster.c',
+  'collationcmds.c',
+  'comment.c',
+  'constraint.c',
+  'conversioncmds.c',
+  'copy.c',
+  'copyfrom.c',
+  'copyfromparse.c',
+  'copyto.c',
+  'createas.c',
+  'dbcommands.c',
+  'define.c',
+  'discard.c',
+  'dropcmds.c',
+  'event_trigger.c',
+  'explain.c',
+  'extension.c',
+  'foreigncmds.c',
+  'functioncmds.c',
+  'indexcmds.c',
+  'lockcmds.c',
+  'matview.c',
+  'opclasscmds.c',
+  'operatorcmds.c',
+  'policy.c',
+  'portalcmds.c',
+  'prepare.c',
+  'proclang.c',
+  'publicationcmds.c',
+  'schemacmds.c',
+  'seclabel.c',
+  'sequence.c',
+  'statscmds.c',
+  'subscriptioncmds.c',
+  'tablecmds.c',
+  'tablespace.c',
+  'trigger.c',
+  'tsearchcmds.c',
+  'typecmds.c',
+  'user.c',
+  'vacuum.c',
+  'variable.c',
+  'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+  'execAmi.c',
+  'execAsync.c',
+  'execCurrent.c',
+  'execExpr.c',
+  'execExprInterp.c',
+  'execGrouping.c',
+  'execIndexing.c',
+  'execJunk.c',
+  'execMain.c',
+  'execParallel.c',
+  'execPartition.c',
+  'execProcnode.c',
+  'execReplication.c',
+  'execSRF.c',
+  'execScan.c',
+  'execTuples.c',
+  'execUtils.c',
+  'functions.c',
+  'instrument.c',
+  'nodeAgg.c',
+  'nodeAppend.c',
+  'nodeBitmapAnd.c',
+  'nodeBitmapHeapscan.c',
+  'nodeBitmapIndexscan.c',
+  'nodeBitmapOr.c',
+  'nodeCtescan.c',
+  'nodeCustom.c',
+  'nodeForeignscan.c',
+  'nodeFunctionscan.c',
+  'nodeGather.c',
+  'nodeGatherMerge.c',
+  'nodeGroup.c',
+  'nodeHash.c',
+  'nodeHashjoin.c',
+  'nodeIncrementalSort.c',
+  'nodeIndexonlyscan.c',
+  'nodeIndexscan.c',
+  'nodeLimit.c',
+  'nodeLockRows.c',
+  'nodeMaterial.c',
+  'nodeMemoize.c',
+  'nodeMergeAppend.c',
+  'nodeMergejoin.c',
+  'nodeModifyTable.c',
+  'nodeNamedtuplestorescan.c',
+  'nodeNestloop.c',
+  'nodeProjectSet.c',
+  'nodeRecursiveunion.c',
+  'nodeResult.c',
+  'nodeSamplescan.c',
+  'nodeSeqscan.c',
+  'nodeSetOp.c',
+  'nodeSort.c',
+  'nodeSubplan.c',
+  'nodeSubqueryscan.c',
+  'nodeTableFuncscan.c',
+  'nodeTidrangescan.c',
+  'nodeTidscan.c',
+  'nodeUnique.c',
+  'nodeValuesscan.c',
+  'nodeWindowAgg.c',
+  'nodeWorktablescan.c',
+  'spi.c',
+  'tqueue.c',
+  'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..83a90770bca
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,41 @@
+if llvm.found()
+
+  llvmjit_sources = []
+
+  # Infrastructure
+  llvmjit_sources += files(
+    'llvmjit.c',
+    'llvmjit_error.cpp',
+    'llvmjit_inline.cpp',
+    'llvmjit_wrap.cpp',
+  )
+
+  # Code generation
+  llvmjit_sources += files(
+    'llvmjit_deform.c',
+    'llvmjit_expr.c',
+  )
+
+  llvmjit = shared_module('llvmjit',
+    llvmjit_sources,
+    kwargs: pg_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [llvm],
+    }
+  )
+
+  backend_targets += llvmjit
+
+  # Note this is intentionally is not installed to bitcodedir, as it's not
+  # for inlining
+  llvmjit_types = custom_target('llvmjit_types.bc',
+    kwargs: llvm_irgen_kw + {
+      'input': 'llvmjit_types.c',
+      'output': 'llvmjit_types.bc',
+      'depends': [postgres],
+      'install': true,
+      'install_dir': get_option('libdir')
+    }
+  )
+  backend_targets += llvmjit_types
+
+endif
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..53292563d34
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'binaryheap.c',
+  'bipartite_match.c',
+  'bloomfilter.c',
+  'dshash.c',
+  'hyperloglog.c',
+  'ilist.c',
+  'integerset.c',
+  'knapsack.c',
+  'pairingheap.c',
+  'rbtree.c'
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..49867647155
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'auth-sasl.c',
+  'auth-scram.c',
+  'auth.c',
+  'be-fsstubs.c',
+  'be-secure-common.c',
+  'be-secure.c',
+  'crypt.c',
+  'hba.c',
+  'ifaddr.c',
+  'pqcomm.c',
+  'pqformat.c',
+  'pqmq.c',
+  'pqsignal.c',
+)
+
+if ssl.found()
+  backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+  backend_sources += files(
+    'be-secure-gssapi.c',
+    'be-gssapi-common.c'
+  )
+endif
+
+install_data('pg_hba.conf.sample', 'pg_ident.conf.sample', install_dir: 'share/')
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..b84f947bc7e
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,191 @@
+backend_build_deps = [backend_code]
+backend_deps = [dl_dep, thread_dep]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+backend_c_args = []
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+
+if host_machine.system() == 'windows'
+  backend_deps += cc.find_library('secur32', required: true)
+endif
+
+
+postgres_link_args = []
+postgres_link_depends = []
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+#
+# XXX: This needs to be improved.
+#
+
+# NB: There's an outer and inner layer of == windows checks, to allow to
+# exercise most of this on !windows, by widening the outer "layer".
+
+if cc.get_id() == 'msvc' # or true
+
+  postgres_lib = static_library('postgres_lib',
+    backend_sources + timezone_sources + generated_backend_sources,
+    link_whole: backend_link_with,
+    c_pch: '../include/pch/postgres_pch.h',
+    c_args: backend_c_args,
+    implicit_include_directories: false,
+    dependencies: backend_build_deps,
+    build_by_default: false,
+    install: false,
+  )
+
+  postgres_def = custom_target('postgres.def',
+    command: [perl, files('../tools/msvc/gendef2.pl'), 'x64', '@OUTPUT@', '@PRIVATE_DIR@', '@INPUT@'],
+    input: [postgres_lib, common_srv, pgport_srv],
+    output: 'postgres.def',
+    depends: [postgres_lib, common_srv, pgport_srv],
+    install: false,
+  )
+
+  if cc.get_id() == 'msvc'
+    postgres_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+    postgres_link_args += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+    postgres_link_depends += postgres_def
+  endif
+
+  # Unfortunately the msvc linker whines when building an executable with just
+  # libraries, hence the reuse of the 'main' object directly.
+
+  postgres = executable('postgres',
+    objects: [postgres_lib.extract_objects(main_file)],
+    link_with: [postgres_lib],
+    link_args: postgres_link_args,
+    link_depends: postgres_link_depends,
+    dependencies: backend_deps,
+    export_dynamic: true,
+    implib: true,
+    kwargs: default_bin_args,
+  )
+
+else
+
+  postgres = executable('postgres',
+    backend_sources + generated_backend_sources + timezone_sources,
+    c_pch: '../include/pch/postgres_pch.h',
+    c_args: backend_c_args,
+    link_with: backend_link_with,
+    export_dynamic: true,
+    dependencies: [backend_build_deps, backend_deps],
+    kwargs: default_bin_args,
+  )
+
+endif
+
+backend_targets += postgres
+
+pg_mod_args = default_mod_args + {
+  'dependencies': [backend_mod_code],
+  'c_args': [],
+  'cpp_args': [],
+ }
+
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+  pg_mod_args = pg_mod_args + {
+    'c_args': pg_mod_args['c_args'] + ['-fvisibility=hidden'],
+    'cpp_args': pg_mod_args['c_args'] + ['-fvisibility=hidden', '-fvisibility-inlines-hidden'],
+  }
+endif
+
+# Windows / MacOs link shared modules against postgres. To avoid unnecessary
+# build-time dependencies on other operating systems, only add it when
+# necessary.
+if host_machine.system() == 'windows' or host_machine.system() == 'darwin'
+   pg_mod_args = pg_mod_args + {'link_with': [postgres]}
+endif
+if host_machine.system() == 'darwin'
+   pg_mod_args = pg_mod_args + {'link_args': ['-bundle_loader', '@0@'.format(postgres.full_path())]}
+endif
+
+
+# Shared modules that, on some OSs, link against the server binary. Only enter
+# these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
+
+
+if llvm.found()
+
+  # custom_target() insists on targetting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generator and custom_'t accept CustomTargetIndex as 'depends', nor do they
+  # like targets with more than one output. However, a custom target accepts
+  # them as input without a problem. So we have the below transitive target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args + g_c_args,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: ['@PLAINNAME@.bc']
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('postgres.index.bc',
+    kwargs: llvm_irlink_kw + {
+      'input': bc_backend_sources,
+      'output': ['bitcode'],
+      },
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..9fca83fba44
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'bitmapset.c',
+  'copyfuncs.c',
+  'equalfuncs.c',
+  'extensible.c',
+  'list.c',
+  'makefuncs.c',
+  'nodeFuncs.c',
+  'nodes.c',
+  'outfuncs.c',
+  'params.c',
+  'print.c',
+  'read.c',
+  'readfuncs.c',
+  'tidbitmap.c',
+  'value.c',
+)
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'geqo_copy.c',
+  'geqo_cx.c',
+  'geqo_erx.c',
+  'geqo_eval.c',
+  'geqo_main.c',
+  'geqo_misc.c',
+  'geqo_mutation.c',
+  'geqo_ox1.c',
+  'geqo_ox2.c',
+  'geqo_pmx.c',
+  'geqo_pool.c',
+  'geqo_px.c',
+  'geqo_random.c',
+  'geqo_recombination.c',
+  'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'allpaths.c',
+  'clausesel.c',
+  'costsize.c',
+  'equivclass.c',
+  'indxpath.c',
+  'joinpath.c',
+  'joinrels.c',
+  'pathkeys.c',
+  'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'analyzejoins.c',
+  'createplan.c',
+  'initsplan.c',
+  'planagg.c',
+  'planmain.c',
+  'planner.c',
+  'setrefs.c',
+  'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'prepagg.c',
+  'prepjointree.c',
+  'prepqual.c',
+  'preptlist.c',
+  'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'appendinfo.c',
+  'clauses.c',
+  'inherit.c',
+  'joininfo.c',
+  'orclauses.c',
+  'paramassign.c',
+  'pathnode.c',
+  'placeholder.c',
+  'plancat.c',
+  'predtest.c',
+  'relnode.c',
+  'restrictinfo.c',
+  'tlist.c',
+  'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..491eacf20bb
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,43 @@
+backend_sources += files(
+  'analyze.c',
+  'parse_agg.c',
+  'parse_clause.c',
+  'parse_coerce.c',
+  'parse_collate.c',
+  'parse_cte.c',
+  'parse_enr.c',
+  'parse_expr.c',
+  'parse_func.c',
+  'parse_node.c',
+  'parse_oper.c',
+  'parse_param.c',
+  'parse_relation.c',
+  'parse_target.c',
+  'parse_type.c',
+  'parse_utilcmd.c',
+  'scansup.c',
+)
+
+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...
+
+parser_sources = [files('parser.c')]
+
+backend_scanner = custom_target('scan',
+  input: ['scan.l'],
+  output: ['scan.c'],
+  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT0@'])
+parser_sources += backend_scanner[0]
+
+parser_sources += backend_parser_header[0]
+parser_sources += backend_parser_header[1]
+
+parser = static_library('parser',
+  parser_sources + generated_headers,
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: [backend_code],
+  kwargs: default_lib_args + {'install': false},
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'partbounds.c',
+  'partdesc.c',
+  'partprune.c',
+)
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..f1bf7f6d929
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+   backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+   backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+   backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+   backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+   backend_sources += files('win32_shmem.c')
+endif
+
+if host_machine.system() == 'windows'
+  subdir('win32')
+endif
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..68fe4cc3cd0
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'crashdump.c',
+  'signal.c',
+  'socket.c',
+  'timer.c',
+)
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..803405683e2
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'autovacuum.c',
+  'auxprocess.c',
+  'bgworker.c',
+  'bgwriter.c',
+  'checkpointer.c',
+  'fork_process.c',
+  'interrupt.c',
+  'pgarch.c',
+  'pgstat.c',
+  'postmaster.c',
+  'startup.c',
+  'syslogger.c',
+  'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..d08e21cd6d6
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'regcomp.c',
+  'regerror.c',
+  'regexec.c',
+  'regexport.c',
+  'regfree.c',
+  'regprefix.c'
+)
+
+#FIXME
+# mark inclusion dependencies between .c files explicitly
+#regcomp.o: regcomp.c regc_lex.c regc_color.c regc_nfa.c regc_cvec.c \
+#        regc_locale.c regc_pg_locale.c
+#
+#regexec.o: regexec.c rege_dfa.c
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+  'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+  libpqwalreceiver_sources,
+  kwargs: pg_mod_args + {
+    'name_prefix': 'lib',
+    'dependencies': pg_mod_args['dependencies'] + [libpq],
+  }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+  'decode.c',
+  'launcher.c',
+  'logical.c',
+  'logicalfuncs.c',
+  'message.c',
+  'origin.c',
+  'proto.c',
+  'relation.c',
+  'reorderbuffer.c',
+  'snapbuild.c',
+  'tablesync.c',
+  'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..2573f166d79
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,42 @@
+backend_sources += files(
+  'backup_manifest.c',
+  'basebackup.c',
+  'slot.c',
+  'slotfuncs.c',
+  'syncrep.c',
+  'walreceiver.c',
+  'walreceiverfuncs.c',
+  'walsender.c',
+)
+
+# [sync]repl_scanner is compiled as part of [sync]repl_gram. The
+# ordering is enforced by making the generation of grammar depend on
+# the scanner generation. That's unnecessarily strict, but overall
+# harmless.
+
+repl_scanner = custom_target('repl_scanner',
+  input : files('repl_scanner.l'),
+  output : ['repl_scanner.c'],
+  command : [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@']
+)
+
+generated_backend_sources += custom_target('repl_gram',
+  input: 'repl_gram.y',
+  output: 'repl_gram.c',
+  depends: repl_scanner,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+
+syncrep_scanner = custom_target('syncrep_scanner',
+  input: 'syncrep_scanner.l',
+  output: 'syncrep_scanner.c',
+  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@'])
+
+generated_backend_sources += custom_target('syncrep_gram',
+  input: 'syncrep_gram.y',
+  output: 'syncrep_gram.c',
+  depends: syncrep_scanner,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..8ff0a0c6133
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,11 @@
+pgoutput_sources = files(
+  'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+  pgoutput_sources,
+  kwargs: pg_mod_args + {
+  }
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..032e2e409b5
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'rewriteDefine.c',
+  'rewriteHandler.c',
+  'rewriteManip.c',
+  'rewriteRemove.c',
+  'rewriteSearchCycle.c',
+  'rewriteSupport.c',
+  'rowsecurity.c'
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..b1e52e9a0c3
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,83 @@
+dict_snowball_sources = files(
+  'dict_snowball.c',
+  'libstemmer/api.c',
+  'libstemmer/utilities.c',
+)
+
+dict_snowball_sources += files(
+  'libstemmer/stem_ISO_8859_1_basque.c',
+  'libstemmer/stem_ISO_8859_1_catalan.c',
+  'libstemmer/stem_ISO_8859_1_danish.c',
+  'libstemmer/stem_ISO_8859_1_dutch.c',
+  'libstemmer/stem_ISO_8859_1_english.c',
+  'libstemmer/stem_ISO_8859_1_finnish.c',
+  'libstemmer/stem_ISO_8859_1_french.c',
+  'libstemmer/stem_ISO_8859_1_german.c',
+  'libstemmer/stem_ISO_8859_1_indonesian.c',
+  'libstemmer/stem_ISO_8859_1_irish.c',
+  'libstemmer/stem_ISO_8859_1_italian.c',
+  'libstemmer/stem_ISO_8859_1_norwegian.c',
+  'libstemmer/stem_ISO_8859_1_porter.c',
+  'libstemmer/stem_ISO_8859_1_portuguese.c',
+  'libstemmer/stem_ISO_8859_1_spanish.c',
+  'libstemmer/stem_ISO_8859_1_swedish.c',
+  'libstemmer/stem_ISO_8859_2_hungarian.c',
+  'libstemmer/stem_ISO_8859_2_romanian.c',
+  'libstemmer/stem_KOI8_R_russian.c',
+  'libstemmer/stem_UTF_8_arabic.c',
+  'libstemmer/stem_UTF_8_armenian.c',
+  'libstemmer/stem_UTF_8_basque.c',
+  'libstemmer/stem_UTF_8_catalan.c',
+  'libstemmer/stem_UTF_8_danish.c',
+  'libstemmer/stem_UTF_8_dutch.c',
+  'libstemmer/stem_UTF_8_english.c',
+  'libstemmer/stem_UTF_8_finnish.c',
+  'libstemmer/stem_UTF_8_french.c',
+  'libstemmer/stem_UTF_8_german.c',
+  'libstemmer/stem_UTF_8_greek.c',
+  'libstemmer/stem_UTF_8_hindi.c',
+  'libstemmer/stem_UTF_8_hungarian.c',
+  'libstemmer/stem_UTF_8_indonesian.c',
+  'libstemmer/stem_UTF_8_irish.c',
+  'libstemmer/stem_UTF_8_italian.c',
+  'libstemmer/stem_UTF_8_lithuanian.c',
+  'libstemmer/stem_UTF_8_nepali.c',
+  'libstemmer/stem_UTF_8_norwegian.c',
+  'libstemmer/stem_UTF_8_porter.c',
+  'libstemmer/stem_UTF_8_portuguese.c',
+  'libstemmer/stem_UTF_8_romanian.c',
+  'libstemmer/stem_UTF_8_russian.c',
+  'libstemmer/stem_UTF_8_serbian.c',
+  'libstemmer/stem_UTF_8_spanish.c',
+  'libstemmer/stem_UTF_8_swedish.c',
+  'libstemmer/stem_UTF_8_tamil.c',
+  'libstemmer/stem_UTF_8_turkish.c',
+  'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+  dict_snowball_sources,
+  c_pch: '../../include/pch/postgres_pch.h',
+  kwargs: pg_mod_args + {
+    'include_directories': [stemmer_inc],
+  }
+)
+
+snowball_create = custom_target('snowball_create',
+  input: ['snowball_create.pl'],
+  output: ['snowball_create.sql'],
+  depfile: 'snowball_create.dep',
+  command: [perl, '@INPUT0@', '--input', '@CURRENT_SOURCE_DIR@', '--output', '@OUTDIR@'],
+  install: true,
+  install_dir: get_option('datadir'))
+
+# FIXME: check whether the logic to select languages currently in Makefile is needed
+install_subdir('stopwords',
+  install_dir: get_option('datadir') / 'tsearch_data',
+  strip_directory: true)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'dependencies.c',
+  'extended_stats.c',
+  'mcv.c',
+  'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'buf_init.c',
+  'buf_table.c',
+  'bufmgr.c',
+  'freelist.c',
+  'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'buffile.c',
+  'copydir.c',
+  'fd.c',
+  'fileset.c',
+  'reinit.c',
+  'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'freespace.c',
+  'fsmpage.c',
+  'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+  'barrier.c',
+  'dsm.c',
+  'dsm_impl.c',
+  'ipc.c',
+  'ipci.c',
+  'latch.c',
+  'pmsignal.c',
+  'procarray.c',
+  'procsignal.c',
+  'shm_mq.c',
+  'shm_toc.c',
+  'shmem.c',
+  'shmqueue.c',
+  'signalfuncs.c',
+  'sinval.c',
+  'sinvaladt.c',
+  'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..938e7f89894
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'condition_variable.c',
+  'deadlock.c',
+  'lmgr.c',
+  'lock.c',
+  'lwlock.c',
+  'predicate.c',
+  'proc.c',
+  's_lock.c',
+  'spin.c',
+)
+
+lwlocknames_backend = custom_target('lwlocknames',
+  input : files('lwlocknames.txt'),
+  output : ['lwlocknames.c', 'lwlocknames.h'],
+  command : [perl, files('generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@']
+)
+generated_backend_sources += lwlocknames_backend[0]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bufpage.c',
+  'checksum.c',
+  'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'md.c',
+  'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'cmdtag.c',
+  'dest.c',
+  'fastpath.c',
+  'postgres.c',
+  'pquery.c',
+  'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..460036b6d4c
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+  'dict.c',
+  'dict_ispell.c',
+  'dict_simple.c',
+  'dict_synonym.c',
+  'dict_thesaurus.c',
+  'regis.c',
+  'spell.c',
+  'to_tsany.c',
+  'ts_locale.c',
+  'ts_parse.c',
+  'ts_selfuncs.c',
+  'ts_typanalyze.c',
+  'ts_utils.c',
+  'wparser.c',
+  'wparser_def.c',
+)
+
+install_subdir('dicts',
+  install_dir: get_option('datadir') / 'tsearch_data',
+  strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..cef26eb564b
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'backend_progress.c',
+  'backend_status.c',
+  'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..086fde8ff09
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,118 @@
+backend_sources += files(
+  'acl.c',
+  'amutils.c',
+  'array_expanded.c',
+  'array_selfuncs.c',
+  'array_typanalyze.c',
+  'array_userfuncs.c',
+  'arrayfuncs.c',
+  'arraysubs.c',
+  'arrayutils.c',
+  'ascii.c',
+  'bool.c',
+  'cash.c',
+  'char.c',
+  'cryptohashfuncs.c',
+  'date.c',
+  'datetime.c',
+  'datum.c',
+  'dbsize.c',
+  'domains.c',
+  'encode.c',
+  'enum.c',
+  'expandeddatum.c',
+  'expandedrecord.c',
+  'float.c',
+  'format_type.c',
+  'formatting.c',
+  'genfile.c',
+  'geo_ops.c',
+  'geo_selfuncs.c',
+  'geo_spgist.c',
+  'inet_cidr_ntop.c',
+  'inet_net_pton.c',
+  'int.c',
+  'int8.c',
+  'json.c',
+  'jsonb.c',
+  'jsonb_gin.c',
+  'jsonb_op.c',
+  'jsonb_util.c',
+  'jsonfuncs.c',
+  'jsonbsubs.c',
+  'jsonpath.c',
+  'jsonpath_exec.c',
+  'like.c',
+  'like_support.c',
+  'lockfuncs.c',
+  'mac.c',
+  'mac8.c',
+  'mcxtfuncs.c',
+  'misc.c',
+  'multirangetypes.c',
+  'multirangetypes_selfuncs.c',
+  'name.c',
+  'network.c',
+  'network_gist.c',
+  'network_selfuncs.c',
+  'network_spgist.c',
+  'numeric.c',
+  'numutils.c',
+  'oid.c',
+  'oracle_compat.c',
+  'orderedsetaggs.c',
+  'partitionfuncs.c',
+  'pg_locale.c',
+  'pg_lsn.c',
+  'pg_upgrade_support.c',
+  'pgstatfuncs.c',
+  'pseudotypes.c',
+  'quote.c',
+  'rangetypes.c',
+  'rangetypes_gist.c',
+  'rangetypes_selfuncs.c',
+  'rangetypes_spgist.c',
+  'rangetypes_typanalyze.c',
+  'regexp.c',
+  'regproc.c',
+  'ri_triggers.c',
+  'rowtypes.c',
+  'ruleutils.c',
+  'selfuncs.c',
+  'tid.c',
+  'timestamp.c',
+  'trigfuncs.c',
+  'tsginidx.c',
+  'tsgistidx.c',
+  'tsquery.c',
+  'tsquery_cleanup.c',
+  'tsquery_gist.c',
+  'tsquery_op.c',
+  'tsquery_rewrite.c',
+  'tsquery_util.c',
+  'tsrank.c',
+  'tsvector.c',
+  'tsvector_op.c',
+  'tsvector_parser.c',
+  'uuid.c',
+  'varbit.c',
+  'varchar.c',
+  'varlena.c',
+  'version.c',
+  'windowfuncs.c',
+  'xid.c',
+  'xid8funcs.c',
+  'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+  input: ['jsonpath_scan.l'],
+  output: ['jsonpath_scan.c'],
+  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+# jsonpath_scan is compiled as part of jsonpath_gram
+generated_backend_sources += custom_target('jsonpath_parse',
+  input: ['jsonpath_gram.y', jsonpath_scan[0]],
+  output: ['jsonpath_gram.c'],
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..92972db52ad
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'attoptcache.c',
+  'catcache.c',
+  'evtcache.c',
+  'inval.c',
+  'lsyscache.c',
+  'partcache.c',
+  'plancache.c',
+  'relcache.c',
+  'relfilenodemap.c',
+  'relmapper.c',
+  'spccache.c',
+  'syscache.c',
+  'ts_cache.c',
+  'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..ff0ae388263
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'assert.c',
+  'elog.c',
+  )
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'dfmgr.c',
+  'fmgr.c',
+  'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'dynahash.c',
+  'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'globals.c',
+  'miscinit.c',
+  'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..b84a78b6318
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,38 @@
+encodings = {
+  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+  'euc_tw_and_big5': [
+    'euc_tw_and_big5/euc_tw_and_big5.c',
+    'euc_tw_and_big5/big5.c',
+  ],
+  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+  backend_targets += shared_module(encoding,
+    sources,
+    kwargs: pg_mod_args + {
+    }
+  )
+
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'conv.c',
+  'mbutils.c',
+  'stringinfo_mb.c',
+  'wstrcmp.c',
+  'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..afb1c0346ba
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,13 @@
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..5274c8aa1ae
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'help_config.c',
+  'pg_config.c',
+  'pg_controldata.c',
+  'pg_rusage.c',
+  'ps_status.c',
+  'queryenvironment.c',
+  'queryjumble.c',
+  'rls.c',
+  'sampling.c',
+  'superuser.c',
+  'timeout.c',
+  'tzparser.c',
+  'guc.c',
+)
+
+# guc-file.c.h is compiled as part of guc.c
+guc_scan = custom_target('guc_scan',
+  input: ['guc-file.l'],
+  output: ['guc-file.c.h'],
+  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+generated_backend_sources += guc_scan
+
+backend_build_deps += declare_dependency(sources: [guc_scan],
+  include_directories: include_directories('.'))
+
+install_data('postgresql.conf.sample', install_dir: 'share/')
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'aset.c',
+  'dsa.c',
+  'freepage.c',
+  'generation.c',
+  'mcxt.c',
+  'memdebug.c',
+  'portalmem.c',
+  'slab.c',
+)
diff --git a/src/backend/utils/mmgr/proxy.c b/src/backend/utils/mmgr/proxy.c
new file mode 100644
index 00000000000..6e68fa9a557
--- /dev/null
+++ b/src/backend/utils/mmgr/proxy.c
@@ -0,0 +1,217 @@
+#include "postgres.h"
+
+#include "utils/memdebug.h"
+#include "utils/memutils.h"
+#include "lib/ilist.h"
+
+typedef struct ProxyContext
+{
+	MemoryContextData header;	/* Standard memory-context fields */
+	MemoryContext alloc_parent;
+	dlist_head allocations;
+} ProxyContext;
+
+typedef struct ProxyChunk
+{
+	dlist_node node;
+	void *context;
+} ProxyChunk;
+
+static void *ProxyContextAlloc(MemoryContext context, Size size);
+static void ProxyContextFree(MemoryContext context, void *pointer);
+static void *ProxyContextRealloc(MemoryContext context, void *pointer, Size size);
+static void ProxyContextReset(MemoryContext context);
+static void ProxyContextDelete(MemoryContext context);
+static Size ProxyContextGetChunkSpace(MemoryContext context, void *pointer);
+static bool ProxyContextIsEmpty(MemoryContext context);
+static void ProxyContextStats(MemoryContext context,
+						  MemoryStatsPrintFunc printfunc, void *passthru,
+						  MemoryContextCounters *totals);
+
+#ifdef MEMORY_CONTEXT_CHECKING
+static void ProxyContextCheck(MemoryContext context);
+#endif
+
+/*
+ * This is the virtual function table for ProxyContext contexts.
+ */
+static const MemoryContextMethods ProxyContextMethods = {
+	ProxyContextAlloc,
+	ProxyContextFree,
+	ProxyContextRealloc,
+	ProxyContextReset,
+	ProxyContextDelete,
+	ProxyContextGetChunkSpace,
+	ProxyContextIsEmpty,
+	ProxyContextStats
+#ifdef MEMORY_CONTEXT_CHECKING
+	,ProxyContextCheck
+#endif
+};
+
+MemoryContext
+ProxyContextCreate(MemoryContext parent,
+				   const char *name)
+{
+	ProxyContext *proxy;
+	MemoryContext alloc_parent;
+
+	proxy = (ProxyContext *) malloc(sizeof(ProxyContext));
+	if (proxy == NULL)
+	{
+		MemoryContextStats(TopMemoryContext);
+		ereport(ERROR,
+				(errcode(ERRCODE_OUT_OF_MEMORY),
+				 errmsg("out of memory"),
+				 errdetail("Failed while creating memory context \"%s\".",
+						   name)));
+	}
+
+	/* find node we can actually allocate in */
+	alloc_parent = parent;
+	while (alloc_parent != NULL && IsA(alloc_parent, ProxyContext))
+		alloc_parent = alloc_parent->parent;
+	if (alloc_parent == NULL)
+		elog(ERROR, "can't proxy forever");
+	proxy->alloc_parent = parent;
+
+	dlist_init(&proxy->allocations);
+
+	/* Finally, do the type-independent part of context creation */
+	MemoryContextCreate((MemoryContext) proxy,
+						T_ProxyContext,
+						&ProxyContextMethods,
+						parent,
+						name);
+
+	return (MemoryContext) proxy;
+}
+
+static void *
+ProxyContextAlloc(MemoryContext context, Size size)
+{
+	ProxyContext *proxy = castNode(ProxyContext, context);
+	ProxyChunk *chunk;
+	Size alloc_size;
+
+	alloc_size = size + MAXALIGN(sizeof(ProxyChunk));
+
+	chunk = MemoryContextAlloc(proxy->alloc_parent, alloc_size);
+
+	dlist_push_tail(&proxy->allocations, &chunk->node);
+	chunk->context = context;
+
+	return (char *) chunk + MAXALIGN(sizeof(ProxyChunk));
+}
+
+static void
+ProxyContextFree(MemoryContext context, void *pointer)
+{
+	ProxyChunk *chunk = (ProxyChunk *) ((char *) pointer - MAXALIGN(sizeof(ProxyChunk)));
+
+	dlist_delete(&chunk->node);
+
+	pfree(chunk);
+}
+
+static void *
+ProxyContextRealloc(MemoryContext context, void *pointer, Size size)
+{
+	ProxyContext *proxy = castNode(ProxyContext, context);
+	ProxyChunk *chunk = (ProxyChunk *) ((char *) pointer - MAXALIGN(sizeof(ProxyChunk)));
+
+	dlist_delete(&chunk->node);
+
+	chunk =repalloc ((char *) chunk, size + MAXALIGN(sizeof(ProxyChunk)));
+
+	dlist_push_tail(&proxy->allocations, &chunk->node);
+	chunk->context = context;
+
+	return (char *) chunk + MAXALIGN(sizeof(ProxyChunk));
+}
+
+static void
+ProxyContextReset(MemoryContext context)
+{
+	ProxyContext *proxy = castNode(ProxyContext, context);
+	dlist_mutable_iter iter;
+
+	dlist_foreach_modify(iter, &proxy->allocations)
+	{
+		ProxyChunk *ptr = dlist_container(ProxyChunk, node, iter.cur);
+
+		dlist_delete(iter.cur);
+		pfree(ptr);
+	}
+}
+
+static void
+ProxyContextDelete(MemoryContext context)
+{
+	ProxyContextReset(context);
+	free(context);
+}
+
+static Size
+ProxyContextGetChunkSpace(MemoryContext context, void *pointer)
+{
+	ProxyChunk *chunk = (ProxyChunk *) ((char *) pointer - MAXALIGN(sizeof(ProxyChunk)));
+
+	return GetMemoryChunkSpace(chunk);
+}
+
+static bool
+ProxyContextIsEmpty(MemoryContext context)
+{
+	ProxyContext *proxy = castNode(ProxyContext, context);
+
+	return dlist_is_empty(&proxy->allocations);
+}
+
+static void
+ProxyContextStats(MemoryContext context,
+				  MemoryStatsPrintFunc printfunc, void *passthru,
+				  MemoryContextCounters *totals)
+{
+	ProxyContext *proxy = castNode(ProxyContext, context);
+	Size		nblocks = 0;
+	Size		freechunks = 0;
+	Size		totalspace = 0;
+	Size		freespace = 0;
+	Size		chunks = 0;
+	dlist_iter iter;
+
+	dlist_foreach(iter, &proxy->allocations)
+	{
+		ProxyChunk *chunk = dlist_container(ProxyChunk, node, iter.cur);
+
+		totalspace += GetMemoryChunkSpace((void *) chunk);
+		chunks++;
+	}
+
+	if (printfunc)
+	{
+		char		stats_string[200];
+
+		snprintf(stats_string, sizeof(stats_string),
+				 "%zu chunks proxied to parent, totaling %zu bytes",
+				 chunks, totalspace);
+		printfunc(context, passthru, stats_string);
+	}
+
+	if (totals)
+	{
+		totals->nblocks += nblocks;
+		totals->freechunks += freechunks;
+		totals->totalspace += totalspace;
+		totals->freespace += freespace;
+	}
+}
+
+#ifdef MEMORY_CONTEXT_CHECKING
+static void
+ProxyContextCheck(MemoryContext context)
+{
+	/* FIXME */
+}
+#endif
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..b626bdc9d96
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'logtape.c',
+  'sharedtuplestore.c',
+  'sortsupport.c',
+  'tuplesort.c',
+  'tuplestore.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'combocid.c',
+  'snapmgr.c',
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..52f679e3116
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,24 @@
+initdb_sources = files(
+  'findtimezone.c',
+  'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+executable('initdb',
+  initdb_sources,
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'initdb',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_initdb.pl'
+  ]
+}
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..3718fd0759a
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+#TODO subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..69eaef8f141
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,22 @@
+pg_amcheck_sources = files(
+  'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+  pg_amcheck_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_nonesuch.pl',
+    't/003_check.pl',
+    't/004_verify_heapam.pl',
+    't/005_opclass_damage.pl',
+  ]
+}
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..27742fafab7
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,14 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+  ['pg_archivecleanup.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_archivecleanup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/010_pg_archivecleanup.pl'
+  ]
+}
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..a629b8b02f5
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,44 @@
+common_sources = files(
+  'receivelog.c',
+  'streamutil.c',
+  'walmethods.c',
+)
+
+pg_basebackup_common = static_library('pg_basebackup_common',
+  common_sources,
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+executable('pg_basebackup',
+  'pg_basebackup.c',
+  link_with: [pg_basebackup_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+executable('pg_receivewal',
+  'pg_receivewal.c',
+  link_with: [pg_basebackup_common],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+executable('pg_recvlogical',
+  'pg_recvlogical.c',
+  link_with: [pg_basebackup_common],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'pg_basebackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env': {'GZIP_PROGRAM': gzip.path(), 'TAR': tar.path()},
+  'tests': [
+    't/010_pg_basebackup.pl',
+    't/020_pg_receivewal.pl',
+    't/030_pg_recvlogical.pl',
+  ]
+}
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..bbf9582b904
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,16 @@
+executable('pg_checksums',
+  ['pg_checksums.c'],
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_checksums',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_actions.pl'
+  ]
+}
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..df0eb13f636
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,14 @@
+executable('pg_config',
+  ['pg_config.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_config',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_pg_config.pl',
+  ]
+}
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..fa6057afa54
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,14 @@
+executable('pg_controldata',
+  ['pg_controldata.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_controldata',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_pg_controldata.pl'
+  ]
+}
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..ac0d4f18192
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,17 @@
+executable('pg_ctl',
+  ['pg_ctl.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_ctl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_start_stop.pl',
+    't/002_status.pl',
+    't/003_promote.pl',
+    't/004_logrotate.pl'
+  ]
+}
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..ce5ef11eaeb
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,69 @@
+pg_dump_common_sources = files(
+  'compress_io.c',
+  'dumputils.c',
+  'parallel.c',
+  'pg_backup_archiver.c',
+  'pg_backup_custom.c',
+  'pg_backup_db.c',
+  'pg_backup_directory.c',
+  'pg_backup_null.c',
+  'pg_backup_tar.c',
+  'pg_backup_utils.c',
+)
+
+pg_dump_common = static_library('pg_dump_common',
+  pg_dump_common_sources,
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+pg_dump_sources = files(
+  'pg_dump.c',
+  'common.c',
+  'pg_dump_sort.c',
+)
+
+executable('pg_dump',
+  pg_dump_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_dumpall_sources = files(
+  'pg_dumpall.c',
+)
+
+executable('pg_dumpall',
+  pg_dumpall_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_restore_sources = files(
+  'pg_restore.c',
+)
+
+executable('pg_restore',
+  pg_restore_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+tap_tests += {
+  'name': 'pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_pg_dump.pl',
+    't/003_pg_dump_with_server.pl',
+    't/010_dump_connstr.pl',
+  ]
+}
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..7450c0f6432
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,15 @@
+executable('pg_resetwal',
+  files('pg_resetwal.c'),
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_resetwal',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_corrupted.pl'
+  ]
+}
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..c7c59e9e523
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,34 @@
+pg_rewind_sources = files(
+  'datapagemap.c',
+  'file_ops.c',
+  'filemap.c',
+  'libpq_source.c',
+  'local_source.c',
+  'parsexlog.c',
+  'pg_rewind.c',
+  'timeline.c',
+  '../../backend/access/transam/xlogreader.c',
+)
+
+pg_rewind = executable('pg_rewind',
+  pg_rewind_sources,
+  dependencies: [frontend_code, libpq, lz4],
+  kwargs: default_bin_args,
+)
+
+
+tap_tests += {
+  'name': 'pg_rewind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_databases.pl',
+    't/003_extrafiles.pl',
+    't/004_pg_xlog_symlink.pl',
+    't/005_same_timeline.pl',
+    't/006_options.pl',
+    't/007_standby_source.pl',
+    't/008_min_recovery_point.pl',
+  ]
+}
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..527be88d125
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,14 @@
+executable('pg_test_fsync',
+  ['pg_test_fsync.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'pg_test_fsync',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_basic.pl',
+  ]
+}
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..c74577df493
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,14 @@
+pg_test_timing = executable('pg_test_timing',
+  ['pg_test_timing.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_test_timing',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl'
+  ]
+}
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..88d0e03446b
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,26 @@
+pg_upgrade_sources = files(
+  'check.c',
+  'controldata.c',
+  'dump.c',
+  'exec.c',
+  'file.c',
+  'function.c',
+  'info.c',
+  'option.c',
+  'parallel.c',
+  'pg_upgrade.c',
+  'relfilenode.c',
+  'server.c',
+  'tablespace.c',
+  'util.c',
+  'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+  pg_upgrade_sources,
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+# FIXME: add test
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..c7039ddcc49
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,25 @@
+pg_verifybackup_sources = files(
+  'parse_manifest.c',
+  'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+  pg_verifybackup_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_verifybackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_algorithm.pl',
+    't/003_corruption.pl',
+    't/004_options.pl',
+    't/005_bad_manifest.pl',
+    't/006_encoding.pl',
+    't/007_wal.pl',
+  ]
+}
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..f89139f89f5
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,23 @@
+pg_waldump_sources = files(
+  'compat.c',
+  'pg_waldump.c',
+  'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+
+pg_waldump = executable('pg_waldump',
+  pg_waldump_sources,
+  dependencies: [frontend_code, lz4],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_waldump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+  ]
+}
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..5c4a778ff32
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,38 @@
+pgbench_sources = files(
+  'pgbench.c',
+)
+
+# exprscan is compiled as part ofexprparse. The ordering is enforced by making
+# the generation of grammar depend on the scanner generation. That's
+# unnecessarily strict, but overall harmless.
+
+exprscan = custom_target('exprscan',
+  input : files('exprscan.l'),
+  output : ['exprscan.c'],
+  command : [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@']
+)
+
+exprparse = custom_target('exprparse',
+  input: 'exprparse.y',
+  output: 'exprparse.c',
+  depends: exprscan,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+pgbench_sources += exprparse
+
+executable('pgbench',
+  pgbench_sources,
+  dependencies: [frontend_code, libpq, thread_dep],
+  include_directories: include_directories('.'),
+  kwargs: default_bin_args,
+)
+
+
+tap_tests += {
+  'name' : 'pgbench',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_pgbench_with_server.pl',
+    't/002_pgbench_no_server.pl'
+  ]
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..9b4642a69d0
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1 @@
+# FIXME: implement when I can test
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..98921f801d7
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,46 @@
+psql_sources = files(
+  'command.c',
+  'common.c',
+  'copy.c',
+  'crosstabview.c',
+  'describe.c',
+  'help.c',
+  'input.c',
+  'large_obj.c',
+  'mainloop.c',
+  'prompt.c',
+  'startup.c',
+  'stringutils.c',
+  'tab-complete.c',
+  'variables.c',
+)
+
+psql_sources += custom_target('psqlscanslash',
+  input: ['psqlscanslash.l'],
+  output: ['psqlscanslash.c'],
+  command: [flex, '-CFe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+psql_sources += custom_target('psql_help',
+  input: ['create_help.pl'],
+  output: ['sql_help.c', 'sql_help.h'],
+  depfile: 'sql_help.dep',
+  command: [perl, '@INPUT0@', '@SOURCE_ROOT@/doc/src/sgml/ref', '@OUTDIR@', 'sql_help'])
+
+executable('psql',
+  psql_sources,
+  c_pch: '../../include/pch/c_pch.h',
+  include_directories: include_directories('.'),
+  dependencies : [frontend_code, libpq, readline],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'psql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+  'tests': [
+    't/010_tab_completion.pl',
+    't/020_cancel.pl',
+  ],
+}
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..547a53500a4
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,46 @@
+scripts_common = static_library('scripts_common',
+  files('common.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: internal_lib_args,
+)
+
+binaries = [
+  'createdb',
+  'dropdb',
+  'createuser',
+  'dropuser',
+  'clusterdb',
+  'vacuumdb',
+  'reindexdb',
+  'pg_isready',
+]
+
+foreach binary : binaries
+  executable(binary,
+    files(binary + '.c'),
+    link_with: [scripts_common],
+    dependencies: [frontend_code, libpq],
+    kwargs: default_bin_args,
+  )
+endforeach
+
+tap_tests += {
+  'name': 'scripts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/010_clusterdb.pl',
+    't/011_clusterdb_all.pl',
+    't/020_createdb.pl',
+    't/040_createuser.pl',
+    't/050_dropdb.pl',
+    't/070_dropuser.pl',
+    't/080_pg_isready.pl',
+    't/090_reindexdb.pl',
+    't/091_reindexdb_all.pl',
+    't/100_vacuumdb.pl',
+    't/101_vacuumdb_all.pl',
+    't/102_vacuumdb_stages.pl',
+    't/200_connstr.pl',
+  ]
+}
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..6be70b0c5b3
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,140 @@
+common_sources = files(
+  'archive.c',
+  'base64.c',
+  'checksum_helper.c',
+  'config_info.c',
+  'controldata_utils.c',
+  'encnames.c',
+  'exec.c',
+  'file_perm.c',
+  'file_utils.c',
+  'hashfn.c',
+  'ip.c',
+  'jsonapi.c',
+  'keywords.c',
+  'kwlookup.c',
+  'link-canary.c',
+  'md5_common.c',
+  'pg_get_line.c',
+  'pg_lzcompress.c',
+  'pgfnames.c',
+  'psprintf.c',
+  'relpath.c',
+  'rmtree.c',
+  'saslprep.c',
+  'scram-common.c',
+  'string.c',
+  'stringinfo.c',
+  'unicode_norm.c',
+  'username.c',
+  'wait_error.c',
+  'wchar.c',
+)
+
+# FIXME: implement openssl
+if ssl.found()
+  common_sources += files(
+    'cryptohash_openssl.c',
+    'hmac_openssl.c',
+    'protocol_openssl.c',
+  )
+else
+  common_sources += files(
+    'cryptohash.c',
+    'hmac.c',
+    'md5.c',
+    'sha1.c',
+    'sha2.c',
+  )
+endif
+
+common_sources += custom_target('kwlist',
+  input: files('../include/parser/kwlist.h'),
+  output: 'kwlist_d.h',
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+      '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+  'd2s.c',
+  'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+  ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+ryu_srv = static_library('ryu_srv',
+  ryu_sources,
+  dependencies: [backend_port_code],
+  c_args: ryu_cflags,
+  kwargs: internal_lib_args
+)
+
+ryu_shlib = static_library('ryu_shlib',
+  ryu_sources,
+  dependencies: [frontend_port_code],
+  c_args: ryu_cflags,
+  pic: true,
+  kwargs: internal_lib_args
+)
+
+ryu_static = static_library('ryu_static',
+  ryu_sources,
+  dependencies: [frontend_port_code],
+  c_args: ryu_cflags,
+  kwargs: internal_lib_args
+)
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+  'fe_memutils.c',
+  'restricted_token.c',
+  'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+  'logging.c',
+)
+
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+
+common_srv = static_library('pgcommon_srv',
+  common_sources,
+  c_pch: '../include/pch/c_pch.h',
+  link_with: [ryu_srv],
+  dependencies: [backend_common_code, ssl],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+
+common_shlib = static_library('pgcommon_shlib',
+  common_sources_frontend_shlib,
+  c_pch: '../include/pch/c_pch.h',
+  pic: true,
+  link_with: [ryu_shlib],
+  dependencies: [frontend_common_code, ssl],
+  include_directories: include_directories('.'),
+  kwargs: default_lib_args,
+)
+
+common_static = static_library('pgcommon_static',
+  common_sources_frontend_static,
+  c_pch: '../include/pch/c_pch.h',
+  link_with: [ryu_static],
+  dependencies: [frontend_common_code, ssl],
+  include_directories: include_directories('.'),
+  kwargs: default_lib_args,
+)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..b305727d967
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,27 @@
+fe_utils_sources = files(
+  'archive.c',
+  'cancel.c',
+  'conditional.c',
+  'connect_utils.c',
+  'mbprint.c',
+  'option_utils.c',
+  'parallel_slot.c',
+  'print.c',
+  'query_utils.c',
+  'recovery_gen.c',
+  'simple_list.c',
+  'string_utils.c',
+)
+
+fe_utils_sources += custom_target('psqlscan',
+  input: ['psqlscan.l'],
+  output: ['psqlscan.c'],
+  command: [flex, '-Cfe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+fe_utils = static_library('fe_utils',
+  fe_utils_sources + generated_headers,
+  c_pch: '../include/pch/c_pch.h',
+  include_directories :  [postgres_inc, libpq_inc],
+  c_args: ['-DFRONTEND'],
+  kwargs: default_lib_args,
+)
diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..a86ac67eada
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,113 @@
+catalog_headers = [
+  'pg_proc.h',
+  'pg_type.h',
+  'pg_attribute.h',
+  'pg_class.h',
+  'pg_attrdef.h',
+  'pg_constraint.h',
+  'pg_inherits.h',
+  'pg_index.h',
+  'pg_operator.h',
+  'pg_opfamily.h',
+  'pg_opclass.h',
+  'pg_am.h',
+  'pg_amop.h',
+  'pg_amproc.h',
+  'pg_language.h',
+  'pg_largeobject_metadata.h',
+  'pg_largeobject.h',
+  'pg_aggregate.h',
+  'pg_statistic.h',
+  'pg_statistic_ext.h',
+  'pg_statistic_ext_data.h',
+  'pg_rewrite.h',
+  'pg_trigger.h',
+  'pg_event_trigger.h',
+  'pg_description.h',
+  'pg_cast.h',
+  'pg_enum.h',
+  'pg_namespace.h',
+  'pg_conversion.h',
+  'pg_depend.h',
+  'pg_database.h',
+  'pg_db_role_setting.h',
+  'pg_tablespace.h',
+  'pg_authid.h',
+  'pg_auth_members.h',
+  'pg_shdepend.h',
+  'pg_shdescription.h',
+  'pg_ts_config.h',
+  'pg_ts_config_map.h',
+  'pg_ts_dict.h',
+  'pg_ts_parser.h',
+  'pg_ts_template.h',
+  'pg_extension.h',
+  'pg_foreign_data_wrapper.h',
+  'pg_foreign_server.h',
+  'pg_user_mapping.h',
+  'pg_foreign_table.h',
+  'pg_policy.h',
+  'pg_replication_origin.h',
+  'pg_default_acl.h',
+  'pg_init_privs.h',
+  'pg_seclabel.h',
+  'pg_shseclabel.h',
+  'pg_collation.h',
+  'pg_partitioned_table.h',
+  'pg_range.h',
+  'pg_transform.h',
+  'pg_sequence.h',
+  'pg_publication.h',
+  'pg_publication_rel.h',
+  'pg_subscription.h',
+  'pg_subscription_rel.h',
+]
+
+bki_data = files(
+  'pg_aggregate.dat',
+  'pg_am.dat',
+  'pg_amop.dat',
+  'pg_amproc.dat',
+  'pg_authid.dat',
+  'pg_cast.dat',
+  'pg_class.dat',
+  'pg_collation.dat',
+  'pg_conversion.dat',
+  'pg_database.dat',
+  'pg_language.dat',
+  'pg_namespace.dat',
+  'pg_opclass.dat',
+  'pg_operator.dat',
+  'pg_opfamily.dat',
+  'pg_proc.dat',
+  'pg_range.dat',
+  'pg_tablespace.dat',
+  'pg_ts_config.dat',
+  'pg_ts_config_map.dat',
+  'pg_ts_dict.dat',
+  'pg_ts_parser.dat',
+  'pg_ts_template.dat',
+  'pg_type.dat',
+  )
+
+
+input = []
+output_files = ['postgres.bki', 'schemapg.h', 'system_fk_info.h', 'system_constraints.sql']
+output_install = [get_option('datadir'), get_option('includedir'), get_option('includedir'), get_option('datadir')]
+
+foreach h : catalog_headers
+  fname = h.split('.h')[0]+'_d.h'
+  input += files(h)
+  output_files += fname
+  output_install += get_option('includedir')
+endforeach
+
+generated_headers += custom_target('generated_catalog_headers',
+    input: input,
+    depend_files: bki_data,
+    build_by_default: true,
+    install: true,
+    output: output_files,
+    install_dir: output_install,
+    command: [perl, files('../../backend/catalog/genbki.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--set-version='+pg_version_major.to_string(), '--output=@OUTDIR@', '@INPUT@']
+    )
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..c3af4a2574f
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,50 @@
+configure_file(input : 'pg_config_ext.h.meson',
+  output : 'pg_config_ext.h',
+  configuration : cdata)
+
+system = host_machine.system()
+if system == 'windows'
+  system = 'win32'
+endif
+
+configure_file(
+  output : 'pg_config_os.h',
+  input: files('port/@0@.h'.format(system)),
+  install: true,
+  install_dir : get_option('includedir'),
+  copy : true)
+
+configure_file(
+  output : 'pg_config.h',
+  install : true,
+  install_dir : get_option('includedir'),
+  configuration : cdata)
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', get_option('prefix') / get_option('bindir'))
+config_paths_data.set_quoted('PGSHAREDIR', get_option('prefix') / get_option('datadir'))
+config_paths_data.set_quoted('SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
+config_paths_data.set_quoted('INCLUDEDIR', get_option('prefix') / get_option('includedir'))
+# FIXME: shouldn't be the same
+config_paths_data.set_quoted('PKGINCLUDEDIR', get_option('prefix') / get_option('includedir'))
+config_paths_data.set_quoted('INCLUDEDIRSERVER', get_option('prefix') / get_option('includedir'))
+config_paths_data.set_quoted('LIBDIR', get_option('prefix') / get_option('libdir'))
+# FIXME: figure out logic for pkglibdir
+config_paths_data.set_quoted('PKGLIBDIR', get_option('prefix') / get_option('libdir'))
+config_paths_data.set_quoted('LOCALEDIR', get_option('prefix') / get_option('localedir'))
+config_paths_data.set_quoted('DOCDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql')
+config_paths_data.set_quoted('HTMLDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql')
+config_paths_data.set_quoted('MANDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql')
+
+configure_file(
+  output: 'pg_config_paths.h',
+  configuration: config_paths_data,
+  install: false
+)
+
+
+subdir('utils')
+subdir('storage')
+subdir('catalog')
+subdir('parser')
diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build
new file mode 100644
index 00000000000..caf4c092909
--- /dev/null
+++ b/src/include/parser/meson.build
@@ -0,0 +1,10 @@
+backend_parser_header = custom_target('gram',
+  input: [files('../../backend/parser/gram.y')],
+  output: ['gram.c', 'gram.h'],
+  command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT0@'],
+  install: true,
+  # Only install gram.h, not gram.c
+  install_dir: [false, get_option('includedir')]
+)
+
+#generated_backend_headers += backend_parser[1]
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in.  This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..ce749169442
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,15 @@
+# FIXME: this creates an unnecessary lwlocknames.c - but it's not
+# obvious how to avoid that: meson insist on output files being in the
+# current dir.
+
+# FIXME: this leads to lwlocknames.c being installed. Bad.
+lwlocknames = custom_target('lwlocknames',
+  input : files('../../backend/storage/lmgr/lwlocknames.txt'),
+  output : ['lwlocknames.h', 'lwlocknames.c'],
+  command : [perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@'],
+  build_by_default: true,
+  install: true,
+  install_dir: get_option('includedir')
+)
+
+generated_backend_headers += lwlocknames[0]
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..b9c959b474d
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,22 @@
+errcodes = custom_target('errcodes',
+  input : files('../../backend/utils/errcodes.txt'),
+  output : ['errcodes.h'],
+  command : [perl, files('../../backend/utils/generate-errcodes.pl'), '@INPUT@', '@OUTPUT@']
+)
+generated_headers += errcodes
+
+generated_backend_headers += custom_target('probes.d',
+  input: files('../../backend/utils/probes.d'),
+  output : 'probes.h',
+  capture: true,
+  command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@']
+)
+
+fmgrtab_target = custom_target('fmgrtab',
+  input: '../catalog/pg_proc.dat',
+  output : ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@']
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..4b716f0e89d
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,99 @@
+libpq_sources = files(
+  'fe-auth-scram.c',
+  'fe-connect.c',
+  'fe-exec.c',
+  'fe-lobj.c',
+  'fe-misc.c',
+  'fe-print.c',
+  'fe-protocol3.c',
+  'fe-secure.c',
+  'fe-trace.c',
+  'legacy-pqsignal.c',
+  'libpq-events.c',
+  'pqexpbuffer.c',
+  'fe-auth.c',
+)
+
+if host_machine.system() == 'windows'
+  libpq_sources += files('win32.c', 'pthread-win32.c')
+endif
+
+if ssl.found()
+  libpq_sources += files('fe-secure-common.c')
+  libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+  libpq_sources += files(
+    'fe-secure-gssapi.c',
+    'fe-gssapi-common.c'
+  )
+endif
+
+export_file = custom_target('libpq_exports.list',
+  input: [files('exports.txt')],
+  output: ['@BASENAME@.list'],
+  command: [perl, files('../../tools/gen_versioning_script.pl'),
+    host_machine.system() == 'darwin' ? 'darwin' : 'gnu',
+    '@INPUT0@', '@OUTPUT0@'],
+  build_by_default: false,
+  install: false,
+)
+
+libpq_def = custom_target('libpq.def',
+  command: [perl, files('../../tools/msvc/export2def.pl'), '@OUTPUT@', '@INPUT0@', 'libpq'],
+  input: files('exports.txt'),
+  output: 'libpq.def',
+  build_by_default: false,
+  install: false,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+libpq_deps = [frontend_shlib_code, thread_dep, ssl, ldap, gssapi]
+libpq_link_depends = []
+
+libpq_kwargs = default_lib_args + {
+  'version': '5.'+pg_version_major.to_string(),
+}
+
+
+if host_machine.system() == 'darwin'
+  libpq_kwargs = libpq_kwargs + {
+    'link_args': ['-exported_symbols_list', export_file.full_path()],
+    'link_depends': export_file,
+    'soversion': '5',
+  }
+elif host_machine.system() == 'windows'
+  libpq_deps += cc.find_library('secur32', required: true)
+
+  libpq_kwargs = libpq_kwargs + {
+    'vs_module_defs': libpq_def,
+    'soversion': '',
+  }
+else
+  libpq_kwargs = libpq_kwargs + {
+    'link_args': '-Wl,--version-script=' + export_file.full_path(),
+    'link_depends': export_file,
+    'soversion': '5',
+  }
+endif
+
+libpq_so = shared_library('pq',
+  libpq_sources,
+  include_directories : [libpq_inc, postgres_inc],
+  c_args: ['-DFRONTEND'],
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: libpq_deps,
+  kwargs: libpq_kwargs,
+)
+
+libpq = declare_dependency(
+  link_with: [libpq_so],
+  include_directories: [include_directories('.')]
+)
+
+install_headers('libpq-fe.h', 'libpq-events.h')
+# FIXME: adjust path
+install_headers('libpq-int.h', 'pqexpbuffer.h')
+install_data('pg_service.conf.sample', install_dir: get_option('datadir'))
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..414be1db419
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,10 @@
+# libraries that other subsystems might depend uppon first, in their
+# respective dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..b720e922093
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,4 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..a5a994e845f
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,81 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+plperl_sources = files(
+  'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+  check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(subppdir)
+
+plperl_sources += custom_target('perlchunks.h',
+  input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+  output: 'perlchunks.h',
+  capture: true,
+  command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+  input: files('plperl_opmask.pl'),
+  output: 'plperl_opmask.h',
+  command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+  xs = files(n+'.xs')
+  xs_c_name = n+'.c'
+
+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?
+  xs_c = custom_target(xs_c_name,
+    input: xs,
+    output: xs_c_name,
+    command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+  )
+  plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+shared_module('plperl',
+  plperl_sources,
+  c_pch: '../../include/pch/postgres_pch.h',
+  include_directories: [plperl_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, pg_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'plperl.control',
+  'plperl--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+install_data(
+  'plperlu.control',
+  'plperlu--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+regress_tests += {
+  'name': 'plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'plperl_setup',
+    'plperl',
+    'plperl_lc',
+    'plperl_trigger',
+    'plperl_shared',
+    'plperl_elog',
+    'plperl_util',
+    'plperl_init',
+    'plperlu',
+    'plperl_array',
+    'plperl_call',
+    'plperl_transaction',
+   ],
+}
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..b040e5e8507
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,67 @@
+plpgsql_sources = files(
+  'pl_comp.c',
+  'pl_exec.c',
+  'pl_funcs.c',
+  'pl_handler.c',
+  'pl_scanner.c',
+)
+
+plpgsql_sources += custom_target('gram',
+  input: ['pl_gram.y'],
+  output: ['pl_gram.c', 'pl_gram.h'],
+  command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT0@'])
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+plpgsql_sources += custom_target('plerrcodes',
+  input: ['../../../../src/backend/utils/errcodes.txt'],
+  output: ['plerrcodes.h'],
+  command: [perl, gen_plerrcodes, '@INPUT0@'],
+  capture: true)
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+plpgsql_sources += custom_target('pl_reserved_kwlist',
+  input: ['pl_reserved_kwlist.h'],
+  output: ['pl_reserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+
+plpgsql_sources += custom_target('pl_unreserved_kwlist',
+  input: ['pl_unreserved_kwlist.h'],
+  output: ['pl_unreserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+
+shared_module('plpgsql',
+  plpgsql_sources,
+  c_pch: '../../../include/pch/postgres_pch.h',
+  include_directories: include_directories('.'),
+  kwargs: pg_mod_args,
+)
+
+install_data('plpgsql.control', 'plpgsql--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+install_headers('plpgsql.h',
+  install_dir: get_option('includedir') / 'server')
+
+
+regress_tests += {
+  'name': 'plpgsql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+     'plpgsql_array',
+     'plpgsql_call',
+     'plpgsql_control',
+     'plpgsql_copy',
+     'plpgsql_domain',
+     'plpgsql_record',
+     'plpgsql_cache',
+     'plpgsql_simple',
+     'plpgsql_transaction',
+     'plpgsql_trap',
+     'plpgsql_trigger',
+     'plpgsql_varprops',
+  ],
+}
diff --git a/src/pl/plpython/expected/meson.build b/src/pl/plpython/expected/meson.build
new file mode 100644
index 00000000000..4172ced2208
--- /dev/null
+++ b/src/pl/plpython/expected/meson.build
@@ -0,0 +1,14 @@
+# FIXME: adding the variant files like this is an abysmal hack in an abysmal hack
+foreach r2 : plpython_regress + ['plpython_error_5', 'plpython_types_3']
+  # string.replace is only in meson 0.58
+  r3 = 'plpython3' + r2.split('plpython')[1]
+
+  s2 = '@0@.out'.format(r2)
+  s3 = '@0@.out'.format(r3)
+  plpython3_test_deps += custom_target(s3,
+    input: '@0@.out'.format(r2),
+    output: '@0@.out'.format(r3),
+    capture: true,
+    command: plpython_regress_cmd,
+  )
+endforeach
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..14fe8bd7c7f
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,100 @@
+if not python3.found()
+  subdir_done()
+endif
+
+plpython_sources = files(
+  'plpy_cursorobject.c',
+  'plpy_elog.c',
+  'plpy_exec.c',
+  'plpy_main.c',
+  'plpy_planobject.c',
+  'plpy_plpymodule.c',
+  'plpy_procedure.c',
+  'plpy_resultobject.c',
+  'plpy_spi.c',
+  'plpy_subxactobject.c',
+  'plpy_typeio.c',
+  'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+    input: files('../../backend/utils/errcodes.txt'),
+    output: 'spiexceptions.h',
+    command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+    capture: true
+  )
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+shared_module('plpython3',
+  plpython_sources,
+  c_pch: '../../include/pch/postgres_pch.h',
+  include_directories: [plpython_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [python3, pg_mod_args['dependencies']],
+  },
+)
+
+# FIXME: Only install the relevant versions
+install_data(
+  'plpythonu.control',
+  'plpython2u.control',
+  'plpython3u.control',
+  'plpythonu--1.0.sql',
+  'plpython2u--1.0.sql',
+  'plpython3u--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+# FIXME: Think about python2
+
+
+plpython_regress_cmd = [
+  sed,
+  '-f', files('regress-python3-mangle.sed'),
+  '@INPUT0@'
+]
+
+plpython_regress = [
+  'plpython_schema',
+  'plpython_populate',
+  'plpython_test',
+  'plpython_do',
+  'plpython_global',
+  'plpython_import',
+  'plpython_spi',
+  'plpython_newline',
+  'plpython_void',
+  'plpython_call',
+  'plpython_params',
+  'plpython_setof',
+  'plpython_record',
+  'plpython_trigger',
+  'plpython_types',
+  'plpython_error',
+  'plpython_ereport',
+  'plpython_unicode',
+  'plpython_quote',
+  'plpython_composite',
+  'plpython_subtransaction',
+  'plpython_transaction',
+  'plpython_drop',
+]
+
+plpython3_regress = []
+plpython3_test_deps = []
+
+# FIXME: this is an abysmal hack
+subdir('sql')
+subdir('expected')
+
+regress_tests += {
+  'name': 'plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': plpython3_regress,
+  'deps': plpython3_test_deps,
+  'regress_args': ['--inputdir', meson.current_build_dir()],
+}
diff --git a/src/pl/plpython/sql/meson.build b/src/pl/plpython/sql/meson.build
new file mode 100644
index 00000000000..9923425e5ff
--- /dev/null
+++ b/src/pl/plpython/sql/meson.build
@@ -0,0 +1,15 @@
+# Convert plpython2 regression tests to plpython3 ones
+foreach r2 : plpython_regress
+  # string.replace is only in meson 0.58
+  r3 = 'plpython3' + r2.split('plpython')[1]
+  plpython3_regress += r3
+
+  s2 = '@0@.sql'.format(r2)
+  s3 = '@0@.sql'.format(r3)
+  plpython3_test_deps += custom_target(s3,
+    input: '@0@.sql'.format(r2),
+    output: '@0@.sql'.format(r3),
+    capture: true,
+    command: plpython_regress_cmd,
+  )
+endforeach
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..c6e4c788052
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,146 @@
+pgport_sources = [
+  'bsearch_arg.c',
+  'chklocale.c',
+  'erand48.c',
+  'inet_net_ntop.c',
+  'noblock.c',
+  'path.c',
+  'pg_bitutils.c',
+  'pg_strong_random.c',
+  'pgcheckdir.c',
+  'pgmkdirp.c',
+  'pgsleep.c',
+  'pgstrcasecmp.c',
+  'pgstrsignal.c',
+  'pqsignal.c',
+  'qsort.c',
+  'qsort_arg.c',
+  'quotes.c',
+  'snprintf.c',
+  'strerror.c',
+  'tar.c',
+  'thread.c',
+]
+
+if host_machine.system() == 'windows'
+  pgport_sources += files(
+    'dirmod.c',
+    'kill.c',
+    'open.c',
+    'system.c',
+    'win32env.c',
+    'win32error.c',
+    'win32security.c',
+    'win32setlocale.c',
+    'win32stat.c',
+  )
+endif
+
+if cc.get_id() == 'msvc'
+  pgport_sources += files(
+    'dirent.c',
+  )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+    ['dlopen'],
+    ['explicit_bzero'],
+    ['fls'],
+    ['getaddrinfo'],
+    ['getopt'],
+    ['getopt_long'],
+    ['getpeereid'],
+    ['getpeereid'],
+    ['getrusage'],
+    ['gettimeofday'],
+    ['inet_aton'],
+    ['link'],
+    ['mkdtemp'],
+    ['pread'],
+    ['preadv', 'HAVE_DECL_PREADV'],
+    ['pwrite'],
+    ['pwritev', 'HAVE_DECL_PWRITEV'],
+    ['random'],
+    ['srandom'],
+    ['strlcat'],
+    ['strlcpy'],
+    ['strnlen'],
+]
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+  ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+]
+
+foreach f : replace_funcs_neg
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'false' or val == '0'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+foreach f : replace_funcs_pos
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'true' or val == '1'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+
+if (host_machine.system() == 'windows' or host_machine.system() == 'cygwin') and \
+  (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+  # Cygwin and (apparently, based on test results) Mingw both
+  # have a broken strtof(), so substitute the same replacement
+  # code we use with VS2013. That's not a perfect fix, since
+  # (unlike with VS2013) it doesn't avoid double-rounding, but
+  # we have no better options. To get that, though, we have to
+  # force the file to be compiled despite HAVE_STRTOF.
+  pgport_sources += files('strtof.c')
+  message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+    host_machine.system(), cc.get_id(), cc.version()))
+endif
+
+if not cdata.has('HAVE_PTHREAD_BARRIER_WAIT') and host_machine.system() != 'windows'
+   pgport_sources += files('pthread_barrier_wait.c')
+endif
+
+
+pgport_srv = static_library('pgport_srv',
+  pgport_sources,
+  c_pch: '../include/pch/c_pch.h',
+  dependencies: [ssl, backend_port_code],
+  kwargs: internal_lib_args,
+)
+
+pgport_static = static_library('pgport',
+  pgport_sources,
+  c_pch: '../include/pch/c_pch.h',
+  dependencies: [ssl, frontend_port_code],
+  kwargs: default_lib_args,
+)
+
+pgport_shlib = static_library('pgport_shlib',
+  pgport_sources,
+  c_pch: '../include/pch/c_pch.h',
+  pic: true,
+  dependencies: [ssl, frontend_port_code],
+  kwargs: default_lib_args,
+)
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..be41fb314a5
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,9 @@
+tap_tests += {
+  'name': 'authentication',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_password.pl',
+    't/002_saslprep.pl',
+  ],
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..637b4807550
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,49 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+  'isolation_main.c',
+)
+
+# see src/backend/replication/meson.build for depend logic
+spec_scanner = custom_target('specscanner',
+  input : files('specscanner.l'),
+  output : ['specscanner.c'],
+  command : [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@']
+)
+
+isolationtester_sources = files('isolationtester.c')
+isolationtester_sources += custom_target('specparse',
+  input: 'specparse.y',
+  output: 'specparse.c',
+  depends: spec_scanner,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+pg_isolation_regress = executable('pg_isolation_regress',
+  isolation_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+isolationtester = executable('isolationtester',
+  isolationtester_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+isolation_tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'schedule': files('isolation_schedule'),
+  'test_kwargs': {
+    'priority': 40,
+    'timeout': 1000,
+  },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..9f9957a3b4c
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,12 @@
+tap_tests += {
+  'name': 'kerberos',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_auth.pl',
+  ],
+  'env' : {
+    'with_gssapi': gssapi.found() ? 'yes' : 'no',
+    'with_krb_srvnam': 'postgres',
+  },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..58eb9adc6f5
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,9 @@
+tap_tests += {
+  'name': 'ldap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_auth.pl',
+  ],
+  'env' : {'with_ldap': ldap.found() ? 'yes' : 'no'},
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..f0b0d3d3b5e
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,19 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+   subdir('ssl')
+endif
+
+if ldap.found()
+   subdir('ldap')
+endif
+
+if gssapi.found()
+   subdir('kerberos')
+endif
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..99ccaac5b38
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,19 @@
+isolation_tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'summarization-and-inprogress-insertion',
+  ]
+}
+
+
+tap_tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/01_workitems.pl',
+  ],
+}
+
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..2794d837c35
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,20 @@
+regress_tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'commit_timestamp',
+  ]
+}
+
+tap_tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_base.pl',
+    't/002_standby.pl',
+    't/003_standby_2.pl',
+    't/004_restart.pl',
+  ],
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..58fe5a1a21d
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,15 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+  ['delay_execution.c'],
+  kwargs: pg_mod_args,
+)
+
+isolation_tests += {
+  'name': 'delay_execution',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'partition-addition',
+    'partition-removal-1',
+  ]
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..a9c49bd9554
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+  ['dummy_index_am.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_index_am.control',
+  'dummy_index_am--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dummy_index_am',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'reloptions',
+  ]
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..ed31d8f9530
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+  ['dummy_seclabel.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_seclabel.control',
+  'dummy_seclabel--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dummy_seclabel',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'dummy_seclabel',
+  ]
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..2f850215a6f
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,21 @@
+libpq_pipeline = executable('libpq_pipeline',
+  files(
+    'libpq_pipeline.c',
+  ),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  },
+)
+
+tap_tests += {
+  'name': 'libpq_pipeline',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env': {
+    'PATH': meson.current_build_dir(),
+  },
+  'tests': [
+    't/001_libpq_pipeline.pl',
+  ]
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..c98225c6e7b
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,25 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_misc')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..3f70688fb89
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+  ['plsample.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plsample.control',
+  'plsample--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'plsample',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'plsample',
+  ]
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..cdf4afd18b8
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,11 @@
+isolation_tests += {
+  'name': 'snapshot_too_old',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'sto_using_cursor',
+    'sto_using_select',
+    'sto_using_hash_index',
+  ],
+  'regress_args': ['--temp-config', files('sto.conf')],
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..19aa00892f1
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+  ['spgist_name_ops.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'spgist_name_ops.control',
+  'spgist_name_ops--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'spgist_name_ops',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'spgist_name_ops',
+  ]
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..b9fa5ee1cdc
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,45 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+  ['ssl_passphrase_func.c'],
+  kwargs: pg_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  }
+)
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+  cert = custom_target('server.crt',
+    output: ['server.crt', 'server.ckey'],
+    command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+      '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+    build_by_default: false,
+    install: false,
+  )
+
+  # needs to agree with what's in the test script
+  pass = 'FooBaR1'
+
+  enccert = custom_target('server.key',
+    input: [cert[1]],
+    output: ['server.key'],
+    command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+  )
+endif
+
+tap_tests += {
+  'name': 'ssl_passphrase_callback',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_testfunc.pl',
+  ],
+  'env': {'with_ssl': 'openssl'},
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..2e995310876
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+  ['test_bloomfilter.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_bloomfilter.control',
+  'test_bloomfilter--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_bloomfilter',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_bloomfilter',
+  ]
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..3618229594d
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,40 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+  ['test_ddl_deparse.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ddl_deparse.control',
+  'test_ddl_deparse--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_ddl_deparse',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_ddl_deparse',
+    'create_extension',
+    'create_schema',
+    'create_type',
+    'create_conversion',
+    'create_domain',
+    'create_sequence_1',
+    'create_table',
+    'create_transform',
+    'alter_table',
+    'create_view',
+    'create_trigger',
+    'create_rule',
+    'comment_on',
+    'alter_function',
+    'alter_sequence',
+    'alter_ts_config',
+    'alter_type_enum',
+    'opfamily',
+    'defprivs',
+    'matviews',
+  ]
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..2ca504f8588
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,38 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_ext1--1.0.sql',
+  'test_ext1.control',
+  'test_ext2--1.0.sql',
+  'test_ext2.control',
+  'test_ext3--1.0.sql',
+  'test_ext3.control',
+  'test_ext4--1.0.sql',
+  'test_ext4.control',
+  'test_ext5--1.0.sql',
+  'test_ext5.control',
+  'test_ext6--1.0.sql',
+  'test_ext6.control',
+  'test_ext7--1.0--2.0.sql',
+  'test_ext7--1.0.sql',
+  'test_ext7.control',
+  'test_ext8--1.0.sql',
+  'test_ext8.control',
+  'test_ext_cyclic1--1.0.sql',
+  'test_ext_cyclic1.control',
+  'test_ext_cyclic2--1.0.sql',
+  'test_ext_cyclic2.control',
+  'test_ext_evttrig--1.0--2.0.sql',
+  'test_ext_evttrig--1.0.sql',
+  'test_ext_evttrig.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_extensions',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_extensions',
+    'test_extdepend',
+  ]
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..e177e90019f
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+  ['test_ginpostinglist.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ginpostinglist.control',
+  'test_ginpostinglist--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_ginpostinglist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_ginpostinglist',
+  ]
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..ccb8db725e5
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+  ['test_integerset.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_integerset.control',
+  'test_integerset--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_integerset',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_integerset',
+  ]
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..4ee8c562ac0
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,8 @@
+tap_tests += {
+  'name': 'misc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_constraint_validation.pl',
+  ],
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..c43ae95cf2c
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+  ['test_parser.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_parser.control',
+  'test_parser--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_parser',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_parser',
+  ]
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..110b3876832
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,24 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_pg_dump.control',
+  'test_pg_dump--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_pg_dump',
+  ]
+}
+
+tap_tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_base.pl',
+  ]
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..9f9a9475c8b
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+  ['test_predtest.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_predtest.control',
+  'test_predtest--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_predtest',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_predtest',
+  ]
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..6bbeca39ec9
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+  ['test_rbtree.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_rbtree.control',
+  'test_rbtree--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_rbtree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_rbtree',
+  ]
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..c5fd92ee1c6
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,21 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+  ['test_regex.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_regex.control',
+  'test_regex--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_regex',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_regex',
+    'test_regex_utf8',
+  ]
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..fb8b697e160
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,19 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+  ['test_rls_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_rls_hooks.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_rls_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_rls_hooks',
+  ]
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..159943f861e
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,24 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+  files(
+    'setup.c',
+    'test.c',
+    'worker.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_shm_mq.control',
+  'test_shm_mq--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_shm_mq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_shm_mq',
+  ]
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..9ed4d587721
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,9 @@
+regress_tests += {
+  'name': 'unsafe_tests',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'rolenames',
+    'alter_system_table',
+  ],
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..a80bd493ea7
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+  files(
+    'worker_spi.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'worker_spi.control',
+  'worker_spi--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'worker_spi',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'worker_spi',
+  ],
+  'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..5678e1d27ae
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,33 @@
+tap_tests += {
+  'name': 'recovery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' : [
+    't/001_stream_rep.pl',
+    't/002_archiving.pl',
+    't/003_recovery_targets.pl',
+    't/004_timeline_switch.pl',
+    't/005_replay_delay.pl',
+    't/006_logical_decoding.pl',
+    't/007_sync_rep.pl',
+    't/008_fsm_truncation.pl',
+    't/009_twophase.pl',
+    't/010_logical_decoding_timelines.pl',
+    't/011_crash_recovery.pl',
+    't/012_subtransactions.pl',
+    't/013_crash_restart.pl',
+    't/014_unlogged_reinit.pl',
+    't/015_promotion_pages.pl',
+    't/016_min_consistency.pl',
+    't/017_shm.pl',
+    't/018_wal_optimize.pl',
+    't/019_replslot_limit.pl',
+    't/020_archive_status.pl',
+    't/021_row_visibility.pl',
+    't/022_crash_temp_files.pl',
+    't/023_pitr_prepared_xact.pl',
+    't/024_archive_recovery.pl',
+    't/025_stuck_on_old_timeline.pl',
+    't/026_overwrite_contrecord.pl',
+  ]
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..1a2f7675e87
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,57 @@
+# also used by isolationtester
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+  'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+  regress_sources,
+  c_args: pg_regress_cflags,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+regress_module = shared_module('regress',
+  ['regress.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+shared_module('autoinc',
+  ['../../../contrib/spi/autoinc.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+shared_module('refint',
+  ['../../../contrib/spi/refint.c'],
+  kwargs: pg_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+    'install': false,
+  },
+)
+
+
+regress_tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'schedule': files('parallel_schedule'),
+  'regress_args': ['--make-testtablespace-dir'],
+  'test_kwargs': {
+    'priority': 50,
+    'timeout': 1000,
+  },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..42e34c9f632
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,10 @@
+tap_tests += {
+  'name': 'ssl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env' : {'with_ssl': get_option('ssl')},
+  'tests': [
+    't/001_ssltests.pl',
+    't/002_scram.pl'
+  ],
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..31580edd3d3
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,33 @@
+tap_tests += {
+  'name': 'subscription',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+  'tests': [
+    't/001_rep_changes.pl',
+    't/002_types.pl',
+    't/003_constraints.pl',
+    't/004_sync.pl',
+    't/005_encoding.pl',
+    't/006_rewrite.pl',
+    't/007_ddl.pl',
+    't/008_diff_schema.pl',
+    't/009_matviews.pl',
+    't/010_truncate.pl',
+    't/011_generated.pl',
+    't/012_collation.pl',
+    't/013_partition.pl',
+    't/014_binary.pl',
+    't/015_stream.pl',
+    't/016_stream_subxact.pl',
+    't/017_stream_ddl.pl',
+    't/018_stream_subxact_abort.pl',
+    't/019_stream_subxact_ddl_abort.pl',
+    't/020_messages.pl',
+    't/021_twophase.pl',
+    't/022_twophase_cascade.pl',
+    't/023_twophase_stream.pl',
+    't/024_add_drop_pub.pl',
+    't/100_bugs.pl',
+  ],
+}
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..c3703a5ec7d
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,50 @@
+# files to build into backend
+timezone_sources = files(
+  'localtime.c',
+  'pgtz.c',
+  'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+   'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+  'data/tzdata.zi'
+)
+
+
+# FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+# build our zic. But for that we'd need to run a good chunk of the configure
+# tests both natively and cross. Unclear if it's worth it.
+if meson.is_cross_build()
+  zic = find_program('zic', native: true, required: false)
+else
+  zic = executable('zic', zic_sources,
+    dependencies: [frontend_code],
+    kwargs: default_bin_args + {'install': false}
+  )
+endif
+
+# FIXME: this used to be sorted - but also isn't actually used
+abbrevs_txt = custom_target('abbrevs.txt',
+  input: tzdata,
+  output: ['abbrevs.txt'],
+  command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+  capture: true)
+
+tzdata = custom_target('tzdata',
+  input: tzdata,
+  output: ['timezone'],
+  command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+  install: true,
+  install_dir: get_option('datadir'))
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..effd2880ce7
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,20 @@
+tznames = files(
+  'Africa.txt',
+  'America.txt',
+  'Antarctica.txt',
+  'Asia.txt',
+  'Atlantic.txt',
+  'Australia.txt',
+  'Etc.txt',
+  'Europe.txt',
+  'Indian.txt',
+  'Pacific.txt',
+)
+
+tznames_sets = files(
+  'Default',
+  'Australia',
+  'India')
+
+install_data(tznames, install_dir: get_option('datadir') / 'timezonesets')
+install_data(tznames_sets, install_dir: get_option('datadir') / 'timezonesets')
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..2d75537374e
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+
+import os
+import shlex
+import sys
+
+mesonintrospect = os.environ['MESONINTROSPECT']
+components = shlex.split(mesonintrospect)
+
+if len(components) < 2:
+    print(f'expected more, got: {components}')
+    sys.exit(1)
+
+if components[-1] != 'introspect':
+    print('expected introspection at the end')
+    sys.exit(1)
+
+print('\n'.join(components[:-1]), end='')
+
+sys.exit(0)
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..efc2c700277
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+set -e
+
+srcdir="$1"
+builddir="$2"
+llvm_lto="$3"
+outputdir=$(realpath "$5")
+index="$outputdir/postgres.index.bc"
+priv="$6"
+shift 6
+numinput=$#
+
+if [ ! -d "$outputdir" ];then
+    mkdir -p "$outputdir/postgres"
+fi
+
+cd $priv
+
+# fixme, remove old contents"
+cp -r . "$outputdir/postgres"
+
+cd "$outputdir"
+
+filenames=$(for f in "$@";do echo "postgres/${f#$priv/}";done)
+"$llvm_lto" -thinlto -thinlto-action=thinlink -o "$index" $filenames
+
+exit 0
diff --git a/src/tools/msvc/export2def.pl b/src/tools/msvc/export2def.pl
new file mode 100644
index 00000000000..fb88e8b8ab9
--- /dev/null
+++ b/src/tools/msvc/export2def.pl
@@ -0,0 +1,22 @@
+# Copyright (c) 2021, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use 5.8.0;
+use List::Util qw(max);
+
+my ($deffile, $txtfile, $libname) = @ARGV;
+
+print STDERR "Generating $deffile...\n";
+open(my $if, '<', $txtfile) || die("Could not open $txtfile\n");
+open(my $of, '>', $deffile) || die("Could not open $deffile for writing\n");
+print $of "LIBRARY $libname\nEXPORTS\n";
+while (<$if>)
+{
+	next if (/^#/);
+	next if (/^\s*$/);
+	my ($f, $o) = split;
+	print $of " $f @ $o\n";
+}
+close($of);
+close($if);
diff --git a/src/tools/msvc/gendef2.pl b/src/tools/msvc/gendef2.pl
new file mode 100644
index 00000000000..3b905d6f5da
--- /dev/null
+++ b/src/tools/msvc/gendef2.pl
@@ -0,0 +1,177 @@
+
+# Copyright (c) 2021, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use 5.8.0;
+use List::Util qw(max);
+
+my @def;
+
+#
+# Script that generates a .DEF file for all objects in a directory
+#
+# src/tools/msvc/gendef.pl
+#
+
+# Given a symbol file path, loops over its contents
+# and returns a list of symbols of interest as a dictionary
+# of 'symbolname' -> symtype, where symtype is:
+#
+#     0    a CODE symbol, left undecorated in the .DEF
+#     1    A DATA symbol, i.e. global var export
+#
+sub extract_syms
+{
+	my ($symfile, $def) = @_;
+	open(my $f, '<', $symfile) || die "Could not open $symfile: $!\n";
+	while (<$f>)
+	{
+
+		# Expected symbol lines look like:
+		#
+		# 0   1        2      3            4            5 6
+		# IDX SYMBOL   SECT   SYMTYPE      SYMSTATIC      SYMNAME
+		# ------------------------------------------------------------------------
+		# 02E 00000130 SECTA  notype       External     | _standbyState
+		# 02F 00000009 SECT9  notype       Static       | _LocalRecoveryInProgress
+		# 064 00000020 SECTC  notype ()    Static       | _XLogCheckBuffer
+		# 065 00000000 UNDEF  notype ()    External     | _BufferGetTag
+		#
+		# See http://msdn.microsoft.com/en-us/library/b842y285.aspx
+		#
+		# We're not interested in the symbol index or offset.
+		#
+		# SECT[ION] is only examined to see whether the symbol is defined in a
+		# COFF section of the local object file; if UNDEF, it's a symbol to be
+		# resolved at link time from another object so we can't export it.
+		#
+		# SYMTYPE is always notype for C symbols as there's no typeinfo and no
+		# way to get the symbol type from name (de)mangling. However, we care
+		# if "notype" is suffixed by "()" or not. The presence of () means the
+		# symbol is a function, the absence means it isn't.
+		#
+		# SYMSTATIC indicates whether it's a compilation-unit local "static"
+		# symbol ("Static"), or whether it's available for use from other
+		# compilation units ("External"). We export all symbols that aren't
+		# static as part of the whole program DLL interface to produce UNIX-like
+		# default linkage.
+		#
+		# SYMNAME is, obviously, the symbol name. The leading underscore
+		# indicates that the _cdecl calling convention is used. See
+		# http://www.unixwiz.net/techtips/win32-callconv.html
+		# http://www.codeproject.com/Articles/1388/Calling-Conventions-Demystified
+		#
+		s/notype \(\)/func/g;
+		s/notype/data/g;
+
+		my @pieces = split;
+
+		# Skip file and section headers and other non-symbol entries
+		next unless defined($pieces[0]) and $pieces[0] =~ /^[A-F0-9]{3,}$/;
+
+		# Skip blank symbol names
+		next unless $pieces[6];
+
+		# Skip externs used from another compilation unit
+		next if ($pieces[2] eq "UNDEF");
+
+		# Skip static symbols
+		next unless ($pieces[4] eq "External");
+
+		# Skip some more MSVC-generated crud
+		next if $pieces[6] =~ /^@/;
+		next if $pieces[6] =~ /^\(/;
+
+		# __real and __xmm are out-of-line floating point literals and
+		# (for __xmm) their SIMD equivalents. They shouldn't be part
+		# of the DLL interface.
+		next if $pieces[6] =~ /^__real/;
+		next if $pieces[6] =~ /^__xmm/;
+
+		# __imp entries are imports from other DLLs, eg __imp__malloc .
+		# (We should never have one of these that hasn't already been skipped
+		# by the UNDEF test above, though).
+		next if $pieces[6] =~ /^__imp/;
+
+		# More under-documented internal crud
+		next if $pieces[6] =~ /NULL_THUNK_DATA$/;
+		next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
+		next if $pieces[6] =~ /^__NULL_IMPORT/;
+
+		# Skip string literals
+		next if $pieces[6] =~ /^\?\?_C/;
+
+		# We assume that if a symbol is defined as data, then as a function,
+		# the linker will reject the binary anyway. So it's OK to just pick
+		# whatever came last.
+		$def->{ $pieces[6] } = $pieces[3];
+	}
+	close($f);
+	return;
+}
+
+sub writedef
+{
+	my ($deffile, $platform, $def) = @_;
+	open(my $fh, '>', $deffile) || die "Could not write to $deffile\n";
+	print $fh "EXPORTS\n";
+	foreach my $f (sort keys %{$def})
+	{
+		my $isdata = $def->{$f} eq 'data';
+
+		# Strip the leading underscore for win32, but not x64
+		$f =~ s/^_//
+		  unless ($platform eq "x64");
+
+		# Emit just the name if it's a function symbol, or emit the name
+		# decorated with the DATA option for variables.
+		if ($isdata)
+		{
+			print $fh "  $f DATA\n";
+		}
+		else
+		{
+			print $fh "  $f\n";
+		}
+	}
+	close($fh);
+	return;
+}
+
+
+sub usage
+{
+	die(    "Usage: gendef.pl platform outputfile tempdir sourcelib\n"
+		  . "    modulepath: path to dir with obj files, no trailing slash"
+		  . "    platform: Win32 | x64");
+}
+
+usage()
+  unless scalar(@ARGV) >= 4;
+
+my $platform  = $ARGV[0];
+shift;
+my $deffile  = $ARGV[0];
+shift;
+my $tempdir  = $ARGV[0];
+shift;
+
+print STDERR "Generating $deffile in tmp dir $tempdir from ".join(' ', @ARGV)."\n";
+
+my %def = ();
+
+my $symfile = "$tempdir/all.sym";
+my $tmpfile = "$tempdir/tmp.sym";
+mkdir($tempdir);
+print STDERR "dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV)."\n";
+system("dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV))
+  && die "Could not call dumpbin";
+rename($tmpfile, $symfile);
+print "generated symfile to $symfile (via $tmpfile)\n";
+extract_syms($symfile, \%def);
+print "\n";
+
+writedef($deffile, $platform, \%def);
+
+print "Generated " . scalar(keys(%def)) . " symbols\n";
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..aeb2019b099
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# FIXME: I should probably be a perl or python script
+#
+
+# FIXME: argument parsing
+
+basedir=$1
+builddir=$2
+testgroup=$3
+testname=$(basename -s .pl $4)
+shift 4
+
+testdir="$basedir/testrun/$testgroup/$testname"
+echo "# executing test in $testdir group $testgroup test $testname, builddir $builddir"
+rm -rf "$testdir/"
+mkdir -p "$testdir"
+
+export TESTOUTDIR="$testdir"
+export TESTDIR="$builddir"
+
+exec "$@"
-- 
2.23.0.385.gbc12974a89

v3-0017-ci-Build-both-with-meson-and-as-before.patchtext/x-diff; charset=us-asciiDownload
From 6567a246b7c98bf769b15f4544fb039d162dbe38 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 8 Oct 2021 17:29:10 -0700
Subject: [PATCH v3 17/17] ci: Build both with meson and as before.

---
 .cirrus.yml | 464 ++++++++++++++++++++++++++++++++++------------------
 1 file changed, 308 insertions(+), 156 deletions(-)

diff --git a/.cirrus.yml b/.cirrus.yml
index f75bdce6dec..eace4602ea3 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -13,14 +13,13 @@ env:
 
 
 task:
-  name: FreeBSD
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
   compute_engine_instance:
     image_project: pg-vm-images-aio
     image: family/pg-aio-freebsd-13-0
     platform: freebsd
-    cpu: 2
-    memory: 2G
+    cpu: 4
+    memory: 4G
     disk: 50
   env:
     CCACHE_DIR: "/tmp/ccache_dir"
@@ -39,33 +38,52 @@ task:
     - mkdir -p /tmp/ccache_dir
     - chown -R postgres:postgres /tmp/ccache_dir
 
-  configure_script: |
-    su postgres -c './configure \
-      --enable-cassert --enable-debug --enable-tap-tests \
-      --enable-nls \
-      \
-      --with-icu \
-      --with-ldap \
-      --with-libxml \
-      --with-libxslt \
-      \
-      --with-lz4 \
-      --with-pam \
-      --with-perl \
-      --with-python \
-      --with-ssl=openssl \
-      --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
-      --with-uuid=bsd \
-      \
-      --with-includes=/usr/local/include --with-libs=/usr/local/lib \
-      CC="ccache cc"'
-  build_script:
-    - su postgres -c 'gmake -s -j3 && gmake -s -j3 -C contrib'
-  upload_caches:
-    - ccache
+  matrix:
+    - name: FreeBSD autoconf
+
+      configure_script: |
+        su postgres -c './configure \
+          --enable-cassert --enable-debug --enable-tap-tests \
+          --enable-nls \
+          \
+          --with-icu \
+          --with-ldap \
+          --with-libxml \
+          --with-libxslt \
+          \
+          --with-lz4 \
+          --with-pam \
+          --with-perl \
+          --with-python \
+          --with-ssl=openssl \
+          --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+          --with-uuid=bsd \
+          \
+          --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+          CC="ccache cc"'
+      build_script:
+        - su postgres -c 'gmake -s -j4 && gmake -s -j4 -C contrib'
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - su postgres -c 'time gmake -s -j4 ${CHECK} ${CHECKFLAGS}'
+
+    - name: FreeBSD meson
+
+      configure_script:
+        - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl build'
+      build_script:
+        - su postgres -c 'ninja -C build'
+      upload_caches:
+        - ccache
+      run_tests_script:
+        - su postgres -c 'meson test --no-rebuild -C build'
 
-  tests_script:
-    - su postgres -c 'time gmake -s -j2 ${CHECK} ${CHECKFLAGS}'
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
 
   on_failure:
     cores_script: |
@@ -83,14 +101,16 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
-  name: Linux
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
   compute_engine_instance:
     image_project: pg-vm-images-aio
-    image: family/pg-aio-bullseye
     platform: linux
     cpu: 4
     memory: 2G
@@ -120,37 +140,78 @@ task:
     - su postgres -c 'ulimit -l -S'
     - echo '/tmp/%e-%s-%p.core' > /proc/sys/kernel/core_pattern
 
-  configure_script: |
-    su postgres -c './configure \
-      --enable-cassert --enable-debug --enable-tap-tests \
-      --enable-nls \
-      \
-      --with-gssapi \
-      --with-icu \
-      --with-ldap \
-      --with-libxml \
-      --with-libxslt \
-      --with-llvm \
-      --with-lz4 \
-      --with-pam \
-      --with-perl \
-      --with-python \
-      --with-ssl=openssl \
-      --with-systemd \
-      --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \
-      --with-uuid=e2fs \
-      \
-      CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"'
-  build_script:
-    - su postgres -c 'make -s -j4 && make -s -j4 -C contrib'
-  upload_caches:
-    - ccache
+  matrix:
+    - name: Linux Autoconf
+
+      compute_engine_instance:
+        image: family/pg-aio-bullseye
+
+      configure_script: |
+        su postgres -c './configure \
+          --enable-cassert --enable-debug --enable-tap-tests \
+          --enable-nls \
+          \
+          --with-gssapi \
+          --with-icu \
+          --with-ldap \
+          --with-libxml \
+          --with-libxslt \
+          --with-llvm \
+          --with-lz4 \
+          --with-pam \
+          --with-perl \
+          --with-python \
+          --with-ssl=openssl \
+          --with-systemd \
+          --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \
+          --with-uuid=e2fs \
+          \
+          CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"'
+      build_script:
+        - su postgres -c 'make -s -j4 && make -s -j4 -C contrib'
+      upload_caches:
+        - ccache
+
+      tests_script: |
+        su postgres -c '\
+          ulimit -c unlimited; \
+          make -s ${CHECK} ${CHECKFLAGS} -j8 \
+          '
+
+    - name: Linux Meson
+
+      compute_engine_instance:
+        image: family/pg-aio-bullseye
+
+      configure_script:
+        - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl build'
+      build_script:
+        - su postgres -c 'ninja -C build'
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - su postgres -c 'meson test --no-rebuild -C build'
+
+    - name: Linux Meson Sid
+
+      compute_engine_instance:
+        image: family/pg-aio-sid
+
+      configure_script:
+        - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl build'
+      build_script:
+        - su postgres -c 'ninja -C build'
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - su postgres -c 'meson test --no-rebuild -C build'
 
-  tests_script: |
-    su postgres -c '\
-      ulimit -c unlimited; \
-      make -s ${CHECK} ${CHECKFLAGS} -j8 \
-      '
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
 
   on_failure:
     cores_script: |
@@ -168,10 +229,13 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
-  name: macOS
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
   osx_instance:
     image: big-sur-base
@@ -201,55 +265,86 @@ task:
     - sudo chmod 777 /cores
   homebrew_install_script:
     - brew install make coreutils ccache icu4c lz4 tcl-tk openldap
+    - brew install meson ninja python@3.9
   upload_caches:
     - homebrew
 
-  configure_script: |
-    LIBS="/usr/local/lib:$LIBS"
-    INCLUDES="/usr/local/include:$INCLUDES"
-
-    INCLUDES="/usr/local/opt/openssl/include:$INCLUDES"
-    LIBS="/usr/local/opt/openssl/lib:$LIBS"
-
-    PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
-    INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES"
-    LIBS="/usr/local/opt/icu4c/lib:$LIBS"
-
-    LIBS="/usr/local/opt/openldap/lib:$LIBS"
-    INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
-
-    export PKG_CONFIG_PATH
-
-    ./configure \
-      --prefix=$HOME/install \
-      --with-includes="$INCLUDES" \
-      --with-libs="$LIBS" \
-      \
-      --enable-cassert --enable-debug --enable-tap-tests \
-      --enable-nls \
-      \
-      --with-icu \
-      --with-ldap \
-      --with-libxml \
-      --with-libxslt \
-      \
-      --with-lz4 \
-      --with-perl \
-      --with-python \
-      --with-ssl=openssl \
-      --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \
-      --with-uuid=e2fs \
-      \
-      CC="ccache gcc" CFLAGS="-O0 -ggdb"
-  build_script:
-    - gmake -s -j12 && gmake -s -j12 -C contrib
-  upload_caches:
-    - ccache
+  matrix:
+    - name: macOS autoconf
+
+      configure_script: |
+        LIBS="/usr/local/lib:$LIBS"
+        INCLUDES="/usr/local/include:$INCLUDES"
+
+        PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH"
+        INCLUDES="/usr/local/opt/openssl/include:$INCLUDES"
+        LIBS="/usr/local/opt/openssl/lib:$LIBS"
+
+        PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
+        INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES"
+        LIBS="/usr/local/opt/icu4c/lib:$LIBS"
+
+        PKG_CONFIG_PATH="/usr/local/opt/ldap/lib/pkgconfig:$PKG_CONFIG_PATH"
+        LIBS="/usr/local/opt/openldap/lib:$LIBS"
+        INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
+
+        export PKG_CONFIG_PATH
+
+        ./configure \
+          --prefix=$HOME/install \
+          --with-includes="$INCLUDES" \
+          --with-libs="$LIBS" \
+          \
+          --enable-cassert --enable-debug --enable-tap-tests \
+          --enable-nls \
+          \
+          --with-icu \
+          --with-ldap \
+          --with-libxml \
+          --with-libxslt \
+          \
+          --with-lz4 \
+          --with-perl \
+          --with-python \
+          --with-ssl=openssl \
+          --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \
+          --with-uuid=e2fs \
+          \
+          CC="ccache gcc" CFLAGS="-O0 -ggdb"
+      build_script:
+        - gmake -s -j12 && gmake -s -j12 -C contrib
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - ulimit -c unlimited
+        - ulimit -n 1024
+        - gmake -s -j12 ${CHECK} ${CHECKFLAGS}
+
+    - name: macOS meson
+
+      configure_script: |
+        PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH"
+        PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
+        PKG_CONFIG_PATH="/usr/local/opt/openldap/lib/pkgconfig:$PKG_CONFIG_PATH"
+
+        export PKG_CONFIG_PATH
+
+        meson setup --buildtype debug -Dcassert=true -Dssl=openssl build
+      build_script:
+        - ninja -C build
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - ulimit -c unlimited
+        - ulimit -n 1024
+        - meson test --no-rebuild -C build
 
-  tests_script:
-    - ulimit -c unlimited
-    - ulimit -n 1024
-    - gmake -s -j12 ${CHECK} ${CHECKFLAGS}
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
 
   on_failure:
     cores_script: |
@@ -265,10 +360,13 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
-  name: Windows
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*'
   windows_container:
     dockerfile: ci/docker/windows_vs_2019
@@ -281,6 +379,8 @@ task:
     TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
     # Avoid re-installing over and over
     NO_TEMP_INSTALL: 1
+    # Try to hide git's tar
+    PATH: c:\windows\system32;${PATH}
 
   sysinfo_script:
     - chcp
@@ -289,55 +389,103 @@ task:
     - ps: Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug'
     - set
 
-  configure_script:
-    - copy ci\windows_build_config.pl src\tools\msvc\config.pl
-    - vcvarsall x64
-    - perl src/tools/msvc/mkvcbuild.pl
-  build_script:
-    - vcvarsall x64
-    # Disable file tracker, we're never going to rebuild...
-    - msbuild -m /p:TrackFileAccess=false pgsql.sln
-  tempinstall_script:
-    # Installation on windows currently only completely works from src\tools\msvc
-    - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install
-
-  check_test_script:
-    - perl src/tools/msvc/vcregress.pl check parallel
-  startcreate_test_script:
-    - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log
-    - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf
-    - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log
-  plcheck_test_script:
-    - perl src/tools/msvc/vcregress.pl plcheck
-  isolationcheck_test_script:
-    - perl src/tools/msvc/vcregress.pl isolationcheck
-  modulescheck_test_script:
-    - perl src/tools/msvc/vcregress.pl modulescheck
-  contribcheck_test_script:
-    - perl src/tools/msvc/vcregress.pl contribcheck
-  stop_test_script:
-    - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log
-  ssl_test_script:
-    - set with_ssl=openssl
-    - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\
-  subscriptioncheck_test_script:
-    - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\
-  authentication_test_script:
-    - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\
-  recoverycheck_test_script:
-    - perl src/tools/msvc/vcregress.pl recoverycheck
-  bincheck_test_script:
-    - perl src/tools/msvc/vcregress.pl bincheck
-  upgradecheck_test_script:
-    - perl src/tools/msvc/vcregress.pl upgradecheck
-  ecpgcheck_test_script:
-    # tries to build additional stuff
-    - vcvarsall x64
-    # References ecpg_regression.proj in the current dir
-    - cd src\tools\msvc
-    - perl vcregress.pl ecpgcheck
+  matrix:
+    - name: Windows homegrowns
+
+      configure_script:
+        - copy ci\windows_build_config.pl src\tools\msvc\config.pl
+        - vcvarsall x64
+        - perl src/tools/msvc/mkvcbuild.pl
+      build_script:
+        - vcvarsall x64
+        # Disable file tracker, we're never going to rebuild...
+        - msbuild -m /p:TrackFileAccess=false pgsql.sln
+      tempinstall_script:
+        # Installation on windows currently only completely works from src\tools\msvc
+        - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install
+
+      check_test_script:
+        - perl src/tools/msvc/vcregress.pl check parallel
+      startcreate_test_script:
+        - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log
+        - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf
+        - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log
+      plcheck_test_script:
+        - perl src/tools/msvc/vcregress.pl plcheck
+      isolationcheck_test_script:
+        - perl src/tools/msvc/vcregress.pl isolationcheck
+      modulescheck_test_script:
+        - perl src/tools/msvc/vcregress.pl modulescheck
+      contribcheck_test_script:
+        - perl src/tools/msvc/vcregress.pl contribcheck
+      stop_test_script:
+        - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log
+      ssl_test_script:
+        - set with_ssl=openssl
+        - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\
+      subscriptioncheck_test_script:
+        - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\
+      authentication_test_script:
+        - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\
+      recoverycheck_test_script:
+        - perl src/tools/msvc/vcregress.pl recoverycheck
+      bincheck_test_script:
+        - perl src/tools/msvc/vcregress.pl bincheck
+      upgradecheck_test_script:
+        - perl src/tools/msvc/vcregress.pl upgradecheck
+      ecpgcheck_test_script:
+        # tries to build additional stuff
+        - vcvarsall x64
+        # References ecpg_regression.proj in the current dir
+        - cd src\tools\msvc
+        - perl vcregress.pl ecpgcheck
+
+    - name: Windows Meson+vs+Ninja
+
+      meson_script:
+        - pip install meson
+        - pip install ninja
+      configure_script:
+        - vcvarsall x64
+        - mkdir subprojects
+        - meson wrap install lz4
+        - meson wrap install zlib
+        - meson setup --buildtype debug --backend ninja  -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1.1l\lib -Dextra_include_dirs=c:\openssl\1.1.1l\include build
+      build_script:
+        - vcvarsall x64
+        - ninja -C build
+
+      check_script:
+        - vcvarsall x64
+        - meson test --no-rebuild -C build
+
+    - name: Windows Meson+vs+msbuild
+
+      # Need a development version of meson for now
+      meson_dev_script:
+        - git clone https://github.com/mesonbuild/meson.git
+
+      configure_script:
+        - vcvarsall x64
+        - mkdir subprojects
+        - .\meson\meson.py wrap install lz4
+        - .\meson\meson.py wrap install zlib
+        - .\meson\meson.py setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1.1l\lib -Dextra_include_dirs=c:\openssl\1.1.1l\include build
+
+      build_script:
+        - vcvarsall x64
+        - msbuild -m /p:UseMultiToolTask=true build\postgresql.sln
+
+      check_script:
+        - vcvarsall x64
+        - .\meson\meson.py test --no-rebuild -C build
 
   always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+    cat_dumps_script:
+
     cores_script:
       - cat crashlog.txt || true
     dump_artifacts:
@@ -354,12 +502,16 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
   name: CompilerWarnings
   depends_on:
-    - Linux
+    - Linux Autoconf
   # task that did not run count as a success, so we need to recheck Linux' condition here :/
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
   container:
-- 
2.23.0.385.gbc12974a89

#2Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
1 attachment(s)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 01:37:21 -0700, Andres Freund wrote:

non-cached build (world-bin):
current: 40.46s
ninja: 7.31s

Interestingly this is pretty close to the minimum achievable on my
machine from the buildsystem perspective.

A build with -fuse-ld=lld, which the above didn't use, takes 6.979s. The
critical path is

bison gram.y -> gram.c 4.13s
gcc gram.c -> gram.o 2.05s
gcc postgres .... 0.317

A very helpful visualization is to transform ninja's build logs into a
tracefile with https://github.com/nico/ninjatracing

I attached an example - the trace.json.gz can be uploaded as-is to
https://ui.perfetto.dev/

It's quite a bit of of fun to look at imo.

There's a few other things quickly apparent:

- genbki prevents build progress due to dependencies on the generated
headers.
- the absolutely stupid way I implemented the python2->python3
regression test output conversion uses up a fair bit of resources
- tablecmds.c, pg_dump.c, xlog.c and a few other files are starting to
big enough to be problematic compile-time wise

Greetings,

Andres Freund

Attachments:

trace.json.gzapplication/gzipDownload
#3Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

On 12.10.21 10:37, Andres Freund wrote:

For the last year or so I've on and off tinkered with $subject. I think
it's in a state worth sharing now. First, let's look at a little
comparison.

I played with $subject a few years ago and liked it. I think, like you
said, meson is the best way forward. I support this project.

One problem I noticed back then was that some choices that we currently
determine ourselves in configure or the makefiles are hardcoded in
meson. For example, at the time, gcc on macOS was not supported. Meson
thought, if you are on macOS, you are surely using the Apple compiler,
and it supports these options. Fixing that required patches deep in the
bowels of the meson source code (and, in practice, waiting for a new
release etc.). I strongly suspect this isn't the only such problem.
For example, the shared library build behavior has been carefully tuned
in opinionated ways. With the autotools chain, one can override
anything with enough violence; so we have always felt free to do that.
I haven't followed it in a while, so I don't know what the situation is
now; but it is a concern, because we have always felt free to try new
and unusual build tools (Sun compiler, Intel compiler,
clang-when-it-was-new) early without waiting for anyone else.

#4Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#3)
Re: [RFC] building postgres with meson

On Tue, Oct 12, 2021 at 9:31 AM Peter Eisentraut
<peter.eisentraut@enterprisedb.com> wrote:

One problem I noticed back then was that some choices that we currently
determine ourselves in configure or the makefiles are hardcoded in
meson. For example, at the time, gcc on macOS was not supported. Meson
thought, if you are on macOS, you are surely using the Apple compiler,
and it supports these options. Fixing that required patches deep in the
bowels of the meson source code (and, in practice, waiting for a new
release etc.). I strongly suspect this isn't the only such problem.
For example, the shared library build behavior has been carefully tuned
in opinionated ways. With the autotools chain, one can override
anything with enough violence; so we have always felt free to do that.
I haven't followed it in a while, so I don't know what the situation is
now; but it is a concern, because we have always felt free to try new
and unusual build tools (Sun compiler, Intel compiler,
clang-when-it-was-new) early without waiting for anyone else.

I think we're going to need some solution to this problem. We have too
many people here with strong opinions about questions like this for me
to feel good about the idea that we're going to collectively be OK
with leaving these sorts of decisions up to some other project.

From my point of view, the time it takes to run configure is annoying,
but the build time is pretty fine. On my system, configure takes about
33 seconds, and a full rebuild with 'make -j8' takes 14.5 seconds (I
am using ccache). Moreover, most of the time when I run make, I'm only
doing a partial rebuild, so it's near-instantaneous.

--
Robert Haas
EDB: http://www.enterprisedb.com

#5Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

On 10/12/21 4:37 AM, Andres Freund wrote:

git remote add andres git@github.com:anarazel/postgres.git

ITYM:

git remote add andres git://github.com/anarazel/postgres.git

cheers

andrew
�
--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#6Josef Šimánek
josef.simanek@gmail.com
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

.

út 12. 10. 2021 v 10:37 odesílatel Andres Freund <andres@anarazel.de> napsal:

Hi,

For the last year or so I've on and off tinkered with $subject. I think
it's in a state worth sharing now. First, let's look at a little
comparison.

My workstation:

non-cached configure:
current: 11.80s
meson: 6.67s

non-cached build (world-bin):
current: 40.46s
ninja: 7.31s

no-change build:
current: 1.17s
ninja: 0.06s

test world:
current: 105s
meson: 63s

What actually started to motivate me however were the long times windows
builds took to come back with testsresults. On CI, with the same machine
config:

build:
current: 202s (doesn't include genbki etc)
meson+ninja: 140s
meson+msbuild: 206s

test:
current: 1323s (many commands)
meson: 903s (single command)

(note that the test comparison isn't quite fair - there's a few tests
missing, but it's just small contrib ones afaik)

The biggest difference to me however is not the speed, but how readable
the output is.

Running the tests with meson in a terminal, shows the number of tests
that completed out of how many total, how much time has passed, how long
the currently running tests already have been running.

At the end of a testrun a count of tests is shown:

188/189 postgresql:tap+pg_basebackup / pg_basebackup/t/010_pg_basebackup.pl OK 39.51s 110 subtests passed
189/189 postgresql:isolation+snapshot_too_old / snapshot_too_old/isolation OK 62.93s

Ok: 188
Expected Fail: 0
Fail: 1
Unexpected Pass: 0
Skipped: 0
Timeout: 0

Full log written to /tmp/meson/meson-logs/testlog.txt

The log has the output of the tests and ends with:

Summary of Failures:
120/189 postgresql:tap+recovery / recovery/t/007_sync_rep.pl ERROR 7.16s (exit status 255 or signal 127 SIGinvalid)

Quite the difference to make check-world -jnn output.

So, now that the teasing is done, let me explain a bit what lead me down
this path:

Autoconf + make is not being actively developed. Especially autoconf is
*barely* in maintenance mode - despite many shortcomings and bugs. It's
also technology that very few want to use - autoconf m4 is scary, and
it's scarier for people that started more recently than a lot of us
committers for example.

Recursive make as we use it is hard to get right. One reason the clean
make build is so slow compared to meson is that we had to resort to
.NOTPARALLEL to handle dependencies in a bunch of places. And despite
that, I quite regularly see incremental build failures that can be
resolved by retrying the build.

While we have incremental build via --enable-depend, they don't work
that reliable (i.e. misses necessary rebuilds) and yet is often too
aggressive. More modern build system can keep track of the precise
command used to build a target and rebuild it when that command changes.

We also don't just have the autoconf / make buildsystem, there's also
the msvc project generator - something most of us unix-y folks do not
like to touch. I think that, combined with there being no easy way to
run all tests, and it being just different, really hurt our windows
developer appeal (and subsequently the quality of postgres on
windows). I'm not saying this to ding the project generator - that was
well before there were decent "meta" buildsystems out there (and in some
ways it is a small one itself).

The last big issue I have with the current situation is that there's no
good test integration. make check-world output is essentially unreadable
/ not automatically parseable. Which led to the buildfarm having a
separate list of things it needs to test, so that failures can be
pinpointed and paired with appropriate logs. That approach unfortunately
doesn't scale well to multi-core CPUs, slowing down the buildfarm by a
fair bit.

This all led to me to experiment with improvements. I tried a few
somewhat crazy but incremental things like converting our buildsystem to
non-recursive make (I got it to build the backend, but it's too hard to
do manually I think), or to not run tests during the recursive make
check-world, but to append commands to a list of tests, that then is run
by a helper (can kinda be made to work). In the end I concluded that
the amount of time we'd need to invest to maintain our more-and-more
custom buildsystem going forward doesn't make sense.

Which lead me to look around and analyze which other buildsystems there
are that could make some sense for us. The halfway decent list includes,
I think:
1) cmake
2) bazel
3) meson

cmake would be a decent choice, I think. However, I just can't fully
warm up to it. Something about it just doesn't quite sit right with
me. That's not a good enough reason to prevent others from suggesting to
use it, but it's good enough to justify not investing a lot of time in
it myself.

Bazel has some nice architectural properties. But it requires a JVM to
run - I think that basically makes it insuitable for us. And the build
information seems quite arduous to maintain too.

Which left me with meson. It is a meta-buildsystem that can do the
actual work of building via ninja (the most common one, also targeted by
cmake), msbuild (visual studio project files, important for GUI work)
and xcode projects (I assume that's for a macos IDE, but I haven't tried
to use it). Meson roughly does what autoconf+automake did, in a
python-esque DSL, and outputs build-instructions for ninja / msbuild /
xcode. One interesting bit is that meson itself is written in python (
and fairly easy to contribute too - I got a few changes in now).

I don't think meson is perfect architecturally - e.g. its insistence on
not having functions ends up making it a bit harder to not end up
duplicating code. There's some user-interface oddities that are now hard
to fix fully, due to the faily wide usage. But all-in-all it's pretty
nice to use.

Its worth calling out that a lot of large open source projects have been
/ are migrating to meson. qemu/kvm, mesa (core part of graphics stack on
linux and also widely used in other platforms), a good chunk of GNOME,
and quite a few more. Due to that it seems unlikely to be abandoned
soon.

As far as I can tell the only OS that postgres currently supports that
meson doesn't support is HPUX. It'd likely be fairly easy to add
gcc-on-hpux support, a chunk more to add support for the proprietary
ones.

The attached patch (meson support is 0016, the rest is prerequisites
that aren't that interesting at this stage) converts most of postgres to
meson. There's a few missing contrib modules, only about half the
optional library dependencies are implemented, and I've only built on
x64. It builds on freebsd, linux, macos and windows (both ninja and
msbuild) and cross builds from linux to windows. Thomas helped make the
freebsd / macos pieces a reality, thanks!

I took a number of shortcuts (although there used to be a *lot*
more). So this shouldn't be reviewed to the normal standard of the
community - it's a prototype. But I think it's in a complete enough
shape that it allows to do a well-informed evaluation.

What doesn't yet work/ build:

- plenty optional libraries, contrib, NLS, docs build

- PGXS - and I don't yet know what to best do about it. One
backward-compatible way would be to continue use makefiles for pgxs,
but do the necessary replacement of Makefile.global.in via meson (and
not use that for postgres' own build). But that doesn't really
provide a nicer path for building postgres extensions on windows, so
it'd definitely not be a long-term path.

- JIT bitcode generation for anything but src/backend.

- anything but modern-ish x86. That's proably a small amount of work,
but something that needs to be done.

- exporting all symbols for extension modules on windows (the stuff for
postgres is implemented). Instead I marked the relevant symbols als
declspec(dllexport). I think we should do that regardless of the
buildsystem change. Restricting symbol visibility via gcc's
-fvisibility=hidden for extensions results in a substantially reduced
number of exported symbols, and even reduces object size (and I think
improves the code too). I'll send an email about that separately.

There's a lot more stuff to talk about, but I'll stop with a small bit
of instructions below:

Demo / instructions:
# Get code
git remote add andres git@github.com:anarazel/postgres.git
git fetch andres
git checkout --track andres/meson

# setup build directory
meson setup build --buildtype debug
cd build

# build (uses automatically as many cores as available)
ninja

I'm getting errors at this step. You can find my output at
https://pastebin.com/Ar5VqfFG. Setup went well without errors. Is that
expected for now?

Show quoted text

# change configuration, build again
meson configure -Dssl=openssl
ninja

# run all tests
meson test

# run just recovery tests
meson test --suite setup --suite recovery

# list tests
meson test --list

Greetings,

Andres Freund

#7Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

On 10/12/21 4:37 AM, Andres Freund wrote:

# setup build directory
meson setup build --buildtype debug

I took this for an outing on msys2 and it just seems to hang. If it's not hanging it's unbelievably slow.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#8Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#4)
Re: [RFC] building postgres with meson

Robert Haas <robertmhaas@gmail.com> writes:

I think we're going to need some solution to this problem. We have too
many people here with strong opinions about questions like this for me
to feel good about the idea that we're going to collectively be OK
with leaving these sorts of decisions up to some other project.

Agreed. I'm willing to put up with the costs of moving to some
other build system, but not if it dictates choices we don't want to
make about the end products.

From my point of view, the time it takes to run configure is annoying,
but the build time is pretty fine. On my system, configure takes about
33 seconds, and a full rebuild with 'make -j8' takes 14.5 seconds (I
am using ccache). Moreover, most of the time when I run make, I'm only
doing a partial rebuild, so it's near-instantaneous.

Read about Autoconf's --cache-file option. That and ccache are
absolutely essential tools IMO.

regards, tom lane

#9Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#7)
Re: [RFC] building postgres with meson

On 10/12/21 11:28 AM, Andrew Dunstan wrote:

On 10/12/21 4:37 AM, Andres Freund wrote:

# setup build directory
meson setup build --buildtype debug

I took this for an outing on msys2 and it just seems to hang. If it's not hanging it's unbelievably slow.

It hung because it expected the compiler to be 'ccache cc'. Hanging in
such a case is kinda unforgivable. I remedied that by setting 'CC=gcc'
but it then errored out looking for perl libs. I think msys2 is going to
be a bit difficult here :-(

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#10Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#3)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 15:30:57 +0200, Peter Eisentraut wrote:

I played with $subject a few years ago and liked it. I think, like you
said, meson is the best way forward. I support this project.

Cool.

One problem I noticed back then was that some choices that we currently
determine ourselves in configure or the makefiles are hardcoded in meson.

Yea, there's some of that. I think some degree of reduction in flexibility is
needed to realistically target multiple "backend" build-system like visual
studio project files etc. but I wish there were a bit less of that
nonetheless.

For example, at the time, gcc on macOS was not supported. Meson thought, if
you are on macOS, you are surely using the Apple compiler, and it supports
these options.

I'm pretty sure this one now can just be overridden with CC=gcc. It can on
linux and windows, but I don't have ready interactive access with a mac
(leaving cirrus asside, which now has a "start a terminal" option...).

For example, the shared library build behavior has been carefully tuned in
opinionated ways. With the autotools chain, one can override anything with
enough violence; so we have always felt free to do that. I haven't followed
it in a while, so I don't know what the situation is now; but it is a
concern, because we have always felt free to try new and unusual build tools
(Sun compiler, Intel compiler, clang-when-it-was-new) early without waiting
for anyone else.

It's possible to just take over building e.g. shared libraries ourselves with
custom targets. Although it'd be a bit annoying to do. The bigger problem is
that that e.g. wouldn't play that nicely with generating visual studio
projects, which require to generate link steps in a certain way. It'd build,
but the GUI might loose some of its options. Etc.

Greetings,

Andres Freund

#11Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#9)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 11:50:03 -0400, Andrew Dunstan wrote:

It hung because it expected the compiler to be 'ccache cc'. Hanging in
such a case is kinda unforgivable. I remedied that by setting 'CC=gcc'
but it then errored out looking for perl libs. I think msys2 is going to
be a bit difficult here :-(

Hm. Yea, the perl thing is my fault - you should be able to get past it with
-Dperl=disabled, and I'll take a look at fixing the perl detection. (*)

I can't reproduce the hanging though. I needed to install bison, flex and
ninja and disable perl as described above, but then it built just fine.

It does seems to crash somewhere in the main regression tests though, I think
I don't do the "set stack depth" dance correctly for msys.

If you repro the hanging, what's the last bit in meson-logs/meson-log.txt?

(*) I've for now made most dependencies autodetected, unless you pass
--auto-features disabled to collectively disable all the auto-detected
features. Initially I had mirrored the autoconf behaviour, but I got sick of
forgetting to turn off readline or zlib on windows. And then it was useful to
test on multiple operating systems...

For working on windows meson's wraps are quite useful. I've not added that to
the git branch, but if you manually do
mkdir subprojects
meson wrap install lz4
meson wrap install zlib
building with -Dzlib=enabled -Dlz4=enabled will fall back to building lz4,
zlib as-needed.

I was wondering about adding a binary wrap for e.g. bison, flex on windows, so
that the process of getting a build going isn't as arduous.

Greetings,

Andres Freund

#12Andres Freund
andres@anarazel.de
In reply to: Josef Šimánek (#6)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 17:21:50 +0200, Josef Šimánek wrote:

# build (uses automatically as many cores as available)
ninja

I'm getting errors at this step. You can find my output at
https://pastebin.com/Ar5VqfFG. Setup went well without errors. Is that
expected for now?

Thanks, that's helpful. And no, that's not expected (*), it should be fixed.

What OS / distribution / version is this?

Can you build postgres "normally" with --with-gss? Seems like we're ending up
with a version of gssapi that we're not compatible with.

You should be able to get past this by disabling gss using meson configure
-Dgssapi=disabled.

Greetings,

Andres Freund

* except kinda, in the sense that I'd expect it to be buggy, given that I've
run it only on a few machines and it's very, uh, bleeding edge

#13Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#11)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 09:59:26 -0700, Andres Freund wrote:

On 2021-10-12 11:50:03 -0400, Andrew Dunstan wrote:

It hung because it expected the compiler to be 'ccache cc'. Hanging in
such a case is kinda unforgivable. I remedied that by setting 'CC=gcc'
but it then errored out looking for perl libs. I think msys2 is going to
be a bit difficult here :-(

Hm. Yea, the perl thing is my fault - you should be able to get past it with
-Dperl=disabled, and I'll take a look at fixing the perl detection. (*)

This is a weird one. I don't know much about msys, so it's probably related to
that. Perl spits out /usr/lib/perl5/core_perl/ as its archlibexp. According to
shell commands that exists, but not according to msys's own python

$ /mingw64/bin/python -c "import os; p = '/usr/lib/perl5/core_perl/CORE'; print(f'does {p} exist:', os.path.exists(p))"
does /usr/lib/perl5/core_perl/CORE exist: False

$ ls -ld /usr/lib/perl5/core_perl/CORE
drwxr-xr-x 1 anfreund anfreund 0 Oct 10 10:19 /usr/lib/perl5/core_perl/CORE

So it's not too surprising that that doesn't work out. It's easy enough to
work around, but still pretty weird.

I pushed a workaround for the config-time error, but it doesn't yet recognize
msys perl correctly. But at least it's not alone in that - configure doesn't
seem to either, so I'm probably doing something wrong :)

I can't reproduce the hanging though. I needed to install bison, flex and
ninja and disable perl as described above, but then it built just fine.

It does seems to crash somewhere in the main regression tests though, I think
I don't do the "set stack depth" dance correctly for msys.

That was it - just hadn't ported setting -Wl,--stack=... for !msvc
windows. Pushed the fix for that out.

I guess I should figure out how to commandline install msys and add it to CI.

Greetings,

Andres Freund

#14Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#11)
Re: [RFC] building postgres with meson

On 10/12/21 12:59 PM, Andres Freund wrote:

If you repro the hanging, what's the last bit in meson-logs/meson-log.txt?

Here's the entire thing

# cat 
C:/tools/msys64/home/Administrator/postgresql/build/meson-logs/meson-log.txt
Build started at 2021-10-12T18:08:34.387568
Main binary: C:/tools/msys64/mingw64/bin/python.exe
Build Options: -Dbuildtype=debug
Python system: Windows
The Meson build system
Version: 0.59.1
Source dir: C:/tools/msys64/home/Administrator/postgresql
Build dir: C:/tools/msys64/home/Administrator/postgresql/build
Build type: native build
Project name: postgresql
Project version: 15devel
Sanity testing C compiler: ccache cc
Is cross compiler: False.
Sanity check compiler command line: ccache cc sanitycheckc.c -o
sanitycheckc.exe -D_FILE_OFFSET_BITS=64
Sanity check compile stdout:

-----
Sanity check compile stderr:

-----

meson.build:1:0: ERROR: Compiler ccache cc can not compile programs.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#15Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#14)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 14:11:39 -0400, Andrew Dunstan wrote:

On 10/12/21 12:59 PM, Andres Freund wrote:

If you repro the hanging, what's the last bit in meson-logs/meson-log.txt?

Here's the entire thing

Sanity check compiler command line: ccache cc sanitycheckc.c -o
sanitycheckc.exe -D_FILE_OFFSET_BITS=64
Sanity check compile stdout:

-----
Sanity check compile stderr:

-----

meson.build:1:0: ERROR: Compiler ccache cc can not compile programs.

Huh, it's not a question of gcc vs cc, it's that meson automatically uses
ccache. And it looks like msys's ccache is broken at the moment (installed
yesterday):

$ ccache --version
ccache version 4.4.1
...

$ echo > test.c
$ ccache cc -c test.c
Segmentation fault (core dumped)
..

not sure how that leads to hanging, but it's not too surprising that things
don't work out after that...

Greetings,

Andres Freund

#16Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#13)
Re: [RFC] building postgres with meson

On 10/12/21 2:09 PM, Andres Freund wrote:

Hi,

On 2021-10-12 09:59:26 -0700, Andres Freund wrote:

On 2021-10-12 11:50:03 -0400, Andrew Dunstan wrote:

It hung because it expected the compiler to be 'ccache cc'. Hanging in
such a case is kinda unforgivable. I remedied that by setting 'CC=gcc'
but it then errored out looking for perl libs. I think msys2 is going to
be a bit difficult here :-(

Hm. Yea, the perl thing is my fault - you should be able to get past it with
-Dperl=disabled, and I'll take a look at fixing the perl detection. (*)

This is a weird one. I don't know much about msys, so it's probably related to
that. Perl spits out /usr/lib/perl5/core_perl/ as its archlibexp. According to
shell commands that exists, but not according to msys's own python

$ /mingw64/bin/python -c "import os; p = '/usr/lib/perl5/core_perl/CORE'; print(f'does {p} exist:', os.path.exists(p))"
does /usr/lib/perl5/core_perl/CORE exist: False

$ ls -ld /usr/lib/perl5/core_perl/CORE
drwxr-xr-x 1 anfreund anfreund 0 Oct 10 10:19 /usr/lib/perl5/core_perl/CORE

Looks to me like a python issue:

# perl -e 'my $p = "/usr/lib/perl5/core_perl/CORE"; print qq(does $p
exist: ), -e $p, qq{\n};'
does /usr/lib/perl5/core_perl/CORE exist: 1

# python -c "import os; p = '/usr/lib/perl5/core_perl/CORE';
print(f'does {p} exist:', os.path.exists(p))"
does /usr/lib/perl5/core_perl/CORE exist: False

# cygpath -m /usr/lib/perl5/core_perl/CORE
C:/tools/msys64/usr/lib/perl5/core_perl/CORE

# python -c "import os; p =
'C:/tools/msys64/usr/lib/perl5/core_perl/CORE'; print(f'does {p}
exist:', os.path.exists(p))"
does C:/tools/msys64/usr/lib/perl5/core_perl/CORE exist: True

Clearly python is not understanding msys virtualized paths.

I guess I should figure out how to commandline install msys and add it to CI.

here's what I do:

# msys2 outputs esc-[3J which clears the screen's scroll buffer. Nasty.
# so we redirect the output
# find the log in c:\Windows\System32 if needed
choco install -y --no-progress --limit-output msys2 > msys2inst.log
c:\tools\msys64\usr\bin\bash -l
'/c/vfiles/windows-uploads/msys2-packages.sh'

Here's what's in msys-packages.sh:

pacman -S --needed --noconfirm \
    base-devel \
    msys/git \
    msys/ccache \
    msys/vim  \
    msys/perl-Crypt-SSLeay \
    mingw-w64-clang-x86_64-toolchain \
    mingw-w64-x86_64-toolchain

# could do: pacman -S --needed --noconfirm development
# this is more economical. These should cover most of the things you
might
# want to configure with

pacman -S --needed --noconfirm \
       msys/gettext-devel \
       msys/icu-devel \
       msys/libiconv-devel \
       msys/libreadline-devel \
       msys/libxml2-devel \
       msys/libxslt-devel \
       msys/openssl-devel \
       msys/zlib-devel

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#17Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#15)
Re: [RFC] building postgres with meson

On 10/12/21 2:23 PM, Andres Freund wrote:

Hi,

On 2021-10-12 14:11:39 -0400, Andrew Dunstan wrote:

On 10/12/21 12:59 PM, Andres Freund wrote:

If you repro the hanging, what's the last bit in meson-logs/meson-log.txt?

Here's the entire thing
Sanity check compiler command line: ccache cc sanitycheckc.c -o
sanitycheckc.exe -D_FILE_OFFSET_BITS=64
Sanity check compile stdout:

-----
Sanity check compile stderr:

-----

meson.build:1:0: ERROR: Compiler ccache cc can not compile programs.

Huh, it's not a question of gcc vs cc, it's that meson automatically uses
ccache. And it looks like msys's ccache is broken at the moment (installed
yesterday):

$ ccache --version
ccache version 4.4.1
...

$ echo > test.c
$ ccache cc -c test.c
Segmentation fault (core dumped)
..

not sure how that leads to hanging, but it's not too surprising that things
don't work out after that...

Yes, I've had to disable ccache on fairywren.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#18Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#10)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 09:15:41 -0700, Andres Freund wrote:

For example, at the time, gcc on macOS was not supported. Meson thought, if
you are on macOS, you are surely using the Apple compiler, and it supports
these options.

I'm pretty sure this one now can just be overridden with CC=gcc. It can on
linux and windows, but I don't have ready interactive access with a mac
(leaving cirrus asside, which now has a "start a terminal" option...).

It was a tad more complicated. But only because it took me a while to figure
out how to make gcc on macos actually work, independent of meson. Initially
gcc was always failing with errors about not finding the linker, and
installing binutils was a dead end.

Turns out just using a gcc at a specific path doesn't work, it ends up using
wrong internal binaries or something like that.

Once I got to that, the meson part was easy:

$ export PATH="/usr/local/opt/gcc/bin:$PATH"
$ CC=gcc-11 meson setup build-gcc
...
C compiler for the host machine: gcc-11 (gcc 11.2.0 "gcc-11 (Homebrew GCC 11.2.0) 11.2.0")
...
$ cd build-gcc
$ ninja test
...

181/181 postgresql:tap+subscription / subscription/t/100_bugs.pl OK 17.83s 5 subtests passed

Ok: 180
Expected Fail: 0
Fail: 0
Unexpected Pass: 0
Skipped: 1
Timeout: 0

One thing that is nice with meson's testrunner is that it can parse the output
of tap tests and recognizes the number of completed / failed subtests. I
wonder whether we could make pg_regress' output tap compliant without the
output quality suffering too much.

Greetings,

Andres Freund

#19Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#16)
Re: [RFC] building postgres with meson

On 10/12/21 2:37 PM, Andrew Dunstan wrote:

On 10/12/21 2:09 PM, Andres Freund wrote:

Hi,

On 2021-10-12 09:59:26 -0700, Andres Freund wrote:

On 2021-10-12 11:50:03 -0400, Andrew Dunstan wrote:

It hung because it expected the compiler to be 'ccache cc'. Hanging in
such a case is kinda unforgivable. I remedied that by setting 'CC=gcc'
but it then errored out looking for perl libs. I think msys2 is going to
be a bit difficult here :-(

Hm. Yea, the perl thing is my fault - you should be able to get past it with
-Dperl=disabled, and I'll take a look at fixing the perl detection. (*)

This is a weird one. I don't know much about msys, so it's probably related to
that. Perl spits out /usr/lib/perl5/core_perl/ as its archlibexp. According to
shell commands that exists, but not according to msys's own python

$ /mingw64/bin/python -c "import os; p = '/usr/lib/perl5/core_perl/CORE'; print(f'does {p} exist:', os.path.exists(p))"
does /usr/lib/perl5/core_perl/CORE exist: False

$ ls -ld /usr/lib/perl5/core_perl/CORE
drwxr-xr-x 1 anfreund anfreund 0 Oct 10 10:19 /usr/lib/perl5/core_perl/CORE

Looks to me like a python issue:

# perl -e 'my $p = "/usr/lib/perl5/core_perl/CORE"; print qq(does $p
exist: ), -e $p, qq{\n};'
does /usr/lib/perl5/core_perl/CORE exist: 1

# python -c "import os; p = '/usr/lib/perl5/core_perl/CORE';
print(f'does {p} exist:', os.path.exists(p))"
does /usr/lib/perl5/core_perl/CORE exist: False

# cygpath -m /usr/lib/perl5/core_perl/CORE
C:/tools/msys64/usr/lib/perl5/core_perl/CORE

# python -c "import os; p =
'C:/tools/msys64/usr/lib/perl5/core_perl/CORE'; print(f'does {p}
exist:', os.path.exists(p))"
does C:/tools/msys64/usr/lib/perl5/core_perl/CORE exist: True

Clearly python is not understanding msys virtualized paths.

It's a matter of which python you use. The one that understands msys
paths is msys/python. The mingw64 packages are normally pure native
windows and so don't understand msys paths. I know it's confusing :-(

# /usr/bin/python -c "import os; p = '/usr/lib/perl5/core_perl/CORE';
print(f'does {p} exist:', os.path.exists(p))"
does /usr/lib/perl5/core_perl/CORE exist: True

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#20Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#16)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 14:37:04 -0400, Andrew Dunstan wrote:

On 10/12/21 2:09 PM, Andres Freund wrote:

Hm. Yea, the perl thing is my fault - you should be able to get past it with
-Dperl=disabled, and I'll take a look at fixing the perl detection. (*)

This is a weird one. I don't know much about msys, so it's probably related to
that. Perl spits out /usr/lib/perl5/core_perl/ as its archlibexp. According to
shell commands that exists, but not according to msys's own python

$ /mingw64/bin/python -c "import os; p = '/usr/lib/perl5/core_perl/CORE'; print(f'does {p} exist:', os.path.exists(p))"
does /usr/lib/perl5/core_perl/CORE exist: False

$ ls -ld /usr/lib/perl5/core_perl/CORE
drwxr-xr-x 1 anfreund anfreund 0 Oct 10 10:19 /usr/lib/perl5/core_perl/CORE

Looks to me like a python issue:

Clearly python is not understanding msys virtualized paths.

Ah, it's a question of the *wrong* python being used :/. I somehow ended up
with both a mingw and an msys python, with the mingw python taking preference
over the msys one. The latter one does understand such paths.

I guess I should figure out how to commandline install msys and add it to CI.

here's what I do:

Thanks!

Does that recipe get you to a build where ./configure --with-perl succeeds?

I see this here:

checking for Perl archlibexp... /usr/lib/perl5/core_perl
checking for Perl privlibexp... /usr/share/perl5/core_perl
checking for Perl useshrplib... true
checking for CFLAGS recommended by Perl... -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -march=x86-64 -mtune=generic -O2 -pipe -fwrapv -fno-strict-aliasing -fstack-protector-strong
checking for CFLAGS to compile embedded Perl... -DPERL_USE_SAFE_PUTENV
checking for flags to link embedded Perl... no
configure: error: could not determine flags for linking embedded Perl.
This probably means that ExtUtils::Embed or ExtUtils::MakeMaker is not
installed.

If I just include perl.h from a test file with gcc using the above flags it
fails to compile:
$ echo '#include <perl.h>' > test.c
$ gcc -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -march=x86-64 -mtune=generic -O2 -pipe -fwrapv -fno-strict-aliasing -fstack-protector-strong test.c -c -I /c/dev/msys64/usr/lib/perl5/core_perl/CORE
In file included from test.c:1:
C:/dev/msys64/usr/lib/perl5/core_perl/CORE/perl.h:1003:13: fatal error: sys/wait.h: No such file or directory
1003 | # include <sys/wait.h>

and ldopts bleats

$ perl -MExtUtils::Embed -e ldopts
Warning (mostly harmless): No library found for -lpthread
Warning (mostly harmless): No library found for -ldl
-Wl,--enable-auto-import -Wl,--export-all-symbols -Wl,--enable-auto-image-base -fstack-protector-strong -L/usr/lib/perl5/core_perl/CORE -lperl -lcrypt

Greetings,

Andres Freund

#21John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

On Tue, Oct 12, 2021 at 4:37 AM Andres Freund <andres@anarazel.de> wrote:

[Meson prototype]

The build code looks pretty approachable for someone with no prior
exposure, and feels pretty nice when running it (I couldn't get a build
working but I'll leave that aside for now).

As far as I can tell the only OS that postgres currently supports that
meson doesn't support is HPUX. It'd likely be fairly easy to add
gcc-on-hpux support, a chunk more to add support for the proprietary
ones.

That would also have to work for all the dependencies, which were displayed
to me as:

ninja, gdbm, ca-certificates, openssl@1.1, readline, sqlite and python@3.9

Also, could utility makefile targets be made to work? I'm thinking in
particular of update-unicode and reformat-dat-files, for example.

--
John Naylor
EDB: http://www.enterprisedb.com

#22Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#20)
Re: [RFC] building postgres with meson

On 10/12/21 3:29 PM, Andres Freund wrote:

Does that recipe get you to a build where ./configure --with-perl succeeds?

I see this here:

checking for Perl archlibexp... /usr/lib/perl5/core_perl
checking for Perl privlibexp... /usr/share/perl5/core_perl
checking for Perl useshrplib... true
checking for CFLAGS recommended by Perl... -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -march=x86-64 -mtune=generic -O2 -pipe -fwrapv -fno-strict-aliasing -fstack-protector-strong
checking for CFLAGS to compile embedded Perl... -DPERL_USE_SAFE_PUTENV
checking for flags to link embedded Perl... no
configure: error: could not determine flags for linking embedded Perl.
This probably means that ExtUtils::Embed or ExtUtils::MakeMaker is not
installed.

If I just include perl.h from a test file with gcc using the above flags it
fails to compile:

You need to build against a native perl, like Strawberry or ActiveState.
(I have had mixed success with Strawberry) You do that by putting a path
to it at the start of the PATH. The wrinkle in this is that you need
prove to point to one that understands virtual paths. So you do
something like this:

PATH="/c/perl/bin:$PATH" PROVE=/bin/core_perl/prove configure ...

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#23Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#22)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 16:02:14 -0400, Andrew Dunstan wrote:

You need to build against a native perl, like Strawberry or ActiveState.
(I have had mixed success with Strawberry)

Do you understand why that is needed?

You do that by putting a path to it at the start of the PATH. The wrinkle in
this is that you need prove to point to one that understands virtual
paths. So you do something like this:

PATH="/c/perl/bin:$PATH" PROVE=/bin/core_perl/prove configure ...

Oh my.

I'll try that later... I wonder if we could make this easier from our side?
This is a lot of magic to know.

Greetings,

Andres Freund

#24Andres Freund
andres@anarazel.de
In reply to: John Naylor (#21)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 15:55:22 -0400, John Naylor wrote:

On Tue, Oct 12, 2021 at 4:37 AM Andres Freund <andres@anarazel.de> wrote:
The build code looks pretty approachable for someone with no prior
exposure, and feels pretty nice when running it

That's part of what attracted me...

(I couldn't get a build working but I'll leave that aside for now).

If you want to do that separately, I'll try to fix it.

As far as I can tell the only OS that postgres currently supports that
meson doesn't support is HPUX. It'd likely be fairly easy to add
gcc-on-hpux support, a chunk more to add support for the proprietary
ones.

That would also have to work for all the dependencies, which were displayed
to me as:

ninja, gdbm, ca-certificates, openssl@1.1, readline, sqlite and python@3.9

meson does depend on ninja (to execute the build) and of course python. But
the rest should be optional dependencies. ninja builds without any
dependencies as long as you don't change its parser sources. python builds on
aix, hpux etc.

Not sure what way gdbm openssl@1.1 and sqlite are pulled in? I assume readline
is for python...

Also, could utility makefile targets be made to work? I'm thinking in
particular of update-unicode and reformat-dat-files, for example.

Yes, that shouldn't be a problem. You can run arbitrary code in targets
(there's plenty need for that already in what I have so far).

Greetings,

Andres Freund

#25Josef Šimánek
josef.simanek@gmail.com
In reply to: Andres Freund (#12)
Re: [RFC] building postgres with meson

út 12. 10. 2021 v 19:17 odesílatel Andres Freund <andres@anarazel.de> napsal:

Hi,

On 2021-10-12 17:21:50 +0200, Josef Šimánek wrote:

# build (uses automatically as many cores as available)
ninja

I'm getting errors at this step. You can find my output at
https://pastebin.com/Ar5VqfFG. Setup went well without errors. Is that
expected for now?

Thanks, that's helpful. And no, that's not expected (*), it should be fixed.

What OS / distribution / version is this?

Fedora 34 (64 bit)

Can you build postgres "normally" with --with-gss? Seems like we're ending up
with a version of gssapi that we're not compatible with.

Yes, I can.

You should be able to get past this by disabling gss using meson configure
-Dgssapi=disabled.

I tried to clean and start from scratch, but I'm getting different
error probably related to wrongly configured JIT (LLVM wasn't found
during meson setup). I'll debug on my side to provide more info.

Whole build error could be found at https://pastebin.com/hCFqcPvZ.
Setup log could be found at https://pastebin.com/wjbE1w56.

Show quoted text

Greetings,

Andres Freund

* except kinda, in the sense that I'd expect it to be buggy, given that I've
run it only on a few machines and it's very, uh, bleeding edge

#26Andres Freund
andres@anarazel.de
In reply to: Josef Šimánek (#25)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-13 01:19:27 +0200, Josef Šimánek wrote:

I tried to clean and start from scratch, but I'm getting different
error probably related to wrongly configured JIT (LLVM wasn't found
during meson setup). I'll debug on my side to provide more info.

../src/backend/jit/jit.c:91:73: error: ‘DLSUFFIX’ undeclared (first use in this function)
91 | snprintf(path, MAXPGPATH, "%s/%s%s", pkglib_path, jit_provider, DLSUFFIX);
| ^~~~~~~~

This *very* likely is related to building in a source tree that also contains
a "non-meson" build "in place". The problem is that the meson build picks up
the pg_config.h generated by ./configure in the "normal" build, rather than
the one meson generated itself.

You'd need to execute make distclean or such, or use a separate git checkout.

I forgot about this issue because I only ever build postgres from outside the
source-tree (by invoking configure from a separate directory), so there's
never build products in it. I think at least I need to make the build emit a
warning / error if there's a pg_config.h in the source tree...

This is the part of the jit code that's built regardless of llvm availability
- you'd get the same error in a few other places unrelated to jit.

Greetings,

Andres Freund

#27Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#23)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 13:42:56 -0700, Andres Freund wrote:

On 2021-10-12 16:02:14 -0400, Andrew Dunstan wrote:

You do that by putting a path to it at the start of the PATH. The wrinkle in
this is that you need prove to point to one that understands virtual
paths. So you do something like this:

PATH="/c/perl/bin:$PATH" PROVE=/bin/core_perl/prove configure ...

Oh my.

I'll try that later... I wonder if we could make this easier from our side?
This is a lot of magic to know.

I managed to get this working. At first it failed because I don't have
pexports - it's not available inside msys as far as I could tell. And seems to
be unmaintained. But replacing pexports with gendef fixed that.

There's this comment in src/pl/plperl/GNUmakefile

# Perl on win32 ships with import libraries only for Microsoft Visual C++,
# which are not compatible with mingw gcc. Therefore we need to build a
# new import library to link with.

but I seem to be able to link fine without going through that song-and-dance?

Greetings,

Andres Freund

#28Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#18)
1 attachment(s)
Re: [RFC] building postgres with meson

On 12 Oct 2021, at 21:01, Andres Freund <andres@anarazel.de> wrote:

One thing that is nice with meson's testrunner is that it can parse the output
of tap tests and recognizes the number of completed / failed subtests. I
wonder whether we could make pg_regress' output tap compliant without the
output quality suffering too much.

I added a --tap option for TAP output to pg_regress together with Jinbao Chen
for giggles and killing some time a while back. It's not entirely done and
sort of PoC, but most of it works. Might not be of interest here, but in case
it is I've refreshed it slightly and rebased it. There might be better ways to
do it, but the aim was to make the diff against the guts of pg_regress small
and instead extract output functions for the different formats.

It omits the test timings, but that could be added either as a diagnostic line
following each status or as a YAML block in TAP 13 (the attached is standard
TAP, not version 13 but the change would be trivial).

If it's helpful and there's any interest for this I'm happy to finish it up now.

One thing that came out of this, is that we don't really handle the ignored
tests in the way the code thinks it does for normal output, the attached treats
ignored tests as SKIP tests.

--
Daniel Gustafsson https://vmware.com/

Attachments:

pg_regress_tap.diffapplication/octet-stream; name=pg_regress_tap.diff; x-unix-mode=0644Download
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 05296f7ee1..dc60edf82e 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -95,6 +95,7 @@ static char *dlpath = PKGLIBDIR;
 static char *user = NULL;
 static _stringlist *extraroles = NULL;
 static char *config_auth_datadir = NULL;
+static bool tap = false;
 
 /* internal variables */
 static const char *progname;
@@ -120,9 +121,71 @@ static int	fail_ignore_count = 0;
 static bool directory_exists(const char *dir);
 static void make_directory(const char *dir);
 
-static void header(const char *fmt,...) pg_attribute_printf(1, 2);
+struct output_func
+{
+	void (*header)(const char *line);
+	void (*footer)(const char *difffilename, const char *logfilename);
+	void (*comment)(const char *comment);
+
+	void (*test_status_preamble)(const char *testname);
+
+	void (*test_status_ok)(const char *testname);
+	void (*test_status_failed)(const char *testname);
+	void (*test_status_ignored)(const char *testname);
+
+	void (*test_runtime)(const char *testname, double runtime);
+};
+
+
+void (*test_runtime)(const char *testname, double runtime);
+/* Text output format */
+static void header_text(const char *line);
+static void footer_text(const char *difffilename, const char *logfilename);
+static void comment_text(const char *comment);
+static void test_status_preamble_text(const char *testname);
+static void test_status_ok_text(const char *testname);
+static void test_status_failed_text(const char *testname);
+static void test_runtime_text(const char *testname, double runtime);
+
+struct output_func output_func_text =
+{
+	header_text,
+	footer_text,
+	comment_text,
+	test_status_preamble_text,
+	test_status_ok_text,
+	test_status_failed_text,
+	NULL,
+	test_runtime_text
+};
+
+/* TAP output format */
+static void header_tap(const char *line);
+static void footer_tap(const char *difffilename, const char *logfilename);
+static void comment_tap(const char *comment);
+static void test_status_ok_tap(const char *testname);
+static void test_status_failed_tap(const char *testname);
+static void test_status_ignored_tap(const char *testname);
+
+struct output_func output_func_tap =
+{
+	header_tap,
+	footer_tap,
+	comment_tap,
+	NULL,
+	test_status_ok_tap,
+	test_status_failed_tap,
+	test_status_ignored_tap,
+	NULL
+};
+
+struct output_func *output = &output_func_text;
+
+static void test_status_ok(const char *testname);
+
 static void status(const char *fmt,...) pg_attribute_printf(1, 2);
 static void psql_command(const char *database, const char *query,...) pg_attribute_printf(2, 3);
+static void status_end(void);
 
 /*
  * allow core files if possible.
@@ -206,18 +269,227 @@ split_to_stringlist(const char *s, const char *delim, _stringlist **listhead)
 /*
  * Print a progress banner on stdout.
  */
+static void
+header_text(const char *line)
+{
+	fprintf(stdout, "============== %-38s ==============\n", line);
+	fflush(stdout);
+}
+
+static void
+header_tap(const char *line)
+{
+	fprintf(stdout, "# %s\n", line);
+	fflush(stdout);
+}
+
 static void
 header(const char *fmt,...)
 {
 	char		tmp[64];
 	va_list		ap;
 
+	if (!output->header)
+		return;
+
 	va_start(ap, fmt);
 	vsnprintf(tmp, sizeof(tmp), fmt, ap);
 	va_end(ap);
 
-	fprintf(stdout, "============== %-38s ==============\n", tmp);
-	fflush(stdout);
+	output->header(tmp);
+}
+
+static void
+footer_tap(const char *difffilename, const char *logfilename)
+{
+	status("1..%i\n", (fail_count + fail_ignore_count + success_count));
+	status_end();
+}
+
+static void
+footer(const char *difffilename, const char *logfilename)
+{
+	if (output->footer)
+		output->footer(difffilename, logfilename);
+}
+
+static void
+comment_text(const char *comment)
+{
+	status("%s", comment);
+}
+
+static void
+comment_tap(const char *comment)
+{
+	status("# %s", comment);
+}
+
+static void
+comment(const char *fmt,...)
+{
+	char		tmp[256];
+	va_list		ap;
+
+	if (!output->comment)
+		return;
+
+	va_start(ap, fmt);
+	vsnprintf(tmp, sizeof(tmp), fmt, ap);
+	va_end(ap);
+
+	output->comment(tmp);
+}
+
+static void
+test_status_preamble_text(const char *testname)
+{
+	status(_("test %-28s ... "), testname);
+}
+
+static void
+test_status_preamble(const char *testname)
+{
+	if (output->test_status_preamble)
+		output->test_status_preamble(testname);
+}
+
+static void
+test_status_ok_tap(const char *testname)
+{
+	/* There is no NLS translation here as "ok" is a protocol message */
+	status("ok %i - %s",
+		   (fail_count + fail_ignore_count + success_count),
+		   testname);
+}
+
+static void
+test_status_ok_text(const char *testname)
+{
+	(void) testname; /* unused */
+	status(_("ok    "));	/* align with FAILED */
+}
+
+static void
+test_status_ok(const char *testname)
+{
+	success_count++;
+	if (output->test_status_ok)
+		output->test_status_ok(testname);
+}
+
+static void
+test_status_failed_tap(const char *testname)
+{
+	status("not ok %i - %s",
+		   (fail_count + fail_ignore_count + success_count),
+		   testname);
+}
+
+static void
+test_status_failed_text(const char *testname)
+{
+	status(_("FAILED"));
+}
+
+static void
+test_status_failed(const char *testname)
+{
+	fail_count++;
+	if (output->test_status_failed)
+		output->test_status_failed(testname);
+}
+
+static void
+test_status_ignored(const char *testname)
+{
+	fail_ignore_count++;
+	if (output->test_status_ignored)
+		output->test_status_ignored(testname);
+}
+
+static void
+test_status_ignored_tap(const char *testname)
+{
+	status("ok %i - %s # SKIP (ignored)",
+		   (fail_count + fail_ignore_count + success_count),
+		   testname);
+}
+
+static void
+test_runtime_text(const char *testname, double runtime)
+{
+	(void)testname;
+	status(_(" %8.0f ms"), runtime);
+}
+
+static void
+runtime(const char *testname, double runtime)
+{
+	if (output->test_runtime)
+		output->test_runtime(testname, runtime);
+}
+
+static void
+footer_text(const char *difffilename, const char *logfilename)
+{
+	char buf[256];
+
+	/*
+	 * Emit nice-looking summary message
+	 */
+	if (fail_count == 0 && fail_ignore_count == 0)
+		snprintf(buf, sizeof(buf),
+				 _(" All %d tests passed. "),
+				 success_count);
+	else if (fail_count == 0)	/* fail_count=0, fail_ignore_count>0 */
+		snprintf(buf, sizeof(buf),
+				 _(" %d of %d tests passed, %d failed test(s) ignored. "),
+				 success_count,
+				 success_count + fail_ignore_count,
+				 fail_ignore_count);
+	else if (fail_ignore_count == 0)	/* fail_count>0 && fail_ignore_count=0 */
+		snprintf(buf, sizeof(buf),
+				 _(" %d of %d tests failed. "),
+				 fail_count,
+				 success_count + fail_count);
+	else
+		/* fail_count>0 && fail_ignore_count>0 */
+		snprintf(buf, sizeof(buf),
+				 _(" %d of %d tests failed, %d of these failures ignored. "),
+				 fail_count + fail_ignore_count,
+				 success_count + fail_count + fail_ignore_count,
+				 fail_ignore_count);
+
+	putchar('\n');
+	for (int i = strlen(buf); i > 0; i--)
+		putchar('=');
+	printf("\n%s\n", buf);
+	for (int i = strlen(buf); i > 0; i--)
+		putchar('=');
+	putchar('\n');
+	putchar('\n');
+
+	if (difffilename && logfilename)
+	{
+		printf(_("The differences that caused some tests to fail can be viewed in the\n"
+				 "file \"%s\".  A copy of the test summary that you see\n"
+				 "above is saved in the file \"%s\".\n\n"),
+			   difffilename, logfilename);
+	}
+}
+
+static void
+status_start(bool single, const char *testname)
+{
+	/* TAP only outputs after the test has finished */
+	if (tap)
+		return;
+
+	if (single)
+		status(_("test %-24s ... "), testname);
+	else
+		status(_("     %-24s ... "), testname);
 }
 
 /*
@@ -917,13 +1189,13 @@ initialize_environment(void)
 #endif
 
 		if (pghost && pgport)
-			printf(_("(using postmaster on %s, port %s)\n"), pghost, pgport);
+			comment(_("(using postmaster on %s, port %s)\n"), pghost, pgport);
 		if (pghost && !pgport)
-			printf(_("(using postmaster on %s, default port)\n"), pghost);
+			comment(_("(using postmaster on %s, default port)\n"), pghost);
 		if (!pghost && pgport)
-			printf(_("(using postmaster on Unix socket, port %s)\n"), pgport);
+			comment(_("(using postmaster on Unix socket, port %s)\n"), pgport);
 		if (!pghost && !pgport)
-			printf(_("(using postmaster on Unix socket, default port)\n"));
+			comment(_("(using postmaster on Unix socket, default port)\n"));
 	}
 
 	convert_sourcefiles();
@@ -1167,9 +1439,10 @@ psql_command(const char *database, const char *query,...)
 
 	/* And now we can build and execute the shell command */
 	snprintf(psql_cmd, sizeof(psql_cmd),
-			 "\"%s%spsql\" -X -c \"%s\" \"%s\"",
+			 "\"%s%spsql\" %s -X -c \"%s\" \"%s\"",
 			 bindir ? bindir : "",
 			 bindir ? "/" : "",
+			 tap ? "-q" : "",
 			 query_escaped,
 			 database);
 
@@ -1704,6 +1977,9 @@ run_schedule(const char *schedule, test_start_function startfunc,
 				c++;
 			add_stringlist_item(&ignorelist, c);
 
+			test_status_ignored(c);
+			status_end();
+
 			/*
 			 * Note: ignore: lines do not run the test, they just say that
 			 * failure of this test when run later on is to be ignored. A bit
@@ -1762,7 +2038,7 @@ run_schedule(const char *schedule, test_start_function startfunc,
 
 		if (num_tests == 1)
 		{
-			status(_("test %-28s ... "), tests[0]);
+			test_status_preamble(tests[0]);
 			pids[0] = (startfunc) (tests[0], &resultfiles[0], &expectfiles[0], &tags[0]);
 			INSTR_TIME_SET_CURRENT(starttimes[0]);
 			wait_for_tests(pids, statuses, stoptimes, NULL, 1);
@@ -1778,8 +2054,8 @@ run_schedule(const char *schedule, test_start_function startfunc,
 		{
 			int			oldest = 0;
 
-			status(_("parallel group (%d tests, in groups of %d): "),
-				   num_tests, max_connections);
+			comment(_("parallel group (%d tests, in groups of %d): "),
+					  num_tests, max_connections);
 			for (i = 0; i < num_tests; i++)
 			{
 				if (i - oldest >= max_connections)
@@ -1799,7 +2075,7 @@ run_schedule(const char *schedule, test_start_function startfunc,
 		}
 		else
 		{
-			status(_("parallel group (%d tests): "), num_tests);
+			comment(_("parallel group (%d tests): "), num_tests);
 			for (i = 0; i < num_tests; i++)
 			{
 				pids[i] = (startfunc) (tests[i], &resultfiles[i], &expectfiles[i], &tags[i]);
@@ -1818,7 +2094,7 @@ run_schedule(const char *schedule, test_start_function startfunc,
 			bool		differ = false;
 
 			if (num_tests > 1)
-				status(_("     %-28s ... "), tests[i]);
+				test_status_preamble(tests[i]);
 
 			/*
 			 * Advance over all three lists simultaneously.
@@ -1858,27 +2134,18 @@ run_schedule(const char *schedule, test_start_function startfunc,
 					}
 				}
 				if (ignore)
-				{
-					status(_("failed (ignored)"));
-					fail_ignore_count++;
-				}
+					test_status_ignored(tests[i]);
 				else
-				{
-					status(_("FAILED"));
-					fail_count++;
-				}
+					test_status_failed(tests[i]);
 			}
 			else
-			{
-				status(_("ok    "));	/* align with FAILED */
-				success_count++;
-			}
+				test_status_ok(tests[i]);
 
 			if (statuses[i] != 0)
 				log_child_failure(statuses[i]);
 
 			INSTR_TIME_SUBTRACT(stoptimes[i], starttimes[i]);
-			status(_(" %8.0f ms"), INSTR_TIME_GET_MILLISEC(stoptimes[i]));
+			runtime(tests[i], INSTR_TIME_GET_MILLISEC(stoptimes[i]));
 
 			status_end();
 		}
@@ -1917,7 +2184,7 @@ run_single_test(const char *test, test_start_function startfunc,
 			   *tl;
 	bool		differ = false;
 
-	status(_("test %-28s ... "), test);
+	test_status_preamble(test);
 	pid = (startfunc) (test, &resultfiles, &expectfiles, &tags);
 	INSTR_TIME_SET_CURRENT(starttime);
 	wait_for_tests(&pid, &exit_status, &stoptime, NULL, 1);
@@ -1947,15 +2214,9 @@ run_single_test(const char *test, test_start_function startfunc,
 	}
 
 	if (differ)
-	{
-		status(_("FAILED"));
-		fail_count++;
-	}
+		test_status_failed(test);
 	else
-	{
-		status(_("ok    "));	/* align with FAILED */
-		success_count++;
-	}
+		test_status_ok(test);
 
 	if (exit_status != 0)
 		log_child_failure(exit_status);
@@ -2152,6 +2413,7 @@ regression_main(int argc, char *argv[],
 		{"config-auth", required_argument, NULL, 24},
 		{"max-concurrent-tests", required_argument, NULL, 25},
 		{"make-testtablespace-dir", no_argument, NULL, 26},
+		{"tap", no_argument, NULL, 27},
 		{NULL, 0, NULL, 0}
 	};
 
@@ -2285,6 +2547,9 @@ regression_main(int argc, char *argv[],
 			case 26:
 				make_testtablespace_dir = true;
 				break;
+			case 27:
+				tap = true;
+				break;
 			default:
 				/* getopt_long already emitted a complaint */
 				fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
@@ -2311,6 +2576,9 @@ regression_main(int argc, char *argv[],
 		exit(0);
 	}
 
+	if (tap)
+		output = &output_func_tap;
+
 	if (temp_instance && !port_specified_by_user)
 
 		/*
@@ -2636,54 +2904,20 @@ regression_main(int argc, char *argv[],
 
 	fclose(logfile);
 
-	/*
-	 * Emit nice-looking summary message
-	 */
-	if (fail_count == 0 && fail_ignore_count == 0)
-		snprintf(buf, sizeof(buf),
-				 _(" All %d tests passed. "),
-				 success_count);
-	else if (fail_count == 0)	/* fail_count=0, fail_ignore_count>0 */
-		snprintf(buf, sizeof(buf),
-				 _(" %d of %d tests passed, %d failed test(s) ignored. "),
-				 success_count,
-				 success_count + fail_ignore_count,
-				 fail_ignore_count);
-	else if (fail_ignore_count == 0)	/* fail_count>0 && fail_ignore_count=0 */
-		snprintf(buf, sizeof(buf),
-				 _(" %d of %d tests failed. "),
-				 fail_count,
-				 success_count + fail_count);
-	else
-		/* fail_count>0 && fail_ignore_count>0 */
-		snprintf(buf, sizeof(buf),
-				 _(" %d of %d tests failed, %d of these failures ignored. "),
-				 fail_count + fail_ignore_count,
-				 success_count + fail_count + fail_ignore_count,
-				 fail_ignore_count);
-
-	putchar('\n');
-	for (i = strlen(buf); i > 0; i--)
-		putchar('=');
-	printf("\n%s\n", buf);
-	for (i = strlen(buf); i > 0; i--)
-		putchar('=');
-	putchar('\n');
-	putchar('\n');
-
-	if (file_size(difffilename) > 0)
-	{
-		printf(_("The differences that caused some tests to fail can be viewed in the\n"
-				 "file \"%s\".  A copy of the test summary that you see\n"
-				 "above is saved in the file \"%s\".\n\n"),
-			   difffilename, logfilename);
-	}
-	else
+	if (file_size(difffilename) <= 0)
 	{
 		unlink(difffilename);
 		unlink(logfilename);
+
+		free(difffilename);
+		difffilename = NULL;
+		free(logfilename);
+		logfilename = NULL;
 	}
 
+	footer(difffilename, logfilename);
+	status_end();
+
 	if (fail_count != 0)
 		exit(1);
 
#29Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#27)
Re: [RFC] building postgres with meson

On 10/12/21 9:03 PM, Andres Freund wrote:

Hi,

On 2021-10-12 13:42:56 -0700, Andres Freund wrote:

On 2021-10-12 16:02:14 -0400, Andrew Dunstan wrote:

You do that by putting a path to it at the start of the PATH. The wrinkle in
this is that you need prove to point to one that understands virtual
paths. So you do something like this:

PATH="/c/perl/bin:$PATH" PROVE=/bin/core_perl/prove configure ...

Oh my.

I'll try that later... I wonder if we could make this easier from our side?
This is a lot of magic to know.

I managed to get this working. At first it failed because I don't have
pexports - it's not available inside msys as far as I could tell. And seems to
be unmaintained. But replacing pexports with gendef fixed that.

There's this comment in src/pl/plperl/GNUmakefile

# Perl on win32 ships with import libraries only for Microsoft Visual C++,
# which are not compatible with mingw gcc. Therefore we need to build a
# new import library to link with.

but I seem to be able to link fine without going through that song-and-dance?

It looks like you're not building a native postgres, but rather one
targeted at msys. To build one that's native (i.e. runs without any
presence of msys) you need to do these things before building:

MSYSTEM=MINGW64
MSYSTEM_CHOST=x86_64-w64-mingw32
PATH="/mingw64/bin:$PATH"

pexports will be in the resulting path, and the build will use the
native compiler.

You can use fairywren's config as a guide.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#30John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#24)
Re: [RFC] building postgres with meson

On Tue, Oct 12, 2021 at 4:59 PM Andres Freund <andres@anarazel.de> wrote:

On 2021-10-12 15:55:22 -0400, John Naylor wrote:

(I couldn't get a build working but I'll leave that aside for now).

If you want to do that separately, I'll try to fix it.

Okay, I pulled the latest commits and tried again:

[51/950] Compiling C object
src/interfaces/libpq/libpq.5.dylib.p/fe-connect.c.o
FAILED: src/interfaces/libpq/libpq.5.dylib.p/fe-connect.c.o
ccache cc -Isrc/interfaces/libpq/libpq.5.dylib.p -Isrc/interfaces/libpq
-I../src/interfaces/libpq -Isrc/port -I../src/port -Isrc/include
-I../src/include
-I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/LDAP.framework/Headers
-I/usr/local/opt/readline/include -I/usr/local/opt/gettext/include
-I/usr/local/opt/zlib/include -I/usr/local/opt/openssl/include
-fcolor-diagnostics -Wall -Winvalid-pch -Wextra -O0 -g -isysroot
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -fno-strict-aliasing
-fwrapv -Wmissing-prototypes -Wpointer-arith -Werror=vla -Wendif-labels
-Wmissing-format-attribute -Wformat-security -Wdeclaration-after-statement
-Wno-unused-command-line-argument -Wno-missing-field-initializers
-Wno-sign-compare -Wno-unused-parameter -msse4.2
-F/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/LDAP.framework
-DFRONTEND -MD -MQ src/interfaces/libpq/libpq.5.dylib.p/fe-connect.c.o -MF
src/interfaces/libpq/libpq.5.dylib.p/fe-connect.c.o.d -o
src/interfaces/libpq/libpq.5.dylib.p/fe-connect.c.o -c
../src/interfaces/libpq/fe-connect.c
In file included from ../src/interfaces/libpq/fe-connect.c:72:
In file included from
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/LDAP.framework/Headers/ldap.h:1:

[the last line is repeated a bunch of times, then...]

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/LDAP.framework/Headers/ldap.h:1:10:
error: #include nested too deeply
#include <ldap.h>
^

Then the expected "undeclared identifier" errors that would arise from a
missing header. I tried compiling --with-ldap with the Make build, and only
got warnings about deprecated declarations -- that build completed.

I tried disabling ldap with the Meson build but I'll spare the details of
what went wrong there in case I did something wrong, so we can take things
one step at a time.

That would also have to work for all the dependencies, which were

displayed

to me as:

ninja, gdbm, ca-certificates, openssl@1.1, readline, sqlite and

python@3.9

meson does depend on ninja (to execute the build) and of course python.

But

the rest should be optional dependencies. ninja builds without any
dependencies as long as you don't change its parser sources. python

builds on

aix, hpux etc.

Not sure what way gdbm openssl@1.1 and sqlite are pulled in? I assume

readline

is for python...

Hmm, weird.

--
John Naylor
EDB: http://www.enterprisedb.com

#31Andres Freund
andres@anarazel.de
In reply to: John Naylor (#30)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-13 11:51:03 -0400, John Naylor wrote:

On Tue, Oct 12, 2021 at 4:59 PM Andres Freund <andres@anarazel.de> wrote:

On 2021-10-12 15:55:22 -0400, John Naylor wrote:

(I couldn't get a build working but I'll leave that aside for now).

If you want to do that separately, I'll try to fix it.

Okay, I pulled the latest commits and tried again:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/LDAP.framework/Headers/ldap.h:1:

[the last line is repeated a bunch of times, then...]

Oh. I actually saw that on CI at some point... That one is definitely
odd. Currently CI for OSX builds like

- brew install make coreutils ccache icu4c lz4 tcl-tk openldap
- brew install meson ninja python@3.9
..
PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH"
PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
PKG_CONFIG_PATH="/usr/local/opt/openldap/lib/pkgconfig:$PKG_CONFIG_PATH"

export PKG_CONFIG_PATH

meson setup --buildtype debug -Dcassert=true -Dssl=openssl build

but I set that up knowing little about macos.

For the autoconf build CI currently does something similar via
LIBS="/usr/local/lib:$LIBS"
INCLUDES="/usr/local/include:$INCLUDES"
...
LIBS="/usr/local/opt/openldap/lib:$LIBS"
INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
...
--with-includes="$INCLUDES" \
--with-libs="$LIBS" \

are you doing something like that? Or does it work for you without? I vaguely
recall hitting a similar problem as you report when not passing
/usr/local/... to configure.

i tried disabling ldap with the meson build but i'll spare the details of
what went wrong there in case i did something wrong, so we can take things
one step at a time.

you can change it for an existing builddir with
meson configure -dldap=disabled or when setting up a new builddir by passing
-dldap=disabled at that time.

ninja, gdbm, ca-certificates, openssl@1.1, readline, sqlite and

python@3.9

meson does depend on ninja (to execute the build) and of course python.

but

the rest should be optional dependencies. ninja builds without any
dependencies as long as you don't change its parser sources. python

builds on

aix, hpux etc.

not sure what way gdbm openssl@1.1 and sqlite are pulled in? i assume

readline

is for python...

Hmm, weird.

They're homebrew python deps: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/python@3.9.rb#L28
which are optional things enabled explicitly:
https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/python@3.9.rb#L123

Greetings,

Andres Freund

#32John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#31)
Re: [RFC] building postgres with meson

On Wed, Oct 13, 2021 at 12:37 PM Andres Freund <andres@anarazel.de> wrote:

For the autoconf build CI currently does something similar via
LIBS="/usr/local/lib:$LIBS"
INCLUDES="/usr/local/include:$INCLUDES"
...
LIBS="/usr/local/opt/openldap/lib:$LIBS"
INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
...
--with-includes="$INCLUDES" \
--with-libs="$LIBS" \

are you doing something like that? Or does it work for you without? I

vaguely

recall hitting a similar problem as you report when not passing
/usr/local/... to configure.

I didn't do anything like that for the autoconf build. I have in the past
done things retail, like

--with-icu ICU_CFLAGS='-I/usr/local/opt/icu4c/include/'
ICU_LIBS='-L/usr/local/opt/icu4c/lib/ -licui18n -licuuc -licudata'

i tried disabling ldap with the meson build but i'll spare the details

of

what went wrong there in case i did something wrong, so we can take

things

one step at a time.

you can change it for an existing builddir with
meson configure -dldap=disabled or when setting up a new builddir by

passing

-dldap=disabled at that time.

Somehow our emails got lower-cased down here, but I tried it with capital D:

meson configure -Dldap=disabled

inside the build dir and got this:

../meson.build:278:2: ERROR: Tried to assign the invalid value "None" of
type NoneType to variable.

Line 278 is

ldap_r = ldap = dependency('', required : false)

--
John Naylor
EDB: http://www.enterprisedb.com

#33Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#29)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-13 08:55:38 -0400, Andrew Dunstan wrote:

On 10/12/21 9:03 PM, Andres Freund wrote:

I managed to get this working. At first it failed because I don't have
pexports - it's not available inside msys as far as I could tell. And seems to
be unmaintained. But replacing pexports with gendef fixed that.

There's this comment in src/pl/plperl/GNUmakefile

# Perl on win32 ships with import libraries only for Microsoft Visual C++,
# which are not compatible with mingw gcc. Therefore we need to build a
# new import library to link with.

but I seem to be able to link fine without going through that song-and-dance?

It looks like you're not building a native postgres, but rather one
targeted at msys. To build one that's native (i.e. runs without any
presence of msys) you need to do these things before building:

MSYSTEM=MINGW64
MSYSTEM_CHOST=x86_64-w64-mingw32
PATH="/mingw64/bin:$PATH"

I had a config equivalent to this (slight difference in PATH, but the same gcc
being picked), and I just verified that it still works if I set up PATH like
that. I get a working plperl out of it. Without msys on PATH or such.

where perl526.dll
C:\perl\strawberry-5.26.3.1-64bit\perl\bin\perl526.dll

dumpbin /imports 'C:/Users/anfreund/src/pg-meson/build-mingw/tmp_install/lib/plperl.dll'|grep dll

Dump of file C:\Users\anfreund\src\pg-meson\build-mingw\tmp_install\lib\plperl.dll
KERNEL32.dll
msvcrt.dll
perl526.dll

dumpbin /imports .\build-mingw\tmp_install\bin\postgres.exe|grep dll
ADVAPI32.dll
KERNEL32.dll
msvcrt.dll
Secur32.dll
WLDAP32.dll
WS2_32.dll

do $$elog(NOTICE, "blob");$$ language plperl;
NOTICE: blob
DO

To me this looks like it's a plperl built without the import file recreation,
without being msys dependent?

pexports will be in the resulting path, and the build will use the
native compiler.

I don't see pexports anywhere in the msys installation. I can see it available
on sourceforge, and I see a few others asking where to get it from in the
context of msys, and being pointed to manually downloading it.

Seems like we should consider using gendef instead of pexports, given it's
available in msys?

$ pacman -Fy
$ pacman -F gendef.exe
...
mingw64/mingw-w64-x86_64-tools-git 9.0.0.6316.acdc7adc9-1 (mingw-w64-x86_64-toolchain) [installed]
mingw64/bin/gendef.exe
..
$ pacman -F pexports.exe
$ pacman -Fx pexports
<bunch of packages containing smtpexports.h>

Greetings,

Andres Freund

#34Andres Freund
andres@anarazel.de
In reply to: John Naylor (#32)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-13 13:19:36 -0400, John Naylor wrote:

On Wed, Oct 13, 2021 at 12:37 PM Andres Freund <andres@anarazel.de> wrote:

For the autoconf build CI currently does something similar via
LIBS="/usr/local/lib:$LIBS"
INCLUDES="/usr/local/include:$INCLUDES"
...
LIBS="/usr/local/opt/openldap/lib:$LIBS"
INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
...
--with-includes="$INCLUDES" \
--with-libs="$LIBS" \

are you doing something like that? Or does it work for you without? I

vaguely

recall hitting a similar problem as you report when not passing
/usr/local/... to configure.

I didn't do anything like that for the autoconf build. I have in the past
done things retail, like

I'll try to see how this works / what causes the breakage.

Somehow our emails got lower-cased down here, but I tried it with capital D:

:)

meson configure -Dldap=disabled

inside the build dir and got this:

../meson.build:278:2: ERROR: Tried to assign the invalid value "None" of
type NoneType to variable.

Line 278 is

ldap_r = ldap = dependency('', required : false)

Oops, I broke that when trying to clean things up. I guess I write too much C
;). It needs to be two lines.

I pushed the fix for that.

Greetings,

Andres Freund

#35John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#34)
Re: [RFC] building postgres with meson

On Wed, Oct 13, 2021 at 1:42 PM Andres Freund <andres@anarazel.de> wrote:

I pushed the fix for that.

Ok great, it builds now! :-) Now something's off with dynamic loading.
There are libraries in ./tmp_install/usr/local/lib/ but apparently initdb
doesn't know to look for them there:

$ cat /Users/john/pgdev/meson/build/testrun/main/pg_regress/log/initdb.log
dyld: Library not loaded: /usr/local/lib/libpq.5.dylib
Referenced from:
/Users/john/pgdev/meson/build/tmp_install/usr/local/bin/initdb
Reason: image not found

--
John Naylor
EDB: http://www.enterprisedb.com

#36Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#33)
Re: [RFC] building postgres with meson

On 10/13/21 1:26 PM, Andres Freund wrote:

pexports will be in the resulting path, and the build will use the
native compiler.

I don't see pexports anywhere in the msys installation. I can see it available
on sourceforge, and I see a few others asking where to get it from in the
context of msys, and being pointed to manually downloading it.

Weird. fairywren has it, which means that it must have been removed from
the packages at some stage, fairly recently as fairywren isn't that old.
I just confirmed the absence on a 100% fresh install.

It is in Strawberry's c/bin directory.

Seems like we should consider using gendef instead of pexports, given it's
available in msys?

Yeah. It's missing on my ancient msys animal (frogmouth), but it doesn't
build --with-perl.

jacana seems to have it.

If you prep a patch I'll test it.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#37Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#36)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-13 16:06:32 -0400, Andrew Dunstan wrote:

If you prep a patch I'll test it.

Well, right now I'm wondering if the better fix is to just remove the whole
win32 block. I don't know how far back, but afaict it's not needed. Seems to
have been needed for narwhal at some point, according to 02b61dd08f99. But
narwhal is long dead.

Greetings,

Andres Freund

#38Josef Šimánek
josef.simanek@gmail.com
In reply to: Andres Freund (#26)
Re: [RFC] building postgres with meson

st 13. 10. 2021 v 1:54 odesílatel Andres Freund <andres@anarazel.de> napsal:

Hi,

On 2021-10-13 01:19:27 +0200, Josef Šimánek wrote:

I tried to clean and start from scratch, but I'm getting different
error probably related to wrongly configured JIT (LLVM wasn't found
during meson setup). I'll debug on my side to provide more info.

../src/backend/jit/jit.c:91:73: error: ‘DLSUFFIX’ undeclared (first use in this function)
91 | snprintf(path, MAXPGPATH, "%s/%s%s", pkglib_path, jit_provider, DLSUFFIX);
| ^~~~~~~~

This *very* likely is related to building in a source tree that also contains
a "non-meson" build "in place". The problem is that the meson build picks up
the pg_config.h generated by ./configure in the "normal" build, rather than
the one meson generated itself.

You'd need to execute make distclean or such, or use a separate git checkout.

I forgot about this issue because I only ever build postgres from outside the
source-tree (by invoking configure from a separate directory), so there's
never build products in it. I think at least I need to make the build emit a
warning / error if there's a pg_config.h in the source tree...

Hello, thanks for the hint. I can finally build using meson and run
regress tests.

The only problem I do have currently is auto-detection of perl. I'm
getting error related to missing "Opcode.pm". PERL is autodetected and
enabled (https://pastebin.com/xfRRrDcU).

I do get the same error when I enforce perl for current master build
(./configure --with-perl). Using ./configure with perl autodetection
skips plperl extension on my system.

Disabling perl manually for meson build (meson setup build
--reconfigure --buildtype debug -Dperl=disabled) works for me.

Show quoted text

This is the part of the jit code that's built regardless of llvm availability
- you'd get the same error in a few other places unrelated to jit.

Greetings,

Andres Freund

#39Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#37)
Re: [RFC] building postgres with meson

On 10/13/21 5:46 PM, Andres Freund wrote:

Hi,

On 2021-10-13 16:06:32 -0400, Andrew Dunstan wrote:

If you prep a patch I'll test it.

Well, right now I'm wondering if the better fix is to just remove the whole
win32 block. I don't know how far back, but afaict it's not needed. Seems to
have been needed for narwhal at some point, according to 02b61dd08f99. But
narwhal is long dead.

Ok, I'll test it out.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#40Thomas Munro
thomas.munro@gmail.com
In reply to: John Naylor (#30)
Re: [RFC] building postgres with meson

On Thu, Oct 14, 2021 at 4:51 AM John Naylor
<john.naylor@enterprisedb.com> wrote:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/LDAP.framework/Headers/ldap.h:1:10: error: #include nested too deeply
#include <ldap.h>
^

I vaguely recall that PostgreSQL should build OK against Apple's copy
of OpenLDAP. That recursive include loop is coming from a "framework"
header that contains just a couple of lines like #include <ldap.h> to
try to include the real header, which should also be in the include
path, somewhere like
/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/ldap.h.
I think we'd need to figure out where that
-I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/LDAP.framework/Headers
directive is coming from and get rid of it, so we can include the real
header directly.

In reply to: Josef Šimánek (#38)
Re: [RFC] building postgres with meson

Josef Šimánek <josef.simanek@gmail.com> writes:

The only problem I do have currently is auto-detection of perl. I'm
getting error related to missing "Opcode.pm". PERL is autodetected and
enabled (https://pastebin.com/xfRRrDcU).

Your Perl (not PERL) installation seems to be incomplete. Opcode.pm is a
core module, and should be in /usr/lib64/perl5, judging by the paths in
the error message.

Which OS is this? Some Linux distributions have separate packages for
the interpreter itself and the included modules, and the packages can be
named confusingly. E.g. on older Redhat/Fedora versions you have to
install the 'perl-core' package to get all the modules, 'perl' is just
the interpreter and the bare minimum set of strictily necessary modules.

They've fixed this in recent versions (Fedora 34 and Redhat 8, IIRC), so
that 'perl' gives you the hole bundle, and 'perl-interpeter' is the
minimal one.

- ilmari

#42Josef Šimánek
josef.simanek@gmail.com
In reply to: Dagfinn Ilmari Mannsåker (#41)
Re: [RFC] building postgres with meson

čt 14. 10. 2021 v 15:14 odesílatel Dagfinn Ilmari Mannsåker
<ilmari@ilmari.org> napsal:

Josef Šimánek <josef.simanek@gmail.com> writes:

The only problem I do have currently is auto-detection of perl. I'm
getting error related to missing "Opcode.pm". PERL is autodetected and
enabled (https://pastebin.com/xfRRrDcU).

Your Perl (not PERL) installation seems to be incomplete. Opcode.pm is a
core module, and should be in /usr/lib64/perl5, judging by the paths in
the error message.

Which OS is this? Some Linux distributions have separate packages for
the interpreter itself and the included modules, and the packages can be
named confusingly. E.g. on older Redhat/Fedora versions you have to
install the 'perl-core' package to get all the modules, 'perl' is just
the interpreter and the bare minimum set of strictily necessary modules.

They've fixed this in recent versions (Fedora 34 and Redhat 8, IIRC), so
that 'perl' gives you the hole bundle, and 'perl-interpeter' is the
minimal one.

I'm using Fedora 34 and I still see perl-Opcode.x86_64 as a separate
package. Anyway it behaves differently with autoconf tools and the
meson build system. Is perl disabled by default in the current build
system?

Show quoted text

- ilmari

#43Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Josef Šimánek (#42)
Re: [RFC] building postgres with meson

On 2021-Oct-14, Josef Šimánek wrote:

I'm using Fedora 34 and I still see perl-Opcode.x86_64 as a separate
package. Anyway it behaves differently with autoconf tools and the
meson build system. Is perl disabled by default in the current build
system?

Yes, you have to use --with-perl in order to get it.

--
Álvaro Herrera Valdivia, Chile — https://www.EnterpriseDB.com/
"Puedes vivir sólo una vez, pero si lo haces bien, una vez es suficiente"

In reply to: Josef Šimánek (#42)
Re: [RFC] building postgres with meson

Josef Šimánek <josef.simanek@gmail.com> writes:

čt 14. 10. 2021 v 15:14 odesílatel Dagfinn Ilmari Mannsåker
<ilmari@ilmari.org> napsal:

Josef Šimánek <josef.simanek@gmail.com> writes:

The only problem I do have currently is auto-detection of perl. I'm
getting error related to missing "Opcode.pm". PERL is autodetected and
enabled (https://pastebin.com/xfRRrDcU).

Your Perl (not PERL) installation seems to be incomplete. Opcode.pm is a
core module, and should be in /usr/lib64/perl5, judging by the paths in
the error message.

Which OS is this? Some Linux distributions have separate packages for
the interpreter itself and the included modules, and the packages can be
named confusingly. E.g. on older Redhat/Fedora versions you have to
install the 'perl-core' package to get all the modules, 'perl' is just
the interpreter and the bare minimum set of strictily necessary modules.

They've fixed this in recent versions (Fedora 34 and Redhat 8, IIRC), so
that 'perl' gives you the hole bundle, and 'perl-interpeter' is the
minimal one.

I'm using Fedora 34 and I still see perl-Opcode.x86_64 as a separate
package.`

Yes, it's a separate package, but the 'perl' package depends on all the
core module packages, so installing that should fix things. You appear
to only have 'perl-interpreter' installed.

Anyway it behaves differently with autoconf tools and the meson build
system. Is perl disabled by default in the current build system?

configure doesn't auto-detect any optional features, they have to be
explicitly enabled using --with-foo switches.

- ilmari

#45Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#43)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-14 10:29:42 -0300, Alvaro Herrera wrote:

On 2021-Oct-14, Josef Šimánek wrote:

I'm using Fedora 34 and I still see perl-Opcode.x86_64 as a separate
package. Anyway it behaves differently with autoconf tools and the
meson build system. Is perl disabled by default in the current build
system?

Hm, so it seems we should make the test separately verify that perl -M{Opcode,
ExtUtils::Embed, ExtUtils::ParseXS} doesn't fail, so that we can fail perl
detection with a useful message?

Yes, you have to use --with-perl in order to get it.

With the meson prototype I set most optional features to "auto", except for
LLVM, as that increases compile times noticeably.

For configure we didn't/don't want to do much auto-detection, because that
makes life harder for distributors. But meson has one switch controlling all
features set to 'auto' and not explicitly enabled/disabled:
--auto-features {enabled,disabled,auto} Override value of all 'auto' features (default: auto).
so the argument doesn't apply to the same degree there. We could default
auto-features to something else too.

There were two other reasons:

1) I got tired of needing to disable zlib, readline to be able to build on
windows.
2) Exercising all the dependency detection / checking seems important at this
stage

Greetings,

Andres Freund

#46Andres Freund
andres@anarazel.de
In reply to: Josef Šimánek (#38)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-13 23:58:12 +0200, Josef Šimánek wrote:

st 13. 10. 2021 v 1:54 odesílatel Andres Freund <andres@anarazel.de> napsal:

This *very* likely is related to building in a source tree that also contains
a "non-meson" build "in place". The problem is that the meson build picks up
the pg_config.h generated by ./configure in the "normal" build, rather than
the one meson generated itself.

You'd need to execute make distclean or such, or use a separate git checkout.

I forgot about this issue because I only ever build postgres from outside the
source-tree (by invoking configure from a separate directory), so there's
never build products in it. I think at least I need to make the build emit a
warning / error if there's a pg_config.h in the source tree...

Hello, thanks for the hint. I can finally build using meson and run
regress tests.

I yesterday pushed code that should detect this case (with an error). Should
now detect the situation both when you first run configure in tree, and then
meson, and the other way round (by the dirty hack of ./configure touch'ing
meson.build at the end for in-tree builds).

The only problem I do have currently is auto-detection of perl. I'm
getting error related to missing "Opcode.pm". PERL is autodetected and
enabled (https://pastebin.com/xfRRrDcU).

I do get the same error when I enforce perl for current master build
(./configure --with-perl). Using ./configure with perl autodetection
skips plperl extension on my system.

Disabling perl manually for meson build (meson setup build
--reconfigure --buildtype debug -Dperl=disabled) works for me.

Yay, thanks for testing!

Greetings,

Andres Freund

#47John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#35)
Re: [RFC] building postgres with meson

I wrote:

Ok great, it builds now! :-) Now something's off with dynamic loading.

There are libraries in ./tmp_install/usr/local/lib/ but apparently initdb
doesn't know to look for them there:

$ cat /Users/john/pgdev/meson/build/testrun/main/pg_regress/log/initdb.log
dyld: Library not loaded: /usr/local/lib/libpq.5.dylib
Referenced from:

/Users/john/pgdev/meson/build/tmp_install/usr/local/bin/initdb

Reason: image not found

After poking a bit more, this only happens when trying to run the tests. If
I specify a prefix, I can install, init, and start the server just fine, so
that much works.

--
John Naylor
EDB: http://www.enterprisedb.com

#48Josef Šimánek
josef.simanek@gmail.com
In reply to: Dagfinn Ilmari Mannsåker (#44)
Re: [RFC] building postgres with meson

čt 14. 10. 2021 v 15:32 odesílatel Dagfinn Ilmari Mannsåker
<ilmari@ilmari.org> napsal:

Josef Šimánek <josef.simanek@gmail.com> writes:

čt 14. 10. 2021 v 15:14 odesílatel Dagfinn Ilmari Mannsåker
<ilmari@ilmari.org> napsal:

Josef Šimánek <josef.simanek@gmail.com> writes:

The only problem I do have currently is auto-detection of perl. I'm
getting error related to missing "Opcode.pm". PERL is autodetected and
enabled (https://pastebin.com/xfRRrDcU).

Your Perl (not PERL) installation seems to be incomplete. Opcode.pm is a
core module, and should be in /usr/lib64/perl5, judging by the paths in
the error message.

Which OS is this? Some Linux distributions have separate packages for
the interpreter itself and the included modules, and the packages can be
named confusingly. E.g. on older Redhat/Fedora versions you have to
install the 'perl-core' package to get all the modules, 'perl' is just
the interpreter and the bare minimum set of strictily necessary modules.

They've fixed this in recent versions (Fedora 34 and Redhat 8, IIRC), so
that 'perl' gives you the hole bundle, and 'perl-interpeter' is the
minimal one.

I'm using Fedora 34 and I still see perl-Opcode.x86_64 as a separate
package.`

Yes, it's a separate package, but the 'perl' package depends on all the
core module packages, so installing that should fix things. You appear
to only have 'perl-interpreter' installed.

You're right. Installing "perl" or "perl-Opcode" manually fixes this
problem. Currently I only have "perl-interpreter" installed.

Show quoted text

Anyway it behaves differently with autoconf tools and the meson build
system. Is perl disabled by default in the current build system?

configure doesn't auto-detect any optional features, they have to be
explicitly enabled using --with-foo switches.

- ilmari

#49Josef Šimánek
josef.simanek@gmail.com
In reply to: Andres Freund (#45)
Re: [RFC] building postgres with meson

čt 14. 10. 2021 v 19:24 odesílatel Andres Freund <andres@anarazel.de> napsal:

Hi,

On 2021-10-14 10:29:42 -0300, Alvaro Herrera wrote:

On 2021-Oct-14, Josef Šimánek wrote:

I'm using Fedora 34 and I still see perl-Opcode.x86_64 as a separate
package. Anyway it behaves differently with autoconf tools and the
meson build system. Is perl disabled by default in the current build
system?

Hm, so it seems we should make the test separately verify that perl -M{Opcode,
ExtUtils::Embed, ExtUtils::ParseXS} doesn't fail, so that we can fail perl
detection with a useful message?

I can confirm "perl -MOpcode" fails. ExtUtils::Embed and
ExtUtils::ParseXS are present. Looking at the local system history of
perl-interpreter package, it seems to be installed by default on
Fedora 34. Friendly error message would be welcomed.

Yes, you have to use --with-perl in order to get it.

With the meson prototype I set most optional features to "auto", except for
LLVM, as that increases compile times noticeably.

For configure we didn't/don't want to do much auto-detection, because that
makes life harder for distributors. But meson has one switch controlling all
features set to 'auto' and not explicitly enabled/disabled:
--auto-features {enabled,disabled,auto} Override value of all 'auto' features (default: auto).
so the argument doesn't apply to the same degree there. We could default
auto-features to something else too.

There were two other reasons:

1) I got tired of needing to disable zlib, readline to be able to build on
windows.
2) Exercising all the dependency detection / checking seems important at this
stage

Clear, thanks for the info.

Show quoted text

Greetings,

Andres Freund

#50Andres Freund
andres@anarazel.de
In reply to: John Naylor (#47)
Re: [RFC] building postgres with meson

Hi,

On October 14, 2021 12:14:16 PM PDT, John Naylor <john.naylor@enterprisedb.com> wrote:

I wrote:

Ok great, it builds now! :-) Now something's off with dynamic loading.

There are libraries in ./tmp_install/usr/local/lib/ but apparently initdb
doesn't know to look for them there:

$ cat /Users/john/pgdev/meson/build/testrun/main/pg_regress/log/initdb.log
dyld: Library not loaded: /usr/local/lib/libpq.5.dylib
Referenced from:

/Users/john/pgdev/meson/build/tmp_install/usr/local/bin/initdb

Reason: image not found

After poking a bit more, this only happens when trying to run the tests. If
I specify a prefix, I can install, init, and start the server just fine, so
that much works.

Is this a Mac with SIP enabled? The Mac CI presumably has that disabled, which is why I didn't see this issue there. Probably need to implement whatever Tom figured out to do about that for the current way of running tests.

Andres
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

#51John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#50)
Re: [RFC] building postgres with meson

On Thu, Oct 14, 2021 at 4:34 PM Andres Freund <andres@anarazel.de> wrote:

Is this a Mac with SIP enabled? The Mac CI presumably has that disabled,

which is why I didn't see this issue there. Probably need to implement
whatever Tom figured out to do about that for the current way of running
tests.

System Information says it's disabled. Running "csrutil status" complains
of an unsupported configuration, which doesn't sound good, so I should
probably go fix that independent of anything else. :-/

--
John Naylor
EDB: http://www.enterprisedb.com

#52John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#51)
Re: [RFC] building postgres with meson

I wrote:

Is this a Mac with SIP enabled? The Mac CI presumably has that

disabled, which is why I didn't see this issue there. Probably need to
implement whatever Tom figured out to do about that for the current way of
running tests.

System Information says it's disabled. Running "csrutil status" complains

of an unsupported configuration, which doesn't sound good, so I should
probably go fix that independent of anything else. :-/

Looking online, I wonder if the "unsupported" message might be overly
cautious. In any case, I do remember turning something off to allow a
debugger to run. Here are all the settings, in case it matters:

Apple Internal: disabled
Kext Signing: enabled
Filesystem Protections: enabled
Debugging Restrictions: disabled
DTrace Restrictions: enabled
NVRAM Protections: enabled
BaseSystem Verification: enabled

--
John Naylor
EDB: http://www.enterprisedb.com

#53Sergey Shinderuk
s.shinderuk@postgrespro.ru
In reply to: John Naylor (#51)
Re: [RFC] building postgres with meson

Hi,

On 14.10.2021 23:54, John Naylor wrote:

On Thu, Oct 14, 2021 at 4:34 PM Andres Freund <andres@anarazel.de
<mailto:andres@anarazel.de>> wrote:

Is this a Mac with SIP enabled? The Mac CI presumably has that

disabled, which is why I didn't see this issue there. Probably need to
implement whatever Tom figured out to do about that for the current way
of running tests.

System Information says it's disabled. Running "csrutil status"
complains of an unsupported configuration, which doesn't sound good, so
I should probably go fix that independent of anything else. :-/

Maybe you could check that DYLD_LIBRARY_PATH is working for you?

% DYLD_FALLBACK_LIBRARY_PATH=
DYLD_LIBRARY_PATH=./tmp_install/usr/local/lib
./tmp_install/usr/local/bin/psql --version
psql (PostgreSQL) 15devel

Without DYLD_LIBRARY_PATH I get the error, as expected:

% DYLD_FALLBACK_LIBRARY_PATH= ./tmp_install/usr/local/bin/psql --version
dyld: Library not loaded: /usr/local/lib/libpq.5.dylib
Referenced from:
/Users/shinderuk/src/postgres-meson/build/./tmp_install/usr/local/bin/psql
Reason: image not found

I add "DYLD_FALLBACK_LIBRARY_PATH=" because otherwise dyld falls back to
/usr/lib/libpq.5.dylib provided by Apple (I am testing on Catalina).

% DYLD_PRINT_LIBRARIES=1 ./tmp_install/usr/local/bin/psql --version 2>&1
| grep libpq
dyld: loaded: <4EDF735E-2104-32AD-BE7B-B400ABFCF57C> /usr/lib/libpq.5.dylib

Regards,

--
Sergey Shinderuk https://postgrespro.com/

#54Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#52)
Re: [RFC] building postgres with meson

John Naylor <john.naylor@enterprisedb.com> writes:

System Information says it's disabled. Running "csrutil status" complains
of an unsupported configuration, which doesn't sound good, so I should
probably go fix that independent of anything else. :-/

Looking online, I wonder if the "unsupported" message might be overly
cautious. In any case, I do remember turning something off to allow a
debugger to run. Here are all the settings, in case it matters:

Apple Internal: disabled
Kext Signing: enabled
Filesystem Protections: enabled
Debugging Restrictions: disabled
DTrace Restrictions: enabled
NVRAM Protections: enabled
BaseSystem Verification: enabled

I remember having seen that report too, after some previous software
upgrade that had started from a "SIP disabled" status. I'm mostly
guessing here, but my guess is that

(a) csrutil only considers the all-enabled and all-disabled states
of these individual flags to be "supported" cases.

(b) some one or more of these flags came along in a macOS update,
and if you did the update starting from a "disabled" state, you
nonetheless ended up with the new flags enabled, leading to the
mixed state that csrutil complains about.

I've lost count of the number of times I've seen macOS updates
be sloppy about preserving non-default settings, so I don't find
theory (b) to be even slightly surprising.

Whether the mixed state is actually problematic in any way,
I dunno. I don't recall having had any problems before noticing
that that was what I had.

regards, tom lane

#55Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#50)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

Is this a Mac with SIP enabled? The Mac CI presumably has that disabled, which is why I didn't see this issue there. Probably need to implement whatever Tom figured out to do about that for the current way of running tests.

AFAIR the only cases we've made work are

(1) disable SIP

(2) avoid the need for (1) by always doing "make install" before
"make check".

Peter E. did some hacking towards another solution awhile ago,
but IIRC it involved changing the built binaries, and I think
we concluded that the benefits didn't justify that.

regards, tom lane

#56Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#45)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

Hm, so it seems we should make the test separately verify that perl -M{Opcode,
ExtUtils::Embed, ExtUtils::ParseXS} doesn't fail, so that we can fail perl
detection with a useful message?

Our existing policy is that we should check this at configure time,
not later. Since plperl won't work at all without Opcode, it seems
appropriate to add a check there if you say --with-perl. I wasn't
aware that Red Hat had unbundled that from the minimal perl
installation :-(.

OTOH, if they've not unbundled ExtUtils::Embed or ExtUtils::ParseXS,
I doubt it's worth the configure cycles to check for those separately.

regards, tom lane

#57Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#39)
Re: [RFC] building postgres with meson

On 10/13/21 7:11 PM, Andrew Dunstan wrote:

On 10/13/21 5:46 PM, Andres Freund wrote:

Hi,

On 2021-10-13 16:06:32 -0400, Andrew Dunstan wrote:

If you prep a patch I'll test it.

Well, right now I'm wondering if the better fix is to just remove the whole
win32 block. I don't know how far back, but afaict it's not needed. Seems to
have been needed for narwhal at some point, according to 02b61dd08f99. But
narwhal is long dead.

Ok, I'll test it out.

confirmed that jacana doesn't need this code to build or test plperl
(all I did was change the test from win32 to win32x). There would still
be work to do to fix the contrib bool_plperl, jsonb_plperl and
hstore_plperl modules.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#58Thomas Munro
thomas.munro@gmail.com
In reply to: Tom Lane (#55)
Re: [RFC] building postgres with meson

On Fri, Oct 15, 2021 at 11:00 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Peter E. did some hacking towards another solution awhile ago,
but IIRC it involved changing the built binaries, and I think
we concluded that the benefits didn't justify that.

Yeah, by now there are lots of useful blogs from various projects
figuring out that you can use the install_name_tool to adjust the
paths it uses to be absolute or relative to certain magic words, like
@executable_path/../lib/blah.dylib, which is tempting, but...
realistically, for serious hacking on a Mac, SIP is so annoying that
it isn't the only reason you'll want to turn it off: it stops
dtrace/dtruss/... from working, and somehow prevents debuggers from
working when you've ssh'd in from a remote machine with a proper
keyboard, and probably more things that I'm forgetting.

I wish I could find the Xnu source that shows exactly how and when the
environment is suppressed in this way to understand better, but it
doesn't jump out of Apple's github; maybe it's hiding in closed source
machinery...

#59Tom Lane
tgl@sss.pgh.pa.us
In reply to: Thomas Munro (#58)
Re: [RFC] building postgres with meson

Thomas Munro <thomas.munro@gmail.com> writes:

I wish I could find the Xnu source that shows exactly how and when the
environment is suppressed in this way to understand better, but it
doesn't jump out of Apple's github; maybe it's hiding in closed source
machinery...

I recall that we figured out awhile ago that the environment gets trimmed
when make (or whatever) executes some command via the shell; seemingly,
Apple has decided that /bin/sh is a security-critical program that mustn't
be run with a non-default DYLD_LIBRARY_PATH. Dunno if that helps you
find where the damage is done exactly.

(The silliness of this policy, when you pair it with the fact that they
don't reset PATH at the same time, seems blindingly obvious to me. But
apparently not to Apple.)

regards, tom lane

#60Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#55)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-14 18:00:49 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

Is this a Mac with SIP enabled? The Mac CI presumably has that disabled, which is why I didn't see this issue there. Probably need to implement whatever Tom figured out to do about that for the current way of running tests.

AFAIR the only cases we've made work are

(1) disable SIP

(2) avoid the need for (1) by always doing "make install" before
"make check".

Ah, I thought it was more than that. In that case, John, does meson's test
succeed after you did the "proper" install? Assuming it's in a path that's
allowed to provide shared libraries?

Greetings,

Andres Freund

#61Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#59)
Re: [RFC] building postgres with meson

I wrote:

I recall that we figured out awhile ago that the environment gets trimmed
when make (or whatever) executes some command via the shell; seemingly,
Apple has decided that /bin/sh is a security-critical program that mustn't
be run with a non-default DYLD_LIBRARY_PATH. Dunno if that helps you
find where the damage is done exactly.

BTW, here's the evidence for this theory:

[tgl@pro ~]$ cat checkenv.c
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
char *pth = getenv("DYLD_LIBRARY_PATH");

if (pth)
printf("DYLD_LIBRARY_PATH = %s\n", pth);
else
printf("DYLD_LIBRARY_PATH is unset\n");

return 0;
}
[tgl@pro ~]$ gcc checkenv.c
[tgl@pro ~]$ ./a.out
DYLD_LIBRARY_PATH is unset
[tgl@pro ~]$ export DYLD_LIBRARY_PATH=/Users/tgl/pginstall/lib
[tgl@pro ~]$ ./a.out
DYLD_LIBRARY_PATH = /Users/tgl/pginstall/lib
[tgl@pro ~]$ sh -c ./a.out
DYLD_LIBRARY_PATH is unset
[tgl@pro ~]$ ./a.out
DYLD_LIBRARY_PATH = /Users/tgl/pginstall/lib
[tgl@pro ~]$ bash -c ./a.out
DYLD_LIBRARY_PATH is unset

You have to check the environment using an "unprivileged" program.
If you try to examine the environment using, say, "env", you will get
very misleading results. AFAICT, /usr/bin/env is *also* considered
security-critical, because I cannot get it to ever report that
DYLD_LIBRARY_PATH is set.

Hmm ... /usr/bin/perl seems to act the same way. It can see
ENV{'PATH'} but not ENV{'DYLD_LIBRARY_PATH'}.

This may indicate that they've applied this policy on a blanket
basis to everything in /bin and /usr/bin (and other system
directories, maybe), rather than singling out the shell.

regards, tom lane

#62Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#58)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-15 11:23:00 +1300, Thomas Munro wrote:

On Fri, Oct 15, 2021 at 11:00 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Peter E. did some hacking towards another solution awhile ago,
but IIRC it involved changing the built binaries, and I think
we concluded that the benefits didn't justify that.

Yeah, by now there are lots of useful blogs from various projects
figuring out that you can use the install_name_tool to adjust the
paths it uses to be absolute or relative to certain magic words, like
@executable_path/../lib/blah.dylib, which is tempting, but...
realistically, for serious hacking on a Mac, SIP is so annoying that
it isn't the only reason you'll want to turn it off: it stops
dtrace/dtruss/... from working, and somehow prevents debuggers from
working when you've ssh'd in from a remote machine with a proper
keyboard, and probably more things that I'm forgetting.

Meson has support for using install_name_tool to remove "build time" rpaths
and set "install time" rpaths during the installation process - which uses
install_name_tool on mac.

If, and perhaps that's too big an if, relative rpaths actually work despite
SIP, it might be worth setting a relative install_rpath, because afaict that
should then work both for a "real" installation and our temporary test one.

If absolute rpaths are required, it'd make the process a bit more expensive,
because we'd probably need to change a configure time option during the temporary
install. No actual rebuilds would be required, but still.

Greetings,

Andres Freund

#63Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#62)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

If, and perhaps that's too big an if, relative rpaths actually work despite
SIP, it might be worth setting a relative install_rpath, because afaict that
should then work both for a "real" installation and our temporary test one.

From what we know so far, it seems like SIP wouldn't interfere with
that (if it works at all). I think what SIP desires to prevent is
messing with a program's execution by setting DYLD_LIBRARY_PATH.
As long as the program executable itself is saying where to find
the library, I don't see why they should interfere with that.

(Again, it seems blindingly stupid to forbid this while not blocking
PATH or any of the other environment variables that have always affected
execution. But what do I know.)

If absolute rpaths are required, it'd make the process a bit more expensive,

It'd also put the kibosh on relocatable install trees, though I dunno how
much people really care about that.

regards, tom lane

#64John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#60)
Re: [RFC] building postgres with meson

On Thu, Oct 14, 2021 at 6:55 PM Andres Freund <andres@anarazel.de> wrote:

Ah, I thought it was more than that. In that case, John, does meson's test
succeed after you did the "proper" install? Assuming it's in a path that's
allowed to provide shared libraries?

Oh, it can act like installcheck? [checks] Yep, "meson test" ran fine (*).
It still ran the temp install first, but in any case it worked. The full
"configure step" was

meson setup build --buildtype debug -Dldap=disabled -Dcassert=true
-Dprefix=$(pwd)/inst

* (all passed but skipped subscription/t/012_collation.pl)

--
John Naylor
EDB: http://www.enterprisedb.com

#65Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#56)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-14 18:08:58 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

Hm, so it seems we should make the test separately verify that perl -M{Opcode,
ExtUtils::Embed, ExtUtils::ParseXS} doesn't fail, so that we can fail perl
detection with a useful message?

Our existing policy is that we should check this at configure time,
not later.

Yea, I was thinking of configure (and meson's equivalent) as well.

Since plperl won't work at all without Opcode, it seems
appropriate to add a check there if you say --with-perl. I wasn't
aware that Red Hat had unbundled that from the minimal perl
installation :-(.

OTOH, if they've not unbundled ExtUtils::Embed or ExtUtils::ParseXS,
I doubt it's worth the configure cycles to check for those separately.

On debian the perl binary, with a sparse set of modules is in
perl-base. ExtUtils::Embed and ExtUtils::ParseXS are in
perl-modules-x.yy. Whereas Opcode is in libperlx.yy. But libperlx.yy depends
on perl-modules-x.yy so I guess an Opcode.pm check would suffice.

Seems we can just check all of them at once with with something like

perl -MOpcode -MExtUtils::Embed -MExtUtils::ParseXSNotAvailable -e ''
Can't locate ExtUtils/ParseXSNotAvailable.pm in @INC (you may need to install the ExtUtils::ParseXS3 module) (@INC contains: /home/andres/bin/perl5/lib/perl5/x86_64-linux-gnu-thread-multi /home/andres/bin/perl5/lib/perl5 /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.32.1 /usr/local/share/perl/5.32.1 /usr/lib/x86_64-linux-gnu/perl5/5.32 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.32 /usr/share/perl/5.32 /usr/local/lib/site_perl).

Greetings,

Andres Freund

#66Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#65)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

On 2021-10-14 18:08:58 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

Hm, so it seems we should make the test separately verify that perl -M{Opcode,
ExtUtils::Embed, ExtUtils::ParseXS} doesn't fail, so that we can fail perl
detection with a useful message?

Our existing policy is that we should check this at configure time,
not later.

Yea, I was thinking of configure (and meson's equivalent) as well.

Ah, sorry, I misunderstood what you meant by "test".

regards, tom lane

#67Andres Freund
andres@anarazel.de
In reply to: John Naylor (#64)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-14 19:27:17 -0400, John Naylor wrote:

On Thu, Oct 14, 2021 at 6:55 PM Andres Freund <andres@anarazel.de> wrote:

Ah, I thought it was more than that. In that case, John, does meson's test
succeed after you did the "proper" install? Assuming it's in a path that's
allowed to provide shared libraries?

Oh, it can act like installcheck? [checks] Yep, "meson test" ran fine (*).
It still ran the temp install first, but in any case it worked.

As far as I understand Tom, our normal make check only works on OSX if
previously you ran make install. Which will have installed libpq into the
"proper" install location. Because all our binaries will, by default, have an
rpath to the library directory embedded, that then allows binaries in the
temporary install to work. But using the wrong libpq - which most of the time
turns out to be harmless, because libpq doesn't change that rapidly.

* (all passed but skipped subscription/t/012_collation.pl)

That test requires ICU, so that's fine. I guess we could prevent the test from
being executed in the first place, but I don't think we've done that for cases
where it's one specific test in a t/ directory, where others in the same
directory do not have such dependencies.

Greetings,

Andres Freund

#68Thomas Munro
thomas.munro@gmail.com
In reply to: Tom Lane (#61)
Re: [RFC] building postgres with meson

On Fri, Oct 15, 2021 at 12:04 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

[tgl@pro ~]$ cat checkenv.c
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
char *pth = getenv("DYLD_LIBRARY_PATH");

if (pth)
printf("DYLD_LIBRARY_PATH = %s\n", pth);
else
printf("DYLD_LIBRARY_PATH is unset\n");

return 0;
}
[tgl@pro ~]$ gcc checkenv.c
[tgl@pro ~]$ ./a.out
DYLD_LIBRARY_PATH is unset
[tgl@pro ~]$ export DYLD_LIBRARY_PATH=/Users/tgl/pginstall/lib
[tgl@pro ~]$ ./a.out
DYLD_LIBRARY_PATH = /Users/tgl/pginstall/lib
[tgl@pro ~]$ sh -c ./a.out
DYLD_LIBRARY_PATH is unset
[tgl@pro ~]$ ./a.out
DYLD_LIBRARY_PATH = /Users/tgl/pginstall/lib
[tgl@pro ~]$ bash -c ./a.out
DYLD_LIBRARY_PATH is unset

You have to check the environment using an "unprivileged" program.
If you try to examine the environment using, say, "env", you will get
very misleading results. AFAICT, /usr/bin/env is *also* considered
security-critical, because I cannot get it to ever report that
DYLD_LIBRARY_PATH is set.

Hmm ... /usr/bin/perl seems to act the same way. It can see
ENV{'PATH'} but not ENV{'DYLD_LIBRARY_PATH'}.

This may indicate that they've applied this policy on a blanket
basis to everything in /bin and /usr/bin (and other system
directories, maybe), rather than singling out the shell.

Looks like it. If I've found the right code here, it looks like where
any common-or-garden Unix runtime linker would ignore LD_LIBRARY_PATH
for a setuid binary, they've trained theirs to whack DYLD_*, and also
for code-signed and __RESTRICT-marked executables.

https://github.com/opensource-apple/dyld/blob/master/src/dyld.cpp#L1681

I suppose you could point SHELL at an unsigned copy of sh (codesign
--remove-signature, or something from brew/ports/x) so that GNU make
should respect, but I don't know how many other exec("/bin/sh") calls
might be hiding around the place (I guess perl calls system()?) and
might require some kind of LD_PRELOAD hackery... not much fun.

#69Tom Lane
tgl@sss.pgh.pa.us
In reply to: Thomas Munro (#68)
Re: [RFC] building postgres with meson

Thomas Munro <thomas.munro@gmail.com> writes:

On Fri, Oct 15, 2021 at 12:04 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

This may indicate that they've applied this policy on a blanket
basis to everything in /bin and /usr/bin (and other system
directories, maybe), rather than singling out the shell.

Looks like it. If I've found the right code here, it looks like where
any common-or-garden Unix runtime linker would ignore LD_LIBRARY_PATH
for a setuid binary, they've trained theirs to whack DYLD_*, and also
for code-signed and __RESTRICT-marked executables.
https://github.com/opensource-apple/dyld/blob/master/src/dyld.cpp#L1681

Ugh. That explains it, all right.

I suppose you could point SHELL at an unsigned copy of sh (codesign
--remove-signature, or something from brew/ports/x) so that GNU make
should respect, but I don't know how many other exec("/bin/sh") calls
might be hiding around the place (I guess perl calls system()?) and
might require some kind of LD_PRELOAD hackery... not much fun.

Yeah. I thought about invoking everything via a small wrapper
that restores the correct setting of DYLD_LIBRARY_PATH. We could
perhaps make that work for the invocations of test postmasters
and psqls from "make" and TAP scripts, but hacking up our code's
sundry uses of system(3) like that seems like it'd be very messy,
if feasible at all.

BTW, the POSIX spec explicitly discourages letting SHELL affect the
behavior of system(3), so I bet that wouldn't help.

regards, tom lane

#70Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#69)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-14 22:46:07 -0400, Tom Lane wrote:

Thomas Munro <thomas.munro@gmail.com> writes:

I suppose you could point SHELL at an unsigned copy of sh (codesign
--remove-signature, or something from brew/ports/x) so that GNU make
should respect, but I don't know how many other exec("/bin/sh") calls
might be hiding around the place (I guess perl calls system()?) and
might require some kind of LD_PRELOAD hackery... not much fun.

Yeah. I thought about invoking everything via a small wrapper
that restores the correct setting of DYLD_LIBRARY_PATH. We could
perhaps make that work for the invocations of test postmasters
and psqls from "make" and TAP scripts, but hacking up our code's
sundry uses of system(3) like that seems like it'd be very messy,
if feasible at all.

It does sound like using relative rpaths might be the thing we want - and like
they've been available since 10.5 or something.

Is there a reason we're using absolute rpaths on a bunch of platforms, rather
than relative ones, which'd allow relocation?

Greetings,

Andres Freund

#71Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#63)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-14 19:23:58 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

If, and perhaps that's too big an if, relative rpaths actually work despite
SIP, it might be worth setting a relative install_rpath, because afaict that
should then work both for a "real" installation and our temporary test one.

From what we know so far, it seems like SIP wouldn't interfere with
that (if it works at all). I think what SIP desires to prevent is
messing with a program's execution by setting DYLD_LIBRARY_PATH.
As long as the program executable itself is saying where to find
the library, I don't see why they should interfere with that.

Well, there's *some* danger with relative rpaths, because they might
accidentally be pointing somewhere non-existing and user-creatable. Not a huge
risk, but as you say:

(Again, it seems blindingly stupid to forbid this while not blocking
PATH or any of the other environment variables that have always affected
execution. But what do I know.)

these aren't necessarily carefuly weighed considerations :/

But it seems to work well from what I gather.

If absolute rpaths are required, it'd make the process a bit more expensive,

It'd also put the kibosh on relocatable install trees, though I dunno how
much people really care about that.

We currently use absolute rpaths, or something equivalent.

The reason that running tests on macos works is that we set the "install_name"
of shared libraries to the intended installed location, using an absolute
path:
LINK.shared = $(COMPILER) -dynamiclib -install_name '$(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)' $(version_link) $(exported_symbols_list) -multiply_defined suppress
which on macos means that all libraries linking to that dylib reference it
under that absolute path.

On most other platforms we set an absolute rpath to the installation
directory, which has an equivalent effect:
rpathdir = $(libdir)

It seems to work quite well to change our own references to libpq in binaries
/ shared libs to be relative, but to leave the install_name of the libraries
intact. In combination with adding an rpath of @loader_path/../lib/ to
binaries and @loader_path/ to shlibs, the install will re relocatable.

It doesn't work as well to actually have a non-absolute install_name for
libraries (e.g. @rpath/libpq.dylib), because then external code linking to
libpq needs to add an rpath to the installation to make it work.

The advantage of this approach over Peter's is that it's not temp-install
specific - due to the relative paths, it makes installations relocatable
without relying [DY]LD_LIBRARY_PATH.

On other unixoid systems this whole mess is simpler, because we can just add
$ORIGIN to shared libraries and $ORIGIN/../lib/ to binaries. We don't need to
leave some absolute path in the libraries themself intact.

Greetings,

Andres Freund

#72Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#71)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-15 11:50:30 -0700, Andres Freund wrote:

It seems to work quite well to change our own references to libpq in binaries
/ shared libs to be relative, but to leave the install_name of the libraries
intact. In combination with adding an rpath of @loader_path/../lib/ to
binaries and @loader_path/ to shlibs, the install will re relocatable.

It doesn't work as well to actually have a non-absolute install_name for
libraries (e.g. @rpath/libpq.dylib), because then external code linking to
libpq needs to add an rpath to the installation to make it work.

The advantage of this approach over Peter's is that it's not temp-install
specific - due to the relative paths, it makes installations relocatable
without relying [DY]LD_LIBRARY_PATH.

On other unixoid systems this whole mess is simpler, because we can just add
$ORIGIN to shared libraries and $ORIGIN/../lib/ to binaries. We don't need to
leave some absolute path in the libraries themself intact.

I implemented this for the meson build, and it seems to work nicely. The macos
part was harder than I hoped due to the install_name stuff, which meson
doesn't solve.

https://github.com/anarazel/postgres/commit/a35379c28989469cc4b701a8d7a22422e6302e09

After that the build directory is relocatale.

I don't immediately see a way to do this reasonably for the autoconf
build. We'd need a list of our own shared libraries from somewhere, and then
replace the references after building the objects?

Greetings,

Andres Freund

#73Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#72)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-15 15:36:16 -0700, Andres Freund wrote:

On 2021-10-15 11:50:30 -0700, Andres Freund wrote:

It seems to work quite well to change our own references to libpq in binaries
/ shared libs to be relative, but to leave the install_name of the libraries
intact. In combination with adding an rpath of @loader_path/../lib/ to
binaries and @loader_path/ to shlibs, the install will re relocatable.

It doesn't work as well to actually have a non-absolute install_name for
libraries (e.g. @rpath/libpq.dylib), because then external code linking to
libpq needs to add an rpath to the installation to make it work.

The advantage of this approach over Peter's is that it's not temp-install
specific - due to the relative paths, it makes installations relocatable
without relying [DY]LD_LIBRARY_PATH.

On other unixoid systems this whole mess is simpler, because we can just add
$ORIGIN to shared libraries and $ORIGIN/../lib/ to binaries. We don't need to
leave some absolute path in the libraries themself intact.

I implemented this for the meson build, and it seems to work nicely. The macos
part was harder than I hoped due to the install_name stuff, which meson
doesn't solve.

https://github.com/anarazel/postgres/commit/a35379c28989469cc4b701a8d7a22422e6302e09

After that the build directory is relocatale.

Well, now that I think about it, it's still only relocatable in the sense that
postgres itself will continue to work. Outside code linking to e.g. libpq will
get the wrong path after relocation the source tree, due to the absolute
install_name.

But that doesn't seem solvable, unless we make the installed install_name to
be '@rpath/libpq...dylib' and require code linking to libpq to pass
-Wl,-rpath,/path/to/libpq when linking to libpq.

Greetings,

Andres Freund

#74Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

Hi Tom,

On 2021-10-12 01:37:21 -0700, Andres Freund wrote:

As far as I can tell the only OS that postgres currently supports that
meson doesn't support is HPUX. It'd likely be fairly easy to add
gcc-on-hpux support, a chunk more to add support for the proprietary
ones.

Tom, wrt HPUX on pa-risc, what are your thoughts there? IIRC we gave up
supporting HP's compiler on pa-risc a while ago.

As I said it'd probably not be too hard to add meson support for hpux on hppa,
it's probably just a few branches. But that'd require access somewhere. The
gcc compile farm does not have a hppa member anymore...

I did notice that gcc will declare hppa-hpux obsolete in gcc 12 and will
remove at some point:
"The hppa[12]*-*-hpux10* and hppa[12]*-*-hpux11* configurations targeting 32-bit PA-RISC with HP-UX have been obsoleted and will be removed in a future release."
https://gcc.gnu.org/gcc-12/changes.html

Greetings,

Andres Freund

#75Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#74)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

On 2021-10-12 01:37:21 -0700, Andres Freund wrote:

As far as I can tell the only OS that postgres currently supports that
meson doesn't support is HPUX. It'd likely be fairly easy to add
gcc-on-hpux support, a chunk more to add support for the proprietary
ones.

Tom, wrt HPUX on pa-risc, what are your thoughts there? IIRC we gave up
supporting HP's compiler on pa-risc a while ago.

Right. I am still testing with gcc on HP-PA. I'd kind of like to
keep it running just as an edge case for our spinlock support, but
I'm not sure that I want to do any huge amount of work on meson
to keep that going.

I do have a functioning OpenBSD installation on that machine, so
one alternative if the porting costs look too high is to replace
gaur with an OpenBSD animal. However, last I checked, OpenBSD
was about half the speed of HPUX on that hardware, so I'm not
real eager to go that way. gaur's already about the slowest
animal in the farm :-(

As I said it'd probably not be too hard to add meson support for hpux on hppa,
it's probably just a few branches. But that'd require access somewhere. The
gcc compile farm does not have a hppa member anymore...

If you've got an idea where to look, I could add that to my
to-do queue.

In any case, I don't think we need to consider HPUX as a blocker
for the meson approach. The value-add from keeping gaur going
probably isn't terribly much. I'm more concerned about the
effort involved in getting meson going on some other old animals,
such as prairiedog.

regards, tom lane

#76John Naylor
john.naylor@enterprisedb.com
In reply to: Tom Lane (#75)
1 attachment(s)
Re: [RFC] building postgres with meson

Hi,

I know this is still in the evaluation stage, but I did notice some
discrepencies in the Flex flags. With the attached patch, the read-only
data segment seems to match up pretty well now.

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

sync-flex-flags-with-autoconf-build.patchapplication/octet-stream; name=sync-flex-flags-with-autoconf-build.patchDownload
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index 49276aed64..3cf7ebdd8e 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -6,7 +6,7 @@ cube_sources = files(
 cubescan = custom_target('cubescan',
   input: ['cubescan.l'],
   output: ['cubescan.c'],
-  command: [flex, '-CFe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
 
 cube_sources += custom_target('cubeparse',
   input: 'cubeparse.y',
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
index 491eacf20b..5ce4d09f31 100644
--- a/src/backend/parser/meson.build
+++ b/src/backend/parser/meson.build
@@ -28,7 +28,7 @@ parser_sources = [files('parser.c')]
 backend_scanner = custom_target('scan',
   input: ['scan.l'],
   output: ['scan.c'],
-  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT0@'])
+  command: [flex, '-b', '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT0@'])
 parser_sources += backend_scanner[0]
 
 parser_sources += backend_parser_header[0]
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
index 2573f166d7..ee12c6d49d 100644
--- a/src/backend/replication/meson.build
+++ b/src/backend/replication/meson.build
@@ -17,7 +17,7 @@ backend_sources += files(
 repl_scanner = custom_target('repl_scanner',
   input : files('repl_scanner.l'),
   output : ['repl_scanner.c'],
-  command : [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@']
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@']
 )
 
 generated_backend_sources += custom_target('repl_gram',
@@ -30,7 +30,7 @@ generated_backend_sources += custom_target('repl_gram',
 syncrep_scanner = custom_target('syncrep_scanner',
   input: 'syncrep_scanner.l',
   output: 'syncrep_scanner.c',
-  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@'])
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
 
 generated_backend_sources += custom_target('syncrep_gram',
   input: 'syncrep_gram.y',
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
index 086fde8ff0..e1cea1eb4e 100644
--- a/src/backend/utils/adt/meson.build
+++ b/src/backend/utils/adt/meson.build
@@ -109,7 +109,7 @@ backend_sources += files(
 jsonpath_scan = custom_target('jsonpath_scan',
   input: ['jsonpath_scan.l'],
   output: ['jsonpath_scan.c'],
-  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+  command: [flex, '-b', '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
 
 # jsonpath_scan is compiled as part of jsonpath_gram
 generated_backend_sources += custom_target('jsonpath_parse',
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
index 5274c8aa1a..2c0090ad33 100644
--- a/src/backend/utils/misc/meson.build
+++ b/src/backend/utils/misc/meson.build
@@ -18,7 +18,7 @@ backend_sources += files(
 guc_scan = custom_target('guc_scan',
   input: ['guc-file.l'],
   output: ['guc-file.c.h'],
-  command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
 
 generated_backend_sources += guc_scan
 
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index 5c4a778ff3..bc135abebf 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -9,7 +9,7 @@ pgbench_sources = files(
 exprscan = custom_target('exprscan',
   input : files('exprscan.l'),
   output : ['exprscan.c'],
-  command : [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@']
+  command : [flex, '-o', '@OUTPUT0@', '@INPUT@']
 )
 
 exprparse = custom_target('exprparse',
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 98921f801d..e56beb28e1 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -18,7 +18,7 @@ psql_sources = files(
 psql_sources += custom_target('psqlscanslash',
   input: ['psqlscanslash.l'],
   output: ['psqlscanslash.c'],
-  command: [flex, '-CFe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+  command: [flex, '-b', '-Cfe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
 
 psql_sources += custom_target('psql_help',
   input: ['create_help.pl'],
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index b305727d96..e3f0b34cf1 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -16,7 +16,7 @@ fe_utils_sources = files(
 fe_utils_sources += custom_target('psqlscan',
   input: ['psqlscan.l'],
   output: ['psqlscan.c'],
-  command: [flex, '-Cfe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+  command: [flex, '-b', '-Cfe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
 
 fe_utils = static_library('fe_utils',
   fe_utils_sources + generated_headers,
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index 637b480755..ea8baa2063 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -8,7 +8,7 @@ isolation_sources = pg_regress_c + files(
 spec_scanner = custom_target('specscanner',
   input : files('specscanner.l'),
   output : ['specscanner.c'],
-  command : [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@']
+  command : [flex, '-o', '@OUTPUT0@', '@INPUT@']
 )
 
 isolationtester_sources = files('isolationtester.c')
#77Andres Freund
andres@anarazel.de
In reply to: John Naylor (#76)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-19 17:57:31 -0400, John Naylor wrote:

I know this is still in the evaluation stage, but I did notice some
discrepencies in the Flex flags. With the attached patch, the read-only
data segment seems to match up pretty well now.

Good catch. I think I just copied them around...

I wish we had a bit more consistency in the flags, so we could centralize
them. Seems there's no reason to not use -p -p and -b everywhere?

I also need to make meson use our flex wrapper for the relevant versions... I
can see the warning that'd be fixed by it on macos CI. Will do that and push
it out to my github repo together with your changes.

Thanks!

Andres

#78Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#75)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-19 15:22:15 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2021-10-12 01:37:21 -0700, Andres Freund wrote:

As far as I can tell the only OS that postgres currently supports that
meson doesn't support is HPUX. It'd likely be fairly easy to add
gcc-on-hpux support, a chunk more to add support for the proprietary
ones.

Tom, wrt HPUX on pa-risc, what are your thoughts there? IIRC we gave up
supporting HP's compiler on pa-risc a while ago.

Right. I am still testing with gcc on HP-PA. I'd kind of like to
keep it running just as an edge case for our spinlock support, but
I'm not sure that I want to do any huge amount of work on meson
to keep that going.

Makes sense. While that does test an odd special case for our spinlock
implementation, it's also the only supported platform with that edge case, and
it seems extremely unlikely that there ever will be a new platform with such
odd/limited atomic operations.

I do have a functioning OpenBSD installation on that machine, so
one alternative if the porting costs look too high is to replace
gaur with an OpenBSD animal. However, last I checked, OpenBSD
was about half the speed of HPUX on that hardware, so I'm not
real eager to go that way. gaur's already about the slowest
animal in the farm :-(

Yea, that doesn't sound enticing. Seems like we either should keep it running
on hp-ux or just drop parisc support?

As I said it'd probably not be too hard to add meson support for hpux on hppa,
it's probably just a few branches. But that'd require access somewhere. The
gcc compile farm does not have a hppa member anymore...

If you've got an idea where to look, I could add that to my to-do queue.

It might even just work. Looks like meson does have pa-risc detection. While
it doesn't have any specifically for hpux, it just falls back to python's
sys.platform in that case. python3 -c 'import sys;print(sys.platform)'

meson generates output for ninja to execute (basically a faster make that's
partially faster by being much less flexible. Intended to be output by more
user-friendly buildsystems ). Ninja can be built by a minimal python script,
or with cmake. The former doesn't seem to have hpux support, the latter does I
think.
https://github.com/ninja-build/ninja

So it could be interesting to see if ninja builds.

I've not taught the PG meson the necessary stuff for a 32 bit build. So
there's no point is trying whether meson works that much. I'll try to do that,
and let you know.

I'm more concerned about the effort involved in getting meson going on some
other old animals, such as prairiedog.

Yea, that's an *old* OS version. One version too old to have support for
@rpath, added in 10.5 :(. Is there a reason to run 10.4 specifically?
According to wikipedia 10.5 is the last version to support ppc.

Looks like python still supports building back to 10.4.

Greetings,

Andres Freund

#79Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#77)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

I wish we had a bit more consistency in the flags, so we could centralize
them. Seems there's no reason to not use -p -p and -b everywhere?

I don't think we care enough about performance of most of the scanners
to make them all backup-free, so -1 to that idea.

We could possibly replace the command line switches with %option
entries in the files themselves. But I think the reason we haven't
done so for -b is that the Makefile still needs to know about it
so as to know what to do with the lex.backup output file.

regards, tom lane

#80Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#78)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

On 2021-10-19 15:22:15 -0400, Tom Lane wrote:

I'm more concerned about the effort involved in getting meson going on some
other old animals, such as prairiedog.

Yea, that's an *old* OS version. One version too old to have support for
@rpath, added in 10.5 :(. Is there a reason to run 10.4 specifically?
According to wikipedia 10.5 is the last version to support ppc.

My notes say

Currently running OSX 10.4.11 (last release of Tiger); although 10.5 Leopard
supports PPCs, it refuses to install if CPU speed < 867MHz, well beyond the
Cube's ability. Wikipedia does suggest it's possible to run Leopard, but...
https://en.wikipedia.org/wiki/Mac_OS_X_Leopard#Usage_on_unsupported_hardware

I'm not sure that I have install media for 10.5 anymore, either --- ISTR
some machine's CD drive failing and not letting me get the CD back out.
If I did have it, I don't think there'd be a way to update past 10.5.0
(surely Apple no longer has those updaters on-line?), so on the whole
I think that path is a nonstarter.

I do have 10.5 running on an old G4 PowerMac, but that machine is (a)
noisy (b) power-hungry and (c) getting flaky, so I'm uneager to spin up
a buildfarm animal on it.

As with the HPPA, a potential compromise is to spin up some newer
BSD-ish system on it. I agree that OSX 10.4 is uninteresting as a
software platform, but I'd like to keep 32-bit PPC represented in
the farm.

regards, tom lane

#81Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#77)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-19 17:31:22 -0700, Andres Freund wrote:

I also need to make meson use our flex wrapper for the relevant versions... I
can see the warning that'd be fixed by it on macos CI. Will do that and push
it out to my github repo together with your changes.

That turned out to be more work than I anticipated, so I pushed your changes
out separately.

There's this bit in plflex.pl that talks about adjusting yywrap() for msvc. I
didn't implement that and didn't see any compilation problems. Looks like that
originally hails from 2011, in 08a0c2dabc3b9d59d72d7a79ed867b8e37d275a7

Hm. Seems not worth carrying forward unless it actually causes trouble?

Greetings,

Andres Freund

#82Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#80)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-19 21:26:53 -0400, Tom Lane wrote:

My notes say

Currently running OSX 10.4.11 (last release of Tiger); although 10.5 Leopard
supports PPCs, it refuses to install if CPU speed < 867MHz, well beyond the
Cube's ability. Wikipedia does suggest it's possible to run Leopard, but...
https://en.wikipedia.org/wiki/Mac_OS_X_Leopard#Usage_on_unsupported_hardware

I'm not sure that I have install media for 10.5 anymore, either --- ISTR
some machine's CD drive failing and not letting me get the CD back out.
If I did have it, I don't think there'd be a way to update past 10.5.0
(surely Apple no longer has those updaters on-line?), so on the whole
I think that path is a nonstarter.

That does indeed sound like a nonstarter.

I do have 10.5 running on an old G4 PowerMac, but that machine is (a)
noisy (b) power-hungry and (c) getting flaky, so I'm uneager to spin up
a buildfarm animal on it.

Understandable.

As with the HPPA, a potential compromise is to spin up some newer
BSD-ish system on it. I agree that OSX 10.4 is uninteresting as a
software platform, but I'd like to keep 32-bit PPC represented in
the farm.

I assume the reason 32-bit PPC is interesting is that it's commonly run big
endian?

I wonder when it'll be faster to run 32bit ppc via qemu than natively :)

Greetings,

Andres Freund

#83Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#82)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

On 2021-10-19 21:26:53 -0400, Tom Lane wrote:

As with the HPPA, a potential compromise is to spin up some newer
BSD-ish system on it. I agree that OSX 10.4 is uninteresting as a
software platform, but I'd like to keep 32-bit PPC represented in
the farm.

I assume the reason 32-bit PPC is interesting is that it's commonly run big
endian?

Aside from bit width and endianness, I believe it's a somewhat smaller
instruction set than the newer CPUs.

I wonder when it'll be faster to run 32bit ppc via qemu than natively :)

I think qemu would have a ways to go for that. More to the point,
I've found that its emulation is not as precise as one might wish...

regards, tom lane

#84Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#82)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-19 18:49:43 -0700, Andres Freund wrote:

I wonder when it'll be faster to run 32bit ppc via qemu than natively :)

Freebsd didn't seem to want to boot, but surprisingly a debian buster image
started at least the installer without problems... Will probably take a while
to see if it actually works.

I assume to make it acceptable from a build-speed perspective one would have
to use distcc with the compiler running outside.

Greetings,

Andres Freund

#85Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#84)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-19 19:41:56 -0700, Andres Freund wrote:

On 2021-10-19 18:49:43 -0700, Andres Freund wrote:

I wonder when it'll be faster to run 32bit ppc via qemu than natively :)

Freebsd didn't seem to want to boot, but surprisingly a debian buster image
started at least the installer without problems... Will probably take a while
to see if it actually works.

The build was quite slow (cold ccache cache, only 1 cpu):
real 106m33.418s
user 86m36.363s
sys 17m33.830s

But the actual test time wasn't *too* bad, compared to the 32bit ppc animals

real 12m14.944s
user 0m51.622s
sys 0m44.743s

Greetings,

Andres Freund

#86Andres Freund
andres@anarazel.de
In reply to: John Naylor (#21)
1 attachment(s)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 15:55:22 -0400, John Naylor wrote:

Also, could utility makefile targets be made to work? I'm thinking in
particular of update-unicode and reformat-dat-files, for example.

Implementing reformat-dat-files was trivial:
https://github.com/anarazel/postgres/commit/29c1ce1ad4731290714978da5ce81e99ef051bec

However, update-unicode is a bit harder. Partially not directly because of
meson, but because update-unicode as-is afaict doesn't support VPATH builds,
and meson enforces those.

make update-unicode
...
make -C src/common/unicode update-unicode
'/usr/bin/perl' generate-unicode_norm_table.pl
Can't open perl script "generate-unicode_norm_table.pl": No such file or directory

It's not too hard to fix. See attached for the minimal stuff that I
immediately found to be needed. There's likely more,
e.g. src/backend/utils/mb/Unicode - but I didn't immediately see where that's
invoked from.

The slightly bigger issue making update-unicode work with meson is that meson
doesn't provide support for invoking build targets in specific directories
(because it doesn't map nicely to e.g. msbuild). But scripts like
src/common/unicode/generate-unicode_norm_table.pl rely on CWD. It's not hard
to work around that, but IMO it's better for such scripts to not rely on CWD.

Greetings,

Andres Freund

Attachments:

update-unicode.difftext/x-diff; charset=us-asciiDownload
diff --git i/src/common/unicode/Makefile w/src/common/unicode/Makefile
index a3683dd86b9..e69054d4671 100644
--- i/src/common/unicode/Makefile
+++ w/src/common/unicode/Makefile
@@ -12,14 +12,14 @@ subdir = src/common/unicode
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
+override CPPFLAGS := -DFRONTEND -I$(abs_top_builddir)/src/common/unicode $(CPPFLAGS)
 LIBS += $(PTHREAD_LIBS)
 
 # By default, do nothing.
 all:
 
 update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_east_asian_fw_table.h unicode_normprops_table.h unicode_norm_hashfunc.h
-	mv $^ ../../../src/include/common/
+	mv $^ $(top_srcdir)/src/include/common/
 	$(MAKE) normalization-check
 
 # These files are part of the Unicode Character Database. Download
@@ -33,7 +33,7 @@ UnicodeData.txt EastAsianWidth.txt DerivedNormalizationProps.txt CompositionExcl
 unicode_norm_hashfunc.h: unicode_norm_table.h
 
 unicode_norm_table.h: generate-unicode_norm_table.pl UnicodeData.txt CompositionExclusions.txt
-	$(PERL) generate-unicode_norm_table.pl
+	$(PERL) $^
 
 unicode_combining_table.h: generate-unicode_combining_table.pl UnicodeData.txt
 	$(PERL) $^ >$@
@@ -58,7 +58,7 @@ submake-common:
 	$(MAKE) -C .. all
 
 norm_test_table.h: generate-norm_test_table.pl NormalizationTest.txt
-	perl generate-norm_test_table.pl NormalizationTest.txt $@
+	perl $^ $@
 
 .PHONY: normalization-check
 
diff --git i/contrib/unaccent/Makefile w/contrib/unaccent/Makefile
index b8307d1601e..d6c466e07ad 100644
--- i/contrib/unaccent/Makefile
+++ w/contrib/unaccent/Makefile
@@ -27,12 +27,12 @@ include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
-update-unicode: unaccent.rules
+update-unicode: $(srcdir)/unaccent.rules
 
 # Allow running this even without --with-python
 PYTHON ?= python
 
-unaccent.rules: generate_unaccent_rules.py ../../src/common/unicode/UnicodeData.txt Latin-ASCII.xml
+$(srcdir)/unaccent.rules: generate_unaccent_rules.py ../../src/common/unicode/UnicodeData.txt Latin-ASCII.xml
 	$(PYTHON) $< --unicode-data-file $(word 2,$^) --latin-ascii-file $(word 3,$^) >$@
 
 # Only download it once; dependencies must match src/common/unicode/
#87John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#86)
Re: [RFC] building postgres with meson

On Thu, Oct 21, 2021 at 5:48 PM Andres Freund <andres@anarazel.de> wrote:

However, update-unicode is a bit harder. Partially not directly because

of

meson, but because update-unicode as-is afaict doesn't support VPATH

builds,

and meson enforces those.

make update-unicode
...
make -C src/common/unicode update-unicode
'/usr/bin/perl' generate-unicode_norm_table.pl
Can't open perl script "generate-unicode_norm_table.pl": No such file or

directory

It's not too hard to fix. See attached for the minimal stuff that I
immediately found to be needed.

Thanks for doing that, it works well enough for demonstration. With your
patch, and using an autoconf VPATH build, the unicode tables work fine, but
it complains of a permission error in generate_unaccent_rules.py. That
seems to be because the script is invoked directly rather than as an
argument to the python interpreter.

The slightly bigger issue making update-unicode work with meson is that

meson

doesn't provide support for invoking build targets in specific directories
(because it doesn't map nicely to e.g. msbuild). But scripts like
src/common/unicode/generate-unicode_norm_table.pl rely on CWD. It's not

hard

to work around that, but IMO it's better for such scripts to not rely on

CWD.

Yeah. I encountered a further issue: With autoconf on HEAD, with a source
tree build executed in contrib/unaccent:

$ touch generate_unaccent_rules.py
$ make update-unicode
generate_unaccent_rules.py --unicode-data-file
../../src/common/unicode/UnicodeData.txt --latin-ascii-file Latin-ASCII.xml

unaccent.rules

/bin/sh: generate_unaccent_rules.py: command not found
make: *** [unaccent.rules] Error 127
make: *** Deleting file `unaccent.rules'

...so in this case it seems not to know to use CWD here.

Anyway, this can be put off until the very end, since it's not run often.
You've demonstrated how these targets would work, and that's good enough
for now.

--
John Naylor
EDB: http://www.enterprisedb.com

#88Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
16 attachment(s)
Re: [RFC] building postgres with meson -v

Hi,

Attached is an updated version of the meson patchset.

Changes:

- support for remaining binaries in src/bin, contrib modules

- nearly all tests, including src/test/modules etc, are integrated.

- quite a few more, but not yet all, optional dependencies (most are
exercised in the included CI)

- runs tests on SIP enabled macos without needing a prior installation /
installation is relocatable

- support for building docs.
I couldn't get dbtoepub work in a vpath style build, so I changed that
to also use pandoc. No idea if anybody uses the epub rules?

- 32bit x86 [1]I had not defined SIZEOF_SIZE_T. Surprisingly that still results in a successful 64bit build, but not a successful 32bit build., 64bit aarch64 builds

- cross-building windows from linux works

- error when building with meson against a source tree with an in-tree
autoconf build (leads to problems with pg_config.h etc)

- update-unicode, reformat-dat-files, expand-dat-files

Bigger missing pieces:

- pgxs (that's a *hard* one)

- NLS

- test / add support for platforms besides freebsd, linux, macos, windows

- remaining hardcoded configure tests (e.g. ACCEPT_TYPE_ARG*)

- win32 resource files only handled for two binaries, needs to be made
more compact

- ecpg

- fixing up flex output

- truckloads of polishing

- some tests (e.g. pg_upgrade, because of the upcoming tap conversion,
other tests that are shell scripts). Some tests are now run
unconditionally that previously were opt-in.

- what exactly gets installed where

- a "dist" target

- fix "ldap" build on macos

Greetings,

Andres Freund

[1]: I had not defined SIZEOF_SIZE_T. Surprisingly that still results in a successful 64bit build, but not a successful 32bit build.
a successful 64bit build, but not a successful 32bit build.

Attachments:

v5-0001-ci-backend-windows-DONTMERGE-crash-reporting-back.patchtext/x-diff; charset=us-asciiDownload
From 48d06672d142ffed46faaf0ab4d2fece67534dce Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 9 Sep 2021 17:49:39 -0700
Subject: [PATCH v5 01/16] ci: backend: windows: DONTMERGE: crash reporting
 (backend).

---
 src/backend/main/main.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index ad84a45e28c..65a325723fd 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -26,6 +26,10 @@
 #include <sys/param.h>
 #endif
 
+#if defined(WIN32)
+#include <crtdbg.h>
+#endif
+
 #if defined(_M_AMD64) && _MSC_VER == 1800
 #include <math.h>
 #include <versionhelpers.h>
@@ -238,7 +242,15 @@ startup_hacks(const char *progname)
 		}
 
 		/* In case of general protection fault, don't show GUI popup box */
-		SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+		SetErrorMode(SEM_FAILCRITICALERRORS /* | SEM_NOGPFAULTERRORBOX */);
+
+		_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+		_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+		_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+		_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+#ifndef __MINGW64__
+		_set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG, _CALL_REPORTFAULT | _WRITE_ABORT_MSG);
+#endif
 
 #if defined(_M_AMD64) && _MSC_VER == 1800
 
-- 
2.23.0.385.gbc12974a89

v5-0002-ci-Add-CI-for-FreeBSD-Linux-MacOS-and-Windows-uti.patchtext/x-diff; charset=us-asciiDownload
From 2e4bba81f06ab55fad639e9657b71c5db98b6252 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 15 Mar 2021 09:25:15 -0700
Subject: [PATCH v5 02/16] ci: Add CI for FreeBSD, Linux, MacOS and Windows,
 utilizing cirrus-ci.

---
 .cirrus.yml                     | 395 ++++++++++++++++++++++++++++++++
 .dockerignore                   |   3 +
 ci/docker/linux_debian_bullseye |  13 ++
 ci/docker/windows_vs_2019       | 111 +++++++++
 ci/freebsd_gcp_repartition.sh   |  28 +++
 ci/pg_ci_base.conf              |  12 +
 ci/windows_build_config.pl      |  13 ++
 7 files changed, 575 insertions(+)
 create mode 100644 .cirrus.yml
 create mode 100644 .dockerignore
 create mode 100644 ci/docker/linux_debian_bullseye
 create mode 100644 ci/docker/windows_vs_2019
 create mode 100755 ci/freebsd_gcp_repartition.sh
 create mode 100644 ci/pg_ci_base.conf
 create mode 100644 ci/windows_build_config.pl

diff --git a/.cirrus.yml b/.cirrus.yml
new file mode 100644
index 00000000000..f75bdce6dec
--- /dev/null
+++ b/.cirrus.yml
@@ -0,0 +1,395 @@
+env:
+  # accelerate initial clone, but a bit of depth so that concurrent tasks work
+  CIRRUS_CLONE_DEPTH: 100
+  # Useful to be able to analyse what in a script takes long
+  CIRRUS_LOG_TIMESTAMP: true
+  # target to test, for all but windows
+  CHECK: check-world
+  CHECKFLAGS: -Otarget
+  PGCTLTIMEOUT: 120
+  CCACHE_MAXSIZE: "500M"
+  TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
+  PG_TEST_EXTRA: kerberos ldap ssl
+
+
+task:
+  name: FreeBSD
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
+  compute_engine_instance:
+    image_project: pg-vm-images-aio
+    image: family/pg-aio-freebsd-13-0
+    platform: freebsd
+    cpu: 2
+    memory: 2G
+    disk: 50
+  env:
+    CCACHE_DIR: "/tmp/ccache_dir"
+
+  ccache_cache:
+    folder: "/tmp/ccache_dir"
+  sysinfo_script:
+    - export || true
+  sysconfig_script:
+    - sudo sysctl kern.corefile='/tmp/%N.%P.core'
+  repartition_script:
+    - ci/freebsd_gcp_repartition.sh
+  create_user_script:
+    - pw useradd postgres
+    - chown -R postgres:postgres .
+    - mkdir -p /tmp/ccache_dir
+    - chown -R postgres:postgres /tmp/ccache_dir
+
+  configure_script: |
+    su postgres -c './configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-ssl=openssl \
+      --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+      --with-uuid=bsd \
+      \
+      --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+      CC="ccache cc"'
+  build_script:
+    - su postgres -c 'gmake -s -j3 && gmake -s -j3 -C contrib'
+  upload_caches:
+    - ccache
+
+  tests_script:
+    - su postgres -c 'time gmake -s -j2 ${CHECK} ${CHECKFLAGS}'
+
+  on_failure:
+    cores_script: |
+      for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do
+        binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECPATH | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ;
+        echo dumping $corefile for $binary ;
+        gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile;
+      done
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: Linux
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+  compute_engine_instance:
+    image_project: pg-vm-images-aio
+    image: family/pg-aio-bullseye
+    platform: linux
+    cpu: 4
+    memory: 2G
+    nested_virtualization: false
+  env:
+    CCACHE_DIR: "/tmp/ccache_dir"
+    DEBUGINFOD_URLS: "https://debuginfod.debian.net"
+
+  ccache_cache:
+    folder: "/tmp/ccache_dir"
+
+  sysinfo_script:
+    - id
+    - uname -a
+    - cat /proc/cmdline
+    - lsblk
+    - ulimit -a -H
+    - ulimit -a -S
+    - export
+  sysconfig_script:
+    - useradd -m postgres
+    - chown -R postgres:postgres .
+    - mkdir -p /tmp/ccache_dir
+    - chown -R postgres:postgres /tmp/ccache_dir
+    - echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
+    - su postgres -c 'ulimit -l -H'
+    - su postgres -c 'ulimit -l -S'
+    - echo '/tmp/%e-%s-%p.core' > /proc/sys/kernel/core_pattern
+
+  configure_script: |
+    su postgres -c './configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-gssapi \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      --with-llvm \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-ssl=openssl \
+      --with-systemd \
+      --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"'
+  build_script:
+    - su postgres -c 'make -s -j4 && make -s -j4 -C contrib'
+  upload_caches:
+    - ccache
+
+  tests_script: |
+    su postgres -c '\
+      ulimit -c unlimited; \
+      make -s ${CHECK} ${CHECKFLAGS} -j8 \
+      '
+
+  on_failure:
+    cores_script: |
+      for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do
+        binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECFN | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ;
+        echo dumping $corefile for $binary ;
+        gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile ;
+      done
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: macOS
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
+  osx_instance:
+    image: big-sur-base
+  env:
+    CIRRUS_WORKING_DIR: ${HOME}/pgsql/
+    TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
+    CCACHE_DIR: ${HOME}/ccache
+    HOMEBREW_CACHE: ${HOME}/homebrew-cache
+    PERL5LIB: ${HOME}/perl5/lib/perl5
+
+  sysinfo_script:
+    - id
+    - export
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+  homebrew_cache:
+    folder: ${HOMEBREW_CACHE}
+  perl_cache:
+    folder: ~/perl5
+
+  cpan_install_script:
+    - perl -mIPC::Run -e 1 || cpan -T IPC::Run
+    - perl -mIO::Pty -e 1 || cpan -T IO::Pty
+  upload_caches:
+    - perl
+  core_install_script:
+    - sudo chmod 777 /cores
+  homebrew_install_script:
+    - brew install make coreutils ccache icu4c lz4 tcl-tk openldap
+  upload_caches:
+    - homebrew
+
+  configure_script: |
+    LIBS="/usr/local/lib:$LIBS"
+    INCLUDES="/usr/local/include:$INCLUDES"
+
+    INCLUDES="/usr/local/opt/openssl/include:$INCLUDES"
+    LIBS="/usr/local/opt/openssl/lib:$LIBS"
+
+    PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
+    INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES"
+    LIBS="/usr/local/opt/icu4c/lib:$LIBS"
+
+    LIBS="/usr/local/opt/openldap/lib:$LIBS"
+    INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
+
+    export PKG_CONFIG_PATH
+
+    ./configure \
+      --prefix=$HOME/install \
+      --with-includes="$INCLUDES" \
+      --with-libs="$LIBS" \
+      \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      \
+      --with-lz4 \
+      --with-perl \
+      --with-python \
+      --with-ssl=openssl \
+      --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc" CFLAGS="-O0 -ggdb"
+  build_script:
+    - gmake -s -j12 && gmake -s -j12 -C contrib
+  upload_caches:
+    - ccache
+
+  tests_script:
+    - ulimit -c unlimited
+    - ulimit -n 1024
+    - gmake -s -j12 ${CHECK} ${CHECKFLAGS}
+
+  on_failure:
+    cores_script: |
+      for corefile in $(find /cores/ -name 'core.*' 2>/dev/null) ; do
+        lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit' ;
+      done
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: Windows
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*'
+  windows_container:
+    dockerfile: ci/docker/windows_vs_2019
+    cpu: 4
+    memory: 4G
+  env:
+    PROVE_FLAGS: -j10
+    # The default working dir is in a directory msbuild complains about
+    CIRRUS_WORKING_DIR: "c:/cirrus"
+    TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
+    # Avoid re-installing over and over
+    NO_TEMP_INSTALL: 1
+
+  sysinfo_script:
+    - chcp
+    - systeminfo
+    - powershell -Command get-psdrive -psprovider filesystem
+    - ps: Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug'
+    - set
+
+  configure_script:
+    - copy ci\windows_build_config.pl src\tools\msvc\config.pl
+    - vcvarsall x64
+    - perl src/tools/msvc/mkvcbuild.pl
+  build_script:
+    - vcvarsall x64
+    # Disable file tracker, we're never going to rebuild...
+    - msbuild -m /p:TrackFileAccess=false pgsql.sln
+  tempinstall_script:
+    # Installation on windows currently only completely works from src\tools\msvc
+    - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install
+
+  check_test_script:
+    - perl src/tools/msvc/vcregress.pl check parallel
+  startcreate_test_script:
+    - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log
+    - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf
+    - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log
+  plcheck_test_script:
+    - perl src/tools/msvc/vcregress.pl plcheck
+  isolationcheck_test_script:
+    - perl src/tools/msvc/vcregress.pl isolationcheck
+  modulescheck_test_script:
+    - perl src/tools/msvc/vcregress.pl modulescheck
+  contribcheck_test_script:
+    - perl src/tools/msvc/vcregress.pl contribcheck
+  stop_test_script:
+    - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log
+  ssl_test_script:
+    - set with_ssl=openssl
+    - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\
+  subscriptioncheck_test_script:
+    - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\
+  authentication_test_script:
+    - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\
+  recoverycheck_test_script:
+    - perl src/tools/msvc/vcregress.pl recoverycheck
+  bincheck_test_script:
+    - perl src/tools/msvc/vcregress.pl bincheck
+  upgradecheck_test_script:
+    - perl src/tools/msvc/vcregress.pl upgradecheck
+  ecpgcheck_test_script:
+    # tries to build additional stuff
+    - vcvarsall x64
+    # References ecpg_regression.proj in the current dir
+    - cd src\tools\msvc
+    - perl vcregress.pl ecpgcheck
+
+  always:
+    cores_script:
+      - cat crashlog.txt || true
+    dump_artifacts:
+      path: "crashlog.txt"
+      type: text/plain
+
+  on_failure:
+    log_artifacts:
+      path: "**/**.log"
+      type: text/plain
+    regress_diffs_artifacts:
+      path: "**/**.diffs"
+      type: text/plain
+    tap_artifacts:
+      path: "**/regress_log_*"
+      type: text/plain
+
+
+task:
+  name: CompilerWarnings
+  depends_on:
+    - Linux
+  # task that did not run count as a success, so we need to recheck Linux' condition here :/
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+  container:
+    dockerfile: ci/docker/linux_debian_bullseye
+  env:
+    CCACHE_SIZE: "4GB"
+    CCACHE_DIR: "/tmp/ccache_dir"
+  ccache_cache:
+    folder: "/tmp/ccache_dir"
+  setup_script:
+    - echo "COPT=-Werror" > src/Makefile.custom
+    - gcc -v
+    - clang -v
+  # gcc with asserts disabled
+  always:
+    gcc_warning_script:
+      - ./configure --cache gcc.cache CC="ccache gcc"
+      - time make -s -j4 clean && time make -s -j4
+  # gcc with asserts enabled
+  always:
+    gcc_a_warning_script:
+      - ./configure --cache gcc.cache --enable-cassert CC="ccache gcc"
+      - time make -s -j4 clean && time make -s -j4
+  # clang with asserts disabled
+  always:
+    clang_warning_script:
+      - ./configure --cache clang.cache CC="ccache clang"
+      - time make -s -j4 clean && time make -s -j4
+  # clang with asserts enabled
+  always:
+    clang_a_warning_script:
+      - ./configure --cache clang.cache --enable-cassert CC="ccache clang"
+      - time make -s -j4 clean && time make -s -j4
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000000..3fceab2e97b
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,3 @@
+# Ignore everything, except ci/
+*
+!ci/*
diff --git a/ci/docker/linux_debian_bullseye b/ci/docker/linux_debian_bullseye
new file mode 100644
index 00000000000..f6c1782f16b
--- /dev/null
+++ b/ci/docker/linux_debian_bullseye
@@ -0,0 +1,13 @@
+FROM debian:bullseye
+RUN \
+  apt-get -y update && \
+  apt-get -y upgrade && \
+  DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+    git build-essential gcc g++ libreadline-dev flex bison make perl libipc-run-perl \
+    libio-pty-perl clang llvm-dev libperl-dev libpython3-dev tcl-dev libldap2-dev \
+    libicu-dev docbook-xml docbook-xsl fop libxml2-utils xsltproc krb5-admin-server \
+    krb5-kdc krb5-user slapd ldap-utils libssl-dev pkg-config locales-all liblz4-dev \
+    libsystemd-dev libxml2-dev libxslt1-dev python3-dev libkrb5-dev libpam-dev \
+    libkrb5-*-heimdal uuid-dev gettext \
+    liburing-dev python3-distutils ccache && \
+  apt-get clean
diff --git a/ci/docker/windows_vs_2019 b/ci/docker/windows_vs_2019
new file mode 100644
index 00000000000..a4fcaceae96
--- /dev/null
+++ b/ci/docker/windows_vs_2019
@@ -0,0 +1,111 @@
+# escape=`
+
+# We used to use the visual studio container, but it's too outdated now
+FROM cirrusci/windowsservercore:2019
+
+SHELL ["powershell", "-NoLogo", "-NoProfile", "-Command"]
+
+
+# Install commandline debugger and log all crashes to c:\cirrus\crashlog.txt
+#
+# Done manually as doing this via chocolatey / the installer directly, ends up
+# with a lot of unnecessary chaff, making the layer unnecessarily large.
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    `
+    setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m ; `
+    `
+    curl.exe -sSL -o 'windsdksetup.exe' https://download.microsoft.com/download/9/7/9/97982c1d-d687-41be-9dd3-6d01e52ceb68/windowssdk/winsdksetup.exe ; `
+    echo 'starting sdk installation (for debugger)' ; `
+    Start-Process -Wait -FilePath ".\windsdksetup.exe" `
+      -ArgumentList '/Features OptionId.WindowsDesktopDebuggers /layout c:\t\sdk /quiet /norestart /log c:\t\sdk.log' `
+      ; `
+    `
+    Start-Process -Wait -FilePath msiexec.exe `
+      -ArgumentList '/a \"C:\t\sdk\Installers\X64 Debuggers And Tools-x64_en-us.msi\" /qb /log install2.log' `
+    ; `
+    C:\Windows` Kits\10\Debuggers\x64\cdb.exe -version ; `
+    `
+    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Debugger' -Value '\"C:\Windows Kits\10\Debuggers\x64\cdb.exe\" -p %ld -e %ld -g -kqm -c \".lines -e; .symfix+ ;.logappend c:\cirrus\crashlog.txt ; !peb; ~*kP ; .logclose ; q \"' ; `
+    New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Auto' -Value 1 -PropertyType DWord ; `
+    Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse
+
+
+# Install perl, python, flex and bison.
+#
+# Done manually as choco takes a lot longer. I think it's download issues with
+# powershell's download stuff? That's wy curl.exe is directly used here at least...
+#
+# Using perl 5.26.3.1 for now, as newer versions don't currently work correctly
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    `
+    echo 'adding to path, before setup below, so changes are not overwritten' ; `
+    setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m ; `
+    `
+    curl.exe -sSL -o perl.zip `
+        https://strawberryperl.com/download/5.26.3.1/strawberry-perl-5.26.3.1-64bit-portable.zip ; `
+    echo 'installing perl' ; `
+    7z.exe x .\perl.zip -xr!c -oc:\strawberry ; `
+    `
+    curl.exe -sSL -o python.exe https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe ; `
+    echo 'installing python' ; `
+    Start-Process -Wait -FilePath ".\python.exe" `
+      -ArgumentList `
+        '/quiet', 'SimpleInstall=1', 'PrependPath=1', 'CompileAll=1', `
+        'TargetDir=c:\python\', 'InstallAllUsers=1', 'Shortcuts=0', `
+        'Include_docs=0', 'Include_tcltk=0', 'Include_tests=0' `
+      ; `
+    `
+    curl.exe -sSL -o winflexbison.zip `
+        https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip ; `
+    echo 'installing winflexbison' ; `
+    7z.exe x .\winflexbison.zip -oc:\winflexbison ; `
+    Rename-Item -Path c:\winflexbison\win_flex.exe c:\winflexbison\flex.exe ; `
+    Rename-Item -Path c:\winflexbison\win_bison.exe c:\winflexbison\bison.exe ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse
+
+
+# Install openssl
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    `
+    curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; `
+    echo 'staring openssl installation' ; `
+    Start-Process -Wait -FilePath ".\openssl-setup.exe" `
+      -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse
+
+
+# Install visual studio
+#
+# Adding VS path to vcvarsall.bat so user of container doesn't need to know the full path
+RUN `
+    mkdir c:\t ; `
+    cd c:\t ; `
+    setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m ; `
+    `
+    curl.exe -sSL -o c:\t\vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe ; `
+    echo 'starting visual studio installation' ; `
+    Start-Process -Wait `
+        -FilePath c:\t\vs_buildtools.exe `
+        -ArgumentList `
+          '--quiet', '--wait', '--norestart', '--nocache', `
+          '--installPath', 'c:\BuildTools', `
+          '--add', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', `
+          '--add', 'Microsoft.VisualStudio.Component.Windows10SDK.20348'  ; `
+    `
+    cd c:\ ; `
+    Remove-Item C:\t -Force -Recurse ; `
+    Remove-Item -Force -Recurse ${Env:TEMP}\*; `
+    Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\"
diff --git a/ci/freebsd_gcp_repartition.sh b/ci/freebsd_gcp_repartition.sh
new file mode 100755
index 00000000000..2d5e1738998
--- /dev/null
+++ b/ci/freebsd_gcp_repartition.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+set -e
+set -x
+
+# The default filesystem on freebsd gcp images is very slow to run tests on,
+# due to its 32KB block size
+#
+# XXX: It'd probably better to fix this in the image, using something like
+# https://people.freebsd.org/~lidl/blog/re-root.html
+
+# fix backup partition table after resize
+gpart recover da0
+gpart show da0
+# kill swap, so we can delete a partition
+swapoff -a || true
+# (apparently we can only have 4!?)
+gpart delete -i 3 da0
+gpart add -t freebsd-ufs -l data8k -a 4096 da0
+gpart show da0
+newfs -U -b 8192 /dev/da0p3
+
+# Migrate working directory
+du -hs $CIRRUS_WORKING_DIR
+mv $CIRRUS_WORKING_DIR $CIRRUS_WORKING_DIR.orig
+mkdir $CIRRUS_WORKING_DIR
+mount -o noatime /dev/da0p3 $CIRRUS_WORKING_DIR
+cp -r $CIRRUS_WORKING_DIR.orig/* $CIRRUS_WORKING_DIR/
diff --git a/ci/pg_ci_base.conf b/ci/pg_ci_base.conf
new file mode 100644
index 00000000000..637e3cfb343
--- /dev/null
+++ b/ci/pg_ci_base.conf
@@ -0,0 +1,12 @@
+# Tends to produce too many core files, taking a long time
+restart_after_crash = false
+
+# So that tests using the "manually" started postgres on windows can use
+# prepared statements
+max_prepared_transactions=10
+
+# Settings that make logs more useful
+log_line_prefix='%m [%p][%b][%v:%x] '
+log_checkpoints = true
+log_connections = true
+log_disconnections = true
diff --git a/ci/windows_build_config.pl b/ci/windows_build_config.pl
new file mode 100644
index 00000000000..ba82b13d69a
--- /dev/null
+++ b/ci/windows_build_config.pl
@@ -0,0 +1,13 @@
+use strict;
+use warnings;
+
+our $config;
+
+$config->{"tap_tests"} = 1;
+$config->{"asserts"} = 1;
+
+$config->{"openssl"} = "c:/openssl/1.1.1l/";
+$config->{"perl"} = "c:/strawberry/perl/";
+$config->{"python"} = "c:/python/";
+
+1;
-- 
2.23.0.385.gbc12974a89

v5-0003-plpython-Drop-support-python2.patchtext/x-diff; charset=us-asciiDownload
From 96cb64239dcee91060a038bbad47047bd8b1b1c3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 3 Oct 2021 10:56:21 -0700
Subject: [PATCH v5 03/16] plpython: Drop support python2.

Author:
Reviewed-By:
Discussion: https://postgr.es/m/20211031184548.g4sxfe47n2kyi55r@alap3.anarazel.de
Backpatch:
---
 .cirrus.yml                                   |    3 +-
 config/python.m4                              |    4 +-
 configure                                     |    4 +-
 contrib/hstore_plpython/Makefile              |   10 +-
 .../expected/hstore_plpython.out              |   22 +-
 .../hstore_plpython2u--1.0.sql                |   19 -
 .../hstore_plpython/hstore_plpython2u.control |    6 -
 .../hstore_plpython/hstore_plpythonu--1.0.sql |   19 -
 .../hstore_plpython/hstore_plpythonu.control  |    6 -
 .../hstore_plpython/sql/hstore_plpython.sql   |   18 +-
 contrib/jsonb_plpython/Makefile               |   11 +-
 .../expected/jsonb_plpython.out               |   32 +-
 .../jsonb_plpython/jsonb_plpython2u--1.0.sql  |   19 -
 .../jsonb_plpython/jsonb_plpython2u.control   |    6 -
 .../jsonb_plpython/jsonb_plpythonu--1.0.sql   |   19 -
 .../jsonb_plpython/jsonb_plpythonu.control    |    6 -
 contrib/jsonb_plpython/sql/jsonb_plpython.sql |   30 +-
 contrib/ltree_plpython/Makefile               |   10 +-
 .../expected/ltree_plpython.out               |   10 +-
 .../ltree_plpython/ltree_plpython2u--1.0.sql  |   12 -
 .../ltree_plpython/ltree_plpython2u.control   |    6 -
 .../ltree_plpython/ltree_plpythonu--1.0.sql   |   12 -
 .../ltree_plpython/ltree_plpythonu.control    |    6 -
 contrib/ltree_plpython/sql/ltree_plpython.sql |    8 +-
 src/pl/plpython/Makefile                      |   14 -
 src/pl/plpython/expected/plpython_call.out    |   12 +-
 .../plpython/expected/plpython_composite.out  |   32 +-
 src/pl/plpython/expected/plpython_do.out      |    8 +-
 src/pl/plpython/expected/plpython_drop.out    |    3 +-
 src/pl/plpython/expected/plpython_ereport.out |   22 +-
 src/pl/plpython/expected/plpython_error.out   |   52 +-
 src/pl/plpython/expected/plpython_error_5.out |  447 --------
 src/pl/plpython/expected/plpython_global.out  |    6 +-
 src/pl/plpython/expected/plpython_import.out  |    8 +-
 src/pl/plpython/expected/plpython_newline.out |    6 +-
 src/pl/plpython/expected/plpython_params.out  |    8 +-
 src/pl/plpython/expected/plpython_quote.out   |    2 +-
 src/pl/plpython/expected/plpython_record.out  |   18 +-
 src/pl/plpython/expected/plpython_setof.out   |   18 +-
 src/pl/plpython/expected/plpython_spi.out     |   48 +-
 .../expected/plpython_subtransaction.out      |   38 +-
 src/pl/plpython/expected/plpython_test.out    |   12 +-
 .../expected/plpython_transaction.out         |   24 +-
 src/pl/plpython/expected/plpython_trigger.out |   46 +-
 src/pl/plpython/expected/plpython_types.out   |  230 ++--
 src/pl/plpython/expected/plpython_types_3.out | 1009 -----------------
 src/pl/plpython/expected/plpython_unicode.out |   16 +-
 src/pl/plpython/expected/plpython_void.out    |    6 +-
 src/pl/plpython/plpy_cursorobject.c           |    2 +-
 src/pl/plpython/plpy_main.c                   |   55 +-
 src/pl/plpython/plpy_plpymodule.c             |   16 -
 src/pl/plpython/plpy_plpymodule.h             |    2 -
 src/pl/plpython/plpy_resultobject.c           |    8 -
 src/pl/plpython/plpy_typeio.c                 |    8 -
 src/pl/plpython/plpy_util.c                   |    3 -
 src/pl/plpython/plpy_util.h                   |    2 -
 src/pl/plpython/plpython.h                    |   13 +-
 src/pl/plpython/plpython2u--1.0.sql           |   17 -
 src/pl/plpython/plpython2u.control            |    7 -
 src/pl/plpython/plpythonu--1.0.sql            |   17 -
 src/pl/plpython/plpythonu.control             |    7 -
 src/pl/plpython/regress-python3-mangle.mk     |   38 -
 src/pl/plpython/sql/plpython_call.sql         |   12 +-
 src/pl/plpython/sql/plpython_composite.sql    |   32 +-
 src/pl/plpython/sql/plpython_do.sql           |    6 +-
 src/pl/plpython/sql/plpython_drop.sql         |    4 +-
 src/pl/plpython/sql/plpython_ereport.sql      |   22 +-
 src/pl/plpython/sql/plpython_error.sql        |   48 +-
 src/pl/plpython/sql/plpython_global.sql       |    6 +-
 src/pl/plpython/sql/plpython_import.sql       |    8 +-
 src/pl/plpython/sql/plpython_newline.sql      |    6 +-
 src/pl/plpython/sql/plpython_params.sql       |    8 +-
 src/pl/plpython/sql/plpython_quote.sql        |    2 +-
 src/pl/plpython/sql/plpython_record.sql       |   18 +-
 src/pl/plpython/sql/plpython_setof.sql        |   18 +-
 src/pl/plpython/sql/plpython_spi.sql          |   48 +-
 .../plpython/sql/plpython_subtransaction.sql  |   38 +-
 src/pl/plpython/sql/plpython_test.sql         |   12 +-
 src/pl/plpython/sql/plpython_transaction.sql  |   22 +-
 src/pl/plpython/sql/plpython_trigger.sql      |   46 +-
 src/pl/plpython/sql/plpython_types.sql        |  106 +-
 src/pl/plpython/sql/plpython_unicode.sql      |   16 +-
 src/pl/plpython/sql/plpython_void.sql         |    6 +-
 83 files changed, 629 insertions(+), 2433 deletions(-)
 delete mode 100644 contrib/hstore_plpython/hstore_plpython2u--1.0.sql
 delete mode 100644 contrib/hstore_plpython/hstore_plpython2u.control
 delete mode 100644 contrib/hstore_plpython/hstore_plpythonu--1.0.sql
 delete mode 100644 contrib/hstore_plpython/hstore_plpythonu.control
 delete mode 100644 contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql
 delete mode 100644 contrib/jsonb_plpython/jsonb_plpython2u.control
 delete mode 100644 contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql
 delete mode 100644 contrib/jsonb_plpython/jsonb_plpythonu.control
 delete mode 100644 contrib/ltree_plpython/ltree_plpython2u--1.0.sql
 delete mode 100644 contrib/ltree_plpython/ltree_plpython2u.control
 delete mode 100644 contrib/ltree_plpython/ltree_plpythonu--1.0.sql
 delete mode 100644 contrib/ltree_plpython/ltree_plpythonu.control
 delete mode 100644 src/pl/plpython/expected/plpython_error_5.out
 delete mode 100644 src/pl/plpython/expected/plpython_types_3.out
 delete mode 100644 src/pl/plpython/plpython2u--1.0.sql
 delete mode 100644 src/pl/plpython/plpython2u.control
 delete mode 100644 src/pl/plpython/plpythonu--1.0.sql
 delete mode 100644 src/pl/plpython/plpythonu.control
 delete mode 100644 src/pl/plpython/regress-python3-mangle.mk

diff --git a/.cirrus.yml b/.cirrus.yml
index f75bdce6dec..2bb6f4a14d7 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -240,7 +240,8 @@ task:
       --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \
       --with-uuid=e2fs \
       \
-      CC="ccache gcc" CFLAGS="-O0 -ggdb"
+      CC="ccache gcc" CFLAGS="-O0 -ggdb" \
+      PYTHON=python3
   build_script:
     - gmake -s -j12 && gmake -s -j12 -C contrib
   upload_caches:
diff --git a/config/python.m4 b/config/python.m4
index d41aeb2876a..f51d23c3d43 100644
--- a/config/python.m4
+++ b/config/python.m4
@@ -37,8 +37,8 @@ python_majorversion=`echo "$python_fullversion" | sed '[s/^\([0-9]*\).*/\1/]'`
 python_minorversion=`echo "$python_fullversion" | sed '[s/^[0-9]*\.\([0-9]*\).*/\1/]'`
 python_version=`echo "$python_fullversion" | sed '[s/^\([0-9]*\.[0-9]*\).*/\1/]'`
 # Reject unsupported Python versions as soon as practical.
-if test "$python_majorversion" -lt 3 -a "$python_minorversion" -lt 6; then
-  AC_MSG_ERROR([Python version $python_version is too old (version 2.6 or later is required)])
+if test "$python_majorversion" -lt 3; then
+  AC_MSG_ERROR([Python version $python_version is too old (version 3 or later is required)])
 fi
 
 AC_MSG_CHECKING([for Python distutils module])
diff --git a/configure b/configure
index 4ffefe46552..1b5fd12a432 100755
--- a/configure
+++ b/configure
@@ -10123,8 +10123,8 @@ python_majorversion=`echo "$python_fullversion" | sed 's/^\([0-9]*\).*/\1/'`
 python_minorversion=`echo "$python_fullversion" | sed 's/^[0-9]*\.\([0-9]*\).*/\1/'`
 python_version=`echo "$python_fullversion" | sed 's/^\([0-9]*\.[0-9]*\).*/\1/'`
 # Reject unsupported Python versions as soon as practical.
-if test "$python_majorversion" -lt 3 -a "$python_minorversion" -lt 6; then
-  as_fn_error $? "Python version $python_version is too old (version 2.6 or later is required)" "$LINENO" 5
+if test "$python_majorversion" -lt 3; then
+  as_fn_error $? "Python version $python_version is too old (version 3 or later is required)" "$LINENO" 5
 fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python distutils module" >&5
diff --git a/contrib/hstore_plpython/Makefile b/contrib/hstore_plpython/Makefile
index 6af097ae68b..9d88cda1d0f 100644
--- a/contrib/hstore_plpython/Makefile
+++ b/contrib/hstore_plpython/Makefile
@@ -6,11 +6,10 @@ OBJS = \
 	hstore_plpython.o
 PGFILEDESC = "hstore_plpython - hstore transform for plpython"
 
-EXTENSION = hstore_plpythonu hstore_plpython2u hstore_plpython3u
-DATA = hstore_plpythonu--1.0.sql hstore_plpython2u--1.0.sql hstore_plpython3u--1.0.sql
+EXTENSION = hstore_plpython3u
+DATA = hstore_plpython3u--1.0.sql
 
 REGRESS = hstore_plpython
-REGRESS_PLPYTHON3_MANGLE := $(REGRESS)
 
 PG_CPPFLAGS = $(python_includespec) -DPLPYTHON_LIBNAME='"plpython$(python_majorversion)"'
 
@@ -37,9 +36,4 @@ SHLIB_LINK += $(python_libspec) $(python_additional_libs)
 endif
 
 REGRESS_OPTS += --load-extension=hstore
-ifeq ($(python_majorversion),2)
-REGRESS_OPTS += --load-extension=plpythonu --load-extension=hstore_plpythonu
-endif
 EXTRA_INSTALL += contrib/hstore
-
-include $(top_srcdir)/src/pl/plpython/regress-python3-mangle.mk
diff --git a/contrib/hstore_plpython/expected/hstore_plpython.out b/contrib/hstore_plpython/expected/hstore_plpython.out
index ecf1dd61bc1..bf238701fec 100644
--- a/contrib/hstore_plpython/expected/hstore_plpython.out
+++ b/contrib/hstore_plpython/expected/hstore_plpython.out
@@ -1,8 +1,8 @@
-CREATE EXTENSION hstore_plpython2u CASCADE;
-NOTICE:  installing required extension "plpython2u"
+CREATE EXTENSION hstore_plpython3u CASCADE;
+NOTICE:  installing required extension "plpython3u"
 -- test hstore -> python
 CREATE FUNCTION test1(val hstore) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert isinstance(val, dict)
@@ -18,7 +18,7 @@ INFO:  [('aa', 'bb'), ('cc', None)]
 
 -- the same with the versioned language name
 CREATE FUNCTION test1n(val hstore) RETURNS int
-LANGUAGE plpython2u
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert isinstance(val, dict)
@@ -34,7 +34,7 @@ INFO:  [('aa', 'bb'), ('cc', None)]
 
 -- test hstore[] -> python
 CREATE FUNCTION test1arr(val hstore[]) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert(val == [{'aa': 'bb', 'cc': None}, {'dd': 'ee'}])
@@ -48,7 +48,7 @@ SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
 
 -- test python -> hstore
 CREATE FUNCTION test2(a int, b text) RETURNS hstore
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 val = {'a': a, 'b': b, 'c': None}
@@ -65,14 +65,14 @@ SELECT test2(1, 'boo');
 CREATE OR REPLACE FUNCTION public.test2(a integer, b text)
  RETURNS hstore
  TRANSFORM FOR TYPE hstore
- LANGUAGE plpythonu
+ LANGUAGE plpython3u
 AS $function$
 val = {'a': a, 'b': b, 'c': None}
 return val
 $function$
 -- test python -> hstore[]
 CREATE FUNCTION test2arr() RETURNS hstore[]
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 val = [{'a': 1, 'b': 'boo', 'c': None}, {'d': 2}]
@@ -87,7 +87,7 @@ SELECT test2arr();
 -- test python -> domain over hstore
 CREATE DOMAIN hstore_foo AS hstore CHECK(VALUE ? 'foo');
 CREATE FUNCTION test2dom(fn text) RETURNS hstore_foo
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 return {'a': 1, fn: 'boo', 'c': None}
@@ -104,7 +104,7 @@ CONTEXT:  while creating return value
 PL/Python function "test2dom"
 -- test as part of prepare/execute
 CREATE FUNCTION test3() RETURNS void
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 rv = plpy.execute("SELECT 'aa=>bb, cc=>NULL'::hstore AS col1")
@@ -131,7 +131,7 @@ SELECT * FROM test1;
 (1 row)
 
 CREATE FUNCTION test4() RETURNS trigger
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert(TD["new"] == {'a': 1, 'b': {'aa': 'bb', 'cc': None}})
diff --git a/contrib/hstore_plpython/hstore_plpython2u--1.0.sql b/contrib/hstore_plpython/hstore_plpython2u--1.0.sql
deleted file mode 100644
index 800765f3f0c..00000000000
--- a/contrib/hstore_plpython/hstore_plpython2u--1.0.sql
+++ /dev/null
@@ -1,19 +0,0 @@
-/* contrib/hstore_plpython/hstore_plpython2u--1.0.sql */
-
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION hstore_plpython2u" to load this file. \quit
-
-CREATE FUNCTION hstore_to_plpython2(val internal) RETURNS internal
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME', 'hstore_to_plpython';
-
-CREATE FUNCTION plpython2_to_hstore(val internal) RETURNS hstore
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME', 'plpython_to_hstore';
-
-CREATE TRANSFORM FOR hstore LANGUAGE plpython2u (
-    FROM SQL WITH FUNCTION hstore_to_plpython2(internal),
-    TO SQL WITH FUNCTION plpython2_to_hstore(internal)
-);
-
-COMMENT ON TRANSFORM FOR hstore LANGUAGE plpython2u IS 'transform between hstore and Python dict';
diff --git a/contrib/hstore_plpython/hstore_plpython2u.control b/contrib/hstore_plpython/hstore_plpython2u.control
deleted file mode 100644
index ed905671123..00000000000
--- a/contrib/hstore_plpython/hstore_plpython2u.control
+++ /dev/null
@@ -1,6 +0,0 @@
-# hstore_plpython2u extension
-comment = 'transform between hstore and plpython2u'
-default_version = '1.0'
-module_pathname = '$libdir/hstore_plpython2'
-relocatable = true
-requires = 'hstore,plpython2u'
diff --git a/contrib/hstore_plpython/hstore_plpythonu--1.0.sql b/contrib/hstore_plpython/hstore_plpythonu--1.0.sql
deleted file mode 100644
index 52832912abc..00000000000
--- a/contrib/hstore_plpython/hstore_plpythonu--1.0.sql
+++ /dev/null
@@ -1,19 +0,0 @@
-/* contrib/hstore_plpython/hstore_plpythonu--1.0.sql */
-
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION hstore_plpythonu" to load this file. \quit
-
-CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME';
-
-CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME';
-
-CREATE TRANSFORM FOR hstore LANGUAGE plpythonu (
-    FROM SQL WITH FUNCTION hstore_to_plpython(internal),
-    TO SQL WITH FUNCTION plpython_to_hstore(internal)
-);
-
-COMMENT ON TRANSFORM FOR hstore LANGUAGE plpythonu IS 'transform between hstore and Python dict';
diff --git a/contrib/hstore_plpython/hstore_plpythonu.control b/contrib/hstore_plpython/hstore_plpythonu.control
deleted file mode 100644
index 8e9b35e43bf..00000000000
--- a/contrib/hstore_plpython/hstore_plpythonu.control
+++ /dev/null
@@ -1,6 +0,0 @@
-# hstore_plpythonu extension
-comment = 'transform between hstore and plpythonu'
-default_version = '1.0'
-module_pathname = '$libdir/hstore_plpython2'
-relocatable = true
-requires = 'hstore,plpythonu'
diff --git a/contrib/hstore_plpython/sql/hstore_plpython.sql b/contrib/hstore_plpython/sql/hstore_plpython.sql
index b6d98b7dd53..a9cfbbe13e2 100644
--- a/contrib/hstore_plpython/sql/hstore_plpython.sql
+++ b/contrib/hstore_plpython/sql/hstore_plpython.sql
@@ -1,9 +1,9 @@
-CREATE EXTENSION hstore_plpython2u CASCADE;
+CREATE EXTENSION hstore_plpython3u CASCADE;
 
 
 -- test hstore -> python
 CREATE FUNCTION test1(val hstore) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert isinstance(val, dict)
@@ -16,7 +16,7 @@ SELECT test1('aa=>bb, cc=>NULL'::hstore);
 
 -- the same with the versioned language name
 CREATE FUNCTION test1n(val hstore) RETURNS int
-LANGUAGE plpython2u
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert isinstance(val, dict)
@@ -29,7 +29,7 @@ SELECT test1n('aa=>bb, cc=>NULL'::hstore);
 
 -- test hstore[] -> python
 CREATE FUNCTION test1arr(val hstore[]) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert(val == [{'aa': 'bb', 'cc': None}, {'dd': 'ee'}])
@@ -41,7 +41,7 @@ SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
 
 -- test python -> hstore
 CREATE FUNCTION test2(a int, b text) RETURNS hstore
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 val = {'a': a, 'b': b, 'c': None}
@@ -56,7 +56,7 @@ SELECT test2(1, 'boo');
 
 -- test python -> hstore[]
 CREATE FUNCTION test2arr() RETURNS hstore[]
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 val = [{'a': 1, 'b': 'boo', 'c': None}, {'d': 2}]
@@ -70,7 +70,7 @@ SELECT test2arr();
 CREATE DOMAIN hstore_foo AS hstore CHECK(VALUE ? 'foo');
 
 CREATE FUNCTION test2dom(fn text) RETURNS hstore_foo
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 return {'a': 1, fn: 'boo', 'c': None}
@@ -82,7 +82,7 @@ SELECT test2dom('bar');  -- fail
 
 -- test as part of prepare/execute
 CREATE FUNCTION test3() RETURNS void
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 rv = plpy.execute("SELECT 'aa=>bb, cc=>NULL'::hstore AS col1")
@@ -103,7 +103,7 @@ INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
 SELECT * FROM test1;
 
 CREATE FUNCTION test4() RETURNS trigger
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE hstore
 AS $$
 assert(TD["new"] == {'a': 1, 'b': {'aa': 'bb', 'cc': None}})
diff --git a/contrib/jsonb_plpython/Makefile b/contrib/jsonb_plpython/Makefile
index ca767418943..6333ea0bbaf 100644
--- a/contrib/jsonb_plpython/Makefile
+++ b/contrib/jsonb_plpython/Makefile
@@ -8,11 +8,10 @@ PGFILEDESC = "jsonb_plpython - transform between jsonb and plpythonu"
 
 PG_CPPFLAGS = -I$(top_srcdir)/src/pl/plpython $(python_includespec) -DPLPYTHON_LIBNAME='"plpython$(python_majorversion)"'
 
-EXTENSION = jsonb_plpythonu jsonb_plpython2u jsonb_plpython3u
-DATA = jsonb_plpythonu--1.0.sql jsonb_plpython2u--1.0.sql jsonb_plpython3u--1.0.sql
+EXTENSION = jsonb_plpython3u
+DATA = jsonb_plpython3u--1.0.sql
 
 REGRESS = jsonb_plpython
-REGRESS_PLPYTHON3_MANGLE := $(REGRESS)
 
 ifdef USE_PGXS
 PG_CONFIG = pg_config
@@ -33,9 +32,3 @@ else
 rpathdir = $(python_libdir)
 SHLIB_LINK += $(python_libspec) $(python_additional_libs)
 endif
-
-ifeq ($(python_majorversion),2)
-REGRESS_OPTS += --load-extension=plpythonu --load-extension=jsonb_plpythonu
-endif
-
-include $(top_srcdir)/src/pl/plpython/regress-python3-mangle.mk
diff --git a/contrib/jsonb_plpython/expected/jsonb_plpython.out b/contrib/jsonb_plpython/expected/jsonb_plpython.out
index b491fe9cc68..cac963de69c 100644
--- a/contrib/jsonb_plpython/expected/jsonb_plpython.out
+++ b/contrib/jsonb_plpython/expected/jsonb_plpython.out
@@ -1,8 +1,8 @@
-CREATE EXTENSION jsonb_plpython2u CASCADE;
-NOTICE:  installing required extension "plpython2u"
+CREATE EXTENSION jsonb_plpython3u CASCADE;
+NOTICE:  installing required extension "plpython3u"
 -- test jsonb -> python dict
 CREATE FUNCTION test1(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, dict)
@@ -18,7 +18,7 @@ SELECT test1('{"a": 1, "c": "NULL"}'::jsonb);
 -- test jsonb -> python dict
 -- complex dict with dicts as value
 CREATE FUNCTION test1complex(val jsonb) RETURNS int
-LANGUAGE plpython2u
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, dict)
@@ -34,7 +34,7 @@ SELECT test1complex('{"d": {"d": 1}}'::jsonb);
 -- test jsonb[] -> python dict
 -- dict with array as value
 CREATE FUNCTION test1arr(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, dict)
@@ -50,7 +50,7 @@ SELECT test1arr('{"d":[12, 1]}'::jsonb);
 -- test jsonb[] -> python list
 -- simple list
 CREATE FUNCTION test2arr(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, list)
@@ -66,7 +66,7 @@ SELECT test2arr('[12, 1]'::jsonb);
 -- test jsonb[] -> python list
 -- array of dicts
 CREATE FUNCTION test3arr(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, list)
@@ -81,7 +81,7 @@ SELECT test3arr('[{"a": 1, "b": 2}, {"c": 3,"d": 4}]'::jsonb);
 
 -- test jsonb int -> python int
 CREATE FUNCTION test1int(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert(val == 1)
@@ -95,7 +95,7 @@ SELECT test1int('1'::jsonb);
 
 -- test jsonb string -> python string
 CREATE FUNCTION test1string(val jsonb) RETURNS text
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert(val == "a")
@@ -109,7 +109,7 @@ SELECT test1string('"a"'::jsonb);
 
 -- test jsonb null -> python None
 CREATE FUNCTION test1null(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert(val == None)
@@ -123,7 +123,7 @@ SELECT test1null('null'::jsonb);
 
 -- test python -> jsonb
 CREATE FUNCTION roundtrip(val jsonb) RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 as $$
 return val
@@ -238,7 +238,7 @@ SELECT roundtrip('["string", "string2"]'::jsonb);
 
 -- complex numbers -> jsonb
 CREATE FUNCTION testComplexNumbers() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = 1 + 2j
@@ -250,7 +250,7 @@ CONTEXT:  while creating return value
 PL/Python function "testcomplexnumbers"
 -- range -> jsonb
 CREATE FUNCTION testRange() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = range(3)
@@ -264,7 +264,7 @@ SELECT testRange();
 
 -- 0xff -> jsonb
 CREATE FUNCTION testDecimal() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = 0xff
@@ -278,7 +278,7 @@ SELECT testDecimal();
 
 -- tuple -> jsonb
 CREATE FUNCTION testTuple() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = (1, 'String', None)
@@ -292,7 +292,7 @@ SELECT testTuple();
 
 -- interesting dict -> jsonb
 CREATE FUNCTION test_dict1() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = {"a": 1, None: 2, 33: 3}
diff --git a/contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql b/contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql
deleted file mode 100644
index 2526d14ee19..00000000000
--- a/contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql
+++ /dev/null
@@ -1,19 +0,0 @@
-/* contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql */
-
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION jsonb_plpython2u" to load this file. \quit
-
-CREATE FUNCTION jsonb_to_plpython2(val internal) RETURNS internal
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME', 'jsonb_to_plpython';
-
-CREATE FUNCTION plpython2_to_jsonb(val internal) RETURNS jsonb
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME', 'plpython_to_jsonb';
-
-CREATE TRANSFORM FOR jsonb LANGUAGE plpython2u (
-    FROM SQL WITH FUNCTION jsonb_to_plpython2(internal),
-    TO SQL WITH FUNCTION plpython2_to_jsonb(internal)
-);
-
-COMMENT ON TRANSFORM FOR jsonb LANGUAGE plpython2u IS 'transform between jsonb and Python';
diff --git a/contrib/jsonb_plpython/jsonb_plpython2u.control b/contrib/jsonb_plpython/jsonb_plpython2u.control
deleted file mode 100644
index d26368316b6..00000000000
--- a/contrib/jsonb_plpython/jsonb_plpython2u.control
+++ /dev/null
@@ -1,6 +0,0 @@
-# jsonb_plpython2u extension
-comment = 'transform between jsonb and plpython2u'
-default_version = '1.0'
-module_pathname = '$libdir/jsonb_plpython2'
-relocatable = true
-requires = 'plpython2u'
diff --git a/contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql b/contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql
deleted file mode 100644
index 3fa89885a63..00000000000
--- a/contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql
+++ /dev/null
@@ -1,19 +0,0 @@
-/* contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql */
-
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION jsonb_plpythonu" to load this file. \quit
-
-CREATE FUNCTION jsonb_to_plpython(val internal) RETURNS internal
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME';
-
-CREATE FUNCTION plpython_to_jsonb(val internal) RETURNS jsonb
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME';
-
-CREATE TRANSFORM FOR jsonb LANGUAGE plpythonu (
-    FROM SQL WITH FUNCTION jsonb_to_plpython(internal),
-    TO SQL WITH FUNCTION plpython_to_jsonb(internal)
-);
-
-COMMENT ON TRANSFORM FOR jsonb LANGUAGE plpythonu IS 'transform between jsonb and Python';
diff --git a/contrib/jsonb_plpython/jsonb_plpythonu.control b/contrib/jsonb_plpython/jsonb_plpythonu.control
deleted file mode 100644
index 6f8fa4f184b..00000000000
--- a/contrib/jsonb_plpython/jsonb_plpythonu.control
+++ /dev/null
@@ -1,6 +0,0 @@
-# jsonb_plpythonu extension
-comment = 'transform between jsonb and plpythonu'
-default_version = '1.0'
-module_pathname = '$libdir/jsonb_plpython2'
-relocatable = true
-requires = 'plpythonu'
diff --git a/contrib/jsonb_plpython/sql/jsonb_plpython.sql b/contrib/jsonb_plpython/sql/jsonb_plpython.sql
index 2ee1bca0a98..29dc33279a0 100644
--- a/contrib/jsonb_plpython/sql/jsonb_plpython.sql
+++ b/contrib/jsonb_plpython/sql/jsonb_plpython.sql
@@ -1,8 +1,8 @@
-CREATE EXTENSION jsonb_plpython2u CASCADE;
+CREATE EXTENSION jsonb_plpython3u CASCADE;
 
 -- test jsonb -> python dict
 CREATE FUNCTION test1(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, dict)
@@ -15,7 +15,7 @@ SELECT test1('{"a": 1, "c": "NULL"}'::jsonb);
 -- test jsonb -> python dict
 -- complex dict with dicts as value
 CREATE FUNCTION test1complex(val jsonb) RETURNS int
-LANGUAGE plpython2u
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, dict)
@@ -29,7 +29,7 @@ SELECT test1complex('{"d": {"d": 1}}'::jsonb);
 -- test jsonb[] -> python dict
 -- dict with array as value
 CREATE FUNCTION test1arr(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, dict)
@@ -42,7 +42,7 @@ SELECT test1arr('{"d":[12, 1]}'::jsonb);
 -- test jsonb[] -> python list
 -- simple list
 CREATE FUNCTION test2arr(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, list)
@@ -55,7 +55,7 @@ SELECT test2arr('[12, 1]'::jsonb);
 -- test jsonb[] -> python list
 -- array of dicts
 CREATE FUNCTION test3arr(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert isinstance(val, list)
@@ -67,7 +67,7 @@ SELECT test3arr('[{"a": 1, "b": 2}, {"c": 3,"d": 4}]'::jsonb);
 
 -- test jsonb int -> python int
 CREATE FUNCTION test1int(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert(val == 1)
@@ -78,7 +78,7 @@ SELECT test1int('1'::jsonb);
 
 -- test jsonb string -> python string
 CREATE FUNCTION test1string(val jsonb) RETURNS text
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert(val == "a")
@@ -89,7 +89,7 @@ SELECT test1string('"a"'::jsonb);
 
 -- test jsonb null -> python None
 CREATE FUNCTION test1null(val jsonb) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 assert(val == None)
@@ -100,7 +100,7 @@ SELECT test1null('null'::jsonb);
 
 -- test python -> jsonb
 CREATE FUNCTION roundtrip(val jsonb) RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 as $$
 return val
@@ -129,7 +129,7 @@ SELECT roundtrip('["string", "string2"]'::jsonb);
 
 -- complex numbers -> jsonb
 CREATE FUNCTION testComplexNumbers() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = 1 + 2j
@@ -140,7 +140,7 @@ SELECT testComplexNumbers();
 
 -- range -> jsonb
 CREATE FUNCTION testRange() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = range(3)
@@ -151,7 +151,7 @@ SELECT testRange();
 
 -- 0xff -> jsonb
 CREATE FUNCTION testDecimal() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = 0xff
@@ -162,7 +162,7 @@ SELECT testDecimal();
 
 -- tuple -> jsonb
 CREATE FUNCTION testTuple() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = (1, 'String', None)
@@ -173,7 +173,7 @@ SELECT testTuple();
 
 -- interesting dict -> jsonb
 CREATE FUNCTION test_dict1() RETURNS jsonb
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE jsonb
 AS $$
 x = {"a": 1, None: 2, 33: 3}
diff --git a/contrib/ltree_plpython/Makefile b/contrib/ltree_plpython/Makefile
index 12a01467721..406d2789c9c 100644
--- a/contrib/ltree_plpython/Makefile
+++ b/contrib/ltree_plpython/Makefile
@@ -6,11 +6,10 @@ OBJS = \
 	ltree_plpython.o
 PGFILEDESC = "ltree_plpython - ltree transform for plpython"
 
-EXTENSION = ltree_plpythonu ltree_plpython2u ltree_plpython3u
-DATA = ltree_plpythonu--1.0.sql ltree_plpython2u--1.0.sql ltree_plpython3u--1.0.sql
+EXTENSION = ltree_plpython3u
+DATA = ltree_plpython3u--1.0.sql
 
 REGRESS = ltree_plpython
-REGRESS_PLPYTHON3_MANGLE := $(REGRESS)
 
 PG_CPPFLAGS = $(python_includespec) -DPLPYTHON_LIBNAME='"plpython$(python_majorversion)"'
 
@@ -37,9 +36,4 @@ SHLIB_LINK += $(python_libspec) $(python_additional_libs)
 endif
 
 REGRESS_OPTS += --load-extension=ltree
-ifeq ($(python_majorversion),2)
-REGRESS_OPTS += --load-extension=plpythonu --load-extension=ltree_plpythonu
-endif
 EXTRA_INSTALL += contrib/ltree
-
-include $(top_srcdir)/src/pl/plpython/regress-python3-mangle.mk
diff --git a/contrib/ltree_plpython/expected/ltree_plpython.out b/contrib/ltree_plpython/expected/ltree_plpython.out
index f28897fee48..bd32541fdb3 100644
--- a/contrib/ltree_plpython/expected/ltree_plpython.out
+++ b/contrib/ltree_plpython/expected/ltree_plpython.out
@@ -1,7 +1,7 @@
-CREATE EXTENSION ltree_plpython2u CASCADE;
-NOTICE:  installing required extension "plpython2u"
+CREATE EXTENSION ltree_plpython3u CASCADE;
+NOTICE:  installing required extension "plpython3u"
 CREATE FUNCTION test1(val ltree) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE ltree
 AS $$
 plpy.info(repr(val))
@@ -15,7 +15,7 @@ INFO:  ['aa', 'bb', 'cc']
 (1 row)
 
 CREATE FUNCTION test1n(val ltree) RETURNS int
-LANGUAGE plpython2u
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE ltree
 AS $$
 plpy.info(repr(val))
@@ -29,7 +29,7 @@ INFO:  ['aa', 'bb', 'cc']
 (1 row)
 
 CREATE FUNCTION test2() RETURNS ltree
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE ltree
 AS $$
 return ['foo', 'bar', 'baz']
diff --git a/contrib/ltree_plpython/ltree_plpython2u--1.0.sql b/contrib/ltree_plpython/ltree_plpython2u--1.0.sql
deleted file mode 100644
index 5c4a7037013..00000000000
--- a/contrib/ltree_plpython/ltree_plpython2u--1.0.sql
+++ /dev/null
@@ -1,12 +0,0 @@
-/* contrib/ltree_plpython/ltree_plpython2u--1.0.sql */
-
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION ltree_plpython2u" to load this file. \quit
-
-CREATE FUNCTION ltree_to_plpython2(val internal) RETURNS internal
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME', 'ltree_to_plpython';
-
-CREATE TRANSFORM FOR ltree LANGUAGE plpython2u (
-    FROM SQL WITH FUNCTION ltree_to_plpython2(internal)
-);
diff --git a/contrib/ltree_plpython/ltree_plpython2u.control b/contrib/ltree_plpython/ltree_plpython2u.control
deleted file mode 100644
index bedfd0acbad..00000000000
--- a/contrib/ltree_plpython/ltree_plpython2u.control
+++ /dev/null
@@ -1,6 +0,0 @@
-# ltree_plpython2u extension
-comment = 'transform between ltree and plpython2u'
-default_version = '1.0'
-module_pathname = '$libdir/ltree_plpython2'
-relocatable = true
-requires = 'ltree,plpython2u'
diff --git a/contrib/ltree_plpython/ltree_plpythonu--1.0.sql b/contrib/ltree_plpython/ltree_plpythonu--1.0.sql
deleted file mode 100644
index ee93edf28b9..00000000000
--- a/contrib/ltree_plpython/ltree_plpythonu--1.0.sql
+++ /dev/null
@@ -1,12 +0,0 @@
-/* contrib/ltree_plpython/ltree_plpythonu--1.0.sql */
-
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION ltree_plpythonu" to load this file. \quit
-
-CREATE FUNCTION ltree_to_plpython(val internal) RETURNS internal
-LANGUAGE C STRICT IMMUTABLE
-AS 'MODULE_PATHNAME';
-
-CREATE TRANSFORM FOR ltree LANGUAGE plpythonu (
-    FROM SQL WITH FUNCTION ltree_to_plpython(internal)
-);
diff --git a/contrib/ltree_plpython/ltree_plpythonu.control b/contrib/ltree_plpython/ltree_plpythonu.control
deleted file mode 100644
index b03c89a2e6e..00000000000
--- a/contrib/ltree_plpython/ltree_plpythonu.control
+++ /dev/null
@@ -1,6 +0,0 @@
-# ltree_plpythonu extension
-comment = 'transform between ltree and plpythonu'
-default_version = '1.0'
-module_pathname = '$libdir/ltree_plpython2'
-relocatable = true
-requires = 'ltree,plpythonu'
diff --git a/contrib/ltree_plpython/sql/ltree_plpython.sql b/contrib/ltree_plpython/sql/ltree_plpython.sql
index 210f5428a5a..0b8d28399a6 100644
--- a/contrib/ltree_plpython/sql/ltree_plpython.sql
+++ b/contrib/ltree_plpython/sql/ltree_plpython.sql
@@ -1,8 +1,8 @@
-CREATE EXTENSION ltree_plpython2u CASCADE;
+CREATE EXTENSION ltree_plpython3u CASCADE;
 
 
 CREATE FUNCTION test1(val ltree) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE ltree
 AS $$
 plpy.info(repr(val))
@@ -13,7 +13,7 @@ SELECT test1('aa.bb.cc'::ltree);
 
 
 CREATE FUNCTION test1n(val ltree) RETURNS int
-LANGUAGE plpython2u
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE ltree
 AS $$
 plpy.info(repr(val))
@@ -24,7 +24,7 @@ SELECT test1n('aa.bb.cc'::ltree);
 
 
 CREATE FUNCTION test2() RETURNS ltree
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 TRANSFORM FOR TYPE ltree
 AS $$
 return ['foo', 'bar', 'baz']
diff --git a/src/pl/plpython/Makefile b/src/pl/plpython/Makefile
index 9e95285af89..a8feacdef06 100644
--- a/src/pl/plpython/Makefile
+++ b/src/pl/plpython/Makefile
@@ -35,9 +35,6 @@ OBJS = \
 	plpy_util.o
 
 DATA = $(NAME)u.control $(NAME)u--1.0.sql
-ifeq ($(python_majorversion),2)
-DATA += plpythonu.control plpythonu--1.0.sql
-endif
 
 # header files to install - it's not clear which of these might be needed
 # so install them all.
@@ -77,11 +74,6 @@ endif # win32
 SHLIB_LINK = $(python_libspec) $(python_additional_libs) $(filter -lintl,$(LIBS))
 
 REGRESS_OPTS = --dbname=$(PL_TESTDB)
-# Only load plpythonu with Python 2.  The test files themselves load
-# the versioned language plpython(2|3)u.
-ifeq ($(python_majorversion),2)
-REGRESS_OPTS += --load-extension=plpythonu
-endif
 
 REGRESS = \
 	plpython_schema \
@@ -108,8 +100,6 @@ REGRESS = \
 	plpython_transaction \
 	plpython_drop
 
-REGRESS_PLPYTHON3_MANGLE := $(REGRESS)
-
 include $(top_srcdir)/src/Makefile.shlib
 
 all: all-lib
@@ -127,7 +117,6 @@ uninstall: uninstall-lib uninstall-data
 install-data: installdirs
 	$(INSTALL_DATA) $(addprefix $(srcdir)/, $(DATA)) '$(DESTDIR)$(datadir)/extension/'
 	$(INSTALL_DATA) $(addprefix $(srcdir)/, $(INCS)) '$(DESTDIR)$(includedir_server)'
-	$(INSTALL_DATA) $(srcdir)/regress-python3-mangle.mk '$(DESTDIR)$(pgxsdir)/src/pl/plpython'
 
 uninstall-data:
 	rm -f $(addprefix '$(DESTDIR)$(datadir)/extension'/, $(notdir $(DATA)))
@@ -136,9 +125,6 @@ uninstall-data:
 .PHONY: install-data uninstall-data
 
 
-include $(srcdir)/regress-python3-mangle.mk
-
-
 check: submake-pg-regress
 	$(pg_regress_check) $(REGRESS_OPTS) $(REGRESS)
 
diff --git a/src/pl/plpython/expected/plpython_call.out b/src/pl/plpython/expected/plpython_call.out
index 55e1027246a..4c0690067a0 100644
--- a/src/pl/plpython/expected/plpython_call.out
+++ b/src/pl/plpython/expected/plpython_call.out
@@ -2,14 +2,14 @@
 -- Tests for procedures / CALL syntax
 --
 CREATE PROCEDURE test_proc1()
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 pass
 $$;
 CALL test_proc1();
 -- error: can't return non-None
 CREATE PROCEDURE test_proc2()
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 return 5
 $$;
@@ -18,7 +18,7 @@ ERROR:  PL/Python procedure did not return None
 CONTEXT:  PL/Python procedure "test_proc2"
 CREATE TABLE test1 (a int);
 CREATE PROCEDURE test_proc3(x int)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plpy.execute("INSERT INTO test1 VALUES (%s)" % x)
 $$;
@@ -31,7 +31,7 @@ SELECT * FROM test1;
 
 -- output arguments
 CREATE PROCEDURE test_proc5(INOUT a text)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 return [a + '+' + a]
 $$;
@@ -42,7 +42,7 @@ CALL test_proc5('abc');
 (1 row)
 
 CREATE PROCEDURE test_proc6(a int, INOUT b int, INOUT c int)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 return (b * a, c * a)
 $$;
@@ -54,7 +54,7 @@ CALL test_proc6(2, 3, 4);
 
 -- OUT parameters
 CREATE PROCEDURE test_proc9(IN a int, OUT b int)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plpy.notice("a: %s" % (a))
 return (a * 2,)
diff --git a/src/pl/plpython/expected/plpython_composite.out b/src/pl/plpython/expected/plpython_composite.out
index af801923343..bb101e07d53 100644
--- a/src/pl/plpython/expected/plpython_composite.out
+++ b/src/pl/plpython/expected/plpython_composite.out
@@ -1,6 +1,6 @@
 CREATE FUNCTION multiout_simple(OUT i integer, OUT j integer) AS $$
 return (1, 2)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT multiout_simple();
  multiout_simple 
 -----------------
@@ -27,7 +27,7 @@ SELECT (multiout_simple()).j + 3;
 
 CREATE FUNCTION multiout_simple_setof(n integer = 1, OUT integer, OUT integer) RETURNS SETOF record AS $$
 return [(1, 2)] * n
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT multiout_simple_setof();
  multiout_simple_setof 
 -----------------------
@@ -67,7 +67,7 @@ elif typ == 'obj':
     return type_record
 elif typ == 'str':
     return "('%s',%r)" % (first, second)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM multiout_record_as('dict', 'foo', 1, 'f');
  first | second 
 -------+--------
@@ -237,7 +237,7 @@ for i in range(n):
     power = 2 ** i
     length = plpy.execute("select length('%d')" % power)[0]['length']
     yield power, length
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM multiout_setof(3);
  power_of_2 | length 
 ------------+--------
@@ -260,7 +260,7 @@ CREATE FUNCTION multiout_return_table() RETURNS TABLE (x integer, y text) AS $$
 return [{'x': 4, 'y' :'four'},
         {'x': 7, 'y' :'seven'},
         {'x': 0, 'y' :'zero'}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM multiout_return_table();
  x |   y   
 ---+-------
@@ -273,7 +273,7 @@ CREATE FUNCTION multiout_array(OUT integer[], OUT text) RETURNS SETOF record AS
 yield [[1], 'a']
 yield [[1,2], 'b']
 yield [[1,2,3], None]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM multiout_array();
  column1 | column2 
 ---------+---------
@@ -284,11 +284,11 @@ SELECT * FROM multiout_array();
 
 CREATE FUNCTION singleout_composite(OUT type_record) AS $$
 return {'first': 1, 'second': 2}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION multiout_composite(OUT type_record) RETURNS SETOF type_record AS $$
 return [{'first': 1, 'second': 2},
        {'first': 3, 'second': 4	}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM singleout_composite();
  first | second 
 -------+--------
@@ -305,7 +305,7 @@ SELECT * FROM multiout_composite();
 -- composite OUT parameters in functions returning RECORD not supported yet
 CREATE FUNCTION multiout_composite(INOUT n integer, OUT type_record) AS $$
 return (n, (n * 2, n * 3))
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION multiout_table_type_setof(typ text, returnnull boolean, INOUT n integer, OUT table_record) RETURNS SETOF record AS $$
 if returnnull:
     d = None
@@ -323,7 +323,7 @@ elif typ == 'str':
     d = "(%r,%r)" % (n * 2, n * 3)
 for i in range(n):
     yield (i, d)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM multiout_composite(2);
  n | column2 
 ---+---------
@@ -438,7 +438,7 @@ CREATE TABLE changing (
 CREATE FUNCTION changing_test(OUT n integer, OUT changing) RETURNS SETOF record AS $$
 return [(1, {'i': 1, 'j': 2}),
         (1, (3, 4))]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM changing_test();
  n | column2 
 ---+---------
@@ -474,7 +474,7 @@ yield {'tab': [('first', 1), ('second', 2)],
 yield {'tab': [('first', 1), ('second', 2)],
       'typ': [{'first': 'third', 'second': 3},
               {'first': 'fourth', 'second': 4}]}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM composite_types_table();
             tab             |            typ             
 ----------------------------+----------------------------
@@ -486,7 +486,7 @@ SELECT * FROM composite_types_table();
 -- check what happens if the output record descriptor changes
 CREATE FUNCTION return_record(t text) RETURNS record AS $$
 return {'t': t, 'val': 10}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM return_record('abc') AS r(t text, val integer);
   t  | val 
 -----+-----
@@ -525,7 +525,7 @@ SELECT * FROM return_record('999') AS r(val text, t integer);
 
 CREATE FUNCTION return_record_2(t text) RETURNS record AS $$
 return {'v1':1,'v2':2,t:3}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM return_record_2('v3') AS (v3 int, v2 int, v1 int);
  v3 | v2 | v1 
 ----+----+----
@@ -572,7 +572,7 @@ SELECT * FROM return_record_2('v3') AS (v1 int, v2 int, v3 int);
 -- multi-dimensional array of composite types.
 CREATE FUNCTION composite_type_as_list()  RETURNS type_record[] AS $$
   return [[('first', 1), ('second', 1)], [('first', 2), ('second', 2)], [('first', 3), ('second', 3)]];
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM composite_type_as_list();
                                composite_type_as_list                               
 ------------------------------------------------------------------------------------
@@ -585,7 +585,7 @@ SELECT * FROM composite_type_as_list();
 -- on the issue.
 CREATE FUNCTION composite_type_as_list_broken()  RETURNS type_record[] AS $$
   return [['first', 1]];
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM composite_type_as_list_broken();
 ERROR:  malformed record literal: "first"
 DETAIL:  Missing left parenthesis.
diff --git a/src/pl/plpython/expected/plpython_do.out b/src/pl/plpython/expected/plpython_do.out
index e300530e031..d131a4c0ed6 100644
--- a/src/pl/plpython/expected/plpython_do.out
+++ b/src/pl/plpython/expected/plpython_do.out
@@ -1,8 +1,6 @@
-DO $$ plpy.notice("This is plpythonu.") $$ LANGUAGE plpythonu;
-NOTICE:  This is plpythonu.
-DO $$ plpy.notice("This is plpython2u.") $$ LANGUAGE plpython2u;
-NOTICE:  This is plpython2u.
-DO $$ raise Exception("error test") $$ LANGUAGE plpythonu;
+DO $$ plpy.notice("This is plpython3u.") $$ LANGUAGE plpython3u;
+NOTICE:  This is plpython3u.
+DO $$ raise Exception("error test") $$ LANGUAGE plpython3u;
 ERROR:  Exception: error test
 CONTEXT:  Traceback (most recent call last):
   PL/Python anonymous code block, line 1, in <module>
diff --git a/src/pl/plpython/expected/plpython_drop.out b/src/pl/plpython/expected/plpython_drop.out
index a0e3b5c4ef6..97bb54a55e7 100644
--- a/src/pl/plpython/expected/plpython_drop.out
+++ b/src/pl/plpython/expected/plpython_drop.out
@@ -2,5 +2,4 @@
 -- For paranoia's sake, don't leave an untrusted language sitting around
 --
 SET client_min_messages = WARNING;
-DROP EXTENSION plpythonu CASCADE;
-DROP EXTENSION IF EXISTS plpython2u CASCADE;
+DROP EXTENSION plpython3u CASCADE;
diff --git a/src/pl/plpython/expected/plpython_ereport.out b/src/pl/plpython/expected/plpython_ereport.out
index b73bfff5115..b38bb91e894 100644
--- a/src/pl/plpython/expected/plpython_ereport.out
+++ b/src/pl/plpython/expected/plpython_ereport.out
@@ -17,7 +17,7 @@ plpy.info('This is message text.',
 plpy.notice('notice', detail='some detail')
 plpy.warning('warning', detail='some detail')
 plpy.error('stop on error', detail='some detail', hint='some hint')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT elog_test();
 INFO:  info
 DETAIL:  some detail
@@ -38,42 +38,42 @@ CONTEXT:  Traceback (most recent call last):
   PL/Python function "elog_test", line 18, in <module>
     plpy.error('stop on error', detail='some detail', hint='some hint')
 PL/Python function "elog_test"
-DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpythonu;
+DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpython3u;
 INFO:  other types
 DETAIL:  (10, 20)
 DO $$
 import time;
 from datetime import date
 plpy.info('other types', detail=date(2016, 2, 26))
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 INFO:  other types
 DETAIL:  2016-02-26
 DO $$
 basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
 plpy.info('other types', detail=basket)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 INFO:  other types
 DETAIL:  ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
 -- should fail
-DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu;
+DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpython3u;
 ERROR:  ValueError: invalid SQLSTATE code
 CONTEXT:  Traceback (most recent call last):
   PL/Python anonymous code block, line 1, in <module>
     plpy.info('wrong sqlstate', sqlstate='54444A') 
 PL/Python anonymous code block
-DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu;
+DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpython3u;
 ERROR:  TypeError: 'blabla' is an invalid keyword argument for this function
 CONTEXT:  Traceback (most recent call last):
   PL/Python anonymous code block, line 1, in <module>
     plpy.info('unsupported argument', blabla='fooboo') 
 PL/Python anonymous code block
-DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu;
+DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpython3u;
 ERROR:  TypeError: argument 'message' given by name and position
 CONTEXT:  Traceback (most recent call last):
   PL/Python anonymous code block, line 1, in <module>
     plpy.info('first message', message='second message') 
 PL/Python anonymous code block
-DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu;
+DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpython3u;
 ERROR:  TypeError: argument 'message' given by name and position
 CONTEXT:  Traceback (most recent call last):
   PL/Python anonymous code block, line 1, in <module>
@@ -96,7 +96,7 @@ kwargs = {
 }
 # ignore None values
 plpy.error(**dict((k, v) for k, v in iter(kwargs.items()) if v))
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT raise_exception('hello', 'world');
 ERROR:  plpy.Error: hello
 DETAIL:  world
@@ -189,7 +189,7 @@ try:
 except Exception as e:
     plpy.info(e.spidata)
     raise e
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 INFO:  (119577128, None, 'some hint', None, 0, None, 'users_tab', None, 'user_type', None)
 ERROR:  plpy.SPIError: plpy.Error: my message
 HINT:  some hint
@@ -199,7 +199,7 @@ try:
 except Exception as e:
     plpy.info('sqlstate: %s, hint: %s, table_name: %s, datatype_name: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name))
     raise e
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 INFO:  sqlstate: XX987, hint: some hint, table_name: users_tab, datatype_name: user_type
 ERROR:  plpy.Error: my message
 HINT:  some hint
diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.out
index b2f8fe83eb6..7fe864a1a57 100644
--- a/src/pl/plpython/expected/plpython_error.out
+++ b/src/pl/plpython/expected/plpython_error.out
@@ -6,7 +6,7 @@
 CREATE FUNCTION python_syntax_error() RETURNS text
         AS
 '.syntaxerror'
-        LANGUAGE plpythonu;
+        LANGUAGE plpython3u;
 ERROR:  could not compile PL/Python function "python_syntax_error"
 DETAIL:  SyntaxError: invalid syntax (<string>, line 2)
 /* With check_function_bodies = false the function should get defined
@@ -16,7 +16,7 @@ SET check_function_bodies = false;
 CREATE FUNCTION python_syntax_error() RETURNS text
         AS
 '.syntaxerror'
-        LANGUAGE plpythonu;
+        LANGUAGE plpython3u;
 SELECT python_syntax_error();
 ERROR:  could not compile PL/Python function "python_syntax_error"
 DETAIL:  SyntaxError: invalid syntax (<string>, line 2)
@@ -30,7 +30,7 @@ RESET check_function_bodies;
 CREATE FUNCTION sql_syntax_error() RETURNS text
         AS
 'plpy.execute("syntax error")'
-        LANGUAGE plpythonu;
+        LANGUAGE plpython3u;
 SELECT sql_syntax_error();
 ERROR:  spiexceptions.SyntaxError: syntax error at or near "syntax"
 LINE 1: syntax error
@@ -45,7 +45,7 @@ PL/Python function "sql_syntax_error"
 CREATE FUNCTION exception_index_invalid(text) RETURNS text
 	AS
 'return args[1]'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT exception_index_invalid('test');
 ERROR:  IndexError: list index out of range
 CONTEXT:  Traceback (most recent call last):
@@ -58,7 +58,7 @@ CREATE FUNCTION exception_index_invalid_nested() RETURNS text
 	AS
 'rv = plpy.execute("SELECT test5(''foo'')")
 return rv[0]'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT exception_index_invalid_nested();
 ERROR:  spiexceptions.UndefinedFunction: function test5(unknown) does not exist
 LINE 1: SELECT test5('foo')
@@ -81,7 +81,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT invalid_type_uncaught('rick');
 ERROR:  spiexceptions.UndefinedObject: type "test" does not exist
 CONTEXT:  Traceback (most recent call last):
@@ -105,7 +105,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT invalid_type_caught('rick');
 NOTICE:  type "test" does not exist
  invalid_type_caught 
@@ -129,7 +129,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT invalid_type_reraised('rick');
 ERROR:  plpy.Error: type "test" does not exist
 CONTEXT:  Traceback (most recent call last):
@@ -147,7 +147,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT valid_type('rick');
  valid_type 
 ------------
@@ -170,7 +170,7 @@ def fun3():
 fun3()
 return "not reached"
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT nested_error();
 ERROR:  plpy.Error: boom
 CONTEXT:  Traceback (most recent call last):
@@ -199,7 +199,7 @@ def fun3():
 fun3()
 return "not reached"
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT nested_error_raise();
 ERROR:  plpy.Error: boom
 CONTEXT:  Traceback (most recent call last):
@@ -228,7 +228,7 @@ def fun3():
 fun3()
 return "you''ve been warned"
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 SELECT nested_warning();
 WARNING:  boom
    nested_warning   
@@ -241,9 +241,9 @@ WARNING:  boom
 CREATE FUNCTION toplevel_attribute_error() RETURNS void AS
 $$
 plpy.nonexistent
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT toplevel_attribute_error();
-ERROR:  AttributeError: 'module' object has no attribute 'nonexistent'
+ERROR:  AttributeError: module 'plpy' has no attribute 'nonexistent'
 CONTEXT:  Traceback (most recent call last):
   PL/Python function "toplevel_attribute_error", line 2, in <module>
     plpy.nonexistent
@@ -261,7 +261,7 @@ def third():
   plpy.execute("select sql_error()")
 
 first()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$
 begin
   select 1/0;
@@ -274,7 +274,7 @@ end
 $$ LANGUAGE plpgsql;
 CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$
 plpy.execute("select sql_error()")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT python_traceback();
 ERROR:  spiexceptions.DivisionByZero: division by zero
 CONTEXT:  Traceback (most recent call last):
@@ -325,7 +325,7 @@ except spiexceptions.NotNullViolation as e:
     plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate)
 except spiexceptions.UniqueViolation as e:
     plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT specific_exception(2);
  specific_exception 
 --------------------
@@ -351,7 +351,7 @@ NOTICE:  Violated the UNIQUE constraint, sqlstate 23505
 CREATE FUNCTION python_unique_violation() RETURNS void AS $$
 plpy.execute("insert into specific values (1)")
 plpy.execute("insert into specific values (1)")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$
 begin
     begin
@@ -374,7 +374,7 @@ CREATE FUNCTION manual_subxact() RETURNS void AS $$
 plpy.execute("savepoint save")
 plpy.execute("create table foo(x integer)")
 plpy.execute("rollback to save")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT manual_subxact();
 ERROR:  plpy.SPIError: SPI_execute failed: SPI_ERROR_TRANSACTION
 CONTEXT:  Traceback (most recent call last):
@@ -389,7 +389,7 @@ rollback = plpy.prepare("rollback to save")
 plpy.execute(save)
 plpy.execute("create table foo(x integer)")
 plpy.execute(rollback)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT manual_subxact_prepared();
 ERROR:  plpy.SPIError: SPI_execute_plan failed: SPI_ERROR_TRANSACTION
 CONTEXT:  Traceback (most recent call last):
@@ -400,7 +400,7 @@ PL/Python function "manual_subxact_prepared"
  */
 CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$
 raise plpy.spiexceptions.DivisionByZero()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 DO $$
 BEGIN
 	SELECT plpy_raise_spiexception();
@@ -414,7 +414,7 @@ CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$
 exc = plpy.spiexceptions.DivisionByZero()
 exc.sqlstate = 'SILLY'
 raise exc
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 DO $$
 BEGIN
 	SELECT plpy_raise_spiexception_override();
@@ -425,18 +425,18 @@ $$ LANGUAGE plpgsql;
 /* test the context stack trace for nested execution levels
  */
 CREATE FUNCTION notice_innerfunc() RETURNS int AS $$
-plpy.execute("DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$")
+plpy.execute("DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$")
 return 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION notice_outerfunc() RETURNS int AS $$
 plpy.execute("SELECT notice_innerfunc()")
 return 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 \set SHOW_CONTEXT always
 SELECT notice_outerfunc();
 NOTICE:  inside DO
 CONTEXT:  PL/Python anonymous code block
-SQL statement "DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$"
+SQL statement "DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$"
 PL/Python function "notice_innerfunc"
 SQL statement "SELECT notice_innerfunc()"
 PL/Python function "notice_outerfunc"
diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.out
deleted file mode 100644
index bc66ab55340..00000000000
--- a/src/pl/plpython/expected/plpython_error_5.out
+++ /dev/null
@@ -1,447 +0,0 @@
--- test error handling, i forgot to restore Warn_restart in
--- the trigger handler once. the errors and subsequent core dump were
--- interesting.
-/* Flat out Python syntax error
- */
-CREATE FUNCTION python_syntax_error() RETURNS text
-        AS
-'.syntaxerror'
-        LANGUAGE plpython3u;
-ERROR:  could not compile PL/Python function "python_syntax_error"
-DETAIL:  SyntaxError: invalid syntax (<string>, line 2)
-/* With check_function_bodies = false the function should get defined
- * and the error reported when called
- */
-SET check_function_bodies = false;
-CREATE FUNCTION python_syntax_error() RETURNS text
-        AS
-'.syntaxerror'
-        LANGUAGE plpython3u;
-SELECT python_syntax_error();
-ERROR:  could not compile PL/Python function "python_syntax_error"
-DETAIL:  SyntaxError: invalid syntax (<string>, line 2)
-/* Run the function twice to check if the hashtable entry gets cleaned up */
-SELECT python_syntax_error();
-ERROR:  could not compile PL/Python function "python_syntax_error"
-DETAIL:  SyntaxError: invalid syntax (<string>, line 2)
-RESET check_function_bodies;
-/* Flat out syntax error
- */
-CREATE FUNCTION sql_syntax_error() RETURNS text
-        AS
-'plpy.execute("syntax error")'
-        LANGUAGE plpython3u;
-SELECT sql_syntax_error();
-ERROR:  spiexceptions.SyntaxError: syntax error at or near "syntax"
-LINE 1: syntax error
-        ^
-QUERY:  syntax error
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "sql_syntax_error", line 1, in <module>
-    plpy.execute("syntax error")
-PL/Python function "sql_syntax_error"
-/* check the handling of uncaught python exceptions
- */
-CREATE FUNCTION exception_index_invalid(text) RETURNS text
-	AS
-'return args[1]'
-	LANGUAGE plpython3u;
-SELECT exception_index_invalid('test');
-ERROR:  IndexError: list index out of range
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "exception_index_invalid", line 1, in <module>
-    return args[1]
-PL/Python function "exception_index_invalid"
-/* check handling of nested exceptions
- */
-CREATE FUNCTION exception_index_invalid_nested() RETURNS text
-	AS
-'rv = plpy.execute("SELECT test5(''foo'')")
-return rv[0]'
-	LANGUAGE plpython3u;
-SELECT exception_index_invalid_nested();
-ERROR:  spiexceptions.UndefinedFunction: function test5(unknown) does not exist
-LINE 1: SELECT test5('foo')
-               ^
-HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
-QUERY:  SELECT test5('foo')
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "exception_index_invalid_nested", line 1, in <module>
-    rv = plpy.execute("SELECT test5('foo')")
-PL/Python function "exception_index_invalid_nested"
-/* a typo
- */
-CREATE FUNCTION invalid_type_uncaught(a text) RETURNS text
-	AS
-'if "plan" not in SD:
-	q = "SELECT fname FROM users WHERE lname = $1"
-	SD["plan"] = plpy.prepare(q, [ "test" ])
-rv = plpy.execute(SD["plan"], [ a ])
-if len(rv):
-	return rv[0]["fname"]
-return None
-'
-	LANGUAGE plpython3u;
-SELECT invalid_type_uncaught('rick');
-ERROR:  spiexceptions.UndefinedObject: type "test" does not exist
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "invalid_type_uncaught", line 3, in <module>
-    SD["plan"] = plpy.prepare(q, [ "test" ])
-PL/Python function "invalid_type_uncaught"
-/* for what it's worth catch the exception generated by
- * the typo, and return None
- */
-CREATE FUNCTION invalid_type_caught(a text) RETURNS text
-	AS
-'if "plan" not in SD:
-	q = "SELECT fname FROM users WHERE lname = $1"
-	try:
-		SD["plan"] = plpy.prepare(q, [ "test" ])
-	except plpy.SPIError as ex:
-		plpy.notice(str(ex))
-		return None
-rv = plpy.execute(SD["plan"], [ a ])
-if len(rv):
-	return rv[0]["fname"]
-return None
-'
-	LANGUAGE plpython3u;
-SELECT invalid_type_caught('rick');
-NOTICE:  type "test" does not exist
- invalid_type_caught 
----------------------
- 
-(1 row)
-
-/* for what it's worth catch the exception generated by
- * the typo, and reraise it as a plain error
- */
-CREATE FUNCTION invalid_type_reraised(a text) RETURNS text
-	AS
-'if "plan" not in SD:
-	q = "SELECT fname FROM users WHERE lname = $1"
-	try:
-		SD["plan"] = plpy.prepare(q, [ "test" ])
-	except plpy.SPIError as ex:
-		plpy.error(str(ex))
-rv = plpy.execute(SD["plan"], [ a ])
-if len(rv):
-	return rv[0]["fname"]
-return None
-'
-	LANGUAGE plpython3u;
-SELECT invalid_type_reraised('rick');
-ERROR:  plpy.Error: type "test" does not exist
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "invalid_type_reraised", line 6, in <module>
-    plpy.error(str(ex))
-PL/Python function "invalid_type_reraised"
-/* no typo no messing about
- */
-CREATE FUNCTION valid_type(a text) RETURNS text
-	AS
-'if "plan" not in SD:
-	SD["plan"] = plpy.prepare("SELECT fname FROM users WHERE lname = $1", [ "text" ])
-rv = plpy.execute(SD["plan"], [ a ])
-if len(rv):
-	return rv[0]["fname"]
-return None
-'
-	LANGUAGE plpython3u;
-SELECT valid_type('rick');
- valid_type 
-------------
- 
-(1 row)
-
-/* error in nested functions to get a traceback
-*/
-CREATE FUNCTION nested_error() RETURNS text
-	AS
-'def fun1():
-	plpy.error("boom")
-
-def fun2():
-	fun1()
-
-def fun3():
-	fun2()
-
-fun3()
-return "not reached"
-'
-	LANGUAGE plpython3u;
-SELECT nested_error();
-ERROR:  plpy.Error: boom
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "nested_error", line 10, in <module>
-    fun3()
-  PL/Python function "nested_error", line 8, in fun3
-    fun2()
-  PL/Python function "nested_error", line 5, in fun2
-    fun1()
-  PL/Python function "nested_error", line 2, in fun1
-    plpy.error("boom")
-PL/Python function "nested_error"
-/* raising plpy.Error is just like calling plpy.error
-*/
-CREATE FUNCTION nested_error_raise() RETURNS text
-	AS
-'def fun1():
-	raise plpy.Error("boom")
-
-def fun2():
-	fun1()
-
-def fun3():
-	fun2()
-
-fun3()
-return "not reached"
-'
-	LANGUAGE plpython3u;
-SELECT nested_error_raise();
-ERROR:  plpy.Error: boom
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "nested_error_raise", line 10, in <module>
-    fun3()
-  PL/Python function "nested_error_raise", line 8, in fun3
-    fun2()
-  PL/Python function "nested_error_raise", line 5, in fun2
-    fun1()
-  PL/Python function "nested_error_raise", line 2, in fun1
-    raise plpy.Error("boom")
-PL/Python function "nested_error_raise"
-/* using plpy.warning should not produce a traceback
-*/
-CREATE FUNCTION nested_warning() RETURNS text
-	AS
-'def fun1():
-	plpy.warning("boom")
-
-def fun2():
-	fun1()
-
-def fun3():
-	fun2()
-
-fun3()
-return "you''ve been warned"
-'
-	LANGUAGE plpython3u;
-SELECT nested_warning();
-WARNING:  boom
-   nested_warning   
---------------------
- you've been warned
-(1 row)
-
-/* AttributeError at toplevel used to give segfaults with the traceback
-*/
-CREATE FUNCTION toplevel_attribute_error() RETURNS void AS
-$$
-plpy.nonexistent
-$$ LANGUAGE plpython3u;
-SELECT toplevel_attribute_error();
-ERROR:  AttributeError: module 'plpy' has no attribute 'nonexistent'
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "toplevel_attribute_error", line 2, in <module>
-    plpy.nonexistent
-PL/Python function "toplevel_attribute_error"
-/* Calling PL/Python functions from SQL and vice versa should not lose context.
- */
-CREATE OR REPLACE FUNCTION python_traceback() RETURNS void AS $$
-def first():
-  second()
-
-def second():
-  third()
-
-def third():
-  plpy.execute("select sql_error()")
-
-first()
-$$ LANGUAGE plpython3u;
-CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$
-begin
-  select 1/0;
-end
-$$ LANGUAGE plpgsql;
-CREATE OR REPLACE FUNCTION python_from_sql_error() RETURNS void AS $$
-begin
-  select python_traceback();
-end
-$$ LANGUAGE plpgsql;
-CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$
-plpy.execute("select sql_error()")
-$$ LANGUAGE plpython3u;
-SELECT python_traceback();
-ERROR:  spiexceptions.DivisionByZero: division by zero
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "python_traceback", line 11, in <module>
-    first()
-  PL/Python function "python_traceback", line 3, in first
-    second()
-  PL/Python function "python_traceback", line 6, in second
-    third()
-  PL/Python function "python_traceback", line 9, in third
-    plpy.execute("select sql_error()")
-PL/Python function "python_traceback"
-SELECT sql_error();
-ERROR:  division by zero
-CONTEXT:  SQL statement "select 1/0"
-PL/pgSQL function sql_error() line 3 at SQL statement
-SELECT python_from_sql_error();
-ERROR:  spiexceptions.DivisionByZero: division by zero
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "python_traceback", line 11, in <module>
-    first()
-  PL/Python function "python_traceback", line 3, in first
-    second()
-  PL/Python function "python_traceback", line 6, in second
-    third()
-  PL/Python function "python_traceback", line 9, in third
-    plpy.execute("select sql_error()")
-PL/Python function "python_traceback"
-SQL statement "select python_traceback()"
-PL/pgSQL function python_from_sql_error() line 3 at SQL statement
-SELECT sql_from_python_error();
-ERROR:  spiexceptions.DivisionByZero: division by zero
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "sql_from_python_error", line 2, in <module>
-    plpy.execute("select sql_error()")
-PL/Python function "sql_from_python_error"
-/* check catching specific types of exceptions
- */
-CREATE TABLE specific (
-    i integer PRIMARY KEY
-);
-CREATE FUNCTION specific_exception(i integer) RETURNS void AS
-$$
-from plpy import spiexceptions
-try:
-    plpy.execute("insert into specific values (%s)" % (i or "NULL"));
-except spiexceptions.NotNullViolation as e:
-    plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate)
-except spiexceptions.UniqueViolation as e:
-    plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate)
-$$ LANGUAGE plpython3u;
-SELECT specific_exception(2);
- specific_exception 
---------------------
- 
-(1 row)
-
-SELECT specific_exception(NULL);
-NOTICE:  Violated the NOT NULL constraint, sqlstate 23502
- specific_exception 
---------------------
- 
-(1 row)
-
-SELECT specific_exception(2);
-NOTICE:  Violated the UNIQUE constraint, sqlstate 23505
- specific_exception 
---------------------
- 
-(1 row)
-
-/* SPI errors in PL/Python functions should preserve the SQLSTATE value
- */
-CREATE FUNCTION python_unique_violation() RETURNS void AS $$
-plpy.execute("insert into specific values (1)")
-plpy.execute("insert into specific values (1)")
-$$ LANGUAGE plpython3u;
-CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$
-begin
-    begin
-        perform python_unique_violation();
-    exception when unique_violation then
-        return 'ok';
-    end;
-    return 'not reached';
-end;
-$$ language plpgsql;
-SELECT catch_python_unique_violation();
- catch_python_unique_violation 
--------------------------------
- ok
-(1 row)
-
-/* manually starting subtransactions - a bad idea
- */
-CREATE FUNCTION manual_subxact() RETURNS void AS $$
-plpy.execute("savepoint save")
-plpy.execute("create table foo(x integer)")
-plpy.execute("rollback to save")
-$$ LANGUAGE plpython3u;
-SELECT manual_subxact();
-ERROR:  plpy.SPIError: SPI_execute failed: SPI_ERROR_TRANSACTION
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "manual_subxact", line 2, in <module>
-    plpy.execute("savepoint save")
-PL/Python function "manual_subxact"
-/* same for prepared plans
- */
-CREATE FUNCTION manual_subxact_prepared() RETURNS void AS $$
-save = plpy.prepare("savepoint save")
-rollback = plpy.prepare("rollback to save")
-plpy.execute(save)
-plpy.execute("create table foo(x integer)")
-plpy.execute(rollback)
-$$ LANGUAGE plpython3u;
-SELECT manual_subxact_prepared();
-ERROR:  plpy.SPIError: SPI_execute_plan failed: SPI_ERROR_TRANSACTION
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "manual_subxact_prepared", line 4, in <module>
-    plpy.execute(save)
-PL/Python function "manual_subxact_prepared"
-/* raising plpy.spiexception.* from python code should preserve sqlstate
- */
-CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$
-raise plpy.spiexceptions.DivisionByZero()
-$$ LANGUAGE plpython3u;
-DO $$
-BEGIN
-	SELECT plpy_raise_spiexception();
-EXCEPTION WHEN division_by_zero THEN
-	-- NOOP
-END
-$$ LANGUAGE plpgsql;
-/* setting a custom sqlstate should be handled
- */
-CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$
-exc = plpy.spiexceptions.DivisionByZero()
-exc.sqlstate = 'SILLY'
-raise exc
-$$ LANGUAGE plpython3u;
-DO $$
-BEGIN
-	SELECT plpy_raise_spiexception_override();
-EXCEPTION WHEN SQLSTATE 'SILLY' THEN
-	-- NOOP
-END
-$$ LANGUAGE plpgsql;
-/* test the context stack trace for nested execution levels
- */
-CREATE FUNCTION notice_innerfunc() RETURNS int AS $$
-plpy.execute("DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$")
-return 1
-$$ LANGUAGE plpythonu;
-CREATE FUNCTION notice_outerfunc() RETURNS int AS $$
-plpy.execute("SELECT notice_innerfunc()")
-return 1
-$$ LANGUAGE plpythonu;
-\set SHOW_CONTEXT always
-SELECT notice_outerfunc();
-NOTICE:  inside DO
-CONTEXT:  PL/Python anonymous code block
-SQL statement "DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$"
-PL/Python function "notice_innerfunc"
-SQL statement "SELECT notice_innerfunc()"
-PL/Python function "notice_outerfunc"
- notice_outerfunc 
-------------------
-                1
-(1 row)
-
diff --git a/src/pl/plpython/expected/plpython_global.out b/src/pl/plpython/expected/plpython_global.out
index 192e3e48a72..a4cfb1483f9 100644
--- a/src/pl/plpython/expected/plpython_global.out
+++ b/src/pl/plpython/expected/plpython_global.out
@@ -8,7 +8,7 @@ CREATE FUNCTION global_test_one() returns text
 if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_one"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 CREATE FUNCTION global_test_two() returns text
     AS
 'if "global_test" not in SD:
@@ -16,7 +16,7 @@ CREATE FUNCTION global_test_two() returns text
 if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_two"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 CREATE FUNCTION static_test() returns int4
     AS
 'if "call" in SD:
@@ -25,7 +25,7 @@ else:
 	SD["call"] = 1
 return SD["call"]
 '
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 SELECT static_test();
  static_test 
 -------------
diff --git a/src/pl/plpython/expected/plpython_import.out b/src/pl/plpython/expected/plpython_import.out
index b59e1821a79..854e989eaf9 100644
--- a/src/pl/plpython/expected/plpython_import.out
+++ b/src/pl/plpython/expected/plpython_import.out
@@ -6,7 +6,7 @@ CREATE FUNCTION import_fail() returns text
 except ImportError:
 	return "failed as expected"
 return "succeeded, that wasn''t supposed to happen"'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 CREATE FUNCTION import_succeed() returns text
 	AS
 'try:
@@ -25,7 +25,7 @@ except Exception as ex:
 	plpy.notice("import failed -- %s" % str(ex))
 	return "failed, that wasn''t supposed to happen"
 return "succeeded, as expected"'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 CREATE FUNCTION import_test_one(p text) RETURNS text
 	AS
 'try:
@@ -35,7 +35,7 @@ except ImportError:
     import sha
     digest = sha.new(p)
 return digest.hexdigest()'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE FUNCTION import_test_two(u users) RETURNS text
 	AS
 'plain = u["fname"] + u["lname"]
@@ -46,7 +46,7 @@ except ImportError:
     import sha
     digest = sha.new(plain);
 return "sha hash of " + plain + " is " + digest.hexdigest()'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 -- import python modules
 --
 SELECT import_fail();
diff --git a/src/pl/plpython/expected/plpython_newline.out b/src/pl/plpython/expected/plpython_newline.out
index 27dc2f8ab0c..2bc149257e7 100644
--- a/src/pl/plpython/expected/plpython_newline.out
+++ b/src/pl/plpython/expected/plpython_newline.out
@@ -3,13 +3,13 @@
 --
 CREATE OR REPLACE FUNCTION newline_lf() RETURNS integer AS
 E'x = 100\ny = 23\nreturn x + y\n'
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 CREATE OR REPLACE FUNCTION newline_cr() RETURNS integer AS
 E'x = 100\ry = 23\rreturn x + y\r'
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 CREATE OR REPLACE FUNCTION newline_crlf() RETURNS integer AS
 E'x = 100\r\ny = 23\r\nreturn x + y\r\n'
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 SELECT newline_lf();
  newline_lf 
 ------------
diff --git a/src/pl/plpython/expected/plpython_params.out b/src/pl/plpython/expected/plpython_params.out
index 46ea7dfb90b..d1a36f36239 100644
--- a/src/pl/plpython/expected/plpython_params.out
+++ b/src/pl/plpython/expected/plpython_params.out
@@ -3,12 +3,12 @@
 --
 CREATE FUNCTION test_param_names0(integer, integer) RETURNS int AS $$
 return args[0] + args[1]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_param_names1(a0 integer, a1 text) RETURNS boolean AS $$
 assert a0 == args[0]
 assert a1 == args[1]
 return True
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_param_names2(u users) RETURNS text AS $$
 assert u == args[0]
 if isinstance(u, dict):
@@ -19,7 +19,7 @@ if isinstance(u, dict):
 else:
     s = str(u)
 return s
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 -- use deliberately wrong parameter names
 CREATE FUNCTION test_param_names3(a0 integer) RETURNS boolean AS $$
 try:
@@ -28,7 +28,7 @@ try:
 except NameError as e:
 	assert e.args[0].find("a1") > -1
 	return True
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT test_param_names0(2,7);
  test_param_names0 
 -------------------
diff --git a/src/pl/plpython/expected/plpython_quote.out b/src/pl/plpython/expected/plpython_quote.out
index eed72923aec..1fbe93d5351 100644
--- a/src/pl/plpython/expected/plpython_quote.out
+++ b/src/pl/plpython/expected/plpython_quote.out
@@ -8,7 +8,7 @@ CREATE FUNCTION quote(t text, how text) RETURNS text AS $$
         return plpy.quote_ident(t)
     else:
         raise plpy.Error("unrecognized quote type %s" % how)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT quote(t, 'literal') FROM (VALUES
        ('abc'),
        ('a''bc'),
diff --git a/src/pl/plpython/expected/plpython_record.out b/src/pl/plpython/expected/plpython_record.out
index 458330713a8..31de198582b 100644
--- a/src/pl/plpython/expected/plpython_record.out
+++ b/src/pl/plpython/expected/plpython_record.out
@@ -23,7 +23,7 @@ elif typ == 'obj':
 	type_record.first = first
 	type_record.second = second
 	return type_record
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_type_record_as(typ text, first text, second integer, retnull boolean) RETURNS type_record AS $$
 if retnull:
 	return None
@@ -40,17 +40,17 @@ elif typ == 'obj':
 	return type_record
 elif typ == 'str':
 	return "('%s',%r)" % (first, second)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_in_out_params(first in text, second out text) AS $$
 return first + '_in_to_out';
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_in_out_params_multi(first in text,
                                          second out text, third out text) AS $$
 return (first + '_record_in_to_out_1', first + '_record_in_to_out_2');
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_inout_params(first inout text) AS $$
 return first + '_inout';
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 -- Test tuple returning functions
 SELECT * FROM test_table_record_as('dict', null, null, false);
  first | second 
@@ -340,7 +340,7 @@ SELECT * FROM test_type_record_as('obj', 'one', 1, false);
 -- errors cases
 CREATE FUNCTION test_type_record_error1() RETURNS type_record AS $$
     return { 'first': 'first' }
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_record_error1();
 ERROR:  key "second" not found in mapping
 HINT:  To return null in a column, add the value None to the mapping with the key named after the column.
@@ -348,7 +348,7 @@ CONTEXT:  while creating return value
 PL/Python function "test_type_record_error1"
 CREATE FUNCTION test_type_record_error2() RETURNS type_record AS $$
     return [ 'first' ]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_record_error2();
 ERROR:  length of returned sequence did not match number of columns in row
 CONTEXT:  while creating return value
@@ -357,7 +357,7 @@ CREATE FUNCTION test_type_record_error3() RETURNS type_record AS $$
     class type_record: pass
     type_record.first = 'first'
     return type_record
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_record_error3();
 ERROR:  attribute "second" does not exist in Python object
 HINT:  To return null in a column, let the returned object have an attribute named after column with value None.
@@ -365,7 +365,7 @@ CONTEXT:  while creating return value
 PL/Python function "test_type_record_error3"
 CREATE FUNCTION test_type_record_error4() RETURNS type_record AS $$
     return 'foo'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_record_error4();
 ERROR:  malformed record literal: "foo"
 DETAIL:  Missing left parenthesis.
diff --git a/src/pl/plpython/expected/plpython_setof.out b/src/pl/plpython/expected/plpython_setof.out
index 170dbc394de..39409400290 100644
--- a/src/pl/plpython/expected/plpython_setof.out
+++ b/src/pl/plpython/expected/plpython_setof.out
@@ -3,20 +3,20 @@
 --
 CREATE FUNCTION test_setof_error() RETURNS SETOF text AS $$
 return 37
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT test_setof_error();
 ERROR:  returned object cannot be iterated
 DETAIL:  PL/Python set-returning functions must return an iterable object.
 CONTEXT:  PL/Python function "test_setof_error"
 CREATE FUNCTION test_setof_as_list(count integer, content text) RETURNS SETOF text AS $$
 return [ content ]*count
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_setof_as_tuple(count integer, content text) RETURNS SETOF text AS $$
 t = ()
 for i in range(count):
 	t += ( content, )
 return t
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_setof_as_iterator(count integer, content text) RETURNS SETOF text AS $$
 class producer:
 	def __init__ (self, icount, icontent):
@@ -24,13 +24,13 @@ class producer:
 		self.icount = icount
 	def __iter__ (self):
 		return self
-	def next (self):
+	def __next__ (self):
 		if self.icount == 0:
 			raise StopIteration
 		self.icount -= 1
 		return self.icontent
 return producer(count, content)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_setof_spi_in_iterator() RETURNS SETOF text AS
 $$
     for s in ('Hello', 'Brave', 'New', 'World'):
@@ -38,7 +38,7 @@ $$
         yield s
         plpy.execute('select 2')
 $$
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 -- Test set returning functions
 SELECT test_setof_as_list(0, 'list');
  test_setof_as_list 
@@ -130,7 +130,7 @@ global x
 while x <= lim:
     yield x
     x = x + 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT ugly(1, 5);
  ugly 
 ------
@@ -155,7 +155,7 @@ CREATE OR REPLACE FUNCTION get_user_records()
 RETURNS SETOF users
 AS $$
     return plpy.execute("SELECT * FROM users ORDER BY username")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT get_user_records();
    get_user_records   
 ----------------------
@@ -179,7 +179,7 @@ CREATE OR REPLACE FUNCTION get_user_records2()
 RETURNS TABLE(fname text, lname text, username text, userid int)
 AS $$
     return plpy.execute("SELECT * FROM users ORDER BY username")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT get_user_records2();
   get_user_records2   
 ----------------------
diff --git a/src/pl/plpython/expected/plpython_spi.out b/src/pl/plpython/expected/plpython_spi.out
index a09df68c7d1..391fdb0e645 100644
--- a/src/pl/plpython/expected/plpython_spi.out
+++ b/src/pl/plpython/expected/plpython_spi.out
@@ -6,17 +6,17 @@ CREATE FUNCTION nested_call_one(a text) RETURNS text
 'q = "SELECT nested_call_two(''%s'')" % a
 r = plpy.execute(q)
 return r[0]'
-	LANGUAGE plpythonu ;
+	LANGUAGE plpython3u ;
 CREATE FUNCTION nested_call_two(a text) RETURNS text
 	AS
 'q = "SELECT nested_call_three(''%s'')" % a
 r = plpy.execute(q)
 return r[0]'
-	LANGUAGE plpythonu ;
+	LANGUAGE plpython3u ;
 CREATE FUNCTION nested_call_three(a text) RETURNS text
 	AS
 'return a'
-	LANGUAGE plpythonu ;
+	LANGUAGE plpython3u ;
 -- some spi stuff
 CREATE FUNCTION spi_prepared_plan_test_one(a text) RETURNS text
 	AS
@@ -30,7 +30,7 @@ except Exception as ex:
 	plpy.error(str(ex))
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE FUNCTION spi_prepared_plan_test_two(a text) RETURNS text
 	AS
 'if "myplan" not in SD:
@@ -43,7 +43,7 @@ except Exception as ex:
 	plpy.error(str(ex))
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE FUNCTION spi_prepared_plan_test_nested(a text) RETURNS text
 	AS
 'if "myplan" not in SD:
@@ -57,7 +57,7 @@ except Exception as ex:
 	plpy.error(str(ex))
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE FUNCTION join_sequences(s sequences) RETURNS text
 	AS
 'if not s["multipart"]:
@@ -69,7 +69,7 @@ for r in rv:
 	seq = seq + r["sequence"]
 return seq
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE FUNCTION spi_recursive_sum(a int) RETURNS int
 	AS
 'r = 0
@@ -77,7 +77,7 @@ if a > 1:
     r = plpy.execute("SELECT spi_recursive_sum(%d) as a" % (a-1))[0]["a"]
 return a + r
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 --
 -- spi and nested calls
 --
@@ -155,7 +155,7 @@ if result.status() > 0:
    return result.nrows()
 else:
    return None
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT result_metadata_test($$SELECT 1 AS foo, '11'::text AS bar UNION SELECT 2, '22'$$);
 INFO:  True
 INFO:  ['foo', 'bar']
@@ -177,7 +177,7 @@ CREATE FUNCTION result_nrows_test(cmd text) RETURNS int
 AS $$
 result = plpy.execute(cmd)
 return result.nrows()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT result_nrows_test($$SELECT 1$$);
  result_nrows_test 
 -------------------
@@ -206,7 +206,7 @@ CREATE FUNCTION result_len_test(cmd text) RETURNS int
 AS $$
 result = plpy.execute(cmd)
 return len(result)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT result_len_test($$SELECT 1$$);
  result_len_test 
 -----------------
@@ -254,7 +254,7 @@ except TypeError:
 else:
     assert False, "TypeError not raised"
 
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT result_subscript_test();
 INFO:  2
 INFO:  4
@@ -272,7 +272,7 @@ result = plpy.execute("select 1 where false")
 
 plpy.info(result[:])
 
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT result_empty_test();
 INFO:  []
  result_empty_test 
@@ -285,7 +285,7 @@ AS $$
 plan = plpy.prepare(cmd)
 result = plpy.execute(plan)
 return str(result)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT result_str_test($$SELECT 1 AS foo UNION SELECT 2$$);
                       result_str_test                       
 ------------------------------------------------------------
@@ -306,12 +306,12 @@ for row in res:
     if row['lname'] == 'doe':
         does += 1
 return does
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION double_cursor_close() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
 res.close()
 res.close()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_fetch() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
 assert len(res.fetch(3)) == 3
@@ -329,7 +329,7 @@ except StopIteration:
     pass
 else:
     assert False, "StopIteration not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_mix_next_and_fetch() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users order by fname")
 assert len(res.fetch(2)) == 2
@@ -342,7 +342,7 @@ except AttributeError:
 assert item['fname'] == 'rick'
 
 assert len(res.fetch(2)) == 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION fetch_after_close() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
 res.close()
@@ -352,7 +352,7 @@ except ValueError:
     pass
 else:
     assert False, "ValueError not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION next_after_close() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
 res.close()
@@ -365,7 +365,7 @@ except ValueError:
     pass
 else:
     assert False, "ValueError not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_fetch_next_empty() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users where false")
 assert len(res.fetch(1)) == 0
@@ -378,7 +378,7 @@ except StopIteration:
     pass
 else:
     assert False, "StopIteration not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_plan() RETURNS SETOF text AS $$
 plan = plpy.prepare(
     "select fname, lname from users where fname like $1 || '%' order by fname",
@@ -387,12 +387,12 @@ for row in plpy.cursor(plan, ["w"]):
     yield row['fname']
 for row in plan.cursor(["j"]):
     yield row['fname']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_plan_wrong_args() RETURNS SETOF text AS $$
 plan = plpy.prepare("select fname, lname from users where fname like $1 || '%'",
                     ["text"])
 c = plpy.cursor(plan, ["a", "b"])
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TYPE test_composite_type AS (
   a1 int,
   a2 varchar
@@ -401,7 +401,7 @@ CREATE OR REPLACE FUNCTION plan_composite_args() RETURNS test_composite_type AS
 plan = plpy.prepare("select $1 as c1", ["test_composite_type"])
 res = plpy.execute(plan, [{"a1": 3, "a2": "label"}])
 return res[0]["c1"]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT simple_cursor_test();
  simple_cursor_test 
 --------------------
diff --git a/src/pl/plpython/expected/plpython_subtransaction.out b/src/pl/plpython/expected/plpython_subtransaction.out
index 2a56541917d..43d9277a33b 100644
--- a/src/pl/plpython/expected/plpython_subtransaction.out
+++ b/src/pl/plpython/expected/plpython_subtransaction.out
@@ -14,7 +14,7 @@ with plpy.subtransaction():
         plpy.execute("INSERT INTO subtransaction_tbl VALUES ('oops')")
     elif what_error == "Python":
         raise Exception("Python exception")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT subtransaction_ctx_test();
  subtransaction_ctx_test 
 -------------------------
@@ -71,7 +71,7 @@ with plpy.subtransaction():
             raise
         plpy.notice("Swallowed %s(%r)" % (e.__class__.__name__, e.args[0]))
 return "ok"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT subtransaction_nested_test();
 ERROR:  spiexceptions.SyntaxError: syntax error at or near "error"
 LINE 1: error
@@ -111,7 +111,7 @@ with plpy.subtransaction():
     plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
     plpy.execute("SELECT subtransaction_nested_test('t')")
 return "ok"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT subtransaction_deeply_nested_test();
 NOTICE:  Swallowed SyntaxError('syntax error at or near "error"')
  subtransaction_deeply_nested_test 
@@ -133,42 +133,42 @@ TRUNCATE subtransaction_tbl;
 CREATE FUNCTION subtransaction_exit_without_enter() RETURNS void
 AS $$
 plpy.subtransaction().__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION subtransaction_enter_without_exit() RETURNS void
 AS $$
 plpy.subtransaction().__enter__()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION subtransaction_exit_twice() RETURNS void
 AS $$
 plpy.subtransaction().__enter__()
 plpy.subtransaction().__exit__(None, None, None)
 plpy.subtransaction().__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION subtransaction_enter_twice() RETURNS void
 AS $$
 plpy.subtransaction().__enter__()
 plpy.subtransaction().__enter__()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION subtransaction_exit_same_subtransaction_twice() RETURNS void
 AS $$
 s = plpy.subtransaction()
 s.__enter__()
 s.__exit__(None, None, None)
 s.__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION subtransaction_enter_same_subtransaction_twice() RETURNS void
 AS $$
 s = plpy.subtransaction()
 s.__enter__()
 s.__enter__()
 s.__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 -- No warnings here, as the subtransaction gets indeed closed
 CREATE FUNCTION subtransaction_enter_subtransaction_in_with() RETURNS void
 AS $$
 with plpy.subtransaction() as s:
     s.__enter__()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION subtransaction_exit_subtransaction_in_with() RETURNS void
 AS $$
 try:
@@ -176,7 +176,7 @@ try:
         s.__exit__(None, None, None)
 except ValueError as e:
     raise ValueError(e)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT subtransaction_exit_without_enter();
 ERROR:  ValueError: this subtransaction has not been entered
 CONTEXT:  Traceback (most recent call last):
@@ -255,7 +255,7 @@ try:
     plpy.execute(p, ["wrong"])
 except plpy.SPIError:
     plpy.warning("Caught a SPI error")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT subtransaction_mix_explicit_and_implicit();
 WARNING:  Caught a SPI error from an explicit subtransaction
 WARNING:  Caught a SPI error
@@ -278,7 +278,7 @@ AS $$
 s = plpy.subtransaction()
 s.enter()
 s.exit(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT subtransaction_alternative_names();
  subtransaction_alternative_names 
 ----------------------------------
@@ -294,7 +294,7 @@ with plpy.subtransaction():
          plpy.execute("INSERT INTO subtransaction_tbl VALUES ('a')")
      except plpy.SPIError:
          plpy.notice("caught")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT try_catch_inside_subtransaction();
 NOTICE:  caught
  try_catch_inside_subtransaction 
@@ -318,7 +318,7 @@ with plpy.subtransaction():
          plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
      except plpy.SPIError:
          plpy.notice("caught")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT pk_violation_inside_subtransaction();
 NOTICE:  caught
  pk_violation_inside_subtransaction 
@@ -340,7 +340,7 @@ with plpy.subtransaction():
     cur.fetch(10)
 fetched = cur.fetch(10);
 return int(fetched[5]["i"])
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_aborted_subxact() RETURNS int AS $$
 try:
     with plpy.subtransaction():
@@ -351,7 +351,7 @@ except plpy.SPIError:
     fetched = cur.fetch(10)
     return int(fetched[5]["i"])
 return 0 # not reached
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_plan_aborted_subxact() RETURNS int AS $$
 try:
     with plpy.subtransaction():
@@ -364,7 +364,7 @@ except plpy.SPIError:
     fetched = cur.fetch(5)
     return fetched[2]["i"]
 return 0 # not reached
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION cursor_close_aborted_subxact() RETURNS boolean AS $$
 try:
     with plpy.subtransaction():
@@ -374,7 +374,7 @@ except plpy.SPIError:
     cur.close()
     return True
 return False # not reached
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT cursor_in_subxact();
  cursor_in_subxact 
 -------------------
diff --git a/src/pl/plpython/expected/plpython_test.out b/src/pl/plpython/expected/plpython_test.out
index 39b994f4468..13c14119c08 100644
--- a/src/pl/plpython/expected/plpython_test.out
+++ b/src/pl/plpython/expected/plpython_test.out
@@ -1,7 +1,7 @@
 -- first some tests of basic functionality
-CREATE EXTENSION plpython2u;
+CREATE EXTENSION plpython3u;
 -- really stupid function just to get the module loaded
-CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu;
+CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u;
 select stupid();
  stupid 
 --------
@@ -9,7 +9,7 @@ select stupid();
 (1 row)
 
 -- check 2/3 versioning
-CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython2u;
+CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u;
 select stupidn();
  stupidn 
 ---------
@@ -26,7 +26,7 @@ for key in keys:
     out.append("%s: %s" % (key, u[key]))
 words = a1 + " " + a2 + " => {" + ", ".join(out) + "}"
 return words'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 select "Argument test #1"(users, fname, lname) from users where lname = 'doe' order by 1;
                            Argument test #1                            
 -----------------------------------------------------------------------
@@ -41,7 +41,7 @@ $$
 contents = list(filter(lambda x: not x.startswith("__"), dir(plpy)))
 contents.sort()
 return contents
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 select module_contents();
  module_contents 
 -----------------
@@ -78,7 +78,7 @@ plpy.info('info', 37, [1, 2, 3])
 plpy.notice('notice')
 plpy.warning('warning')
 plpy.error('error')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT elog_test_basic();
 INFO:  info
 INFO:  37
diff --git a/src/pl/plpython/expected/plpython_transaction.out b/src/pl/plpython/expected/plpython_transaction.out
index 14152993c75..393ea21eaad 100644
--- a/src/pl/plpython/expected/plpython_transaction.out
+++ b/src/pl/plpython/expected/plpython_transaction.out
@@ -1,6 +1,6 @@
 CREATE TABLE test1 (a int, b text);
 CREATE PROCEDURE transaction_test1()
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 for i in range(0, 10):
     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
@@ -22,7 +22,7 @@ SELECT * FROM test1;
 
 TRUNCATE test1;
 DO
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 $$
 for i in range(0, 10):
     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
@@ -44,7 +44,7 @@ SELECT * FROM test1;
 TRUNCATE test1;
 -- not allowed in a function
 CREATE FUNCTION transaction_test2() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 for i in range(0, 10):
     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
@@ -64,7 +64,7 @@ SELECT * FROM test1;
 
 -- also not allowed if procedure is called from a function
 CREATE FUNCTION transaction_test3() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plpy.execute("CALL transaction_test1()")
 return 1
@@ -82,19 +82,19 @@ SELECT * FROM test1;
 
 -- DO block inside function
 CREATE FUNCTION transaction_test4() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
-plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$")
+plpy.execute("DO LANGUAGE plpython3u $x$ plpy.commit() $x$")
 return 1
 $$;
 SELECT transaction_test4();
 ERROR:  spiexceptions.InvalidTransactionTermination: invalid transaction termination
 CONTEXT:  Traceback (most recent call last):
   PL/Python function "transaction_test4", line 2, in <module>
-    plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$")
+    plpy.execute("DO LANGUAGE plpython3u $x$ plpy.commit() $x$")
 PL/Python function "transaction_test4"
 -- commit inside subtransaction (prohibited)
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 s = plpy.subtransaction()
 s.enter()
 plpy.commit()
@@ -106,7 +106,7 @@ CONTEXT:  PL/Python anonymous code block
 CREATE TABLE test2 (x int);
 INSERT INTO test2 VALUES (0), (1), (2), (3), (4);
 TRUNCATE test1;
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
     plpy.commit()
@@ -129,7 +129,7 @@ SELECT * FROM pg_cursors;
 
 -- error in cursor loop with commit
 TRUNCATE test1;
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (12/(%s-2))" % row['x'])
     plpy.commit()
@@ -153,7 +153,7 @@ SELECT * FROM pg_cursors;
 
 -- rollback inside cursor loop
 TRUNCATE test1;
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
     plpy.rollback()
@@ -170,7 +170,7 @@ SELECT * FROM pg_cursors;
 
 -- first commit then rollback inside cursor loop
 TRUNCATE test1;
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
     if row['x'] % 2 == 0:
diff --git a/src/pl/plpython/expected/plpython_trigger.out b/src/pl/plpython/expected/plpython_trigger.out
index 742988a5b59..dd1ca32fa49 100644
--- a/src/pl/plpython/expected/plpython_trigger.out
+++ b/src/pl/plpython/expected/plpython_trigger.out
@@ -15,20 +15,20 @@ if TD["new"]["fname"] == "william":
 	TD["new"]["fname"] = TD["args"][0]
 	rv = "MODIFY"
 return rv'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE FUNCTION users_update() returns trigger
 	AS
 'if TD["event"] == "UPDATE":
 	if TD["old"]["fname"] != TD["new"]["fname"] and TD["old"]["fname"] == TD["args"][0]:
 		return "SKIP"
 return None'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE FUNCTION users_delete() RETURNS trigger
 	AS
 'if TD["old"]["fname"] == TD["args"][0]:
 	return "SKIP"
 return None'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 CREATE TRIGGER users_insert_trig BEFORE INSERT ON users FOR EACH ROW
 	EXECUTE PROCEDURE users_insert ('willem');
 CREATE TRIGGER users_update_trig BEFORE UPDATE ON users FOR EACH ROW
@@ -71,7 +71,7 @@ CREATE TABLE trigger_test_generated (
 	i int,
         j int GENERATED ALWAYS AS (i * 2) STORED
 );
-CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpythonu AS $$
+CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpython3u AS $$
 
 if 'relid' in TD:
 	TD['relid'] = "bogus:12345"
@@ -328,7 +328,7 @@ INSERT INTO trigger_test VALUES (0, 'zero');
 CREATE FUNCTION stupid1() RETURNS trigger
 AS $$
     return 37
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger1
 BEFORE INSERT ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid1();
@@ -341,7 +341,7 @@ DROP TRIGGER stupid_trigger1 ON trigger_test;
 CREATE FUNCTION stupid2() RETURNS trigger
 AS $$
     return "MODIFY"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger2
 BEFORE DELETE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid2();
@@ -353,7 +353,7 @@ INSERT INTO trigger_test VALUES (0, 'zero');
 CREATE FUNCTION stupid3() RETURNS trigger
 AS $$
     return "foo"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger3
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid3();
@@ -365,8 +365,8 @@ DROP TRIGGER stupid_trigger3 ON trigger_test;
 -- Unicode variant
 CREATE FUNCTION stupid3u() RETURNS trigger
 AS $$
-    return u"foo"
-$$ LANGUAGE plpythonu;
+    return "foo"
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger3
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid3u();
@@ -380,7 +380,7 @@ CREATE FUNCTION stupid4() RETURNS trigger
 AS $$
     del TD["new"]
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger4
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid4();
@@ -394,7 +394,7 @@ CREATE FUNCTION stupid5() RETURNS trigger
 AS $$
     TD["new"] = ['foo', 'bar']
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger5
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid5();
@@ -408,7 +408,7 @@ CREATE FUNCTION stupid6() RETURNS trigger
 AS $$
     TD["new"] = {1: 'foo', 2: 'bar'}
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger6
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid6();
@@ -422,7 +422,7 @@ CREATE FUNCTION stupid7() RETURNS trigger
 AS $$
     TD["new"] = {'v': 'foo', 'a': 'bar'}
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger7
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid7();
@@ -434,9 +434,9 @@ DROP TRIGGER stupid_trigger7 ON trigger_test;
 -- Unicode variant
 CREATE FUNCTION stupid7u() RETURNS trigger
 AS $$
-    TD["new"] = {u'v': 'foo', u'a': 'bar'}
+    TD["new"] = {'v': 'foo', 'a': 'bar'}
     return "MODIFY"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER stupid_trigger7
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE stupid7u();
@@ -461,7 +461,7 @@ CREATE FUNCTION test_null() RETURNS trigger
 AS $$
     TD["new"]['v'] = None
     return "MODIFY"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER test_null_trigger
 BEFORE UPDATE ON trigger_test
 FOR EACH ROW EXECUTE PROCEDURE test_null();
@@ -481,7 +481,7 @@ SET DateStyle = 'ISO';
 CREATE FUNCTION set_modif_time() RETURNS trigger AS $$
     TD['new']['modif_time'] = '2010-10-13 21:57:28.930486'
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TABLE pb (a TEXT, modif_time TIMESTAMP(0) WITHOUT TIME ZONE);
 CREATE TRIGGER set_modif_time BEFORE UPDATE ON pb
   FOR EACH ROW EXECUTE PROCEDURE set_modif_time();
@@ -507,7 +507,7 @@ CREATE FUNCTION composite_trigger_f() RETURNS trigger AS $$
     TD['new']['f1'] = (3, False)
     TD['new']['f2'] = {'k': 7, 'l': 'yes', 'ignored': 10}
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER composite_trigger BEFORE INSERT ON composite_trigger_test
   FOR EACH ROW EXECUTE PROCEDURE composite_trigger_f();
 INSERT INTO composite_trigger_test VALUES (NULL, NULL);
@@ -521,7 +521,7 @@ SELECT * FROM composite_trigger_test;
 CREATE TABLE composite_trigger_noop_test (f1 comp1, f2 comp2);
 CREATE FUNCTION composite_trigger_noop_f() RETURNS trigger AS $$
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER composite_trigger_noop BEFORE INSERT ON composite_trigger_noop_test
   FOR EACH ROW EXECUTE PROCEDURE composite_trigger_noop_f();
 INSERT INTO composite_trigger_noop_test VALUES (NULL, NULL);
@@ -540,7 +540,7 @@ CREATE TYPE comp3 AS (c1 comp1, c2 comp2, m integer);
 CREATE TABLE composite_trigger_nested_test(c comp3);
 CREATE FUNCTION composite_trigger_nested_f() RETURNS trigger AS $$
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE TRIGGER composite_trigger_nested BEFORE INSERT ON composite_trigger_nested_test
   FOR EACH ROW EXECUTE PROCEDURE composite_trigger_nested_f();
 INSERT INTO composite_trigger_nested_test VALUES (NULL);
@@ -555,7 +555,7 @@ SELECT * FROM composite_trigger_nested_test;
 (3 rows)
 
 -- check that using a function as a trigger over two tables works correctly
-CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpythonu AS $$
+CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpython3u AS $$
     TD["new"]["data"] = '1234'
     return 'MODIFY'
 $$;
@@ -581,7 +581,7 @@ SELECT * FROM b;
 -- check that SQL run in trigger code can see transition tables
 CREATE TABLE transition_table_test (id int, name text);
 INSERT INTO transition_table_test VALUES (1, 'a');
-CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpythonu AS
+CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpython3u AS
 $$
     rv = plpy.execute("SELECT * FROM old_table")
     assert(rv.nrows() == 1)
@@ -601,7 +601,7 @@ DROP TABLE transition_table_test;
 DROP FUNCTION transition_table_test_f();
 -- dealing with generated columns
 CREATE FUNCTION generated_test_func1() RETURNS trigger
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 TD['new']['j'] = 5  # not allowed
 return 'MODIFY'
diff --git a/src/pl/plpython/expected/plpython_types.out b/src/pl/plpython/expected/plpython_types.out
index 0a2659fe292..a470911c2ec 100644
--- a/src/pl/plpython/expected/plpython_types.out
+++ b/src/pl/plpython/expected/plpython_types.out
@@ -7,23 +7,23 @@
 CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_bool(true);
-INFO:  (True, <type 'bool'>)
+INFO:  (True, <class 'bool'>)
  test_type_conversion_bool 
 ---------------------------
  t
 (1 row)
 
 SELECT * FROM test_type_conversion_bool(false);
-INFO:  (False, <type 'bool'>)
+INFO:  (False, <class 'bool'>)
  test_type_conversion_bool 
 ---------------------------
  f
 (1 row)
 
 SELECT * FROM test_type_conversion_bool(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_bool 
 ---------------------------
  
@@ -48,7 +48,7 @@ elif n == 5:
    ret = [0]
 plpy.info(ret, not not ret)
 return ret
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_bool_other(0);
 INFO:  (0, False)
  test_type_conversion_bool_other 
@@ -94,16 +94,16 @@ INFO:  ([0], True)
 CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_char('a');
-INFO:  ('a', <type 'str'>)
+INFO:  ('a', <class 'str'>)
  test_type_conversion_char 
 ---------------------------
  a
 (1 row)
 
 SELECT * FROM test_type_conversion_char(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_char 
 ---------------------------
  
@@ -112,23 +112,23 @@ INFO:  (None, <type 'NoneType'>)
 CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_int2(100::int2);
-INFO:  (100, <type 'int'>)
+INFO:  (100, <class 'int'>)
  test_type_conversion_int2 
 ---------------------------
                        100
 (1 row)
 
 SELECT * FROM test_type_conversion_int2(-100::int2);
-INFO:  (-100, <type 'int'>)
+INFO:  (-100, <class 'int'>)
  test_type_conversion_int2 
 ---------------------------
                       -100
 (1 row)
 
 SELECT * FROM test_type_conversion_int2(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_int2 
 ---------------------------
                           
@@ -137,23 +137,23 @@ INFO:  (None, <type 'NoneType'>)
 CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_int4(100);
-INFO:  (100, <type 'int'>)
+INFO:  (100, <class 'int'>)
  test_type_conversion_int4 
 ---------------------------
                        100
 (1 row)
 
 SELECT * FROM test_type_conversion_int4(-100);
-INFO:  (-100, <type 'int'>)
+INFO:  (-100, <class 'int'>)
  test_type_conversion_int4 
 ---------------------------
                       -100
 (1 row)
 
 SELECT * FROM test_type_conversion_int4(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_int4 
 ---------------------------
                           
@@ -162,30 +162,30 @@ INFO:  (None, <type 'NoneType'>)
 CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_int8(100);
-INFO:  (100L, <type 'long'>)
+INFO:  (100, <class 'int'>)
  test_type_conversion_int8 
 ---------------------------
                        100
 (1 row)
 
 SELECT * FROM test_type_conversion_int8(-100);
-INFO:  (-100L, <type 'long'>)
+INFO:  (-100, <class 'int'>)
  test_type_conversion_int8 
 ---------------------------
                       -100
 (1 row)
 
 SELECT * FROM test_type_conversion_int8(5000000000);
-INFO:  (5000000000L, <type 'long'>)
+INFO:  (5000000000, <class 'int'>)
  test_type_conversion_int8 
 ---------------------------
                 5000000000
 (1 row)
 
 SELECT * FROM test_type_conversion_int8(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_int8 
 ---------------------------
                           
@@ -196,7 +196,7 @@ CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$
 # between decimal and cdecimal
 plpy.info(str(x), x.__class__.__name__)
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_numeric(100);
 INFO:  ('100', 'Decimal')
  test_type_conversion_numeric 
@@ -256,30 +256,30 @@ INFO:  ('None', 'NoneType')
 CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_float4(100);
-INFO:  (100.0, <type 'float'>)
+INFO:  (100.0, <class 'float'>)
  test_type_conversion_float4 
 -----------------------------
                          100
 (1 row)
 
 SELECT * FROM test_type_conversion_float4(-100);
-INFO:  (-100.0, <type 'float'>)
+INFO:  (-100.0, <class 'float'>)
  test_type_conversion_float4 
 -----------------------------
                         -100
 (1 row)
 
 SELECT * FROM test_type_conversion_float4(5000.5);
-INFO:  (5000.5, <type 'float'>)
+INFO:  (5000.5, <class 'float'>)
  test_type_conversion_float4 
 -----------------------------
                       5000.5
 (1 row)
 
 SELECT * FROM test_type_conversion_float4(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_float4 
 -----------------------------
                             
@@ -288,37 +288,37 @@ INFO:  (None, <type 'NoneType'>)
 CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_float8(100);
-INFO:  (100.0, <type 'float'>)
+INFO:  (100.0, <class 'float'>)
  test_type_conversion_float8 
 -----------------------------
                          100
 (1 row)
 
 SELECT * FROM test_type_conversion_float8(-100);
-INFO:  (-100.0, <type 'float'>)
+INFO:  (-100.0, <class 'float'>)
  test_type_conversion_float8 
 -----------------------------
                         -100
 (1 row)
 
 SELECT * FROM test_type_conversion_float8(5000000000.5);
-INFO:  (5000000000.5, <type 'float'>)
+INFO:  (5000000000.5, <class 'float'>)
  test_type_conversion_float8 
 -----------------------------
                 5000000000.5
 (1 row)
 
 SELECT * FROM test_type_conversion_float8(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_float8 
 -----------------------------
                             
 (1 row)
 
 SELECT * FROM test_type_conversion_float8(100100100.654321);
-INFO:  (100100100.654321, <type 'float'>)
+INFO:  (100100100.654321, <class 'float'>)
  test_type_conversion_float8 
 -----------------------------
             100100100.654321
@@ -327,23 +327,23 @@ INFO:  (100100100.654321, <type 'float'>)
 CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_oid(100);
-INFO:  (100L, <type 'long'>)
+INFO:  (100, <class 'int'>)
  test_type_conversion_oid 
 --------------------------
                       100
 (1 row)
 
 SELECT * FROM test_type_conversion_oid(2147483649);
-INFO:  (2147483649L, <type 'long'>)
+INFO:  (2147483649, <class 'int'>)
  test_type_conversion_oid 
 --------------------------
                2147483649
 (1 row)
 
 SELECT * FROM test_type_conversion_oid(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_oid 
 --------------------------
                          
@@ -352,16 +352,16 @@ INFO:  (None, <type 'NoneType'>)
 CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_text('hello world');
-INFO:  ('hello world', <type 'str'>)
+INFO:  ('hello world', <class 'str'>)
  test_type_conversion_text 
 ---------------------------
  hello world
 (1 row)
 
 SELECT * FROM test_type_conversion_text(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_text 
 ---------------------------
  
@@ -370,23 +370,23 @@ INFO:  (None, <type 'NoneType'>)
 CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_bytea('hello world');
-INFO:  ('hello world', <type 'str'>)
+INFO:  (b'hello world', <class 'bytes'>)
  test_type_conversion_bytea 
 ----------------------------
  \x68656c6c6f20776f726c64
 (1 row)
 
 SELECT * FROM test_type_conversion_bytea(E'null\\000byte');
-INFO:  ('null\x00byte', <type 'str'>)
+INFO:  (b'null\x00byte', <class 'bytes'>)
  test_type_conversion_bytea 
 ----------------------------
  \x6e756c6c0062797465
 (1 row)
 
 SELECT * FROM test_type_conversion_bytea(null);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_bytea 
 ----------------------------
  
@@ -395,14 +395,14 @@ INFO:  (None, <type 'NoneType'>)
 CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$
 import marshal
 return marshal.dumps('hello world')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_type_unmarshal(x bytea) RETURNS text AS $$
 import marshal
 try:
     return marshal.loads(x)
 except ValueError as e:
     return 'FAILED: ' + str(e)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT test_type_unmarshal(x) FROM test_type_marshal() x;
  test_type_unmarshal 
 ---------------------
@@ -415,7 +415,7 @@ SELECT test_type_unmarshal(x) FROM test_type_marshal() x;
 CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL);
 CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_booltrue(true, true);
  test_type_conversion_booltrue 
 -------------------------------
@@ -432,21 +432,21 @@ CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0);
 CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$
 plpy.info(x, type(x))
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_uint2(100::uint2, 50);
-INFO:  (100, <type 'int'>)
+INFO:  (100, <class 'int'>)
  test_type_conversion_uint2 
 ----------------------------
                          50
 (1 row)
 
 SELECT * FROM test_type_conversion_uint2(100::uint2, -50);
-INFO:  (100, <type 'int'>)
+INFO:  (100, <class 'int'>)
 ERROR:  value for domain uint2 violates check constraint "uint2_check"
 CONTEXT:  while creating return value
 PL/Python function "test_type_conversion_uint2"
 SELECT * FROM test_type_conversion_uint2(null, 1);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_uint2 
 ----------------------------
                           1
@@ -455,7 +455,7 @@ INFO:  (None, <type 'NoneType'>)
 CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL);
 CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_nnint(10, 20);
  test_type_conversion_nnint 
 ----------------------------
@@ -472,9 +472,9 @@ CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT
 CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$
 plpy.info(x, type(x))
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold');
-INFO:  ('hello wold', <type 'str'>)
+INFO:  (b'hello wold', <class 'bytes'>)
  test_type_conversion_bytea10 
 ------------------------------
  \x68656c6c6f20776f6c64
@@ -483,14 +483,14 @@ INFO:  ('hello wold', <type 'str'>)
 SELECT * FROM test_type_conversion_bytea10('hello world', 'hello wold');
 ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
 SELECT * FROM test_type_conversion_bytea10('hello word', 'hello world');
-INFO:  ('hello word', <type 'str'>)
+INFO:  (b'hello word', <class 'bytes'>)
 ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
 CONTEXT:  while creating return value
 PL/Python function "test_type_conversion_bytea10"
 SELECT * FROM test_type_conversion_bytea10(null, 'hello word');
 ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
 SELECT * FROM test_type_conversion_bytea10('hello word', null);
-INFO:  ('hello word', <type 'str'>)
+INFO:  (b'hello word', <class 'bytes'>)
 ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
 CONTEXT:  while creating return value
 PL/Python function "test_type_conversion_bytea10"
@@ -500,58 +500,58 @@ PL/Python function "test_type_conversion_bytea10"
 CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]);
-INFO:  ([0, 100], <type 'list'>)
+INFO:  ([0, 100], <class 'list'>)
  test_type_conversion_array_int4 
 ---------------------------------
  {0,100}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]);
-INFO:  ([0, -100, 55], <type 'list'>)
+INFO:  ([0, -100, 55], <class 'list'>)
  test_type_conversion_array_int4 
 ---------------------------------
  {0,-100,55}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_int4(ARRAY[NULL,1]);
-INFO:  ([None, 1], <type 'list'>)
+INFO:  ([None, 1], <class 'list'>)
  test_type_conversion_array_int4 
 ---------------------------------
  {NULL,1}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_int4(ARRAY[]::integer[]);
-INFO:  ([], <type 'list'>)
+INFO:  ([], <class 'list'>)
  test_type_conversion_array_int4 
 ---------------------------------
  {}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_int4(NULL);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_array_int4 
 ---------------------------------
  
 (1 row)
 
 SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]);
-INFO:  ([[1, 2, 3], [4, 5, 6]], <type 'list'>)
+INFO:  ([[1, 2, 3], [4, 5, 6]], <class 'list'>)
  test_type_conversion_array_int4 
 ---------------------------------
  {{1,2,3},{4,5,6}}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_int4(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]);
-INFO:  ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], <type 'list'>)
+INFO:  ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], <class 'list'>)
           test_type_conversion_array_int4          
 ---------------------------------------------------
  {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_int4('[2:4]={1,2,3}');
-INFO:  ([1, 2, 3], <type 'list'>)
+INFO:  ([1, 2, 3], <class 'list'>)
  test_type_conversion_array_int4 
 ---------------------------------
  {1,2,3}
@@ -560,9 +560,9 @@ INFO:  ([1, 2, 3], <type 'list'>)
 CREATE FUNCTION test_type_conversion_array_int8(x int8[]) RETURNS int8[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_int8(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]::int8[]);
-INFO:  ([[[1L, 2L, None], [None, 5L, 6L]], [[None, 8L, 9L], [10L, 11L, 12L]]], <type 'list'>)
+INFO:  ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], <class 'list'>)
           test_type_conversion_array_int8          
 ---------------------------------------------------
  {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}}
@@ -571,10 +571,10 @@ INFO:  ([[[1L, 2L, None], [None, 5L, 6L]], [[None, 8L, 9L], [10L, 11L, 12L]]], <
 CREATE FUNCTION test_type_conversion_array_date(x date[]) RETURNS date[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22',NULL],[NULL,'2016-10-21','2016-10-22']],
             [[NULL,'2016-11-21','2016-10-21'],['2015-09-21','2015-09-22','2014-09-21']]]::date[]);
-INFO:  ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016']], [[None, '11-21-2016', '10-21-2016'], ['09-21-2015', '09-22-2015', '09-21-2014']]], <type 'list'>)
+INFO:  ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016']], [[None, '11-21-2016', '10-21-2016'], ['09-21-2015', '09-22-2015', '09-21-2014']]], <class 'list'>)
                                                  test_type_conversion_array_date                                                 
 ---------------------------------------------------------------------------------------------------------------------------------
  {{{09-21-2016,09-22-2016,NULL},{NULL,10-21-2016,10-22-2016}},{{NULL,11-21-2016,10-21-2016},{09-21-2015,09-22-2015,09-21-2014}}}
@@ -583,12 +583,12 @@ INFO:  ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016']
 CREATE FUNCTION test_type_conversion_array_timestamp(x timestamp[]) RETURNS timestamp[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_timestamp(ARRAY[[['2016-09-21 15:34:24.078792-04','2016-10-22 11:34:24.078795-04',NULL],
             [NULL,'2016-10-21 11:34:25.078792-04','2016-10-21 11:34:24.098792-04']],
             [[NULL,'2016-01-21 11:34:24.078792-04','2016-11-21 11:34:24.108792-04'],
             ['2015-09-21 11:34:24.079792-04','2014-09-21 11:34:24.078792-04','2013-09-21 11:34:24.078792-04']]]::timestamp[]);
-INFO:  ([[['Wed Sep 21 15:34:24.078792 2016', 'Sat Oct 22 11:34:24.078795 2016', None], [None, 'Fri Oct 21 11:34:25.078792 2016', 'Fri Oct 21 11:34:24.098792 2016']], [[None, 'Thu Jan 21 11:34:24.078792 2016', 'Mon Nov 21 11:34:24.108792 2016'], ['Mon Sep 21 11:34:24.079792 2015', 'Sun Sep 21 11:34:24.078792 2014', 'Sat Sep 21 11:34:24.078792 2013']]], <type 'list'>)
+INFO:  ([[['Wed Sep 21 15:34:24.078792 2016', 'Sat Oct 22 11:34:24.078795 2016', None], [None, 'Fri Oct 21 11:34:25.078792 2016', 'Fri Oct 21 11:34:24.098792 2016']], [[None, 'Thu Jan 21 11:34:24.078792 2016', 'Mon Nov 21 11:34:24.108792 2016'], ['Mon Sep 21 11:34:24.079792 2015', 'Sun Sep 21 11:34:24.078792 2014', 'Sat Sep 21 11:34:24.078792 2013']]], <class 'list'>)
                                                                                                                                                       test_type_conversion_array_timestamp                                                                                                                                                      
 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  {{{"Wed Sep 21 15:34:24.078792 2016","Sat Oct 22 11:34:24.078795 2016",NULL},{NULL,"Fri Oct 21 11:34:25.078792 2016","Fri Oct 21 11:34:24.098792 2016"}},{{NULL,"Thu Jan 21 11:34:24.078792 2016","Mon Nov 21 11:34:24.108792 2016"},{"Mon Sep 21 11:34:24.079792 2015","Sun Sep 21 11:34:24.078792 2014","Sat Sep 21 11:34:24.078792 2013"}}}
@@ -598,9 +598,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint4(h int4, i int4, j int4, k int4 )
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 select pyreturnmultidemint4(8,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]], [[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]]], <type 'list'>)
+INFO:  ([[[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]], [[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]]], <class 'list'>)
                                                                                                                                                                                                                                                                              pyreturnmultidemint4                                                                                                                                                                                                                                                                              
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  {{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}},{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}}}
@@ -610,9 +610,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint8(h int4, i int4, j int4, k int4 )
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 select pyreturnmultidemint8(5,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]], [[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]]], <type 'list'>)
+INFO:  ([[[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]], [[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]]], <class 'list'>)
                                                                                                                                                                                    pyreturnmultidemint8                                                                                                                                                                                    
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  {{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}},{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}}}
@@ -622,9 +622,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat4(h int4, i int4, j int4, k int4
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 select pyreturnmultidemfloat4(6,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]], [[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]]], <type 'list'>)
+INFO:  ([[[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]], [[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]]], <class 'list'>)
                                                                                                                                                                                                                 pyreturnmultidemfloat4                                                                                                                                                                                                                 
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  {{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}},{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}}}
@@ -634,9 +634,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat8(h int4, i int4, j int4, k int4
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 select pyreturnmultidemfloat8(7,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]], [[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]]], <type 'list'>)
+INFO:  ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]], [[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]]], <class 'list'>)
                                                                                                                                                                                                                                               pyreturnmultidemfloat8                                                                                                                                                                                                                                               
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  {{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}},{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}}}
@@ -645,16 +645,16 @@ INFO:  ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6],
 CREATE FUNCTION test_type_conversion_array_text(x text[]) RETURNS text[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_text(ARRAY['foo', 'bar']);
-INFO:  (['foo', 'bar'], <type 'list'>)
+INFO:  (['foo', 'bar'], <class 'list'>)
  test_type_conversion_array_text 
 ---------------------------------
  {foo,bar}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar2']]);
-INFO:  ([['foo', 'bar'], ['foo2', 'bar2']], <type 'list'>)
+INFO:  ([['foo', 'bar'], ['foo2', 'bar2']], <class 'list'>)
  test_type_conversion_array_text 
 ---------------------------------
  {{foo,bar},{foo2,bar2}}
@@ -663,9 +663,9 @@ INFO:  ([['foo', 'bar'], ['foo2', 'bar2']], <type 'list'>)
 CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]);
-INFO:  (['\xde\xad\xbe\xef', None], <type 'list'>)
+INFO:  ([b'\xde\xad\xbe\xef', None], <class 'list'>)
  test_type_conversion_array_bytea 
 ----------------------------------
  {"\\xdeadbeef",NULL}
@@ -673,7 +673,7 @@ INFO:  (['\xde\xad\xbe\xef', None], <type 'list'>)
 
 CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$
 return [123, 'abc']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_mixed1();
  test_type_conversion_array_mixed1 
 -----------------------------------
@@ -682,14 +682,14 @@ SELECT * FROM test_type_conversion_array_mixed1();
 
 CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$
 return [123, 'abc']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_mixed2();
 ERROR:  invalid input syntax for type integer: "abc"
 CONTEXT:  while creating return value
 PL/Python function "test_type_conversion_array_mixed2"
 CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$
 return [[1,2,3],[4,5]]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_mdarray_malformed();
 ERROR:  wrong length of inner sequence: has length 2, but 3 was expected
 DETAIL:  To construct a multidimensional array, the inner sequences must all have the same length.
@@ -697,14 +697,14 @@ CONTEXT:  while creating return value
 PL/Python function "test_type_conversion_mdarray_malformed"
 CREATE FUNCTION test_type_conversion_mdarray_toodeep() RETURNS int[] AS $$
 return [[[[[[[1]]]]]]]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_mdarray_toodeep();
 ERROR:  number of array dimensions exceeds the maximum allowed (6)
 CONTEXT:  while creating return value
 PL/Python function "test_type_conversion_mdarray_toodeep"
 CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$
 return [{'first': 'one', 'second': 42}, {'first': 'two', 'second': 11}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_record();
  test_type_conversion_array_record 
 -----------------------------------
@@ -713,7 +713,7 @@ SELECT * FROM test_type_conversion_array_record();
 
 CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$
 return 'abc'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_string();
  test_type_conversion_array_string 
 -----------------------------------
@@ -722,7 +722,7 @@ SELECT * FROM test_type_conversion_array_string();
 
 CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$
 return ('abc', 'def')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_tuple();
  test_type_conversion_array_tuple 
 ----------------------------------
@@ -731,7 +731,7 @@ SELECT * FROM test_type_conversion_array_tuple();
 
 CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$
 return 5
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_error();
 ERROR:  return value of function with array return type is not a Python sequence
 CONTEXT:  while creating return value
@@ -743,16 +743,16 @@ CREATE DOMAIN ordered_pair_domain AS integer[] CHECK (array_length(VALUE,1)=2 AN
 CREATE FUNCTION test_type_conversion_array_domain(x ordered_pair_domain) RETURNS ordered_pair_domain AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain);
-INFO:  ([0, 100], <type 'list'>)
+INFO:  ([0, 100], <class 'list'>)
  test_type_conversion_array_domain 
 -----------------------------------
  {0,100}
 (1 row)
 
 SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain);
-INFO:  (None, <type 'NoneType'>)
+INFO:  (None, <class 'NoneType'>)
  test_type_conversion_array_domain 
 -----------------------------------
  
@@ -760,7 +760,7 @@ INFO:  (None, <type 'NoneType'>)
 
 CREATE FUNCTION test_type_conversion_array_domain_check_violation() RETURNS ordered_pair_domain AS $$
 return [2,1]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_domain_check_violation();
 ERROR:  value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check"
 CONTEXT:  while creating return value
@@ -771,9 +771,9 @@ PL/Python function "test_type_conversion_array_domain_check_violation"
 CREATE FUNCTION test_read_uint2_array(x uint2[]) RETURNS uint2 AS $$
 plpy.info(x, type(x))
 return x[0]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 select test_read_uint2_array(array[1::uint2]);
-INFO:  ([1], <type 'list'>)
+INFO:  ([1], <class 'list'>)
  test_read_uint2_array 
 -----------------------
                      1
@@ -781,7 +781,7 @@ INFO:  ([1], <type 'list'>)
 
 CREATE FUNCTION test_build_uint2_array(x int2) RETURNS uint2[] AS $$
 return [x, x]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 select test_build_uint2_array(1::int2);
  test_build_uint2_array 
 ------------------------
@@ -800,7 +800,7 @@ PL/Python function "test_build_uint2_array"
 CREATE FUNCTION test_type_conversion_domain_array(x integer[])
   RETURNS ordered_pair_domain[] AS $$
 return [x, x]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 select test_type_conversion_domain_array(array[2,4]);
 ERROR:  return value of function with array return type is not a Python sequence
 CONTEXT:  while creating return value
@@ -813,9 +813,9 @@ CREATE FUNCTION test_type_conversion_domain_array2(x ordered_pair_domain)
   RETURNS integer AS $$
 plpy.info(x, type(x))
 return x[1]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 select test_type_conversion_domain_array2(array[2,4]);
-INFO:  ([2, 4], <type 'list'>)
+INFO:  ([2, 4], <class 'list'>)
  test_type_conversion_domain_array2 
 ------------------------------------
                                   4
@@ -827,9 +827,9 @@ CREATE FUNCTION test_type_conversion_array_domain_array(x ordered_pair_domain[])
   RETURNS ordered_pair_domain AS $$
 plpy.info(x, type(x))
 return x[0]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 select test_type_conversion_array_domain_array(array[array[2,4]::ordered_pair_domain]);
-INFO:  ([[2, 4]], <type 'list'>)
+INFO:  ([[2, 4]], <class 'list'>)
  test_type_conversion_array_domain_array 
 -----------------------------------------
  {2,4}
@@ -846,7 +846,7 @@ CREATE TABLE employee (
 INSERT INTO employee VALUES ('John', 100, 10), ('Mary', 200, 10);
 CREATE OR REPLACE FUNCTION test_composite_table_input(e employee) RETURNS integer AS $$
 return e['basesalary'] + e['bonus']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT name, test_composite_table_input(employee.*) FROM employee;
  name | test_composite_table_input 
 ------+----------------------------
@@ -876,7 +876,7 @@ CREATE TYPE named_pair AS (
 );
 CREATE OR REPLACE FUNCTION test_composite_type_input(p named_pair) RETURNS integer AS $$
 return sum(p.values())
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT test_composite_type_input(row(1, 2));
  test_composite_type_input 
 ---------------------------
@@ -896,7 +896,7 @@ SELECT test_composite_type_input(row(1, 2));
 CREATE TYPE nnint_container AS (f1 int, f2 nnint);
 CREATE FUNCTION nnint_test(x int, y int) RETURNS nnint_container AS $$
 return {'f1': x, 'f2': y}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT nnint_test(null, 3);
  nnint_test 
 ------------
@@ -913,7 +913,7 @@ PL/Python function "nnint_test"
 CREATE DOMAIN ordered_named_pair AS named_pair_2 CHECK((VALUE).i <= (VALUE).j);
 CREATE FUNCTION read_ordered_named_pair(p ordered_named_pair) RETURNS integer AS $$
 return p['i'] + p['j']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT read_ordered_named_pair(row(1, 2));
  read_ordered_named_pair 
 -------------------------
@@ -924,7 +924,7 @@ SELECT read_ordered_named_pair(row(2, 1));  -- fail
 ERROR:  value for domain ordered_named_pair violates check constraint "ordered_named_pair_check"
 CREATE FUNCTION build_ordered_named_pair(i int, j int) RETURNS ordered_named_pair AS $$
 return {'i': i, 'j': j}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT build_ordered_named_pair(1,2);
  build_ordered_named_pair 
 --------------------------
@@ -937,7 +937,7 @@ CONTEXT:  while creating return value
 PL/Python function "build_ordered_named_pair"
 CREATE FUNCTION build_ordered_named_pairs(i int, j int) RETURNS ordered_named_pair[] AS $$
 return [{'i': i, 'j': j}, {'i': i, 'j': j+1}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT build_ordered_named_pairs(1,2);
  build_ordered_named_pairs 
 ---------------------------
@@ -952,7 +952,7 @@ PL/Python function "build_ordered_named_pairs"
 -- Prepared statements
 --
 CREATE OR REPLACE FUNCTION test_prep_bool_input() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT CASE WHEN $1 THEN 1 ELSE 0 END AS val", ['boolean'])
 rv = plpy.execute(plan, ['fa'], 5) # 'fa' is true in Python
@@ -965,7 +965,7 @@ SELECT test_prep_bool_input(); -- 1
 (1 row)
 
 CREATE OR REPLACE FUNCTION test_prep_bool_output() RETURNS bool
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT $1 = 1 AS val", ['int'])
 rv = plpy.execute(plan, [0], 5)
@@ -980,7 +980,7 @@ INFO:  {'val': False}
 (1 row)
 
 CREATE OR REPLACE FUNCTION test_prep_bytea_input(bb bytea) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT octet_length($1) AS val", ['bytea'])
 rv = plpy.execute(plan, [bb], 5)
@@ -993,7 +993,7 @@ SELECT test_prep_bytea_input(E'a\\000b'); -- 3 (embedded null formerly truncated
 (1 row)
 
 CREATE OR REPLACE FUNCTION test_prep_bytea_output() RETURNS bytea
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT decode('aa00bb', 'hex') AS val")
 rv = plpy.execute(plan, [], 5)
@@ -1001,7 +1001,7 @@ plpy.info(rv[0])
 return rv[0]['val']
 $$;
 SELECT test_prep_bytea_output();
-INFO:  {'val': '\xaa\x00\xbb'}
+INFO:  {'val': b'\xaa\x00\xbb'}
  test_prep_bytea_output 
 ------------------------
  \xaa00bb
diff --git a/src/pl/plpython/expected/plpython_types_3.out b/src/pl/plpython/expected/plpython_types_3.out
deleted file mode 100644
index a6ec10d5e18..00000000000
--- a/src/pl/plpython/expected/plpython_types_3.out
+++ /dev/null
@@ -1,1009 +0,0 @@
---
--- Test data type behavior
---
---
--- Base/common types
---
-CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_bool(true);
-INFO:  (True, <class 'bool'>)
- test_type_conversion_bool 
----------------------------
- t
-(1 row)
-
-SELECT * FROM test_type_conversion_bool(false);
-INFO:  (False, <class 'bool'>)
- test_type_conversion_bool 
----------------------------
- f
-(1 row)
-
-SELECT * FROM test_type_conversion_bool(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_bool 
----------------------------
- 
-(1 row)
-
--- test various other ways to express Booleans in Python
-CREATE FUNCTION test_type_conversion_bool_other(n int) RETURNS bool AS $$
-# numbers
-if n == 0:
-   ret = 0
-elif n == 1:
-   ret = 5
-# strings
-elif n == 2:
-   ret = ''
-elif n == 3:
-   ret = 'fa' # true in Python, false in PostgreSQL
-# containers
-elif n == 4:
-   ret = []
-elif n == 5:
-   ret = [0]
-plpy.info(ret, not not ret)
-return ret
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_bool_other(0);
-INFO:  (0, False)
- test_type_conversion_bool_other 
----------------------------------
- f
-(1 row)
-
-SELECT * FROM test_type_conversion_bool_other(1);
-INFO:  (5, True)
- test_type_conversion_bool_other 
----------------------------------
- t
-(1 row)
-
-SELECT * FROM test_type_conversion_bool_other(2);
-INFO:  ('', False)
- test_type_conversion_bool_other 
----------------------------------
- f
-(1 row)
-
-SELECT * FROM test_type_conversion_bool_other(3);
-INFO:  ('fa', True)
- test_type_conversion_bool_other 
----------------------------------
- t
-(1 row)
-
-SELECT * FROM test_type_conversion_bool_other(4);
-INFO:  ([], False)
- test_type_conversion_bool_other 
----------------------------------
- f
-(1 row)
-
-SELECT * FROM test_type_conversion_bool_other(5);
-INFO:  ([0], True)
- test_type_conversion_bool_other 
----------------------------------
- t
-(1 row)
-
-CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_char('a');
-INFO:  ('a', <class 'str'>)
- test_type_conversion_char 
----------------------------
- a
-(1 row)
-
-SELECT * FROM test_type_conversion_char(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_char 
----------------------------
- 
-(1 row)
-
-CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_int2(100::int2);
-INFO:  (100, <class 'int'>)
- test_type_conversion_int2 
----------------------------
-                       100
-(1 row)
-
-SELECT * FROM test_type_conversion_int2(-100::int2);
-INFO:  (-100, <class 'int'>)
- test_type_conversion_int2 
----------------------------
-                      -100
-(1 row)
-
-SELECT * FROM test_type_conversion_int2(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_int2 
----------------------------
-                          
-(1 row)
-
-CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_int4(100);
-INFO:  (100, <class 'int'>)
- test_type_conversion_int4 
----------------------------
-                       100
-(1 row)
-
-SELECT * FROM test_type_conversion_int4(-100);
-INFO:  (-100, <class 'int'>)
- test_type_conversion_int4 
----------------------------
-                      -100
-(1 row)
-
-SELECT * FROM test_type_conversion_int4(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_int4 
----------------------------
-                          
-(1 row)
-
-CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_int8(100);
-INFO:  (100, <class 'int'>)
- test_type_conversion_int8 
----------------------------
-                       100
-(1 row)
-
-SELECT * FROM test_type_conversion_int8(-100);
-INFO:  (-100, <class 'int'>)
- test_type_conversion_int8 
----------------------------
-                      -100
-(1 row)
-
-SELECT * FROM test_type_conversion_int8(5000000000);
-INFO:  (5000000000, <class 'int'>)
- test_type_conversion_int8 
----------------------------
-                5000000000
-(1 row)
-
-SELECT * FROM test_type_conversion_int8(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_int8 
----------------------------
-                          
-(1 row)
-
-CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$
-# print just the class name, not the type, to avoid differences
-# between decimal and cdecimal
-plpy.info(str(x), x.__class__.__name__)
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_numeric(100);
-INFO:  ('100', 'Decimal')
- test_type_conversion_numeric 
-------------------------------
-                          100
-(1 row)
-
-SELECT * FROM test_type_conversion_numeric(-100);
-INFO:  ('-100', 'Decimal')
- test_type_conversion_numeric 
-------------------------------
-                         -100
-(1 row)
-
-SELECT * FROM test_type_conversion_numeric(100.0);
-INFO:  ('100.0', 'Decimal')
- test_type_conversion_numeric 
-------------------------------
-                        100.0
-(1 row)
-
-SELECT * FROM test_type_conversion_numeric(100.00);
-INFO:  ('100.00', 'Decimal')
- test_type_conversion_numeric 
-------------------------------
-                       100.00
-(1 row)
-
-SELECT * FROM test_type_conversion_numeric(5000000000.5);
-INFO:  ('5000000000.5', 'Decimal')
- test_type_conversion_numeric 
-------------------------------
-                 5000000000.5
-(1 row)
-
-SELECT * FROM test_type_conversion_numeric(1234567890.0987654321);
-INFO:  ('1234567890.0987654321', 'Decimal')
- test_type_conversion_numeric 
-------------------------------
-        1234567890.0987654321
-(1 row)
-
-SELECT * FROM test_type_conversion_numeric(-1234567890.0987654321);
-INFO:  ('-1234567890.0987654321', 'Decimal')
- test_type_conversion_numeric 
-------------------------------
-       -1234567890.0987654321
-(1 row)
-
-SELECT * FROM test_type_conversion_numeric(null);
-INFO:  ('None', 'NoneType')
- test_type_conversion_numeric 
-------------------------------
-                             
-(1 row)
-
-CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_float4(100);
-INFO:  (100.0, <class 'float'>)
- test_type_conversion_float4 
------------------------------
-                         100
-(1 row)
-
-SELECT * FROM test_type_conversion_float4(-100);
-INFO:  (-100.0, <class 'float'>)
- test_type_conversion_float4 
------------------------------
-                        -100
-(1 row)
-
-SELECT * FROM test_type_conversion_float4(5000.5);
-INFO:  (5000.5, <class 'float'>)
- test_type_conversion_float4 
------------------------------
-                      5000.5
-(1 row)
-
-SELECT * FROM test_type_conversion_float4(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_float4 
------------------------------
-                            
-(1 row)
-
-CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_float8(100);
-INFO:  (100.0, <class 'float'>)
- test_type_conversion_float8 
------------------------------
-                         100
-(1 row)
-
-SELECT * FROM test_type_conversion_float8(-100);
-INFO:  (-100.0, <class 'float'>)
- test_type_conversion_float8 
------------------------------
-                        -100
-(1 row)
-
-SELECT * FROM test_type_conversion_float8(5000000000.5);
-INFO:  (5000000000.5, <class 'float'>)
- test_type_conversion_float8 
------------------------------
-                5000000000.5
-(1 row)
-
-SELECT * FROM test_type_conversion_float8(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_float8 
------------------------------
-                            
-(1 row)
-
-SELECT * FROM test_type_conversion_float8(100100100.654321);
-INFO:  (100100100.654321, <class 'float'>)
- test_type_conversion_float8 
------------------------------
-            100100100.654321
-(1 row)
-
-CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_oid(100);
-INFO:  (100, <class 'int'>)
- test_type_conversion_oid 
---------------------------
-                      100
-(1 row)
-
-SELECT * FROM test_type_conversion_oid(2147483649);
-INFO:  (2147483649, <class 'int'>)
- test_type_conversion_oid 
---------------------------
-               2147483649
-(1 row)
-
-SELECT * FROM test_type_conversion_oid(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_oid 
---------------------------
-                         
-(1 row)
-
-CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_text('hello world');
-INFO:  ('hello world', <class 'str'>)
- test_type_conversion_text 
----------------------------
- hello world
-(1 row)
-
-SELECT * FROM test_type_conversion_text(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_text 
----------------------------
- 
-(1 row)
-
-CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_bytea('hello world');
-INFO:  (b'hello world', <class 'bytes'>)
- test_type_conversion_bytea 
-----------------------------
- \x68656c6c6f20776f726c64
-(1 row)
-
-SELECT * FROM test_type_conversion_bytea(E'null\\000byte');
-INFO:  (b'null\x00byte', <class 'bytes'>)
- test_type_conversion_bytea 
-----------------------------
- \x6e756c6c0062797465
-(1 row)
-
-SELECT * FROM test_type_conversion_bytea(null);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_bytea 
-----------------------------
- 
-(1 row)
-
-CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$
-import marshal
-return marshal.dumps('hello world')
-$$ LANGUAGE plpython3u;
-CREATE FUNCTION test_type_unmarshal(x bytea) RETURNS text AS $$
-import marshal
-try:
-    return marshal.loads(x)
-except ValueError as e:
-    return 'FAILED: ' + str(e)
-$$ LANGUAGE plpython3u;
-SELECT test_type_unmarshal(x) FROM test_type_marshal() x;
- test_type_unmarshal 
----------------------
- hello world
-(1 row)
-
---
--- Domains
---
-CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL);
-CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$
-return y
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_booltrue(true, true);
- test_type_conversion_booltrue 
--------------------------------
- t
-(1 row)
-
-SELECT * FROM test_type_conversion_booltrue(false, true);
-ERROR:  value for domain booltrue violates check constraint "booltrue_check"
-SELECT * FROM test_type_conversion_booltrue(true, false);
-ERROR:  value for domain booltrue violates check constraint "booltrue_check"
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_booltrue"
-CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0);
-CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$
-plpy.info(x, type(x))
-return y
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_uint2(100::uint2, 50);
-INFO:  (100, <class 'int'>)
- test_type_conversion_uint2 
-----------------------------
-                         50
-(1 row)
-
-SELECT * FROM test_type_conversion_uint2(100::uint2, -50);
-INFO:  (100, <class 'int'>)
-ERROR:  value for domain uint2 violates check constraint "uint2_check"
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_uint2"
-SELECT * FROM test_type_conversion_uint2(null, 1);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_uint2 
-----------------------------
-                          1
-(1 row)
-
-CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL);
-CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$
-return y
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_nnint(10, 20);
- test_type_conversion_nnint 
-----------------------------
-                         20
-(1 row)
-
-SELECT * FROM test_type_conversion_nnint(null, 20);
-ERROR:  value for domain nnint violates check constraint "nnint_check"
-SELECT * FROM test_type_conversion_nnint(10, null);
-ERROR:  value for domain nnint violates check constraint "nnint_check"
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_nnint"
-CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT NULL);
-CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$
-plpy.info(x, type(x))
-return y
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold');
-INFO:  (b'hello wold', <class 'bytes'>)
- test_type_conversion_bytea10 
-------------------------------
- \x68656c6c6f20776f6c64
-(1 row)
-
-SELECT * FROM test_type_conversion_bytea10('hello world', 'hello wold');
-ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
-SELECT * FROM test_type_conversion_bytea10('hello word', 'hello world');
-INFO:  (b'hello word', <class 'bytes'>)
-ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_bytea10"
-SELECT * FROM test_type_conversion_bytea10(null, 'hello word');
-ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
-SELECT * FROM test_type_conversion_bytea10('hello word', null);
-INFO:  (b'hello word', <class 'bytes'>)
-ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_bytea10"
---
--- Arrays
---
-CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]);
-INFO:  ([0, 100], <class 'list'>)
- test_type_conversion_array_int4 
----------------------------------
- {0,100}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]);
-INFO:  ([0, -100, 55], <class 'list'>)
- test_type_conversion_array_int4 
----------------------------------
- {0,-100,55}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_int4(ARRAY[NULL,1]);
-INFO:  ([None, 1], <class 'list'>)
- test_type_conversion_array_int4 
----------------------------------
- {NULL,1}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_int4(ARRAY[]::integer[]);
-INFO:  ([], <class 'list'>)
- test_type_conversion_array_int4 
----------------------------------
- {}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_int4(NULL);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_array_int4 
----------------------------------
- 
-(1 row)
-
-SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]);
-INFO:  ([[1, 2, 3], [4, 5, 6]], <class 'list'>)
- test_type_conversion_array_int4 
----------------------------------
- {{1,2,3},{4,5,6}}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_int4(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]);
-INFO:  ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], <class 'list'>)
-          test_type_conversion_array_int4          
----------------------------------------------------
- {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_int4('[2:4]={1,2,3}');
-INFO:  ([1, 2, 3], <class 'list'>)
- test_type_conversion_array_int4 
----------------------------------
- {1,2,3}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_int8(x int8[]) RETURNS int8[] AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_int8(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]::int8[]);
-INFO:  ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], <class 'list'>)
-          test_type_conversion_array_int8          
----------------------------------------------------
- {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_date(x date[]) RETURNS date[] AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22',NULL],[NULL,'2016-10-21','2016-10-22']],
-            [[NULL,'2016-11-21','2016-10-21'],['2015-09-21','2015-09-22','2014-09-21']]]::date[]);
-INFO:  ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016']], [[None, '11-21-2016', '10-21-2016'], ['09-21-2015', '09-22-2015', '09-21-2014']]], <class 'list'>)
-                                                 test_type_conversion_array_date                                                 
----------------------------------------------------------------------------------------------------------------------------------
- {{{09-21-2016,09-22-2016,NULL},{NULL,10-21-2016,10-22-2016}},{{NULL,11-21-2016,10-21-2016},{09-21-2015,09-22-2015,09-21-2014}}}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_timestamp(x timestamp[]) RETURNS timestamp[] AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_timestamp(ARRAY[[['2016-09-21 15:34:24.078792-04','2016-10-22 11:34:24.078795-04',NULL],
-            [NULL,'2016-10-21 11:34:25.078792-04','2016-10-21 11:34:24.098792-04']],
-            [[NULL,'2016-01-21 11:34:24.078792-04','2016-11-21 11:34:24.108792-04'],
-            ['2015-09-21 11:34:24.079792-04','2014-09-21 11:34:24.078792-04','2013-09-21 11:34:24.078792-04']]]::timestamp[]);
-INFO:  ([[['Wed Sep 21 15:34:24.078792 2016', 'Sat Oct 22 11:34:24.078795 2016', None], [None, 'Fri Oct 21 11:34:25.078792 2016', 'Fri Oct 21 11:34:24.098792 2016']], [[None, 'Thu Jan 21 11:34:24.078792 2016', 'Mon Nov 21 11:34:24.108792 2016'], ['Mon Sep 21 11:34:24.079792 2015', 'Sun Sep 21 11:34:24.078792 2014', 'Sat Sep 21 11:34:24.078792 2013']]], <class 'list'>)
-                                                                                                                                                      test_type_conversion_array_timestamp                                                                                                                                                      
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- {{{"Wed Sep 21 15:34:24.078792 2016","Sat Oct 22 11:34:24.078795 2016",NULL},{NULL,"Fri Oct 21 11:34:25.078792 2016","Fri Oct 21 11:34:24.098792 2016"}},{{NULL,"Thu Jan 21 11:34:24.078792 2016","Mon Nov 21 11:34:24.108792 2016"},{"Mon Sep 21 11:34:24.079792 2015","Sun Sep 21 11:34:24.078792 2014","Sat Sep 21 11:34:24.078792 2013"}}}
-(1 row)
-
-CREATE OR REPLACE FUNCTION pyreturnmultidemint4(h int4, i int4, j int4, k int4 ) RETURNS int4[] AS $BODY$
-m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
-plpy.info(m, type(m))
-return m
-$BODY$ LANGUAGE plpython3u;
-select pyreturnmultidemint4(8,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]], [[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]]], <class 'list'>)
-                                                                                                                                                                                                                                                                             pyreturnmultidemint4                                                                                                                                                                                                                                                                              
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- {{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}},{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}}}
-(1 row)
-
-CREATE OR REPLACE FUNCTION pyreturnmultidemint8(h int4, i int4, j int4, k int4 ) RETURNS int8[] AS $BODY$
-m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
-plpy.info(m, type(m))
-return m
-$BODY$ LANGUAGE plpython3u;
-select pyreturnmultidemint8(5,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]], [[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]]], <class 'list'>)
-                                                                                                                                                                                   pyreturnmultidemint8                                                                                                                                                                                    
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- {{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}},{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}}}
-(1 row)
-
-CREATE OR REPLACE FUNCTION pyreturnmultidemfloat4(h int4, i int4, j int4, k int4 ) RETURNS float4[] AS $BODY$
-m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
-plpy.info(m, type(m))
-return m
-$BODY$ LANGUAGE plpython3u;
-select pyreturnmultidemfloat4(6,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]], [[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]]], <class 'list'>)
-                                                                                                                                                                                                                pyreturnmultidemfloat4                                                                                                                                                                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- {{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}},{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}}}
-(1 row)
-
-CREATE OR REPLACE FUNCTION pyreturnmultidemfloat8(h int4, i int4, j int4, k int4 ) RETURNS float8[] AS $BODY$
-m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
-plpy.info(m, type(m))
-return m
-$BODY$ LANGUAGE plpython3u;
-select pyreturnmultidemfloat8(7,5,3,2);
-INFO:  ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]], [[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]]], <class 'list'>)
-                                                                                                                                                                                                                                              pyreturnmultidemfloat8                                                                                                                                                                                                                                               
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- {{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}},{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}}}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_text(x text[]) RETURNS text[] AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_text(ARRAY['foo', 'bar']);
-INFO:  (['foo', 'bar'], <class 'list'>)
- test_type_conversion_array_text 
----------------------------------
- {foo,bar}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar2']]);
-INFO:  ([['foo', 'bar'], ['foo2', 'bar2']], <class 'list'>)
- test_type_conversion_array_text 
----------------------------------
- {{foo,bar},{foo2,bar2}}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]);
-INFO:  ([b'\xde\xad\xbe\xef', None], <class 'list'>)
- test_type_conversion_array_bytea 
-----------------------------------
- {"\\xdeadbeef",NULL}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$
-return [123, 'abc']
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_mixed1();
- test_type_conversion_array_mixed1 
------------------------------------
- {123,abc}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$
-return [123, 'abc']
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_mixed2();
-ERROR:  invalid input syntax for type integer: "abc"
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_array_mixed2"
-CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$
-return [[1,2,3],[4,5]]
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_mdarray_malformed();
-ERROR:  wrong length of inner sequence: has length 2, but 3 was expected
-DETAIL:  To construct a multidimensional array, the inner sequences must all have the same length.
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_mdarray_malformed"
-CREATE FUNCTION test_type_conversion_mdarray_toodeep() RETURNS int[] AS $$
-return [[[[[[[1]]]]]]]
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_mdarray_toodeep();
-ERROR:  number of array dimensions exceeds the maximum allowed (6)
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_mdarray_toodeep"
-CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$
-return [{'first': 'one', 'second': 42}, {'first': 'two', 'second': 11}]
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_record();
- test_type_conversion_array_record 
------------------------------------
- {"(one,42)","(two,11)"}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$
-return 'abc'
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_string();
- test_type_conversion_array_string 
------------------------------------
- {a,b,c}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$
-return ('abc', 'def')
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_tuple();
- test_type_conversion_array_tuple 
-----------------------------------
- {abc,def}
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$
-return 5
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_error();
-ERROR:  return value of function with array return type is not a Python sequence
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_array_error"
---
--- Domains over arrays
---
-CREATE DOMAIN ordered_pair_domain AS integer[] CHECK (array_length(VALUE,1)=2 AND VALUE[1] < VALUE[2]);
-CREATE FUNCTION test_type_conversion_array_domain(x ordered_pair_domain) RETURNS ordered_pair_domain AS $$
-plpy.info(x, type(x))
-return x
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain);
-INFO:  ([0, 100], <class 'list'>)
- test_type_conversion_array_domain 
------------------------------------
- {0,100}
-(1 row)
-
-SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain);
-INFO:  (None, <class 'NoneType'>)
- test_type_conversion_array_domain 
------------------------------------
- 
-(1 row)
-
-CREATE FUNCTION test_type_conversion_array_domain_check_violation() RETURNS ordered_pair_domain AS $$
-return [2,1]
-$$ LANGUAGE plpython3u;
-SELECT * FROM test_type_conversion_array_domain_check_violation();
-ERROR:  value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check"
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_array_domain_check_violation"
---
--- Arrays of domains
---
-CREATE FUNCTION test_read_uint2_array(x uint2[]) RETURNS uint2 AS $$
-plpy.info(x, type(x))
-return x[0]
-$$ LANGUAGE plpythonu;
-select test_read_uint2_array(array[1::uint2]);
-INFO:  ([1], <class 'list'>)
- test_read_uint2_array 
------------------------
-                     1
-(1 row)
-
-CREATE FUNCTION test_build_uint2_array(x int2) RETURNS uint2[] AS $$
-return [x, x]
-$$ LANGUAGE plpythonu;
-select test_build_uint2_array(1::int2);
- test_build_uint2_array 
-------------------------
- {1,1}
-(1 row)
-
-select test_build_uint2_array(-1::int2);  -- fail
-ERROR:  value for domain uint2 violates check constraint "uint2_check"
-CONTEXT:  while creating return value
-PL/Python function "test_build_uint2_array"
---
--- ideally this would work, but for now it doesn't, because the return value
--- is [[2,4], [2,4]] which our conversion code thinks should become a 2-D
--- integer array, not an array of arrays.
---
-CREATE FUNCTION test_type_conversion_domain_array(x integer[])
-  RETURNS ordered_pair_domain[] AS $$
-return [x, x]
-$$ LANGUAGE plpythonu;
-select test_type_conversion_domain_array(array[2,4]);
-ERROR:  return value of function with array return type is not a Python sequence
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_domain_array"
-select test_type_conversion_domain_array(array[4,2]);  -- fail
-ERROR:  return value of function with array return type is not a Python sequence
-CONTEXT:  while creating return value
-PL/Python function "test_type_conversion_domain_array"
-CREATE FUNCTION test_type_conversion_domain_array2(x ordered_pair_domain)
-  RETURNS integer AS $$
-plpy.info(x, type(x))
-return x[1]
-$$ LANGUAGE plpythonu;
-select test_type_conversion_domain_array2(array[2,4]);
-INFO:  ([2, 4], <class 'list'>)
- test_type_conversion_domain_array2 
-------------------------------------
-                                  4
-(1 row)
-
-select test_type_conversion_domain_array2(array[4,2]);  -- fail
-ERROR:  value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check"
-CREATE FUNCTION test_type_conversion_array_domain_array(x ordered_pair_domain[])
-  RETURNS ordered_pair_domain AS $$
-plpy.info(x, type(x))
-return x[0]
-$$ LANGUAGE plpythonu;
-select test_type_conversion_array_domain_array(array[array[2,4]::ordered_pair_domain]);
-INFO:  ([[2, 4]], <class 'list'>)
- test_type_conversion_array_domain_array 
------------------------------------------
- {2,4}
-(1 row)
-
----
---- Composite types
----
-CREATE TABLE employee (
-    name text,
-    basesalary integer,
-    bonus integer
-);
-INSERT INTO employee VALUES ('John', 100, 10), ('Mary', 200, 10);
-CREATE OR REPLACE FUNCTION test_composite_table_input(e employee) RETURNS integer AS $$
-return e['basesalary'] + e['bonus']
-$$ LANGUAGE plpython3u;
-SELECT name, test_composite_table_input(employee.*) FROM employee;
- name | test_composite_table_input 
-------+----------------------------
- John |                        110
- Mary |                        210
-(2 rows)
-
-ALTER TABLE employee DROP bonus;
-SELECT name, test_composite_table_input(employee.*) FROM employee;
-ERROR:  KeyError: 'bonus'
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "test_composite_table_input", line 2, in <module>
-    return e['basesalary'] + e['bonus']
-PL/Python function "test_composite_table_input"
-ALTER TABLE employee ADD bonus integer;
-UPDATE employee SET bonus = 10;
-SELECT name, test_composite_table_input(employee.*) FROM employee;
- name | test_composite_table_input 
-------+----------------------------
- John |                        110
- Mary |                        210
-(2 rows)
-
-CREATE TYPE named_pair AS (
-    i integer,
-    j integer
-);
-CREATE OR REPLACE FUNCTION test_composite_type_input(p named_pair) RETURNS integer AS $$
-return sum(p.values())
-$$ LANGUAGE plpython3u;
-SELECT test_composite_type_input(row(1, 2));
- test_composite_type_input 
----------------------------
-                         3
-(1 row)
-
-ALTER TYPE named_pair RENAME TO named_pair_2;
-SELECT test_composite_type_input(row(1, 2));
- test_composite_type_input 
----------------------------
-                         3
-(1 row)
-
---
--- Domains within composite
---
-CREATE TYPE nnint_container AS (f1 int, f2 nnint);
-CREATE FUNCTION nnint_test(x int, y int) RETURNS nnint_container AS $$
-return {'f1': x, 'f2': y}
-$$ LANGUAGE plpythonu;
-SELECT nnint_test(null, 3);
- nnint_test 
-------------
- (,3)
-(1 row)
-
-SELECT nnint_test(3, null);  -- fail
-ERROR:  value for domain nnint violates check constraint "nnint_check"
-CONTEXT:  while creating return value
-PL/Python function "nnint_test"
---
--- Domains of composite
---
-CREATE DOMAIN ordered_named_pair AS named_pair_2 CHECK((VALUE).i <= (VALUE).j);
-CREATE FUNCTION read_ordered_named_pair(p ordered_named_pair) RETURNS integer AS $$
-return p['i'] + p['j']
-$$ LANGUAGE plpythonu;
-SELECT read_ordered_named_pair(row(1, 2));
- read_ordered_named_pair 
--------------------------
-                       3
-(1 row)
-
-SELECT read_ordered_named_pair(row(2, 1));  -- fail
-ERROR:  value for domain ordered_named_pair violates check constraint "ordered_named_pair_check"
-CREATE FUNCTION build_ordered_named_pair(i int, j int) RETURNS ordered_named_pair AS $$
-return {'i': i, 'j': j}
-$$ LANGUAGE plpythonu;
-SELECT build_ordered_named_pair(1,2);
- build_ordered_named_pair 
---------------------------
- (1,2)
-(1 row)
-
-SELECT build_ordered_named_pair(2,1);  -- fail
-ERROR:  value for domain ordered_named_pair violates check constraint "ordered_named_pair_check"
-CONTEXT:  while creating return value
-PL/Python function "build_ordered_named_pair"
-CREATE FUNCTION build_ordered_named_pairs(i int, j int) RETURNS ordered_named_pair[] AS $$
-return [{'i': i, 'j': j}, {'i': i, 'j': j+1}]
-$$ LANGUAGE plpythonu;
-SELECT build_ordered_named_pairs(1,2);
- build_ordered_named_pairs 
----------------------------
- {"(1,2)","(1,3)"}
-(1 row)
-
-SELECT build_ordered_named_pairs(2,1);  -- fail
-ERROR:  value for domain ordered_named_pair violates check constraint "ordered_named_pair_check"
-CONTEXT:  while creating return value
-PL/Python function "build_ordered_named_pairs"
---
--- Prepared statements
---
-CREATE OR REPLACE FUNCTION test_prep_bool_input() RETURNS int
-LANGUAGE plpython3u
-AS $$
-plan = plpy.prepare("SELECT CASE WHEN $1 THEN 1 ELSE 0 END AS val", ['boolean'])
-rv = plpy.execute(plan, ['fa'], 5) # 'fa' is true in Python
-return rv[0]['val']
-$$;
-SELECT test_prep_bool_input(); -- 1
- test_prep_bool_input 
-----------------------
-                    1
-(1 row)
-
-CREATE OR REPLACE FUNCTION test_prep_bool_output() RETURNS bool
-LANGUAGE plpython3u
-AS $$
-plan = plpy.prepare("SELECT $1 = 1 AS val", ['int'])
-rv = plpy.execute(plan, [0], 5)
-plpy.info(rv[0])
-return rv[0]['val']
-$$;
-SELECT test_prep_bool_output(); -- false
-INFO:  {'val': False}
- test_prep_bool_output 
------------------------
- f
-(1 row)
-
-CREATE OR REPLACE FUNCTION test_prep_bytea_input(bb bytea) RETURNS int
-LANGUAGE plpython3u
-AS $$
-plan = plpy.prepare("SELECT octet_length($1) AS val", ['bytea'])
-rv = plpy.execute(plan, [bb], 5)
-return rv[0]['val']
-$$;
-SELECT test_prep_bytea_input(E'a\\000b'); -- 3 (embedded null formerly truncated value)
- test_prep_bytea_input 
------------------------
-                     3
-(1 row)
-
-CREATE OR REPLACE FUNCTION test_prep_bytea_output() RETURNS bytea
-LANGUAGE plpython3u
-AS $$
-plan = plpy.prepare("SELECT decode('aa00bb', 'hex') AS val")
-rv = plpy.execute(plan, [], 5)
-plpy.info(rv[0])
-return rv[0]['val']
-$$;
-SELECT test_prep_bytea_output();
-INFO:  {'val': b'\xaa\x00\xbb'}
- test_prep_bytea_output 
-------------------------
- \xaa00bb
-(1 row)
-
diff --git a/src/pl/plpython/expected/plpython_unicode.out b/src/pl/plpython/expected/plpython_unicode.out
index c7546dd4587..fd54b0b88e8 100644
--- a/src/pl/plpython/expected/plpython_unicode.out
+++ b/src/pl/plpython/expected/plpython_unicode.out
@@ -11,24 +11,24 @@ CREATE TABLE unicode_test (
 	testvalue  text NOT NULL
 );
 CREATE FUNCTION unicode_return() RETURNS text AS E'
-return u"\\xA0"
-' LANGUAGE plpythonu;
+return "\\xA0"
+' LANGUAGE plpython3u;
 CREATE FUNCTION unicode_trigger() RETURNS trigger AS E'
-TD["new"]["testvalue"] = u"\\xA0"
+TD["new"]["testvalue"] = "\\xA0"
 return "MODIFY"
-' LANGUAGE plpythonu;
+' LANGUAGE plpython3u;
 CREATE TRIGGER unicode_test_bi BEFORE INSERT ON unicode_test
   FOR EACH ROW EXECUTE PROCEDURE unicode_trigger();
 CREATE FUNCTION unicode_plan1() RETURNS text AS E'
 plan = plpy.prepare("SELECT $1 AS testvalue", ["text"])
-rv = plpy.execute(plan, [u"\\xA0"], 1)
+rv = plpy.execute(plan, ["\\xA0"], 1)
 return rv[0]["testvalue"]
-' LANGUAGE plpythonu;
+' LANGUAGE plpython3u;
 CREATE FUNCTION unicode_plan2() RETURNS text AS E'
-plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", u"text"])
+plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", "text"])
 rv = plpy.execute(plan, ["foo", "bar"], 1)
 return rv[0]["testvalue"]
-' LANGUAGE plpythonu;
+' LANGUAGE plpython3u;
 SELECT unicode_return();
  unicode_return 
 ----------------
diff --git a/src/pl/plpython/expected/plpython_void.out b/src/pl/plpython/expected/plpython_void.out
index 1080d12d6b2..07d0760783e 100644
--- a/src/pl/plpython/expected/plpython_void.out
+++ b/src/pl/plpython/expected/plpython_void.out
@@ -3,14 +3,14 @@
 --
 CREATE FUNCTION test_void_func1() RETURNS void AS $$
 x = 10
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 -- illegal: can't return non-None value in void-returning func
 CREATE FUNCTION test_void_func2() RETURNS void AS $$
 return 10
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 CREATE FUNCTION test_return_none() RETURNS int AS $$
 None
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 -- Tests for functions returning void
 SELECT test_void_func1(), test_void_func1() IS NULL AS "is null";
  test_void_func1 | is null 
diff --git a/src/pl/plpython/plpy_cursorobject.c b/src/pl/plpython/plpy_cursorobject.c
index 08d8b607e38..f8591358bc8 100644
--- a/src/pl/plpython/plpy_cursorobject.c
+++ b/src/pl/plpython/plpy_cursorobject.c
@@ -40,7 +40,7 @@ static PyTypeObject PLy_CursorType = {
 	.tp_name = "PLyCursor",
 	.tp_basicsize = sizeof(PLyCursorObject),
 	.tp_dealloc = PLy_cursor_dealloc,
-	.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_ITER,
+	.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
 	.tp_doc = PLy_cursor_doc,
 	.tp_iter = PyObject_SelfIter,
 	.tp_iternext = PLy_cursor_iternext,
diff --git a/src/pl/plpython/plpy_main.c b/src/pl/plpython/plpy_main.c
index 3eedaa80da7..21303c1586b 100644
--- a/src/pl/plpython/plpy_main.c
+++ b/src/pl/plpython/plpy_main.c
@@ -28,27 +28,13 @@
  * exported functions
  */
 
-#if PY_MAJOR_VERSION >= 3
-/* Use separate names to reduce confusion */
-#define plpython_validator plpython3_validator
-#define plpython_call_handler plpython3_call_handler
-#define plpython_inline_handler plpython3_inline_handler
-#endif
-
 extern void _PG_init(void);
 
 PG_MODULE_MAGIC;
 
-PG_FUNCTION_INFO_V1(plpython_validator);
-PG_FUNCTION_INFO_V1(plpython_call_handler);
-PG_FUNCTION_INFO_V1(plpython_inline_handler);
-
-#if PY_MAJOR_VERSION < 3
-/* Define aliases plpython2_call_handler etc */
-PG_FUNCTION_INFO_V1(plpython2_validator);
-PG_FUNCTION_INFO_V1(plpython2_call_handler);
-PG_FUNCTION_INFO_V1(plpython2_inline_handler);
-#endif
+PG_FUNCTION_INFO_V1(plpython3_validator);
+PG_FUNCTION_INFO_V1(plpython3_call_handler);
+PG_FUNCTION_INFO_V1(plpython3_inline_handler);
 
 
 static bool PLy_procedure_is_trigger(Form_pg_proc procStruct);
@@ -125,13 +111,9 @@ PLy_initialize(void)
 	if (inited)
 		return;
 
-#if PY_MAJOR_VERSION >= 3
 	PyImport_AppendInittab("plpy", PyInit_plpy);
-#endif
 	Py_Initialize();
-#if PY_MAJOR_VERSION >= 3
 	PyImport_ImportModule("plpy");
-#endif
 	PLy_init_interp();
 	PLy_init_plpy();
 	if (PyErr_Occurred())
@@ -171,7 +153,7 @@ PLy_init_interp(void)
 }
 
 Datum
-plpython_validator(PG_FUNCTION_ARGS)
+plpython3_validator(PG_FUNCTION_ARGS)
 {
 	Oid			funcoid = PG_GETARG_OID(0);
 	HeapTuple	tuple;
@@ -203,17 +185,8 @@ plpython_validator(PG_FUNCTION_ARGS)
 	PG_RETURN_VOID();
 }
 
-#if PY_MAJOR_VERSION < 3
 Datum
-plpython2_validator(PG_FUNCTION_ARGS)
-{
-	/* call plpython validator with our fcinfo so it gets our oid */
-	return plpython_validator(fcinfo);
-}
-#endif							/* PY_MAJOR_VERSION < 3 */
-
-Datum
-plpython_call_handler(PG_FUNCTION_ARGS)
+plpython3_call_handler(PG_FUNCTION_ARGS)
 {
 	bool		nonatomic;
 	Datum		retval;
@@ -284,16 +257,8 @@ plpython_call_handler(PG_FUNCTION_ARGS)
 	return retval;
 }
 
-#if PY_MAJOR_VERSION < 3
-Datum
-plpython2_call_handler(PG_FUNCTION_ARGS)
-{
-	return plpython_call_handler(fcinfo);
-}
-#endif							/* PY_MAJOR_VERSION < 3 */
-
 Datum
-plpython_inline_handler(PG_FUNCTION_ARGS)
+plpython3_inline_handler(PG_FUNCTION_ARGS)
 {
 	LOCAL_FCINFO(fake_fcinfo, 0);
 	InlineCodeBlock *codeblock = (InlineCodeBlock *) DatumGetPointer(PG_GETARG_DATUM(0));
@@ -368,14 +333,6 @@ plpython_inline_handler(PG_FUNCTION_ARGS)
 	PG_RETURN_VOID();
 }
 
-#if PY_MAJOR_VERSION < 3
-Datum
-plpython2_inline_handler(PG_FUNCTION_ARGS)
-{
-	return plpython_inline_handler(fcinfo);
-}
-#endif							/* PY_MAJOR_VERSION < 3 */
-
 static bool
 PLy_procedure_is_trigger(Form_pg_proc procStruct)
 {
diff --git a/src/pl/plpython/plpy_plpymodule.c b/src/pl/plpython/plpy_plpymodule.c
index 0365acc95b0..0eefd34afcd 100644
--- a/src/pl/plpython/plpy_plpymodule.c
+++ b/src/pl/plpython/plpy_plpymodule.c
@@ -109,7 +109,6 @@ static PyMethodDef PLy_exc_methods[] = {
 	{NULL, NULL, 0, NULL}
 };
 
-#if PY_MAJOR_VERSION >= 3
 static PyModuleDef PLy_module = {
 	PyModuleDef_HEAD_INIT,
 	.m_name = "plpy",
@@ -141,7 +140,6 @@ PyInit_plpy(void)
 
 	return m;
 }
-#endif							/* PY_MAJOR_VERSION >= 3 */
 
 void
 PLy_init_plpy(void)
@@ -150,10 +148,6 @@ PLy_init_plpy(void)
 			   *main_dict,
 			   *plpy_mod;
 
-#if PY_MAJOR_VERSION < 3
-	PyObject   *plpy;
-#endif
-
 	/*
 	 * initialize plpy module
 	 */
@@ -162,13 +156,7 @@ PLy_init_plpy(void)
 	PLy_subtransaction_init_type();
 	PLy_cursor_init_type();
 
-#if PY_MAJOR_VERSION >= 3
 	PyModule_Create(&PLy_module);
-	/* for Python 3 we initialized the exceptions in PyInit_plpy */
-#else
-	plpy = Py_InitModule("plpy", PLy_methods);
-	PLy_add_exceptions(plpy);
-#endif
 
 	/* PyDict_SetItemString(plpy, "PlanType", (PyObject *) &PLy_PlanType); */
 
@@ -191,11 +179,7 @@ PLy_add_exceptions(PyObject *plpy)
 	PyObject   *excmod;
 	HASHCTL		hash_ctl;
 
-#if PY_MAJOR_VERSION < 3
-	excmod = Py_InitModule("spiexceptions", PLy_exc_methods);
-#else
 	excmod = PyModule_Create(&PLy_exc_module);
-#endif
 	if (excmod == NULL)
 		PLy_elog(ERROR, "could not create the spiexceptions module");
 
diff --git a/src/pl/plpython/plpy_plpymodule.h b/src/pl/plpython/plpy_plpymodule.h
index 54d78101ceb..ad6436aca78 100644
--- a/src/pl/plpython/plpy_plpymodule.h
+++ b/src/pl/plpython/plpy_plpymodule.h
@@ -11,9 +11,7 @@
 extern HTAB *PLy_spi_exceptions;
 
 
-#if PY_MAJOR_VERSION >= 3
 PyMODINIT_FUNC PyInit_plpy(void);
-#endif
 extern void PLy_init_plpy(void);
 
 #endif							/* PLPY_PLPYMODULE_H */
diff --git a/src/pl/plpython/plpy_resultobject.c b/src/pl/plpython/plpy_resultobject.c
index 54f39419c84..f289617ba80 100644
--- a/src/pl/plpython/plpy_resultobject.c
+++ b/src/pl/plpython/plpy_resultobject.c
@@ -226,19 +226,11 @@ PLy_result_str(PyObject *arg)
 {
 	PLyResultObject *ob = (PLyResultObject *) arg;
 
-#if PY_MAJOR_VERSION >= 3
 	return PyUnicode_FromFormat("<%s status=%S nrows=%S rows=%S>",
 								Py_TYPE(ob)->tp_name,
 								ob->status,
 								ob->nrows,
 								ob->rows);
-#else
-	return PyString_FromFormat("<%s status=%ld nrows=%ld rows=%s>",
-							   ob->ob_type->tp_name,
-							   PyInt_AsLong(ob->status),
-							   PyInt_AsLong(ob->nrows),
-							   PyString_AsString(PyObject_Str(ob->rows)));
-#endif
 }
 
 static PyObject *
diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c
index 5e807b139f1..adf37a9b882 100644
--- a/src/pl/plpython/plpy_typeio.c
+++ b/src/pl/plpython/plpy_typeio.c
@@ -1032,25 +1032,17 @@ PLyObject_AsString(PyObject *plrv)
 	else if (PyFloat_Check(plrv))
 	{
 		/* use repr() for floats, str() is lossy */
-#if PY_MAJOR_VERSION >= 3
 		PyObject   *s = PyObject_Repr(plrv);
 
 		plrv_bo = PLyUnicode_Bytes(s);
 		Py_XDECREF(s);
-#else
-		plrv_bo = PyObject_Repr(plrv);
-#endif
 	}
 	else
 	{
-#if PY_MAJOR_VERSION >= 3
 		PyObject   *s = PyObject_Str(plrv);
 
 		plrv_bo = PLyUnicode_Bytes(s);
 		Py_XDECREF(s);
-#else
-		plrv_bo = PyObject_Str(plrv);
-#endif
 	}
 	if (!plrv_bo)
 		PLy_elog(ERROR, "could not create string representation of Python object");
diff --git a/src/pl/plpython/plpy_util.c b/src/pl/plpython/plpy_util.c
index 4a7d7264d79..693d0396c48 100644
--- a/src/pl/plpython/plpy_util.c
+++ b/src/pl/plpython/plpy_util.c
@@ -95,7 +95,6 @@ PLyUnicode_AsString(PyObject *unicode)
 	return rv;
 }
 
-#if PY_MAJOR_VERSION >= 3
 /*
  * Convert a C string in the PostgreSQL server encoding to a Python
  * unicode object.  Reference ownership is passed to the caller.
@@ -126,5 +125,3 @@ PLyUnicode_FromString(const char *s)
 {
 	return PLyUnicode_FromStringAndSize(s, strlen(s));
 }
-
-#endif							/* PY_MAJOR_VERSION >= 3 */
diff --git a/src/pl/plpython/plpy_util.h b/src/pl/plpython/plpy_util.h
index c9ba7edc0ec..7c6577925ea 100644
--- a/src/pl/plpython/plpy_util.h
+++ b/src/pl/plpython/plpy_util.h
@@ -11,9 +11,7 @@
 extern PyObject *PLyUnicode_Bytes(PyObject *unicode);
 extern char *PLyUnicode_AsString(PyObject *unicode);
 
-#if PY_MAJOR_VERSION >= 3
 extern PyObject *PLyUnicode_FromString(const char *s);
 extern PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
-#endif
 
 #endif							/* PLPY_UTIL_H */
diff --git a/src/pl/plpython/plpython.h b/src/pl/plpython/plpython.h
index 994457b37d6..68426b12f76 100644
--- a/src/pl/plpython/plpython.h
+++ b/src/pl/plpython/plpython.h
@@ -69,26 +69,21 @@
  * compatibility layer for Python 3 that when asked to convert a C
  * string to a Python string it converts the C string from the
  * PostgreSQL server encoding to a Python Unicode object.
+ *
+ * FIXME
  */
-#if PY_MAJOR_VERSION >= 3
 #define PyString_Check(x) 0
 #define PyString_AsString(x) PLyUnicode_AsString(x)
 #define PyString_FromString(x) PLyUnicode_FromString(x)
 #define PyString_FromStringAndSize(x, size) PLyUnicode_FromStringAndSize(x, size)
-#endif
 
 /*
  * Python 3 only has long.
+ *
+ * FIXME
  */
-#if PY_MAJOR_VERSION >= 3
 #define PyInt_FromLong(x) PyLong_FromLong(x)
 #define PyInt_AsLong(x) PyLong_AsLong(x)
-#endif
-
-/* Python 3 removed the Py_TPFLAGS_HAVE_ITER flag */
-#if PY_MAJOR_VERSION >= 3
-#define Py_TPFLAGS_HAVE_ITER 0
-#endif
 
 /* define our text domain for translations */
 #undef TEXTDOMAIN
diff --git a/src/pl/plpython/plpython2u--1.0.sql b/src/pl/plpython/plpython2u--1.0.sql
deleted file mode 100644
index 69f74775678..00000000000
--- a/src/pl/plpython/plpython2u--1.0.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-/* src/pl/plpython/plpython2u--1.0.sql */
-
-CREATE FUNCTION plpython2_call_handler() RETURNS language_handler
-  LANGUAGE c AS 'MODULE_PATHNAME';
-
-CREATE FUNCTION plpython2_inline_handler(internal) RETURNS void
-  STRICT LANGUAGE c AS 'MODULE_PATHNAME';
-
-CREATE FUNCTION plpython2_validator(oid) RETURNS void
-  STRICT LANGUAGE c AS 'MODULE_PATHNAME';
-
-CREATE LANGUAGE plpython2u
-  HANDLER plpython2_call_handler
-  INLINE plpython2_inline_handler
-  VALIDATOR plpython2_validator;
-
-COMMENT ON LANGUAGE plpython2u IS 'PL/Python2U untrusted procedural language';
diff --git a/src/pl/plpython/plpython2u.control b/src/pl/plpython/plpython2u.control
deleted file mode 100644
index 39c2b791efe..00000000000
--- a/src/pl/plpython/plpython2u.control
+++ /dev/null
@@ -1,7 +0,0 @@
-# plpython2u extension
-comment = 'PL/Python2U untrusted procedural language'
-default_version = '1.0'
-module_pathname = '$libdir/plpython2'
-relocatable = false
-schema = pg_catalog
-superuser = true
diff --git a/src/pl/plpython/plpythonu--1.0.sql b/src/pl/plpython/plpythonu--1.0.sql
deleted file mode 100644
index 4c6f7c3f140..00000000000
--- a/src/pl/plpython/plpythonu--1.0.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-/* src/pl/plpython/plpythonu--1.0.sql */
-
-CREATE FUNCTION plpython_call_handler() RETURNS language_handler
-  LANGUAGE c AS 'MODULE_PATHNAME';
-
-CREATE FUNCTION plpython_inline_handler(internal) RETURNS void
-  STRICT LANGUAGE c AS 'MODULE_PATHNAME';
-
-CREATE FUNCTION plpython_validator(oid) RETURNS void
-  STRICT LANGUAGE c AS 'MODULE_PATHNAME';
-
-CREATE LANGUAGE plpythonu
-  HANDLER plpython_call_handler
-  INLINE plpython_inline_handler
-  VALIDATOR plpython_validator;
-
-COMMENT ON LANGUAGE plpythonu IS 'PL/PythonU untrusted procedural language';
diff --git a/src/pl/plpython/plpythonu.control b/src/pl/plpython/plpythonu.control
deleted file mode 100644
index ae91b1c255c..00000000000
--- a/src/pl/plpython/plpythonu.control
+++ /dev/null
@@ -1,7 +0,0 @@
-# plpythonu extension
-comment = 'PL/PythonU untrusted procedural language'
-default_version = '1.0'
-module_pathname = '$libdir/plpython2'
-relocatable = false
-schema = pg_catalog
-superuser = true
diff --git a/src/pl/plpython/regress-python3-mangle.mk b/src/pl/plpython/regress-python3-mangle.mk
deleted file mode 100644
index a785818a172..00000000000
--- a/src/pl/plpython/regress-python3-mangle.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-ifeq ($(python_majorversion),3)
-# Adjust regression tests for Python 3 compatibility
-#
-# Mention those regression test files that need to be mangled in the
-# variable REGRESS_PLPYTHON3_MANGLE.  They will be copied to a
-# subdirectory python3/ and have their Python syntax and other bits
-# adjusted to work with Python 3.
-
-# Note that the order of the tests needs to be preserved in this
-# expression.
-REGRESS := $(foreach test,$(REGRESS),$(if $(filter $(test),$(REGRESS_PLPYTHON3_MANGLE)),python3/$(test),$(test)))
-
-.PHONY: pgregress-python3-mangle
-pgregress-python3-mangle:
-	$(MKDIR_P) sql/python3 expected/python3 results/python3
-	for file in $(patsubst %,$(srcdir)/sql/%.sql,$(REGRESS_PLPYTHON3_MANGLE)) $(patsubst %,$(srcdir)/expected/%*.out,$(REGRESS_PLPYTHON3_MANGLE)); do \
-	  sed \
-	      -e "s/<type 'exceptions\.\([[:alpha:]]*\)'>/<class '\1'>/g" \
-	      -e "s/<type 'long'>/<class 'int'>/g" \
-	      -e "s/\([0-9][0-9]*\)L/\1/g" \
-	      -e 's/\([ [{]\)u"/\1"/g' \
-	      -e "s/\([ [{]\)u'/\1'/g" \
-	      -e "s/def next/def __next__/g" \
-	      -e "s/LANGUAGE plpythonu/LANGUAGE plpython3u/g" \
-	      -e "s/LANGUAGE plpython2u/LANGUAGE plpython3u/g" \
-	      -e "s/EXTENSION plpythonu/EXTENSION plpython3u/g" \
-	      -e "s/EXTENSION plpython2u/EXTENSION plpython3u/g" \
-	      -e "s/EXTENSION \([^ ]*\)_plpythonu/EXTENSION \1_plpython3u/g" \
-	      -e "s/EXTENSION \([^ ]*\)_plpython2u/EXTENSION \1_plpython3u/g" \
-	      -e 's/installing required extension "plpython2u"/installing required extension "plpython3u"/g' \
-	    $$file >`echo $$file | sed 's,^.*/\([^/][^/]*/\)\([^/][^/]*\)$$,\1python3/\2,'` || exit; \
-	done
-
-check installcheck: pgregress-python3-mangle
-
-pg_regress_clean_files += sql/python3/ expected/python3/ results/python3/
-
-endif # Python 3
diff --git a/src/pl/plpython/sql/plpython_call.sql b/src/pl/plpython/sql/plpython_call.sql
index b0b3705ae3c..daa4bc377d7 100644
--- a/src/pl/plpython/sql/plpython_call.sql
+++ b/src/pl/plpython/sql/plpython_call.sql
@@ -3,7 +3,7 @@
 --
 
 CREATE PROCEDURE test_proc1()
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 pass
 $$;
@@ -13,7 +13,7 @@ CALL test_proc1();
 
 -- error: can't return non-None
 CREATE PROCEDURE test_proc2()
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 return 5
 $$;
@@ -24,7 +24,7 @@ CALL test_proc2();
 CREATE TABLE test1 (a int);
 
 CREATE PROCEDURE test_proc3(x int)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plpy.execute("INSERT INTO test1 VALUES (%s)" % x)
 $$;
@@ -37,7 +37,7 @@ SELECT * FROM test1;
 -- output arguments
 
 CREATE PROCEDURE test_proc5(INOUT a text)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 return [a + '+' + a]
 $$;
@@ -46,7 +46,7 @@ CALL test_proc5('abc');
 
 
 CREATE PROCEDURE test_proc6(a int, INOUT b int, INOUT c int)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 return (b * a, c * a)
 $$;
@@ -57,7 +57,7 @@ CALL test_proc6(2, 3, 4);
 -- OUT parameters
 
 CREATE PROCEDURE test_proc9(IN a int, OUT b int)
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plpy.notice("a: %s" % (a))
 return (a * 2,)
diff --git a/src/pl/plpython/sql/plpython_composite.sql b/src/pl/plpython/sql/plpython_composite.sql
index 0fd2f5d5e3b..21757701cc1 100644
--- a/src/pl/plpython/sql/plpython_composite.sql
+++ b/src/pl/plpython/sql/plpython_composite.sql
@@ -1,6 +1,6 @@
 CREATE FUNCTION multiout_simple(OUT i integer, OUT j integer) AS $$
 return (1, 2)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT multiout_simple();
 SELECT * FROM multiout_simple();
@@ -9,7 +9,7 @@ SELECT (multiout_simple()).j + 3;
 
 CREATE FUNCTION multiout_simple_setof(n integer = 1, OUT integer, OUT integer) RETURNS SETOF record AS $$
 return [(1, 2)] * n
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT multiout_simple_setof();
 SELECT * FROM multiout_simple_setof();
@@ -34,7 +34,7 @@ elif typ == 'obj':
     return type_record
 elif typ == 'str':
     return "('%s',%r)" % (first, second)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM multiout_record_as('dict', 'foo', 1, 'f');
 SELECT multiout_record_as('dict', 'foo', 1, 'f');
@@ -77,7 +77,7 @@ for i in range(n):
     power = 2 ** i
     length = plpy.execute("select length('%d')" % power)[0]['length']
     yield power, length
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM multiout_setof(3);
 SELECT multiout_setof(5);
@@ -86,7 +86,7 @@ CREATE FUNCTION multiout_return_table() RETURNS TABLE (x integer, y text) AS $$
 return [{'x': 4, 'y' :'four'},
         {'x': 7, 'y' :'seven'},
         {'x': 0, 'y' :'zero'}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM multiout_return_table();
 
@@ -94,18 +94,18 @@ CREATE FUNCTION multiout_array(OUT integer[], OUT text) RETURNS SETOF record AS
 yield [[1], 'a']
 yield [[1,2], 'b']
 yield [[1,2,3], None]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM multiout_array();
 
 CREATE FUNCTION singleout_composite(OUT type_record) AS $$
 return {'first': 1, 'second': 2}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION multiout_composite(OUT type_record) RETURNS SETOF type_record AS $$
 return [{'first': 1, 'second': 2},
        {'first': 3, 'second': 4	}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM singleout_composite();
 SELECT * FROM multiout_composite();
@@ -113,7 +113,7 @@ SELECT * FROM multiout_composite();
 -- composite OUT parameters in functions returning RECORD not supported yet
 CREATE FUNCTION multiout_composite(INOUT n integer, OUT type_record) AS $$
 return (n, (n * 2, n * 3))
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION multiout_table_type_setof(typ text, returnnull boolean, INOUT n integer, OUT table_record) RETURNS SETOF record AS $$
 if returnnull:
@@ -132,7 +132,7 @@ elif typ == 'str':
     d = "(%r,%r)" % (n * 2, n * 3)
 for i in range(n):
     yield (i, d)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM multiout_composite(2);
 SELECT * FROM multiout_table_type_setof('dict', 'f', 3);
@@ -157,7 +157,7 @@ CREATE TABLE changing (
 CREATE FUNCTION changing_test(OUT n integer, OUT changing) RETURNS SETOF record AS $$
 return [(1, {'i': 1, 'j': 2}),
         (1, (3, 4))]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM changing_test();
 ALTER TABLE changing DROP COLUMN j;
@@ -178,14 +178,14 @@ yield {'tab': [('first', 1), ('second', 2)],
 yield {'tab': [('first', 1), ('second', 2)],
       'typ': [{'first': 'third', 'second': 3},
               {'first': 'fourth', 'second': 4}]}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM composite_types_table();
 
 -- check what happens if the output record descriptor changes
 CREATE FUNCTION return_record(t text) RETURNS record AS $$
 return {'t': t, 'val': 10}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM return_record('abc') AS r(t text, val integer);
 SELECT * FROM return_record('abc') AS r(t text, val bigint);
@@ -196,7 +196,7 @@ SELECT * FROM return_record('999') AS r(val text, t integer);
 
 CREATE FUNCTION return_record_2(t text) RETURNS record AS $$
 return {'v1':1,'v2':2,t:3}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM return_record_2('v3') AS (v3 int, v2 int, v1 int);
 SELECT * FROM return_record_2('v3') AS (v2 int, v3 int, v1 int);
@@ -211,7 +211,7 @@ SELECT * FROM return_record_2('v3') AS (v1 int, v2 int, v3 int);
 -- multi-dimensional array of composite types.
 CREATE FUNCTION composite_type_as_list()  RETURNS type_record[] AS $$
   return [[('first', 1), ('second', 1)], [('first', 2), ('second', 2)], [('first', 3), ('second', 3)]];
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM composite_type_as_list();
 
 -- Starting with PostgreSQL 10, a composite type in an array cannot be
@@ -220,5 +220,5 @@ SELECT * FROM composite_type_as_list();
 -- on the issue.
 CREATE FUNCTION composite_type_as_list_broken()  RETURNS type_record[] AS $$
   return [['first', 1]];
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM composite_type_as_list_broken();
diff --git a/src/pl/plpython/sql/plpython_do.sql b/src/pl/plpython/sql/plpython_do.sql
index 0e281a08ee8..d49413268e9 100644
--- a/src/pl/plpython/sql/plpython_do.sql
+++ b/src/pl/plpython/sql/plpython_do.sql
@@ -1,5 +1,3 @@
-DO $$ plpy.notice("This is plpythonu.") $$ LANGUAGE plpythonu;
+DO $$ plpy.notice("This is plpython3u.") $$ LANGUAGE plpython3u;
 
-DO $$ plpy.notice("This is plpython2u.") $$ LANGUAGE plpython2u;
-
-DO $$ raise Exception("error test") $$ LANGUAGE plpythonu;
+DO $$ raise Exception("error test") $$ LANGUAGE plpython3u;
diff --git a/src/pl/plpython/sql/plpython_drop.sql b/src/pl/plpython/sql/plpython_drop.sql
index 72d5d657ec3..e4f373b2bc7 100644
--- a/src/pl/plpython/sql/plpython_drop.sql
+++ b/src/pl/plpython/sql/plpython_drop.sql
@@ -3,6 +3,4 @@
 --
 SET client_min_messages = WARNING;
 
-DROP EXTENSION plpythonu CASCADE;
-
-DROP EXTENSION IF EXISTS plpython2u CASCADE;
+DROP EXTENSION plpython3u CASCADE;
diff --git a/src/pl/plpython/sql/plpython_ereport.sql b/src/pl/plpython/sql/plpython_ereport.sql
index 58df2057ef5..3bcf8f5cde9 100644
--- a/src/pl/plpython/sql/plpython_ereport.sql
+++ b/src/pl/plpython/sql/plpython_ereport.sql
@@ -17,28 +17,28 @@ plpy.info('This is message text.',
 plpy.notice('notice', detail='some detail')
 plpy.warning('warning', detail='some detail')
 plpy.error('stop on error', detail='some detail', hint='some hint')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT elog_test();
 
-DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpythonu;
+DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpython3u;
 
 DO $$
 import time;
 from datetime import date
 plpy.info('other types', detail=date(2016, 2, 26))
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 DO $$
 basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
 plpy.info('other types', detail=basket)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 -- should fail
-DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu;
-DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu;
-DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu;
-DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu;
+DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpython3u;
+DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpython3u;
+DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpython3u;
+DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpython3u;
 
 -- raise exception in python, handle exception in plgsql
 CREATE OR REPLACE FUNCTION raise_exception(_message text, _detail text DEFAULT NULL, _hint text DEFAULT NULL,
@@ -57,7 +57,7 @@ kwargs = {
 }
 # ignore None values
 plpy.error(**dict((k, v) for k, v in iter(kwargs.items()) if v))
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT raise_exception('hello', 'world');
 SELECT raise_exception('message text', 'detail text', _sqlstate => 'YY333');
@@ -128,7 +128,7 @@ try:
 except Exception as e:
     plpy.info(e.spidata)
     raise e
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 DO $$
 try:
@@ -136,4 +136,4 @@ try:
 except Exception as e:
     plpy.info('sqlstate: %s, hint: %s, table_name: %s, datatype_name: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name))
     raise e
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sql
index 88d6936fd0d..11f14ec5a7c 100644
--- a/src/pl/plpython/sql/plpython_error.sql
+++ b/src/pl/plpython/sql/plpython_error.sql
@@ -7,7 +7,7 @@
 CREATE FUNCTION python_syntax_error() RETURNS text
         AS
 '.syntaxerror'
-        LANGUAGE plpythonu;
+        LANGUAGE plpython3u;
 
 /* With check_function_bodies = false the function should get defined
  * and the error reported when called
@@ -17,7 +17,7 @@ SET check_function_bodies = false;
 CREATE FUNCTION python_syntax_error() RETURNS text
         AS
 '.syntaxerror'
-        LANGUAGE plpythonu;
+        LANGUAGE plpython3u;
 
 SELECT python_syntax_error();
 /* Run the function twice to check if the hashtable entry gets cleaned up */
@@ -30,7 +30,7 @@ RESET check_function_bodies;
 CREATE FUNCTION sql_syntax_error() RETURNS text
         AS
 'plpy.execute("syntax error")'
-        LANGUAGE plpythonu;
+        LANGUAGE plpython3u;
 
 SELECT sql_syntax_error();
 
@@ -40,7 +40,7 @@ SELECT sql_syntax_error();
 CREATE FUNCTION exception_index_invalid(text) RETURNS text
 	AS
 'return args[1]'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT exception_index_invalid('test');
 
@@ -51,7 +51,7 @@ CREATE FUNCTION exception_index_invalid_nested() RETURNS text
 	AS
 'rv = plpy.execute("SELECT test5(''foo'')")
 return rv[0]'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT exception_index_invalid_nested();
 
@@ -68,7 +68,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT invalid_type_uncaught('rick');
 
@@ -90,7 +90,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT invalid_type_caught('rick');
 
@@ -111,7 +111,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT invalid_type_reraised('rick');
 
@@ -127,7 +127,7 @@ if len(rv):
 	return rv[0]["fname"]
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT valid_type('rick');
 
@@ -147,7 +147,7 @@ def fun3():
 fun3()
 return "not reached"
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT nested_error();
 
@@ -167,7 +167,7 @@ def fun3():
 fun3()
 return "not reached"
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT nested_error_raise();
 
@@ -187,7 +187,7 @@ def fun3():
 fun3()
 return "you''ve been warned"
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 SELECT nested_warning();
 
@@ -196,7 +196,7 @@ SELECT nested_warning();
 CREATE FUNCTION toplevel_attribute_error() RETURNS void AS
 $$
 plpy.nonexistent
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT toplevel_attribute_error();
 
@@ -213,7 +213,7 @@ def third():
   plpy.execute("select sql_error()")
 
 first()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$
 begin
@@ -229,7 +229,7 @@ $$ LANGUAGE plpgsql;
 
 CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$
 plpy.execute("select sql_error()")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT python_traceback();
 SELECT sql_error();
@@ -251,7 +251,7 @@ except spiexceptions.NotNullViolation as e:
     plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate)
 except spiexceptions.UniqueViolation as e:
     plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT specific_exception(2);
 SELECT specific_exception(NULL);
@@ -262,7 +262,7 @@ SELECT specific_exception(2);
 CREATE FUNCTION python_unique_violation() RETURNS void AS $$
 plpy.execute("insert into specific values (1)")
 plpy.execute("insert into specific values (1)")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$
 begin
@@ -283,7 +283,7 @@ CREATE FUNCTION manual_subxact() RETURNS void AS $$
 plpy.execute("savepoint save")
 plpy.execute("create table foo(x integer)")
 plpy.execute("rollback to save")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT manual_subxact();
 
@@ -295,7 +295,7 @@ rollback = plpy.prepare("rollback to save")
 plpy.execute(save)
 plpy.execute("create table foo(x integer)")
 plpy.execute(rollback)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT manual_subxact_prepared();
 
@@ -303,7 +303,7 @@ SELECT manual_subxact_prepared();
  */
 CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$
 raise plpy.spiexceptions.DivisionByZero()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 DO $$
 BEGIN
@@ -319,7 +319,7 @@ CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$
 exc = plpy.spiexceptions.DivisionByZero()
 exc.sqlstate = 'SILLY'
 raise exc
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 DO $$
 BEGIN
@@ -332,14 +332,14 @@ $$ LANGUAGE plpgsql;
 /* test the context stack trace for nested execution levels
  */
 CREATE FUNCTION notice_innerfunc() RETURNS int AS $$
-plpy.execute("DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$")
+plpy.execute("DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$")
 return 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION notice_outerfunc() RETURNS int AS $$
 plpy.execute("SELECT notice_innerfunc()")
 return 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 \set SHOW_CONTEXT always
 
diff --git a/src/pl/plpython/sql/plpython_global.sql b/src/pl/plpython/sql/plpython_global.sql
index 32502b41eee..96d20492861 100644
--- a/src/pl/plpython/sql/plpython_global.sql
+++ b/src/pl/plpython/sql/plpython_global.sql
@@ -9,7 +9,7 @@ CREATE FUNCTION global_test_one() returns text
 if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_one"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 
 CREATE FUNCTION global_test_two() returns text
     AS
@@ -18,7 +18,7 @@ CREATE FUNCTION global_test_two() returns text
 if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_two"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 
 
 CREATE FUNCTION static_test() returns int4
@@ -29,7 +29,7 @@ else:
 	SD["call"] = 1
 return SD["call"]
 '
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 
 
 SELECT static_test();
diff --git a/src/pl/plpython/sql/plpython_import.sql b/src/pl/plpython/sql/plpython_import.sql
index ec887677e1e..3031eef2e69 100644
--- a/src/pl/plpython/sql/plpython_import.sql
+++ b/src/pl/plpython/sql/plpython_import.sql
@@ -7,7 +7,7 @@ CREATE FUNCTION import_fail() returns text
 except ImportError:
 	return "failed as expected"
 return "succeeded, that wasn''t supposed to happen"'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 
 
 CREATE FUNCTION import_succeed() returns text
@@ -28,7 +28,7 @@ except Exception as ex:
 	plpy.notice("import failed -- %s" % str(ex))
 	return "failed, that wasn''t supposed to happen"
 return "succeeded, as expected"'
-    LANGUAGE plpythonu;
+    LANGUAGE plpython3u;
 
 CREATE FUNCTION import_test_one(p text) RETURNS text
 	AS
@@ -39,7 +39,7 @@ except ImportError:
     import sha
     digest = sha.new(p)
 return digest.hexdigest()'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 CREATE FUNCTION import_test_two(u users) RETURNS text
 	AS
@@ -51,7 +51,7 @@ except ImportError:
     import sha
     digest = sha.new(plain);
 return "sha hash of " + plain + " is " + digest.hexdigest()'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 
 -- import python modules
diff --git a/src/pl/plpython/sql/plpython_newline.sql b/src/pl/plpython/sql/plpython_newline.sql
index f9cee9491bb..cb22ba923f9 100644
--- a/src/pl/plpython/sql/plpython_newline.sql
+++ b/src/pl/plpython/sql/plpython_newline.sql
@@ -4,15 +4,15 @@
 
 CREATE OR REPLACE FUNCTION newline_lf() RETURNS integer AS
 E'x = 100\ny = 23\nreturn x + y\n'
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 
 CREATE OR REPLACE FUNCTION newline_cr() RETURNS integer AS
 E'x = 100\ry = 23\rreturn x + y\r'
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 
 CREATE OR REPLACE FUNCTION newline_crlf() RETURNS integer AS
 E'x = 100\r\ny = 23\r\nreturn x + y\r\n'
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 
 
 SELECT newline_lf();
diff --git a/src/pl/plpython/sql/plpython_params.sql b/src/pl/plpython/sql/plpython_params.sql
index ee75c4dc410..8bab4888592 100644
--- a/src/pl/plpython/sql/plpython_params.sql
+++ b/src/pl/plpython/sql/plpython_params.sql
@@ -4,13 +4,13 @@
 
 CREATE FUNCTION test_param_names0(integer, integer) RETURNS int AS $$
 return args[0] + args[1]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_param_names1(a0 integer, a1 text) RETURNS boolean AS $$
 assert a0 == args[0]
 assert a1 == args[1]
 return True
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_param_names2(u users) RETURNS text AS $$
 assert u == args[0]
@@ -22,7 +22,7 @@ if isinstance(u, dict):
 else:
     s = str(u)
 return s
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 -- use deliberately wrong parameter names
 CREATE FUNCTION test_param_names3(a0 integer) RETURNS boolean AS $$
@@ -32,7 +32,7 @@ try:
 except NameError as e:
 	assert e.args[0].find("a1") > -1
 	return True
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 
 SELECT test_param_names0(2,7);
diff --git a/src/pl/plpython/sql/plpython_quote.sql b/src/pl/plpython/sql/plpython_quote.sql
index 346b5485daf..a1133e7e266 100644
--- a/src/pl/plpython/sql/plpython_quote.sql
+++ b/src/pl/plpython/sql/plpython_quote.sql
@@ -9,7 +9,7 @@ CREATE FUNCTION quote(t text, how text) RETURNS text AS $$
         return plpy.quote_ident(t)
     else:
         raise plpy.Error("unrecognized quote type %s" % how)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT quote(t, 'literal') FROM (VALUES
        ('abc'),
diff --git a/src/pl/plpython/sql/plpython_record.sql b/src/pl/plpython/sql/plpython_record.sql
index 9bab4c9e82d..52bad8bccea 100644
--- a/src/pl/plpython/sql/plpython_record.sql
+++ b/src/pl/plpython/sql/plpython_record.sql
@@ -27,7 +27,7 @@ elif typ == 'obj':
 	type_record.first = first
 	type_record.second = second
 	return type_record
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_type_record_as(typ text, first text, second integer, retnull boolean) RETURNS type_record AS $$
 if retnull:
@@ -45,20 +45,20 @@ elif typ == 'obj':
 	return type_record
 elif typ == 'str':
 	return "('%s',%r)" % (first, second)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_in_out_params(first in text, second out text) AS $$
 return first + '_in_to_out';
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_in_out_params_multi(first in text,
                                          second out text, third out text) AS $$
 return (first + '_record_in_to_out_1', first + '_record_in_to_out_2');
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_inout_params(first inout text) AS $$
 return first + '_inout';
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 
 -- Test tuple returning functions
@@ -136,14 +136,14 @@ SELECT * FROM test_type_record_as('obj', 'one', 1, false);
 
 CREATE FUNCTION test_type_record_error1() RETURNS type_record AS $$
     return { 'first': 'first' }
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_record_error1();
 
 
 CREATE FUNCTION test_type_record_error2() RETURNS type_record AS $$
     return [ 'first' ]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_record_error2();
 
@@ -152,12 +152,12 @@ CREATE FUNCTION test_type_record_error3() RETURNS type_record AS $$
     class type_record: pass
     type_record.first = 'first'
     return type_record
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_record_error3();
 
 CREATE FUNCTION test_type_record_error4() RETURNS type_record AS $$
     return 'foo'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_record_error4();
diff --git a/src/pl/plpython/sql/plpython_setof.sql b/src/pl/plpython/sql/plpython_setof.sql
index 16c2eef0ad6..4cfb10192c0 100644
--- a/src/pl/plpython/sql/plpython_setof.sql
+++ b/src/pl/plpython/sql/plpython_setof.sql
@@ -4,21 +4,21 @@
 
 CREATE FUNCTION test_setof_error() RETURNS SETOF text AS $$
 return 37
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT test_setof_error();
 
 
 CREATE FUNCTION test_setof_as_list(count integer, content text) RETURNS SETOF text AS $$
 return [ content ]*count
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_setof_as_tuple(count integer, content text) RETURNS SETOF text AS $$
 t = ()
 for i in range(count):
 	t += ( content, )
 return t
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_setof_as_iterator(count integer, content text) RETURNS SETOF text AS $$
 class producer:
@@ -27,13 +27,13 @@ class producer:
 		self.icount = icount
 	def __iter__ (self):
 		return self
-	def next (self):
+	def __next__ (self):
 		if self.icount == 0:
 			raise StopIteration
 		self.icount -= 1
 		return self.icontent
 return producer(count, content)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_setof_spi_in_iterator() RETURNS SETOF text AS
 $$
@@ -42,7 +42,7 @@ $$
         yield s
         plpy.execute('select 2')
 $$
-LANGUAGE plpythonu;
+LANGUAGE plpython3u;
 
 
 -- Test set returning functions
@@ -69,7 +69,7 @@ global x
 while x <= lim:
     yield x
     x = x + 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT ugly(1, 5);
 
@@ -81,7 +81,7 @@ CREATE OR REPLACE FUNCTION get_user_records()
 RETURNS SETOF users
 AS $$
     return plpy.execute("SELECT * FROM users ORDER BY username")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT get_user_records();
 SELECT * FROM get_user_records();
@@ -91,7 +91,7 @@ CREATE OR REPLACE FUNCTION get_user_records2()
 RETURNS TABLE(fname text, lname text, username text, userid int)
 AS $$
     return plpy.execute("SELECT * FROM users ORDER BY username")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT get_user_records2();
 SELECT * FROM get_user_records2();
diff --git a/src/pl/plpython/sql/plpython_spi.sql b/src/pl/plpython/sql/plpython_spi.sql
index dd77833ed56..112add93fc9 100644
--- a/src/pl/plpython/sql/plpython_spi.sql
+++ b/src/pl/plpython/sql/plpython_spi.sql
@@ -7,19 +7,19 @@ CREATE FUNCTION nested_call_one(a text) RETURNS text
 'q = "SELECT nested_call_two(''%s'')" % a
 r = plpy.execute(q)
 return r[0]'
-	LANGUAGE plpythonu ;
+	LANGUAGE plpython3u ;
 
 CREATE FUNCTION nested_call_two(a text) RETURNS text
 	AS
 'q = "SELECT nested_call_three(''%s'')" % a
 r = plpy.execute(q)
 return r[0]'
-	LANGUAGE plpythonu ;
+	LANGUAGE plpython3u ;
 
 CREATE FUNCTION nested_call_three(a text) RETURNS text
 	AS
 'return a'
-	LANGUAGE plpythonu ;
+	LANGUAGE plpython3u ;
 
 -- some spi stuff
 
@@ -35,7 +35,7 @@ except Exception as ex:
 	plpy.error(str(ex))
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 CREATE FUNCTION spi_prepared_plan_test_two(a text) RETURNS text
 	AS
@@ -49,7 +49,7 @@ except Exception as ex:
 	plpy.error(str(ex))
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 CREATE FUNCTION spi_prepared_plan_test_nested(a text) RETURNS text
 	AS
@@ -64,7 +64,7 @@ except Exception as ex:
 	plpy.error(str(ex))
 return None
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 CREATE FUNCTION join_sequences(s sequences) RETURNS text
 	AS
@@ -77,7 +77,7 @@ for r in rv:
 	seq = seq + r["sequence"]
 return seq
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 CREATE FUNCTION spi_recursive_sum(a int) RETURNS int
 	AS
@@ -86,7 +86,7 @@ if a > 1:
     r = plpy.execute("SELECT spi_recursive_sum(%d) as a" % (a-1))[0]["a"]
 return a + r
 '
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 --
 -- spi and nested calls
@@ -120,7 +120,7 @@ if result.status() > 0:
    return result.nrows()
 else:
    return None
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT result_metadata_test($$SELECT 1 AS foo, '11'::text AS bar UNION SELECT 2, '22'$$);
 SELECT result_metadata_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$);
@@ -129,7 +129,7 @@ CREATE FUNCTION result_nrows_test(cmd text) RETURNS int
 AS $$
 result = plpy.execute(cmd)
 return result.nrows()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT result_nrows_test($$SELECT 1$$);
 SELECT result_nrows_test($$CREATE TEMPORARY TABLE foo2 (a int, b text)$$);
@@ -140,7 +140,7 @@ CREATE FUNCTION result_len_test(cmd text) RETURNS int
 AS $$
 result = plpy.execute(cmd)
 return len(result)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT result_len_test($$SELECT 1$$);
 SELECT result_len_test($$CREATE TEMPORARY TABLE foo3 (a int, b text)$$);
@@ -170,7 +170,7 @@ except TypeError:
 else:
     assert False, "TypeError not raised"
 
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT result_subscript_test();
 
@@ -180,7 +180,7 @@ result = plpy.execute("select 1 where false")
 
 plpy.info(result[:])
 
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT result_empty_test();
 
@@ -189,7 +189,7 @@ AS $$
 plan = plpy.prepare(cmd)
 result = plpy.execute(plan)
 return str(result)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT result_str_test($$SELECT 1 AS foo UNION SELECT 2$$);
 SELECT result_str_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$);
@@ -203,13 +203,13 @@ for row in res:
     if row['lname'] == 'doe':
         does += 1
 return does
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION double_cursor_close() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
 res.close()
 res.close()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_fetch() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
@@ -228,7 +228,7 @@ except StopIteration:
     pass
 else:
     assert False, "StopIteration not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_mix_next_and_fetch() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users order by fname")
@@ -242,7 +242,7 @@ except AttributeError:
 assert item['fname'] == 'rick'
 
 assert len(res.fetch(2)) == 1
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION fetch_after_close() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
@@ -253,7 +253,7 @@ except ValueError:
     pass
 else:
     assert False, "ValueError not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION next_after_close() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users")
@@ -267,7 +267,7 @@ except ValueError:
     pass
 else:
     assert False, "ValueError not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_fetch_next_empty() RETURNS int AS $$
 res = plpy.cursor("select fname, lname from users where false")
@@ -281,7 +281,7 @@ except StopIteration:
     pass
 else:
     assert False, "StopIteration not raised"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_plan() RETURNS SETOF text AS $$
 plan = plpy.prepare(
@@ -291,13 +291,13 @@ for row in plpy.cursor(plan, ["w"]):
     yield row['fname']
 for row in plan.cursor(["j"]):
     yield row['fname']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_plan_wrong_args() RETURNS SETOF text AS $$
 plan = plpy.prepare("select fname, lname from users where fname like $1 || '%'",
                     ["text"])
 c = plpy.cursor(plan, ["a", "b"])
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TYPE test_composite_type AS (
   a1 int,
@@ -308,7 +308,7 @@ CREATE OR REPLACE FUNCTION plan_composite_args() RETURNS test_composite_type AS
 plan = plpy.prepare("select $1 as c1", ["test_composite_type"])
 res = plpy.execute(plan, [{"a1": 3, "a2": "label"}])
 return res[0]["c1"]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT simple_cursor_test();
 SELECT double_cursor_close();
diff --git a/src/pl/plpython/sql/plpython_subtransaction.sql b/src/pl/plpython/sql/plpython_subtransaction.sql
index cc4b1ae102b..c65c380f40c 100644
--- a/src/pl/plpython/sql/plpython_subtransaction.sql
+++ b/src/pl/plpython/sql/plpython_subtransaction.sql
@@ -17,7 +17,7 @@ with plpy.subtransaction():
         plpy.execute("INSERT INTO subtransaction_tbl VALUES ('oops')")
     elif what_error == "Python":
         raise Exception("Python exception")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT subtransaction_ctx_test();
 SELECT * FROM subtransaction_tbl;
@@ -45,7 +45,7 @@ with plpy.subtransaction():
             raise
         plpy.notice("Swallowed %s(%r)" % (e.__class__.__name__, e.args[0]))
 return "ok"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT subtransaction_nested_test();
 SELECT * FROM subtransaction_tbl;
@@ -65,7 +65,7 @@ with plpy.subtransaction():
     plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
     plpy.execute("SELECT subtransaction_nested_test('t')")
 return "ok"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT subtransaction_deeply_nested_test();
 SELECT * FROM subtransaction_tbl;
@@ -76,25 +76,25 @@ TRUNCATE subtransaction_tbl;
 CREATE FUNCTION subtransaction_exit_without_enter() RETURNS void
 AS $$
 plpy.subtransaction().__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION subtransaction_enter_without_exit() RETURNS void
 AS $$
 plpy.subtransaction().__enter__()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION subtransaction_exit_twice() RETURNS void
 AS $$
 plpy.subtransaction().__enter__()
 plpy.subtransaction().__exit__(None, None, None)
 plpy.subtransaction().__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION subtransaction_enter_twice() RETURNS void
 AS $$
 plpy.subtransaction().__enter__()
 plpy.subtransaction().__enter__()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION subtransaction_exit_same_subtransaction_twice() RETURNS void
 AS $$
@@ -102,7 +102,7 @@ s = plpy.subtransaction()
 s.__enter__()
 s.__exit__(None, None, None)
 s.__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION subtransaction_enter_same_subtransaction_twice() RETURNS void
 AS $$
@@ -110,14 +110,14 @@ s = plpy.subtransaction()
 s.__enter__()
 s.__enter__()
 s.__exit__(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 -- No warnings here, as the subtransaction gets indeed closed
 CREATE FUNCTION subtransaction_enter_subtransaction_in_with() RETURNS void
 AS $$
 with plpy.subtransaction() as s:
     s.__enter__()
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION subtransaction_exit_subtransaction_in_with() RETURNS void
 AS $$
@@ -126,7 +126,7 @@ try:
         s.__exit__(None, None, None)
 except ValueError as e:
     raise ValueError(e)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT subtransaction_exit_without_enter();
 SELECT subtransaction_enter_without_exit();
@@ -159,7 +159,7 @@ try:
     plpy.execute(p, ["wrong"])
 except plpy.SPIError:
     plpy.warning("Caught a SPI error")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT subtransaction_mix_explicit_and_implicit();
 SELECT * FROM subtransaction_tbl;
@@ -172,7 +172,7 @@ AS $$
 s = plpy.subtransaction()
 s.enter()
 s.exit(None, None, None)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT subtransaction_alternative_names();
 
@@ -186,7 +186,7 @@ with plpy.subtransaction():
          plpy.execute("INSERT INTO subtransaction_tbl VALUES ('a')")
      except plpy.SPIError:
          plpy.notice("caught")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT try_catch_inside_subtransaction();
 SELECT * FROM subtransaction_tbl;
@@ -202,7 +202,7 @@ with plpy.subtransaction():
          plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
      except plpy.SPIError:
          plpy.notice("caught")
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT pk_violation_inside_subtransaction();
 SELECT * FROM subtransaction_tbl;
@@ -217,7 +217,7 @@ with plpy.subtransaction():
     cur.fetch(10)
 fetched = cur.fetch(10);
 return int(fetched[5]["i"])
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_aborted_subxact() RETURNS int AS $$
 try:
@@ -229,7 +229,7 @@ except plpy.SPIError:
     fetched = cur.fetch(10)
     return int(fetched[5]["i"])
 return 0 # not reached
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_plan_aborted_subxact() RETURNS int AS $$
 try:
@@ -243,7 +243,7 @@ except plpy.SPIError:
     fetched = cur.fetch(5)
     return fetched[2]["i"]
 return 0 # not reached
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION cursor_close_aborted_subxact() RETURNS boolean AS $$
 try:
@@ -254,7 +254,7 @@ except plpy.SPIError:
     cur.close()
     return True
 return False # not reached
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT cursor_in_subxact();
 SELECT cursor_aborted_subxact();
diff --git a/src/pl/plpython/sql/plpython_test.sql b/src/pl/plpython/sql/plpython_test.sql
index 5f1be9c94a8..aa22a274155 100644
--- a/src/pl/plpython/sql/plpython_test.sql
+++ b/src/pl/plpython/sql/plpython_test.sql
@@ -1,13 +1,13 @@
 -- first some tests of basic functionality
-CREATE EXTENSION plpython2u;
+CREATE EXTENSION plpython3u;
 
 -- really stupid function just to get the module loaded
-CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu;
+CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u;
 
 select stupid();
 
 -- check 2/3 versioning
-CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython2u;
+CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u;
 
 select stupidn();
 
@@ -21,7 +21,7 @@ for key in keys:
     out.append("%s: %s" % (key, u[key]))
 words = a1 + " " + a2 + " => {" + ", ".join(out) + "}"
 return words'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 select "Argument test #1"(users, fname, lname) from users where lname = 'doe' order by 1;
 
@@ -32,7 +32,7 @@ $$
 contents = list(filter(lambda x: not x.startswith("__"), dir(plpy)))
 contents.sort()
 return contents
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 select module_contents();
 
@@ -47,6 +47,6 @@ plpy.info('info', 37, [1, 2, 3])
 plpy.notice('notice')
 plpy.warning('warning')
 plpy.error('error')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT elog_test_basic();
diff --git a/src/pl/plpython/sql/plpython_transaction.sql b/src/pl/plpython/sql/plpython_transaction.sql
index 33b37e5b7fc..f9062254572 100644
--- a/src/pl/plpython/sql/plpython_transaction.sql
+++ b/src/pl/plpython/sql/plpython_transaction.sql
@@ -2,7 +2,7 @@ CREATE TABLE test1 (a int, b text);
 
 
 CREATE PROCEDURE transaction_test1()
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 for i in range(0, 10):
     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
@@ -20,7 +20,7 @@ SELECT * FROM test1;
 TRUNCATE test1;
 
 DO
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 $$
 for i in range(0, 10):
     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
@@ -37,7 +37,7 @@ TRUNCATE test1;
 
 -- not allowed in a function
 CREATE FUNCTION transaction_test2() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 for i in range(0, 10):
     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
@@ -55,7 +55,7 @@ SELECT * FROM test1;
 
 -- also not allowed if procedure is called from a function
 CREATE FUNCTION transaction_test3() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plpy.execute("CALL transaction_test1()")
 return 1
@@ -68,9 +68,9 @@ SELECT * FROM test1;
 
 -- DO block inside function
 CREATE FUNCTION transaction_test4() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
-plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$")
+plpy.execute("DO LANGUAGE plpython3u $x$ plpy.commit() $x$")
 return 1
 $$;
 
@@ -78,7 +78,7 @@ SELECT transaction_test4();
 
 
 -- commit inside subtransaction (prohibited)
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 s = plpy.subtransaction()
 s.enter()
 plpy.commit()
@@ -91,7 +91,7 @@ INSERT INTO test2 VALUES (0), (1), (2), (3), (4);
 
 TRUNCATE test1;
 
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
     plpy.commit()
@@ -106,7 +106,7 @@ SELECT * FROM pg_cursors;
 -- error in cursor loop with commit
 TRUNCATE test1;
 
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (12/(%s-2))" % row['x'])
     plpy.commit()
@@ -120,7 +120,7 @@ SELECT * FROM pg_cursors;
 -- rollback inside cursor loop
 TRUNCATE test1;
 
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
     plpy.rollback()
@@ -134,7 +134,7 @@ SELECT * FROM pg_cursors;
 -- first commit then rollback inside cursor loop
 TRUNCATE test1;
 
-DO LANGUAGE plpythonu $$
+DO LANGUAGE plpython3u $$
 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
     if row['x'] % 2 == 0:
diff --git a/src/pl/plpython/sql/plpython_trigger.sql b/src/pl/plpython/sql/plpython_trigger.sql
index 19852dc5851..e5504b9ab1d 100644
--- a/src/pl/plpython/sql/plpython_trigger.sql
+++ b/src/pl/plpython/sql/plpython_trigger.sql
@@ -16,7 +16,7 @@ if TD["new"]["fname"] == "william":
 	TD["new"]["fname"] = TD["args"][0]
 	rv = "MODIFY"
 return rv'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 
 CREATE FUNCTION users_update() returns trigger
@@ -25,7 +25,7 @@ CREATE FUNCTION users_update() returns trigger
 	if TD["old"]["fname"] != TD["new"]["fname"] and TD["old"]["fname"] == TD["args"][0]:
 		return "SKIP"
 return None'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 
 CREATE FUNCTION users_delete() RETURNS trigger
@@ -33,7 +33,7 @@ CREATE FUNCTION users_delete() RETURNS trigger
 'if TD["old"]["fname"] == TD["args"][0]:
 	return "SKIP"
 return None'
-	LANGUAGE plpythonu;
+	LANGUAGE plpython3u;
 
 
 CREATE TRIGGER users_insert_trig BEFORE INSERT ON users FOR EACH ROW
@@ -72,7 +72,7 @@ CREATE TABLE trigger_test_generated (
         j int GENERATED ALWAYS AS (i * 2) STORED
 );
 
-CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpythonu AS $$
+CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpython3u AS $$
 
 if 'relid' in TD:
 	TD['relid'] = "bogus:12345"
@@ -157,7 +157,7 @@ INSERT INTO trigger_test VALUES (0, 'zero');
 CREATE FUNCTION stupid1() RETURNS trigger
 AS $$
     return 37
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger1
 BEFORE INSERT ON trigger_test
@@ -173,7 +173,7 @@ DROP TRIGGER stupid_trigger1 ON trigger_test;
 CREATE FUNCTION stupid2() RETURNS trigger
 AS $$
     return "MODIFY"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger2
 BEFORE DELETE ON trigger_test
@@ -191,7 +191,7 @@ INSERT INTO trigger_test VALUES (0, 'zero');
 CREATE FUNCTION stupid3() RETURNS trigger
 AS $$
     return "foo"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger3
 BEFORE UPDATE ON trigger_test
@@ -206,8 +206,8 @@ DROP TRIGGER stupid_trigger3 ON trigger_test;
 
 CREATE FUNCTION stupid3u() RETURNS trigger
 AS $$
-    return u"foo"
-$$ LANGUAGE plpythonu;
+    return "foo"
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger3
 BEFORE UPDATE ON trigger_test
@@ -224,7 +224,7 @@ CREATE FUNCTION stupid4() RETURNS trigger
 AS $$
     del TD["new"]
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger4
 BEFORE UPDATE ON trigger_test
@@ -241,7 +241,7 @@ CREATE FUNCTION stupid5() RETURNS trigger
 AS $$
     TD["new"] = ['foo', 'bar']
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger5
 BEFORE UPDATE ON trigger_test
@@ -258,7 +258,7 @@ CREATE FUNCTION stupid6() RETURNS trigger
 AS $$
     TD["new"] = {1: 'foo', 2: 'bar'}
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger6
 BEFORE UPDATE ON trigger_test
@@ -275,7 +275,7 @@ CREATE FUNCTION stupid7() RETURNS trigger
 AS $$
     TD["new"] = {'v': 'foo', 'a': 'bar'}
     return "MODIFY";
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger7
 BEFORE UPDATE ON trigger_test
@@ -290,9 +290,9 @@ DROP TRIGGER stupid_trigger7 ON trigger_test;
 
 CREATE FUNCTION stupid7u() RETURNS trigger
 AS $$
-    TD["new"] = {u'v': 'foo', u'a': 'bar'}
+    TD["new"] = {'v': 'foo', 'a': 'bar'}
     return "MODIFY"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER stupid_trigger7
 BEFORE UPDATE ON trigger_test
@@ -318,7 +318,7 @@ CREATE FUNCTION test_null() RETURNS trigger
 AS $$
     TD["new"]['v'] = None
     return "MODIFY"
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER test_null_trigger
 BEFORE UPDATE ON trigger_test
@@ -341,7 +341,7 @@ SET DateStyle = 'ISO';
 CREATE FUNCTION set_modif_time() RETURNS trigger AS $$
     TD['new']['modif_time'] = '2010-10-13 21:57:28.930486'
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TABLE pb (a TEXT, modif_time TIMESTAMP(0) WITHOUT TIME ZONE);
 
@@ -365,7 +365,7 @@ CREATE FUNCTION composite_trigger_f() RETURNS trigger AS $$
     TD['new']['f1'] = (3, False)
     TD['new']['f2'] = {'k': 7, 'l': 'yes', 'ignored': 10}
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER composite_trigger BEFORE INSERT ON composite_trigger_test
   FOR EACH ROW EXECUTE PROCEDURE composite_trigger_f();
@@ -380,7 +380,7 @@ CREATE TABLE composite_trigger_noop_test (f1 comp1, f2 comp2);
 
 CREATE FUNCTION composite_trigger_noop_f() RETURNS trigger AS $$
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER composite_trigger_noop BEFORE INSERT ON composite_trigger_noop_test
   FOR EACH ROW EXECUTE PROCEDURE composite_trigger_noop_f();
@@ -399,7 +399,7 @@ CREATE TABLE composite_trigger_nested_test(c comp3);
 
 CREATE FUNCTION composite_trigger_nested_f() RETURNS trigger AS $$
     return 'MODIFY'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE TRIGGER composite_trigger_nested BEFORE INSERT ON composite_trigger_nested_test
   FOR EACH ROW EXECUTE PROCEDURE composite_trigger_nested_f();
@@ -410,7 +410,7 @@ INSERT INTO composite_trigger_nested_test VALUES (ROW(ROW(NULL, 't'), ROW(1, 'f'
 SELECT * FROM composite_trigger_nested_test;
 
 -- check that using a function as a trigger over two tables works correctly
-CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpythonu AS $$
+CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpython3u AS $$
     TD["new"]["data"] = '1234'
     return 'MODIFY'
 $$;
@@ -432,7 +432,7 @@ SELECT * FROM b;
 CREATE TABLE transition_table_test (id int, name text);
 INSERT INTO transition_table_test VALUES (1, 'a');
 
-CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpythonu AS
+CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpython3u AS
 $$
     rv = plpy.execute("SELECT * FROM old_table")
     assert(rv.nrows() == 1)
@@ -455,7 +455,7 @@ DROP FUNCTION transition_table_test_f();
 -- dealing with generated columns
 
 CREATE FUNCTION generated_test_func1() RETURNS trigger
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 TD['new']['j'] = 5  # not allowed
 return 'MODIFY'
diff --git a/src/pl/plpython/sql/plpython_types.sql b/src/pl/plpython/sql/plpython_types.sql
index 0d207d9c015..40f4f79d99f 100644
--- a/src/pl/plpython/sql/plpython_types.sql
+++ b/src/pl/plpython/sql/plpython_types.sql
@@ -9,7 +9,7 @@
 CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_bool(true);
 SELECT * FROM test_type_conversion_bool(false);
@@ -35,7 +35,7 @@ elif n == 5:
    ret = [0]
 plpy.info(ret, not not ret)
 return ret
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_bool_other(0);
 SELECT * FROM test_type_conversion_bool_other(1);
@@ -48,7 +48,7 @@ SELECT * FROM test_type_conversion_bool_other(5);
 CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_char('a');
 SELECT * FROM test_type_conversion_char(null);
@@ -57,7 +57,7 @@ SELECT * FROM test_type_conversion_char(null);
 CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_int2(100::int2);
 SELECT * FROM test_type_conversion_int2(-100::int2);
@@ -67,7 +67,7 @@ SELECT * FROM test_type_conversion_int2(null);
 CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_int4(100);
 SELECT * FROM test_type_conversion_int4(-100);
@@ -77,7 +77,7 @@ SELECT * FROM test_type_conversion_int4(null);
 CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_int8(100);
 SELECT * FROM test_type_conversion_int8(-100);
@@ -90,7 +90,7 @@ CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$
 # between decimal and cdecimal
 plpy.info(str(x), x.__class__.__name__)
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_numeric(100);
 SELECT * FROM test_type_conversion_numeric(-100);
@@ -105,7 +105,7 @@ SELECT * FROM test_type_conversion_numeric(null);
 CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_float4(100);
 SELECT * FROM test_type_conversion_float4(-100);
@@ -116,7 +116,7 @@ SELECT * FROM test_type_conversion_float4(null);
 CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_float8(100);
 SELECT * FROM test_type_conversion_float8(-100);
@@ -128,7 +128,7 @@ SELECT * FROM test_type_conversion_float8(100100100.654321);
 CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_oid(100);
 SELECT * FROM test_type_conversion_oid(2147483649);
@@ -138,7 +138,7 @@ SELECT * FROM test_type_conversion_oid(null);
 CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_text('hello world');
 SELECT * FROM test_type_conversion_text(null);
@@ -147,7 +147,7 @@ SELECT * FROM test_type_conversion_text(null);
 CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_bytea('hello world');
 SELECT * FROM test_type_conversion_bytea(E'null\\000byte');
@@ -157,7 +157,7 @@ SELECT * FROM test_type_conversion_bytea(null);
 CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$
 import marshal
 return marshal.dumps('hello world')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_type_unmarshal(x bytea) RETURNS text AS $$
 import marshal
@@ -165,7 +165,7 @@ try:
     return marshal.loads(x)
 except ValueError as e:
     return 'FAILED: ' + str(e)
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT test_type_unmarshal(x) FROM test_type_marshal() x;
 
@@ -178,7 +178,7 @@ CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL);
 
 CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_booltrue(true, true);
 SELECT * FROM test_type_conversion_booltrue(false, true);
@@ -190,7 +190,7 @@ CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0);
 CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$
 plpy.info(x, type(x))
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_uint2(100::uint2, 50);
 SELECT * FROM test_type_conversion_uint2(100::uint2, -50);
@@ -201,7 +201,7 @@ CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL);
 
 CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_nnint(10, 20);
 SELECT * FROM test_type_conversion_nnint(null, 20);
@@ -213,7 +213,7 @@ CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT
 CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$
 plpy.info(x, type(x))
 return y
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold');
 SELECT * FROM test_type_conversion_bytea10('hello world', 'hello wold');
@@ -229,7 +229,7 @@ SELECT * FROM test_type_conversion_bytea10('hello word', null);
 CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]);
 SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]);
@@ -243,14 +243,14 @@ SELECT * FROM test_type_conversion_array_int4('[2:4]={1,2,3}');
 CREATE FUNCTION test_type_conversion_array_int8(x int8[]) RETURNS int8[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_int8(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]::int8[]);
 
 CREATE FUNCTION test_type_conversion_array_date(x date[]) RETURNS date[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22',NULL],[NULL,'2016-10-21','2016-10-22']],
             [[NULL,'2016-11-21','2016-10-21'],['2015-09-21','2015-09-22','2014-09-21']]]::date[]);
@@ -258,7 +258,7 @@ SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22',
 CREATE FUNCTION test_type_conversion_array_timestamp(x timestamp[]) RETURNS timestamp[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_timestamp(ARRAY[[['2016-09-21 15:34:24.078792-04','2016-10-22 11:34:24.078795-04',NULL],
             [NULL,'2016-10-21 11:34:25.078792-04','2016-10-21 11:34:24.098792-04']],
@@ -270,7 +270,7 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint4(h int4, i int4, j int4, k int4 )
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 
 select pyreturnmultidemint4(8,5,3,2);
 
@@ -278,7 +278,7 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint8(h int4, i int4, j int4, k int4 )
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 
 select pyreturnmultidemint8(5,5,3,2);
 
@@ -286,7 +286,7 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat4(h int4, i int4, j int4, k int4
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 
 select pyreturnmultidemfloat4(6,5,3,2);
 
@@ -294,14 +294,14 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat8(h int4, i int4, j int4, k int4
 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)]
 plpy.info(m, type(m))
 return m
-$BODY$ LANGUAGE plpythonu;
+$BODY$ LANGUAGE plpython3u;
 
 select pyreturnmultidemfloat8(7,5,3,2);
 
 CREATE FUNCTION test_type_conversion_array_text(x text[]) RETURNS text[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_text(ARRAY['foo', 'bar']);
 SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar2']]);
@@ -310,59 +310,59 @@ SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar
 CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]);
 
 
 CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$
 return [123, 'abc']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_mixed1();
 
 
 CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$
 return [123, 'abc']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_mixed2();
 
 CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$
 return [[1,2,3],[4,5]]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_mdarray_malformed();
 
 CREATE FUNCTION test_type_conversion_mdarray_toodeep() RETURNS int[] AS $$
 return [[[[[[[1]]]]]]]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_mdarray_toodeep();
 
 
 CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$
 return [{'first': 'one', 'second': 42}, {'first': 'two', 'second': 11}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_record();
 
 
 CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$
 return 'abc'
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_string();
 
 CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$
 return ('abc', 'def')
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_tuple();
 
 CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$
 return 5
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_error();
 
@@ -376,14 +376,14 @@ CREATE DOMAIN ordered_pair_domain AS integer[] CHECK (array_length(VALUE,1)=2 AN
 CREATE FUNCTION test_type_conversion_array_domain(x ordered_pair_domain) RETURNS ordered_pair_domain AS $$
 plpy.info(x, type(x))
 return x
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain);
 SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain);
 
 CREATE FUNCTION test_type_conversion_array_domain_check_violation() RETURNS ordered_pair_domain AS $$
 return [2,1]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_array_domain_check_violation();
 
 
@@ -394,13 +394,13 @@ SELECT * FROM test_type_conversion_array_domain_check_violation();
 CREATE FUNCTION test_read_uint2_array(x uint2[]) RETURNS uint2 AS $$
 plpy.info(x, type(x))
 return x[0]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 select test_read_uint2_array(array[1::uint2]);
 
 CREATE FUNCTION test_build_uint2_array(x int2) RETURNS uint2[] AS $$
 return [x, x]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 select test_build_uint2_array(1::int2);
 select test_build_uint2_array(-1::int2);  -- fail
@@ -413,7 +413,7 @@ select test_build_uint2_array(-1::int2);  -- fail
 CREATE FUNCTION test_type_conversion_domain_array(x integer[])
   RETURNS ordered_pair_domain[] AS $$
 return [x, x]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 select test_type_conversion_domain_array(array[2,4]);
 select test_type_conversion_domain_array(array[4,2]);  -- fail
@@ -422,7 +422,7 @@ CREATE FUNCTION test_type_conversion_domain_array2(x ordered_pair_domain)
   RETURNS integer AS $$
 plpy.info(x, type(x))
 return x[1]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 select test_type_conversion_domain_array2(array[2,4]);
 select test_type_conversion_domain_array2(array[4,2]);  -- fail
@@ -431,7 +431,7 @@ CREATE FUNCTION test_type_conversion_array_domain_array(x ordered_pair_domain[])
   RETURNS ordered_pair_domain AS $$
 plpy.info(x, type(x))
 return x[0]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 select test_type_conversion_array_domain_array(array[array[2,4]::ordered_pair_domain]);
 
@@ -450,7 +450,7 @@ INSERT INTO employee VALUES ('John', 100, 10), ('Mary', 200, 10);
 
 CREATE OR REPLACE FUNCTION test_composite_table_input(e employee) RETURNS integer AS $$
 return e['basesalary'] + e['bonus']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT name, test_composite_table_input(employee.*) FROM employee;
 
@@ -470,7 +470,7 @@ CREATE TYPE named_pair AS (
 
 CREATE OR REPLACE FUNCTION test_composite_type_input(p named_pair) RETURNS integer AS $$
 return sum(p.values())
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT test_composite_type_input(row(1, 2));
 
@@ -487,7 +487,7 @@ CREATE TYPE nnint_container AS (f1 int, f2 nnint);
 
 CREATE FUNCTION nnint_test(x int, y int) RETURNS nnint_container AS $$
 return {'f1': x, 'f2': y}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT nnint_test(null, 3);
 SELECT nnint_test(3, null);  -- fail
@@ -501,21 +501,21 @@ CREATE DOMAIN ordered_named_pair AS named_pair_2 CHECK((VALUE).i <= (VALUE).j);
 
 CREATE FUNCTION read_ordered_named_pair(p ordered_named_pair) RETURNS integer AS $$
 return p['i'] + p['j']
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT read_ordered_named_pair(row(1, 2));
 SELECT read_ordered_named_pair(row(2, 1));  -- fail
 
 CREATE FUNCTION build_ordered_named_pair(i int, j int) RETURNS ordered_named_pair AS $$
 return {'i': i, 'j': j}
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT build_ordered_named_pair(1,2);
 SELECT build_ordered_named_pair(2,1);  -- fail
 
 CREATE FUNCTION build_ordered_named_pairs(i int, j int) RETURNS ordered_named_pair[] AS $$
 return [{'i': i, 'j': j}, {'i': i, 'j': j+1}]
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 SELECT build_ordered_named_pairs(1,2);
 SELECT build_ordered_named_pairs(2,1);  -- fail
@@ -526,7 +526,7 @@ SELECT build_ordered_named_pairs(2,1);  -- fail
 --
 
 CREATE OR REPLACE FUNCTION test_prep_bool_input() RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT CASE WHEN $1 THEN 1 ELSE 0 END AS val", ['boolean'])
 rv = plpy.execute(plan, ['fa'], 5) # 'fa' is true in Python
@@ -537,7 +537,7 @@ SELECT test_prep_bool_input(); -- 1
 
 
 CREATE OR REPLACE FUNCTION test_prep_bool_output() RETURNS bool
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT $1 = 1 AS val", ['int'])
 rv = plpy.execute(plan, [0], 5)
@@ -549,7 +549,7 @@ SELECT test_prep_bool_output(); -- false
 
 
 CREATE OR REPLACE FUNCTION test_prep_bytea_input(bb bytea) RETURNS int
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT octet_length($1) AS val", ['bytea'])
 rv = plpy.execute(plan, [bb], 5)
@@ -560,7 +560,7 @@ SELECT test_prep_bytea_input(E'a\\000b'); -- 3 (embedded null formerly truncated
 
 
 CREATE OR REPLACE FUNCTION test_prep_bytea_output() RETURNS bytea
-LANGUAGE plpythonu
+LANGUAGE plpython3u
 AS $$
 plan = plpy.prepare("SELECT decode('aa00bb', 'hex') AS val")
 rv = plpy.execute(plan, [], 5)
diff --git a/src/pl/plpython/sql/plpython_unicode.sql b/src/pl/plpython/sql/plpython_unicode.sql
index a11e5eeaa21..14f7b4e0053 100644
--- a/src/pl/plpython/sql/plpython_unicode.sql
+++ b/src/pl/plpython/sql/plpython_unicode.sql
@@ -14,28 +14,28 @@ CREATE TABLE unicode_test (
 );
 
 CREATE FUNCTION unicode_return() RETURNS text AS E'
-return u"\\xA0"
-' LANGUAGE plpythonu;
+return "\\xA0"
+' LANGUAGE plpython3u;
 
 CREATE FUNCTION unicode_trigger() RETURNS trigger AS E'
-TD["new"]["testvalue"] = u"\\xA0"
+TD["new"]["testvalue"] = "\\xA0"
 return "MODIFY"
-' LANGUAGE plpythonu;
+' LANGUAGE plpython3u;
 
 CREATE TRIGGER unicode_test_bi BEFORE INSERT ON unicode_test
   FOR EACH ROW EXECUTE PROCEDURE unicode_trigger();
 
 CREATE FUNCTION unicode_plan1() RETURNS text AS E'
 plan = plpy.prepare("SELECT $1 AS testvalue", ["text"])
-rv = plpy.execute(plan, [u"\\xA0"], 1)
+rv = plpy.execute(plan, ["\\xA0"], 1)
 return rv[0]["testvalue"]
-' LANGUAGE plpythonu;
+' LANGUAGE plpython3u;
 
 CREATE FUNCTION unicode_plan2() RETURNS text AS E'
-plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", u"text"])
+plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", "text"])
 rv = plpy.execute(plan, ["foo", "bar"], 1)
 return rv[0]["testvalue"]
-' LANGUAGE plpythonu;
+' LANGUAGE plpython3u;
 
 
 SELECT unicode_return();
diff --git a/src/pl/plpython/sql/plpython_void.sql b/src/pl/plpython/sql/plpython_void.sql
index 77d7f59e4c7..5a1a6711fb0 100644
--- a/src/pl/plpython/sql/plpython_void.sql
+++ b/src/pl/plpython/sql/plpython_void.sql
@@ -4,16 +4,16 @@
 
 CREATE FUNCTION test_void_func1() RETURNS void AS $$
 x = 10
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 -- illegal: can't return non-None value in void-returning func
 CREATE FUNCTION test_void_func2() RETURNS void AS $$
 return 10
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 CREATE FUNCTION test_return_none() RETURNS int AS $$
 None
-$$ LANGUAGE plpythonu;
+$$ LANGUAGE plpython3u;
 
 
 -- Tests for functions returning void
-- 
2.23.0.385.gbc12974a89

v5-0004-meson-prereq-output-and-depencency-tracking-work.patchtext/x-diff; charset=us-asciiDownload
From 604a2932f353f0bd12f7ed45ed7fe7124e8aad7f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 8 Mar 2021 13:47:39 -0800
Subject: [PATCH v5 04/16] meson: prereq: output and depencency tracking work.

---
 src/backend/utils/misc/Makefile  |  5 ++++-
 src/backend/utils/misc/guc.c     |  2 +-
 src/bin/initdb/initdb.c          |  5 +++--
 src/bin/psql/Makefile            |  4 ++--
 src/bin/psql/create_help.pl      | 16 ++++++++++++----
 src/tools/msvc/MSBuildProject.pm |  9 +++++++--
 src/tools/msvc/Mkvcbuild.pm      |  3 +++
 src/tools/msvc/Solution.pm       |  2 +-
 src/tools/msvc/pgflex.pl         |  4 ++--
 9 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 1d5327cf644..14861fd96b2 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -37,8 +37,11 @@ endif
 
 include $(top_srcdir)/src/backend/common.mk
 
+guc-file.c.h: guc-file.l
+	flex -o $@ $<
+
 # guc-file is compiled as part of guc
-guc.o: guc-file.c
+guc.o: guc-file.c.h
 
 # Note: guc-file.c is not deleted by 'make clean',
 # since we want to ship it in distribution tarballs.
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index e91d5a3cfda..a0ac8cf0341 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -12572,4 +12572,4 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
 	return true;
 }
 
-#include "guc-file.c"
+#include "guc-file.c.h"
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 1ed4808d53f..9067a06e58a 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1368,8 +1368,9 @@ bootstrap_template1(void)
 
 	if (strcmp(headerline, *bki_lines) != 0)
 	{
-		pg_log_error("input file \"%s\" does not belong to PostgreSQL %s",
-					 bki_file, PG_VERSION);
+		pg_log_error("input file \"%s\" does not belong to PostgreSQL %s (expect %s, is %s)",
+					 bki_file, PG_VERSION,
+					 headerline, *bki_lines);
 		fprintf(stderr,
 				_("Check your installation or specify the correct path "
 				  "using the option -L.\n"));
diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile
index d00881163c0..3851da1c8ef 100644
--- a/src/bin/psql/Makefile
+++ b/src/bin/psql/Makefile
@@ -56,7 +56,7 @@ sql_help.c: sql_help.h
 	touch $@
 
 sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml)
-	$(PERL) $< $(REFDOCDIR) $*
+	$(PERL) $< $(REFDOCDIR) . $*
 
 psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
 psqlscanslash.c: FLEX_NO_BACKUP=yes
@@ -81,7 +81,7 @@ clean distclean:
 # files removed here are supposed to be in the distribution tarball,
 # so do not clean them in the clean/distclean rules
 maintainer-clean: distclean
-	rm -f sql_help.h sql_help.c psqlscanslash.c
+	rm -f sql_help.h sql_help.c sql_help.dep psqlscanslash.c
 
 check:
 	$(prove_check)
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
index 83324239740..40eb6ac2d3f 100644
--- a/src/bin/psql/create_help.pl
+++ b/src/bin/psql/create_help.pl
@@ -23,9 +23,12 @@ use strict;
 use warnings;
 
 my $docdir = $ARGV[0] or die "$0: missing required argument: docdir\n";
-my $hfile = $ARGV[1] . '.h'
+my $outdir = $ARGV[1] or die "$0: missing required argument: outdir\n";
+
+my $hfile = $ARGV[2] . '.h'
   or die "$0: missing required argument: output file\n";
-my $cfile = $ARGV[1] . '.c';
+my $cfile = $ARGV[2] . '.c';
+my $depfile = $ARGV[2] . '.dep';
 
 my $hfilebasename;
 if ($hfile =~ m!.*/([^/]+)$!)
@@ -43,10 +46,12 @@ $define =~ s/\W/_/g;
 
 opendir(DIR, $docdir)
   or die "$0: could not open documentation source dir '$docdir': $!\n";
-open(my $hfile_handle, '>', $hfile)
+open(my $hfile_handle, '>', $outdir . '/' . $hfile)
   or die "$0: could not open output file '$hfile': $!\n";
-open(my $cfile_handle, '>', $cfile)
+open(my $cfile_handle, '>', $outdir . '/' . $cfile)
   or die "$0: could not open output file '$cfile': $!\n";
+open(my $depfile_handle, '>', $outdir . '/' . $depfile)
+  or die "$0: could not open output file '$depfile': $!\n";
 
 print $hfile_handle "/*
  * *** Do not change this file by hand. It is automatically
@@ -98,6 +103,8 @@ foreach my $file (sort readdir DIR)
 	my ($cmdid, @cmdnames, $cmddesc, $cmdsynopsis);
 	$file =~ /\.sgml$/ or next;
 
+	print $depfile_handle "$cfile $hfile: $docdir/$file\n";
+
 	open(my $fh, '<', "$docdir/$file") or next;
 	my $filecontent = join('', <$fh>);
 	close $fh;
@@ -216,4 +223,5 @@ print $hfile_handle "
 
 close $cfile_handle;
 close $hfile_handle;
+close $depfile_handle;
 closedir DIR;
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index fdd22e89eb2..036e44fcb83 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -211,14 +211,19 @@ EOF
 			}
 			else    #if ($grammarFile =~ /\.l$/)
 			{
+				if ($outputFile eq 'src/backend/utils/misc/guc-file.c')
+				{
+					$outputFile = 'src/backend/utils/misc/guc-file.c.h';
+				}
+
 				print $f <<EOF;
     <CustomBuild Include="$grammarFile">
       <Message Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">Running flex on $grammarFile</Message>
-      <Command Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile"</Command>
+      <Command Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" "$outputFile"</Command>
       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
       <Message Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">Running flex on $grammarFile</Message>
-      <Command Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile"</Command>
+      <Command Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" "$outputFile"</Command>
       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
     </CustomBuild>
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 4362bd44fd1..b8e62c6d3f7 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -330,6 +330,7 @@ sub mkvcbuild
 	$pgregress_ecpg->AddFile('src/test/regress/pg_regress.c');
 	$pgregress_ecpg->AddIncludeDir('src/port');
 	$pgregress_ecpg->AddIncludeDir('src/test/regress');
+	$pgregress_ecpg->AddDefine('DLSUFFIX=".dll"');
 	$pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$pgregress_ecpg->AddLibrary('ws2_32.lib');
 	$pgregress_ecpg->AddDirResourceFile('src/interfaces/ecpg/test');
@@ -345,6 +346,7 @@ sub mkvcbuild
 	$isolation_tester->AddIncludeDir('src/port');
 	$isolation_tester->AddIncludeDir('src/test/regress');
 	$isolation_tester->AddIncludeDir('src/interfaces/libpq');
+	$isolation_tester->AddDefine('DLSUFFIX=".dll"');
 	$isolation_tester->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$isolation_tester->AddLibrary('ws2_32.lib');
 	$isolation_tester->AddDirResourceFile('src/test/isolation');
@@ -356,6 +358,7 @@ sub mkvcbuild
 	$pgregress_isolation->AddFile('src/test/regress/pg_regress.c');
 	$pgregress_isolation->AddIncludeDir('src/port');
 	$pgregress_isolation->AddIncludeDir('src/test/regress');
+	$pgregress_isolation->AddDefine('DLSUFFIX=".dll"');
 	$pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$pgregress_isolation->AddLibrary('ws2_32.lib');
 	$pgregress_isolation->AddDirResourceFile('src/test/isolation');
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 43fd1be0888..dc78d3b65c3 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -689,7 +689,7 @@ sub GenerateFiles
 	{
 		print "Generating sql_help.h...\n";
 		chdir('src/bin/psql');
-		system("perl create_help.pl ../../../doc/src/sgml/ref sql_help");
+		system("perl create_help.pl ../../../doc/src/sgml/ref . sql_help");
 		chdir('../../..');
 	}
 
diff --git a/src/tools/msvc/pgflex.pl b/src/tools/msvc/pgflex.pl
index 0728b85d4de..19f26ff213f 100644
--- a/src/tools/msvc/pgflex.pl
+++ b/src/tools/msvc/pgflex.pl
@@ -29,6 +29,8 @@ unless ($verparts[0] == 2
 }
 
 my $input = shift;
+my $output = shift;
+
 if ($input !~ /\.l$/)
 {
 	print "Input must be a .l file\n";
@@ -40,8 +42,6 @@ elsif (!-e $input)
 	exit 1;
 }
 
-(my $output = $input) =~ s/\.l$/.c/;
-
 # get flex flags from make file
 my $makefile = dirname($input) . "/Makefile";
 my ($mf, $make);
-- 
2.23.0.385.gbc12974a89

v5-0005-meson-prereq-move-snowball_create.sql-creation-in.patchtext/x-diff; charset=us-asciiDownload
From 931ff07e713d7869a16a23dcf770f5fd30c18df8 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 8 Mar 2021 14:59:22 -0800
Subject: [PATCH v5 05/16] meson: prereq: move snowball_create.sql creation
 into perl file.

FIXME: deduplicate with Install.pm
---
 src/backend/snowball/Makefile           |  27 +-----
 src/backend/snowball/snowball_create.pl | 110 ++++++++++++++++++++++++
 2 files changed, 113 insertions(+), 24 deletions(-)
 create mode 100644 src/backend/snowball/snowball_create.pl

diff --git a/src/backend/snowball/Makefile b/src/backend/snowball/Makefile
index 50b9199910c..259104f8eb3 100644
--- a/src/backend/snowball/Makefile
+++ b/src/backend/snowball/Makefile
@@ -119,29 +119,8 @@ all: all-shared-lib $(SQLSCRIPT)
 
 include $(top_srcdir)/src/Makefile.shlib
 
-$(SQLSCRIPT): Makefile snowball_func.sql.in snowball.sql.in
-	echo '-- Language-specific snowball dictionaries' > $@
-	cat $(srcdir)/snowball_func.sql.in >> $@
-	@set -e; \
-	set $(LANGUAGES) ; \
-	while [ "$$#" -gt 0 ] ; \
-	do \
-		lang=$$1; shift; \
-		nonascdictname=$$lang; \
-		ascdictname=$$1; shift; \
-		if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \
-			stop=", StopWords=$${lang}" ; \
-		else \
-			stop=""; \
-		fi; \
-		cat $(srcdir)/snowball.sql.in | \
-			sed -e "s#_LANGNAME_#$$lang#g" | \
-			sed -e "s#_DICTNAME_#$${lang}_stem#g" | \
-			sed -e "s#_CFGNAME_#$$lang#g" | \
-			sed -e "s#_ASCDICTNAME_#$${ascdictname}_stem#g" | \
-			sed -e "s#_NONASCDICTNAME_#$${nonascdictname}_stem#g" | \
-			sed -e "s#_STOPWORDS_#$$stop#g" ; \
-	done >> $@
+$(SQLSCRIPT): snowball_create.pl Makefile snowball_func.sql.in snowball.sql.in
+	$(PERL) $< --input ${srcdir} --output .
 
 install: all installdirs install-lib
 	$(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)'
@@ -171,4 +150,4 @@ uninstall: uninstall-lib
 	done
 
 clean distclean maintainer-clean: clean-lib
-	rm -f $(OBJS) $(SQLSCRIPT)
+	rm -f $(OBJS) $(SQLSCRIPT) snowball_create.dep
diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl
new file mode 100644
index 00000000000..d9d79f3668f
--- /dev/null
+++ b/src/backend/snowball/snowball_create.pl
@@ -0,0 +1,110 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $output_path = '';
+my $makefile_path = '';
+my $input_path = '';
+
+GetOptions(
+	'output:s'   => \$output_path,
+	'input:s'    => \$input_path) || usage();
+
+# Make sure input_path ends in a slash if needed.
+if ($input_path ne '' && substr($input_path, -1) ne '/')
+{
+	$output_path .= '/';
+}
+
+# Make sure output_path ends in a slash if needed.
+if ($output_path ne '' && substr($output_path, -1) ne '/')
+{
+	$output_path .= '/';
+}
+
+GenerateTsearchFiles();
+
+sub usage
+{
+	die <<EOM;
+Usage: snowball_create.pl --input/-i <path> --input <path>
+    --output        Output directory (default '.')
+    --input         Input directory
+
+snowball_create.pl creates snowball.sql from snowball.sql.in
+EOM
+}
+
+sub GenerateTsearchFiles
+{
+	my $target = shift;
+	my $output_file = "$output_path/snowball_create.sql";
+
+	print "Generating tsearch script...";
+	my $F;
+	my $D;
+	my $tmpl = read_file("$input_path/snowball.sql.in");
+	my $mf   = read_file("$input_path/Makefile");
+
+	open($D, '>', "$output_path/snowball_create.dep")
+	  || die "Could not write snowball_create.dep";
+
+	print $D "$output_file: $input_path/Makefile\n";
+	print $D "$output_file: $input_path/snowball.sql.in\n";
+	print $D "$output_file: $input_path/snowball_func.sql.in\n";
+
+	$mf =~ s{\\\r?\n}{}g;
+	$mf =~ /^LANGUAGES\s*=\s*(.*)$/m
+	  || die "Could not find LANGUAGES line in snowball Makefile\n";
+	my @pieces = split /\s+/, $1;
+	open($F, '>', $output_file)
+	  || die "Could not write snowball_create.sql";
+
+	print $F "-- Language-specific snowball dictionaries\n";
+
+	print $F read_file("$input_path/snowball_func.sql.in");
+
+	while ($#pieces > 0)
+	{
+		my $lang    = shift @pieces || last;
+		my $asclang = shift @pieces || last;
+		my $txt     = $tmpl;
+		my $stop    = '';
+		my $stopword_path = "$input_path/stopwords/$lang.stop";
+
+		if (-s "$stopword_path")
+		{
+			$stop = ", StopWords=$lang";
+
+			print $D "$output_file: $stopword_path\n";
+		}
+
+		$txt =~ s#_LANGNAME_#${lang}#gs;
+		$txt =~ s#_DICTNAME_#${lang}_stem#gs;
+		$txt =~ s#_CFGNAME_#${lang}#gs;
+		$txt =~ s#_ASCDICTNAME_#${asclang}_stem#gs;
+		$txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs;
+		$txt =~ s#_STOPWORDS_#$stop#gs;
+		print $F $txt;
+		print ".";
+	}
+	close($F);
+	close($D);
+	print "\n";
+	return;
+}
+
+
+sub read_file
+{
+	my $filename = shift;
+	my $F;
+	local $/ = undef;
+	open($F, '<', $filename) || die "Could not open file $filename\n";
+	my $txt = <$F>;
+	close($F);
+
+	return $txt;
+}
-- 
2.23.0.385.gbc12974a89

v5-0006-meson-prereq-add-output-path-arg-in-generate-lwlo.patchtext/x-diff; charset=us-asciiDownload
From 5e712fa7763cb28a4ab8f763cab6d3746c24f857 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 10 Mar 2021 01:43:07 -0800
Subject: [PATCH v5 06/16] meson: prereq: add output path arg in
 generate-lwlocknames.pl

---
 src/backend/storage/lmgr/generate-lwlocknames.pl | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl
index 8a44946594d..315156b29f1 100644
--- a/src/backend/storage/lmgr/generate-lwlocknames.pl
+++ b/src/backend/storage/lmgr/generate-lwlocknames.pl
@@ -5,15 +5,21 @@
 
 use strict;
 use warnings;
+use Getopt::Long;
+
+my $output_path = '.';
 
 my $lastlockidx = -1;
 my $continue    = "\n";
 
+GetOptions(
+	'output:s'       => \$output_path);
+
 open my $lwlocknames, '<', $ARGV[0] or die;
 
 # Include PID in suffix in case parallel make runs this multiple times.
-my $htmp = "lwlocknames.h.tmp$$";
-my $ctmp = "lwlocknames.c.tmp$$";
+my $htmp = "$output_path/lwlocknames.h.tmp$$";
+my $ctmp = "$output_path/lwlocknames.c.tmp$$";
 open my $h, '>', $htmp or die "Could not open $htmp: $!";
 open my $c, '>', $ctmp or die "Could not open $ctmp: $!";
 
@@ -65,7 +71,7 @@ printf $h "#define NUM_INDIVIDUAL_LWLOCKS		%s\n", $lastlockidx + 1;
 close $h;
 close $c;
 
-rename($htmp, 'lwlocknames.h') || die "rename: $htmp: $!";
-rename($ctmp, 'lwlocknames.c') || die "rename: $ctmp: $!";
+rename($htmp, "$output_path/lwlocknames.h") || die "rename: $htmp to $output_path/lwlocknames.h: $!";
+rename($ctmp, "$output_path/lwlocknames.c") || die "rename: $ctmp: $!";
 
 close $lwlocknames;
-- 
2.23.0.385.gbc12974a89

v5-0007-meson-prereq-add-src-tools-gen_versioning_script..patchtext/x-diff; charset=us-asciiDownload
From 0fd47642701e4941c6a2bb3eca29b9509b999399 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 10 Mar 2021 15:11:13 -0800
Subject: [PATCH v5 07/16] meson: prereq: add
 src/tools/gen_versioning_script.pl.

Currently the logic is all in src/Makefile.shlib. This adds a sketch
of a generation script that can be used from meson.
---
 src/tools/gen_versioning_script.pl | 58 ++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100644 src/tools/gen_versioning_script.pl

diff --git a/src/tools/gen_versioning_script.pl b/src/tools/gen_versioning_script.pl
new file mode 100644
index 00000000000..862b5e14aad
--- /dev/null
+++ b/src/tools/gen_versioning_script.pl
@@ -0,0 +1,58 @@
+use strict;
+use warnings;
+
+my $format = $ARGV[0] or die "$0: missing required argument: format\n";
+my $input = $ARGV[1] or die "$0: missing required argument: input\n";
+my $output = $ARGV[2] or die "$0: missing required argument: output\n";
+
+#FIXME: handle format argument, so we can reuse the one script for several platforms
+if (not ($format eq 'gnu' or $format eq 'darwin'))
+{
+	die "$0: $format is not yet handled (only gnu is)\n";
+}
+
+open(my $input_handle, '<', $input)
+  or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+  or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+	print $output_handle "{
+  global:
+";
+}
+
+while (<$input_handle>)
+{
+	if (/^#/)
+	{
+		# don't do anything with a comment
+	}
+	elsif (/^([^\s]+)\s+([^\s]+)/)
+	{
+		if ($format eq 'gnu')
+		{
+			print $output_handle "    $1;\n";
+		}
+		elsif ($format eq 'darwin')
+		{
+			print $output_handle "    _$1\n";
+		}
+	}
+	else
+	{
+		die "$0: unexpected line $_\n";
+	}
+}
+
+if ($format eq 'gnu')
+{
+	print $output_handle "  local: *;
+};
+";
+}
+
+exit(0);
-- 
2.23.0.385.gbc12974a89

v5-0008-meson-prereq-generate-errcodes.pl-accept-output-f.patchtext/x-diff; charset=us-asciiDownload
From 8e6ee0e31e25238ff8ea50938a20f1775001c88d Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 27 Sep 2021 00:14:09 -0700
Subject: [PATCH v5 08/16] meson: prereq: generate-errcodes.pl: accept output
 file

---
 src/backend/utils/Makefile             |  2 +-
 src/backend/utils/generate-errcodes.pl | 13 ++++++++-----
 src/tools/msvc/Solution.pm             |  2 +-
 3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index ef8df254826..469caf0d704 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -52,7 +52,7 @@ fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/ca
 	touch $@
 
 errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
-	$(PERL) $(srcdir)/generate-errcodes.pl $< > $@
+	$(PERL) $(srcdir)/generate-errcodes.pl $< $@
 
 ifneq ($(enable_dtrace), yes)
 probes.h: Gen_dummy_probes.sed
diff --git a/src/backend/utils/generate-errcodes.pl b/src/backend/utils/generate-errcodes.pl
index c5cdd388138..57ec2a5ca21 100644
--- a/src/backend/utils/generate-errcodes.pl
+++ b/src/backend/utils/generate-errcodes.pl
@@ -6,11 +6,13 @@
 use strict;
 use warnings;
 
-print
+open my $errcodes, '<', $ARGV[0] or die;
+open my $out, '>', $ARGV[1] or die;
+
+print $out
   "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n";
-print "/* there is deliberately not an #ifndef ERRCODES_H here */\n";
+print $out "/* there is deliberately not an #ifndef ERRCODES_H here */\n";
 
-open my $errcodes, '<', $ARGV[0] or die;
 
 while (<$errcodes>)
 {
@@ -25,7 +27,7 @@ while (<$errcodes>)
 	{
 		my $header = $1;
 		$header =~ s/^\s+//;
-		print "\n/* $header */\n";
+		print $out "\n/* $header */\n";
 		next;
 	}
 
@@ -40,7 +42,8 @@ while (<$errcodes>)
 	# And quote them
 	$sqlstate =~ s/([^,])/'$1'/g;
 
-	print "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n";
+	print $out "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n";
 }
 
 close $errcodes;
+close $out;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index dc78d3b65c3..40cd6020421 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -659,7 +659,7 @@ sub GenerateFiles
 	{
 		print "Generating errcodes.h...\n";
 		system(
-			'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt > src/backend/utils/errcodes.h'
+			'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt src/backend/utils/errcodes.h'
 		);
 		copyFile('src/backend/utils/errcodes.h',
 			'src/include/utils/errcodes.h');
-- 
2.23.0.385.gbc12974a89

v5-0009-meson-prereq-remove-unhelpful-chattiness-in-snowb.patchtext/x-diff; charset=us-asciiDownload
From b47c7af10cea83c78e8f3c75bf083c42d6adfd55 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 27 Sep 2021 15:41:24 -0700
Subject: [PATCH v5 09/16] meson: prereq: remove unhelpful chattiness in
 snowball_create.pl.

---
 src/backend/snowball/snowball_create.pl | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl
index d9d79f3668f..285cf4f5d90 100644
--- a/src/backend/snowball/snowball_create.pl
+++ b/src/backend/snowball/snowball_create.pl
@@ -42,7 +42,6 @@ sub GenerateTsearchFiles
 	my $target = shift;
 	my $output_file = "$output_path/snowball_create.sql";
 
-	print "Generating tsearch script...";
 	my $F;
 	my $D;
 	my $tmpl = read_file("$input_path/snowball.sql.in");
@@ -88,11 +87,9 @@ sub GenerateTsearchFiles
 		$txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs;
 		$txt =~ s#_STOPWORDS_#$stop#gs;
 		print $F $txt;
-		print ".";
 	}
 	close($F);
 	close($D);
-	print "\n";
 	return;
 }
 
-- 
2.23.0.385.gbc12974a89

v5-0010-meson-prereq-Can-we-get-away-with-not-export-all-.patchtext/x-diff; charset=us-asciiDownload
From bfcc214e472040810bb59110280e734b2c5f1f2b Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 29 Sep 2021 00:29:10 -0700
Subject: [PATCH v5 10/16] meson: prereq: Can we get away with not
 export-all'ing libraries?

---
 configure                                  | 49 ++++++++++++++++++++++
 configure.ac                               | 10 +++++
 contrib/hstore/hstore.h                    | 16 +++----
 contrib/ltree/ltree.h                      | 40 +++++++++---------
 src/Makefile.global.in                     |  1 +
 src/Makefile.shlib                         | 12 ++++++
 src/include/c.h                            | 15 +++++--
 src/include/fmgr.h                         |  6 ++-
 src/include/jit/jit.h                      |  2 +-
 src/include/pg_config.h.in                 |  3 ++
 src/include/replication/output_plugin.h    |  2 +
 src/pl/plpython/plpy_elog.h                |  8 ++--
 src/pl/plpython/plpy_typeio.h              | 18 ++++----
 src/pl/plpython/plpy_util.h                |  8 ++--
 src/test/modules/test_shm_mq/test_shm_mq.h |  2 +-
 src/test/modules/worker_spi/worker_spi.c   |  2 +-
 src/tools/msvc/Solution.pm                 |  1 +
 17 files changed, 142 insertions(+), 53 deletions(-)

diff --git a/configure b/configure
index 1b5fd12a432..fd15801b34c 100755
--- a/configure
+++ b/configure
@@ -735,6 +735,7 @@ CPP
 CFLAGS_SL
 BITCODE_CXXFLAGS
 BITCODE_CFLAGS
+CFLAGS_SL_MOD
 CFLAGS_VECTORIZE
 CFLAGS_UNROLL_LOOPS
 PERMIT_DECLARATION_AFTER_STATEMENT
@@ -6421,6 +6422,54 @@ fi
   if test -n "$NOT_THE_CFLAGS"; then
     CFLAGS="$CFLAGS -Wno-stringop-truncation"
   fi
+
+  # If the compiler knows how to hide symbols, use that. But only for shared libraries,
+  # for postgres itself that'd be too verbose for now.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD" >&5
+$as_echo_n "checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD... " >&6; }
+if ${pgac_cv_prog_CC_cflags__fvisibility_hidden+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  pgac_save_CFLAGS=$CFLAGS
+pgac_save_CC=$CC
+CC=${CC}
+CFLAGS="${CFLAGS_SL_MOD} -fvisibility=hidden"
+ac_save_c_werror_flag=$ac_c_werror_flag
+ac_c_werror_flag=yes
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  pgac_cv_prog_CC_cflags__fvisibility_hidden=yes
+else
+  pgac_cv_prog_CC_cflags__fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_c_werror_flag=$ac_save_c_werror_flag
+CFLAGS="$pgac_save_CFLAGS"
+CC="$pgac_save_CC"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__fvisibility_hidden" >&5
+$as_echo "$pgac_cv_prog_CC_cflags__fvisibility_hidden" >&6; }
+if test x"$pgac_cv_prog_CC_cflags__fvisibility_hidden" = x"yes"; then
+  CFLAGS_SL_MOD="${CFLAGS_SL_MOD} -fvisibility=hidden"
+fi
+
+
+  if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then
+
+$as_echo "#define HAVE_VISIBILITY_ATTRIBUTE 1" >>confdefs.h
+
+  fi
+
 elif test "$ICC" = yes; then
   # Intel's compiler has a bug/misoptimization in checking for
   # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.
diff --git a/configure.ac b/configure.ac
index 44ee3ebe2f1..973f83db52c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -541,6 +541,15 @@ if test "$GCC" = yes -a "$ICC" = no; then
   if test -n "$NOT_THE_CFLAGS"; then
     CFLAGS="$CFLAGS -Wno-stringop-truncation"
   fi
+
+  # If the compiler knows how to hide symbols, use that. But only for shared libraries,
+  # for postgres itself that'd be too verbose for now.
+  PGAC_PROG_CC_VAR_OPT(CFLAGS_SL_MOD, [-fvisibility=hidden])
+  if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then
+     AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE, 1,
+               [Define to 1 if your compiler knows the visibility("hidden") attribute.])
+  fi
+
 elif test "$ICC" = yes; then
   # Intel's compiler has a bug/misoptimization in checking for
   # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.
@@ -564,6 +573,7 @@ fi
 
 AC_SUBST(CFLAGS_UNROLL_LOOPS)
 AC_SUBST(CFLAGS_VECTORIZE)
+AC_SUBST(CFLAGS_SL_MOD)
 
 # Determine flags used to emit bitcode for JIT inlining. Need to test
 # for behaviour changing compiler flags, to keep compatibility with
diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h
index bf4a565ed9b..625134c9f69 100644
--- a/contrib/hstore/hstore.h
+++ b/contrib/hstore/hstore.h
@@ -147,7 +147,7 @@ typedef struct
 	} while (0)
 
 /* DatumGetHStoreP includes support for reading old-format hstore values */
-extern HStore *hstoreUpgrade(Datum orig);
+extern PGDLLEXPORT HStore *hstoreUpgrade(Datum orig);
 
 #define DatumGetHStoreP(d) hstoreUpgrade(d)
 
@@ -168,14 +168,14 @@ typedef struct
 	bool		needfree;		/* need to pfree the value? */
 } Pairs;
 
-extern int	hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen);
-extern HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen);
+extern PGDLLEXPORT int	hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen);
+extern PGDLLEXPORT HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen);
 
-extern size_t hstoreCheckKeyLen(size_t len);
-extern size_t hstoreCheckValLen(size_t len);
+extern PGDLLEXPORT size_t hstoreCheckKeyLen(size_t len);
+extern PGDLLEXPORT size_t hstoreCheckValLen(size_t len);
 
-extern int	hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen);
-extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
+extern PGDLLEXPORT int	hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen);
+extern PGDLLEXPORT Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
 
 #define HStoreContainsStrategyNumber	7
 #define HStoreExistsStrategyNumber		9
@@ -194,7 +194,7 @@ extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
 #if HSTORE_POLLUTE_NAMESPACE
 #define HSTORE_POLLUTE(newname_,oldname_) \
 	PG_FUNCTION_INFO_V1(oldname_);		  \
-	Datum newname_(PG_FUNCTION_ARGS);	  \
+	extern PGDLLEXPORT Datum newname_(PG_FUNCTION_ARGS);	  \
 	Datum oldname_(PG_FUNCTION_ARGS) { return newname_(fcinfo); } \
 	extern int no_such_variable
 #else
diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h
index 5b4be5e680a..d8bcdedbdbe 100644
--- a/contrib/ltree/ltree.h
+++ b/contrib/ltree/ltree.h
@@ -176,30 +176,30 @@ typedef struct
 
 
 /* use in array iterator */
-Datum		ltree_isparent(PG_FUNCTION_ARGS);
-Datum		ltree_risparent(PG_FUNCTION_ARGS);
-Datum		ltq_regex(PG_FUNCTION_ARGS);
-Datum		ltq_rregex(PG_FUNCTION_ARGS);
-Datum		lt_q_regex(PG_FUNCTION_ARGS);
-Datum		lt_q_rregex(PG_FUNCTION_ARGS);
-Datum		ltxtq_exec(PG_FUNCTION_ARGS);
-Datum		ltxtq_rexec(PG_FUNCTION_ARGS);
-Datum		_ltq_regex(PG_FUNCTION_ARGS);
-Datum		_ltq_rregex(PG_FUNCTION_ARGS);
-Datum		_lt_q_regex(PG_FUNCTION_ARGS);
-Datum		_lt_q_rregex(PG_FUNCTION_ARGS);
-Datum		_ltxtq_exec(PG_FUNCTION_ARGS);
-Datum		_ltxtq_rexec(PG_FUNCTION_ARGS);
-Datum		_ltree_isparent(PG_FUNCTION_ARGS);
-Datum		_ltree_risparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_isparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_risparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltq_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltq_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		lt_q_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		lt_q_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltxtq_exec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltxtq_rexec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltq_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltq_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_lt_q_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_lt_q_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltxtq_exec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltxtq_rexec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltree_isparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltree_risparent(PG_FUNCTION_ARGS);
 
 /* Concatenation functions */
-Datum		ltree_addltree(PG_FUNCTION_ARGS);
-Datum		ltree_addtext(PG_FUNCTION_ARGS);
-Datum		ltree_textadd(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_addltree(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_addtext(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_textadd(PG_FUNCTION_ARGS);
 
 /* Util function */
-Datum		ltree_in(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_in(PG_FUNCTION_ARGS);
 
 bool		ltree_execute(ITEM *curitem, void *checkval,
 						  bool calcnot, bool (*chkcond) (void *checkval, ITEM *val));
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 533c12fef95..c7c701dcb93 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -259,6 +259,7 @@ SUN_STUDIO_CC = @SUN_STUDIO_CC@
 CXX = @CXX@
 CFLAGS = @CFLAGS@
 CFLAGS_SL = @CFLAGS_SL@
+CFLAGS_SL_MOD = @CFLAGS_SL_MOD@
 CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@
 CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@
 CFLAGS_SSE42 = @CFLAGS_SSE42@
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 551023c6fb0..d36782aa942 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -253,6 +253,18 @@ ifeq ($(PORTNAME), win32)
 endif
 
 
+# If the shared library doesn't have an export file, mark all symbols not
+# explicitly exported using PGDLLEXPORT as hidden. We can't pass these flags
+# when building a library with explicit exports, as the symbols would be
+# hidden before the linker script / exported symbol list takes effect.
+#
+# XXX: This probably isn't the best location, but not clear instead?
+ifeq ($(SHLIB_EXPORTS),)
+  LDFLAGS += $(CFLAGS_SL_MOD)
+  override CFLAGS += $(CFLAGS_SL_MOD)
+  override CXXFLAGS += $(CFLAGS_SL_MOD)
+endif
+
 
 ##
 ## BUILD
diff --git a/src/include/c.h b/src/include/c.h
index c8ede082739..9b539a2657b 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -1312,11 +1312,18 @@ extern long long strtoll(const char *str, char **endptr, int base);
 extern unsigned long long strtoull(const char *str, char **endptr, int base);
 #endif
 
-/* no special DLL markers on most ports */
-#ifndef PGDLLIMPORT
-#define PGDLLIMPORT
+/*
+ * If the platform knows __attribute__((visibility("*"))), i.e. gcc like
+ * compilers, we use that.
+ */
+#if !defined(PGDLLIMPORT) && defined(HAVE_VISIBILITY_ATTRIBUTE)
+#define PGDLLIMPORT __attribute__((visibility("default")))
+#define PGDLLEXPORT __attribute__((visibility("default")))
 #endif
-#ifndef PGDLLEXPORT
+
+/* No special DLL markers on the remaining ports. */
+#if !defined(PGDLLIMPORT)
+#define PGDLLIMPORT
 #define PGDLLEXPORT
 #endif
 
diff --git a/src/include/fmgr.h b/src/include/fmgr.h
index ab7b85c86e1..679443cca19 100644
--- a/src/include/fmgr.h
+++ b/src/include/fmgr.h
@@ -413,7 +413,7 @@ typedef const Pg_finfo_record *(*PGFInfoFunction) (void);
  *	info function, since authors shouldn't need to be explicitly aware of it.
  */
 #define PG_FUNCTION_INFO_V1(funcname) \
-extern Datum funcname(PG_FUNCTION_ARGS); \
+extern PGDLLEXPORT Datum funcname(PG_FUNCTION_ARGS); \
 extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \
 const Pg_finfo_record * \
 CppConcat(pg_finfo_,funcname) (void) \
@@ -424,6 +424,10 @@ CppConcat(pg_finfo_,funcname) (void) \
 extern int no_such_variable
 
 
+extern PGDLLEXPORT void _PG_init(void);
+extern PGDLLEXPORT void _PG_fini(void);
+
+
 /*-------------------------------------------------------------------------
  *		Support for verifying backend compatibility of loaded modules
  *
diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h
index b634df30b98..74617ad1b64 100644
--- a/src/include/jit/jit.h
+++ b/src/include/jit/jit.h
@@ -63,7 +63,7 @@ typedef struct JitContext
 
 typedef struct JitProviderCallbacks JitProviderCallbacks;
 
-extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
+extern PGDLLEXPORT void _PG_jit_provider_init(JitProviderCallbacks *cb);
 typedef void (*JitProviderInit) (JitProviderCallbacks *cb);
 typedef void (*JitProviderResetAfterErrorCB) (void);
 typedef void (*JitProviderReleaseContextCB) (JitContext *context);
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 15ffdd895aa..e3ab1c7752f 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -710,6 +710,9 @@
 /* Define to 1 if you have the <uuid/uuid.h> header file. */
 #undef HAVE_UUID_UUID_H
 
+/* Define to 1 if your compiler knows the visibility("hidden") attribute. */
+#undef HAVE_VISIBILITY_ATTRIBUTE
+
 /* Define to 1 if you have the `wcstombs_l' function. */
 #undef HAVE_WCSTOMBS_L
 
diff --git a/src/include/replication/output_plugin.h b/src/include/replication/output_plugin.h
index 810495ed0e4..a087f14dadd 100644
--- a/src/include/replication/output_plugin.h
+++ b/src/include/replication/output_plugin.h
@@ -35,6 +35,8 @@ typedef struct OutputPluginOptions
  */
 typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb);
 
+extern PGDLLEXPORT void _PG_output_plugin_init(struct OutputPluginCallbacks *cb);
+
 /*
  * Callback that gets called in a user-defined plugin. ctx->private_data can
  * be set to some private data.
diff --git a/src/pl/plpython/plpy_elog.h b/src/pl/plpython/plpy_elog.h
index e02ef4ffe9f..aeade82ce10 100644
--- a/src/pl/plpython/plpy_elog.h
+++ b/src/pl/plpython/plpy_elog.h
@@ -34,13 +34,13 @@ extern PyObject *PLy_exc_spi_error;
 	} while(0)
 #endif							/* HAVE__BUILTIN_CONSTANT_P */
 
-extern void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
+extern PGDLLEXPORT void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
 
-extern void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
+extern PGDLLEXPORT void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
 
-extern void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural,
+extern PGDLLEXPORT void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural,
 									 unsigned long n,...) pg_attribute_printf(2, 5) pg_attribute_printf(3, 5);
 
-extern void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata);
+extern PGDLLEXPORT void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata);
 
 #endif							/* PLPY_ELOG_H */
diff --git a/src/pl/plpython/plpy_typeio.h b/src/pl/plpython/plpy_typeio.h
index d11e6ae1b89..87e3b2c464e 100644
--- a/src/pl/plpython/plpy_typeio.h
+++ b/src/pl/plpython/plpy_typeio.h
@@ -147,29 +147,29 @@ struct PLyObToDatum
 };
 
 
-extern PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val);
-extern Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val,
+extern PGDLLEXPORT PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val);
+extern PGDLLEXPORT Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val,
 								bool *isnull);
 
-extern PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple,
+extern PGDLLEXPORT PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple,
 									  TupleDesc desc, bool include_generated);
 
-extern void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
+extern PGDLLEXPORT void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
 								 Oid typeOid, int32 typmod,
 								 struct PLyProcedure *proc);
-extern void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt,
+extern PGDLLEXPORT void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt,
 								  Oid typeOid, int32 typmod,
 								  struct PLyProcedure *proc);
 
-extern void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc,
 								  struct PLyProcedure *proc);
-extern void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc,
 								   struct PLyProcedure *proc);
 
-extern void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc,
 									struct PLyProcedure *proc);
 
 /* conversion from Python objects to C strings --- exported for transforms */
-extern char *PLyObject_AsString(PyObject *plrv);
+extern PGDLLEXPORT char *PLyObject_AsString(PyObject *plrv);
 
 #endif							/* PLPY_TYPEIO_H */
diff --git a/src/pl/plpython/plpy_util.h b/src/pl/plpython/plpy_util.h
index 7c6577925ea..6f491b0f95b 100644
--- a/src/pl/plpython/plpy_util.h
+++ b/src/pl/plpython/plpy_util.h
@@ -8,10 +8,10 @@
 
 #include "plpython.h"
 
-extern PyObject *PLyUnicode_Bytes(PyObject *unicode);
-extern char *PLyUnicode_AsString(PyObject *unicode);
+extern PGDLLEXPORT PyObject *PLyUnicode_Bytes(PyObject *unicode);
+extern PGDLLEXPORT char *PLyUnicode_AsString(PyObject *unicode);
 
-extern PyObject *PLyUnicode_FromString(const char *s);
-extern PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
+extern PGDLLEXPORT PyObject *PLyUnicode_FromString(const char *s);
+extern PGDLLEXPORT PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
 
 #endif							/* PLPY_UTIL_H */
diff --git a/src/test/modules/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h
index a6661218347..a7a36714a48 100644
--- a/src/test/modules/test_shm_mq/test_shm_mq.h
+++ b/src/test/modules/test_shm_mq/test_shm_mq.h
@@ -40,6 +40,6 @@ extern void test_shm_mq_setup(int64 queue_size, int32 nworkers,
 							  shm_mq_handle **input);
 
 /* Main entrypoint for a worker. */
-extern void test_shm_mq_main(Datum) pg_attribute_noreturn();
+extern PGDLLEXPORT void test_shm_mq_main(Datum) pg_attribute_noreturn();
 
 #endif
diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c
index 0b6246676b6..e267bc3cffa 100644
--- a/src/test/modules/worker_spi/worker_spi.c
+++ b/src/test/modules/worker_spi/worker_spi.c
@@ -47,7 +47,7 @@ PG_MODULE_MAGIC;
 PG_FUNCTION_INFO_V1(worker_spi_launch);
 
 void		_PG_init(void);
-void		worker_spi_main(Datum) pg_attribute_noreturn();
+PGDLLEXPORT void worker_spi_main(Datum) pg_attribute_noreturn();
 
 /* GUC variables */
 static int	worker_spi_naptime = 10;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 40cd6020421..85b877b80b2 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -432,6 +432,7 @@ sub GenerateFiles
 		HAVE_WINLDAP_H                           => undef,
 		HAVE_WCSTOMBS_L                          => 1,
 		HAVE_WCTYPE_H                            => 1,
+		HAVE_VISIBILITY_ATTRIBUTE                => undef,
 		HAVE_WRITEV                              => undef,
 		HAVE_X509_GET_SIGNATURE_NID              => 1,
 		HAVE_X86_64_POPCNTQ                      => undef,
-- 
2.23.0.385.gbc12974a89

v5-0011-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patchtext/x-diff; charset=us-asciiDownload
From c1571bfd8f3eb811ad0f8916d189f94d3f98ec80 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 30 Sep 2021 10:20:24 -0700
Subject: [PATCH v5 11/16] meson: prereq: Handle DLSUFFIX in msvc builds
 similar to other build envs.

---
 src/include/port/win32_port.h | 3 ---
 src/tools/msvc/Mkvcbuild.pm   | 3 +++
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h
index c1c4831595a..72b2d2b5a01 100644
--- a/src/include/port/win32_port.h
+++ b/src/include/port/win32_port.h
@@ -529,9 +529,6 @@ typedef unsigned short mode_t;
 #define W_OK 2
 #define R_OK 4
 
-/* Pulled from Makefile.port in MinGW */
-#define DLSUFFIX ".dll"
-
 #endif							/* _MSC_VER */
 
 #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || \
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index b8e62c6d3f7..47b5c43357a 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -195,6 +195,7 @@ sub mkvcbuild
 		'syncrep_gram.y');
 	$postgres->AddFiles('src/backend/utils/adt', 'jsonpath_scan.l',
 		'jsonpath_gram.y');
+	$postgres->AddDefine('DLSUFFIX=".dll"');
 	$postgres->AddDefine('BUILDING_DLL');
 	$postgres->AddLibrary('secur32.lib');
 	$postgres->AddLibrary('ws2_32.lib');
@@ -298,6 +299,7 @@ sub mkvcbuild
 	my $libecpg = $solution->AddProject('libecpg', 'dll', 'interfaces',
 		'src/interfaces/ecpg/ecpglib');
 	$libecpg->AddDefine('FRONTEND');
+	$libecpg->AddDefine('DLSUFFIX=".dll"');
 	$libecpg->AddIncludeDir('src/interfaces/ecpg/include');
 	$libecpg->AddIncludeDir('src/interfaces/libpq');
 	$libecpg->AddIncludeDir('src/port');
@@ -845,6 +847,7 @@ sub mkvcbuild
 	$pgregress->AddFile('src/test/regress/pg_regress.c');
 	$pgregress->AddFile('src/test/regress/pg_regress_main.c');
 	$pgregress->AddIncludeDir('src/port');
+	$pgregress->AddDefine('DLSUFFIX=".dll"');
 	$pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
 	$pgregress->AddLibrary('ws2_32.lib');
 	$pgregress->AddDirResourceFile('src/test/regress');
-- 
2.23.0.385.gbc12974a89

v5-0012-prereq-make-unicode-targets-work-in-vpath-builds.patchtext/x-diff; charset=us-asciiDownload
From 386bab39b951a71336c57611f8ff10977995ec9f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 27 Oct 2021 09:59:33 -0700
Subject: [PATCH v5 12/16] prereq: make unicode targets work in vpath builds.

---
 contrib/unaccent/Makefile                         |  4 ++--
 src/common/unicode/Makefile                       |  8 ++++----
 src/common/unicode/generate-unicode_norm_table.pl | 11 ++++++-----
 3 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/contrib/unaccent/Makefile b/contrib/unaccent/Makefile
index b8307d1601e..d6c466e07ad 100644
--- a/contrib/unaccent/Makefile
+++ b/contrib/unaccent/Makefile
@@ -27,12 +27,12 @@ include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
-update-unicode: unaccent.rules
+update-unicode: $(srcdir)/unaccent.rules
 
 # Allow running this even without --with-python
 PYTHON ?= python
 
-unaccent.rules: generate_unaccent_rules.py ../../src/common/unicode/UnicodeData.txt Latin-ASCII.xml
+$(srcdir)/unaccent.rules: generate_unaccent_rules.py ../../src/common/unicode/UnicodeData.txt Latin-ASCII.xml
 	$(PYTHON) $< --unicode-data-file $(word 2,$^) --latin-ascii-file $(word 3,$^) >$@
 
 # Only download it once; dependencies must match src/common/unicode/
diff --git a/src/common/unicode/Makefile b/src/common/unicode/Makefile
index a3683dd86b9..40a5f7bc0fe 100644
--- a/src/common/unicode/Makefile
+++ b/src/common/unicode/Makefile
@@ -12,14 +12,14 @@ subdir = src/common/unicode
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
+override CPPFLAGS := -DFRONTEND -I$(abs_top_builddir)/src/common/unicode $(CPPFLAGS)
 LIBS += $(PTHREAD_LIBS)
 
 # By default, do nothing.
 all:
 
 update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_east_asian_fw_table.h unicode_normprops_table.h unicode_norm_hashfunc.h
-	mv $^ ../../../src/include/common/
+	mv $^ $(top_srcdir)/src/include/common/
 	$(MAKE) normalization-check
 
 # These files are part of the Unicode Character Database. Download
@@ -33,7 +33,7 @@ UnicodeData.txt EastAsianWidth.txt DerivedNormalizationProps.txt CompositionExcl
 unicode_norm_hashfunc.h: unicode_norm_table.h
 
 unicode_norm_table.h: generate-unicode_norm_table.pl UnicodeData.txt CompositionExclusions.txt
-	$(PERL) generate-unicode_norm_table.pl
+	$(PERL) $< $(CURDIR)
 
 unicode_combining_table.h: generate-unicode_combining_table.pl UnicodeData.txt
 	$(PERL) $^ >$@
@@ -58,7 +58,7 @@ submake-common:
 	$(MAKE) -C .. all
 
 norm_test_table.h: generate-norm_test_table.pl NormalizationTest.txt
-	perl generate-norm_test_table.pl NormalizationTest.txt $@
+	perl $^ $@
 
 .PHONY: normalization-check
 
diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 114ab30d3f1..4d2c603ff27 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -15,15 +15,16 @@ use FindBin;
 use lib "$FindBin::RealBin/../../tools/";
 use PerfectHash;
 
-my $output_table_file = "unicode_norm_table.h";
-my $output_func_file  = "unicode_norm_hashfunc.h";
+my $directory = $ARGV[0];
+my $output_table_file = "$directory/unicode_norm_table.h";
+my $output_func_file  = "$directory/unicode_norm_hashfunc.h";
 
 my $FH;
 
 # Read list of codes that should be excluded from re-composition.
 my @composition_exclusion_codes = ();
-open($FH, '<', "CompositionExclusions.txt")
-  or die "Could not open CompositionExclusions.txt: $!.";
+open($FH, '<', "$directory/CompositionExclusions.txt")
+  or die "Could not open $directory/CompositionExclusions.txt: $!.";
 while (my $line = <$FH>)
 {
 	if ($line =~ /^([[:xdigit:]]+)/)
@@ -38,7 +39,7 @@ close $FH;
 # and character decomposition mapping
 my @characters     = ();
 my %character_hash = ();
-open($FH, '<', "UnicodeData.txt")
+open($FH, '<', "$directory/UnicodeData.txt")
   or die "Could not open UnicodeData.txt: $!.";
 while (my $line = <$FH>)
 {
-- 
2.23.0.385.gbc12974a89

v5-0013-wip-don-t-run-ldap-tests-on-windows.patchtext/x-diff; charset=us-asciiDownload
From 418ac644ce3c51c73c50166f126392610c5c2d0e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 10 Oct 2021 13:49:12 -0700
Subject: [PATCH v5 13/16] wip: don't run ldap tests on windows.

---
 src/test/ldap/t/001_auth.pl | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index 5a9a0098327..8850fc1cb1b 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -6,6 +6,13 @@ use warnings;
 use PostgreSQL::Test::Utils;
 use PostgreSQL::Test::Cluster;
 use Test::More;
+use Config;
+
+if ($Config{osname} eq 'MSWin32')
+{
+	plan skip_all => 'ldap tests ';
+	exit;
+}
 
 if ($ENV{with_ldap} eq 'yes')
 {
-- 
2.23.0.385.gbc12974a89

v5-0014-wip-split-TESTDIR-into-two.patchtext/x-diff; charset=us-asciiDownload
From fb2933a9bba05d79ce920f9f161a732c615c4897 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 27 Oct 2021 10:10:37 -0700
Subject: [PATCH v5 14/16] wip: split TESTDIR into two.

---
 src/Makefile.global.in                 |  9 ++++---
 src/bin/psql/t/010_tab_completion.pl   | 34 +++++++++++++-------------
 src/test/perl/PostgreSQL/Test/Utils.pm |  2 +-
 src/tools/msvc/vcregress.pl            |  2 ++
 4 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index c7c701dcb93..014029c9a9c 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -450,7 +450,8 @@ define prove_installcheck
 rm -rf '$(CURDIR)'/tmp_check
 $(MKDIR_P) '$(CURDIR)'/tmp_check
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+   PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -460,8 +461,9 @@ define prove_installcheck
 rm -rf '$(CURDIR)'/tmp_check
 $(MKDIR_P) '$(CURDIR)'/tmp_check
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
-   PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
+   TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+   PATH="$(bindir):$(CURDIR):$$PATH" PGPORT='6$(DEF_PGPORT)' \
+   top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
 endef
@@ -471,6 +473,7 @@ define prove_check
 rm -rf '$(CURDIR)'/tmp_check
 $(MKDIR_P) '$(CURDIR)'/tmp_check
 cd $(srcdir) && \
+   TESTOUTDIR='$(CURDIR)/tmp_check' \
    TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 55b318517ea..33f6a6c12fd 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -67,23 +67,23 @@ delete $ENV{LS_COLORS};
 # to run in the build directory so that we can use relative paths to
 # access the tmp_check subdirectory; otherwise the output from filename
 # completion tests is too variable.
-if ($ENV{TESTDIR})
+if ($ENV{TESTOUTDIR})
 {
-	chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+	chdir "$ENV{TESTOUTDIR}" or die "could not chdir to \"$ENV{TESTOUTDIR}\": $!";
 }
 
 # Create some junk files for filename completion testing.
 my $FH;
-open $FH, ">", "tmp_check/somefile"
-  or die("could not create file \"tmp_check/somefile\": $!");
+open $FH, ">", "somefile"
+  or die("could not create file \"somefile\": $!");
 print $FH "some stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile123"
-  or die("could not create file \"tmp_check/afile123\": $!");
+open $FH, ">", "afile123"
+  or die("could not create file \"afile123\": $!");
 print $FH "more stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile456"
-  or die("could not create file \"tmp_check/afile456\": $!");
+open $FH, ">", "afile456"
+  or die("could not create file \"afile456\": $!");
 print $FH "other stuff\n";
 close $FH;
 
@@ -184,16 +184,16 @@ clear_query();
 
 # check filename completion
 check_completion(
-	"\\lo_import tmp_check/some\t",
-	qr|tmp_check/somefile |,
+	"\\lo_import some\t",
+	qr|somefile |,
 	"filename completion with one possibility");
 
 clear_query();
 
 # note: readline might print a bell before the completion
 check_completion(
-	"\\lo_import tmp_check/af\t",
-	qr|tmp_check/af\a?ile|,
+	"\\lo_import af\t",
+	qr|af\a?ile|,
 	"filename completion with multiple possibilities");
 
 clear_query();
@@ -202,15 +202,15 @@ clear_query();
 # note: broken versions of libedit want to backslash the closing quote;
 # not much we can do about that
 check_completion(
-	"COPY foo FROM tmp_check/some\t",
-	qr|'tmp_check/somefile\\?' |,
+	"COPY foo FROM some\t",
+	qr|'somefile\\?' |,
 	"quoted filename completion with one possibility");
 
 clear_line();
 
 check_completion(
-	"COPY foo FROM tmp_check/af\t",
-	qr|'tmp_check/afile|,
+	"COPY foo FROM af\t",
+	qr|'afile|,
 	"quoted filename completion with multiple possibilities");
 
 # some versions of readline/libedit require two tabs here, some only need one
@@ -218,7 +218,7 @@ check_completion(
 # the quotes might appear, too
 check_completion(
 	"\t\t",
-	qr|afile123'? +'?(tmp_check/)?afile456|,
+	qr|afile123'? +'?afile456|,
 	"offer multiple file choices");
 
 clear_line();
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index f29d43f1f32..7878bc4ef48 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -187,7 +187,7 @@ INIT
 	# Determine output directories, and create them.  The base path is the
 	# TESTDIR environment variable, which is normally set by the invoking
 	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check";
+	$tmp_check = $ENV{TESTOUTDIR} ? "$ENV{TESTOUTDIR}" : "tmp_check";
 	$log_path = "$tmp_check/log";
 
 	mkdir $tmp_check;
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index fc826da3ff2..cf099033ebd 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -252,6 +252,8 @@ sub tap_check
 	# add the module build dir as the second element in the PATH
 	$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
 
+	$ENV{TESTOUTDIR} = "$dir/tmp_check";
+
 	rmtree('tmp_check');
 	system(@args);
 	my $status = $? >> 8;
-- 
2.23.0.385.gbc12974a89

v5-0015-meson-Add-draft-of-a-meson-based-buildsystem.patchtext/x-diff; charset=utf-8Download
From 8152a34caee2ce97112a860c01b1c6a0b4cef73f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 10 Sep 2021 09:51:51 -0700
Subject: [PATCH v5 15/16] meson: Add draft of a meson based buildsystem.

Author: Andres Freund
Author: Thomas Munro
Author: John Naylor <john.naylor@enterprisedb.com>
---
 configure                                     |    6 +
 configure.ac                                  |    6 +
 contrib/adminpack/meson.build                 |   20 +
 contrib/amcheck/meson.build                   |   37 +
 contrib/auth_delay/meson.build                |    4 +
 contrib/auto_explain/meson.build              |   13 +
 contrib/bloom/meson.build                     |   38 +
 contrib/bool_plperl/meson.build               |   37 +
 contrib/btree_gin/meson.build                 |   51 +
 contrib/btree_gist/meson.build                |   79 +
 contrib/citext/meson.build                    |   29 +
 contrib/cube/meson.build                      |   42 +
 contrib/dblink/meson.build                    |   29 +
 contrib/dict_int/meson.build                  |   19 +
 contrib/dict_xsyn/meson.build                 |   26 +
 contrib/earthdistance/meson.build             |   20 +
 contrib/file_fdw/meson.build                  |   19 +
 contrib/fuzzystrmatch/meson.build             |   23 +
 contrib/hstore/meson.build                    |   36 +
 contrib/hstore_plperl/meson.build             |   38 +
 contrib/hstore_plpython/meson.build           |   34 +
 contrib/intagg/meson.build                    |    6 +
 contrib/intarray/meson.build                  |   34 +
 contrib/isn/meson.build                       |   25 +
 contrib/jsonb_plperl/meson.build              |   37 +
 contrib/jsonb_plpython/meson.build            |   33 +
 contrib/lo/meson.build                        |   24 +
 contrib/ltree/meson.build                     |   36 +
 contrib/ltree_plpython/meson.build            |   34 +
 contrib/meson.build                           |   63 +
 contrib/oid2name/meson.build                  |   14 +
 contrib/old_snapshot/meson.build              |   14 +
 contrib/pageinspect/meson.build               |   45 +
 contrib/passwordcheck/meson.build             |   27 +
 contrib/pg_buffercache/meson.build            |   16 +
 contrib/pg_freespacemap/meson.build           |   15 +
 contrib/pg_prewarm/meson.build                |   16 +
 contrib/pg_stat_statements/meson.build        |   31 +
 contrib/pg_surgery/meson.build                |   23 +
 contrib/pg_trgm/meson.build                   |   33 +
 contrib/pg_visibility/meson.build             |   25 +
 contrib/pgcrypto/meson.build                  |  117 +
 contrib/pgrowlocks/meson.build                |   15 +
 contrib/pgstattuple/meson.build               |   30 +
 contrib/postgres_fdw/meson.build              |   31 +
 contrib/seg/meson.build                       |   40 +
 contrib/sepgsql/meson.build                   |   34 +
 contrib/spi/meson.build                       |   43 +
 contrib/sslinfo/meson.build                   |   21 +
 contrib/tablefunc/meson.build                 |   23 +
 contrib/tcn/meson.build                       |   13 +
 contrib/test_decoding/meson.build             |   69 +
 contrib/tsm_system_rows/meson.build           |   22 +
 contrib/tsm_system_time/meson.build           |   22 +
 contrib/unaccent/meson.build                  |   30 +
 contrib/uuid-ossp/meson.build                 |   31 +
 contrib/vacuumlo/meson.build                  |   14 +
 contrib/xml2/meson.build                      |   30 +
 conversion_helpers.txt                        |    6 +
 doc/src/sgml/meson.build                      |  241 ++
 doc/src/sgml/resolv.xsl                       |    7 +
 doc/src/sgml/version.sgml.in                  |    2 +
 meson.build                                   | 2130 +++++++++++++++++
 meson_options.txt                             |   90 +
 src/backend/access/brin/meson.build           |   12 +
 src/backend/access/common/meson.build         |   18 +
 src/backend/access/gin/meson.build            |   17 +
 src/backend/access/gist/meson.build           |   13 +
 src/backend/access/hash/meson.build           |   12 +
 src/backend/access/heap/meson.build           |   11 +
 src/backend/access/index/meson.build          |    6 +
 src/backend/access/meson.build                |   13 +
 src/backend/access/nbtree/meson.build         |   13 +
 src/backend/access/rmgrdesc/meson.build       |   26 +
 src/backend/access/spgist/meson.build         |   13 +
 src/backend/access/table/meson.build          |    6 +
 src/backend/access/tablesample/meson.build    |    5 +
 src/backend/access/transam/meson.build        |   28 +
 src/backend/bootstrap/meson.build             |   12 +
 src/backend/catalog/meson.build               |   41 +
 src/backend/commands/meson.build              |   50 +
 src/backend/executor/meson.build              |   67 +
 src/backend/foreign/meson.build               |    3 +
 src/backend/jit/llvm/meson.build              |   41 +
 src/backend/jit/meson.build                   |    3 +
 src/backend/lib/meson.build                   |   12 +
 src/backend/libpq/meson.build                 |   28 +
 src/backend/main/meson.build                  |    2 +
 src/backend/meson.build                       |  197 ++
 src/backend/nodes/meson.build                 |   17 +
 src/backend/optimizer/geqo/meson.build        |   17 +
 src/backend/optimizer/meson.build             |    5 +
 src/backend/optimizer/path/meson.build        |   11 +
 src/backend/optimizer/plan/meson.build        |   10 +
 src/backend/optimizer/prep/meson.build        |    7 +
 src/backend/optimizer/util/meson.build        |   16 +
 src/backend/parser/meson.build                |   43 +
 src/backend/partitioning/meson.build          |    5 +
 src/backend/port/meson.build                  |   28 +
 src/backend/port/win32/meson.build            |    6 +
 src/backend/postmaster/meson.build            |   15 +
 src/backend/regex/meson.build                 |   15 +
 .../replication/libpqwalreceiver/meson.build  |   13 +
 src/backend/replication/logical/meson.build   |   14 +
 src/backend/replication/meson.build           |   42 +
 src/backend/replication/pgoutput/meson.build  |   11 +
 src/backend/rewrite/meson.build               |    9 +
 src/backend/snowball/meson.build              |   83 +
 src/backend/statistics/meson.build            |    6 +
 src/backend/storage/buffer/meson.build        |    7 +
 src/backend/storage/file/meson.build          |    8 +
 src/backend/storage/freespace/meson.build     |    5 +
 src/backend/storage/ipc/meson.build           |   20 +
 src/backend/storage/large_object/meson.build  |    3 +
 src/backend/storage/lmgr/meson.build          |   18 +
 src/backend/storage/meson.build               |    9 +
 src/backend/storage/page/meson.build          |    5 +
 src/backend/storage/smgr/meson.build          |    4 +
 src/backend/storage/sync/meson.build          |    4 +
 src/backend/tcop/meson.build                  |    8 +
 src/backend/tsearch/meson.build               |   21 +
 src/backend/utils/activity/meson.build        |    5 +
 src/backend/utils/adt/meson.build             |  118 +
 src/backend/utils/cache/meson.build           |   16 +
 src/backend/utils/error/meson.build           |    4 +
 src/backend/utils/fmgr/meson.build            |    8 +
 src/backend/utils/hash/meson.build            |    4 +
 src/backend/utils/init/meson.build            |    4 +
 .../utils/mb/conversion_procs/meson.build     |   38 +
 src/backend/utils/mb/meson.build              |    9 +
 src/backend/utils/meson.build                 |   13 +
 src/backend/utils/misc/meson.build            |   28 +
 src/backend/utils/mmgr/meson.build            |   10 +
 src/backend/utils/resowner/meson.build        |    3 +
 src/backend/utils/sort/meson.build            |    7 +
 src/backend/utils/time/meson.build            |    4 +
 src/bin/initdb/meson.build                    |   24 +
 src/bin/meson.build                           |   20 +
 src/bin/pg_amcheck/meson.build                |   22 +
 src/bin/pg_archivecleanup/meson.build         |   14 +
 src/bin/pg_basebackup/meson.build             |   44 +
 src/bin/pg_checksums/meson.build              |   16 +
 src/bin/pg_config/meson.build                 |   14 +
 src/bin/pg_controldata/meson.build            |   14 +
 src/bin/pg_ctl/meson.build                    |   17 +
 src/bin/pg_dump/meson.build                   |   69 +
 src/bin/pg_resetwal/meson.build               |   15 +
 src/bin/pg_rewind/meson.build                 |   34 +
 src/bin/pg_test_fsync/meson.build             |   14 +
 src/bin/pg_test_timing/meson.build            |   14 +
 src/bin/pg_upgrade/meson.build                |   26 +
 src/bin/pg_verifybackup/meson.build           |   25 +
 src/bin/pg_waldump/meson.build                |   23 +
 src/bin/pgbench/meson.build                   |   38 +
 src/bin/pgevent/meson.build                   |   32 +
 src/bin/psql/meson.build                      |   65 +
 src/bin/scripts/meson.build                   |   46 +
 src/common/meson.build                        |  155 ++
 src/common/unicode/meson.build                |   99 +
 src/fe_utils/meson.build                      |   27 +
 src/include/catalog/meson.build               |  129 +
 src/include/meson.build                       |   50 +
 src/include/parser/meson.build                |   10 +
 src/include/pch/c_pch.h                       |    1 +
 src/include/pch/postgres_pch.h                |    1 +
 src/include/pg_config_ext.h.meson             |    7 +
 src/include/storage/meson.build               |   16 +
 src/include/utils/meson.build                 |   22 +
 src/interfaces/libpq/meson.build              |   99 +
 src/meson.build                               |   10 +
 src/pl/meson.build                            |    4 +
 src/pl/plperl/meson.build                     |   81 +
 src/pl/plpgsql/meson.build                    |    1 +
 src/pl/plpgsql/src/meson.build                |   67 +
 src/pl/plpython/meson.build                   |   78 +
 src/port/meson.build                          |  191 ++
 src/port/win32ver.rc.in                       |   41 +
 src/test/authentication/meson.build           |    9 +
 src/test/isolation/meson.build                |   49 +
 src/test/kerberos/meson.build                 |   12 +
 src/test/ldap/meson.build                     |    9 +
 src/test/meson.build                          |   19 +
 src/test/modules/brin/meson.build             |   19 +
 src/test/modules/commit_ts/meson.build        |   20 +
 src/test/modules/delay_execution/meson.build  |   15 +
 src/test/modules/dummy_index_am/meson.build   |   20 +
 src/test/modules/dummy_seclabel/meson.build   |   20 +
 src/test/modules/libpq_pipeline/meson.build   |   21 +
 src/test/modules/meson.build                  |   25 +
 src/test/modules/plsample/meson.build         |   20 +
 src/test/modules/snapshot_too_old/meson.build |   11 +
 src/test/modules/spgist_name_ops/meson.build  |   20 +
 .../ssl_passphrase_callback/meson.build       |   45 +
 src/test/modules/test_bloomfilter/meson.build |   20 +
 src/test/modules/test_ddl_deparse/meson.build |   40 +
 src/test/modules/test_extensions/meson.build  |   38 +
 .../modules/test_ginpostinglist/meson.build   |   20 +
 src/test/modules/test_integerset/meson.build  |   20 +
 src/test/modules/test_misc/meson.build        |    8 +
 src/test/modules/test_parser/meson.build      |   20 +
 src/test/modules/test_pg_dump/meson.build     |   24 +
 src/test/modules/test_predtest/meson.build    |   20 +
 src/test/modules/test_rbtree/meson.build      |   20 +
 src/test/modules/test_regex/meson.build       |   21 +
 src/test/modules/test_rls_hooks/meson.build   |   19 +
 src/test/modules/test_shm_mq/meson.build      |   24 +
 src/test/modules/unsafe_tests/meson.build     |    9 +
 src/test/modules/worker_spi/meson.build       |   23 +
 src/test/recovery/meson.build                 |   33 +
 src/test/regress/meson.build                  |   57 +
 src/test/ssl/meson.build                      |   10 +
 src/test/subscription/meson.build             |   34 +
 src/timezone/meson.build                      |   50 +
 src/timezone/tznames/meson.build              |   20 +
 src/tools/find_meson                          |   20 +
 src/tools/irlink                              |   28 +
 src/tools/msvc/export2def.pl                  |   22 +
 src/tools/msvc/gendef2.pl                     |  177 ++
 .../relativize_shared_library_references      |   84 +
 src/tools/relpath.py                          |    6 +
 src/tools/testwrap                            |   22 +
 221 files changed, 8521 insertions(+)
 create mode 100644 contrib/adminpack/meson.build
 create mode 100644 contrib/amcheck/meson.build
 create mode 100644 contrib/auth_delay/meson.build
 create mode 100644 contrib/auto_explain/meson.build
 create mode 100644 contrib/bloom/meson.build
 create mode 100644 contrib/bool_plperl/meson.build
 create mode 100644 contrib/btree_gin/meson.build
 create mode 100644 contrib/btree_gist/meson.build
 create mode 100644 contrib/citext/meson.build
 create mode 100644 contrib/cube/meson.build
 create mode 100644 contrib/dblink/meson.build
 create mode 100644 contrib/dict_int/meson.build
 create mode 100644 contrib/dict_xsyn/meson.build
 create mode 100644 contrib/earthdistance/meson.build
 create mode 100644 contrib/file_fdw/meson.build
 create mode 100644 contrib/fuzzystrmatch/meson.build
 create mode 100644 contrib/hstore/meson.build
 create mode 100644 contrib/hstore_plperl/meson.build
 create mode 100644 contrib/hstore_plpython/meson.build
 create mode 100644 contrib/intagg/meson.build
 create mode 100644 contrib/intarray/meson.build
 create mode 100644 contrib/isn/meson.build
 create mode 100644 contrib/jsonb_plperl/meson.build
 create mode 100644 contrib/jsonb_plpython/meson.build
 create mode 100644 contrib/lo/meson.build
 create mode 100644 contrib/ltree/meson.build
 create mode 100644 contrib/ltree_plpython/meson.build
 create mode 100644 contrib/meson.build
 create mode 100644 contrib/oid2name/meson.build
 create mode 100644 contrib/old_snapshot/meson.build
 create mode 100644 contrib/pageinspect/meson.build
 create mode 100644 contrib/passwordcheck/meson.build
 create mode 100644 contrib/pg_buffercache/meson.build
 create mode 100644 contrib/pg_freespacemap/meson.build
 create mode 100644 contrib/pg_prewarm/meson.build
 create mode 100644 contrib/pg_stat_statements/meson.build
 create mode 100644 contrib/pg_surgery/meson.build
 create mode 100644 contrib/pg_trgm/meson.build
 create mode 100644 contrib/pg_visibility/meson.build
 create mode 100644 contrib/pgcrypto/meson.build
 create mode 100644 contrib/pgrowlocks/meson.build
 create mode 100644 contrib/pgstattuple/meson.build
 create mode 100644 contrib/postgres_fdw/meson.build
 create mode 100644 contrib/seg/meson.build
 create mode 100644 contrib/sepgsql/meson.build
 create mode 100644 contrib/spi/meson.build
 create mode 100644 contrib/sslinfo/meson.build
 create mode 100644 contrib/tablefunc/meson.build
 create mode 100644 contrib/tcn/meson.build
 create mode 100644 contrib/test_decoding/meson.build
 create mode 100644 contrib/tsm_system_rows/meson.build
 create mode 100644 contrib/tsm_system_time/meson.build
 create mode 100644 contrib/unaccent/meson.build
 create mode 100644 contrib/uuid-ossp/meson.build
 create mode 100644 contrib/vacuumlo/meson.build
 create mode 100644 contrib/xml2/meson.build
 create mode 100644 conversion_helpers.txt
 create mode 100644 doc/src/sgml/meson.build
 create mode 100644 doc/src/sgml/resolv.xsl
 create mode 100644 doc/src/sgml/version.sgml.in
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 src/backend/access/brin/meson.build
 create mode 100644 src/backend/access/common/meson.build
 create mode 100644 src/backend/access/gin/meson.build
 create mode 100644 src/backend/access/gist/meson.build
 create mode 100644 src/backend/access/hash/meson.build
 create mode 100644 src/backend/access/heap/meson.build
 create mode 100644 src/backend/access/index/meson.build
 create mode 100644 src/backend/access/meson.build
 create mode 100644 src/backend/access/nbtree/meson.build
 create mode 100644 src/backend/access/rmgrdesc/meson.build
 create mode 100644 src/backend/access/spgist/meson.build
 create mode 100644 src/backend/access/table/meson.build
 create mode 100644 src/backend/access/tablesample/meson.build
 create mode 100644 src/backend/access/transam/meson.build
 create mode 100644 src/backend/bootstrap/meson.build
 create mode 100644 src/backend/catalog/meson.build
 create mode 100644 src/backend/commands/meson.build
 create mode 100644 src/backend/executor/meson.build
 create mode 100644 src/backend/foreign/meson.build
 create mode 100644 src/backend/jit/llvm/meson.build
 create mode 100644 src/backend/jit/meson.build
 create mode 100644 src/backend/lib/meson.build
 create mode 100644 src/backend/libpq/meson.build
 create mode 100644 src/backend/main/meson.build
 create mode 100644 src/backend/meson.build
 create mode 100644 src/backend/nodes/meson.build
 create mode 100644 src/backend/optimizer/geqo/meson.build
 create mode 100644 src/backend/optimizer/meson.build
 create mode 100644 src/backend/optimizer/path/meson.build
 create mode 100644 src/backend/optimizer/plan/meson.build
 create mode 100644 src/backend/optimizer/prep/meson.build
 create mode 100644 src/backend/optimizer/util/meson.build
 create mode 100644 src/backend/parser/meson.build
 create mode 100644 src/backend/partitioning/meson.build
 create mode 100644 src/backend/port/meson.build
 create mode 100644 src/backend/port/win32/meson.build
 create mode 100644 src/backend/postmaster/meson.build
 create mode 100644 src/backend/regex/meson.build
 create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
 create mode 100644 src/backend/replication/logical/meson.build
 create mode 100644 src/backend/replication/meson.build
 create mode 100644 src/backend/replication/pgoutput/meson.build
 create mode 100644 src/backend/rewrite/meson.build
 create mode 100644 src/backend/snowball/meson.build
 create mode 100644 src/backend/statistics/meson.build
 create mode 100644 src/backend/storage/buffer/meson.build
 create mode 100644 src/backend/storage/file/meson.build
 create mode 100644 src/backend/storage/freespace/meson.build
 create mode 100644 src/backend/storage/ipc/meson.build
 create mode 100644 src/backend/storage/large_object/meson.build
 create mode 100644 src/backend/storage/lmgr/meson.build
 create mode 100644 src/backend/storage/meson.build
 create mode 100644 src/backend/storage/page/meson.build
 create mode 100644 src/backend/storage/smgr/meson.build
 create mode 100644 src/backend/storage/sync/meson.build
 create mode 100644 src/backend/tcop/meson.build
 create mode 100644 src/backend/tsearch/meson.build
 create mode 100644 src/backend/utils/activity/meson.build
 create mode 100644 src/backend/utils/adt/meson.build
 create mode 100644 src/backend/utils/cache/meson.build
 create mode 100644 src/backend/utils/error/meson.build
 create mode 100644 src/backend/utils/fmgr/meson.build
 create mode 100644 src/backend/utils/hash/meson.build
 create mode 100644 src/backend/utils/init/meson.build
 create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
 create mode 100644 src/backend/utils/mb/meson.build
 create mode 100644 src/backend/utils/meson.build
 create mode 100644 src/backend/utils/misc/meson.build
 create mode 100644 src/backend/utils/mmgr/meson.build
 create mode 100644 src/backend/utils/resowner/meson.build
 create mode 100644 src/backend/utils/sort/meson.build
 create mode 100644 src/backend/utils/time/meson.build
 create mode 100644 src/bin/initdb/meson.build
 create mode 100644 src/bin/meson.build
 create mode 100644 src/bin/pg_amcheck/meson.build
 create mode 100644 src/bin/pg_archivecleanup/meson.build
 create mode 100644 src/bin/pg_basebackup/meson.build
 create mode 100644 src/bin/pg_checksums/meson.build
 create mode 100644 src/bin/pg_config/meson.build
 create mode 100644 src/bin/pg_controldata/meson.build
 create mode 100644 src/bin/pg_ctl/meson.build
 create mode 100644 src/bin/pg_dump/meson.build
 create mode 100644 src/bin/pg_resetwal/meson.build
 create mode 100644 src/bin/pg_rewind/meson.build
 create mode 100644 src/bin/pg_test_fsync/meson.build
 create mode 100644 src/bin/pg_test_timing/meson.build
 create mode 100644 src/bin/pg_upgrade/meson.build
 create mode 100644 src/bin/pg_verifybackup/meson.build
 create mode 100644 src/bin/pg_waldump/meson.build
 create mode 100644 src/bin/pgbench/meson.build
 create mode 100644 src/bin/pgevent/meson.build
 create mode 100644 src/bin/psql/meson.build
 create mode 100644 src/bin/scripts/meson.build
 create mode 100644 src/common/meson.build
 create mode 100644 src/common/unicode/meson.build
 create mode 100644 src/fe_utils/meson.build
 create mode 100644 src/include/catalog/meson.build
 create mode 100644 src/include/meson.build
 create mode 100644 src/include/parser/meson.build
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/postgres_pch.h
 create mode 100644 src/include/pg_config_ext.h.meson
 create mode 100644 src/include/storage/meson.build
 create mode 100644 src/include/utils/meson.build
 create mode 100644 src/interfaces/libpq/meson.build
 create mode 100644 src/meson.build
 create mode 100644 src/pl/meson.build
 create mode 100644 src/pl/plperl/meson.build
 create mode 100644 src/pl/plpgsql/meson.build
 create mode 100644 src/pl/plpgsql/src/meson.build
 create mode 100644 src/pl/plpython/meson.build
 create mode 100644 src/port/meson.build
 create mode 100644 src/port/win32ver.rc.in
 create mode 100644 src/test/authentication/meson.build
 create mode 100644 src/test/isolation/meson.build
 create mode 100644 src/test/kerberos/meson.build
 create mode 100644 src/test/ldap/meson.build
 create mode 100644 src/test/meson.build
 create mode 100644 src/test/modules/brin/meson.build
 create mode 100644 src/test/modules/commit_ts/meson.build
 create mode 100644 src/test/modules/delay_execution/meson.build
 create mode 100644 src/test/modules/dummy_index_am/meson.build
 create mode 100644 src/test/modules/dummy_seclabel/meson.build
 create mode 100644 src/test/modules/libpq_pipeline/meson.build
 create mode 100644 src/test/modules/meson.build
 create mode 100644 src/test/modules/plsample/meson.build
 create mode 100644 src/test/modules/snapshot_too_old/meson.build
 create mode 100644 src/test/modules/spgist_name_ops/meson.build
 create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
 create mode 100644 src/test/modules/test_bloomfilter/meson.build
 create mode 100644 src/test/modules/test_ddl_deparse/meson.build
 create mode 100644 src/test/modules/test_extensions/meson.build
 create mode 100644 src/test/modules/test_ginpostinglist/meson.build
 create mode 100644 src/test/modules/test_integerset/meson.build
 create mode 100644 src/test/modules/test_misc/meson.build
 create mode 100644 src/test/modules/test_parser/meson.build
 create mode 100644 src/test/modules/test_pg_dump/meson.build
 create mode 100644 src/test/modules/test_predtest/meson.build
 create mode 100644 src/test/modules/test_rbtree/meson.build
 create mode 100644 src/test/modules/test_regex/meson.build
 create mode 100644 src/test/modules/test_rls_hooks/meson.build
 create mode 100644 src/test/modules/test_shm_mq/meson.build
 create mode 100644 src/test/modules/unsafe_tests/meson.build
 create mode 100644 src/test/modules/worker_spi/meson.build
 create mode 100644 src/test/recovery/meson.build
 create mode 100644 src/test/regress/meson.build
 create mode 100644 src/test/ssl/meson.build
 create mode 100644 src/test/subscription/meson.build
 create mode 100644 src/timezone/meson.build
 create mode 100644 src/timezone/tznames/meson.build
 create mode 100755 src/tools/find_meson
 create mode 100644 src/tools/irlink
 create mode 100644 src/tools/msvc/export2def.pl
 create mode 100644 src/tools/msvc/gendef2.pl
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py
 create mode 100755 src/tools/testwrap

diff --git a/configure b/configure
index fd15801b34c..c91295fcab5 100755
--- a/configure
+++ b/configure
@@ -21045,3 +21045,9 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/configure.ac b/configure.ac
index 973f83db52c..95c1f7ac6c9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2494,3 +2494,9 @@ AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
                   [echo >src/interfaces/ecpg/include/stamp-h])
 
 AC_OUTPUT
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..457a6089445
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,20 @@
+autoinc = shared_module('adminpack',
+  ['adminpack.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'adminpack.control',
+  'adminpack--1.0.sql',
+  'adminpack--1.0--1.1.sql',
+  'adminpack--1.1--2.0.sql',
+  'adminpack--2.0--2.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'adminpack',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': ['adminpack'],
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..e656d35f41f
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,37 @@
+amcheck = shared_module('amcheck', [
+    'verify_heapam.c',
+    'verify_nbtree.c',
+  ],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'amcheck.control',
+  'amcheck--1.0.sql',
+  'amcheck--1.0--1.1.sql',
+  'amcheck--1.1--1.2.sql',
+  'amcheck--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'check',
+    'check_btree',
+    'check_heap'
+  ],
+}
+
+tap_tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_verify_heapam.pl',
+    't/002_cic.pl',
+    't/003_cic_2pc.pl',
+  ],
+}
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..941bb6f39a4
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,4 @@
+autoinc = shared_module('auth_delay',
+  ['auth_delay.c'],
+  kwargs: contrib_mod_args,
+)
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..321896efa2c
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,13 @@
+auto_explain = shared_module('auto_explain',
+  files('auto_explain.c'),
+  kwargs: contrib_mod_args,
+)
+
+tap_tests += {
+  'name': 'auto_explain',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_auto_explain.pl',
+  ]
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..5c5d33c7f7a
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,38 @@
+bloom_sources = files(
+  'blcost.c',
+  'blinsert.c',
+  'blscan.c',
+  'blutils.c',
+  'blvacuum.c',
+  'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+  bloom_sources,
+  c_pch: '../../src/include/pch/c_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'bloom.control',
+  'bloom--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'bloom'
+  ],
+}
+
+tap_tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_wal.pl',
+  ],
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..e15dc5285eb
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,37 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+bool_plperl_sources = files(
+  'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+  bool_plperl_sources,
+  include_directories: [plperl_inc, include_directories('.')],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'bool_plperl.control',
+  'bool_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'bool_plperlu.control',
+  'bool_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'bool_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'bool_plperl',
+    'bool_plperlu',
+  ],
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..d25ece7500e
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,51 @@
+btree_gin = shared_module('btree_gin',
+  files('btree_gin.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gin.control',
+  'btree_gin--1.0.sql',
+  'btree_gin--1.0--1.1.sql',
+  'btree_gin--1.1--1.2.sql',
+  'btree_gin--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'btree_gin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'install_btree_gin',
+    'int2',
+    'int4',
+    'int8',
+    'float4',
+    'float8',
+    'money',
+    'oid',
+    'timestamp',
+    'timestamptz',
+    'time',
+    'timetz',
+    'date',
+    'interval',
+    'macaddr',
+    'macaddr8',
+    'inet',
+    'cidr',
+    'text',
+    'varchar',
+    'char',
+    'bytea',
+    'bit',
+    'varbit',
+    'numeric',
+    'enum',
+    'uuid',
+    'name',
+    'bool',
+    'bpchar',
+  ],
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..8ee0faea401
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,79 @@
+btree_gist_sources = files(
+  'btree_bit.c',
+  'btree_bytea.c',
+  'btree_cash.c',
+  'btree_date.c',
+  'btree_enum.c',
+  'btree_float4.c',
+  'btree_float8.c',
+  'btree_gist.c',
+  'btree_inet.c',
+  'btree_int2.c',
+  'btree_int4.c',
+  'btree_int8.c',
+  'btree_interval.c',
+  'btree_macaddr.c',
+  'btree_macaddr8.c',
+  'btree_numeric.c',
+  'btree_oid.c',
+  'btree_text.c',
+  'btree_time.c',
+  'btree_ts.c',
+  'btree_utils_num.c',
+  'btree_utils_var.c',
+  'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+  btree_gist_sources,
+  c_pch: '../../src/include/pch/c_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gist.control',
+  'btree_gist--1.0--1.1.sql',
+  'btree_gist--1.1--1.2.sql',
+  'btree_gist--1.2.sql',
+  'btree_gist--1.2--1.3.sql',
+  'btree_gist--1.3--1.4.sql',
+  'btree_gist--1.4--1.5.sql',
+  'btree_gist--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'btree_gist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'init',
+    'int2',
+    'int4',
+    'int8',
+    'float4',
+    'float8',
+    'cash',
+    'oid',
+    'timestamp',
+    'timestamptz',
+    'time',
+    'timetz',
+    'date',
+    'interval',
+    'macaddr',
+    'macaddr8',
+    'inet',
+    'cidr',
+    'text',
+    'varchar',
+    'char',
+    'bytea',
+    'bit',
+    'varbit',
+    'numeric',
+    'uuid',
+    'not_equal',
+    'enum',
+  ],
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..f2e9ff2117d
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,29 @@
+citext_sources = files(
+  'citext.c',
+)
+
+citext = shared_module('citext',
+  citext_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'citext.control',
+  'citext--1.0--1.1.sql',
+  'citext--1.1--1.2.sql',
+  'citext--1.2--1.3.sql',
+  'citext--1.3--1.4.sql',
+  'citext--1.4.sql',
+  'citext--1.4--1.5.sql',
+  'citext--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'citext',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'citext'
+  ],
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..3cf7ebdd8ea
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,42 @@
+cube_sources = files(
+  'cube.c',
+)
+
+# cubescan is compiled as part of cubeparse
+cubescan = custom_target('cubescan',
+  input: ['cubescan.l'],
+  output: ['cubescan.c'],
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
+
+cube_sources += custom_target('cubeparse',
+  input: 'cubeparse.y',
+  output: 'cubeparse.c',
+  depends: cubescan,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+cube = shared_module('cube',
+  cube_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'cube.control',
+  'cube--1.0--1.1.sql',
+  'cube--1.1--1.2.sql',
+  'cube--1.2.sql',
+  'cube--1.2--1.3.sql',
+  'cube--1.3--1.4.sql',
+  'cube--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'cube',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'cube',
+    'cube_sci',
+  ],
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..7ac253700c9
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,29 @@
+dblink_sources = files(
+  'dblink.c',
+)
+
+dblink = shared_module('dblink',
+  dblink_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'dblink.control',
+  'dblink--1.0--1.1.sql',
+  'dblink--1.1--1.2.sql',
+  'dblink--1.2.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dblink',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'paths',
+    'dblink'
+  ],
+  'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..7c23b275c5a
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,19 @@
+dict_int = shared_module('dict_int',
+  files('dict_int.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_int.control',
+  'dict_int--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dict_int',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'dict_int'
+  ],
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..7cbabba02f1
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,26 @@
+dict_xsyn = shared_module('dict_xsyn',
+  files('dict_xsyn.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_xsyn.control',
+  'dict_xsyn--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'xsyn_sample.rules',
+  kwargs: contrib_data_args + {
+    'install_dir': get_option('datadir') / 'tsearch_data'
+  }
+)
+
+regress_tests += {
+  'name': 'dict_xsyn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'dict_xsyn'
+  ],
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..d56abf4f260
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,20 @@
+earthdistance = shared_module('earthdistance',
+  files('earthdistance.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'earthdistance.control',
+  'earthdistance--1.0--1.1.sql',
+  'earthdistance--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'earthdistance',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'earthdistance'
+  ],
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..0cd3348dfd0
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,19 @@
+file_fdw = shared_module('file_fdw',
+  files('file_fdw.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'file_fdw.control',
+  'file_fdw--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'file_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'file_fdw'
+  ],
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..d1e75479668
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,23 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+  files(
+    'fuzzystrmatch.c',
+    'dmetaphone.c'
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'fuzzystrmatch.control',
+  'fuzzystrmatch--1.0--1.1.sql',
+  'fuzzystrmatch--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'fuzzystrmatch',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'fuzzystrmatch'
+  ],
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..661e61f9692
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,36 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+  files(
+    'hstore_compat.c',
+    'hstore_gin.c',
+    'hstore_gist.c',
+    'hstore_io.c',
+    'hstore_op.c',
+    'hstore_subs.c',
+  ),
+  c_pch: '../../src/include/pch/c_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'hstore.control',
+  'hstore--1.1--1.2.sql',
+  'hstore--1.3--1.4.sql',
+  'hstore--1.4.sql',
+  'hstore--1.4--1.5.sql',
+  'hstore--1.5--1.6.sql',
+  'hstore--1.6--1.7.sql',
+  'hstore--1.7--1.8.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'hstore',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'hstore'
+  ],
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..48231cb1c9e
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,38 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+hstore_plperl_sources = files(
+  'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+  hstore_plperl_sources,
+  include_directories: [plperl_inc, hstore_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plperl.control',
+  'hstore_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'hstore_plperlu.control',
+  'hstore_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'hstore_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'hstore_plperl',
+    'hstore_plperlu',
+    'create_transform',
+  ],
+}
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..98114e46f5e
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,34 @@
+if not python3.found()
+  subdir_done()
+endif
+
+hstore_plpython_sources = files(
+  'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+  hstore_plpython_sources,
+  include_directories: [plpython_inc, hstore_inc, ],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plpython3u--1.0.sql',
+  'hstore_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = [
+  'hstore_plpython'
+]
+
+regress_tests += {
+  'name': 'hstore_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': hstore_plpython_regress,
+  'regress_args': ['--load-extension=hstore'],
+}
diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build
new file mode 100644
index 00000000000..a0f39366f47
--- /dev/null
+++ b/contrib/intagg/meson.build
@@ -0,0 +1,6 @@
+install_data(
+  'intagg.control',
+  'intagg--1.0--1.1.sql',
+  'intagg--1.1.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
new file mode 100644
index 00000000000..d4fe99ca275
--- /dev/null
+++ b/contrib/intarray/meson.build
@@ -0,0 +1,34 @@
+intarray_sources = files(
+  '_int_bool.c',
+  '_int_gin.c',
+  '_int_gist.c',
+  '_int_op.c',
+  '_int_selfuncs.c',
+  '_int_tool.c',
+  '_intbig_gist.c',
+)
+
+intarray = shared_module('_int',
+  intarray_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'intarray.control',
+  'intarray--1.0--1.1.sql',
+  'intarray--1.1--1.2.sql',
+  'intarray--1.2.sql',
+  'intarray--1.2--1.3.sql',
+  'intarray--1.3--1.4.sql',
+  'intarray--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'intarray',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    '_int'
+  ],
+}
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
new file mode 100644
index 00000000000..ca919800b9f
--- /dev/null
+++ b/contrib/isn/meson.build
@@ -0,0 +1,25 @@
+isn_sources = files(
+  'isn.c',
+)
+
+isn = shared_module('isn',
+  isn_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'isn.control',
+  'isn--1.0--1.1.sql',
+  'isn--1.1--1.2.sql',
+  'isn--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'isn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'isn'
+  ],
+}
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..c34090e5f5c
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,37 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+  'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+  jsonb_plperl_sources,
+  include_directories: [plperl_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plperl.control',
+  'jsonb_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'jsonb_plperlu.control',
+  'jsonb_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'jsonb_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'jsonb_plperl',
+    'jsonb_plperlu',
+  ],
+}
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..aa372d52e26
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,33 @@
+if not python3.found()
+  subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+  'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+  jsonb_plpython_sources,
+  include_directories: [plpython_inc],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plpython3u.control',
+  'jsonb_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = [
+  'jsonb_plpython'
+]
+
+regress_tests += {
+  'name': 'jsonb_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': jsonb_plpython_regress,
+}
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
new file mode 100644
index 00000000000..ca9bbc42015
--- /dev/null
+++ b/contrib/lo/meson.build
@@ -0,0 +1,24 @@
+lo_sources = files(
+  'lo.c',
+)
+
+lo = shared_module('lo',
+  lo_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'lo.control',
+  'lo--1.0--1.1.sql',
+  'lo--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'lo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'lo'
+  ],
+}
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
new file mode 100644
index 00000000000..12909945350
--- /dev/null
+++ b/contrib/ltree/meson.build
@@ -0,0 +1,36 @@
+ltree_sources = files(
+  '_ltree_gist.c',
+  '_ltree_op.c',
+  'crc32.c',
+  'lquery_op.c',
+  'ltree_gist.c',
+  'ltree_io.c',
+  'ltree_op.c',
+  'ltxtquery_io.c',
+  'ltxtquery_op.c',
+)
+
+# .. so that includes of ltree/ltree.h work
+ltree_inc = include_directories('.', '../')
+
+ltree = shared_module('ltree',
+  ltree_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'ltree.control',
+  'ltree--1.0--1.1.sql',
+  'ltree--1.1--1.2.sql',
+  'ltree--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'ltree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'ltree'
+  ],
+}
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
new file mode 100644
index 00000000000..df30c84c6a9
--- /dev/null
+++ b/contrib/ltree_plpython/meson.build
@@ -0,0 +1,34 @@
+if not python3.found()
+  subdir_done()
+endif
+
+ltree_plpython_sources = files(
+  'ltree_plpython.c',
+)
+
+ltree_plpython = shared_module('ltree_plpython3',
+  ltree_plpython_sources,
+  include_directories: [plpython_inc, ltree_inc],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'ltree_plpython3u--1.0.sql',
+  'ltree_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+ltree_plpython_regress = [
+  'ltree_plpython'
+]
+
+regress_tests += {
+  'name': 'ltree_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': ltree_plpython_regress,
+  'regress_args': ['--load-extension=ltree'],
+}
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..720181023c8
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,63 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = get_option('datadir') / 'extension'
+contrib_data_args = {
+  'install_dir': contrib_data_dir
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('bloom')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+subdir('intagg')
+subdir('intarray')
+subdir('isn')
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+subdir('lo')
+subdir('ltree')
+subdir('ltree_plpython')
+subdir('oid2name')
+subdir('old_snapshot')
+subdir('pageinspect')
+subdir('passwordcheck')
+subdir('pg_buffercache')
+subdir('pgcrypto')
+subdir('pg_freespacemap')
+subdir('pg_prewarm')
+subdir('pgrowlocks')
+subdir('pg_stat_statements')
+subdir('pgstattuple')
+subdir('pg_surgery')
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('postgres_fdw')
+subdir('seg')
+subdir('sepgsql')
+subdir('spi')
+subdir('sslinfo')
+# start-scripts doesn't contain build products
+subdir('tablefunc')
+subdir('tcn')
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+subdir('uuid-ossp')
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..bee34d2137c
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,14 @@
+executable('oid2name',
+  ['oid2name.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'oid2name',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_basic.pl',
+  ]
+}
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
new file mode 100644
index 00000000000..5785c29e9f8
--- /dev/null
+++ b/contrib/old_snapshot/meson.build
@@ -0,0 +1,14 @@
+old_snapshot_sources = files(
+  'time_mapping.c',
+)
+
+old_snapshot = shared_module('old_snapshot',
+  old_snapshot_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'old_snapshot.control',
+  'old_snapshot--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..4bd5b1784e0
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,45 @@
+pageinspect = shared_module('pageinspect',
+  files(
+    'brinfuncs.c',
+    'btreefuncs.c',
+    'fsmfuncs.c',
+    'ginfuncs.c',
+    'gistfuncs.c',
+    'hashfuncs.c',
+    'heapfuncs.c',
+    'rawpage.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pageinspect--1.0--1.1.sql',
+  'pageinspect--1.1--1.2.sql',
+  'pageinspect--1.2--1.3.sql',
+  'pageinspect--1.3--1.4.sql',
+  'pageinspect--1.4--1.5.sql',
+  'pageinspect--1.5--1.6.sql',
+  'pageinspect--1.5.sql',
+  'pageinspect--1.6--1.7.sql',
+  'pageinspect--1.7--1.8.sql',
+  'pageinspect--1.8--1.9.sql',
+  'pageinspect--1.9--1.10.sql',
+  'pageinspect.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'pageinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'page',
+    'btree',
+    'brin',
+    'gin',
+    'gist',
+    'hash',
+    'checksum',
+    'oldextversions',
+  ],
+}
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
new file mode 100644
index 00000000000..ae5db94d0e1
--- /dev/null
+++ b/contrib/passwordcheck/meson.build
@@ -0,0 +1,27 @@
+passwordcheck_sources = files(
+  'passwordcheck.c',
+)
+
+passwordcheck_c_args = []
+passwordcheck_deps = []
+
+# uncomment the following two lines to enable cracklib support
+# passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
+# passwordcheck_deps += [cc.find_library('crack')]
+
+passwordcheck = shared_module('passwordcheck',
+  passwordcheck_sources,
+  kwargs: contrib_mod_args + {
+    'c_args': contrib_mod_args.get('c_args') + passwordcheck_c_args,
+    'dependencies': contrib_mod_args.get('dependencies') + passwordcheck_deps,
+  }
+)
+
+regress_tests += {
+  'name': 'passwordcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'passwordcheck'
+  ],
+}
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
new file mode 100644
index 00000000000..f4f540218b6
--- /dev/null
+++ b/contrib/pg_buffercache/meson.build
@@ -0,0 +1,16 @@
+pg_buffercache = shared_module('pg_buffercache',
+  files(
+    'pg_buffercache_pages.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_buffercache--1.0--1.1.sql',
+  'pg_buffercache--1.1--1.2.sql',
+  'pg_buffercache--1.2--1.3.sql',
+  'pg_buffercache--1.2.sql',
+  'pg_buffercache.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
new file mode 100644
index 00000000000..feb1e225f48
--- /dev/null
+++ b/contrib/pg_freespacemap/meson.build
@@ -0,0 +1,15 @@
+pg_freespacemap = shared_module('pg_freespacemap',
+  files(
+    'pg_freespacemap.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_freespacemap--1.0--1.1.sql',
+  'pg_freespacemap--1.1--1.2.sql',
+  'pg_freespacemap--1.1.sql',
+  'pg_freespacemap.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..c93ccc2db6d
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,16 @@
+pg_prewarm = shared_module('pg_prewarm',
+  files(
+    'autoprewarm.c',
+    'pg_prewarm.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_prewarm--1.0--1.1.sql',
+  'pg_prewarm--1.1--1.2.sql',
+  'pg_prewarm--1.1.sql',
+  'pg_prewarm.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..6ed70ac0f18
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,31 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+  files('pg_stat_statements.c'),
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_stat_statements.control',
+  'pg_stat_statements--1.4.sql',
+  'pg_stat_statements--1.8--1.9.sql',
+  'pg_stat_statements--1.7--1.8.sql',
+  'pg_stat_statements--1.6--1.7.sql',
+  'pg_stat_statements--1.5--1.6.sql',
+  'pg_stat_statements--1.4--1.5.sql',
+  'pg_stat_statements--1.3--1.4.sql',
+  'pg_stat_statements--1.2--1.3.sql',
+  'pg_stat_statements--1.1--1.2.sql',
+  'pg_stat_statements--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'pg_stat_statements',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'pg_stat_statements'
+  ],
+  'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+}
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
new file mode 100644
index 00000000000..58de871b041
--- /dev/null
+++ b/contrib/pg_surgery/meson.build
@@ -0,0 +1,23 @@
+pg_surgery = shared_module('pg_surgery',
+  files(
+    'heap_surgery.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_surgery--1.0.sql',
+  'pg_surgery.control',
+  kwargs: contrib_data_args,
+)
+
+
+regress_tests += {
+  'name': 'pg_surgery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'heap_surgery'
+  ],
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..0a56926ad6b
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,33 @@
+pg_trgm = shared_module('pg_trgm',
+  files(
+    'trgm_gin.c',
+    'trgm_gist.c',
+    'trgm_op.c',
+    'trgm_regexp.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_trgm--1.0--1.1.sql',
+  'pg_trgm--1.1--1.2.sql',
+  'pg_trgm--1.2--1.3.sql',
+  'pg_trgm--1.3--1.4.sql',
+  'pg_trgm--1.3.sql',
+  'pg_trgm--1.4--1.5.sql',
+  'pg_trgm--1.5--1.6.sql',
+  'pg_trgm.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'pg_trgm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'pg_trgm',
+    'pg_word_trgm',
+    'pg_strict_word_trgm',
+  ],
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..5fd0e8cd986
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,25 @@
+pg_visibility = shared_module('pg_visibility',
+  files(
+    'pg_visibility.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_visibility--1.0--1.1.sql',
+  'pg_visibility--1.1--1.2.sql',
+  'pg_visibility--1.1.sql',
+  'pg_visibility.control',
+  kwargs: contrib_data_args,
+)
+
+
+regress_tests += {
+  'name': 'pg_visibility',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'pg_visibility'
+  ],
+}
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
new file mode 100644
index 00000000000..f20076b84a0
--- /dev/null
+++ b/contrib/pgcrypto/meson.build
@@ -0,0 +1,117 @@
+pgcrypto_sources = files(
+  'crypt-blowfish.c',
+  'crypt-des.c',
+  'crypt-gensalt.c',
+  'crypt-md5.c',
+  'mbuf.c',
+  'pgcrypto.c',
+  'pgp-armor.c',
+  'pgp-cfb.c',
+  'pgp-compress.c',
+  'pgp-decrypt.c',
+  'pgp-encrypt.c',
+  'pgp-info.c',
+  'pgp-mpi.c',
+  'pgp-pgsql.c',
+  'pgp-pubdec.c',
+  'pgp-pubenc.c',
+  'pgp-pubkey.c',
+  'pgp-s2k.c',
+  'pgp.c',
+  'px-crypt.c',
+  'px-hmac.c',
+  'px.c',
+)
+
+pgcrypto_regress = [
+  'init',
+  'md5',
+  'sha1',
+  'hmac-md5',
+  'hmac-sha1',
+  'blowfish',
+  'rijndael',
+  'crypt-des',
+  'crypt-md5',
+  'crypt-blowfish',
+  'crypt-xdes',
+  'pgp-armor',
+  'pgp-decrypt',
+  'pgp-encrypt',
+  'pgp-pubkey-decrypt',
+  'pgp-pubkey-encrypt',
+  'pgp-info',
+]
+
+
+pgcrypto_internal_sources = files(
+  'internal.c',
+  'internal-sha2.c',
+  'blf.c',
+  'rijndael.c',
+  'pgp-mpi-internal.c',
+  'imath.c',
+)
+
+pgcrypto_internal_regress = [
+  'sha2',
+]
+
+
+pgcrypto_openssl_sources = files(
+  'openssl.c',
+  'pgp-mpi-openssl.c',
+)
+pgcrypto_openssl_regress = [
+  'sha2',
+  'des',
+  '3des',
+  'cast5',
+]
+
+# TODO: implement rijndael.c generation
+
+pgcrypto_deps = []
+if ssl.found()
+  pgcrypto_deps += ssl
+  pgcrypto_sources += pgcrypto_openssl_sources
+  pgcrypto_regress += pgcrypto_openssl_regress
+else
+  pgcrypto_sources += pgcrypto_internal_sources
+  pgcrypto_regress += pgcrypto_internal_regress
+endif
+
+if zlib.found()
+  pgcrypto_deps += zlib
+  pgcrypto_regress += 'pgp-compression'
+else
+  pgcrypto_regress += 'pgp-zlib-DISABLED'
+endif
+
+pgcrypto = shared_module('pgcrypto',
+  pgcrypto_sources,
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args + {
+    'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
+  },
+)
+
+install_data(
+  'pgcrypto--1.0--1.1.sql',
+  'pgcrypto--1.1--1.2.sql',
+  'pgcrypto--1.2--1.3.sql',
+  'pgcrypto--1.3.sql',
+  'pgcrypto.control',
+  kwargs: contrib_data_args,
+)
+
+
+regress_tests += {
+  'name': 'pgcrypto',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    pgcrypto_regress
+  ],
+}
+
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
new file mode 100644
index 00000000000..26c68248fce
--- /dev/null
+++ b/contrib/pgrowlocks/meson.build
@@ -0,0 +1,15 @@
+pgrowlocks = shared_module('pgrowlocks',
+  files(
+    'pgrowlocks.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgrowlocks--1.0--1.1.sql',
+  'pgrowlocks--1.1--1.2.sql',
+  'pgrowlocks--1.2.sql',
+  'pgrowlocks.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
new file mode 100644
index 00000000000..4ed41b3743c
--- /dev/null
+++ b/contrib/pgstattuple/meson.build
@@ -0,0 +1,30 @@
+pgstattuple = shared_module('pgstattuple',
+  files(
+    'pgstatapprox.c',
+    'pgstatindex.c',
+    'pgstattuple.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgstattuple--1.0--1.1.sql',
+  'pgstattuple--1.1--1.2.sql',
+  'pgstattuple--1.2--1.3.sql',
+  'pgstattuple--1.3--1.4.sql',
+  'pgstattuple--1.4--1.5.sql',
+  'pgstattuple--1.4.sql',
+  'pgstattuple.control',
+  kwargs: contrib_data_args,
+)
+
+
+regress_tests += {
+  'name': 'pgstattuple',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'pgstattuple'
+  ],
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..507d01448b1
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,31 @@
+postgres_fdw_sources = files(
+  'connection.c',
+  'deparse.c',
+  'option.c',
+  'postgres_fdw.c',
+  'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'postgres_fdw.control',
+  'postgres_fdw--1.0.sql',
+  'postgres_fdw--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'postgres_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'postgres_fdw'
+  ],
+  'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+}
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
new file mode 100644
index 00000000000..a66a4b4c218
--- /dev/null
+++ b/contrib/seg/meson.build
@@ -0,0 +1,40 @@
+seg_sources = files(
+  'seg.c',
+)
+
+# segscan is compiled as part of segparse
+segscan = custom_target('segscan',
+  input: ['segscan.l'],
+  output: ['segscan.c'],
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
+
+seg_sources += custom_target('segparse',
+  input: 'segparse.y',
+  output: 'segparse.c',
+  depends: segscan,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+seg = shared_module('seg',
+  seg_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'seg.control',
+  'seg--1.0--1.1.sql',
+  'seg--1.1--1.2.sql',
+  'seg--1.1.sql',
+  'seg--1.2--1.3.sql',
+  'seg--1.3--1.4.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'seg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'seg',
+  ],
+}
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
new file mode 100644
index 00000000000..852c6740569
--- /dev/null
+++ b/contrib/sepgsql/meson.build
@@ -0,0 +1,34 @@
+if not selinux.found()
+  subdir_done()
+endif
+
+sepgsql_sources = files(
+  'database.c',
+  'dml.c',
+  'hooks.c',
+  'label.c',
+  'proc.c',
+  'relation.c',
+  'schema.c',
+  'selinux.c',
+  'uavc.c',
+)
+
+sepgsql = shared_module('sepgsql',
+  sepgsql_sources,
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args + {
+    'dependencies': [selinux, pg_mod_args['dependencies']],
+  }
+)
+
+custom_target('sepgsql.sql',
+  input: 'sepgsql.sql.in',
+  output: 'sepgsql.sql',
+  command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'],
+  capture: true,
+  install: true,
+  install_dir: contrib_data_args['install_dir'],
+)
+
+# TODO: implement sepgsql tests
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..51bc96ea657
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,43 @@
+autoinc = shared_module('autoinc',
+  ['autoinc.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+  ['insert_username.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('insert_username.control', 'insert_username--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+
+moddatetime = shared_module('moddatetime',
+  ['moddatetime.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('moddatetime.control', 'moddatetime--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+  ['refint.c'],
+  kwargs: contrib_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+  },
+)
+
+install_data('refint.control', 'refint--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
new file mode 100644
index 00000000000..27ee59d62d5
--- /dev/null
+++ b/contrib/sslinfo/meson.build
@@ -0,0 +1,21 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+sslinfo = shared_module('sslinfo',
+  files(
+    'sslinfo.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  }
+)
+
+install_data(
+  'sslinfo--1.0--1.1.sql',
+  'sslinfo--1.1--1.2.sql',
+  'sslinfo--1.2.sql',
+  'sslinfo.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
new file mode 100644
index 00000000000..955b1ae6795
--- /dev/null
+++ b/contrib/tablefunc/meson.build
@@ -0,0 +1,23 @@
+tablefunc = shared_module('tablefunc',
+  files(
+    'tablefunc.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tablefunc--1.0.sql',
+  'tablefunc.control',
+  kwargs: contrib_data_args,
+)
+
+
+regress_tests += {
+  'name': 'tablefunc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'tablefunc'
+  ],
+}
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
new file mode 100644
index 00000000000..b3a663f64bc
--- /dev/null
+++ b/contrib/tcn/meson.build
@@ -0,0 +1,13 @@
+tcn = shared_module('tcn',
+  files(
+    'tcn.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tcn--1.0.sql',
+  'tcn.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..d26b43cbe79
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,69 @@
+test_decoding_sources = files(
+  'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+  test_decoding_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+regress_tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'ddl',
+    'xact',
+    'rewrite',
+    'toast',
+    'permissions',
+    'decoding_in_xact',
+    'decoding_into_rel',
+    'binary',
+    'prepared',
+    'replorigin',
+    'time',
+    'messages',
+    'spill',
+    'slot',
+    'truncate',
+    'stream',
+    'stats',
+    'twophase',
+    'twophase_stream',
+  ],
+  'regress_args': [
+    '--temp-config', files('logical.conf')
+  ]
+}
+
+isolation_tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'mxact',
+    'delayed_startup',
+    'ondisk_startup',
+    'concurrent_ddl_dml',
+    'oldest_xmin',
+    'snapshot_transfer',
+    'subxact_without_top',
+    'concurrent_stream',
+    'twophase_snapshot',
+  ],
+  'regress_args': [
+    '--temp-config', files('logical.conf')
+  ]
+}
+
+
+tap_tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_repl_stats.pl',
+  ],
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..2c8f4487f8d
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,22 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+  files(
+    'tsm_system_rows.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_rows--1.0.sql',
+  'tsm_system_rows.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'tsm_system_rows',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'tsm_system_rows',
+  ],
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..df9c4aa4b51
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,22 @@
+tsm_system_time = shared_module('tsm_system_time',
+  files(
+    'tsm_system_time.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_time--1.0.sql',
+  'tsm_system_time.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'tsm_system_time',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'tsm_system_time',
+  ],
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..e77bf790d8c
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,30 @@
+unaccent = shared_module('unaccent',
+  files(
+    'unaccent.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'unaccent--1.0--1.1.sql',
+  'unaccent--1.1.sql',
+  'unaccent.control',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'unaccent.rules',
+   install_dir: get_option('datadir') / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+regress_tests += {
+  'name': 'unaccent',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'unaccent',
+  ],
+  'regress_args': ['--encoding=UTF8'],
+}
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
new file mode 100644
index 00000000000..dad1ec228bd
--- /dev/null
+++ b/contrib/uuid-ossp/meson.build
@@ -0,0 +1,31 @@
+if not uuid.found()
+  subdir_done()
+endif
+
+uuid_ossp = shared_module('uuid-ossp',
+  files(
+    'uuid-ossp.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args + {
+    'dependencies': [uuid, pg_mod_args['dependencies']],
+  },
+
+)
+
+install_data(
+  'uuid-ossp--1.0--1.1.sql',
+  'uuid-ossp--1.1.sql',
+  'uuid-ossp.control',
+  kwargs: contrib_data_args,
+)
+
+
+regress_tests += {
+  'name': 'uuid-ossp',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'uuid_ossp'
+  ],
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..99e76daacf9
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,14 @@
+executable('vacuumlo',
+  ['vacuumlo.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'vacuumlo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_basic.pl',
+  ]
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..6f8a26e4f0a
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,30 @@
+if not libxml.found()
+  subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+  files(
+    'xpath.c',
+    'xslt_proc.c',
+  ),
+  c_pch: '../../src/include/pch/postgres_pch.h',
+  kwargs: contrib_mod_args + {
+    'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'xml2--1.0--1.1.sql',
+  'xml2--1.1.sql',
+  'xml2.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'xml2',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'xml2',
+  ],
+}
diff --git a/conversion_helpers.txt b/conversion_helpers.txt
new file mode 100644
index 00000000000..e5879b4fe77
--- /dev/null
+++ b/conversion_helpers.txt
@@ -0,0 +1,6 @@
+convert list of files to quoted-one-per-line:
+
+	?\b\(\(?:\w\|\d\|_\|-\)+\)\.o ?\(?:\\
+\)? →   '\1.c',
+
+
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
new file mode 100644
index 00000000000..4576e20a189
--- /dev/null
+++ b/doc/src/sgml/meson.build
@@ -0,0 +1,241 @@
+alldocs = []
+doc_generated = []
+
+xmllint = find_program('xmllint', native: true, required: false)
+pandoc = find_program('pandoc', native: true, required: false)
+xsltproc = find_program('xsltproc', native: true, required: false)
+fop = find_program('fop', native: true, required: false)
+
+
+configure_file(
+  input: 'version.sgml.in',
+  output: 'version.sgml',
+  configuration: cdata,
+)
+
+doc_generated += custom_target('features-supported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt'),
+  output: 'features-supported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'YES', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+doc_generated += custom_target('features-unsupported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt'),
+  output: 'features-unsupported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'NO', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+doc_generated += custom_target('errcodes-table.sgml',
+  input: files(
+    '../../../src/backend/utils/errcodes.txt'),
+  output: 'errcodes-table.sgml',
+  command: [perl, files('generate-errcodes-table.pl'), '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+# FIXME: this actually has further inputs, adding depfile support to
+# generate-keywords-table.pl is probably the best way to address that
+# robustly.
+doc_generated += custom_target('keywords-table.sgml',
+  input: files(
+    '../../../src/include/parser/kwlist.h'),
+  output: 'keywords-table.sgml',
+  command: [perl, files('generate-keywords-table.pl'), '@CURRENT_SOURCE_DIR@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+# For everything else we need at least xmllint
+if not xmllint.found()
+  subdir_done()
+endif
+
+# Compute validity just once
+postgres_sgml_valid = custom_target('postgres.sgml.valid',
+  input: 'postgres.sgml',
+  output: 'postgres.sgml.valid',
+  command: [xmllint, '--noout', '--valid', '--path', '@OUTDIR@'],
+  build_by_default: true,
+  capture: true,
+)
+alldocs += postgres_sgml_valid
+
+
+#
+# Full documentation as html, text
+#
+if xsltproc.found()
+  xsltproc_flags = [
+    '--stringparam', 'pg.version', pg_version,
+    '--param', 'website.stylesheet', '1'
+  ]
+
+
+  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
+  # depfile
+  html = custom_target('html',
+    input: ['stylesheet.xsl', 'postgres.sgml'],
+    output: 'html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html
+
+
+  html_help = custom_target('html_help',
+    input: ['stylesheet-hh.xsl', 'postgres.sgml'],
+    output: 'htmlhelp',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html_help
+
+
+  # single-page HTML
+  postgres_html = custom_target('postgres.html',
+    input: ['stylesheet-html-nochunk.xsl', 'postgres.sgml'],
+    output: 'postgres.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_html
+
+  # single-page text
+  if pandoc.found()
+    postgres_txt = custom_target('postgres.txt',
+      input: [postgres_html],
+      output: 'postgres.txt',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+endif
+
+
+#
+# INSTALL in html, text
+#
+if xsltproc.found()
+  install_xml = custom_target('INSTALL.xml',
+    input: ['standalone-profile.xsl', 'standalone-install.xml'],
+    output: 'INSTALL.xml',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+    build_by_default: false,
+  )
+  install_html = custom_target('INSTALL.html',
+    input: ['stylesheet-text.xsl', install_xml],
+    output: 'INSTALL.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += install_html
+
+  if pandoc.found()
+    # XXX: Makefile does an iconv translit here, but unclear why?
+    install = custom_target('INSTALL',
+      input: [install_html],
+      output: 'INSTALL',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+
+endif
+
+
+#
+# Man pages
+#
+if xsltproc.found()
+  # FIXME: implement / consider sqlmansectnum logic
+  man = custom_target('man',
+    input: ['stylesheet-man.xsl', 'postgres.sgml'],
+    output: ['man1', 'man3', 'man7'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+endif
+
+
+#
+# Full documentation as PDF
+#
+if fop.found() and xsltproc.found()
+  xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
+
+  foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
+    postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+    postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
+
+    postgres_x_fo = custom_target(postgres_x_fo_f,
+      input: ['stylesheet-fo.xsl', 'postgres.sgml'],
+      output: [postgres_x_fo_f],
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
+                '--stringparam', 'paper.type', detail,
+                '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+
+    postgres_x_pdf = custom_target(postgres_x_pdf_f,
+      input: [postgres_x_fo],
+      output: [postgres_x_pdf_f],
+      command: [fop, '-fo', '@INPUT@', '-pdf', '@OUTPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_x_pdf
+  endforeach
+endif
+
+
+#
+# epub
+#
+
+# This was previously implemented using dbtoepub - but that doesn't seem to
+# support running in build != source directory (i.e. VPATH builds already
+# weren't supported).
+if pandoc.found() and xsltproc.found()
+  # XXX: Wasn't able to make pandoc successfully resolve entities
+  # XXX: Perhaps we should just make all targets use this, to avoid repeatedly
+  # building whole thing? It's comparatively fast though.
+  postgres_full_xml = custom_target('postgres-full.xml',
+    input: ['resolv.xsl', 'postgres.sgml'],
+    output: ['postgres-full.xml'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_flags,
+              '-o', '@OUTPUT@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+  postgres_epub = custom_target('postgres.epub',
+    input: [postgres_full_xml],
+    output: 'postgres.epub',
+    command: [pandoc, '-f', 'docbook', '-t', 'epub', '-o', '@OUTPUT@', '--resource-path=@CURRENT_SOURCE_DIR@',
+              '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_epub
+endif
+
+
+alias_target('alldocs', alldocs)
diff --git a/doc/src/sgml/resolv.xsl b/doc/src/sgml/resolv.xsl
new file mode 100644
index 00000000000..c69ba714dab
--- /dev/null
+++ b/doc/src/sgml/resolv.xsl
@@ -0,0 +1,7 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/doc/src/sgml/version.sgml.in b/doc/src/sgml/version.sgml.in
new file mode 100644
index 00000000000..fa5ff343f40
--- /dev/null
+++ b/doc/src/sgml/version.sgml.in
@@ -0,0 +1,2 @@
+<!ENTITY version @PG_VERSION@>
+<!ENTITY majorversion @PG_MAJORVERSION@>
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..4cf621f375b
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,2130 @@
+project('postgresql',
+  ['c'],
+  version: '15devel',
+  license: 'PostgreSQL',
+  meson_version: '>=0.54',
+  default_options: [
+    'warning_level=2',
+    'b_pie=true',
+    'b_pch=false',
+    'buildtype=release',
+  ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+fs = import('fs')
+windows = import('windows')
+
+thread_dep = dependency('threads')
+
+cpu_family = host_machine.cpu_family()
+
+
+# It's very easy to get into confusing states when the source directory
+# contains an in-place build. E.g. the wrong pg_config.h will be used. So just
+# refuse to build in that case.
+if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h')
+  error('''
+****
+Non-clean source code directory detected.
+
+To build with meson the source tree may not have an in-place, ./configure
+style, build configured. Use a separate check out for meson based builds, or
+run make distclean in the source tree.
+
+You can have both meson and ./configure style builds for the same source tree
+by building out-of-source / VPATH with configure as well.
+****
+''')
+endif
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+  pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+  pg_version_arr = pg_version.split('beta')
+elif pg_version.contains('rc')
+  pg_version_arr = pg_version.split('rc')
+else
+  pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+
+cc = meson.get_compiler('c')
+
+cdata = configuration_data()
+
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', 'https://www.postgresql.org/')
+
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+  pg_version, target_machine.cpu_family(), cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set_quoted('PG_MINORVERSION', pg_version_minor.to_string())
+cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
+cdata.set('PG_VERSION_NUM', (pg_version_major*10000)+pg_version_minor)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Search paths
+#
+# NB: Arguments added globally (via the below, or CFLAGS etc) are not taken
+# into account for configuration-time checks (so they are more
+# isolated). Flags that have to be taken into account for configure checks
+# have to be explicitly specified in configure tests.
+###############################################################
+
+g_inc = []
+g_c_args = []
+g_l_args = []
+
+if host_machine.system() == 'darwin'
+  # XXX, should this be required?
+  xcrun = find_program('xcrun', native: true, required: true)
+
+  sysroot = run_command(xcrun, '--show-sdk-path', check: true).stdout().strip()
+  message('sysroot is >@0@<'.format(sysroot))
+
+  g_c_args += ['-isysroot', sysroot]
+  g_l_args += ['-isysroot', sysroot]
+endif
+
+if host_machine.system() == 'linux' or host_machine.system() == 'cygwin'
+  g_c_args += '-D_GNU_SOURCE'
+endif
+
+g_c_inc = []
+
+g_c_inc += include_directories(get_option('extra_include_dirs'))
+g_c_lib = get_option('extra_lib_dirs')
+
+add_project_arguments(g_c_args, language: ['c', 'cpp'])
+add_project_link_arguments(g_l_args, language: ['c', 'cpp'])
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true)
+flex = find_program(get_option('FLEX'), native: true)
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'))
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+touch = find_program('touch', native: true)
+
+# Internal programs
+find_meson = find_program('src/tools/find_meson', native: true)
+testwrap = find_program('src/tools/testwrap', native: true)
+relpath = find_program('src/tools/relpath.py', native: true)
+
+bisonflags = []
+if bison.found()
+  bison_version_c = run_command(bison, '--version', check: true)
+  # bison version string helpfully is something like
+  # >>bison (GNU bison) 3.8.1<<
+  bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+  if bison_version.version_compare('>=3.0')
+    bisonflags += ['-Wno-deprecated']
+  endif
+endif
+
+
+wget = find_program('wget', required: false, native: true)
+wget_flags = ['-O', '@OUTPUT0@', '--no-use-server-timestamps']
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# FIXME: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(find_meson, check: true)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+  error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+    meson_binpath_r.returncode(),
+    meson_binpath_r.stdout(),
+    meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+  error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+  if i == 0
+    meson_binpath = e
+  else
+    meson_args += e
+  endif
+  i += 1
+endforeach
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert'))
+
+cdata.set('BLCKSZ', 8192, description: '''
+ Size of a disk block --- this also limits the size of a tuple.  You
+ can set it bigger if you need bigger tuples (although TOAST should
+ reduce the need to have large tuples, since fields can be spread
+ across multiple tuples).
+
+ BLCKSZ must be a power of 2.  The maximum possible value of BLCKSZ
+ is currently 2^15 (32768).  This is determined by the 15-bit widths
+ of the lp_off and lp_len fields in ItemIdData (see
+ include/storage/itemid.h).
+
+ Changing BLCKSZ requires an initdb.
+''')
+
+cdata.set('XLOG_BLCKSZ', 8192)
+cdata.set('RELSEG_SIZE', 131072)
+cdata.set('DEF_PGPORT', 5432)
+cdata.set_quoted('DEF_PGPORT_STR', '5432')
+cdata.set_quoted('PG_KRB_SRVNAM', 'postgres')
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+if not gssapiopt.disabled()
+  gssapi = dependency('krb5-gssapi', required: gssapiopt)
+
+  if gssapi.found() and \
+    cc.check_header('gssapi/gssapi.h', args: g_c_args, dependencies: gssapi, required: gssapiopt)
+
+    if not cc.has_function('gss_init_sec_context', args: g_c_args, dependencies: gssapi)
+      error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+    endif
+    cdata.set('ENABLE_GSS', 1)
+  endif
+
+else
+  gssapi = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if not ldapopt.disabled()
+
+  if host_machine.system() == 'windows'
+    ldap = cc.find_library('wldap32')
+    ldap_r = ldap
+  else
+    ldap = dependency('ldap', required: false)
+
+    # Before 2.5 openldap didn't have a pkg-config file..
+    if ldap.found()
+      ldap_r = ldap
+    else
+      ldap = cc.find_library('ldap', required: ldapopt)
+      ldap_r = cc.find_library('ldap_r', required: ldapopt)
+
+      # Use ldap_r for FE if available, else assume ldap is thread-safe.
+      # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+      if ldap.found() and not ldap_r.found()
+        ldap_r = ldap
+      endif
+    endif
+
+    if ldap.found() and cc.has_function('ldap_initialize', args: g_c_args, dependencies: [ldap, thread_dep])
+      cdata.set('HAVE_LDAP_INITIALIZE', 1)
+    endif
+  endif
+
+  if ldap.found()
+    cdata.set('USE_LDAP', 1)
+  endif
+
+else
+  ldap = dependency('', required : false)
+  ldap_r = ldap
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+  add_languages('cpp', required : true, native: false)
+  llvm = dependency('llvm', version : '>=3.9', method: 'config-tool', required: llvmopt)
+
+  if llvm.found()
+
+    cdata.set('USE_LLVM', 1)
+
+    cpp = meson.get_compiler('cpp')
+
+    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+    ccache = find_program('ccache', required: false)
+    clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+
+    # FIXME: the includes hardcoded here suck
+    llvm_irgen_args = [
+      '-c', '-o', '@OUTPUT@', '@INPUT@',
+      '-flto=thin', '-emit-llvm',
+      '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+      '-I', '@SOURCE_ROOT@/src/include',
+      '-I', '@BUILD_ROOT@/src/include',
+      '-I', '@BUILD_ROOT@/src/backend/utils/misc',
+      '-I', '@CURRENT_SOURCE_DIR@',
+      '-O2',
+      '-Wno-ignored-attributes',
+      '-Wno-empty-body',
+    ]
+
+    if ccache.found()
+      llvm_irgen_command = ccache
+      llvm_irgen_args = [clang.path()] + llvm_irgen_args
+    else
+      llvm_irgen_command = clang
+    endif
+
+    llvm_irgen_kw = {
+      'command': [llvm_irgen_command] + llvm_irgen_args,
+      'depfile': '@BASENAME@.c.bc.d',
+    }
+
+    irlink = find_program('src/tools/irlink', native: true)
+
+    llvm_irlink_kw = {
+      'command':[
+        irlink,
+        '@SOURCE_ROOT@',
+        '@BUILD_ROOT@',
+        llvm_lto,
+        '-o', '@OUTPUT0@',
+        '@PRIVATE_DIR@',
+        '@INPUT@',
+      ],
+      'install': true,
+      'install_dir': get_option('libdir'),
+    }
+
+  endif
+else
+  llvm = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+if not get_option('icu').disabled()
+  icu = dependency('icu-uc', required: get_option('icu').enabled())
+  icu_i18n = dependency('icu-i18n', required: get_option('icu').enabled())
+
+  if icu.found()
+    cdata.set('USE_ICU', 1)
+  endif
+
+else
+  icu = dependency('', required : false)
+  icu_i18n = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+  libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+  if libxml.found()
+    cdata.set('USE_LIBXML', 1)
+  endif
+else
+  libxml = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+  libxslt = dependency('libxslt', required: libxsltopt)
+
+  if libxslt.found()
+    cdata.set('USE_LIBXSLT', 1)
+  endif
+else
+  libxslt = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+  lz4 = dependency('liblz4', required: lz4opt)
+
+  if lz4.found()
+    cdata.set('USE_LZ4', 1)
+    cdata.set('HAVE_LIBLZ4', 1)
+  endif
+
+else
+  lz4 = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('perl')
+perl_dep = dependency('', required: false)
+
+if perlopt.disabled()
+  perl_may_work = false
+else
+  perl_may_work = true
+
+  # First verify that perl has the necessary dependencies installed
+  perl_mods = run_command(
+    [perl,
+     '-MConfig', '-MOpcode', '-MExtUtils::Embed', '-MExtUtils::ParseXS',
+     '-e', ''],
+    check: false)
+  if perl_mods.returncode() != 0
+    perl_may_work = false
+    perl_msg = 'perl installation does not have the required modules'
+  endif
+
+  # Then inquire perl about its configuration
+  if perl_may_work
+    # FIXME: include copy-edited comments from perl.m4
+    perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+    perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+    archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+    privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+    useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+    libperl = run_command(perl_conf_cmd, 'libperl', check: true).stdout()
+
+    perl_inc_dir = '@0@/CORE'.format(archlibexp)
+
+    perl_ccflags = []
+
+    if useshrplib != 'true'
+      perl_may_work = false
+      perl_msg = 'need a shared perl'
+    endif
+  endif
+
+  # XXX: should we only add directories that exist? Seems a bit annoying with
+  # macos' sysroot stuff...
+  #
+  # NB: For unknown reasons msys' python doesn't see these paths, despite gcc
+  # et al seeing them. So we can't use include_directories(), as that checks
+  # file existence.
+  if perl_may_work
+    perl_ccflags += ['-I@0@'.format(perl_inc_dir)]
+    if host_machine.system() == 'darwin'
+      perl_ccflags += ['-iwithsysroot', perl_inc_dir]
+    endif
+  endif
+
+  # check required headers are present
+  if perl_may_work and not \
+    cc.has_header('perl.h', args: g_c_args + perl_ccflags, required: false)
+    perl_may_work = false
+    perl_msg = 'missing perl.h'
+  endif
+
+  # Find perl library. This is made more complicated by the fact that the name
+  # Config.pm returns isn't directly usable (sometimes lib needs to be chopped
+  # off)
+  if perl_may_work
+    foreach p : ['perl', 'libperl', libperl, libperl.strip('lib'), fs.stem(libperl), fs.stem(libperl).strip('lib')]
+      perl_dep_int = cc.find_library(p,
+        dirs: ['@0@/CORE'.format(archlibexp)],
+        required: false)
+      if perl_dep_int.found()
+        break
+      endif
+    endforeach
+
+    if not perl_dep_int.found()
+      perl_may_work = false
+      perl_msg = 'missing libperl'
+    endif
+  endif
+
+  if perl_may_work
+    perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+    message('CCFLAGS recommended by Perl: @0@'.format(perl_ccflags_r))
+
+    foreach flag : perl_ccflags_r.split(' ')
+      if flag.startswith('-D') and \
+        (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+        perl_ccflags += flag
+      endif
+    endforeach
+
+    if host_machine.system() == 'windows'
+      perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+    endif
+
+    message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+    # perl.m4 sayeth:
+    #
+    # We are after Embed's ldopts, but without the subset mentioned in
+    # Config's ccdlflags;
+    #
+    # FIXME: andres sayeth: But why?
+
+    ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+    ccdlflags = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().strip()
+
+    ccdlflags_dict = {}
+
+    foreach ccdlflag : ccdlflags.split(' ')
+      ccdlflags_dict += {ccdlflag: 1}
+    endforeach
+
+    perl_ldopts = []
+    foreach ldopt : ldopts.split(' ')
+      if ldopt == ''
+        continue
+      elif ccdlflags_dict.has_key(ldopt)
+        continue
+      # strawberry perl unhelpfully has that in ldopts
+      elif ldopt == '-s'
+        continue
+      endif
+
+      perl_ldopts += ldopt.strip('"')
+    endforeach
+
+    # FIXME: check if windows handling is necessary
+
+    message('LDFLAGS for embedding perl: "@0@" (ccdlflags: "@1@", ldopts: "@2@")'.format(
+      ' '.join(perl_ldopts), ccdlflags, ldopts))
+
+    if perl_dep_int.found()
+      perl_dep = declare_dependency(
+        compile_args: perl_ccflags,
+        link_args: perl_ldopts,
+        version: perlversion,
+      )
+    endif
+  endif # perl_may_work
+
+  if not perl_may_work
+    if perlopt.enabled()
+      error('dependency perl failed: @0@'.format(perl_msg))
+    else
+      message('disabling optional dependency perl: @0@'.format(perl_msg))
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('python')
+if not pyopt.disabled()
+  pm = import('python')
+  python3_inst = pm.find_installation(required: pyopt.enabled())
+  python3 = python3_inst.dependency(embed: true, required: pyopt.enabled())
+else
+  python3 = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: Readline
+#
+# FIXME: editline support
+###############################################################
+
+if not get_option('readline').disabled()
+  readline = dependency('readline', required: false)
+  if not readline.found()
+    readline = cc.find_library('readline',
+      required: get_option('readline').enabled())
+  endif
+
+  if readline.found()
+    cdata.set('HAVE_LIBREADLINE', 1)
+
+    if cc.has_header('readline/history.h', args: g_c_args, dependencies: [readline], required: false)
+      history_h = 'readline/history.h'
+      cdata.set('HAVE_READLINE_HISTORY_H', 1)
+      cdata.set('HAVE_READLINE_H', false)
+    elif cc.has_header('history.h', args: g_c_args, dependencies: [readline], required: false)
+      history_h = 'history.h'
+      cdata.set('HAVE_READLINE_HISTORY_H', false)
+      cdata.set('HAVE_HISTORY_H', 1)
+    else
+      error('''readline header not found
+If you have readline already installed, see see meson-log/meson-log.txt for details on the
+failure.  It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.''')
+    endif
+
+    if cc.has_header('readline/readline.h', args: g_c_args, dependencies: [readline], required: false)
+      readline_h = 'readline/readline.h'
+      cdata.set('HAVE_READLINE_READLINE_H', 1)
+    elif cc.has_header('readline.h', args: g_c_args, dependencies: [readline], required: false)
+      readline_h = 'readline.h'
+      cdata.set('HAVE_READLINE_H', 1)
+    else
+      error('''readline header not found
+If you have readline already installed, see see meson-log/meson-log.txt for details on the
+failure.  It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.''')
+    endif
+
+    check_funcs = [
+      'rl_completion_matches',
+      'rl_filename_completion_function',
+      'rl_reset_screen_size',
+      'append_history',
+      'history_truncate_file',
+    ]
+
+    foreach func : check_funcs
+      cdata.set('HAVE_'+func.to_upper(),
+        cc.has_function(func, args: g_c_args, dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    check_vars = [
+      'rl_completion_append_character',
+      'rl_completion_suppress_quote',
+      'rl_filename_quote_characters',
+      'rl_filename_quoting_function',
+    ]
+
+    foreach var : check_vars
+      cdata.set('HAVE_'+var.to_upper(),
+        cc.has_header_symbol(readline_h, var, args: g_c_args, dependencies: [readline]) ? 1 : false)
+    endforeach
+  endif
+else
+  readline = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: selinux
+###############################################################
+
+selinux = dependency('', required : false)
+selinuxopt = get_option('selinux')
+if not selinuxopt.disabled()
+  selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
+endif
+cdata.set('HAVE_LIBSELINUX',
+  selinux.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: systemd
+###############################################################
+
+systemd = dependency('', required : false)
+systemdopt = get_option('systemd')
+if meson.version().version_compare('>=0.59')
+  systemdopt = systemdopt.disable_auto_if(host_machine.system() != 'linux')
+endif
+if not systemdopt.disabled()
+  systemd = dependency('libsystemd', required: systemdopt)
+endif
+cdata.set('USE_SYSTEMD',
+  systemd.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+  # Try to find openssl via pkg-config et al, if that doesn't work, look for
+  # the library names that we know about.
+
+  # via pkg-config et al
+  ssl = dependency('openssl', required: false)
+
+  # via library + headers
+  if not ssl.found()
+    ssl_lib = cc.find_library('ssl',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc,
+      has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+    crypto_lib = cc.find_library('crypto',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc)
+    ssl_int = [ssl_lib, crypto_lib]
+
+    ssl = declare_dependency(dependencies: ssl_int,
+                             include_directories: g_c_inc)
+  else
+    cc.has_header('openssl/ssl.h', args: g_c_args, dependencies: ssl, required: true)
+    cc.has_header('openssl/err.h', args: g_c_args, dependencies: ssl, required: true)
+
+    ssl_int = [ssl]
+  endif
+
+  cdata.set_quoted('WITH_SSL', get_option('ssl'))
+
+  check_funcs = [
+    ['CRYPTO_new_ex_data', {'required': true}],
+    ['SSL_new', {'required': true}],
+
+    # Function introduced in OpenSSL 1.0.2.
+    ['X509_get_signature_nid'],
+
+    # Functions introduced in OpenSSL 1.1.0. We used to check for
+    # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+    # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+    # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+    # functions.
+    ['OPENSSL_init_ssl'],
+    ['BIO_get_data'],
+    ['BIO_meth_new'],
+    ['ASN1_STRING_get0_data'],
+    ['HMAC_CTX_new'],
+    ['HMAC_CTX_free'],
+
+    # OpenSSL versions before 1.1.0 required setting callback functions, for
+    # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+    # function was removed.
+    ['CRYPTO_lock'],
+  ]
+
+  foreach c : check_funcs
+    func = c.get(0)
+    val = cc.has_function(func, args: g_c_args, dependencies: ssl_int)
+    if not val and c.get(1, {}).get('required', false)
+      error('openssl function @0@ is required'.format(func))
+    endif
+    cdata.set('HAVE_'+func.to_upper(), val ? 1 : false)
+  endforeach
+
+  cdata.set('USE_OPENSSL', 1,
+            description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+
+  cdata.set('OPENSSL_API_COMPAT', 0x10001000,
+            description: 'Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.')
+else
+  ssl = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: uuid
+###############################################################
+
+uuidopt = get_option('uuid')
+if uuidopt != 'none'
+  uuidname = uuidopt.to_upper()
+  if uuidopt == 'e2fs'
+    uuid = dependency('uuid', required: true)
+    uuidfunc = 'uuid_generate'
+    uuidheader = 'uuid/uuid.h'
+  elif uuidopt == 'bsd'
+    # libc should have uuid function
+    uuid = declare_dependency()
+    uuidfunc = 'uuid_to_string'
+    uuidheader = 'uuid.h'
+  elif uuidopt == 'ossp'
+    uuid = dependency('ossp-uuid', required: true)
+    uuidfunc = 'uuid_export'
+    uuidheader = 'ossp/uuid.h'
+  else
+    error('huh')
+  endif
+
+  if not cc.has_header_symbol(uuidheader, uuidfunc, dependencies: uuid)
+    error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc))
+  endif
+  cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1)
+
+  cdata.set('HAVE_UUID_@0@'.format(uuidname), 1,
+           description: 'Define to 1 if you have @0@ UUID support.'.format(uuidname))
+else
+  uuid = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = dependency('', required : false)
+if not zlibopt.disabled()
+  zlib_t = dependency('zlib', required: zlibopt)
+
+  if zlib_t.type_name() == 'internal'
+    # if fallback was used, we don't need to test if headers are present (they
+    # aren't built yet, so we can't test)
+    zlib = zlib_t
+  elif not zlib_t.found()
+    warning('did not find zlib')
+  elif not cc.has_header('zlib.h', args: g_c_args, dependencies: [zlib_t], required: zlibopt.enabled())
+    warning('zlib header not found')
+  elif not cc.has_type('z_streamp', args: g_c_args, dependencies: [zlib_t], prefix: '#include <zlib.h>')
+    if zlibopt.enabled()
+      error('zlib version is too old')
+    else
+      warning('zlib version is too old')
+    endif
+  else
+    zlib = zlib_t
+  endif
+
+  if zlib.found()
+    cdata.set('HAVE_LIBZ', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+sizeof_long = cc.sizeof('long', args: g_c_args)
+cdata.set('SIZEOF_LONG', sizeof_long)
+if sizeof_long == 8
+  cdata.set('HAVE_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long int')
+  cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: g_c_args) == 8
+  cdata.set('HAVE_LONG_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long long int')
+  cdata.set_quoted('INT64_MODIFIER', 'll')
+elif
+  error('do not know how to get a 64bit int')
+endif
+
+
+cdata.set('MAXIMUM_ALIGNOF', 8)
+cdata.set('ALIGNOF_SHORT', cc.alignment('short', args: g_c_args))
+cdata.set('ALIGNOF_INT', cc.alignment('int', args: g_c_args))
+cdata.set('ALIGNOF_LONG', cc.alignment('long', args: g_c_args))
+cdata.set('ALIGNOF_DOUBLE', cc.alignment('double', args: g_c_args))
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: g_c_args))
+cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: g_c_args))
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang).  If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+    static inline int foo(void)
+    {
+      void *labeladdrs[] = {&&my_label};
+      goto *labeladdrs[0];
+      my_label:
+      return 1;
+    }''',
+    args: g_c_args)
+  cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# XXX: for now just assume that compiler knows __func__ - it's C99 after all.
+cdata.set('HAVE_FUNCNAME__FUNC', 1)
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+    int main(int arg, char **argv)
+    {
+        ({ _Static_assert(1, "foo"); })
+    }
+    ''',
+    args: g_c_args)
+  cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: g_c_args) \
+  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: g_c_args) \
+  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: g_c_args) == 1
+  cdata.set('HAVE__BOOL', 1)
+  cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = 'extern void pgac_write(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));'
+foreach a : printf_attributes
+  if cc.compiles(testsrc.format(a), args: g_c_args + ['-Werror'], name: 'format ' + a)
+    cdata.set('PG_PRINTF_ATTRIBUTE', a)
+    break
+  endif
+endforeach
+
+if cc.has_function_attribute('visibility:default') and \
+  cc.has_function_attribute('visibility:hidden')
+  cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+endif
+
+
+if cc.has_function('__builtin_unreachable', args: g_c_args)
+  cdata.set('HAVE__BUILTIN_UNREACHABLE', 1)
+endif
+
+if cc.has_function('__builtin_constant_p', args: g_c_args)
+  cdata.set('HAVE__BUILTIN_CONSTANT_P', 1)
+
+  if host_machine.cpu_family() == 'ppc' or host_machine.cpu_family() == 'ppc64'
+    # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+    if cc.compiles('''
+      static inline int
+      addi(int ra, int si)
+      {
+          int res = 0;
+          if (__builtin_constant_p(si))
+              __asm__ __volatile__(
+                  " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+          return res;
+      }
+      int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+      ''',
+      args: g_c_args)
+      cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+    endif
+  endif
+endif
+
+
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+    #include <cpuid.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+    }
+    ''', name: '__get_cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+    #include <intrin.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __cpuid(exx, 1);
+    }
+    ''', name: '__cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__CPUID', 1)
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+  # Disable strict-aliasing rules; needed for gcc 3.3+
+  '-fno-strict-aliasing',
+  # Disable optimizations that assume no overflow; needed for gcc 4.3+
+  '-fwrapv',
+  '-fexcess-precision=standard'
+]
+
+add_project_arguments(cc.get_supported_arguments(common_functional_flags), language: 'c')
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+
+common_warning_flags = [
+  '-Wmissing-prototypes',
+  '-Wpointer-arith',
+  '-Werror=vla',
+  '-Wendif-labels',
+  '-Wmissing-format-attribute',
+  '-Wimplicit-fallthrough=3',
+  '-Wcast-function-type',
+  '-Wformat-security',
+]
+
+add_project_arguments(cc.get_supported_arguments(common_warning_flags), language: 'c')
+
+if llvm.found()
+  add_project_arguments(cpp.get_supported_arguments(common_warning_flags), language: 'cpp')
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+  add_project_arguments('-Wdeclaration-after-statement', language: 'c')
+  using_declaration_after_statement_warning = true
+else
+  using_declaration_after_statement_warning = false
+endif
+
+
+# We want to suppress a few unhelpful warnings - but gcc won't
+# complain about unrecognized -Wno-foo switches, so we have to test
+# for the positive form and if that works, add the negative form
+
+negative_warning_flags = [
+  'unused-command-line-argument',
+  'format-truncation',
+  'stringop-truncation',
+
+  # FIXME: from andres's local config
+  'clobbered',
+  'missing-field-initializers',
+  'sign-compare',
+  'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+  if cc.has_argument('-W'+w)
+    add_project_arguments('-Wno-'+w, language: 'c')
+  endif
+
+  if llvm.found() and cpp.has_argument('-W'+w)
+    add_project_arguments('-Wno-'+w, language: 'cpp')
+  endif
+endforeach
+
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+  add_project_arguments('/wd4018', '/wd4244', '/wd4273', '/wd4102', '/wd4090', '/wd4267',
+    language: 'c')
+  add_project_arguments('/DWIN32', '/DWINDOWS', '/D__WINDOWS__', '/D__WIN32__',
+    '/DWIN32_STACK_RLIMIT=4194304', '/D_CRT_SECURE_NO_DEPRECATE', '/D_CRT_NONSTDC_NO_DEPRECATE',
+        language: 'c')
+endif
+
+
+
+###############################################################
+# Atomics
+###############################################################
+
+# FIXME
+cdata.set('HAVE_SPINLOCKS', 1)
+
+if get_option('atomics')
+  # FIXME
+  cdata.set('HAVE_ATOMICS', 1)
+
+  atomic_checks = [
+    {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+     'desc': '__sync_lock_test_and_set(char)',
+     'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+     'desc': '__sync_lock_test_and_set(int32)',
+     'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+     'desc': '__sync_val_compare_and_swap(int32)',
+     'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+# FIXME: int64 reference
+    {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+     'desc': '__sync_val_compare_and_swap(int64)',
+     'test': '''
+long val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+     'desc': ' __atomic_compare_exchange_n(int32)',
+     'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+# FIXME: int64 reference
+    {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+     'desc': ' __atomic_compare_exchange_n(int64)',
+     'test': '''
+long val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+  ]
+
+  foreach check : atomic_checks
+    test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+    cdata.set(check['name'],
+      cc.links(test, name: check['desc'], args: g_c_args))
+  endforeach
+
+endif
+
+
+
+###############################################################
+# CRC
+###############################################################
+
+have_optimized_crc = false
+cflags_crc = []
+if cpu_family == 'x86' or cpu_family == 'x86_64'
+
+  if cc.get_id() == 'msvc'
+    cdata.set('USE_SSE42_CRC32C', false)
+    cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  else
+
+    prog = '''
+#include <nmmintrin.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = _mm_crc32_u8(crc, 0);
+    crc = _mm_crc32_u32(crc, 0);
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+    if cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 without -msse4.2', args: g_c_args)
+      cdata.set('USE_SSE42_CRC32C', 1)
+      have_optimized_crc = true
+    elif cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 with -msse4.2', args: g_c_args + ['-msse4.2'])
+      cflags_crc += '-msse4.2'
+      cdata.set('USE_SSE42_CRC32C', false)
+      cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+      have_optimized_crc = true
+    endif
+
+  endif
+
+elif cpu_family == 'arm' or cpu_family == 'aarch64'
+
+  prog = '''
+#include <arm_acle.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = __crc32cb(crc, 0);
+    crc = __crc32ch(crc, 0);
+    crc = __crc32cw(crc, 0);
+    crc = __crc32cd(crc, 0);
+
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+  if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc',
+      args: g_c_args)
+    cdata.set('USE_ARMV8_CRC32C', true)
+    have_optimized_crc = true
+  elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc',
+      args: g_c_args + ['-march=armv8-a+crc'])
+    cflags_crc += '-march=armv8-a+crc'
+    cdata.set('USE_ARMV8_CRC32C', false)
+    cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  endif
+endif
+
+if not have_optimized_crc
+  cdata.set('USE_SLICING_BY_8_CRC32C', 1)
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+header_checks = [
+  ['atomic.h'],
+  ['stdbool.h'],
+  ['copyfile.h'],
+  ['execinfo.h'],
+  ['getopt.h'],
+  ['ifaddrs.h'],
+  ['langinfo.h'],
+  ['mbarrier.h'],
+  ['poll.h'],
+  ['sys/epoll.h'],
+  ['sys/event.h'],
+  ['sys/ipc.h'],
+  ['sys/prctl.h'],
+  ['sys/procctl.h'],
+  ['sys/pstat.h'],
+  ['sys/resource.h'],
+  ['sys/select.h'],
+  ['sys/sem.h'],
+  ['sys/shm.h'],
+  ['sys/sockio.h'],
+  ['sys/tas.h'],
+  ['sys/uio.h'],
+  ['sys/un.h'],
+  ['termios.h'],
+  ['ucred.h'],
+  # FIXME: openbsd workaround
+  ['sys/ucred.h'],
+  ['wctype.h'],
+  ['netinet/tcp.h'],
+  ['net/if.h'],
+  ['crtdefs.h'],
+]
+
+foreach c : header_checks
+  varname = 'HAVE_'+c.get(0).underscorify().to_upper()
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  found = cc.has_header(c.get(0), include_directories: g_inc, args: g_c_args)
+  cdata.set(varname, found ? 1 : false,
+            description: 'Define to 1 if you have the <@0@> header file.'.format(c))
+endforeach
+
+
+
+decl_checks = [
+  ['F_FULLFSYNC', 'fcntl.h'],
+  ['RTLD_GLOBAL', 'dlfcn.h'],
+  ['RTLD_NOW', 'dlfcn.h'],
+  ['fdatasync', 'unistd.h'],
+  ['posix_fadvise', 'fcntl.h'],
+  ['sigwait', 'signal.h'],
+  ['strlcat', 'string.h'],
+  ['strlcpy', 'string.h'],
+  ['strnlen', 'string.h'],
+  ['strsignal', 'string.h'],
+  ['strtoll', 'stdlib.h'], ['strtoull', 'stdlib.h'], # strto[u]ll may exist but not be declared
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+  ['preadv', 'sys/uio.h'],
+  ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+  varname = 'HAVE_DECL_'+c.get(0).underscorify().to_upper()
+
+  found = cc.has_header_symbol(c.get(1), c.get(0), args: g_c_args, kwargs: c.get(2, {}))
+  cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@\', and to 0 if you
+  don't.'''.format(c))
+endforeach
+
+
+
+# XXX: this is borked, HAVE_SYS_UCRED_H not defined
+if cc.has_type('struct cmsgcred',
+    include_directories: g_inc,
+    args: g_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '-DHAVE_SYS_UCRED_H' : ''],
+    prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+  cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+  cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_function('getopt', args: g_c_args) and \
+   cc.has_function('getopt_long', args: g_c_args) and \
+   cc.has_type('struct option', args: g_c_args, prefix: '#include <getopt.h>')
+  cdata.set('HAVE_GETOPT', 1)
+  cdata.set('HAVE_GETOPT_LONG', 1)
+  cdata.set('HAVE_STRUCT_OPTION', 1)
+else
+  warning('not yet implemented')
+endif
+
+
+foreach c : ['opterr', 'optreset']
+  varname = 'HAVE_INT_'+c.underscorify().to_upper()
+
+  if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+    extern int @0@;
+    @0@ = 1;
+}
+'''.format(c), name: c, args: g_c_args)
+    cdata.set(varname, 1)
+  else
+    cdata.set(varname, false)
+  endif
+endforeach
+
+
+if cc.has_type('struct sockaddr_storage', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', 'ss_family', args: g_c_args,
+  prefix: '''#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', '__ss_family', args: g_c_args,
+  prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY', 1)
+endif
+
+if cc.has_type('struct sockaddr_un', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/un.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_UN', 1)
+endif
+
+if cc.has_type('struct addrinfo', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+''')
+  cdata.set('HAVE_STRUCT_ADDRINFO', 1)
+endif
+
+if host_machine.system() == 'windows'
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1)
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1)
+endif
+
+if cc.has_type('struct sockaddr_in6', args: g_c_args, prefix: '''
+#include <netinet/in.h>''')
+  cdata.set('HAVE_IPV6', 1)
+endif
+
+
+if cc.has_member('struct tm', 'tm_zone', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+  cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+    return timezone / 60;
+}
+''', name: 'Check if the global variable `timezone\' exists', args: g_c_args,)
+  cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+  cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+# FIXME: sys/ipc.h, sys/sem.h includes were conditional
+if cc.has_type('union semun', args: g_c_args, prefix: '''
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+''')
+  cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+  char buf[100];
+  switch (strerror_r(1, buf, sizeof(buf)))
+  { case 0: break; default: break; }
+}''', args: g_c_args)
+  cdata.set('STRERROR_R_INT', 1)
+else
+  cdata.set('STRERROR_R_INT', false)
+endif
+
+# FIXME
+cdata.set('pg_restrict', '__restrict')
+
+# FIXME
+if host_machine.system() == 'windows'
+  cdata.set('ACCEPT_TYPE_ARG1', 'unsigned int')
+  cdata.set('ACCEPT_TYPE_ARG2', 'struct sockaddr *')
+  cdata.set('ACCEPT_TYPE_ARG3', 'int')
+  cdata.set('ACCEPT_TYPE_RETURN', 'unsigned int PASCAL')
+else
+  cdata.set('ACCEPT_TYPE_ARG1', 'int')
+  cdata.set('ACCEPT_TYPE_ARG2', 'struct sockaddr')
+  cdata.set('ACCEPT_TYPE_ARG3', 'socklen_t')
+  cdata.set('ACCEPT_TYPE_RETURN', 'int')
+endif
+
+cdata.set('HAVE_STRUCT_ADDRINFO', 1)
+
+
+cdata.set('MEMSET_LOOP_LIMIT', 1024)
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+    PS_STRINGS->ps_nargvstr = 1;
+    PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+  name: 'PS_STRINGS', args: g_c_args)
+  cdata.set('HAVE_PS_STRINGS', 1)
+else
+  cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+m_dep = cc.find_library('m', required : false)
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps = [m_dep]
+
+rt_dep = cc.find_library('rt', required : false)
+
+dl_dep = cc.find_library('dl', required : false)
+
+util_dep = cc.find_library('util', required : false)
+posix4_dep = cc.find_library('posix4', required : false)
+
+getopt_dep = cc.find_library('getopt', required : false)
+gnugetopt_dep = cc.find_library('gnugetopt', required : false)
+
+execinfo_dep = cc.find_library('execinfo', required : false)
+
+func_checks = [
+  ['_configthreadlocale'],
+  ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+  ['clock_gettime', {'dependencies': [rt_dep, posix4_dep]}],
+  ['copyfile'],
+  ['dlopen', {'dependencies': [dl_dep]}],
+  ['explicit_bzero'],
+  ['fdatasync', {'dependencies': [rt_dep, posix4_dep]}],
+  ['fls'],
+  ['getaddrinfo'],
+  ['gethostbyname_r', {'dependencies': [thread_dep]}],
+  ['getifaddrs'],
+  ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getopt_long',{'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getpeereid'],
+  ['getpeerucred'],
+  ['getpwuid_r', {'dependencies': [thread_dep]}],
+  ['getrlimit'],
+  ['getrusage'],
+  ['gettimeofday'], # XXX: This seems to be in the autoconf case
+  ['inet_aton'],
+  ['kqueue'],
+  ['link'],
+  ['mbstowcs_l'],
+  ['memset_s'],
+  ['mkdtemp'],
+  ['poll'],
+  ['posix_fadvise'],
+  ['posix_fallocate'],
+  ['ppoll'],
+  ['pread'],
+  ['pstat'],
+  ['pthread_is_threaded_np'],
+  ['pwrite'],
+  ['random'],
+  ['readlink'],
+  ['readv'],
+  ['setenv'], # FIXME: windows handling
+  ['setproctitle', {'dependencies': [util_dep]}],
+  ['setproctitle_fast'],
+  ['setsid'],
+  ['shm_open', {'dependencies': [rt_dep]}],
+  ['shm_unlink', {'dependencies': [rt_dep]}],
+  ['srandom'],
+  ['strchrnul'],
+  ['strerror_r', {'dependencies': [thread_dep]}],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+  ['strsignal'],
+  ['strtof'], # strsignal is checked separately
+  ['strtoll'], ['__strtoll'], ['strtoq'],
+  ['strtoull'], ['__strtoull'], ['strtouq'],
+  ['symlink'],
+  ['sync_file_range'],
+  ['syncfs'],
+  ['unsetenv'],
+  ['uselocale'],
+  ['wcstombs_l'],
+  ['writev'],
+]
+
+foreach c : func_checks
+  func = c.get(0)
+  kwargs = c.get(1, {})
+  deps = kwargs.get('dependencies', [])
+
+  varname = 'HAVE_'+func.underscorify().to_upper()
+
+  found = cc.has_function(func, args: g_c_args,
+                          kwargs: kwargs + {'dependencies': []})
+
+  if not found
+    foreach dep : deps
+      if not dep.found()
+        continue
+      endif
+      found = cc.has_function(func, args: g_c_args,
+                              kwargs: kwargs + {'dependencies': [dep]})
+      if found
+        os_deps += dep
+        break
+      endif
+    endforeach
+  endif
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  cdata.set(varname, found  ? 1 : false,
+            description: 'Define to 1 if you have the `@0@\' function.'.format(c))
+endforeach
+
+
+
+
+
+if host_machine.system() == 'linux' or host_machine.system() == 'freebsd'
+  dlsuffix = '.so'
+elif host_machine.system() == 'darwin'
+  dlsuffix = '.dylib'
+elif host_machine.system() == 'windows'
+  dlsuffix = '.dll'
+else
+  error('not yet')
+endif
+
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+if host_machine.system() == 'windows'
+   cdata.set('USE_WIN32_SEMAPHORES', 1)
+   cdata.set('USE_WIN32_SHARED_MEMORY', 1)
+elif host_machine.system() == 'darwin'
+   cdata.set('USE_SYSV_SEMAPHORES', 1)
+   cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+else
+   cdata.set('USE_UNNAMED_POSIX_SEMAPHORES', 1)
+   cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+endif
+
+
+if host_machine.system() == 'windows'
+  cdata.set('HAVE_IPV6', 1)
+  cdata.set('HAVE_SYMLINK', 1)
+  cdata.set('WIN32_STACK_RLIMIT', 4194304)
+  cdata.set('HAVE__CONFIGTHREADLOCALE', 1)
+endif
+
+if cc.get_id() == 'msvc'
+  add_project_link_arguments(
+    '/fixed:no',
+    '/dynamicbase',
+    '/nxcompat',
+    language : ['c', 'cpp'],
+  )
+endif
+
+if host_machine.system() == 'windows'
+  os_deps += cc.find_library('ws2_32', required: true)
+endif
+
+
+
+###############################################################
+# Threading
+###############################################################
+
+# Probably not worth implementing other cases anymore
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+if thread_dep.found()
+  if cc.has_function('pthread_is_threaded_np', args: g_c_args, dependencies: [thread_dep])
+    cdata.set('HAVE_PTHREAD_IS_THREADED_NP', 1)
+  endif
+  if cc.has_function('pthread_barrier_wait', args: g_c_args, dependencies: [thread_dep])
+    cdata.set('HAVE_PTHREAD_BARRIER_WAIT', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Build
+###############################################################
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+test_deps = []
+backend_targets = []
+
+
+# List of tap tests we later generate test() invocations for. The main
+# reason for doing it that way instead of having test() invocations
+# everywhere is that they end up being too large. A second benefit is
+# that it'd make it easier to generate data for another runner.
+tap_tests = []
+isolation_tests = []
+regress_tests = []
+
+
+# Default options for targets
+
+default_target_args = {
+  'implicit_include_directories': false,
+  'install': true,
+}
+
+default_lib_args = default_target_args + {
+  'name_prefix': 'lib',
+}
+
+internal_lib_args = default_lib_args + {
+  'build_by_default': false,
+  'install': false,
+}
+
+default_mod_args = default_lib_args + {
+  'name_prefix': '',
+}
+
+default_bin_args = default_target_args + {
+}
+
+if host_machine.system() == 'windows'
+  # nothing to do
+else
+  if host_machine.system() == 'darwin'
+    rpath_var = '@loader_path'
+  else
+    rpath_var = '$ORIGIN'
+  endif
+
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(relpath,
+    get_option('bindir'), get_option('libdir'), check: true).stdout().strip()
+  default_bin_args += {'install_rpath':  rpath_var / bin_to_lib}
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(relpath,
+    get_option('libdir'), get_option('libdir'), check: true).stdout().strip()
+  default_mod_args += {'install_rpath': rpath_var}
+endif
+
+
+###
+### windows resources related stuff
+###
+
+rc_cdata = configuration_data()
+rc_cdata.set_quoted('ICO', meson.source_root() / 'src' / 'port' / 'win32.ico')
+
+rc_lib_cdata = rc_cdata
+rc_lib_cdata.set('VFT_TYPE', 'VFT_DLL')
+
+rc_bin_cdata = rc_cdata
+rc_bin_cdata.set('VFT_TYPE', 'VFT_APP')
+
+win32ver_rc_in = files('src/port/win32ver.rc.in')
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+generated_headers = []
+generated_backend_headers = []
+
+postgres_inc = [include_directories('src/include')]
+
+if host_machine.system() == 'windows'
+  postgres_inc += include_directories('src/include/port/win32')
+
+  if cc.get_id() == 'msvc'
+    postgres_inc += include_directories('src/include/port/win32_msvc')
+  endif
+endif
+
+subdir('src/include')
+
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+backend_common_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_shlib, common_shlib],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+subdir('src/interfaces/libpq')
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_static, common_static, fe_utils],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+backend_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: [os_deps, ssl, lz4, icu, icu_i18n, ldap, gssapi, libxml, systemd],
+)
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+  compile_args: [],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: [os_deps, ssl, lz4, icu, icu_i18n, ldap, gssapi, libxml, systemd],
+)
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+
+subdir('doc/src/sgml')
+
+
+if host_machine.system() == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+  if host_machine.system() == 'windows'
+    if prefix.split(':\\').length() == 1
+        # just a drive
+        test_prefix = ''
+    else
+        test_prefix = prefix.split(':\\')[1]
+    endif
+  else
+    test_prefix = prefix.substring(1)
+  endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+test('tmp_install',
+    meson_bin, args: meson_args + ['install', '--quiet', '--only-changed', '--no-rebuild'],
+    env: {'DESTDIR':test_install_destdir},
+    priority: 100,
+    is_parallel: false,
+    suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport=40000
+
+test_env = environment()
+
+test_env.prepend('PATH', test_install_location / get_option('bindir'))
+test_env.set('PG_REGRESS', meson.build_root() / 'src/test/regress/pg_regress')
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+# Define all 'pg_regress' style tests
+foreach t : regress_tests
+  test_command = [
+    pg_regress,
+    '--temp-instance', test_result_dir / t['name'] / 'pg_regress' / 'tmp_check',
+    '--inputdir', t['sd'],
+    '--outputdir', test_result_dir / t['name'] / 'pg_regress',
+    '--bindir', '',
+    '--dlpath', t['bd'],
+    '--max-concurrent-tests=20',
+    '--port=@0@'.format(testport),
+  ]
+
+  if t.has_key('regress_args')
+     test_command += t['regress_args']
+  endif
+
+  if t.has_key('schedule')
+     test_command += ['--schedule', t['schedule'],]
+  else
+     test_command += t['sql']
+  endif
+
+  test_kwargs = {
+    'suite': ['pg_regress', t['name']],
+    'priority': 10,
+    'timeout': 300,
+    'depends': test_deps + t.get('deps', []),
+    'env': test_env,
+    'workdir': t['sd'],
+    'args': [
+      meson.build_root(),
+      t['bd'],
+      t['name'],
+      'pg_regress',
+      test_command,
+    ]
+  }
+
+  # Allow test definition to override arguments
+  if t.has_key('test_kwargs')
+     test_kwargs += t['test_kwargs']
+  endif
+
+  test(t['name'] / 'pg_regress',
+    testwrap,
+    kwargs: test_kwargs,
+  )
+
+  testport = testport + 1
+endforeach
+
+
+# Define all 'isolationtester' style tests
+foreach t : isolation_tests
+  test_command = [
+    pg_isolation_regress,
+    '--temp-instance', test_result_dir / t['name'] / 'isolation' / 'tmp_check',
+    '--inputdir', t['sd'],
+    '--outputdir', test_result_dir / t['name'] / 'isolation',
+    '--bindir', '',
+    '--dlpath', t['bd'],
+    '--max-concurrent-tests=20',
+    '--port=@0@'.format(testport),
+  ]
+
+  if t.has_key('regress_args')
+     test_command += t['regress_args']
+  endif
+
+  if t.has_key('schedule')
+     test_command += ['--schedule', t['schedule'],]
+  else
+     test_command += t['specs']
+  endif
+
+  test_kwargs = {
+    'suite': ['isolation', t['name']],
+    'priority': 20,
+    'timeout': 300,
+    'depends': test_deps + t.get('deps', []),
+    'workdir': t['sd'],
+    'env': test_env,
+    'args': [
+      meson.build_root(),
+      t['bd'],
+      t['name'],
+      'isolation',
+      test_command,
+    ]
+  }
+
+  # Allow test definition to override arguments
+  if t.has_key('test_kwargs')
+     test_kwargs += t['test_kwargs']
+  endif
+
+  test(t['name'] / 'isolation',
+    testwrap,
+    kwargs: test_kwargs,
+  )
+
+  testport = testport + 1
+endforeach
+
+
+# Define all 'tap' style tests
+# FIXME: dependencies for each test
+foreach t : tap_tests
+  env = test_env
+
+  foreach name, value : t.get('env', {})
+    if name == 'PATH'
+      # FIXME: manually setting PATH again, because repeated prepend didn't work
+      # before meson 0.58.
+      env.prepend('PATH', value, test_install_location / get_option('bindir'))
+    else
+      env.set(name, value)
+    endif
+  endforeach
+
+  foreach onetap : t['tests']
+    test(t['name'] / onetap,
+      testwrap,
+      workdir: t['sd'],
+      args: [
+        meson.build_root(),
+        t['bd'],
+        t['name'],
+        onetap,
+        'perl',
+        '-I', meson.source_root() / 'src/test/perl',
+        '-I', t['sd'],
+        t['sd'] / onetap
+      ],
+      protocol: 'tap',
+      suite: ['tap', t['name']],
+      env: env,
+      depends: test_deps + t.get('deps', []),
+      timeout: 300,
+      )
+  endforeach
+endforeach
+
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+  summary({
+    'Data Block Size' : cdata.get('BLCKSZ'),
+    'WAL Block Size' : cdata.get('XLOG_BLCKSZ')
+    }, section: 'Data Layout'
+  )
+
+  summary(
+    {
+      'host system' : '@0@ @1@'.format(host_machine.system(), host_machine.cpu_family()),
+      'build system' : '@0@ @1@'.format(build_machine.system(), build_machine.cpu_family()),
+    },
+    section: 'System'
+  )
+
+  summary(
+    {
+      'linker': '@0@'.format(cc.get_linker_id()),
+      'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+    },
+    section: 'Compiler'
+  )
+
+  if llvm.found()
+    summary(
+      {
+        'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version())
+      },
+      section: 'Compiler')
+  endif
+
+  summary(
+    {
+      'bison' : '@0@ @1@'.format(bison.full_path(), bison_version),
+    },
+    section: 'Programs'
+  )
+
+  summary(
+    {
+      'GSS': gssapi,
+      'LDAP': ldap,
+      'LLVM': llvm,
+      'icu': icu,
+      'libxml': libxml,
+      'libxslt': libxslt,
+      'lz4': lz4,
+      'perl': perl_dep,
+      'python3': python3,
+      'readline': readline,
+      'selinux': selinux,
+      'ssl': ssl,
+      'systemd': systemd,
+      'uuid': uuid,
+      'zlib': zlib,
+    },
+    section: 'External Libraries'
+  )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..d80d8fa5820
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,90 @@
+# Data layout influencing options
+option('BLCKSZ', type : 'combo', choices : ['1', '2', '4', '8', '16', '32'], value : '8',
+  description: 'set table block size in kB')
+
+
+# You get it
+option('cassert', type : 'boolean', value: false,
+  description: 'enable assertion checks (for debugging)')
+
+option('atomics', type : 'boolean', value: true,
+  description: 'whether to use atomic operations')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array',
+  description: 'non-default directories to be searched for headers')
+option('extra_lib_dirs', type : 'array',
+  description: 'non-default directories to be searched for libs')
+
+
+# External dependencies
+
+option('gssapi', type : 'feature', value: 'auto',
+  description: 'GSSAPI support')
+
+option('ldap', type : 'feature', value: 'auto',
+  description: 'LDAP support')
+
+option('llvm', type : 'feature', value: 'disabled',
+  description: 'whether to use llvm')
+
+option('icu', type : 'feature', value: 'auto',
+  description: 'ICU support')
+
+option('libxml', type : 'feature', value: 'auto',
+  description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+  description: 'XSLT support in contrib/xml2')
+
+option('lz4', type : 'feature', value: 'auto',
+  description: 'LZ4 support')
+
+option('perl', type : 'feature', value: 'auto',
+  description: 'build Perl modules (PL/Perl)')
+
+option('python', type : 'feature', value: 'auto',
+  description: 'build Python modules (PL/Python)')
+
+option('readline', type : 'feature', value : 'auto',
+  description: 'use GNU Readline or BSD Libedit for editing')
+
+option('selinux', type : 'feature', value : 'disabled',
+  description: 'build with SELinux support')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'], value : 'none',
+  description: 'use LIB for SSL/TLS support (openssl)')
+
+option('systemd', type : 'feature', value: 'auto',
+  description: 'build with systemd support')
+
+option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'], value : 'none',
+  description: 'build contrib/uuid-ossp using LIB')
+
+option('zlib', type : 'feature', value: 'auto',
+  description: 'whether to use zlib')
+
+
+# Programs
+option('BISON', type : 'string', value: 'bison',
+  description: 'path to bison binary')
+
+option('FLEX', type : 'string', value: 'flex',
+  description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+  description: 'path to gzip binary')
+
+option('PERL', type : 'string', value: 'perl',
+  description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+  description: 'path to prove binary')
+
+option('SED', type : 'string', value: 'gsed',
+  description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+  description: 'path to tar binary')
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'brin.c',
+  'brin_bloom.c',
+  'brin_inclusion.c',
+  'brin_minmax.c',
+  'brin_minmax_multi.c',
+  'brin_pageops.c',
+  'brin_revmap.c',
+  'brin_tuple.c',
+  'brin_validate.c',
+  'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'attmap.c',
+  'bufmask.c',
+  'detoast.c',
+  'heaptuple.c',
+  'indextuple.c',
+  'printsimple.c',
+  'printtup.c',
+  'relation.c',
+  'reloptions.c',
+  'scankey.c',
+  'session.c',
+  'syncscan.c',
+  'toast_compression.c',
+  'toast_internals.c',
+  'tupconvert.c',
+  'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'ginarrayproc.c',
+  'ginbtree.c',
+  'ginbulk.c',
+  'gindatapage.c',
+  'ginentrypage.c',
+  'ginfast.c',
+  'ginget.c',
+  'gininsert.c',
+  'ginlogic.c',
+  'ginpostinglist.c',
+  'ginscan.c',
+  'ginutil.c',
+  'ginvacuum.c',
+  'ginvalidate.c',
+  'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'gist.c',
+  'gistbuild.c',
+  'gistbuildbuffers.c',
+  'gistget.c',
+  'gistproc.c',
+  'gistscan.c',
+  'gistsplit.c',
+  'gistutil.c',
+  'gistvacuum.c',
+  'gistvalidate.c',
+  'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'hash.c',
+  'hash_xlog.c',
+  'hashfunc.c',
+  'hashinsert.c',
+  'hashovfl.c',
+  'hashpage.c',
+  'hashsearch.c',
+  'hashsort.c',
+  'hashutil.c',
+  'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'heapam.c',
+  'heapam_handler.c',
+  'heapam_visibility.c',
+  'heaptoast.c',
+  'hio.c',
+  'pruneheap.c',
+  'rewriteheap.c',
+  'vacuumlazy.c',
+  'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'amapi.c',
+  'amvalidate.c',
+  'genam.c',
+  'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'nbtcompare.c',
+  'nbtdedup.c',
+  'nbtinsert.c',
+  'nbtpage.c',
+  'nbtree.c',
+  'nbtsearch.c',
+  'nbtsort.c',
+  'nbtsplitloc.c',
+  'nbtutils.c',
+  'nbtvalidate.c',
+  'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+  'brindesc.c',
+  'clogdesc.c',
+  'committsdesc.c',
+  'dbasedesc.c',
+  'genericdesc.c',
+  'gindesc.c',
+  'gistdesc.c',
+  'hashdesc.c',
+  'heapdesc.c',
+  'logicalmsgdesc.c',
+  'mxactdesc.c',
+  'nbtdesc.c',
+  'relmapdesc.c',
+  'replorigindesc.c',
+  'seqdesc.c',
+  'smgrdesc.c',
+  'spgdesc.c',
+  'standbydesc.c',
+  'tblspcdesc.c',
+  'xactdesc.c',
+  'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'spgdoinsert.c',
+  'spginsert.c',
+  'spgkdtreeproc.c',
+  'spgproc.c',
+  'spgquadtreeproc.c',
+  'spgscan.c',
+  'spgtextproc.c',
+  'spgutils.c',
+  'spgvacuum.c',
+  'spgvalidate.c',
+  'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'table.c',
+  'tableam.c',
+  'tableamapi.c',
+  'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bernoulli.c',
+  'system.c',
+  'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..fe3703e0f21
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'clog.c',
+  'commit_ts.c',
+  'generic_xlog.c',
+  'multixact.c',
+  'parallel.c',
+  'rmgr.c',
+  'slru.c',
+  'subtrans.c',
+  'timeline.c',
+  'transam.c',
+  'twophase.c',
+  'twophase_rmgr.c',
+  'varsup.c',
+  'xact.c',
+  'xlog.c',
+  'xlogarchive.c',
+  'xlogfuncs.c',
+  'xloginsert.c',
+  'xlogutils.c',
+)
+
+# used by frontend programs to built a frontend xlogreader
+xlogreader_sources = files(
+  'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..55c0be68cc4
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+bootscanner = custom_target('bootscanner',
+  input: ['bootscanner.l'],
+  output: ['bootscanner.c'],
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
+
+generated_backend_sources += custom_target('bootparse',
+  input: ['bootparse.y', bootscanner[0]],
+  output: ['bootparse.c'],
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..2cc23582e35
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,41 @@
+backend_sources += files(
+  'aclchk.c',
+  'catalog.c',
+  'dependency.c',
+  'heap.c',
+  'index.c',
+  'indexing.c',
+  'namespace.c',
+  'objectaccess.c',
+  'objectaddress.c',
+  'partition.c',
+  'pg_aggregate.c',
+  'pg_cast.c',
+  'pg_class.c',
+  'pg_collation.c',
+  'pg_constraint.c',
+  'pg_conversion.c',
+  'pg_db_role_setting.c',
+  'pg_depend.c',
+  'pg_enum.c',
+  'pg_inherits.c',
+  'pg_largeobject.c',
+  'pg_namespace.c',
+  'pg_operator.c',
+  'pg_proc.c',
+  'pg_publication.c',
+  'pg_range.c',
+  'pg_shdepend.c',
+  'pg_subscription.c',
+  'pg_type.c',
+  'storage.c',
+  'toasting.c',
+)
+
+
+install_data(
+  'information_schema.sql',
+  'sql_features.txt',
+  'system_functions.sql',
+  'system_views.sql',
+  install_dir: 'share/')
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..8e73b29a263
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,50 @@
+backend_sources += files(
+  'aggregatecmds.c',
+  'alter.c',
+  'amcmds.c',
+  'analyze.c',
+  'async.c',
+  'cluster.c',
+  'collationcmds.c',
+  'comment.c',
+  'constraint.c',
+  'conversioncmds.c',
+  'copy.c',
+  'copyfrom.c',
+  'copyfromparse.c',
+  'copyto.c',
+  'createas.c',
+  'dbcommands.c',
+  'define.c',
+  'discard.c',
+  'dropcmds.c',
+  'event_trigger.c',
+  'explain.c',
+  'extension.c',
+  'foreigncmds.c',
+  'functioncmds.c',
+  'indexcmds.c',
+  'lockcmds.c',
+  'matview.c',
+  'opclasscmds.c',
+  'operatorcmds.c',
+  'policy.c',
+  'portalcmds.c',
+  'prepare.c',
+  'proclang.c',
+  'publicationcmds.c',
+  'schemacmds.c',
+  'seclabel.c',
+  'sequence.c',
+  'statscmds.c',
+  'subscriptioncmds.c',
+  'tablecmds.c',
+  'tablespace.c',
+  'trigger.c',
+  'tsearchcmds.c',
+  'typecmds.c',
+  'user.c',
+  'vacuum.c',
+  'variable.c',
+  'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+  'execAmi.c',
+  'execAsync.c',
+  'execCurrent.c',
+  'execExpr.c',
+  'execExprInterp.c',
+  'execGrouping.c',
+  'execIndexing.c',
+  'execJunk.c',
+  'execMain.c',
+  'execParallel.c',
+  'execPartition.c',
+  'execProcnode.c',
+  'execReplication.c',
+  'execSRF.c',
+  'execScan.c',
+  'execTuples.c',
+  'execUtils.c',
+  'functions.c',
+  'instrument.c',
+  'nodeAgg.c',
+  'nodeAppend.c',
+  'nodeBitmapAnd.c',
+  'nodeBitmapHeapscan.c',
+  'nodeBitmapIndexscan.c',
+  'nodeBitmapOr.c',
+  'nodeCtescan.c',
+  'nodeCustom.c',
+  'nodeForeignscan.c',
+  'nodeFunctionscan.c',
+  'nodeGather.c',
+  'nodeGatherMerge.c',
+  'nodeGroup.c',
+  'nodeHash.c',
+  'nodeHashjoin.c',
+  'nodeIncrementalSort.c',
+  'nodeIndexonlyscan.c',
+  'nodeIndexscan.c',
+  'nodeLimit.c',
+  'nodeLockRows.c',
+  'nodeMaterial.c',
+  'nodeMemoize.c',
+  'nodeMergeAppend.c',
+  'nodeMergejoin.c',
+  'nodeModifyTable.c',
+  'nodeNamedtuplestorescan.c',
+  'nodeNestloop.c',
+  'nodeProjectSet.c',
+  'nodeRecursiveunion.c',
+  'nodeResult.c',
+  'nodeSamplescan.c',
+  'nodeSeqscan.c',
+  'nodeSetOp.c',
+  'nodeSort.c',
+  'nodeSubplan.c',
+  'nodeSubqueryscan.c',
+  'nodeTableFuncscan.c',
+  'nodeTidrangescan.c',
+  'nodeTidscan.c',
+  'nodeUnique.c',
+  'nodeValuesscan.c',
+  'nodeWindowAgg.c',
+  'nodeWorktablescan.c',
+  'spi.c',
+  'tqueue.c',
+  'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..83a90770bca
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,41 @@
+if llvm.found()
+
+  llvmjit_sources = []
+
+  # Infrastructure
+  llvmjit_sources += files(
+    'llvmjit.c',
+    'llvmjit_error.cpp',
+    'llvmjit_inline.cpp',
+    'llvmjit_wrap.cpp',
+  )
+
+  # Code generation
+  llvmjit_sources += files(
+    'llvmjit_deform.c',
+    'llvmjit_expr.c',
+  )
+
+  llvmjit = shared_module('llvmjit',
+    llvmjit_sources,
+    kwargs: pg_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [llvm],
+    }
+  )
+
+  backend_targets += llvmjit
+
+  # Note this is intentionally is not installed to bitcodedir, as it's not
+  # for inlining
+  llvmjit_types = custom_target('llvmjit_types.bc',
+    kwargs: llvm_irgen_kw + {
+      'input': 'llvmjit_types.c',
+      'output': 'llvmjit_types.bc',
+      'depends': [postgres],
+      'install': true,
+      'install_dir': get_option('libdir')
+    }
+  )
+  backend_targets += llvmjit_types
+
+endif
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..53292563d34
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'binaryheap.c',
+  'bipartite_match.c',
+  'bloomfilter.c',
+  'dshash.c',
+  'hyperloglog.c',
+  'ilist.c',
+  'integerset.c',
+  'knapsack.c',
+  'pairingheap.c',
+  'rbtree.c'
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..49867647155
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'auth-sasl.c',
+  'auth-scram.c',
+  'auth.c',
+  'be-fsstubs.c',
+  'be-secure-common.c',
+  'be-secure.c',
+  'crypt.c',
+  'hba.c',
+  'ifaddr.c',
+  'pqcomm.c',
+  'pqformat.c',
+  'pqmq.c',
+  'pqsignal.c',
+)
+
+if ssl.found()
+  backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+  backend_sources += files(
+    'be-secure-gssapi.c',
+    'be-gssapi-common.c'
+  )
+endif
+
+install_data('pg_hba.conf.sample', 'pg_ident.conf.sample', install_dir: 'share/')
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..0098411c6b2
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,197 @@
+backend_build_deps = [backend_code]
+backend_deps = [dl_dep, thread_dep]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+backend_c_args = []
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+
+postgres_link_args = []
+postgres_link_depends = []
+
+if host_machine.system() == 'windows'
+  backend_deps += cc.find_library('secur32', required: true)
+
+  if cc.get_id() == 'msvc'
+    postgres_link_args += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  else
+    postgres_link_args += '-Wl,--stack,@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  endif
+endif
+
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+#
+# XXX: This needs to be improved.
+#
+
+# NB: There's an outer and inner layer of == windows checks, to allow to
+# exercise most of this on !windows, by widening the outer "layer".
+
+if cc.get_id() == 'msvc' # or true
+
+  postgres_lib = static_library('postgres_lib',
+    backend_sources + timezone_sources + generated_backend_sources,
+    link_whole: backend_link_with,
+    c_pch: '../include/pch/postgres_pch.h',
+    c_args: backend_c_args,
+    implicit_include_directories: false,
+    dependencies: backend_build_deps,
+    build_by_default: false,
+    install: false,
+  )
+
+  postgres_def = custom_target('postgres.def',
+    command: [perl, files('../tools/msvc/gendef2.pl'), 'x64', '@OUTPUT@', '@PRIVATE_DIR@', '@INPUT@'],
+    input: [postgres_lib, common_srv, pgport_srv],
+    output: 'postgres.def',
+    depends: [postgres_lib, common_srv, pgport_srv],
+    install: false,
+  )
+
+  if cc.get_id() == 'msvc'
+    postgres_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+    postgres_link_depends += postgres_def
+  endif
+
+  # Unfortunately the msvc linker whines when building an executable with just
+  # libraries, hence the reuse of the 'main' object directly.
+
+  postgres = executable('postgres',
+    objects: [postgres_lib.extract_objects(main_file)],
+    link_with: [postgres_lib],
+    link_args: postgres_link_args,
+    link_depends: postgres_link_depends,
+    dependencies: backend_deps,
+    export_dynamic: true,
+    implib: true,
+    kwargs: default_bin_args,
+  )
+
+else
+
+  postgres = executable('postgres',
+    backend_sources + generated_backend_sources + timezone_sources,
+    c_pch: '../include/pch/postgres_pch.h',
+    c_args: backend_c_args,
+    link_args: postgres_link_args,
+    link_with: backend_link_with,
+    export_dynamic: true,
+    dependencies: [backend_build_deps, backend_deps],
+    kwargs: default_bin_args,
+  )
+
+endif
+
+backend_targets += postgres
+
+pg_mod_args = default_mod_args + {
+  'dependencies': [backend_mod_code],
+  'c_args': [],
+  'cpp_args': [],
+ }
+
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+  pg_mod_args = pg_mod_args + {
+    'c_args': pg_mod_args['c_args'] + ['-fvisibility=hidden'],
+    'cpp_args': pg_mod_args['c_args'] + ['-fvisibility=hidden', '-fvisibility-inlines-hidden'],
+  }
+endif
+
+# Windows / MacOs link shared modules against postgres. To avoid unnecessary
+# build-time dependencies on other operating systems, only add it when
+# necessary.
+if host_machine.system() == 'windows' or host_machine.system() == 'darwin'
+   pg_mod_args = pg_mod_args + {'link_with': [postgres]}
+endif
+if host_machine.system() == 'darwin'
+   pg_mod_args = pg_mod_args + {'link_args': ['-bundle_loader', '@0@'.format(postgres.full_path())]}
+endif
+
+
+# Shared modules that, on some OSs, link against the server binary. Only enter
+# these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
+
+
+if llvm.found()
+
+  # custom_target() insists on targetting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generator and custom_'t accept CustomTargetIndex as 'depends', nor do they
+  # like targets with more than one output. However, a custom target accepts
+  # them as input without a problem. So we have the below transitive target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args + g_c_args,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: ['@PLAINNAME@.bc']
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('postgres.index.bc',
+    kwargs: llvm_irlink_kw + {
+      'input': bc_backend_sources,
+      'output': ['bitcode'],
+      },
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..9fca83fba44
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'bitmapset.c',
+  'copyfuncs.c',
+  'equalfuncs.c',
+  'extensible.c',
+  'list.c',
+  'makefuncs.c',
+  'nodeFuncs.c',
+  'nodes.c',
+  'outfuncs.c',
+  'params.c',
+  'print.c',
+  'read.c',
+  'readfuncs.c',
+  'tidbitmap.c',
+  'value.c',
+)
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'geqo_copy.c',
+  'geqo_cx.c',
+  'geqo_erx.c',
+  'geqo_eval.c',
+  'geqo_main.c',
+  'geqo_misc.c',
+  'geqo_mutation.c',
+  'geqo_ox1.c',
+  'geqo_ox2.c',
+  'geqo_pmx.c',
+  'geqo_pool.c',
+  'geqo_px.c',
+  'geqo_random.c',
+  'geqo_recombination.c',
+  'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'allpaths.c',
+  'clausesel.c',
+  'costsize.c',
+  'equivclass.c',
+  'indxpath.c',
+  'joinpath.c',
+  'joinrels.c',
+  'pathkeys.c',
+  'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'analyzejoins.c',
+  'createplan.c',
+  'initsplan.c',
+  'planagg.c',
+  'planmain.c',
+  'planner.c',
+  'setrefs.c',
+  'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'prepagg.c',
+  'prepjointree.c',
+  'prepqual.c',
+  'preptlist.c',
+  'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'appendinfo.c',
+  'clauses.c',
+  'inherit.c',
+  'joininfo.c',
+  'orclauses.c',
+  'paramassign.c',
+  'pathnode.c',
+  'placeholder.c',
+  'plancat.c',
+  'predtest.c',
+  'relnode.c',
+  'restrictinfo.c',
+  'tlist.c',
+  'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..5ce4d09f31b
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,43 @@
+backend_sources += files(
+  'analyze.c',
+  'parse_agg.c',
+  'parse_clause.c',
+  'parse_coerce.c',
+  'parse_collate.c',
+  'parse_cte.c',
+  'parse_enr.c',
+  'parse_expr.c',
+  'parse_func.c',
+  'parse_node.c',
+  'parse_oper.c',
+  'parse_param.c',
+  'parse_relation.c',
+  'parse_target.c',
+  'parse_type.c',
+  'parse_utilcmd.c',
+  'scansup.c',
+)
+
+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...
+
+parser_sources = [files('parser.c')]
+
+backend_scanner = custom_target('scan',
+  input: ['scan.l'],
+  output: ['scan.c'],
+  command: [flex, '-b', '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT0@'])
+parser_sources += backend_scanner[0]
+
+parser_sources += backend_parser_header[0]
+parser_sources += backend_parser_header[1]
+
+parser = static_library('parser',
+  parser_sources + generated_headers,
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: [backend_code],
+  kwargs: default_lib_args + {'install': false},
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'partbounds.c',
+  'partdesc.c',
+  'partprune.c',
+)
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..f1bf7f6d929
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+   backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+   backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+   backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+   backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+   backend_sources += files('win32_shmem.c')
+endif
+
+if host_machine.system() == 'windows'
+  subdir('win32')
+endif
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..68fe4cc3cd0
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'crashdump.c',
+  'signal.c',
+  'socket.c',
+  'timer.c',
+)
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..803405683e2
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'autovacuum.c',
+  'auxprocess.c',
+  'bgworker.c',
+  'bgwriter.c',
+  'checkpointer.c',
+  'fork_process.c',
+  'interrupt.c',
+  'pgarch.c',
+  'pgstat.c',
+  'postmaster.c',
+  'startup.c',
+  'syslogger.c',
+  'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..d08e21cd6d6
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'regcomp.c',
+  'regerror.c',
+  'regexec.c',
+  'regexport.c',
+  'regfree.c',
+  'regprefix.c'
+)
+
+#FIXME
+# mark inclusion dependencies between .c files explicitly
+#regcomp.o: regcomp.c regc_lex.c regc_color.c regc_nfa.c regc_cvec.c \
+#        regc_locale.c regc_pg_locale.c
+#
+#regexec.o: regexec.c rege_dfa.c
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+  'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+  libpqwalreceiver_sources,
+  kwargs: pg_mod_args + {
+    'name_prefix': 'lib',
+    'dependencies': pg_mod_args['dependencies'] + [libpq],
+  }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+  'decode.c',
+  'launcher.c',
+  'logical.c',
+  'logicalfuncs.c',
+  'message.c',
+  'origin.c',
+  'proto.c',
+  'relation.c',
+  'reorderbuffer.c',
+  'snapbuild.c',
+  'tablesync.c',
+  'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..ee12c6d49da
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,42 @@
+backend_sources += files(
+  'backup_manifest.c',
+  'basebackup.c',
+  'slot.c',
+  'slotfuncs.c',
+  'syncrep.c',
+  'walreceiver.c',
+  'walreceiverfuncs.c',
+  'walsender.c',
+)
+
+# [sync]repl_scanner is compiled as part of [sync]repl_gram. The
+# ordering is enforced by making the generation of grammar depend on
+# the scanner generation. That's unnecessarily strict, but overall
+# harmless.
+
+repl_scanner = custom_target('repl_scanner',
+  input : files('repl_scanner.l'),
+  output : ['repl_scanner.c'],
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@']
+)
+
+generated_backend_sources += custom_target('repl_gram',
+  input: 'repl_gram.y',
+  output: 'repl_gram.c',
+  depends: repl_scanner,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+
+syncrep_scanner = custom_target('syncrep_scanner',
+  input: 'syncrep_scanner.l',
+  output: 'syncrep_scanner.c',
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
+
+generated_backend_sources += custom_target('syncrep_gram',
+  input: 'syncrep_gram.y',
+  output: 'syncrep_gram.c',
+  depends: syncrep_scanner,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..8ff0a0c6133
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,11 @@
+pgoutput_sources = files(
+  'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+  pgoutput_sources,
+  kwargs: pg_mod_args + {
+  }
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..032e2e409b5
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'rewriteDefine.c',
+  'rewriteHandler.c',
+  'rewriteManip.c',
+  'rewriteRemove.c',
+  'rewriteSearchCycle.c',
+  'rewriteSupport.c',
+  'rowsecurity.c'
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..b1e52e9a0c3
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,83 @@
+dict_snowball_sources = files(
+  'dict_snowball.c',
+  'libstemmer/api.c',
+  'libstemmer/utilities.c',
+)
+
+dict_snowball_sources += files(
+  'libstemmer/stem_ISO_8859_1_basque.c',
+  'libstemmer/stem_ISO_8859_1_catalan.c',
+  'libstemmer/stem_ISO_8859_1_danish.c',
+  'libstemmer/stem_ISO_8859_1_dutch.c',
+  'libstemmer/stem_ISO_8859_1_english.c',
+  'libstemmer/stem_ISO_8859_1_finnish.c',
+  'libstemmer/stem_ISO_8859_1_french.c',
+  'libstemmer/stem_ISO_8859_1_german.c',
+  'libstemmer/stem_ISO_8859_1_indonesian.c',
+  'libstemmer/stem_ISO_8859_1_irish.c',
+  'libstemmer/stem_ISO_8859_1_italian.c',
+  'libstemmer/stem_ISO_8859_1_norwegian.c',
+  'libstemmer/stem_ISO_8859_1_porter.c',
+  'libstemmer/stem_ISO_8859_1_portuguese.c',
+  'libstemmer/stem_ISO_8859_1_spanish.c',
+  'libstemmer/stem_ISO_8859_1_swedish.c',
+  'libstemmer/stem_ISO_8859_2_hungarian.c',
+  'libstemmer/stem_ISO_8859_2_romanian.c',
+  'libstemmer/stem_KOI8_R_russian.c',
+  'libstemmer/stem_UTF_8_arabic.c',
+  'libstemmer/stem_UTF_8_armenian.c',
+  'libstemmer/stem_UTF_8_basque.c',
+  'libstemmer/stem_UTF_8_catalan.c',
+  'libstemmer/stem_UTF_8_danish.c',
+  'libstemmer/stem_UTF_8_dutch.c',
+  'libstemmer/stem_UTF_8_english.c',
+  'libstemmer/stem_UTF_8_finnish.c',
+  'libstemmer/stem_UTF_8_french.c',
+  'libstemmer/stem_UTF_8_german.c',
+  'libstemmer/stem_UTF_8_greek.c',
+  'libstemmer/stem_UTF_8_hindi.c',
+  'libstemmer/stem_UTF_8_hungarian.c',
+  'libstemmer/stem_UTF_8_indonesian.c',
+  'libstemmer/stem_UTF_8_irish.c',
+  'libstemmer/stem_UTF_8_italian.c',
+  'libstemmer/stem_UTF_8_lithuanian.c',
+  'libstemmer/stem_UTF_8_nepali.c',
+  'libstemmer/stem_UTF_8_norwegian.c',
+  'libstemmer/stem_UTF_8_porter.c',
+  'libstemmer/stem_UTF_8_portuguese.c',
+  'libstemmer/stem_UTF_8_romanian.c',
+  'libstemmer/stem_UTF_8_russian.c',
+  'libstemmer/stem_UTF_8_serbian.c',
+  'libstemmer/stem_UTF_8_spanish.c',
+  'libstemmer/stem_UTF_8_swedish.c',
+  'libstemmer/stem_UTF_8_tamil.c',
+  'libstemmer/stem_UTF_8_turkish.c',
+  'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+  dict_snowball_sources,
+  c_pch: '../../include/pch/postgres_pch.h',
+  kwargs: pg_mod_args + {
+    'include_directories': [stemmer_inc],
+  }
+)
+
+snowball_create = custom_target('snowball_create',
+  input: ['snowball_create.pl'],
+  output: ['snowball_create.sql'],
+  depfile: 'snowball_create.dep',
+  command: [perl, '@INPUT0@', '--input', '@CURRENT_SOURCE_DIR@', '--output', '@OUTDIR@'],
+  install: true,
+  install_dir: get_option('datadir'))
+
+# FIXME: check whether the logic to select languages currently in Makefile is needed
+install_subdir('stopwords',
+  install_dir: get_option('datadir') / 'tsearch_data',
+  strip_directory: true)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'dependencies.c',
+  'extended_stats.c',
+  'mcv.c',
+  'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'buf_init.c',
+  'buf_table.c',
+  'bufmgr.c',
+  'freelist.c',
+  'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'buffile.c',
+  'copydir.c',
+  'fd.c',
+  'fileset.c',
+  'reinit.c',
+  'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'freespace.c',
+  'fsmpage.c',
+  'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+  'barrier.c',
+  'dsm.c',
+  'dsm_impl.c',
+  'ipc.c',
+  'ipci.c',
+  'latch.c',
+  'pmsignal.c',
+  'procarray.c',
+  'procsignal.c',
+  'shm_mq.c',
+  'shm_toc.c',
+  'shmem.c',
+  'shmqueue.c',
+  'signalfuncs.c',
+  'sinval.c',
+  'sinvaladt.c',
+  'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..938e7f89894
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'condition_variable.c',
+  'deadlock.c',
+  'lmgr.c',
+  'lock.c',
+  'lwlock.c',
+  'predicate.c',
+  'proc.c',
+  's_lock.c',
+  'spin.c',
+)
+
+lwlocknames_backend = custom_target('lwlocknames',
+  input : files('lwlocknames.txt'),
+  output : ['lwlocknames.c', 'lwlocknames.h'],
+  command : [perl, files('generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@']
+)
+generated_backend_sources += lwlocknames_backend[0]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bufpage.c',
+  'checksum.c',
+  'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'md.c',
+  'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'cmdtag.c',
+  'dest.c',
+  'fastpath.c',
+  'postgres.c',
+  'pquery.c',
+  'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..460036b6d4c
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+  'dict.c',
+  'dict_ispell.c',
+  'dict_simple.c',
+  'dict_synonym.c',
+  'dict_thesaurus.c',
+  'regis.c',
+  'spell.c',
+  'to_tsany.c',
+  'ts_locale.c',
+  'ts_parse.c',
+  'ts_selfuncs.c',
+  'ts_typanalyze.c',
+  'ts_utils.c',
+  'wparser.c',
+  'wparser_def.c',
+)
+
+install_subdir('dicts',
+  install_dir: get_option('datadir') / 'tsearch_data',
+  strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..cef26eb564b
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'backend_progress.c',
+  'backend_status.c',
+  'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..e1cea1eb4e4
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,118 @@
+backend_sources += files(
+  'acl.c',
+  'amutils.c',
+  'array_expanded.c',
+  'array_selfuncs.c',
+  'array_typanalyze.c',
+  'array_userfuncs.c',
+  'arrayfuncs.c',
+  'arraysubs.c',
+  'arrayutils.c',
+  'ascii.c',
+  'bool.c',
+  'cash.c',
+  'char.c',
+  'cryptohashfuncs.c',
+  'date.c',
+  'datetime.c',
+  'datum.c',
+  'dbsize.c',
+  'domains.c',
+  'encode.c',
+  'enum.c',
+  'expandeddatum.c',
+  'expandedrecord.c',
+  'float.c',
+  'format_type.c',
+  'formatting.c',
+  'genfile.c',
+  'geo_ops.c',
+  'geo_selfuncs.c',
+  'geo_spgist.c',
+  'inet_cidr_ntop.c',
+  'inet_net_pton.c',
+  'int.c',
+  'int8.c',
+  'json.c',
+  'jsonb.c',
+  'jsonb_gin.c',
+  'jsonb_op.c',
+  'jsonb_util.c',
+  'jsonfuncs.c',
+  'jsonbsubs.c',
+  'jsonpath.c',
+  'jsonpath_exec.c',
+  'like.c',
+  'like_support.c',
+  'lockfuncs.c',
+  'mac.c',
+  'mac8.c',
+  'mcxtfuncs.c',
+  'misc.c',
+  'multirangetypes.c',
+  'multirangetypes_selfuncs.c',
+  'name.c',
+  'network.c',
+  'network_gist.c',
+  'network_selfuncs.c',
+  'network_spgist.c',
+  'numeric.c',
+  'numutils.c',
+  'oid.c',
+  'oracle_compat.c',
+  'orderedsetaggs.c',
+  'partitionfuncs.c',
+  'pg_locale.c',
+  'pg_lsn.c',
+  'pg_upgrade_support.c',
+  'pgstatfuncs.c',
+  'pseudotypes.c',
+  'quote.c',
+  'rangetypes.c',
+  'rangetypes_gist.c',
+  'rangetypes_selfuncs.c',
+  'rangetypes_spgist.c',
+  'rangetypes_typanalyze.c',
+  'regexp.c',
+  'regproc.c',
+  'ri_triggers.c',
+  'rowtypes.c',
+  'ruleutils.c',
+  'selfuncs.c',
+  'tid.c',
+  'timestamp.c',
+  'trigfuncs.c',
+  'tsginidx.c',
+  'tsgistidx.c',
+  'tsquery.c',
+  'tsquery_cleanup.c',
+  'tsquery_gist.c',
+  'tsquery_op.c',
+  'tsquery_rewrite.c',
+  'tsquery_util.c',
+  'tsrank.c',
+  'tsvector.c',
+  'tsvector_op.c',
+  'tsvector_parser.c',
+  'uuid.c',
+  'varbit.c',
+  'varchar.c',
+  'varlena.c',
+  'version.c',
+  'windowfuncs.c',
+  'xid.c',
+  'xid8funcs.c',
+  'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+  input: ['jsonpath_scan.l'],
+  output: ['jsonpath_scan.c'],
+  command: [flex, '-b', '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+# jsonpath_scan is compiled as part of jsonpath_gram
+generated_backend_sources += custom_target('jsonpath_parse',
+  input: ['jsonpath_gram.y', jsonpath_scan[0]],
+  output: ['jsonpath_gram.c'],
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..92972db52ad
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'attoptcache.c',
+  'catcache.c',
+  'evtcache.c',
+  'inval.c',
+  'lsyscache.c',
+  'partcache.c',
+  'plancache.c',
+  'relcache.c',
+  'relfilenodemap.c',
+  'relmapper.c',
+  'spccache.c',
+  'syscache.c',
+  'ts_cache.c',
+  'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..ff0ae388263
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'assert.c',
+  'elog.c',
+  )
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'dfmgr.c',
+  'fmgr.c',
+  'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'dynahash.c',
+  'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'globals.c',
+  'miscinit.c',
+  'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..b84a78b6318
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,38 @@
+encodings = {
+  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+  'euc_tw_and_big5': [
+    'euc_tw_and_big5/euc_tw_and_big5.c',
+    'euc_tw_and_big5/big5.c',
+  ],
+  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+  backend_targets += shared_module(encoding,
+    sources,
+    kwargs: pg_mod_args + {
+    }
+  )
+
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'conv.c',
+  'mbutils.c',
+  'stringinfo_mb.c',
+  'wstrcmp.c',
+  'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..afb1c0346ba
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,13 @@
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..2c0090ad337
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'help_config.c',
+  'pg_config.c',
+  'pg_controldata.c',
+  'pg_rusage.c',
+  'ps_status.c',
+  'queryenvironment.c',
+  'queryjumble.c',
+  'rls.c',
+  'sampling.c',
+  'superuser.c',
+  'timeout.c',
+  'tzparser.c',
+  'guc.c',
+)
+
+# guc-file.c.h is compiled as part of guc.c
+guc_scan = custom_target('guc_scan',
+  input: ['guc-file.l'],
+  output: ['guc-file.c.h'],
+  command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
+
+generated_backend_sources += guc_scan
+
+backend_build_deps += declare_dependency(sources: [guc_scan],
+  include_directories: include_directories('.'))
+
+install_data('postgresql.conf.sample', install_dir: 'share/')
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'aset.c',
+  'dsa.c',
+  'freepage.c',
+  'generation.c',
+  'mcxt.c',
+  'memdebug.c',
+  'portalmem.c',
+  'slab.c',
+)
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..b626bdc9d96
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'logtape.c',
+  'sharedtuplestore.c',
+  'sortsupport.c',
+  'tuplesort.c',
+  'tuplestore.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'combocid.c',
+  'snapmgr.c',
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..52f679e3116
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,24 @@
+initdb_sources = files(
+  'findtimezone.c',
+  'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+executable('initdb',
+  initdb_sources,
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'initdb',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_initdb.pl'
+  ]
+}
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..5fd5a9d2f98
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..69eaef8f141
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,22 @@
+pg_amcheck_sources = files(
+  'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+  pg_amcheck_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_nonesuch.pl',
+    't/003_check.pl',
+    't/004_verify_heapam.pl',
+    't/005_opclass_damage.pl',
+  ]
+}
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..27742fafab7
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,14 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+  ['pg_archivecleanup.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_archivecleanup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/010_pg_archivecleanup.pl'
+  ]
+}
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..a629b8b02f5
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,44 @@
+common_sources = files(
+  'receivelog.c',
+  'streamutil.c',
+  'walmethods.c',
+)
+
+pg_basebackup_common = static_library('pg_basebackup_common',
+  common_sources,
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+executable('pg_basebackup',
+  'pg_basebackup.c',
+  link_with: [pg_basebackup_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+executable('pg_receivewal',
+  'pg_receivewal.c',
+  link_with: [pg_basebackup_common],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+executable('pg_recvlogical',
+  'pg_recvlogical.c',
+  link_with: [pg_basebackup_common],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'pg_basebackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env': {'GZIP_PROGRAM': gzip.path(), 'TAR': tar.path()},
+  'tests': [
+    't/010_pg_basebackup.pl',
+    't/020_pg_receivewal.pl',
+    't/030_pg_recvlogical.pl',
+  ]
+}
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..bbf9582b904
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,16 @@
+executable('pg_checksums',
+  ['pg_checksums.c'],
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_checksums',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_actions.pl'
+  ]
+}
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..df0eb13f636
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,14 @@
+executable('pg_config',
+  ['pg_config.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_config',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_pg_config.pl',
+  ]
+}
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..fa6057afa54
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,14 @@
+executable('pg_controldata',
+  ['pg_controldata.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_controldata',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_pg_controldata.pl'
+  ]
+}
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..ac0d4f18192
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,17 @@
+executable('pg_ctl',
+  ['pg_ctl.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_ctl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_start_stop.pl',
+    't/002_status.pl',
+    't/003_promote.pl',
+    't/004_logrotate.pl'
+  ]
+}
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..ce5ef11eaeb
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,69 @@
+pg_dump_common_sources = files(
+  'compress_io.c',
+  'dumputils.c',
+  'parallel.c',
+  'pg_backup_archiver.c',
+  'pg_backup_custom.c',
+  'pg_backup_db.c',
+  'pg_backup_directory.c',
+  'pg_backup_null.c',
+  'pg_backup_tar.c',
+  'pg_backup_utils.c',
+)
+
+pg_dump_common = static_library('pg_dump_common',
+  pg_dump_common_sources,
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+pg_dump_sources = files(
+  'pg_dump.c',
+  'common.c',
+  'pg_dump_sort.c',
+)
+
+executable('pg_dump',
+  pg_dump_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_dumpall_sources = files(
+  'pg_dumpall.c',
+)
+
+executable('pg_dumpall',
+  pg_dumpall_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_restore_sources = files(
+  'pg_restore.c',
+)
+
+executable('pg_restore',
+  pg_restore_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+tap_tests += {
+  'name': 'pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_pg_dump.pl',
+    't/003_pg_dump_with_server.pl',
+    't/010_dump_connstr.pl',
+  ]
+}
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..7450c0f6432
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,15 @@
+executable('pg_resetwal',
+  files('pg_resetwal.c'),
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_resetwal',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_corrupted.pl'
+  ]
+}
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..c7c59e9e523
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,34 @@
+pg_rewind_sources = files(
+  'datapagemap.c',
+  'file_ops.c',
+  'filemap.c',
+  'libpq_source.c',
+  'local_source.c',
+  'parsexlog.c',
+  'pg_rewind.c',
+  'timeline.c',
+  '../../backend/access/transam/xlogreader.c',
+)
+
+pg_rewind = executable('pg_rewind',
+  pg_rewind_sources,
+  dependencies: [frontend_code, libpq, lz4],
+  kwargs: default_bin_args,
+)
+
+
+tap_tests += {
+  'name': 'pg_rewind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_databases.pl',
+    't/003_extrafiles.pl',
+    't/004_pg_xlog_symlink.pl',
+    't/005_same_timeline.pl',
+    't/006_options.pl',
+    't/007_standby_source.pl',
+    't/008_min_recovery_point.pl',
+  ]
+}
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..527be88d125
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,14 @@
+executable('pg_test_fsync',
+  ['pg_test_fsync.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name' : 'pg_test_fsync',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_basic.pl',
+  ]
+}
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..c74577df493
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,14 @@
+pg_test_timing = executable('pg_test_timing',
+  ['pg_test_timing.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_test_timing',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl'
+  ]
+}
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..88d0e03446b
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,26 @@
+pg_upgrade_sources = files(
+  'check.c',
+  'controldata.c',
+  'dump.c',
+  'exec.c',
+  'file.c',
+  'function.c',
+  'info.c',
+  'option.c',
+  'parallel.c',
+  'pg_upgrade.c',
+  'relfilenode.c',
+  'server.c',
+  'tablespace.c',
+  'util.c',
+  'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+  pg_upgrade_sources,
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+# FIXME: add test
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..c7039ddcc49
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,25 @@
+pg_verifybackup_sources = files(
+  'parse_manifest.c',
+  'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+  pg_verifybackup_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_verifybackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+    't/002_algorithm.pl',
+    't/003_corruption.pl',
+    't/004_options.pl',
+    't/005_bad_manifest.pl',
+    't/006_encoding.pl',
+    't/007_wal.pl',
+  ]
+}
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..f89139f89f5
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,23 @@
+pg_waldump_sources = files(
+  'compat.c',
+  'pg_waldump.c',
+  'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+
+pg_waldump = executable('pg_waldump',
+  pg_waldump_sources,
+  dependencies: [frontend_code, lz4],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'pg_waldump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_basic.pl',
+  ]
+}
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..bc135abebfc
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,38 @@
+pgbench_sources = files(
+  'pgbench.c',
+)
+
+# exprscan is compiled as part ofexprparse. The ordering is enforced by making
+# the generation of grammar depend on the scanner generation. That's
+# unnecessarily strict, but overall harmless.
+
+exprscan = custom_target('exprscan',
+  input : files('exprscan.l'),
+  output : ['exprscan.c'],
+  command : [flex, '-o', '@OUTPUT0@', '@INPUT@']
+)
+
+exprparse = custom_target('exprparse',
+  input: 'exprparse.y',
+  output: 'exprparse.c',
+  depends: exprscan,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+pgbench_sources += exprparse
+
+executable('pgbench',
+  pgbench_sources,
+  dependencies: [frontend_code, libpq, thread_dep],
+  include_directories: include_directories('.'),
+  kwargs: default_bin_args,
+)
+
+
+tap_tests += {
+  'name' : 'pgbench',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' :[
+    't/001_pgbench_with_server.pl',
+    't/002_pgbench_no_server.pl'
+  ]
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..b35287d074b
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,32 @@
+if host_machine.system() != 'windows'
+  subdir_done()
+endif
+
+pgevent_sources = files(
+    'pgevent.c',
+)
+
+pgevent_cdata = rc_lib_cdata
+pgevent_cdata.set_quoted('FILEDESC', 'Eventlog message formatter')
+pgevent_cdata.set_quoted('INTERNAL_NAME', 'pgevent')
+pgevent_cdata.set_quoted('ORIGINAL_NAME', 'pgevent.dll')
+
+configure_file(
+  output: 'win32ver.rc',
+  input: win32ver_rc_in,
+  configuration: pgevent_cdata
+)
+
+pgevent_sources += windows.compile_resources(
+  'pgmsgevent.rc',
+  include_directories: [include_directories('.'), postgres_inc],
+)
+
+shared_library('pgevent',
+  pgevent_sources,
+  dependencies: [frontend_code],
+  vs_module_defs: 'pgevent.def',
+  kwargs: default_lib_args + {
+    'name_prefix': '',
+  },
+)
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..75905a52c13
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,65 @@
+psql_sources = files(
+  'command.c',
+  'common.c',
+  'copy.c',
+  'crosstabview.c',
+  'describe.c',
+  'help.c',
+  'input.c',
+  'large_obj.c',
+  'mainloop.c',
+  'prompt.c',
+  'startup.c',
+  'stringutils.c',
+  'tab-complete.c',
+  'variables.c',
+)
+
+psql_sources += custom_target('psqlscanslash',
+  input: ['psqlscanslash.l'],
+  output: ['psqlscanslash.c'],
+  command: [flex, '-b', '-Cfe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+psql_sources += custom_target('psql_help',
+  input: ['create_help.pl'],
+  output: ['sql_help.c', 'sql_help.h'],
+  depfile: 'sql_help.dep',
+  command: [perl, '@INPUT0@', '@SOURCE_ROOT@/doc/src/sgml/ref', '@OUTDIR@', 'sql_help'])
+
+if host_machine.system() == 'windows'
+  psql_cdata = rc_bin_cdata
+  psql_cdata.set_quoted('FILEDESC', 'psql - the PostgreSQL interactive terminal')
+  psql_cdata.set_quoted('INTERNAL_NAME', 'psql')
+  psql_cdata.set_quoted('ORIGINAL_NAME', 'psql.exe')
+
+  win32_ver_rc = configure_file(
+    output: 'win32ver.rc',
+    input: win32ver_rc_in,
+    configuration: psql_cdata
+  )
+
+  psql_sources += windows.compile_resources(
+    win32_ver_rc,
+    include_directories: postgres_inc,
+  )
+endif
+
+executable('psql',
+  psql_sources,
+  c_pch: '../../include/pch/c_pch.h',
+  include_directories: include_directories('.'),
+  dependencies : [frontend_code, libpq, readline],
+  kwargs: default_bin_args,
+)
+
+tap_tests += {
+  'name': 'psql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+  'tests': [
+    't/001_basic.pl',
+    't/010_tab_completion.pl',
+    't/020_cancel.pl',
+  ],
+}
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..547a53500a4
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,46 @@
+scripts_common = static_library('scripts_common',
+  files('common.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: internal_lib_args,
+)
+
+binaries = [
+  'createdb',
+  'dropdb',
+  'createuser',
+  'dropuser',
+  'clusterdb',
+  'vacuumdb',
+  'reindexdb',
+  'pg_isready',
+]
+
+foreach binary : binaries
+  executable(binary,
+    files(binary + '.c'),
+    link_with: [scripts_common],
+    dependencies: [frontend_code, libpq],
+    kwargs: default_bin_args,
+  )
+endforeach
+
+tap_tests += {
+  'name': 'scripts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/010_clusterdb.pl',
+    't/011_clusterdb_all.pl',
+    't/020_createdb.pl',
+    't/040_createuser.pl',
+    't/050_dropdb.pl',
+    't/070_dropuser.pl',
+    't/080_pg_isready.pl',
+    't/090_reindexdb.pl',
+    't/091_reindexdb_all.pl',
+    't/100_vacuumdb.pl',
+    't/101_vacuumdb_all.pl',
+    't/102_vacuumdb_stages.pl',
+    't/200_connstr.pl',
+  ]
+}
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..bb48a3c50a0
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,155 @@
+common_sources = files(
+  'archive.c',
+  'base64.c',
+  'checksum_helper.c',
+  'config_info.c',
+  'controldata_utils.c',
+  'encnames.c',
+  'exec.c',
+  'file_perm.c',
+  'file_utils.c',
+  'hashfn.c',
+  'ip.c',
+  'jsonapi.c',
+  'keywords.c',
+  'kwlookup.c',
+  'link-canary.c',
+  'md5_common.c',
+  'pg_get_line.c',
+  'pg_lzcompress.c',
+  'pgfnames.c',
+  'psprintf.c',
+  'relpath.c',
+  'rmtree.c',
+  'saslprep.c',
+  'scram-common.c',
+  'string.c',
+  'stringinfo.c',
+  'unicode_norm.c',
+  'username.c',
+  'wait_error.c',
+  'wchar.c',
+)
+
+# FIXME: implement openssl
+if ssl.found()
+  common_sources += files(
+    'cryptohash_openssl.c',
+    'hmac_openssl.c',
+    'protocol_openssl.c',
+  )
+else
+  common_sources += files(
+    'cryptohash.c',
+    'hmac.c',
+    'md5.c',
+    'sha1.c',
+    'sha2.c',
+  )
+endif
+
+common_sources += custom_target('kwlist',
+  input: files('../include/parser/kwlist.h'),
+  output: 'kwlist_d.h',
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+      '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+  'd2s.c',
+  'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+  ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+common_cflags = {'ryu': ryu_cflags}
+common_sources_cflags = {'ryu': ryu_sources}
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+  'fe_memutils.c',
+  'restricted_token.c',
+  'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+  'logging.c',
+)
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+#
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+#
+# For the server build of pgcommon, depend on lwlocknames_h, because at least
+# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a
+# layering violation, but ...
+pgcommon = {}
+pgcommon_variants = {
+  'srv' : internal_lib_args + {
+    'sources': common_sources + [lwlocknames_h],
+    'dependencies': [backend_common_code],
+   },
+  'static' : default_lib_args + {
+    'sources': common_sources_frontend_static,
+    'dependencies': [frontend_common_code],
+   },
+  'shlib' : default_lib_args + {
+    'pic': true,
+    'sources': common_sources_frontend_shlib,
+    'dependencies': [frontend_common_code],
+   },
+}
+
+foreach name, opts : pgcommon_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources: common_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + common_cflags[cflagname]
+    cflag_libs += static_library('pgcommon_@0@_@1@'.format(cflagname, name),
+      c_pch: '../include/pch/c_pch.h',
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'sources': sources,
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('pgcommon_@0@'.format(name),
+      link_with: cflag_libs,
+      c_pch: '../include/pch/c_pch.h',
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgcommon += {name: lib}
+endforeach
+
+common_srv = pgcommon['srv']
+common_shlib = pgcommon['shlib']
+common_static = pgcommon['static']
+
+subdir('unicode')
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
new file mode 100644
index 00000000000..e8145e138c0
--- /dev/null
+++ b/src/common/unicode/meson.build
@@ -0,0 +1,99 @@
+# These files are part of the Unicode Character Database. Download
+# them on demand.
+
+UNICODE_VERSION = '14.0.0'
+
+unicode_data = {}
+unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
+
+if not wget.found()
+  subdir_done()
+endif
+
+foreach f : ['UnicodeData.txt', 'EastAsianWidth.txt', 'DerivedNormalizationProps.txt', 'CompositionExclusions.txt', 'NormalizationTest.txt']
+  url = unicode_baseurl.format(UNICODE_VERSION, f)
+  target = custom_target(f,
+    output: f,
+    command: [wget, wget_flags, url],
+    build_by_default: false,
+  )
+  unicode_data += {f: target}
+endforeach
+
+
+update_unicode_targets = []
+
+update_unicode_targets += \
+  custom_target('unicode_norm_table.h',
+    input: [unicode_data['UnicodeData.txt'], unicode_data['CompositionExclusions.txt']],
+    output: ['unicode_norm_table.h', 'unicode_norm_hashfunc.h'],
+    command: [perl, files('generate-unicode_norm_table.pl'), '@OUTDIR@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_combining_table.h',
+    input: [unicode_data['UnicodeData.txt']],
+    output: ['unicode_combining_table.h'],
+    command: [perl, files('generate-unicode_combining_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_east_asian_fw_table.h',
+    input: [unicode_data['EastAsianWidth.txt']],
+    output: ['unicode_east_asian_fw_table.h'],
+    command: [perl, files('generate-unicode_east_asian_fw_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_normprops_table.h',
+    input: [unicode_data['DerivedNormalizationProps.txt']],
+    output: ['unicode_normprops_table.h'],
+    command: [perl, files('generate-unicode_normprops_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+norm_test_table = custom_target('norm_test_table.h',
+    input: [unicode_data['NormalizationTest.txt']],
+    output: ['norm_test_table.h'],
+    command: [perl, files('generate-norm_test_table.pl'), '@INPUT@', '@OUTPUT@'],
+    build_by_default: false,
+  )
+
+inc = include_directories('.')
+
+norm_test = executable('norm_test',
+  ['norm_test.c', norm_test_table],
+  dependencies: [frontend_port_code],
+  include_directories: inc,
+  link_with: [pgport_static, common_static],
+  build_by_default: false,
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+if not meson.is_cross_build()
+  norm_test_valid = custom_target('norm_test.valid',
+    output: 'norm_test.valid',
+    depends: update_unicode_targets,
+    command: [norm_test],
+    build_by_default: false,
+    capture: true,
+  )
+
+  run_target('update-unicode',
+    depends: norm_test_valid,
+    command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+  )
+else
+  run_target('update-unicode',
+    depends: update_unicode_targets,
+    command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+  )
+endif
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..e3f0b34cf13
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,27 @@
+fe_utils_sources = files(
+  'archive.c',
+  'cancel.c',
+  'conditional.c',
+  'connect_utils.c',
+  'mbprint.c',
+  'option_utils.c',
+  'parallel_slot.c',
+  'print.c',
+  'query_utils.c',
+  'recovery_gen.c',
+  'simple_list.c',
+  'string_utils.c',
+)
+
+fe_utils_sources += custom_target('psqlscan',
+  input: ['psqlscan.l'],
+  output: ['psqlscan.c'],
+  command: [flex, '-b', '-Cfe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@'])
+
+fe_utils = static_library('fe_utils',
+  fe_utils_sources + generated_headers,
+  c_pch: '../include/pch/c_pch.h',
+  include_directories :  [postgres_inc, libpq_inc],
+  c_args: ['-DFRONTEND'],
+  kwargs: default_lib_args,
+)
diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..f5bc294c814
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,129 @@
+catalog_headers = [
+  'pg_proc.h',
+  'pg_type.h',
+  'pg_attribute.h',
+  'pg_class.h',
+  'pg_attrdef.h',
+  'pg_constraint.h',
+  'pg_inherits.h',
+  'pg_index.h',
+  'pg_operator.h',
+  'pg_opfamily.h',
+  'pg_opclass.h',
+  'pg_am.h',
+  'pg_amop.h',
+  'pg_amproc.h',
+  'pg_language.h',
+  'pg_largeobject_metadata.h',
+  'pg_largeobject.h',
+  'pg_aggregate.h',
+  'pg_statistic.h',
+  'pg_statistic_ext.h',
+  'pg_statistic_ext_data.h',
+  'pg_rewrite.h',
+  'pg_trigger.h',
+  'pg_event_trigger.h',
+  'pg_description.h',
+  'pg_cast.h',
+  'pg_enum.h',
+  'pg_namespace.h',
+  'pg_conversion.h',
+  'pg_depend.h',
+  'pg_database.h',
+  'pg_db_role_setting.h',
+  'pg_tablespace.h',
+  'pg_authid.h',
+  'pg_auth_members.h',
+  'pg_shdepend.h',
+  'pg_shdescription.h',
+  'pg_ts_config.h',
+  'pg_ts_config_map.h',
+  'pg_ts_dict.h',
+  'pg_ts_parser.h',
+  'pg_ts_template.h',
+  'pg_extension.h',
+  'pg_foreign_data_wrapper.h',
+  'pg_foreign_server.h',
+  'pg_user_mapping.h',
+  'pg_foreign_table.h',
+  'pg_policy.h',
+  'pg_replication_origin.h',
+  'pg_default_acl.h',
+  'pg_init_privs.h',
+  'pg_seclabel.h',
+  'pg_shseclabel.h',
+  'pg_collation.h',
+  'pg_partitioned_table.h',
+  'pg_range.h',
+  'pg_transform.h',
+  'pg_sequence.h',
+  'pg_publication.h',
+  'pg_publication_namespace.h',
+  'pg_publication_rel.h',
+  'pg_subscription.h',
+  'pg_subscription_rel.h',
+]
+
+bki_data = files(
+  'pg_aggregate.dat',
+  'pg_am.dat',
+  'pg_amop.dat',
+  'pg_amproc.dat',
+  'pg_authid.dat',
+  'pg_cast.dat',
+  'pg_class.dat',
+  'pg_collation.dat',
+  'pg_conversion.dat',
+  'pg_database.dat',
+  'pg_language.dat',
+  'pg_namespace.dat',
+  'pg_opclass.dat',
+  'pg_operator.dat',
+  'pg_opfamily.dat',
+  'pg_proc.dat',
+  'pg_range.dat',
+  'pg_tablespace.dat',
+  'pg_ts_config.dat',
+  'pg_ts_config_map.dat',
+  'pg_ts_dict.dat',
+  'pg_ts_parser.dat',
+  'pg_ts_template.dat',
+  'pg_type.dat',
+  )
+
+
+input = []
+output_files = ['postgres.bki', 'schemapg.h', 'system_fk_info.h', 'system_constraints.sql']
+output_install = [get_option('datadir'), get_option('includedir'), get_option('includedir'), get_option('datadir')]
+
+foreach h : catalog_headers
+  fname = h.split('.h')[0]+'_d.h'
+  input += files(h)
+  output_files += fname
+  output_install += get_option('includedir')
+endforeach
+
+generated_headers += custom_target('generated_catalog_headers',
+    input: input,
+    depend_files: bki_data,
+    build_by_default: true,
+    install: true,
+    output: output_files,
+    install_dir: output_install,
+    command: [perl, files('../../backend/catalog/genbki.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--set-version='+pg_version_major.to_string(), '--output=@OUTDIR@', '@INPUT@']
+    )
+
+
+# 'reformat-dat-files' is a convenience target for rewriting the
+# catalog data files in our standard format.  This includes collapsing
+# out any entries that are redundant with a BKI_DEFAULT annotation.
+run_target('reformat-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data],
+)
+
+# 'expand-dat-files' is a convenience target for expanding out all
+# default values in the catalog data files.  This should be run before
+# altering or removing any BKI_DEFAULT annotation.
+run_target('expand-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data, '--full-tuples'],
+)
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..c3af4a2574f
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,50 @@
+configure_file(input : 'pg_config_ext.h.meson',
+  output : 'pg_config_ext.h',
+  configuration : cdata)
+
+system = host_machine.system()
+if system == 'windows'
+  system = 'win32'
+endif
+
+configure_file(
+  output : 'pg_config_os.h',
+  input: files('port/@0@.h'.format(system)),
+  install: true,
+  install_dir : get_option('includedir'),
+  copy : true)
+
+configure_file(
+  output : 'pg_config.h',
+  install : true,
+  install_dir : get_option('includedir'),
+  configuration : cdata)
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', get_option('prefix') / get_option('bindir'))
+config_paths_data.set_quoted('PGSHAREDIR', get_option('prefix') / get_option('datadir'))
+config_paths_data.set_quoted('SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
+config_paths_data.set_quoted('INCLUDEDIR', get_option('prefix') / get_option('includedir'))
+# FIXME: shouldn't be the same
+config_paths_data.set_quoted('PKGINCLUDEDIR', get_option('prefix') / get_option('includedir'))
+config_paths_data.set_quoted('INCLUDEDIRSERVER', get_option('prefix') / get_option('includedir'))
+config_paths_data.set_quoted('LIBDIR', get_option('prefix') / get_option('libdir'))
+# FIXME: figure out logic for pkglibdir
+config_paths_data.set_quoted('PKGLIBDIR', get_option('prefix') / get_option('libdir'))
+config_paths_data.set_quoted('LOCALEDIR', get_option('prefix') / get_option('localedir'))
+config_paths_data.set_quoted('DOCDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql')
+config_paths_data.set_quoted('HTMLDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql')
+config_paths_data.set_quoted('MANDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql')
+
+configure_file(
+  output: 'pg_config_paths.h',
+  configuration: config_paths_data,
+  install: false
+)
+
+
+subdir('utils')
+subdir('storage')
+subdir('catalog')
+subdir('parser')
diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build
new file mode 100644
index 00000000000..caf4c092909
--- /dev/null
+++ b/src/include/parser/meson.build
@@ -0,0 +1,10 @@
+backend_parser_header = custom_target('gram',
+  input: [files('../../backend/parser/gram.y')],
+  output: ['gram.c', 'gram.h'],
+  command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT0@'],
+  install: true,
+  # Only install gram.h, not gram.c
+  install_dir: [false, get_option('includedir')]
+)
+
+#generated_backend_headers += backend_parser[1]
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in.  This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..ef2bbb7c6f7
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,16 @@
+# FIXME: this creates an unnecessary lwlocknames.c - but it's not
+# obvious how to avoid that: meson insist on output files being in the
+# current dir.
+
+lwlocknames = custom_target('lwlocknames',
+  input : files('../../backend/storage/lmgr/lwlocknames.txt'),
+  output : ['lwlocknames.h', 'lwlocknames.c'],
+  command : [perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@'],
+  build_by_default: true,
+  install: true,
+  install_dir: [get_option('includedir'), false],
+)
+
+lwlocknames_h = lwlocknames[0]
+
+generated_backend_headers += lwlocknames_h
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..b9c959b474d
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,22 @@
+errcodes = custom_target('errcodes',
+  input : files('../../backend/utils/errcodes.txt'),
+  output : ['errcodes.h'],
+  command : [perl, files('../../backend/utils/generate-errcodes.pl'), '@INPUT@', '@OUTPUT@']
+)
+generated_headers += errcodes
+
+generated_backend_headers += custom_target('probes.d',
+  input: files('../../backend/utils/probes.d'),
+  output : 'probes.h',
+  capture: true,
+  command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@']
+)
+
+fmgrtab_target = custom_target('fmgrtab',
+  input: '../catalog/pg_proc.dat',
+  output : ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@']
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..4b716f0e89d
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,99 @@
+libpq_sources = files(
+  'fe-auth-scram.c',
+  'fe-connect.c',
+  'fe-exec.c',
+  'fe-lobj.c',
+  'fe-misc.c',
+  'fe-print.c',
+  'fe-protocol3.c',
+  'fe-secure.c',
+  'fe-trace.c',
+  'legacy-pqsignal.c',
+  'libpq-events.c',
+  'pqexpbuffer.c',
+  'fe-auth.c',
+)
+
+if host_machine.system() == 'windows'
+  libpq_sources += files('win32.c', 'pthread-win32.c')
+endif
+
+if ssl.found()
+  libpq_sources += files('fe-secure-common.c')
+  libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+  libpq_sources += files(
+    'fe-secure-gssapi.c',
+    'fe-gssapi-common.c'
+  )
+endif
+
+export_file = custom_target('libpq_exports.list',
+  input: [files('exports.txt')],
+  output: ['@BASENAME@.list'],
+  command: [perl, files('../../tools/gen_versioning_script.pl'),
+    host_machine.system() == 'darwin' ? 'darwin' : 'gnu',
+    '@INPUT0@', '@OUTPUT0@'],
+  build_by_default: false,
+  install: false,
+)
+
+libpq_def = custom_target('libpq.def',
+  command: [perl, files('../../tools/msvc/export2def.pl'), '@OUTPUT@', '@INPUT0@', 'libpq'],
+  input: files('exports.txt'),
+  output: 'libpq.def',
+  build_by_default: false,
+  install: false,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+libpq_deps = [frontend_shlib_code, thread_dep, ssl, ldap, gssapi]
+libpq_link_depends = []
+
+libpq_kwargs = default_lib_args + {
+  'version': '5.'+pg_version_major.to_string(),
+}
+
+
+if host_machine.system() == 'darwin'
+  libpq_kwargs = libpq_kwargs + {
+    'link_args': ['-exported_symbols_list', export_file.full_path()],
+    'link_depends': export_file,
+    'soversion': '5',
+  }
+elif host_machine.system() == 'windows'
+  libpq_deps += cc.find_library('secur32', required: true)
+
+  libpq_kwargs = libpq_kwargs + {
+    'vs_module_defs': libpq_def,
+    'soversion': '',
+  }
+else
+  libpq_kwargs = libpq_kwargs + {
+    'link_args': '-Wl,--version-script=' + export_file.full_path(),
+    'link_depends': export_file,
+    'soversion': '5',
+  }
+endif
+
+libpq_so = shared_library('pq',
+  libpq_sources,
+  include_directories : [libpq_inc, postgres_inc],
+  c_args: ['-DFRONTEND'],
+  c_pch: '../../include/pch/c_pch.h',
+  dependencies: libpq_deps,
+  kwargs: libpq_kwargs,
+)
+
+libpq = declare_dependency(
+  link_with: [libpq_so],
+  include_directories: [include_directories('.')]
+)
+
+install_headers('libpq-fe.h', 'libpq-events.h')
+# FIXME: adjust path
+install_headers('libpq-int.h', 'pqexpbuffer.h')
+install_data('pg_service.conf.sample', install_dir: get_option('datadir'))
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..414be1db419
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,10 @@
+# libraries that other subsystems might depend uppon first, in their
+# respective dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..b720e922093
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,4 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..a5a994e845f
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,81 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+plperl_sources = files(
+  'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+  check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(subppdir)
+
+plperl_sources += custom_target('perlchunks.h',
+  input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+  output: 'perlchunks.h',
+  capture: true,
+  command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+  input: files('plperl_opmask.pl'),
+  output: 'plperl_opmask.h',
+  command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+  xs = files(n+'.xs')
+  xs_c_name = n+'.c'
+
+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?
+  xs_c = custom_target(xs_c_name,
+    input: xs,
+    output: xs_c_name,
+    command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+  )
+  plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+shared_module('plperl',
+  plperl_sources,
+  c_pch: '../../include/pch/postgres_pch.h',
+  include_directories: [plperl_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, pg_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'plperl.control',
+  'plperl--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+install_data(
+  'plperlu.control',
+  'plperlu--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+regress_tests += {
+  'name': 'plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'plperl_setup',
+    'plperl',
+    'plperl_lc',
+    'plperl_trigger',
+    'plperl_shared',
+    'plperl_elog',
+    'plperl_util',
+    'plperl_init',
+    'plperlu',
+    'plperl_array',
+    'plperl_call',
+    'plperl_transaction',
+   ],
+}
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..b040e5e8507
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,67 @@
+plpgsql_sources = files(
+  'pl_comp.c',
+  'pl_exec.c',
+  'pl_funcs.c',
+  'pl_handler.c',
+  'pl_scanner.c',
+)
+
+plpgsql_sources += custom_target('gram',
+  input: ['pl_gram.y'],
+  output: ['pl_gram.c', 'pl_gram.h'],
+  command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT0@'])
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+plpgsql_sources += custom_target('plerrcodes',
+  input: ['../../../../src/backend/utils/errcodes.txt'],
+  output: ['plerrcodes.h'],
+  command: [perl, gen_plerrcodes, '@INPUT0@'],
+  capture: true)
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+plpgsql_sources += custom_target('pl_reserved_kwlist',
+  input: ['pl_reserved_kwlist.h'],
+  output: ['pl_reserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+
+plpgsql_sources += custom_target('pl_unreserved_kwlist',
+  input: ['pl_unreserved_kwlist.h'],
+  output: ['pl_unreserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+
+shared_module('plpgsql',
+  plpgsql_sources,
+  c_pch: '../../../include/pch/postgres_pch.h',
+  include_directories: include_directories('.'),
+  kwargs: pg_mod_args,
+)
+
+install_data('plpgsql.control', 'plpgsql--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+install_headers('plpgsql.h',
+  install_dir: get_option('includedir') / 'server')
+
+
+regress_tests += {
+  'name': 'plpgsql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+     'plpgsql_array',
+     'plpgsql_call',
+     'plpgsql_control',
+     'plpgsql_copy',
+     'plpgsql_domain',
+     'plpgsql_record',
+     'plpgsql_cache',
+     'plpgsql_simple',
+     'plpgsql_transaction',
+     'plpgsql_trap',
+     'plpgsql_trigger',
+     'plpgsql_varprops',
+  ],
+}
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..48a02b532aa
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,78 @@
+if not python3.found()
+  subdir_done()
+endif
+
+plpython_sources = files(
+  'plpy_cursorobject.c',
+  'plpy_elog.c',
+  'plpy_exec.c',
+  'plpy_main.c',
+  'plpy_planobject.c',
+  'plpy_plpymodule.c',
+  'plpy_procedure.c',
+  'plpy_resultobject.c',
+  'plpy_spi.c',
+  'plpy_subxactobject.c',
+  'plpy_typeio.c',
+  'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+    input: files('../../backend/utils/errcodes.txt'),
+    output: 'spiexceptions.h',
+    command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+    capture: true
+  )
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+shared_module('plpython3',
+  plpython_sources,
+  c_pch: '../../include/pch/postgres_pch.h',
+  include_directories: [plpython_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [python3, pg_mod_args['dependencies']],
+  },
+)
+
+# FIXME: Only install the relevant versions
+install_data(
+  'plpython3u.control',
+  'plpython3u--1.0.sql',
+  install_dir: get_option('datadir') / 'extension'
+)
+
+plpython_regress = [
+  'plpython_schema',
+  'plpython_populate',
+  'plpython_test',
+  'plpython_do',
+  'plpython_global',
+  'plpython_import',
+  'plpython_spi',
+  'plpython_newline',
+  'plpython_void',
+  'plpython_call',
+  'plpython_params',
+  'plpython_setof',
+  'plpython_record',
+  'plpython_trigger',
+  'plpython_types',
+  'plpython_error',
+  'plpython_ereport',
+  'plpython_unicode',
+  'plpython_quote',
+  'plpython_composite',
+  'plpython_subtransaction',
+  'plpython_transaction',
+  'plpython_drop',
+]
+
+regress_tests += {
+  'name': 'plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': plpython_regress,
+}
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..c2f35c02f1f
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,191 @@
+pgport_sources = [
+  'bsearch_arg.c',
+  'chklocale.c',
+  'erand48.c',
+  'inet_net_ntop.c',
+  'noblock.c',
+  'path.c',
+  'pg_bitutils.c',
+  'pg_strong_random.c',
+  'pgcheckdir.c',
+  'pgmkdirp.c',
+  'pgsleep.c',
+  'pgstrcasecmp.c',
+  'pgstrsignal.c',
+  'pqsignal.c',
+  'qsort.c',
+  'qsort_arg.c',
+  'quotes.c',
+  'snprintf.c',
+  'strerror.c',
+  'tar.c',
+  'thread.c',
+]
+
+if host_machine.system() == 'windows'
+  pgport_sources += files(
+    'dirmod.c',
+    'kill.c',
+    'open.c',
+    'system.c',
+    'win32env.c',
+    'win32error.c',
+    'win32security.c',
+    'win32setlocale.c',
+    'win32stat.c',
+  )
+endif
+
+if cc.get_id() == 'msvc'
+  pgport_sources += files(
+    'dirent.c',
+  )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+    ['dlopen'],
+    ['explicit_bzero'],
+    ['fls'],
+    ['getaddrinfo'],
+    ['getopt'],
+    ['getopt_long'],
+    ['getpeereid'],
+    ['getpeereid'],
+    ['getrusage'],
+    ['gettimeofday'],
+    ['inet_aton'],
+    ['link'],
+    ['mkdtemp'],
+    ['pread'],
+    ['preadv', 'HAVE_DECL_PREADV'],
+    ['pwrite'],
+    ['pwritev', 'HAVE_DECL_PWRITEV'],
+    ['random'],
+    ['srandom'],
+    ['strlcat'],
+    ['strlcpy'],
+    ['strnlen'],
+]
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+  # x86/x64
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # arm / aarch64
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # generic fallback
+  ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
+]
+
+pgport_cflags = {'crc': cflags_crc}
+pgport_sources_cflags = {'crc': []}
+
+foreach f : replace_funcs_neg
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'false' or val == '0'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+foreach f : replace_funcs_pos
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'true' or val == '1'
+    src = files(filename)
+    if f.length() > 2
+      pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
+    else
+      pgport_sources += src
+    endif
+  endif
+endforeach
+
+
+if (host_machine.system() == 'windows' or host_machine.system() == 'cygwin') and \
+  (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+  # Cygwin and (apparently, based on test results) Mingw both
+  # have a broken strtof(), so substitute the same replacement
+  # code we use with VS2013. That's not a perfect fix, since
+  # (unlike with VS2013) it doesn't avoid double-rounding, but
+  # we have no better options. To get that, though, we have to
+  # force the file to be compiled despite HAVE_STRTOF.
+  pgport_sources += files('strtof.c')
+  message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+    host_machine.system(), cc.get_id(), cc.version()))
+endif
+
+if not cdata.has('HAVE_PTHREAD_BARRIER_WAIT') and host_machine.system() != 'windows'
+   pgport_sources += files('pthread_barrier_wait.c')
+endif
+
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+pgport = {}
+pgport_variants = {
+  'srv' : internal_lib_args + {
+    'dependencies': [backend_port_code],
+   },
+  'static' : default_lib_args + {
+    'dependencies': [frontend_port_code],
+   },
+  'shlib' : default_lib_args + {
+    'pic': true,
+    'dependencies': [frontend_port_code],
+   },
+}
+
+foreach name, opts : pgport_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources: pgport_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
+    cflag_libs += static_library('pgport_@0@_@1@'.format(cflagname, name),
+      sources,
+      c_pch: '../include/pch/c_pch.h',
+      kwargs: opts + {
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('pgport_@0@'.format(name),
+      pgport_sources,
+      link_with: cflag_libs,
+      c_pch: '../include/pch/c_pch.h',
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgport += {name: lib}
+endforeach
+
+pgport_srv = pgport['srv']
+pgport_static = pgport['static']
+pgport_shlib = pgport['shlib']
diff --git a/src/port/win32ver.rc.in b/src/port/win32ver.rc.in
new file mode 100644
index 00000000000..d5c98e2e8fb
--- /dev/null
+++ b/src/port/win32ver.rc.in
@@ -0,0 +1,41 @@
+#include <winver.h>
+#include "pg_config.h"
+
+// https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION    PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ PRODUCTVERSION PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ FILEFLAGSMASK  VS_FFI_FILEFLAGSMASK
+ FILEFLAGS      0x0L
+ FILEOS         VOS_NT_WINDOWS32
+ FILETYPE	@VFT_TYPE@
+ FILESUBTYPE    0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+  BLOCK "040904B0"			// U.S. English, Unicode
+  BEGIN
+   VALUE "CompanyName",      "PostgreSQL Global Development Group"
+   VALUE "FileDescription",  @FILEDESC@
+   /*
+    * XXX: In the autoconf / src/tools/msvc build this was set differently than
+    * ProductVersion below, using the current date. But that doesn't seem like a
+    * good idea, because it makes the build not reproducible and causes
+    * unnecessary rebuilds?
+    */
+   VALUE "FileVersion",      PG_VERSION
+   VALUE "InternalName",     @INTERNAL_NAME@
+   VALUE "LegalCopyright", "Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California."
+   VALUE "OriginalFileName", @ORIGINAL_NAME@
+   VALUE "ProductName",      "PostgreSQL"
+   VALUE "ProductVersion",   PG_VERSION
+  END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+  VALUE "Translation", 0x0409, 1200	// U.S. English, Unicode
+ END
+END
+
+IDI_ICON ICON @ICO@
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..be41fb314a5
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,9 @@
+tap_tests += {
+  'name': 'authentication',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_password.pl',
+    't/002_saslprep.pl',
+  ],
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..ea8baa20634
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,49 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+  'isolation_main.c',
+)
+
+# see src/backend/replication/meson.build for depend logic
+spec_scanner = custom_target('specscanner',
+  input : files('specscanner.l'),
+  output : ['specscanner.c'],
+  command : [flex, '-o', '@OUTPUT0@', '@INPUT@']
+)
+
+isolationtester_sources = files('isolationtester.c')
+isolationtester_sources += custom_target('specparse',
+  input: 'specparse.y',
+  output: 'specparse.c',
+  depends: spec_scanner,
+  command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@'])
+
+pg_isolation_regress = executable('pg_isolation_regress',
+  isolation_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+isolationtester = executable('isolationtester',
+  isolationtester_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+isolation_tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'schedule': files('isolation_schedule'),
+  'test_kwargs': {
+    'priority': 40,
+    'timeout': 1000,
+  },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..9f9957a3b4c
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,12 @@
+tap_tests += {
+  'name': 'kerberos',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_auth.pl',
+  ],
+  'env' : {
+    'with_gssapi': gssapi.found() ? 'yes' : 'no',
+    'with_krb_srvnam': 'postgres',
+  },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..58eb9adc6f5
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,9 @@
+tap_tests += {
+  'name': 'ldap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_auth.pl',
+  ],
+  'env' : {'with_ldap': ldap.found() ? 'yes' : 'no'},
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..f0b0d3d3b5e
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,19 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+   subdir('ssl')
+endif
+
+if ldap.found()
+   subdir('ldap')
+endif
+
+if gssapi.found()
+   subdir('kerberos')
+endif
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..99ccaac5b38
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,19 @@
+isolation_tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'summarization-and-inprogress-insertion',
+  ]
+}
+
+
+tap_tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/01_workitems.pl',
+  ],
+}
+
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..2794d837c35
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,20 @@
+regress_tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'commit_timestamp',
+  ]
+}
+
+tap_tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_base.pl',
+    't/002_standby.pl',
+    't/003_standby_2.pl',
+    't/004_restart.pl',
+  ],
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..58fe5a1a21d
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,15 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+  ['delay_execution.c'],
+  kwargs: pg_mod_args,
+)
+
+isolation_tests += {
+  'name': 'delay_execution',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'partition-addition',
+    'partition-removal-1',
+  ]
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..a9c49bd9554
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+  ['dummy_index_am.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_index_am.control',
+  'dummy_index_am--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dummy_index_am',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'reloptions',
+  ]
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..ed31d8f9530
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+  ['dummy_seclabel.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_seclabel.control',
+  'dummy_seclabel--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'dummy_seclabel',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'dummy_seclabel',
+  ]
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..2f850215a6f
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,21 @@
+libpq_pipeline = executable('libpq_pipeline',
+  files(
+    'libpq_pipeline.c',
+  ),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  },
+)
+
+tap_tests += {
+  'name': 'libpq_pipeline',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env': {
+    'PATH': meson.current_build_dir(),
+  },
+  'tests': [
+    't/001_libpq_pipeline.pl',
+  ]
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..c98225c6e7b
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,25 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_misc')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..3f70688fb89
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+  ['plsample.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plsample.control',
+  'plsample--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'plsample',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'plsample',
+  ]
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..cdf4afd18b8
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,11 @@
+isolation_tests += {
+  'name': 'snapshot_too_old',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'specs': [
+    'sto_using_cursor',
+    'sto_using_select',
+    'sto_using_hash_index',
+  ],
+  'regress_args': ['--temp-config', files('sto.conf')],
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..19aa00892f1
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+  ['spgist_name_ops.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'spgist_name_ops.control',
+  'spgist_name_ops--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'spgist_name_ops',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'spgist_name_ops',
+  ]
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..b9fa5ee1cdc
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,45 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+  ['ssl_passphrase_func.c'],
+  kwargs: pg_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  }
+)
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+  cert = custom_target('server.crt',
+    output: ['server.crt', 'server.ckey'],
+    command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+      '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+    build_by_default: false,
+    install: false,
+  )
+
+  # needs to agree with what's in the test script
+  pass = 'FooBaR1'
+
+  enccert = custom_target('server.key',
+    input: [cert[1]],
+    output: ['server.key'],
+    command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+  )
+endif
+
+tap_tests += {
+  'name': 'ssl_passphrase_callback',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_testfunc.pl',
+  ],
+  'env': {'with_ssl': 'openssl'},
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..2e995310876
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+  ['test_bloomfilter.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_bloomfilter.control',
+  'test_bloomfilter--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_bloomfilter',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_bloomfilter',
+  ]
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..3618229594d
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,40 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+  ['test_ddl_deparse.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ddl_deparse.control',
+  'test_ddl_deparse--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_ddl_deparse',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_ddl_deparse',
+    'create_extension',
+    'create_schema',
+    'create_type',
+    'create_conversion',
+    'create_domain',
+    'create_sequence_1',
+    'create_table',
+    'create_transform',
+    'alter_table',
+    'create_view',
+    'create_trigger',
+    'create_rule',
+    'comment_on',
+    'alter_function',
+    'alter_sequence',
+    'alter_ts_config',
+    'alter_type_enum',
+    'opfamily',
+    'defprivs',
+    'matviews',
+  ]
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..2ca504f8588
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,38 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_ext1--1.0.sql',
+  'test_ext1.control',
+  'test_ext2--1.0.sql',
+  'test_ext2.control',
+  'test_ext3--1.0.sql',
+  'test_ext3.control',
+  'test_ext4--1.0.sql',
+  'test_ext4.control',
+  'test_ext5--1.0.sql',
+  'test_ext5.control',
+  'test_ext6--1.0.sql',
+  'test_ext6.control',
+  'test_ext7--1.0--2.0.sql',
+  'test_ext7--1.0.sql',
+  'test_ext7.control',
+  'test_ext8--1.0.sql',
+  'test_ext8.control',
+  'test_ext_cyclic1--1.0.sql',
+  'test_ext_cyclic1.control',
+  'test_ext_cyclic2--1.0.sql',
+  'test_ext_cyclic2.control',
+  'test_ext_evttrig--1.0--2.0.sql',
+  'test_ext_evttrig--1.0.sql',
+  'test_ext_evttrig.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_extensions',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_extensions',
+    'test_extdepend',
+  ]
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..e177e90019f
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+  ['test_ginpostinglist.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ginpostinglist.control',
+  'test_ginpostinglist--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_ginpostinglist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_ginpostinglist',
+  ]
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..ccb8db725e5
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+  ['test_integerset.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_integerset.control',
+  'test_integerset--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_integerset',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_integerset',
+  ]
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..4ee8c562ac0
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,8 @@
+tap_tests += {
+  'name': 'misc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_constraint_validation.pl',
+  ],
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..c43ae95cf2c
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+  ['test_parser.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_parser.control',
+  'test_parser--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_parser',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_parser',
+  ]
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..110b3876832
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,24 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_pg_dump.control',
+  'test_pg_dump--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_pg_dump',
+  ]
+}
+
+tap_tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests': [
+    't/001_base.pl',
+  ]
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..9f9a9475c8b
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+  ['test_predtest.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_predtest.control',
+  'test_predtest--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_predtest',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_predtest',
+  ]
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..6bbeca39ec9
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,20 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+  ['test_rbtree.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_rbtree.control',
+  'test_rbtree--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_rbtree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_rbtree',
+  ]
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..c5fd92ee1c6
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,21 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+  ['test_regex.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_regex.control',
+  'test_regex--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_regex',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_regex',
+    'test_regex_utf8',
+  ]
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..fb8b697e160
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,19 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+  ['test_rls_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_rls_hooks.control',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_rls_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_rls_hooks',
+  ]
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..159943f861e
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,24 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+  files(
+    'setup.c',
+    'test.c',
+    'worker.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_shm_mq.control',
+  'test_shm_mq--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'test_shm_mq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'test_shm_mq',
+  ]
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..9ed4d587721
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,9 @@
+regress_tests += {
+  'name': 'unsafe_tests',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'rolenames',
+    'alter_system_table',
+  ],
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..a80bd493ea7
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+  files(
+    'worker_spi.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'worker_spi.control',
+  'worker_spi--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+regress_tests += {
+  'name': 'worker_spi',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'sql': [
+    'worker_spi',
+  ],
+  'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..5678e1d27ae
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,33 @@
+tap_tests += {
+  'name': 'recovery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tests' : [
+    't/001_stream_rep.pl',
+    't/002_archiving.pl',
+    't/003_recovery_targets.pl',
+    't/004_timeline_switch.pl',
+    't/005_replay_delay.pl',
+    't/006_logical_decoding.pl',
+    't/007_sync_rep.pl',
+    't/008_fsm_truncation.pl',
+    't/009_twophase.pl',
+    't/010_logical_decoding_timelines.pl',
+    't/011_crash_recovery.pl',
+    't/012_subtransactions.pl',
+    't/013_crash_restart.pl',
+    't/014_unlogged_reinit.pl',
+    't/015_promotion_pages.pl',
+    't/016_min_consistency.pl',
+    't/017_shm.pl',
+    't/018_wal_optimize.pl',
+    't/019_replslot_limit.pl',
+    't/020_archive_status.pl',
+    't/021_row_visibility.pl',
+    't/022_crash_temp_files.pl',
+    't/023_pitr_prepared_xact.pl',
+    't/024_archive_recovery.pl',
+    't/025_stuck_on_old_timeline.pl',
+    't/026_overwrite_contrecord.pl',
+  ]
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..1a2f7675e87
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,57 @@
+# also used by isolationtester
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+  'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+  regress_sources,
+  c_args: pg_regress_cflags,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+regress_module = shared_module('regress',
+  ['regress.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+shared_module('autoinc',
+  ['../../../contrib/spi/autoinc.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+shared_module('refint',
+  ['../../../contrib/spi/refint.c'],
+  kwargs: pg_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+    'install': false,
+  },
+)
+
+
+regress_tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'schedule': files('parallel_schedule'),
+  'regress_args': ['--make-testtablespace-dir'],
+  'test_kwargs': {
+    'priority': 50,
+    'timeout': 1000,
+  },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..42e34c9f632
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,10 @@
+tap_tests += {
+  'name': 'ssl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env' : {'with_ssl': get_option('ssl')},
+  'tests': [
+    't/001_ssltests.pl',
+    't/002_scram.pl'
+  ],
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..1024952e25b
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,34 @@
+tap_tests += {
+  'name': 'subscription',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+  'tests': [
+    't/001_rep_changes.pl',
+    't/002_types.pl',
+    't/003_constraints.pl',
+    't/004_sync.pl',
+    't/005_encoding.pl',
+    't/006_rewrite.pl',
+    't/007_ddl.pl',
+    't/008_diff_schema.pl',
+    't/009_matviews.pl',
+    't/010_truncate.pl',
+    't/011_generated.pl',
+    't/012_collation.pl',
+    't/013_partition.pl',
+    't/014_binary.pl',
+    't/015_stream.pl',
+    't/016_stream_subxact.pl',
+    't/017_stream_ddl.pl',
+    't/018_stream_subxact_abort.pl',
+    't/019_stream_subxact_ddl_abort.pl',
+    't/020_messages.pl',
+    't/021_twophase.pl',
+    't/022_twophase_cascade.pl',
+    't/023_twophase_stream.pl',
+    't/024_add_drop_pub.pl',
+    't/025_rep_changes_for_schema.pl',
+    't/100_bugs.pl',
+  ],
+}
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..c3703a5ec7d
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,50 @@
+# files to build into backend
+timezone_sources = files(
+  'localtime.c',
+  'pgtz.c',
+  'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+   'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+  'data/tzdata.zi'
+)
+
+
+# FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+# build our zic. But for that we'd need to run a good chunk of the configure
+# tests both natively and cross. Unclear if it's worth it.
+if meson.is_cross_build()
+  zic = find_program('zic', native: true, required: false)
+else
+  zic = executable('zic', zic_sources,
+    dependencies: [frontend_code],
+    kwargs: default_bin_args + {'install': false}
+  )
+endif
+
+# FIXME: this used to be sorted - but also isn't actually used
+abbrevs_txt = custom_target('abbrevs.txt',
+  input: tzdata,
+  output: ['abbrevs.txt'],
+  command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+  capture: true)
+
+tzdata = custom_target('tzdata',
+  input: tzdata,
+  output: ['timezone'],
+  command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+  install: true,
+  install_dir: get_option('datadir'))
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..effd2880ce7
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,20 @@
+tznames = files(
+  'Africa.txt',
+  'America.txt',
+  'Antarctica.txt',
+  'Asia.txt',
+  'Atlantic.txt',
+  'Australia.txt',
+  'Etc.txt',
+  'Europe.txt',
+  'Indian.txt',
+  'Pacific.txt',
+)
+
+tznames_sets = files(
+  'Default',
+  'Australia',
+  'India')
+
+install_data(tznames, install_dir: get_option('datadir') / 'timezonesets')
+install_data(tznames_sets, install_dir: get_option('datadir') / 'timezonesets')
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..2d75537374e
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+
+import os
+import shlex
+import sys
+
+mesonintrospect = os.environ['MESONINTROSPECT']
+components = shlex.split(mesonintrospect)
+
+if len(components) < 2:
+    print(f'expected more, got: {components}')
+    sys.exit(1)
+
+if components[-1] != 'introspect':
+    print('expected introspection at the end')
+    sys.exit(1)
+
+print('\n'.join(components[:-1]), end='')
+
+sys.exit(0)
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..efc2c700277
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+set -e
+
+srcdir="$1"
+builddir="$2"
+llvm_lto="$3"
+outputdir=$(realpath "$5")
+index="$outputdir/postgres.index.bc"
+priv="$6"
+shift 6
+numinput=$#
+
+if [ ! -d "$outputdir" ];then
+    mkdir -p "$outputdir/postgres"
+fi
+
+cd $priv
+
+# fixme, remove old contents"
+cp -r . "$outputdir/postgres"
+
+cd "$outputdir"
+
+filenames=$(for f in "$@";do echo "postgres/${f#$priv/}";done)
+"$llvm_lto" -thinlto -thinlto-action=thinlink -o "$index" $filenames
+
+exit 0
diff --git a/src/tools/msvc/export2def.pl b/src/tools/msvc/export2def.pl
new file mode 100644
index 00000000000..fb88e8b8ab9
--- /dev/null
+++ b/src/tools/msvc/export2def.pl
@@ -0,0 +1,22 @@
+# Copyright (c) 2021, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use 5.8.0;
+use List::Util qw(max);
+
+my ($deffile, $txtfile, $libname) = @ARGV;
+
+print STDERR "Generating $deffile...\n";
+open(my $if, '<', $txtfile) || die("Could not open $txtfile\n");
+open(my $of, '>', $deffile) || die("Could not open $deffile for writing\n");
+print $of "LIBRARY $libname\nEXPORTS\n";
+while (<$if>)
+{
+	next if (/^#/);
+	next if (/^\s*$/);
+	my ($f, $o) = split;
+	print $of " $f @ $o\n";
+}
+close($of);
+close($if);
diff --git a/src/tools/msvc/gendef2.pl b/src/tools/msvc/gendef2.pl
new file mode 100644
index 00000000000..3b905d6f5da
--- /dev/null
+++ b/src/tools/msvc/gendef2.pl
@@ -0,0 +1,177 @@
+
+# Copyright (c) 2021, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use 5.8.0;
+use List::Util qw(max);
+
+my @def;
+
+#
+# Script that generates a .DEF file for all objects in a directory
+#
+# src/tools/msvc/gendef.pl
+#
+
+# Given a symbol file path, loops over its contents
+# and returns a list of symbols of interest as a dictionary
+# of 'symbolname' -> symtype, where symtype is:
+#
+#     0    a CODE symbol, left undecorated in the .DEF
+#     1    A DATA symbol, i.e. global var export
+#
+sub extract_syms
+{
+	my ($symfile, $def) = @_;
+	open(my $f, '<', $symfile) || die "Could not open $symfile: $!\n";
+	while (<$f>)
+	{
+
+		# Expected symbol lines look like:
+		#
+		# 0   1        2      3            4            5 6
+		# IDX SYMBOL   SECT   SYMTYPE      SYMSTATIC      SYMNAME
+		# ------------------------------------------------------------------------
+		# 02E 00000130 SECTA  notype       External     | _standbyState
+		# 02F 00000009 SECT9  notype       Static       | _LocalRecoveryInProgress
+		# 064 00000020 SECTC  notype ()    Static       | _XLogCheckBuffer
+		# 065 00000000 UNDEF  notype ()    External     | _BufferGetTag
+		#
+		# See http://msdn.microsoft.com/en-us/library/b842y285.aspx
+		#
+		# We're not interested in the symbol index or offset.
+		#
+		# SECT[ION] is only examined to see whether the symbol is defined in a
+		# COFF section of the local object file; if UNDEF, it's a symbol to be
+		# resolved at link time from another object so we can't export it.
+		#
+		# SYMTYPE is always notype for C symbols as there's no typeinfo and no
+		# way to get the symbol type from name (de)mangling. However, we care
+		# if "notype" is suffixed by "()" or not. The presence of () means the
+		# symbol is a function, the absence means it isn't.
+		#
+		# SYMSTATIC indicates whether it's a compilation-unit local "static"
+		# symbol ("Static"), or whether it's available for use from other
+		# compilation units ("External"). We export all symbols that aren't
+		# static as part of the whole program DLL interface to produce UNIX-like
+		# default linkage.
+		#
+		# SYMNAME is, obviously, the symbol name. The leading underscore
+		# indicates that the _cdecl calling convention is used. See
+		# http://www.unixwiz.net/techtips/win32-callconv.html
+		# http://www.codeproject.com/Articles/1388/Calling-Conventions-Demystified
+		#
+		s/notype \(\)/func/g;
+		s/notype/data/g;
+
+		my @pieces = split;
+
+		# Skip file and section headers and other non-symbol entries
+		next unless defined($pieces[0]) and $pieces[0] =~ /^[A-F0-9]{3,}$/;
+
+		# Skip blank symbol names
+		next unless $pieces[6];
+
+		# Skip externs used from another compilation unit
+		next if ($pieces[2] eq "UNDEF");
+
+		# Skip static symbols
+		next unless ($pieces[4] eq "External");
+
+		# Skip some more MSVC-generated crud
+		next if $pieces[6] =~ /^@/;
+		next if $pieces[6] =~ /^\(/;
+
+		# __real and __xmm are out-of-line floating point literals and
+		# (for __xmm) their SIMD equivalents. They shouldn't be part
+		# of the DLL interface.
+		next if $pieces[6] =~ /^__real/;
+		next if $pieces[6] =~ /^__xmm/;
+
+		# __imp entries are imports from other DLLs, eg __imp__malloc .
+		# (We should never have one of these that hasn't already been skipped
+		# by the UNDEF test above, though).
+		next if $pieces[6] =~ /^__imp/;
+
+		# More under-documented internal crud
+		next if $pieces[6] =~ /NULL_THUNK_DATA$/;
+		next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
+		next if $pieces[6] =~ /^__NULL_IMPORT/;
+
+		# Skip string literals
+		next if $pieces[6] =~ /^\?\?_C/;
+
+		# We assume that if a symbol is defined as data, then as a function,
+		# the linker will reject the binary anyway. So it's OK to just pick
+		# whatever came last.
+		$def->{ $pieces[6] } = $pieces[3];
+	}
+	close($f);
+	return;
+}
+
+sub writedef
+{
+	my ($deffile, $platform, $def) = @_;
+	open(my $fh, '>', $deffile) || die "Could not write to $deffile\n";
+	print $fh "EXPORTS\n";
+	foreach my $f (sort keys %{$def})
+	{
+		my $isdata = $def->{$f} eq 'data';
+
+		# Strip the leading underscore for win32, but not x64
+		$f =~ s/^_//
+		  unless ($platform eq "x64");
+
+		# Emit just the name if it's a function symbol, or emit the name
+		# decorated with the DATA option for variables.
+		if ($isdata)
+		{
+			print $fh "  $f DATA\n";
+		}
+		else
+		{
+			print $fh "  $f\n";
+		}
+	}
+	close($fh);
+	return;
+}
+
+
+sub usage
+{
+	die(    "Usage: gendef.pl platform outputfile tempdir sourcelib\n"
+		  . "    modulepath: path to dir with obj files, no trailing slash"
+		  . "    platform: Win32 | x64");
+}
+
+usage()
+  unless scalar(@ARGV) >= 4;
+
+my $platform  = $ARGV[0];
+shift;
+my $deffile  = $ARGV[0];
+shift;
+my $tempdir  = $ARGV[0];
+shift;
+
+print STDERR "Generating $deffile in tmp dir $tempdir from ".join(' ', @ARGV)."\n";
+
+my %def = ();
+
+my $symfile = "$tempdir/all.sym";
+my $tmpfile = "$tempdir/tmp.sym";
+mkdir($tempdir);
+print STDERR "dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV)."\n";
+system("dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV))
+  && die "Could not call dumpbin";
+rename($tmpfile, $symfile);
+print "generated symfile to $symfile (via $tmpfile)\n";
+extract_syms($symfile, \%def);
+print "\n";
+
+writedef($deffile, $platform, \%def);
+
+print "Generated " . scalar(keys(%def)) . " symbols\n";
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..db6431639f1
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import shlex
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    targets = json.load(open(os.path.join(build_root, 'meson-info', 'intro-targets.json')))
+    installed = json.load(open(os.path.join(build_root, 'meson-info', 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            #print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            subprocess.check_call(install_name_tool + ['-change', lib, newref, patchpath])
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}', file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..aeb2019b099
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# FIXME: I should probably be a perl or python script
+#
+
+# FIXME: argument parsing
+
+basedir=$1
+builddir=$2
+testgroup=$3
+testname=$(basename -s .pl $4)
+shift 4
+
+testdir="$basedir/testrun/$testgroup/$testname"
+echo "# executing test in $testdir group $testgroup test $testname, builddir $builddir"
+rm -rf "$testdir/"
+mkdir -p "$testdir"
+
+export TESTOUTDIR="$testdir"
+export TESTDIR="$builddir"
+
+exec "$@"
-- 
2.23.0.385.gbc12974a89

v5-0016-meson-ci-Build-both-with-meson-and-as-before.patchtext/x-diff; charset=us-asciiDownload
From 0585858de3602b88b2c8f11924d3439f457b5ab2 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 8 Oct 2021 17:29:10 -0700
Subject: [PATCH v5 16/16] meson: ci: Build both with meson and as before.

---
 .cirrus.yml | 466 ++++++++++++++++++++++++++++++++++------------------
 1 file changed, 309 insertions(+), 157 deletions(-)

diff --git a/.cirrus.yml b/.cirrus.yml
index 2bb6f4a14d7..a7f955b3c63 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -13,14 +13,13 @@ env:
 
 
 task:
-  name: FreeBSD
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
   compute_engine_instance:
     image_project: pg-vm-images-aio
     image: family/pg-aio-freebsd-13-0
     platform: freebsd
-    cpu: 2
-    memory: 2G
+    cpu: 4
+    memory: 4G
     disk: 50
   env:
     CCACHE_DIR: "/tmp/ccache_dir"
@@ -39,33 +38,52 @@ task:
     - mkdir -p /tmp/ccache_dir
     - chown -R postgres:postgres /tmp/ccache_dir
 
-  configure_script: |
-    su postgres -c './configure \
-      --enable-cassert --enable-debug --enable-tap-tests \
-      --enable-nls \
-      \
-      --with-icu \
-      --with-ldap \
-      --with-libxml \
-      --with-libxslt \
-      \
-      --with-lz4 \
-      --with-pam \
-      --with-perl \
-      --with-python \
-      --with-ssl=openssl \
-      --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
-      --with-uuid=bsd \
-      \
-      --with-includes=/usr/local/include --with-libs=/usr/local/lib \
-      CC="ccache cc"'
-  build_script:
-    - su postgres -c 'gmake -s -j3 && gmake -s -j3 -C contrib'
-  upload_caches:
-    - ccache
+  matrix:
+    - name: FreeBSD autoconf
+
+      configure_script: |
+        su postgres -c './configure \
+          --enable-cassert --enable-debug --enable-tap-tests \
+          --enable-nls \
+          \
+          --with-icu \
+          --with-ldap \
+          --with-libxml \
+          --with-libxslt \
+          \
+          --with-lz4 \
+          --with-pam \
+          --with-perl \
+          --with-python \
+          --with-ssl=openssl \
+          --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+          --with-uuid=bsd \
+          \
+          --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+          CC="ccache cc"'
+      build_script:
+        - su postgres -c 'gmake -s -j4 && gmake -s -j4 -C contrib'
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - su postgres -c 'time gmake -s -j4 ${CHECK} ${CHECKFLAGS}'
+
+    - name: FreeBSD meson
+
+      configure_script:
+        - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=bsd build'
+      build_script:
+        - su postgres -c 'ninja -C build'
+      upload_caches:
+        - ccache
+      run_tests_script:
+        - su postgres -c 'meson test --no-rebuild -C build'
 
-  tests_script:
-    - su postgres -c 'time gmake -s -j2 ${CHECK} ${CHECKFLAGS}'
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
 
   on_failure:
     cores_script: |
@@ -83,14 +101,16 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
-  name: Linux
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
   compute_engine_instance:
     image_project: pg-vm-images-aio
-    image: family/pg-aio-bullseye
     platform: linux
     cpu: 4
     memory: 2G
@@ -120,37 +140,78 @@ task:
     - su postgres -c 'ulimit -l -S'
     - echo '/tmp/%e-%s-%p.core' > /proc/sys/kernel/core_pattern
 
-  configure_script: |
-    su postgres -c './configure \
-      --enable-cassert --enable-debug --enable-tap-tests \
-      --enable-nls \
-      \
-      --with-gssapi \
-      --with-icu \
-      --with-ldap \
-      --with-libxml \
-      --with-libxslt \
-      --with-llvm \
-      --with-lz4 \
-      --with-pam \
-      --with-perl \
-      --with-python \
-      --with-ssl=openssl \
-      --with-systemd \
-      --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \
-      --with-uuid=e2fs \
-      \
-      CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"'
-  build_script:
-    - su postgres -c 'make -s -j4 && make -s -j4 -C contrib'
-  upload_caches:
-    - ccache
+  matrix:
+    - name: Linux Autoconf
+
+      compute_engine_instance:
+        image: family/pg-aio-bullseye
+
+      configure_script: |
+        su postgres -c './configure \
+          --enable-cassert --enable-debug --enable-tap-tests \
+          --enable-nls \
+          \
+          --with-gssapi \
+          --with-icu \
+          --with-ldap \
+          --with-libxml \
+          --with-libxslt \
+          --with-llvm \
+          --with-lz4 \
+          --with-pam \
+          --with-perl \
+          --with-python \
+          --with-ssl=openssl \
+          --with-systemd \
+          --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \
+          --with-uuid=e2fs \
+          \
+          CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"'
+      build_script:
+        - su postgres -c 'make -s -j4 && make -s -j4 -C contrib'
+      upload_caches:
+        - ccache
+
+      tests_script: |
+        su postgres -c '\
+          ulimit -c unlimited; \
+          make -s ${CHECK} ${CHECKFLAGS} -j8 \
+          '
+
+    - name: Linux Meson
+
+      compute_engine_instance:
+        image: family/pg-aio-bullseye
+
+      configure_script:
+        - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+      build_script:
+        - su postgres -c 'ninja -C build'
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - su postgres -c 'meson test --no-rebuild -C build'
+
+    - name: Linux Meson Sid
+
+      compute_engine_instance:
+        image: family/pg-aio-sid
+
+      configure_script:
+        - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=ossp build'
+      build_script:
+        - su postgres -c 'ninja -C build'
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - su postgres -c 'meson test --no-rebuild -C build'
 
-  tests_script: |
-    su postgres -c '\
-      ulimit -c unlimited; \
-      make -s ${CHECK} ${CHECKFLAGS} -j8 \
-      '
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
 
   on_failure:
     cores_script: |
@@ -168,10 +229,13 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
-  name: macOS
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
   osx_instance:
     image: big-sur-base
@@ -201,56 +265,87 @@ task:
     - sudo chmod 777 /cores
   homebrew_install_script:
     - brew install make coreutils ccache icu4c lz4 tcl-tk openldap
+    - brew install meson ninja python@3.9
   upload_caches:
     - homebrew
 
-  configure_script: |
-    LIBS="/usr/local/lib:$LIBS"
-    INCLUDES="/usr/local/include:$INCLUDES"
-
-    INCLUDES="/usr/local/opt/openssl/include:$INCLUDES"
-    LIBS="/usr/local/opt/openssl/lib:$LIBS"
-
-    PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
-    INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES"
-    LIBS="/usr/local/opt/icu4c/lib:$LIBS"
-
-    LIBS="/usr/local/opt/openldap/lib:$LIBS"
-    INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
-
-    export PKG_CONFIG_PATH
-
-    ./configure \
-      --prefix=$HOME/install \
-      --with-includes="$INCLUDES" \
-      --with-libs="$LIBS" \
-      \
-      --enable-cassert --enable-debug --enable-tap-tests \
-      --enable-nls \
-      \
-      --with-icu \
-      --with-ldap \
-      --with-libxml \
-      --with-libxslt \
-      \
-      --with-lz4 \
-      --with-perl \
-      --with-python \
-      --with-ssl=openssl \
-      --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \
-      --with-uuid=e2fs \
-      \
-      CC="ccache gcc" CFLAGS="-O0 -ggdb" \
-      PYTHON=python3
-  build_script:
-    - gmake -s -j12 && gmake -s -j12 -C contrib
-  upload_caches:
-    - ccache
+  matrix:
+    - name: macOS autoconf
+
+      configure_script: |
+        LIBS="/usr/local/lib:$LIBS"
+        INCLUDES="/usr/local/include:$INCLUDES"
+
+        PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH"
+        INCLUDES="/usr/local/opt/openssl/include:$INCLUDES"
+        LIBS="/usr/local/opt/openssl/lib:$LIBS"
+
+        PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
+        INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES"
+        LIBS="/usr/local/opt/icu4c/lib:$LIBS"
+
+        PKG_CONFIG_PATH="/usr/local/opt/openldap/lib/pkgconfig:$PKG_CONFIG_PATH"
+        LIBS="/usr/local/opt/openldap/lib:$LIBS"
+        INCLUDES="/usr/local/opt/openldap/include:$INCLUDES"
+
+        export PKG_CONFIG_PATH
+
+        ./configure \
+          --prefix=$HOME/install \
+          --with-includes="$INCLUDES" \
+          --with-libs="$LIBS" \
+          \
+          --enable-cassert --enable-debug --enable-tap-tests \
+          --enable-nls \
+          \
+          --with-icu \
+          --with-ldap \
+          --with-libxml \
+          --with-libxslt \
+          \
+          --with-lz4 \
+          --with-perl \
+          --with-python \
+          --with-ssl=openssl \
+          --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \
+          --with-uuid=e2fs \
+          \
+          CC="ccache gcc" CFLAGS="-O0 -ggdb" \
+          PYTHON=python3
+      build_script:
+        - gmake -s -j12 && gmake -s -j12 -C contrib
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - ulimit -c unlimited
+        - ulimit -n 1024
+        - gmake -s -j12 ${CHECK} ${CHECKFLAGS}
+
+    - name: macOS meson
+
+      configure_script: |
+        PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH"
+        PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
+        PKG_CONFIG_PATH="/usr/local/opt/openldap/lib/pkgconfig:$PKG_CONFIG_PATH"
+
+        export PKG_CONFIG_PATH
+
+        meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build
+      build_script:
+        - ninja -C build
+      upload_caches:
+        - ccache
+
+      tests_script:
+        - ulimit -c unlimited
+        - ulimit -n 1024
+        - meson test --no-rebuild -C build
 
-  tests_script:
-    - ulimit -c unlimited
-    - ulimit -n 1024
-    - gmake -s -j12 ${CHECK} ${CHECKFLAGS}
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
 
   on_failure:
     cores_script: |
@@ -266,10 +361,13 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
-  name: Windows
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*'
   windows_container:
     dockerfile: ci/docker/windows_vs_2019
@@ -282,6 +380,8 @@ task:
     TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf
     # Avoid re-installing over and over
     NO_TEMP_INSTALL: 1
+    # Try to hide git's tar
+    PATH: c:\windows\system32;${PATH}
 
   sysinfo_script:
     - chcp
@@ -290,55 +390,103 @@ task:
     - ps: Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug'
     - set
 
-  configure_script:
-    - copy ci\windows_build_config.pl src\tools\msvc\config.pl
-    - vcvarsall x64
-    - perl src/tools/msvc/mkvcbuild.pl
-  build_script:
-    - vcvarsall x64
-    # Disable file tracker, we're never going to rebuild...
-    - msbuild -m /p:TrackFileAccess=false pgsql.sln
-  tempinstall_script:
-    # Installation on windows currently only completely works from src\tools\msvc
-    - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install
-
-  check_test_script:
-    - perl src/tools/msvc/vcregress.pl check parallel
-  startcreate_test_script:
-    - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log
-    - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf
-    - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log
-  plcheck_test_script:
-    - perl src/tools/msvc/vcregress.pl plcheck
-  isolationcheck_test_script:
-    - perl src/tools/msvc/vcregress.pl isolationcheck
-  modulescheck_test_script:
-    - perl src/tools/msvc/vcregress.pl modulescheck
-  contribcheck_test_script:
-    - perl src/tools/msvc/vcregress.pl contribcheck
-  stop_test_script:
-    - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log
-  ssl_test_script:
-    - set with_ssl=openssl
-    - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\
-  subscriptioncheck_test_script:
-    - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\
-  authentication_test_script:
-    - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\
-  recoverycheck_test_script:
-    - perl src/tools/msvc/vcregress.pl recoverycheck
-  bincheck_test_script:
-    - perl src/tools/msvc/vcregress.pl bincheck
-  upgradecheck_test_script:
-    - perl src/tools/msvc/vcregress.pl upgradecheck
-  ecpgcheck_test_script:
-    # tries to build additional stuff
-    - vcvarsall x64
-    # References ecpg_regression.proj in the current dir
-    - cd src\tools\msvc
-    - perl vcregress.pl ecpgcheck
+  matrix:
+    - name: Windows homegrown
+
+      configure_script:
+        - copy ci\windows_build_config.pl src\tools\msvc\config.pl
+        - vcvarsall x64
+        - perl src/tools/msvc/mkvcbuild.pl
+      build_script:
+        - vcvarsall x64
+        # Disable file tracker, we're never going to rebuild...
+        - msbuild -m /p:TrackFileAccess=false pgsql.sln
+      tempinstall_script:
+        # Installation on windows currently only completely works from src\tools\msvc
+        - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install
+
+      check_test_script:
+        - perl src/tools/msvc/vcregress.pl check parallel
+      startcreate_test_script:
+        - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log
+        - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf
+        - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log
+      plcheck_test_script:
+        - perl src/tools/msvc/vcregress.pl plcheck
+      isolationcheck_test_script:
+        - perl src/tools/msvc/vcregress.pl isolationcheck
+      modulescheck_test_script:
+        - perl src/tools/msvc/vcregress.pl modulescheck
+      contribcheck_test_script:
+        - perl src/tools/msvc/vcregress.pl contribcheck
+      stop_test_script:
+        - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log
+      ssl_test_script:
+        - set with_ssl=openssl
+        - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\
+      subscriptioncheck_test_script:
+        - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\
+      authentication_test_script:
+        - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\
+      recoverycheck_test_script:
+        - perl src/tools/msvc/vcregress.pl recoverycheck
+      bincheck_test_script:
+        - perl src/tools/msvc/vcregress.pl bincheck
+      upgradecheck_test_script:
+        - perl src/tools/msvc/vcregress.pl upgradecheck
+      ecpgcheck_test_script:
+        # tries to build additional stuff
+        - vcvarsall x64
+        # References ecpg_regression.proj in the current dir
+        - cd src\tools\msvc
+        - perl vcregress.pl ecpgcheck
+
+    - name: Windows Meson+vs+Ninja
+
+      meson_script:
+        - pip install meson
+        - pip install ninja
+      configure_script:
+        - vcvarsall x64
+        - mkdir subprojects
+        - meson wrap install lz4
+        - meson wrap install zlib
+        - meson setup --buildtype debug --backend ninja  -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1.1l\lib -Dextra_include_dirs=c:\openssl\1.1.1l\include build
+      build_script:
+        - vcvarsall x64
+        - ninja -C build
+
+      check_script:
+        - vcvarsall x64
+        - meson test --no-rebuild -C build
+
+    - name: Windows Meson+vs+msbuild
+
+      # Need a development version of meson for now
+      meson_dev_script:
+        - git clone https://github.com/mesonbuild/meson.git
+
+      configure_script:
+        - vcvarsall x64
+        - mkdir subprojects
+        - .\meson\meson.py wrap install lz4
+        - .\meson\meson.py wrap install zlib
+        - .\meson\meson.py setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1.1l\lib -Dextra_include_dirs=c:\openssl\1.1.1l\include build
+
+      build_script:
+        - vcvarsall x64
+        - msbuild -m /p:UseMultiToolTask=true build\postgresql.sln
+
+      check_script:
+        - vcvarsall x64
+        - .\meson\meson.py test --no-rebuild -C build
 
   always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+    cat_dumps_script:
+
     cores_script:
       - cat crashlog.txt || true
     dump_artifacts:
@@ -355,12 +503,16 @@ task:
     tap_artifacts:
       path: "**/regress_log_*"
       type: text/plain
+    meson_test_artifacts:
+      path: "build/meson-logs/testlog.junit.xml"
+      type: text/xml
+      format: junit
 
 
 task:
   name: CompilerWarnings
   depends_on:
-    - Linux
+    - Linux Autoconf
   # task that did not run count as a success, so we need to recheck Linux' condition here :/
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
   container:
-- 
2.23.0.385.gbc12974a89

#89Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#88)
1 attachment(s)
Re: [RFC] building postgres with meson -v

On 01.11.21 00:24, Andres Freund wrote:

- remaining hardcoded configure tests (e.g. ACCEPT_TYPE_ARG*)

I think we can get rid of that one.

That test originally catered to some strange edge cases where the third
argument was size_t that was not the same size as int. That is long
gone, if it ever really existed. All systems currently of interest use
either socklen_t or int, and socklen_t is always int. (A few build farm
animals report size_t, but they are all 32-bit.)

I think we can change the code to use socklen_t and add a simple check
to typedef socklen_t as int if not available. See attached patch.

Attachments:

0001-Remove-check-for-accept-argument-types.patchtext/plain; charset=UTF-8; name=0001-Remove-check-for-accept-argument-types.patch; x-mac-creator=0; x-mac-type=0Download
From 6229ba9973134dfb184eb21bc62822d83ba554d8 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Thu, 4 Nov 2021 13:50:25 +0100
Subject: [PATCH] Remove check for accept() argument types

---
 aclocal.m4                        |  1 -
 config/ac_func_accept_argtypes.m4 | 78 -----------------------------
 configure                         | 82 +++++--------------------------
 configure.ac                      |  2 +-
 src/backend/libpq/auth.c          |  2 +-
 src/backend/libpq/pqcomm.c        |  8 +--
 src/backend/postmaster/pgstat.c   |  4 +-
 src/include/c.h                   |  4 ++
 src/include/libpq/pqcomm.h        |  2 +-
 src/include/pg_config.h.in        | 15 ++----
 src/interfaces/libpq/fe-connect.c |  2 +-
 src/port/getpeereid.c             |  4 +-
 src/tools/msvc/Solution.pm        |  5 +-
 13 files changed, 31 insertions(+), 178 deletions(-)
 delete mode 100644 config/ac_func_accept_argtypes.m4

diff --git a/aclocal.m4 b/aclocal.m4
index 5e22482cd5..58ade65046 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,5 +1,4 @@
 dnl aclocal.m4
-m4_include([config/ac_func_accept_argtypes.m4])
 m4_include([config/ax_prog_perl_modules.m4])
 m4_include([config/ax_pthread.m4])
 m4_include([config/c-compiler.m4])
diff --git a/config/ac_func_accept_argtypes.m4 b/config/ac_func_accept_argtypes.m4
deleted file mode 100644
index 178ef67818..0000000000
--- a/config/ac_func_accept_argtypes.m4
+++ /dev/null
@@ -1,78 +0,0 @@
-# config/ac_func_accept_argtypes.m4
-# This comes from the official Autoconf macro archive at
-# <http://research.cys.de/autoconf-archive/>
-
-
-dnl @synopsis AC_FUNC_ACCEPT_ARGTYPES
-dnl
-dnl Checks the data types of the three arguments to accept(). Results are
-dnl placed into the symbols ACCEPT_TYPE_RETURN and ACCEPT_TYPE_ARG[123],
-dnl consistent with the following example:
-dnl
-dnl       #define ACCEPT_TYPE_RETURN int
-dnl       #define ACCEPT_TYPE_ARG1 int
-dnl       #define ACCEPT_TYPE_ARG2 struct sockaddr *
-dnl       #define ACCEPT_TYPE_ARG3 socklen_t
-dnl
-dnl NOTE: This is just a modified version of the AC_FUNC_SELECT_ARGTYPES
-dnl macro. Credit for that one goes to David MacKenzie et. al.
-dnl
-dnl @version $Id: ac_func_accept_argtypes.m4,v 1.1 1999/12/03 11:29:29 simons Exp $
-dnl @author Daniel Richard G. <skunk@mit.edu>
-dnl
-
-# PostgreSQL local changes: In the original version ACCEPT_TYPE_ARG3
-# is a pointer type. That's kind of useless because then you can't
-# use the macro to define a corresponding variable. We also make the
-# reasonable(?) assumption that you can use arg3 for getsocktype etc.
-# as well (i.e., anywhere POSIX.2 has socklen_t).
-#
-# arg2 can also be `const' (e.g., RH 4.2). Change the order of tests
-# for arg3 so that `int' is first, in case there is no prototype at all.
-#
-# Solaris 7 and 8 have arg3 as 'void *' (disguised as 'Psocklen_t'
-# which is *not* 'socklen_t *').  If we detect that, then we assume
-# 'int' as the result, because that ought to work best.
-#
-# On Win32, accept() returns 'unsigned int PASCAL'
-# Win64 uses SOCKET for return and arg1
-
-AC_DEFUN([AC_FUNC_ACCEPT_ARGTYPES],
-[AC_MSG_CHECKING([types of arguments for accept()])
- AC_CACHE_VAL(ac_cv_func_accept_return,dnl
- [AC_CACHE_VAL(ac_cv_func_accept_arg1,dnl
-  [AC_CACHE_VAL(ac_cv_func_accept_arg2,dnl
-   [AC_CACHE_VAL(ac_cv_func_accept_arg3,dnl
-    [for ac_cv_func_accept_return in 'int' 'SOCKET WSAAPI' 'unsigned int PASCAL'; do
-      for ac_cv_func_accept_arg1 in 'int' 'SOCKET' 'unsigned int'; do
-       for ac_cv_func_accept_arg2 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
-        for ac_cv_func_accept_arg3 in 'int' 'size_t' 'socklen_t' 'unsigned int' 'void'; do
-         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
-[#include <sys/types.h>
-#include <sys/socket.h>
-extern $ac_cv_func_accept_return accept ($ac_cv_func_accept_arg1, $ac_cv_func_accept_arg2, $ac_cv_func_accept_arg3 *);])],
-         [ac_not_found=no; break 4], [ac_not_found=yes])
-       done
-      done
-     done
-    done
-    if test "$ac_not_found" = yes; then
-      AC_MSG_ERROR([could not determine argument types])
-    fi
-    if test "$ac_cv_func_accept_arg3" = "void"; then
-      ac_cv_func_accept_arg3=int
-    fi
-    ])dnl AC_CACHE_VAL
-   ])dnl AC_CACHE_VAL
-  ])dnl AC_CACHE_VAL
- ])dnl AC_CACHE_VAL
- AC_MSG_RESULT([$ac_cv_func_accept_return, $ac_cv_func_accept_arg1, $ac_cv_func_accept_arg2, $ac_cv_func_accept_arg3 *])
- AC_DEFINE_UNQUOTED(ACCEPT_TYPE_RETURN, $ac_cv_func_accept_return,
-                    [Define to the return type of 'accept'])
- AC_DEFINE_UNQUOTED(ACCEPT_TYPE_ARG1, $ac_cv_func_accept_arg1,
-                    [Define to the type of arg 1 of 'accept'])
- AC_DEFINE_UNQUOTED(ACCEPT_TYPE_ARG2, $ac_cv_func_accept_arg2,
-                    [Define to the type of arg 2 of 'accept'])
- AC_DEFINE_UNQUOTED(ACCEPT_TYPE_ARG3, $ac_cv_func_accept_arg3,
-                    [Define to the type of arg 3 of 'accept'])
-])
diff --git a/configure b/configure
index 4ffefe4655..e60e78efdf 100755
--- a/configure
+++ b/configure
@@ -14615,6 +14615,17 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+fi
+
+ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include <sys/socket.h>
+"
+if test "x$ac_cv_type_socklen_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_SOCKLEN_T 1
+_ACEOF
+
+
 fi
 
 ac_fn_c_check_type "$LINENO" "struct sockaddr_un" "ac_cv_type_struct_sockaddr_un" "#include <sys/types.h>
@@ -15327,77 +15338,6 @@ if test x"$pgac_cv_var_int_timezone" = xyes ; then
 $as_echo "#define HAVE_INT_TIMEZONE 1" >>confdefs.h
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for accept()" >&5
-$as_echo_n "checking types of arguments for accept()... " >&6; }
- if ${ac_cv_func_accept_return+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-   if ${ac_cv_func_accept_arg1+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-    if ${ac_cv_func_accept_arg2+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-     if ${ac_cv_func_accept_arg3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      for ac_cv_func_accept_return in 'int' 'SOCKET WSAAPI' 'unsigned int PASCAL'; do
-      for ac_cv_func_accept_arg1 in 'int' 'SOCKET' 'unsigned int'; do
-       for ac_cv_func_accept_arg2 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
-        for ac_cv_func_accept_arg3 in 'int' 'size_t' 'socklen_t' 'unsigned int' 'void'; do
-         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/socket.h>
-extern $ac_cv_func_accept_return accept ($ac_cv_func_accept_arg1, $ac_cv_func_accept_arg2, $ac_cv_func_accept_arg3 *);
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_not_found=no; break 4
-else
-  ac_not_found=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-       done
-      done
-     done
-    done
-    if test "$ac_not_found" = yes; then
-      as_fn_error $? "could not determine argument types" "$LINENO" 5
-    fi
-    if test "$ac_cv_func_accept_arg3" = "void"; then
-      ac_cv_func_accept_arg3=int
-    fi
-
-fi
-
-fi
-
-fi
-
-fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_accept_return, $ac_cv_func_accept_arg1, $ac_cv_func_accept_arg2, $ac_cv_func_accept_arg3 *" >&5
-$as_echo "$ac_cv_func_accept_return, $ac_cv_func_accept_arg1, $ac_cv_func_accept_arg2, $ac_cv_func_accept_arg3 *" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define ACCEPT_TYPE_RETURN $ac_cv_func_accept_return
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define ACCEPT_TYPE_ARG1 $ac_cv_func_accept_arg1
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define ACCEPT_TYPE_ARG2 $ac_cv_func_accept_arg2
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define ACCEPT_TYPE_ARG3 $ac_cv_func_accept_arg3
-_ACEOF
-
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gettimeofday takes only one argument" >&5
 $as_echo_n "checking whether gettimeofday takes only one argument... " >&6; }
 if ${pgac_cv_func_gettimeofday_1arg+:} false; then :
diff --git a/configure.ac b/configure.ac
index 44ee3ebe2f..22cabe1b60 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1552,6 +1552,7 @@ PGAC_C_BUILTIN_UNREACHABLE
 PGAC_C_COMPUTED_GOTO
 PGAC_STRUCT_TIMEZONE
 PGAC_UNION_SEMUN
+AC_CHECK_TYPES(socklen_t, [], [], [#include <sys/socket.h>])
 PGAC_STRUCT_SOCKADDR_UN
 PGAC_STRUCT_SOCKADDR_STORAGE
 PGAC_STRUCT_SOCKADDR_STORAGE_MEMBERS
@@ -1686,7 +1687,6 @@ fi
 ##
 
 PGAC_VAR_INT_TIMEZONE
-AC_FUNC_ACCEPT_ARGTYPES
 PGAC_FUNC_GETTIMEOFDAY_1ARG
 PGAC_FUNC_WCSTOMBS_L
 
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index a317aef1c9..7bcf52523b 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -3026,7 +3026,7 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por
 	struct addrinfo hint;
 	struct addrinfo *serveraddrs;
 	int			port;
-	ACCEPT_TYPE_ARG3 addrsize;
+	socklen_t	addrsize;
 	fd_set		fdset;
 	struct timeval endtime;
 	int			i,
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 89a5f901aa..6f2b2bbb37 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -1620,7 +1620,7 @@ pq_getkeepalivesidle(Port *port)
 	if (port->default_keepalives_idle == 0)
 	{
 #ifndef WIN32
-		ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_idle);
+		socklen_t	size = sizeof(port->default_keepalives_idle);
 
 		if (getsockopt(port->sock, IPPROTO_TCP, PG_TCP_KEEPALIVE_IDLE,
 					   (char *) &port->default_keepalives_idle,
@@ -1705,7 +1705,7 @@ pq_getkeepalivesinterval(Port *port)
 	if (port->default_keepalives_interval == 0)
 	{
 #ifndef WIN32
-		ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_interval);
+		socklen_t	size = sizeof(port->default_keepalives_interval);
 
 		if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPINTVL,
 					   (char *) &port->default_keepalives_interval,
@@ -1788,7 +1788,7 @@ pq_getkeepalivescount(Port *port)
 
 	if (port->default_keepalives_count == 0)
 	{
-		ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_count);
+		socklen_t	size = sizeof(port->default_keepalives_count);
 
 		if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPCNT,
 					   (char *) &port->default_keepalives_count,
@@ -1863,7 +1863,7 @@ pq_gettcpusertimeout(Port *port)
 
 	if (port->default_tcp_user_timeout == 0)
 	{
-		ACCEPT_TYPE_ARG3 size = sizeof(port->default_tcp_user_timeout);
+		socklen_t	size = sizeof(port->default_tcp_user_timeout);
 
 		if (getsockopt(port->sock, IPPROTO_TCP, TCP_USER_TIMEOUT,
 					   (char *) &port->default_tcp_user_timeout,
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index b7d0fbaefd..8c166e5e16 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -391,7 +391,7 @@ static void pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len);
 void
 pgstat_init(void)
 {
-	ACCEPT_TYPE_ARG3 alen;
+	socklen_t	alen;
 	struct addrinfo *addrs = NULL,
 			   *addr,
 				hints;
@@ -624,7 +624,7 @@ pgstat_init(void)
 	{
 		int			old_rcvbuf;
 		int			new_rcvbuf;
-		ACCEPT_TYPE_ARG3 rcvbufsize = sizeof(old_rcvbuf);
+		socklen_t	rcvbufsize = sizeof(old_rcvbuf);
 
 		if (getsockopt(pgStatSock, SOL_SOCKET, SO_RCVBUF,
 					   (char *) &old_rcvbuf, &rcvbufsize) < 0)
diff --git a/src/include/c.h b/src/include/c.h
index c8ede08273..7c790f557e 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -408,6 +408,10 @@ typedef unsigned char bool;
  * ----------------------------------------------------------------
  */
 
+#ifndef HAVE_SOCKLEN_T
+typedef socklen_t int;
+#endif
+
 /*
  * Pointer
  *		Variable holding address of any memory resident object.
diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h
index be9d970574..1bcc189dee 100644
--- a/src/include/libpq/pqcomm.h
+++ b/src/include/libpq/pqcomm.h
@@ -62,7 +62,7 @@ struct sockaddr_storage
 typedef struct
 {
 	struct sockaddr_storage addr;
-	ACCEPT_TYPE_ARG3 salen;
+	socklen_t	salen;
 } SockAddr;
 
 /* Configure the UNIX socket location for the well known port. */
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 15ffdd895a..ca3592465e 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -1,17 +1,5 @@
 /* src/include/pg_config.h.in.  Generated from configure.ac by autoheader.  */
 
-/* Define to the type of arg 1 of 'accept' */
-#undef ACCEPT_TYPE_ARG1
-
-/* Define to the type of arg 2 of 'accept' */
-#undef ACCEPT_TYPE_ARG2
-
-/* Define to the type of arg 3 of 'accept' */
-#undef ACCEPT_TYPE_ARG3
-
-/* Define to the return type of 'accept' */
-#undef ACCEPT_TYPE_RETURN
-
 /* Define if building universal (internal helper macro) */
 #undef AC_APPLE_UNIVERSAL_BUILD
 
@@ -518,6 +506,9 @@
 /* Define to 1 if you have the `shm_open' function. */
 #undef HAVE_SHM_OPEN
 
+/* Define to 1 if the system has the type `socklen_t'. */
+#undef HAVE_SOCKLEN_T
+
 /* Define to 1 if you have spinlocks. */
 #undef HAVE_SPINLOCKS
 
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index b288d346f9..0b7ee3e3c8 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -2744,7 +2744,7 @@ PQconnectPoll(PGconn *conn)
 
 		case CONNECTION_STARTED:
 			{
-				ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
+				socklen_t	optlen = sizeof(optval);
 
 				/*
 				 * Write ready, since we've made it here, so the connection
diff --git a/src/port/getpeereid.c b/src/port/getpeereid.c
index d6aa755d30..4631869180 100644
--- a/src/port/getpeereid.c
+++ b/src/port/getpeereid.c
@@ -37,7 +37,7 @@ getpeereid(int sock, uid_t *uid, gid_t *gid)
 #if defined(SO_PEERCRED)
 	/* Linux: use getsockopt(SO_PEERCRED) */
 	struct ucred peercred;
-	ACCEPT_TYPE_ARG3 so_len = sizeof(peercred);
+	socklen_t	so_len = sizeof(peercred);
 
 	if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) != 0 ||
 		so_len != sizeof(peercred))
@@ -48,7 +48,7 @@ getpeereid(int sock, uid_t *uid, gid_t *gid)
 #elif defined(LOCAL_PEERCRED)
 	/* Debian with FreeBSD kernel: use getsockopt(LOCAL_PEERCRED) */
 	struct xucred peercred;
-	ACCEPT_TYPE_ARG3 so_len = sizeof(peercred);
+	socklen_t	so_len = sizeof(peercred);
 
 	if (getsockopt(sock, 0, LOCAL_PEERCRED, &peercred, &so_len) != 0 ||
 		so_len != sizeof(peercred) ||
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 43fd1be088..a013951e0d 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -205,10 +205,6 @@ sub GenerateFiles
 	# Every symbol in pg_config.h.in must be accounted for here.  Set
 	# to undef if the symbol should not be defined.
 	my %define = (
-		ACCEPT_TYPE_ARG1           => 'unsigned int',
-		ACCEPT_TYPE_ARG2           => 'struct sockaddr *',
-		ACCEPT_TYPE_ARG3           => 'int',
-		ACCEPT_TYPE_RETURN         => 'unsigned int PASCAL',
 		ALIGNOF_DOUBLE             => 8,
 		ALIGNOF_INT                => 4,
 		ALIGNOF_LONG               => 4,
@@ -365,6 +361,7 @@ sub GenerateFiles
 		HAVE_SETPROCTITLE_FAST                   => undef,
 		HAVE_SETSID                              => undef,
 		HAVE_SHM_OPEN                            => undef,
+		HAVE_SOCKLEN_T                           => 1,
 		HAVE_SPINLOCKS                           => 1,
 		HAVE_SRANDOM                             => undef,
 		HAVE_STDBOOL_H                           => 1,
-- 
2.33.1

#90Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#89)
Re: [RFC] building postgres with meson -v

Hi,

On 2021-11-04 19:17:05 +0100, Peter Eisentraut wrote:

On 01.11.21 00:24, Andres Freund wrote:

- remaining hardcoded configure tests (e.g. ACCEPT_TYPE_ARG*)

I think we can get rid of that one.

Oh, nice!

I was somewhat confused by "unsigned int PASCAL" as a type.

That test originally catered to some strange edge cases where the third
argument was size_t that was not the same size as int. That is long gone,
if it ever really existed. All systems currently of interest use either
socklen_t or int, and socklen_t is always int. (A few build farm animals
report size_t, but they are all 32-bit.)

diff --git a/src/include/c.h b/src/include/c.h
index c8ede08273..7c790f557e 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -408,6 +408,10 @@ typedef unsigned char bool;
* ----------------------------------------------------------------
*/
+#ifndef HAVE_SOCKLEN_T
+typedef socklen_t int;
+#endif

I'd put this in port.h instead of c.h, or is there a reason not to do so?

Probably worth putting this in fairly soon independent of whether anything
happens wrt meson?

Greetings,

Andres Freund

#91Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#90)
Re: [RFC] building postgres with meson -v

On 04.11.21 19:48, Andres Freund wrote:

Probably worth putting this in fairly soon independent of whether anything
happens wrt meson?

OK, done. Let's see what happens. ;-)

#92Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#88)
Re: [RFC] building postgres with meson -v

On 01.11.21 00:24, Andres Freund wrote:

Hi,

Attached is an updated version of the meson patchset.

Nanoreview: I think the patch

Subject: [PATCH v5 11/16] meson: prereq: Handle DLSUFFIX in msvc builds
similar to other build envs.

is good to go. It's not clear why it's needed in this context, but it
seems good in general to make these things more consistent.

#93Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#92)
Re: [RFC] building postgres with meson -v

Hi,

On 2021-11-10 11:07:02 +0100, Peter Eisentraut wrote:

On 01.11.21 00:24, Andres Freund wrote:

Hi,

Attached is an updated version of the meson patchset.

Nanoreview: I think the patch

Thanks for looking!

Subject: [PATCH v5 11/16] meson: prereq: Handle DLSUFFIX in msvc builds
similar to other build envs.

is good to go. It's not clear why it's needed in this context, but it seems
good in general to make these things more consistent.

The way it was set between msvc and other builds is currently inconsistent
between msvc and other builds, by virtue of win32_port.h defining for msvc:

/* Things that exist in MinGW headers, but need to be added to MSVC */
#ifdef _MSC_VER
...
/* Pulled from Makefile.port in MinGW */
#define DLSUFFIX ".dll"

it'd have needed unnecessarily contorted logic to continue setting DLSUFFIX
via commandline for !msvc, given that the the meson stuff is the same for msvc
and !msvc.

Greetings,

Andres Freund

#94Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

Hi,

FWIW, I tried building postgres on a few other operating systems using
meson, after I got access to the gcc compile farm. Here's the results:

- openbsd: Compiled fine. Hit one issue running tests:

openbsd has *completely* broken $ORIGIN support. It uses CWD as $ORIGIN
rpaths, which obviously breaks for binaries invoked via PATH. So there
goes the idea to only use $ORIGIN to run tests. Still seems worth to use
on other platforms, particularly because it works with SIP on macos

I understand not supporting $ORIGIN at all. But implementing it this way
seems insane.

I also ran into some problems with the semaphore limits. I had to switch to
USE_NAMED_POSIX_SEMAPHORES to make the tests pass at all.

- netbsd: Compiled fine after some minor fix. There's a bit more to fix around
many libraries not being in the normal library directory, but in
/usr/pkg/lib, which is not in the library search path (i.e. we need to add
an rpath for that in a few more places).

- AIX: Compiled and basic postgres runs fine after a few fixes (big endian
test, converting exports.txt into the right format). Doesn't yet
successfully run more than trivial tests, because I didn't implement the
necessary generation of import files for postgres, but that's just a bit of
work.

This is hampered by the fact that the vanilla postgres crashes for me. I
haven't quite figured out what's the problem. Might be a system issue -
lots of other tools, e.g. perl, segfault frequently.

One important thing to call out: Meson has support for the AIX linker, but
*not* the xlc compiler. I.e. one has to use gcc (or clang, but I didn't
try). I don't know if we'd require adding support for xlc to meson - xlc is
pretty buggy and it doesn't seem particularly crucial to support such an old
crufty compiler on a platform that's not used to a significant degree?

Greetings,

Andres

#95Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#94)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

One important thing to call out: Meson has support for the AIX linker, but
*not* the xlc compiler. I.e. one has to use gcc (or clang, but I didn't
try). I don't know if we'd require adding support for xlc to meson - xlc is
pretty buggy and it doesn't seem particularly crucial to support such an old
crufty compiler on a platform that's not used to a significant degree?

While I have no particular interest in AIX or xlc specifically, I do
worry about us becoming a builds-on-gcc-or-workalikes-only project.
I suppose MSVC provides a little bit of a cross-check, but I don't
really like giving up on other compilers. Discounting gcc+clang+MSVC
leaves just a few buildfarm animals, and the xlc ones are a significant
part of that population. (In fact, unless somebody renews fossa/husky's
icc license, the three xlc animals will be an outright majority of
them, because wrasse and anole are the only other active animals with
non-mainstream compilers.)

Having said that, I don't plan to be the one trying to get meson
to add xlc support ...

regards, tom lane

#96Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#95)
Re: [RFC] building postgres with meson

Hi,

On 2021-11-15 14:11:25 -0500, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

One important thing to call out: Meson has support for the AIX linker, but
*not* the xlc compiler. I.e. one has to use gcc (or clang, but I didn't
try). I don't know if we'd require adding support for xlc to meson - xlc is
pretty buggy and it doesn't seem particularly crucial to support such an old
crufty compiler on a platform that's not used to a significant degree?

While I have no particular interest in AIX or xlc specifically, I do
worry about us becoming a builds-on-gcc-or-workalikes-only project.
I suppose MSVC provides a little bit of a cross-check, but I don't
really like giving up on other compilers. Discounting gcc+clang+MSVC
leaves just a few buildfarm animals, and the xlc ones are a significant
part of that population.

Yea, that's a reasonable concern. I wonder if there's some non-mainstream
compiler that actually works on, um, more easily available platforms that we
could utilize.

(In fact, unless somebody renews fossa/husky's
icc license, the three xlc animals will be an outright majority of
them, because wrasse and anole are the only other active animals with
non-mainstream compilers.)

It should probably be doable to get somebody to run another icc animal. Icc is
supported by meson, fwiw.

Having said that, I don't plan to be the one trying to get meson
to add xlc support ...

It'd probably not be too hard. But given that it's quite hard to get access to
AIX + xlc, I'm not sure it's something I want to propose. There's no resources
to run halfway regular tests on that I found...

It's good to make sure we're not growing too reliant on some compiler(s), but
imo only really makes sense if the alternative compilers are meaningfully
available and maintained.

Greetings,

Andres Freund

#97Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#96)
Re: [RFC] building postgres with meson

On Mon, Nov 15, 2021 at 2:23 PM Andres Freund <andres@anarazel.de> wrote:

It's good to make sure we're not growing too reliant on some compiler(s), but
imo only really makes sense if the alternative compilers are meaningfully
available and maintained.

That's a sensible position. I do worry that with this proposed move
we're going to be giving up some of the flexibility that we have right
now. I'm not sure exactly what that means in practice. But make is
just a way of running shell commands, and so you can run any shell
commands you want. The concept of some compiler not being supported
isn't really a thing that even makes sense in a world that is powered
by make. With a big enough hammer you can run any commands you like,
including any compilation commands you like. The whole thing is likely
to be a bit crufty which is a downside, and you might spend more time
fiddling with it than you really want. But nothing is really ever
blocked.

--
Robert Haas
EDB: http://www.enterprisedb.com

#98Thomas Munro
thomas.munro@gmail.com
In reply to: Andres Freund (#96)
Re: [RFC] building postgres with meson

On Tue, Nov 16, 2021 at 8:23 AM Andres Freund <andres@anarazel.de> wrote:

On 2021-11-15 14:11:25 -0500, Tom Lane wrote:

Having said that, I don't plan to be the one trying to get meson
to add xlc support ...

It'd probably not be too hard. But given that it's quite hard to get access to
AIX + xlc, I'm not sure it's something I want to propose. There's no resources
to run halfway regular tests on that I found...

FWIW there's a free-as-in-beer edition of xlc for Linux (various
distros, POWER only) so you could use qemu, though of course there
will be differences WRT AIX especially around linking, and I suppose a
big part of that work would be precisely understanding stuff like
linker details.

It looks like we have two xlc 12.1 compilers in the farm, but those
compilers are EOL'd[1]https://www.ibm.com/support/pages/lifecycle/search?q=xl%20c%2Fc%2B%2B. The current release is 16.1, and we have one
of those. The interesting thing about 16.1 is that you can invoke it
as xlclang to get the new clang frontend and, I think, possibly use
more clang/gcc-ish compiler switches[2]https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=new-clang-based-front-end.

[1]: https://www.ibm.com/support/pages/lifecycle/search?q=xl%20c%2Fc%2B%2B
[2]: https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=new-clang-based-front-end

#99Tom Lane
tgl@sss.pgh.pa.us
In reply to: Thomas Munro (#98)
Re: [RFC] building postgres with meson

Thomas Munro <thomas.munro@gmail.com> writes:

... The interesting thing about 16.1 is that you can invoke it
as xlclang to get the new clang frontend and, I think, possibly use
more clang/gcc-ish compiler switches[2].
[2] https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=new-clang-based-front-end

Ho, that's an earful ;-). Though I wonder whether that frontend
hides the AIX-specific linking issues you mentioned. (Also, although
I see /opt/IBM/xlc/16.1.0/ on gcc119, there's no xlclang there.
So whether we have useful access to it right now is unclear.)

This plays into something that was nagging at me while I wrote my
upthread screed about not giving up on non-gcc/clang compilers:
are those compilers outcompeting all the proprietary ones, to the
extent that the latter will be dead soon anyway? I think Microsoft
is rich enough and stubborn enough to keep on developing MSVC no
matter what, but other compiler vendors may see the handwriting
on the wall. Writing C compilers can't be a growth industry these
days.

regards, tom lane

#100Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#99)
Re: [RFC] building postgres with meson

Hi,

On 2021-11-15 17:34:33 -0500, Tom Lane wrote:

Thomas Munro <thomas.munro@gmail.com> writes:

... The interesting thing about 16.1 is that you can invoke it
as xlclang to get the new clang frontend and, I think, possibly use
more clang/gcc-ish compiler switches[2].
[2] https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=new-clang-based-front-end

Ho, that's an earful ;-). Though I wonder whether that frontend
hides the AIX-specific linking issues you mentioned. (Also, although
I see /opt/IBM/xlc/16.1.0/ on gcc119, there's no xlclang there.
So whether we have useful access to it right now is unclear.)

It's actually available there, but in /opt/IBM/xlC/16.1.0/bin/xlclang++ (note
the upper case C).

It doesn't really hide the linking issues afaict. I think they're basically an
ABI rather than a linker invocation issue. It's not that hard to address them
though, it's basically making mkldexport.sh a tiny bit more general and
integrating it into src/backend/postgres' build.

We don't have to generate export files for shared libraries anymore though,
afaict, because there's 'expall', which suffices for our purposes. dlopen()
doesn't require an import file.

This plays into something that was nagging at me while I wrote my
upthread screed about not giving up on non-gcc/clang compilers:
are those compilers outcompeting all the proprietary ones, to the
extent that the latter will be dead soon anyway?

I think that's a pretty clear trend. The ones that aren't dying seem to be
incrementally onto more and more rebasing onto llvm tooling.

It doesn't help that most of those compilers are primarily for OSs that, uh,
aren't exactly growing. Which limits their potential usability significantly.

Greetings,

Andres Freund

#101Thomas Munro
thomas.munro@gmail.com
In reply to: Thomas Munro (#98)
Re: [RFC] building postgres with meson

On Tue, Nov 16, 2021 at 11:08 AM Thomas Munro <thomas.munro@gmail.com> wrote:

FWIW there's a free-as-in-beer edition of xlc for Linux (various
distros, POWER only) so you could use qemu,

(It's also known to be possible to run AIX 7.2 on qemu, but the
install media is not made available to developers for testing/CI
without a hardware serial number. Boo.)

#102Thomas Munro
thomas.munro@gmail.com
In reply to: Andres Freund (#96)
Re: [RFC] building postgres with meson

On Tue, Nov 16, 2021 at 8:23 AM Andres Freund <andres@anarazel.de> wrote:

On 2021-11-15 14:11:25 -0500, Tom Lane wrote:

(In fact, unless somebody renews fossa/husky's
icc license, the three xlc animals will be an outright majority of
them, because wrasse and anole are the only other active animals with
non-mainstream compilers.)

It should probably be doable to get somebody to run another icc animal. Icc is
supported by meson, fwiw.

FWIW, in case someone is interested in bringing ICC back to the farm,
some light googling tells me that newer editions of "classic" ICC (as
opposed to "data parallel" ICC, parts of some kind of rebrand) no
longer require regular licence bureaucracy, and can be installed in
modern easier to maintain ways. For example, I see that some people
add Intel's APT repository and apt-get install the compiler inside CI
jobs, on Ubuntu.

#103Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#36)
1 attachment(s)
Re: [RFC] building postgres with meson

On 10/13/21 16:06, Andrew Dunstan wrote:

On 10/13/21 1:26 PM, Andres Freund wrote:

pexports will be in the resulting path, and the build will use the
native compiler.

I don't see pexports anywhere in the msys installation. I can see it available
on sourceforge, and I see a few others asking where to get it from in the
context of msys, and being pointed to manually downloading it.

Weird. fairywren has it, which means that it must have been removed from
the packages at some stage, fairly recently as fairywren isn't that old.
I just confirmed the absence on a 100% fresh install.

It is in Strawberry's c/bin directory.

Seems like we should consider using gendef instead of pexports, given it's
available in msys?

Yeah. It's missing on my ancient msys animal (frogmouth), but it doesn't
build --with-perl.

jacana seems to have it.

If you prep a patch I'll test it.

Here's a patch. I've tested the perl piece on master and it works fine.
It applies cleanly down to 9.4, which is before we got transform modules
(9.5) which fail if we just omit doing this platform-specific piece.

Before that only plpython uses pexports, and we're not committed to
supporting plpython at all on old branches.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

Attachments:

gendef.patchtext/x-patch; charset=UTF-8; name=gendef.patchDownload
commit 823b36d98b
Author: Andrew Dunstan <andrew@dunslane.net>
Date:   Sun Feb 6 10:53:06 2022 -0500

    Use gendef instead of pexports for building windows .def files
    
    Modern msys systems lack pexports but have gendef instead, so use that.
    
    Discussion: https://postgr.es/m/20d4fa3a-e0f1-0ac4-1657-0698ee1c511f@dunslane.net>

diff --git a/src/pl/plperl/GNUmakefile b/src/pl/plperl/GNUmakefile
index 919d46453f..a2e6410f53 100644
--- a/src/pl/plperl/GNUmakefile
+++ b/src/pl/plperl/GNUmakefile
@@ -48,7 +48,7 @@ lib$(perlwithver).a: $(perlwithver).def
 	dlltool --dllname $(perlwithver).dll --def $(perlwithver).def --output-lib lib$(perlwithver).a
 
 $(perlwithver).def: $(PERLDLL)
-	pexports $^ > $@
+	gendef - $^ > $@
 
 endif # win32
 
diff --git a/src/pl/plpython/Makefile b/src/pl/plpython/Makefile
index 9e95285af8..a83ae8865c 100644
--- a/src/pl/plpython/Makefile
+++ b/src/pl/plpython/Makefile
@@ -69,7 +69,7 @@ libpython${pytverstr}.a: python${pytverstr}.def
 	dlltool --dllname python${pytverstr}.dll --def python${pytverstr}.def --output-lib libpython${pytverstr}.a
 
 python${pytverstr}.def:
-	pexports $(PYTHONDLL) > $@
+	gendef - $(PYTHONDLL) > $@
 
 endif # win32
 
diff --git a/src/pl/tcl/Makefile b/src/pl/tcl/Makefile
index 1e7740da3f..25e65189b6 100644
--- a/src/pl/tcl/Makefile
+++ b/src/pl/tcl/Makefile
@@ -46,7 +46,7 @@ lib$(tclwithver).a: $(tclwithver).def
 	dlltool --dllname $(tclwithver).dll --def $(tclwithver).def --output-lib lib$(tclwithver).a
 
 $(tclwithver).def: $(TCLDLL)
-	pexports $^ > $@
+	gendef - $^ > $@
 
 endif # win32
 
#104Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#103)
Re: [RFC] building postgres with meson

Hi,

On 2022-02-06 12:06:41 -0500, Andrew Dunstan wrote:

Here's a patch. I've tested the perl piece on master and it works fine.
It applies cleanly down to 9.4, which is before we got transform modules
(9.5) which fail if we just omit doing this platform-specific piece.

Given /messages/by-id/34e972bc-6e75-0754-9e6d-cde2518773a1@dunslane.net
wouldn't it make sense to simply remove the pexports/gendef logic instead of
moving to gendef?

Greetings,

Andres Freund

#105Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#104)
Re: [RFC] building postgres with meson

On 2/6/22 13:39, Andres Freund wrote:

Hi,

On 2022-02-06 12:06:41 -0500, Andrew Dunstan wrote:

Here's a patch. I've tested the perl piece on master and it works fine.
It applies cleanly down to 9.4, which is before we got transform modules
(9.5) which fail if we just omit doing this platform-specific piece.

Given /messages/by-id/34e972bc-6e75-0754-9e6d-cde2518773a1@dunslane.net
wouldn't it make sense to simply remove the pexports/gendef logic instead of
moving to gendef?

I haven't found a way to fix the transform builds if we do that. So
let's leave that as a separate exercise unless you have a solution for
that - this patch is really trivial.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#106Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson - autogenerated headers

Hi,

I've been wondering whether we should try to have the generated pg_config.h
look as similar as possible to autoconf/autoheader's, or not. And whether the
way autoconf/autoheader define symbols makes sense when not using either
anymore.

To be honest, I do not really understand the logic behind when autoconf ends
up with #defines that define a macro to 0/1 and when a macro ends defined/or
not and when we end up with a macro defined to 1 or not defined at all.

So far I've tried to mirror the logic, but not the description / comment
formatting of the individual macros.

The "defined to 1 or not defined at all" behaviour is a mildly awkward to
achieve with meson, because it doesn't match the behaviour for booleans
options meson has (there are two builtin behaviours, one to define/undefine a
macro, the other to set the macro to 0/1. But there's none that defines a
macro to 1 or undefines it).

Probably best to initially have the macros defined as similar as reasonably
possible, but subsequently clean things up a bit.

A second aspect that I'm wondering about is whether we should try to split
pg_config.h output a bit:

With meson it's easy to change options like whether to build with some
dependency in an existing build tree and then still get a reliable build
result (ninja rebuilds if the commandline changed from the last invocation).

But right now doing so often ends up with way bigger rebuilds than necessary,
because for a lot of options we add #define USE_LDAP 1 etc to pg_config.h,
which of course requires rebuilding a lot of files. Even though most of these
symbols are only checked in a handful of files, often only .c files.

It seems like it might make sense to separate out defines that depend on the
compiler / "standard libraries" (e.g. {SIZEOF,ALIGNOF}_*,
HAVE_DECL_{STRNLEN,...}, HAVE_*_H) from feature defines (like
USE_{LDAP,ICU,...}). The header containing the latter could then included in
the places needing it (or we could have one header for each of the places
using it).

Perhaps we should also separate out configure-time settings like BLCKSZ,
DEF_PGPORT, etc. Realistically most of them are going to require a "full tree"
recompile anway, but it seems like it might make things easier to understand.

I think a split into pg_config_{platform,features,settings}.h could make sense.

Similar to above, it's probably best to do this separately after merging meson
support. But knowing what the split should eventually look like would be
helpful before, to ensure it's easy to do.

Greetings,

Andres Freund

#107Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#106)
Re: [RFC] building postgres with meson - autogenerated headers

Andres Freund <andres@anarazel.de> writes:

I've been wondering whether we should try to have the generated pg_config.h
look as similar as possible to autoconf/autoheader's, or not. And whether the
way autoconf/autoheader define symbols makes sense when not using either
anymore.

To be honest, I do not really understand the logic behind when autoconf ends
up with #defines that define a macro to 0/1 and when a macro ends defined/or
not and when we end up with a macro defined to 1 or not defined at all.

Agreed, that always seemed entirely random to me too. I'd be content
to end up with "defined or not defined" as the standard. I think
we have way more #ifdef tests than #if tests, so changing the latter
seems more sensible than changing the former.

A second aspect that I'm wondering about is whether we should try to split
pg_config.h output a bit:

TBH I can't get excited about that. I do not think that rebuilding
with different options is a critical path. ccache already does most
of the heavy lifting when you do that sort of thing, anyway.

regards, tom lane

#108Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson - perl embedding

Hi,

I was trying to fix a few perl embedding oddities in the meson
patchset.

Whenever I have looked at the existing code, I've been a bit confused about
the following

code/comment in perl.m4:

# PGAC_CHECK_PERL_EMBED_LDFLAGS
# -----------------------------
# We are after Embed's ldopts, but without the subset mentioned in
# Config's ccdlflags; [...]

pgac_tmp1=`$PERL -MExtUtils::Embed -e ldopts`
pgac_tmp2=`$PERL -MConfig -e 'print $Config{ccdlflags}'`
perl_embed_ldflags=`echo X"$pgac_tmp1" | sed -e "s/^X//" -e "s%$pgac_tmp2%%" -e ["s/ -arch [-a-zA-Z0-9_]*//g"]`

What is the reason behind subtracting ccdlflags?

The comment originates in:

commit d69a419e682c2d39c2355105a7e5e2b90357c8f0
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: 2009-09-08 18:15:55 +0000

Remove any -arch switches given in ExtUtils::Embed's ldopts from our
perl_embed_ldflags setting. On OS X it seems that ExtUtils::Embed is
trying to force a universal binary to be built, but you need to specify
that a lot further upstream if you want Postgres built that way; the only
result of including -arch in perl_embed_ldflags is some warnings at the
plperl.so link step. Per my complaint and Jan Otto's suggestion.

but the subtraction goes all the way back to

commit 7662419f1bc1a994193c319c9304dfc47e121c98
Author: Peter Eisentraut <peter_e@gmx.net>
Date: 2002-05-28 16:57:53 +0000

Change PL/Perl and Pg interface build to use configured compiler and
Makefile.shlib system, not MakeMaker.

Greetings,

Andres Freund

#109Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#107)
Re: [RFC] building postgres with meson - autogenerated headers

Hi,

On 2022-02-07 16:30:53 -0500, Tom Lane wrote:

A second aspect that I'm wondering about is whether we should try to split
pg_config.h output a bit:

TBH I can't get excited about that. I do not think that rebuilding
with different options is a critical path. ccache already does most
of the heavy lifting when you do that sort of thing, anyway.

I've found it to be pretty painful when building with msvc, which doesn't have
ccache (yet at least), and where the process startup overhead is bigger.

Even on some other platforms it's useful - it takes a while on net/openbsd to
recompile postgres, even if everything is in ccache. If I test on some
platform I'll often install the most basic set, get the tests to run, and then
incrementally figure out what other packages need to be installed etc.

Greetings,

Andres Freund

#110Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#108)
Re: [RFC] building postgres with meson - perl embedding

Andres Freund <andres@anarazel.de> writes:

What is the reason behind subtracting ccdlflags?

It looks like the coding actually originated here:

commit f5d0c6cad5bb2706e0e63f3f8f32e431ea428100
Author: Bruce Momjian <bruce@momjian.us>
Date: Wed Jun 20 00:26:06 2001 +0000

Apparently, on some systems, ExtUtils::Embed and MakeMaker are slightly
broken, and its impossible to make a shared library when compiling with
both CCDLFLAGS and LDDLFAGS, you have to pick one or the other.

Alex Pilosov

and Peter just copied the logic in 7662419f1. Considering that
the point of 7662419f1 was to get rid of MakeMaker, maybe we no
longer needed that at that point.

On my RHEL box, the output of ldopts is sufficiently redundant
that the subtraction doesn't actually accomplish much:

$ perl -MExtUtils::Embed -e ldopts
-Wl,--enable-new-dtags -Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -fstack-protector-strong -L/usr/local/lib -L/usr/lib64/perl5/CORE -lperl -lpthread -lresolv -ldl -lm -lcrypt -lutil -lc

$ perl -MConfig -e 'print $Config{ccdlflags}'
-Wl,--enable-new-dtags -Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld

which leads to

$ grep perl_embed_ldflags src/Makefile.global
perl_embed_ldflags = -Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -fstack-protector-strong -L/usr/local/lib -L/usr/lib64/perl5/CORE -lperl -lpthread -lresolv -ldl -lm -lcrypt -lutil -lc

so the only thing we actually got rid of was -Wl,--enable-new-dtags,
which I think we'll put back anyway.

Things might be different elsewhere of course, but I'm tempted
to take out the ccdlflags subtraction and see what the buildfarm
says.

regards, tom lane

#111Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#110)
Re: [RFC] building postgres with meson - perl embedding

I wrote:

Andres Freund <andres@anarazel.de> writes:

What is the reason behind subtracting ccdlflags?

It looks like the coding actually originated here:
commit f5d0c6cad5bb2706e0e63f3f8f32e431ea428100

Ah, here's the thread leading up to that:

/messages/by-id/200106191206.f5JC6R108371@candle.pha.pa.us

The use of ldopts rather than hand-hacked link options seems to date to
0ed7864d6, only a couple days before that. I don't think we had a
buildfarm then, but I'd bet against the problem being especially
widespread even then, or more people would've complained.

BTW, the business with zapping arch options seems to not be necessary
anymore either on recent macOS:

$ perl -MExtUtils::Embed -e ldopts
-fstack-protector-strong -L/System/Library/Perl/5.30/darwin-thread-multi-2level/CORE -lperl
$ perl -MConfig -e 'print $Config{ccdlflags}'
$

(same results on either Intel or ARM Mac). However, it looks like it
is still necessary to keep locust happy, and I have no idea just when
Apple stopped using arch switches here, so we'd better keep that.

regards, tom lane

#112Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#110)
Re: [RFC] building postgres with meson - perl embedding

Hi,

On 2022-02-07 20:42:09 -0500, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

What is the reason behind subtracting ccdlflags?

It looks like the coding actually originated here:

commit f5d0c6cad5bb2706e0e63f3f8f32e431ea428100
Author: Bruce Momjian <bruce@momjian.us>
Date: Wed Jun 20 00:26:06 2001 +0000

Apparently, on some systems, ExtUtils::Embed and MakeMaker are slightly
broken, and its impossible to make a shared library when compiling with
both CCDLFLAGS and LDDLFAGS, you have to pick one or the other.

Alex Pilosov

and Peter just copied the logic in 7662419f1. Considering that
the point of 7662419f1 was to get rid of MakeMaker, maybe we no
longer needed that at that point.

Yea. And maybe what was broken in 2001 isn't broken anymore either ;)

Looking at a number of OSs:

debian sid:
embed: -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.34/CORE -lperl -ldl -lm -lpthread -lc -lcrypt
ldopts: -Wl,-E

fedora:
embed: -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -fstack-protector-strong -L/usr/local/lib -L/usr/lib64/perl5/CORE -lperl -lpthread -lresolv -ldl -lm -lcrypt -lutil -lc
ldopts: -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1

suse tumbleweed:
embed: -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.34.0/x86_64-linux-thread-multi/CORE -L/usr/local/lib64 -fstack-protector-strong -L/usr/lib/perl5/5.34.0/x86_64-linux-thread-multi/CORE -lperl -lm -ldl -lcrypt -lpthread
ldopts: -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.34.0/x86_64-linux-thread-multi/CORE

freebsd:
embed: -Wl,-R/usr/local/lib/perl5/5.30/mach/CORE -pthread -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/local/lib/perl5/5.30/mach/CORE -lperl -lpthread -lm -lcrypt -lutil
ldopts: -Wl,-R/usr/local/lib/perl5/5.30/mach/CORE

netbsd:
embed: -Wl,-E -Wl,-R/usr/pkg/lib/perl5/5.34.0/x86_64-netbsd-thread-multi/CORE -pthread -L/usr/lib -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -L/usr/pkg/lib/perl5/5.34.0/x86_64-netbsd-thread-multi/CORE -lperl -lm -lcrypt -lpthread
ldopts: -Wl,-E -Wl,-R/usr/pkg/lib/perl5/5.34.0/x86_64-netbsd-thread-multi/CORE

openbsd:
embed: -Wl,-R/usr/libdata/perl5/amd64-openbsd/CORE -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/libdata/perl5/amd64-openbsd/CORE -lperl -lm -lc
ldopts: -Wl,-R/usr/libdata/perl5/amd64-openbsd/CORE

aix:
embed: -bE:/usr/opt/perl5/lib64/5.28.1/aix-thread-multi-64all/CORE/perl.exp -bE:/usr/opt/perl5/lib64/5.28.1/aix-thread-multi-64all/CORE/perl.exp -brtl -bdynamic -b64 -L/usr/opt/perl5/lib64/5.28.1/aix-thread-multi-64all/CORE -lperl -lpthread -lbind -lnsl -ldl -lld -lm -lcrypt -lpthreads -lc
ldopts: -bE:/usr/opt/perl5/lib64/5.28.1/aix-thread-multi-64all/CORE/perl.exp -bE:/usr/opt/perl5/lib64/5.28.1/aix-thread-multi-64all/CORE/perl.exp

mac m1 monterey:
embed: -fstack-protector-strong -L/System/Library/Perl/5.30/darwin-thread-multi-2level/CORE -lperl
ldopts:

windows msys install ucrt perl:
embed: -s -L"C:\dev\msys64\ucrt64\lib\perl5\core_perl\CORE" -L"C:\dev\msys64\ucrt64\lib" "C:\dev\msys64\ucrt64\lib\perl5\core_perl\CORE\libperl532.a"
ldopts:

windows strawberrry perl:
embed: -s -L"C:\STRAWB~1\perl\lib\CORE" -L"C:\STRAWB~1\c\lib" "C:\STRAWB~1\perl\lib\CORE\libperl530.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libmoldname.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libkernel32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libuser32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libgdi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libwinspool.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libcomdlg32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libadvapi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libshell32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libole32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\liboleaut32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libnetapi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libuuid.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libws2_32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libmpr.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libwinmm.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libversion.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libodbc32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libodbccp32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libcomctl32.a"
ldopts:

So on windows, macos it makes no difference because ldopts is empty.

On various linuxes, except red-hat and debian ones, as well as on the BSDs, it
removes rpath. Which we then add back in various places (pl and transform
modules). On debian the added rpath never will contain the library.

AIX is the one exception. Specifying -bE... doesn't seem right for building
plperl etc. So possibly the subtraction accidentally does work for us there...

Things might be different elsewhere of course, but I'm tempted
to take out the ccdlflags subtraction and see what the buildfarm
says.

Except for the AIX thing I agree :(

Greetings,

Andres Freund

#113Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#106)
Re: [RFC] building postgres with meson - autogenerated headers

On 07.02.22 20:24, Andres Freund wrote:

To be honest, I do not really understand the logic behind when autoconf ends
up with #defines that define a macro to 0/1 and when a macro ends defined/or
not and when we end up with a macro defined to 1 or not defined at all.

The default is to define to 1 or not at all. The reason for this is
presumably that originally, autoconf (or its predecessor practices) just
populated the command line with a few -DHAVE_THIS options. Creating a
header file came later. And -DFOO is equivalent to #define FOO 1.
Also, this behavior allows code to use both the #ifdef HAVE_THIS and the
#if HAVE_THIS style.

The cases that deviate from this have a special reason for this. One
issue to consider is that depending on how the configure script is set
up or structured, a test might not run at all. But for example, if you
have a check for a declaration of a function, and the test doesn't run
in a particular configuration, the fallback in your own code would
normally be to then manually declare the function yourself. But if you
didn't even run the test, then adding a declaration of a function you
didn't want in the first place might be bad. In that case, you can
check with #ifdef whether the test was run, and then check the value of
the macro for the test outcome.

#114Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#111)
Re: [RFC] building postgres with meson - perl embedding

On 2/7/22 21:40, Tom Lane wrote:

I wrote:

Andres Freund <andres@anarazel.de> writes:

What is the reason behind subtracting ccdlflags?

It looks like the coding actually originated here:
commit f5d0c6cad5bb2706e0e63f3f8f32e431ea428100

Ah, here's the thread leading up to that:

/messages/by-id/200106191206.f5JC6R108371@candle.pha.pa.us

The use of ldopts rather than hand-hacked link options seems to date to
0ed7864d6, only a couple days before that. I don't think we had a
buildfarm then, but I'd bet against the problem being especially
widespread even then, or more people would've complained.

The buildfarm's first entry is from 22 Oct 2004.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#115Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#112)
Re: [RFC] building postgres with meson - perl embedding

Andres Freund <andres@anarazel.de> writes:

On 2022-02-07 20:42:09 -0500, Tom Lane wrote:

... Peter just copied the logic in 7662419f1. Considering that
the point of 7662419f1 was to get rid of MakeMaker, maybe we no
longer needed that at that point.

Yea. And maybe what was broken in 2001 isn't broken anymore either ;)

Yeah --- note that Bruce was complaining about a problem on
Perl 5.005, which was already a bit over-the-hill in 2001.

AIX is the one exception. Specifying -bE... doesn't seem right for building
plperl etc. So possibly the subtraction accidentally does work for us there...

I tried this on AIX 7.2 (using the gcc farm, same build options
as hoverfly). The build still works and passes regression tests,
but you get a warning about each symbol exported by Perl itself:

...
ld: 0711-415 WARNING: Symbol PL_veto_cleanup is already exported.
ld: 0711-415 WARNING: Symbol PL_warn_nl is already exported.
ld: 0711-415 WARNING: Symbol PL_warn_nosemi is already exported.
ld: 0711-415 WARNING: Symbol PL_warn_reserved is already exported.
ld: 0711-415 WARNING: Symbol PL_warn_uninit is already exported.
ld: 0711-415 WARNING: Symbol PL_WB_invlist is already exported.
ld: 0711-415 WARNING: Symbol PL_XPosix_ptrs is already exported.
ld: 0711-415 WARNING: Symbol PL_Yes is already exported.
ld: 0711-415 WARNING: Symbol PL_Zero is already exported.

So there's about 1200 such warnings for plperl, and then the same
again for each contrib foo_plperl module. Maybe that's annoying
enough that we should keep the logic. OTOH, it seems entirely
accidental that it has that effect. I'd be a little inclined to
replace it with some rule about stripping '-bE:' switches out of
the ldopts result.

regards, tom lane

#116Joel Jacobson
joel@compiler.org
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

On Tue, Oct 12, 2021, at 10:37, Andres Freund wrote:

- PGXS - and I don't yet know what to best do about it. One
backward-compatible way would be to continue use makefiles for pgxs,
but do the necessary replacement of Makefile.global.in via meson (and
not use that for postgres' own build). But that doesn't really
provide a nicer path for building postgres extensions on windows, so
it'd definitely not be a long-term path.

To help evaluate meson, I've put together a list consisting of 6165 Github repos with (?m)^PGXS in the Makefile.

It's structured in the alphabetical order of each parent repo, with possible children repos underneath, using Markdown nested lists.

https://github.com/joelonsql/postgresql-extension-repos

Perhaps such a list could be useful also for other purposes as well,
maybe to create some new type of automated tests.

/Joel

#117Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#115)
Re: [RFC] building postgres with meson - perl embedding

Hi,

On 2022-02-08 18:42:33 -0500, Tom Lane wrote:

I'd be a little inclined to replace it with some rule about stripping '-bE:'
switches out of the ldopts result.

Similar. That's a lot easier to understand than than -bE ending up stripped by
what we're doing. Should I do so, or do you want to?

Greetings,

Andres Freund

#118Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#117)
Re: [RFC] building postgres with meson - perl embedding

Andres Freund <andres@anarazel.de> writes:

On 2022-02-08 18:42:33 -0500, Tom Lane wrote:

I'd be a little inclined to replace it with some rule about stripping '-bE:'
switches out of the ldopts result.

Similar. That's a lot easier to understand than than -bE ending up stripped by
what we're doing. Should I do so, or do you want to?

I could look at it later, but if you want to do it, feel free.

regards, tom lane

#119Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#105)
Re: [RFC] building postgres with meson

On 2/6/22 15:57, Andrew Dunstan wrote:

On 2/6/22 13:39, Andres Freund wrote:

Hi,

On 2022-02-06 12:06:41 -0500, Andrew Dunstan wrote:

Here's a patch. I've tested the perl piece on master and it works fine.
It applies cleanly down to 9.4, which is before we got transform modules
(9.5) which fail if we just omit doing this platform-specific piece.

Given /messages/by-id/34e972bc-6e75-0754-9e6d-cde2518773a1@dunslane.net
wouldn't it make sense to simply remove the pexports/gendef logic instead of
moving to gendef?

I haven't found a way to fix the transform builds if we do that. So
let's leave that as a separate exercise unless you have a solution for
that - this patch is really trivial.

Any objection to my moving ahead with this? My current workaround is this:

cat > /usr/bin/pexports <<EOF
#!/bin/sh
/ucrt64/bin/gendef - "$@"
EOF
chmod +x /usr/bin/pexports

(gendef is available in the ucrt64/mingw-w64-ucrt-x86_64-tools-git
package on msys2)

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#120Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#119)
Re: [RFC] building postgres with meson

Hi,

On 2022-02-10 12:00:16 -0500, Andrew Dunstan wrote:

Any objection to my moving ahead with this?

No. I don't yet understand what the transforms issue is and whether it can be
avoidded, but clearly it's an improvement to be able to build with builtin
msys tools vs not...

Greetings,

Andres Freund

#121Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#120)
Re: [RFC] building postgres with meson

On 2/10/22 12:52, Andres Freund wrote:

Hi,

On 2022-02-10 12:00:16 -0500, Andrew Dunstan wrote:

Any objection to my moving ahead with this?

No. I don't yet understand what the transforms issue is and whether it can be
avoidded, but clearly it's an improvement to be able to build with builtin
msys tools vs not...

OK, thanks, done.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#122Andres Freund
andres@anarazel.de
In reply to: Daniel Gustafsson (#28)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-13 13:54:10 +0200, Daniel Gustafsson wrote:

I added a --tap option for TAP output to pg_regress together with Jinbao Chen
for giggles and killing some time a while back.

Sorry for not replying to this earlier. I somehow thought I had, but the
archives disagree.

I think this would be great.

If it's helpful and there's any interest for this I'm happy to finish it up now.

Yes! Probably worth starting a new thread for...

One thing that came out of this, is that we don't really handle the ignored
tests in the way the code thinks it does for normal output, the attached treats
ignored tests as SKIP tests.

I can't really parse the first sentence...

if (exit_status != 0)
log_child_failure(exit_status);
@@ -2152,6 +2413,7 @@ regression_main(int argc, char *argv[],
{"config-auth", required_argument, NULL, 24},
{"max-concurrent-tests", required_argument, NULL, 25},
{"make-testtablespace-dir", no_argument, NULL, 26},
+ {"tap", no_argument, NULL, 27},
{NULL, 0, NULL, 0}
};

I'd make it a --format=(regress|tap) or such.

Greetings,

Andres Freund

#123Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andrew Dunstan (#121)
Re: [RFC] building postgres with meson

Is there a current patch set to review in this thread at the moment?

#124Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#123)
Re: [RFC] building postgres with meson

Hi,

On 2022-03-07 14:56:24 +0100, Peter Eisentraut wrote:

Is there a current patch set to review in this thread at the moment?

I've been regularly rebasing and improving the patchset, but didn't post to
the thread about it most of the time.

I've just pushed another rebase, will work to squash it into a reasonable
number of patches and then repost that.

Greetings,

Andres Freund

#125Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
14 attachment(s)
Re: [RFC] building postgres with meson -v6

Hi,

Attached is v6 of the meson patchset. There are a lots of changes since the
last version posted. These include:
- python2 removal is now committed, so not needed in here anymore
- CI changed to be based on the CI now merged into postgres
- CI also tests suse, rhel, fedora (Nazir Bilal Yavuz). Found several bugs. I
don't think we'd merge all of those, but while working on the meson branch,
it's really useful.
- all dependencies, except for pl/tcl (should be done soon)
- several missing options added (segsize, extra_{lib,include}_dirs, enable-tap-tests
- several portability fixes, builds on net/openbsd without changes now
- improvements to a number of "configure" tests
- lots of ongoing rebasing changes
- ...

Greetings,

Andres Freund

Attachments:

v6-0012-wip-split-TESTDIR-into-two.patch.gzapplication/x-patch-gzipDownload
v6-0001-meson-prereq-output-and-depencency-tracking-work.patch.gzapplication/x-patch-gzipDownload
v6-0002-meson-prereq-move-snowball_create.sql-creation-in.patch.gzapplication/x-patch-gzipDownload
v6-0003-meson-prereq-add-output-path-arg-in-generate-lwlo.patch.gzapplication/x-patch-gzipDownload
v6-0013-meson-Add-meson-based-buildsystem.patch.gzapplication/x-patch-gzipDownload
v6-0014-meson-ci-Build-both-with-meson-and-as-before.patch.gzapplication/x-patch-gzipDownload
v6-0004-meson-prereq-add-src-tools-gen_versioning_script..patch.gzapplication/x-patch-gzipDownload
v6-0005-meson-prereq-generate-errcodes.pl-accept-output-f.patch.gzapplication/x-patch-gzipDownload
v6-0006-meson-prereq-remove-unhelpful-chattiness-in-snowb.patch.gzapplication/x-patch-gzipDownload
v6-0007-meson-prereq-Can-we-get-away-with-not-export-all-.patch.gzapplication/x-patch-gzipDownload
v6-0008-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch.gzapplication/x-patch-gzipDownload
v6-0009-prereq-make-unicode-targets-work-in-vpath-builds.patch.gzapplication/x-patch-gzipDownload
v6-0010-ldap-tests-Don-t-run-on-unsupported-operating-sys.patch.gzapplication/x-patch-gzipDownload
v6-0011-ldap-tests-Add-paths-for-openbsd.patch.gzapplication/x-patch-gzipDownload
#126Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#124)
Re: [RFC] building postgres with meson

On 2022-03-07 09:58:41 -0800, Andres Freund wrote:

On 2022-03-07 14:56:24 +0100, Peter Eisentraut wrote:

Is there a current patch set to review in this thread at the moment?

I've been regularly rebasing and improving the patchset, but didn't post to
the thread about it most of the time.

I've just pushed another rebase, will work to squash it into a reasonable
number of patches and then repost that.

Now done, see /messages/by-id/20220308025629.3xh2yo4sau74oafo@alap3.anarazel.de

#127Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#125)
Re: [RFC] building postgres with meson -v6

On 08.03.22 03:56, Andres Freund wrote:

Attached is v6 of the meson patchset. There are a lots of changes since the
last version posted. These include:
- python2 removal is now committed, so not needed in here anymore
- CI changed to be based on the CI now merged into postgres
- CI also tests suse, rhel, fedora (Nazir Bilal Yavuz). Found several bugs. I
don't think we'd merge all of those, but while working on the meson branch,
it's really useful.
- all dependencies, except for pl/tcl (should be done soon)
- several missing options added (segsize, extra_{lib,include}_dirs, enable-tap-tests
- several portability fixes, builds on net/openbsd without changes now
- improvements to a number of "configure" tests
- lots of ongoing rebasing changes
- ...

I looked at this today mainly to consider whether some of the prereq
work is ready for adoption now. A lot of the work has to do with
making various scripts write the output to other directories. I
suspect this has something to do with how meson handles separate build
directories and how we have so far handled files created in the
distribution tarball. But the whole picture isn't clear to me.

More generally, I don't see a distprep target in the meson build
files. I wonder what your plan for that is, or whether that would
even work under meson. In [0]/messages/by-id/cf0bec33-d965-664d-e0ec-fb15290f2273@2ndquadrant.com, I argued for getting rid of the
distprep step. Perhaps it is time to reconsider that now.

[0]: /messages/by-id/cf0bec33-d965-664d-e0ec-fb15290f2273@2ndquadrant.com
/messages/by-id/cf0bec33-d965-664d-e0ec-fb15290f2273@2ndquadrant.com

For the short term, I think the patches 0002, 0008, 0010, and 0011
could be adopted, if they are finished as described.

Patch 0007 seems unrelated, or at least independently significant, and
should be discussed separately.

The rest is really all part of the same
put-things-in-the-right-directory issue.

For the overall patch set, I did a quick test with

meson setup build
cd build
ninja

which failed with

Undefined symbols for architecture x86_64:
"_bbsink_zstd_new", referenced from:
_SendBaseBackup in replication_basebackup.c.o

So maybe your patch set is not up to date with this new zstd build
option.

Details:

v6-0001-meson-prereq-output-and-depencency-tracking-work.patch.gz

This all looks kind of reasonable, but lacks explanation in some
cases, so I can't fully judge it.

v6-0002-meson-prereq-move-snowball_create.sql-creation-in.patch.gz

Looks like a reasonable direction, would be good to deduplicate with
Install.pm.

v6-0003-meson-prereq-add-output-path-arg-in-generate-lwlo.patch.gz

Ok. Similar to 0001. (But unlike 0001, nothing in this patch
actually uses the new output dir option. That only comes in 0013.)

v6-0004-meson-prereq-add-src-tools-gen_versioning_script..patch.gz

This isn't used until 0013, and there it is patched again, so I'm not
sure if this is in the right position of this patch series.

v6-0005-meson-prereq-generate-errcodes.pl-accept-output-f.patch.gz

Also similar to 0001.

v6-0006-meson-prereq-remove-unhelpful-chattiness-in-snowb.patch.gz

Might as well include this into 0002.

v6-0007-meson-prereq-Can-we-get-away-with-not-export-all-.patch.gz

This is a separate discussion. It's not clear to me why this is part
of this patch series.

v6-0008-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch.gz

Part of this was already done in 0001, so check if these patches are
split correctly.

I think the right way here is actually to go the other way around:
Move DLSUFFIX into header files for all platforms. Move the DLSUFFIX
assignment from src/makefiles/ to src/templates/, have configure read
it, and then substitute it into Makefile.global and pg_config.h.

Then we also don't have to patch the Windows build code a bunch of
times to add the DLSUFFIX define everywhere.

There is code in configure already that would benefit from this, which
currently says

# We don't know the platform DLSUFFIX here, so check 'em all.

v6-0009-prereq-make-unicode-targets-work-in-vpath-builds.patch.gz

Another directory issue

v6-0010-ldap-tests-Don-t-run-on-unsupported-operating-sys.patch.gz

Not sure what this is supposed to do, but it looks independent of this
patch series. Does it currently not work on "unsupported" operating
systems?

v6-0011-ldap-tests-Add-paths-for-openbsd.patch.gz

The more the merrier, although I'm a little bit worried about pointing
to a /usr/local/share/examples/ directory.

v6-0012-wip-split-TESTDIR-into-two.patch.gz
v6-0013-meson-Add-meson-based-buildsystem.patch.gz
v6-0014-meson-ci-Build-both-with-meson-and-as-before.patch.gz

I suggest in the interim to add a README.meson to show how to invoke
this. Eventually, of course, we'd rewrite the installation
instructions.

#128Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#127)
14 attachment(s)
Re: [RFC] building postgres with meson -v7

Hi,

On 2022-03-09 13:37:23 +0100, Peter Eisentraut wrote:

I looked at this today mainly to consider whether some of the prereq
work is ready for adoption now.

Thanks!

A lot of the work has to do with
making various scripts write the output to other directories. I
suspect this has something to do with how meson handles separate build
directories and how we have so far handled files created in the
distribution tarball. But the whole picture isn't clear to me.

A big part of it is that when building with ninja tools are invoked in the
top-level build directory, but right now a bunch of our scripts put their
output in CWD.

More generally, I don't see a distprep target in the meson build
files. I wonder what your plan for that is, or whether that would
even work under meson. In [0], I argued for getting rid of the
distprep step. Perhaps it is time to reconsider that now.

[0]: /messages/by-id/cf0bec33-d965-664d-e0ec-fb15290f2273@2ndquadrant.com

I think it should be doable to add something roughly like the current distprep. The
cleanest way would be to use
https://mesonbuild.com/Reference-manual_builtin_meson.html#mesonadd_dist_script
to copy the files into the generated tarball.

Of course not adding it would be even easier ;)

For the short term, I think the patches 0002, 0008, 0010, and 0011
could be adopted, if they are finished as described.

Cool.

Patch 0007 seems unrelated, or at least independently significant, and
should be discussed separately.

It's related - it saves us from doing a lot of extra complexity on
windows. I've brought it up as a separate thread too:
/messages/by-id/20211101020311.av6hphdl6xbjbuif@alap3.anarazel.de

I'm currently a bit stuck implementing this properly for the configure / make
system, as outlined in:
/messages/by-id/20220111025328.iq5g6uck53j5qtin@alap3.anarazel.de

The rest is really all part of the same put-things-in-the-right-directory
issue.

For the overall patch set, I did a quick test with

meson setup build
cd build
ninja

which failed with

Undefined symbols for architecture x86_64:
"_bbsink_zstd_new", referenced from:
_SendBaseBackup in replication_basebackup.c.o

So maybe your patch set is not up to date with this new zstd build
option.

Yep, I posted it before "7cf085f077d - Add support for zstd base backup
compression." went in, but after 6c417bbcc8f. So the meson build knew about
the zstd dependency, but didn't yet specify it for postgres /
pg_basebackup. So all that's needed was / is adding the dependency to those
two places.

Updated patches attached. This just contains the fix for this issue, doesn't
yet address review comments.

FWIW, I'd already pushed those fixes out to the git tree. There's frequent
enough small changes that reposting everytime seems too noisy.

v6-0001-meson-prereq-output-and-depencency-tracking-work.patch.gz

This all looks kind of reasonable, but lacks explanation in some
cases, so I can't fully judge it.

I'll try to clean it up.

v6-0007-meson-prereq-Can-we-get-away-with-not-export-all-.patch.gz

This is a separate discussion. It's not clear to me why this is part
of this patch series.

See above.

v6-0008-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch.gz

Part of this was already done in 0001, so check if these patches are
split correctly.

I think the right way here is actually to go the other way around:
Move DLSUFFIX into header files for all platforms. Move the DLSUFFIX
assignment from src/makefiles/ to src/templates/, have configure read
it, and then substitute it into Makefile.global and pg_config.h.

Then we also don't have to patch the Windows build code a bunch of
times to add the DLSUFFIX define everywhere.

There is code in configure already that would benefit from this, which
currently says

# We don't know the platform DLSUFFIX here, so check 'em all.

I'll try it out.

v6-0009-prereq-make-unicode-targets-work-in-vpath-builds.patch.gz

Another directory issue

I think it's a tad different, in that it's fixing something that's currently
broken in VPATH builds.

v6-0010-ldap-tests-Don-t-run-on-unsupported-operating-sys.patch.gz

Not sure what this is supposed to do, but it looks independent of this
patch series. Does it currently not work on "unsupported" operating
systems?

Right now if you run the ldap tests on windows, openbsd, ... the tests
fail. The only reason it doesn't cause trouble on the buildfarm is that we
currently don't run those tests by default...

v6-0011-ldap-tests-Add-paths-for-openbsd.patch.gz

The more the merrier, although I'm a little bit worried about pointing
to a /usr/local/share/examples/ directory.

It's where the files are in the package :/.

v6-0012-wip-split-TESTDIR-into-two.patch.gz
v6-0013-meson-Add-meson-based-buildsystem.patch.gz
v6-0014-meson-ci-Build-both-with-meson-and-as-before.patch.gz

I suggest in the interim to add a README.meson to show how to invoke
this. Eventually, of course, we'd rewrite the installation
instructions.

Good idea.

Greetings,

Andres Freund

Attachments:

v7-0012-wip-split-TESTDIR-into-two.patch.gzapplication/x-patch-gzipDownload
v7-0013-meson-Add-meson-based-buildsystem.patch.gzapplication/x-patch-gzipDownload
�%�(bv7-0013-meson-Add-meson-based-buildsystem.patch�]���8��^1������v�u�{P����N9vw%��:���R����HJ�x�Y�AR����H����^��]�f�9^-�t~��c�,���e�����������	��,�{R��%��n�_����G�����HkB����E�~������H>M���^�����&�S4�F����8�9��Y����j6;z�����A��|���o��������hGhY@Oi*~D1�$Eq��)}�
�M������������S�G[��PX������~�_�o7;������}���r[�7�1/k��_�0-��-)RWuC������:9��$oSr�������z����?�Fh��F'2�^�C@9W����g���K�gI�N�������J�l��f�����Xg��<4��T����Tq�)k�q����B��M�S'U�d�����E�2��[A2�-��t�#��zX������D�WWC�x���;RO�d�v Z+��)�3�$�����l��]XpBq����v'p�V�����-�-�����������3+R�`��}a��N�m~E�������z��SB���8ie]	g
�s��p���(�U:��V6\���z���VqqY6P�U��� No8���t�<���<��n��]h�h]�$��X���~e�Y��)��������<�p�:�����_����|�ZA�z~}90�X�|��$��U���o �7�ki��.�kc�i��pc��fF8���HZY1�jb<��j�������1�0�i�mP�5Y��EVXN���~Io��{A��:e�h��}�f��dc�`c��t:��U���Cx���$$�S{6	_n�Gu9n����J�gc\�)��j�8�}]��:k|*(�-�������]it�
��6Ybe�u�U��]��ko>G=n�9��?�!���6���U&%d8�������t��O,4��t�5��0�{���`7]�s�H;�����k����8�����M��O;G�$�I��e��ujt�p���2�����%8��������U�2�?�[[W�FO�s�+������[{���I�Z�����.
l���-��9�4�y3�u���2����g�qz�A�C��}����qR��7�]���b�u_��O�=]�����vI���n9�9(T~�1�����O���`z�P!����53(E/8�!d��`z�J��Q�v�1�F|��qw�_k��ES�y
��sj���I�p�
.mw6/�k�4��N����p����$�_��5�6��.�lt�8f	��r��65�{�����������%�R�����e\L
�����G�Hb�����~���n�H�N�:�k�v��U&��F���e�������=��f6�-G�*�H��s}~.�6�]�#{����K��l�~l������(�A���:��]�����3�w~)��f�$�F=P_����C�;�7{}���p��^�8���[\^��x~=���#���������W>�Vs��+pW�1.���{��)�{��wV��K��q���2��.K�(�14������__�q`�4����]+�$�0:Z����s�~��H�z������e��w%��]�8������3{���`����,��]5����K��!�+��j�� �����v�9�/�I�����qJ����?Z.l�R�v���+�tQ`�����e\�F�����3����%+h���4�r%�(�/��-��v������\n���0�
n����q��*P�q�J���[��Cv�U5��s��R{�����^^o|�S?L��hg��E��O�KR?V��41���������KO�?F��5�N�����:���:P�e�n9�q!
�~�i���'�� ��>���Y��w�:l�'��$�|^������Lf����q�]$��"�8�M��kp���kv������m�����m����'m��I%��>�r�-�i�i�p��nva�����*����������(�:���=�g8n0��}�,X�����q�pK���1����<�<uD28�$����W�mN��DN����.���E	���HEh��S2���#�ia"��8��$�11]TZp�EUYE�3�_�x�p��0����A3>z��V��e���7�����"��EeE�u��S��m�)�������W���8��f9�Z��c~���9p}������`,�0?a ��I�������V�o���J%�N�vY"_x�8[H��?�{Y�H0�j����������YB�����h[��v��gG��hgph:���	�f�/�T~���jQ�6���q5(=w}~d8�pLo
�K+�>L1���@�X8�]�S2�������C��A��89���n	s�i��8q|�=�nq�9�O�NTr�8�������A���~+5!f��t\���	�E���%�PYq�{�*nC��["`���L�*WqL�=���(��������%g���m-R�V���0#H���"�P�^1��.�F��``��5����IM���}�WK�C@���i����>�A�����q�%��`t�JQ������\]-.PV��������S�B���|z�&�!���7�X.�Kk~�sH]]�!�T���r��b�����K^�]`E�I����+D
�tW�S!�u=���f�N���0bx��qJ�C(N�~D�}E��B�zD(R��8��s�p=�5�CxQ��eW"�d����)^�)�!tH}%�!��'�E�Y~�u��/���p��Pj2�!P%�����pT�j�B�]|9
~`��vg3�L�^�f� ��kHOk8��8SzC@Z��c�q���	0[~C0TMq�r��J�C0���������T��J����<�z��c�s�����%�!�%:��D�@��v�9�!��vo�;@�#�
s�C ���Usa���f�t��aLopV�g�b�B�	>�9���2&0xAZ�B�����5���9[�W������
>�97!�g&�`�������r<-�S_KCp�Wb���
9�=� �^Y��a�0fxj��\!��KD
5�wf��,��+���� k���f�k���SN@"`������ge=��]����A�N�5���2����~'J���~��r�;qz ������������@��;�;+�������'��)�
�D�;A��{�r�FY�}0[��g���A��^�m��������{J��Lq��1������;AJ,��n��e��w��c����1�nD�P��n�=>�p����@x'���������w�}�����nU�=�n�1��
1��j��vxEK�z��u��6`�[?o�_������L��aHW({`�������a
���h��~@������90���}�!A���pm������_����������`�0�9���5���Z@��D�{*[��m��!��X��?�K�3h*��seC���\�H�1��>�
�T��C�p�`C���Mt���}���Q�����t�5�	��������QA�yt��"G\�A����t�����2��/���(RwgE��G'''�������:�?e��G']5��8���~F��N�p[�L������y����S���F*��R�[�q8
M�A|�K�bK���r�`\P�y�MY�ek���G�L�N~*+�Y�n��M�7D.�7D���	i0������w�`�RC���P��[^Dj�]���Zu��`\���L/Xp��u�T)Z����0'�����%�P���J`
��W*��p��$���F�tx������T-�����o��������ohw%l,�v�R^0��R$$�L�*W���K�� ]N����Jn�]��oZ(b#��N�������Q�MC�\T�n���\�6o"���Q��j���d�L,�������!-������
�f�4����y��|m���m�~��b��W��I�T[������$������S����^KLy��p&&��#"���-�pn)
��[*��T:0Q�tO\��g�Ja������K������F�D.���{�?�jaw������/�TJ���8:��m�,��"�W#�=E���;�
4y�&4�27>?��$��/��Je{�K��k>�7����Y��t��	[�4�'�O���S1z34��>cF8��-�A����f��R�D��	L������$b�U:�����J�b�X;��4��m�G' $�����"����^Cp�����Ni���Q�"������+�H����{���(~�y�
j����IHeb~7���S��]�.��}bw�O;�N��3�����\a�������v�;e�����~|��e�����cmt���X?�x��������xS��S��z"�������/^��em��~����l���w��4e�d7��@�S>�	�(���+2&�X/5�P��/�l	k���Yl��z������N��a���m����Q��dE�-�������CAM����v��g�F��?_G/^�z����(�F0����-��e�_5�����f��`�P�����?�{�����[�����wd�
z	%���������P����[AT����=]��l��k���E�f?�6[�]y�~f���6��4y�5�f���NY����`�C19��%^�.�k��h1W3a����x"��M�	(�����F�J=�E�|��g��N�)��K���d*J�@�l��*?�	[,�)�r��j&��gk��2��Am��u�x�����N��x":;>�j��x�p��t������u?P!���o�2���O���*���lI��S`����i�d�����~c"���ar�����
/����={�2��A�����_���}�*�e�
����_�y�����/�1c��^��/o:YL�$3�\�������������������_�<�<�5�u�Da����q�U}�����xf������%/�������(��k���;���o������?���OGv+I>���A�`e���9%�6��e[���gs��]������E���8t���bO�p��dv���]{5
C7c��P,:��3�;�	��U�w�\�d4O�.Y��#�O�����2M����N>+�_��XA{c��s��LK��Rrm��<f#+~�lQ~@o��q����tS�s��j6+�U����^'���=Gv�L�O����2�����M���r�\�.|����Q��m���]��d���{������P�,:��y�X����q�T�n�3�6��1p��<=X�t��Y�N��3�4:��|�g?�v���Y1��
[��k�<��?�vX����OX�`b��_f87%���~�%[P�wq���fe����-���5s�N������LS�~�r
&,�6����4��H
��q���h��k�����e��_�����w����+G��8�/����w�L��Y�����f���W�`��-
�����G���U���&���>e���%���.+[
6�=�2�+��{=n�_V|.�
*������0^����k��n��n��.F/G���}WR�x>�C�YC���i����J�%r;����m:n�w,BF�t��A�z#�se�,9��g4�h=�}�]��#��GD��]��}�������u��\�����p,�p��f��2l��M����9���������hz�TC+�����^w�^�c�G��{�Y�EU�1t��\'���2�
�j6���G�zD���79]O���������D�^�b��
��)�����f�z�=����hm�a�H�Tm��3��2�a�'����i^u�)��D��w�����c���)���!�Mj������>I�A��8���K���8���ruu�9MY���m�p2���R*�5������rx������}�P������OB���"��UW�@�����A�;�Dn�}�b]�Y5����p�
�_�#K]�C��,(��{;Mp��P�KW���P'�I+R=.��A����K�������|+Z������>�kx��(���b���S�0�N���)�QZ����QQ���B2����{�5����(�����|�t���}��)TV��4~p�O�e�����b�H�(��z
�]�Pj�Wm���,�.��%_I��]:�@�P	jq���<�<�<�DD.�L$@��\����.���3####c�+��r(�L�8D�W�uy%�]\���[�D��$6������h�hM�,P��+����f����A����8�)�����������!q&]A�".x�V����:HeQ(���g&��������T
�$I�J5I��sz��[>���=����0�U��@Kmi���5�cg���?��x|��)T'Y�9^�nL�zA��9��M���na'vA����{��I�������*=u�����{��3zhu��g���i��kF�G��A������R�'���y�'� ����6���[
�_�!<1�[)��9g��25.�`���k���|��������Z�����������K�Hx�ow�����_g��������}�������
��u����C-L�&�`�`�����t!&Dt�s�9P ��"��`�x�����W�����'�b�d+�h�p�!���=/�ab:����q�+(M�Oj���!jMB��78L�v���	�I�N��B�+��wf��7�/K��}����/���_��%(���l�Z���I�r����b�A��b95L�pZ�b���UU`���=�]GP!Y�����y���1�3���U���R����������BC^�*p{�nx�G1�a�D>�n������E��]	;yUk\)�v�\�X��Nz�(l����|J�Q���������zb��� \G��o��!�t\�
)��������p��p,�n9;$s� F�u�:�2`�-�������{!�J�{��"*�^�����!��~�.vD(t��&W�Bf��b��^�����S�~a����O��N4��9,��SZT���~�I��:|s��]�'2 1;H1h��8���*�#�<!I���C<������nR�+�����W4�:q8���VVQ��+��ZD�E����I	lq���t��b `P�_���ig�{�/���H�'a���������}�{!u.�����D/	�Bny`h�|<�e�N���c���enph;l�%B(��)�|Jv�t�I�(���	�<\�WJ��&��hQ=E�a'e�������q��eu��	66-�x�/���(&H�I������}2<�&I�a�D��D�/�T��(�D���P�0
{��������:6�.{�h�������`��.q��QD���	� p�/��3f5t��:�=�4<9�}�%��'7�8��[��SvI�+q����N��N�O�Q��7�t;���k6�M��V���E�����<�g;��777��I�������Z]�?XG:�o ���QS��l�� ��+�-TP�	I��Pq|$����p�?EA~%���A\��1��8�H\�[��3�aX�$#����3a<��Z�s�b)�h+�1
b��	�S[��sb�������FS���rhL���kEA��Ym�p{NvxWJ�v�BW�a��{cE2��+��d@���%�������^�9z�����0��}E����%��b���JMU)���+*��.��N.t.x������r��� ��������'�`����zH'��M��P��I�7p������O�;�$�fWO|��W�����j
9wl���U����edX6M�Lyz��6��d��eSj�&����&
�1�3��2?l^������Y�!�U��(�Qn�U|���%���Ix��D�+���	���F�3���[�'.f��c�"�+�I��� ���)��jP�CZ�T��Y����	�d5_�aG5aM��Z��1�R�Z�p����i��8m��)�*��[�Y{�.�[���P�U���=e�;���������*Wb���z"��|�`�
�,�n�����.�<g���yR<��1����F�U2F�.k&�} d�$S%�{Q��M�{��8��<����������n~G?���6~��.z���T|��^,sO�}{�>�k����d�c��������	~�b������!5��(�]�@�Pp�Z���^�Q~W��:�����WK��G��|"��I�Yg�J�:��<F?�()�K���T��(���4
�y�,���L���3����J]�0�=p)���A��.���h\����a�(	�8S�.�aF��{�M�y	���ct�<�N
�.2T��`��&���������o<}�O�zh��@�����52'?��x����oOv�T3�+��,������Z6X�{�	����Y����1��Is��v+���s���~�1d\�������Y�8�wg���������
�{�����?�����;>?|s���p��O���jq��$����Yjo��0�/�:���GHy& �Z��{��������{���Z��XVY�L4)�f��y���.�����p������W�BcN��'v*�G#7�2�r���L�\��a�����K����r��{U���H&O�:cYY]��H�y����Zv�l����
2m��x��������
K��0�=H��B��!:%�	����j������IB���Q�����u^���x����3�9��������{�{L�'�����}� �&���KE���rn
_�������UR ������Up#X$p�+��
��^
w�������=���]����]��@�s:������Y�������'�+~�]����S��p����	:����g9�����@V<�Xyz`�	I��N<�w{��Oz+ ���������^Y����Vr^�$�����3����������C�4���L��{�s��L�w�5�;Y\^���y���:�ltt-bG6S��������]vv~z~��S�.�����"��	�%,����m��+O���������&����:�tJnF��V[S9�5
V
��m�+:L#{{�2Q�������S����s��v���q����9���c/M�0uQ��M���W����%�����T)|��{�{T�ITU�Y��j�NC������CB����qU�������0L%��j5
���(�dT�P��+��Y��:D��5$����~H�Mh�&K��CjP�\�.J$A
:6L�N4S~zJc�b0����~�5���������E��!+�^�^3�-��<!�uG�!��u����	�B�t=���:?�d@�`��^���6F=@��
<��������oX�W�GBe��}����_'�����7k�5�P(���d����(��������gov���/��zu�jP5���m��CO�V;?�����p�<�?��l��9���//~|uNf�/8���K�,j{y���_����yrFF�Ga*�`� rt�����e��_��X�w���s@���a����]�s~�=zw�<��ovw;����������9��d'�~x���4����?Q����^H��8�������������f�!s��V��h���:�+�������YW�`��v3Q��4	~�#C58���f���3/]�&�����Y�ga8u�}�D��I�ozk�����@�l�;�L 0��z���=Q�LT�� �!�����	��(��S�x�Ye�^������o^����K/�K�wity�C~X��8{GB�
�����7��nn�
���TW3\sN�K��.�����������Y�u4:!�^�3�������60��H���U�]}j����7�L?z�u��*��E+S���`���[sz�n�n�Q��7����= O����E��'+8�I����7���A�_m���-�5�� ��(��

B�`q1t�J��UO�������)0S�����PCB��5�C�`��N��)
z'��a��Uz.��x��F�����`�t����n5X@/��\L�^V<+a�xY�`w�K�\{���� z���bP���1&����D�$�	-
�Go�!,�5�0kh��1O���u��������X�t���U:�n��M6�)�����`c2�Q���%M���#��cxH�&s��f���E�A�Fq
�R��G�L�D�(44
�O�1�������5*X���p����!e�}����jI��S@�yp��GaT�MbY[����6�Y��K�1����r���X!�ge
b,Z��V
A�e������._73W�u��'}c��o�R[�=�Ug�P8�W`l5%��Xh�LkE%F-�""@_����*&����SX/�����p�7^ �-u�zM*�
<f�.���X����E@P���O��0����Y�Y��^�5��},�-Z������)]�>�l�)��7��pc�t���)+������$�i����������S�t�>g���6������zM���lB�!k� ��T!������7nz��P�����`��tz�"'�9���
�.l	��j`��yS���1C�Rh6�L��5^��f������v�����{�C����#�A(|9�S �`p��i�I�
���f`�~"J�
`�9��,_9[��g�����h�W-�m����Kx�[�c���x�
}ufL�5�to��~����Iv����k�c�L����g0��r��kt�Q7�I
��_�����{�4�;5��|�*�P���S�.|�g�4p���U(s�q��0��`�8����K]����T,��`K����\�wFh+��p4�v�����"��� 3Xm	�!@Z�]#j~�������|��mn�����A����%:���b)[s=�
��l�a�E,7vOf����]�_
o��U~�I`Tb
g�r�fH����gq�[�������,Z�TX4����,�����5�U����1v����367��m������Fc����zn7�/_��������I�����1y��aqOE]�@�.�����],H4
5q|X��M2�Bs�j�\{i�0_Z�������a�-�A"� W*�����f>P#���"�U���yV��3#Ez�Y����I�c�:1�5Os�������-�_.���t?NKV���� ���|�+�lY�����[�z5���s����y������j?x� ���t���;YTt�}���i���e�����wi�HU8�&Gs������~8X.�X8w�D����U��y��/4tt�.���T��E�Da!g�7�A���!5�qR���K��T2B���}u���@�x�j���@(���-�+05��.O�XR�i<�(T���
@F�UajDPN>���y�y5��5s��t��SCC�l��:�:��I���+��p6����,�:
o��G�E���uBN�n�,�En���t������!�9l�������w[
D�+����},����RE�Ys��7�V�]1�kYvT�����;��@����\�)LQ���`,�R!_�"8=���4�k���NK��<�%�"�����Z]}5 !�A]
��� �,���GP
��#�)l
=Gj�=$"��TD+�v���Q
_��Jr��*����R����\.S������Xa��{;�,������\����)�ICbjT��9�����������XR/�M����i�`=|kD!{L�N���������������&�����}�o���o�U�@�� (`�=l���"��?;}���"�S�L
�N��XA�J.4����������A������Z�?_�I��$�����T��a)����#x����`���^~���0UN��*���Z~K"���	8�^|��-P�:6.u�>7G�G��>Mn2
���P�����$�0�eA	^������F������
���P���D�<@w�2�B}<��- ����L�y��p��K����-��D�Ai5�c8Qg&����@4
�W��( ���P���EP�����r�DJ��n�)I?�CI�+�K�_i!�5�iQ5v���Y����������`���������M��������oQ���uH[����o������e������h�`���"�!P^��r!��g��Cz��5�������"�a>/�D3&j�$���H$��8u\D�CS&%h��?����M�����%[�#+� �0��PaP�Q(g�9%�"%�����E��>
\V<�����:N���E�C
�s^����.��r��(G}p����_�"7�uh�xx1rd]m����XN��Lw��b6�h�CB4��
Y�#X��R�����pBH���R�����w���5���u��z��Q��I������^}�`0���p�����=	'���D��f�Fj��FpF4PG4���E��ir�q��}��_EO�L��*�2]����%���2��~y��L��>��Y�4�XZ_��qB�e�z��_=�������1���������/f����U�"!����f��bq��$�r��� rC��d�"���+z�c�X�	������R>�DQLW>Tob�c���r"������Y�o�M���cQ)/[��c+�����IU��bY��d6�p�5&d�>���+�z��
fr�G�a/��G��Vu���FT<&4�[> ��L�j�q��f��c���������7��1�m��tt[�03r8���,Bfh#/>Er�Ot�A%��Eyb�*�����u��3�VrK����6MFX(X�wU�R�g.�).D�*L��T�y� �2�O���?���DM�4��
��)\��ve�s��Op�hp�[�;��J�5�V8�nu�P�`��M���<���n&U�v.PUA2<�����-

�	�_T�e5����1���ID����G�4�}�u�q�����[�8��C���������9�~:<�]����Aw/��t�TQo��x��A��k��\zW*���>W��U8S���%���PzACf�5.f�=C�G����I�%�RZ�i(H|�����i�G:��J+(�az�!���'������ ���3��~4��l�!r)$��p]��X��!��X���',��5P����h�W!wp��������oON�Y����$�@s�,���`A��XZ�)������A�����,�Vy,(�J,�4�6C��a�f�z��s���� aJ��C����s�����S�^a��Z�Yc}�T��3^���X�
1���r�?���9���������^�m�$�~���k�qg4:
�6���%fc��QP�0��#�V�Uh.U�6*�F����u����e!�%��4��\C�����G��j�I���)�����$�>eC[]�(���+qj}Lf��<&�D�(�qJ�2�S��E�Is�����2�;
���+T��o���>����9�uo-������re��H�@���c��_���A,�H_�k����}����{~�V�ZH�����SpJ��yk��3�{UY=u�w�����;u:`S]����j�F�P�ZN9�����}���;���	�u���AF�d�7t�T:D���E��f�s�NU�!��c.(��������M_��qZj,PG�
���y�X���.w�����,��,j�"�i����^d��
�f�4�5�������_��v�1�e�X�
X"�N�O?[�*�[3�F���������]e���0�W��������W:����C����{��u�'q�.<<;|yxtx���{~~z����A���R{h��j�|%!~�=)�Q�_EA�x�V�y�PT���J�����3���,���?���E����E�i��6��N�o1��)m�	.!�� 3�0�$�����H�^��"��X������U��5�R��J�[��-�Y���b�j;s�f&����F��
u�u��r��S���q�:���]`�������VV,������aBTp��!���A���g:hA)JlG�����?��xq������/���z��%7c|�1�����z��G*���o}�|jpg�����r�K0BP��2������� ��;��K��eE���t�3���S0V��U;�8Z�4�	:�b�k����p�nPu�
��6��<���E+�RZv�lbh���c}e�S���SV���������v3�ahl�s���)�RHv��c���|}?�[��9��%U|P�Or��]%�;�(��_�L4������R����Cr^�]����{�a>;��0��)n���Uqa��2�lY�Dyt-z���0*R8K�V�C)�T>fsN��!�E��W����d�����E�,�+[�'�%W��]h�"uEy����*0^3���p9�����VM_�q�����yT�����)E9z�����c�g���9$��-�\1��	8bV�s�n�����(��������+����2s��Gp:*^��c�<��o������T�q�0a��o�$O�yq(�7W;����`2����p����	����GUR������^l���QUm�kQp��z�:DQ�^�z����Z��Bz���e�(`S����r�J�(�~���,ou����w����L��#�4wo�_P��)�3����&�ZQ�$�T��e�Hs'��E�k�4������O���Ib4?7r��,d�7-}��8�p#�h����k���Co�Y�������c���r�i58�o�CM�������h�����iI�~������Rs�u�,������:VQS����Tma|���
�`@�Z�6T.�P
���;��%��
�o�U12��Z�o����p�~KMs��t��
�|�9SV���4��h�S�����-C�LQU��1
'�Q�����f�`dl�g4n{�q7�\��Q���M�2FR'�qM4�ADB���E����"mj4�f��n6����66����Rs*n7�OF&hti���U�Z�$5�C��tF�����U
��~�=m���3`�V	��y���vH_�ko�2=���Y�r����~8���A�N�fT��&���&U�j� l�L`�~���%h	�R�v1��/��t� P2���S������e���������=j'H��j�������%�gy��Mb�d����wn��,��(LQ�C��O���_�����x��C����a8+�T{��r�.s��Y����+q��JeI!�����DV�:�S���gqr�����U=-��
�o�^h8�<L`�n���d�>%��L�3�1���^�?s��Z/
�@`�]~���X��S��R��y{J�6E�F�5�,����/^u�V*����YI�vd����6GYe��Z:+u����5[��t��^�_�����{z\�z�(��=Rh^�@^U��H���U��p�6�lN6���r��.u3q����� ��|GB�}������������?����V)d���*+I�����I��M|�����~9��>Ugw�u����^��)l�}z���)����7'��4������5���������L�S������M#b
�n�R���=[�p��?X�f���{���S�|�P�����+��i��B��v�l����{��^w�?h2W���}�Y�����[��'�����9��80A��yB�$���YeIs�/������w9�b��8vM_lP*U�[�6��������YmR�Y�Rz�5�n���l�]�[Q���!5�"�r����3=������A9@&�����9�n;�p�~z�E�x��lF����
r�����h�1*h��&��w�~�1z�b?�j�}g��'��8�f���X����!�}�[(`��b��M6��
��:��V���f���]'������������=�����\
c&���u����V5�����
.�R2�-4��k��}��I�zbfO"s��_������`�5�z��r;�em��1l@���W����������������
=M+b�Dq\e	k��pd�R��a����*�����G=�jO�b����gy[��t�p��.7{�jK��5��c�b��,��rEtQ��, �S�_~�����C�|�jlH��4��)���H��W�%���H����X+Nr�C�ED�^���)����D`�;a}���:/p�� (����^���i)9I�b)�E!���
��3�%N~d��a�Q��",
�u!_fF�Ev@����b��� ��}�k[����
��
�$�RS��#�Dj��/E^Z���Q�+pO�r�5�\FG��`NI�U�R����7�~�$,��Y#N�3�c0;�13���Q��6�3���&]K4���M��we�W���M����a����L�Q�7z���
�6Z~�����HU�Y�A�f���F���NMTU�8tE�]�R�����~�������v�Yo���W��������W���R��p�\�j8#{��;?.'-��-2�!�bM�����5K`��x
��p��a',����E�b�NBW�������v�1���pS5(`����T���3�6&� ���g'���h����TWm59�Q���Q�5�Q����\�hj2�,�o����M���p�k��2L���2�Y�E
s�
���7�s��7�e��d��6���\�Y#t���� �	�FY���bv�V�
��w��*5y�yr�����"�]�w���-8U����*�4�m�e[��X�e��Z��x��m��,�a,����s��+�i�����0��$�l9+�T�,E�����k7.��d��\@�����2���/�����-��E�%[�e\��x�F;
������k	ma�roYb5�"�����((��W�,���������`�	�+�<�J�Wp
�+���jsf�enZK�w!�.B�*6��z1�e h��V��1mQ��U��]�������$cd��v�m{�<�b^t�_���W�6��A�������s�����^�����v�$�7x�&��o1��#�4�G�i�*���J�4�P�C7Q�"C*�z�_x���4P�
� ���������87��$i����Y�����+�"����;��������5��P57
����Na���r=t��h�� �qES�|�V_+$�"�XC��t���}`��Z����:��N^U��z�������r������%
5���^H����/C5�YzS�L�g�o0�f�{��F��f0��?�T6�^r��#~���6z1k�|�J�������25�SX
g�dbmy������������|v�-�SaNVR�d6��So�x��y]���\���1�{A���@�R���B���*6Cuf;U���������V�l�I�|j(�J���iS��j�*�S�3W��rE/��{�g�/O�L5�c�^�l<�}7B
����4�����OI�������n��6zO��0]��5���M������x�nN�����1fc��	���7S��R��#-�������h�hv��z��-]-w6��-��P]�M�Y����/�J::+=�|d�U���t������U[-��OC%7g4���.��QC~)j.���RM��`��l����vJ��	-�i�Y���-�6$Y�$��
h���nX3#���������f����<3�����=�7��Rc�
s��h��(Fp7���U^D��fD���\�>��~0,Wz�lL�	k0I���$�M���\��?�z���v��Zne]��=��P���tu\3t3����Gp�	�����=�0�4�=54�r��xY�Y�K�)@���'�|[�;\HR7w��-�7����x#h@�m���w�|����(���{'�DEu	��%���DO_�"]������ku���g��X�<���D�y	�,4�l��ws�.�-���4�����g����4��H�*Q��"��<��������]����F8m���4w�SM��y����S���O^Pw;�������^8�����4U�Fvf��d��5�k��C1�.��l���A-,�L�rB�[�����s�W���W�b��!P�f���W�@ �0D�Xs$��B���4�f-4��D�BE8J��I�(F/���n��`Zxl�\hR��0*�i��5#��R����������\�0���-�����-Sr��X�rU�mQc\u
���2i���W��]���>�"�Jx3��=_�]t��J����"�#���E3�����`���~n~���	`�*��/4�g�*
����$*P8H?F�����jY���%���+��<��iq�����+�����p$����H��l�xe����[5m^U�B������B�H��V�Jn��.�P_�2���R/��X@�	����� �u����op��)���M�&�|\#���z���~P>���)�8���er��ti�M�#��pV����ZV��k���U���[F�T
���3I�P��,���c�_��4��=��|?������
��	�����-��V
_�x��y������mN��u��0���_�	�*r5���7��x����"�j��&�9�9���X �6��D�a�a5�����"��q	�C�7��HO��b�5�������f��
`�J�����.�jn��
�����cYU[�T �2���{��Z����������������d8��I�\&T��=%C���}�W��hb����q--��81|����q�Mf�����E��'��&
����=���A�5
���"���Pi`�d���#��l��A0Y����{N�e���X�Rh�(r����c�<�t���in_�5�6����V��[������+]��&�F,���Fq����6"��M��u y�V�������~�2�A�M��	����Lk]���z����jeQ�n|��?��f������o>�.GX���u�[ �%����A[�Y��/������2x�*:Ki�(5���U[��-m�:d]�������R��\7���5��[7�+
�6/�m�n|W���H������M�p~�n|[
_�{[�AW/���&�Z��Y��Z���\	��D/���&��������Ju�=K-�%W�X��@�����$d]��(V�OI�JK�+c`]����`4Z���EA�����;���9���0��a��T�e
�~��
ju�?�?"`�P�C����Y���p8�l��~_�
���O��1��=�GYwZH|o�+")��I����<��&�������htB9��f���?K�a�|�x�q���
<��[){�)8��0U_�4u��ja���)�
/�bkz53=b�T��|��m���@nf�:Of�\F�d&ZZ�:F�������z�`�\O�����o�
ct~2�D���K;$O���*�t�y��g��%	N��u�&�i���P�o������{C��/G�b�Uj�k�,��GC�z�����m�����
R��Io�C�'�.=�f?���r�K�]
����"#�Ap������Q\�X���
��E�T�(B��w�:��!�H�`J��
�\�������aoLYo�5�4���w��� ����������F}�+>�i��>�����v�����\:����56�����u�"�4wOEjQG39MV�������a��1��`{�;����i1'���<�33_��D�;%��O�,[R\:�H��������L&[���qc����=�^(��'5t�V�v9a��m��-���o0��C����[P��A"�����_Y�U�=
6���PA����[L������8�]���^�x�UU�|t�uG1���������1�_-M�Xi��s8�,��[����s���St��j^$���G���|��y/�Z%�5dXc&�i��}���������x�U�����������jMln���lln��^��4��Pw�!,�}?�-0!���H,��>j�
eTlRP�/�J��$������0����"������J�n��XX��jf����\^#���}���������A�A�b</�����DU����V]I�i\����"5�����n����������:VL���g��$y�A�]�U�������9�.�pY��d<aBm�:3Fb�q�Hf�	��c(.�fJt�n�0~h~��9�U] .�;�3���43{���($���:v�J��c�%��H_W��U���<�������%��3{����v����IoXs��nF��>��'2Vy���+`�W�L
��N-W��(�����>��"�����3������H��h������{S3y�&s�*��)^;Ez5�+Q�����\��9�O��7��*.m�������x:M�iy_N�<]>�Y���H�����.=
��7�y�k����h��e����%�X��2�p�R������4�u���.����P�/RR4�8W=�����iV��XFM=�A�U�7mJ�p���f�9�_��8�����Y�M�-��%[K^}�Y���r���C�8���_�V�Z�����[��B�iK�m[{I�v��?�����t	�o��k�X������+���>:;�u��8��k��G�����oOO^����xT��������)$�>����������`@��U�������
�uv���@��\��:>-!������>%+��'D���FL��<T��,�e����h�?���X��5T�@6�Hq�)�	�|�C\��0z�'���H���Y����O�n8�
&�z)���2?ib�+h!S��Z+�?�B�k��9@���257��6��M�6���������hh������{�u�\���^��������Y�n0���z�5:��&����.o��������
������Eg�er�59J�`2�I��
��I���.�
�U���z{�Q8��B/����hC�F������Q�m���������Z��g��5;�$��'KB0���KN��^8��2�O����d�;����L��j\}O��\�5Q��J8���d�V'��Msef�Aram������2;���m�U4F�2�C�^?$���\��6��� T,�ul�\� fT����\(��Ob��&)
|rp�D�3=�4���fY�6���O�Aa��<��p�����a����v��M�8���h�"TuG����'�����O(�n4b��^�������M�n��~��je+���|R`�*"����}�E0&k�O�f`o�����&��^oUy����+�!���+�<�����7���:V�2_��*-��������s��P��C'���I��k�b5��<z�yh�<N���M��)?�e(V�����=r�*�t��]�;F��;�)�
T��.��w�=�=�r6���V���� �mi��^Q(.~�+\�� ���Cc��S���W�iP,Y�r�{P��hs3���
�7e}�U2����b,?�~5qN�'_�z-]~�&S�����t��`8�Xzk�5���l�%�N���v��"�ze��2�y��^�������fe�~k��wSy��D��]=v0��9���~5�@������_�?�������7�%2H�bn%Z�zZ��Y���Y[����f��T�����q����.��]9��QV��R�����U���k�<����^���$�[lIaj �/��J�[�5�f�b�J����-3l��V��3zY��������������^���s����d���mfk�7���'K99[3��
�3V�f=m�����^�A��:�4+���.����������-oH�P*��Qi�m���T�	��|��W���[[�����j~o0���xR�l�������J 9.�M�#.���5^�0��~v��B��X"�
�C�1�
��;g�}(��&��� ���t��ybk]�/����a-��	��K���\7���3^@��Fc��+/�����	U� J�2"����B$v�r��f��8��]K�1�>{����
p)8{�����3�W�����D�g��lYz���9��
6��WH�P�3,�PN����(��+f�Z@M�m�i�(Y�Q'R���N����i0�om��:��m�����G�*������Pr��aP��U����������\0��J�C�	;��+y#��'W
�x���)��O#����KNq����������=�!��S\s�4�p����Cu������G�����H���.urz���R����L�e���
��	��Aq&�5�"�.L@$���/�D*=2fO!|�:��@�>KG�4��-z`�?����j�w!��;�Q�z�Tr��u����:��m0�@��Lt8iY)�x�Ub�"q�i8�n[RQ��Z�� Z�TmS#���h�;�F}������j�^�0K%��J��4.,>�$�������B��������E`1W�h��E�����D�b�
 s-�[�+���u���=j#����VY���4
�Y����b�����zZ�%.Ks�}wq��~�X��b
�K�$9��U!�Q�ER���/x�������A��f��x=�]���}gC�<M��	
Z9�C�dNM�<0��&��-#Ng���ix�����_�h��+�,����D�,@�&�����ad�etY���Pw6����Av�y�&���ze,��f����L������]������z�8��-���<��Wb9��7( FT���#;�������8�YR��_!��u1*���nYf���������Ur��R�����6�nz�������umm�~;�����VT�3hj�X]��a�{V��A�=����-����=H���`i��JIU>as�Me�k�_,��C�����e�Zt��P�R���D�����Y:�6G��3��b�t)}z/x��SY�Y%������~|Q�Y���{�W$��eW�����H!�gz���2�1��n)�Ef:����+q�L�I����v��)=�b+�/Ra{^�j}���������:!��<�ei�0�����j���zJ�Z�L��c|�:��<��c���RE5^��xw��m����m��������3g��*��^���o�$�S�L�$a�[�Wm�D^�}P��G�O�a;V����o���<��x�3���
 ���(B������n���A��2�F:o�,��Z#Q�z4�i���������9���H����,��1_W���vq65���zc#��/���/o�o��J^R����`E���"z�!��!�fY�:h�/F���2P�d�r�����r�/X��N����<I�l�2����]A���EHf�S��2���v��h�2;/�w.��;����������bB��	*D"
F5���u��>Fu���2�5�Y��"M�m�uY�������C��fad@��q�����,BL�w���,�
�UqOX��9��*&��u��HIH!_��	,I��O���
�s����(��q-��Jq�P�@�d�i�7z�<�~K�N��LnB��'&<��H^t�P#����Q�FN��?�k���Nr(������2�a����a�v��"G����r8��qm�/E���=��0@U�1 ��(��6��	!���~~)����~o��/�Y���e��UII��P���I�3�m���6���kp���\$��r��B�;���cU��H"R�w����,����:��I�X}����,1�:+�*9�x�x��?~��'!�`�������TD�+�A��Qy/���|I/m�v�������k�����o�p�Y��}/+��7�������
����?�����Rj��lV����iH!�5Y��|��)P�����m|����mo>��{�o���v���QN�W��5}�x~�e�X;�e\<����.���
�GXNk�"!�}������loA�S�����D��^=*����
EJS�mP�|����b�r.y��x����G���������fe�Y���C�Q���?�v�<��]?������[������y����9���N��c�YV�D�E��YC���+��P�N�r	�E����9���Z�������b�!��/d��,��
����):��d�2�`����<�+!����I��}���D\E�m
���V~}���������M{g�0Y�d>��U#U�Xf��������'z)D�3�[:{{��p1����;{���f��~����g�"���l�+C�#EDn�����.���w����8m�����3O�1d�"q��,�.���D���=)�;e����[uF�����9��������~�c*US���E	�S�l���\�W�U�����z�Vng	�'�e�Y�������>-��l�ye�T%�{=�0�i�`����((�y"2���N�#���`�:*��1N���&�6�(�6*_���~8^;]p���\��;z�E��7!<��	fkB���	C�Fqst������wg}i����C���'U<2����ncOl��q4��o����j���&
�Dc��D5sE��g�@���������Q���iM3�c�y�*����8��*��o#r=������g���������j��F=dS['A�Kz:��M�	�(����%=�nY�����p�LS�{�$"���"���&c,�#e���5&2kE������	`��>m�e^M�Cxw�������-$�J�{�9H����pS�[2�Aj�`dr���h���Mr$-6Y�X������n_{)�q�{�����pV��.���l���������O��w��SSf�.�!}�,����^�T�N��2����#@�-I�h�jI�|x�f����b�����#(7i�lE�1
��e(P�I���J�T�ptf��F1a	�����e�GO���+W$�����<�U�b>	}*��Rjs�zo2������Z��
U���v(���*P)��s��.���lJ��^3���B��cof�
�bT������aG-��VQV<�s�b|hc���`�W�
��U��h1��Cnvze��jGz
�!�h�P���
�d��b��Y���|������7X����z������8�KT���(S���o;~��H������>����d�����=A?LHw(
�����z�*n��]���'<�1('�\RY�X��S�h��'�E�b���3aAbB.�d��Cr��P@qT��w
�u&�8���{p��J��y21��i�R=i0�R�,�n	����EH"L0���w�$��	@K�����$�bD�E3>���<
#c"e���M���`
��+���Mo|jG��Fwk{8�����R�-���M�4�
�|�/�`FP-�f=�Ls����	7(�����R{�v��l����f���Z��`�1=�7+
X�C����P5��Jn�6��h2�M���>��I���N&��`JRt�G**��>JJ^���P�����AK8��KX�����=��
�'�.�V�_.����j��zE��=�6�U���N_t�s��F��"�&,���6�5Cs	7�����+b�4SR8����I�%������zc�qY��s4����7�����,mHU��iY�s%S5E5Aj�,#Mu;���com�*LbJ��L�,�X��<�_F������������T����:+y+B}�Y���/c���&��X#�XzXZ{����#-�G�����y8��E�K�y�T�	Q�fq�L���Lknl�������lz�hUj�����T�Q�'���1��0U��������1���qx������qP��E����*�X��^QssE0���R6H���=5���y�������G'I�Zu��h~S����U��X�N���z�J������j�?E"�E�F�e~R��R�s�R��������&E��E�}�lm3��PMzh�`.����!c\��(^���J&���\��?
�ps�������� �3O"�e��$�1���\���:t�p���'��v-�tq�R��n��c!��B�9J����P����8��4�,R�@�U1)�vXxhz:/C��L�P�)�g}
�k��YS�Aj~o)%�B�������\�����D�c|��^�i����b�Q!�
 ?e^���B��y�v*Q2��p's���pc��C\������Ef��w�f��2L�	��0`>����
�X�pA�lp�b�
bW	��� ��\e���m��up4��!
��	�mg�2@��<�~���D�W�+9����x�+��W��(�l=W����`��K�I1�#y�
+�����2y�mT&o�_�����G;��� g�/����L9���+������y��+��������W9�y����v�6'K.K������L����2�(�6g�W��tJ���(���"�D����)�J��H�����H2���ur��+�6_�E>�Z���q�0�Lj���O6�ql����R�c�0Kv/��P��������}R��%�4�����t����2��/������r��Z�
p��w�b��}5��>�Y�-����(���\M�{B
���NtxB���+�D�xB����|1=�3�h�D��?������T;����eO������n�����D9l
�T�����egp���
k����:%)i�V${�����h����
P$��@��8�U���pWm�����n1���`��&I������Iuh�9�������G�����#T�ZQXHp����<����
��A�*t�������x4�,����6����[���co<���Io9j�Z)G���*������/EVG?��o9X��\�tRN�������V�>x��x��*'>�[�i}Tt�f��+�"�
"���W�*�4�mx��p��pH����N�����Z���Z���Q���Z��.�x@�_������ sN�T��-���[?�[�$�G1k#�SSd+#�H�pJ���*4L�>5�Q<v�V�!�����,G�A��iK�4�B�ps4������G�������dQ�U���+z��4���UB���X�7����f%R�H�,S�hh�5���<I���rbc���������v��,M��
����q��������]�4��s��$��o���&�h�"�_Fg��1o@_Y�/�V�Y������S���X>�E�78>��b@�U�H*����
�)�.�J�eE��R�$m�_[�sU,x�-��h�W�5+�4�f��z���o��&U�T����A�z�0K����4x�������Ut5=��������tX���ij����z�sr��{�Mij��+D�,L���k������3���;��m���hTo�T�����_�\�hc���L��M)u{[�!P�j�W�[|�i��}E�����/�?��G�/1��'�wOH�]����t�^�l����e@9����nis�MFz��m�Y�QhAE�+��q�m�=�9?�k�@4������_Nl������a����	�q��%�a������U���JU9[���f�������$�����f���}���$���R%A���(��Q"}�w��_@��f���R��S��2-�Q|�}BTc�W��H,]8��J����&��)j�C?g���_i�`eU���r�U����nw�]����_.�����Y AE��r��#l6�R\�����14��*�"P���	�������q���*Ksd���p4��AT6� �kj�v�Ts(����8�����5����'�4��k{EM��{�Z�y�����Y^���x����-�I��u��L�����V8�7z�������9��k����=j^"���}�^!�-6�A���3sT�7�7�����m���'7�/�eW��]�u��b��	�a��c�����0F�*/�n/qb�Tq�l�8)o��;�+*�L6[�p*N�L? �%F�X�_B�c4��B3�1n������!F����R�9�Sq���fz�\]��z���0�S�-�0����Ti����&-���\���I�
������������5
?]��}�aN��=�0�6)��J���{���m#j��NZ�Ugjn�;���n�Gv��
�z(	��D���]K�@a�5���X�.7��<.����`�L��\��x�K��rIF�G���~7����_��������L�������j�u��������s���H]a,��k��f�XN]����;M1v
��JhC�R.	uh�O�����r��g-*X����\�r�@��=�7��P!B����"���>�����4�+%�?� ���/[J{H1!$[Va�VH�1���f�GU�h��k�$
�DJT��l����D���w���d��Y��JJ���E�e1"�?�����{���)���4OC��S�&7q������9�E���T���MaZ���t�<�4�t��,Gq��y�;z���R��aJ%hi���$a���i�#CgN���'9Qt��(�<������

&�oLj����;�&@�$�fZ�l��@�n����Id��$-f�����D��v�e�R2W|:��N��3LPj����-�9��a��
*���6��dK�|���C������_�W�U������C;�svtgzt~4py����e����3�����o���z]������f�s��)\ ]s�R
��,s�����5��WN�*���&�K�g]S�h�X������h��������vT+~�|��,/�z���h���h����p�-&p�MM�e�(rG&����J��������������e�Vq��^J���|#���o����������^�T�D6�Mud3}���N�����3����,Z��������J�x���,���P�DF1S<�-��������Lc8+�ME��
Y�(o�nXo�Z��*��E�����,j+��/n��/�$�,D��@.�)���h��qr����$�Q���`�)�)��p����`yk���(�ywv���������%3�_���������?Y_d�z��Ux�.^��`0C�v�:����	,���T��0���Ei&l�[��.Y���P�$Xf�s���W��m�*�V���L�qz��)y(�����e�W�Vm��L�w�d8
�������UMS*�^R����/�e�A��"i����-`�g��Z/�G~)K��/e)��,���9�0K�!T�VU����{a�?��/um��5����b�&$�����O�,�U�e���V)Ou�C��1Uc�%C��������`�D4]�����V4�2�����*������2��*lQ�m��&[S=�b5��dln��]��NzK�K]s�#eO��Q��>�UA#K�R�un����-{��uGu�3�n�����5[��h�V�wZ��o����n��l�{�5����d�m=K6s�5���-�'8Z���5H�-',^E5g��!j�K9Cs��Vnm�����;�����"����G��!��,���8�m���H�������hV���6���W5������x�����l����QV:���8FOteC�����4��8�2��s�gl��
i6B,�l�\����f��f;�0�����?"�/a�(�(3���i�[�x1��h�<�	�$��[~���T�Q�R��K�k�z�S��"Z��);�h�j?�9l���Q����9����JSK��)nT"r9�����A�?�m.y��6������$��&Z���
�������$R�0pP��8�2�e^��i0���x1��m0o��5I5�?���t�8�����`p�*�P�DL���Mz*:�.�MTn�>�w(�P����m�c������w�>��2�&�`-�b�Y����U���T�����4�mxa\���c��T�;�O�������k�F{x[���_^����&���'�K���W3�����6�}#�Ds�\_.�=J��=�M�_��*=;�C���+��*���tL��q4V7|�b��%|�4m_1��0F��5�����������������N������<b�}�H�)KN;iN���@����bk�Z�����T7���jj�:�����H���E��.m��?���~�S������P��<�m��������&~��iE3����������*��@a5���j�=���R��9��m���7l�J�U���)9m�P(���S��<Mn��S�KP�����x�h����-TPK��t�@O�'=<-5V��.EEC�h���]��*�4��w7�no8�/��V5dyR�V\z��,���E�{����^
nP�S��h>G�"�9T2Z���K�X$Kg2=e>�A���C������x�L{�����=�Q[[��<���M�������\�oc���~�C�Y��O��%�a�H��2�w]H0H��D�R�-��VX��PK80�����������k���R(0�`F��4��Y����2aAc�\���G#,�@�g;���t/�J�;������9��EUd�4�dS�t���<���ol����%���F�9x��yq�D����k5���7�r��$)n8�����&M
�Z��vfg�U8-�B�����w�+�������a�^�8O�aJ x����x~����&%crO9������PrW�Q� ^Y �
�DekoN�������k��� j�R���*o�/�p���E��D���me���5����:?�?2�a�HA\,.m���7�����������������=5�W�_�H�zm�����<�-�{�)�{���� ����g��������Z�$���g��TK1"#���n����x�?����cU�8�g�Q���~��=u�+`����0���$)\���m���@@8%���s��������<L��c����wRm	T�:�$�����9�����������������1���cp1��k��l"��,u�a�P�� _n�����hV9���s3G��F?���ekC}k�}�c%��r
s������<� ��L��{�������)ien�H���Xr*��+p�����G�q�76�����JYOO�+�L�-��52��@e��E���
��x�+N���{N�W9�2R�;<x���p\/�7�W�c8>�gS�b��C��O��������^��Q�8Uy�a[�6G���z���%e�6����p_�fQ�|����'�Ykc�Vr�&-��hAJ��������ix�Fya�'�b�<�i�)��t&���f�V��@��E��h�	Ua����=�N��$�T���uFU�D4-��@�E�Y��������eyzS�������d~�ea	�������Y!�y+����2���k�S5�V�%L���`�<���O�U��;�"��g1����C	�
����X&���a�N�e��AX��0-Rc��j����k#�2���!�H�R�$��0M�R��e���^G��F9���
�-���
w65���1��X������oM�����V�
a][*o�gG���B�
�P�3^��'��zJg�����O�N��q����!'�����<�d�z�p<���k�9�b#�)Y-rrI�����S������|�,�AN�5�+m��]�nn�'���`���cm��t$��P��+c�H��('Z�JM�D��X�z'��c3�j�����*+��?����s(*��f'Kq__��Bz��j-����y����V�����X�-l�����B������V�zD\r����.1���Z6��i�I"�O`b�M$�k8��!�o��j�5��e]�\?����L�%��V��-��,u;��<�����[�w�)����������S��7����b9���^1&[^#N�^�R�(��n�@�&��������F�nQ�MQ&��`QUM��H��	���'��J�D�	{X��?*�*Z�� �i������T����1\�F���n��-$�;��Ava|?��p�^��
�'br�z�zS����3���Z��8i��"�
��L�8W���.U��
�#J��(w�'4�c��K�'(�ZZ�{��D��4tq�����I���.����B��UE3@p�l�����('���>Y�{_�b�!��0������?�^���8�\G�+^����N~[���f�V������~B�R�7� ;D�'	�V���/ge�'�A�w.?�����PHS���t/f�'M��������?a��4E�'kS_>g�yg���<U�Q1C��m� �����������0m!��P����2g�HI���"[s�����`�c�/��'X�����]Q�F$ �c��#�1���w�n^�N2]�ZX
����:���h�k'T�N�?������\���-\i
����;==8>w�N���������I��@��`a��F��	I�����=�t~�JV�7�5�:{��%t��8
���o�N2�C�z'��e��]�I�h�2[e�b1�hP��=K�$9n����}��>Mi?I�
�*Ij����������a��SZ8��������F����c�HC�`���.���R���{��^afh���jh=���A��cM��9o�q����`�U�4�Z�j��sI5������6��I�9��K���w��������9&y�*NP��]F��3�0-���@C4F
}�M�� ��2���e�DM
���U"Ua��u�����w�4�[�(�X
��^���>o�T3y���{��Z���9��)p:��m���p���r,v��s�G��T��Z�>4�pk�_o����N�6��ig�Adv]S����g�,������}!���������X�,R����M�R7�|r����Y���<���sx|v�{t3�����[���un�F��,o� ���������&����o�v�����u[�!�t�I��2����gSY��	��CD��c4��Z�W�7���n,��A+W?�];��G�w�p
z�cd
`�S����b����U*��w*S*�?���I��f�#PGV$Y|���*��"��ca��l1uHUMm��SoV�U ����k��=���i��M����<�o�e�_6����4Id�`�)��[G"/�M��/w�hz���wG3�����xk��9hhz��;��r���u����%��7����;��<��'�]���:���o����A�:�����f���`b)�rIK�%L5zT�*�N�z�U�������K-��L9�YI��r�������x��%��{f[����%�fq����*�M&�.��I��!�O�@�BS78��{�L��bL?��%�7��!
��d��we��O��q�`1�MG&
�d�,�\(���b6�b28�_�;l�;�����u���#!�\pL���������jR���*���$W����.RT�<�c�C�k��}?���%�0wI|���Q��R��0�����2&� U�LC���!(N]#	�uP�<�����h�8/7WIL�g��p�s����H����u�/�:�}{kg�%��,V������X��k����I ��%��6�����JL6g����x���y#��I��%�9V�6�vW7M�s�x�<er{gdC!&��^&���^�_�5��.�o�EJ��6�co�7�o�J��u=T��;�Y�py��'�N�	��g�dy��*��;��777��A'I/�{����?����1pO����*�!�M�Pp��O^���3��*��s����{�t�����-Jg��h�Z~]T����>EA1@1��k��xk6'�HnnM��&��p0���6�j���+`���/b��o_�������������[���������"�6�F����'v�P�h�������x�zv�&m�>���m��^��1cA���O�����hQVg�"g@ZZU-�5CsEmok�y���`X��fT? l����� ��:3f���3���_�*���0��j{�ZL����4!}|���\�I�
���;���M�\t������D�9��jz'��X��(��30��XW?��N�:.M��,J[F���*eq)����S1�R�*�L����Y����/���z��,| &���L!NE���z'{�����M��L�A.Skq���*������Tc���W�����+��w�U}�EN�����vJ���i
�w� !��<�`��;
���G��w�
3��z�!L�a���������'���Mo0��r�[Q�����\Q��9l����SH	g���-�r��,��g?���N�.�H�{�����|H�n�^��T������i�!������,a�J-��]���������8�O�j�-B���_�����xd��n�\�2l������Q�sY�$�i1ol0��j~�zP*���4��y��|���&��#G����*M����kyim������K� �T,��:��\��<��K�}��G��������k����:�B��*�>RG��i��}C�l��6s-'�@�\<F�-���a�>Dp}7���-��(��-�m��>�����`�,������zf���BV��F�`W�1��u���G���� /��;5�X�����Hp�f�x���.����������7�~�3������mF��h9��|���|�z���d����:-O�v���o�m�M���f��� *���/��������� ����4�&�^��U��W���K��zf��{�n��}�n����h�(�A�e"�@h�5i�2-]"�m�c%�;�����x_W�K��mL�u�a�d���,���u3<��n.��`k�=�E��i�q�T4Y��"]�S�<-����H|<���h��,m5�U�P��h���Mw<��}���Qo�=�l�3����,������#i=�n���>)8����1��u�KcN���K��>y���~�o�����F���5��s�d�����C�I�yTJ��RI1�RI�����7�C��K7�-m�1�]D7�k}�p���6�J���H�@j����$�����L#�,�R)M��JI�p�N����w��v�eu���Q����Z��ta��e8-������4,�����q�R$�RJv5u�����,�&!��*����0�Z�K6�X�e;���yT��fwckk2��{i��cq	�1�c�+8g �?�'(J���8������Kk��6��2�����z�`0���+���������p��>�1�<��O`����)OX�0����f�!��z)�,�0��%L����L`ZA��+/�b��2�`V?��A;i�6��R������=�����O�����cQ6�MK���t��+U����S��Y��h��l�5!�vFi)�./�\l{�����K^������4�������Z������mIu{���<u��b7Pm���$g�\���jt||E���dH�����s���8��3���"�$����&�tC����1	j��$��=��,_r)����
������c�m�QS����4QC7i������*��A���;�-�f�oG�m�xw��M��������8(z_��������D�
��?���+��4�w�:�Xf�������x���C�}�������� �����$y������N9���
�q���wQ��W��N}���xa�m�Of"(���s��)0��?w^\>!`�����5�����W�b �H�E�B*V�V�q������4��=/;0��7v
��G�^wks��IQ��c1<f��:T�'�&��x�r-�c&?0�c��9������1%<���"s�Fo���m>���Z|����4ZiF�������Z���$?������[j
U00�GX��-��2�R�V����$���R3��J��kB	(�}d�����:
o�D��J�F����it�1�V�h���XxS�)s�_�����lQ�!�O�ia�o���u|XM���!7nDp�����u����VC���FU��[Hn*��W
� l$�����������������U6*
lr��}k����6+���*�UQ����8�+K���\:�^U<�����N���&��#~E����)pv����_���"�u:z���6�]�'� Z5
?*���[�*O�*��'}�dVT�-z��`�l�|T��5�����F�m����o���(l��S���bt�f6+/�*&�/�b��2������s���b-�4�W3ccL�z=�1����CK����eVF���#Cg[po�������M����S���KJ��_��r��Ke����/7Y�r��g8����?�7|U�j�Q�
k���p���0�QA����� ,�8���
5%(\��:��6��u������A�>�hiQ���Q�+���G�����Fm����cv�N�53��x���!�%�},�������j��Y����Z�b������/���
��i�����<���j��L#�~��6W;�C�l�~C���7Y{��UWU�d�/�JQA'Y�c`�:�G�G�������������'M��>�����������GEl�
I[ZCD�|	��4��G��b���E;�]���{��PGo�����};�����ao��IYM�e�����*\�:��
���lQ�����^?.��m5�Ff��Y���F����dk����������W���V�&W37��|1WbrrS|2��
��X�Z��V���U�����P�Umt�!nU����0����~C���K����WL�u�Bl�xh��wYNU��&b��Tj���s6�������� �6�-ME{*M<4M)�,����LV��/�j%�(�r�cz,�5���5Lp�|nC���1���8�	�q��^����u[z��n0��A/�{K�Mk+�����G�r��`�vT����T�:�@-���7uU�����K���ve��C4�u�����V�nv����a�M�11���.9^�P�OK6���|[���Id7]�|�c����$�����^����9�^��S4)a���l1&�8���Jd��!�<t3��%�4�fQ)�M �	Y�Q�3��;�f���A4�K]�D��n�70~��1�>�fh�V
,wc�`v���8���|a���s������h���fz�O
R
�\�a���<E1��N�[�^3�P��bu�#�������%���*��6\,};�t's������Yl""zf��r�j�5�+d�b�=%7�Mx��~��������5�P��?��8K0��p6<��g��S��D\@�b�q������z�6q��p��$.��������'g�����G��LR����?����������O���l=�z������
k^��^�������+'�8�2��
�}�X�&�g�~>�:�����iS���s8���h���ZG���~@C�)mB�������I�EA��`!]}�5�1Bo�'Qag'c%+���<1���N�Y^�8���m_0p����g�--��xVa;U����������a`����_}���,�tae$5&������`������*I�-cL�2�aDw�����t��0�*�S�"�G\�A	�p��,	zk����$��kTO��kV��>x��h�
��%��-�������z�}������k�*W�+�d�����(jP������e�C �_�8��h�l@�W+�� ._��L�� l:�w~�(���"�S�2�'ql���5@z�,_���W��7�?�C],lqO�����_/�z��|)�6s���-'\�2����/`�E��{����"�u
����d���2��`�;IR���7��R���;K��<L�6Vb��f��,�4�"��.M���b�\���oNx������F/��:��`k���F�����+5p
T|#�����������@	*��%a[{�<���������\�$���?��ey�m8C���x��;�	���%�!�5��������J�>�&���������;�Z��}I�8�~����>}���1����"�y�;F�x4=����PH:�OL'z!��/X��`��V�x�M�%�Yh�6�������0M�m�Y�=>�k���'����'|���y�����?�1�����*�'_������p����@X��A�'N#c������Em�5�i�w�����W���v�N�V��I�
����K�z��/����>��\�
��)�yO��}]-�6�}u�
��=`�����V��~bu�,��{xD!m�v����K�%,_��iJ2a�4^�~_$pb�)@y��QB������:�u�����z���
~��������>�u��N���R~�>�������u������-	�2,0�\�P~�%73�A�S���)�Dm����z>��3��,c@�	���vg;�����ed�$��7 ������I��]�8��oW3��������_�����B���V�������[o�~G�w�G����
���vx����}�uN�sx������?O<�JW>��� f�&���)�5�G	����`�z#�]�H���2 �������>b)��[��y�3��t�	$5��^�O�[x��G���G�s�������t�,`8B���azY���/��\_�����E>�P��:�P��DS��������X��F�sb�W���!������X���.3?�\��S������U��(z*����1g=��?�*����� I������hi�&�xr+~���@��8���I�N9"����8$a`�9K(:,���
	�pJL�b�������Y'�����T_j�u�������B��.�����V�������o�'�6�����M	��9�����E/��
;����e�1EW�u�N���QY1
2����p��w0`�6��N$�=�OA�D�X4[s���gp�`�v�(6���5�/��N:��8���P��C���i�n�j��<��z���d����<f1M�r:c��8������c�?���G��Q%��(s�\dOZ�X�����i����RE�����@g��������^�6.���<�r��}�b�iuQ��z�bW���0���������~��X�����h+��`�Z������[Y��G3[�����/�
eRI�^tg��)bz�����d��?�����Aa�������s���{����Cr�.��w�O�������K8��x|�L��)�1s�kzwz�u`��������+��k��`[k���[�y���S}�������^�9|V���E�E���p��c��n=��"�V)
���V�UT�j#b������H��UQ*��{c)_���qU�����*e-�b�R=������������v����������pY[�H�������)�o��qv���i"����q2&�~+��G��8$=��{��v_�9a�����v�����t8���b�NGm��Q�����Y����U2MR�0D�a��q^�31t02���Ru3�v�K)���R����Mm4�Bbk�b��� '�7�����^I�W�&�y�q�L
�����V�����p�>u~���5'���u~e80�7����G��t�H������B�i���q�k��������v|��P%�5����p+�#���Y#+��D�����8�]R ���{ ����F<���.X�xi.5�]��zq�B�����]�EP��j��������-�ak���4�>��K������*�!�����1��QF�e�b���}�"z�����r��CWKXG>�8�jA��Z�xYi8���&����dM��_�`���]�t���t����i��J�j���"Ca��8Z4	�|���Rq�,Yjq��u���~�����u��S	�w)�+���T�=��s�	J]�f�~�]�Yf��[T����;Q'K�wR���Xb�R�Z������P�3��	�S��6��;�
B��0-��U���`�V-�q~�_%%������4l�1x]�WG?cA�8C1
�]W���kQ������u�6G�6TM]g��
�Z��`���v��'?���.����e���y]���:|k)�����a]��
��T�5�$���IP��P����k�_g��M'Q����H�nR�49D�$���f)��c���� �H0��2$S��>���tC����+a�*����vP�=Y 	>*��8��R�����	��Xu��N��/u�etT�5�������B|�:��9'�Z���nE�x��Ft��x*��X��fI;�@��+m]��7�n.����Nl���T��UT�N�N����E��������1�����@}���Y!�����?U�z^��r>6
���<>��Su`
_�������(�Z�;�jL�N.�s=��E��o�z�o�1�8���Pj�4��k���h��T	�i�v�x�i���s����I�'��-E�y���9�M����:�lX�����jv�O���wx����vq��Et�:�b7{��z�L�n,���,��R�����j�>�X��NO���nt$��`���_�f��z����6,4V��t��1�r]�zC�-���1���M�K���*����0N$��D���	A=�%oS[��h-YN�"'t�9?�V���|���R����gg����{�<<~
{R=S}/�����U�������ro���kNJ
,��h�EC�/��?8�8�?8�rG����II>cRu�;_`�%��%Y@-(�GkQgz��5�K���AT$sV������9?�=;�$*��`��83n�d1J�xi���d�]'
Q��������Ux> }�Lqa�)Vh��6���X�������@���A�6�.���g����xAfe�������_���2�onl�R�
����t
����8���=����b��F�s7�LH�?q?�q*��0�GI�
Q}��EHR�z�c<�(�\����J�|�����_Q�;�
C����N^�QT����6!.{k����������������{v���t^���f_/���}�������K�������������j�y����{v�����_�������q��w;�������#+�2o�������/2c�/
8������t<j�*TLV�*��$�'Ce�.��WM�>��x3`j���E7`�������+/�N��-q1�1Kx+#�86�����7����J>�L	�,���c��I_B�-G��cf����/�\�S�[U��������:�����'%z���0jXQ�� 6���5��f�,���W2�CLA�d
���e#��
PeEx
��S7��U,��y"gG����PA�Z���������R��H����E��=����,��O�*�}���Xkr�fu����n����R�����s�������|xn2��6��w��Nf��f{92���*#�/����=��=���`w�=:|y&k1�����2`��)�N��}�&���D��F��������kN�`s!����v<p��w��������G���Z���9�8�G_��u^����(D�������
���E�V����!���vF�N7���$>O��x����a�4�9m7
]e���87T{�*g|�8��}DA��@�i�@[f���������;���T��X�,����N��+���Y�hV���B�������x�z��������{�2L
��;����Q�nz���VP0�J��k�j�)g!��3��A��;:����z���r�T=�X&���)�����K�6+L�*.��Am����Iy�C�A��,2��b'S�@:�g}+�a�m_n�=��<}>�Rm��[2V��%�~�����Nb���P�(������-���T
��,�ud&3�,��1�GK*��6���#(��	�b;f�>�J���I��?(
GpI.�2b7��>�
��O_1��H|��s�HS	�[�m�/E�7���������"����W�GZ��������������g)��w�G�������/r`���j��w�����y��?<��z�W�P�]����F�/��E��N��]{�2����0�+qu��q!,�^���E�*�_�he��yff�p��f���d�p�<��We�V�\��#��A��^��=;@���3�;���Or�R���_vX����z�����5���q���(��&�-����Z���������&�9��xQLba�L����Am���C$Q�a�B#����`���v�F��A�V!Q&M@W�s`�p�^��,�T	�H)�*q����R��Q���f��3�p�]5�TR�T���-C�����a*���R\e�DF�d��a�t�G�a��;����0E���>|���#sM�����OX�,�l��.�:A��P,�e� ��TX��N�
}I�tM���������*��"����8TW����@:%�
`9m��2������"�(I6_���R�����E�)�
���b�0*XSy�X�g���\U�%�^�Uh,(U3���A!r]���4�0���`�
��(�r$����	LH�������thB���MQ}d�.����,8�]�	�}��d�� ���6������tL�Z�-���U�D��0�L�A9&'E��:
�P��I�#[4#|����I�W8QW����!Sy����|G��${cs����D���w��M
)�����a���D�]a��t��p�i@�>�&�j�|��h�;�2�������}���bJK����T��#���T����Y���D(��/�Wf��C�6���X_�"��t�T��*,2�W����f]m<WuU�
V�
Q�E��������)�M/������*����"+Yq[��5���������V�����w���M�$��%f��=Q(����s�S����x�P��,XuS�O��T����d�aO4OY4y1c�i�e�������[���?�B��K*s�x�����B�F���L|J6�R���6���5���X�h�H1\p��(h����U!5V/�
7����?�Y.l�.�V���JR��O�S��Yn�|�)���EF�Z�+?V;���W	�(���Xid��I��3��H�)t��������$���w
|�`�1��O�3
�D�$�8�1���
����$6L�67+�������O�d2Y�F!��5G�-No����s��$���TD+p�a�h/iy�T_J����Z�v���/v1~�j��p3�A|������
������R�����M���uB�#���?��a�7�Co'�`y�_�qJtF�aU3�0�K���7+K���C�m���-Mu���*G9�Y�A6�����������=?|s�����6��h��M��$t��d�t;zw���>�o���b!��"�����e��$�i�Z�G�[#�T����b�m���-���Q���;�<R���A��h��{�)��{7�0�
����P���j4�M�����Ym��?�"�4I�����^)�*��-h�������:"�O
$#��@z�.?��:+�F����_G��������:���OV
%m��i��2�a��*aK����^��Y�G��V=��L��O�`}Q2H!�r����7r�h�s�,O�6+�v)4�+�����3�����D^��X�R���L,@~1�\���{I����x��\�}=����*p��e3�(S�;NQ��W���2��0e��*X)8V��� j`x���Q���]���V��W)xa6��
��!J��j6;�T0U�����!�)�
�Lp?�<���)������R�z��J$s#����� r�TS����W�+���]K��DY��j����nY����wtx,t�$�4Y���(t��(]mS��V]X�D�zy���������]����I�3*F��pxv~r����"���AM�?aL������k4���L=��B�Dz63L����g��f���2����BxMFx��1���r]�"{x<aN�����7��pF���sH���	����$���I��9~��y���[8��|��k������^�9�(z��U����t����`��bl"�WK�G������r�����E�{ ;3[A�l]E������,)�]�j	g��EI'�t�9sj�C���%P>�fJ�zN�d��;>g.Ni�B�	������@���:�*j=�d������������R}u���m���H^�w�.�������B5�EW��R:�N=?��XM6t�i�~i�Or
��3���6���M�I�Rl�5lC������It��������gy%���[Z�/[��?���w�����/��y�L�^�����W�}�B�� !^W�����:OP��EV�2eoVX����E-%��^��U\CZn.gpR���mF^��B�z��D$^f�X]�����,K�K����D����0��,>���hq�F��|����Y�ZIJu	$�����BCY��5�������W*�j�pvv�P"�R�"�h��_Rq%%��d5����P���{�b8��]���t��B<�Ymd-��B��\D���3���h���yf*V�NWt��D�����HV��.��PW���8Ft ��	�,C���`1����C-�(O�6a?��ws�)]d��Ke6�;�{>1kJ$�%Vf�1�k�����*�J�M���z�rU�UT�V�������w	�] �tx��{������Wj��o���������7nxK����?Z�_���x>��V0we.��$L��E
�� ��'0P�����Q������=����7tgQ����UV�U:?1��H��S�-db�����x�}yp��:3����A���S��!�=��A2�L��dVTL}��h*
���C�#M;�9J���8]Z���66�� #�!9:����`�����b�E�+@�bA_������`���.��g�=t�qx�Ku�b?���-�?�$x_m]��> L6Y��1K�������-�c\S�X�-���q8Ka��Y�����z�Hq�o��"�{1�����:�p}:���|�������~N�v �h����-]{1#����s*�*/5xRaud�N��`�~Z���n5��\�$�o9p��er��� f(=
6�=P����y
5�)��(3���>�E�s�"vmb�aBn����a���xW�]����.�o���7ow�f�{���e��AnF45I2�U9�J`��	17{�((	W���kn�������|�K�b=��+*�'�/"r��d�O��"��
�q.N���D(u ��;j����4��)����T���<�:�%�c�#�,h	z��/4\�����h��,������^����%Y6��$Lm�k��n��X�>O�q+�,��Gn!�+�_�YFM1���*
[�
�
M����$��Bo�Ob�����2�Tu.��w��{�O��n�B���fU�PY��w�j�|VS�Hy2�Qc����T�B�,x��	�GX�!DXQ�}$U��h�Iym����in���{��-��X���2�^t%AA]I�-!�|�����L�|�����bY��Y��>H�rx���]��rV
P����a���E��k(u����\b����msOy�!Z7d��o��/���.�H�G7{�q��:_�H��"�gc��U�~����T2 ��8I�4�YQ]M)����+��k��2%���3�Xd��p-X��XT�R�L&
`~�
�#�0�V�jM.�w�����dti�����{�)�<0?���}�TD��0����6]�Y[�|��?�y)����-�^��I��S�������pF^@��,�4�1�Z��s�s�bN��;�x��_c���;Zr�����a���X�W�JE�v�Bu��>ji{������5, 5X��Qx��`4�����#�`]���C��I2�GU�������3(��=#��UC;P����cL��,�QV
���v?��^��A^#�s���KTE�[���V���Q��i{�D��5bYAv�8f3<z���BX�V��`�8i)-T)�0�{�K�4S��n������B2qQt�$�*!���L)�=���r�N���R#�Z���-S�e���sw���CPA���=��-�<��
[zN),e�����:< ���9g�g(���#v�����g
�3F�r�A��:����cmz���#yr�M�L�f��G�&�������3���������c><Y��o�	1@��?\rS4
D�U��
��h�2�n��C��B���8Ze��
��~��X��v����� �Jkj����>dV/X�~1�����r��7�?�y���5�C6�6���}��	\������D��VF@����s������,LDP~����>h�x��I��\��������CW�X����.������|R��C�j��;�MP����`�}}r~��j�{<z;*�P�L�y/��`($����m�&�B��p+��`��5m�s"SK�8�D����HJ*�o	+#G�0"R��(�Z����	�tE��& ������<F��?�w.?}'r�8����&r�?�z<�'����c�������l��GB��p��Vf���K�j�u�L��,�7�chw�J����[0�~I
�jtc��04vF3�2�����H��@������w��5f����B�����d/'
��a6��tV�O���g�*@�6�E�]%�������������O�a�M�0�oJ��k����L�M�4��}���f>Y��Q��s/��'������Me���,d�#2��.�����`V����EQ`�z@N�^���(�pH����T���e1�'C�pS$���p�/��K��&[Q��/�=f���v|�K*D�3�z����(������
���N�����>��P�����S���0g����s9[���cB��!���X�B<�L�X���*�`x(,�^��/*�c�u��,N.]W:���O���/���i30/�C�����L�5��n�������5��6X]���T)���5s��B����y�q���?�O��*.�-��p������'��W�������,W�B^.�iA.�|�4x{
��+w�����%z�.�Q�����V�!�.�F�E�(�������y���
^EA�ZV*����������_��h\�#�m�d���]�h0Hu�7��vzwxt~x��;>=���}����7I(��r�,��oq���*���
A��s��������r�N[.�_��<Y����~���O�'+��Lk�6$H,Te�g��	�P�vk���Y��c��s)���w|��X{�����l
l��^c�\4�uW�L��	u������������	��'��'+��U�=���+qv�)�S�����I�����v�������(B�1XC�3�q����l��S�z.[�������.�)�q�V���#�$E}z�I��i���N�����?=�q.�,�9������WtY\p�"�b��4���'�hE�(G���<�#�+�i��9��=��$����1��)������`��8h�{Mf�d#�@\�yE�7����?�_�,foo��rg��'�\��a�l�b����?����B`����D��>\���sw���C!,�U���
Z��+M�����������������aB�%��bv��E\E�Sg�R�>����8��k6�����7<�
����L��d���2l�*��c}���]��q�8�u�N������h�I��V�
o�E5b"�U=�k�����Y���<����I��YU��-�i]����+�����$O��-���8����d�5��jS!fZ�+g��En��$�d%yBb11�?�zn��)�Kv�bN2�z�����n&�M3��d��y^�q����2��:�Deh���'gk�}����[�@�X�)dd\�	0����<N�(�u�q�r��.I�;v&F".�Mj�"#n�6IG���`�r��]f���V���V�_�(z>�����m�#m�L1PR��GtN�h��?A-���8g���K���=���k�=�B�A��_��6X�����)�����5�A�
�:�������f2����&z�}@C��O�NO��MGp9K�����S�{�R�s�����(:�Sy���Vm����XR�<�3Ts�R.�re)1y���T��GI��Ue�����Hn�T����~��,,*�1JY���P.�E.��p�u�)��v�%�c$�7���7�}~]����4	sxB;��3s5�nh)�kL���[� {�1�^p/����K�b��O�31z�C�b�$��=[�����/���>����5a8rJ��<�H����I�`;G��M����6����K��]T�I��r)W��f��J���)��$F`3aNM���}m'�����
��?�����[C��Q%�����Z��SR�q����$��Bu��b�����b~)`���1���sl-I�1rf���%�[�4��I�����$��������������f��e7��Q]F��L|����cd�B�Cop����:sII�$��������!��7����B1������@��u��gw�+3ll
^�<MU���tx<`�����������O&S��A?�]�F���?����7��������;�e�0����������?x{z��K�(�z����=#����Cy�k�n�L#���bh'V8(����b���:a�I���e&�g�i���.���2��P}�6/Xgo��N��YX����Wv��7�
D@��7������n
E(*
Dl�rg�B��xw�?l#�=?ys�w���X�.�r�vX�����s�0��{���������{���6G������|�@q��i��4^�W�����a���M��������D�P����qC���T�I��T��������A�bL��O�^� ��X�4�.�x���`�?�0����5�v����=��1���n+�KU>J��>��cz�a[�7��	;tg��d&R���V���Z6��d�q$4 ���������+��������5��EZ6����������p$���I���g)���k����o����x2����p/��lAuy:�w��Y�*IW�8��d���yW�D����i2���?����������X�=�8�t�Ax���\��O������23:�E�Q>@�x��A�Te�K�RWmg3KJ�ggC��{���a�X��%s��w���y����*�!�1���P�d12]Yx6�*�m+�����
����������Z���V�2�F�����%�����{�E�7po^_i��w��9[gu���QS[��������+#����c��=��p������/z��v�
�o����~��/R���� �]����*�����Jq�Tt��{�K�����}�y�[����_�#���c�v��W��7������7R5n�a�c,~�0u9e[��<����j{� y���b��o~�*�Q��\B r ���������K9�LC�	������/bE�e�%����=t���wK'��d#��;'gh���t���{~�G�5k U�$�����
oC?�Ml�X�hBJ�
E4F���K�(L�<�����l=���>�h��y��fI�9�����Y�H�����7�f���\� �b%�&.�Qbs/3 �R��L�a:����O��-)�E��p��~/e�Je�Z������,�#�o=��:t=��8��A8��$���CCF,!
�U�^�]�������`�����E��dN�y����6}�d���������z������U�Wa�^k�Z�����[S�q4��������w�}/&����1��jY��3|�*Q�W��wGG�P��b��?�����������������L>>���6�)@�&.f�O��=�n��	��,�������\�m �Z����4z�0��wUi�8�U��v�Rs�F,-`��k"aQN�X(y�~q������a�����8J��(��0��Io��e&���Pu��_�4�*�(�)����2�G� ��<�G_R?���r�#�3�AsttM�/���M��%�D��i;������<�;��������	�8K���7��{�}?���
+T���A/�4�@�meP�I�����B�.��-�6JG���e�a*�s�P�]�����<V�m�[�/g�����}���*�JQl�l��Ky�%�h�9�f�I1?x��0&f�-9|'�c��,��M,@��p�]zx9?}�w���9{�I���g�R���w�����/�� g�n�^���=/��GkV���	�g�V7#P��I��Q�������^���7��e�r��m=[��K��E��1�}���I`*�������d$�.�r�V�]��%X���aHlc%J�^*�8v������5���O��ytp��,�*�+�[��n����q�]x��p���P�����k��FU���t���a���#u���W�o�~��1�����W�u������!��������{W"�����]��L�!����=�y0&��Q��_�p��X4�x�%��ny���Qg�e��|��)����W���������������B��N���#WZ��e��M&��q:�ug���r��f}'c/vD8��5��bW��sf����,��:%�����J�����9R,%z��6�J1]�2��W(���u����i-j�;F��go�(WR��}�G
;���}���0�Z]������Yd�UV��*3���i*uw���w��������`l�����S����J�,8����=�
�O�h}/,�����`d2�I���Zc!C�:����}�:(����Mc(����O�"��BYE���nZ_�'1������U{�[����l�3��97W�F��)l�;�R�: ���SraM�Jxc�1���`��#���6\��k�I�4��(�Q�S��'7��<�r�%dz�%�(P���s�e|Y�9��>��u�d�h. ��b���V.����7g�����[��4�����z�X�K�.v�z������o���o��{���������t�_�,9�d!�SwN��"�)��uY�h��6�q6K�vgn���,���(d.V��K2��fg���mnJ(
��4{��l�4�b�
uN	�gZxq�����&��M�� B�@�����NZ3s���"����K%|"&�<�
3�1e�����\:�-�1���
�@'� I�i.IR��U�J~����Ue�����TU)L��#Y���K�j�	K���T{���bIa���m��WU�H�*O�h���0��deJq0z��C.OE+�?Z�����^���'��D�����~Z�1$Ys��PJ��L����^��0�)����������q��L`����T)0�:0��k��~6�z�P�?����
�Ys4\�*Ds��5�C�)<��"���A���m���JR2�Q!�.	��{����@�0�
3Ln�#��c5�m
�7g���/�E�����6��7~��ZAc��!��]{��x3�1��\��eq��/|�.��F����0pg��s��qdm)P�dZ|��i4�u�v����M?��n���O+z�"�8�_��(��;\���cj��,W[�����n��O
����
�Qvc>������"V!���x�����i�e��/�7��|�d�������a|�?r����j����^�����2/��wS
?H�������;e1���Yh�(���v��������Q9�*^��\��(�9S���k���0n�!]�`������$�1����|(�,w��xQb�bi1]����E[</�t?��H���h��.��(%8����}��t[�,�3��\���&c������e*'�:"�$�o���$��i��k�E*#��njtKJ}A�-&��<�:Y�BHP�	���}�,A:������r������\�[R??m,
�qM����|����a�������Wp���.�xe���DA���NN���"����
���S��Q?u\k�������>��������IO������$���I(_�P���&4���(��a��=8�u=����:�1�s�}�������8*�Ur���M�|��KR,������=�{��k�E����������������V��99~u�����~��[�!n��4r�!3���u�ka�3K
��X�?����n�NK>�#cGw�M�F��M�r�.�7Y�%��R���V9>'�����rM��h�>&�r	7@�IL�5H�����	��n
��&�<8F��.[�l�����c���KV��O����)q7"�(|xY%���x��x?a���$�P�+���r����������S����s�G�;/�Q���\2�V�sf|�D�)�7�An|�;GD�q��@��J�9&mmrX��a�9���l�9���a��I7�,$�&d�,��pK@�L��T �u��6�'�X�	������.�f��_hi�K���R�����0�R�������z����Z��J��0��!)m���$��;�97���11��������2f�3�gt�����z���E�/*)�hF��fl���$��T�l*�abF� ��M�Kt
�����3����q�V6�LQ���j��BF�-�P�$����-�R<F?��������m�=����=k��/���5��O��$H�C�e���+<�VtU��N�`iFG[f�h�t�T�D.�W<�����t{��CD@�{���+s�=9=|}x,_&q{�	�
_��"�#:�xO|z��`��D��y��=��z�Tkd�0r�����9&�XmZqa�v���bh������h�������b~�^���w�T��E��V2���}Z>>������k6c��4��o�N���w<�}��<
c�JL8`��OM"b���@!\��ie~�v��/WZY��a���&��:���*��T�#c��B���9��7�)�`����>n�W���@y`��{��	�-����2�O��(_<I���*cN�;�M��:q�}��Izc�89o�t�h�<}*e���*cs�����<'�K�
��oZv� ;$2�X�P�k
u�:�~7M<)����Kq/��e��D~�^�S
�.�
�	������
�����d�-�:d�����oY�-8��u;���Xj�����I�N4O�p�R����;�Y���Q�@���q�j�A�GA��E3�N����sw���8�X�q����^s�.)h;�����a����\�v�p�r���?�0��`1�W��qb���?��Dr�6�Gu��p�
�Y�'�o�M�q�Ir�Y�5�+�V�#���u�M�������x����;���
d��_a������4�63��~~E������(:��G3VD���Yui+�j��}\~��.�d�Y��?���z]�d�?c��+"i_g�I��tS/	K�}�S�sG__�":m|�^O�� ��?u&����b���%��E�n�i�E����������_
��a.\A*�����a,�5'�8\�h�kN�/�/7�m�Q�'�I6��n���m��,��������q�s-�jH�(�B�Y�j)�9�����G����	�OX~Dr�Kr��si����.��D~���90W��f���\8��P�����+�b�����z�O__�}���{�9"���{f
�9���IM�����S�r�!�L�9Bi�<��k8#����2ew�����A'�\d��_@$�"z�tA
Z���#��*QL���ZOEe�"[����5����kzse�:���=�=`��;���
M��4�����1�{��7�y�O�"�<�G/��0�6�LX�9�g������|���`��2�[ca���
��q�,j��zo]��j�i�B�N�p�I����\,�*%�2���s�u�����j�f� ���v��Jk��_[��8�]�W+E�-��)���)����g�B��m��4��w!_��(���p�!k��$��\R�d�/-[z�Q7{��QL-���t�d��		��l>����-��g����;��bv�7<������#���uu�lk��Ym]<�Q7��+^-@|��N���}�9��J�m��0`�Y�NC�4�g�;�->��������I��[����
����#1��X���QN�z�R��s?�T;sn�����/f-q�dnlQ��(�$�^��U�b���a!�P#�m
��Q4~�����r��/�"�K@){�`�1�5 	��8�;��D��9o��$�*�O�����������X`r����X}�I�L���n���xi��y��b;����le�T�p�~8:|IO��E��JFQ����bX!w	9��*,��+�n�'[es��t�A�^��,hQI��WA��P����bf]k4�B~�jJ���{�X��8��8�J�p�b�[��[��������y����a�c��}��+���D��|j��
dN�)%	��5NiI<�*j�f���hGA���-�"�qKEy�I���H���k�M��6P	���n�T=�w�����0�|��)���~9=J�t��<���P��f��s�����xK���`qkVV����&V|]�]����/��q������!r����e��P49�\���
��<�E��jKY,�\'q(��T@R?_�{�@�T\a�+���g0�B��k�������Z��5?�Q��d�Y���^��K�����d7&�-�)�!ROF����P�)��2�:�%OZ{5����,�w��^�O�H�T+4zD�t\</~>Cn��A�y�)�i
�3�kI_��!�����i`���%�_N��_��W#��Z������4����'��� �
���A���p�!�C�E�����3���2������S*!)w��t0�H��%R���Gd���c��QF�2NS���A%�~!��b��4V��THX�0x���<�O���'���g,������,Eae9qGv�^dA������X
�6Cn�q]��
+�gD�x�Sr�J���O&�?/b��(������Y�:�"x�4U��{S"-�dNH2Q[pGlY�Y���]��*f�&������21\BmD����J=��F�#�q�)�`�������Y��B������������`��V������s��!��7w�+����Q�r����\Y�D������������?�[,�>*����Ag����I����?��%��Z?�Ug�����k�8/�m�%������k���_�0������n
�v��!1P<1V��:(��oI��������U�V9^!%\o��n�_���p[�BVZ��5�`�����$3�`�d���dO��hY��Xm��f��������j-1V�Ah��[{������b����g��Or����Ou3:flf_aL��s�\���z�&��7����e�&-�\P|Q-�>��s�=�*����f��ZBF������p�G~"��P7 �E����[I =���_z2�:�C_�T����
�)I6������v��q����;�S�!��]�s��s���2�q��u���1$B���n_F������%��o��+����7�*�!>�l���:��O������?��6����mg=��g�w�<�]b�����]�:�zk�������H<c"���N��~�� +�o�	&��l�����b��1����5C�_���bLRXH
n�C��������+1'K7���a�(c:=�'>�|x��%��/nS�����/1R�lg�l����U4�FmDq2���9�l"�$#�G ���.I;�p���]R�-N.;����n�����5��Z�����E��Y�|Gz�L������qS#��r�<�#��6W�-6�)����Yz��0��>|�7a8sz�����"{���7�C3��2^!7V#WCx�
��V��m�2�\:�=����^��et���?B���v��7��I`�q�c�WD���6��L�b�]Cq�y`$0e��'SZ�0�Wz����Q�g&���8�$��9��;9P��/S��kM����q1�&!V�7k/\������bh��9W^�<!+ ������|�6���x�����R� Jm3�yyD�gRv>�;/l�hN�:&)�i���������(��4h��Z����h�������1���V���$�JE�2E�;6/b��t��M+Es���I��^a���)_�b
%3���(��Y������|rG�r�E|���1���+��sH�0��t���������w��sM�)bC6���L�K#�L�L��LB�����T��Ux�q� +�0��f���%aD:����j����l�cbS"��w��M���"w�;Tf'�2�����|�Io	����#R�J��<�)��u8�Z:��lA��X�j�L�@������Q?�A</&����Vo�����>���hE��?��)V�:D�V��4�S�Q�C���L,��6���L��
p�����6��KD�U��-��*v��^	�~�
��tx'����X\3:[���h�(U$*���N���[�B>[XD=�<V^��6O=��Q�����]�����h�hwr7XL����fkJ@���mZPfE���Y���(���^�����C-��bc _����='�>Z�}N��{�����sj<��}[Q%��}N�?�9��ou�U������+��C'�F+xA�k��E
l�[���k�8������>)��=|F�L���-og���:VK��]�K��
��d4%���M95m���>~���Z0����}���A����7
<�q`7��V�V�������#���^x���y��_:3@���es&}���}t���wvv�~~tV���"c��t����������F����O��d4�,�79�����`���C������s�l�l�G�-Q3�#�!L���g�������)aL���>�WG?�U=�����1�Z�������c4����e���nu��l�����Q]��+��^L�W|z��Am�irm�tYuJ!hmu�r���&�#��kB���qD�%F�mM�Q�����TR����d������j�j[Wk�^�-�������l�V���E��,���'LglB�A���8��ao�*5�U��].-�u������b����[� ��A�R��a�(�q��(V����$�[���(t��������c�D�-3jKj<��`�;�F��TN��e�Gb�I8GD��G�<>�o��Z\�d@�#r��K(���[����������5F��b���p#�U���Q���=���l<�z�����>�]-<��\����3Z;(�;��������
�Sy����'������C�K�����e���:������
c��p�����:g�$�:�����x��d�*q~�M$sr)����9���
����@*��0�c�j1���A��[s�DV$�a��q�y����"�+Q�B�U�-Y�Q^�#b
�]�{U�U����O9\����o�_�'m2W�c5�/�I4Eyei���a���"��R�mRx���>q�^9J��a^��������3b�,~��Z���g�x�����P��.w��O��"��Hg�"T"��SQ�����F �#�;��o�@Y����x�
�����8<~����(�������6:����')mE��s~q���zQ�_E�#���tG�o���]�B�?��MVK�y�:�m������I�������rnkH!�}F�y.���N0*J�6��ihBf�~p<��,�>���A����� Ws,R��)�C�*�L���hR������f�C�2.�6�W+g��Dtq��[k�$�{�'���luQ�>��2��q.�@Z_����Y���
���p��^o�Vc�Yy���u}���@�Q��3�4�S��'���]�-�����U��|��`)���-����������������9j��{���������FM�Qe�V�2�����#�s��Q7���E������|y�58�� �G�r�C��;��m�b 3��2��v��l��n�*/r���yt8Gii��u����D���@��kX�9��e���uJ�M�Yxgk�P�����F<
{C������vwk ��Y�6KX��q���g#vp�w���������|��p�
3t�|����@��Z<����qX�_gO���*��I��k\�+�a'�����V�U�M�)�x�p>J�{
�6���6��<|�y:l���L�O���_W��sEL[�;����Ta����'�0��?�%���Vt?^Q�	�@K����"gJd�	��E���Ya�}�$���=�G9����zB�SPi���|��'/�+!\V�����`�����Zo�<�������k���a�����8M������~�.����=?�1�/��430�R�GN���b!!p�7�<AJ�m�;>C������*:kC��S[��V��Z��K{&������&���E)9	�@�`�������7k1�b���G%�c/#�z�Oh��+��
x�����o���>���O)n�'�9�Oi����<G��'�����|2��������B�5d����U4���o��S����
m���_�v�(�=q.��'|vM������9�zaE~�|������.iS�%\|�G��N;u:U�Q]jo��F�LR�	�s�|���wA���U�<U����)�e�&�����[1�O�6*��/����I��>y�P��4�O����IW�V�[�{�}��'����<S���qr2��
��[��ZtV����}.��K�w��������������Ee�j
D�_��b�s@/���;�Wd<�3�9�lu��7�p��y�G����������	�A�����������zN�x�~' ��|����y",��Ut:F&
�=4�������x�<�c��$'Z/3@�j
	��=�����g�c��@�xm��M�'����������������N
���YxK6pl<]��T�����e@�K���	���V�v^�O�e?N�p����G^_��d��"u������(����	F+-�b��M����:H��N���b$]��P��?x�HtA��d�����W���j��@�3���:�� sx�j��b���d��
���q�S��Y�6c�b�h]�LK&���K�3��@r7��bY�F�i�%��a�;]������a��.��9{'��)�c8aak�����p8K�\��u�w�we9r.]���1a��l1vH[��1�a�6���t&�h��[E�yI4xF���������+gP�����
r-�B�o}|���>���@�\v(����?}���Q����X�p�g���7/O�zWg���7����������=��QNX����#��]�t�+�N��#����������r
���x%�6U�mTqF�Tq��S@ �<��sr�e���!���:�'k[Y����QrI��_.����e$����w�^�9,V�u��{�����s����u����3�P��Lr������6����a���5�x��V��������b������	��N����=�)xxr|�7$������7Kr��� �e��1�(V����W��B<���gD�����&�;Y�t����&�W_�m8���i�\2��Jy�E�~�L�IG{�g��|����I�e���,�GSJTq����!�d���`ua�(��J�N��%^�;��
���XS>:��'�O������������'�\�����|bMCo�1�UXS�E�af���Y1V��M��I�t�����m2�`���9D}��a�	�7OV�pzM"h7M:�4a����%2���>����v0,8_]����F')L+����m]a�������O@�v��9��"W- ��w��?�����v$��wS����:�s�T�q�-`���82��@9�"r��������X��6������V���������M��3��.>y4����6V��t��i\*��Z<JQ��&/��Ro���������������.��I�OQ|:�u��~]�uu�p��;5a��3/�c�rE�(d���5���!�3n�|�sB"���M�)�]���TH��8��,&Op�6�|�Zz��X���������������n{������o����c����VDmz�����iD�DsY#�Cxu���<!�dU��#8�f�dCVE���Z�YGy����������@�S1B6_/���K�u��C�r�g�uo�S2�|;��IIq'��F�7a��(�����S�U������G������`w���]!+�'�8���������N]�Y���H�QGM�Y��)��')�
�.Yn��R�`���	������a�!Pt��q��+����,��e�tf��s�����2f��Oxc���U����C��q�A� ���������4K������{��������lJ�����?8�;=|{~r��5�J����$6�b�?~���W����*`�<$��`Mv�z�f-�v��z��B��f�-iH�J#�3�<a���?�"�������
����|E�e���{J��?��|���9@ZDRV~���_���;W�C��R�B��E�T_��*D!�������L�^���+�P���/�g����J��!��?��*��]o�F�=�BP�J�liNl�����a��-���?��[�v2l������d�v���#�x����x�NvQ��$���G��N�O�4�T�!�[��;�%_]B���w��s��
�ZY���S�z�
5,�;���l$F�}����.AJl��Q��E�U�C��iL��|lL$��v���$����@GG�L��������{H/K�����j��,�C7=�[|F����i�cO.-������[��9^������qo}��vzq��5��t���c��}��#[2��{�V�7�����4^g�s���QW�:A�)�k���fu��?q����x�� �F�N���i��/bR��+@�f��R�<�S	�T�c%w���g�G��	�N���\���J��K��{�z�bI��r4��^5���� C�k��g��yz��` )�P�����i{9~��&�d�Y����2>��������A�ERQSf������#^�s�����48;e6�w�;���y�����n����������u����4���rX����kv9�~���|�����z�m��G��%2]l2_���]trreI� �aB���j>��Zn����'���8������	��������:U�e3�d(���EZ8�@X}4{�����}H���E4O��7|��w.s�>4B:�\�t�<0��0��&�JkWj���O��^��RW�*TENX���e7���UL��&E��0�@�(���)I�k����3�"�wJw�1��0Vts�^X��j���s����Jr=���z�A��C��������&�?i�G���a��u�%	�:����?��u��X�e��o�M[���I��t{ '��G�0������>��![�xs�Z��[
�A�L�>:������rzw��
jV����=�4�)�U#����.���HS������ ������+��l�y�=--�V�����d�����lj�
�9A���	x�!�s�^�54;|�k��[9a��w�����g���<��RRF�Mf����LEL����B@�$���������|U#�������1�����E�rH�����%#�
���>#n:�)�n����HgsX'���R�����7��2T8	���O�|�h����\���E��\�i�h����l�Oq��
��iKJXB��
F����P�i���������t����'����"w6o��������J�g��T��j�B���i`�:��(C4ej�b}x>3����d<����`���!M=r�w����O�n��QX�I����U��|���S!m-�u5^o(�����z�T�����%�\K����.��S{�d�������]��]��IYRq0������A�H'���)C�?s[P�|)��UlpHWD����!�d�$�����e�^��
@h�X��(OC��'�X9�7�p���xx��_�N�m5��>��������[����f���������0|�|
v7-0014-meson-ci-Build-both-with-meson-and-as-before.patch.gzapplication/x-patch-gzipDownload
v7-0001-meson-prereq-output-and-depencency-tracking-work.patch.gzapplication/x-patch-gzipDownload
v7-0002-meson-prereq-move-snowball_create.sql-creation-in.patch.gzapplication/x-patch-gzipDownload
v7-0003-meson-prereq-add-output-path-arg-in-generate-lwlo.patch.gzapplication/x-patch-gzipDownload
v7-0004-meson-prereq-add-src-tools-gen_versioning_script..patch.gzapplication/x-patch-gzipDownload
v7-0005-meson-prereq-generate-errcodes.pl-accept-output-f.patch.gzapplication/x-patch-gzipDownload
v7-0006-meson-prereq-remove-unhelpful-chattiness-in-snowb.patch.gzapplication/x-patch-gzipDownload
v7-0007-meson-prereq-Can-we-get-away-with-not-export-all-.patch.gzapplication/x-patch-gzipDownload
v7-0008-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch.gzapplication/x-patch-gzipDownload
v7-0009-prereq-make-unicode-targets-work-in-vpath-builds.patch.gzapplication/x-patch-gzipDownload
v7-0010-ldap-tests-Don-t-run-on-unsupported-operating-sys.patch.gzapplication/x-patch-gzipDownload
v7-0011-ldap-tests-Add-paths-for-openbsd.patch.gzapplication/x-patch-gzipDownload
#129Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

Hi,

One thing that's pretty cool with ninja based builds is that it contains a
dependency log of "discovered" dependencies as well as information about
dependencies "encoded" in the build specification. LLVM contains a script that
uses that dependency information to see whether the build specification is
missing any dependencies - this helped me find several "build bugs".

The script is at:
https://github.com/llvm/llvm-project/blob/main/llvm/utils/check_ninja_deps.py

It just needs to be invoked in the build directory after a build.

If I e.g. remove the dependency from libpgcommon_srv.a to the lwlocknames.h
generation (*) it complains with:
error: src/common/libpgcommon_srv.a.p/cryptohash_openssl.c.o requires src/include/storage/lwlocknames.h but has no dependency on it
error: src/common/libpgcommon_srv.a.p/hmac_openssl.c.o requires src/include/storage/lwlocknames.h but has no dependency on it

I wonder if it's worth having a build target invoking it? But how to get the
path to the script? We could just copy it into src/tools? It's permissively
licensed...

Greetings,

Andres Freund

(*) It seems architecturally pretty darn ugly for pgcommon to acquire lwlocks.

#130Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#2)
2 attachment(s)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-12 02:08:29 -0700, Andres Freund wrote:

A very helpful visualization is to transform ninja's build logs into a
tracefile with https://github.com/nico/ninjatracing

I attached an example - the trace.json.gz can be uploaded as-is to
https://ui.perfetto.dev/

These days perfetto can load .ninja_log directly without conversion. Attached
is an example of the output. Also attached a local .ninja_log to upload if
somebody wants to look at the interactive output without building.

It's quite a bit of of fun to look at imo.

There's a few other things quickly apparent:

- genbki prevents build progress due to dependencies on the generated
headers.

That's still the biggest "slowdown". Only a small number of things can start
before genbki is done. Parts of pgport, bison/flex and parts of the docs
build.

- the absolutely stupid way I implemented the python2->python3
regression test output conversion uses up a fair bit of resources

That's gone now.

- tablecmds.c, pg_dump.c, xlog.c and a few other files are starting to
big enough to be problematic compile-time wise

But these are still present. When building just the backend, the build speed
is limited by gram.y->gram.c, gram.c -> gram.o, linking postgres.

Greetings,

Andres Freund

Attachments:

build-log.pngimage/pngDownload
�PNG


IHDR/���� IDATx^��	�Gy�]�%K�%��.ox�x/��dB��L`���yH&$�L�l$����0��a&��,C&�2!��`v�c����-��l���%}��y���s��{��9�}
z$��]���}����W/8��s��������6m��?���|���C��$ 	H@��$ 	H@��$ 	H@��$ 	�D`�	��n�����g�Y��l�Z�������$ 	H@��$ 	H@��$ 	H@��$ 	H��g���m�-J����?��u��	H@��$ 	H@��$ 	H@��$ 	H@���9��?���B�q���L[��~�m���O��s������=�yZ�y@����O�{l�y�&m���nK�zhZ�lY������c�=���k�����7*��'�L�=�\�c�=�n����,l��ys�g�}�������#�T�|�K^���?��Si��u���kT��-[��������:�QY�?�|z���*�{��w�����[nI�~xZ�ti��r�<u���{�!����g�y&=���i��U�����?��m�=�LK�,i��8%.����p���e��y�p����>[�or�	^���AY<�@�o�X��IQ���]w]:���.�����\1O��v���h[�5�1��]?���i��UYM��|��}�Te69r����V�^�����2���}3e�Y������O����������Q���>�|��#�l���7?��U<4���}3������G�1�4��Nl����>xSv\C�<�~����,��>�~�\��AY���#M���1O����}/�]��6l����u��7����XA���o���C�M�>�=�����E��w���(��w���;����s�<1J|�6�S�-|���i��o�M/_��q<0WdNF�4�%�S�`�������:�\��I�\�]a��6�)#��?��F6q1q���Ol\c"sE��4N�(���iY����|��\1W����G��P9���\����]�yX���A���\��\1g�SG�b}������a�8%�`]
�My��v(���+��!���;�W��vM�f�"��G���s�y�]w�U�6MX����}3�(�H�8���{�8e���o�����\�i<�/��	�����#�����|�?��t�x �Y/k����y�@�b���c�i������������}��W�5�C�8e��|�gHM���b���5���������5��y~�~��*�i�����y�G5��3�i��*�6��uaE;�]�r��;	B�����(y��J�����n5]P�
�t�MU�n*���s&�j:)��!)��@�b��4�����GqD���;�<���.�)���M��xK�D�������>�����b�X`��x��`M��I���&>�'�h����0A��[��O���8%�j*�����#���E��cR�W^ye��)��1O��d1�����>^M�qJbHYM�f&d�C��9W�������n<��oh�7�CX����/���t�g4i����7�|s5�n��7�P*��&P���v����b�������C�
�ME�,�M�b}���\�u��wV�H��&g����@��.�f"��T�}3�H��X�g���j�7����!�����C��}3�����5MP)��[oM'�tRc�9c��As��,���k�f�wb�i�L��M��V����n�������/P���(���MsJ��X��SNiR��Z��n�!���h\c"����il�R�H��x����
r�<��v�*G���v��T���k�\��o&�a������\1g�SG�b}��9%�H�8%�`]�8m:�&���B���y|���c�+}M<l�G�`��i��3���n���*�iz���:q���n!����.��o�q�t�as��"[�@�f��i[d�O�#���@��g=�iN�+��)�9�6�i�O��@���1^��'G��|���5�+��y�f�s�CD�L������?��4}������<�)��1O��-u�QM��j�|�|�����.���A��v;hl�H�e����T��.���xC�F�T,@gC��c�����$��	���3�s�T:.��"q��t�$]M��x��]M�ZH�y��M�\}���r���HY�b�:�V-���v�J���i�a�;s4U��0�����'W�c1O��Tla���o��CX���j��i���x�%g��5������r$��5�v@���	G�T6�� W�[�<�OSQe0�1��x���7lj�o���K/Mg�}v�!���>����
}3�I9�69�fP��;0E�7�-&c<hf��TT����]�b,�_n�0EY��9v
�����E@4���Y��!���9����yr-�����b>rb�i�����YM��x��J�Tb��o���M���yr@�+��6�[����t����B���M�!�0�Ms]��g�j*b �����{���s2��X���A�nN9D���<���M��>�2r��=������b���C�8%��7����'i���������e���9c�:9�;�S�xs�"n51�p�xo*D�����yF���+��W�~0v��;^��"�B�~���6�^u-���t���G�G��)��s�F��u���(��<h�����>�q�1�iY��_��i�L<����T�9Y����e�F���k�'r<�e�������l�I������X� ���m�o��cH�Y�c4}���B|�4���}h��j��7����
������	w:h<�Z@�	|�[��&�MP��x��E��
n:�7���f��5�|�#<D��
��I�e��i'w&�L<�,���!<��@7��k��u�MX��M�(+W�$$$\MkT�b�.L4�*�`� ��5��y�!�I��
w�!,q���e��A��T
�=�\rIz��^�x��3���Q�b�PJ�Hvc�NYM�f&dUR�Px�+�i��b��TF���1?���,j0�n:�����.J��w^�a���>����
}3�b��}3�0��>���o�����x���o�b���'uh7���M�(����G��59c�������M�"of����T�}3�H��X�'�"�l���+�#�`q�i����pj�7��N��4]@�-",?���s��<� �]7�y�D�@9v��of�!����<�b�i<������}DC|.#�bl���:^{����3�l���G���Yg���,�D����Mc���2r�������s�<ys���Tl����
v���S��4�cod��6}@�3��#1�C����r|R���J�O���v��,@��+��a����b��x����?9v�#���b�R�����'�]�������
���O��V�"M�Q�&aSSQ%} �"s��m��>���:�4�|al����e��?�g-Y�����O��6M�L<4�S�+���W6]��������X����gdME@<��&�i�����y�G5������<3�b�O��7����
�������B4�M�	�o;��/��J��>���6M;y�%�V��(��J-���
w�����N�
�9�"��M���EY�bV�1G���S���{��#J,���KM��3"�s���1����~+g�L��7M��4G�:6-+w���}s�1O.�B��'��8���7��i<�9���c>�X�3�,5�Y@e��E���s�|�}s����7�n�9�d����`W��X,cw�1�#/���eW���[���k��9�4gY>x������ �s�[%�9D��9w^Z���y� <���G������#NK[?�[9�Zr���a�4B��m��������e��������[��b���YV�u]^��A:���<s����9c>�:D��d����<��u�����z�N��xP�������?�����
?�� �=�!�q0��M��K#`����'&����w�o*�����e�B��~x3����>�-�N�!���%.���1o�����[e9v����c�	�{&��[����5����[���T`6xY��`v(��y����m 0Px���k
����6�U�I��_�j:��s\�'d�.��1_�;4f��	@��@xp�e�U��*<(�-2F����j������-�l�f �c>V*�[#<`k���)���&����m�����70���Gx���"���ul?���DL��O��N���m���o�7��;�(0PtP�K�o���/�s�=7-[�l���:c~�.��	0�'��M���K/���&���T]��'D`�����Z��[�N���*���w����1?UWx�	@x�����a'��L���Gx��[�S��7�@M��v[�I���yKO��T	 ��s�=����`����u	���;�WlP���_���y�����|q��L��A0��������.�����W���f~����=��k��������������O<�DbK��O>�����0*�v��Jxp�q�)<�?n��5�s:�:�(c~^G�������Z	����Z�?~��5E8�����Rx0��Eu(<x���*(:h�'5ub���!�����iq�L����7W���+W��N�&o$�q���w_bs�������}���Y����Wf{��>���,;;�A1����&�$!���jLr96m��.��������������L��7���t��g��W���|/��x���0�s�~���+V���/���W����j��^�A����[��K�,�{cK�����}�������*����O?�t������mG&��T�>/����!�%D?����>�lb[X�q���{�� <��>���w����>���v�|��<���$~nmJ���#���[�������}�{��H�}9����@���U�^���yr����?�����O�n��(hWf��*Z+������^����4e�'l�0a��j$�$�t���	�d��]��$/[�lI$�<h�k����%�-�W��U���n�} �>#9���������-��L��E�JY�n]��*&N|�����,�������W1���|�UWU��p�	i�}��b�si����{�t��_|��U�����������n���jAQ%7��8g�����~��g��T��~�m��N�Z��/W_}u:��3v��������]�`l���)E`>���O9��1ON����|z$�oD��/����a?_�{5j�a��
6TqL�C����ON1�e.z�1�Tm��Jn����5���
��.������A�� b���!��:
�<��9,s\c�4�j�LX�dM�yg�x@3�%����q���<�����Wm%@�������b�~�\��X��� �G��x��+�h�=�s���=Px���wX���;Q'K����O���wZ�������f�	=?g0���~���V8�u�w�D`P�S4��W\Q%+,\�������<��MY�4��X^��3��\��n	�tx������H�2U�b$0'�b�|���y���d���7��{���b%�{�������{��	�]tQ:���v�m�9��e��x ���������P�q�e�U�71o?>i/z��@x�`�����x@^�����W���H�O���P��� <@(��N�1��a
����o��0I~�}����%yU[f"����?\=P��k�4��!N��i��FX�g7�
���A�����]�x�D��������f�>�6���k�y��@�~����|���~����
�i�l��{b�������~�Z��?7��J�0�,���a1u$���>�0>�`Z�fM�����`[��v�*<hG5�R�#0����� I��V�}&�$�LX���7���fr~�N� �8��C�$���X�Y�zu��|�;��|H��|������Y,p�v"�;����%�����%�����G(��L�����i�����$oh'��s��WL��0��&��ib�����9��JX��,��p�renS<9z��&< �'n�<x� �q��=7��]�A��mr�H��c����������K��G`����?^�_GpsT�k��Y�'����/yK������������Y�'0Lx@l���u�����B��<qY�j���1?y�y���|.
�<b��m�mry��������$<�XKN?�;q?C��@�u���u����.Px�E�Z���@�Ev�&�,H�F4l�Dr���P��8��{���)�"=�|�m*���g��c!�Wx�do���C[a����x�v��H	�J�����)�����I/�;�,Z��G�������gE�	S$0Lx�����Y���WT��t�����I;@|�D�xG���6~2g�N��3&< �'a��O?}�g�x����6��J`������xp�"$o���jC�������A�b�����i��"&�y8�������@ON�Z �'Rx0�b�-5&<`M&b�ub�7������]���t���x\;	��#�A �A&�g�'��sc��	�c�\�
q��~���z
�f7(�2��������2���	(<(�?ZW �a[p3I��gQ2����@~�"�����PM������$��q�����X�M�x��d�~�y���_����Vfu�'�����'N9x����;b�~��%�����=����e��	�_��s�j����q��|�O�o�#�a����=qO����=FgX�D����y9FE�����&�.o����O-P4sNrr���(���&�
��G���<��@v���&�
{�y�51o5����'@`����F�B�k���p��;�A��A19m�6@[��5�XgL����+�
�����V�)�a�����(��1_�g�k\��q���	�h�6I �a��e[�J$0LxP���$�f�(�2$P�a�����	�"0Lx��|��@i�	J�S{$�#��a;�xj��{�ZG��o��4�!c�!@/o>�����6�s��@����r�OE�#�����&v%#��U�u�����7����(G(�K$����;���e��y
9M����8/�@����
�y	�����6xI% 	H@��$ 	H@��$ 	H@��$ 	H@�PxP�c4K��$ 	H@��$ 	H@��$ 	H@��$�
��%m��$ 	H@��$ 	H@��$ 	H@��$ 	J@�A������[�.]|���o����7��W^�6m�T��
�������}m�RR���+������{n��qYp��'�����K��zj���\�-������ww���M��$ 	H@��$ 	H@��$ 	H`�-]�^����)���9^9���?�7�/d�i!]'��O����/����]����s�=�)�������m��t��?���[���qYp�Yg�����5�yM���\�UW]�N;��.W��I@��$ 	H@��$ 	H@��$ 	����e��S�uz:��_?�+��W?���/d�i!]'��`4+<�[����h��$ 	H@��$ 	H@��$ 	H�[t����e��0��q�q���-C��$ 	H@��$ 	H@��$ 	t����n�����������`4n9�Rx���eH@��$ 	H@��$ 	H@��$ �nPx�-Z��Px0����-�U
rP�	H@��$ 	H@��$ 	H@��$�-
��Ok�2
Fs�������J�A��!	H@��$ 	H@��$ 	H@���E@�A��imZF@��hSx0�W)<�A�2$ 	H@��$ 	H@��$ 	H@�@�(<��?�M�(<�a
F���*�9(Z�$ 	H@��$ 	H@��$ 	H@������i��9L��h�r\�� E���x��� IDAT$ 	H@��$ 	H@��$ 	H@�"���[��6-#��`4�)<�[����h��$ 	H@��$ 	H@��$ 	H�[t����e��0��q�q���-C��$ 	H@��$ 	H@��$ 	t����n�����������`4n9�Rx���eH@��$ 	H@��$ 	H@��$ �nPx�-Z��Px0����-�U
rP�	H@��$ 	H@��$ 	H@��$�-
��Ok�2
Fs�������J�A��!	H@��$ 	H@��$ 	H@���E@�A��imZF@��hSx0�W)<�A�2$ 	H@��$ 	H@��$ 	H@�@�(<��?�M�(<�a
F���*�9(Z�$ 	H@��$ 	H@��$ 	H@������i��7�;��3m��5�|������lZ�~}������5k��-[ZV�����,���ok\'���\�����y�$ 	H@��$ 	H@��$ 	H@�,��u�k�m�����7��.� ����lz�����uMt�?�!*g�Q�A�}h
$ 	H@��$ 	H@��$ 	H@�@n
r�<	�H����O�}�{�#�<2b	�_���|�f�����{	H@��$ 	H@��$ 	H@��$0�(<�>���PxP�1~j�>��g*<�M��$ 	H@��$ 	H@��$ 	H@�@�	(<h��AG(<��H��Y�>S�An��'	H@��$ 	H@��$ 	H@���O@�A�}h
:B@�A}G*<��*��
r�<	H@��$ 	H@��$ 	H@��$�~
��Ck�
�;R�A}V��Tx����I@��$ 	H@��$ 	H@��$ ��Px�~Z��PxP��
���}����D-O��$ 	H@��$ 	H@��$ 	��������t������TxP�U�3�&jy��$ 	H@��$ 	H@��$ 	H�������#�w�����r��� 7Q���$ 	H@��$ 	H@��$ 	H@�'����>�!����#�g��L���Z�$ 	H@��$ 	H@��$ 	H@h?����5������>��g*<�M��$ 	H@��$ 	H@��$ 	H@�@�	(<h��AG(<��H��Y�>S�An��'	H@��$ 	H@��$ 	H@���O@�A�}h
:B@�A}G*<��*��
r�<	H@��$ 	H@��$ 	H@��$�~
��Ck�
�;R�A}V��Tx����I@��$ 	H@��$ 	H@��$ ��Px�~Z��PxP��
���}����D-O��$ 	H@��$ 	H@��$ 	��������t������TxP�U�3�&jy��$ 	H@��$ 	H@��$ 	H�������#�w�����r��� 7Q���$ 	H@��$ 	H@��$ 	H@�'����>�!����#�g��L���Z�$ 	H@��$ 	H@��$ 	H@h?����5������>��g*<�M��$ 	H@��$ 	H@��$ 	H@�@�	(<h��AG(<��H��Y�>S�An��'	H@��$ 	H@��$ 	H@���O@�A�}h
:B@�A}G*<��*��
r�<	H@��$ 	H@��$ 	H@��$�~
��Ck�
�;R�A}V��Tx����I@��$ 	H@��$ 	H@��$ ��Px�~Z��PxP��
���}����D-O��$ 	H@��$ 	H@��$ 	��������t������TxP�U�3�&jy��$ 	H@��$ 	H@��$ 	H�������#�w�����r��� 7Q���$ 	H@��$ 	H@��$ 	H@�'����>�!����#�g��L���Z�$ 	H@��$ 	H@��$ 	H@h?����5������>��g*<�M��$ 	H@��$ 	H@��$ 	H@�@�	(<h��AG(<��H��Y�>S�An��'	H@��$ 	H@��$ 	H@���O@�A�}h
:B@�A}G*<��*��
r�<	H@��$ 	H@��$ 	H@��$�~
��Ck�
�;R�A}V��Tx����I@��$ 	H@��$ 	H@��$ ��Px�~Z��PxP��
���}����D-O��$ 	H@��$ 	H@��$ 	��������t������TxP�U�3�&jy��$ 	H@��$ 	H@��$ 	H�������#�w�����r��� 7Q���$ 	H@��$ 	H@��$ 	H@�'����>�!����#�g��L���Z�$ 	H@��$ 	H@��$ 	H@h?����5������>��g*<�M��$ 	H@��$ 	H@��$ 	H@�@�	(<h��AG(<��H��Y�>S�An��'	H@��$ 	H@��$ 	H@���O@�A�}h
:B@�A}G*<��*��
r�<	H@��$ 	H@��$ 	H@��$�~
��Ck�
�;R�A}V��Tx����I@��$ 	H@��$ 	H@��$ ��Px�~Z��PxP��
���}����D-O��$ 	H@��$ 	H@��$ 	��������t������TxP�U�3�&jy��$ 	H@��$ 	H@��$ 	H�������#�w�����r��� 7Q���$ 	H@��$ 	H@��$ 	H@�'0Q��]7]�~b�@c"���|%}���N�<�L�;l��--X��q9���w����W������t�
�����}������{lz�{��N<��,�u��;��3�����R��[���f)+g��.�
�h����aS�>"W)'��u4����s�CN�Z�1?��������h��g5�~����?W�6��3���r/���s�\}M�<gY��c~n�Cn^�|}����X������9�~~n�r�ks��q��9�����R��R����,Z�(����qo>)�s����i����V~���=�u��pn-��%0O<������Ng�qFZ�dI�Z3`�A4�$,b����u������e��
��2-^����[��-[��lK/�i������-����qc������^PAWl��%=��ci����jl6m��������>��y��J����{�(R�F������
6T����ni�]v�s�N�D[�!��K��7��������-i��U[�g����l����b�����{=���U;�u�]g,2g��|��qN��vN����h��1?���-}/|C��Rb~P��������O{������d��jL�	����h�M�q��\c�������b�����s�=W�Wu���u��2�?�����hV�����s��(u��G���%����47`,$7Y�timd���s����l?{�}����Ys�#�����������6��~���6���a��u���2K�i�p�}����������U���]gn@��'{��������7W�0���K��o_��9GY��+W���=u|8[|����������d�|*g��-���:�z�y����:�{�uy�fS��&^bb,��as����C�>��4b��{���Lmd�2��u����oK���z��Q�U�V��+�VV]~uc�Ny�1��SO�9��GN�ZGl`
���<k���l�&��P���~�Zo��&�3�����,��Y��������''���F�UB���L��l�{y��������������g��w�����f>������k��q�����%�o����[nI�|�;[���-���g�������>d�y���W�/}�K[[g���7�����7��,��z����/���K��m��V�t���V�O[&k<�@5A8����Z�*���w��^������TR����o�W�������������b�I�Vz}��j<?��sK7uF��m��c!��w�}[[���,��N
�dm_���M��c�����^���sL��c1�F��]vY:�������k�]�)�$k����3/�G]���|������c1��z��e��V���nL�=������%�<��Y#����;����}$z�/�B����Y'm�<��[�+���W�2��.�#�~�]���y���+_���dv�M7Us�������\]��y�v�5�T��\���	X����xC��������F�8fQ����o�+<(#R���^+���P/�e���e���
�e�D�AY�PxP�?�F�A9>QxP�/��.��
��/��r|�%
���t%WxPVluEX�������]�A9~1/�X��`�?jP���p�m�C�[���QB���-�vZS2���h�������:��wUx����0���������f���-�����~u�(�����]�Ib;(��F~[������0��mg����x�#��?$�,�a;>�:b��89�&��+��c�\���`��fx�'��F��s`7�M��c�R����ol����*{��&���3�Mk��a;�$�h��m����\|�c;���!��p��l�F��o���\���?�m�����g��?a���u|� �����Tg��w���	�%��z
j����A�0�-���6�s-����h��)����T�\l�s���K������z������O�������Kb�W1F�������f��T�M�&< �����v�?�C���DN�7�x��AlE���Q����������~�7m��0��S�](1��c+g~6��bX�
zc�?g��?W�P�~�����a����=�s����N�%��&m���3���O�W��c�m���>�u���{�������k�����z��A�����*)�T�A��{�������o��_���xcL��2S�NK~��d ���3E�>�����(��������q�vN���<����������a�����}�\T��rwl��A���B�s�i�W��������x����Y����~�{����r��g�+�!�<}~���%��
�O����Ao��;�Q���J���o��w��+r�������a���Sb�z�����������������������}�O��h�����;����NPJ�>l���w��ak|��w}$�r�i����3����R�����K�w�u�6��5���gs��2f���G�o��c�N���s�9�� >�A��C�����3B�^[x@Bq���V���W^�^����X('��f#0��A����>R� �c�H��md�	a������������~z�k_[-�p�{R�1O�7z�*<��l}�C;�<��C��{��DF��-����/���$���2�m�����)��G��A�0��6I���^�vsOl���{�`���n����8���%��<��5t�\�9�
Z���l#�����.��T|�m���m�9��������������0(�Ce�=���a��
7��9���>�X���{�-�]��z����a>�w1����)���0�vG�#����?��w~�7[X2�~h+�V$��h����	�Db��Lk���'��:���M�]���Z�-���{����}d,��r�)U�p>���l��a�����m��7m�������N�����H�b���Ts"�'�Pl��%}-�"n���abw��GW��S?�Nl��O,Nr�3Lx��9h��O�m��o�����A?�A]b�=�I�����}`�-���i����E��i���a���g�uV�v��961t�g��zN>��[���������
Z�|��G��`�Sb�bL8�������f�g�:m���z�>b��zL���oP�b�z0�����p�=��F,<�G�/�n�Qo^Z��\�$<�+�����������
u"�������~�v�/�G��j�(�\~�����N���������'�|r+!f��F��Z�������|���������	�+}4�L\�A�y��Ga\��a��A�;m�zk��iKg�yfu[�'�8�:L�}p�a�;y�O8���M�|��UD�����k����_��"��������]���g:oX�NJ�D���N��w�7�=rE��z2����!%/���>Lx�;c��,���B��+����7�/�.�����L����'_a����+�G�Q?��h���/�<c���)����/���oU9V��(�7?����������:���sh�K�?��*7��rr4�`���sO#&<����	�<�'Ogm�1������c{s�X(�������g���7�Fr.>E=h�ym���3p���M�����i7��z��P!�OBP<(w'6��Xc���c����C�����r���+�_�<}��	"�>����p%����q4>#5��}��������C|q�%�Ty�c�l�;�	���D\
�,�:0V��F��X��I<O��<v��8,g��y �������z/����;�K��;�O#����7gLd������#/��L;&<�.�"�Y��6�|���9qG�T��M��&�\s���q[hG�L���b������\�������M�r[�-���'D���^z��xF�B{&�h���G��i�����o��W��UU\Q��M��cP�^[x���}��P�<����
�;��N���4���1q *��Pj����G�;Me�l(�$t�������j��$�e��?$T��3��.
�m�fh�,���H�:v�evt4,���K[��W�����$Q\O�������$^$��=t��3�G�C�H��,P'������J�����z2��[�$$#�o��>+���po�a3�e�#Y��?�$	��$���[I N?��f}�K_�4��D���xC��}���C��u���������',����"!��w�}����A��G��#l
*~���0ib�$�bZ��p?������s�cL
��#c�?�;��H���.���j�qp���6�
�G����1	�}|�C|�o��:��'m�6�?i��>-\C�����s����5y����d���^��}y���I,h���>�h#���6���?�;�'��h���I}��_xoy��p������X��w�v�O����{���-���3W��,��M���g�>b!�6s��i���1f�`�q�1��Y�
�?���#<a $�O,�u�a��xI!����X��w�,�r;�C�K�Gi_�o�!cx����T�~�A���8�Ato��0;�����#����c�CL��B�Y�������3~��E?��9��3����3����9}9�$��}�qT��r]����G�x��U\0�_����vZW�vG�>��"��<�{��_����C�H��-rU�-������/ ��3�
��������<Hx0(�=1H�'�����h��Z���~c�}�/L���c#mQ�B���8`������C?����i����w�������7�X=X�7o�O��P���#��m��MB��/<�����+�c�D=�+���&~�w'a���`_,��0L��_�_���#Nh��e�k���,rw�G;�g�]�8f���{�k���z�
z����������7�{�X�0���"��m�7���i�����h������u����@�����>���x���/<����c��6CDN�����-\Y��������������5�4���?w��x�3�H IDAT�-b�|��
��}l��Is�����xkU�c��s���������W�M���c���/�L3���������1�1��9��)'&�N"7$<����)�#���F�c�`Z��a�_�;���S�H�"�Gi+!R���W~k����{���;ysor,b%�59�1��M;$<��9-k����y��{������|���h���!�am�:3���8����w�u��	�C��!������.�����%�v�Q�#�s�W�������_�'�K���j���<���\�q/� �y������D��;q���X�/�[���������	�����h�^xaz��^��:a'@9�r�$��!���p{�S��^'�����X��Ex@EgaQ%�'����,<�������������a$<��Q�.��~�A�-E[���a�My9�
0IaR�b+6�xD?�+"aq�z�I���������\:P��C�����9��6D���l��_���������J����.��R��[�$��J���@����_�r� �	!�\C<�������9&s��a�����v���_�DK��.�@�+<`�
��I+��������h��O~����c�eMBK|�39&�z��>�F��o�[&��>����o�����I�
�d$����[��
�������!�<�������d���M�{�9���+�<m�EN�0��<��w������&����6B{��	�F��?!<��M��f�}�Q�p-u"�&�?��L]����i���v�o`�",v��w��d��o�P�I,��/���Cx��pX���H�$��%B5���������}�M�����J����:v�!�'��9bkR[�/�WYX���3}+�&u�.�/�W���\��G�xB���I|��_xK���)���L��9�K�B�D]xp�����#��-���Q�c	}/�����w��F�b���(�������}������F�c�R�����g�x�X��G�F�4��0�?����;>�
�?�7>��gl	ag�����9�9��q�o��`P����5��p^���������b\"'���Z���c76���}�Ml��_� ��L����
oxC�s�H��E?1�����l�)�;}�"��!���FL��f|&���D[�������/�1w�����V�:	������K���!<�f����0��%�i���3����y�����c�91���S�y����7��}<0�v���������v�3������D�}�4��~�A�N���c�L_J]��b����cnK_���>��/<�����"��������=���<\�#F��Qo�y=sE
�oO2���������:}m�����`�!��z��������������3��hO�����f�B_M_6���~;(��l�k"��L�;~����I�������!TcM�
�������������=�N�������b���� �q��7�{X��f��+<���i�b$^���bn��i�����M�S������y<��x��~��_�j��*�=c�U�'��5�X��m����3���I�e1�e���i����g@���5������?�&"�
�W�����O[�D�T7'.#G\������W!��5�i�����������X��}�l*�'
��kb������>� <`�b ������_��j��sdP��V�tz���
l�iI�F���"��B,3��aU�H-@�2(��.�3�v�`�!< �a1���7�c3	b�':-9�#���}5j�P�/����<��::v�qB'|<Lx��,J�����Z��x�o�:�u��j���8�>�%UI�P��l&���,��?��s=}y�����br��B]�8����8$F�u��� ��X��1 ��2@�����>��]ib��_!�!�������$q�g|d`��
qH�����>�@�`;��������������;��D|���b�>�1�=�9��vhq����)vi�����������#��)9
�|��l,}j���H��W��+�%b-�����0������}f6;��~��bW��(G�mSG���s��%��w�G�=	Q���(�x��X����I�oU0a����L����M�}�Id�/�b��A[��yl��/���������0�]+x�%���3�P���.�s
����I�����c�(����Q�K�%+��]�!mQ|y~���u�+�`��W��A�Z�O��y���U�����<�fq�"�9���w����P�a�Z`��>�;�'�v��e� ��cY|��T]�9��Uk���y/}W��6�v���-�'�����p�s�a�Z����9�-�x��q��KK��M�u���p���������9>�7
����|�)��M��o�wr}~6�O���["��y��5��9����;H�GP���b~�>������o��+1D?�\"��!L����O�Z�A�Z ��	w������#�c�
u�G������Ho�<��u��)��#/7����q/��sB�]J�N,1n��_�'
������+�H�;��}��"wg\������"�b<qj��E�-�9��2�c��z�w���#����lK�����|7����Fo^�{|�l�����=���$��v����>+^@��"G����=����@���V5[l��Bo�N�}��%m�u�X#��������������1���l�{�?�l���O-�;����2��G�U�63�y�����������/?���b�g���:��4���O-�������O�b3~b��������}j�6�y:�`~��k��<�g���N��0>�C�hw�1���79~?S�;��^J,�w�>�W��A�{��(���=v-"��!�b��5������X1)� ����c7��b��/��s� K������r�C,O{"'$��:�����{m�`	> q��'�g0(��0Y`�=D	�o���	�P��h��!��������g��e��x[������y��
�.~ja+��zT�{�H�bp�}G���Cx��>�3�y��C�	z��Bel��$$���:��Q����)�X���-�c����ql�6[�������������
&�t���I�bg�-B�+�H8���X�:���$N9������%�H`a�~ho$qL���gL2I�H������������A>��Zc�u&$<$��������5���_���C��cr=Lx�_|�����b'<�vD��;��y|��N�79g����2#�aJ��V�p'����<\������4�u�k	��	1q��K,
����K=�1b1�'�4���%�@�No�����}Y����A�l<��~��Lo��
�M&j1�a���?��s��F��0�A�svvb����Q/�;���y����3��"_'��1F�����������?�!�c�+�P�-�cK��]�1�N���f��0�A�?�����������4��/�/s
c%��$DF����&>��H,,�[��'>iF;g|�|���1IA�0�Ao}�y��6M��u���9c3>�T[c�.{�#n����z|���y},��7o��N:���Q�&<�-������G�A{�Vb���|��]���q�9�����:��-�/�nr��sY;a��^_�7����F�	����I������?�	�c�"u�����J�x���'#�����9���ebs,�3�P�����jR;H
�����A���9�H=�?�vC��w���z��a���l�����e�}�����*G�XVb��}�`<,"G$�X!�g">+;��}��������F�������s9�_�7���d�l�������e���\���}����S'�6��������������}>�N2�-w���0FDn�;y3s+�o�kx�-�I��6Lx�[������3F��'m�~o���l�[��a=�9n|6t����YO�H�	z�A�Alq`�Os;�o�-�:��{���Q�a�G\�'mX��f��/<��3y;� >e�{b\����������xgl�=�c	}r|��|*vL�|�(���x�{����#�����w�H]�������=�b.�����|x��k�u�w�,�h��������3��4��a���z���#��>�_��}N��s���� ��[�qS$:N"(H�Q��x��4a���M�N�d$�$�!.`�C7��bP�x��~��[����|�z^bq�w��q�c�e�I3���I��7����#�b��6L�B�3���q��$.9>�0.;g+��E�xj��K�=m�L�-�YO��L�4����U�t�Xh\�w���[4����]��ua���%�m�q��&�?NL�������q�I���A\3��m�U/�Br�IO�U3�
[��qQ�[�]���3Nm����6&����"eng�������f�������7��������}���������F���Fm}
�����m�Jc��r���.��<D�����QD��	��v|~��9(�+�+�{��;k� 4'�A�Z��L ���r�����'�
�q��'-��x�`��D�< F�onM����I
VFN����u����,�����;�4�2��i���u|�vZ�4�/���?���[��I�������c����{\�w����6?�F�����m�7i����&}\��(�W�>��L�\�u����f\u�M
��6����l���+R�Vn��w�E���yH��;������m�^�/��74i��%���#���Qk���f�2���C!�w� ���@s��K����z �b��6���R��w���Ap\������ �k�Xh�>�(�����<G`
�hr��)<-��j��O�Z(��u>�P������Uk[�Qg��6�,��in���U�O-4������U����Q~�O-���������q����:[Q6��$���S��!�=�l���^�*g�O-�������S��7���|ja���Uv��Zs�k\���������\���D��W�S��2���l�:~+�����9��%���B�{����>�0���.�+�{rw|[�S�c`�ue~[�S��7�2�������q��]f�O-��������;�^�j���]���|ja�1��`��<^PxP�����^+���P/�e���e���
�e��+�P���������(<(�'
��EX������r����_`������5]�������e��e�#�w������_`�����PxPV�jM��� �e����.%>�K�A1��e~��B�AY>���%T��x������5
�����r|�t)WxPN|����,QxP�?��+�{rw�����6���,(<(�Xc�^�O�����bUk
'���)<(��Vt)��^
��1.��C�
��IW.����K�e��QxP�O�����K����r����_`������5]�������e��e�C�AY�����|��`�?��ZS8�e8H�A~���K��RxPF��pY�z�PxP�O��p	�.,^*<(�}`���r|���_�%]���_����K����J����(<(��(<(�
��������������X���	(<(�A
��C�]J|����2b���2��k����|���K�va�R�AY�k�����",�R������2/�X���,`MW��.���C�AYmD�AY�PxP�?����,�(<��e���N���/O��v[z�����/_^���������^{��9��V����=�\Z�vm��eK:���Z['�C��������x����w��N:���d������;��l?������K[[���7Wm��K_�����6~��W�c�9&�Z�����pfN9���r��V�������-���v���uy������z��Z[�����]vYU������U!��C������O?�t���k������:����[�n������>���&p@k��a*`�^����#<8��[=!�����'�\F��h������tUyHA^����C=������1��\��B�N�#g��yH���W����NK��m>���/Z�(v�a�u���>�n���t��G�=������p��������gm�_}5O��/*<(+V��pk�����'�pBk5x�l�����{N{�y�E�n���m����>�����{��7}����"{���z��DB���:W�m�~���~���VwT�H�X(��j�q��wW�m��$g��MUY�xqk]����Gi����$m~�A�XH����a��Dl!�i�@���|��#�hm����/.X����a,$w_�bEk�@N�b2~0/��]���+�������B������,��_��
���Y4�g�y�zH���_]���������������e5�9X���-� �E�6��q]��wD �����5,vb�������(�J��\���x�����ZS8?�P����B~���K[=Q/?�PF��Uk~���O-����l�
�.l����jX������Z(�aI��w?�PN|����,�Se�k���w!w�~j��6������Z(�Xc�^�O���p(<(+V��p
�p���2��kE������s��?�Z���,�te��]X�TxPV�����D�A9�K���+<('������(<(�X�����;�PxPVQxP�?���1/�'
������-I~�'2���Ho}�[�����@:����{������5�c�:B�
F�6�K����J����f�.\�5��Lv�[ue���va�R�A����)
&|��)<(�aI��w�����{9���e�k���w!w�
�j#
��������5��e�D��p����7����o�S�������_��_�w��]���������H`��E*<��/�R�*�c����pY�OSx0A�5n���K����K�5�v��(<�0�n���_�%]���_����K����J����(<(��(<(�
����������Q[x	�����t��w�W������/N�|�;�������u���(<��Tx0�1_���T
�05�w��&�	���`��k��+�T���
j��OQx0a�3�N�A9�K���+<('�����E��� o���O{��WY����|0�q���s����e������;���������,(<(�Xc�^�O������#�T�������@���Px0~�u����������r
&?����e~��B�AY>���%T��x������5
�����r|�t)WxPN|����,q�����5]�������e��e�C�AY�����|��`�?�,<�(����~�W����u�3�c\�x�5AM��.%>`Sx0����V.\���^+����,\B���
�jX����(<(�aI��w�����{9���e�k���w!w�
�j#
��������5��e�D��p�$<(��Z#��Px09�3�I�A~���K��RxPF��pY�z�PxP�O��p	�.,^*<(�}`���r|���_�%]���_����K����J����(<(��(<(�
��������������X���	(<(�A
��C�]J|����2b���2��k����|���K�va�R�AY�k�����",�R������2/�X���,`MW��.���C�AYmD�AY�PxP�?����,�(<��e���N@�ARxP�z��R�C��c.\���^+����,\B���
�jX����(<(�aI��w�����{9���e�k���w!w�
�j#
��������5��e�D��p�$<������>����i��ey[k$0F
�wE+<��	����d
&8�����2��k����|���K�va�R�AY�k�R8T@ IDAT����",�R������2/�X���,`MW��.���C�AYmD�AY�PxP�?����,�(<��9������w�#�[�.�z�����������]k�H@�����h�s�5�S����L���g���pY�z�PxP�O��p	�.,^*<(�}`���r|���_�%]���_����K����J����(<(��(<(�
����������1'�A�,X�~�'~"�������b]k�L@����,^�AMP<�K��L0xf���e���
�e��+�P���������(<(�'
��EX���]�A9�e�^�/�D�AY������]����������������,`��{Y>Qx0���k��Mg�}vZ�pa���>�N<���S������9������,�k��@@����P�������.%>�Rx0���Y��5AM�4��]�V]Y���]X�TxP#h'|���	��v
��EX���]�A9�e�^�/�D�AY������]����������������,`��{Y>Qx0�����O~2��
o�Dq|���NGqD:��s����H`��E*<��/�R�*�c����pY�OSx0A�5n���K����K�5�v��(<�0�n���_�%]���_����K����J����(<(��(<(�
����������1'�AYn�	L�;�s�1i�]w�����s��ei��J�N,f<��3i��mi�������J]����t�a�e*q:��������������o��+W�E���i��-i������{��[[��[��|�j����[k���k������%KZ]���~:m���j#�/nm]��h�tPk����?�xe��y8��h}[��g��t�������6��{���A"���s��U�VU;���`,$w_�|y[�P�$�!��e��K�;����9g~�8B������,�m��!��k@m�O1�]�n��{!!�������>h'm=�2��z�^����;q����u�=������Z�z����9!s�6��ey�+�;�X������ZS8w<(�A�xP�z�����z��A1�Se���
w<(�']yc
�]xk��jX�������EX������/��r|�%�xP�?��+�{rw���e�w<(��xP�?����,����p(<(+V��p
�p���2��kE������s��?�Z���,�te��]X�TxPV�����D�A9�K���+<('������(<(�X�����;�PxPVQxP�?���1/�'
��C�AY��5�PxP�����^+���P/�e���e���
�e��+�P���������(<(�'
��EX���]�A9�e�^�/�D�AY������]����������������,`��{Y>Qx0�����L�_�m������Z��?(����/����$ 	H@��$ 	H@��$ 	H@��$ 	H@�%������[�`������\}��/R
��]x�CZ�
aU��a������5��$ 	H@��$ 	H@��$ 	H@��$ ��N�����Jp��]A����a�N�I|P�~������&q���!�w��_��$ 	H@��$ 	H@��$ 	H@��$�=_����*���?��x��o-�@�;�>�P������A�B�I@��$ 	H@��$ 	H@��$ 	H@��R��K�C����"�A;,_��v	�W�YK���� ��Lc���$ 	H@��$ 	H@��$ 	H@��$ 	���V�������������O-�X��S
/�f0H�b����!	H@��$ 	H@��$ 	H@��$ 	H@�@g	\v�^�[fT��|Na�N�u��
+&	H@��$ 	H@��$ 	H@��$ 	H@�'p�7/���h����`����,T�Ux��!������&	H@��$ 	H@��$ 	H@��$ 	H@�����w|f����� �����ZH�?������K^���b��#�D�`��$ 	H@��$ 	H@��$ 	H@��$ 	H����k�����9�������A
�8vh^�+��� k(	H@��$ 	H@��$ 	H@��$ 	H@���������?�����G���B����K@��$ 	H@��$ 	H@��$ 	H@������h`uk
fB���)���$ 	H@��$ 	H@��$ 	H@��$ 	�O7]y�����������coO7�t��?�����~���������oN���[��?������,�g~���?���#��G����y ]}�
;��[����7~�?�����K�[���t��'�_�����.O��$ 	H@��$ 	H@��$ 	H@��$ 	H`g�\���H�x��w���k�����g���3H7�xKm��p���kW��Gz�vq����g���oy�v���t����t�o}�W�o|�?�����;'�}����{�N?�m�'J@��$ 	H@��$ 	H@��$ 	H@��$�����\2��@����{�m�f���?��\w�M���J�-J������\���/+���G�~���I��O���_L����[�����/��m��}������o��j�����vC���>�=������/��o���V�yH@��$ 	H@��$ 	H@��$ 	H@��$0:��������
f��v,�����{�����L����vY�K�������g����]w�5m��%�p���'������%<������:"����|�w�������~�c/2[��l�����$ 	H@��$ 	H@��$ 	H@��$ ��	�,XP]4�� v:���7V����#�_����]vYXK|��������=����d-��K^rp�����k�����0�������3$ 	H@��$ 	H@��$ 	H@��$ 	H@�����O��O��{V��A���c�9*��'?�~��>�������p�'>����u>���`6��{	H@��$ 	H@��$ 	H@��$ 	H@�@>Y���h�'�~�@w�e��e��f;z��-]�>�������o������?H�6mJ��������N�7�K�w�Ho���5kH[�nI�l�a�3����j�=�/��g�k�w<���^��$ 	H@��$ 	H@��$ 	H@��$0;�����o9�l��9�\�"����o����M'�p\���yWz�������~�7~�E�����>}�W~!-����G"���������T���~�	H@��$ 	H@��$ 	H@��$ 	H@��l��f����$ 	H@��$ 	H@��$ 	H@��$ 	H�
���VH@��$ 	H@��$ 	H@��$ 	H@��ZI@�A+�����$ 	H@��$ 	H@��$ 	H@��$ �2(<(�Z!	H@��$ 	H@��$ 	H@��$ 	H@h%��t�FK@��$ 	H@��$ 	H@��$ 	H@��� ���?h�$ 	H@��$ 	H@��$ 	H@��$ 	H����m-	H@��$ 	H@��$ 	H@��$ 	H@(����2����$ 	H@��$ 	H@��$ 	H@��$ �VPx�J�i�$ 	H@��$ 	H@��$ 	H@��$ 	H�
���VH@��$ 	H@��$ 	H@��$ 	H@��ZI@�A+�����$ 	H@��$ 	H@��$ 	H@��$ �2�Ix�t��2��
	H`�l���)���% ��X��/�f_0u?h��M��`�����$ ���fP�C4G�!�<a:���J#`_P�G�Gc%������_����_�$a��7���@[	|��;��'�V����k��.\��:l��1m��!���>��C�?�q�c�=��/_��.]Z�Q#X����l��%=��#i���#x��K�G9�x���+cV�\Y�Q#X����t!!���qL�t%O�GW�a>2�;b��cDpc��+������A�]���.�J>b~8��hPd������t%!����
:6/�L��]�MT�K�Ls �I�+���0Q������?\Xn9K��?\X�����?�����7���%�����,���a���������<�t!�DW�G�a~��m�*�+��B>�� WT�)�+����<�`)���<�M����9�X���DU�&`���h������,���f����.,d���;*��g���_�����.��]�������t����""O9]���a�x�UJ���|���\Q���.����J���?��N;_w��<}������_jmm7o��/^<u�w[�"���������@\Z�z�SO����'[�nM�Y�h����V.X�������s��{���~����x����O��gH��sUz���#�7�g��{�{[�?��41�N�mez��������2����-m�y��}���.K�s���O�������>����'���������c���m��z�0�����rRzp���	�.��R��b�i����/LO��zu��?J��:u.�X���t��nnt�U��,��`m�2]���������s�d���������+=��^t��W��7�c����1
4v��&����}�����GT�6�r����R���������t�W�Z�I�c����MG�9�M��0��o��s\��G��'x��&��uVF��k�~��S��~����d�[u����3/�[�q��i��
����?V|q:�C&���~�I���^�:]�a������{��i����-��#O�r[��]�7[����}4�o�k�=���n��;�h���l������k��g-:j���d�������������n�xq���t}}�{�~�}���^��������J�M��\��.<n���������:������~a�Y���	��(<����� <�����V�\�����2��O]1�i
F�6�Ew=�p�����Y��	�-�3�}��FE��z�t�]�5*�����?0���c��+��_~�{�\0Z�������~�����Q���5��"=��b�5��H�?�����������5�F�nK���N����}�N�����l��
{������;m3��	,��2}�o.oT���:;]���������W��v�p�l�����-X�.ZrJcG�:"��}��� -`���<2=��X�L���+�����t���L���n���=�O��O��;x�,L�>tok��*z���S��}�|�K��y~lp�~���c[�[�M^�������Z�-���t�#�����������q��l������^����2�[t���^���@zA9�����V��x����������^V�b��
���C�5��d����HO���1�b�b�_�O���?<�{��&�^yVZs���\2��=V,L�{�d)k��(<']��@F
��Tx����JSx�sl+<h��(<�k)<�Gb
�G�����,�D@�A��B�A�|��)<��'L�w��)<�Kj��)<��\�A~�����W�����j��"��rL�5wi��?���M?��s����6<�1}���S��������w�SO>.}�Kf��g>��t�)��#^r��k�v�]qm����>���K{�\�S_������oO�m������SNT]>g�^0��$������������3��>�_~e�6;�oO������[��0�y�eC=w�Q'�3^�O������������y�{��7]��g�-��@������tZz��
��;o�����~�]?�~���M����>���[��};�Im��`��:=m���=~�����|eN���,-��^����K�t]��{��2������.9������z����|����.*�,<`����H���.-\�$m��;�����������k�]Yv{�1i���s��oN���`�k��W}1�������N'���9�t���)�����G��������s�������T[M�3��������
�<N������N{������lz�O�<�����OmM�������l�S���s�Z���O?�5�z��t����#�`�����,<X�����c��y�����=����m��7��K���?�z���"������y��t��/|2���q�����5���-���O>�6]}k�e�Ui�����g�0'������+^�v���;���6�?t7*���"
vww�k�����������]��k���X�(&""��=3wAD�����p��83s�y���y^������p�&F�)]X�+���[��_���kk����b��D�����u@|XLj���<
�g��4�n>�<�h
>�ZfV0r�%��������
?w�������q&�LX��?���)�R�@�Q�FcXM=L:�iM3v����c����9u���8�0}*���/�<�:dn��f�&`�����&q�S��04���#g(_���
9�B����f���B��[��_���<�p���#t�5�,
{�L�������Ap�Kx�;KDF��l��I�r�s'��:��*s�Q��~�:�,������A�~�~,��V6�R�	�����Gb������m�a��Y�{+@
��{�bc���a����o[��|�������T�/�|��X��&@
d���v�<�Z�e4w���s���z5+��u[�`��q�e���Vb��}����
xp��������{���9�MM��;2*
�Wn�����a������I�e�_���{ ��n���X,����24�>V��������~��v�u�<P�LN����)�� ��X��&�	<�����n�1f���v��6�=��'��/������&LWB���( :H
(�&�����^?��R�1��A�����-;��<xp�m+�(�@�g�<�}�������A��LqDv�q�g�D�N;C$��@U�7��`[@��������SE{2RqV����Tq�<�V��^��i��hi��e�q�uvZ���k��_���-��>;x��������M�L�VA��T���7���<v��Be�����	1�������{�f�H^���m]���^8?���������:�J��������C�ey��"��N��b��G�UfRVA����_b���<��� ������wy����6e��� k%+rgx����
M����T�9��������E����$c�RV�>>;�;��<�}h^�Es������������z�����j� E�eW��u�����������Lw]�2f
<
��1���X���o�<���X�f�_�q������J$n�J�Q��3f-\Eu����A�T<��m�?����������u�"H�7�]E~?q��I��(���-����{�AxD$|�������~��u&u��������l�Z"��/��5�g`������7,���M�����������Z���3�����0b�n,���=#X����������h�o��� ��6,�f]�J��|���%��!)�&�P���"B�Z*P�2w~$p�������Bb��lO�.c���@C���Q�lu�s

���T]A��Q�������j�z�����vn@�"%��bu�=��S�ocp�Fs�����z�6,��YcL?����)����
��z����8��~�|�|�p[K\e����u�VIG�����`l�N����7W�~���4��z�i�:J�[�r���uX���0��G�r�y���f���?� IDAT��AY'���K�u�O�:o&�v�C==�o�W�.���{��������e�����X��BBZ�����u�m����}�����#:�UP(��;��5ail�����M���O�!�P��������b'x�_� ��r!��74t�W�jH�]u�����h'?�:��6F��h�7E����z
��e��`8����0�\��N�<���Go��A�Z�����NA��z�
(�Yv	:%sA�vA��*�+�@��5���C��h�@����noI��T<�)�F�T'B_@�m������	F	���
���Veq��r���p,��>o1��1�o\O�y��en�����A<����s#�\��h�����Q�v	<��F;/.����W\��x�V|>�������8�y>(_����|G�2����8�%e�������0�Vq��2�2L�:���}���P�1W!3�C��=�@Bx����E�!�q���"v�E��K*
3���|��.��z�
 �a ����x�4�5����[�`>�>��vAs��uG�O0LFU���4L�d~U+<|�Om�|�C����N������:?��
�=s��[�.@��^��C[��I�I�{�8�x���!�u����8�Op��
DG��|��(P�
N�_��0*=�:j���'�����c�eS�J��I������R��-
+����������9���	}S��zH[c�T<p;��Vj�yc��9�x`z������x�GM�hi�fBU���<�<��\���*w	�Yi��N���h9]��_(�Zx���
�a���K�#�*��P��!b�!A�,rkr��J�����qjW8w7��{���#a������I��ov)�]����'��G�
�����J����~'Cx_����^{����m
e�.���.�#�|�|�{+b��io �|�����tt5�w$�����V��y�!�Q5e{�^�A��8hji�0���v*J�O��z�~���E;�Y����TQ��LloT��H����xt;�u���*���]��#��a�K���xX��B�o<
��R��'�!>d[mj!�M�����.�D�������dx�)�a�8&&����U�����Zu\����q�uC%����_�������$/������[y���v{��G���Q��t��y�C���Y����]]���to0�AO���t���������+��������P�`#�+�Q1a�����������+�����������I���]���}q��J*������������qe=�xk�����8{s-�5]��G��("��f���O���>m3\��K*�_���p��a���kO�6/�����7��O�R�rF��
�3�7��+@9�Y���E�op��D��&�<��U�&�����ie����&pZ6Q+�%�j+�Q����}������T����������������M�U�S�������7��� ��9�x}��l��S�"�Z�'U�jV@�J�F�m��Wo`�<��,�����X���u.%b�>F�����"O>����.����A�	w�)|��5�	��Y�)��S��<���g	x�|yN��OB8q�r�h��#��:E��]� �X���t+��VA;B��I���D�Y��)>(������y��F*m�~�*��r���Z\��gi�(]�R�/��I���KM����WD>����[�7q0k�M<&x�|2�s��U��RM@${�5�.�_�;�{����'v�84�L��������z����9��0���*!��QD��:"o��� ��B� ��q���A���g�Q,U���Ag�.%��y���G�wl��x>���a\��T<��u���0r�'��9��m0m��K#����=�����Pj��GB\,�_����\�OX���M�O��7z��ORUH�
�c����z�����6�/6.�f �Z�m��b'���5�m���5�h+6�������f���u��+�=�f���s:�)-��L]~����Xj�_e]L<��5����x\~�KG=�u`�g�*"5*��\���p �hC<�G''8��X���(�VhO���8l�������E��`)��a��XF�aL=x���s)���	���bQ�Y���>�m���uq�n,�=����wyj�\�������l��~~m�-���=x���g���M;R����������O8l-�vz�Z�W�����;����"����`hb���8�s>�
�A��#9jp?�Q��	;:�u/W;V��"����%����B:
�z�=�j5�z�����qn7�6��N��:[h��T<0�
����^3Y�+��������G��t�&�X��h*���'|�x�}�����X�/�n��nTo������#Q�B�������}���������v�g��t���'m������x`_D��p�R��A�F��\��"q�`������s?�]�25ocC����x��>��{N
A�jz������a;��{!��Y�i��u
qoBaP�4-
����+��B��=��?E|��U
I� !�v{��J���~I�P!��[�h��-���������jN�3��<<���n�xE3=
��!�Su��Z�����!�+�v�c=�
��o[=�aL]�~���O^�~��#+WCD������
\��Y��Wr���	<o�A�|.(S�5��)�
-�n�R�������hXw<�?8��������������V1�3������	�[����5�~��.��(��/��M��ko��!���1-z���q<�	��n��h�R���<�s`��MX��8���3z�l��#|�`��U���HtY��T<010�������S{d{D��T)0����,�����.��������(�'?����By�!2:
c7�E�vz=��'���s������)��5�{�a�]������VLn�-�L��M>f����~�����)�T��:��4��.�r}�[g������q��6u�OP8
Ya�y�t������7�8�*���k|a���	��u�6��\�hy�{y��C/9��k4�s�sN�����66�w5������&�bkj���Kc���������������c���/��aV����/��c�5���[���u@ U~�\r�������Q���|�W�I�N�0�����`k�:������}����v}=3-�q�b��N�#����(\�����kF������7��n2��Zz���D�6��`#���wqyP:���������Xg���0�[�cD#�.@eL�{��&��C�����b��|?���u�`���
G���p���s���=�$
��_�B�8r"����{G����W,]�O�������>�tv�t���������1�����)S��h�������h�F���
{�D��
�f�n��3���������R�����1t@w	)��a��#��[�a�������3c�
��������Ir� eJ
<H~���8������I���������8~
N���5Z���������E_���s��B>�T��/����s�"�����K����{�����O��Z�����?����/�e�i��f����MQ�de������B����~�p:&���x����������}��x�ue}�=�5�k������Un�D9;��[b��c��������|_�1���v�+�e�[��~������f-p����|�<f������)������&��h���3�
4h���/���}'Aj��<���+��	h��u\d������0{:J��G�����?���������x���%<�}I�'�]�H���|1���~h��n�����J;������c�H>����Da��r[FvB�E�a���n5���m�h]�_��q����L<�0������tz5�����u�1��`>�!���~-{sD�>�1���pa�Nc�?#p�Q�p`��!��C�aD��aU��6��e��:_b"`����:HW ����{��Y��u�K���C��o����0���
?��\�X����t�M��?d<0R�����~C�1b�)D�Ji���T����O�2��1^����n����r�����;^��>�nP%%xEi���'�a�Yx|�
���CF�q��tV�S�`8�t�GG�7w�?F�R���&j�T��:�nu�M��\;�7j��t�(��:"���$A���M�o��A�NC�ya:Sb����Q�r�Oc�G�#|�-	h�1����prA���N�0��a��$��]:� t��R���~������G����oD�<��Fz�yR�N���0'�W1/4s�Q��EC\��D��P���qo����BX�?L�m$ �7��������
��_�*
�����T��G�!��$(pb�l8Vi�2`b�Gt���D%���qq��E��0!�B�uy?f�#�E��h?��'#�X9���3��k8������."4�O�����d�&�.���2,���;m�	J�Dj�<�������x��p���p�����������-a�b����@�����B�Z�3�B/����x�8/UI�;��Di�\���C���..8(QQ��wSQ�E.-�^�V����^���I� �!�3~�_"���m	g8.�k`��P�&������^�a	(K'��������Ql���:��U#�[����]�F�\��H
� �BB@�u�sl����	����S����/�#��'�6���I�}��xP����Z��sH����Q���K=�Y&�/��z3� �"�����ic�M�@����8�G�C|�Ipd��04�fH("���r�z�Q�;3)%x`DH���k����V��_��X%�S�vXC'�h:~
�U�/�U��c���x~S��_��M�?�W�K��S�te�AC�����z���05����Xl$\��C4��t����_�,L�P�P#�z�������ZV�	�^[al`�2^���ynD�����,B
�x��aBx��8pq6�i��5q���i���'D�V�����:����,G�5��F@�3	0���E~�|%���K�|�S�/v��Yi�$? 5��;���E�;�r����r�2#�A���Y�I'Bh4�M���a�f��DNW�t�����U�]�����SQ���.@����Y�a����%�u��Ue9-j!��.�cV��
cC:�#`����������������?{�$��	���t����,G�g�B��L�t��7 ��G�r���a�u����}�����#Z8�Y�������\bn?��B����(�	$�C���q�+��������,7|�!�lA���l����RD>�gs#y~	�\J�����^mB;��-�������hkD_�
�bTMR�b����<x�w%�
��c��Gp�-� `�B�8
!n��A| �3k��t����IO�36�O�o���	�DZ�gz���R�@y��F�s���3=�1�}p�D\h ,�}���txqa��
���?��_�j���n&"�.#6�z�zn?�:�@�����E���@��0o��t����<����/����;#��fX���$�Y�
���9!��g%���x rv��^����b�����`��p��
���A���p��n��}?L��Y��_�,�P\p����fa��i����1{b�Y��u��rn�fi����t��>//���
a���+&7����&������~x��TCZr.Cj(��|�N&$����V��w��_h�P
��W>s��B�r:�$��m�/���Rq�sJv����)�_<����m��
^�h��D8���8�_���.���l��C-�,��]�����(S�<�va����kZG��<��j<Ct�N��On��w��y�0�[�E������>�{�z{�%�k�{7\%��xr+t�~o�E[�
;�b^T+C��8�������:TM�����J[�%��}x���(X;w����&�$�[e+7��A�:]���b�^p���Iu��K����m��������=z���9�����%�~�/��:���7�f���I:�.���o'n��=h�( ��������M��
��1|G������q��r�@��x�O��S7�_�Re����^���n%��2�CM< d6�6�����F;��m�W,�b6\q�m�3L�!B�pCB{g�;c��4����~���)�3�blD���a��Z�{Unv���7)-����l������(�p���^�A����;��M	��_0��/<�������X;�6��;M�J9��xp�}��.��	|6���
�����^(^��q�����������BB�xl��������C�$� �!\�w��=����|iw�')���A�=�~���z`��qi����B��uaM�5���������s�v�H$W<�3v>:��Hp�F������Kn%�)�����b�����3���v���6���1��~�4)W
������K�~�tZ�+~�<��v�;�3�G�%1�� ��|E	�	_��s��y�L��c9�2���~h_�>�����S�����D^��p�������T:?6�|J� LCz`q��y�:*�Y"��>��z��*$Lh��Y�����v���@�|Q����W�k�S)�����;����/����r�l]�"����&�*p�,@��U���*B(���S������A*��Ax/2	<�u����m���	Lj��o]A�'��*�w0GC"=<�a���@������/P��)�-��s<�&������4&
�?��K��M�����`���m���>�"r��VTi;	��w��sk<�q���J��8�n����xP���40m�q�r*�{�����3V�����`M����b�5��#�����>Fl��D��feK��P����@E��������[�60]�[���tlm�9K�P��17�s���;�+�I������z�����a�~���^�*9!�/������;�wP�>[�e��J(a�TCI��=��F��hZ�&�?���U�Q��N~�����MRPH�T>��3��0�����.uR��*z #�����Z	\?�Ol����0��t�c���X<�SR�
����%��p��,9xp��z���7c����/B.$�g'�M�R*��kO���&w�}�rlKG\�p�/KS���>��z��*R�aIu��U�����5�%m���F}������#hH3��/�����1x�rD'�lg���	�7���)z*%x`id�a���f���C��>�}bO���_������Xp`'&u�Ag�I�>J(����
7j�:^��=���R�`���������HjN���6(����"�S��X�o0�,���b|��x@(A����q�������h�����3���Xu�*	m�������j�����-���1'�LS����U�O�p!D���t���T&x�	�4���1��B��,R��O
���f�� h2���V�V^���~tFOc\��*B-X�m*�'1�4U,������e(�|C�X������c0��E��l��h����t\�]�z�]z�~tx$�X`p��\���b�b���50n�A�QW�>���r���U�j����[Ga_�&��m�>!6&'w(����������3G����ah�cb�[������Pz�)��Q�2�C-�(�x����!�w:'�y�����x�T�p�GQ�@<����{����_BK�xJ�<����Ij	� �!���m+?�<����K�L.:R���1�u�M�����1���[HE�9�� IDAT�Vx0h[L��V<J���N�h��H����t�,?�+�����kE�tj
��\�E$x�rU�r����u(�P[\=���Y��.>%��%C!T��;�����\��j	��\�>7��������D�4.�q��1�+�
:�q�wSQ���@=��W�$�����@���3��_����R����'��;�!��1J�>����c�vR�L��bcph}Z|c�QxCPA�
u��~p+��\�/�p��������Z��w����e~(��Z'�b���-wF�1 T���h���/�I�^=��N���<H��~,vT�BE�^�<G6�I��p� A('�!�N����0��U�h���:����Q��'�/�&��B�x�+��3P��~�������h��_gX���
e���"T$DE�����PrHl�;�D���mJ���n�U��\O_�$�Zp��xpU(2�����B-T��uju���p��@YJ
<(��$z�����'X��?���A��}���t�`�NJ�c@x`H%�zN�n�W����\�b�����4>�����w*O�����x`@��;�P��?���.���e{B����p�w�*��D�4�2��U�

W��EmB���&���{�����h�j��,�o�"_��x�R�������
M+��0�H��-�yt������;:\���}j����1��i
}����~��PnSf<�������;�u+�g� !�
���|.���p�k��*� �J���� �����������t��C��������3�%���@�^�
�y�2���B���>��<��0!<���|��M*!�=���C���2���j
B�@�"�Q�@�j�[��C�����d�X���oT��?2_�&QN:���x��=�}�$�c��}t�(3��`��1�	�R�A�d!:�
k"I���~����������J�+����:~�����~�y����-�t�:Q(�e&)��?��:�K4��V(v{	����O<����B�X�������TE*��A<�Mj�B �����6���'�J`C��-�����g��{R������
����A��
�~t���K�L��1�WO�������.��"�~rG�TL���!�v�O�"��)���~��4���Cu(��zr��h9�������`R��TEH�h�D=��^n�HRj�B���5��\�9r�T<8st=|�����k1o��5]B����uKF�&$�Z��b��	�1wj�t7--�@p�q,�<�C%���<��iT,�������R�z�'o����B�'��h;�$w����pA����?[Q����q|��J�����GQ�G	-�d�(*E���S
��<�.���&�G�cj�b��h����PUI���P���r07���������|��.,���
�5�P��JZ
U/�
��D��T�A�n�q��(R�C�Vd����B�JV���c���X=�W��^�6hB����sRE�p�jh�}"�^xK��sG��"�:B��t����
��we[	:�#x���V���N�"��[X;�?z��K����;�dj[*�5��@���n��k��%xp�u3��Y�^<H<��m�����jJ�H�whP�6�������M[����5O�
�-����$L��w���?�xP��>�p�v$n\�@�V�{y�N��.����:�����)�[�C��KI�f�����_$���f������Z���O���DO��>5����c���4x
�X�T����a�+�X'FKG��CR����NvhU��<�c�E�]=g���������@\��V�bU��/_�L
��~e
��8"���g��Mp�_	�V�%x��eK���+kacS�_x$�����GE�fH���$e������������]����p��}1�up���=��UHZT����P*h7[q�Ol:wP:�7��H��^[�����������{�@WU�:��o�J�Q�PX(�����eT5�i�,���{�Lj��V}p��n*����&$���N0�('�)%x����s�b��wk�����Gor�7��-������z���T�g�"��XC��Xx�����Z�����AkG��{Eu)��
�3�X8������Pd��M���������s�\	l�v�w�dH�`�(��U���+1��7Xx�@x���Ln��=� 1�B��x*"�n�������������o�����_�+�%��!WYx,��u)}BK���1.�s��O/PaH.<?�WW>�D�<�����{!��Pl�|���}x	/�/�T��\�x	�"�q�};B��v�?pl�`�S�c�A���p��K�)���#���k7s����������o��� ���9���x`���M=��%����i�m��,_
�)�"*8�*�2w�E�Bz�U�+���lR���>���&������&7*;;Jh����kU��S�.���A�:��������y�^�1e�`x?z��w��jB���!�S�x�z�NT�\�
;(���Hgd<0����gBHCo'�<~Z-��F��K���\�/!��������r'��i�x��/������%c�h��1���1�Y*�9� p��cg��c�`���e���Zm�F��v�~2��XN���LM���<7:~�;V��'
����IV��s�~���R��Lj�E�}
�A�*����)�n@���t)���j�N�k*tt���[���Z=�:�;C3#%x����^�Q�@A��E���]J�K
<�_�)V?���v�3��N��*��o�:��N���(%�����`���h��t���z������k
�����;w��sg�t��0~�:�j ��"E}i�������bC��o�.��%��l����#�n=�0���*��(����x  ����"t`�k}����EH�`>�j��@�����t�EE��;�xyO��G9J���qV�x����K#l�P<��A�"�.�����������BY���R������<0U
�TZ�cy<U��R����KU�r6���$����x������//_��a��kI�A���'�����*;c�;��f^:RJ� ,���z��L������V�Ip�5U�"%*��PJ��z��R;P��Z~��������|w�2�@�D����3����A�J���Sa@*�%�w&?T�aD�P���W�� BBtw<�F�6/*E�����f�8�l0hSQ'�����*�3dCu;Jp��zxC���8��%��<mJ	������D���P!(P�
wiy��#�G������B��|#�l��QG��N�aDJ�xP�rk������ZC�����:8������h<�}���x�.��#�����$J�����z����*�-�x�K�}��6���Q���^��*�$B.d&�<�����8(�-���~��<s��nE��v �/0@\)��(`����������a#�x $�_2D�a ��#�Pi\�nA���D�V �b����	'�c�H	��F��j4�n��Th��qR���"p��G�p�����g��SO�#Hn���g�lCC#h!w~-�. �|lKCF����������h����X`�{-Z�"��Pv�����I�B�A�	�"1��8������E�[�����p�/��,x��0�(C��v�1Ux`E�E�����~S'm��y�eK��]����kk�}����{.�+'�S����B��u�����^�%�<*$�����6�8����AE�x���z��2tB��?�0"}�x��P@g*l����������������-C6�cn><�z��6��(�P�6�z���n���A"xp�!\����	�-�a�R�W�E�}��P<����=j9�V��A�q��m8ZD�<E1��N�}��@�� �p@����%�����<�����&��;	K)����1=	"��SD����|9Q��*����z$CU�2�m6th�X~���O�#M�,$9����8��r[*'��e	�*
���x�&Q$�C4J�B9A�6�l���� ����p��@	����A"x��8���2d�h']�={%C0����siH��$����s
8����+�/U�^M#���a�w���1#������`P�Un#�2�&t�'�!n{�I���w��&�{�q�� ���["���h��zT
�(�^Q� 7b�v "���T����,k�of�T��G�R��3="HDC/�e���-ZTf��05���2����9��� *�5�"����0�3�$���(����x�b
lF�G���0��~��rv��
J/�d|<�����E��<F������FK���#O���^���%��H)�ht�D�����)��A����b�����������}:�+�gx��Q�t1�5Z�"%*<
L���-�&jN�R�e)������s"�<oLU����0��>R!H�a0�n��F�^S*8�V�cX��� ��J{D�,>�D;*9x0��.~>�h�=�=:GPB���p���-��p���D�@����D��g��vgh�eT�z����� ���y�B9a������R����J������Y.��+�M:{�^���|#�I\/K���U3{&���h	����	M�[�������xp����:��?���_���`A�o~��T���.���[�t�a�VI��%S�W<H�4���W��zv�����f6���,#��C1a�F�<0���]~]	��k�[��������#�`��4B���������.W(h�Ry��=�� �_.d��T<0�[�����[�+�x`��t��������E(-k��C�f<�cn�r-q���V�W^���U����
	|_������;W�$�@�\�a�xp��V�+��O��aD�P��Ne;x0���s�Z��[��8�u�
�]0b�h�T�������Y��R
a���$`@����,��:Vi#>����+�Z�1�������k����0�M?a��D��!�p^�B�A���
Pe�w�V\hL��/�04�r�������������	���f�0tw����x�p
�	!��|�i��
0��!D-3�NA������NsM��Mw�&�?3�������!�P��}?<z�G��@�%
X�*SQ�
�;�y`���"~��dy�#���x@����M�����O�TjA(�rC����(�����R��
g&��C}��C���*x ��t�:*��j���00��O%;R�b����~qi�R��hkt���_�C��E���������2��������o�6�x�������U<�C�z&��E�Sks�YJ;��!*m�Q+d����2
xx����&,��'����s8|�
�+��?���Da���?�~<pq*���P��}��A}���:L�������F��R<�x�I<�i��s�N�PUd<q��
�#%��"��a�^!<�@Y���v�����GS�MfA�����?wC��R�,��i�q�HA��O�KU���7��X
���F���HB��]���,������8�j�����3��������gj�{�O�s��N��1��������`��k��t:��v�������w���
���
�h'$��0u�VTt(�����k5����\v�
�"<����>
�N���6<5�����������rL	�*^=k0~=V���������V���G>�q��wRY���5nE����'�i�Ji�9J���/�b��1��{3�V����P\{����n'��^���7g����M[&��TGC�����e�&��?o���h�N���m+Ueh��R�`J�n�65�N�xL��	M���*�K9b��1m����c:���4�����b���s����v�oW�/a\�!<i�	�YI��Z����u�W%�X}��qMS��;�M�P��;���"
��x@��z��7w�s���+0������5�2���q��i���!t��T+0���,n�D�..PG2a�2��=����Oy����u��5ha������K�].<�H�x�]�;����at�Z���a�n�dPEJ��bl�\�IG9�)%x�[����[���k���8�A�=��E2���C���)-��z!tqq���\���o��3����Z�����Xq���6����0�Q]�}�2�o[���)SJ� ..�N��tDFR6�������#�����+���MW��@x���-��"�8������k��,{I�|P�v�(0���	r�3[�w�$���.60h������mw�24	<�0���P����~K�� �X�o�����^M�_cL<(��q��M!����)�5	�b�)����N����a����z�����e����yG��~!%x���� ���Mg��G�}���d����(������DYm:_RIw��OB�1�E(���B��0��K"w���9�~k**Y�
�)���-���N��}!���������`�����`�Spj�B��S�����p���t��7��f��d�mm]��5&9�6�����2[l�#t_�xr��/�pl%w���q|��p��
���K���������7�HpjW�H'p����5d(���D��;Tw��pU.�{p_5� �H��o�[o)%\��E�#����q.����3{"��{+~_��p���d�C��e����+~t[(�b��0)�H���TC�{GH�>��\��b�xp�#�!+>���u���_U
��X�Pt(J@�$���jM�a@�d���m���0�BHD�o�B�(�*
�_����hYV9������8'�� ���H�y����>��7�q���P_xD�B����U�NL���,x��A,�.Gs�R�� �PO��������5������i��������a�CC.��a����O�`<��}��=�P�XE��5?�����^.P��,�m�<>�+
LJ�.����n����)��������m.w���"X0<}����w*C���"vUQ��bw����0x����e������=�yr��k������<(U����D��c�����X�R�$���B9�i�Q2��xo����T�+�vC�-8��C���U��"�6T�_H	�f�"����-B/xx�G���q���ic���-V���[�e^P��x������+K�X�r�Q�2��#�+�kj�UlJ�c1������q\c��?k��{�������|�W�r�"e<���0Q�����SM�������2�iR�@�D����}�x ����T�2lS�tr�\�#��7�H������<��j�B�@(������hp��	�M�#|����j9+��E(���b��_�IuhT)t�v�Vy^*���JR� ��;�K��1�~���=n`�y�9��
A9���{���p
	�QR5A���C�����}]�B��l!
=*/��E	�^���m�����C[�Q�*�*�����G���Cn��}�M�-*"���d�
��Oo�24��,)S<�}	�/ hX��� ox�wnvA<l���A����uQ:�E�A����:�qk�U�r���!�0�t�s��P���G�1��B��*T��@�UWX��7[)w��&��mKX!���Y��2�+C���8?�^�E�o%!�������>�j�fM{K5���k����.�h?�s;o�� �?�"�0��A�0�s!�l�b������j3�������~�d���k���0Z���Z�x l�^���3Uq�_�p���T��N��FCe�-+'�I�a�9�j;�]�����K:�m��N��<�����c�o����p�W<���� IDAT{w=?������(�P�0�D�Q�=HN��w��w�
�{m���c��w��?����D�ict&\`@0o%�B:x_Q
I�px��	�o���shH������`XM]�<���:T1��;�C}����<�De�c�b	IR�L�>m��.:TY�F��:8KP���*j��0��^>�\�	�|,Y���V}~�1�z������"_��?+����}�8��?�j�8B����@�:0b��KF�Xk~�
��en����
�g��#h�h���u������
B=G.���{�i�q���g��u?�A�Q�)��j�^T`p�m��
cHo���xtG��'�=�e��v\�2`���J�:�c�����Y���K��\y����kkCQ��mo^g�!@���B��=��DSy����k&��N�^$�v���>����xP��\�(B��?�w.��D�������B�5s*B�J8!e���4��m���,�v���A��PB� ��6��3���X��)��v�Z��OK� t�
�<���?�=�"���j���b�#t�u�\6��MOa��@�A"	�@(��A�\~T/��%'�3J|.�
D\xm**hSM��cY�����mi)��3A��5�IX����I�A���������ZO�����!n|H�x�C�`j�
0��J8o$��_��Q
���5
�mh4j���
�`P��E0!yJK����;<o��vby���x�D�f=�6_~'
:T���2�H<x���Tg���G��cq���4���,�|�.8sn���W~^Ie%o�2�G�����4��_*�n��
A(cO���
.��r����#�a&�1\Cj�b]O(�t�E����S�o��+�������80�C�E�ex���XN�v�a������ �/Dr�`0U��l[������BnP�a�<	<���U��>���t�����y����C+���.b9'g������u.(7�������~��>xp��4dh�!��A��$�J���<��^���=�����
m�����]���kT��F�P��m�v���e��YY\z��C^�����%^BVF&��b�Z�w����7>N�����|t�������B�\C���4��7���BMA�D��������exb3�'�yb�4��K���qm����7$T��Jh4����2C��l
S{]��pa�/t�@�<0/����q��n��oQn�5\x�Tuj�D�Ru����K{g"�a<���"�F�~y���f��A��?�����07]W!��n����1�q��fuaE�8���)�� ��F4�)���^��w�Z��<��ah�'o�
�P<��uCrA|���%8��M3Cr��"������Od���T����v�:2|���ok��:5��g�A0�p������=���2�"�A_(GL`�����L�H��Y�3'���:wFJe�r�U��=�@�Z�A!�|2LC�F�q������@%��!2�x�e��cH��[����)�<+���>B�Jz #���3��5x����<��8%x��:S2SNb���Y��S�M<��v|,�Bv��%��<�h��2ZNz�O-�Bz���8e������Q|
��]mLx�]u�r��Z�l�1\��ZA"�� 3�%����_J��B-d�m��-C����e����a���95� 3ee<�L�_j�D����/�`�&�,�0�	�e"%��VvU�7M�Te�A�
�B3%�$d�yq����E��kf���P���,�BF�R�����z����|�m�L���Z�L~�G�j
b��
s����p��-3�|��Y-�c��Z���x���UQFZ��*�N-�BV�M<�J���Wx�]���rS�����Y�#��AV��\�S���������Kx�]�*+79x��Xe���e=��@y��#�=��z@
�fL�����������j�+e���e=�����A��S
��35x���Q�����u�H	�f��T������<��,J=�<Pmf�4U8�#�����~�:��
Cf�<�L�}yTP
!��b�e�Q��JAF�<�Ho}�c��A���R��2��PN��f
^�=�������{��U���SQ�<�Z������_v�V������>]_��2j��6S]����P��5x��G5x��5x���JY)j�@Y��{5x���T���L
�=�k�A��$u����Z� =��u�V<������������0�j��K���_��QH�Uj�@���T���D5x��~U�Y�������g?,W
|��5���O������P��@5x��G5x��5x���JY)j�@Y��{5x���T���L
�=��A��-u�{@
��Y�r����3R��v$�����������S��85x��>W���SQ�<�Z������_v�V������>]_�������oum_y����5_�Y������@�_~���g��=�g�	���u��I��$��uh0V�=��������������������"���6�S�3�)22:::��RH��"$"km�dS���c����&Nx>�R���_Km�43�%������B>s&
m�=|CC�L�$�J[�Ef*of2U��$���S���-N�d��J�$$$@<?2;J+P���
"����jtt��IWWW�5~���2z�W}��68��r�x|)�aV5#����{W�e�J�������2R��|<��,`��:��@U��m�4qG'F�}p���9��
�>�	����,D*|*{D�m7��D���,6+�?U�+��}��a���mx����S���a�����M��)3d�����U���M,B�����)�C��V_�x$o���`�D}����������4^.U����z!B#}���c<���Ql�j�?q<������X������
@3.c!m2[yV��@����S��^���r}��!(�&wq���'���x|���A����@��>T���i���#�=��oM����\[���������C����6+�����00���S�����y5�#��\i���G
4������>����066���&���2�s�|���A�rE��s�����D5x�����|9e<>��X�#�U�f��������lmm�V��;'\9e<�������p����z<>UO����`�3�)�GN��b��y����G>�Qj{�S�r��P�G��*���)�?�}��3%c������>���g��j�0�{8c�����	��9�xdl�f��9�}�9�5x���T]v��5x���4�<����.%o��|��'r����Cm��rfg���2�����U��S�C����Y���r�x�{Dm�g}>���}����zY���z����b���uU������9���	���Usm����29�c�U�����S�����H<8uxg�GH]��r`x���S	����BBB��JzC-hjj">>m9���BvHH�}-r��������oeu���2iB�\[[[�)��g�x|�{AN!�
�/z���q��HO/}�c��!`�(��9���9�������9�����P���z9�e�d�e/!'\9e<��H��ov�H���������Hz{����O����%��?U�'��}�=Nm�������b������������k<>�� '��b��k<2>3��#'�GN�G�H~��P+d�ZR�����Z���xN!EO����?�[�9	@U�BN�>r�x�	YU�����S�#���Q�G���*K�	�����r}����)���^W��&�e������*KP��*{3ke�����>��<Pu��`���CU�����������S�#'�#bl�������r�="z�s^j� �sP��?�j���zNy�2?�\J���� VeO���#'���PU���zY9e<��Y��,!���zaY��"�e����)���^��|Ve	j�P���������>TU	9�Q�����)''�#�'r����Cm���TU)9e<r�="�T=���Y/'��#�'>����>�%��z@
|���)b�B���K�[�9�����r}���P����Y/+��GNY8S�G���*K�	���eU�����S�����������*{3�e��#�}������zR5����P�����*%'���>T�lPM99e<r�="FT=����(%��W������<P�lT�������!LubP����?����n
;�ZmNyi����8~.,�Cm���/6g:�V�����G�_�@r��/Cy2zp\����h��7���W�A�*�\����7Sy�3�64�(r`vV�I�~��3���|�:?ee1F�p���OYe�u�����2����tw�(� 6�X�(v�(vww�����]�(`�b����]~g��%]v���1^^���33�<1q~�>�����
�G����r����?_NM	� ��zR�����q~�U:�2�}���A���d�����C�������
]n�����f��W��,���FU����:\q!D�����*��{IA�U<��]��r�
�7��B��:�=7���{�%����6FUw��c����.�o)/] 
�^T�����>���[���*16��i�U�?��\���G������>gU����v^Q��������~���r�*�V���"0�����������eO��]���S�5=PN��[#,.�/����00�����O,8Id:^'UK���B_Z�Z�*YH
x��tkM�5=P�=PT��Vb
x���s�Zj�����<(�^�������X����9���������/K+�<�k���Xz
x������^T�ok��?�U
xP�����<�{z�<�{��*���U����5=���@
xP��[T��5��QM��(������j�������R���5�A��b
x��?�������^����@
xP}�G
xP}}YZI5��_�����k��W�<�������}[���j����?���5�����5�����U��<�Jo�������j��������>�%����K���-4��������c�����Wn�������[��kw��ic��hU��9RR����,DDD�������V�rEw>�;�@���d�������u�P�������:�Br�W���U�N5�����|��V�c
3�+j���������?@TL����������~�
����������;�<������k������t����h�SW������o�n��������Z4�3����j�l<C\����.
l���P�I��y�eEdd~�YS�*���K6�
���R�J����:����6���V������s����2���jm��4Qa�������#Uj�������I�����q��;����/��t�������4��������
T���iQ!��	��Ot��nV{=8�����_��{l���i�e�Xq���
���������qd�"�m)X3V6i�+aa��rdKe)3_u�n� -,���4��$��v�*����.t��]i�*WZ��������� k�IW.BqL���s�����s����gO!� �(���� ���O�UU�n���I/d�'�����1��P�#?@FD�b��~m}�*uGu�*V�����v����B�����d��P�YX�q�M:`�k,m��2�W9Ou������1����bao�*����+�����8qa��9�Y�zV�}�
��:��},������j���4��jACN���#(6��r���dUN��y�;���T
��
��:��\�v���T�!=N
Ik��t\e3�����nH���-�8���M��j��@���_��qU�\]�4�E���q���N���IO$�%�C�68��2|��g�O�����[�a��=�`St��rs���fthU�[�������{�V�p��IL�[��'�S��&��l��ON��wKG���#S����I��_>f��6�_������������#�	|Z��]-i����\���"���>���?��*��'����_r�����44�L������h�?\���Ra�S�����Z����������������m,���'�;c�������1{�H

�[�������Zs���}w�()���������=G��q�������x���{�&GMT��.��~�&\>�����J���,m:�Ap�sD~~W�c�P<(,WI�n
x��z���QQQPSS#p����6�<(���K���v�X�~3ZZ�#��O�~d(���N��x��;�Z�HH��O�u��h��>��G��m&"��T5t�������N��]�����U~%u��:�����hWO�4R����4��������1�E�@DHkM���py���x���&Lj8^1O�s�AvH�B� �����������a����/�#?-R�:T���n��������Jk��6�����]����
�w\���K�;j�?<������F��_�G��72�
D�������n��}��e���9x�����0���<�7�`��x��
u�=���d�k"ySv����aAH����U��;8�?
���{�|��x��N�`S�UXxe%�����<�&��������*���s�t�
�	)qU6�7�cC]S\p9�K�\<(l�����T^U���o��Ss� �\�y����=���a��9)�R������ �o)�?����J�r����T�&����"���J���L
xPqW�x����3�oc��8x�"�hkBUYM����1��{��P#�[Z����6�:Yi��("+;�+��(a����7u4�<}������NV���������$���kj���S30jX�����
a��(M� 3+;��\���DM���DT<�;lDD%�����3���
}�!#� ��������n��=�B@@�����;HH�����[���,���$~�]R0HI��������A�x��F���.���1;p��4HI+�����%(Dj7���Z�����"5��2S��������?��jz�uyb���xPX���
?���h4n�+��k�9��������x|&���]�z���pdggP��+��?��(T���%sI� <�O����<��8�Z������$G��_���u��e|���z�����u�`�����)��a�	
���p\z����q�4(�����6f���nK������j*�e5���2�����$��/�K���Q��*	�gd����J!6#	��/TX� �E_��x�f:u1�u{p������(���u���:A��h�]�%���2Z���~���,"O�0����W����[NL����6���IaQ����+��x��u�{=cH��t��3�S+<��3�q�k+��sa�cE�nXzs
$�0�t,��_CJfo�����lp�l�g�]�ASN�����jD�Dq��.�f�@W�v���+oO�;�k_�2s3������F���3*<���S<�������n�JR�p-
��`�IL��%%�Zh��@����,��.
_�\���#�&��Lzv���|<����`a*���x���tzf�����(>*P<x��Ks�Z��O���l����j��E�JS<`��p����GBjN�_��CO#1�+.>��&!-�@-�����P�9�k5���Y����>;��d$q�����W��+�xP�Qt������'�"91S���� ��;C&l��E����[��cg����a�����'��T>�9��
5M}�]qqi<������?z�e��8����7S<�����P_�~z����$�iX�;���s�:S�����v�@4�?b�6�%i�����\���y��K���e~Lp�7�K
p��V|����s@�)t��7�"�>y+?_og|�
��qk�%�n���SwBXX�b��r��!�v�F��7���	�!�g.7���C'm�sS@"���>0���((ib��C��0��ct�����v�]��R IDAT������2�L��w��
m9q�i���q�'
�;��B�����0����(��\q���2��Azv�r���~��a�P���������,Lm�K��0���:�3�J�+t1P���4��aN�z�6�������o���t�)Jb��@$f�`Q��H������u�W<����g
V����������������s�M����!����N�������J=��Jb�����K��w4�����pw��5�����z���'1I�����+��uTDZR��JAR\�;�>�W� ��^�#���m#^�t���c3Z
�8��Rtovib�������s�t22'�q\{��������ia��3x��=����y�zt��f`4�O]����k'�a���_������
j	����[�~.K��C�[\=�<���7
�Q���fd���~R'`I[R�u� );��Oa\��p���G�~ .(ALm<i�8���s�a�c3%K����4�1nJ��8��+<�vA]i]X*��>�'7?�� ��[��_�T���wz�$�>�����C~�`|���~�#E;�>rE~J*{�������+� ��ok���RWG^J2���
f��� ?=
�:d�����?#��
��l��Z�X`�'�<����r�r��A��
�ad(�p��2��o�jc	s�����PKL��2\� /%��n@~� $�%�1:���t�����U{d�y�4/�M��z��S\"����^���gO�qy�^!%��tiQ����������X�Nsu�	y��h�l ��=�m�&�r^�����G���G��q���*��4��J�7����r�u���'�J��n�d�"&��<�����1Z��#1+'�<���v~�OJ��d��R]��cV����x CsOm����'��6���@�z0�x ����3�?��t���<j�OF������R�����u�$�w���-i��w1�b"�;z!�e
�"��{n�`~i������&=c�hW����M�p�(�%�1�i\
xI�`������� L����C��g�������%����4,hiQ�w��K�u(j`�Q�
~����0��4y�+Ne)�y����HJ���� �Hc��x(����I����.��ofwij��
z����Xy9����F�UO�����{�4���jB�Z����QR���;u���S@�=�9:L�@EI��NC\L
-�Y�1������
K�.4����el_u�>��Y�I����
�S��A�CO=.X��Z��A7l�:r�����G�!��������+���V�����u�����h�!(�s�����e�0���h���}-'BE���[���x0�����#���������3�n�����Q�
�`R��[N�9� ��nE|Z�8��������-�u��}������W���%Wf�K���fd���Td�da��y�Q����3!I��3������3:/��-�G���9�t�)O�@�V"��x{���Cj�I� �v$jA���%H����l�����x-d�$Aa�r2 T[�N_��>��U TW����HZNeB�X�����{	\� �����D������x9�@��(�J@��M����l����W����J/�	9	��� u�m������q���D��v���������IQd�}�#���
�:JH?���pH�����
54�K�@H_c��W12��Fn�W�x���CH/���9��O�!����X=[�B������|Vg��{>��3��x�c)%��}!z7)�Amq�}�Fl@6��I����3������������J�]x0�� �����1��"�3h�����q�\�c*����)����\^�>���7`����J-C�=q���6��� )"�WV "��prI���w���`�\6jS�����H�i�UN���^�E����aOo��JECz�s�$(�=phc-yYx�!�6&:7���3�`��������b�������6����m%3���y�C�7t�
Bp����tlp8���`,=8���CN��}���,�7��V�b3���@�kR�P�r��c��j���0t����
����yWM�]�����s�r�>������6�����8��r�����f
� 5=��
���'����tj����[R?�
'��X�C�N�{�m���H,N�Br,We�K�	���A���Y��!�������;�>��R
�}:v�_����~�vq%�������p�� �#���'	dw(L]-���q>�f��~�D[���?��x��*/_��XeU�������*�����y���?�l������Q��kbx��y����Fj��>X{|&�Y�J������5��l�&[�,DjFr�����%����0�W�/���i��~����%
s�����wQ��v�b���l�	���a��f"�m{�`�G�2�8@�$�aj'	�f�#��M��������UA��J�mo2����C���H
,I��`2d���Bv����r#�e#��Qo ���l9�!���\��������� �X��|Y'_x����w�s-n�b�
�+JkM
�/]0���)�Hk��;�x��n�A,�>�����6�~�}zt����0~�=6�:�E3
n�������m��+0H�)��������d������0f�?f��C0���Y+�g�� ��v8���������;Ce=x��%�&�N��/��PS���*0����P����$|��q	YZ���3�Sx�u����(�E���p��&4k��d�#�����sN�k4
��rj���@�!��82�m�px���k��3�B+l�MR���40����y�F&�x���.c������F��8x +�
�����:���h���%��_��
�e?5����>N�w����[;p0]m����;�R���'��7/�#H���qvG���sQ<p���_ge]�R��]���5��&+�fF���C`��	o��Tx���,�����[t1��
��?Rx�8�	NWgCE�����������po��7�w"%5�mp�m{�]<���F�dvt�
k��%�5r�MR�*�8x0�S7��C��/P�����?%�(
<8`3
�_���"��&�PU�r8��1Vv����G��I��7����_R��<2���>���/a8�{F_;���p=�5�X������)<x���>�o2�??F+��L���[�����-��A�j�����.�yl���2�������q
�>�����&�I����V���=�����(��a�������K��O�H�4������<���q64��DaR��CNFw\r�����os�6����mIF����y��6-D8x������d��G��!Ke���e.�dh���uGQ����
�Z�!��hHTn��"x���49g0�����G�g?�LUt�J$h��n6���x��.�>�
gFBE�6:���{����
"b�c{����iA���]�b�%����8���������v����)��BNA�b�0�v���#�I��3�K��WO��2�-������
�Z:i3�\8L��*�A���lm�����r�����R���i�y(�BFV	g-B��b���S���2v��9k�a���02�H��&�����{f(11��<B�����~H��
���������G���si'������'�x��rJ�!���a+:��0m����l����h�cVQl�@Q�6n_�A��6����3���K�:`��c������!����kX��G���Mc��1��1���������P�����p�E8l��8Tp�c,&Q����F��/�O�����(�v���<
�2�E�|$����k�����8����1T�������*�G��_���f^}�=���x�-Z�Q�u���3=;��b���1��QK�`���<�c��X|���'�{�7f����f��'��mV��TK�C���p���*�4���k6�6�U��-���R�b�@T\]G����x��!�'�'+�y�7T�&����3����&��j"*!�:��
�'x���f�E���X�.&�������r�]��6g�o[U9��9�N�����p��]l����.�E}C2e�*�
l����� ���\vBpL.�\��i������w*�a��,��x�!��m�:����o�?&����;7*��zG�|��F�-�>��Ta�h�����������
	���{���`���@����p*\��CG�.D����A10��a����0���s��t
DjUn�:��������@��KH�5C���P�1y�q��/?x(��zBXS��O ��Qc����^�����6�E4@.m^�76������0d��/(+����!I�B�EH�P�O_2d�"��6�#�t�2m�4F�+o���BXU��8
���q-T�,@V�'d�~���T��RP�X�F<�l���u�i=�;���4s��x�<�&8 f�&(����_QK^9����(t�8����5��*���rr��xr�}�s!���VVpq���M� ))!!K�o��xz�������5i\}�v�
�DA�|n`T��P ���Ok`�[�>P�%��S^Cy-L}z
�Z��k�4����YH	�A���(�BTQb*����7q!;1:� ��V�v����H$����A���H&H�x�Y�,�.���2�2�)o��m0>�_R�J���R�J<#�C��1���N��:�5��;G���0DQ8�������]9���u^�X��_������k?��I��)�����������8�=��]�#���P:�.��Rx��������~���3���f�L�����N��u�tL����w��"]e!l���y�d���]wS��^��I^_&:"�&�\W�;GT�(�AJ�R���t�1,\C���6x�����V�s�5�����e����zu��C����2f#��^E�m
�x0o�-��jn?s��^,<x����5����~�cX�w$�`2����8Z<������sx@��
���G0�=���=�d&[���g�fg��k�m��y����yf���po�B��^�
�\��,����]�g��j#*>���s<��S���&w����>�D�wiUD%F`~���qv�L�2
w�;cr�9�G!�4�������������=`A�U8O!�������F��-����#��l6�^��)�z�V.tJy���6]$����(�s a��L�D��M��vR4�L�t1�C��DR;�@��/�N���.=��
��"��#U��)���q=2s��v6"M%��������"� ��7HOP'��w�!�����*G���=1�}�����N�Ba'�aj��9�H�Av�K�r�!��r�G q�5�����}�1�'�BOY��Aj^w��~H��E��h����$���*b6&���
�%6H?���m��� �o��$(!��KHM��X!m���}+�S��>�����AMy�}�C��8�h����L�������|2��������0����8M�J#�a�R���^��e*���<|�6��-�-��x��v�SN���c������5���0��_���v!����:M���;���-"���#��}��~�k\�x}�
�`�~���[����/�T�oJ������N�����;��:UXVe���7��{�'&��K�_�C���0�R��s���OR��F�Q�6��-=0��9�DE0�,)Z���8
q}�=Y���/�AK�fDg�y+�@�~z�����Q~8t5��j763�yP�9�d��yo0���Ak1o�H��89!~��(4�u�p�{�\��M��~��;��i*?vJ�e����Ez4�G�j��0#��y70~CO4��@[c���m��-l�e�������6��`C0�[�l�D0���g9\����R��}s�1isoh��3��4T�h9��������
�O{-�oH��8|}������A
������!��f�����%�������}1��J�{v�@�(l���1k�	z���o %.����B������}�`�,�5,T<�"��0kG�#�`B��x��V^����)�o��Z=r�q����y^�y��K*	,�?������KE���`����e-�w�����=c����p������PY����t�)���\$F���K`�~
w&z-h��Yj��@VU/Bh;^��L�@��H���A�4O.
?c`+�~[q<?�����@pbq��{[i�i�"?d!12���[USi�A���������z�����T�5�A�nb��c����;�/ZZ4�����%��9��+��v��z:�kAP�3WC��3�>�?�ust�����y��BH %5��H(TP(�*=}�Cdu"zv�*�"fddb�oG�tv��AM���?���7�"CmS��0
�4iP�l@���8P��#-h�dp�Q��h��0����%���NDv�5�{8�s�����v�q��T�#�B*}�,:�A��\�;��(pAXu�-#D���A� �M��)0���x�'���w�������Y/���}������]��%d������\�Y����U�����]��(	�SL�'.G�K�fk��e�0-/X��������FzD$�A��Tx�<F��h��
8L�����~*�4�@S�:5���0�����s���"c��0��w 2�����j�=y�u�k7���Z�g+�8x /!�)�;��V�\�)!��G���j��5��K���G�P�dE��z�o=�c��S�q�cb���V�]%o�|\�M���fyg�9����e�oD�:I��p��eE����s���s�����Q_��oO��n;I��%>QH;���/oia�.
zs����8�]�wQ�����i8��������/>���0���M����0+0�x������h�f�	��V��������WWh���g��>����=�yH�:������i�U�*�<`0�YS2�zeC��r��p�����A���iN�C���(��������
������ e�l���"T�����>03����{�U�x���CNb���hT��5���soQW��2��r=�x�������y�4�E�)�=�T��+H�(�f�\R������Cc`�K����s���ox�1�?S1`J<�$��[G�k�l|�{NjA���g2��C�8��z�@�f�q�G�xf�72�������4z���~#K�&�AVA��)L�w�;���&��� 2R�7��C���i|�B���c�p��y�n�cD�$1q�a���[��S��.-�����
j���]��*B!x��B���Ou0����-=�42�0�az��0��-���j^�?��cc��T�	Wa��Tx G��1�k$��^�h�)[>�}�&2��%]���@ 9ipC��) \���hRAx��=8���\��xD&10IG���1��
�HA��#-���E�(I�`������P>y���Z1�Zx������l��MY1�*Ir�8���e��I�E
U���S�?�����d�q�7���@E
�_E�}tJ���4� ��?��sh���$���S����n1�7G��L��@�)������IE
+<`P�C;��Fc��X�w�x�'��H��Cw-/*Z�T<�����S���P�����C(�RPh�Y�;uy8��&-�� ��2��J�9B8�s��p[���~��#��P��S9�����`p6�8���1Ho|��O8C�7�7"�n��K��o ��Y��!�����dzS'�P�1T�U	8�@cn.rIE��z'|L�����n���us��|�I�%~��m��0�p>�E+g,<`�M������	�p��<�g�G���C���2m�� IDAT
����DEr5��!2�|9 ��I7��;y�e~����������(<J�����!�����!�T�T��GJ	��H���;RGh�� P`<��������������x��J����#�]1�6Ca�D$����b6o�������H�wB�*�!E���W�L����dR_���.��1�1Z/^���a�p���?���m��������*z�����I_p6�4�
���Z�kQ�����bm�~���c����&�Y�=+�������O�����������+VQ*
<`J�:B����3�!K
BRd�}
����a�x|�����mD��$���������eG��v"d�A�MOR8P��	���<v�����4� �&\g}��1>�X�PES�:aw��xI���G4!�������!������v���}�2:�c#0�T���>"��<1���z4?���W��E��X<|�E����b$��'�}�<�ChN���j���lz7���L��L�`aoY�
�����7����i���x���c+��)lhI��}���':����7���W<��r���l�q,Z���<EE�1q��8X���Z!%��sNb�Z�
��<���?��=���Im�zj�
L%e��4V��q��T~�?���bNAl�9xp�����~���]��q��Yh���7������Z����C�z��c0Bh�v�V������C��
��e(<`p���Si�)��n��^�c��X|e��u��
/�2����������<����R^���#1��X>��%��o/�������T;�g*<`P��@e�E�2��HORG��x��gA~����(J��,L�@�����P"������
�xoE����m#��wi�~����Ej
�{�����9�@sP%'�|���k!7(��H!���"(���L*W��
����� ���7}~�O�PB�TR�)Lb����)k<��B-�P�-������!H*�jH&AjFW$�8�(8_U2�'8����)'�2����v�����
�B}��Z����r�~p c!s��d*
<�Q'8��y��!�-
��D!L����0!��I|m\���I��U
�P�~.<h���F!4.��^���#9.����Y����I���8��������7x��|������{��uLac��������Un���$x����x��5�G�"�sm2�V�*���4)Pk��`��)~sJ�)
�-/�E���o��j2sr���s;����Z���m9������
x��
�t����8�`b@)4�3���n38��V�wLA���C!7��5h�&z��#��P�@FR�9a��K���?�e=�7��!�'�=)_4$��ww������f��FuM�A��O�A��0���>�����!t���9l>�����k_<��6��W*xPh�g ���0{�P,����0���x��0����1������/���>a���\���	s�n���?�L;���������j�~l=�#{���'��R����y���& ����M%���!x0�z
��%reIQ��.>0�<0��v���)���
]��\�u-�:^p�6���h���Q's[�����G��}I�@���f�
���m�x���-0��l��>������V>�we���lR~������E���:����*�����K�Pd EY,�0Y�'����4�-�xP�Y�?����Qg	RIH%Ui^W!x��J�W&@YW����k
��[��
_x`7�GO ����U���<(��0E1��4�T`i��C�2R��hN��<<�|�<8��.�Z��${�����6a��I�N����jB�Tx�-'h��0����$�5���:�������_��MT<P�jDF���vf)�v�R0#o6�yF��=��p��VG�R�V
�K����&��q���'���8H��g�
�O)�3���|��
��1}7��f��:��\^:�[$�����K� ��'�����aX�<�&�OYM��p`�Z��C.�z.M��4����;0T�U^����G�$x���]��k����'@�C7&�Zv*$��Q��|4���+Y���t����f���;'�&�i�;�-���SJ�������!������cY�!��G�h�M��N)����
m����[�[�n?�=��Y�a�8x`cL��0�]����x�|������F-p��-;�CL�-V1��.�F�}��~�k�
�����-M����8�%������t�?
0�@��JR���p1W((�������"�	�j�5�y�#oa�?(d�0+���l��S���Z@����(�#�2/#&Gr���J
���4*'\x�0!2*����BA!x���
D(��a#!<#�����~'�C	,�T<0m��
�`j,H�
x>��e3a����a>���������� �
9��.���|�� !z�' ��j�����i4!��!f<�}�fQ�ZHx��\���p��
���H�yAD����'
�@�>%�H
��`�D�,x�T�_��������Es+�������n����7z�o`������#��cr�;����������;M����L��s�?�Ba�q���>gc-�G��9��EA!x�`�6]��4)'��|�g�;F*@F����)l\�*Z�[�i\��{��8B�`0�� dge�JR�,:����4�B-x>$Ys��j�}�O�
���1t���l@��0�N)i���P3W^�����K��cVc��Qh�y�����
�F�T`�%��)E0A#u��;���j�{����.
Y��@���&]���,t�;���5����R>���r����:XJ�������%���m����'� ���3s�qJ�B

�Mg_Er�L��o��Wc5����_� �5R<`��Q�E	F`�!aC�F�@pCURi�A��\���v����Si���l-��gk��L����'�e�|��c;����3W#x��F<����Y��w�R;�M�����"�����Q\�`v�!�J�����G�p�����B��Zgr��	�l�XOR<I�$�9M���o���
��-��b����:��,����)Y�?���}�/kP0�q!q�&����Vk��a�1�~A8�����{�w�5t��E�_1\9�>:��q�N��hI��<W�Z��0�h��zB���z��2�^��jOy�A^B<7��7E���E~dGD ��)��y!55�y<�t��<CI��|
cX�6��33!E`B�&R<������Mo�"��t:^���+�71��&f���������eB�������������
���/_@��5y���\��%?���x�A,)��[���L�y��<���IHyp���P����S����S ��cUG���PM��Pwhk7�NDE�/����L����>�A�V�p���*��4��B��V�q��

����[XL���u�?����$n�|�J��C������]��L� ��
2
L!gh�R�*�o����I� j� ���l�"�i=oGi�M7\���APio�a�dR���6��-��e'����U�R+�4���b��P����s��B� ����R��Y4�?����7����%
�PR� �`
��a?m	"t �a_��p�G���#$)����B� <hE�,� ����\��/�yg�"��J
������
���i��� �0���M�6}��yX�����%JsG���B1L;��]#�x��������-�_|	kw��`�Y<����_����(4k~A��	��y���'�����qw�C��$`��h������

���o�\�`H�4v=�){y��BG�~<CI���`ee�O�F���y
����fR<�E�L� �B��n^��-��,�`|��8p�<������hM����
	�h�����g�9�v�0�n��>!h�}��v��RI� �N �)�F7��n����Z
+�Y���o?���rC-����H��r�)���Tx�Y�%`������@��'��Q�H=Fa�g��p�x�~1���x@^�L-��)�'Az�:�<�T
��(+� Ufk�:�ZSx��<��"C��D��?��C��K��@!��9���;@���;q�A5
� "�=��2�������H?���!y�����^��
i�������)��)d=�����(+L8���
A��A��uZ�#�+�%��4�B�	���x�R�x��L�[�����8�2�,�`L��8��$�[O���w�XYl�[��F�qh��`������[Pzi�WN�~�HR
a!y��x�����I��:���T�W<8�������sr�P���(������!dS�B���
�O�#E��+�$%������LI ���,��I��z��a������v�F��~>��F����1��Y`�������)�&�YHp�
���;�~���g�A��"�K�Om���B����	{�@�MV<(���������X8|N���A�&�0"�cfxg��4�����)8����2���6�0�a��5.�}i%?oeRO`j
�M��
�����0uW�`}�@���g�8l���T����'W)`�*v��H���xPxP�<z��C�7���c�V!D������Z�q��������@�F�l L)a��4���J��<�n�����A�VVx��
�����!�Cn��;v��#�<�1��
��A�I�Xe��W�����LY$E�!�@���|�P�����r������sv�����������AN�9 g
�n�!��B_fR�|4h/���y���`j�B��%�z-KU<8s���=  %���4�.�Y�d]5�A�y���T�`����&olWO�u����s8x�i���%6a��hl�u�'��Y��`��;�@:b��X<�`'5-�<�$J���a�aL�0����XJK��N
�P�n��&��@u�@e�VW�!k���-���^��}�
4`pS�����e��"oJ
�h�J,1����������?@�����qR*�C!��S3�����M:��N�dU���X�e[�Ii����`�BC��$OM���
�Q<�uy�O�2���
o	::~���CBHQ+f�qq5�H�l���x��0��#����hjaK���'�$������n�Z%�� �g^?��j�V�����V�����]z����T<`^��f��i2���D�M2�4����&�p���f����Zg{�P3'�9�_;��u�Tx���0t��� ���W�s�qE���ZctmE�!}���S��ys��:BjF)3X�c2(�ga*	�����B�b7ga����g>�|�c��=N�?��b]���(��7�����>���������	��@�����X~�2�Rg�f��$�C-�h��u�jP���*k`��-X xU�<N�����P<�����W7���f���y�%���)!����� "9�������!�'�b��<�N����X(I�6FwR=(�����&H ���mI��g���x/�)�0
JR*�I��z>�]O��Te�Wq4t�@�B��'����~/dP,���d�p[�y��S=���h�=��UIi��Q��h��A!�`�O��� O���AF�w�y��� ���B}2�R�V`���r�(8��+� �#�8
���P��!���}�l���� m�t�$�pfa�ic��?�Dp�A6^ �S��	��9hn.���^"����zK�JXl��+x����t����Z`�K�:. �\���d����p��|����@��hH���!
� GR���DLb8�L����]N1#�s*46�@��X� �{ub�C��I)y
e��?�a!����6��w�}�x��,�bVF����UX(���@R�'�`<7����r�8��6�G����'�X��c�j��{?�<Y��B��B�����<��YxO�sh���^L A:o��MwH���6j��a!�����y�H�C
����=����d~�OSXZ��Pv��j0� !)�����8x��gL*�I� �����0�a+),H ���c��1���o
|���FJ
r��������/���<�Z��@F:�sE�<������@��xG�wy&��b�~����K1�I���L�%XQ�6e�����_SN��
�tL����t+](P�����9���WE`e�r�<
������ej%��N}��f�	A����rJ��������|�I�!#V�����K �?�	N`�#1��}��SC��&)t�>�P"93(<SW(-�D��z�MAz���*��O���X���,A(�|��sI��PL�@QC�dtJ��E&��5���$�����,���]��i��R�z/�X�+�5o�.M,��}���p�j���3#�`C���U�Ar�Z�t�$|#C�o�\zGd�c<�J^��<<�	�!�`�g�X�g�����k)lC��z�n���{��6����"/�/dJF/�V�m���Oe�Ly�v�3�)jK�@B6�3�]� �~�����%��z���6������x���1�$d��c��x��C)hIj#%'��,���{��E��$84����\� 9;	��2�����+H
I�<���o�8��7jWRM���J��������p�884 *��b�n�~���E����En�ZAad�B!������S�0b��	8��r�b��8�+$$�"C"���m�x��$2�+��o{v�piO#/�TK����k��W<P�2
)�!'�6�H���UHM����W�����t�Y�1C#�����4/N�t�
��|��C��j>�
�w:&��1��y������$���tE6S|�.;�ry���^kXX���^^�Gi\Q*���M�	t_���dd���0o~.�4gL�qR_�<�^�B�6q�b���d*
<8��BZ�������]	`yZ|��O|��t=z�n�X�X����0,1��yr��������)����A�������9,I�#�����.L�)����F�a�E��P��B�@�����I:�����g �D��$���%��NTQ��L%Aw�B��� �|�B��|�c�r�	0
�C�ZH�+��L�"��	h�w�����0��p
�_���oc
S��Q�"�����]��;C��������m,l���������:���,liC�q�_�
M��R���\>�'�1X�N6���[<y����<��B:����/��r��c�����*��gu���S�,���Bk�|z
`jW)�����,����
���"#�$���K���,��y�E���:
�p�Tqd(<��]is��g:�����V��%�z��q[i^J���?�O���k���Nm��)m�u�|	��L�������h��+���F=;��^���	8�]����roE�@o���g��Tx���^������}������nHB����(���'�y��xp�uA*$/�������g<vPjP��hL��/�\���'m���_�Id���PCxI1��r�p3�����,������6����G7cZ�a<���������������d�
"E ��?�[��A���o^�|�zz�����Rg��m%������C���N�x�<h��+�KJ�I���(�}/�6�O��A�������1��b�3%�|��E�ilGk�x����yr�f2\����(<���${Ls��m���R�u��XK��YX�=�\!eO���0�[�"�s�j�"��W��Z��2�>�`&�]������"��������&�!iM8��� ��
m N��,���'�ARE(	�wW@~R.D)C��o���CD�L�*#��� IDATP���=!@J�3����zA��qN���i[����h�=H�hE?�����,�����X
;��T
�����������f��"�"���pl�1�B0�~"���d�
B��j@cm�����/�*BI�i
�v������~��35!�����Y��KS<�m#A���x�Ls�:�E����ZI���^d�����yH�\p�����M�1e}Q|~�=+I���
�SY��$�1hZ��BXtu,���F����a<�O=;
2����yh�X��6?U�U���;N<=�%=�B�����$����q�F�$g��m����d����c]�TR� �B��&�v���!�$�������
)-
-����kZTLe�����P8�X���E���o�����F"�'�����o���9�W��z��(��3�K�me���
E�����1��;��3�Y|���PR�.+��J����������:��3C7�?������E�k+�d����I�[6n�w
_<�d�.�" G��������-M�`��'#=3`�n������U��9�o���j$,HU8��q�_��^Y�VM:������!9��w9Y*�$o���G�9�Rs`
�o���{g����/�q7B	����.J��
JK���R�Bq��P������������!Y6�j�3��O��������y�;T�	t����p��\0�"��w���;�'������rRJ(Is��r]������O�M���3+��M0����?`�����{����z��s��������~��{��a�����+x ��]��mH�u�PRK�!�{v�,/������d���Y��4��Q��8}�@�~�m���B����&��~��a.��`��X�<x������j����C�KA�����fA�MC��k��{w��O?�����/���ws`a�[����s�p;�l���=,aaKt��S�1��5zXe�dU<xv9��$�N?+�����1�r0�pA�O�qsoj���1����F
��1��#{��W7io��+M����!X����Lbe��Q��5�u�]aVx�Bn�c��{�dQ�����E����nK{�7��������'���,�@n&%$&a���X��w����h�b�<s"��4�q��n���:5��q�� �j��%�=���.�.)��{D/W	����E����y��n�{y�s���5<y�2/��Z���G�Je?����g!��*�Aal
S"HN�#��U�:I=��F�l���i�� F� �U-�y|y�@��]-��^x�W��������"W����gTM�<P5]��
<�Ey��37�@�e�G�9�Z�����P<(����L��I��MSy������{7O��]VWje �(7�@��<��Z�e}�y���������}N�A^�
��9������-/W���1���j!���x�_uP�W�Y�QD=�)Sx�L�����������r�Z�����w]T-/'�@�|���h��.�������;/WQ']��<�u�9��.W����U���*���.�|l��.l�L�Y�(_�jA�: �&��e���Z����A��L>�G�v�w�
[y������,x��r2?E������������;xP�n��(S����#"HvH���Y$Y}O�W+{�e6�	�@��x�����FS.�� �M��@m����k[G~�x
)0�u�T��T�YaL!����+��I���J1x��f�)��m+��m%���OA��A�X]��cgUJ��r���rv��%���&����Ll�m%�"�+d���4��~y�1����������x��=%��6�A�cQ��?O5)Q��XO�������B�@����n��������*���p(o[|h+(?~
"����<�;�R�T���+,�[�@���A�6�A�61�2- ���<�;g-E��m.�������jR�4��H��x���!���RQN<��}�1w��U�n��@y�
��C[	�@��S1x�?V�A��Y�Rx���D\a�Z@�����������!,�iK�`b���+�e"##akk�B]�2���Ya''�B�e*777*]�qR��� �e�SRR����P�%=Q����5��8N���f���<R)MN�ccc��&&&��$Z�!����XH�ij���J��4� %��?������YCz�4���,�R��:)�]�q��HN��Ziii���������x����[��aM������P��C��'&&��fff�f��t��u�``�R��?����L��U��$��b����H��0��9������P��k~��:�Jz�BQ��*��z��W��h;�s=����63��k{
��Sq��0K�h�Lm�G|�$'�kTM+�1����yQM��IzE��4+r����0�T0�L�FKI��wA���f=�%�(c�\kY��zD
)����Z�e��"6!���sk�-�P3��Q��?��Y2����C$����.���Vu="�O��b��u]�l�?1����������U�Z�-a��}�I��Y8�[�)��*�
,nDZ"��e����z��$W��������C_�� �#��G]�G2\������2mu�5F�"	<�>��2��8�D�T;{���`cb���U�
vFP{�<P��D���xP���Gk��t���x���t�N_�� _�������fy���"88��E4�������/����occSF��U����t�R���.�2?��?�e=����]<u��S�G����R����eU�W_�b}�z��2�>����P�#D����Pu��2����>�GX?����hW-o}Y��V����j�N���[@�?��E,62~,e�AA���i	}���b�����y^��bcY������?���6G��y�C��zD��5���A��iM�����
�����G�z][#B;���z�YB_��>��Xjgnj+}�}X��>�����y>��a�(���<8}x��=$r(t`/1sss���\0y��X}���D"F�vP�?�]�6����`�{�������&������g�>�Gzz:X;Ty�j���L+�C��U-o&����[�rQ?����2?
�?����)�a=�Z$�C[#B�|t���f����C_�C�GT��L!�cc�B�g�l��zDYK�O<��cgeKQ�����	��O�xb}���tO_�#�R���[W�t���,���!�=]���#C�����a=Y��!4�K"��B���;\_@fIA,�x��� 	@mZA_��>�� d�9�5�K_�C_n����|Lk3}X�0{����������X�k�I�y^b}��
����mZS�����'����m�����Xj{Th��Xjf?m��������[������/�f���<P���A���;]_^�b#���R���X�������!������/�!6�5��A_�Cl,ksTh��>����G�z]������P���</���P[9��zD���5"���>�G�%�e~�C���v���r�������S������/�f���<�|,��C`�A�����!!!ptt,r�f�01�S����".l��I����V�?����+G#%�"��V���G�1��� ^�"##aaa��-d�&H��T:�������#7C�#A��qN��]������?�^���
�la�qIL&-<<NNN��o��I���9P�������4��Ij����-�����ZZZ�eu���!@b�N����P�����0��,E��`�D�+�U�E���I7�ur������H�!RR��WH)T]��!�PC����#vv�����F��T9�����6�`����P����?r+ ��)����4nePX�#��E_���?4	�M���O�5�,7}������l$eO-�C���,/M�#��l%1�5L8��
�����P����a~$E��<���_��?�����F���1�Z� �Z�M��)��X�T�(���I%$��N�M;t�>44�N���=��HM�p�1��#��������yk��02�(��<P�T"��@�Z���~�
�zRz����Y�������&S*A��(�wH����L������J�M3�`�QG��jideC���$����"/|�q>����f'q&�������
������, ��|>"X@��1xzo6��b������?���j7S�[�p��
f��
���������i���2V�����?���u�u�f���@����x��������+V������[G�Z8
��g�:�]��-�A�C
�A{��QZQ������������������c� �f<�0m��C�"�C�|K��V!<&��T'���`a�.V���\���H���oe^���AO�^^K7���@���:CcC��{��b��6"*����S7#c���	y�T�fc�����RqY$(m*QX�`- ���_�@a�J����-�������L,9	��0�B���
O������(���3I�\h��";aaaaaa���x��]-���W�����cH�����2Vq��Y ?�����47@HdJ5���a���<��ih^3w��w$bt��e�w�NF�:&�0#�����T�	KC�
�In
�@�yl
"v����pc}$j�����PRQIi�|�����H�M�i$����j�z��)���)m��"jS� 42�n��xq�%F�Y�n*�o��yhX�<]��Y�p��v�Z9�f��J��M�����q�Q�]6g{/U���"�J��������?Ql�����qw��U�l�W��7����#�$kz3OO�������Q����K� ==+i�vo���G`?��JMI�|iq	�lVG�t����/����5+���6��N�ahe�V~�N�1�J�@dR4�M�`+����{�2�����Iq�05������lT��J%�"x�d[
��D`�c�=b�S�7)UU#�B�`v�f�w�2&������P�J�*����[.����R��:U-���_�u�����$�{�J�z�G�6xP�]O$F�����#4�B�N�ng������Z�����;������acn��WBTJ'����Bc�q�^$�hr;O,;���T��S5��������{��MO1��~���)��5�M�j}�����=����Du����Y�-Z��fJ���Zy�����7Rc�=BZ.�`��Ha������.-P����S�`�S)A��7l��t����x 16����1s�?�1ez���A������84�T[�]������Sb�o��l&E���p������]���xP��4<8�)	�K�	��,Cb��h��1������?���Y�y�-��F��(U�;�A�����Y�Jx�.i�%k���|q�H�?r L��'��oOwtj�T�-
d�@~��KB�f��V��6��4�N��W9��j���te�E��T3��/��s�[�G���k����P��U�_�1���������������Q��)����U~��_�@�Fj������g���_N
<���3D��"��z��ww���5����#3����� �����+p� =E��M�`��j�PV�1p��a
�x����f�1�?4�����C�b���A���p~�L����Z���_]����GT�pFe/W���P�?�h�w�EJ�r�:sz`h<h>s>N�������<���\/2�W�7^�"".���#|��?�}�/��P�=�����L�@VpA`�j�o�xc��/�y��	����������
K�xPXzB��0[���ix"�����)
�w��G���w��@N�����
��m���+OU�����%�nW�_Y�$\-��Cf�ma`m��=�����'x`hd���������/��Bt��.x�e\]�|�I�h��.^�������_�����-X��c���(�SSM�74�W��g.2_������U`V�������qs�������)�y������	��J��Z�M�*p�����Z��Q��1b��p��]����d��2Bt\:n>����6����H�����fth`���t�xP���]IA�������8��';gLO3�y����)=���)?{C�����tT+c�%;1��d@����+
����P)u��F�
1x@�u�3{	��&�����v�I�[xz03�����
C#c<��~g�e~�f$�j�������_v���%�FFc����1m���;cP���;6W���I�"y�bQ8{UG��Ca`h�;'"�M����t�@uo0�f�F�M������+#<:sCx���2���#�F
�:����O�����84�-��r��Y���� .$u?��')8=;4��������Z%|0�YS��<����X>l4������C�~<�'o�`��J�������0�h���^��=����	�d���.n���H�
+#Xv)�����s#Z!�N�����-�8�@b���/�N7��{��������x0�1l��@����;��E���?�������I����[8ti=wS���p�X�c����j���m���#�2�8C�����W��	�;}���������Z��D�!��!(�%v�YA��8����J��?�"&>�?����m'q��{���R���
���������4����9�@�by�Am���B1�?4I�	vhX��f�4����
��H�����������mWal)�[�r002����2�����J�����x�����V>�x��1�_{�2�[���+��@����.U�`F��!C���1����Pl���@��-Hx
�	���{�i3���c��0��D��=<0�����-�O�F��,h��=������~)�P,��/<��G��b�|0��[������x��O���S�������W#��S�_�7�{{�
+���M���g��X7:w���-����.]���SG$������L����O�F��t���/��m�:�3��o�g���^�`W���g������_"������uT'(�F� j�^��T����r%�p#�]��0���9���x�?`7�+�O�X6����K����3������005A���H'E�bEa��)�/�D���`���{����k�x`hg��{O`7�3�w�4���I�����MLBjx,��Y�J�\��I)�6�
kr��������:U��AzZ=ka��
��u�x�>���D�M�0.�����x}��m`V�������Wn�=q	Iw���
fX�������"� �������L����-&4�������{D�v�u�}��+_��z7+;_���s
�Vw�������^n����MQ�.�	__��{{0��8��?����;�
FT��/���%���OK���#I������Lu2�(V<0@�������I��x�o6�t�3�"��!�N�Y��ky�|�~W~�|j�r�|�pm�_�q�F������y�;���|�E�y����&����������D����)����$�����u-��&���
~'�"��i��1fV|~��8i��W:��xP��&��C���3�	&�B���p��y�$%�����E�	}�����iV���Z���n�a�K���7���e<�%V�{c����w��`eA�������HU���)0���]�����q�u�����{��+�S�<�;6��y���o]���������Vx�6V���9������v�hp�U����r���&���=;�<���~���o�����'~�s�n��~��5R�y3s�i|��,��T���nh?���O������%� <6�+�Y�aT�jt�w���C*��\����`+�Q��xP�����l��;����l�������Sx~�(j
������������j~�%��9C�*@�*�����`iL��F�n>~/W���g?�K����aBk���|��B���������(3�s IDAT�9\mL0�wI�M�@qL������H�����%E������l����e���\@���\� 8:�|l�z����i�������������!�lM��z(��E`���>���{�3�x���-���_J�~Tfq'3^���8oR%]��|�n�3�(o�5��K���<�4t�m_|"�����a��Datw����Di&x ;^>���������J2~�U~Tw�}������}�b��kS�)i�������?��A^�;�������[��rBH�����x�����3+���.v�{Xc7�=�#,%�p�2����p�5���z�3n7��{�r�VG���?��F��`y���l�T����f�|�y;�a���h^��+9�s�N�)N��|�F$���
����8�;�yQ��-���dm����`�o0=�?���T���d�D�v���+�?$��dguf���g	��L���&oy
��!����E>M��3A���)�9k2�
�9r�q��'_e���6��hT|j�y�<$Q�1*+�/�]f&��>
��/�~�@jy��b4��=������Q:~��6R��be�S9l�{��j��������w�@Z,��l�_ ��5��gKv�u�S���kL�<���9��E���H|���C��db��y�jHON�����J�SqWN���ML�8��(��*T$U�q�����I���c����;#�w��/;v�s��R����Uh����������r5vN���]x�0�t��!c�W�q��K�q����q��?�ioe|�v�~�v0������e8s�>W>��9{�n�3
���1z�J5Z��ff6h�1��M���?����@�j]���E�k��Q���OD�:����o�m���Xm�8<�O���UPx�@k�*c*�m<����Tm|e���=�t\��
<��N���1����u��|�{2N=�������7�T���1I�������<��K�����������H��!�V�����F����:�0kn�L��7�����OK
>���v�RCS�"6�=��?�D�#���� v�[�����
!��Atb<����S{;����-q������{X�6�q�X���Z0@���@ba���`��?����E���nK,�F���r��\��E3�����	QA���+��>������	��A����Z�>O��i:�(���n6f
l��W�


�����rV@W����Q��BdT46�<��������Q��(\�Q�Bi�����J@�U%�A_�v5j�������5�\iC<�Cn.N��p5�7�.]���O�����M�����u�h��m��Z��m�u�8|�y�R������t���	 �@��!�(����;�������V8{S�*w7���I���
�%X�]=S:�J���!Jye������	�����{HH"0@���a��5BN���;R��g;+C,���1��9X0�����fc:w���T2��f����L�@Yu��F�
/x`J�*M5��!G���/���Q9��%�6�W��8������/��SV�Z�c���0w%:�����~�g���c9��}1���o7�A�����u��z����"��r�q{}Q��an����y/��Li^�����_�E�F�x~6�G8���8��KB�?\q`�[8�$���OO���X\]����l���sq�
���'~��6&���[/�������d���0���?��\�~u!.){o\����������BN����R���������@��.H����������o����E���0k�H�d����,�I�d�Gt���}�Y3G$�
�Y}v�A�n5�'�"�b,{��<��.��t����|#a=���R9R��*�����9�-'�`�����.���%
G��0��l�����srA�
;O/C��������
�~�A�
����������
-�)�����z���nh3	����9w{?�#D�o�q�p� ���qa������o�s�xL�3~�|An�<����}!L����l_T#������d �Z���+!��*�����o#��s4�2��.�m�"�&� `�MR;�����46���Q8��\lPnbK\����k������[<^z����5��U�o���G��dI$�c�g��/�HE�,A������`�4�f�F����5�0� x�^D_��j�w�F�n(2`��m�k�W
��<5.��v0�)�*���������}�Pz��x�d)RBBP��x��(��l�4%���#FpP ��kT�:��������k��kL��z�*�_����=�/A�����c;n������7{�$nnH|�*S��A����� +#�9��{e����h�>�u��H�~�R����/��M���;����x����+"	&������q��lS��l	z.D��B)��^�i#2g�&�zH�� �����7����7�"c{�W-��u�
>H�vf�+p �V�#��U�
����g`�����H�l���!m��x��������-�e�R&�eDo?D��"|�&8L���a^����T<`��G���-�������K�<`?����v�'�F�R�������m$������I�z�0�/�T���*U|n������N�<����\,��n��U�6�g��*8��X�E���c�V�}��<(b���������@�'��s+��mPe�\\_5
��Z���J����;G�<�w=����5;����H�v���u���nY��
�T��W��f�/	L��Ru�"6<�/r������.G��?rP�����6r*��~�Ws����8���*P�tkB����x�v���[����8xi9W�������E�&����|����w���������;����6�sP���a����hS�S����g}�]��X9��(5�rl�M1@k|���T*N�W����N��_x:���������
�
��7a��WS:;E�v�����X�onj���(�`��8�0h�^:l��G��L;0��Ay�([�>�������,��*���P�yr���R	^��6� �a"���yX������bqt�Q����\�����B3�V�@�"�t]�G�;���}�
�a����k������d�C�Qk�d\Z�+�v���7�rV�*�@%k}����E�bV�����z�&m~J�f�@���8<����D�m���W�~��v��H��
����t�~�i4? ��!F�yD���;�-A��������2��jXZ� �N�2V�y��T�Yt8;��+^�a4���I��k�=�������p��C�_��D�j��"�t����A(S��	������`�r������`��7�.�`��n�������[v��<�|�#���j�}�5=G<8����#���T�>��^V�k�vx�!+3�zYs`c��0,\
6>�.FS9I�\�����",H`A�.?�~A�IGq�Y��	�����Jb�����w� 
J��_0�T�:2�a����$�����f�H�����{ye�00#8:���1"kS=�r��gi�H���UQY_�)i��Y
j�1�dJ�4���Kh��%��PP�8+x0��7�c�`bz��s(">9��D`��%d���2\-���=�s�������W�Pf�����9F��
��������\�������������O�`$�0iR����V�%���>`c*�@'=���f�ku'���T��������mM�����9s�}?G��	�-�����2�WD�\���#���p��g$��iD,�6�T<`�����m��{�g���`��'�6/�u�<oU����_C��=�"$::����0�n<s?���m/���	^NN,�1�\(�>��2W	2�;w>������C9x���/����p�����1a�Z��_���q��C�~��k�B1����K�������A<�V�7���p��~4m9gN,��a��a�`X�p��s��oh��{��a���=�����^���F�aU�V��=�Pyd��J�	60#�.��LkO+�^r������G�j�<xP��P������,�~��7����%y���<�����U��.��`$���gD�
�Y;��a���1E��
H�`�?���D�$z��%W{r������������Q��s/$3VV�`����I��lu,�p��i�/v���?Gh\4�>�?��$W;+L`��o..�w��
��`���k�#q
����U�`�V6.>�}�JIu��H�b��x�����&����#���]�����f�[��>sg0�wg�;|�:���-{0bp/�����1q���X����o���g8���K�m{�`h���!"j�N$26vg�_A�p����=�[Z�d�s���k�#�����e
Wo�s���� ��e"�2P<xM��O]��F��h5�����3���!��N����R�H0Y�z4=���:�1�U� >���&�����1��{RI(R<8z9�:I���Ft����D�1$r�n�:�QUc�;���2�,�+�@���z�@:r��"C����9i�"�i�;���W/��Z�����]�����F`��#�V��\��'�7����vt(��^u���t�t�W#����hX��Kza�����e�)�X��(�������@�b^!/����nh��xq>O��e"h�A	3��cD`O�Q�8??��U��A1AR4����3��8XZa\��t���| ������;m\���_�L�=U���x`�m��H}��8R#��>�v�O�n����z�7bV�m�3`�A")#H_&�v
���&����kCc$�B���1p�-�{��]h�c����?RI�vrI"��!G��p�^���VN�S"�wn5��L&�`(��#�<{�����Q��Ff}����u�IQ0��f��Qk��BE��
��A$���[�
���c����G���S_��7��:`��uxB��5����at3�,�5S.�x����	�\J����x8~u;AoN��A�m+��[u��W;�s��[� �YA	�pq���v��������uy,s�`(1F�e�q��U(>�.l���
��C���yME��2��U�+�'<��J��6�}B���p��!�P�Css���=W2`!�����6re[��]
0qtD)$����-���<>��5�[�6�2�TZ���H�����~�C&P�����p��DHKJ��	7�u���1?qq��s�����T�reVSk�3�����%x<��i��$�� v/s��������-IY���7��9��x
�V
��6��I� �\*Xwl��{A
)�o���I��)$�J��/`�������`e���#�l����s$��mR88�2�aO�A��P>2`J��� ��#9�#b�6�s�`��9b�_��-���� j�#���eB��U�����i��}( �G�5?$���Y��� PA����9%�������0�@�Fu�������)�<���%+�m���}��+/�n���J�"s��l1��`��&��0[�5���K����;���ff�?5������TR�a��,�H�{���
��
-P�ZG�=�77�q���Ww�A�r�����DP��06������V�f���j��"��U�yt)�	����
��R9x ����3Ia,��_#��5*� %R�`���.%����E��!{��+s{z�����9�?�����>�S�1xp^�W�j[�3z���,���w�&z/�������M�a�n5&�p���A	�������an�k\�
��w|):�xFm��nD':���%�����3������=W`����u���t��k��������1F��E�}�:�j���!��u�v�K�Z���9lP��MjW��"aC�%[|��MmO����6SI��Os:d=A�
-� � �u��~����8�o3���yHp��O;`�U��upn��S���6�D�z�k+��D3k����m:/��� 5%�}�B���������B�@y[}�1�
svP[�����v�m��ow>C���D7�W�-kY`���2;�g��,n�����e���A4��\�����`N_�g�d����=E�!<; f���A�fF�,D0Uv�������K<����������b� ;hf7�g�.���!';�d�?�}������`��?kZ���f��&uN�`��U�}��s)(���: 5���?��L�@f���b�l��n�g�O�����?k++����?���*�-�w��F�K9����g�2Q���5�����Ev��k1n�(���l=�X_���BJ�\�A�|�&��������d��7�Wq�!PeX�"������hT�����
_n����6z�c�3�<n���)��1;0�D�O��1���9�~��� c���!�v+_�������]-dd�E���[�z�J��,��x�h�x���|���e(3o��p�����#A,��QV�L�LpY�1d}�[?��d6����7��I)%�][=�d�As���a�M�:.69y?�c~l��+aM����7���C����KKKL@��Yp�#��-)�N����_�m�o��p�����,x��&�����I�r0/[U�e��,x�a�X[������K������h�@L���]�]w��~9��Z��z��dn�i�A�>�PZ�^0p�B�%�a��
|��\�0~,>]�3zv�y2�`Z��\MA� 4lJ5^\�����	)�v�;[�}��f��S2!�&-����yR?�<h��9��<��w�{�"p�g���~p$���!�N$<>��m7���OH5C	G�������KG���V�6n�:�~_��I��/���R�a���L�[ n]0������R�g�U��fM��Y�*d� ��'���?{#b*��B�
��=���%P�3��|r�=�.dd�G���{��5w��tVV�<�t���'@�d�bC��v��pi���|�L�P������~�
WvE��\�O���.E�C��<`�_���;�c��@�_�*"If��Oq�:zf�i������#(a/WC`�����!�`m����������W�-���8|3id��BN�d��(B.�T������m��k0e�0�}�D�*L^5o�
������Lp�B2>����L�`��$��#����KE%C��!E����9�X�+C��mx:"�u�y�j�#��3)��6�$�t�.�I��S\`J	����bFv�p���\`���>��2E�;O������ ���(���m�8Uu���/�jmk����S�<J�BJr"��^������S������"���Z�Gn���I�1v�f,�|�9�Y=�����������6������J�hxrN�U��]7���g��X:���/.���lW��5U��e*t ����x`_���F���&�����>W��s{<>��'�yV�]E�����S��hS�$m����#�3�����0f���K�`-���}�W���Bg$�j)��yT�:&��;I� 2�M�H	!��]��=�"����F�����S;`6��(m;�o3I���Y�V}�	V��0/'�����n��W�r�
A�u�9����n�e������{ !���Z���-�u����r7,�+4��'��W�j]�@�.�G��}I9�)|����M7Lw4���v������r�x9I)��P��7��T*Qgo�K�y]l�4��l�P�o��E���qu�f����Q������8�g)W;� ��t���[��m��x0�%�?N��pu��x�d�9���
'u�(��tD�<�]����A��I���Y IDAT��$�A�������S���2\�(R<��w/n���k��\��;�����;�1r$V�@��;�p�~��`������p��8��M������������YH

B5R/`�
27�.<0uq�Je��I

K�9jWR����,����]�"�`��5���W��l1�	�(Gj�����x@����:AY����=����m������)$�w�2W<`.��8!��5X��#"��,aHy�%&��i����#���#)0���0�;��hR:	
���[��B,�L�x`��d����A�N�0r y@v�B��9��W<�[5C��w�x0!T�/I���30���!������6o
A�s�4,�W��wQ���$�x�� 86��^�Q�
��{�k3�\�����o���|I�Lv���^.J
������*������Z5�*�n��L��)��$`���\�'���@���� ���5�c
$�@`�Y�������R�m����Fh
<`*���k��p+E����L��l�~H��5O��E���u?*6'��]���~�x��� ����U�|���V���\���+�D$�iF+��Br�
�r�P�h5�����o�2a�&L���)|��C��C���:�gs7,(R<h^c ��	�KD��#I�gw�����
���=��&��_��Lm���N�}��tX?e�q���%J�"A���+��������b��;$�����Ao�)�$�mL�����
��B�,�xp�W<�I���IR��n^����?�xN 5��rL����`�A2�`����@�/�V��I����&f��'K������,���}d�r���[��������uZc�f�-��f#>,�$0v/����W�|Y�*���L��������m{��';d�Y���BhR���hg������LZ?������`��2�X�0����\
X�5v��j3������r��=;��z���V�k
RM�C�t(��K��CDvs{����q)x&K?�$����z�x����l�Si��8��V���������`���Z����������P<`�."%��t�����L���)�m.o���A��.N��(Wc`����'@����������
���$5?�������
<`n6����#sw���Cq�x�������x����ljL�)%�.e�oJ������?�;�8_w��c���J�CV� �8���O��c)R0�f��E��
���H�-��l����hp����V��
�J�����9�l(���Tf�d��
s������Cs�!�x ����17�@����;�6����;f3�E�����A2�N�%7	}G#��%��=�a\'���.��F�|����<xP�9"v����`����l���s�
�e��y�>����5j�r���2o:{����=���]���w�/\��k(�*0�����0�u�_)|O�X����Z������x�������g8l-6����*��U��N������WhN��l��g(r��hN}���T
�mOo��J�*�)x��K�cO��;-�������>�x`oe��w�h�(x"vu��H�R������?]��I#��^M��6F���LE���0�7F��0R7x�U*%��_�W<`�\���\?�^Uq�G�xE���O����3����f�Lk�Q	A�O�������T�n:/h7:�!)�&����F���/�9m'��g,0W�h�8��rJ�,���������u��q�,�F��c�M�O��I����w7��Q�C�����q]H����W���L��i}���'x�,�w�1���9�<{�{�p���A��!�gWn��V����7oCp��E�����w�	��=:�
�����HE�R9�}_�����P<8y5/���Q����������A@pm�%s�Pu*��c����`��0��xp�Q*�gM�dz�&�� �����{��&|1q�z
>���y3\������t�E�����S�F�	��L<	�����r3���>�L�l
Hf������1��OF[�n<�����>��+W����!���s=z�CJ�*.~}u~���wP{f�]��j.�o��[gO4��m�
�������<`R]��7#5�����;���0�OG8��%���O[�=���Ej��{��'/���0f��lCNx�V�>J����\Z���(xWl�XZd&�mv���q���$���&A^�]�C���0&w'��t���:���H�ii	�������.�@��6��RR1a!7��dsK�hjI~{���{\[A��,�L�Q��$�~/�)?����������W�>�$�+S<������q���h�� ��@���IJ��*�:J�K���U1X>9���I	��n����`��5<0.f�.nt3�|�����q%����0���>O�������Q�J�������
��'�;��o�����6�-�EW7�K��	���q�Hy��S���@r����C}{���y����	����?R8uc�����|e�b�Ijz.����UK5��'	��������p`����$�u��~�9z!����;l=�?D�cc�����'��nb��p��qR��]5�����|��i��l�"x��Xv@N��*��w�.�=��.X�$��'1��$:���+Oo�!}v_��$�Y��n0"�ki|nL���3;e�����H�rt(o�;?�G�QMp������������y��.���D�PkQ��dP�0�����)����8�6)
�u	lh�+c��i��2�L5��ZU{�x4}�����*W���q�O{���pj�O��i	�<0$�@����
�������q�J��]`�HK4��]�\��L�oR1H
|��{�Pl�JC���tK�����ti
	_�
@�*x���pl�/f�xf��k����4�xH�>>��a���B�����a��6E��Cx3(!��e0��o���bHx�����F�.(��o��R������F��2��#��������z�����*��z�����)
0H���m�Nt���C3�4D��A�{vH������Q������!������A�-�G �^m!%5�l`FeE,���0i���lz�E��S����
t�� ��(�T�D*6�{�����4r�� I��\��q�����U�&0qwA��=���B�9Ma7�+��Sa`e0�����T/�U����j��V��@��\@�)����9'��fo2�[K�U�^�7XXpf����7���p��5��Y�2�!t�T����}Ptn�A}�Z�W��C`��mp���2��������!�AtdR4�#_px��XC:(JG�4�+!|�p"�i��i��b-�`�L@s��((R<002A����GX*m6����t�����v��	a��L�z�J��`���~��g���x�Q��7��{��*r���	H,lQ���|\��{��8r��� ����bU[���4)g7~�5;�L}�[
"9JK[�\=	u{����R���
�k ��xVh���6�Z�h�X������
��Y�P>ry5w�#S1�$����gr��Wo��������a`�������N$��;�
w���rO��]b��{'�{h:�WJ�^h&�W���U,�'�mD���c���ten��	=_�����I�O��;R X�YG��U�zH���O���[�;c�)�S<���nn��{K3�9��
�_x
OR(87:����]�O����V�#w�1� �Qkq�����D~��gS<`�A�:�������FuM��H�!"�w��pXJ����G/�*k�J�w�H����+��������k���>2��YS�^�^&x�\�
j~:������V�����@2�9�w���0x�o�;[WR��8<=�6�|��B�����v�\�=���`&�/Xc�����	?0�B�u}l��x�}7�qM; �a�s�K�r�@7���8���������:�
�Z�C��T�a��	�
o#�R=�	 ���7����4:\M#����������
��=YXE�������>��g����n�-xv8���9�
A�����p!�+0��*����|��o#�����H}��/zV>;�fj��sW9���c�)0E	����Q�`mc��I�4�|=�P@&x��@�H���(���$��K��B�.���A$�&=���&������$L~����~��6��#Y���1����:05�OW>D�*6`��AA�~��m	�)c]HR�9�����MX���~e�S�xM���=s�50.���`���Y�������q7��se�((������3�6�[rYaga��*?G.������)3oZ��]���7���s���.`�&l��<�*(�Gh�<E��	{e}V������#�.���!n��a.����,�����wi$�'p�7	��#��qZc�JG�>�x��<�i��g��yW��KSE�A��|����4p<b����
���^�:��?�Pf�)(T�����m������Hj�����a�(��V���N5k�k�����"�`���xL�9|H�w��}(�Q������F<0����=����z*�+)J�<��H���)�'��MI�r��S��F/{���S�����I�������A�q��2�.�����Ms��br��x���
��d%|�������"P�T#\���MFa�?�2��<`�U>���?n~���t�c\%��!�t��xE���Y�������ox���+���s��+�x����#oZ���W�k���Z�]rK9kP7,>x�@�NXJ�(������,��x`\�V��
��}�H�%��C\`�A�?���^������{��E�K�i�0u
2��~Nq��M������!�A<�~.���A��Cz����G��8���U� ����'w�v�8�cp-�A�-����"��%��0��5Q��>��ef���������W���*t����R�|s���~j&x�Q���4���~��O���K�M��,�������j+S>O��������Z��R.�[>���H���2�Y#\�����,�'���~H�`3���!}��>y�8��s���X`n�|1s��:xP�*mH����{�	8h�yK���/G�4���gei�P�`��m\%���|��A||�5��A�	�����su-�*x�n9��t<(�����O<�-}N�T-3�������(�>/�@�<�#�"�@�������3'� ��/�r�Y���
S}5�KVW���\I�%&��$+,[���3@U��������Y]-�[���D�j#���7��A����M�U�>7�@�)�gN��M�S���M��y�����Ay�Z� �B�4��u*�x�N~����:Vi
�-�/����(�]�[���`������Fdu�QPv��m��Y`p
�3�e�0H�������;a������+;(j�]wh�|E��%H��1�`��#D���h�N��OY�@�e��������"�@��*�Q^^��6��EY�m����m��J��Ani��A�J�0c6�������0�]������p��U�^����:5��q�� �j��%�=�������.)��{ss	��*��E����K����k����|X_�#	��<Pe����X@��XI�8<��r#E�X<8�3A��3�
�x���>��<(<��
���jUx�Aj�x�v-"N�R��<P�l�;G>>�F3��`j
�N�*F� �@�
�4�Y�K.���V�,,��x��2��.�Z�KW0��G��4Z��@~������`@��{^�?xy4��!���@o�RaCx�~�
� �v<P)���H�
�����I+���, ��u�x����aN<����K(dw���u����x�����<P�V�N'�(c<���+����A��^,, , , , , ,��[@�y�Q}���<����C����2Vq��Y@��
<���F��9	�@���/�@�����xPxzV�<�A����Q���E�������h�c��o���_�@���|J(o+SX<�� ���7�x o���x������;��N���gx ����5�A~XY�!, , , , , ,����>�����<��6�Q^y� /����X��<?^�c!!!ptt���a�����3L��T�GBB�������r��� 00nnn��?R�R���_�$�]�+G#%�k�P[%����D
+�x�3������LMM��I7AZ����tD�l��"	:��s�%�R��^N�����dhl�d�KJKKCxx���������s�@�#KO���&��7e(h){��`ii���Id�����:IsL#�C=s�'�4M����R�>6�AT���Q��Jq�6��NNQ��&�#�HI��W3r-G��z��
u004��l=bg�x��
k$�`��A�sL�jh���)��
�8���#�b���b���H�FP�e=�I[����l �C���������[�r����/�Q��?�FR���?�iM���d=�N�V#Z��#Q��0���
��]]�GRT���������N����p0�������1��n
�OQ�Z�"�@�o_M*!10�w�n������1u����� 
Ej��{���I�=��t�~�[;���D��

�������w�W%x������Y,����U|>Z���nu�(�u-��t���"�f�����55�+55���(R��f���0?��?��3��B02�����m�����>dv������/�6�D����^�b=���t�J���,�z�����C��^�)���'���!��-����L�)��?�a=��Y��.G�jy��z��� ��Tw"��<(��//b��Y�c)k
�E�MK������Um�l��������m��/�!6��9*4�K�C_�#b���x�fb}�Mkj����m���e="�����G�#��2?���Y�U��a���,TP�����{�]u�u��Ww�Xc��VT��Q,����3,�.�E�������x���93��|3������c*��TV*��=��="�4�=��d~:��5�-��t����?��rR���lX�w�����?{g���RN^� \2y��)�����AKKqY����i������#��Gtt�t��=�!��v�R�������III�����9M�]\���E3�B��'K)��+����w��� ����=m���e{�{x?2�gE�����E�P��r�C���yi��#�W��:�=�M���(z�9���5�u������gEs�����y���S4^���hM}�x9�����������k���>����#+��2�f���.��h�o�9��x�r�������o����5�C,��)���Tf-d��#;�G!��'����.��]N�����?��L!;�#�>�����#��#9��2{��O+�>��:Tf
9�����������c~�s�����=�c*�����r����?e_�]�#;�#�ms�C�O����]�Q����>������r��o���e �Y����R�|��X�5�]����9��2���O+��G����?�L!��G���2���O+;�Gv�Gr������B�}������r����PY)d{$�^W���t��="j"����=r�C����J%��Gv�GD��������O'��#�&����|������Q
��y�������add���=7111������CJ��e{�1�D�|N�u��O.g�N?�=��U����MRC��v���)�r���.444>��orM��q$!Yv=%|n{(r#�������N����;��R{��;�@c���",,L����������B@��C�l]vh!�&�^��� IDAT����PS��>Zv�����?R�C[���U6���-�u�>�9H�G������);u�D�6��i���=�����L�I�����J <�����"������q9i����M�����5<�7S���8��G���(��3B�S�oy2�/�*.�WK��������� �r�@=.�_Y~��O���Y{�IPA`D�2��"i)�=��8 ��=b������G�H������Q��P�PV{|���0�B�����ZOV��8A1�_��2�����JH�-�"�aJ����������_������H�Pk?)��
Yi���e�_		�Y�,��}T��������������0�UIZY�Ce_���CQ^>���w%��{���Y���Vd`V���5ZC�h�O�6���Y����95��j@���O�F��d�S������`r���	�?G�=����)��������VO����&
��y��LGb,!��P�k�	q����_3��BK����5��s�*��2���~n2������|mK���oqCg��:�����%"������)�����j��������E}7��R�8Lp���o];�=��]��)���>1�K�L}�<��rF�*��j�B{(+��+������*SNi2���e�d����>Ag�?���\�S��5�[te���_�����]?�5������V<Z����m���J��5+o��?�UY����Z��~�zBIuG��}�tp����g�@%��mUV�f�t�����KVJc��Hx��������m�����I�Q�i�M�6"�v%i$���l����{������7>��m��t`�O�6���Y����95��j <�F����k <x�Js���� ������� �gG�9���5������Q���Yn�� �U��r����WH1<�
���f����������d^�9�A�u�_���k���]]��_���2��W��QN��H���<h�����0��[�������I��T��El�b������a(&�Z���A��K���^���e����?������dZ���7��?mDp��N�e��D�16��z���?Sm�R��X}���NK]?7���;�}nvJ��K�#�w���[�iY�����KsQ��3�_[���AUU����T<�_e��i{���x�BGW1�IR��D���C��b%5aa�i��wc*��������l�D��z
���"}	�@��&�\r��j!z�$<x��2-���^�tM��i�W�5�vCwD.N��
�r���I{>�m#���\���xFN���k����,]��X���x���w��wi�4��RzY�HY����;����0����[�Y)�W��wn����,]�l�������{�lk[lk�>Ke��5@��84ho��K�l�l���������W��ATP��yi��<�W�����d���p�y�'�m�E�V<Xw$
�*ha��H�l�$�]J�kO����P��R��3�u�l����S��6-�Q��\��]�l����C��5��{g�T�>�m�RVe+<�-��$!�v�c����:(%�aj���/���a����*��V���;��&5���PK[�g����U��x��~�'>���������V�R&x��'�]�c~����Y���4�e�f�y��vU4������n�*�<x�e����Z���x��V�x@�,]�6r���!��U�������	���B�tC��zU��Qg��J�U��']�r�:Z#1417�*\�V<p�����p(UW��+�[
�ED�2yV�j��k��K(���sss\��������Y{���B�X
W�g��O���,�:�%�7�m�S����������X���]����?��7Lw�J�f�{R<x���>	������_R<�<����W[��V��A�>����@���	
��cw����A8�z���K��	4�1
���Bbb�����x0���\�+v��
k��g�E�F��'��d%��	$�
v��0l����i��U����_�m��[_M���x`d���8�W�{a��!<����$���5[Q��l�-��'��9S~��m��%K�C~�s��� J�E~�O�g�60�GM��ES��k��I?}	���O�h���vg�l91�U
|/���V�0z��%���+�zQx���?�|O[�O4��1�Y/�����g\�x�w��*�1R<PZfJJ�K����U�+��X�PI�+x��m���U����~5�+
U�?���X���3.���P��m�D�F:xx;���/�%���x�����a�)<�P���f��	@����N�J������Y[hV6x���^\9#���<P��D�Q��5��.�^�,FRx��xI\}�yn�W�+kX�����+�xP}f��������
�o��m���Fv�x��������u��x`bUf6�x�������q`�tD��3�k�������d����]�����l]-������AGwx��CPt�74w���������.�v=����o+u�,�@CC}G�`�����4_����!����������A=�4��f�yT&x�S�-�_��y�O�x�p�l�[45����Ju����a�|���5M�k�c��6�L�@�<0lK���9������{q(f��B���������%���2�����f���8����{V����Z���3��������_<p)���&8sh�g�-���2x��L}��c���t�b��������W��K�8��aV�R��t��A�6�=���1������e�6��l��d+#<��W�b�_D�2��O������E�Jep��5���L)7���Y��w��Z�'�,\�/_���#��w����G��#,3���95����A��uP�P	Y�7�C��.h_�6N=��cw�``��E���G��M��wv���:mq��5X���kE$��������k%�������$�P<��}�x�pn��\���3Lk������hc�n�'�HGCk��iV����\/��e\�%
Y�!!1Q�aF���PS�y���R�A�'*GoY����T��ZE���t�6����Pp����&t4����	��/�jN%��S/��OaC�	��{��V�1�s+�>��!�[#��-�!c�-�*�[��:��}�����������������Z�o���O?��������!^���\ ����~��WOa�o�����:K���!o��6��o��J�sB��Md�~`=�R�"�������T�����
�����3C�X��a�=/�jh��}I���b��ux�v�������U�@EE3��X�A���rL��
��,���(���Q�d)����u����b��ZH�������	�{a�&�B�E�B�u�[�� 	������p�����5ou,��^Ug`����Bq]���������o����e�'J��x��c��GKu�{>��y7�7\����8yq\�Z@W�X�kNN"�����}{+B#^*T����x\:�t�r�����baWP]*������Re�h#2"���J}�������W��*��L�	8s$Z�
t-��|�4��/
Q�I|:yB��N���w����Z
�4d>		IR��Oq�SU�y����u�����;�����%�q=�xp�P��k2m��	��j
JDu�#�Q4dh�,M�B2��	���6��M��_C�[
��K� ��hVt���byK�@EO�:�=���@�GM���R�a���q�j*�O�}���G �/���.�����.�UQSE���Hx�I���"*�z�q���^��Hx�j�l�c���`B;��[�hu���<�v+��Ta}q�D������NN�	~N�L���������&/��Q}Q�NS8�o�8�a�1���e0��������1����xz��~�ms����Pn��xP�^s�����Qi�t���}s�������w1�{0u(��A���e64tt������VK�;�Z�K��o����q&�����xu�J�#�<	��S�G@MS�~�*��G�������O<p��������>y��Sx��u��Ip ��8����\1�������������}�U��
9!"61�';{c�s�=�u���8���!���DGG�!�����u�������Hz�G��W�R��:�x��<�|[;D�
��i'`�f�|5��U���xj�I0�������<-v����/aR�f���K�(�Cy�6��P�����(5��xr{�u�u�T<8;�$�N��}=w��j>jD��|?N��	�R�P�����4�&C��.2^\x,o#�����J.�������lP��lgUq&LQ�y	����{x��.�;���R^YMG��CL���������'� �t�a�?�	/uK��V������p��}��+X�l�d����?ByGc�,o�s�Y����f.�_�8��w�a��.����	F4����u�����_���	��4������x�i_�1��D������J���*������a0�����?z���q�ymYY�&j������2E41yM8�r�x�6�+j�`.u�<�7�|����uiC��F�����
��������
�����j�~��g�����=�B����?��b�������{�����M����%x���>�x���9r�z$R5L��zuZ*�����T�J��B�����������|�n��h>;��b:�9OHx�:
�aV�'� �5xx�����Q\}(#���>�p��:�s	p��!o�q���9��]�2�|l�|���A^����`~�
��]�n���~�0�s�fx|��_=���HTn�#Ml�K)#��W~	,W��\<4��{����j(���N ���*�W�@4���g�yO�����7��8]B����&��W,��
8�k w��Gb-�>���i��g���PN�y
����X��Z�����DY�,(�j�ad�zP���w�^�bF�V�{�1��c�[
�t�����E��W.b�rf'�t
1�Rs����	�L<��	qR�@(�~�+o�F�|������[��rE�l���a(kS�/�G�U`�g$�{�)Y�����m'�?��Q\0��<�HS;]��r���=�%�Ue�hjK0b��+�Y�vf2� ��0����'����{�V*7�(T�e�� >k"��7�h�P^�`���^�.�i��z�������6�d�O<�aq����x ��~?��x90 �g��P3�����]A����a(^U���%^���tE}~��C0cy><���y5�nI�\�D���/��D����=�B�*��H�(��=�R�`��W�?���C����m$�Y��K8�Ee�_��"�e��o�<2R<�:E��cY�6�y����P56D����%	��n�*Z���#1:�n�<H�zf"Qi.���<u1�o 1&-BE[K�A���5=���Q�N]�z
k��"����4hY�#t���#1"F�� ���TXP37E���0�]^�v�g}��1�@E���y��bnx����.3�����Sa��'�o�+_DMV3h3a�A�nu��$�O�6O��p���*Zz�:����@�q��xp�WE��9�H`!!�5��"��~��4x�����}1O���;������
�M^}a��J����%X>��s��kU���������GP��i�	e�Sx����C���q���6�r{{���(\�.�SA��b{GLd(���,���Nn�C*���F.���'����.�3��[��h6lB^?���)6N��x��+2S<�5SG��yE���� <9�f�"�7��=F����k��<���M�$4��{F��5���x�(�q���/��Qc��nu�����_�hCS�f�fW����`]LO*���C���8<��������"�>�P
�CM\��w���{���L���7R��@e#h���/P�y-#� ��E��OVr0h���d��C%�?D:�l���Z�
!��>��J�����!?t=J#|�	��x-�5�����"��x S�VE����l3�UO��� Ft*��;�?K������!/�3�$T�8���kf!=W7�������w*��y�
�s�&��*������v����"����s�*~0#=����DXT���
T�z�b�����8���s���������!�O�����p�T�f��O��N%G6����Y�{��+��B?�����PB�����\~�����B��]�4�����pw�)��e~m��o�.>�s��81x5����'���x�~�
^�����2�=#�@�6R�n�}�k�8���n��i�$%%`��Q\�G����z�7-�V}f�����C���L�sq�n*���%�Z}���y)m��C|w�#.,�[����$���p�knUIZ�\^���������Zp�r���������8|�8F4��`�	��F�=�i�5+�P�~����EX�{&4X��������m����~C�i�������M8�N�o���#M	mk�C�k��f~���:���z%kr�zZ��r,��n��6@u8&n��|��	L�<��(��ws�*v�/�a�<��|���
���o�����o�����4���h�����jd���[�ni�z��b	m�h��uTz����fA=w������f����}�6U4t\K�4Y��g����t�W�X���wj�|hs4j��w"#� w	m��3�X�B�@���KC�^����PT�5A����8�*Y���XK���:KeH�����W��j?x��z1��������Y��S#�y����q��?5�O�������P���~������u�<�`ea��4����#w����$� &��]�Q�$��]#CX[�!&6N*X[�c
������+�u���bP�rY����4^��P�Z�8;�����>���	n3��/mX�r:�j=]�(���Pb
|	�`}�_1p�l������7p�s@n.�-�K�������A5[a��uhY�*����7���vfV������'���1��������6�I�m���W���u1������o�C0�� ��K��yX6���U�jXw�0!�~X|l��R�
�-S[/G�����gS7���
��#@a�QtG0��t �1���~o_I�`b��r?���q�����=�z,:�}�5��
s%�a�I�A����M�:��J`!E�@��!�����B`!��[?�:G��P�x9��~.UqB���@��$\��E�0N�l�@c���%���k�����5�������wk#���������"����f��}�OE�|ep����m�C�����{X�`�����f�(h�{���
]0��F����q����*x`��`�?����hX�v_8�_�w��sg��q;���&�~A1��(L�g�i���y�<��
�����G�i�����*c��E�3�eq,8��V�����x�n�jT���Ih����y*��0v\��N���U<���"�l�p��B�W
wD�F��qo_�&x�G�LG������^�����K���O����qo�Gf"����P.�������1��$���&N�FY�	�����*�
hH� 48Q��;#%�AY?NzE�|*F�����Z#]y���nrr���B�!I���������.G�Nz��,�����O3pR��"4�UP�U;W�F�%������P��.7�����dzbp.��d;3��ha��^u{$�
�N;���xo.���"�m�
"����f���E��h	��F�5_���o��F��s��
Q��A����1�9x���I�"O�R@
��KTD��Bb`8��- IDAT��E��m���C�A��F���rE,:�D��hA����<������e�~fR"f����+�����5��?����������<���������0���u�����<����*���[�C��J�!vj\���5�P�UW�����rp���i{D�yS��>��m������`�V������=��#O���������pj�''�K�A�����AE���3���ah��^����y����Px/����qlL�����#��1lK����S��z	,d%��/S	�^��CB.���`$a�!���Y������nH`��N#'��	,�|V�6����}?{�����0�$���P�����k	�(Z�NzR(��
�89�Md�t���dW����ZF����1v��,7���|��m��
7G���wlk��E-aV��mu5f���!����������G�����8�v����PmF\Yt������$ ���k�QqlU�Puf�A� 4��F�cW%��,$l`hg�����9�9l�;�;�cK��J(P���Zq��?�N�I�@�LW*1T�V�]�[_w\]|A��)�e{�
h���
����P�E�P�I<\4F�:s�!@.D�$Q���f�nz���~N��!�-��*8���>lM����9&�+����MXz���y�����gb�*����o���������hV��/��[������z?D�E���B��snYX��G`Xk�A��FE��m���:�	�+�IP!
�9��h�R��Vzo��t������������"Q�]���/��I<����3pb��v��GQ��b������1�{	�����E!����(]k<.J�����/7-P�\/\<��X�1� 1*�[����@��*���������!��NC9.=EB�h9����z��W%��r7�#�s�H�=R!����[%��Y
�r����&�<8w`1��(sk��o��0n��Ui�M��t�n��&�%��([��\�c+�.XJ��W���3v,��}�����(�V���.,(2.��E.5�*�����{�����!����:��#�@����AG�|j<a\n ��#].�4���a�[���	2��l-<��W����P�0�^'�@�G���E�z+-.+
��������B��p���".�V���k\���t���	��,��PI�a/��G\h��I�Z�E���I	�X�6~����]���ly�����XR�3z�ktD�#�Q��J�)���{��m� ���h�Z qm5;'�w�G�t��������
S/�C�"��$�Q���$$ ������n�K���s{�ny�zvj�-
Y�}|�<Z`��:T�w�1�1�pE�����\�"��9J����%V�>����K�a��k�W�=���?�������^q�9a�O
����45�c��bu#�>��?X������)K���^��_H�v���A�6�{�+	O_�����UG�^��s�?j62��m\�k������$7����B���8�=H��TNX9���b1yq^�N�r��������`���+�`�_�0�������V��Cs�Uo�fd������C
*�����:U�����^\(����{��OUm	h��F�<&0�
�g/C�T	�\��<���T�f�]�87�=ez!WI�u+h�r����U2��!l��7��>v�z�G8^�'��,��NA����&��#��[�x���|�,?4+���qp����#�e@ d�0�M��@�� ��~�t]L8���A-Dz.����������.T
���B����;r�u����P�m!��o&�"�V��!k��U��+�����iz�C��!�f!����cy���]�fo3�SXw��=Sx�i�Vl���r@(a�\�0���������98�n:�g�h5��N�K�6�&���S<�uj'���@�`'�'4����vl�=�7CT�y��'��Z�Q2�N����st�p�O�B�~3pv�"D�l��<�[<��L��IQ��x�<��(��43� ?7��J���a�gW�Qk���{��:pic�#��$<� 
q5������<�9��<��k�����P�����P�_�����������=X:��4�������`��G0��D��6R����\�9���H@I�R8��\[[���'(���~1<�9�^����&��/KF�A����g����A���|g�@��B���.]*���}9I[�*a������P�%��g�0'&�>:��~t��C�"hhB�A��<�R�2��52}u[K�EE��}N��|����f�z�����!xp�T,r�P���
���aO�#��x���5����PoiG[���G;cB%-�}D���V������&@�]r�/���T0�|8���|C9+�A���_*����� o�x��2����������+���M(��4��>G���������lM�>�	��Y����@MC
/�S���e����K����sx{���4��x��o�������������Oy��V<(K[*������zmG�
��*��a��Ap��u#s�  ���4,���:Q���N�Y��*4����&�!H����2����snt	z�Z�K�@@�0�����.D����zG#�������|^�x0��tL��^|���l�������p4'l`N�L��+p�g�4���R�������h�����v�^��:���� � �[���}��9N6����^�Y]'a�A�Wh'o�(�1�p��&�Vo'����J�������#�F��{��Z��~���x �	L�&��P�K$��� ot�VD��M�.���+���u��	`��Sw�)���0�3���0g�{��I��H
���Fm	i2�~��r)�/U�.�� p�l�
*a�g��}����Y�T�e��i�<��>�Z}suW
���D#C�F&���px�6�`���k���J��,�:O�Vv����C�=596��x��2P���?����Z�M�F�}������7�D�N-1m�2��K�2a�B��/��c �p)���a��C���	i�����?���?�"P�����3�����'
g�_�!};a���f�[.a���P��D�4
���S���/����\�{��%�yn��N��_�s,z������K��m`$}����O�\#@�K~������6��Bz�����[f��a(&�Z�i-�"��B�@�Gq�s�<m����#a1�{�y
s�=�\����"�r���F��5����b;/�$�hc���sxJ�u��ft�HJ0�Fw.cOR��Z����]n���8�O���}!y�s�>��w5zUi,�/ ����rS��<D?�R��G����p�i��j�H	i]-��R���?�i���nb���H���PO\��$g0
)�+�y�(
E�q}������"��^��'���������kA��S��V��O�:b��e
?���H�~�2hY��.]���^R�`���x��9V��7�7��O��x �\�;�+O��X��l�ZR���j��	%�G���\������
Z�����5�z6Xw�7t�<Y���
qa��4���p��<}�.���=ao�[+g����}r[������(F����<���F�Swe�i����T�	g�F!����������R�@�$����X"
[{5yj���h�� 9]4��i�T}Gj�_n8���E�-�?�<����I9)�:	�n�D����a��	<i�����%��wc*��Ap`�R�@�/��S�#���%��W<a 
��B=@�cU$<{C5O�
n��>�pNO�[��%g�E
���>%��jZW2.�	��C��
��n�������8Bq������R)A�*���#)����E����?vC�=�d��������CAB��	�@�SU������\��b�<�61C�>?A��8�L��e��������R�<�_x�M��G����6�nm\��?���yB�P�s?n&k��wo�U�������RW9vkH�{Tp�9��e�V�G����/���
��bu��/�7<�o��&��b�zr���,G��&IA�F+v�k�yB������������Xq!0������
��K���R!+!=�����^��C���.��������#{��T9x���E��l:�������H� ��B�����_B]J���l��T�(ne���QK	
�X
��b��s�u�����Q��P��
7+�����[�����Qi�����M�\0s��M*���P�6BjZj���)vu��N.0s�d][�s�A	���
	������h��#�}�$�������2y.�ys;�0@0���qc�7�nl��=����F2}g+���j��+�i� ��2�*��?�����.[���:�k�	I��qG��4�\j������8���8��
`s�����=;2�FL�Oz�A�\��R�~o���Ts6���:6Q�`AoG^v��w=�	������E������H����!���5�j��q1G�����l�'>�,/��I��qs�@y.���O����T����O�X��8�t"` BJ\�����JGy��A+t�;�\��U(��x�*X
�����������>A�'��J8�cPj���.@�"Ti��7��f�&*4�'wT�(��8��y�'�x��xY�x���
!��������]I��"��^��2�W�����w�/yq��a�g\����0T�P0dDE��?�+.����/����M���{�l�u�Bu�w����'�J���'�%x �s[�^>u;N�������i0�y2�h��E?EBF�����v2N�=%*�����T�	�'ca�G
6y�=C�v��|=�K�{xC�G���*K��*����=wBj��mT����PQ��@�A����f��#�"	}VjD�8�~(��x 6�;8����
��9'U��V���K[���yn,���������#<�F�R���)���_s�,z8{HeWK;t?���GK�p��PM�T���WO�����=0O�: �
�����T20����P�	6����f�$���pi����i�:�F!����}��e+�q2�AM�s�� ����q��]��!����?�?�e��:�Z� �F�@�3�2u!Q������y�P�>����g<P���$!>5|��B�j��Z�g�����`�xphg���H(a� n�����j����X���jA�c~��/��^KS�-����u���"����_����[i`���xN�`��.���;�#���g�~�T900����@L^�c�������2���@��3P57���F�>��>!x�juo�*!����w�J"�u���q�L������#	c9 14\B�����YK����m�)��%k��������u���6!�#0$��(4x�9��A�v,�����6��4�
R�XqP+��>�j�s@��v�
O�R�@�^n���n���������1w� ��C	��V���'�%t������C��:��v��4��w�������^�f�o������%������6��Q��^��cNyn�:H%�<E%��S�5�9@i��5���M�!��/Nn��T,�10���+���
�0������x���=���<J�|o1�z�L����*5���\�����n������i���Mj�o'w�*m��A4�"����>��
���8�g�G��#��j
~
��*^��Z���.�|)U*��=�}`_��.�HY�n�&6��A��(	����UV�B�~6B�SJ���A�9�����";��R��TQx�<����>��6T�����d`��[�,
����u�a��'���,�:�X��#�H�SBF�A�3*�x�������<��>!h�Z�1������d 1������`��%������W|~_Iw��w�Y 4��9�K�!J������E�S��D�A�������C� ���q��:���&a��Bz�A0U������u$X ,��T�IW��	�:��u������6�0���hH<�p>�v���t��:���a^�7{��e_����6���
��B>x���R!��{�8�H���yUrUv�y	{���4<��I� ��]Zp���8�~!jo����A(�@)����>T��k�K���*�A�C�s�<RIJ�B���� �����;	�Mpr�R�k7���G��#p������.]���[JTi��f�;��A�y�Re�a,B��f�����9h���(�P�����.���<���
���;u��j��(Y�3w�����e����T� ,hDX5<H�V!�w�����\��{3x!Z���y=���e?������PX8E;S(�7+�f<t(�|	�t�e�Y�^�^.h�e����jbV��.��������DB!���I�~����K[� �
#����x���\;P35K����R���{��SB�
^���{"l��Z��y�u��x.m�k	~����g��;(<�����]	�����e��]\����T;(���]*�]ywX���1|�E"��BV�{��w������1�2�r��LjZ���kI��a-���.	C���p���o�@��j�.	��aW*$ ��k7��bYW��^	?�����.y�",<c��NUPH[��'�COOe(������w?NBl8�������--����<d9q��j�K��*����#���������r���,�H�up#O���{u����^�a��U��3f�����O(�*��M�q��O���n��}�PvU��:��q��by:`6U��u�����6���u�*]����H��e'v��*�t= \5l0��c����<��t���Pih������	7�*���A��� 
y���"������}�6�B�x�?n��������T"�����p���/��a�%J12��HE���/����������H$�j"|�x �I��0�)�V�������K�@�#�{�Da��p����
<��3��eA#t���H�8:�\�J��^��7�n{&J�k}shrQBH�{�f,)����*x`K������`�X����6m.��[~��9vOG��67�o�NdGPu�����%���}�����V��&S^��J7
�t_ �~��%�{|M�@�q	1
�f5����S�s�p-��OO��}e�	�A��Mp��:DD�Q�3�<*y���p�3�xX��O�	�_����N.�&(����gc�Q'y�C������X��@�������x@�
�����8����8"�s����R���]��|�b���*6-
<����P_��.U����dE�rA*��F����yI(((W�@�M%Dm8	]n�����F�����P�X��x����������=�|�C����<�Mwac�&+�;
��T<�d��*�jA��S0Z���qi@}���Sb�(���~��S��p�*�+|h7���x�ea�^�?���({F��P!��<YoC%�Y�8���x���w�w�+�:q�t� ��6�@��=$� \/���k+��Hk�k���V�+]&�8��@����9��V��x�'���O��)A
x \686���SF����x&%v�,��g��x��[#qC^����s0�� �
��m���,�/����*�����[�Gz��P! A	*3����z*H���	8��
�C�RXG��	�_�fA�����|�[�Z�FW�������6A��.Z;����{�C�a4�@��"�c�����\m$t�xm�@���%L B�-Z��)]'�2D�ry���"_'o���x0�".�>�2�<4p�T<���JRu����A���m�����s�!U*�p�����
T#�q>�_��=�`G;'c�� IDAT�|�*�(�(���,8���9&�e��Y�I���3��@����qu�E��x�&Zt���]�pm�e�����<>�nq7��L<�8qz<��o'e��S>��1m���=����K�����~���2D
x0I(x���X.�Xr%���`��d�%=���E��������s��@�e>t���qg���j���T��N_�?m=��I���T�����8^�p��0���N�K�*hc?{7���5	�}x��oI��bx��8<�-����P��4	�P����x `]kX�.Iw�(��<&�U<(Z�7.��#!���A�xn��@�:�
6�N	��<P����U���0o��D�K���0-'7����<�Kw�^�y���T<�v��4�����t�P��n���7��1<8�i�kt���)�R� �*�|��
������-���=���7�=��Qx Tr�B�"^�4�UM�	�]�=B�G(�:{'U����R�����k���������g�XN*'\����&��'��'���C^'�
!�  ��u�QV`��V���@�1t��2"�+��X��J�	
S����t� \%��dYw�Jr�]��k��G(l�	KkwA�[T�#�^-��;=�A��@^��<��A �����&��c�Sa��@(24�����S�7DJJ�9�1"�`?A��o_H����vK��	t!`K��D\0x=�����c,O
�@(!������7U�*��M
����ex�8?�����..��KU�����O�)�LFL<0�TG�b�8w<���QO������x �,�~A<�P<Ce�S<�m��K���3�<��;��E�����ZB��f�����p�d�(�����������y��b�E��$�[���{�@�k�qTD�.���t����^��P1�C���T�1���6>����A]���,�-�1��p
Q(D?C�����<t��0	+����^m*+��@,�'ED�<J
zBi�e��TW�T7����Oc&�$ 0�y�I��0 � L�Q'7p�u�t� ���B��D���� l��T/���E�������t��J�n5��P3�M��F��$1�:p������X����w��eI��$�U4\���5����4�������~�
�����s�Q<�k��R��\��8�r�L*=����g�{tS��R���%�}�
/��7�#����v�!�P��l��f�Z?�t��N�@�W���An7}������X4�K����0�P$pmk!]!8�U���Q���V�Y�_��jl2�'t�pu}:�u��vT<XE��N����p� \#����Y>m�Z�&����Q�;��$U��B��xs�/�F�O����e�X��8�����;#� �
zU�H5u;[�=�MBVS��
*��>��w3Y~_��If����A;��t�`��i��Aw�>~
U�?P� ��9�E���
�m�#|�Q	+��#�_����!��������<�F���H������|�#=��]c
��m���l����?���'��bRu*l��J�B�������Yu�x��|����Og< A|t,"��PcyO�D��8����g~��]������S�n�QD�
��A���p��2jK�c�(<�pV�K�0q�|>x�p�*���*4��������T,�r����-x~��Nh.�@���L�n/�x�Z([�������*]&���SU�x�`0��B����M������74����!�	��HQ<���-*�ir�Mt��F���>�\���;]X(<X�{�n��������U��N,��m	�7`\�_��6U�@�fA������x����`��0��v�'�0�@���
w
��-���'���vhI�C�_�D�`�kt��cSD9"9^o9�KP*Y	�*$P%3!(�B�R���K�P�:�%!�1�<�"T)��.x ��Q<0��3�����.�"�/�7whp�^�.�R��-����P<(R[��F"��6�����]���<(��P���>�R��pys�����q_i�m�MI�q�{�y]��>�M��Bx�������hm�-Q�����(UT��,���y���<�D��*��r�������;��O}���)�&<��	iCz`��R@�K��P�|)	?��.&�HQ�
t�`�[q?�Yy�s��������p� 6��l]
���N�;����t#�F�g���r��O]��2d��Z.�J�`]8��n���� .�<d����K�x-E���+�Q��k���W����z��?,�8�?��0D������Bd0O�L�r�P�)�L��!��G�����L���U��JUa��K7�w������6��D�B�1q�J���N�5n�;X���Tj?�j�|tY!�_v,�!O��k�U.6]x|K�]+I5<|�GZ�@�_���t�(&��M7
Z4�����A�S\@���?%����������]?#�E�����6�T���7%����(<y	wB�a���p#� ���������T��.
�(<��\���:��
*��xxv��5�Z�����"�c+v�$��UV^���?����n!�������zA�l��KbR����A�J�Q��'t��[�7}Kk�y���}��#�hT�<F,_*���!#�@�[/�&%K��:hQfv]��
\�9���g�����k�����"J�P�<�	�:&���+O�E����,{��
`gN��V�m����g��#[T+;�o{"'�Wp���T�@��Vv(�tL	�����)�U�g�Y/�j	�j���H�:��M��7������<��89F�[�+t��DQ����(�i���6e��H����V<��U��#��l�����EW
&�����z�����E=�+T�7����T:��2��op� ���H���B��**�����"�����]<�A7�)X��.�z��vsd��,m����U���p!�c�I�8U��'�5$9���Cf�B5@���p��i[���Z*x��H_���RH�n;���>{���<>�U��{���\����H�����"����O9
o*����Q+=S���p����t���d#
�7�dZ�I��t;TA�u��t����� ���B5h�v��
����Q���-YI!��x��|5��u��T���@�r����p����M�?{�����S�"��|��K������� �08��B�����9��T%�5�t3I�����_qw�Zn(�w)���5^�j@@,��~�C��{��2��
�����J
��V���c%� B���p�*����B5�������������;��gy�������Qi��RJ������S����L<(G�����E�5���448<0d�)�.������5�|��}~��zA&-��j�dy"Y?��n�+�`���z�P���y���aH���Ac�w��u�d��QQ�Y�0A���g�N��������:�=	E��(��K����EQ��Q�*j�H�����82tj�4���*oaZ��f�"��u5B\$��a. �x�l�bQ�&]0������?4h/�h&�-X8[��r��4N�) "�����+A��M�\_,�J
�/$/$	�@(7��P&&^��IS	$�������~��r����*��:����#*�0t�p}�U�T��?v��pz�A��C��'�5�f����b�-��%�S	A��p�����Uu��=��T�����|v&o��[�T��)�z�������5��U�>��	�@�V�Z�������}i��f���}�H\|H��nf�sC�q��b&�I���c��	V�-N7[������.�oO����5��&�ohE���ZS1G�qE����f�x��&)?n���?�bI��Z����6��4e�}P��*9�s���;���KG�@��{����F�6�v�p��$��S�{�����������<����n��&��l!����4/n�Y�S�����Cy���w`U%m���%*i�
**6bw��v�k�k���vwww�(6(-��t��;sQ�{)�~g||�{��;s������}���(��L�-��������!7����g��F=/h>����a�J�g� �`��\bH�E7$����sw����+Hv���xC�	���K�.�{z�Vvp����o�:�|�I��	��)��C��_�y)�{<����i:�	5���DdxJ���w���ju;�=>�3r_@�\x�����P�nP�^g�=���������Hj�p~�8�J����
M�Q�����R<xO���`�9�����,���<� r��k$K�be�M����h����o����d}�vJ�uK�7�R��~��7�����E�2���m��Z*w��D�*?w�+�r��d�F�N�1/��u�SZ/�s0���.H�%7�k;���S:��\d�,�����A���`�g\��`��sIZ�A�$#�6�Y\���=�m9Zhwm?��A#�;���Q���f�5���-SCI�,-���*� �+�q� ��m���X���^�nK�����`���4��"����q�|�%��$d��=���N�z���H��SB`�X��C�r���\2"�+05V��$a�� ���d9/���GCJE���NG�P���b'�0�d�������zZP]�0��)0��y;m�m���pl]�n�
��~&��6��#�d�M�����R�J���&H"��l�}bo8���g`}����~.��Z`p�����:��Q��&���sG"�*�����t��Z��k���p�l����	���S
H{��/��wo�D�;<H
D��[���2�|Mq��j$`���h�� ������=�p��Q�a4~)��1�_6$'|2��\9#����Xp��
��\Y#rWs2*J���<)%T�<`s�Rf���F��@htk�wRsj�������	�.@ndh>�@ Ev���}"7�@V�,�����T�'��=<�Q!���.0G�i���w�e�_����8��7�2+`�J5[�dpGr���!���M�m�tL!��J�����HMF��"DS�T�'>��w�����	�wrw�,9r���zia���
��I-��lZ�������6V����]�p�
�d�s����Cx`\��z����I�������\��0�@S�,�_��;�kRsI$�?w� �m�/�y������U����e����&�{� �����zD���RJ��x�O*-	��B��xtn;�����x���x�UN����vx�7�3UX��IQ@MO��}>���X8j���`^�-�  *:�87�-�U@r�@����S8���|e��q�����R%�����i������AUW�+��'
p�0��c�5��v2�
4qmi�b���fx�%-f���B0���g�5'��	\���7V�F�64�R�&mz����h�C*zd3�v��I �s�������A
�J�~�\��������'�[���
�{��<HU!�?�u>�?���"0G�>h|`���������CHz�]3����^�����n�c�x0��y:W(h@��
��/��A�N�RVp�JG�����Gf�	<x�����e��J�\��d�1�����^h�CY��C$	��e-�?���5�4r�$MNo�a��������zHN����L�,���LzO�S�D�o���~�
��7��Vw�y]���I�mi�;�����{�u1��i�����Mr�`P��+$G�#�+!}x\(�+A�m������=K����d�mC�+�q���>X�KmX��+7���ap%�������'o|_<=/�@��T]-���L����Uh�c�-�Z��m3h���xG'�{����E�v<�xP������;M	N�����ge�c�U��'����
�(C��{���8������&w��Jkn����{�o����p5]����xhX(���/��R<�5���G�-�����W����.����l9}�|R�k�x��_N���M����50u2���'�zU*kI�V�*A�������s,0��Q�,H����d��g����gn4�fPs��I�����\���y�?��_bH�m����l �B����}g�[�-�Cp�gDJ��������i@*�4X���B.g4�Kv���5��Lu���IO#�����A���z�7*Cs���jG�x.4'������D�Q	��mU�
hr����=���\c��'{�������h>d���s�V�tR5Xa��w���u��G��F��L���l1A��W�z%��N*8�r7,TP���:��UX"�yU�����0$���!;x _N��;��g�cD����������fMk/���"K� ������WoH�`?V���*=�.�d����X62������6a2����"0�����-&6/��8p�J�D���h���O w	�9*d�Zn`������
���5U�����>��V�����V����5�x�Bh���j�06�����]�����5H
W��s�P\�&������'n���q�(����Z(H]�
��4��<������LX�8�)'��8�+���r�P�e�����Z(�:��������WTi�r�PTe:�\\-:�d����dWlI����d�xP��JW	���U���&������THp���ly��TA�7]n��M����<�Y���������.����xPJ�\�j�*��<q^��O~i�����������#i���I�`�%Q<(H��i��Z�/�������w��*\M�����e-��y�eT����������*3�|��Z�+�����2w<��g��������������Z���������������[�������2*D��\-H���c���d������1C>�c��]X:g�����x�����r��Ec"��C����Yy���}�&p#���D�1lE��������U��{wO�:������,�up������r���\����?�i`��tb��:�e�����+�����K���m.���A<��Vx���� ��#n<�R?.����@2[
��d��/��g�����:�;�ZF�P#Iy��H'�K*�AIY���#���Z(}�U�	�A�6������o#���
e8m�'��A��[�*#f,<�b��<���t���S��u�$7w�?x��r������L�]�$	x ������Nn2�	�(� clQM���-������x t
i��|��x ~����F�1� g������?���q�$�q��R�������!(Hl��O��xP��,���d�]�J�<(M��G�E����o��5�|i����~UZ������oU<�VBL�?�x�C�/^�����)��w.<��Vx ����������OZR�A)jI<��1�@b�}<(z��@�xPF.�E�����Y�����M.����g�!�x�S������W��[P<��FB�Y��3H��@
��� �	����K
C
g?iI-���%�@����MV�	���mZ9
�A	��!�xPJ�f�WK�7��o��5������
�z�A�����m$�,�xP���Ok���@�)S���?�5$&&">>���?�5dV\h����?Rz�(� -��4�Gzz:BCCall\�M�C�����=�Bcbb�������R�������0a�Ph�����DZ�#�<�pHK{��b�a���4\1$����0?,��Q�,���'���!���G��a1t�Bd)
�v��rHC{H�|����xP��MH��g�x �?����A,LTl?���� .JKH��!
�!LT��g>/iiaa��}�(s�����K~ IDAT���W>/ihi���������A��5�����aQ� -�a�^T=�h�������������h����EZ�C�#xPT��h����H�n^<^4�$�"X@�,���?jZ���W�N�2�qX����Ru�III����)U�*He$m���Q�i��="##���
%%��6Y��_\�Q�c�4�;���a``P�m^��QV����8Q]]]�E���i�?~t{U�J�|��Bh��������#����9H��!-�!�G$����"�=TTTJ�����-�G��T����d�,n)�>���=A���O��k���'-�f)I������%W{��X 
�C�z�������������k����A��%!���~v����h.�,##���\jj*�����KQNh���f��b/�:PPP(\F?8������>}��+���~p�(|�B{��E�{eAYY����!�H��!-�!
����i�?��=�e>����?�1�c��|��������=�e>"�KO�����0?,]}J�
�Q����������2���u<(�O�Sj-����4W���B{�����JO[��HC{�\��OIK{H�T���������������"������g�����-��z�jiy�	��������'�KW���B{��a~��"-��4����G~�|]�c���Z���oZiy�?�/e��4L���j��S�DUh������\V-x�����r��@q��������3
�����4����a��qq��������������4�G����_)�e>"��G�(x��0?�s����RZ�#xP�C�S�@1Y��v�HN�B�$�|(pIq*������O!����x����:���������5��k���O��/Qiii`�v�o&O��,���It��D6K�q"%M���0V�M����Ih�U���!>1��v,��L���W���be7!����
�������,Vr�T��G�*�G�F�����y)i{W�
�oJJ
�BQQ��L�1>�96�O/��!�!��?@&Y����y&^BB����t���z8�SS-��~{H��7	���P�]�����>�HOZ}�*Nq�G~��!����������<Q�OEX�g�������bF���#�%�,����e�<�K�����zi�b�r�G��=��p�}c�W��%J��am��
�5��Z�q���W��� 3q����7\��%����JK{��O����D�G����m�O{U���W{E�B�i�"-/��Tu#��q���|;Is.�t������?�}
�tW�*�4���3�Uq�I���8Y�t�}}�������Db�=$)D����R%[��$�����*�m��S�jI�F��Hf����P����(QAY����9I�L��?��n&!�`��6>*Hy�f�Hy^��d��-���@����U��O���79kX����@l�o��F�'Ee�����������^��m�\�����B�������a��M�����2Q�E^��Z")���Z�W��2U�J�~%T��+&U�>wG��
%�����Y8 �@�`�a��"����94�3G�S��z	i�*82��C(����t(�k�Y27QK�[�����B=K���3��V�1~��RhEi��+��JQ�|��\����EY��NSPC�nQf)����=����]~r(B;"HIRs���O#K����������VS��VAP��K�t�%H�V�IDY~�-#u;Dl.����v=�>��y�qX��Z�h%49���1��/�������)���
�#���Zj�F��8W�w��ET�{E�k.N���g�+p��
�A~�,PJ, �?�!���k<(�
�A��5�\���u����_I�(�%i��+K�������uKo�xPz��g������W�z
����j��Y����h�YT�	�A�XR���xP4v�6<���R<���(��h��e����Vb����������**Y�����N^D���`iV�@�>f�_0��Y�go�����ar;��@hX���@�4,PB"��Z@~|����k��TtdaR[���_�I\�T��A���E#U�y� #�4��#-�Ue�� Q�����#��IMl���;�m_���������U0��:�\|$Q���V��hS�+n����UL�����Wm�"E	,�;K���������~�VA�x�]�@G�<�����`/r�����Jt��:����a��(]fd�����/�;9R���h��R���w�hWE���%��1�b������
8*#5��Ue �.�����������	H�/����c���;����B�QZ�Z����)j�@��*�;�"�'�Z��;,���j�rJ�W�.J����Zb��[��1��>���P�n��C������a�&��������^my�,FK&_\��s6��'O0����-��[��CSI	�<�W��^���ZYZ��G��K+D''�A`�X�(n����!�Uo��h+�c���b�+3��f�p��5���V�t������%7v�c|$�hI���v~u����~���F� 8:W���T��I1hg��X���z_�3{�b���X>��Du��/���`���%J�=���g$*��.y�����G=G;���d`*�5�>�k���l�����s��1�^��dU�4%������h(�CKI_��������q������(]f�����?��cB8�hQ�i�qsI��*���<`��e������l&;����o����+w�(]n����X\��?����}/��������0d������D��{�U5��*}�d,�TUD�J�'��$xPmQ?������"��-���d�b����!�����nW�NhK����,��#����B��w�i�����M�Yxyf1������	���NU�L�;������8�-0���w�#{d<��t��<%��4o�����c��SX�h�?��U[1i��|�d<X�n'&������<
U*Z���E�;��P�@N���/�����8������KA���m:�����;k���Tn����?�c%��d1�iM,����5����,'{,����
��E(�+����0~������<h�h |�A_���<Xr#������7���0-�l��^��WP�FE]�~�>�T���W�E��?25x������A�D�@Ai��0�Ck�:q@���{n��;${�C�v�T��G5����R�h��6p�=�(n���];��
S��(S���������{�G�Cs
�^��?K}K#xp��!T+k����?
x ���_F��=��AR��+i_�u�������zv	6e+���\��7+nHl86�?�9-��x0��$,��N��~8xP��
6����v�@�f���_��g�8}q$,j��3�5����~�FxP
�9�������)��ME��j�Y�[����(t��yy����F���c�<�����<0�.P�0*�AFt���z������P<P^I����'q�Y}��Kx��_v}�������Wn�C��\��PP��[��9[������}�����]OQ���T�UC���0�o��!���E���MV � *:��������y�������l�U����b����u�1�e��n-4�o��Wo�����!9%�+�1��?k�c���p���y� 11-�����Z�
�jjh��5kX�+IIM����1fH�����{������(tk�TU���		��y��^��� ���i�M���r��7��9#H�B}�i�����Fa	IX������a^�	����{t��!tO�;v2_�kX��� ++�o��A��e�t�`�D
2�}</�!9.��i#>,�N��)	����"����4��`MDd��������}�����T"���B,�W����!i�D�����pID��:�3uy���@M_�����X,��`�J�e���I|��z�t�.,y���eh�y%�}&x �(Mcy$D��\-R>�@�N��D���v�x��wDCK�U<����6� #'��co��6*+���5�19��"��0�Y-h�(�	�D�{�96wo��q�X�
�����eY������K|��GC�2PU��%�����)��F�\G�h\y�!u�PAO��0��#T����:V�rq��-�������{n�����}�fe�\�<���e�����*$%�z��$`%�t�a��fFHHMCdB2W<�RV�`�{9��\�<Z��p��ee���S�Q�F�������{^�6��kb�m1��c�&�qBN����_:�������PL��L����1��:ue�k�5���X���hY�	����s8?{/��uC%cK�}|-\��bR���._	����q�M*��N���2�s�(.?_e"'�YmEh���}%�vR�F@{^M��O@�����9�Z���������@/�@l\����~8vt:w���	���+"����p`����vv�@�CZj2�K�j=Jtr����xs�;���t������3���\��V�
�������u��
�@/7�o�����LoR���#Gf"4��z,���
��pyx����^%��gjZU<z�����S^&���4�U�h�h`��(�v�g�7P���tr?���O_]�+��U�	`J��hRc5��x���hc�\G����V�S��K�� �l{��t*�+��0����+q(�!G� XDc�R95�$��tM�:���w���l$�2-T�2���a1@��H�y"�20�����+���
�?!�l��)*�r0��9Y��G���}4��!�cxo���o"��*H ������0H���x�T|8���u�@e��(�{K4�b3���T��f��"���i/
����*c�y��
e��7GQ����A)����MYT�Ee���X^��:�.�sx��!K�����MkE(�s%������d+Q�E��P�� E6I���������"���*Ao�-h�D��Hr	��
���!b�s�L������"f�'�]o�=�g��jm�##>
��Y1�)����=��5y���A��PG��1����
�Uu8������Z��iT�zD#f��/��)�v�G�
"8|������	�jk���������
�wG]����7�V�5EE�}���u:	����������-�+��mu�������iC-�;��y���a���`�����������k��&V���x�g����-yv_�	uS5X�2A��p����x_�?����_H�U��1_��i����z����Z�M�"h�*��hA�g[�^����8z��������G����t��_>�����H�����_ ����Jn�lN0�^=� W���	X���
�[�{J6<}��U����;��������Z�p�����iS�EEA���u���O���u�]G	�aa���%*��b���_��"U:��Xy����?bX��0VW��
���:u�B�]�>;Ie]y�����O�2"����+������A~����<�/gM��N4w��*�4�.�_l[����v���������(�}i��1��*R�rD�F�OIDrZ*f]Z�����������,n�}�)M�CWE��H�0����W<hg�a�������@AV�C����I��9>��QY�s/o@db�Ev��{�������x��8���b�-(�� /T ���.��<�c���g�1=�2d�Ey��b8
O4��OC�,�9t�����P�8��J8���K�=�x=�X�69z�#�<x�s[���B�"���mY��l��r}��G���^�/��^�~���'��Hy�����t����c~yE���k�o�6/��n4tI1�m����A��wX/�V��wq�><��}t?��O�!�V����3PN������7V�4����UW�������j6ny^��7��A��S	�ZL���w�}S���f�6��-�� :1��3c��@��k���X>��^5M]D��������ay����*��qhM�]Y��'����z�������a������9�L*�,) ��vA�_'���522��c�(�3�F�^�:���������]�{�rl��?��v�}��|=��������:M�Q���-�aaU����@_����e���s�<�8�G_\��7��`��{�tO�1��z�5���i�N����5����g0�Qo������$�����Iut�q�-Wzw��D��38A���,f�e��v0����&c����@�
c��qz�@W���]^�cM}���aQ������\N��������L�n��M��<���?iL�6�D0�!S�lm/����f��t0��'�zb��sd�t�����]<����Q�������()x`W�=Dc���0�,���p��+�����M�(l~��J�V��&�������b��&�8��������	������W�p��&9����6���^�?�o�x��BsxF����]�t���7����� ��[Ne�C%���QI���x��A%]K��4�+�^{0�>M5�������U7��$���|�h���.��K���h"����~���0��o.���*���g��Y�+�/cC�W#����F��ABw��������p<t��x�K�����rK�x���.��F�vC�&hQ�
&_=}��9�<O��Q4��0��O;�mF�J�gK������2
��O���6����&����W����w	���}uP��B��XO�aT�	��|+B������S�]�
�)T0�����+��>[���pk�c�q��bt�rX�����[�-9�ZP�S@�� K����w2N�k 1$/V��b�2P�Q��������~�;|P�2;�Z�H
�����^~�a!����y��G� ���������th�{s�^ZX�O��m'
R��"����E���8K��������<�,���"B����J
Fe��b�q�|:����G�x���	5i��^�{��Fq�
Z���@�P���g`����p�k�^+N"5:5W����0(��������{ dh�s�6Xm��zx�6�;����\�@^]�������W��)R6��o���.��Riq������$|�x�)1��O�,�����	)o����1�[�M�!�����{!���O4�W���W�"��/T��B��h�/��x���J��N��q���ST�G����������2�Q����!��2������Z4�v<����H�E������kBkFc����wde����O��b�)/�E5-8[������#�aR�%*6�����\���h4��q?@��/�-���g��z=<��L��h
�,�����Kb�+/�@AY5����b?����fTi>
�zf�D��g���:�{,EBT ��k������ydi~v|.��/BRL(^_Y
�Nsp�p�x ��Fi5�}����n�������1/�@QWV3M��������Z�S��6���CA�����za>��Wa�1�
�n]
X6B���B�$|(wk�:��B!n�*|��[Z���g���H����;�:�3+��xI�����Wn���C�f�>rg��/^G�v-���I��KWo��	�����w=�}���;�7)0������K��34	�w��&��Z���`�������A�>�Gb��`Z����4�o7��E����i�f�h�j�s���%mW�<)�@^�����i��110$��-��r4h�pQs;L�M�f�ix�m0M��L���Z**X7��o����68��%Ri�2� ���c��k�2eJ
�xP�&�Qi��	�2m�$��Nu��z�3�u��=m>?OB�4c�Tu�HE@���s���6E����j��l,�v���=���^��I�6h���(�!�_�6�t��~:uj��>�O�|o�s����|Y��["aPE	*�R�G�������m�R]sX<�[	����'��A�]�b�����i��z������5� IDATj7k��F"�}du����4�
<�PR����a��;p�X��?��OcZD�E���1F���	�����Z�����^��T��0��mZR����x��U�q��f9�a��'���20 `H]k{��q
k@����}�wQqXO��>~�������E���v<��&*c����J����7�$��W(����f� �@��9x������}0���������N�=�������rk�4��.0����6�r��4���������X�N=����`y��E<�t��;�q�T7��U��8r���7�Dlb��l]�%�PF�S���8Z���q��~+���s�0��0,>���aJXt�?q�������P�!��6��
����V���\�|sZ����#(���P#DD����m��P�$�b�������$\"0AW�������5<���
t�6�����FGF~�=M�
��[�Q�~o�8�'A
���%7
1�i����'��6-����GG0t�.l�:#F���M�`U�	�������(�cGf(1�������1�9�1��Y-C�4�&�����)F������#�+;\�0����o�aD���	L`�AsK� �i��8����4�Q�*+r����Bk��$�����AW�?G��<*���yE%�CcL/RX�&�imrO e�e��wu��q��N�[���8A��m��y$A��"����
G�6�?����$����{I0�x�����
�	,c��<`����
~�rAQ[I�=��,�A���9���#�C
��0j�J�@:-|�L�AcN��LD��p�;��=�-���-�����f�'8|���?t��5�]2Pi�YXMqda�[���x~Yk��q��X���[�P���0��C�\�!�~2TM�a��Jy�p#)$��e�B��X�vK�r+���r�Pe��G@���pT
!��x�������Z������,� |���N��!#!
	>@{�5����|9U��*���<�7V����t[����>=g���I�]��#<��fG���*ZP��Mi�������=��s9�x��7@���t�L�&7�`���0��	���!����
�����p���n���-�����f����
R;h���n ���xp��'��c��~��ez����O_�=�,��;c|J
��p���<?V���r���7�TW�/��eCe���r�Rj�/���}�'�7)�Y��y�[TN�A�S7$���v�����
���*M���p�
���;��hb����G�F�'��8�?��3H�P��A���
<�������r���p��k[��
�K(���.����������'2����#��CUU�|q�������
��;�mfr�a���M�7?{��D3mmy>�F������7a@���Q�8NPK�Y�w��5�@��os�6v�<�5DS�+�U�Hs�8<���$�F�rA�6�	�c��i`���Y��6��9r����Xu� ������#�?8�������4��\0P����G�<D@�ld��m��Tc^s���6�uU5����U����1�k��}F_�=�a���hdQ��6=z�L���I������?�l����Z������=������a�C7l�kZ���Al��]d�w��Z��EE��
�L�4�R��t�0�Ng�7���,{�#`a��i�V���5�w���:N����9Z�6N�*�h`e��������"�7�C����ez��w�_Lk:�o�^�y�
]f`��yb���"~h�B���31`�,���^�����"��;�nD�2Ua�g���0j�����Kh�<E�4�r��{���� ��q��W��g(���^�7�^[F.:(�xd�c����V�{q#�M���i����A%�l�x����a3vb������#��=�n������v��	KNa���|������nF�����HJ�����3:CK����7��{�����C���GW�U�	8�g1b0fP��s;����r���1�|0~�I����7Gy��#�@��9.Z�����)�0h�&����c���X6��X��"��~|)��i�����^�����>�����f�������G�0�~7�%�F�_k�T�@A��uQ���	�u��Sn7���#.�=���U���J}�,0�ng�;�W7��_N�����~�&���+[0�I,��w���w��8��]$w
�h�V���g" 2"X���=�y�G���;Y}��^u���o�FkkG��}��F���-G���|L*I��q�6��0T��g�>��e���~t�j����>���Z�h_���
B��;��
9(0�q<�`���@����lza��#2t�g�*�'H�+����mh�����6:Vj��i�����?sq��[������|��E�4����%�r^@���<�M���p)��`"
S�-���������3�A�I�������X�x;)64�y��Y��	h�Euey"# 6����n�I�K�i8�^��q$���0��,o1���S�l�Wd����)r��x���>^}|�>6�p?�6��;a�����i�MF���smK�A,���RLl0�������?�n��>)-	�F�h.��u9��O�5�vy�X	�Ho��~��
�(��S��
�p�m~�7��m��qT��c�������F�?��BxCK��q��Yo6]���]�D}���:�����r�����&^�~��Nzxw>-�����$#o�����|a���^�{����-x ���Js��c��6n���`��^����R���<H���ZF���'��v��<#���Z�"�`�D=|�w���t���������Y`���?�N��W��r� �������!8����|g*	��D�1�|���7�����oM�N���'���n�\v��P���K���6�f���P�\(<���A���P53�R,`�Ag!���d�A�\����N��n��J*e;:���S<`�����`�����X�!Jq���A�+={�}A�����r�������##.	��B�e��=����p�4��B��NQ(h/qF���������6d��u��^PI�W|����w���!�#�"f�-#0����dh�=�dT	~�h����d���t>���L��Tn���������3O�/C���pqVO��`0�w,@���p����=���O!1�c������xK��!�.�4YV������i�<^��u�����9Tl8O��B�m�Ds� ������=cP��$�{j,g*4���%w��h0pKx���ED�{
��;pw�����<=o��bIB^��^CM����g]0��{1
��W���P)O���c��iKk��t�{%����p�+r�PT��� v�2����A!2�v7,�9��^0��=�!}�q�A]�q��ssp��~�.�����)87�OP�)������@�z�����|��n��S��K4������W!�N1���������}zt�Q�wk�����}������t"�UI��W�@��<��~�����~6v`��y����	�n]�6u����}�fX�V6����.�t��G�����k�������IW�Irt��lq���:W4���F�)�����&�H�����3��>Zp!�j,�#5�g���cP@��(?�tpcd�O���U�N��`G
	Lm���Zx��N��^-�Is��L=��c����mVk����cy�9�����Or��%#�?� e�HLP���k�/A��o�
E�v�E9$�x��H:��9���������7h\8��]��%�nW�N}�?�$/���l��\���jA�����>~?y�I���T&�`��'���8C���)#u������8��N���>�t.��7YZ��������wm��g`Q��<+CmZ86���\g{^����i�9X�1�Lia��{H�����$���2�S�����8����B��-���#�=��������2�w�[��
����UQT�BZ��c�h�9�������=)� �_P��
�
U�;�����c��&���$�����=��P�^����R���+!f�+���	<PS�E��c����KW�{�,����D�p?���!93�M�7on ��
x�J�����������r��q�!��@9���������~VK`�t�<VVMq��:<&����(�[�#�N9j�F+�o��X��T���e����LLm9����?bh����b]����P�����gXm�$�F�,W#�M�VbD�B@�?-�1M�N2g�E#Li�J�2]-��L��%�oWi������t:?<!64������zJ<��,>SA�|.��tN��IN�Dj�t6�6�������P��'H���I7�i�e`S@�'��A&]�C�5�2CE���!e6�1� 3n�.���L�PB�v��@�ak��
hTR����|�,���_M%���`�8�QY��(����6���p�����s�����T���������@���/�����6�P�T�T{f���HOG�+�s{R��P�PD�Wjx�U��D>����*W1`�SgH�O��:BK�4f��x�G�|��eH0F8-@1(�0!OW�14�U$m���&�$h���
��VA��p$?�B�k�����!H����S.�;�M��Lq����N���#OK�������u���_�q�N{�5��!b�3h�����|J��!mP��/f�In����7��w��x�.&�v�r�������=D���t�gzg�=u���������`����75A[�j��w�����P��Cz���G������G�]m�(�(�zTE�)�d�}{]�\�w�7���1OH�C��BN�S:�9{)~����	�+�#h��������v��Y����)����������`t$�"��-��~��[��
<`����rp�f@m��`=#	�ml��!�"+[[��g�S<`��({{�y�6jh[�������0�����>��-Z`��kY�Z��s��	��IE����|������"�yx�A��\!���y�a��[���	HX�����j`���$th�nT�t=�XC`�) h�&3�F�����0��3�m���{O��zf������:@���)9y
����
���}�lv\A���u�����B��	c�������A#�Z\���Q�;���v8���J���X�Tin���D��`C����fTm���o������"`����I�Ze���}j��*<��F���NR����>�,�3��6&�+~��!�m���a:m�e}�����}0��\e�!�:g�����\-��j�N6�q��}�������D���vZ�JAo������&���?�V��&�_���{Q��9xK'���t���;`m\F���:s��.N����Z�#�
�����i^u�
<`ij6h�������xx� W<`�!�1�\���+:�����
z���L�g�Z��
������
"��j+T���
^�
�J�e���)+.�#)0�!�����������in������4����8d�jVW�]pk���+{I��A����?�?9O��!���~�6�cHI�k
'L<�/����E2�6@sQy�#��s�qjW&x���D��I}3[D$DqW���f�1���>ZLy��
��S�I=����_2��1
��6?8�����$a<��W���������,W)��o���L����KR�{���-��8L.5t���I9!9=���:��Z�����)������X���4p��)��/�pw	z�e����sksx�w8�}��C�k���4��?�u��U���He��i�����WP8I��PR�eTt�@�����������A��uQE�W x��L���k�")"~s���������\mT3��\�_�4�U�J�������QU�2�^��g�e���[
��F�j]���:�G����HI V4N�J��k���	T0�EU�<H'�������@g��6�����R�Ux���~��K
���B_�����;q�`��M��8��]���+t���}/wRL�[�s��r-���y�������k��b+��b�/��b��M��k���X�����:�}����J�hm;��qe6�{���X��=�m��Z�3x?����9�L��j@9�VS�������q��+������6�����\-�8���S'D����+�a��~����X����������{e�z�X�/����Bs��J �����+��ip$�V2�&d�ss$������"e-Z����A���t��B:\�E@zq��w$`���DP����8��.��;<
�H�����x��&T��a�^A��mu��u
��*d�B�{���H���a>���@���<�L_q����������	7.C��
��I!�`������G���c=����$^��
�!�M���u�@k�Z3� z�H����l��*������
���0O���q� z�����L�
�����l�@��	�Seu�<��9�T}]H����<�A4������1[/<��+�eA�zOF��[t�.�+����D���MA^�A��#A���D0�A��)_���e�rP���^X;���#�a�4i�P���L��q�v����Z���H������q����^�">����y�Z��S�~�����w�C�2!&���-5�����IkE����h}����JP��)j!q����[�W�n�/��'u�6P��!�m84������������}�B��
�c��������^�;y$���N�EL5!{�t���3&��NK1�(���J�D@�td��������z�����zW!|$X@2�r��Um���!��
	 ���rT��B���be�:�{�Ib~�����BM3S\~�
;G��]�������S�x Y{w��
<(WK�@�d��)@����F~&x������$X���[R��)r��BN�3��)�������5m�e�')x`������PH!�)*d�>�N���6O�U< �)9����x����/���R��Hy���Ya����"�Mr	�n����X��!f����vT$����������t��I���k��^��x0�^Ul!w�������������G�����A|:U��M*�)������j���
W#I�
l���M��Cv�`��;��s�� ����]�$�Eu��
���,'{�}�����}��7"��4�z�V��3�����Dr�B��xP��a{K�{r
G�l��u�1��"0���;R<�I��aU�"���4����gR`�k�:)qb�u����p��
v��������A������^q�����Bu��LNm<��E�b:�Z�S!` ���,+8p���A�z��;�<}r���;;�������S< ���RS�(��76�~�>8~l�Uk�]68:���gg��j����j��i� ��������Q������=q��<^�����cORba�V�r�)kx��`&�x�K�a�z����<��Q�T����x0�D,V�i�K�x��vo����6��L�JK �Z��@e."�j��$%����D���j_I�L� ��h
ZD��M�8�{�	9�"�c>�MB��j�H������,`!'�cR�a.��|8C��"��-��JH�c��0��]�kh����A.X9������d�d�L� �T(�BA���\A������,�hr���HA��)2!����� ���)$�'�����/��V����)dW<�*����G��=7X=��Q��EF���\m!5F���o��������4N� IDAT�9 l��,�@���H��<mH����}���o���W<���/�|���H������O`��!B���Br�QF���ANO	
��'�
&j�HL����;s� i�
<�W�v�������C ,����%�:b����x���cb������-YN����G�-�I�zH����r�w��+pt��{.�E�f�8�I-�sXA�-����er�#tkjC���^Eg���m��`��0r;���{���e��x�@�`���A��m0��{x��.�W��Aw$<~yr��!4Z7�<�b�N��\O0 !��x���j��:����o�3�	<�@�so�\!461�[:T�D���#��o�k�d��c?<��
��B���
��A��H���]Rv3�w���B!�����v30��d&��	D������nr���Z5�����nI��Bp�@������^��dm���q&7<I8��6�w���Z��`�* X���m8��6��m�O�W�V�u3�H��y�{���=����s��JN]r/!*��]X����L� .�\4��?S(���.'��v�����r��x��`Sr��	��0�N����l��-����H��Ww��>ge�U�6"{S��$��2���t�k�"w`�����t���t��I�V�����a�L���o�Nv�R�Y���$��2$_o[�
�t���_l)����Z����
<`*����Wx�������s/Or��fV-q�`�:a��E���*���	g^��D���G�����{y��g����(�c�����
#����m�[[T�'���.<�m�@���"0����+R<8M�`lf]��|n������>�R<�3
������s�?�����������8�w	W<plE�N*�)�t�=#S�?�/WVX9�_7de��o�x��:� ���� ���LA� x��z����{�amd�U+3����)0�*g��nZ�6�]$�w�xrR<qd!Vw��K���y��������a��1��`j���B�����n� ��45��h22a�L��))#���0���B��V��s����[�]sa�6�;Vk���I�2�����`�W�>X��w��XG����F�k���I�j�m��p���i��-��>�=H� �)��\E���q������.�S��*0����=����!5{c��C\E��{����#w��k����{#��c������?��$G�4�H��~�W�A�:��M�P���O�VS]����Q0�`R�Q�tu�Tn�������Q����9Rn��?���-����qYe1��T��wV|�x�	,l2�]w��`�h�Q������bc��Ima!�'�"�0���G0T3��[��BA&x�6���NrW��!8��|��S�����������I��m+u���c����V<`
��!�>	4����I�����.�z�8H���f��$!7���e[��K �-*�����Y��c�n��M�c��hV�n�f.u������ipE���d4\e��}_f�Z�TE�}Q��.b|���@Ln��-x��_jV���x��G�Yk�<�"��wtX�A��VE��`m��uD��vY8FM���A$�O���r�V�\1���"B��]��E��7��_�n"�b���]:p`W��(^����"�\���]&��v�����������w%@�B��������x�Xq��"E��/���	����L��"�&7nw����=3�;;����b���7��������x`H��UN_R� !� ��At�q�_)`@��).x|�<�[�`��A�O��t�����g7�Q~�<����O���B-XO�E�����F���tm�w#=��Yq�|��9�z�@�����fL|�A�)�n�p��x�p�����}�Pg��3�5�B��>�������D�.cpj������5d+��|sk?r��D0�,�+
���p�_&T�r��+����F<����&*��U<Hn�1QH ����BQhv\��IL`F����N{��U,�<��������$�4�j��-{a��#��=F��(E����c�wP�`#�O����y��9:q�.������Da��}�__�%��Pv��9M�W�K�����d��[������r�������G�����zw�LGO��E�4�a�
K��6�'���?g����
�����2��h}B�)E�D* Xs��)��� �.R|���w>�\��z\�F`���2NUt�
p�mr�f��h�@�����oeJ��j!��v�inH����k?;������?x����le�N��P���hP�����Gx}])qF����+{J�Hq���J3���O��P/%]�\����B^�&�~�� �h��h�S�4���<l!S|��=c��D8������B B�64���
��8,��Ox]."��)J���s�u�7��*H����t_�	�|>}�x`�M�QK`�gC �
S�_�@4xP�Js8H��T�P^U�Et�?���ikN��
��-��L�,�������D^n�0��s����&W�#�0�*	"lC�6�B�@���*��4q�N�O���t������l��k�u
�@����-�p0��5dc���u�fY$Nt8�P�\[��?3��P��g�	b���[o=EW�$�P�������e<��S��?��)���ZS	�v���4���31����n�IV���#W�OL������.a���+���\#7��4�%7��0���� �S��C�������Oo����O1��x�ko��y�=��0J{�yX�Gh�e�� `�R����qS|���0f,Aq�����\K��L�f���Dc���>����E����x��
�%7�B)��m�h��Jp'``�Xo,h�h�)!�n;C%4h0
�.m�Oc�����@3�j�BOh��q�����p�8/D������)��<-��B��a�`����R<�p=�'_s�Y1���-��D+<�N'GT|�F|>}��;����> �Q��r�B��	���o}"`a���_����s^���3�t�d��,��
qT?_�v��l�O��l6������� �,��U�0$�PJ���Q<�fx�ZT�c��~��E
�S�����t��C��_n���"	�@�+��	O����e�j*^��w���FR���
doo)U����������`%a���OR� .x��Dr2�C�'U��p����swi�CJ�y� �CF0\���T�a7EqmN��#����t����	�P`a�����g��"DCl�3�$d��C8����;�r�������'�����7{���:ta��a+TI��z��thi��k�I��Z��aD���G>:�����:���Dxq�P���3��I6�=��jc���A�T��j^s�P]�F�.������2����D�_�f������������_
q�����w�	��+�E!�L2��D*��T.<p�d�^����m�|
������G�.�zq�@����,q��l�t
#��`s�"�	]w��~c��d.C�������a�'��Z����{�+0�����U�f�C����2�2��C�v��\{��Y�����u~K���S������~�#�,(���!K}�=��-o|��9�R|�A�)x���O���N���A�������]��u�������s����:Y&���K7Jh!��_�<��qq�^�A�t��"D���H��9��?+&����2e$,He��T �x ���%O��<���y���+�,�$���:�"N��P �/���c�js�P�����Gr	�C�G03��)����+W���]���2�	�*�x�4wn�C���B!���7n����4&���SXe2e�,�Jd�X�q�:�A�lE�l�#��PH�w`�����c�u�N�|w������/��C?��2f��#K��@s�zaD=�	����V8'']���:a;��[�X���N���=�6����B� .x���1��t���E��g�o+����w�)�1�D9�t

5�~e[q�� �o�_�q1�a	����{�
"|�P`a,�����jXG�P<pa��Tv�eo�=�^�����nh�;�}��=e=�hD�����C��d��I4�����MT�`�e��������������q�:qR��Q����o&���?�n��:l��ud���[��:!������{����Z��*sx �������'�GpFi�����<a���}�{rJ�U�x�vP��T�9��w�K�����������2��T��Wu�?8�5�%C�0�I�&�re=���2EB��w���fC����l�?-{N�JWk��������3�Y��m��\kF}K��n���1���*�
��Z���@�\���]KF��i=�����W���}4�2Q�����n�7dq.�"\���1�_@D\��l�����y��l��������o�{�2���$�RM�@���L�WC+w�a>������^�llL�����T((L�x�g�;����
�i�j24�[wy��"T��sN��s��.�TU�V,��,'�����*� ��^�+�@���x� '<p�pq���B$�9�������]�'�+F2d�'�����&.P
a����������s��B:,�<:/��3�������q�I�����A9�2h��1���
�Llb� ��9���)��*"	�@�+�
�Ju���y�����}��`�p��0~���������p���Ys..����~��2�B\�`��Sn�~�������xW���N��`.���x��k:~Ac��H��?/	Ld6����}��A((l��C*0��	B�A�S�0�s�D���JB���.��R�}��b,�m�g�4&��#�[~}�����:�������*�=?O^�*)1�@�SXqu��O]�@�$_��@����B��%'z���
���Q��������-d P�����y�^��Lpc������'p�-���T�{<d�}%t0��DL�:ko�`Yo��[��t�4����s0��w��0>��M<���,*�m%����[���c�SCK�,=J���^��l�
m���a��hQj8��]K`���w�x`��EGr�I|�^����n1��(_t����-�'>E�F��
6x��
.=qn��/������}�$���)����
�@��yaW�8�W���m��x�`<">���x����|xh��<:R�@�Z�._��[!�w����;v(m;G�Yi��������TX�!]3f2��.�6�ho'I�W��g��C}$h��vS�����E���*x�B��`������	I%�K���<�0�fp����c����
O�G�ZE��Ey��[z�^����x������yrt��x�Q��t�oh�@���-x2C����l��]��).��`���#����2By(}��h�9�n�[���"�x��Q\��g��iu�>`���W$ e����}�;f���0*S��]�������`T�,�����E���D������oU�������$l[�=`��u���FU8�+�_�p�]��w��/B-X)/�t-��;�t����nT��
�ue�e?|}�=1�C��*�s�������"K�Zp��B�;om]�?�����WQk�z��M%��U$x >��*6���K�z"{����lBc�c�11��ZP��h���Cu���V O�>���^����i��:#��A����'�0E�M�W�@��j�x}��4<���1O%<9�Jv�2cnd.T���_����T�n���0����3"�P*����u�����L�kh&�5`��O�?�5���fA��{Df�z�SY�a���0Di(������5X��?�M�b��w���C3��g�2��~����%�jVb��w��P��������N$<�g��xzb���X6;�%����s����q?��<w����NJ/�Je��P<p��(�44�Uw�xp���&&F�KY
�!>�@������&�zwn�t��_*�^���m�`�
�jK�T��I���+P���*U+SB��'n�u�T�u-���4� u��}�.���P��a\� �z������r�C-�V�
��Z�i��xC-h����
T��W�x��w\���Y�w�=v���tR�@G$!�,-f�����C�$��DC-$����\B��w��D�x����h�
U�K,��*��)�:��6]�&B�0
"�D����>��P�V�C-$TN�U�O���/��:���&$���*�X������lG��[�O�m����z��K]� ��~������>�RE@}�� ���RR]��&$����`B�Aju1>� 5��/�BJ�Q<HI��lt�����j!����>1�@�:��|q����_b�AZ��n����������l'5�J4�Bj6�H�q�u����ZL��X@K-���~`�x�-�'��(���'<��GP4?F
x�M�@�sM4k���6M�"$�Pb���>`(�4K
x�f�NQC
x�"����� �C7�rg)/N6�=�D��'')�A��� 9����Q�����LM��EHc���B�!<2Jb:��h��
x��=�@�sM���$m���P��-���G�Si����i�tr�|����������b��
x���IRo�)O}f�g���k��U��x����(|���x���/-[�/*��}S�-<H-�j�^<��=�������2>?B?���aP���d�K��&��N]�U�@�y�@��������jS4cIE�@3vT4c���(�	�URg�)�j�������(�A��VR����������i?���E<HKkk�-<��-S�&<HM�~�u+���;6?J��@~���#�S~�Q���
x��qT���SS�)��f,�����h��
x���@u[)9@�E<��<�%��I���c����v8�R�:<_�������flT0?Z�/]�(i�1)�A��Z�$nl�U����H�?���j���2�����"5��|�|N��t�Wr�b{�zc�be<���n?<|?�d������'�ye``�R�����W"T*�M,��<"8, E�������%R�YN����Pw<R�_)�7""J�ZOOO�?B7^�l��j�������������BU�������T~V�������jv���{���b���g,SZM����
q�m�yRc<���H]�y�>�l*��G^��3
���c��[����V1��<�/�GY���E"4<���:��_���]���������O��svD�w&�-�3�4Q�H�5+�JV�����O��S�2U����8�sN�Z�>���Gj���t�0���4�o1�3���@��������&���Mu{Zg���U�n'�z$�s.�
Lv}���*���m'������L�����2ZaG��}����G�s���m}���5��;���'g<�i$]�
H�}��k�~~d��e'+�*�����8��������6hP(L��U�����P*�J��X��Z@�e
;�N��uWWW�����s5�R���e�T��-��-_��$e<4i���%68�������������ph�x��F�I����M�i��Gj[X���a}(�X[�mmY��y���z������GR��������6K����S���5C�W�6����a��>�J)����l���������Ae<�7�S����G�m����(���T��Z(���Zmy+��~.����|k��rh�x(UM�����-��l,�|.h�mecY��"�ui�xh�zDY��|>k�e}�Ik��.e<RnCM��-�e�����z�a=",�-��6���>�����Z�e<(�� IDAT�a="�TM�����-�a�oy��<�3�#���X@-p��K�����2q����Ne�!;/�~��,_�666�S���u�#Y��r!m///������(�-�����x���@�C<;=<<�>}���4�]�40��M��������*��l6M=���������������2��)�'��#)���5h���-���G����Y"z<LLL��=U�[Y��j�����G��Y�V�}�i�;A����OY�j����-�a)u������-��x���@��b�Rk<��)+�
��-�1��r<����KJ�����o?��B
K*����O�=���&��-��6��B�jrf��.mm9���G���&k���������0��Q���|���.e}�rj�e<4i����-�?e}��y�����Q����)�OY��~�.�-��
�1��xhz�'�>mY�|��C�?���A(���tmy+��~.����|k��rh�x(UM�����-��l,�|.h�mecY��"�ui�xh�zDY��|>k�e}�Ik��.e<RnCM��-�e�����z�a=",�-��6���>�����Z�e<�a="�TM�����-�a�oy(�A���R��
x��[[^��F���K�{�-_�������0�BU�3;�ui�xh���2)����A62��eM�����-�e���������&������H�
5U��>��%5S�����>��|�T-�0��PS�A3�h�xh�zD��2�����E[���-��������J�����8q�tu�af\K#�^����dHq]��~DPxD������������v�C�j�R�vZU�-/��q#s��W���[��q��}}�D��������Zu��9�c)���K�x���E%�����u���HFn���goJ���x�*V8 Ka��d���$;���>}�����\O3�������"������8��&PAZ���:�����Ih<4�HT&>�D���K��R��y<��V�����8�2���5�::0O�;:Y������a`j���A)i2U�����9�����RB��O�B%4�����{�#hk���x�]c��F,�Z%���5�CL�m<�JM�G�E�s�T3j2r-(��A�(�#����@�������4������"��&u��j$
}O�����X�����H�x��aD�9*�����_|�H�x��}��;���?{w���W��d��H���^Q�{\���V��+Y�������
�P G����pW!gT�d���	�[TW�������Gt������Y�=��)����������G��.(�����g�.}�$m�� -����X@��������1�������j�����9�����C�k���=�7/�����<H=K����]���TkYB�p������-��:�S�����?����%��w�q���d�����[%_�������[�����)�g����sKq=�cO��@�z����2�>i�"C�����Zzu)�,��n�6_�zU���
����w��[������T��lY��D��kS�f���H��;2H��V����;�������Ph�c�und��p�{�j�+k���E�K%�����j>9������AJ.;�$-���
��b�x-�G�)(�V ��c�u>J<M�����gD;�:�}8�{
��
�����Hi����db�7�-R���D������H��~������O��{���c��!s����
x�]��	�I[@��Qj�P�������m����ig���%<HzD� i)9��� a�+�����h�������XI��(������|E
x����|�c��Lu(�A��R���PtN<P�f�K(�A���#�V���QJV�����^�J�d��A�e��?�Y���Q�p~�r���<���Jq�S���O����]�������i��W�:p<���o��SF����G��J�s(��� <H�1P������������R�A��I�`Q�!��e-����>�g����I���1��_G�U.:s��hQ�
��_�RyM+����Q���p�3����R?�3�����37�&yjF�J���B�=T���<0��Y������0������U���e�d������U.��i	T�i�s��Q��9n����C���w��6��!�adb����E��&8{��<�w�4��V�l�u�x`��O���[�OF����tn/��P�BS�[����Uj���\�~Ox{���s{��:���g �_���I��D�`X���j���
x��N��-�B��x0��B�[�SF����M��gM�6Mj#��~'/$�M*y�����������U�$���a���_��Zebg�x���_v�f*��i����
�+���`mn�u��[�Lh_�O���d��iZ� ��-��-���.bP�z}�o����v�"�26�����*��m�
�����n��,�K��oH`���.�
�A�*���?���%�����M&6��/��=�'j�����|K�����O����^	� �d��������&x`T��|C��d]�{�����D�����q���8���A�gTH������z�E�:�����`q������m�3z/������=+�:�I�r1��������^>,4��h����JD>��/���_#CLh3S����>3�nN���&�<8L�L+#]������������\�z���lLk�������#S�tp���G_*ng2D���x�D}�����A�6x����W�x.Ao���1L���&r���.>�����i+xP�f7<yx��r���'����9���B�Z�?���4��`T��V���FR�� �z��]����PT�X�/���-{���Q0d���WbX�.I��M	x������~?��%a9O��5w�Z��9%sE)�X �
x��'���(����5�;hh���~V=������N�Q�9\9�����D�����`���O��9:�����0���?��5j[��_�[��KR��u(��S~�H]T�j��{��)��R���A�u��)W1��]W/�����>7F;��+RwJ�\��v��a��ah���<���(r�,��GW~7�A����f����4�I�`��c���%���'��n�J�������F+���+���sx�s��@W�+6���[�~F�-�
��O[����n�����z��tFl����I)�N������&���,~.�7	lg����~nk��A�����y�/��g�]^���s*��9���c�<0�7����b��q�SL~l8�w^�~8 ��%���c����N1�[��+�Ar��r��z`hQ[,���x��jS<0�h�����x��{D�x��,�����?����0�&����Q��@��������I(�2�%	�����9��N��������6������\�/��]�L�x���NE��\�	�&7
��&%�O����Vb�����tMn�b�)�A�)�x��b������5�����Y2#c�t(�������A?���+JP�JE���1s�*XQy�>C:��d�P<��`���������k���)��BP�r��_������T+�"��N��x
O���@ �3G�
���5�v��=xz��F�2)�0J��T�W���y3K��Zw�AI���jn�~��0�y�t0)���q�k|�O:�u�Jn�2_���V�YR�=��7_R��\�1�y�f�� ��*!� ���g��S$L���I���zNyaR���Lb=��g��X���{L���11��f�����Y�����7��y�d}d$���
c��c(e�q����m�Y��(��N�n��[�Q42�����o`j��
Y2@���EW0fk�9��??��M��Gg�<�������A�����b��c�;n�yyb*
�T��t�G-��CV.@Xx8F���5�����O�����sCB0�SO�hp��c��{�	��N�R�%01q�_(��K����U���K0�Ed��������cR�036�c��Xw�v]8-�R�pq����F�����vi�a����x*'�}[ ����m-i�7��Q'���5D���0,�F�]�)8���p�=���0m\	:�F>~aw���E5�X�r.���e5�x`X�o�z�������.�_�������^����*O���0�X:�Q���)V<�T�	*�*!�i����
N:����{���3Lg�����>�����gPb�j�x�;F�e�T����Gx�t��{��qcD8�k��
�#����!�5f�r�D��#�o���+���qdn�����X=�}rt�!25h
������?(0n�`��w�l�b����*)f��9�N=������ai��;�����2���^��=
�SNC����	���X/����� 8�6B~c�����EH�'���^���� ��[6y�I3k�<�''�\���A��G��V�}]������TX0��g�g���uQ���5�����A�&Vx�K+=>�S]T�l.=�}v�b����d[gN����	�d5`?���>��YrM	=����F���?�O�#C}��o,�q��"�:��k��t��A0��������i�7��p�z�&Ht���T3�}�����K�e�f(��J �,�mb��wna�c ��[���3�#�U����M��-���Oe���.�>_S�p�c/�w�����dNJ���'����C[_*�>��N;���a��)�V�+�5�|n�Z4��ah��W��g5M�0`�_x�������|����c�i0�������w����
�J����Mk& �sQ�x�����E�a���h�~4�����HB���)��fH���^��gv�[���g���G���)Q���pZ�S��d	�9]��z�����m��iH�)����������GP��P��������Y��6�c�4�3����)O�=��/N�[�Be��D��������k	(��f�&�8o0�t������e�N3`a������b�L��^n��}:��(Y��zX��7�������C'����[L�O_����36���OT[�DO���:5�E�R2��a�`��e����w�|O�C�]��<7�������?s����B��N^���Q�bG���_a��;(�>+J���'W�k��lP6cx���'W1��"��9���P���R���i�B8��)��}� ��P�	�<����i��s�
U���1��Vc�@�|�d�=��H�M����f����!Y�'4�K�C`x(~�uTZx����<�	������7��z|���q
�	;��Zg�>�J;D�O��~��}Q��?z6��?��a�|hR��\��p}2b�8��bh�J0����#����g���q}"�8������T<h\������z�B�)���[��<�q��-\|����W>1��z)����D_~�s?,2S���>�2���ju�3��\��c��-����P4��{q��c�O��rv��>�{a?\8�����>(�%����~%��������v��k�5�!�yBj���8�����&����)v>�$*f�3#����h���_��&�=�[�_�4��3%p":��}���>����p^����p[���7I?_��Rk2�T?1U*Ga����c������?O��2�y����;~k����Xp|M�\k3�7MD��5��Xm���pL�o�
'���j��9������Sh"OM�����b��E��b+�x�����nOq��)	�v��������"�f^���m:������`jh,a�M,/��+3#��qT����.�3d���kq����98"8�cw������s�I�d���x��
&4��|��8���<�0a;;y��t(�g�,���I��C�l���8��
�6����0~�����`���������
#y
^�>1�u�v����6�Q��|�`?��	PA�6��}p��-���S��_fU����i���p�y�Lf0�������,������C�����4��Mn�8`T93���A`>�F�o�
�9���S^���#h�3�^q�y�XE��������FU�����`��P�7�Sn}������9,�7�"}BaI�!�J�9��3��T<0��A�_��-GG�C/��������d�\�Fx#`�=�X�r`a@_!���s��M.��$� �
C]�����5
�J�i����}�um|��}����5N	�&E�a��^����oa�h���f������7>�E0>�Rm� �$-��������0����=*l<��]7/wL�6]���~�����W���B����|��5��s���S�g��_��t��{�������O�,��{
U�{d���(���T<p���z�
�fF7G�L|�G`!���G��`�=��wv^<���&���3+�#( �[�He������| �UV����V������ME:����;���G��e��6�w]8��~�c�rB���mQ�@y|���?(K�Y�u��)�i�W�%�0��;�~u����+�D�;,
��������X�o�=��,�3�g^�������u�yx�To�����
{��m:�[����1�ABm%g�U)����]�[��b3�"�>gW�����=(����FX�`��>�Y6�rj�JS2�u�����4��;����{�
����Xu���Q�JL�������������)��X���j��MO�}�_XJf0F���t�=����q�}K=�!$ R���X���X�����Wz�����_`j6����Z��<���L�)n������%��
����M�y�jX�1N�������-e.��&+$e������=��s3��u�]}�����`����� �9�����w��7WI��j��Qu��<�P�s7��`L0��z��z�e~C��0���>�����������
������D�u�?�����^R�@��z�:���l���%^��������	>E|�u������L`�7���b�/���a��ov�#�{
����y]����b��If��>r��fUO���d�����0������U>0I����l��/������5a��=>-U��)��m;G���}���@��u�W�J~��1�
����)<�53����]���8��W�6��BEjr�&3U;7q/�0�q}fe����@p���B�v����&�~��ck�}��u>vvg���|�h�e�<�.��o��<�Q�A����m2g��z������o�N=����|��������E�E�)Q�	�K�D�@���O��=�������_�)7�7�w����v��v��6L(�DY&Y��(8����ep,\�7:�j���N�i�X�i7zvj�Vb��=e#��Z"�>~�"��^B
B�@�d���0��kKs3���~���H��� ����N����~�l��
�t��hT������*�)��X��l�vm�
c�O�����k���U'�#��x��PM,�dX����^� �_�awM`�<X'/n�������q���]Q���F'�~���
{{{�8�RB�A����w���`|�y���O���r���������2�l<��y����W�Hz�<�xja�|0�����8&
�$,�S
�O�@VK3���Kv�7�{aa�R��r�Z ��?s��2����#p3Y�xP�H	��W���G��e���)��;�O�s���?j�R	����g~���l.2��az���4w�����������3rC��*
�]c����_P ��d���?~ ��;fE��3�`����+����Y�7�+`���x�FGJ�^�i�t`���6�r�C�R�4�4���,Wn}�.���
�v�@]�
F�H� ��=�|A{NC�2�F%�s���t�YJP@�	��t���E.��.������V�p�aHHA�cT�0��?O��!p�Q�-(A��s�`1�
�n���v��c�w�� IDAT8A��a�^��RQ�����F~�J1x���\�����u����tP&�2T�������i_�<�^���?em��p��y~&�2�w�:f!p�O������Cf	
?/�^
����F~����/n�:e�n�:�,���<W�Z	��#B����c�V��7;6�������#A���a���\�@8�����-��~~�'���.��uX�c��N�3g  �S��#3��t�?���t&��`�����eB|�>I8�E����s�,C4�jk#U
D���BP��._
D ������P��%vl�F����l	�K�����,/�p���
��A�j�Z\
�v�����xx��s��^�P�n���@G�(���xP��	B�s�N0���"8���M����������N�B����P��I�!:	�;%�h������
3���~��q�d�����x �ZY�I�#��h�@�q�S�����g{��?�+�@!��$a�K$tw����T�}R�A��5�������eH���1}\S~gGu�k�)��7/������1p!����v����*�u��7�����ST����`��e�'���_!k��p��$G��������w�w&4h>H��h?�oG�r�%X�����fH��Z���k��o6��^��w�5[�MB��7ZU����x�����������Ng+;�f���[����E��n��Y\��0�_3�k����<�yZ��O��3!���>����t�%���p"�|x
��w���#%�����J��L�0��*L���J4��+�0i�������#w����#kd���/�����a����O�)���%l�����p�[1@S">� ���x9`�j0���E�����%��u�X��Y���H����e�mY�o������N<���N�J���o�7�s��=�q~�s.�i7��k����3a������,����t�F��frF:�R~A���Kgdm����#��|����1���7�d��	"�u����Q�s����.CL�y�T����bz��Xt���s��T�!]�1/F_�G����s�z�k�o> �
QX���b�%.�]�"*�s�F0�������
�J���=g%x����e/br��Xw�2X���G_	t��[+_B���FSB
����
���?�S3�����)1�@8��gr��K�P�����������BN{�t)���<�����0T����J�`T�&���j�{:�/���������W�~��{���]�<|���F8����#��Gntv+ZU��'�p�ek:�`�K��� @���`����R�*��z�����2���
�}(���{1�h�^�:����&bRvK<��;5�t<�V|�����bG<���!���F���t�?p{{�Tb=( ��V�@���@�g7��uzc�����g8��/�����(0��p�=�,������*��Jh��������	E���N��#����yhQ�n�&-��
=��\5�(����A���2��O��C�&�e�L�!(����&5���?$����eqd�ft��������[��l������	��O��"dQ�`���!��;�m������X��:	,,?�Q:��'�]�i*:ps�~���?a��d��n\��0N^�>���.����������?On��i�6��h�����2�Z�/����H0����p���Y��z��NLg��&��y����)(��Boa�5a�4����%x ����}��kk���["�-���������v�kg#4�o4#	0����1Yt�[O+�qa=��9��3���MH>�$�|�
�&�������
!�]~���<����w�����$d_@gx���e���k1*� �-Z�@���I�u�-:��	�H� ��[B��� ����l�rxQ�L���qJ<H�73���y��0Ho��{�y����C��>,{K�>��S
�,\	�g��hP��t��M�w#8�]������%<p�����aa�)���h�\��i:�1@�^@����FG��;�$�PrG����vA�;�:��bO�������BFj�]��&�p��Y4*UK�O�.u#�.�Za�_1��OxNpM�~f�_1�!���#��M'n���������mg����m����8-g�`���u��vx����/�\*WQ4,QS�6h?��Th,���>��G�@��}�e�2�\<9�s�������$l3���X4L�3 8%�����p
���J���]��o[I����H<X�xr[�C6��������C�m���}0�3Ae��\��@��]$,�JJ
<�����: ���y����MQ��S�|D�|VHg��������_�q}��|�	���Lg����cQe�T27K�p�����F��\,qC������)�J������9��;�7=G�!����7��a1�B����7����><�|x���J�������������J��q��A���������U%�&�
����?o7+���)�����F�������������:�A�N�p��O8#R���a_�/��#��k.nqO���@�S���\���R<�3��{W�H�3� ������Uj��b��Y/����|�:E�gt�g����8��x���%�
@����6�y�z�h�}��)!�w���+.x`��2U7�c�$c9pO���^@�{��N���<�$>.���u$�����k�j4�l��a����)�`�ol�0�����Y������}��1�m:M����X���-F����qh�"��3��#lx��=�a����	-������P����e��������$q��-Q���|��{��h#Z��2��!\o^8�
}����U#$x����3�%\�&t�ZW�!`��[g�h�z��]_���uTq�+���&<����!��W_N�*���������������*o?�q���^�J"���5��%��G�!�$���w�B���[�"?{���H�d��������^1

�|���h��.�s��
����%�;��+��yJ'�R��mU��|����Q�T_,=t��I;S�r��C��	��j��!�x`cf�>5r��@�?������$e�����D�#��An���r]D�z���@����q���`�<YP�����^cO{�������fILrS��\g�I�N<PA;���_ ��|���<�K���>�Z����yo��o�J���s��B�x N����s8s3{'�<y�=c����Q��R%r���]�7TK����Y�I��m�}�BE�@�b�1�i[�B(Kq�������h���S7)SQg����$� �yBG���9V��EJb�����*K�C�E��8
mf��}mQ��F�*K�4� �	�
y�fUy�e^�!��D���l��v��x �N^�F�>}Cp�5KC����,B.��JG&�_-A��MM�I���
ns�������c��m[��)�Y���'�2r�����C���Z	|�&�|MuGw��k��K'B~:ezWn���]xl=�$}�.!�@������\
��_���
y�����������AE����{?��:�G�%x`he��W������~YBN]{�D�>tR����(N��r���.�1�I�W�

ovn�s/~LPY#������B�G��JJ.x �%��4�W��p�G�Oh��Z�
p_L&^����:�E�j!:o�,����H��
	f���M(^��<>�����	�nOB�ZZ#8��|e�s��c~10���]����%�/���R��h���!���	B���A_B^eR�@8���Xs��HBl�F�pEt_���	��!��iO������1%�����	-���.R=��m���@:�?_cl��lc-�^����f��8�
�����Yl�	( �Z�������
kVy�(���NpD�]B���Ezn�d����Q�������S5OR��p��k�����:��<��1S�a�������%�{����r����-���'��V�a��^�_�r�-����I���g���XG���Qk1�7>�O������;g���Zw/O.��Qx��**����z��K��G�����{�,���S�,���YBA��I	��Tx��n8��q`��,P�<�vf�*����'���3��~�B�ZI��.� A�>��`�o��R�*7���K���n/�#_I������?1�@�/S���m����s[c�'�D���0iN��f��*��tx������1������_��os�����<��&�s!C�y����Um�X�����pZ��w����������(�b	W��������5d����s	�y��T0h�� �]���%����G�������{A�����L%������)_y���T*(�!xb�7�:�*SGO�B	��n
��N��H:	-	T7���_�
���y	D��)����$N:9�0��?�SQ#����	5�c�O��:���c�'jT��>9����w�2���S	������0�y�0�[�Oz�)M���q�����X�LX�7J-A�	�k�j��TP8��gn�5w���j���/�-'N�v.\��~��`�{�*M����(�9
tZN� :	���W!�I� :o):��d����N��+cB���q���������6���Ti���T�(����Ae��O�Zp\��;'����[_OL�����E:����@|���HV���DZ��/��Y,��5;b�A��[�`U�6u��A� ��<���R5�����kt�1�s�����z}���A����7q����������T��PXG�g`�������w�Y��<�,N���>�:OC�������^����ck���~���%�*�I�(���'`I�)h��/��)#���P8�]�����Gp��0�H[�,�eL9��;L��E���2�����~`1z�(����&��
�������
D_��n��MJ��{�]�+�HjV�Q�a�U~��?	� ���r�b{�����/��������0��5\*I,j?�j
s0�z�q���4:���H�@���HU�@(����o&=*�=�7J���	��sK�{����n���j�3K�@��������{�SB&�����J�
��o����v&�y��0$P ~|��T0p���\��y
VcJ���%���J��������/�%���`�����x ����a��!t>�1i�$����D��~.kn��^1��A;�g_�~��9��,�����V��F�?��t.	{�NU
��;6	�z<�l���+�G�`�i���������o�#��z����>�OU��T�YL5�+On�8�+Q��$���w/������!�c.�& ��c[�,�*�/��t�/:�������1��)���b���h=�WLMK�%`0�{
���0�
�%1��B��V`�U�Ek�$a�����+�l��0�}�Q��T	8z��+TF0�H�C&0�������,���{� mDG�,Z�o���T[9�'������"���%L!���kj��=0	���;�uz��
�����=r?7j}�6U�C�{K���������-U�1��K<�	��:o-B#	����5����r���s���A���\����C���/2���S^k,��9|��3�1�l�/?�[O����l�����A}*#��6��;�lz�8�!Ur������J�G���g���Q{�B����� ,z�x��������V��JB����q����>����,���T�!RB$�"N|���r��0����'n|/����I�;~�|f&��r���>�7�l�j���wXv	�f��@qc�
�	�
��j!�#�<�H����p�g����na�_**�Y\�.c�I�5L�!���T��j!��sIT?s�d%���[�v)p����{&��A�G�DrS\�����^��x����i����5��h��\x}��� ������A��C������'��o��p�gF}��u��V!,�H����	�����
�������G	*7�O	��o�LY�J�����<��T�{g�x,��w	���N%GW�7�GC�%�p
+�+����'T��{�_�-��I�@�E@f�b�W������ j�����q��R<�:_������	�K���F�q��>J/$���:��ss������*��R�7��<��s�1���'�p����;E�n��3�xP�RY���'�������M��i�?�"G��(��dJR,�!�t���5'�bh�����Gn&-�x`��~�?���=B�"�d�1��s���Q$�-J8Qvm��/�������GBn]�36?!���YSd��l�48A�`i����<�^\�|��i�Rv����7��j�$G"1��U�l��|���s��n��J����Qf�O���C�����0���/����H������X���P
���D��d(����0��k����	��x�����������=���f�������44��O&d��a���Yge�\��HU�>^�Z��l��N��������A������x�<����@��p�93� wV���U��AHB/����7C'�ui �,���������

�	����aT���A�\�x�!��^���$d`X$�t��v�
�Z8,���<��PJ�tD�%��'��A�
��!�#���I�8t�t��8!���8�����(�p��dm���>��@�.�(/�����`�H_)l\����I!"$X7G
B:�.tl&�L��bU�r.��?�	8�W��p�I�]nRE��:)��A��R��bs� ����qj���B��`aJ��������Q'��S<h��F:���R�BE��]���~�r�t���������#�D;>�v^!�
S�@(-�>��B� v��^ ��=;}P�����A��T<�D���jk������
	��� 3�H0A��
��o�/D����X�������lw3�M$�#$p��i�>h��Z�):	����Y��o����_�@8����s.#�2��n}J/��]l�@�8��,�u���k�b��Zt����(�F)���}}���By������Wi��e��o�BS))�@������	�A���
������&C!����!*�Yvh�~H��J����L�Z���PN�md���S�4�
vt�PV�0����KT-��lt��?�v������c�����Se����D��}e����W.�K���
���G�#)�*X���:[La�T<([�����j��b��	��)�<� ��h���[R�S���]���[
G��u���#|�LpR)1� O��v*������a�1{io���B�"ME��M��'���9�@�rT�^T���&#0oy�sV�o��n�)��#���A�i:�����s���>z"]�F��z������6� x����[Rm�O:�Ze�!V���?x0���B������l�[��@J����A����G��8��P��w�	��/��gn<�y�Y�Q5��1rA�9���[����
R&����q���tXp�W��[�hD'�&B-�����sf�aH���w`U%m���]��������]k�k��v�kwwwwc��(�"���;s$����w�yx�{'��s�����_gr��
�v�J���+���jq�	����nX��x�����u���@������/��s�]AKr���'�;��������u��ZI���xP�Nq2�F� 03�H�	�h���}=�
��6�<������Y`!���*����\$uy���Gc�����q��}�)(�x��� IDAThh��2�H���\"\#����HR����x�I��Az�`��et%�j����G �w�ze���u�Cc0�VN)RD���dT%��3��9��ZbR����g �pgJl�>u��)D�����+��w���`�z��n�X��x��$s�~��3�L��������v`�c�a�st�Ml1�����B#r���Q�g������������������_�E�'1,0�X4�I_l���a��E0!����p������m�r��y�j�)	0U����^U!=x������oRt`�dR�U�D�U���0��\�g��s;��(�z��"��ZH_��r]H�%���H��>�y���IUa<W<8I�����8��&t��cV��n����L� ���o�+T�G���4�@�-)�&!��Wz����*]m�]��������s������t���5"�;�)�����6x��B��[�J�y
���r@��X����AJT��gu��]�����1���\.p�`x�/~F�
���u��bJ
L���=�RZ0����5�B'���x�����2*��SH�n��H���z���4��"�!IbWV�ju
���]*x���?������m���4?��L����X�����-���N����g��`R<`�����>����o|��6�3+������f��ERNh��7)�6���s��A�-Mj:gIM' ,��,`�(��!��8R!�T��or���q7rO��Z��e�w���yX`i�=8�W.\����>8?k:/]z���w&�ZR����&�O�F
S1��0������<]���3(����t�gx�?<�&v?���\����V��sQ]�m�����'�O��\)!8"4C}��S��'�E+�Cn�����1*N����[>���E�V��6�5��e���K���S��Is��<��]���<�rS<8�)=J�*�t��206
&X�D�����%�_��h��#n���/��*����d�^
A���:�a����[�2S��i����X`jog~S<�
<��x�7�.?)L`�w���r�j�})����:�HET���*P��+\)��i���"��H���EmR<�uy:�p7&
,���p�>�<��x��f��"+���1���
�N���4Qt��������xp�����8��_*�K*���
{N��:O*H!���S����)|$������%���&8#����3t�j9�WKY��Q���#]O�eUsr)u��6L��~�n{�_�������X�}�(d�W<`B��p��V������}�s�������G��h���7SV8c�]�������+����������$����x�
A�v���7~XG����
S-��Qwa���?���e4��&�����H���-��*��J~$��z�U�r�`-v3W,0�	S���wejT�IfD$���D�A3����'�&��Q�PWS�R����;����S+<y������T��������A�fr���8����Q���?g�X�!�$�loA��F����;of0aV��&Mh+�r�v�+����&�Bi���;������!�����e�{=k>!�s�N�$��.�A�������#_���[�nS�����.�r����|����3K���l:��B��������#���w����5��6~+�������A���{u�������||i��4y��*����6�N�@T��/;9�}*����s���[Ie���S���t�A)�G��i��/}��)-��w�pZ�
�O�����7tJK��Qr�
<`n�J��)tr�-�^9�������3��-����e�Fa���f�x�~�$za�'����s,!��~��44�
L���Dg'����j6���������+�cf�~��Q�H&a�������������|Y��O���X�up'�L������ou���������5AM�����`oM~C��S�EH�Id���7)�P&�'~��S<�h�����,x�X�,���OL��T�=�qV���,�!0�@�{3��lq
�-j�e:=�q�_CF]�dA��)�[t���Rb������A��G��+��^������@��=�]�E��h(9�#WWx�CV��{���r�t��Sk��$�����X�����I��/��.��Uv���������p��1I�]HhLT�C�_��������9���6���{��
o�L�i���?�"?��5�g�	f����Iz�R��e�_��0x�8]�RV,D���!����p�~����p�r�:�����S�!���6�+x�T�:;��6�k�UK�����>{����l���[��\g�4����{^������%@ll
wE��
0�������'�D��`g
lc��c�4L5��[�O����a����{�J8l����<�D����	��'�K�iA�T�{���c�����P���l�F1m�37L1��z`e�n������q����(]�mH��5�5���`���M'^>��S`�QT�!�B��2|#�������l�J��O@n�9���v�`�0nt��YKM��'q�'�����:8F�t�MF�v2�
�!%�:D�C�����y[X��D���=?���0W�`va6bm�4�����^�]]�����4����{�"	$�f��-S0`�Jl[7�W�)����/�B�|�n[7�t���_`��t������<9�Qxh�X�U��:3u����n}gA�N�'�	�C����cJ�`���8r%�
tI
�I�W��H2���%^4[�GIpW���NlG����a��lM�xP��)�'�;�o��
�4����
Z�>�/�>������G���������Nm��;R7�a�[}+D�F���.�}z3�_
�U��������%��a�}��zX��;��!}�	<`R�#,'����vM��R��z�Q�jK^�=G�{�	X�c|Z����W��23)����d��+8�
kwA$mz}"���?N���[V�����t���n��{�
���`*x�R��F��<
E#�~�@��������C���������2fN{d�xp�N���E"6?a.��������s{���JU@@,�^%�������@�ZL��m�2�>��S�E ;�0�n]���B���O&Wt$%��XW�+v�IC���%��}n��=mX��k!3x��]C��;�������4�mz;z�3����:�NDg]��J.��
�*Z�?�l~���S�#����4?Y��%����p��'4����D�����r�D�K��/q7=V&VA<��[���T3�����S��s3{6����icE�����s���������f9�&P!<��y+7'����4�^G��/H��:��NU1`i�����:�K��7�Q��v��x�����A'�	��w�ti���/0W������������|^���9T WRZ�qu����	�re�15�PZu�a���y8��]��Y
���)0�r�z�:�����c�X�C�2.tB�����gW�����L���%����a� ��N�>��5�����)��O'�x:����%�"W�x�L'�tZi ������&��������j����	��O��L��mt3W�����&v�����#��kt5#����c������5:>���jZ�������t���X��hN��������B���>S`������N�p�$���/����o���X��������hH�%��C-��pj�V�&Y[;�VW�B6S3`p�5�,�����Ec�m��:?!?���L*&�S`�4�zf��������J}�k>a$�����q" ��4��M�k�Z��|��������R�1��1���H_���f���j-�'�;��w�������zf�����l�+.o��$X�^�	���.q������A����}���G��O�@�~k�&��4WMt#��H���.� �������fM�M$%��f��[�RH�f��N`di#0��S�E��P�HE@FS�?�@���9�B2�L� ��A*xs��Kr`WG[H����Jdh��I�m�h��T��������B�T���*)�U���RP�9��+0$����'�NAF]2$�Ke�W<����Z���~O�)B9��5�"w�'�)	�mE�s�5��}�x�Fks:�
��E�?������,��7�fI
%��������v��\���EI����B�����J�|iQ�|��T��&z*x����6�$�@�%�S�c���Y���
#��Az��`,}n@��e����N�2W
=V�@������������F��u��:��cV��U#1�\,��\�AD�����#3(�M��r�����
+�����5����g`�u�{\�����V��WR�YE���-sG3q�<t����$����MzP]��D�W<�V��u�%�2�TfX��>T����7Sw/DKRj"����[Rz�����1Atc�5����3��NL��w�����gm`�n#������B��|iN�>�w���nZ�>v\?���sWy
�������Y�����;B�C���R>��~����-�Z���_�E_�����&��������U�Vn���0r�E�(��'U��R?HU1p%�({?�=�r�h����$�_*p7,0� ��c��y]ct��Hs�p�@M���c��Z�?���Z�+�'���5���	�t-��a�����1���GM���%�~�c�O�Z��X���JS4`.�m��������%x C��F
���0�7���x�o�@���p���mt�@kaoi�������U�����X�u��X�{#����5��mt(���O��Rs:�C��B5Zs�H�(���'���D�@��TZ�:�'�~W$0i�eC9��)0�����e/Mx��/d�x�ZOw�C�[<�+)��@�
<0��}�����u���<�!E���#	��y����C�����n-ehWQ"��6t/���#��~���`m� 7����Kc�[��Gi���v�������Ik�)|�G�(;H_�mEir��0h�)�����UI�h��k����+��tv�8���Rh|\<������?>���q���+���;����C`n�[MnD��<5a')���.voOPJ�y�����������&-S
�R����I��.�d0|-�/�����
���)0�:T%�=��q�TB���G�|.���#Z���SW��,�����-�ZS�B���h��>����=�>\-���g� &6f-��U�xF~�Or���X6w"����|���O�j;TA�� �j��6���MC����B����D������.�R<`�o����h~�;�7L�!����;�zpB:�!����8�A^��
<�K>Y���#��Y���/.��4,�������<�K9�y�//i���OqK�xP�����f�%������U���<(j��k}x�����<X:�*�6���{�3'B� I�L�jA����O�+��~����I���\���K�sW��F=R��
<�fY�-��������\-f��
�>��]nQ�?'��(�O�:�H�WQ���j!�u���B^�L�NR�@e�<Ra���G� �(����b(�z��}���KH�j!/��J�����Z�V<�Vy��OzW����
m^��#Sc�gn&^�'�,�fH� �0��AA����L�j!�u`j
Q��`�j����7�)�����������5����J�(���� Y����r+����W��s�H�Q���U���oV��4�#)x �2��GzWyI������#H`�����vW@7�.W��~�M�r~=�h��bJ�|��'�"��<�o�G�A��ZLL�fD���~e�Y<���x ���R
<� �)����e�Sq�3��)�n��c6x`L�	j�T%�<�{O�I��
x����@z�R�gKqr�q�T���A����I<��~,��4S��F��I�'/A�b��O#-���d��R��X�
t|Z�����T��0����$wj�N�^$����+����K�4x����@�Q$�+���,}
<0MSQ��%�ZC�~� G*����p�����Z�$��@d-<�d�q��- ��?����`��O��X ��*(�0+�
�A�����n!!FaZ@���Hod
���l)NNx ��J^A����iqn����Aq�+<(N�%�5;�A�����<��f�S�����^�H-��~���1^�Z�A�w�\�A��6s�x��l]�J���{Dr����, ���^�7.�@z�''<�J%/���>-�-����{xPt�F������m%������x ���������8��Q/	�Aq�B��x�=�/?����,��jI�n��jh��������#699�|������Bu�I�S�T������_�����{��ch�D$&&��(++��N%.�����Ud��HH��W>
������Gll,�CW���\��;q�;}��.nDq�C������*F�n�_��n(��6���JUU5C�J�VY�|���K$�"�M�S�_�5'#9��sJ�:�'���-]Q�>>^�f@QQ$)[\Cq�������M_R�#��a^��^*�M	;/���F���WRB�b!V8�V���d��_[7yMMh���J_��H�Fn��#_�Y�[Z��T+f&F��OO�]��#�fJ{>�i�2�������N������	���/����[8�)�R��5G��e��(I�y*�$*J����)�*�T����D�Dl�=&vY�8>���G~�� �+i����v�-P6�����9���M �?C��8����`wS�������@1�~�\t�1EQ��)
�Qs����X��#�36������G�}�"������k���?�hQ~�#-�����Q���������MA�E
��B�%�<�S���������������ma@
��?�]R��0���Q�?�i����������/�"��$\%�?��EI��AX���E��J���Y��\%�?J�|��+�?���J����`5����GIy�	���3�J��O��1%���(����KI�>JB���Ha���� �xB�%�xP�][R�%�E���GI�	���?���0Q�� , ,,�U��gI�����*,,�}D��2?��1:��gI������A�,)�QR�#B�(�{���0��+��%�?��aA����YR��$��������HYR�#E<�s�TA����`�bo�W��j9�b����.����BN�a��9�n(C0�!&��Y��0���2%����W�KJ0�4&].//_f�eyT��{AI�&�	

�_��U��eY��������H"�0���%��(����(	�f�?�5"��OA�G�_3�s(	�GI�a>"��-�������������#�Z�������Y�R$}�I�=A���O��k���WR�#�R�^o]�K(�������0?d�WP�!���_���%e>�z�0�CP<���$��?���xP�^R�LfI�X.���Z��-:}�jR�C d���*)�!�h+Z����GI����!�G��>��z��V������h�+�?�N����0_/:c���W	���5�J�|��\%�?J�|D���{UI������q-���[@
��J��H���XJ_a�*���- LT�m���WR�CXX��8�v���x �����JB����i�.)�Q��%e>R����FJJ����������$�G�@:cAZ�������+�!�|J��P�3��KI���|]�5"�|�/, �����D��� }
JJ��5�JB��5�JJ�Ek\�������*	���� IDATQR����r��6�������0?��E��������S����H{T�/?a~�?�I;uI���0?�i����WR�#x��q �,�K-�����'���de1�J%��o��	~�L%N'n������L��8��?L45��_�K���(.d�}�����6�7�$V�����=;������nW\��R�����:CR�\����k�����Ql�[T*���ZO��Ju�z�g9[5��0�!X@�P�M��KO��)if
vW���,i����%�<�R"�x���$���l����RiG�����+���L��*��@�{�b��R�p���5��
��b�1k~u�R-����R��(f�h�����j�����_���7������M�J�8�*�d�
�N_#�����^NQ+���#:��j�����+0"�y�S�7���+��n��e����O!6�p�i�ld!a������@�_f�1���s1�������qg
,����u�����*Tr��(O�|�#�4���"?=OY���Z���6}��s��|w��������{[
����m������m�R�xP�z�G]��h�Kq�������/xP���$�H
���p�.i�x ��
>���� �������������3?�K2�D���j*X@*���1_��A���cb<���]?r��_a��/C
�����~)�������xP��E�^���	�A�����%-U$�X����������x�w���xPT{��z	�AF�������@���`jl�����p-�-��[���Kp�b��6�9���g��F�
��4��
`i���t��qPVR��}���z�!^�|@BB���Fu$.CH X +�A��<(�>(l� %%�O��F%���F�������7P��b�x}9�+@QE&�F*�����������HT�����V���S�v�����#���*
U9���7�=i�l�z���������G�
���v�����b�Q��g\<�)0L�zo�����+Q�����7�TE{+ly�.��e�� �������
����3W27�-t!�%����y��A��*����o�7O��ZIa��z.iV�� ��C���C���xb&��]/Q����p���8W�t��=�����U�l>����VW�BE��!!\������
\��Z
���/�K3i�Z��J��/��`��-.��[S_��y�;
�	��b�!Q��������"G3�<����\^��rb�'m�`���Xs�5&���#����#D�������B�?�H�&5�4]-hWn���0h����g��Q�:�����t���D%��i<�����2�%��~v2���c&/��S#������,JU��Y~�Z)CIM6O���D����T�,`��"�|���6<��+0����6���������x\� Z�,� M�`��:��<��w��m[���IT�?������$J�"K����q)Tm��������;%�K�qK�������(�8��x�l�	�����?O��:�#MW�����_WX�/�?_�]Q��	���w��D���\������������,��2:��v6�`a^����N�,���+���?�k�L$''e�����>=�b��Yy����l<QQ��Q��$<��m����}�~j�M�v����]C|zu
���5ZAI�;-����w����m�����;r��qg*C]���vFh�;��=���#����x�W������7������G0���e��8tAxT�����(uQj�������>���u��-�|�y����K����i��x��������g@QA������!G�r
���{��=�23A�r?&��Vm���#x��+6a��QyB"��- ��?&���������o����Z
?���:)1�/%�z������H�}A��^���*U� ��b��o��.���T7���&���?����j���>���whP�k�f7s��[/1�a�BzU��K�@|���x��AA���jP������E<0�m�e_�BpT^B~AI�,(� !1�������|��Bv_\���&C^.o��������p4��ER�)~~���B��H���r�]�X�=/����6xp�6���)A[I�������!�`zu=�zM�����,���i�>�3x`�i.��_����?�����F���0��d���������\������I<��2�o�B�������abZn�n� >)[��bl�i`Bqjw	����kn#�9\��"��"\����U��ze����qo��������������O�AnY��+bp����sRnQ�����t�<��rF��@v�A�v����"�l6���������4uK	�A��(��D�j��|��u���:�:�6�?��e�c�g	L�}������|��(�:v
�-���h��wg���f��<��a�8t�F
��m�����Fz�\����3���G�8��N$��U��,�w'�45`l�����x`l���wa������\\�������g���jjh��>�V*�� ^�~'�����E����	��L�J���-����8�A����ml����x"b2�������}��#�A��!'/��py�	�����
s}�k�!4����4v.�E"m���������(����V����:i�������MMi����!�g���A�����ut3�Z�VP��H+���M;e[��d�eM�TpgWT4da�T�_���5H�A��
P�����xX;�CU[wv�B�T���Y�T4
d��T<��U�E�8�����C	r
2������XT���=��5��ERv2Kz��LmPn��I����@}F��x�3�ah�:����G~��-U
����?[������n|�
Y����O��X�����9���aa` B2�?�bESIBN�A%;%�h�9b v�
���<:4�����8{'cz����|p�R4�dY��Z�t,�5T���:�ci��W���Z�J��=�O>[���0h���s��XO'w�T����`|	|�����hWu8�5�p��v�-�:jFw,�u��?�-+
��AE\}�����%��W�?�=�3n����Z�m`oVW�z��x���
jY�|\�:���[%<���O_�Y�|��'�_KYC�����1�q�)�CCIO��p��3���M9�*�c�������T��<���t��X0��},oW������c9Y��_B"��u-|���6�7��#�5��p���2�Zz����-kb�U'��`1�q����*�x���$Ls�FcD�1���d'���t�a��dho1�F���r[9$���7�t5��m����oO��o��BN�&��Km�9����O$��4�\�
��.
A��C��.4iC�����+T\`�	�	P��I��F�A�D)t����F�JAVE
��=��k����ju������D�x���b���0�R
t)CVC��"z2�����N�Q��qn10�a	ymy$$ p�LXS�e�}�'��kA���B�����~�Xi�x�X���&�,!C��X�h��k�f�$x���WW#�NQ�h��W�	X�����
�g�����M���du����1���m������qY|�B��`g^	g���O�����ot���C:AI�c�*�`nh�:7���WbT�Ex��N�n�S@L�����������2A�fcp��i���*�����X�/<�������7���-h��2���tR�{�����������|��I����X��zC�;��4�D����0�5�o�&�^����^B`�/]+r��t|���$�$�S���2������XX�������N_��W�P���"��}+���g���_�7�[��/b���O����"c�`�oM���*��Q��03���/S�*�C�BQ^��6
/?�%5�k�������G[��'{�����7����hfu�	<p���������A���C�K�[��_�����x{-�M���=B�#���<���%��	<�M����H���h�
Ce�|
y�U�����9����i���@���N��C*~����4V7���I�G����w������4Q�XW�"��{�;0��6>��s�}e9<����j��F�	���4��.&��������^O�[i(`�3&1� �dt�V��)�h����H�@��x��mY4�f�����!&��B�F
G���x��������7�}C��fPSQ����<PWU���"�����]����8�@UY37>�q��#j��������7\����k�:��z�O���!;��R�`��?����{s�t-�W�">?A���0l<�����A�����5�FC�sy@ �D�e
D�?F��1h�=A�r[�*�����������W��U�zvQ��S�5b�>!������R��{��������'V~��^GBR�XqY$���xw3��u@���P�9����4��C�n�4���yi��b����Q��G
�/���<
J24���N*X�I4��ABl
�5R�iy<?��H�h������gc�����x�������N'�:!��� Th��k�#x���Q���������i�d��Q����%����+�4z�D�'�����|9�It��A��*H�������,Pzh��R�b�;E�>�xr���5�D�[X;(��|z��
0�$�7�c�ge(��N������P�������B��`��
�9fw(��f���u�P�tU����S<")
����d�����x�W������w{VL`	��}���>>���*�����r�����5�����`��,�uAbt$�G^��
u�X�0���p�S�~N�Qi�l(j�|���/�NGr����9)����y��d+y|r���g���DF�<����R�T���&�W/���J@������(oG�N��U5]\�4��:M���2����Ns���P��=l���/��wV#,����Tv�\O���s���:�q�y���(hUC}��j����P��.��=B4=�[7��AtB�D��I
�+�������5�P���=������H��B�=*�S<X�l������F���x{V��*�A�^�hl����%4��s�>z����6����I������.�6���QtMwA���==	q�8�|<]vh2�O(�j���-p{r-�X5m}�^v~��?S<���7�W����Kh;q9��)���
����Y|q���=�����'dV<��������3��Ax�lr������O1�TPnaS��5p����Qyc;D{��e���hE]���o�{��V�������vZ���y]E����4��]����_a��.��c���F�-��#:��y�3��[~�Dj�W: �=
���2�5�c�`5�)( �m|��A��t�=��U^k>@���xOs���\��c�@���H���9�&{b�-+�w�������t�n�8j:�~t&�,���d��,�X�%=��	_#�����9F��9���������_�2���������K���h�w����k2��&p������\
&���o>�������`cU��*���;r3���N�!��
$U�8T��*�4�{rs����=���(+�BO�7���+��3b#V��'N3��x _�*��Q� ��S���@}t$��������t?�
)^�����-�����H��q3�z�S�?�7�!�8�qC�~`�>���~p5���s����q����1����5���28�����qA������,<�"�<X��*��C��i�#���O���3�m=�?{�#����X���M�6tOHFD�7|�p�[NGX����m���q_���C��\�������Z�����&�}E��������S�47S���&�}~D*�Q�L�U���P^�����?}�������1w^�@�7P�6����hZ�+|~{�����x;eir��oi$�v0�6��7�s&��-)6��E�\-���-=k88������k�x'��:���J�@���ymE��[�6�=�q��a�g��8�_�u%��6�B��Ms�?�C���1���sQ�V�]���6�{y�[�P~�#4���B/���\��ciXt������!p^��:\n���Y�j9�]����0_O��z_`m�x|6j�o���;���/���S���m�=<S��EP��\X�q=�a���`����������y<�ubZ+�-����
��CpD�i��������������U�TU\�����r��w �3�(t_�:BJ�r�	N���P4Zl�X���`8lZ�A���Xx�1����}Mx\��ae%�����#nH(���|��t_����k�N��9��[W�(K�n����D�q��-ti�{���������5q8���������m��a}8���K�cg�bP���TW���1�OW�f�?�	`���c��9����	�o��q��S���>C?�z�������?������A�'X G�lj:�n�����C�-J��I
���*��P�N����5��9�c���0�QD�.:����Zi��{��r^��h*+cM��q�(Z�-�k��H`�(�<(�A���c��f�(E!d"/\��%m�QS���`c�V������<9�z����>	f���G@@�~J���34���0_�t `VA�'���Y��qw���D|)xG�b!<xu1�C���j<�+����,-|�����e8��p�2�CS�z/�$�D�
<����88��`C�z�����h�M�� ������C��0{{�k�#8H�DE�_�2s��m�7iL�*��k���??����R<IBN���N�)��o	�'�I�~���q�J8�5 � .������9����������<0����W�1��.<}r����=+� �6����������}�K5����0��
�0S&E�	�l
|B���U-��������h2���8�h����p��t�5�<.��]����{�&A-+
���.���_�*l3"��x��kC��������F#]0�{���5����X�U���CyK���5���>~���A���1����.|�s���<���q��7��[����|�D.Bq��7�lZ
^|B0A�Q��o���&�0��CLhXW)m�������"b�����,�����9v<����q
*���+_����bN�����Uq����_V[��m��V�@��o�h�������^_F�B�L�o��������g?�s��3��F�0�Z
_����eI�<���S�J�z��/�>�rsY|�
�2*P�Q�1�$���o3�!o��&|��`����v3]D�F��8|��V;��s(��VV�fShu�C�o<�����D���e��P�
�
0oN���/������l�Ce�@�Q'���%�OuN-����������Z(
;�R���{��<�,����M'gcB��x�z�o��<8_%e���)����6�|�<Q�BK*tm<*$�� �I7,2�����y?�\�/�{..C���p��>��GT�n�����H��������r�ar��xK�_	T`�A@�m������1�����L��n�����.���=-#��������5�����V��W��:��7�Y�&��kO�0r��6�u4���}����sy]u5
)�x�������%\~|�+=����k��2�����l��U�n4�6�����`p���33�����P�
��Z�$�W�\3\s:L�f�+�k��8�m����%H`�^[���bW���EL��^�&��Wg��b<�9:�;������[���-0����_Y�q�������Y���|�7�L1r�}:��Z6�V7#�.�����Vmq����)��Ils;�A6���,*��AO��r~����8)���>$�NJLA`i]C|��i�L����ME(�&���QH�x��,���B� IDAT���X�M������F��������FF�D�y�3����o���EC �>��nu	A-#ly��
�9��D��p�3S����+A%��<X�*�+hC�T$	9������`m�������<.��B��?VO��U^�8������b�+,Y��G@������8������^�J��Mw��D�]����3*L�_
�)�C�Z���A>!8OeI����F4�>�~nP�kWA���P�7,���0B"���j��{��9	
Ez8q� ��UZ�{
�����s(tI.4��y0w,���W�7|���>k�������$A����\-l����^F)m��9�8AR����h�[0b,������K�A�!���(t�6����B"����U<*�T���`g���/]_�)P�<����[q(���8��M���m"�'�@f���Ui�=�/���V��Mp����"�l�:|\M����Q<m���C���ND���]�����c4Eu|{=����BPE��j�x��c�A��$��7	XHU<`�&��vw��2��qT0���2�;*AI]�E�n/5Rc�D���t�;���`�����4��������u�2����4�����gWmxu1�CF��+�d7.r�@��
�$��L�*zFP52����`��7c����T4
������>\��������:v1�u
�G��d�2t����v2��0�C
���,����k��0�����7��t3�~�������#���m��������@`�'|D��q��l�D4F�������{xy=���9�x>��������8zx0�B_���]���q�f]����g�'�+�U
p��q��tD��X����UD�Btq��^��:������8P����MP� j,m�/�|:�&6�p�St�$�6fU�UTh��������{�=�o�m��VM�nCV�A��������uD��7�NX��3���`�
���	46�w.�k�*6���{Wr�@���NZA��;�Nc.���(��w�1xL��F�A�D�
�X9����{���pe�,Ti�;-�������������k�`���`W�4��h�a�X�����v����������}`v�����k�r�	�-l��;��s����P+��^��q�w,���AH�M�Q����������x���'�������mj���>����
{eUx.q��@�[�i�a��
�g����2A�q�3�={�
%3�=
�����P~G���e5�b������>M}E#e�
��������6�����
<8s,��aL��pz��{�6���\��/����Z����h�x0�,�~�<PS����;�����]��>;�93Nb���04�Dv���u����{x}}��C���m���k�A}��J�
��JJ�
������C�^���3p�x������h����<�r���c`���Bj�T:�F����CV[
���i����m������uZ'�Yp�������@�lN!3x���9����5�A��4O�oL0z�4�9����`�� O�9����&�F7��������<�J�f�ud��<h�a^����sVm8��M_G�V3��|:��6�����9����@��\>0�o���Ah�/�J�P���wvA�����Oxz�wWHx��'Ksy�`��)"�>9������e07wNM�]��TyD�
d�.�&=�^���i������A���jS9��o����p�@M��C
u[���D������~F��;��Ci�9��n�YD�
<������X����u��7�0�~[L;�
�+����&��{���`��5��U/\x���rw��<���������H��^��QvTC<�|�`�JP�W��������{h|l0�t��UQn����k���J:<��-���St`c4V�Gz��V������#��Pp��~�k5�������{�A�X,%<s3�3�����D�<0-j��C�����������z,��;;�E�E�������-���
�.G����t��av����jO����0���G�w����B���Y�R��m��h���/	���:x�N��_���
�cSnW7��B3����_�L�`���8p������j�lTXm�[g�9��u	J8��X`�����hP��4#�4��`����*%"O#"�0{��4����'���#�E'3Y`�l���
���'�Vm��@H2�������8�Az	�_�mH�c��E�����t!3x��w���SNeUp�p�fJD�Q��<�^h����
���Dqf����6,�W���t����K���A����$��g��kH!�S�eK�i�N{��x��|{���o�hQ�-���X4��O=�P��4�_���R2lj�����L���Q������L@�.J��C��!e��	�`!��S�&�������������48��3R�a��=_�4``���XR�6��ZBn�����M�BdXU�.n���iOJ	o�F��J�-���r$	9�Zt�_;mz�������H
��r�n����[��^d����jR6`�j<H���2 A��x��:{���/�Q��jX�Ls��KP�_�Dt������\��^"�)l�>4��^x����\k�?��O�;�
��Q{
�������f�d�8r�z@?�2���I�����:��dRH��;��]�Z0����'a<.S&�b�G0�-F*q�=U� ���
�aO�&�0���{���������T���ZRS]�"�^q�HR9x������c���b�������T��T�[P8R��.eH�:P�M���9$���-�1���#n7C������g�rj>���7Q��J��pW����j%u���V�Ju(��p5�6��\Q\����`�	d���j5ux~�7����x�a�
`�<�����Xs�{�r�����<���3H����B:M>�3�H]�{�'�+��l����yVX`0X��O1"0�`��6<
�[�]#\	���������AHu�J@��
�k�2x��F�A&P��3�y|��II�X��G���V�!�Vj��>!�^>7����%��Bz�6���	zR]-�����'gbB�U������sX�m���c�-��������� �s��\I��r��cm�W��:�+"�fb����������{~w����<�u�o��4���9x���)����IiaL���d������|H0 ��2�����tkO���DJ�mK�������S��\30��s����Ot �,���tL���=����e�e,*���O���))L��|R?���hN�S�J�����(nu?s���	�/��h_6���>-'�>p�<�*D%���S;C^�V5�J��!'��)��|��e	`�oC�H	 �-�b��T�)���?`��.����~RB��x�D���	p
�G;
����Ox�R'PN+�8��_��;m�eL��R*�K��3��%��)��)_&D6��.f?	���?���wWE������xAi��C)�	"H��-���������7�C
����{����}��c��� i�	<������h\E�<�����>a��f��-6�h�����!5i�1�?����5����Q��Z�b�WH0�Q�6�x��C�����4P��E�	�_����x�����z���5������L����zx�"[J:�O�����BZ4H��SB���������u5��[�in��h-�CTI������,�f�����B^���[�����5�K�a�s'�7���*)x�N����7�+�"(�T�dP�������Z���b��L��)0��)����D�o)�C����p��_��S
`��J-���F������`���b�|�h���Ly���(� ���}B�����Y>*��l�,���31F`�)�4	�B���%�� �D���f�D�v���S�I����UR�&~�O-���m��5��H�b��H�"���=�**�����$R�����H�)gY_�O	x}1����"5�rys	�~��(j���>H�C���k��O(�g<��:!�������_�[|�����6<��C�����9�Jw�k����t��6�u�W��A�Z��!'�@��5j
���=�?���>���k��R����B<yD
F�3�j�3�#��c<h�h<.]��j���*�9�A�z#	�W&�����E��kp���V���<��	'��	)�t'5��/6��O�{c
f;������8z���|F���]-��1����]�����0R��aV!Z3���q��zO�8�Txh
��b����nOV��*�W48�N�*X��o*5>��D#R��r~B��{ie0u�'�	 x��M<#5�F����������F�3�W����������z���n���Wlp
�ND�J�E'M5����Q�>'v��@���
IE<8 R}�-d���ah�����W^">�
���FZ�������q~���L��S�B��9�HU�s��������Q������e�j��6`5{�'�~F�s(�w00�4k�A���muK3�F5�4���������W��Eq���<�F�����.��}�2k�������6��A�S<�����&�G,�r���w���'A�xIs��ww��@<Z7$R� ��e�������h~,n<`y�rh���q�	���?Oc����h���j��Y��eK���y9�x���^�ga����P�}W�=^������:�.w�w�{���=�x^�n�=RVc���-H<�QW�J����G��Y'b�d����vdT�������M�������������U���PRu��vY�~`���<�� �����������_���:��n�N�,q��7�~�)���+x���fR(G�!��
�|��s8��&�U
�{��Q?<?��}������bjx��VA�@�T� �39zf4�����J�_r&eZ��	wO�@��Ky<�O�v����o�3|��R�Ho�x��d<W`0��GjH��}x��;����b��9���5��
��
�g��vT�;�R�#��O<H�C�#��C�zCp���$��c�x|u	b���r�����1�;���G<�x��7�%���6�9���f�}������4���'�`"�u��]�D�;����A����h()������
m�[����v%S�t��C�4)b�sB�Cp��^zw�^=&7�`�����}0_�`�z�F(kY�T���9 ���9
2H�
e*x���B���@��o7Z�Q��!�1gK?L����������kR�|�&zw7d,Mk������&N^�*Pb�:*,��$^���`R4�-��c?`D����,��X�/x@�gX5"������0/R
�!�_��H�@���M�
Q��2��4���Q�($��C�4%��G������;���7������������5uN������un��N������P���|��s_�}�E����> ��}��������;���0��{yc����/���p���!�uC�v`\?��9��#�q��
������k��$�D������C����WW1�n?x�d���yCA���Q�$������W�Fr��XTUE�~t�xe(��� ��!E������6���������S�E'�s���S�"yy��A�f
���E���{���������>��E�iMA��*p=�����A+R<��BRl&-���zS
V�O�S<�N�]?(���U���I��x��E���F��0�c��-m"x���4��@K��0�F
����l@�:�� �����nxM.����TR<X���2�@5� M�+
<h�D=�Q��1��jxM'�s`�����;��k"�����G	�S[�eS�����
�����pDz�v����2�[,��;?s������XD�T�O�38��O�F�z^���/v���W��|��i#�x�T�?\��3)h�����<Z�K���(�`H�j8��
&�p�n
D�0�0��-H� Q��6���F���u� I����m����n![u�=
Ii����T����68�\!L!���Q9S9AqI�GiT�#��ol��N.h����x��f����La���U�\P�L�������SN�")Fi�4�	�h����Mw�P�/x���x@����T�d��6F��P�G�IT<`y)j("�H8WN�G��������EM%0�U�G�����]�����eKD��x�[/�������#�
��L��@��DT������e�+�������
�zm-��9���>0w�����&�W<���s��QP ��,zFK�����K���:X{p&���||f�X���Q<���|��@��2yN����-����{/����z�K2����,���+8Vk��6e����tr��������0�`��i�^�
�#:����0\r=����7x�Ie��s����`R8�NM��$+WQz��5��tm����
�F`n����N:�(0W,>S<���g.�T1��L��M�p�=���S�����bP���M�l���?�����������{��I���S���J�?HA���}>�A���xPR��� �������8��)��KAw���<b}�,����������MUt4k�C��l�G���A2w����gb�b`�An�D��&F�0�S<�M��n��5�T��2��Y`���A2��0���Ey*b7A
������N ���!���h�2*%�x���h���������SH%!/x�`�3��?�@6��$[�(�)������m�^b�<��@�:������-�z�3��4��N��mG���{�
������]B?g�v��#�t���u?��S��u��N���}���`���60�x4i!M�
IG��0�#���3�}�q�-G ��X��xPm�6�l�����&SC0�w�����
C���Cz0�S��8��2,�J�:����O1�Yx�����G*��
03������0�4To���a�MJ��ma���u1]S��I���^�&X��
)%(p���}��
�m�;�4hW�p�S`UO���8������tp�Us!������o���1)'��0e> ����X����E�dc�#j����	 ����{Oe��7��D��:1'����{�����<��/�������'�b� ���A�-�~b�w��K���4i�5[���y��J�g����j���
�<BQ�S!uu�A��0"	����sa:e���@����C���Z��,���������5
��3�d����#�Q��H<]�f�;��o$Hq"0���H�����`���6[��_�����?W//%W	����Em�~x�h�?V<�ok:}�E������J�	�����������~�6��k�����^����@�|��$�"�i.x���2�;�������9�\������b��x0��d,��7�/s�_�N�����������=�h���d��������B�@Kr�a]��G��4��O�>��2��%H���-�3o=w���G�'��I��9��\/0�������2�������r�	��~Mj '���7����&N��(���:�:���rF9;`��f�n���a���h�����f��-��x�!3.������V�~���6H��F���ev��l*	<` A&�{R��BAx����x@���M�Lc�J�,���\��X����5X^J0x�a'}����Z���s,�3#�Ur)�D�$s�Y�� IDAT��Fn����CZ)�
���Q�wy�+�
�����/�f�f���7o��M�������q�:��r����.�����f�f��_��Y���o��0��c����k.��������4�.mALL�G��]BD������6�l�����9^�O	�4�G���P�5�����/J�j�n������h ��9Cn�>�1Kj�������4?�	:L��N1W���N��x��t���0�k����)�u������>�
�o�����]Y�<h�k)����dR<�����7b�������:0�����o�x���,����C7��+L������l��vs#Y�`��Gn�������jy�v�I�����s�x����B*	vu��yx^������sc��0(����N�t9nXY)<>Hp�x<��r�����Ke�����FmIY4�������q�\�|M�sN��N5��Q\�r+5x�h5S<p�8"6��"�/�'����0�R�f:H�H�+x0k8S<X��
�4���naP��4������f�g�Us ���]�#����wr�
2`A���l=���}�Ox�O�sL�`��8��E.��k
��;�aG����c���E���u���� ������x�:M0����(�j-<��&j���*hl:b��PZ�@����i��.��x�yT�������$������y�kC
�\�����\�V���]1�NJn~ �n�4��������&��=�n���3'�4	�I���(T������%p%��!-=k���X�e�&R<��}�	A�@i- 
x�U�.�M���D2��h/���o���D�}%����	Ip_��X}�M�]�$I������`�t���������@�F����ir*�EP�{�p����	xP�^Q���<Hy��;w���F'�T��{��������$7J�;�Z��*�j�V<`!�Y:B�3�	)�����A.>�bq�V��X������j� x�N�'E|!����\�����Nj����C;I����i�b�q��'��)�%����z�N�Owt����\���}7]g�YOkk������M���������O1�A<���mRRP#��W�*�PV��w��EK��<��[�T�����E��j��w��{�J
s�m���nI��z���4�:����4�U�'j<hUO���f��jzu#��t��1�{�\/����[�����<���t"�����'b��t�:�����\����%x���L"i���k^�1�|���MWg��|���\0�D������i`�N����+�{�O�f�z��YcRG�]����������Q
T3!��yBQ�S
`��h�����37�jT���F5����?�h��/*�+�����DK��%���o�K~���\	��7���>^��w<z��X�u�\�����&�SR���*�x�N��#������f��1��1�.!X`������Ux�5����G��.s�e+;21��D����	?����5�{IA�@d���V�rHz�����/x��5��CY��Y��s���?/�)��dC�m��)��(��������\Y����AZ���4�B��-���K��W�a����Q���P�'p��G��h�y>���3�z������dZ�#���!��f�wc���t��p7��20`B�\$�M��mAO��=(�+"��V/������[#�'?h6��vk]d�3���*053J�3�z��@���F$j��B�#���NKji��t:���J.����"��� <���'��>�6��R�\gqYX�o�������z,M����L"��a���?G���A�z�H��*�L��Gl8:�hC��<%�ZpnS�7�<��Y�[t��� 	%� T��M
�	(��uo�������6�x�p�����8~}�he�sk� �^����y�����+0���p�\FT���]>���$����"-�p�����q��q�1��6(5�uH^�
�;�_w}C`CMrQ���}�;��7!9��mKkQ�w+q���&�����#�wJ
0�L�������m��S<�����$E��6k�����tJ��P���k��x�������Mr�9���:���^
[mK��i�/W38�
>���r��IRX����0��h�>��/
<JL'��h��_����9*��?IQ �\!�1s[-R6cx�l,s#�~RI���*���g	��~q���M�q��0��
vprrrgD�q����|������&��\,D��}z�~[[?>���2W=����aI�b����\�N**gor�����t���g�������l����I�P��� 7,���P;<�ck�)���o������K�>��"[e��.03���{��������bR����.��MS�
�������8�kg�w�q$���*��	�p�_�����2����I�0�@��;I���g������s�uz�*9����n�h������P8��m��0x!���w�R^��!9�I��;A���"��w�����4����I�xRG�xp���B@Q:�������
��R0HF�����	�E,��B���B*WL!���l�a�������\V� ����i`��lS�d��U<HI��CR'`�+}#[8���g�R<|�J�!>�o6X�N���+��S���[�����$���	���u����)�e ��B�����I�C4W���:�l�5�<���90U�$Z�c�!�����:�#X��.�VJ$��I�T�����4�
P�F}��Fn��H%��
��P�T��H�����x`�R�{�&�B�f�����xI������+��5�:��(�:4���]�CKRu��Uxh>T�����7<`u�6"{Ps�=�9���	y��]Xx\I�nd	E���!X���������P�3�D�z�7��}����!�.��N�37,0���e>vNON����h�U�&�����������3q����n�������J$e�{z'�����eS$�RQ���ne�m��&�|��n{sA�Y���iH ]�w\�����0��.���8��I�����Aq����r�E.��A��Q��
������\2h�f�n��HR�1������RR>~�����7��w��&�p�c.x�&���76O�b��������jY����4V�$(��t��MJ(--��WC;r���3�ogU����#�[�_;�A��W��U]<~�n�}p�}f�^�QHl�#��j���?�������g����gB�`y��i����l���5Zw�m�F�����=���
'x���p����4��20&E�4�Y5'�Lk{��g��6\�����+�$�q���7�I)��Z�{z�"Q�mo3��+�T<���"�sw�?�}:	���	"�M�v�U�������Y��n~kR��B�������tv�ZA����4�E[++�����4p$X�w�=���N.���{�W�g/$��-����;;��(!{�s���]��3�?l�����x�<��_=-�H��g�3�U����w�[h����0�l�6&|�v��j�BYW���N*'S\a�]
��G�N��]M��	tH���)@��G����fv��X���!V1�;L�7p�$�Y�qn6F�B��x�H��#����U��k�V#q��J�k1�.�C��CX�D����YO�@�T8��;w� &�e���XD�x��HR(���4���J���������������D�W��6��O�m���*�j���/FJ*}�(H���:���/���I��!N����-���wx�|�E�Pu��A���O��h�h��O�9��/=�rU���yC^��I�O�
U��R1��KX6�6w��q����C�c�������k�'N���Vq��q|.x��H����=i�]Cm����[1��;���<@���UA}C����L�q�W�����@��;b`���JH�Sm3����I=ja��{�������i-�m9��_=>Bj�����n���{�?G���}��r@��}�a#��:=C<������;������,P�A�&�q���������I`��gw��������+����v����H/hhU���I��v��A�k���]��<�T�������#�u������]0;X��M>��y-So���k��#������m_�?�����^������\@�$)��kbq���;��M�����}`C����/������G�AUr?��'RH���*&���iG��L9!���^3���D�
��sC��7jNk-�F��g���;�j��� 5*����g�C����S��"�S<�FJmC:~���47z��������dk[�Ft`� xP���\$��]2�$%����RRR`�,i�b����=#�7Shd����������������0ZO�B��m�M�N^���>�(����v�f�z�_G�xk)j��@�8U-����!4�7�����Ua�����F��'�i��xc4���X�3F���������h��@n���n��k=��D|,���co,�4r�D��TDx|7iW	@�r���}�������=B������G�����=���l�g�����<H�`�����*{�����������7�>���|��i��pj�0D�\-0����w���Sx���3��P��z5�l����0u�|��r��=<y���L����ecY�KB|�- 
xP��
������$WE�!��ZX~��;xP����J����jA��R�&�O��(��S�AR9��Z��u*������ZgY������i�/
x ���C>y]-��>\`@�fS����L�#�ki��<�6�/!^^W%�/[d����|bWH(i�QJ(i����(��S��(��S����SxP��Z\}
�KW��KJZGY����S����/i�R��PQ#wm,�`f_2�y]-��.�MWxP���:}Q�AY�]��J���L/	<�����
���Y��Y3*a|��J�WyI&	<(��I�E��;OI�Ai�T�����dM_\|I��K#�zI����U��X5�=)�oR_`�
�eB���
Cy���u�H��$���%I_\�����������JZ�$��$y�j�$��&M^�@�|����������������$��#����<(���l�
��|�����x ���zq�@`�������nQ� /����Rh[����6�=�S�A�MWlB<��DxPl����@>&�x�v2�NR��;(3H�$�K��)��kS<(��J�Z���o#Yc����-��f����k�AAK��t�JvIg(	�� �Q���]IH(X����|�v���k��^^�&U�Y�@�(&��x +J�CP<(;�����k�Ay�}Qu���_J�|���g
�A�k<(mRj$(|�V>��e-UP<��be_���xPr������[����o������|9}W��`�X@�b�Re"��2_�����y�������m�S�xP�Z�C]��|���^+<(�-(���]����IE��|�V���cwYK�Y-V����lm,�%����v�5������^x �_Noj*X�,���:�H�D����\�N�)���N�Y�I����=&&���P������������u�g<<��5�����G���&T�
��������hiiI����IHH���*D�>Z�����)��-�by��
��>E���������$U�`{|��SM�����������x����CI��!FzQ���+J{��bnT55�WA]�6%J+�DB{�����K��P�\����/K��UP�8!�T���+U�K�9�&A
W�LJX��%������5)�g��R%L-��`�{h� 6S��5���Z'��t�R�%�����2�T��HT�TY���O;���8��p��|���hu����V��U��)j�<��l�Q���}���^^Bi���{����p��w2zg����d�����B�E��t�z��(Mdy~���g��tMUi�P�8q�o�y�G�*T�������>��-KYZ��.�Y�O/�8�����Y*����b�&��Ma-]_(e&Je;i�C��>S��j�O};E�GR��*���X'h�0�d���i��D�j�T^I�����)����T1�hr��T�6��xDI5�jd�_Nd���4�)Q���"""��MI�KS3��F�A����SH+X��Z����V�b�/((��>(�g��sB>��/��������E����5K�WFF���`ffV���A���|T������=BG����ve�=�����
a|�n��<�=*�x��+�=���J����`5����GE��	�����*��O��>%���(T���KEy>*B{T������AY���<+����7mE�W��\Ei��00����T7V?�@U^�ZQ&����z�|��(�Q6V��e��iy�RQ���x]^=B>�T��zE��C��iy�RQ�#���(�!�����'�����P>}A^�T����Ca=W^�Z>�T�����Kn\<.�Vr, X�\Y�
*�����SF`�2�)�����~�y�A���w��������SQQ���@X{�U{|�wAEh�,�-e�!�;W�dY�!�GYX�dy2�=r���,��������<��=J���SV���#�=��#J�OY�GJ_3�s��GEia<"{�-�9����\����oa<"��>M<�=>���-E�����	��O�x��PZK�}��2a����({��^BY���~T��!k��j�{F�RT���(�����=���=KB����������d������rj ���-XM*B{�l��S�=*�	*�=���Q�#������!����3^Q�C��~%�G�i��������OU��*a|X��TE�T�����GE��>%�G�y_U����^_�������|����H�C,T?_�[a�*���- T�m���WQ�CXX.]?�w���a�[XX�w�.]~�x�t��w���a�^Q�#�{!S^�HEi��2�C^=[>��C��Q^�T���(�a=W^�Z>�T�����/�+��2���u<�W���OX����I�.��*)�#+Sz�JJj �n���bbr�����������kXBIEC�{(�@�����3�HGft������@�8	zzz2�-.�j�&RU����u
m%���$�B�����RRR8%[����D(}����@CC��hee�7����d����`dd�IlV��|��P����Zf�����M��%�`Ky����<�����)>M4]]��K]��j�+$!���
�ub=��P^�C���������~��a���%#]+L��K�#M{(&�A!�|�?u{��W,H���E^�$�c�H�����B����R��w>u{�����c��%�K�%�Ga��i���^�l�5�TA��i?���|�B�
P�E�RY����o���Zn���
�P�)��K��0���2��%����A���<�[�y��I���q�gy��"����\��������,Z��wP�|D���D�As�4Z[�G�jJ����t�������<n��<���%�:`Q��� d�&�I]�"Sy?��QAU����'���D����!�mO^������#MU>v��&kzsB9���������K�x=S�L
D�W{(�� \EL�K�.����z��L�$�xD����S�X��0�g���/i��`�����t�I0�����q��d���I�~p�,u��/���B�6���.�,#6��U��<(�	%f���#�e�|G
{\L�X���vQ]�);����%�"D���0��Q�j�g�,�������v����+�t0�`T�XE	��~�����1I�p�)����P  IDATkNYP�n�}���2����n�.`2�.�.W�Vr�@���2����H	(��A�@B��u3��[��.���~u�I^������;��{���v����~�U����<,�P�	�)��V�i�����~9�8jp� ��rU���	���iY�_(�\��^�Y�ET����CrZ�7s���j���o���|��6�WCX���{UL��!�[�T��������G��<�K^�f��h�����&�*���!�v�*�4���,E���c'i�W^�Ti6O�&���8��k$F~�"e*+m�Tx+�Y�)0r�R&5QQTA�'E�(����T�cGl��FH����2�`�e=�X�"?J��wn��(Q������jJ��%���NH(X��Z@Jno<��v�I*M����[$[H��9�]���T^c	�Aym���%�_^��U�� �e��lz����x �
�@6{}i���Kk1@>}�	����yY�(�em���������R� �:x����P����e��A�ex|t>Z���;[��lo<��dxPt7�(�M�!3!J�����i�J'����+�*�"z�b����$(�`��Xy�2~��	3���z=���.�c�{��L�r"��0G�F����9���
�":1	7_�vN��Aw[�$����%�?{�Wa��Ll�c��)�MX���+�j�O���p����I�P��A�:�������6�ybQ���V�����q)��W�F�t,��,
M0�e�
���6v������_O��;����O�$���u����(�}|W������G|B:v������!Ur"-�{���)����V<����sW:�`�qR&��M���IJ��fy���u�?��
�;�d�W�D�CE5WGrp:�5~S6�2���������%;�Y��:Rc3C���_��d$I�C^�A�����K���2�t���T�L���.���M3n�OC=e�V���<�3-m��f��h�����kO�l"Kdy*�v�oom�C�Ux�w�,�(4�<��Y�Va����}���6D���S� ::O���A}\�&F�����I{���l�
W����N�j�ii��/�<6<N�H~���U��s�S�����6z��	r��K�%��66)���V<Sy�Mc�%g��	i���_��(]N������cz���s.VmEi�W���-/����6�w�m��m�Uq��lm;�c+��y���dc����,�r��C.�5�������&�wi�9����>D���-_�Dz��>�@-z��	x��J�����[�|d���������V�i��?����������:���!�\�J���1�����di��S�&F�f���A���!~�|����j�[\���Y��R<PR���Ax�`�,����%EdUU�����%�H9;Jy4�6G����J��u��x����|�����9�n�`nj���d��e-��uOs��y4�[vU�������hT�U�-��p9Y�l�
uu$�/����&�r>��>������������6� X@���z�kC��~��	��<:��y�A���(������g)�Q�?C�����������6��*����_G��'J����G+�������<X>�/~<|
i�O"���
���5�w�f�k�����k�q`<C�+])���<��������o��=`S��?L��v���!?U(����dXT!:"�DAyhVy�.���E�e��)������B���g��9�����8�>����x���jX���Z~6� ==����g'0�s��k����X��|1����v�����_Pw���<��\5,������<���6V���I�_
x������[a���%�|�y��<H���z�4�h���W��<V�O��a��[�������cM�c$�����A&����M�}��qo$/�`DcG���J�����u,��he��w�K����L�����t����C����KU
�Av3T�R5l����5bA�`��5�c�l�KX��<�v�R\������/<���+&����`��)<�xbN�����;2?e4]:���D�G���)�@��!��!M���e����jAw��H<|�^/e���	�%x����-����L�&�y�Uxp�H&1�L��jb������es�"��?�b���PRR*�J?wv6��]��=������������_����3'"�N.��k'��$Sg"(���cc��
���8��4���_��T����8
���l���<4&������a=D�g���T-kT����}q��S��b�I�]�>
p����������h��N����u�O��hKuR����H�~������!$�����]�
����
^��������/� (|l�/<8�������y�kCG5������������0���S]�YPm����x��zC���m��)-	<��R����PTT��gI�����a��@��� �gxB'g��Ln��kT����z�(�\-����v�1PPTB��
P�d	�6!�������N���@G����[P���6�-��
���L��AI�M�?�&=�=��o�����-�F��	*�5������J�b[7����Xhw��K;��������B��;��m���F�:��~�a�)oe��B��R=��"�+��
}Mz���a��388u<��U�h0�e�~c'��<�7�gv���w]y[�=oB�`Hq��?�d��N�x�/�@��f�������A��"S<�����EGNaF������t��cX��;�gN;x�!�<y���T���D&$r�}*gr��������(�`p�Zhn������
��j��
j���{��	������)���b�������}����Uj���{��cO���Fw�jP�����m$�Xl^�<���}�)W,�p�V���5�\���N
�D�����#c���3��hqM
��\FMSCLj�Qq�nb�Q��O�-���O_���&~���A�0'����BJztnI�* ,>	k\\���c�:���'�Y������d1V�}��wm�����&��c
5R4���^��II�~��9-��M~7?�D�U��]k:�C�=�U}�*+a��D�����.F����oq; ����F��2"�����a�����]B��A�j��m��d%�~j"�b�����
}������!y����Xw>>�s�|�}5�r�F��m���qzf���&�1��h����k�����E����K)�0k�z�o�x��Ix����g����o�>�p���K�pt�2�	D��U������#�@CE����\*��A�vcP��)���~������y�z����+�s:�������m��_���/���4����m&nG�]���T59����	#�����q��Z0���+b�w���P6Q?��l�n(����x���I
I
\��Ab|.ND&m�T���*v"�}cet��K�����(�E���������pm0���-*�
���
�FdXn�OD�8���a[S�����H����S�������"�^���]:����Iee4k'�)�B�%[�](��i��L��f 2VB��$(�)B��*}�����m��v#U(�+ ����
���Ue�����p����*d�w���$&fBWW	��h���DEg�ic5��d��#�Gzv������ua���H	��	�e+�IGM�fA����j� ��	8�A�<�d����m\e��wR�7T�Acud�3�I�o��A���r-��']���
�&j���
���O�	�L�������<K��	V��w����i4fI���2�����3`=L�*
P"���)��V�"��h�_�I�A�::�0�2���f{���0��)�<����!���lE�7�����I����X�����wc$$e %5�V���:�>M�o=zu"�{����$�@j�[�RD��V�}Ue�����Y�]C��������*m�5�'�������;�Y+�=uy�������s'�����1�I�z�lv���Q���3��vA�*U����iT'-�wV:��P�4E*8���{A��ZYZC������}B�T�c�$+(���<�������+��TuL���T4ah���}�.� �y[�Gz��{^D����
�*���q�����x:Mm�����,�?�	��wzr���xN����t�g�w�q��uu%�[�G��H��zi9B�0��,�{���AX���	zK#[���{J��T��ABB&����#�j�`c����`H�&�i���d$���n�������'����:bIy���dz)���,���eeJ#F2m��)����=O��������=�7�^7�k[I�l\��Ok�����D,;}�'������u-M�\��l��U��#��dmjX�1���>��Mox�GUc=l���'oC�iNGx���>NC,}�	���@L� ����	�KJ��=z�ee)���"�k+�AP����2�]��@���L��-���v���s������Th�E����)��m��g���\����n]�e7nbN���������-�O���=~�r��UC��4�HME*������ZO��6������q7 @j�x�J����4>�0"���>�?���z��
�	��a�+������)��_L� �y=����O�}U$Ed��j*2(YeR�1�SB��tD���(��MG����Z���*�7���T@���e+�mS���C3a�K���}������5m���^e �����(�4��H���E+e������T$Gf����F�J�Y�$�����E��;qETb2�����!��&�����7"��M�m��g{��\EZ_��`���v�9T1��y�-�'�=|�������S���9�u�o�x�����zp�������*�ehv<x���{�2��
����FFKu�E)�����Scz��������v
`gj��]L��~�����y��?|E��H�x���+�m�i{.#9Mz���XXa,}C�3�����z�L��{���r����*�z����g���r�9mdA��D
����6t����
��lKM<~~/_CM=���w��4����c��H���������Y�I
��
�0Z����g����g\�H�[g?�����Q_z�������s�A��5i.�_���q�J��5W��mT�t
i��-_M��_���4,|5qg�"=2Z-�@�n�"kmvg)�f���
�������e���l�����BDL0v_�mG�kY����39@0��<����[Z'��	������kw�"(�^����E�u��M���,-
]�{?��s��o/�w���C��<	+�M���q��E��-C�`����q�V�����!~�0ii������8����m�T�����y��G�m� �p��?.y���h�D�����|
5ee�i���=q��s����ob,�x���������.���w�>��,�z��N������)k(
<�:�9,;�������^Dx�-I�VDRH�~9(k�B���{n 18M~��7�x������8����N'���u2U�0� .�5��z�%s��0��>�����N\��TD�uE(���Nc�*������4fN���Yp��+T�HM��Xh� [x�Jk$��d�uD���i��Qg8�@-
�;�^�����
�?�2���
���A�	q�Cfd$t�	�5���P���;d�@��J��H:x!!�Y��~��_���B�?��-X���5!{�K� 	<�2�������w��a�x��2I��'L���d5@U�Z��^�M�~��B�@)w^�>F���c�vH��
i/!r������7|����8y���xR�:A��}����0{�����s�C�
�����1����#�bY&4�r�A��u[1��q�y����E��p"I����]Z!0�dH�i\����V���9S������x�C�th��__��h�FF�v-Q�N�F��[h�N����������Bd~-4<������=���������L�A�,X�0H:��H @,;�+z4��c��k����.M\�|;��lFw��>��,���������a�6���"8:�"_����t�x�j���
}$;"��
Z�������Bi
��
w����iu�T��w���~�_���B~_�����;����1�;K_P���x�����`�9�T�u���$�	WY'��Fa����S([A�m�4�I�Y�_U���/,�$��v-5������X�wT���KK�_��Z00��������H�<��3�o�����Jz��lh����O�����A����������72�����5x�ldA��V������h�A��x��_=j-$��pBNl�j<}3�W�'��
JF��B0������������v������M���;�6/K�tio��a�i;���M���7eFl�kC���l����Frm�*(/�C�����a�Q������=0q�^~�m�������>n�z�������c���a�cJ�vxMy�$�����y�t�Rc�w�8)���uq�_X���);����1���hHcgGh���cx�������u���l�J!���cfL���v�-Z��."	����m�?B�:�p}���^�x�.�G���=g��6�O��F7�X`Z�4�:����ma�-7�3�;�H��5-|]z��E]Za��*'K	$XFj
���w�/aV������l������v�h*�J_]j�b��'|B:�f���^u�x�,�E�#O_r�����FT�p�7I�V�4L-A�Pxp��������A
�x��o|s��vi� z���{���.��R�m�����S,tj���d����;4����������kjQ�uo�)�n���-���x����~���n��O��
�����G���k�|��z��2�Fo�F���q2N<���>_a�����b��������
�9(���I�y�*����?�O�&u������WN]���f�'H�����#�b�a��������f�����Wp`�/�j�������v
an`�{��1�������J���<X2�(Vo����-"����JF�8vn=�~���1�a�k�[�v�� <�^x����m��x�����Nb������\�s���y�(�jz�8�6�cD��<�%�����}r���;Oa��8uq����~�z,[��T�Yx��6�}����^�H��
-�l0`������P
7�&���%7�OS����h���'��5$���>{���%�ka��������M�������������$�����j��W,~�e������JZ
�������Gu��+����#�6����\),��m��Y)#���u�;������#!��4��Z\+��y{:{ �fCn�$-������ui�.u��&����
���1y���#����A���E���4����d�OEW)Q� �
�M�0"�:Db�KAg�j��Fj&h��*t�`�@�\$�Jy0b���&W"`����P'0C�L�UDH���2m��;�CjO%DR?��No�����������kQ�J��&0��:�0!�%�T4x`Iu}2����,0cKf�����	�0�#Z�U���*6x�!�M����k�9�kw��Aa)��$���&����{,��*������OqAx���}�� *&:�7<IG-{%XUV��)h�\Dk
�I'��R!@)�-E')p�����S�;�`�����ca�A����ob�-O���
������-���%���A�i����I��8��f���-�?��SM-��x��{�	Cu
�$&p��p��a���z��Kg`�o����r�O:h��!	<PV�F�~+����h�Z��n�_^A\�8���{'@��=�	�<��Z�9����6'�Y�/�M�MHcX���UL{!��1�w���w!9���RI����.���qjel IDAT�F��C7��<��c�c���������}(����u%;\'Xbz�X}|/q�����s�+a��4�"����������� /�6��"h��R�.�1t��@z���n]�9<`B*'s�HC'zW�����2X�_���*l��DP��	;Z;v&`�W����Dxx�H\x����u�;a��s�\�����c|O����D����>�f��f��3O�`a��XK�	a����=K�6�p;4�����1!�#	<����%wR��I�����;���N�J�C�,R4X�N>d���Yh_E� �T�q�������d�(z��vO���*�\e���2V��b AE��n�&���FZ �������)�)�:���s���V-��p����5���4��A'�j���L�����S�k��C/�aDs0�O�F�W����mXx�*qo3a�N������))8SE��t��J����B}�Y��,������
�d_
x�N�.R��@�^�8�mv2%8�QEbH&���!�&����Pc�
"<3�X���w�Q{�*��HA��T�&)��u�����*��
5Gx����*�EP&���?��;V��1�f�"������T	�HGj"	�>�%H�k���"��s� ����S����z��|��M���4o�����.���|����:��(������aLmD�X��nV{\�D��_/����Z�Kn��`��N���+U�s��_b���4�:������	B��e�!�A�Px ������	*��/���x�&�6����^X��	�n>���X����0�}C|@J����F�V_x��e	��S[�����#�P�������z��@�S��������GA�Cu�{CT�I�oC}L3(�?����k���u���N�|���T�_x�A ����	�'dACW�����U���/z�-	�� %��m��Hc�����$�w�0�@�`��C�a������.z>��1S1j�z�vH�^$	<[�c'#=,����p�44�*�����X��6�[3N
{��������3ckl�7��
��{/�����1�8������LD��h��������A��CFs��/os������~���
3~��<(xm����e��
���<}���w#��?Fb���p������,
�Wq��fR.�H��F�%x���9�<�5��Xl�����������?�����f�{�9�L�`���8{-�*��,�,:��uZ9����[���[e
E�]����~������M�l.��_6]6o�A��-���|B8�p�����TZ{f�����A��.W����rTm6�@!�?�M7;����p ��`_�&��k����i2�ME�����%W���������J"��&���:��S~�xy�Z
����Vb���8��@h������8�����E��{� r�(��)��m��y������H:v}� ��E
�8���T��)d��@������%�`��8qy
��#���������Wx�=���@���2���u���G~H����6H>��L�Q���~��-�|�!�������A�K:��'��#�~�P�[4��X����o��6������z��E���;������?�b��	����������
�n�p)0������K3�-$hb��s7�O�L��36���/��
s���:�d�����^
����+�0jH�t�2R?�?]>~	���B�
oI�;�8������
�7����b�P<`	�6pD?�/������
y���D�}��o���t�	-�d��$+f����n{]���4�w��!^M������)���1�F����?�UA�a�pW�2�N>n�/<xI��?T���W�l�R@��0� +�s�����:�GVR*T���|�D��OAGgmX[�p�%~o?V��$'������HOE��c�E�@� -x�����4h�"��_`
9.��mD����m���Y���?��AF>� '
��L�z�����:���!����B*�	<x��
C�@�|3���T�o��%�P����A�Z}d�GsP"����DI�y#�j��c-�s�	�>����c�����-�q�������;&{S�#����f�9��vU9���mL��j!4���+�c�7�1����t=������7~��pM��`v���
��\{��R�Z�xr��������0m�A��0f�N�&7L�	t`���50`����5T'�rt3w�����'|c>[��
����\Bj��2����HM���c�SBx���)��Sk]j�r��6)$���w!*�V{�����S9�S|����qt�?�@Pv������1����)����&�j�)�.R]2�b���g0�����&�<�I�h����n0HbX#�0�$0���5�26���
���M������`!j�`2����CR#����& #'<#�����[�����<��MCRn	���������K:qJ>�)������C���<7�+����Q=R��K�#K�h�`F��d�<��/F��;
S�����C���6�_}X�d����� ���S�y��uLc/��
���}!����&�����Q�T�	���v���s�H��*�vH�R-R�������[&�A�U��L����
�|P��=�g�sR�*5x`cU}�~K,�\��)h�{���X<��������[�
�g�3��������E3���?G��]�j��@fC�=�J��1�����+���~�c�{c��=t�:�|qf���t�A�Px�N>�.F�Ho�����I}�lz��������Mqk����H)�����E<`�
h#���$X���.mX3���e�
;�j���4��Xd���y�����n��|�6���&�m�&�����IB[����*PY:�����N�>#������������%N�)�m����{�X�q���/X�7����s
�,�g��p���u�4c��g�MI5��Nm���YBQ��2ml�u#���
:K��?c�[~;�`�U	>�������6��H���
<P&��px\_:
KR�&4�F��|~�?�&�����@m�:� �"��a�YZ�*H���"�W����g�<����0��R���&RD��{�Kb�X�)����M1MM1�1����{O����������\�+�������Qw��s�������Po����,%`!5,K<8�8e��'1��A�F�5i���0i�LMI%f�]4�o��0�~?s9'.<r8|��/��p[(p0x`C
+8�8��^I@BIIxI����`��������U��	�7(1�?��l�)�vL�:��>]�����VlT�dJ��������w���	�Zu�2�RS�f���vg�m�D�g�G���0��{a�`����6��J���<z�H���m `>����#�������$Si<�Y���W�:����1��3*p�P<�q�J���dh$G��� hG���*��!y8�������	}�t�����Rcnk�^M�gl]�:7���va�����	&�^:}�o�t�u���7#��P<���X���h(��)>}�w|��e��Rx���c�3IpX�	����
�p;8����j����G���5����T��d!�����Lq�P������u���K��a�Z���I��>�k=o�k\{��`�� ��:������q�I'���>�0cs�.bU�w:���t���e�55��P����B���j����=	Vs�]�_��5=7UIIr������fy��*�B:�>����I0h���!�/�7j���Zf@���#�_�Hj)���%������5���H��wO]����q�n(n=���5}�\x�6k��-0t0���o��������Q�Tx�;�H���[K���>B�AmR4%����\l|=���oK*.2�B-���)�	:?�)@�\Zk��j�5�]]����|w��i�eH`�)�� H)������(���e`���Itm0�p� 0VK�#�+xG��81��y�����@R\H
'���D�et`6|zh�Le���n{[Rs��9��e�.r�8>z�iI�={0�
�mx$��<�1-��N�<P�Zx�MS��ilI�oT���G���?�7����SK�v|��-����?�������j�&h\�q"���ss�?�A�W�"���b��u��V3�8�@�k���������t�mY~�r���@�X����0q���*�ZX=a �p���M����[����S��~�g*+ X�Xs��V�kri��y�6r�%������!���P���NTR��hA�j�P����DsD;����tn���M��	,�m�4'E�kt�9�u�����q4.�2X������P��4BR!�}�6_<�c���Es�-�����w���_9:����o\	��aBjN%%m�.�M��,8v~;�_��?������u���O3������z�-��^[(0x0��i���4��5=����j��=~$�~U���.:������0�|{��X������^�"����U4�Z=�C�#`�r����Q����S�^�]��x�����������%�8}����#�;tc�5��kA���[��mO�`"m�d�������tkD��_��m0�6��&0d�i�$�������<8~�G������B���m���
�wc�`A~����A8<a����s�>�?�u2D�a�i$�:�O�($<�!��h��
�pv�;hB�����������f#h�4�-_��{��-�J���Mx����8s�������0��*�LI�k�|�������o!��id?����SZ?1d�F
x�)�,�����7�`������ur5��]����2{��l���D�m;����|���)=�4o}�����	�V�
)���h��'�x}�u8��O��|����U��N�$x���^����/�u���?����)�WXm������A	[�'.�@[Z����A����h5�����D�����VP�o~V9�$���v�?3Z\��'VX�������L������yBH$h��&��e��W���p,{k)z��D�\)��?9�v��{���0q�2���v�p���TK�_���������X�.M����������h���8��4��8�K��1�$�3kW8x7#���HO�����xP�����q���$��q3=
����;\����^Gkt�r)������!��tENX�*EA�n�����DH�����W������<hn����~-��n �_@�>
�C[�@������Lk5CF�5`;�+�x�����"��nXv��������������R����{
E��J�Y���4��V����)�������5���K�zn:��RX�%r� �Vx�B�E�==�;�*��1������a<�����x��������1� ��#����UXI;��<_q�$��5�~����H� �>�
i���N��G5�������9�mKQ�)9c�iw����-���25���C���{��Nm1kk�>�'���3W0�cs\����
<`�����!%���	u��-`�,��I�`�H���b���\�:�F��v�6F��O�WH���~��V���z���&��r���A�k�g
IM������Ta�-����M{1�a-����[�d��$1 T��mH�4���hZ�s����C�(��AO3L�{J(�����J���
���Hx����bp�p 8���A*I����47�y�M~��^�x�
h�RJf��%�qx�fn��tA��	<`	hU��G��F����t%6�:�q]�c?��"�,p*�x���v���G�J��f�`��M��7��Z��D��1l=s�>7��=��J!)� 8��wg����v�tRN��0����vf��-�W@���5����4�$���s�v'�L~��������~8��:A�������wM�3������c�������RZ��~=�u}��&�'xa����0�`����CTL���##S��x�������R�!���T��I���(�����hF;���Na8=�x`���\i�Zc��?�'}IF��	��bHV?!.���������LGNm��B&��S{tIE��$�jV��xN
?��i���:�|M�;����v����U�C�HNsN�T<���&g]�t���� ���&�w
;0o~<)���$��u��,=[x�aH���,,	y@���R���J8�ZE��f�Sa�;�!�0%�tt�a�;���R<����B�5���%
���
�9��:��a���P�mRI�$��
ak�D[2��+F��t�n�p��������%Z4�&�d5L�R_V<�����;�
��G���1{�a��� �rBIIxp����lj���Pss1Dh8�Y�g��!6oOG��tO!9�����%��h_�V�NF}+4rrNV)�E��������5�����&����4������MGf�����h�v=l ��t�8�n@���T+���3)$0��m�����[}��!)\��1�JxE�)Q7��

U �v!	[q_eeN��C��?�E_�:](��ZY&����g���t�_�^���!��!�
���l>�3l�h����-���"�R�@N�F����eT<���1�G���^�6/T�a�t�a��>��p���8�����f�Sa�~_����fMM����2�vS/M���
R;�yjR�m�&����
=������J��z/~�����Z��sM�f�70`�7�8���<�[3!��m�D���uz>�v7�����B#���%����|o)t"�yb.P�Zr	I�v�.�)������A�����T�8X��y?�2�����=���z����w������%g6��������	3�ta8V<X�!
���������7�c���*%��H���"Og����!�X&�N�P3�2D�N�\�!�T6\��D�a��d��K4 �V;`��lz�d��k�������#����l��\�
"P�;�����}LD[L��,����X7o\U�Z!�H�Pb;�����p�H��]��Bp��-�������]V��x���D�M�D��/�va8V<XK�/5������e����4���)lC��^"d���������A�Z��z�����w�@�k�����,��4]��)��������}B�`���x�}#��C���gP���{��P<8p�.)�Y��}��{JQ�A��
q88�����A}� ���Yw�:�����V�����e�y���w���w����c�����]�%�g	bimC�{�y������O��A��L�0��-:�Y���X��Q5O��v�F��w�-��!��[F� q�vXu���M�a�U�\�<p�uEm�&8va�f.|���)��v|�V|�V�=q7�&z����"6���
���~{
=��$�U����������y���=�7C/����=�������n+�,X=���C��	���G;�7x��V)��+�t���� ��$,�h0+�
�W<P�Kp�'��=�4�X��Ma��YB��C)(HI��,���
�>��M'�;��c��Z�������`9�&�)�P��R
���wX�������c���CB
���@�<h�u�P<�vd��y�HQw��k���!����N�	n[YV���a���8����������5k`5�#���/�|<�Pi���C!��
�}�{l���G����;N!TJH����t_�sf�7'��(�vS�B�`+)$�����PD�N��;%U�����AvH�;|� IDATm $4���Y�����<_xQ��V�:���&�@q`���]Hz%�V��~����[c��-�6h V��?�B�p�$�Y5!R�n�����.��o�/�J�������2n����l�/�>`�)I��4������_�]j�n��{����������I��N�������G��
�,U6s�����B�H?\�F�NU����k���I�u�����X�q�J��������������E���#���'$�kF1�Rqa�jAT�.~�YBq�w���D�Q8�O�mi��H����7������+�|�����
{Y����Kxx��j�<>��`�����(v�����
��*<���SA"��I�:�%��J�@��L����gaB�*�	�B0hR<��������F��o�c��G��������'q��tn��!p��������)�?��4�����KaH�nU��gX���>,pdv���FFP��Zq����'lG}��E���
r	hJ>�2��R�Q ���|'I���p"��!��7a��[�
���`;b�(+'-	k��
Inqh��"y���4�/)�=����)L��pn~�f3�ZxU���
�M��"��g��`������,pb���*��Pv��|.�F�K;�<(T�����7�u��V���vYS,�1w�P��p)���������� ������nA��=���]:t�e���(����ih+�R��NM,;|B�� EQ�8��U��:����M=\��A]����W���`���
O�����������Dh�j6VB��&���������������4�
����N��<?�����,��(��<�j3wC{��"$'n����:��t$)�O�=(>�M��F|X|H�L�����M���K�wH�:{�JA8I���*I��G�!��nJE���_N]e�C*����{2P@F4�iYsNbZ�<��>|�$uOm��~��p^~�����}�����"������u���Hm�D���d�"��8x�7�����aij����hB�*�4��6��������E�����B�]0����]�N�k���ug����A����� �B2��|�7o/B)��OT9��@�	���
�����>X�+>yaV�
V[@e|�q1fQ�i�.�_(���^�s`e7
����>�<���He�>]�x�i|�r�����RQ����Ex���K?"��5xP��!=7E�}��ep�A��q�����Xd����^�CN�%3�sr8z!��VJa?�]x}�LQF��+��m.��h3�� �7<$��;��������	?����+0u�b
�0�vP$5�z��C �������x
��w�x�)��9�U�i�H��1Y�(tr7BM��~�*��v�sN1xp���\$1 B���9%.�L�=Iw�qlp.�N�|W9����3IV�R���v��aAmH�� ���]��c��t2����7��G1U���E��#p'g�!I#�P��p �(��
<����������'�q ]K_��S���vH�����3���$��NU��mqyl�S����J�)��p*�x�E;^�mH"��1�v�o���x���i
{p�l�*1�������W�C�B����J��n	���Qx`U�D�<�Q{S��*�@F�m����i����1�i`���Z���Z#������8��shm%9,�(?�vJ���
B��N
��bda;:?����B69�9�Ba����p<�L�����V���C������_�mcE�{R`A*����&��]3���*���������<��4���|�]��n�P�L���&T81x�����qI�����!�!.!���b��H�9�&u�@S4�G��x�>������	����
<� ��#')�M�&�a�fp�c1&�(O���V` A����P����2�4'"��E��SQ��$�<�YK���A$��
Q�V&�x�B(�N����8�6�csY`�s�����rf?L;�k�9_?r����)>#H��OM��|�=sf�����/�%%"^�$Yz|{���A^8i���f����kvFnn��
�U�N����f{��F�;-G�6������������w- X!u�D67����V���L��jG1n#���G�Wp}�����I��%�'��19m�V�{��[�b���j��K�����=���}��a�Yx���f�r�E�B5
���}��%|2�w,��=:RH�������w��+�T��AA^�v3D�OO#��M�9��'���]�6�{���~@sc��F�6y�^�6oM����O����m�P
�$=�eIA��,pH~����T�d�L�u[��t��J��������q�Lx���?����������6��
}��+!t��I6$U�m�1����[��/������d�_v�F`X�P>�y�i���EBj:.��:9���������L�����R�^3z>�M����<�M�I��N�w����(��8
�������NJa��3��1��5�1���g��1x��k|_h�31�k8D��I(Y��YQ�n��x�mq=������`5x`E;�>������C����'��{�c�����x���*_QX���?���w+z?��{>��K���8�m���24��U��bq�J�3��uYS���25x�Ike��}s�����yy3���g���3�=��7��(���9RJ"��,z��d��D>V@��n���A���L�
�;3ig'���.��i�KS��|�\'�s���	(aH!���>=�����JX��J�M�N�6BF�
�H#H��R5zS(��6r��T��+���`L��VjR<h��A�"�Eh���.�9��+UL�NcK��bp0������yc��Ag?[^s�l���D��
�9��,x�KV!�&��;R8:V��R��2~��)T��`~�������T�O/��/�N��R�������G�9���t�����	
����PO������X�y��k��'-9rI����p�l�7���������_G��p�0�u}�u�>~�5��������)����PR�����qR�3����g�����K�_o���]�rd8N�ttjR<��%�����2/{��TC
d���
����Q/d
�|H�M��xP����_�{GN���_��H�:����������vQ��S�U�������0���|[���� �����/�/���k��TD���H-Z��g����z�������p
��O��I���(����|���O��ZSL���B-L�����k�wi=���^����
��O�vl��9���Im��A��x�7��SG��!��R���oY/CF��*i�x�k��F~K>)Z;��
����'l��7��_@�4|����I)1x���E�z���.~a2�����A�_2�Hjz�"0����W[���W(&|����A�c������_v�g{::<�N-���>$�w�N�*��v����~H��yk��RI��P(�v���4��GN��7i�#;r;n��)�1���MK�����I�����DhN��2����S�?9%�u����o��KTvKz�]F�.9G*�E����F��;}+#x���������G��g���/���*�W<�y�%�����4�������Gy�!p�85�!��)e~���;�H�!�V����}i�fK�X���p����C�$T
�|���P�B2\�5[($E���{��q�1�{@�pm
�fL���'M�rt��o���s�(�o�f=P���X��41w���{������v�tI@���t�8�.��PfFA��3)����73�C�"���K�������a�+��{�B�E�g�k�����,��'����_0!����>fky�n��z��J�<�����60����U�r�0&��
�v���~��OH������H�����
����(�z5R�2O������C�a����5�VB�mN��	FH�0���S�#x�Oc��f����ANl&2�=D.=�d^r��F��0�n����^H�qY59d5��=�������r�
sgN%9S�P`%��x_����x;���Mx�X|�����f������ck`�.���e���8�'�b[�Bx��@�NmZ��(��A!�Hqe�P�����P�]���$+#%����&��4�j
�P\9��]�+*��.e��\	<x��OxP����O����m�iJ��-xPR9U�xI��r���[q�AU�I�P�������������W]��������F]�Rx�kY����B-TT{5�Z�w[��]��R�&��"��	<��vTD[t���P��Q��j�<�,������h�.ujA�2�ynQ��YGY�*
<(K���[x���*�<�J�>��	<�g�����B-T�6�����]��t�&���ejJ[fQ�Ai��%_q�t)G��������-xP�:��Z(����
������
�����o�Tt������'��8��	6����*�m��}��8�@_u��M�Ai�*<(My���<�5�3	����)�f��>�z�s,��O�n�����������S|���Z`��������{\!���3��H��5�EM�C	��`J������H���-�RX�}���?X���F���$Y@����[Q��?�$����[y����V����6	<��+�	<�(���^	<(���ZN	<(8�xP>3\�nW	<���x�����l	<(�u%�@;�I�A�v�����)/�@A;�?�pK�|�k�g����<KJi8�I���+��%� ���$xP�I*R�@����~�$��q�I�A��IJ��GN	<�l�g<(��T�L	<xV.�:$���l[^%K�AyY��+W
���������Ut���f���lI��i1
�g+GTn����[	<(�:x��]'%�XJ��~�K��~�X�R$� �zxP�Y$��,�Y@J?Xx���$����$�����#�h���g�I��~�XQ�H�AEY���J�A�mW�rJ�A�������xPv�J��n6�������-�O��I�AE��T����N	<(_��J���'c��j���<�H�A��E����$���f����m'���'	<(��V9%�@�U%�@?�M�c��*E*����WJo���S
���������Ut���f���l	<x�FL*b�$��"�^�uJ�A��WU�<;W��YG*~.J-�,�D,��A�jf�O�+S}2�rs��.C&�#7W���'�
3ag��tt4���ahh�{ae�an������iiiHII���C����*x��,��E�l�{9�x�L�����yK�`�a���N{���R]/���0�"	&&���s�1Czz��F�c<"
��Y9��Q����P(O�x�|3x�.999������'1�T�1�(������V�Y�y`k�s~�q277�2��9���I��ZW���C�i8Qnf����Rem�m���,�Z�Z���m��!�"J��k<G��0Lq�AV�~�?�����X�2��v���4�G��0�)����d�[�<��(M�9�SV�r5�ci����(*_���r��T���#�&�0}2KZ������T�d��3����\nZi��YF�khUl�+z=�ba�$e��{��i��+�i��bu����t9������������u)L��?C��7J}'C*���h;�j<�]>����#)���l�����ss
������a`(���n��[�$E '#�\�Z��������6�2���P\��>��U�03[�n{�����+���E��~��m'��s�(�����t�=a����L�
)t������
�&Jdf��^lK�vfY�:uI���6G[�#��t���k����6��������m�����v�z�{�?X��H�$Ti0x����S��J��.�%����+�lUe<*�A�����C��,[Y���������k�
�����QU�#11Q�+��?�W�iSl���\#T��l��r}T���*��W�xT�����<c�-�����GUy�I���3����OZV�9%���(T�����\Ua<��z����xPw<��*k	<����*���"WU��*,���j�����@Z�J�Q�>,��UK_fU���X�>,�~�G���>����1;J_fUX�K����y��*�QU�#�x��,/}������+��Ua<��ay����YU��*������������G*%xpp���3�L�O�.\�m������B�\��!X^�2%nOff&LMu���L}P�E����}�*��T*�LhE�!�����x<�{AU�\���~��=Yy6}�'UY�x��UKWfVV�L���Q�
(c.}����Q��Q��Tg�
���4��e/���#eo��%T��������}��g�x����}3����zD[K=����x2v��]��zO��}��'���T��WU�#l)]������5��x<�{AUX����x�>3���*�GUY��HV�xH�e������$�����Bd�%%b�����![y��[R�C"d+���*�!�h�\����GUX�������\�z���������>�\�J��3U��'��+���*����a��SUe=RU���2Ua="��+�����G*���T�y-���[@*~����HZ�V�\��i�*���- -T�m���WU�C��\�y���Ue<$�@�3�l�U�����e���]U��*����z��?d���*�QU�#�x�kf���������}�RU�#��\}���S��x�����R��z����x��)��LX������P��>��������5���s�9�Bzz:,,,��>�.�G����d������4�-�*�GU�IKJJ���=I�QyF�e�8������R���\Ue<��z���4���)KUY��y���Q���u�EvN�xw|V�#�rC
S��j�U<m����X7�����1����(�����{�C��QU��I=��8� ���")z}h,3�������6�ExR�����x���f�P�6�<0����P��$]�#.�l�v@�b+�}��>:p������$�e<��F}�!��,�0L�$�#�
ca�[~�)�G���04����������rk�zZ
��������-�Q����C]XXW���	�H�Aig������.�KG�.�/"�I�J��, Y@��d��$H�, Y@��d��i����[9�VE[��c�9U�z�V.�F���2+�8C��FEUL�R����"���R%_���=�Y5�{�i��eO�n�����|`����E�x��;��\���M���_.���b��������@�v�Yg#"k������LO~b��Yy����'V_I�8{�����N���G��9����4�N�q����,E�{^	<(wKH��$�@?v�J�, Y@��d��$H�, Y@��d�Jn	<x�$��ar	<(�JeJ��$�@V��	<��^O��xP��$�x�i�I�A����xP��%��*f	<�b*uG��d�z��}7d�gB��@��X��L*�t���0��B�_��=������*2��5���;�h��8(\i������%��2�`�n��;��%�7�I��dF������<U���Q=�/���������q9<&����$O'%��$Hx6,PN�A�q�^����p��x�l� ���!��-]��j�H��A����E5GZ!dc�R*��Cy�-^���-Ih0�
�������0Q��������J�y��<���������'es�����"')&M�B������i[}����)�����x`���N��KK����S_c�"}�^d����Ou�i�^���C���'./m�Z�R���!i�^��/��WG�����<I�f��k�mVRa��^C�_>���>��^}���mk���I� ��G8h����/{��X&3A�.���.����M��o���e?"3��3�Ha���
$ IDAT��O���ch��g��������V������Cxx��V�NuR�����{/�����+<�tX|�:
��
G�p=��}w{3���:�"�`cn�UKw���oI�@oSG�����ANF6l��K���8���cmL9q
2s��k�AU��x��p���R�.���]����)�i���O�;s�h��M���Q]��)>���-;���|<������L��c��gmi��F
*PF��8l��_��3l�8����l�����]�zv��^)�d	<���d��$e�
��e�fj�U_�Ai�.�H����EC[<Xy��E<�|.#��r5A�z�<�q101������%�����x����s%H�,PE,P����1�k#�����#�o�5������G�<�[/c�{��e���d�&C�qf����~��	/!���0y�3	���A��k���T<x`d�W_E�o����,+�S�%����/�����"
���
d�l�p��}|1i��T��S�5��/����>\�����Z5�i	.h��c��9z���x�UG5�$����	�'~�s?~���
��_AL�)�]~�\]��j����
B�Y��	<����Xp`��z��Q]�q6(����_R�%���<�;~�]0����<B-��6��W��*���'�x���Rm[��C��(� v�2�	�L�%I��.�*�����:ez:�����l�V���G0�8F�����&��LVl��l���n��_�VlD������V���C
�7��;�G���/Z�a�����s�/�c�@a&/���)H��35�Rg%Hx�-�<����nr6m���'N� �p�_��b�<�����~�)T	�M����10q4�}Ow 7�{����5(j[��K�X������^��]R�OI���
IE!�ZV���4�,�QmB-�pu(�=�����,�����=j�]�vv�Cw���L`�eCu_�6����
�<C<������~SW3��vb{�_�.f������1���"���X7$����1���v��K�yL�����+C�p$u�n��[I0��@����{�#G���/
��W��mM���g\R��M��6��:h��y7���Z?5��n
A����G<�'#�����������<����#=2
��&�1��|,
�K��X��A�?[���'���h�u�����������rd(�+�2/`�4���/�><��
��f��E��+���B��bq ��+���U���j��	2���Kb��vDV\�S��,X]6�1/�'F��HL@����j�������-7��wA=��!���$H�x�[��kz�Q� p�p�L�Gz\6��'����>��Z��(�~�g�%���x��[�I�H��:��	���
���H�D�?�pnm�&�0�bn�N�9�Y����k`��K�����z,]#���p+�L
 ��!�@*�N*�7�Z��eGL������
uB)����ig��D�K�CSS�P�2SC�X�+&��(H����}/�n���$����M�[���F
Q���f��)�������K�9l������&;��D���	�^�Ebd�t��e	�"�7&�K��L\����-���0���H
���V<H���s=S�_��z�,`n'�e.�P9�Y������B��"��R����C��
�W3������[��1�2|8n�L��R!���	Yh��5L-��\X[���E��^ma��OS�/+a��6�=�"��
d��
����1�����X���Rm"��00#;�+���Pn?��0m�rS$��9��P�`he�W�����|?�����%[��@�i�o��:u`�����J]��		����DF"��?�x�����p(7n�6�4	)��vT��o���4Zf e���A1t(����������];�4o.��R�/��x`��-���E��S`B��;Pn���?G��{b���������#��a`a!����q�&����GEv���U�r�&d��	���!su��������������%C:��~*��AvD�p���z�?���v���K��I�42D����Y��0'eV}�!��E���hho�)S�u�X!����������3$��As�1d�������v��_��j*��=`����#e�|���}4_�d��63�[��'u�2�������`A�J�E[�I_~Ya�
�����Lm���q%p�[���(=������z��];f�0C&��{�.�ER�}��������qXq��sr�j����M�����[=�=UI��=!��8l���������%�
X����A7����ku�K�g��AR<������\��>��"&�*��q���o�C������N��	<x��-����%]O�tM��^������+.Vk���o���p�^�h<�w�D��������i7�6"�}��&��{���o`jm���pi�gB�@�����ka�0�k�n�L3D��� %�.\��������wk{�������_�z���A�~��o�����}��������
x`f�\���i���&�<>}��Lm�:
��qn�h>u.n]��O���#$�
���E����A+���&/u��h^����j���\���V�m='�i��/���b��[�=���
c��������W��-�����x���B��\n+�1�]���y����E���s�HQf!=3?l�V��{�t��&���{uL��������!��v	Sz���3�#r���e�P��5iI�'��|�u�Vu���C���^�	,�<����&
������K��6l]k���O���������e�rty�����z4n��4_��������e�Oss���`�@!7C5{g,�9~/6
���� ��_�Y��o�F��0���#������8������l��@�i��Uk�����
l�7�r����vm ��A���0rv�������0vv���a��k1&�G���aL��,z&Z=���5�M��������C���q�T=Er����|���x���5v��&0�w���j����T�A|B"Vm�����g/w8;��a�Z���_�h�+8t�����z����US|��"X��sq�QR-`8�������5GN���������Z�����ss����
j���01�}3��s=(���1�w�=eU�y�R�\�������u���Q�69
�$Y@H����N�, Y@��Slv6�������`���n
D,��_5B����&'2���n��5��N<��x`�Ny(�;���9�X���E�����i��=����PS�6�"���k|���o�)P7������������DS��>$��_��vN�jf'�c���W��>�W�&�@-���"��o�5��0�/a	������:���S��U�n�G�K$�q{��(���V���	�vr�e[���
�����y�P_9��Z�� �;3�`�A��y�zH�GjPL��T~*�h�?��iPua���#���������N�{o��5 G���G��P�c��v������p��L�J�7����������>���T����Zs���'���'����'`C@��`�t�YT�f�x}\aso ;9K��������<P�I^�~����f\<(l��$Y@��d�U�%���$��m��
Ip$9~v�7��f=�����I�4Q�)��H�B���qmaL�Qk���'�3w5f�2��g���W��c;���>RV������#&`�I�Cw#\�G�����B�x�{9N-�,H%;0�w6���P��9�����Z��p�B>d��N$��]U�[G3DI����\��}w�MA��'�d>���%;n
�������p�i�����#�6���.����j�S���D$Dd"����d��K`fk��C�q��8q����0'@���tz���������X����L�Qm����'������{X����,q���Z9�X�D��+0��3���	��n���l4j���)��2W��'�w7S]7����4�eh��%�R������/�yu�S
�B�T4x`��D$�Y��r���fu���f��=�xk8RW�8>�`�H]�
��L�y9H��G�!�z����	����[+�8
�vME�n�
�!�R`��Y��"_����d���c����7x`��K�9����r�(4A��g��kW�*��8rf��!m��D7m�i������Q�,��NrCr$dG�#�?f��	'6I�G�������p�Z[#u�b�t� �������O�4s&��#��&��0tp@����w����!'P"��0��r����|V0$'�9���]f ��_�`H��lr^�;A&XP)�x�	2`�BU{���������?0�8)���������W0i�*/�CV�����#���Oy�#��a����,p*���<���<9�s>c�?1����J��6�V�@���o�v������
��]p��v����k���
������ DG�D��_b���k}k(
<��P��Z���S������J��������:�0�V��:�p��4��.�\��a��k�"l_>v�~�q�w��mh��c�=0����=j)v�xf��h��M��9So��<���:��t]F��E�������7F��D_�����.
XW����Z��O�<0��F��������q����t�;�
I������!��������}��h����h6�R��~�zw�]=���D\Z��<�p�����s���6���o4�<�6-�G��"������7��V�o������m�V<���F�h8��w�����"0�I�`����e�
�$�c<�����z�b�����
vV��IH���B��o�����*T���`���@����j�`�������I*�����D~7
������������e��/h��U��c]�	x�[?l>{ot���V��~�`oa%�U�w�����v�T�7S+��l�k�N��8��K�6�������n.��Q�	8X�m����o.���cQ�v;X��"���C�`��y���D�����4?�&��7�K�o��Q�`�����'�9��"�0s��x���F`����D�&Pa����;�Tx���p|o
2���)`DN��"n�j(Z�D*�G0kB��3�W����W����p��\#`�z�?~����(�h�����F��c�m��:y~b]R~�`��ttjiKs8��F��p�L&��a�K��H�?��[�o�R�\������)�a��+1rp?��s?���%����Q/b�/a�������~���g������J�xV<������p`Eq9Vn�^���3��?	`x������}"(Ub��)o����v�x�}�Ob��~zZ<`%���#u�9E!L����.sS:W�$�@��$Hx6,��]��}�K�=�nG�F�;���Pr����w{��3^H�g�Ty���q'Q{^�yU��5)X8 ��C3�~�X�)�|F
���$64���������0������1�,���������?E��Lu_X9�m���Z�����O���d�H]���P0��*���-��BI�*���l�S�y�2��<P���C�Q>�����).0�
*��mAur��?4A���D>����/��l3"�j�j�P.C���b'�����=���wV*`{���4�+����)�_��
��4����lw]�E����GN� ����g�0XT����vq�c_w���/`���: �b�#_Te�
I��B������c3\�v����`�@U6��>��P����q���Z�K�P*�%�%EJ�$H�,Pu-PR�zW�mK��#��2�x�=����L`�k��-���[�"`���&��A
r<_�-�uM`M������5�R@6~&8;#�'����qj;��jB9�o���5�X
���v����*�"I� ���u�����T�Uh�;��j�H���/����g���'�.9�?������Ne;�	E��i�Vj�P[�:P�����)�� tM%���������qsO�P!h0�
�������������@*
Vn�BM����d_�&��;u���M�Hc����g�#u��A%D��(8�2�r,d�J��nD�KEJL6���)B�R���%���J�yd��^�0'8OBx�O����qh��-d��#�`�����CE���}g$��n�����y��s��#���a�P,0����G`��H��'���L�d1i�P-��� P�9�l�>�sg�	�:>��nBNnd��J;�I���i�v�����](�H��uQ;��
�Nw�A��.���k�NQ�?��y�����J��g�K����!�@N�+
������d��7���`G?;�YA�a��o\�6r����C2)X����T���,0�`��r	\�8w��]�,`N�0b���w�r�*���G�+V�������+TT����v}����V4`�r�T��3�v�P�s����V}`�����}d�@eG�F� �QC������n�:�i6�!U�\��=#�m���$����h8;���3Kq	�_�kW�Au�
��'���;'w���'G���4^��~,
<�O���c�������>�t/�JrF5�����O�.���/Bo����������{������T�#3�#���8���'(�B-�(�B���M��
<�I���z�N�������RQ���m'7���?��x�����r��(�H�q]�����'<�<��c;qw��x�c
�������c�G?���
�}�s�������
L��S3'���Z���>9pC��@*���w}��h��
<(|����.������_S��}�����Z�F����L��_O����M]G4��p@=Ok
��u��1VU�����[�^+������<�p$������8�8����(���T\`����X�Z��_=���&�`�����E?S���������z
��{+T��s\
���������`���������<p�mE����w����^[�]���,R��#�m�
]G�$�*T�k{�:��a����)O�C�{W]�������q��Y���ER7x��u�
��nt$~����F~�`����`���/<�!U���-�����������H���T��~������`A~� a���:� x��8��)�Q����{)�"������k�\~�`�F%��#.Z�s�u���������������>O���$��O�R��^0��aX�a^��Z��G|B�{p��)�W��t�Vt������B
��o�m�������CE8/R"��������S+(�����iR���m��r
3��@OK��Hl�����t�d��H�@��d���\�{���;������E8�����DF��{��Pp���s����P<�A�	��U����������.n}p^���>���J�;��9����������Kf#�u����-n�+�������:�8���2���	r�s�ZC��
U�!^�C ;�YJ??�P��������$�oF��������>��~5r����}m�8T������������� ����jj���A�P�i�x��Fz��;y�f�Sq���@���OxA�R`�y5�P�u\<0v��O�$.#��'?x�j��K�-���A��Q��&"�k����a8��,���'-*�Ha#����N��Q�
��HPI�%ysD D��{��K��$�@	��9�
*����P�x����C!p����w��@��d��1��3�P�����p��G��p`J������!�?���N��{��zic)���� IDATn�!xBa\���e���INejo.A��d�&�NB��()�r�P<���h��o�����+�����C�v�f6�0H�M}L��F�7l)�B�&��O��!8��O���(�N��3s����C��Lj��{�v�sy
[��H��B3X�!��I9�zH	9��_�����I�nV_���\��QY
�NB��)���x�u�k���x`B�����>vSD(��-;N"���-j�or�bD_���KR�25x Vo���-�N�f�;Qx���zM��3� a�/B������=I�`�:��h������@���8�9�h����vI���A`�������z����������+��O� �,p��x '(�w��nG������H���v�����A`���0���m�a(o����F�.]D8nKNL�������'E{���c��"��HA@�dd��q~���G"),(^Hgh ;���gU����=m��<�j�!	F���8}���#����'�x0�vf�`���hg9t��W�_|!�T�
�)�{��R�`�
��?�"C~�3�P�f�Z����p�v�n�t
#Q��df�#)1���5+G��_4j<{w����0�>�sg�#%�q��������W"����	���.Vz��pto��7�����qp�h��u�F�P��v`a�J��&B?��^����H����C(���k�0���\��� �E%����z}����:���3�_����9����?A��f�r��9	~�&	� !�*�}���,��(����3d���;DY�����{�A����0|�r;'�N�����~a������#�������+~&5����`���K����f�y�x0�mu�C�5�������.�fB
�0x���,M)��V<P�Y`�V<X}�|\,�e�4�4����;7#�T
�����W1�so���/�l�.6v�XY�[V<x	�6}�z]D8���^��C�x��z����x���<`[l��+�}=������iN$�l�V�6���!��^��_��,�b���O����=)�K��H��C)��Z~.�eY�#����h���O>�&�RC0���F�`v>����`=h �w����������;H���
���
���8r:{��jP�I����x�����_j�`��I5���	M
h����.�[��T6;�<X��;���U[
����kA�������7n	���I�!�o�e����3�m�psA�����j������(������$��t���$<�`G�E}�YL1i��,v�����������>&.f�9.BP*<`� ^����q8���uS!��ezS��(�p���r&�r
��+T�`'t���)��<��g=+p8y5s�����I��Q>R% �}���
	���l��7���qRo�sM����������Q<P�X���Mw(���#9��!�T�1n�*Aqn�	~��G��P�6Sr�r��'k
3�<�S��\B�)j�@FuxO�/v �"@���m�,�c��������vO�G5V9i��%�B�<`�����vN����a:��}��1������,T(��������206��t�qG��-x�%
��[
���20��j�����v��������, �LR���x��,���Y�U��q�\��]R*������]��k|v������kwww'�(*������3�E@�������w��3g�7���;r�A�M	�`�����@���(�	�H!���dV����G�����,�x &�f�6�7
%��O����f&���H���;I�WBn��n�1��v�.����2mj�����
�?�%Wbc%�X:�nP�ddi���6��-����?AU���eU0) P9���^"H5A3�����TJ�����\30�@�N�{���<`������qU��Z�eDBT2WB�'u��AVm��MW�����Mr{1>�:A���p�H��Bn��:�Ep��j�@O�9�/���l��-�T�d��=;��R�,����:CtBn����w���[�\#0W��w6�lM5�����o��rS6`e9��%5�`�u��0���������xpoS��jsu�9s�`l���K���<Pf 	����8����	sGu���<Q���#��s����q9��o�DA��,<h�>d�u#?�6�4T�p���ex�dU�=Z��b/��Msr#��_��E1���Yi�Y	O_��/���
%S�7FFsW
j��\h�������>gm���
�P$��H��k�Iv�L��
}^�����d
������� �F �N�K�MMh�+��Doo$<y��5��x����b�s��B�l�=���o��
n�j@��1����!����`
\�`�h���DGs��7�Y���S`���$	�\D��������|C^�L�������]0H�A
���������m�37��?b�2�NAA]��guL0��=�_�R��j
�Gs�I��Fr8���o�I`SjP��C$���"}}H��������Hj���<���9WZ��0����M0�A�$�T���l��f��=��/$�bD��X�44����BBc�X�j��%ksyK@sa��=�2���X�����Ni4m>��J�����}i�+�I����0 V$�-Z���sy��ZB���Y[[�5b����>Q>�Cv���w�8������[��Q�i�����1��9�^�@?���s�w.rR<PTRF�vs!RVCB|4��_�:����VU;��
s="����j�ap���	���6�� �@]<������������p$���`\���wV!��+N���a���vv�B`�"�V��]��-,�K�L(]c-h<� �'�_	u�.;���q)�\���;m}E�qx�f�#w����:x��
�ke��!/��"e8�_B`�:�����?���NyK��r-{���%=�Dp��6�������>)��M��@��h��������
W<p���u[������<`�
	�t�������C��)d����3�/x��`:��U��'.����Pk�j�����Z`��G���o[��c%�"����.t�@� ��A�r:���+����	~�T��-B]k��D�*����m��A����K�V�R��)����y�O<����[/���0���4]@t\"��q���$��m����0��S;��E5K����5=+����9����7��?����]0�M�7de'�������w������������?������V���!�������i�{P"��-�2��n"������5�}~6M� ��A�.���7`����>��
��}[�;����Q��6�*�Tw��Cor����6���:o�z��c��)��e��v`c��Az���[��c+L��Gx���iXv/�������������Cn��*�u�u;j�AJ:��:� �#��( Q7H�x��1�?�n�>Y���B��	��B�KG$�������w���M���\�IcD\�������
�������D�����P�B���W����}3e��3\�����"����g:6W��S�����oN��_�����[:�d��7����{X�p*Vn��]1���&L�u8V���<��P��p}�I�A��{�L�:p���I�=�$Mb���{0vX� T3�43x���~��COW�6��4}y�� X /���XK�+X@��`�Em���EQ�"A��I`�������EQ�WFzWEQyI���3�&s���gQ+�!X@��`��f��\-�Q{��Z(�f�g�d]vzW��;c~���[��s�5x �_�i�
R�l��j���@��]]��[zW�� �D�P'�I�'(D�� MyM/M���
<�6mA�e$O�67W�_����ov�A~���&/�AA���Z�-���2����:�6������z@���4�Aa�]�ff=2��Y���v�Y��xPu�O��������Fr�b�����8L������K������y�����?���.��[����"`�x����������^�$"UM�l,�����C'/�J�:�m���6��23x�v�*
Ve��I]	A�@- �y4�]��`����E
��le�T�g�~s�'����<`J
L�CIC���k!, X@��`�<[@�l��&���Z0��xPV-iy�<P<�+1�#�L���_�O(l� ?u*�i���{F2������K����gq�\��.���h����,JuV�F.��������|�E[M�4�%�xP2�A��`��, X@��`����C�A![R���K���F)pD<(�	������C�xP�6/���p-,�x��r����p�KB�rf<���#X@��`��, X@��`�Y[@�|d�Aa�\
��B��da<�������^?Bl<(�^�<���_cx�w�	)�����p�M, X@��`��, X@���xP��-��ar<(�
y
���@V�[x�7{����p{I�@�~�	�A�m&��[�����X���������?lbbbCC��
���Qr�000�����%�R����\��I����fff�����D��������2����������������(97y��0����!/�!�GJ�5�j"�G��yy�	���3����'�K�������\���0acJ���s����Hq������i�&?����;I^��D���R�U�?dma�*k�,?y�aa�`�@����?�acUXX���.X~�|�`��ujy�y����|��2eu��K��|D�Y�l��#�ecGY�"�!/�a=WV�Z6����Pd3d����G�{��%xp��	Y����`�����8T2�a��N�2�iX��������XN�����z��2y����Q�i��?BBB���UU��6Y��_X�Q��y�v�

���Q��yQd.�GQXY�2"##yD��RAV�y�>��?d5�a>�l!���FD��)��H�k���������#y���B�jjj%n�@�v�i-U4���(;K[J^��zO��~�����Z�����|�Y*��G�[7�%V��@����
�?�>2
�B�C^�#�'��?���]KB���~t����0.�������\BB����m�E���C��,X^�e�A������S���!�����e�utt�yT�x�?
nCY��^FY�������!/�!��b�<\���2a�I�Y=�
��0)�
e�����f������0?,�8�ujyx�	�CY����'�f?Y��������[�?d=������G��������A!��?:x Hs��A+�G��A������<�� �U������ �[������<�G�����\��n��Vy�a~X����%�?���'��K��b5��B���2���C^�C�#�|]�w���'/���^_����C!��xP�./#a�Z�c)}
�������0Q��E�������\�q ��������GF��������N-/�!�uy���B���y�y���!��-�|�a>�,!/��<����G��\��cd��<��@V�A6���|����x ��(����>�#��3o�a��5?H���j����TqY$��x�K��/@rJ������|0J\-(�YB�Em��(	��j�����xE���6$&&���I���'��K�eZ��zIp�
�s:i�)�04�RZT&O��,())I������?Jl��U,}�T���@���������J]]=�u��WG�~�\���u_�<��S��\�����f���(Hde�������}��OsTTT���������"I_���H(���"�kN����^�<T ��P;Y
�OM��C�F�h��OF��"��(���2_����Z�<D��9%��!��J�]Ty��0���?dgA��$�����
!�d[�<�V��H��XC�����SB^�I���?�
����P���O��U����-�&u������k������uR7�"�����re7�^���y���I�u�)��V�����my�yx��N��(������|�$�������� .�&�K���H~:L]K����|���MLA����S�L����p��G�������BTR��{���,FK�~Q����i����s�@�."	H�O�C�w����8���T�9S{�(hJ�E*���>�o ��Nu�����6����7/I�=�^lx�B�d^�
7eh��;@��b2N��y}X�zJ�����P�2��.���2�������V��)B���=� 
�'�JL���U�SYUd�wi�x��*;�����'�'��I^%=���f���_��������!�(1��X��t�i}�&���U��
EZ�
�>y�������-0G�%�����>I�5�L������f}q�e��]H
���Xq���e�������)hY�J�?��P�p,�:��|"������R�l����
�����z
, X����Q��xS����o������L��f�y\2��s��7��kx����+�Z886�oDH���b:f���J��������HeF!�`�����A����m���o<���� o��ol<���d�Ndc��r�@
w�	���������d��|�<(�cU��`�Eo<(z�W�xP4�����3+%_�[�C���Q��Q�1��h
�-��k}����V6��9����K��P��e��Z&w���3����yS�BG;������?bc����>���&I�������;~��3��]>y����?c<(������<(�^�z����i�}�{�7k_��<���^iz����x��z1��`��
��;
{{�D� <1]Ju�iy�fV���_{`��c8�p���&mUx�R:�5���;��ty�\R�6������i�!����4�����A�w(��!��y)1�P�c���������df��tYE�5x�9���]����[��~�T<`s��'�Q��2��'�v7�<����D�����v��]x���0��z�[v������f3m�|��R��:�k������:��AHt�x��{Y�:e4a���oB!�U��=yw�#+��x�8(h*B�r��R��A�&S���?h�q�����S��T<(���.��6 
:j�8�$g�������N:�����|��o�r�����_yz�����"<6
A��D���v�t`m��m�]P)bb�
Xq)U����,������p�y>y�c��{�,������V��u'{�c���)�i)bd3m,=�?�%Y��]j"1$
�M+���CD���:]�y���N�����A�:�p��o�j�k/���
y�'K�@s�>���B��.boD"�C�NN��7E�r����>���j�4uX�q+k��~�-^o�B��5p{��|���d��A��46,������45�p������1r�b\����7��r�C�����<W����+%�x�S�eY���XV�y[�|�Fo����
T��-�����d��=�T��8W�� 9$��_@��)��Z�V��N!��%Z�q 9�����{D��45�R��g��Sm���
�S��q�FHx�JeM�������+�iN���{KLW	�A�uE����N������{���%3�B������)���OvA��7o?�?0.no��g������K����\�v#tO�����`bd��+��0��U>Egz���xP��&���xP8�]��m&BY1����7���ONI�x���P}�L+��u^�0��L~1��J
J�i�&�
��L����ui��)��
�A.��; IDAT�V�+��n�F�)�A���wl���o�
<Y�Cdi@/��%<�MF�o�**�g����Q����v�@ k�`I���v��'����mk`��[y�=�<�5���C��V���{���W
��%�e	(*)�V�p��-zl�a���u���P��W/v�@YI3�U����_/(��+��5����6�s�5/�z\Y�mF�������\��iJ=��V���~h��rY_��{�3�� �Q����v����bB��?x ��"bs �P���Z;m$��"�����,�EE8���g�^����xP�O��tj=�<������e�
FZ��;��o+��K���w������kZ��jZ2�RG!n�Y�$�qA�\9$;x���H��E�w���N((���sIX��EC]����5{�l�J��Y�"�rU,��s��m6���#|��|���Pdf�\3�x�~����(_�4����R��n���<�P;1U�Nu4�W+�o'u-� .>�+�-�r�L?w	p�x���8�l�����d454��y8T���A�<����s��������oM��RW��>>0H$�K�Y�|r���?m����_��5��luDuU������L�18�����BJr2B�GrD$��t���[��O�����i����1�nK()*���78������t�����A��9���?�X�)���Wm���}�>�������>N�D������_�������&��Vh��24�g�+�L��y}��Q0�`���'I�;*&����O����1��J%E\q'o?���
>���v�z��a��T����H�1������CHJI��������j��B�R���s=��\��
���b��>�b�?����0����u(*(�Tl�~��a���H��m&�3�7n�}$?[��W����`�	G}��w��hn��nDDb*hV�@����������v���bS2HHN���5������'�,����
S�����Atb))�������w��^-����U�+�CEQS+N�y��{db$�t�x�Y��C��x�*�c9&���:zN���-��Z�����������Bca����I�A�����
�}�%|���Zb����
���G��;?��6��o���,�z��p~�	������&to�����x��+W<`�/�#�8��6���*��<�y��P]V�>L�����'[�W<�WS��������[/�q�c^��Z0���
����^�Z�R����@�?��/N�Q���������
���H�����?/���&�5u���6���-u{�S<H����;Oi%C��#R����
ez1Q�SL��%#}�6����h��z������	/����
h5_�kK$� ����%@���+�G��;������ss�^���]<��7$?h��t)�I\A�QM��������*4�
�?���{��3��CcE����P�S9t��|$%C��=boz����6@�_(N��GH����N�)�F&��\�irR�V#E<<ME���
�����N����I4D�v-5iC:������RP�3}O�^�4��Z��*5R��K">{$R�P��2B�����XK�����^�n�#:���{w�N�p�������E
��}�3������:����&��C���!>_#B�����W�	��;6k�sz���_�.8���K��=^�)�f�����x�iOjj��������\@e����=���g�����^?��T��C�`L��(�k@������`V�^PWQ���>���w������������x�G���������m���am�>���:�F�J�������y�N��eh��[���7��DT�n|
�������2������pg�3�c�cks��3����h��.�� �P����a�qMC��x����JWK�ER��%�����us��Y)$z%"�

�d�tT�{�����*CD�q��;�`�z�P��B��d��Z�����P���j5�	U5]�D����`jZ�x��4D�(m���L/��Ed�/J�o��|�\B�^����z����f~~�*uFA����
����<�W�a��*�k�`v����x�����>����_aZ��E�#���{���]�h#�%ZW1E��f4f������
��3��4TE8�����8M*�g��kt`��9?�����_#q��3�����/���[����(~��w�
���s��j*Jv8A�S<hdcH������4��a�0��v�+���&V(G�{/������>�����"������NU�Jq��L9����1{�,����p��c�m����}��fu����
��^e�K�W��_8J���������M+��})~���<�#�kC;;3�4����"�e*�j�z��i�w�8���/Jgc��[d����bq���z��S[X�VV>��e�Z
Ay�F�����MQ��@|xy������x~c��o5:��>��w�^H��&T���M�����u�6���T���}&�?q@AM[�_���MC��pxi?t���,�e7�1��a"<���~��q�zJ���;��H$%H�L�I����'������ z�n��f`����.�4.Q����q��|M���*�Tp�U,�2����5a7) ��&`PM����4%����������6��"������[�He/8Ns�����9�qv�Z�-Qjt��+����!67�I������P���|��B�o���~i����4���!������VUa��&�@T��9G��Y] ��5���:�,v��h?D�}B�I��J���b���f�`������6����B������q�
�.��p�i�����)z���^U����"N=Y���O�R��"z�z_��v;�1�5Lt���?x�m�G���5�Y���Kyh�g�i��_C������j�)����J�����B��.�h})�f$=���M��O,����1P��5E������]Q���.1���Z�7�qEc1b[����5�����Ks�a����@�&�������Gs7 �r8�Q���1/�)������
4z�"�K"D�*������� ���R�\j����~�`\���{:����@�L
N|�HC�f�|��r�;�>���������h��!na���$O?E�������`R
��p�?�
�5�����[�qtU�������w���w�{�4�������'��]��8z�l��u��I�����@��7l����V��}:��Z8{e��^�qjWoM�N%�:�\`������k8=������}^�����}�q|���O�o�9������@UUZz�r{W<�U���yr��I����g(S��u-H|��]����%���y�,(+�`���t�RD�g���#�/��g/�����'�Q�WQ5�zp��Jh�l��n������m�
*���py}?
^-MR`����f�
3C�R�����|�L!b#�!"28C}N;�y+z�F���(W�����a<�]���_���.���D��]�a�V�1/c��	�R�q���:��z�V=���tm7�T�o���W��_�w�����!��R���v���Di3k�_���~���,�
����d������=�s�p��E�^�rO��A�Z�x@�P���	�,�:p��P����	��hdq�������h���_�!��e�:�H�]:"��^�I��x�:����5b.]A
����%��h�*W<���J��P�X��)��T�
����n^f���ujO�@��9s)�7�Mj���)$�������h��(�.��� �R��e��xIA��<�y}�6��B����,������/�O�Q�bN��� ROKH�wF;�Y���O!����RE���
sf����daN�G�Mk:Z�6E��0d�ho5����:�v��P�=���y\2��s5�8
j������+b�^��o�����Z�!��;�IC�L��@������U���4�'�@�Pq�Ad]��P���j�Zt@�������/C}������
A������� �m4G��kg������m-��-un��<��K��{+.��}�_�!%<������)!�q�tGf����W�
-ZW��=������,>�����M��|Mv������]����|#Bxu�<t^�^��HkS�aXz�X���b:f��)z���n�i/"#��C%��<�Z��f�k����b�X��!�6�<`U\�ffN�
[�cP��8s��uh�]Oa��^X�~fO�[��������o���pH�)0�GN]���]�M7������,[����3y6���;7sH\���Z�V`a��[0k��2�xP�L�J�
<��i*�B���"�h���I���D	�k�:�yJ��5����-~f��~i�0)����i9k\��(U�x��q*���Q9S$�#�/����������)��,	!+������7�p�8���\�:V�����P���4!+� "!��wcE�����ML�i�9��Sv�A#���U�o?As"'�?�Fp�O&iC~������V��5��
��� |���~e�����PSTC���~+�����W`"6A
���X?&Lp��5���f��4�����������mT*� )��\�aU�U��	�c?��~m�>����r���]���>�|��2jehO&�CS]�b��b�t��Y�f�7����(�V
�<�a��h�4���}����5�l����C�6����mX���+1�sX�0W<~P$����[��C��w�c�*8����6�����D�{����JyST,k�w]�������8*�R��p'L��0�w3�9v���p�����N�t��C���I=�������H	��^���A8��0�^�M�Q���CQ�D�O��	r��-����
���F�����!�[Z�����yv�A������pow�
L�f`uz��9�jNY�W�W!�&��L���+a���iB�|����� ��	�:�����6�<��rJe��G/�K	�E������^fU��R�"X<��u9h���E/�e9x �s�TjW�y(��Fa/$*�����+�:6�!w(�����W�H�N/R��HC�s�8����Q;Op�;�s8'Cg(���`�h��R�Q�N>���a��,����U����RnN��a��
��u�����C�MDl����]0�-������>�ID�O2l�*��=	eiC�B��UE�2�=I 0@������_�O��fWUD�%���x��#��'(`h��a+%���&��p{W,
VE��dD\@��5�)��C�)xs/5:���B<O��:	�*)A�P.TF����s�
<`������=���J
\z�{�N��]�f������A���
X�m���	�\0�}_�|�/����
m>z���!���>�m_����b����A�_�t�A���	eZ�]y�8�F7l��6Lj���m[�.R]����2���C#���V��.g����9x����a�x���������OZ�FL���aL/��[���3��k/�K����V���p���:�>E��"Gy�+ ���W������������mg�_Gh�������wGr�����n�bNECd!���R�R�Lc5%��Z�i�"
��P�VD���;�#�A,����<w7�Z�<PQ�B�+q��8��n��^��F���*���y���~|4t
+p����!l:.�7 �`��=�����P�0B�����T,+w����Q��\�~��ss���4�6���n�E�J�4�
�R�t����M���/�`\sk�EqJ���6l����f���@��0������J�]�C���J��	*�����&�����%�6�T���:��;��v��_kb����Li��}�V��'��!�I��s�1�~y|
�������^~�6�6F�UFO#Y`�}om`���^r�A_��(
����v���UK�+�A�Iy1�a�CoG�ca;���^����-+���$��a����-+`&�f�}��0X"}}�S}G�]��Ty���\�k��D����ax0�uEL=����+=?n�	����1��L$��f�.�����+Bd5��z�������of����0�r��Q8���vc���c *4��M��#+a��7��|��v��O��
�Xs�����o�nw���A*����2\�5�������C���#r�������ex|~3=�z�Ww�A��Kp���h:`.����w/r{���s4�
���fF�Jb����O��q�Nv�~�����L�V�"\s������z3���L�D��J�P�� ��W�9�hLn���#������#���
hc�y~j��A�-7��)Xz8��';�����|��o>C�D��W-����je�. !0e������a��!�����s���=��n}���o=��� g��2x�v�]kq����#�!2��������v��c������z�}�-�}�(���E�
<PW����+���/p0o	�����$<������I�b�]���	��������y���(�c�����j��c�
��ug�{s�������`cZ��F�����T}��_|S��x�;���hq���s����{E*q�"�H�����CQ��|��6��4*�C1� ������o����Z��A<����SJAy*h������1MU)�����e������M�6	�Ak�!�V|�� ���I��!w
!���H���,��LEP�q}\����N9�
w���)����@��XX.�K_�4�v����N���mk-|<��j�v���
#�x�#�w����b�gs]a����|D��vx��="�����k���3����LI��#�^�v0Z7���H��?��=f���06*�Fu����?9x`dP��ch�m���� ��`�=]����0gyw�H�C��Q��B�U���!���f
z���kw��)��x�@,�~����7�

J���}��]����8|�������K���:��%�Nc��.05*���&�������W��:������6��T�G����X�=$�l��m������6�8p���a���`��
X��WL�V�A�Z�x}�R]D�M�!��c��cx�T�`�����y��zH$0Bz���_��O��
A!~������q�`��`?�Gvb�����i���aK������?s��<��8�A�/��YK:DD�~7V��S�������V�p0���=E���{�94�_	�b����������C$uu8l�A����<�����������Arh(^���I#$��qP ��y��Iy�hSw�A��h��
�q����_��:�1��8sW	)Q�>��5������T�����h
�mh�����H�z���0���@k�B��{����8xC��M�@���vAs� 0W���R���Z��:s�!��S"���b�,^�Lp�D���!^�te0� ���@��3��Z�
��9y�];���4�%���o��IY�������0��3>�!���s>(#
x���>W��������>x:�~E��
`�A������7C}(�_������4���=^yNJ�����}x�d�Ov�Fi{�;�]$}��_�#r�>H1���\�+r�����q��s"��T�VE"�	�����/C�x �u�v�H��9��	x�K�Mv�_��+&�S�f8��N����K'��.�fo@���`gn�J�7w�~�{��mU5��2���������t80�9bf�`��=�L����j����Y�K����:�?�;��{p�~ry����y�	��aa���h��A	���0���K4t��v-�$�6m?���J�4�t��c����s$`D�tx ���3����}$ IDAT���d�p���pUk|{eV<`�&� ��3�U��z��>�2��������j2�~Z�~�J�KBV����U��66���|���>�A���<H����j��Q�.�W�f�T�e��X�������ghhb�6����x�D������lf���\��	�jc���Rwh~����P������x)7/�_����:UQ]�zZ=�{,�*"�*�+�'��K�.i���n�|������#PE�
/�R�N"�K���<�M��pAlr,����[8�����\������-�
�����Qi�%:��`>�++���/L����H\-�W<����WE�
���0���5�T��%�K��~9^������E����[=W���8z�9�}��NB2(a��oR`u*�#��+�p�����*��}Z�\y�z5�Si*p�5G�����`]��t*��R:8�t�	B�x��?����������������v]r�����w�N:%�)������^�F�����_s���x�B'�mL���� ��0�#][���A����#�L4�$���
���Ndx"�B)��_�Eq�;5�x�6�co��U��
�x$�|Ns��>�,�,�V���W �����1���,��aJND����(-��{F�M��"���EG�)�����B��Nb3� ��c^.����>���'��	���������.���H�e���@��kP�5!p�����|������4��%����G����qic0�NK������D�~N�U]������>��]"�?��R�o����H�e-e�]O@�n��\�Dq�`SO�o%��������t$��#�?�L���	04W$�@�I���-������x%��A
]<9ApC?���fl��K���B�N�x�}�&c��U�gY	��Xb�����;��Kq5��.�YT�@���W1��5:U��
:��;�
���7!��Kwd�:1�����a*) �#�����AS;R:�G
�X�c&�����0b�zT1+�A,�:�L)��,���O�9x"~%%�5�F�4�>O�H�����p�������A$�����D��M�����w�`�=>:�����{T]RGxw��
�<��p���������K�G:+� �N����nZ�Um/F���(�Z��pZ� I��K��=t��'7��"M���B��(_�=>��o�s\����)D�|@C�n��V��H�����'7ROJ\-(*��Q�U�u�WXW����5���W!,Xz�(����3G�R�������}�F��F�Dx��z�����+���g�S`��$���"��m���������6�=������o@��mw���?oh����N��Ly`E�j��1�����_�aWJ�}k�C��<0��
����!P5R+XN���|��w����6���k���T$�S�VF7C<���m����=��bRE`��5:���
R8����,��Gr����������:��U
����Egdn�b� �$�1u	�?�?K��
$��V�����_rXB�!;����
jw�	�_����z��j��.���F��{qb�pzf|�K�1�qi�4:@�������
=�����+��m��P����7(�(eSO~�Y��,�$h��j������Sv"6*��
�T���o���s���a����p��
������aE1ZUQ��7���2�+0e����X@P�L���b1���\�I\-������C��\C���L�9�� ��G�	hI��HK���6��
�9�4��';�@���2����X��\S@�����{����GoEJ���V����tB��Z�]&T�1�+h���A��P&��)&��A�:mo��@���6����+8��J�F#1�T�7V�KN�������^��_{���X�{bV��D�r�Q��\>�����\����IRE���M��_�H�����$F���q�a�������������_W��Q�^�x`C�B���������,R�1���z�z':������>Ag�	�V~�y��%�(@k�>"��*�w��3���2�rEU��k���8RHP��95A	�H���RPPW `�I���3��6�h ����7����!�+005�z%�����Hg�L�����*m�	<`PA������������R�}B��j���'i�(�Qu�-����%������q-���NE-�����\�)m5�_�������B'��\�����O����_{>���{i�c��\�qP����:s�N���<��>F@�'ti;�� �S�(0���X��Zl��m�3U��w�g�	|c<,"�.��������l����
��x����
.<�z�����,H6��)�)c7���VT�JMcU��]�����J�c�"���"H�mz.U����H�8g�^DF���-��%��Fsx�)):<$���������;:Ti
k�j8}ys���<`�F�v?�=���DB�g/+X��@L��y��c&����s����q��{��}�?�/���b�::�Lkg������$�����;�H������]tl5������%�<`��bo�)~rY���T���%A�GWR��
es���(�f^��/�����	x�%U���<�@��n,\����2AI�|9� 	l�?��-2���H����7�N����'�`0���"����J:����{�����I��
�X`�,
S[�:z�uk��+5M"���D�������"�����*�<``����28x�o#��")���^v:_�w��z�U�m+�A{����A2�)��]t��C��*
x���
��Op�L�F������o��6A�k��A� �?(x{�l�M�B��l--��]���2��qeQ��t/<��U������":��D7/^q�\	r!����������^�J� }�5'A��2X�;�"f�mq��-�{��lD��!E+U���}WN�S_�X��6��T�6�y���[�s���Ahlv�s�<�j_�o��~!���R'��|)�H�K'�4���������[��F��������3�����?u,�j���WMH�$���8�!�n�M��-FL�u�w�B�t��3Y 7����x8��e@�������dQ2�ID���#��T:��l����P�����<�fT���D|!��M;a���j�x���b]���=�f����-���xP�C�G�BB��b�P�����yk�����P��A#;L}�s��)�o���Lv�A�2&$��D�A#�g���q�F��L���~���E�T�����;5%5�4i�#���QS�;���x���n��a��$�h������~��,��K_.!&)��9`�����2�e\�@OE�\ 	e���NT�B��O���Lly��4S]1���R%���+t2���_���I+��a��D�x Q>`0�sQ�Z03�F
�2���5�������}9L����x0;W;(m���U,���|%�,�W<���9���%V����S�����-X;�;�a��R<���&����<�@YR5Xs�&WV����������&	f�ft������B��]�8q4�Wv�A������+����#B����5����#���A�v}�{�lz�����e��x�TD6���N�&���&i0S*HU<��a��
���M��_f���vH �I�)���H
E�~�T��N�������w�6S^q6��lM/\$N�
+'����LiCv�	R��H�/��"l��4�@�6���H��N���I����$yk��+tb�NcgR<P�x�i��x�@%��U�Q������]5
&`���&rW�=�����pN$@A�6|�S<`�X^�'s�pgg�xp���A)0X!���Xr�I������XS��R�I��i�SR(,�����jD�_u���'�����'0���k7�o�p�o��B�
���5���N�@�\#���\$�|GNE��+����8Ci�y�k��\�������2�-G���u,�$������*��R[�^�����r�I"����#��������w�
�9�v����1�V���:�+�����N7�>�d�j�J7K�����5�P��O��N��m �:��GV����aU�f������	�����x�8�R!�}"E�$�(J�wE����	�Ixer�p=�d��)���<P�4����n�i�M�q�J�����7h������������f'�>�Mu�A��q�[�������9\�����"��?s����U�0��k�Fw�x@�0^~�@R_�O�v!��f����@�X��
oh�U$��V�v`J�&���w�0��+�V4F���07�>�
x	x�`���Kc�Ew^��t�d0�^�����]O�k��
�c�=o���O�q@����~���#H!���q��``��e3�*���s��G���H``�
�lP��-�
~V���0��W`r��t]d�/���<!�MeLm[	3�U<H��M7���;���4��D��HDH=�s��xP��<��
��� ug>�%�A�����c���A�f}I��j���!+����O����P�aw��&�RCph9Ww�&7������W����h�w&���^���W#,�#�<sh�0�C�lK��i�X,�����BI�@��o����G��I�XG	0`�.)#��^�`�����!����t(W<8�En4��N$��$�����b0��8��f��{�o��2��
A��W��a��V�t%��X���"`��A��a6�|�����J���R�����(����������kI'�~���F\)��������ft������|U�U��t��anX�)n��V�HMb�L����o�L ����x`�k��/0������I�ogT<�	_l&�����fs�������q�x���U�[��s�[�����v��6�@�~z�aC��U��F�)@r��3S<��MR"Pk�����S�k��t���������RH�9�.�yR���g��-$�Ke2XA�'*�(�@���4�3�j-�IJ�!I�>U]!?nX�s������2�B\�`XG��ah��.�!\kM��R�,�]% �Bz����l�z�����^p����x��`enHP�6��*���$�m�FL\?E���O���#�r7,dV<`B��q��.����0���g���e�P��I!��w�N�|��~F���H�0���B������N�?u��V��c�3`ua�����i�F5S<`���X�;L��G{R< �`0�[o�[,�I������r�p��!����-�ePUH��O�����Z]0��G�/�R�!R7��\U�*�����]���F�E�~���P_�y������T�!7����F���R���A/
x�\!fn��a�!}`��N��L;��x����f+��,d5�$�q��q��^��W�x�-���4���G��S!�X���Do�A�=y���AU�	r�~���2+��bj���B?��}��=R�qD<��F�	��ZiH��NOi�~���Jp�7�U��=���0�@0�
q�Hu�}[^E�����)%�����(�kH0%�F�)0@ %<���Ly�X���GH�g�/\J�Hz-���*��O�;&R}P����Dl�
~���������"�
�H�����AbP����r��Li��x�p�)�#m����	6��y���4G� �����_S��
�x�x�A���25��� w<��
�A��#��T�xp���)+�+V%Z�gJ����(a��]�2*�w��LJ�"f
+r[Cne�L_�1�c���9x����!,��h����^}A�M.!=x`B0�=���������b��]��y.�<�Dk��j�!d8}�_jK��\��/�I���-�	u51.���K7�a���<X�a;w��s�0� ���wd�[�p�uq}�I�A��{�LN�	� M�2�<����#g���~�S�������mH?� �KC�>'�<�������}�����IBf� ��C��
�xz�V�.�(a>�$!3x`���I��l���t���{���$d	j����b���{8=�>�A���<��t�$�-E�*�
����A����7Rq�^A�H������Q�R<H�N����fx<�D��R�'�J�J�h�)�z�o�S:�|��;
<��P�N�����>��
�h�q���E��!��N�N8�w�o��*�!�$7��zAxB8wY�\XiZAGY����^'���	<`nV{������2�%W`�@G����<x����sW	�c>ci������>�}|�����S��GPQP��H?[����#��N�%a�������,��Y�w���a���Sx�����H�� �N������WT�.FZ��<�y^~8��_���j��A�!O�E��XF~�
�������N�Q�����)%�@�l���5+�����	��b��nX~��
���X�6��"�����%�������`|�&��3SJp�����0n�Q��>K�]������L/���}�1WE�,�	O��������{�Y��8��Y������1�a#>���}����4���O1�Q�y��D��|��g�x`\�	�:�|�c[���ax�kS���g����5#Zt$_�A/�x�<`>���_������p���4lB5����?�����6d�)$��@����A�Tw��$�5{�&�N���|�q�L�$���o���^"����WH�0�r�DY�^�C���=���q��)$���j5�jc/B4@H��N��k�X�[�a
��������1��Cv��"������dX�z!{��<��T��f�@'"�>��k��=�&4G������e�+���j]4"�F��Lr�Q�.�6�2������d�^��
�&���Ji������$�H����Dp����]RUSD��m���� ���Y��}q!��`y���
_�$|�$�����Z)#���H��te��25�T�!.���n�k��;	���}T��P<*7W�GW��H�$��J0*��|an������_xr�9��g��8x���6�H^�N�&a�����f����c�����:�S���jj����\UI���CA1Q�X��{W];W���;�Xu��;�[		��n��$����w�|�?X��y��������.��#B	*���
��0�EG~o<���0�f��[N���'9��6�Y,�eLl�)��X��Q_����aA�xB�A�x�JJ%�*j�����20`�g�F������(����p*�w��>b\Sg�u������e��T�PX*<�ja
�a�|���������������<�r��Hx^��6�x�9k���U�-�95>��G���H�H�UKS<��M~���?�	�|� � �m
Rn�	j�P��2���'�?�i��|���-��J$
I����������%2FM��R������$����hTx K@_������2�R���pl1#<�l�fVtz�N�=�������~��em:�����h�T���	V�D��K��$~vw�O�B$�il��/���i4?���*�������0�(��5������$����%_z����7'���`��lC��e���V��a`��OX<��g`A
=�������A
,q��?�������?u��a���4~!?x�����`/���FUt)�AY���F6���hX��SX/05��[X�B�NQQ���>�A���z�*BG
��\���'`��I�C��������j��0� �XR=xMu��k�G�V�ev���
�`�����h�Nvc��1��U����I�� IDATwv<B�A����_]���A��Gj	�;��.�
��Qa�s(��	M��|�t��u�QY��&6z8��F�BA�$4�2�^�m08���ax`dU��O�2�/��'�SD�{��{���l���k������^A�����&SBxziZ
YUMz������������o��X��`!� IT*��
�n���)�u��=�����5��+;���)o|��h����HaC���L���	���
������J|m�C�:��D�K+���_X�Oy�$�{��T������+8�8�+&�z��<G��}(��V�XBp��}tx�����p��2L���<�Gu3:�_�T|a��Vs{���z��P���V��j5�a6��C�Ecm�>�����2���6��J��l���� h�-X����������#�$� �();��su��w)����N�a�RB~� =6��78"��"������c�>�/�x G����k�B����)��XwA
�<~���k���p�x����u����Ey�=������'<1��R��T�^��>����g`s3\}���#�u���:��"�����5_��
�j�����m��I��Z9����!�����x�B��WE�^R�I�g<`p��.�<'��+�<4��e�A^H"�Ec�M@��+�w���/��!�B'�����������7Z���x�"J�v!e�Pz�V!��1(��G��,�9�	�IN�gu:�	�a��I����(����*���������U�T�,�����!d	xy��lI����HO�zN4���Xo
Aa�n�$X!
V�EZB:����n_�&��Rg�LDJT
�����7�g����M��n��H�xr�@P�Ox����C���>t2��s����o�s�����gs���xl�5��
�i>���\)`��	��I_8�iO��to<������PHe]��v�
?[N�A"�����/�9�6�Y8�am�k��.P�����9��t�9x�L%S[��L���
&�U8��}�<��ja���x��I{S�h���bX�n(����I{!�<4Bn�������C|B4<�������a�r:��J{}	Vb�C�����a`J
��b��)�bn��2��vu:	L_4�Wv����r/)4m��1m�&�7�6akU��(��{���C^u1Q��0.�_~���
V�����@
oQ��~"X#�]n��3V��_O�\��g��m��,6.����#��C�X�/%I���8���H@V�� �(�u����grFF��i^<�K<H}�����u��]���5=^p� 3����D"�d��������4t�������
�J�6��"��P�<
���������x���)���(�1H����(m9�R���t����?�<�S3`pCz8��P9���|�=��J�������Y�S_��!X8&����>��H%!��@{6��f�����������I(��?A�
�F��}��3�����`���Q��'/�=�7�h��%Q�z��5`�Oi�X�x�
?����f�v�8��@��	�
����u�x$��P�u�(5�������A}��m8������������P`�2	�P�����!a�:0`���X�>�V�k/:�P�I��B��A|�P���Z����0��B]{����pE���jX���J����#gC��\�	.��cN��������u����l�|����|C��n
Zc������h~��}?zwP�w�d�|�z�l���x4�l��nw0�Q{�$ !;��?�)������uG]��9y�<H�A4u�Rl]�3����p����fI5���IF����������X�T�4�a��oIt/
��%��Z�����cg.�Q@���<a�hk�==���������j��2KA����<(��������,T����IX��P��]xP\9Q>/)x J���<<����z�u�i�wn�@��+<�I�/<�T��UO����C�na�A9v���.<(��������U���������u_�
�P�m�SI�q���y�a���S����1�}��C�/a&��7w�q�I��i��yJZ_E-W\�������Ux�o�Q�[X�Q��W������Oy�[xP�����
<�H�/m_�a�����Dr��Q�B��x�o��fE�?w�Q���G�Bd���g��#R]�V~����G�R�FX
���"��P0����
��X�&���X@���46[%�4���X�t���0�V���Te���V&
x n����;�B��$�Z���D�2R�%C��<��(���Z�L�<�����K%x �������xP�^L$�2�(I}�/�l��W%��m7<(������l�,�ek_I�.���b������N��xPx�Q��-��rTJc�i�����"W	����19�$<(��*`<��N�Kx ��*h6<�����nI<`r�lS��`��s:F�ZC��5x J$���,0�
%%�pn�oJ���|=xP��x��2Iu�+$����~/�$�E[��5���K��I�����JJd��1�r���:�;KSH������������F��I�TN����
����P�j
<��������	<(K��������*��
���xP��&(|��T��*�N��`�oo<��6/��<(/���|;o�������X@���xPv>�����Ps�- ���N� ��J�[Jj9�������Z�@�v�	��[- ��N�	�A����A��B�(O�AyZ���-����x�m��Z��ogk�%)���#���_�Y�D�(���n�u�m��X�$��x�����Yt�H�(2jj*r�(6����En�"d��������x%V`������AZ$]%f:c��[1ab�-���"�8�dNKK���,��oN����p}��q_�3v�>�7t;O333��#�=W��0��A�n�������e�'�6%R��|?����c55��)�L��GA���Y:�����������.''�������.�����$
��q��������k-�%�Ky��??4��������W�����;���$�������X.6����:q,a,��yS����G�]��GE�Cv$���+H
xQn�Y���8�V��Gr�e���$N1�����'R#�2����+I�"�|+��q������Hy�#�z,�\t���%���xe�1�I��>�����Sh������B?�H���9I����v����#�����C���O+�3�0{I�?*�|�$c��@Q�T��zQ��f`���%iZ�e*�?\��#�������8�Edb���fk;�4J]$�(7��|e�B����A]]���"�'�Lx Ik
uI�x������:`ll���\���5����� ��GH�����-p�������tU�������������YFF�� ����+���0?dv����4�CZ�#l\	�(��N���#%�[Y��QV��^iy�	�C�}_�%���'��r��_�0?�feYBZ�!
��g�e9���[Z�#�����!���;!��xP�@Z��Bf����=(��$-!-�i��0Q���.}]��aa��cA�5H�?��eI����%
�����0_/�x�d
��P��,}]�?JoCI� -�a�.�!�z�a>�,!-�i��0?��wSR�H�?�a>�|*�CR#���H�|�Y�<���\N��CB
���������������[}}}���<�^�H)))�?�utD[Q����/���"^���#22���PRR��f�Oe��o}/��{gxx8D�_E�(���x&..K*�I��G���@Z���I�i��0[����(}=e5)}���A���a>"��-���PQQ�pk�^�0�R�&���ocgQ[��'��Q�'j>a~(���>���G����~��u�o�������0?d�++�?2JWB�!-�������xP���P�?fA���.- ��@,��x��Ay�����|?��!+��]�����rbG�G���$k������|?���2�������.a~XzJ����f������0?,�8�tii���CI����'�Kg?I��H�|��V���Gx������@y~?���cP(��������A,,d��X����|K�����UI����%-��K?$Y���CXX���(}]��i������gI� �%i���%���6�T
�2�����G�#������C�|7%U���C�#���?$5�K_���G�%���!���B
�!�A�;[Z��Bf����=(��$-!-�i��0Q���.}]��iY8�Q�1-��a!SXX���(}]�2�����A�J����K�G�m(�����,)�z����P2�AR�H�?����F�d��H�|�yT��d��$j���*f���~��$F�P��<�M3�;��b����^$G�,6_Al�����+b����������KMM���B���98`j��b�U^��A\27_�����b���=b����y�*�6��(VEe�\I
��1��o��:>$%ZOZZX2��<���,>�����Q��������`l��r�u��333��#�=�BuR����V�K�Jx�.'be�MZ��^�X�����A��
��[EK�"��=((�[����-��5m~T4����������WW)���[L��%�]{<)x�J���*���v>���?D�cZ�+HK-����vD���=�������D�G�^(������<���(i��5�Gjf�������\I�#�j[R����/%����I����3��j�W����\lY��4}��$�E��[Mo�"C���������!Z}�*V�e��[��,������?��H�xQ�M��C��#!*k}�4I�@r����?������ui�TdY� 5���<��G�63
�r�<����$�=D���(h����Xu����C���"w~����^�?T4
���^�2���N�������)i�x��e����������X���6Aem�b����*�Q�Af\|�u�G���G�k��T���P�d�������d����GJ�/u9Lk�V������S�L�@�Y��#�����E����k�Dl��u�v���{D��a��q��'��u�������U�<3�A�Y��c���U�p4���^�[@^[MUJ����QobbKum��pUu<���MIU+���:-*��X��CU�I._���X��z���<�>��]���`H�R��E�T�����o�j���4���~�l���k�5�e��o�"��d��T��m�;��D�o�f��.=����rk^b
���cW�t���o��[{3$�U�y����%�ofdS��/���b�h�gT�.
e����-�2�<(�i�d+������F(_�:!���ob����.�{���d%�F����9N��l?6���D����{\�D�����c
���-���Q��m����+5�y��}�f�jOI�/M��U�$�����x�����J�(�dR���l�e���
U�z�M��e��##���Nq��).�~�fe��8����X���rX�VS���e���$�,P���rw��H1KV4�4<(��-�%����neYJ���_�������n_<�V��������j�<(����]<�(���~��t�U���@��<����;	��hcF�\x �����_l�w����������k�~�O�z���z�����e������q@KsQ�����]����]��������?���������A�<�&%'����x��=~�=���-�AQQ�i����0����I]�/L(P�- ���"A���| ���vZ�:���1)��]�V@��A��������8��%�CB��v
��U&w���a��k���[��3��?_��
+XV����'1�Q{�tn��#��Zpl$�������z'�3����p\x�cw(q}��`Y��aA���K���B��x����l�Fg(�[��17NANKj��yyV�v�!�S�,�,j�$\��M%M<|�NV�a�]2����$:[��+���,\�-��b�z]����w��j��|e,���_���F`��Mb��XK3�u��c%�/;���[mG,�x�����#=#�q��]�~��,��)c7b����g>��%�=�Y��PW�����Jtm�R<���;D�������PH
<��h��=~��M+��%�xp�m24Td�h��\ea������<��V���X������S���T*$o��E����6_��g�`~���sV�~���{�N�Q�����*�����z7����-�|Y*��H����=2��(U�N%}<�Z�r��}8���)�eW}���J%�m��3Jx������f���8���Z,S�����F�B�r����
}%m�4�����a�
�
Yk�=�U%	$���V
�x�<�F���I�B����
�Z}86��f�\'V?#Bp��6�i0_�r�3/�5%����@��^B��%����@���#x0t�!���zMLYU�f��_�BG��N���x���a��%x������b�~��9��A!wFA� �0�4���I.����wd�%�N��!��d�����x���*dU4�X���� 	�d�{���������{�����s�H�������G���-���`��o<0�Oghkj�)�$ZXr���6�7��Y^�y�FzL�;e4���'���(�_�
C}]8��Q�a!��X@���xPv>��l� +���h����
��K���o;�w�l�����&&�ej�O��a���x������m���zH<8�v��g{�J�v!O>I�G���
<��~J65��_��Afj
��	�!��1M���!$,{������/�W8����L*������z�@QN����SG�o��r���_�Gjz�eh%
�Z�EUkG<|v�_
�;�vnBjZ��D�hN�E�j��K�6������P���$x���>�K��
��j���eM�7j����x@���d
,�*��K�I���3�)F�K{�}{2���� -��1�+��c��-o� %#������#D����� �8
K����')� ���I�nA�G��8^a����x����Dn@TH<��y6�5QY�N�.��W�����t�6����*�)����c|�M1��?C��j��jy
�x0b�"��}~�����xP�	��������YY��
Y����9#~��R�EQ+���A���p��d�;�H���cwQ/���2BTt����#�c��c�\��o���x�K������?�P����@����|���N�cC=$��r�cC}���s&��+�o�?D���-��,^u55th�uj��q��]�1�W'd��O_"� ���A����c����'jV�����
��h�T[�!d�oY ?x������:��������_N�4�\����@F�Q��H�������|[��j7��G����^2�<�f>���@����),�>����o��ZX9f,��������[y>�X�	+G���8R��U��=uu,��r4v.�x������y=�����,C��2�:�J�J��#�1�_�����}_\{Pd�k�i�j��k,[��2�R`����������Qob�>��z:�Tr���J�k>S30VS�9O_�*��y%S����I���x457�
����'8W���y=����%$�2�����u��q����.��������������I��IR6���
m�k���_�Om�B��}4��q��������]���	11���tUU����K��m��=tk{����7y�?6o9������7"�I�  :��7��	��-%��)-T50����q���-Z���X IDAT�����nV�u` L��x;�����];k����
���DM���_���'O^�Om���."U��� !%	�>o�A}������NoOog���l���9�"C0�a{�$`�Cx��-d��� $�&�)$�d�k���q���M:b��c���p<�s�5��H�H'{��� _\uw��"-]Lj������ns-x��cs�I���]���p��
7<_@OUiT��6}����.@����M-��������>U;^A%m��`��5��n���G����	�b"HJs�~v7�$y�F�z����v�����F��_�`h���hS?�4����;����Z����&�_���*d�?t:R�?!��nd$'B�U�:8!��V��EC���7x*"Nl��q�o@��
��� ��Fd���� h����53�hl�_�
���?���IHO�����A����HJ��S+^F��=��>A��?��TG��=H%@�=�u�M@&�,�#��R��
��8�
F�09G\���'���i�s���ix��?�C}cG44v��w�����3�6DTR4����?`��f��& .%���EO�n��L!1-3�M���h1�R<P��C���hl����"�<<���#.:w��B�f����K�3q��<�K*�v������n&��fs(/�z\��AZJ"Z�]e5m���#�M����5���eq��20p�)�E�r��vx���.J����_�����Bbc���S`j��Jp��c�������p9�O����j5���������&�3��b���p���������1�#20��AT52���t-T�������^��_�����{����k�!��b����kQ]�����sd�^:��N�)�=����X�Y����N���C-�������3�D�Qv���-M}����tyz?<��wc��3��$E��pn5Z��L����3�F~��'�����>k�v|
p��H}l�A/���1���N~��y�c���e�>��'{�a���`kU�+�6��h��{��uM)4�s��]z�g��c�`E���n�~���cZ���W�o^��~]uM�����&R��*�L�XO���Y�����5T�'��Q��Rc=�E#n�7����P2�rH�*R���o?����D���MU��K/�P�R�(���YJF�t����
�2p�a"F�R���L��jZ����d	bx?����w�!"SqrM�����d��[���p���8�>�zr�5�a�R��%�s�!5%�G����,�Rp�D4j�PC������k{#aj��b"�`]G��E�|-�)���^1�W:($�s�\p��I����Q!XJ��[��S����?��R�S���s�0�>l��t�c�L�3��IX�w>��y����]��>
��}�V4��o'W��jr��@�����s��9]���L�N����[�����*=?��o�\�����|Z;�@\r<�b��D� �7���`!�M��#�L�(Z����*��[i�����m'�����,:)���HK�����#�m:"^�#��k�MJ:2�t1ilx�$���`!�%={�e����Y�6����,��$CQ[i	��Dj�����T���!����\����8���������"%*��!+/�������5wV@*������3���5�b����[S��6d���_	Aw��>�� �j���X��NV�����|n���t�����s���4O����7����x��H�~��4�m>�2��|/��7��t��0�N�WR5��jC��>K���j�����N���1���j�}��+CQV������ ��u	�I�m�
i#v��!D�2{6�����=�p����a�a��uy;ii������1��2j�>���Q},�L���n$��I�Gg�\��~�$�%��IC^��V|L������m��N�s|0O������^��4�0�s����z��5�x����P;�hg��������������N��1�G]{�}���}cI�A����'$)���
{M+%�aF���V����iOV`M�Yx�
^�1���H�-,SA�A&=(D��R�U��L� #:�u����������	��7���6��}�S�X����B��a�\A��I7h�N�cY��n9���)\'_����G���3����`4���D�������Ss�����^"���E,�1	�:UHv�Fc�F���M����]n��O�N���*�d�i�����A��������������������&�C�<�D�4T���1�����ox����?`�wYun�c����O>����.g�g 0�#N���o~�h��>t��4����0�4fA�[�YI��Q�b���i�n���]���s
�-���~�e����
`��%���O�����k���E��zq��B��y��3'�<8kLk0�����i8��@��EV�?�����##.r����	�. -<
j��=1I�����>����lE$2�|k�����K�NL�.E��P�\1�����4{�.����{\�W�R�?"��=�7��Czx$�>���5T�5+�^��0�@O]
��w���,.>�{>�:�?=s"0e�h�Em�qo[h?�:c���|.���[�0u�)���s{"P�^	5��9������.�tq�b"C�0i�)���`\I��D"�cj�����,������p8�PG�fj��L�s��E�_��xq�A3z����a����o��	��aK�3;"2��(+�BO��o�CDD ��4G<xtfN��� ol�5?~�	+�=��6?x`od@�B
�3��������5�u.mzO���+����:V�C�W���i��v����P.��i-�I�Z\���g\l=���xz �=��T�f��X�&*0�B*E������T4�j�X�Th��������L���k���|.�I���o^)��V����V��|�ins����v�W�����<���4G���J���B-(6t�bm������c����l��������X$��R ��Y]M$�yE(wj���O����	}�Y����>���@�����Y
U��>O
{	P�i
e%�<~����9=$]��4��
�Dkv�R�)_#����t�g�,���G��W�]�W���t��q
�P���U�*'��l��R?�D��C�>��|$�����v������A�}���xS���G5���($���&o�[���f���D����L�d�6�4u,6n?�������
�������a}�l���6���m�f���������9��XH���/c������0zp�q���0���3~����<�Si������k�
�e�����g�������v������k�7O�����r���MFX�+D�x�b�!�?-�Zxpyk�
TElM�d�Ak�SA�A�:u��Zu,=z����}�\�JxP~�8  ���|��"���A�j�����/^�s��8K�����������k�1n������cv�Z���3�z/��<����OO`�S?�
rGK{(��)Zx�A����`�����?7��1����~���0���%&^�[�`W��IzA���.�<}E�si_}�D�"lz��3��/_���8QSQ���f�=K't�4},���m��x��:u�FWW��?6�����@�	��q����wp���n
�0��'��]g^������{��W�_�����P^���O���]�������M
kgq�.Xt�2���=&?�Y-\�<5�_�����7�����(����Lkh`��u����A���|c��y��i����,�;Q�(������3�=�J#�8J
�lk��Y�#�������B{�zX}���WWR���k{�@�������t��K���z����R���#��Vo�-���g~h�	���t|m��������aBa�S[L8���U���>
��F�	?��f|����H�����8�����XE_�y��
�>T&�a]�zjc����\�<�9;��X]��`p�����5Fc������h`i�:f����D��	��vP0�������"HA�p���u%�BI�6�[#��iw�4f��-hw�����
��f�F��H'XB��`@Q��c�l����Ao���{x�@�����9M��FC���{@/��#u���������n�&-A��'H'�3��8��!LF��a0� ���n#IJM
�+��x�J�c �hQ_�]?�\>���8 �E�������e�����BY(L�9���8���}��hQu�}?,y�#iQMWY{����#p��F���gT����[��~uL�1Z��Y��p�l��o��#� J*<�rhs��wn
lj����s0�(�m-}K�n>������0�h
x�C����Y��1A�����_��������>��*���0^�����u�``^�&���t�U��~��IH#HH�Tx����
�c��m|����K����^��?�5C���j���14�Y��_��'V_�H{I88f"���
C
MLj��I���?y�?z������E��F�P&|����9�]�D�V^���P��FP=�l�`Om}��@%]l�}�IUa0�s8D���m�����59x����"�����zj�����u������Ch��f�����j���/C#�������?����%�����������w��-&�^���'C�6F�Y�%�G���i���;W�[����`�����s����E
T2�E0����}��qH���8� �`^�ap�����|a��c������=�
�O�����=`�����->����y!R��:+j!z�;���"#4����t;��b���"g�����+�!�Z4&� n�2DS�(<�{'UM�aA�����
�����W���d(S4������N"6Q�MR0��Cm�I��6�*�pP�����k������a,�!,
�A%8������|�M-����T
���9x�<FG�����}��uX(�'��a�=�0�W#��9F�y������"N�%��m��
��h���NXvv=:�i�SO�������n,io1�����w4����n�L�3�:�X���e"�\UQ��'�d��`��j0NL��^k����=��>��D���
�m�m�8����\�n�uEWGg�s���>X�o�n��s�������#:�mW&���W7��~C������L� �P���P��A��4��S@�S�h�&
x�SC��p����
?I�^Z��5��(
����<
*F�{����J��~�S`�T����'����)��D�B*r���y%Y������d5�:|O����"R�	���J��"��,�u"��	~gSx�4j3�7�C���%O}�R<�~���E�.�x����(hT.��aA�����������HS�����k������gR"���b6��V_:��PqI�`��q�YoE����Q0��	�L_\g2���������6��I���a����t��ApR8V������
C�pe���.��l�~j�!�pU4��Oj�B�m��h7������#�x�K�N�t��_Qo�����E����oaz�a8�sf47b���X��P�W��GK��i(�>o��P�T�S��9<��b��^Fyp��N�3,d+�M���:d��680�@�U������oB,y�?�������qn?��Q x�%��-X,���>Ut1o����<�M��C�:�;R�xA����8W(�����)=�H�`T/d�!�`���H<w�m�������:��I&�@�{��xE�H<u
J��+��S������=c��#8�3tTp��\}���~-��53[��
/�	����-���C�c�O
KoN���+��3�w���4�ZV���4�����{�s(�8iHeO���f�������c
����4�h���G���a�P
���~0�Q,���G�0�b����j=�����7���'b������<[�6����q����+oS�Wc���<�+Gc���
bhc}��+X��#n��G��U������������g��_z���%�����
����@��RA�����0��:P�����`���U��Vo~� #>�Cw�$=y���9�e��T��������H�����6*��cA�A��#���v���L�=
��#�e�����������K3��t&�"�
eDDA�MS��e�
Z���Xb��F����'����m�
<Sq�IG�3������w�0y�6���)6�
�YE�X�&��8�f�}���,0Ha���+d@��_�&�O���m58���"����2���?���(�*N*<X8�~[�����(**���,�����C����h���#��FY����0S<������K�b�0����x�Ggg�y���%���
q��{�n���]���?��>3�������kp?�������v*<���/���g:t�Kkq���.+�eQ)?x�a���x�<��c�!� ��s�p�� L�P}�.����;��`b0	JP1����b��4��M�u�V��g�m����������X[g
��Y�K��d�p�����s����j�����8�����C��!�L
�6�i����#��+�k ��{�E�F}{��u��L�@�T��<F�j������t�`wZ�S@����O�DfR
4g
!��}�5��JG��=�r����O�F�F�>�LZKW�j����	P�����)?x��$W/�������>hA����CQ�A����VY
r���G�{\A��t/���K�����to/�[�F�����hD`�#��]��2&V_�Qx�.��L�`��AtJ�<����&
��B,�l�p��#��E+�9|��kLP���0<x���h�c�����������/K������((�!I���@=`��oY�u��((�B%4�W���x����fn�@IUu��yy%���������D����-���'��m�!G'+r����L����T����h�7��ov����<`cgl��P���o��m`���,�:f����N����C?�xp����Z�,������������l�l^��.���g-������?��"��a�g���D/`KZ5����9m0�`J��X~����?S�:�Xx�~�l�%6��^QSQ����!m7���Hl��+h���aB���G����K.�m��Lj��,N��{H�����	��.a/
L1�3m���P[���th�0�`��{��cS�>�NJ�!��H)a%�)Lm�s��������B#RexB�V����k�hL�d!�q�x�]�	�u P�m�1���\�����5�����l(
x�A'�>�A������z��S�.����_�_�HB��3���o6;�B2�X�wn'V�G���a�"Xam���zI���^���`���\=a���O������L'�4��	���C���U�)��'m���!�@I^!��}O���e5���7���xp	u�l���U,�6��Yxa��'�$r_odb\x0��V,�:*O��������g��e}��
-�*N�2�E����}�����C8-� v�?��>(����]������
�(�W��Az|,4[v�:�C����s��,�s��Z�6H&�C�����O|�Z���A���H�~9u-���Oj
���� ���J@���
RH��17NA���Z�����a�W��e2��cW\H��*�������c4b�C�GOh���U�<����!�c0e'�
���}��Bx���yk7��r�96Y�hf��B'��9x��mk��=4]�W�op��-D'�����Zwe� ���?�o3F5��������C8�v,������^�3�~3��Ta�O� IDAT%��<h�m.���JU�BR=<���;M�<-���4�����m�f��4*��z]���t|�|�+�� N*
<`����k;����8��)W<`�>a��HP�����YVR�{�O���3Y'}�C-(����A#0f�vj�vt������c�K ���;�����eLj
G����0<���������������@�R)�����{�MP��vaM�!�~Sst��2�`i��v`u0� ���������~�TE��O��aM��N�b����X4��/��Z�����|�������bA�L���C�����&�R]3T�M�S�����P"������s&���W��7k��z������i����e.<�#Hdf��PVT�������:):i`��8<�7]�;X���������m�H�x�LA��
T�UBz@"�2��qU�x��?'B���������6J5�[#v�������`p�~"�=Rwk��w���K��j��%���j�I��k��	�T�t��aX���vB�Q7M�X+��������O�\���$��z��<�qM|x�H�b"����^��N	���y_-�daQ]	����,Z����zSU����)�'qRa�;�6��(��p��k;���NM������]c��Rk.n�i��u=������!��1w�B3�NU|���;O$A�l��y)8���Af�`�;�=s�M�����B�>-�9^A>�"��]��m�8p�8>�}���+���3�����c���t-��m�� ������G�GR0 ��������!t�*����	
���N����2�c7�%e�X�D�J�uhU��")$P8����MV.�#&7���M�=��W�qJ��H�D����p� ������N����u4�d9��}8��ia�T	C2`��Nk1���2������3k�]a�+|?�tH@��~w��(<C9�&�r�����P����)���d�]5MLi���CJX�r���s:
�TRs���/���}R�'������g��p�	X��$�����t��&m�;�V�i�m�3k�J<�����p������Xm�3��w��;�6�s�I��S�C�:l�{	xC�Z
~�G�����L��5[�~���������6��6y�0KS/�e��o/���B[����e�G�p`b�m��<h��/AL!<`�xK'�s�����k��l-4� K�K&��_jO���UR�lf�g�,�;�x�mGO����}-�����X_R8H{��j�P�C`)(:V��$�5��Sfj*��t�J�V�O���FD���t2�;R�������>)�]wq���(O�Ao@�����)F4#x�P�[��)����3�||��&u����j!�����BLm�7h�~&~����1<����4f�
��2,����r�����2��WG�Z����d�eM}!h��E+��L��f+��u6&5]L�u�o���a���r��J4Gg�Av��ov���.����M�2[��u~����<��`I��op���-l+��dU�x���=�Kj�p�J7���B�w���/<�����������c���������8?x��M|��^B��=T��������"r�a�M��yA�A&���$U=/(;u�M-}���
��3E2ka�AF\�]��:)O�:�@*�yf&$B�i}��e�
������MP��	v�x@�Y1���
���R�%�:j7QC�V�xI�X��x���	&PP����������*��ab��X����,��s��{yHx0x��%�<P�����t�����".qRQ����2��;��\�0}z��;�L�h����G���C!as�����@R���u����-�z�������&V�t��������W:xL�+���������dU4��<H�.���������	�����Y�r*2���'g����e�{����1����fUx������v;������HIy��(����-��{v��s�h~SO��	N4�C"-��^T*< �@c|/�����tmNJ��������(�Y"��)Eq� � ����J�V��>�<�����%���x�!���%���nN��4����S>3������R�{@��?
GWrUqS~� ����}#�~�u�N�Tx�A
�w�`L*gM�#��T*�	�yx6�{�A�
_��b�/#�R� �;<��@�����N�Lr���hX�&�
h��V������[���A���`���y�������Y�I&���{q���)wh���F�A(�D�K`��	�E�B������DYV&B�%A?���N����BK���]�������E}<���H+���������b"����E�/78VaA�AC;;$��?,;��D�_���������A}��O������2j$�m�X����F�*�m��C*���3v<���<I����@43�������:��4K�������*�n�K�A��o��D���]��^���D�s.��jF~A���l� ��z��\V���T�������������O���+R�`���������')0e�������;F89��G(H�`���y�N����Aj,t�W���-����;�,�4j��f�t�.�)����!�!?x`C�bN�H
kz� �+J}�KJ	,�f�n��O�'�20{1Y5��x��=���V<8B
�������Q��W(`��-�B��8)��R;����|���;�,������Z�R>����x��d�_�P�
�xP���DK���Lm5��N�f"x������_��=���."��N��@��	F�����0�/<��
wv-K�R���-)t�-��J�SH%a5��_��s���,�8�_:���S�iLSNn��
���wx ���G��I.4��	%I��L�@��>�i�;��%���b���0
�x@�@4��������aX��x������F����M�h:����b�0��IHxq���{�,�������9D%�'I9%�N������l� <`�C��K��?���)30�:&��V7K��+L[��PD]>mRb�����f"�N2�EjK�u��&3Wx����B�B�@�}QP���$!��jO���o���+;�
,~�#k�-�_������p������Y.H�`���X�r�|�A��i�H�Jv����W(�<�7�J�Cx(k:!A':j4��g�w">�Nr�x�J�I����w�c )'\���;H ����I����l�H�F�����<��U�����c
eU�������c1��~�'U0`)!�[R;0!`��3�)�+o��s+LnM�Jn\���y�W<�}��4���_��}�5���o���
��$W��M7�re�ao��$���Z�<���]a��0��jSd���
�j��]������:S:X����{K��$H!��F�c���\� <�0�G��#x(�u;�3��n�r0����H:Q������������.,�wsu�sOb���� �}:�J~���5ft����b�DX�����}�����8�V#5�x���l�a:�B�"1�,�<t��N=�����4����4C�IZ"h�=�V��Mx��(�UV��!��R`��t���xE��N�|�G+����'�&7��X�j�%m��~���v
F #Z��|��*�D.;���>�
qjMhL`@�C=g

���
�>�T���,��_��-*���e��%�I�`�� ��{s�M}y
a'5:��g���xxQSa�	��>�O��;���
����P,B�Zm�A���M�P����Z���u�.5�����3����89m/z����uM�Nc�@S���T!�2���cd��v�hq,�����<�y|N�	�^�c��L�@�V��2��N
�
�x�s�H@^M��R��@�w�a�!kR������Qu�"W<`�j�d�8K� �]:��eHY �+%Rx��
������tdy���D|$����,0���Q��"B�S����<��:��R< U^��2l�hP_��{��%G`M���D�
^�I�A9<`!&���*�x���=7����L5�v��47�5j�C��zvcH=j��y����
	����Hw!{�����P���L���z[���7��,�W<�n�
�h����w�+a?-��'���t��mp
q�� ?E�������4��.;�N��JA��fC�aX����:y��b���e����)
���:��g�P>H��@�^�\R&`�@XR$l����e����=��

~�!�M)�
����
���%�w`�u7��i|��X
�������u0��j,�1���`���h��Z�I��b	�@�$i���e��*Ru`}c*
ej!#�NK�|�*H�s*}�$��'<�31@����:�H���_`����H�,�Q<����[H���}����b�:���������J��+0���!��,t��F_`��Q���X��xp�B4t%�
�al�\��-�bx��	RyU��p�N��5m�7�k����L������� ���ZE~�`�����0��s�\�`�Z��������[��]��v�}q�d��W�S:%���#�S���y��2]��W[0��h��s�
R<�����P4�����_�/�Za�C7�RX�l�Z	�CM(L�(� � ��	(*.�|=������B�d�'�<H��F��?�	�	_�:c� ��m(X#��H�����GC�V�"�\x���
���|7@�1��iSZ�A���P��2����J�o�)������U*�|%
d��c�a�������2^t0����T�<`i2)�'�����@���)�V��S<`��*�m�/����5����,1�@������Y�U��q�Ow����b��baww�����k�����������	�
HHww|�"^�^���g��{��yg�;s��3���{������-����|e�����m�C���
���'���������C�}
_i�v��m���";�R�>�`L��XL���	�5����b�����#>���0
/���[���/C-0���p^�V*<���b
�:)�@PY�������k^o^���T0��?4���yf���R<�&����HRr�����i���BI�5$�����9}
��Y-Z7�5W�x��-��'����_*(r�"F���,q�RZ�5�w�p�t����8���x����4RY�&@��<\h������A@]�'�Z!��������f�v���N����9QVRU�<��P
��x ���$R:P�a�D�SPo3����B�-\P��ShrgB-����o]I��6�\U
Op��:������������P,��	s����-��Y�MT���p�w��9y�8z���&OI���j�������F�OB<P����C�i��_Z��Gn���(�r���4C�FC������K�{6���-�R�+Rh35��
��r�e���M�x���BkM��P��/OC�*�&��#�|�S���}���)���z�}������X������=�N��\~��
)�o"����s�.;��&�mhC�#+���4�s��������"���C$�a�L��{������*�v���:���B��s�v����E�����RC�|��
�$�����/M�-y�_��UOI� K���]H	�9��,�'�X����I�;�R���Ijr�MC��A�M/t=�+�i�4)o�3�t��D�����c�6��V�X�
�22���M�w�HU��^�B�K??^
�5��R��<,4S"`
H	���#~! @OM�N���	�
�(
�0��7��L1��r��P
~`J	y�V�B
�B�-��'��s�nkK�Wy[�K��>}�Lg��<�B2�~Q�/F~ca����CAD��LsRk9��%&������8�L5�%�_Le��G����]���{~*uj�T�=Lk���N`�m��0>$�?�igRo0��k��{E^fA�{���/L��,���NCIb/�����|�����k��8z���x����/GR�����6}II����ma��M�� �y"i��D�
��Xl��U��C
��\���:������Iw�`���X�\��X��-� ��^*Ua���`�f4V������8�A�;G�,�H����<�@d����NaXER8P���o�Sh�A�Z�p2�F���?|�4����7�@`I�c��*�N
�I$�<���@��=\���-��
�}���-��2A��'"h��/�:��v� Po�I����o�#X
\3J������B05��+��L�')��B/)���X��4P�^Z�zOa��Z',E��e��1��}��E�rM��,�)
<8�r.����If6�
��w9����9�r�/�����	a�D���������J2�L��W���Js��PWT'%�*hhX��.��'��5q��!fQ=yb��R<��
����<&��xyox��o�w!���'��T��\�v����,����G�������?W��G��K�K�*p��
��J�vtBV����q�zPV�"��:����s���68���6����n�����70�kY�~�9�@�����k�^9�AoK+�����o��K��5�o")|���D��_���(��6��g���O�g��Vt��������:s:t�\���u�����)����$j�1��\!��4j�
������JX�,$K<`�
��t��=��ZR�Hz��^G�?�dj����/
j���f���|���<�o��X�c/�-��~g�D�����x�x0c����ACC[��	m#,�BP��T"��!hN
��!G����o�^���:xJ���Sv��
�1v�2���7�
��T�������$
<hS�!�t��7��_=�u��A���0��@��t��u������'<s{���h�	��1hK6��u�(������j��� S:�B�&]-v��`V��;B��N��	��^PDp����2�gfV'��O��Z����PK��;w�<x�1��H����W#eD1��b3��.��l�lH��*���K2��Y�����x@����w2x�����UiC��S���,,B�Q:|���>	nd��:��w�H�9��T�T���Y��x�c�>�T(����a<o��t�08
�F�8�G0�P��*=+���@$L(����\h��l���}f��{�M�}�������w_�k�<��W��/����SwG�&�l���uY���B�+!10`��%����:�������Gq|ui,�������b�"��}�P
��P0���c�6����ogV��R]��i��K������['b~��TV��Xv�/��:�+�����aU�>�%�Bf%`��5�O�������;������<!����gGd�
���BLy����3j���d�L5 �>�P����}jL&�
H����<���f�3u��l�?�+�\�T���gWS��I�	@��Y�S`u1uV.�~h��@R%�!�x�B��p	��9�7U+pp��o������"��c��Th=��R�F�"N`�Drd��)�P|o�v��:�0����
����'�f��0Ed�*F2�<J F{D8�sB�����^T�[R���9�����!���~�����:��Os>
����vg���B����o�����>��
�w�$	x`O��i����,�a�
����\�P���p�����9��,1��a��J�BY���j��]�s\
xH�A9���#�����v����7�M�N�+�U`
w��$����r��
PWP�T��������)��90�����^D��d��g� X�j�'jm.0= IDATjU��LM'����~v�=!��+�5�".-��s���>�9�'��N�s��,�����n�myL�l�7��f��$���St��U�&!��)��Z#9d��6���Dm\�#�a/m4�n�i��x��e�k�=:�����rH`!*4(��8iLSz_b�Q�R&�'^��MI���*=����'��R��T7�oPLR�N�����;����Y��w�K2g��R[��I%�NN�������I3G@��4�OPhL��^�P���\��S
��J�_��`&�����������N�J	�P��`�m������X_��qX��
v>_N��2W�`@sp��3���))4%���c�����(��xxG~ ��/��rD�<��6� p��a��9�P��zC���������g��z���AR[�K!}q��������.���z5<��hok�!�+j�]�ZS���nG0���|��(���+��zHsW:5O�5�rl���l����x�������6�5�4�$uS:��E�w�(<e���n�e�cQ�A�kq&�~Q��I
5���7��6��w���=�k�X�pF�}��6���g���.;�U<`c?���&SLq:��=�'b�_���F��>�5R���T$<w�<m�����&�c�NR�YcLx�����p��
u�T�Yx���dHZ?�����]����	Y�M�)?��d���'/����&�s�<�bO]�*�#�;��k�4?�!�S<0�0���t�w�7�\r�����A�=�5�R�.L���;���;�x@S�@���Rh~�
Xx�l����:�4Q����F�tp� ��4kmy�R�d#
�u�p���r����(4r
<�e��<�&U�
9�Jk����f��Q�1+<�9hG��u�!�
����X��s��o��������^�}�����
����E3�>�{p�W��:
Q7g�~�8��)O<����z���'*)��M��u�j�!��M��CB�_��� oLna�J�~���V��K�tf_��vlK�I1�Ck��^�^�r�o���B-\w����/���f#����=��s�
����C/�aY��_4;/x���=KJ����������(N�XH	!�C�W�A��D���F�UiH�� �B�����������Qo�l��v��E�m��r������DG!������9/xp��O������U���P,�{.�����j}p��4M�mv�pE/������
���
m�@�n�5��Sv`��j:��Me0�p�.Tw�
<`���)Oi�R������UWE���P����3���%�y?��@@�o��\�@mxgzV$��D���gJ����sKi���d��a��x����*
�U(��u��������,��+z�%���X�5%Ry��M���4F5�b,${�#������x�1F����9�����Xv�zCI��T *d^K�A��u��:�>/������
z!��h��{+��vO"�r��pv��:=L1��o?��Kf������/��C��P�M���X�T���,Ls����~ i%��^��`(I�����xL4fvx��I~�N�
I�@~j!����I=�xP�Q�Aae��0����;xP�+j�(v���
�P{�Z(���*SxPRu~k��C-H�nq�i�U�vr�Z(j[I�N����#��BGH;�H���������� 
<��m��>Q����6q�QX�q�|��r�Z(j[�j�4��J�=�����3?�������x����V=�������<���C���� nQ���IYAI,tD�!��#y��&Q�Aqm�*/	xP����l������5����yu���HO2Y���s�Z(N{$)+
<��|I�-<(��������U������[xP��D�E��]FT�����[VxP\��������H���6,��T����l��
��;�Bay���0���v�Y./x M��m��R�(��(v
-#<(���y�����[�0�@u�FN����	�Z<��i.�E1�EQ�AQ��^q��Aq=(�<�{@J���4^<����x�?z���{P
����C��c����$�gH����I����f�%��H��"
�A��Y�������r
�A�}XZ�@<����i�+
��)=�^%��,�c�,���&<(�./
�`�3D�RS�a

L��I�v�a �YDh�L%�����1��	��g��x �w�,!�_�C�Qx ��&
<`�d4($=���.) 7	����0���6��G]H|E�)S�r���?	���B< x�k�A��
<(�>Xx�4n:g��.j����r����yHt����AI��$l�������86�@/=�<(��>����{Q����� ��-�����8�
��8^����AQ=����<�;�d��oyG
���-(Ho�}������-	������}%�<P���Ru?�\J����|+�e<�S_������$K	�AIz��m<(Y?������}�_N<(�K���Ai����
����e�xP6�U���<�;N�@�;���~����8���We��qU�y�P�va������`��y��
���Z��UR���x�B���`Z�%��%.e���I��KHH���
dd>���[��������* �%��/^���d?�iii`�����S1Ft����MWU���Vt�����o������999qM�H>MR���(����QdC�\P����i��iE�)-�K�������*I���I��`�ko�w�����J���,3%EE��G�k����/UWe�7���~��x�e����|���?J����������V��@R�GI�I5�4�CN��Y���J���j�6����9��������.v>q�#�<"9�t�^�]�8������'3Uj���Em`mudd������2��7�X����&��/����^��4�����\lI�Gq�&IYi��T���AH�,�ygq��$S�+I�������D��h�����b���Y�Ur�����_�9���,�3!��HS���JE[��q�a��fg>����V$��c��^�|r��
������UYUT
������,n(��!<���n�X�e����.�m�*S�L���Oi���)���|>�k���P&�����\���D�y�v��?�!Y�@d�:���J�?r]����x�Z���zR#�'�{S��HQ�EOE,��Z\d9A�@���	(90���~�����-������%\S������mQ,���(����=�2BH�����������+W�x����e��(+���p�������7A�����$J���!�KY�?�B���WB��S�h6��H��VR���()�Jn����	�C���$K���?a~X�#Dr���Pr��d���ea>��Y������.+�v��y���;!��xP������?�r��4�����r���&�����UV�CXX.�X��������4GE�m���(+�a�^��,M��P��,�-�?��CiY(+�a�.�!;ea>�<QV������P:�������(���BHkd�NY��0O���!<��\�{H� x�z���,k��t[Q]uu�/B-d�)#dd���^Q��I1��� _.i�_%]����Ic������\���WR����e�?�4W\\444$���.���O�$''��()I/��$W'�gAY�?J�?$��������>�?�5"�o���#�o�����QV�C��H>~K�Dv�w��m�@���#�z�������Y�Z$����{���7�0?�S%����G��$�?J����PR����ea~�z���C��Q�e�?��|��di���xP�{I(����xP�^V@�I�X.������$����r���Yi����*+�QVN��Q�1-Mea>��QV����ee>"�����)�-a~X|J�����f�l���?a~X�q ��ea>"��=*�gO���.]V��,�GX�
�!�^t{ee>�<P���}
%���������C,,d��X�����!��'���Q�C��Jsd�VY�aa��cA��J����U����G��z���4-�Ciz�����(��e���G����F�t�����DY�?�B�C�����RV��,�GX�
�!��]|;ee>�<Q���,
�C�������C,,d��X�����!��'���Q�C��Jsd�VY����p&�G���4-���LaaY�#�����|D��,H��0?��7�oK����PZ����<);e�?���t����������
��SV��,�GX�
�!�q-
+ee����4�<��hl�g<���`$��~q���� �"U?�h�����E�9z�5$zy�|��+Q�m�"�-�Be���{\���r5\��tJd?(�	��{JTFT�Z�j�=0�Hv�0@���"��Q
ef�����������W�m(������|�c�W#�W"�?H���l�s�r���~������7E���n��[7�T�	�|�jK�>���p�w�����Ma�^F*��#rf��S��\�H�F�{E*+I��F18��$E���b�;�8�����������Q.������-��(;���:FY'n-.�������y�b�������Z�wq��$�]���d�n��W�����m����ig6�����sK�mm�6�kbT��Q���"5)�(E�*�Ru<��E����������e�@;�����h�M��f%�����b�b�T�I������#�@5m��hXl����xq���Y�d�!52��~����B��:�S�
l�]�{x�������
mh^	��E-��(gd���/�����[d���Oz����\�I����"�[((x��z@���E�&�%�x ��xPrc.�e<(����k�	�A����TRD��|���Hwt��UJ����Y���/�
���|��Z�<�VcW
����%��~O	�A�����<��=!(|[�������@<(�>�<(��U�e<(�G���<(����K
��6���0	�3���9�@z�&�����jI��[�]<(��xP��~�xP�=%����K����D���=���k{[� >!~���+��?w
V�k�z�J^��7���6�T2���333���5�\��%?O���:����)$&%#6.�G
���v����d\�{��o]��/S��1�q���$������Myy��#��x@J������@��{N�8��Zm��N*��(��e9���qh�]���xv&�*0�P,��X���L���G�AY���$i�Z�ROQ	ix�!�4���6���y����'���hI\������ZITN��?J���)PQ���i�c��rr�\^N����0p���0����h�E���`�y�t�P��
�T<���0�4��W�`k���nq��C-4��gc`�Wn���+�|\����gh�/+wy
}9�h��3���E�X��A������6��}�%�]�%j����x0p�De�3���s��KL����/�cI++�����?b�S����D��3��B-0_���~��X,_I;��o�m���s���'���o�X���t������Derg�]�T_m-����"��������_���-c�#{,��V���|�]=i.����^R�$�P��4���M�`w-���5��
�x�'����Y��z����'�k�<�&�sC��	�����3�i#�$�����Ky�M�����
��H�VX�F5����������[�$�=U#i0?.��|e]���_����0����h8>���d�6x�i�h�>w����������<&::E*�m�n�����	��<%v���0��%v;�c|������H�~O����Z�����U4�X�=����/��K�1j�l_�?g���+�[���p|���.��xPlr����i{R���6WP�E���pw�G�O��"������A_Ul9�Oc�"�H��V����j.��Pc~8���U{k-���Q}vo|:����6?�V�t��U^i��PT�����"���~���9�E�{��3{
g�E�{Y5@d|���Z
*��C-kbGooT54���
�����W�������RwJ��2"R��"���n�j�\�Up,�'���D�Gm[6!�	�N^������������SGAN��E���<}�7�>`h�n����kgW���[[����{��������%��p�`����?g��m�F�x��}���-$��y@Jl�A���4��H�D���\
9<�e���xL���p
���5mYTm�\��eC�f���PtpN����^����/R�3��&i�����>�#ZV�/�b{���7�&�]O<��T��A�_:?��AS��%i�)i�X������gW~���,��-F���?�`Bi�u;�#�-a���E������W/����x��C��F���e�rx��@�k��{eQ�C�\����������J<P�����Za��;`Bi�c:Y���o��E��!��������V3����)?c�� ��d(������j���R�(�����N����pr���
xp��.�T�_l���*`l���l9~������I6K��~%�J >�4�K334�R7^�.@���
�r���V<� ���G'Q��>Mk�|���9yE��N�����<(��%� �8+����2h��)�����z^��b��_�!�}�W��G�����&�"�YEy��c���������Z����u�"��@k��x��A}h������"���o/��������YZ+������))��XKs:t���'E6�k�z"����MaY�=�����}x�x�g�8Y��#M� �qd�T!W^U��Y&< 'DE����k�<zv:
�
���~���X�������#����q����_[��:��
������
����}�7c������h����h�f����s����[�����������OA�PW�3����.���M�������v�fVuk��=X���=H�ys��^r'-h7���8�|�a���B�w��7N;�|��9��I��Q��0�B���y
�^<��eX�
Y�����N�o4w%*��^h��AJ����Iqx}%�(o!�J����/*�\���1
)	����5��D�xg���V�F��N�����3a�S	Jj,�x)��������]
ME����M@jU���^ic�{J�n��������'�r�/�`�T���<��'����A�W��6�����B>���M2��Tw_5h���9)I(W]w���Od�|�:\$!6<��2h9\�|����E�6*P����}���Q�N�C�P��g�u��%�ss�*<�����-� Gm�~'t�����{���}(~�Z�[�����h�-�1��X�O�v�"�c���1����u��Z�)&�ZumLh���"*14,0��0(��s��W����%��A%]cR_����#�$��MN����4�H��.������ ��+����k�W<0P��������O/"(&��E��
���g�������������E*P;��J�jH���o�P��.P-��S�x��P?j���d�z�q����#
o�SP��<�����>�\$>�6)T�������KF�n*�{9)D�'�*�oi����pu��K���E�G:��5��>��V��}��7Z
����E�,����dz��M���/��'��I�HbBzS��n�O��
��^����������X���$�2����1CcH3m�������EK$�$���W420��@�j���k����m0��4n�������}����O��,�O����j�W�i�,����F����'�����C�^��;�:%���2�e��,����1� IDAT���"=S��&���x�Y)�z35�+����H�$f��n#2 �.��)\Y��3���x����������8D���]���C�N����J�\a!:(
z�p�����6�tqwG�6QA�&�H��g=����v9yX�zFy�'�6�+�~w
��s8�0zf��
��d
�U�)������69�U�jN�R5a�Aw��H����m�f�u~��+AQK�=�u�&k�B�z�WU�pB*��,�u�6b=����0��G��f� 8���Xw�7L�*��}`G�'�7�]��@��n{��b(��#V���6�E��F$&a��7H�����	�V���W�@U�
,p��Q�'C������������j�����s@%-
D����
��*�M�������zZiY7<>��o5����j�5,�+�:��C0�Y}q�����x�5vvHc����V����B-��j���S O��Op���!q���0��]-j}&�������ghAIx��9���Gtb���1��L�=5��6�O���5��|��9c�OF9��8�x'���CM�NN�hW-�d�F��}��6���N=|���8L����)�:y�m}3��(��3w����WU	�����3:6����j@UY���ElB
����G@����X0����1�+V�x������%����7�������mueL�t�+p���(��������6L��Y;o�{�����B��+�_��E�r:���)�������&���!��,��yg����-�����:����#st��WF�:50��������8���~W�����-��������]����>��cdB~����yl������i���6
q��;yz�X��l��0�x`@u<�����[�}-,c~�uU�{�.�������:�����x�|�������6)�kh���p=�����I
Ij�rp�S�/D�qsu�����2='N
N#@��Z��M��}}����es?��e�qpW�3q�(}>��v!��R0k�	�M���^��TR�'�R<hP�FY�����������������y���(��
���U���:~(d��J�e;���L���~���2��>%)�������uF���~>�7fw��:�4��5%e��m��k����
F[+�+����G83m��<Q��<6��o�N���xAs�u�'h����-�����SMC�i<�N�U"u���t���� 5�	v�/p���
�P���<�a��	��+4�NB���acR7>����[Z;����p��>W<���Uu��ce���0�����8����P�FDB(�;��e��{3�����~]X���,M~�����8?4,����x�s�;��W��k����N|uB���QA��q����b�w�������<|�������[�����K��hf�����q-j��w�k�!q�8�r=:T���%���� �+h(i�o��8@7��6�:��'���<v?�&��!���s���m�fIR~�{�^9l(t���%�O��/sL�>#Z����:����!��2�w/z�����1i���������))X>x�i���NJn�z
uhcbF����s��c���s`����j�P���m��FOkv�`��S����J(�������#�����A=?�cc��x���.�������mL��5#5
\&%���X��k��~��=����yy3�
4��9x���
E%�|����t�*��4@�F?��x<�u�
�R�?B|����$,����c#>����B�R�:~��E���Nx��(�_��q�qP���k��~��3.l��u�����O���'~G�A����T�	z-�q{���B��%*��������Ug���K�����_zm,Cbw-8&����Y���^+K��������gh����1�#+��V�����r�OD����^;()����EL�w~>�0,W7/n@������}����O"8������C��.V{�3��|i���m�@��]!oR��4��&���7��������������9��>�����U����Q��Kve4������8�y�ln[�j��,,������B��k�E�P��GBH*V����jH��_m	�~=5Th�I��^�@�_
��jB�����E���js�u�*�p��h��/Z���G�����6*u�FbX��l�J<0��F�v��y�a1�����|79(
�+NrH@���*�����}$D������������3���v�Xn������)�%R{3������]}��)#��snS���
�jt����;�u�����%zoe�����Fj�uz�����L�'�$����XZ_�*����VQ�Egu���G2��V�UE�K
"I�Q�T��R��
��2�q9����)�.o���������q��+fv���|/=}�,j�GCK�;�)<�o�������������!Y����X1�?~���+�++A�������'t��bZ�v���%0p��e=��o{']x��`v�N����p�E��\a��&-�-�����34;��C�����!�.�}��I�X?`��7^���)G��N����
��q
�k����6��|�:<�p��VM��g���$$�����Y�w��w�q����������k�`��s<���=��6$��}o^G�Jf������jc�mk����3�����l�������8�}'i�<H��G�}zw���F�Q�G�!o���FoS$_��U�����!�;��/�f�k�����UA�
F������jU�Z�m�rX����nau���\��p��E;�X����/R�fp���X0s<��s#���w��[{8~�+
������������KWo����8��XH�Snb��������g�b������M{`��s�a���|��M�����]�~�*W@�Y���S^����I���5���$x� H�8;K;��OQ��h��`7���p�!b997x�����w�=�#���lM����[P�
��4��_#��*�}]�d���E��c�!e���C�<$��p�X�V@�k:*�!�`o��PBBd&����M�7i��
MC��J�Uo�>:N�S�t�2�>�+7R�r��Zj��7s>�Z�M����*���<��{^�����h�c�Q�d�0� �6No��A��Z��2�*���(t��eqy}$���F�_m���Zce<&P��6mUd��z�h2�I�������p!��	L�2�B^��A����[���v&x���Dh(��R�6G�p�Q�X��fm:n8Gb*��q7]��!(:%���|t���k��=_�C
kL"�`c��	#��f����*z�Q�	V���#9���I��>���Jc������I�Z`�>�gL;�[���{������A���Nc��/np0�@h\��<^�UUZ�1���S���x�Q��ml���G#��bm�_{�O[�]y�p���6�� ���?q�2P�aP��A0)�De��V	7(��M;%������tOwP�����/��U8x`^W&�p�6<Y�g�X4P��S���������h�S,D���/W�L��$�_W��'�as%�tt�l"�vW�����I�C5�)"�T
��y���p(���PU��-�����q��D�(Yt�o��9w=���5�>>N�m��&��F�[������t���	T�`���U1��6�����^�
�U�G����;{1�A��������`�-Z�������5��<AR�z�a�@r�V��p:�"H�T4����g	vOAO�	.R�������Q<�Y~d�<�&����:�H���h��OD��:xs=�TO���xt 
-G����0���u���Ae�Gm�>���#ZF��j���b9x�B�Hoo�q{�7��F*/Wc�������P4"x!�+~��b�)n*<hyl$����FzN���X������>x���B)���Vx��*
�D�4B�|������w��V������0b�3���1p?��"-.�.:��/���]�<:��>��
�tK����t�W����,Rc2	N����t��/<�HA��^�c\�����UL1��Cl���	8�������@M�����G����!m�$b��7X��	�>�~���rML
9���[KL��[�4�{��G�����#����m���d�/7x���N~~���{x�C�/���>��lk�:���(�W��U��8:xF�^�
�y���?��B�V�<��k�w�])
<�K���Way��x�~�����33�g�
P������ce���
u�o�7Z�����+1���B���Pxpt>�[o��*�����XR�b��X;�=6P��?��5��F=S;���S�%�p���sw8����~��n]g��W�,P�A�I�����6�}�#T��[\>���V�n�=�^!,��&t����������2
i�KTS6XO�D����>@u�i��Mul����}M������{�5&vm��d��_�-�����aN^Ap�#u~����������D����5�}���`Q
�<���+�cq���9�Zpx���.�_+n<��.��
wcU�N����T4�`���X4�C`�>������v�{h8���|�����e��B��*$I��C����5	>���/]=y+���L�����!22	68J`B�N�I���<��w����',��	��i����p,���o6�{���	�T+��&�^�xr?�f���HDG�a��r��9ga�B�"h�����$����5n��!~��	&�T�}
��x���w�.]�����A=�L��F}����L]���!_�"�o�/��� ����e�~d���
�X�������.8>y9o_�Z&f07���/���x��z�6Y	<�Cw�F�t��4��m�=�����D

c�u��ON�KJOae�	���*$-��r#�z}	c(�p��%F�������H�������DDR�T	~�M�������P���	����G�?>F�%������bz#�h� �)jb��zW�J������K���v�������wc���0��S�*x�}
c�����-�O��^�~{-�`@����t9ZW�	;���HJ��@��cp��2D%��0��OcD�YtO+�������u2;�&Mi�h�P�
�M	��K�
����X��i?��
s��hR�ZW�Is�@�
v�����.����&�p��z�����/�#�v�E�8�&n�<����]�'b����n�W^�����`��
�D3l�����k��.��X?j$f���\�����u;�^���>&y�
��x��=���F���J�3�w����x@�����Yx��������ZT0������%����|�`L���������Q����������zc���������8��;�	��f����9��9Y�;^?�j�^=E<�2������bg���xS�pDy�����""�-b�<��F@��T5M��q?*��K�����j7���Owpx��$
<xv}'�*���Q��;���1l�u�*�{~
<�[v���`�~A�pc�v��n���'��i�&�U1AR �YV���>n�����}�	��F����p���XuL�sGvO�]k4��-����������;��I��0�w�W���7�\;���|�2�,v�B��F��s�]�0(a����I����&xx�p$���.A����!3.���������-��6z4F����������M��a��#��*�$Q��n�k�����F'��+<��8��"�S�Zo�I^��A������j�5��t���7�x@��
��)���H4&��W��J��pc�4*(��x#8���4**�rm:���e]y��w�%�p9��]uJ,�B����|�jh��u���#��^����}��}8�N?F�~�t���Ax5y[�bAjT<W1x1f�5Tr������A0l�W���#�(�p��>���D^>��="�asf��[)N����<�4�����xu"���t������0D��g����p0u��"`\���t��~'�����*;tq#��
���g7��p�&<�' ���M�k���k7�&����q��+Ln�?=�����-��An881}2m����l�����{g�N�w�pd�����+'����S��F���w^��>��1����?����#"	v�����Bw������jd�x:p��	�	
�t�6��{w������V]��e=za������+�8��yJl����n�q��[8�x��:��&�����C�Fe�>��`������SL���f�<���
8���,]�	G,���_�D{��x��	��aD0�#[�`�uZ{N��W�6t�^:/U� �F �*�B�H��i��V@��(�d�T{R���}K���B{CdF���@�eA�������-���=*ik�ZK�WN�?0��������+7��5�D�|��V��cX���O\D��M	J�����No������k	w/l�{f�R�S-X4{b����������W����E�y~����A9���4�+�X��= 	x����<��Z&���0<�zL�z�
�%��r��@��7��yB�A%�4�V����������
9:)��{
C>�!���W*~�����x�6�3h#I�$���`lG)�fQme�����0��%J����
�>J�7���S�/7�rf^����f�Z��U�g8���X}�<�U����}�Lk/�����(<`�?��A�f�Q�F��E��m:���]��<��
A��N���P
^o6x G.t�@6m�2u�Z�TP�v��L�`|�rtB�N�X���:Q��8��q����osAK{�����t�V����$
<H���c�����A�mQ�\L=�[����������Oh8�{�����g���~���hR�q�s��8jO'��]������1`.]���������G�yv	���s����n���!b��n������V3��������W��b]�H�*i����G�
��u������/<�2�G���!�����I�I�A]�����COR���|����0�v�uH	���\V^R&��I��T$�5�!-R<���&m>��G��"�X~=j����$�I�T"�[u!��f"���������
���x�r"����
�pR?`m�4�j���#n~x
�*
��fs�x����N�q(a-A	�)�T-�<:��mF���C-�����-`8�l��O�|"������� �@��������//��f���	]�����0d��'	����HM K� w��.?�secs%zv�B�$>�B�
�De�A���8�}�r���0t��O�!:�N�V����h2PwH��Q?M����"���SL�D�k��7I���������.�+#�O&���2������(~B����z^��A<mz��
�j�|bs��Dp5���~����<wNe'����r�Ed����u6?0O'�^�������T�B���:A�}�Y5���	�L�����qIR^��-��Q��LZS)����LZ����j#
q
������p���ZUQ�HS	���H���TE���)(^���cQ��;_���VVp�sH����}�\�L���wG��Xt�k;6��\�����.�4��|RI�4�x�_������!���hNx G ��F�Q�����@���ph�
�8�+l*��e����\��d~��j���n��jK����y��au��ia*	+�.��^ksL��w�S�	��-��
�z����	��VR#�up���	~���� %-�P&���Ci���X�ja?�e����#��T�H��Tis?O]>+]�m 4H)a�gP���=�Ds�L^���a��f���&����j
3z7�����'�\=x�� IDAT1a����D�������SG8L�L��7��5�Ye���������-eyl<�������[x�����B0���9cL���m�	����w�!E�9��_ ��cY��;�ci���x�gRi��>�R�Gv���_v���oc]���������������S���$)?��)�G�5eq�@,��p�����x�)V.�G�Ng�i#l_D�S��)!x{&c�JS�LP���h�A�.������T��P��#��rWo�U��Z�_����<��4{�P�v������ie �����c<�;-u,��E�:�����
W���p!��UX�<`P���>H�>M<pj�F!��-�
��������0�_}_x����mz�I� �mw�v�����Tv������cO�NP/�5����?����{��y��s^q�x����]��-��lC�5t���E,n>��\C=�����Y5���[hB*�H���1)	�c�����Ae��r{LA���M�	���5m>��79�����^�#����$� ���i\�-ZV��Ow������	�rJ�c�+�N��NQN#��`���Y��C-(�*��V�)�4t4����Q��]�~��������Pz�F���!:���w��k^��4WKP�S$-wR9�#�U�������NR�����X��W����v���������t3���e��D�D\ia����JO
fR�}���!��

���A�x���>���s�o�:���	�*U�����z��UCM:Az����!��������nc�*�.nc^����3g`����7)k#�����|x��p�!���w�-����{�x�����q��>�I�-��b��=�I�
�7mA�J��I����<2�v
�}�/0��YN��M�z���W��Y��L�cV�X���w�P���/��"� w��U�a�d��y�l'�M,	�����S��d<��_!�/K9U�$
<H$����>��;�u��Y*#t��^�r=�V��1���T����
_��>�����E_5O��*O��� xm9�������Oo����x9f5����ld0��U�I����u���������w���Y�,)(*����8{x�wv�y���S����)9�A�w5��!p��^�*Nw��d�����k�j(��9�
K���\�z�� �n�I����8>m��wa&s�D%����[H���Q�`H���$x�lTl��*�u�{'^�"�i��=h�[�7T�������@����x�{�5;�<����5��y�9�A�1���(�$(�\���p��b� �8��Q/�@� �]������vW������fc: 1 z�,xX�D�z�����M_�5�����]_����5��N����y����x]�C-X�M��dr�:w?��T�^eE�\���n�?:��5��_����PBS:L� �l��� ���AvX���A�g]��3!n�V(<�?i&����N���9,+U���v�K���7'2�������Z8N0�`�X�
�|fR��?q,&�s��a�n�\`
O=<im:���r�9��IRa�����}�����n<����f��gN�@�`���g�Z`����0��@�`����1�u������{^����9x�]�9����B��:���3/O�d���Q�6Lk��~�����`������><�������������lL��L(�#Ezb������y)0�C��zNw��:������d�)/x`��EsGs�F�����T�
^H����H�@YI&��hbU�CZ��hgk�4Z�����3x@�[7�~"�Y�x��[w,�;?���WM���X����q���fL5U��������nP�W�[���'Z@����< 	xp��l�;����aM.�ZT� =�$_�B���""�����V��*���<0���&Jw�_��4%)��I����?
x�@9������$�5�b��D����i�x�H1��I\>��h�I�B1�|�x�6�� n�����a5s\s|����a��k�]�2[������p����VGS�������Sx�6�B��P�Nm_��6c4`����	<`���(R<�B$����l����Un��Q�
������D
��A'�6��&,T�&*�I���a����9��t��B-t�G�����WA
�4h�L���}��\f��������|@�mf�M7�d�$I��(�����\��
���0R<x�C!<�r�?c:��	P�W��J� ����XT��?`�# b �
+b�-�����ij�1���j��h�)��{�Q��" ��(Ho,K��B)�������g��g��93�|�"�6#$�E�`r�0u�
�>+O��)0X�����$�B`w�`�k���.�r�����:�"%u�:V�0mn�0r��a�8\�t�Im��m/9�
hs��6Z`�\���	R<h���r�??��{���JC�^9���v�!��Iz�n!�o$��q�
]� �?��Q8�����|2�	>`�nT��q���xI��@�������T�\IC�vR�rA�Px�d��h�c���qh���n����E�<��'�vA����M��v9�4^S<�/���:�������p�j{�����i�?�>�k6�r�
L����&�����SD`@���9�4�)\HP��Q�oO�+�-��]!��4�=%CR��O�N�L���rH"�
l��&U���AS}����������r�,��0�@�����O6�]R:p�C�����H%��Q�s�%E9,��������<�����������58���8R�j[7��j�S<8y��F�r%������s�HS<��w.�X��C���;��AR����~r[���N;'rx�q.-|�u���(�������)�|�"��]����L��J_��^�
��A0�x�]!x>G��;���;4�9��T<H�S��h�B���T�����x���L��q$E� ��Z��P�*9���L��-FX`��C�}��b�*<p�iB�
Rj����0f��<�����%��o���.
���v(���|r�0� Z��/��V�#��Y=����_q����{I�`�jR;xB����]���s��Sx0��3��������@�6��� ��xM�#�h���-����9��S<���P���>&wL���O!��Wbr/^��yC0o�90�`�dRq��I:V[��
��<Ii�
"�N���B��V�0��J�&u%���x��+�>q�^�b��A�� �".�A;+�il��w��zP&��Mg��eER��H��)����J���?w�������Q:\1����b(�x�J�&Y^��`r�0�f�A����O��K�R�zlJ
Bb��a_��Gsg(��
�ZDo�T��\Y <�d�vn�!��\��1�UR'0�4�=Ba���\g>�{7#��F�����A�v�x�,
S���.��o�e|<���������\����	��w���@8�*@��_y�d��"]-������2�X!�C*<��6��;$N]-R;��$�l�(�����x��>�	�
B[;G���i���b�oI���dj- !����O��Q2��x�\4L��Z����)
<�I��i��������W�'��]����N�	�6r���m�nX(�x0���z��A�l�=�����)0���p=���c���</S�E
eBq���n
��9����X��7����� ����E�I��4�N0�w���s.�|=4G��u��������|��x-����Iu�a<v�]K�1�b7��\����K��a�}�qe�F�6s�����k��wg�pUV/;r�� ��6�
�Xl������f�cNJ��S[������B������Z|wn�Z�M���^=��b�����W�<`�s��`�v�tq&��u�����E$�NT<`����w�	�����?`�{���a�x�n�8y��+��w�N��q�a�30|�J.u��1���x0��_��V��Z�
<��;�]�TZK{��V6y���W����3���+"����9;�V<�m�O�`j��Z .�/<����
8{������0).<�}�@7D<����>h�~hx��}��nR<h�>�;��0�����nX]��L���u��p�(�������VMC�
���J@�w�����	%��N�����{�\�>�AR�c�A�s?|4k7�.Fj�`B�"1��5�{�6�)�W<�1`�o[X��A����5E����y���K�AQ��t�S�����?�g�7��	��z~mh��A\|��1�!G����x�k)��l]��O@�?�sv�W���=B8E�fjz�b�;4O�������d�L��8h�_� �����s1W:h��~#�U��m�\\���l�S����������.���?�
�����|=
/v_�������)�7\��c����9s�rU<p'������,�*�im#���������:��s�
T�+_JA�'(�V�f���&�����n��m�9���j�h�V<��������D.��+L���{�<��Q^m0��������������[��r������<��5W
8|��u���^�D����s�
���2r��	���q��n�7f�������@���
�?�+o��zs���k�t��q��������Qz��'�K��h^�6Z���];��#[��v9�S>��wHq�@��g)�|"���yx��
SD�I��3
��tmO��nX�F���z�Mk��q�\���<��
 ���X��y����)�Sx��V|3������b`��M���{X�f�k�AK$&�p�>����UkIy��<��|)���U�����������[���?�?7��j�6V��}))���@~�� X��l����W`D�����n��%�����0��W���=�~x�|���0�&p���Z�����J�x�i�g��H�	���3��8�7�]#��=O���G~����3�H��o��������?����KQ��`(���6"o_����b��<H����S�[��
s�\�s���R�N*�	}����7mB'���9'������
��G�$h1@
���b���>mB�7+��e� ��m�����~|o*ti�"��G�������|8&�obW�;u�
�k���U~����&x��>������~���|�ewcp�v�'��w���@�GI�A&���%,@<��G��Gr��<�&���
���F�w�p�t*��������:Jpu�r:�A��m�����M^����d����N#3� ���7��1� <`�i�]����MQO2����S�����u1��[0�50���|qs��H�!���C-��S�&�@��T��d��,9WA`��R=�L�"������MM���3Rx�Dsa�AX�`�����KM{�����,���{8$ "|3���,�.,����� ��No���)���a~�����D�v�
I�S�?�F�Wo��\:��W��A@d����m���N��������CT���1�����7�����a�kw�|i)+t�I�Sr���5s�x�I1���-:!�I���h����^|���N�=��"6��6��/�DM����)��$�KRakNxA�L.xAk�/���u�V$%f����92�<`�VF2�u���s���R�$%\	`�%��l���u����q�p�\*��lNR��T�������o$~<0%7-����&��e��H������;9����<�5��k�������[�XX(<H�����!�H�-1��������^�|^����qw�������O�5A)���c-����|�=���.=������;y`���X��ME���j@���M���
qp�o��������'�u	`��5��J,0��y��a��~$[�\#�q�X�/�p�,3�&P��b�+)$����u�!�����*���$H����l��1u����H�������2_�l0�>�j��W!L)�*�k')��B�}:!��d�V�$�����$���V����_x����0u�E�)�������y����5O���=�v:��H|��������.���
o��f_��^��L�#��%BH���7}���w���vM������3w��{�p��]K��t������q�����8y"/+��Y��|���x�xW*jv���>9�+{�����U)N� ,)k�?�WI��A��W�}9$���g�9��k�X�1G����y����.m��a>�����/���,���n8�$^�/�����VM@�]�$��A��Wn`iW:�x�>h�����\X��&p%�
����Amd���#i�bc��t
��o�S0��ASkk����)[x`C���v��7/n�x@����,�\��`F~k������1���$�6�6�c���0�<��RKSx�N����~�ER�	�']gsW���Y����
A\t*��G�}k�w��g�_(�;-F���?c��H:Y��a���?0����|Qg�����Ex�X��oE�W�����k},��IB9�x<`p���>)���9_��6-�2rg���?��-� �=��oGn�)0�
��s�����H�4>�8Gy2�d����#4*��Y�+r������Ye����Sh���94�6��X��w���@tr��q]�
un%�����W|�#Y�>���S�U{��eq�AXB"�\����H�`D�<��?3tx!��.���]��'��_��s�3C�riEO|��~w�����8���j|"V������
~�O@M�Dr����H>�=���#g�l`O,&��:��)� �X�~N@\k��Qx��R�����K�E�<����CG�q?�����|@D�����x��������8y8��F��)!�L�J��^RL�bc�7���kWF`�����20��z_<
�c�s�7d"��>��&{<H��F�.\A!�\���d�]2��F�P��A[[;�pl�������v�S��5
�\?��v�h,J%����E����(�@g���������k�3��<�@�������$�:���I�wB&����>#����d��g�Px���������{���.����!-����?�������@�lN���"�}5�Q+Nl��� �9a~<����;"�6C}�=�����0�	����7��I��Sm�<� 1-+o����v&���\�\�1u�Cw^'0����6��s�����7q,�I�[r5��H9�����z�������������2����/Ha���1��Oo �ES�:h�Oi!����"rw0��|���S���%�%A.x��^?r��|ka����uSH���wI��/hS���v����|�q)����F������T`��$�����xD����/1�}%�C�p����N���v��"�W<`�AW;6�t"��R����'��D���g�Sn�)�]�������a]���1��x~^�*���p�o&��E� 6��y3��������t��W��i��i3�x��������#�n�w�����9�jx������0�
��m�|K�B��P��cI����������&L�k�;�����?�J����6"z5w��SS�����s���~=:i����4,����N��0�ukzRp����|�]�" 5GA�`��J}��O5���E�wt��Z`�a)��m=rGrr�C�����T�\F^y�}�����36�������rab����PP���N[�w���G��B�k���EIs�94���4*��/lD��+���o�m���D���E4m��������xpm?�c\:��!�4�U<������?�G� IDAT�9S8���=B���s��$:<�|����h�t�<:
������M��+����|�k�$<0t�����[����3��H��u��h�Xj�t)�<B�U���X��Ag�N���B�O���u<zM�Z�}M�u�W�����Z����
��9��3�#"���[����?""�Q�����k1a��8q������g���q`���`(L�@��-f{��]������7�E}PCG
�;��3�����s�d�0~��mD������S<hLjbHU������X_,�������x���O���3��;������dr�^8Cj"]r�`�����c(h����
���}zmq(w���'���������8N�A����3o���1�)0��
�_���X����Z����v��������I����u(\>���Fu�!���M;���.QR����tR�+,07
5�Q��5!�ovp����q�e��nW�:A~�����Ps`�.�\(x��r2R_�@bJ���uh8k����N��o]�OG���A���?�C�Am����;���V�[��X��C
��"���E�z�6�������H}��
y��A~��e8�=�������)���>}g��[[P��4/�lJ��tH�	�����1�8����
�u�����_���|F
�����,�w�H�� xP�6��'	L�`9�k(L��}K1p��_�ge���H��w<����K�\�g��=�O���i�`R�a����L"WDGOp�	���<�w�����UI����W���U�Kr�s�"�6n�A�]����������xp'������^�����P���M��<�x���r-�w��~yw4���4s��~g�"r���-�q����=F�q�s��W.se:��;o���(Of�5���M�h�q4Fu�o����a�{g����`�*�T��t'����k�E� �Hc��$<�����Ct���Mkm��!�a"����@!+<��vA�T

]-d���6�$���� x0��H���/���CP�=�D*�y���B����;Hz�H��Ri���K���E��D����&������x�&�o��mZ8�S��AL�������n�� ���xp�7:d��$k��e���'��x��<O$tf��o4p���=���f�hk�DBS��?�� X�(����]-��_~�@��x���J�mJww�IU������<P5}I����)?�&�����(��$�SIP6e�(�GY��5����(We�gq�AY�~[��j���Oq�AU�cY����BY�**}q�Ay�Y^��RNq�AY������U�Px�j��/���2i��8��,�V���]-�W��������(��<����JS������UR�������������,�<�.��By�Yy�w�����s���2�r>���Y������Rx��2
�WxP���G����0��4��j�4��OSxP�<�J�o�4��J�'�����*{�8�@�<�Z�����VWV������o~W��CI����Q5���TM�?~.(� ���mA*�����U�)m�������g�U
#�,P, �����D�%�fn��m�����A�-�_J���b���lY\NxP1vf��A������@�6����%�E�FT{���-���cE�"������������x�~����lk<(�F���U�Ur\<(�F%����,��u���\A0���0��yI�^���R����4��9��[����
	Tg�A����_���|���W� ��xP1v����3+E*���Y��xP�����"(T����-�oO[�������@}�|[s�v�P�m*(�����A&z�*��H�6)����TP<P�P��**���VU�������)���\��	�A��&���Z@*������@
�me�Z(��~3g<�k�A����"�g��,I
���k<��'��)[����_S<P_�	���l���$�xPQ}WP<(����A�6z[b�A���T~T��A���T�����r0����.2��^�-)��7�CJ��s�$�F�:���B3�_��,���xAC�
(&X���^���.�<
�A�Y�Y�]����T@:�TJKK����J��������Le�O�d�E^��d�J���o�iPS::)e�CEdP�������K���b�e����qVN[��ZI
���BRRssCFF��#T�E��Y���]~}�ml�LG�:y,�=��n��JTH��r�r������V9mUJ����f�<':��nM���,)�Ij���F�MT��(;?TK�J���6�1�����lk�gr��G��T����������������x����\ufR���:��J^���h�]�<Q��P����gN����o[{e���
qk>-�)m��������2����'�}m~�L����_����Uq~� I��(@is�k>�t��Q���tD���V%��l#3C����r��h���8�?�FV��e���n]��
�����O��G��FY��T�4�L�e��q�M�OY�u�W��{,M{hf�{2��R�R5����P)Ya���	b^���S�2e��l{hg!;Cu_�e��R�K;?���G���ReTD���#!���H��������Gn��:R��@_+�=�d�2&����,K
�5����5��i
���P�k��z<::���T�;PJ�i�u��,��7g���&aaa��������U������DN=�K{T��X�-*��:�Y��233	kk��eTRW�����Gbb"����U�g��
B{��v���:��]���Q����GX���<F���)�GJg��J%�GyYV�|���O�������:����ay��������<ST����a}�<{��yW�����|>�@��'��[@*�����HX��������"V�%���Q�C����g�=�����r���:s�.�!,,��W�=����e>"��������0?T�5����e���r�.�a�����|��|�Y��<��=���z�Mu�R]��:�G�@]�Z=�T��H�.����Vr, X�JY�M*tHr^�����LU
�>
��R$b�mU�C���#���LQ"���j �=��=*z,������e�Us��L�GB{��UK�'��c�0�0��Q�T����Q���Z��:�G��	���Q�|�k>R����Cux>�K{���oy��m�HT����oa>���*&��cgeKQ�����e��l<a~����?^u��0K��|��uU/��������0?d�W^��z�([����e>�Z�2�CP<(��$���Y@P<���.D&��@,W~���@�V��`5��!�U�OU���.'v���Z�Gu��0�V���:��0_�Z�xuia~X����U�=���O�V�>U]����a��S�e>R]�����a>����Ug��.���^_�����������o���"&������@��
��nUu[�l�U����������Gu���������0_/�������Gu��W��He/d���.�Q]�#B{��g�'a~�;�+����e>"����W�'��0?���u�R]�#�=_�u�H!���x�la���������GfDl��_C[-d+RK�O�B�r��FEE��������[�"M�KD%�I��DUU�)?-#Ob^*9_���4Ne�Z�����\&�"##[��&� � �bi��������.w��l�a`�hY���+$^n{�Q���l,RTH=�ZH��h����e�;=�I�����������Y�jAS
��2�+��Q\�"z��u�)Zmq��=�V�2JNN�1���*��r)���G�^R5��b���������&g��Qw�.�GE�k��D+d��n�TT7Qw��w~���O�Y225Jv�W]���Gl����P�LU*����iJ��eT���5?L7JA������l���=J�Iuy���=254���Q��*��[�����*z����	�����XT{$��G��V���Ir,42�g^[�b��G��
Z�e�7u&��n���������`X&����yy�hgA�����*�Q.SC���G�����fe�#������u�G
�CVV��[���3-��V����>��\�VtP�=R����U5�LT�������Q������*��u�����<��{aG���s��m����2�@��6?j�����'+q��_(U��L4k�&���ar=��xP�F)!Ypt8F��_)3���cp)�����yT��V8�/�_����P5�������G�&����."K�*�|eg��OuF���K�9���'������%�����u*-X@���O��(�?�}kd������*������{�<xY����V�S���Q5���-�l�������^����������b��)~�N�����B��RL�3�^���
�#I�)�	P�rE�B;X����+"�]��
�v�d��-P$EUDuU*���6*TJS��M����R��v���H3��~�LT����a����TN��'�������0+����r�Sq�o����t�-A�j2����!d�e2��u���e�T���59����J��j%qz�c4�?�jU*_m���6�P1��[@��x�����T�(�f�c	���6S&�(c%@���K�@eX@���TF�,�L<�zm�l��@YK	�T���j1!~eY@Joy<�����R
��j��
��@��
�Ay[8'<�;�(�����x$��A6�`�6��r���;	����NX{1+����M���@*�R��A������B��R7{�lLU�Q���<X5y8~�ws���O���R=�nc=]l:_:�}b�v��O��[���oF
�OO#>�l�����!N����NW{�o������+C��L��
����V�IqA5u��}>�*�U*�������S�O��������4`)�5�W��*2��V���MQe�x�q'	$��0����VM_�g�?�Yj��m����4E�+vEB:�R���<8q,�����#��W�^		Y8wF����N�6,,����g�9��wI
^Wv�b��QY��<h�Ei����Z�'��X59b����J�kK�����6����'�����Cte�Z���<P�@C�������"���j�D��/B��)����^9��R<��m�z�� x�n4�r:���Q�l������w��.7������2
���?5��|<X�+��s��������������rL}G����IY8v%�(}i���,�~��sTfnd@OG���M��4u)Me���|�K���4|0HJ�>�.]T}�
�����`\y��}�����d�����m���}s���l���|��4��<��
)i��	�v���886����<\u5WA�p�5�G��pv�D��^���T<H�	C��c�X�Cfr"�;
V�^x����DRt<�w������U#�H���@���P��3|��FT)����UuR._��~=�jZ)�SP<P�\�zf��e�4O����<�O�SZR^����
�1��xP�K�j��-{��['���
��T��vV�/g�t���h������l��DK��SK��eWo�`��3���)02�G��ZG�������4Lxw ��F^�r�C~��||���������/���KU�����e�j�4`�����,S�
��r���;�����&��n�o��`��o
x ���anH9x�J���j��~m�������HK���
{�$���n��c�\�{���Q-�����s������J�����!6CJ��
B�R�:��Jy����G��'c~��e��B��x��7
���P��t� +4
��r������<����l?���u��Y�����ohi�n������g���u�6�T���	t�a��1h�A�u���$��D
��wS�w����:���
��;�H������C����G�V:x�)����/q����F3p�	���?x�����WW��YD���Dgq�v�I�)��T�'0)�l�kV1�[q�=pQ��ME�i��w/k���:���e,�^��,5�������`��E��%%R'x0����z`!���'�%������-�����_����U<�;�:
���\J��E%��U��@Q�A��Kqf�B���F���T��6� 3.�c�`4z���Xl<u�����*��5)����9���,�+k(�����qu�|�[�u�\x��T�j���
��@�S�]B
�A�&.xp�������
w�y�!��~.$b1��^�/�M����g�e�C�{1jh_�/0��_�g��HL�a���������y�6,-���`�����w���;�22��LS�3
���P
<������ib���X�}�w�7�
���"���������A@M��5�����<�Aq���_��F�8���J\A��D����z!Y1�D'�iMT~!�;)�4����������5M=M(�!?�<a-�%69�P�������}^���F��8�R��p��l�NG����Ab�u�]|(�2���w��������H ��� ��_��S�fzzX<�7-�h�$�gW?�o���)-,~}�8���������^%�w�0Wl�a~g��J�$�'�s5kC]�]���ik:��:���S����RN>x�
:�/<����R�>��������,|y�6�kbr���xj`�O.)w2�8��������4���qAVt�^!iT�&6����O�j�����Y29RO�����H�����td�( nd
��M���i�����������O�S<0'�p���ij������u{�~������n05��V����}H����!=�����������H��c���HU�c���a���'��������]�Pi�����B�S<�K@g�FX��f
�3c=����F��6�����=����{X6~������K���A�f���-��w����/�t�q���WuT���j�q|+��T�gvn�A����Z����9�->����������m���v���'��[:��/��H�������j���� �~}q�$=O�����.������J�9M�L(�����{�����LL�;a�a8v-M[��Ikl}��Z;�nfn�W�����M���5H�L�,]�&-0�f.G_���3H�H����a�m���GBz�f4��Y�fay��X�`>����
!������a�c�%�KxZ���ox9+W�@d�')O���w\�������<�%K���1"��n?M	�#�7s�9/���>N~�m��a��`t����0�E�,j��B��m������9u��sj��k����*�_d��E''7��<��Qa*1EFv�or�k�m�MO7�{����m<�Y�X�h
�WG�F����X�����qs��3	���}��=62h�ZWb6�����V��k��m����s�������bJ�)o������_������
1��e��JqJ2���q1�4���� ��d������fCd��kT"S65��1��_�������vZ6�R3�e�q[#d<HF����,HY@�D����*z1I[@�O8����|�K�{�(�d��������0#mG�_����	�R3�r��o-���#�������?�6�qU
%�l\=~T�d����&z������`@���U��g�a@:{�u�����C�������-C��Z������6lk�p�|*"��){�����Lx^"�������VZ\����?z8�F�!8(|���������L<���Z06�DR7�y#
A��!�jBWO�+�z_��{������@��O���^�,�.M���7����q7e��`�
Y4��#�")1�.�af��(J;n��k���Cs��L~���@�?�8U�,x`�(E��F�W0nm��aM�3���r<��
�Q9�"�'d���R����Iq�R���k�����PF�w� IDAT��t��y��~������&�6���/��X`�	L-!&H����~�GBh:<�4�m*���Q���@������i=	N-���-&#�(A���-�0
��"^N&��v��B�`���L��;������QYx����������D<���W�QM1�.���H#����xJ�����3���?5����)�k���U5������aH�D~S�h\����X�����]mF���	X���zy�BVr
����N�N4�D�mX��FC��!�8������Nw���M=�I�)8�mtu���e�x���ZV�7����������;�������a����<���L%K(�x �u��+����>?t
���a�/H�o�k���� 5�q������h��6�/�*:6Vh�n%CJ��������6l#_bb��;����O��5{zP�����+`���+��G��K���-�}
][R����
�\���HW����x������?-��LHM����\����;D����:���[�`���W����w�0{��w��������b�W����jB$����yHz�De����(
<�����y��EW`8��.�D&��;�R��@��[�|.S�m���!:���U�}��b:>�����	�_w������m�y�?[��5�����L�����&4^��[�Z54��m��k����
��a�
��.A8���
6>�6��5��A����S���H�0$>���S2`�2 ����46�oW�g �i=R��1����P�730������(��.a���v�o��,����5��N���E�:�Bs�������t�OH��������d���`���q�?q�����u����[9���&����k���DmK�'���[��m���)�c��"0��Gk{eP�\
"8�U<(�,�Z����)����.��K�p'�C��A��t_!Xrw�,���v�k�e:�w�6��G��V��{�c�8[�.�����)�D�������Q?8��Leh���
��t����H4��;/,A?�O�������]�w:���s]�SV�����kHE:<��{���c�N�����q|6d=���+���\��>m���q>���}�*���Z�(����4����m�=
;���(�?��������������n���>m�����#K0b�W���CW�~�<q�����(����~�����W���u���$���������������.����]-�>����=
v��^�Jac�o�"�����V#aY��_�>�N��A����I�`��3��9�dq�Q��������6qb��`h^�+ D��(}_,bQ��Aw{f�c&��N���	������-j�����+y9��0�9�����oa5~!�n�E��S�����X
�����T<`�f������C�$��x"F�6�)������6���5"����t���_k0�L���o�z�n��C�O��(�]A��{0X6��0���Q)���a�����_���mz�<�WI���7��XL�
4v&D���24j��[���&	1�x�sC"6�1�o���w���O����f����1r�nD����e\=�3�����	/���%`����7m]#<
�D�s�B��:��Q!J�on����QmZ�Zqm�����j��g�m��(����\�T��tY4�J��_Y��^��H�����m�����+4t���e�3�<4FGCv�$�O���'��` �N�H}IC;H�+�n�#0x �h��Y���R�V���F���|>(���(E���46����.H=x��+����'K
�)}wZ��'�����'%e��nG�l�PH��������C���6���3�f�1�@oTKh�Z�����A���l���?����Ba��;2#��v�1D�4=�@�z�F*	<�l���������ah]�z�A��'�oB���Y%�>��=k 50A�a���?��@KG7�������|�L����|��y��G�S|S�F������z�b$�VT��xPt��
<�OH��}�1e���y����M�f
���u|c����J`�v���S��a�?�N`�fH��~�x`U��Y�9����<�<�X����_��������^�85~�N�n���C�p� x��h0vx�7�<�~�=����Q����!������z0�e"�[�^��r�*����XT(xG��c<&�o���"��I��}Q�(���K$�yI�d��"Qo�y'!=@�)��r�A-V�
1E���O$��f!5���K��x��E�����m,����*������=����5^&�"4�����;}<��A�F�H ����[tLU�~�%>Z�
���g�%�p��$�U��X}�"�7m�[������0�&��[6G2M��{���;c��K4/S��Ha����?m�����[��8���q�/wBc����x�Y�����>��^������2�~|G|������Sc,>r�kc��|���aR�����?�e$]IP����1,<H>r�:����{"mx$���:�� �z:���I�D������
��G|�)iX����u!�W��O�����_
��e(n?�=D��^���bt��{������S����7�����w�uhn1����[rx ��K�?�O�
��u�Q���6�b�/��uZL�[s\z���,]�]�?������5�X����������[aE
S�t��@`i��t������0�qo�y��cJow�D�p�`���X���h���1p�~�����6E,N�`���8=m���#9<5\l``k�;�z���A���<R�h��sw\��wA����z����C�xy#��M�Z�j:�w����(��������Hh����\3�<`�M���^]�(b���i/����X��������C6cR�I8~l�����o���zGCG|~�s���3��Ew��8y��������t�i����_�~�������G
����c�1�=\�O�>���;}�7�Y�	�'�C����K�HL���4�y�<��,���'�f��J������j�������Q3�*0�B[S=��-����`�f�������7����@�	u'�|������x��������uk��7�cOF��u�1�G��5w�����Zv����;���c����1������k,uZ�KQ�8����7�1���_���a��l;f�0y >����Wa��u��m*6E�<�L[��;�bu���<zJ�-	<`�Z�����M~Zl�N�@v|��$Q�;�n&�0!�\$=Li�,�/D�r�@�I�u����'|h���-�p���ZR�{'�B���M+	���f]m�oQ3}(�GA�� �4}m� ��`��[�@`�a���Q��M/	j0��Z�c���U�S�(�"�����w&c�=���������1v�.�Ml$E�q���N�FL��,�j�&xv�:������z�Bm�����-ZJq�`
���r0�3�0�' �m��h%��������n�0�M���e;^��tD��8�
�i#�C'ml�2�M$u�u��0I����D:<�s;
F�~}1Rh#���G��_�|�JC�vT��6m�|&�a��d��!�6�i���Ef�����)���s�i�dW0{$%e��rWz8w&
���SW�Js����l��m��=�o
>��Nl����Dt�e��#���p�����!�=�!#  �G���'�� 
}"��/���>����K���f ��_b	H��rh���C`C{|�$ 5>��M��&�6��8\��C`A����t&�[��T�W�/�piy�����7����a�]Z����yxL�����:@X5�&�"u��l@J�X=3������'��}���'s���+�������@����RO^�E@+hZ��Z��	N�K�E�H��K��bZpl��+�vmC�i�1�����Y�IH9x��qN4���1�����Z��]y�:S�
����GcA�����6�Qi=H��)d������H^G'BF`�7e���Y�T6(Xw��v����5���
��o�����<f������3w	���A���U����<p��x���_gP@��7�+��W���f��7�N��cc�g6���aD��:yt�-����\��q�gxy��zp� )�)�8H�`�p��b12	�������/qo	A������~][4��!��;�����|���OwD��?����aK@5����Y��x`�gw�����A�)����i��N$������OA��������xi�v���4L(���L����g������GC���B}��4����

r�d~��7���S��*�M�L&��x��"�����C�;}#m��������w;1j�h��I��Ch�����ALB6��"U*��!�����R<
����L\�w�	���m�8x ��Sb�sNA�p�v����oiV�G���u���D�`�PRp�U<�~*
�[�aLy���6���p�"�d�����jkQ}3Q��;KS
$�Q������)��"�@��t�#�f��[<`e�L�S<(���^dY�>�E�+<p��{��-q��8�����w0���q�X�����p�����a1�,�9�J8q�s��?�~��K�:x��:�+��gW0��MX�w~�o�Z��am���F&l^����_�n��-&q��� �S��v=p'�4O��y$��8;�����!*!��L�����!'����j�x���g��q��z��|7�Y��
�@���w���g�,
<������9���C\�K���3���&[�C�	�J�F���������P�������<�y�(�Cn���v���o����E�]��������e�6�����M���?���nt
?��`?�]����n����A�^z������9���D�J
�������s``V)�4�q�P�S�zv]���s���U#Y�!��Q��=���Fz����6O���Sq������������C@�nSr�P�	��Y!j�J��p)h�MC��V�}�O�CzL8�zO��i����(D�X��� ����.)ti����������/�����@��g
�o��6���SQ��}�v�	E��v-h����?�AB�L������4�����w]������:���9n�?Fb�e����.����k{alQFf�,1}v����\W	2��f�b����x��W���Q
���Nl�nC����Wy�����p��<3�	�V1l|o<f���@ss����	��p��n�<S�������78������4��m������$������H�{���Av��.��I��r�����#���Bv�����
:�����4>M�l'{�_������e��������3��;6Db*�����ZP$g����p�a��I�����Bq����nH���I���\#����p�2�`8�T
����H�f����{���
I�{"W�@�/�����\�����x�:z6�� >$��=��kjE�w-������T���:f�l_��C2x�����k^3O�����x@c�<>?[����c��8�x4��}B�dZMX((���Jq�T�+��������/o�
�8|�<�G�FR�`�0,���sN�}�������G�'�B� �x�\2�>x
G
"*Y�����9��K��@���p�b��|!���� x����Uk7�	�+��M�Or��������S�a���xP��_K�x�l���
z��#��.�h���A&Q��o� ��-j�����	E��:R��7�%
�G-��R7�Q�hnM$�N��^����7K'���l�r��U\��6�_F'�������G���A��x�}o��F��K���,nu�u�@���t�A�1jwC3wA���x�X�����'/_b���P��lQ��M����k���FMVg�����1��n�����j�/�����{����Rb���8r?�+ e��Vk�����*hy=��#�;v����jA"��J�;��oQ��4���sf���.o:�� �[Vq�W08A� }�3� �q$��i��������d����[n�m���8��))!�lLIY�4&�D/�W�~B��� ij�v��^.�	)<�"�����T��:�����a��1t�����
09B4������X�����������4@K�:������+���0��_�����j}^Hm������7��[���7��^CZ��|����BIEc��#���U�����������"����hD?#�����/4�fN�2���C��iq����\��C��X�^���&�x@���������t��z��q�T�3hS�����9H�o�h����la7����BBbH,,[�������
�*+x��O�+�_{<|}�����f���%�K�r@n``�L����!��SB�����{s�2K�6��RA�6�����@���SnOArF2�u�����w�t���'��cJ�)y��y�Z�����[p6v������bj��\��i�S�9�����0�!�0���}�5�5�d����Zh[����F�����v�ut�`��Ip0p��b��H����|�1�f(�r�mX`6������b���r���;�����cf������@Fs��<v�mW�VL���ho������c�P<�mCV^���������wg��f?pe����@l���n����_����%*	<�N�D��8>u%����O��nF\��+�{w*0����f�SB���B����2SP��G����*jDJW�x�M��]L�����it�y,mD� 8pC8�N�q�6[��� �c���������X����
�z�xH�I_3R��
R?`u-M(	<`y��)p�Nu6j,���$�}B:):����Qc��MNHO�
�r����\W��];�1z�>n\OC�
 �O��29J�W6NH���?e�����ct�T���&C�ZZ\���N���R����}{Ry�aa��<8�?����B~�	��Q��WZ`e�iSl��d���D�Lhs�#�
��yem�$��ws���[����%�n3���6�[@ag��
������&��1��T�7����Z�?�������E�tr��^�6�=IM��W8xx"����L���A����H@�+$$�gpW>��UYc�l[����cI
��I�S���p����$\\����V*j6���,r<x�7�5�:�I]1��8x����A 
��5^J���82���%�]M��0C��K��7��M���1�K������{,X�s��P��.���J�P�:Bq�Am����)rR$�vm����<�	�g�!�K��
�t�����4tw�q��"�)-�[3��:�j3>��q�Q�����3����gH� ���{KP�B~�2��X��C�C2t�uG������?|�U�)�*A���C�ia�����7 �T�}9������
f-]�����b���YO!0� /.)|��!���m@�/��Z�6,����^�������a^�.8��A��
RQ�
�[���<�����w��������������������N�Js��3����#��qh�Ge�������f��h����A����������C�r/��A)�����������z����.R"���`!���1c��s�6�flN��6�l����](�b(�������!�r/1��}p�����}�{�������������3�:��/����6��"�8�	%XI���y&����qm�\�	i��B	������r��&0a2m����x�Ii\O���'P��
��v-
�{�+��?/����RI=A�z�i\Z��mg
�Y�r���r���4^� IDAT�
�O�ib��4�s��gp�`��4R6�����.��J�==.�����Z�����NEz��#@�2	&TF�&���S��#)Eue�s�������N�R���
��_7+R{8G��wGR,`�BN�I�Jj0;��bl/���<���B��g��(����o4
6fup�{+bI�������
jY7Gu��2�	l����5!0� '����,�x��M�&)��j�e�����������<��^��*
5���7�����p���d���"��1��R\y��+%���n0��+�y=�2�X���,?4������7\"���J}����.&���<�0����:�����q��j8��:Q}��NL�����q��8�a��_���]0���:���)����5�&"#C�M�����`;�'��!p�	��D����x8��|1���"�S��������,����]��$�ZB��s����8��F|�[<��N�D��a�G����?pe�?n���Ep�<wOJO���ZPU�D�����g�W'�}a�AfB"Om���4uM1�I0���y�sq��vh�[D��Nh�u���2�`@>�#������=j�����Epi@s<:w�'�+���D�X&���NzW�1���xX���f0�We���I#��P�� K�<���]7�dW\�MG��m8������jre�k;1p�X9m���r�*h�$��A�gj�Z�=~-������]��-/��o�f]?��~�Q���3���GR�qo�7t@l�����K'�w�T!dSb-<H8{���]��j�"��q[w�`�(�w����: 2���?H�@����	�\�"����v��s����\JjO��A?�K-W'%h��ZT�5���D���������{���V(x@k�z��"u�K���7�=$��i]@w�;v��Cg�H���H���_q��@��3)��(5�@K�N�����v����)1��3��p=W��F�#��6�O�7V}E��������?�ey]Y6	6����M?��u����\!Ap�P�;E�iJ0�����b���7�?��9!&6�jT���1l@^�������+A	�r7�x���9���a��-��6}Vo�["�Y�OH�w_N�UP(��)���+����>J�<���u�Ov����@��M-�X, x�N{h6�����a�i>"���i�vS�<�yMD5���a��X3�����X���.t��LQj�H�'Bu�sa�xp@�x nGGQ$H����.�q��:)���R<�/(({Wd�`d�N�z��:�Op �=%��B���A��tX��e -��Z���d)�
��u��
g�`�:����Sw�z-&4�V)$���6W@t��\�`pSg$��q�����=o�4y��(�JA�A]�Y�)��!X3�
s��nx��@��#�1n�u�v`��
Mz�f�E�X��x0�um������G�q���^��Z�`�g�$X��S5��+�i�����;�D����W�H����I.x����8�	61�H�@��L!�������b�����8c�h3]Y�	R���#c�a��P�0������B'�:�{�!-�b�����I~�mm�Q^:ZZ�v�&WN��x
�5Y��K�n�k����j��r�tb0�-
u���DD��z���=o�1|��%�7��5��=��}��Ks��}<z%U<��dMqC�����s���^h>�=BI�@��'9�A�?I�`�e$��A�O���/�&���"�����������?�����{�z������`���_F 6 R��+
0�fF��$�	��g��9�K�-��LY�t�i�2i��0�N�9P��;��[���d?sMPG���?��5��F���S�3fbC�+0��O�}
1I�g� .��o:�������K�f��
���������o���`��k�p�L�!��c ����;WN`i�$�����'~�x�F�yTr�W�x0����uH�J�p������0���N��
���(������T
<B=r����	�:�����cC�&F�*���~ 0���cn!����N`�����������B�>em��S��.`�����H��+<`����,�3�9��T�r���Pf(<`*j��zC�@`
T��r���}�W< e��{�VPO�b	����x��6Z�,H���p�!�j�E������OH"���(0��~�H;Cp�
L�@��!m��m�3h!?x���J��#����~#-�5I>�$��N���
��L	`�6m�'a������p��a�@��Z�:R�(����K)� ��o�W<p!�O��gn�{���p`��4��A+J��Aj�.R��K����Fhc�Vi��H���\*����-O:q�Y
A0� !!�]�$��$4w����H�@�$����a��p�\-4w��9�4�R�'i�R��L����3:A��3�������{'
�z�9�����Y��Bt'fu�`AJ/Rs��V�>�`�NP������?@�7H�R<����f��f��6�IM�I*{���Al�
C�R������G���p�Tp{,B2h�H�C��C[M�2�BS�$�z����P�\&��]�l������`���s���� w#����a�N�J�?�R<��@U!/x� ���d�Mkk��g�,�Bj�t�Fv���~-
<`*��h�?����BAL��
T���Amz��O�5��I
6]����4����������D���m���qoN���C�'>�y1�A{`'�?
�����,�s��)���K<0qi���$��U��+ps��\�@��&�G��,��C����5)�%A~�uZ/�$E�����v�v�b��l% `$W;���������v���,R�#Qc�'�U\��Ui�<^�'��9?�a�H^_�(�X`��HYAbgC��H��T�������6�&P"��97j����j����:�!�W���H6e��c�0W:Ck#q�3�NuF�o&�R��E4�7���8R< ��~!�:\�!�<����[rP�N��@'Ml?C����x��h��������(�����lp�6�����x��I�\,E�39�;O2yYL���dQ�
�c3M^�R#������0�����XwDZ�����:CRS������g����>�Z9K�o��s��f��b����S�,�J�c�s�v����L0����L�  `�����k��A'�#w	���q��&0�9!G��)+00u���e�G,��Eu�<��)��� ������B�#W�/2-K�!Rd���{�F\� :�=b���raK���x0��BhP�-B����D�f�����vd���k���������l& `4WP`�D$���m�*�v�j@
'I�h�`/G]M�o�3w
y������[���u1�9}�(�/�cg���_z/`�LY�����"����+)�8��w��V!���r��0��]�Q�xc�t��Wo}x�s��Q�������x�f�q��)tl5O-�e����a��tOOCrpm��)��U�w@F"�����v|���F���I7A��=��#��k��Pl6E�.���k'������0�m�������x��Fs�mr��6�Yz&��>T<���-�.y#��>�:����~`�f@.xs�(=���A'D_�C�
D�������[��@�,!?x`@���V��!�`�#l<�n�$<
���QF�mKW;0"��/��W
�8���4�����RrA4��R�|��'���A8��
FFZ2]�jx����~�g��s��������A�=AA���/�Q<p���^�&������V��A�����,}�?Na��������-������R�V��A���y���/_�vK7���*0�`	GNBB
�9�����WC�1�\5��A)�iw�_��6Ro�'8�����x��G��	��c�x���w��7��+��Z`���
����p]
>��(A��T
~9G
/�F��l���k2�����B��"W<(O�����_"5���7'�{s����H�,	W���g�]B���4F�X`�MF������}�x��\�����s�`���7^��`'��6
L�����
�b\->�K�&u�,���B�5����r{"�3h�}���?�����a�����Z��������H�s?���7��)���
K��sO��"�}���nM8D!��Y@����`��D��fU���n5�L@���0�~,�6����;'������K�W�^^��
1��
���������Q�B�l�>z����=I��b^��0��4����B�eJ�l�H����;HN��X`���U%��>I��'�N2�!�xtG�!�D44j��t�c
UP<�����������j4@�����
���V�����Lj�_�+i�<xK���$N�5z��u-&�_K��#@������.=UQx0����o�:�X�z�&z��E�-�*4�^�������D��?X��aN��|����7�x�<<�'�`�����"<��P��zb!�vm�vs�w�����D�����CA���X���	b��M��?����NR�� %�V�t�Z��{��n5��L��h,�%X!0"�\\�b5�P`i~����5f�-T���?R�;���DV!����?5��KO���5�����])9|�\x��4�i!�.q����O�2�F ��!��,r%��XZ��b@������}VL�M���P� ���CE�I�1�>kY��T.A��3R��"�6I}W3!��c72E)0������H�^���7r�V�y�(`Js�t�����0~�_n������?�����6��M�%���kZ�F>�F��	=�6D'Gh����p�nMx�8I�VO��n�W��`Bnu��E�Na:�&�U<�b+��!V�A��hY�&�w��Rz��:4�2�h��!0U�%#�b��+X8�'����V�������-`�lE2}��2�$,]����L�[�����;�� ��#p�N���J�1�@�7���/�����p��	����A�&���p�-���bS�=Oc���'��CWx���>X�I����CAAQ��v�m0�~���m�G�E���$��7;�U� <-��LE�0� <5.F.|��m��K~���+!������y�L%��H`J
�������4���=v������ 47j�x`�c�?_�	S-S���b��|l~M��j}������O����&�6��W�H�KM��X`�g�"0���NN�F�FP`�^'������<�����6`�0�4���MX[�x��V�Au��4T50�ar��������,-SU�����%���A~��J|����Z+����t����A��6�
�I���o�J���;������$B�Q<`PC�������g)�����XR	o������E/�^���FIC����$d����U���t
"3<�
NE�%�[����;9�S�B
j�&�pi�X��N�����k�,r���m�t����Yv<A�t=k���TRR��D��(�����b��WT�����:�L!��/��Y�	`j���1� U�`������ w>��Q��MRH��n������������i��)0�����MxI4,^�N"������E<.,���*"��j���/54i=�
P���������QM������)��O���i���-0���>A��mLq�h�)/x��9����!	v�U�TL���)mj�T�B<x���X���e."�$=+�\Ur��~M�����a{]	"H����c���W���+N05�0�-F�k����q�L2w��6��=��IZ1�?�?�4p�Z*��G!��>�<�j"� o)�I"G����&�>! �l��6��0�,0��n���:W7xv"��F�� �/!����{�>�h�]d����?#	4�*%���/SGxJ�����4��R��+�#����6��t2F���'\]&�1��=��~i�!�W~�  r9������-&$$������%�$~}��v$���d<Z�����ah��ya�0{����3	h1��$-�Ar���G����w0z��k��R���J��i�wq�(��)00�
t-wgd%$���5�@������iz53#��
<H����D�����$�M
��;���)w��|�>�|�iTq��H9}��t���:��kr�@���*���{K$n8�x��`��i��IE���AL�T����,��-���o�&~��]�<��<���A�&�X��m[�����8��\B�;h�m�����~G��@B@���P�OXvnK~���`�/0")gM�q���n��>����b��B`n|,C��?P<�>l2�:���@��
��v��e��c����h�G�u�����y�u���@�_w-dR6^6��1m�%�����us��\F������N��E���'e��Ba��dT]�
�*��,����z���������������{��������z�w��i���9)��PR��m��D�L�ZG��P�6�s����$0�o�wse������:��g��	8�D��t�A��1�y�6���������,0E�S��	A[N��+��Aa�6`����!�W���!��8��"�J�#=WX���A�{01=K��^������[U���������;o(���oQ�
�5k����B�%> �����;z�a��-4D������CmkMm�����!�����RP�\�T�j�����,�]��A��o��C���20C*
�]-�x�aY�-U�����X�����*�}�AJ��������y�_�=����b�����)�#��z���������W��#:��!���o�3�`�_`�L����A#R�_�5������_�r��H��R�eV�L.�QZ#~B��tm:��`��)��{��L*�^�����+�/-Cz/�9`��{Ln�����W!I}a2��Q�2	ZXB.��0���7W�I�n4�h��W_((tn=�\*pNm�u�{��m��X�C����;Rq��
C}s����+i<`�0���G�/�*�$����i�s<�n���3�;(L�@\�����0F���=��hH��h���F������3�>
�F#p-m�6��@�;��<���N:p���wr���wz�B��@]��w�B8���6'8���������Epl16<�m�V�����X�����M?3����v���@��:]^I��/),��K�Z�nHK�Cd�C���[`�$>�B����b�n04L�r��f��w������-��{�\+�e0� ��i��B�w���F���d'=$?�=r�}v,�,��N��Z����t�V�q����c1��T�������)R��o�G�o6�/F8�K X�q]1v�$�[��Px�jar������4:p��x�E����U���3R��x�@$�[��8��O��oh������Kg�u���n�}����y%)���@�Z�{|�j�����n
L���?U���������`����v��Z ��2WS����Gy�w���(�:�����y]On�^d�
>k��������c'1��;^��a��O������>�K&��`�|�A9�)0� ��q�g�����������w���*�;��9��G����
b�o����h1?x�A�]�^�wn��Dnv�PXQY�	�8��s����n��&������Y����oD�[�$:�#������]��Bf�[��~o�A`o��{����j���]����|^�,����BG���
-��
��_��I���7�jA��:����;����{�����`hn��D���3��G��,+6�7�����'���I���6[z�H�w�Z IDAT#5�d</�u���i�������sk8v�!<�����4<`����H6!4�	A���
z��'�yv���i��.9&
NGjb,���xya/\'.��2m����kTo�������F�u�r���T���u0����w(,�A����?#���X�d�i����'�������~]���b`��M�=u����A���#�u���$��=w���L�����Hh�_V����G	�@�.mI-!���`
)2��	E�y�/���	<(�����fQx o>y��u� o>x ��*2x [rb}���`�@�<X������%K��\-���<��G}
+�(��"�S���u�P���J�_Y�Q<(���fYy�(RN�]���\=`A�|3�$!�����Wf/���F6+��n/�YNi�UxPZ���-<�7�A�:�u� k�����6�h��f`��d�]ny�����"u�-xwYB�#����:�u]��<Y����KY���j�,��[Fa�Ai����Ai������j��u`�%����j`�f��fB�<s��MW����>�Uf��e�_x��2���0�@�<���<�'mN��������4����_�|
r� oE�/���
������pY(Z���E�WV���e�]\>������}Q�AI�Tf���e�U�y	�A��-1x����/�.������C����k���y3��W�,������pi��\��v������Z���$���W�(��5�s�����w"��x��"�vh_���?�Ai^j�?o<����@6;	���N)�f�c	�A�V������K#�R��rPx�\<��[����5|R����"�%nDI(��w��7H��-�dx���&j����Jx �A��z�IR�H�4<�K
&����^�E
�A���Sx�&4��}s����:�6(�K$f<(��PD�x��>��������l�����c�e���|��8U������(1xP��X��`����	<P��x ���@j'<�m�(K�`�J/(T��j#X ������_�-W�
<����,��Y�$�)����XMHS��(��m��������*id���f��K������xP����D��`7v�Y<(M�
yW:��l]*���I�v�������@QV��xP��C��`�������T�kE*^��Z#<��RB<y- ��ZL�_^���[^����G��x ��*Bl<����xP���/�ecg��
[@d3��f'<��Id/���E-X���A���6��Z@
xP��<�x}"k��@VK	�����k1!~yY@Jny<�����R
��|����@J{
�Ai[X������R(l445AzLRn^	2C��[E�	5S1���K�Ov��)�K����������%*G�DA��D]&�%�+XXY���HLL���������*x�J��#C��Ujj*X�T5/~��yB�2���A�����V��������6455eNo�������d.L��9�a``�Q
5-��z��9�o������|k�q�YYY���*�{�i�T�p��b��\E��N��D�'K�J�S������{�����SVE�J9��?���#Y5�TlW�������PEY���>?��GY��WV�9��K6*�#����J��b�e��4%�8�*Y�&�,���#V�ig��������SW��HM�H3*k~������W����-�Q�M*���$���������LT���k�#3�Y������O+C�x��!��f$��)46���Y:�����?��VHS�V�m�L�B�L-1�5QE���Sf�s�Je!E��u?y��T*��L���t51� VB)f���%�(k>���YYe�l�]_�4�Z��s]C	�?[��vy����������f"�|Dlh�~����yG�_�@9Y����(��/�"mt��5xPR��N����� Vf���Lk*�Wff&���`aa�XF ue�>*K������W����������b�U��!�@e�>*CT��WB(vQfja>�Lk*�����PY9T���0?T��PN>���'��3���0?T�%��Oe���0a=*��r��2r�,�f���>T,���}y�X}$�!X��Y@��K+��XX�,������ V�%*��Q�C��*sd+�We�aaY����*K����U����G�����Y�9�CeZS����P�������G����F�r���f��r}T������6��Ke���0a}*���F���T���Dy^�W�V���TB<x�N���k[������e
�%���H��'==ZZ���-�6���Q����,������,����������e}/���M�f�b����'���C^��^��������eHe�������(�����d�S�#��B���e���#eS�K��Ge�a>RW@�e����T�5Y-%�Gd�T����l�,k)�>���� k�d�'�e�T���,�f)y������%�V����2�Y��V�?2KQ����GXO�g��]KB���������B2K
�r�����'�L+T���2��@�*sd+�We���rbG����2s��f��r}T���,�a���;��y	�C�m����P�5���<����b�@��+�|D�*{T(��0?T�~�N]Y��2�GX�
���^��*�|�Y�<�<(�R�- ������A,,d��X�[��|+������!LT�9����������XPf��?��ee�
����QY�#�|]�������2��x^B(nCe�PY�#�|]Y#B9�T���De�>*C�C�\������Ge���>�CY#[�|*�|�Y�<�<P|,
9��,��Uq*^��Wj�[;8�(VC�<�&?FF�T���}}}������5�Y�)\fYgPY�q!39#
����jY*�ML�D"�+���i��S&���CBBw�����h-MxkHe���QP��.����^�������������Z��b�O��SL�����?��[Z�7�7�q�f��g2i������o����Q��/U3U����TAJzj���d�X�D%�C�	�U���$��U��P�E�GFV:^F�U���w}���Y��a�
� �|�$x��Z���������Y�I������E�V�*��Q��?��"5]z�WV�w~(6� [T���1[��|�?_5%H�6GpB����A>�=��3���^�l_�1���@Z�x�X*6U$���C���2-������ S�2+6MG��X��W��!R�����c��|���a*jJ���d}�������RZ��@���
����P�*�F�Q(���u��������?�kLru5�V-|�����|/�|��eQU�"y�L�X�g�R8���z}����o	������U��`��T�pG��R��Hf��G)�����?J�^y�W�
�_5,�Hy�C�������mD�(/���������
:�������r���d��<8��^WeK c�c�C������Ii�-T
n�3����'��^_�$�b���rP�������F��*�I}(�l}�?����j���U_"!��<UV(�c�Tz+�GEN��b4��*F�����O���������_.Op.���.���AP`9�\zE��w$���^������^�R�
^���\H�\"g�[�v���(9S	��m���V�v����-���F: +�����
[p�1�e���
���%������U��^U��������R�=�M�]��c������b��J�bUU\��U�61u����"YT����u���&wY5�d�~�J-]p[��H�t�����pA���`���+e����$j�X�=V�t�$P�PA|)Al��_X��)�8�0\�,�4m�{].O��%���V8E2�v�CKR�~��M��;�E�$�V�e�b�1�]K�
���W������N��J����Q�j��Y����$V�(�A9=_�xPz} �R�
�A��1<(=���s��s�xPp�	�A��k<({�T�(�x���M-��Z���xP:v���(nc<(�
��`�	�A��S�Tx�;*3<P�5�]y	����%���jA��"�,<(�A ����<x��S/0�Q��ae��vEzr,��[���Q$���k9
��;?�+MQ��|��96�x���0��I��/oF�V<P5U�����!��q+�;e���U�*����d�����3��%�{��2B��d'����2�+C}�o\~����a����G���K�N�B��x�K�����fv�����Z��\��$]A��x���"m}�~~�M�����\�;�n
�N(��(�]������p�0�-B����Ue�=�j"&1�_���AY���0�)/�f����������/��8R���+]Nd�Q���S�dJ_����~}������	�n���w�d�SN�=S'c�_��J�7r���FF���>[��J3ai���!q�I�|���v�f��L�y��9�Rx0b�J�������U��e3e*H,����1�k�����r��K���~q�Q��as
iVg��������U6x0��(�|qi	2��L����'Wr�i��KMC?��2�!'��[����
j+�6�����-\M.����a ���s�j�O#�a����}-��5���N����J.-YX9y<��^/W����<������kS�M5��$��)Q��)<�����)�6S#�,tt���m�%P��A��[��vF�_`<���u���M�l�@b-A��5�b�4�����&w_��T<`�I1�B��������� =(:�����9���d�������i��$w���|�c����t��.s*x0���tq��#�����z8�@Lrt�h� �`����U	�X�X��l������Wq7�����#�����5��6+��fQ��Q{3d��#����u��A����wD��`in���d��q9V,��k���i4nX5��Y�}G���S]�U���e��v��<q�fM���?���w��\���'���Jn�)�����x��|59��)_�j�7@�V�������c<(����������}��U�P���XV&����<�<�����4�����vq������s�
x ����g)4�,��<H��1A���b���"0p!�R2^��8����F�5��WA�flX"�������S��8��I���\<�������U���}��7�h�b�\c]����~m����g��@�,��t�`$������<�TW����=�������m�@<
�kL�D�00�W=�a��]%J_\"e��ul�^���<�����?s������3lk4��������7!�0����4T��u�1Xt[��he�K�{c�kC\y�������6mC����<p����5������n��~t���aI���[����l�8��>CtQR�����Z���i�$�������
d�g"n�M��vG��SxP����D�G�A��P$G�T� -�����(��<p��:S���+s3K�����*����Z)�?���
t�4�o���s	�5������\���W�&��N����&t���X��\�_��W�Wg�}��@SM�l���z��UN�D<�����?_B�P����T
i��@+��D���mo�1���>����/���y�����(����F����k�ED����z��-?}������c>�<�v�>����
�L���������#�����?i�������aj�AP�
����zK�j����Gwk�c�C����|xw������=�����W )-%7������Nz���������bp����vpqYV������� ��H���Z����*����s�*P������~���m��t-��F�����"<1��.c@�F0�8[t���2�l�
�;�N��yBTr2�y�AFV�����E|{�*���aA�X�u1��P��Z�@CM?^�����d2�,�A�_:|<�� ��=�!�U���8��i��x���j2�P�sW�O68&�A���6���e��0�.����XC;WX6��@/D�_���X���p����.6@�c��7��8j�:P�R�[xw?���J�n��/�,Fj�{���MmdS/N/B�!���g2�����e���U5����W^2�4'RA��k9�������U�o�Ut$8����p�Z
j����n#8!-��B���^`}�x�j���p���0��3��E����wf3W����ly�#S��R<P�W��8P�HA i���?�
2������7���*�!�7��~m�N��"�j��/���U=5��%���lR 0�����H:-wh5�������Q�����g����b$l��� 0%�8�_��T�Hj��H��������*Z�P��)��3R<�tCE��T�D�|�.U5��r>:�f�A�;	�#���
������T5����4F�;j/)7�;�B�����,�������&.<0�!��}:���Y�����������(,8v������?<k/����2���
 ��������g`����nb�i�!���h�x�E z9�A�����V��g����Bc���P���y=;@���O����kw�m�`��E���)�����
R<`������N����a���5n<B�����9i�F�N����a�|��������VW
?��::�s� R���n=`@�=����W/����Z�������yh��b�B*{���hY���7�*�{��x+���������.O�h�qb#��������M-����?������b��mp�9
��-GZjR��Q���w����x�}�iIh�w�-p��J$'��PVA�~_���3�k�8�c.\�N��s��&*'�����)A�B��)I��:b1/����������t��+�:�u]z�����������������Eg6��u�����_cb���O����p��6���>[z��������J�k4���@��;�����E��_`�p&�?��BWn���,��7_,�]�}� +!Y�|}��bh���|�x��	�����&�v�]c*t��[�\`���;!��b=����YP��r2������{V#�/"���Y����Pu�7P�Ka�����x0��
��xg���];������]t>�����}^�q��S��������	��'����~�S;wD-ssd�������=fA��<��P�:wL�`��uX3f$��*��r�i����
����O�!8*�t��������tRXx�:���B����O��������nN
O�I5��w�ff���+�_��y�����:&�o��S~?u��6�K
;^�D�OVF`x8O;���o��t����g����7�I��� �������w��~*��cI������j }��_L���!�=�Ry�����B-r�J��d��A2�=O����
����z-+h��H�6�������.L��'$�=�'��97@0�iy�M����vM�qK����@�6���g��c����.�������������������~�{����HHh�����
3���������m����7"$�9$���u_ !��gVa�6U����SzN����5HL����#*�
N�X���_�fD�����������+���]'���J��D��4������m�I������n�y�c�t�I��'�/�������� ,�%����nn��xVGH�sx>�������B ��j�4����AS]�a����(�x��	�4C-]�%Gc��-`j�:&8p���"��jLSCU������ap�t����x#�������H�|��������i�%����gF��L���j����N��b����R����t4��&j��� IDAT���7�	�p�)�h�4���[W�_^������[8a�_�xp. 5���nc��o>��`5��1���jD�(4����{v�������J���W�b3�G�����"��9#]	f������BW�ww���d�������`oa�o��.������E�GX0|�u���_n���s��~n�x��-N�����|J��jx��
V?�����t�j�Y� ���x��{@����r�x�����z��#�x��~p�����'p��?f���?+�l�N}��e�F�9�qz���=kz��x�\������,����0��6
&b-|����>��H�����x���ckR][XI>\�*l���1��}/o�u-/�`r�Otq�Lb���m~��;����4:�����:�����Yh�H��F����C3���l�kP�D��d�}�?L��kRP�Ssu������Q����X�a�x��
��n}$00���zQ���W�t��y�w
h�C��*~�s5��������tVf���F���j>���I��'��G*�PW��~zx����@�*���IFK�[Dn����rq�o!+>j����L� 32bw��Ly���;�l�*zH�y���t���!����5A��XR@p�f��U��X}bv��$P}�a�I_�-���������]�� ����[�Q1c�2���A��>B�#1g�
,1
V&f�}�4$bmtvv�s��{��UX�
U5z���g� �>4w�WZ����������������� ��V\�i���xzD�"����O��{��h����pu�4��	DF"~����Y�Yp��%���Fu�A��m�����7�B0���0����D�n'���,�����{]D,�G�q���sC����.���S�Gv���Z���nS��cF�2����	�����H��7�V�Z��N�)0Rz�)=����_Qu��{��}hH��fMF�^O�b��j��c?�KokR}O��/?;���������	[O�r�'4�q�k�n����`���;,���
���<<���YY��t����:��M�\�@�-iM��A��x$������\�.k
�8V��mM����m�w��4�j���2PE�bd��N�^�6J����"�R"R#e��6RQ����]������/�J�7���-�o�y��[�^�!��v�����0��}?w�4��6��:a	�X~c/~��W�>x>|CP���n���0����^�.���i�<��������Z�>o��g�b��@4�v�2Z�������|��/�"5�TFN�}���%����^� ��*L��]zZ:�Gs���sUV�M���{?�Ya����K0U���}�f,(�Cd�z�������iN'�����B<{
���n#��a~�1��N�U��O���4>e��<��fuCz��}�$����Dk��w�I��+Z���a2���>*^���wV�k�	[^A�R��H���c��;�O��&	������:t�� aM���C��>6"��l����7E����{��3��<�F�CDx v��^��W%t����Nc������l�Z�M�u���������w9����9��kc���&R'����1R�e�)����������1�Np��s$���C��������R��k'ZD��n��!�����)��D�����E����t9�c��f����2nh��E� X�Y�0�`��Q���O�����1,�_U�*Xq\6�����iG~���S�6�=L%���/~��<�>�{�8��6[,Iy�3������H����&OE��6hbiKO��z���.j�����{�hli����P�Z�	6����v�Z���?_;�n$�����Px��&>�aKn��,f}3S����Ck��[���)�;�H������$�Ld�I�)-�Z�!9�6��2����N����[4hQ�F3�MD�������CQ�A��k���\h� 5>�u!����[[P��B���i��|F���y}���A��;<{��� 8
��;����/B� ��+�X�;_�����������.��7�hx��g���e.������(����Q|���(<X��+�]�=}�%%b�c]\x��P���
�=N����	��cAk��"����<�z�4-�ic\Cg�����&��|�o]����U1�E�tx�0��	�?�G/l9��Px�6�5EH�
�f:H�B
���5j�(��K�Q�|��lZL�r� �PtGS�ea�{��&C�Li�a��1��`�9b~�z5M����Q���:��g8�hM��W-�l�4�dh5��` P�q]�o�����M��K�����8P����rA`/��,n���3�w�WC���i���!�r�2nx@pE����Bi�5h���CY�A�Zvhj[+�_G��5q�u0�&�8�AM��YN>|��ZR���E�n
jc���<���w
������������q(il�f��`|�q/j[��&�O3i����)j��t����Z�_>t�16����a����y?Z�`�O����N����������u3�����Oc��q��o�cH�f���q�j��<	��~����e���=1y���XC��:�64�
??0��K)���A���6����m|��+_X_�q���6����7�k�Dms��vE�v���*6u`T��q�_|t�F.~B��c�M�fwi��y��xz�$t
���F�h���p��O��
On�C��x�@*�hF�^G����x~�,���p�����m@��@���p���h�r0�:��1Z����G~C�Q�����TF{��}-�j5���[�A��#\:�����y#l���������Q���h�n���%�������I���s���Qm�@�q�_�E-V�����n�i�����C�K$�{����8n6���Afm���W���������];�+6s�@������f#�\.h���D�!]Pf�����9D�7d2�ujB�`mz�K'0G�H����������}'`�c��D����?|t��B���/o���o����H�g��]-��|"�o�	;�?����1�[���	���C���?�S�F�I�����������p/��L0�6�6k��7oa���X�2\���������M���+���hx���i��}�
�u~6����a��M���'/�����g8��"����=	8���<�%l�v�����5�o�/]����)�0l�Z8�����!�B�f�
9�bXNr�9e�>��+���%	E��-������V��H�����i��|
���9x���!hui�����{�y� ~�.�V1�dV?�����Wk"�.�j�4F��s0������"���"��=����������>@z6�XA���_�8�����~�2FG{[����1�����V��gN%��u�;���+N��
�v���G0c�q�\4&U����H���-���;Rhy��	�M�;�L��1+�c�o����$1{���b�Qx������h?�j�� ������F��q��q�Y�k�9.�[]+�#�����<��1��@7�9�ra$�&���!������.4���o�B�B7^�3�iHH����g�~C�=�U���0��j����O����3�Q��
zT���{hL�0���HD�)���K�/1��b��q����1�i8���������<L������N���������i��\��s"������!���"2)�I)4��0�6��>E�O
���b��'L8��U$��g���P��@�e�>T��57s�`&��z��A0��KRH`i��p���Fu4��1��4���'���O�����8�i�,���g��O������U��{�_I��{���E���	Z�!�$]�}��+c
0p`3�\�B�j}���:K C;�M�)�r��i���X���q�aP��M�������_��!�-��6���2MHN�>�������oE�Z+&���5xy����l�9�E��XI�����[���n�yy�t�vs����q���7�P��i���3,s����"�����?�n�.I�f��GX�^/iN����N4/�%lZ��#h��gB��#n^MF��Z���������
�>8�!�h�D�����6DEoX!�c�p�l"�����4���#����N�~it/SA��"�;�H��66��E5;u���x}g����
��Y*B�e�I����x$���1�	1��0����'0k�>.�IqhAp8������LR���"b2����>G.�t���	��,�����}�d�bn������T����/;!��+���"~��S���KO�������w1�!L������c>5��$guFVL�>��g�d�Sa�AVb"�l���!��Ch��p��50�1�Zd0B~��@G����A��F�f�q�����d�}����������/P���j[���g�
$������g#����:���G��&��l"����Ux`�������o�t���{ah��9.���Z^�`����������=���J�,p��	���bu��-�;��������
�>��r��#��BA�FxfF J����vH�|

k�l��5���`0�3��G��K0����M{>4�b�]�����*D��Y]v�;?xp��FT1s���-��"aiQ�;������~���+	��D?��<�^�c���\�l�'6BlRL��i^���l�GFD�|�+uX4�r[��=/1(#���8�j`P�/��}o�?Gq(A��������x��
D�jxs"��Kr�Ro�~�0J��i���������z���T�t���n���t&����O���f�1���A���X:\f�������9�v
Y��!������m��a���`&1$��?�������n���������:�A4��{#��Q<���l�����`l�=F�_�����B���8�N���<nr����#th�7,���
9u�:�{j��j`�	F������uvp���{����o7\����d0;0��%�L�������;�,����t��NB))�Dv�0����e�0���d:De:��;���*
5V[�o2)������E��xZ�L���&��jA�\��=o!�n���LZ��C_/a�k�:�!3,����j����.]g���yA{�U����7����xPB��Yw��
�C���wa��^8~��v���{�b����_c�iG�@����Wa�g�8���K��G=0�������C�0vX?�f��	`�	3b���sZ1�l�1�hQ����2�����q�Z���RMz���O?��LeiB�Jc���F���;bM-�|p���D������/���y�Euta�����(�Q,�h���{�k�1�hb�hb,���{���
�("�H���f�H�e���w�����v���;w���A���1q�����BA���i�n�AQ�X}���r��d����K�����MQ����o�q���/�,����P������I�;��6�o��e�1����E6na�;Q����<��$}j���\K���=�������M��u?�����
i���D	����YxHwvK���Fs�;���#����7�S�y
�^����8�@��:�
A2Mv�nn�a��PR���N}Wr ;��&A����j����1�Bb�?�]��S�mU���@I]�n 9�-���Ly�����A��\?�C {/CFJ��U��0��#0�`�C������xa�����Gp\,�h�)>��V���I����v���\Wl�s��Lq{T�;���|`/ ��u�B� ������)�z'(�D;�D���8���O�+9����
�}|�c��^�����u��5h�|<=u	B�S04D���o��.���Jc
��Dg2��T[����E#�SC������2��������nGu!�A��0`j���E�F`!���Yi�����I������`�N��&�KKB�����r�����2T)����t1��+,L���=RH��6�1}�	�o���w^�����(�	��/z��H0��]����(.��7��=�_���9G�a�����@^,�w���.����������@4-������{@^����L�e����������������:���#l9�6�C������5V_�������t
p���<`����E#�[��o\������jc���V`����c+�rTfX�}c�#��<�q���t�48*�y�����W�$'���y*##
����>�	R�����;)L%e�PT�8^^ 0��(��^0%Cs{�8�+��/_�����DC-$4��������D\"��oR�7M�*-`��fBFz*�t���Z���;g�q5�7/���j]<����;}����h�k�M��#'jQ�AM3C_�"8*k/=���-��P����u�;a��Sy�����`��^�P���PW��o<f �������t:�m��xR4�&��@�]o$�Hn`��q�b��,��\}���o�#������x�:��H'���Tl�,��aS����e
���c

Qt��L

Wgd�;���!���*�~��>�8x���d��,�������H��:xP���o���S#���S����_��������3gV%u���w!5��q"����c�]��	z7tCMs3��|g�;���N�O��/�lqx�w�RU��
�@���1#i!3���de�?r,���WS���F����2�bB���r���4z���L�d����D��^����^`iV�_��m����� 6W�������_FnY������u�@c����P�e�������b�����=��hy�G�����P�f�x�1��go�R�K�%m��QmYCA�^5�Z�ec7��2t��4�(� �6=7=�����z�4��$��Tt�U��Bs\#�o?.��;���kA������4V��x���~���>�e����c3T�o�3���]j�n0�����x���.�fa�?P��)�Vw��|q��OQ��:)4�7��5\~�����l0�
~��Gs�
��<�6�_���0���~����(�	�����h�4��z�V���'hS�	��>�E�5�N�}��N�y�8���#`mR�)�?������s6�����\	����n��!>)Bb������:Ti��o����k\����K&xbq�)����<��*(cr�!Xp�X��(� �6�7=z�Tr�3�^
z'��s����3���>����8���xG�f�Z������m}�����%W/��q�m5Kz��&P���Q��p�m����
�PZ��Ckgh�����	LP��D����]iW��BCR@��u��L��wh\�N�An`�SH��]r�N�1�����1~\�v�T�g��a���yy�:���v_�N�@'�U�����[������I8D����6��~���q�a��q��m���_�����:�/��n<���A�jU���\�
��o��a|��p�����1U��X}.�����hff�v����`��������%� n(
<�������o Oj8s�@|�30���M�B>�sCzZ6N���O�
E���t:��sC,�~��;�	������Q��1�z�r��������?i�#%G�@�6�V.��UE�G�)��z����p�")�ed�'����A������$X����:��g��
��1� �T�Z7T�yT'�F��x�:�'������%9x��1��k���j=���q��f�P0��P�>A	�!����]w��z�2d���,�>f��p����(��%M"� �)������"��F�O!��(��]����h� IDAT��
N<�����r���WN ��l��+�-�Q�%�x@��[����9��C0��e�A�"�y��EI�8�@��8�r����n�EbhR���&f0�g���<�+�q�#�^~��x�2�>�M���f0v1�@���(� �:c����T����bg����`8�7R|����`��
��I�G*�����������vH%�4G�lM��������2��R�!�����Ar2�[>�JX�����f��E�?tZ�?OM�y��d�� 8������y#|��*�����!����]-�9(C�NAGrN�+����D=x/�Q�dJ�~�B�Yx4��	<��VD��O�%Rcyw!�� ��*]5�"
Y4�i�������Y`u�<X�c&Y��G�nSu��a��Cp��
����r!����6����]~�������#(R	+�N����{����9R#��B~p!7�=)�t����P������l��#�ZL�L�_�%������$^SE���?I�L���]��q����!����� ���\��=grP ���J*���w�p��g�y���K�0�0%�_����s����3j�`���hm�����p��=yzM��A�x��MW5h8�!�]��j+,�jj�G�������@�xE���9%h�������uV�k������dM��qH���^D{:�Y��=P��hh��U��P"u��g��kI:L����;�3�H0�������	���M��"�N������w1�W'n����-����9`��7-,5��7�=���� ���U�s������OS��)(�����0�h:y�����������,�}h�l�/I���Y�M���i�������8�}����^��^������^��S�#����Z���Q���(��6l�-wNa�gx�{�s���%�����_xP��N���zh|�l7#�xV<�kf�������g�^yhkx`�o���.Xp�4�H�N�H�/�^x��nUi����a.�x���Q9�S���Z0�y��$[���f��
Q��wR`E/a��Z_����Zx�G�:�TsM�~�����E��xwl[|�xR'���t.xP�)\[�L���:�yX�
��K9�
S<�;x#�w���#�@%���w��x�/�,���
jt��].�������~A��y�2HR�Px����<��jO##�B'�x�":�:���	�v`B�G��0���.�R�+�&
�M�;��e�x�������L2�I�����#/������j���tfdt�� nExL��	�ZksW�
���.
�=H���,�����F�%G}��\=`�G����@2��5SP�PB�m����$9��dAt�A.x����[�9��`���=�a����L��@��W�)�����)l ����`H���MK���M7G)�Hf��0W��.���BGX9���)�\��/m^&��T����7�6RX��=w��BA� l\���/
f8�m��a����v`��D��-U��d��?�
t�L'6X9lC�m�mMi���8U��
:�0l]�,������M���!�?
�����Cz�4��[7��������\-����m��5��[�E=zc�����.�8��)W<���WGXu����������5�i���Z��R��S!���a�>x���
j�����7�d���4AU����M:����xpp�8t��^g�E+��6�u�G���k]#R)X���[��p������!�trI��+�B�L�����"
?�Y�IxL'1����.�
E���������6��7a���,�����Az����BF���S��*�0��m�g��U��P���Ag��L� �NoG>�Q��u�X��3w���g���pho�<P<�W��!���������	�=#����NE������+G��dSZ���?�H���_���'�KZH�������a��k���WhLQ{o�%5��>�6������B�$,�\=�8G����������@L���L�`��kh@�JL�����I�i7_��]�>0s�>���#�����O�%�R�! @��q�0@.x��q#,>q���a')�%� ����IMp#��]����^���XOJ
/B��}�X]������B}�*�PZ����`���������g��A,��T�<` 
�����#�BA.x�@�W<����;"�uT�6B��+����\�@�����R���:RN�,G�`�i�x���!R���2�0%�F���E��I��s��#4�T#�
�x�������~��X����� x�@6nEG���)����.y���Z���3����N���q���t�_���}�x�������BQ�S!x������f�w����d��xp
����5���,�����>��r!=3��H
�A��8ys!jX{p�	��7�,<��%����� �$�E 2(����>���z5��4)'���&�J��GG;����Z��Y7W`�Cw��	���x0����)V"��7�����nI�������B�����_4�FR����	�R�:�V&���9��b�k�frA��n�xp�~g�;�Vo�w�F�P��������;�&���l������������B�!�V� 
x�T.x=�ku;4&%�W��`�!���C��7n��mq������\r��BA�+�l��C�4_d���r���_���[���^��r�s��]�a���h��>�(b�0X���ra�\� ��9��z%S(�0���y;�vh��'�r�,0����.���	&���
�x��#�]���0��������L�a����2��2�I��it���c�-_�v�����s�����I�����vFj�)�(�(����$4�P�Y:qkI�b�����ft��)��@*w�vC�gp��s�����Xh�V�o���\��������
S< ���������+�#�2�A�M�r�;������8���W2�\������R\�������*Uey4����k��5���
*�rS��;�`��nG�f�2��������F�_g�3����9x�dm�(R<�c��b��@���Z�*���(&E"J/J(
<�$��4��UI����Bo� D��*x`NkJ����):����%�����u0|�pt�2t��jZ������i����LT�GR�����:W����c�I
<0n@�sSH=%$-W������\�`PM��}V���:�8s7,|�x�����Ei*�(���r�A��
�V���>y�A��H$��������(�N�!��Sh���]1|�x@�3������8k+����"��7����+.�����A����>on��y$�^��\����9�������}� <`������O���s�U��
KE�&�K��pw
5G��k:!������K�2��7<�����c�
>Q< (�����LZ��n��H
,d�7�s��^�_�f��v��]�Msvr?�������Jm��u����O����+;0�10�	,���������$4�����b������l~p��z�bS�Y\E �3����m0��F>�cpB���������?l��������������K�"��)+�/?��0���v��
�G�^���A�9�0��
R����AI�LQ��x@��!)�]mR�I��A���x�3)�������jc)T=�I��\���&���H����:��:)\�zOZ3���Z"��@^m���9�*�~&�e�j�~�nx��2l��GU���~m��l���rf�������)1�]�N�T���WC�Kb�sq���M�2q��o��{I��El�u������s���K:Y��$
�jB���5B�J�����@:�Euz�"��,�rWzt:����	6e�I,,Z��\>���Dk�_,Px���F�����:y��o��[/�������}���qK�$&�K�g����\e�+L�`��E@T^&�z����G�Q���7�����an�I��� x0���X�q��9'6�����`xP���K��t1���3�����$����GA����?������������f���4yW��'S~�r�j8��Y2�XW��'0��3��k������]y�!�l9�3������(�����(���n�I�������e�Q�?^�����:-%Rs0D}���LD�����j
Qw�T�6���*��i���0��-}K�#���w������/N������K>�x`�h(w� G������h���M��@��{/�(�2��@,�I`��.P�2��!����d��Zr�r����N�n
�����U ������*x���7����x6��x��*�{��@r�`\�]�����K�0�C#~s����X'<h_�M-��i����`������N�����u,�z&7
�z=$X��7��@��fI����5l��A<�|�RGXC.���d�6��F��!I�����F�\5���_J����X���9$�M�m��X��Q'?d9
<�o��y-���:��e�2�����"b�B��&�]�0!���h�]M�D���I��w$o�(����[N��(h��_���~�i@�l�:T�����������9�X�����r���{�B�T����eDvZ�FrE���l���)!����UO-�����Y"X]t��d��h��k"�����${��p��+>�����er�0�CK���g}	*�O�@�N���Na����}8.��E��Xw5g����=K�D��L��#�a����WT?RC�N�]�9�%��g�e��Kp"_��7,������ �i�{�I��/l�v+u������s-:�L~@����	Ca�l����mZ)q���#����0�}hh�qs����:�w�����$��G'�g<C�^���/�cEP�����B���������O�Lr�V�?�����Z���}#��w�N{��C"��W��;�1��&����5�=�_:��|#�m�I�k0W� ��s<�D~���qp���X��#R��N����$��su�<�\#0%z�6��j��}p��
$�4�<��{���c��;��fJ�$_�\.< ���4�2��
���?������AC��A>h;p�����?��d�|������hr�p��olU���f�EQ������D�Gln6�����N����V��>�W��{���W�`�h<x�����`���d4�n��tulL���txnE
�	���=���,$��B,��\��f`9o
P��B�fq��A������,x�����=N������0��Ar�C�REJ����h�VM�
�����hD_|�s��\�sk�,X	���sX!�L�����A��������9I�{�T�����A�]� �P��'����#�2�`����F��8�_n��I��k���--1�T�il�E�������eW,0�@��#��$���~8p�>V���$z���7�����h0�gw��S����������bJS~�1�6�b	��"���U<`r��$xC
Ou��s��W���B��Zt�M2���P���i�������������f
nJ~���gn�K�-�t��Cj.�i/(�62���;x�T��'_�> �6�:�u����l����)���Cs)����N��������4H�W^_�����h?4���y9��L��AZ���@<}��jN'	��������%�S�oM	��r���B�m}#I>:*�u	n��lriRX(
<��6�0`�������N|����_�j�=7���;���&$o����[�y���h�v�u0I�7��.
��FV�9x����-\>�.<`i{�-�2	�dB��}M��Q�x0x�
��BCK;�L���	�wGdX���\����$�[�,
<�f��@�><��>;�&<PS�����i��(<���V�p��f��5mZ�gAzz�]���k�])D���:�?H`A��S�G�>��3�4�|�v#5�#`j�m�������G�h�����/X���Cv6I�����L��!:�-�RbP��R�>=���m�0Sw\,(�<zf�Q��N�PT����b
���:Vi�f.P�S�R�mR��>��#X`i���4����wN���B�����<p�@��9���Njx����"������t�|�B���MiH��W��1�I��hZ�^��	�`��s�����������)CM'Hn�����S[���	d���Q��N�T��us��<��������js�P0�����A�H���i�'W�@�����s��4fF�����n?��g�A����>R'��n��wZ6���)'0�`�����6��LL[�s��N�Im��g �#�R�HC����BA�`���X8b0��}�Z�#����>=8T�N��	�h��nn�E4n25��=��*�s2�Y+��j���x�o�='U��`
�1���~�{��{#RI�n(n��BQA�ls���cJ:=O�xpu����zv��B.xp:87CI^��1��
���6m>�����X�N����~�C�(����D�#?��B�^��v19<xt/�}��-�#��J���[{:��\'����c���g{u����6�����BP��]�8m��w�\5�\���)���i9�l�=!�����*���������!�����?U�-<��O�����g��N�*
y�A�m:�^�`c��Z*x�<
]����3����T�X�
���U���B.i�aN��L
����E����7
59T#���
��Z`���-7	���LR����]w����/�����Q����+O�@��+�=�QW��]����/��i����+0W��� O��RU#��2��JE��47�&���t?���N���#I�)��32��ti-F��������
t_��z���Sh#���S�1y���Mx��i������1{�*�GO��q#]�Z���Ki��3�,
<�' ��Grc����~8���f�(��h+��J��WLw��5����*-�x�i�	���h������:��z��r�������t�SX4������M7��i���������n��.U����t��������k�Px��]!��\��m���������&�<��3� 5���f!GA��1��;H-d���}�Fi�����Afh�4U��uRLH8qz_w(��T<"WG>O��{�^��03���gF#���y�����CM����_Q���Qmt�?��p���^����u<������I���;��g��)�U�1��%C�z#p��Fm:���{�3�=����[����nm���lR$x�)��S0m�V�����3>��$u�����T"�0Ka���Zl��Ik9�7�������O���A�Izx���~�!��n�������{-������{��%%���^�@����Lz��q3��	����
m��m=��dX@JLy��\��u��@n��a��t���D�pW,'0���W��w~#):�b}��8�
�d�����b�v��a��`B�:/&�!*��
~�+������=����u[�9�	}��� ��/P0�q���x���;]�Nk�9�������'�K����D����>��=G`=)*�H��t�8�	����9h�7`�/���'�I�P��J�t���pzW��8C����%"�TX-g#|k,H�5��0h8���������A��9_�O���z�n�?�9��5����rHH@v\:�5IH���i
Uw��(���2�[�Pv�G��h �k��s�����5����`��w��D~�z��
�/�E�n�q��:XW��?�������\�\����:-���tg.�����s�`�����m���#�x��O��D=�����/8��y�y IDAT��k����cy�Z��	���A��U����GF�mKw�<������"-��Y�(�@Rk�&���Aqy�Ai,,�4_xP�J�/������!n|Q�q�5~q���yT�x�������Z���.E���Z(Er���50 A�����%�D��(�@��_Z��\-|i����%�_��IR���I�5m��DM��<��/����w�P�kR�SIQ�?P[+�,|a��j��-�tE��U���Ay���������Ky�YxP^�(
<(����Q���*�"���eBi�[xP��JJWxPR���{q�Ae�wa�AE��8W���0W���?}q�$-�8�@��%I_x I�e�� xP���J�Wi���6��N')xP��-�����1�c`^QIq��<��Z(X���
�Q?i�Q<�4���I�7}a���y�/���D=O��k�����\��z+���?_�yw��h�����]>���T���n:���/)x�	35�sZ����`(K���s5I���|������+!�[@*�q���U"��44_���k�i
������m�%�����Z�T[h��*WNH 5����j�A����H
������W��#S~���$�������>]�����@�v��B$�����@R�^����s��m,����n7<(]*�J�cGi�"��Y3����)� �"x Z_�$V$)j�*��j�[���v�P���,PY, ��xPvm�����U��x ��J�,(�h�r����xPn-� <��P�:�A����������Jk��N'��YX$�����@R���
<(+��Hnu<(�
��p�	�A��S�Tx ;J3<��5������KP<�@�@t31������R��
� �������c��A���K�Y������������xP�6/�D<���@2�I�Z$�`����l��?W<���xP:
�A�v��������@:v�f.x Mk~Yy	����%�x zob
 �A�w<(�6���
�A��1<(;�~�9����zxPT�	�A��k<(�V�H�x ��$M-��Z���xP6v���Hnc<(�
��p�	�A��S�Tx ;J3<��5����@���<��1�x������EHHLMM!//��^�T������H�G�lQ�=�iM�����Dxx8���$������CV�#..��mm�J�3J_�=Jo��H)�CfY�?d�=de>����e1��.Oa>R:��U*�=�����++�?a~(~��e
Yx�	����!��-���YY�������kg�=��������G�UW��!gf��]��!�|�k
!�`���A�7��<������K�kP�biZBV�Yha�*��-y^������}A�9�J{�����%�!+�a�.y�f��P���</�=$���r����0_�V��N>�0a����C�C�J���V.���0am*���z�����|�Y�"��B��+gI�BB�d�^��P���{e��������L!++�R]oJJ
���U�z��2��Gi�(�4�����PWW���JY��L�/��(��@����>|���Q��yyd.�GyXY�2xDMMM�H9���Y�?*�=����0a��CZ=B�|�j>"y���A�Yia>"~�-������V��D�na>"���'���cgQK��'��Q�'j<a~(���>���G����?�����PV�Q�c�,�Y��U{��3$K!�!+�������d������_��All,�g����b[.==�����"M�	�!MkJ�{e�����dUpjY�?d�=�����
�
��/���6�V�e�UUUieY!����!+�!����Y�?d�=de>������(�Pa>Ry���Dh����2����O���O�V�>%���(��|��EV�YhY��T�|]�b���Y|��� �U������=*RzH�V���iM����$���S�J{��T�������'�fY�?d�=de>������/�L-�uYy��v�C��[��d��'+�����,<����dc��S�Ci[T��d�=da>�ZRh���4S��|����x �^)�%����obYy�����@��
�!mUi[T��d�=de!Sh����S����d��B{�u����S�J{��|]V���)�{DV�C�J�GH'YiY����t���r������+�!�|da~(�����EV��=_�i�H!��0� :[�ob��z���������.����9~a�����"�Ty8�j�E�Z`���� LT����y����E.$##�Qe��'yB1�P�����Y]�
����<�R?���S27


b�Y��jX S>)��l���Qd���Gy���2��P#��gQ*s{����	�S3?�&���+uu�R�Y��5�3K��%��yw"n�:}���n���K/�]J{AE��NP2����J�y9�KKK��)++V��[�jh�cmJ_���G�K�n���C����nFT|�(Q�4NRR��nq\qh��Fr�2���������"�:]7y��_���4���"_�|�6-J���4ay�GfR62����C��0V���&�.�\���|�\*]�i?��q)1�q)�q��S����V�ki�}+�M���Th����^cd�{He
��6H�*��[�����(�*���(�)M��������T�<�+M�u:�k��'����;���y�P[�������6�$�k�!:!���(�,��I�&��mD)^*q*�|=�~*��'�|����#R�A���+������=�������SR{$E�@jBh��O���5��3BtF�(E~���'�-\J�6��s�@��2��.���w���\�`�xZd��O����"�/,�N�T��z�Ty�U��\��T��~��H��;�+.�?(���/��i�"������u����-�6��	�/oK\vyg�����s���4�r����B����<n^��,���X��32CJ7�,�~*������*������K���M�v��������z��/�E�[�#iNh�(9��^M�~�,�?`(CDX+��-z@9lBe����(d�����Y7�V���3���{�R�+3F�6s���.N�#�s�{��!d^~����X�����������8��C���x��eEW���7���J���AIrf���/LY����/���=3�V��n_�E.�	������ti�o?`$�M�mk�����$�z��U�C��N��~i�O���2������-���Yu�@;�����.>|bC>?�VR�/����uS�����[4w�-�e���&2,P>����sq��e�xP��-M�xP��_<��x ��DI!��X�r���2j<(#��f�x ����rUx�yK�������u�l<(�F�C�����G$�+�@2�I3��:|�����X��~Z5�����1����|�L�f��Spq�
���K��=r
�:��������.n������1{�8�h���.^�i�9$�����H���������y�_��W���`�=|vU���k[��"$����T|{�A����l�n���
?��%G�B��z�5��Q��)�� �����"����%%��di*��wBvl2����r�!2�s�iD
���!f�fQ����u����
��G�������������Q�h�����b"2��&�{�K,J[���O
������{�N���TM5`?�O�_+]n����{������h���/���I�:>�����84��M�t����=���s�������sPW�Fu������$�6x���7b���^�5�\������$��4����C1��;c���d�<��
���"�S2����F�b�5�X�@��tnRRv�A�CU�k�������C�OM��PQ�s�����{��C�z��;�!��+��"�5I<��}�_X����b����T�����z���O4j}��G?�&w�k(�6�P�V����S}������]��ddA�N��D�-����n�
N -��u�x/��[�������*i)dD~@��{Po�qOB�@��"M��J�}\��?,��Z�v��X���m��=��!�S�X9h&�]���(�������6
���/&�;b��{"�����x���<�5t������xh4�"���[	���dVM�t���v������m����{B�o�ze��7��a��:!3�\��V������<0�`���t�7�G��P$�����e���tk���/m��Nuk &1Zj��US��;O�*9�kK�?z�H�=m�t����%S����EE�
Jrh>L��E���������c5=4��	���9����)��sG�x0��3��|�j����P��k�?3���m0}�Yq�Td���3Rq��_tk0Q�z���A�vC�w���P���������c����b�X�'��<�y�RR��U��xc������P&����o��	�J��-	x��pz!y����:BW;G���U[0e��B�����012�A�f|7��I�kX�u&���/���8^�+��@2�I#�H��E�!�%�w������Gdf��D;-�<P�����ky�]d�E�Z�� ~�	hNj#�����ja`��x����m+xP��:����e�P)�yey����?�����2�
������U�Y��_�.-�@Q�t.;$!J~R�C����1��`�TL��(*��`���������2m�g>�P��A��xd�A���h��X��zCm�s����0����M��������CZ�����,������-x���=G���T)���
�x!�����K
B��KW����"����)�����
�_���-�T��<��;�>AC��;�����h��r@�DX���!��z��io�!��4����M���a8fii�
��W���p����|E���2��R/��@�)U?�2n	��
���s�\B+�j��%�{�{]<�oH������tk�]MMl>w�$���^�A�����E���1��5�1���%�)������f�����S��)��;��^(xP��u��b�oqMUh���_�j�a�'�+i��p4��}[�=��w)<0�s�q���=�I*v/,<(x�]Oa���X�m?�XY�M�:��p�����}%0:��[=4o��?Vl$u-� 5-�+��R�&���\'8��y��S��������CSC��rG]�OOo����zt	<�m�������<D@�$$&q����:ANN�5Vfw�d\x����
S��=-yo���U��O����y���6d�	�t���J����I����y�jj���9g.��3�b�<�V
vs����A��H���n��It����\���H�����r����W^����}nE�����+����b��i���
���3|�&�>��8���U��/��33���3T�|�����&�����n�15j7�e��<�Z��� <����>�������n���?kh��m�oqp�\XZ9|�{��S`L�YYY���'�vh�
�#=-		�9��V���$��RT���'}&B�N��~�����`j����}.�o�:5���<p�6x>�f��U���j&/�@��T�X)�B4�R����l��z����p�����^�o�p�BW<8�5
}�1����HK�LH��~Q���ZoW(7�����r���A�W��y���/�>�93%��g9]uh�l��?�@sz{�i(C^K
i�iN���[��j'����qd'�B��<���$m��x0~t�E��s���E	�)�i�Bs����C��`��x�m�������
/�$��Gcd�~���'�q���bF������}T������5���8���?`eT��
��gW����>��l^��c��e�������-���KWtt��D�=�Jd�/����I5���4T5���z�x*�Kua���h�Y��Orz���Wih�_������k�����$��WsN�������q��M��u�����L��u$N���q�T<��U��&P�SAjx��vL�@�\���������m���>������%�>�D �vuD�o$4����b���gh�����'�_�qk����#1 !�������ancxM���d�}���x�����BfV�<P�v{���hk���(�y|I���hP��9�o����nNt:���}r��m����~���
N\]A���0��n���w~�7�= m���g�s�x�Ee��G��d���1q�|N���{���R����~8vF��_�����euh��r����\��
=&������2RR`C�~
�t�_�u<�;����h8��mq��R^_m
#�l8����q-���{��6^����r�����f�P��~�Ni�q�������m�Cx������_��{���XxP�Fc�<����X��wX�����p�����^�0��T�|:ry;�������s�,L���K-��n?��}�6�E����j��}���|��(���;j(��~�3D��+L��=�����=��3�w;��!5}��n^K���<��S���C��Ij%��jPU����I���)�_���L	'��=�:t���e�sh3=���Zr(��A��X�_}K�������Q)H�;=�d�z,�?����ni���4�_z�N���8L�*
�S��J���x���N��J7{���"�d�3��e�.�T ?���SM(��G� dgdA���:�H��9J����A����D���)-�%Aepm�x�z&J
���r���-5��J��ANQ>'_�6W��U���v��)3
�������o���
NFHce05��P�_�W�R~)Pt1���*�/�?]j�Ff������/y�(��O�r�<����2��
��������SU���?��'�x@:���c�S�:o�[i!;"J�i���)�/��0�@C�];����"|}�������@\|8�_\
7���x�G�����V_M��{�����2DD�����i���rA��6�k��tO�#6&�����8����#���>�C���������!2��+v���%ox)����G�)����D�9����H�����������_������_s�.��3��B#���8^�"���
�i�P��G�o^l���&�iLP�.���Arx�����(��u3���w���)�PP����"��#�llziQ|Ud$e#-*�+(�*�������;J�~����	0�P�e'R�����A��t��A�����g�}�z�<A�^T�����"-:�Y��?����w�A��r��OC��8T������=�������W��&������2�C�������������G���w����}�ai���.BI���m�g�����0X�v��U���
�=>Q�����cR@��'���2c��}?7Ss��Z��@kJ�N�?v0b��q��t������qJQ�w���dDE#j�V(��P��
�K��������(�7[G|��7����D$�`��9�|�YV`^�e��ao���.�����I��@���^�+$�$�����{����%��Mul�~����O�G������?���f�]�����@�����z|%6�������g�Tf0j��b��e�J���'#:)�����H�x�����_��"�[/����~AX���l����|���*�(���"���;���������**���T0���dd`j���QU���(l�/Z?a6�T� ��$\��6+Z��!�C����W2�=������5�ZD&�s�����4�����ur�frJJ�����7�;�	Y�I��j
7��XC���7u�OA���\���U2�
���T�r����`-����w
�����@J3�+,���jZ�������A,m�k�u���	O�lU��A��\#&� IDAT����&;,�v�1�$%�������U����6��G�������?i�M�A��'�K�=X=��o��i4����x�YdC�t�Qc��&��z�����`��B��F���QK�d�@�+o^���>P�6��u�x���o�e�����R�n��i�
%����E��%)h����p+����5���`��1�cu=
���y���C}-
�����W�_����}N�Z��������i]<���W���TMUz0gD[[���.U�1���grX~�6�
t���	7_�!%��4���Y�Ga��{N������'��}{�j�{}�g���l�#7�������3-����S�i.HaQ�6�a�Y����="�h<��������^Wa��r��3�q1~�R(��@}@ZC���U��j����ti�oiN�/�h�N9 ��kV 6��*EQ:����W�?�YGC�
��������cz�ntz�������y4im~�7_�md$��41��MX:f8�'����)@�UUF��:����\������4�>�@s�k[�Q��:j4�����e�[�������6��F��S$Fe���X4��#����BS��A�R	�w���T����a\�
(�����<�hNH�6��yc{b������������7�?y��-5�6�ZG[N��J��u��"��Iw�����S�<��m
n��y�+*����4gb��Y����PS;7��8����c��=@��f��i��o�7;K�q�:��y�>�xU��\c
tq���#���;����tj�]7H��2_:�=����6~�r�I�D�Px� �|�����B��c����C���
����S��`�AjF2��Fv��f�#����:8����?�H��\�b�������(j(
<P��f�Q9{1o_���f6�m`��7}���4�JM�E��+������-���`��w���U}Oh����^Vs�;��P'�*;I�I�(#=�V���5�=��n�
���m<nn�
�ikp����8g7��<���������2��v}��^&��<�6��N
���r��s��W:���-�;�k�,D���I��j�{Iy9�R����^���Fc%�����\B����e�����E+6`��1�Z�-Y��=g�?�8z ���s����Yr��
���IRj#��i.[O�(��:��\�"AA�`�����0��������(��[I�A����K�8w�ZZh��~y�_(��@I�A-��u,3{h��:UW���0KA�@�����io��B�/���}����ASk�77���w�UU[�yPlZ<�\.$$����
)�H�2A^|�:4�z���~���#���@$�f���G0���v�O��U\(<����N}�*HMA�����b!y�*P�{"+6�^|?%1���[6|c����~�*ui�������aKq����E�m��p��b4l��Q�����g���s��M��������Z�<���	.�_��3�a��102��}�&8Iy�D�h�?�N���9u�j��F��4����K����X1#��bf�L�MW;8�%
)KMZl��?�������.������q���.����R����J:�����0�������N�M+v�E��k�"n�~(X"3<JP0�E�����
��/!�C4F{ q�E�v���P�0������>H�~���3jT��G�qo��;i�<1�6=|�1��k.Aw��?
F��P��{*J��8��Ju��T�I���\�
iw��3�
b�\�E�L��.|wt&f�&����F���\*:|�e|^{�e���~6�5s����J�t���D��������aA��k�
��Z��3}"�WaV���C����1����6F����;��tm����0����	����pZ�w�����ba�BPAZ6^?IA]OMx_J����8����Dh���F�:i��n2b��Z�Px�����+����ga��
���F�\v�5����u)>-�$�����c�H��^��	T�]p������z��u=��v�?~sG��'�w3�����).��s�Ok@��6b�}$��`�**x�,�^��F�F#�p
�5<�v���'������.-'qx���*L��)�j3���p��_�A�����2RP��Ogo���1�Wb���0���xOo�Q��9��������l�'F�����q�=��\;W�������o��W��_�_(�	�k%����i�U<�=I��&�f����z�����:�����fu�c)�����F���a�������2�=(�ky�X�Q=����������k����/�.�;`��)�e!�������yM�<�OZ?�,<���'�<��7Oa�gF������|l�~�V�_�t�lt��X�w>:7��oq��*��:o�;X?�F����-�����`�X�
x�������?p ��#�k���uuy������a����G����>�M�K�TL�i���`I� 3%�����C�qd_4R��1���e������N�u�}C$7��uz^
a�s'cF�\�����W�����:�iS>;���N������B����#��k(yZ#��"9](��8�\��My��V�]�bC�����b=Z�$��yK-���Hyr��A����q�AKC�C�L�Nls?y�c(w�G���uD��WP�c�L�W�6�Y���|����Me����J�T�T��~�~P~,�������J��b=c	d�8� �������x��	��H� �(:B�����Tir�M������	E2���MvBWb`���sx#���)���,ym��{�U��zAu�3B�.�"�)�PxP���*U\q��r���O|N`��]��u������'N�
�:]��Pr���<<�4��c���s������3 A�P<PS�������e�\�#�����{�zi�����?�����������%Q�c�h7pQ����0m��7��7����0��V����Q�{��7���1��/�j�����7-���@���R�n����)`�1*l���0hWW�V5�.�a������P3V��Px��5	@��sO
���H�.QfD��FS\
}g�����������O��#*�(�R��{�=�X���[�������{���."*vE��^��!/p��3k�@���9{N�3�����<(�Y���`�2�����>M������Q!�6WC�	���5�����q���`����~`�Y�Eu0���3������7���	���
�'���R+x��^E
2$������?"����>&���������o���I��p�	�Gn������98��gR���q����w�����_�!=>m����^s�K�������q��������d_?�=M@x[${?��S%�n�������=-_���Zi����
T45�L�����p� f�����g����l��Tx�}�!�y�OC`M��o�C1���8���Gbj2������"��-O�],=���,gl�A�_�L!,
MD6�m�^Xw����YVrH����N[
���/���V+bVU���il����Y�����f:�U�
[cd��4��;�uCg����
4���5��c�M?4w����AX������rF��I���K>hO����8�������0��]X����f�z�?����;A��5���7a`���D}�2���p-Z�W��'(%���	�#���o��H���v���,����v��|q=��N�9���
la_�����]�������2wOe�p ��	���r�I�$�M�����!b��0�z>���������.����'�J�`O����y&��M$&���&�s.�WO���Q�a4+���5b-��m�Iu���r�"�t�[@�x��n�	A��vB����
��s�o�7�EP�1b��A�~��ms`:dR]��s���oX]L���c`��E�|�-����No����Th]�����#���BFht=[I|I��8���X{$<�G��DhZh��������U�UE���E�����\��VHy����1<`@A��6��w��|�A��$&�|O�=������&�����xA�"}��G�(C��|���TG"=3�=x�I���G�B��{��n�
���-���x��X�q�3:5�N?~	��h����v�@E3����`�����-�o��s���g��$M���)�i������}M���?�rH�g�Df���g�����P�����/>ga���M�����o�}{b�����=��Z��
����!����?�
����1g`?�q--JT���3\��$
)U��1�h��AO'��HS����1A�F�,)�U'`���Y�MB�y�'����������y�z������L��o}S8x��j"���i3��odMy����[h\��`)C�=	�����3����Y}����XFx$;�A��a1mB����l�����9{.�+���#0��'m4�
�!Q8�l�O��!+����=lLp����S7(gf�5����~.x`kj�������.��EH$~��o=
���7�@�:.�����H�Tx���D�n�7��_"46i�l�&��3��Y�Z���;�j�oLpAy�����a�x��i��w�l�R�
8����WW�����������@�`�:�������_qz���z&^_;����\��������Qb����\�@����V���_�w�_D�}��c����������5�k�����<?��"���]��A�mgl��E��6J�������������F�����^��/<`���D���&���B�:��YU�F�x�6W`i���h��>A	�s�0����ghT��[6����X�a'�+���	��i��\q�P<x�����
qX�vfM�Q����?���W=�p@��)X�u#�$x�0�r�h������]YM����<� x�y5�G�6����`�N���<P�Q�`Ow�XX`��/�=����um����)���-
m�������~�[����x��6��.�c���.�n��7I����i�ogd��3��q"��a��#}x��D%q�A9;W�l�-����������a~��f��kW#�v��|�;�|�w�<�\�	��8u|	�Wt�W�.�j��k�A��
B9�j����C�~��o����{=�j�_Z��CL����8�0|�5V������RA�f��<���Z`�F�$�a�{4�h[Z�s����}1����C���1��rN'��=_�&�W������B"�h5w���.W/0Z>��hR�|��]?�_\a�A�!od<���e;e-��v����T���P5��E�@��
�m���4)�E�w���dD:+,<`��u��@����� �uh����H�������W����&�1��/���4,<0�7��������B0#=�v0��d�uw�_�55���=>�*0��C�I�y}�i�sp�o��l
����y�D�'<`�����V~���D�=[�sE�O0�MBi��(�R�w���������N2�NyC��-�Q�*P!��a��ag�S<x���c����G|�OUm58O���s���P��P����o��|gT5���)�`��"Aa�b|��i���N4A���,��,M�<��	�����
AC���`S�����RR#��C*4�38���w����j<8}m
_x��	h\�/����v��" �-����������\,��YR8�T���������k2�����w�s�[�r�CR$���m���1��B��E���p�`��L#�u�26�9��`�=���2,��7���%xD�+_�BE0PAj���A	3�����9^���	�:��A�D�638�p�{'��u�������(����#{|O*��g�o�p����=g7`�{1���������V`��	d���[9H���=��h <��C�������F
	A4�[����K��,7�8������u�]��^n]K���/�#�v�0(a�����&���o����$
���C�N���?�����75`G�;[�G��$����[�O;O;���8X�H;�����A��g�j����O����{_EM5gq]��l�V0����Av���B�T�`�x�� J,�@��(7h��F��7<\�
-�3�A��=�����>�H;�w�g���Z%#<��|�������DR< �����y���(D�#�~T���2���A�H����q%��	��)��v�l�?o< u5�v������
b��2�����d�jf��|�9K �#���������6>�J)q!��Rv>���H��Z0j�`lm]q��F�
z��C�`��Ap�T��{�����*ee��;wwr��u�)�����
�=q1O���\<`y�<���^<���A�a���to�"�ACG��������CR��)�82�������]�
��b������I
-�X�A���C��LM��.cMpf�kS^^o�C�o�"���Z�24�Z������y�	"��p���K��I���������<��7��iA=5�[�-�3uf�����:0��A�m���+��6p��0x����k���z�PA�!
���HBn[Eu0�@t�NC���?��^�-��=3��uTl���x�!Yy�\������@��U�[q��
\����?������r�y��d~���p��� j�Vk.��L��W!
��J;^������/�e%<`J	�/!-0��I���(7|B��s���a�����N���.����q�1����#����@�$�0���v�M�Imm�����Z�P���b��?0��~�����H7��.���SR*`�����p0�U�������=�g�q0��w�,jVt���9j	,��6��ks�=w�`l�~�e��U
�0��^5xz���f��P������������N���$M�v�?������t��%�s���CZ8Y��	F�����-(��6�y�[���i���G�<��:f�������F��z��Z���q��9� �Z�$/x����m�,�(-	���Y��"�;��Tk@��3�5����TT�������[�B���5��
C�x�B:�B0h������#��.�f��G�AA�����Af\$L�����8D R�&�Jnx��1FG#���I�@���� �"�%��k�U�&���I����,H]��o�:����'����r)/�!��[B��P��#D����CJ!t��������G���%��8!J�|C*	�����Z��P<(
<0h�U�u�:�h�h4AfCHx����8�@�D���
P%���U0�����:��~��+�������sU�V��9/8(����!H|����7����H��Ky�����7^�����=|�����XN`AMR@0��&�������q�5�x��~��3���;�< �;�y�L�T�\�`����|��}����G�
)+\~���@�����uyw��I�9��USS�KJ$��[�Z���bL�N�m���8��z�J���CC������A�0�`J�.������z�������#8w{t�_kO��O�z��kHE�.�>���q��=~���_� �[�+#R=H�p�'m��'�H�AH�����G�yV��s(�
�*A#h���<�M����������x�WD����Gx@:�S��&CLr�VX��:��Ly����+`>f$���@RL� ������J ��x�s�)��jM���k�'~G�|��*$4 ����+O����ilw�Z}��2��T	����e�:������S.�,p���y�c=ml���<�mL�:�&��4�W��fS IDAT���;�>����|#�
�Q�
�N���u<oa��4���l|���\��|7���N�5q��>
aI*>20�������E�3x�����������.ZM�'����8w�S������0���_�<;Oj4N�h���R�^��AR
2�POI��%v�����wb��Ns����^�#�*s������!\[C�M�}IS^�`R�5Xvh,22?��e��v�G���&�
X�.��1h��+h��-�d���;�Rh��6�8�<`�}��~�6/)�����\5!o�
����A&���OB����)|�������A�&��2B�~X�q&��0���"�}9(<�$	��!�����_�'b\{]zh���a� x`B���9t0���X=7q4aQT�x�Xsi��$?�W��N;��JxP����<hQ���]@�J^��X�.o�:4`�I�p�z4��t�-h�����+���7�?�	���x}���7q�A��[4Y���W����9�{���q�A��q��zt��#i'8[@�L����E\��~�~��Z��<��3�j;���w�$6���q�<0�[��p���o��C��&<xG�g�I�`))��	���v�b���9�sy:�B�����0���q����b�@�+�x���w�h���e��nV3+
�"�liR��������7�%��	Mj���x��E�x���&R�>���H��,�S<0�01#7Q���%����IZ��C��Ou��������V>�Z�$q����_���L�������������������&
���C����������p�T�������0A�F�����;�1��(l���-�aX*�x������tv_�D��)�v�\��E
�g#16���
Q�"�����-f��>�]���)I�7��f���@`@�$�0�@������8��x�o�)��0���<���;C��T���^agrd�*T��W+|��������A���aL;�3i���%T�����\� ���uH"��J�����SR���,<����������������)L�!p��8x�"u2��R�I��l���:5�����g%_��c1W;���!Hj<<�
��OP�-���,0"�@0�f�o�?&x�{}�k�w�]�����pn
[��X�g����d�I)�8vi�7�A!O����N%�a&)>�P{bP��WH(�x �<<��Xit�k��������S����4����
��g��T^.
��?<�3z%���A���p��!�8K����"N�`��9�:4��I�������7Z�j������MH��Yy�Sx`L���hWv��[a��p��b��� R1)0�S��!��I�tA����b�����\���%	0�*����3	0R#�L�ThRZ�)\
�P��s=��s�}�x@�,���p7�x�&����H� �/*�l����0�A��32���	Xb���HvRF.D �0`a�BS�����$@a8xp�Xx��!\������FmR<�p,����B�k#e+�KGy�Q<�iGU����.4ZT�*������U�t�J��&A�,���a

I��T��g&�E��+���~H���DH��8cHe�_Rq�8 <�$���Z8z|.�I1&<��j������	R�*�x�I!\� I*�X�b%<�9�Q�a���2j5X3uV�������v�>yt��j$�B:��Tj�i��P�x�{
o�B!��,�B�nxM���4����Mh3[������F�pu���������<u=���v����$�I*XT�*�JY4A"������vW���zx�o,AF<|K�L���<!����6@����oCx����`t��4����&�'`w|�R��U<���#�����DP;)�X����#��cDSh��9�9��-p�U 8��x�<�#��=�A����h�����hsp.Nw�E�Fy��x5�����[�my�)D����+�����&)@�� b�F�����G�������(��%����a�s���A*-2���$�0���\xz^��P����G��u��)8�}#������;��Y`�������u��DH��k�sq/5�D������>^����+|���:D���hS�>��Ry=0`e�|�0x��H��p��"V���YW�
0��-���'a!��d
"���vd�"���/����
����������� �gq���H�K�{}_s����+T�$/x�T���A:-�����\9R��<`J\��v���zm�fH�|�L�8gW^�����D�����a�������w
j��?��!h�h�xd���:�?�y=l]� �\��������s�����a�e�e�X�r!��}$�b�f%R�ca�t��t���0
*���D�
�[(���Kr�J�z��:�)�U<�#z��0 8C����3�����)�"7��T��B+�����(�S�������I�!o{sT��j	���C�wb
L���H������D�J)���S;��1��3�*Tp*<��h�C*�hW�	��s��*���mV�L�uwk��!��v������8���:{T������`��������\��O����I�Q�g���I�`p#�y"g�AA�����?(DaDe-������i��W���x���+R.]"�HOh������F���5'��������9���y��
���HJ*�]��o;���������)�)H�r�������WC�pZr0K�Pm'�����[��{�%1�x�d�	�]I�����t���D�ShKq�SA)�'����{u3��M9c*q���l�8u<���R<����+�D}�E!�N���PR���C�
C��	Ta���0{�����K
�0���x������z`���2�g>����'��[cL��$���8� ���v���v���GJ[L���7G�z��?KJ� 4��<)�B|
A���^�N8���[���i1��r�rhC�����R2�W< ��W� U�BU=>������<�B�asH�`�G�A\h ��ya�8�#<��x�NM{���u����������P
~x
�N�x0�����x��z/��)�����GOI�`�.�N���q��u��p
�������7�P,��	��
��e���<\)Nb�� ��%�������D�=��X�~&��!��{Mn�������I���I��I�����m���<��J������T\{6�&���M�##[��
=�� x@a~��Tkh���Z���0�'[���(�`�;�P�����E)/x`K/�)��K�b������_������6n�-����Nm���.�e���/�����k.S����	�P<��z������a����g��[�o{��������&�e����5G����&����f?�6Q�U:� �mR��Q��.����?,$��=F���I�[B�j�|.<h�v4*Px�s��pt��
��Pm����0�]�F �-��|�W/s�����h��}�I��t���L��8�.��
��
��^����W�nH�E�ZXz��f�vK�x�h��c-�I�i)Y\������n���uI���`��@�^�8�6i�����_l�6V�����fe��hE�����/�E�$���'����?��*tb���+u�,k
�	m$�e���������&���
t�nu
��v���v���?�u�k���%��G����@��$���
85KC�n���.�'��$ZL�K����<��������!H�x��1#6A��7d��>�;+�bg�������7�	�����4����z��W��	O���Os��&�Ir�Z]m�r�9t:V'���-�x��{��=�LY���;�|s�������\;b+-��n�!��8���K3�m:�K�n>�f����!��������gA���?E��Z�0,1���G�������S����5�
�/aD�gl��#7b�����VwP�Pho�}A�;�$q�z��V;��C�c(�l|�G���,�`���*�I��g������Ws&�xP��;���A�)7��2]�B��Q��Bc=3L��l1���$�����3���ur��n���]������;��M
�y����R�Mm����Jig��%�Vp_���S�s��7���������Cv���Wp�����.�sUK<��Lj�"'I��7���mO~p��$�r���Q��q��
�N{R `��"��������(O;������D��=[O�������Z�������y�#~���������	<���a4	0u���8Z�oJ*s�5�,8sc_�g��v��S��x0���!(�����R��6�H!*R�sbW3� �$��H5��}]����	�''�BOSR$�4����$������F!K"�`�I�#��k����)f{^���p��"Z��$�Z�+.\�������,$E�����XblK!������T�j��(���[�i�
�Y���JRX��_����B�u2�����`EaP�i'��g9���g�f�\�`����4p�,+!�v
� %��'Vc���d��������I����q$�������0��dL_Fm����=����h�8��-�6D�7���u����.][�>������^����Z�����t�m4p����M�7cO�����:O�}�	ZH ���B�\<O`���,�R#��A)00��$�0,��<`?Y�vL��t5�jI�B*,1���+`��lz~h���C#d�"9��J_x?���e�������*Lm���"���j`�1N�����A^�V/��T$�I�A)��p,1� e�c
QD�D���U�|����0�TX�I����fC;0}���B��=;����H� ��A��x�$R{Q+o�CC�v�3�Ztn�_��S)�A�;/vLf���0��-�d��q���Nq��A��=L�B��b�n%��5�B��B�UY[���I����q9th;��+Y���6���t��?B��eQ|�����K�Y�(�9����Cl�{�P���00��[�N��
��Y�����z��M�55
����)
MA��][~��D�A�z=�����)
Y2N.��HG���R�����8l^;&_��:���>��������E�3�:�Zfj��?�D�)��!x�9��C�:�gN�����2x��[�)�A=X5��e�4����+]��j>����B,���0���p�|�<��S�C,�[&��h�!�|R��3��A
�����U0a�Q����I�!���n�I���I�x�K$�	�t�a���#`QW��5#1�����x�����"��{��|z�(��S��r44i�S���,���!b�h!�������C��_�x�2��I�qt4�-�^N��J�\�v��ge��n����u��4�]�MJ����/X��?o"����j���%~#�r��m'"i�����q�T��i1���������Z���D,��f�{L��:^5r�VW��C46����C���Ri^��}�N3D��&-d�����~PP�������� ����`:*g\�Tx���7���c�^�������S3�Ga���/����DK��$-���f�A��
��|-���g1I����$x_�N;V~<�����9�����a:�������}
&z�<��4��K�q�".����fP<�y�$-��A��"u�����0��fUk���G8�0v�����XX�I�I1��E`'��<`�7�XLu�(�C~����{P��{��x0��-kka���0�9`~�]l���a��k�����{��M=H�9�(����=R ��<��D���_�q/�������s�`:
GR$ ���\�%�p�;������)��I
+@���xZD�-����.�_�lQ�-���j���$�^$�a$�jXB�5I�G��f����Q<�����K`�i��`Bj�g7�����	_5�T����Bh�8 ��d�Mu0`�-�����#{7zr����!�d����W��o�(���0��6O�A��S��9��t
�h�p%���K)�	��!�#��T���yw�����ko��}H}u�B��L��!����)�zO*�$_�.���=OJ�>���4v%���|J�?X�U��N&������Sq��I�����w���i�������7��G�~�/ZV�Hz����9�;�������������B-*���C88P�w��������T��A#�
"����y�����>�Ql��]���L�["���W�Q\�%�����*8�0��9l�C����S���S��p�eab�	r��V�wmW��Q�
�NaF5��);O�=-q�Z�Co m�>H��jf4�������yHX�F3B�������(�8��q�����
;���������qh�^�O��n�0rY~����c==�F��l^�q�,9t�zv�md`gl�=z&"�����!K!�T��(Rhm�V���u��e�?��4��%�s��M��t}��J@��������)��6��<��HU����
����s�(�}:Li^��r0��QQA�x��3N`���'e'����=g�W�f�6��F�����xp<u�����LY4/x�F>�;F�m�����!tj�Z����#U9:W#R�H��o��1;���m+k�������v9*/�)�<�#��@�������<������V�����q��3
��+x���=l�P�������6�����95��v����[���9��x�bD'<~+
���_`?;����)*!�=�8G�`a��Pw	*�{w���v���:�<������D�y���'�<z��(<�{{����!��h����O���Wb�6���>:�T	|3���D�b�9+�n'
g���|�.C
��E�"E��������xxd
�h�%N���n;�n� ��*��jL�����y��P��q�X7�X���F�Y�U<`�RH���gS<>�/<i\w����[����xP��:���%�|��q�5�����.A]��|�����4��r�E��D{M����+ggM(�RY�j3~�������u��o�����&���A,�*��0
��Pg����G4	O/Ig���B0H
�:�����DU�
��ucxTw��".ho���4���'����O;���WH�
�@q�Aq�j��2���-+��z�d����= <��q�Aqv����)�%�B[�mCa���vJ3��P
hPA�@Z���im�T~q�AI�U���B-W���<(k���=yC-�j'�&j����"�63���YMI]�(�@jc��@a�>q3�W'#xP&���F�
� �9�@EK�B<���j\A��7��,�EeDa ��!��8�@�uHjO\�I�J�OR�@R{�C���dm�Sm  ��^N���k?�%�����La��������8�@;�(Sx����
q�AYj���AY:y�"RI��N-���u�G�����^2��jA&��L��)p���K�To\U��YxP�
�����9��U4o�Y�d����8�@��������4���u|���%�^I�����8�yC-����E���UT���E�/Kv�������u��_��2x@J�������ss��o��-��(����,����{C>��*����%U�"�����!����p��!��j�Gv���\-���d�0Wx8J�7h;WkhZ^VS\�A�!�*(��x�CY<��������K�v��pu��`�B:��Md�IK	��`RH�0f��NU`><��LE�,$C�Y����`���]�T�����QT~<P�'s���b�Y���xD5��~ IDATN�u�	��\�Sha<�����4��#�:Y0&x@Y< ����xP�}���<�����*�w��x ��>e	A�@zo���L�_���$~)�y���z�J��JkVP<P���"NLP<����@���_8I�< ����e�v����Ku#
���<)�<���"���<(������<(Y��b]d���+#���Z���$%�@/��<xPB�!�%�X�4+����_�Y	���=-�x�����y�<(�G�2��m<����wW
��|�Sdi<�E^O�-%��D����~��*��}�
���UDO��c/q~qu��W�O&m�����;TUUe*_
	�A����K�p��9�+�������.Q�)���k*Q��2e�����YR�qy|�A�}222�}Q�
�������U5[o��-�����X�k�������,���(�X
����M���I������lr�n��J�-�6k����8pH!�����Wn)2��6I��V��"5H�8�����|����������v77�k(���#��Q����xQ�!���oFp�kI��h���t��U�A'f`��KZ�����R�����-^f���e���5�s��L�F�{��O�Y��H�x��Ny��A�=�Ut�����#���*Q��O�(��J�T�8W����s�h�
y��'7�.\2�(�?J�'���s�N�������]�&~>J�����$����?I�#K������V���,6?U�@�L�����N�ct�T��-���$��\�&��FI���<���*��@I�G+�F�r��\$5PV���R���B�H������#��	6A!��+��i��B�$����#!r#d1���(j<����������+���J��yEDD@__���v��A�F��@�����s����ppp0��������N�I=�i�)K���X�=%��"�)�-6�O/^�^Z�e����8�Q����!���L�ExQq6�a|���,��2����G�u%����5�Z�#�zP����P�?���,�?a|(�U����������.��(������*K(�x�������e��,�v��y���W�P�����~�+��X��,�k)oJ�E�HO(����!Tye�oKY�C�X��ZP�e�abY�W�����?�e<"�����iA*�����C~*����G�������Q����������P1����(K(�x����������,�����?���N������>O��\��=3�����\b�&���~�RJII�/c���,��"m�TI	R��������.���J�c%k����S?��?��322%���������V����s2���H�z(��Q����k@�#�B(����NI�G�o�����P���#�_�%YB�:::en�@���#�z�������Y�Z�}�)�;A��I�OJ�����,��)i������5�T|�g�2�Y��THe�WB�CY�#�'K�?���%���A���;\Y@�I�X.��I���$�e�?��?BV�W�����?�e����_������e�?��?�e<"�������0>����� ��"�)�-ey�	�C��E�V���0>T�U!�=a|(��]ZY�C�#�o��P�.�=e�0���!��_�B�/�xP���,/ba"�����-(��"=�,��2��0PU��-�-e�abY�kA���?��eE^��R��P���0^��zV�a|�Ho�oK��}�(�2����"cG�#��r(C�C������,�����B(�������G�'J�����E���<(��V��0�Y��R����X��P��C�C�*���������L�	�!�5�H�0�)L,+�������G������"-�CEzS~[B��CEY�����b�(K�C�\����!�u5(�����2�GX�
����ZV�e����4�<P��(��b<��w_��z����7r�Acc��P��
��K����4�g�J�����������wx��L4�����(���,Nd&m_�4��Ru���]qME����jdRI)��g��'����H�J�E�9'���c��Utz��Y�NFF�����lm�?C&fgg��G�g�L�J��,�a[�=�f��Z�-����a�[����bIMMM.�jf��j��\6�),��<���������}d@��P�ZJ�d�z�f����(�3��Y�
]3`iy���#S�y�#2(C�>���,�	��]����?���kv�Y9�HE�1*����P������d:�i���,����-��aa�K��J"Si�Gf�n�*��R��P>�[�t�-d2U��!S�)T��C��*���	T`��.S�S�20?�|��_j8jg���#2���BjV��0���xT�E���d�U��J��P�y+j|�Q���!29A����Va�k�JKL�����XN��E��I��p�{������R�Q���N�<���|/�����}`*u�$)PR�UZ���([���]]I��/�H�2���������F�9�|
����|X�(�u�M_A;dsq�r��w_���&$6�_��k8�BK1����-K~<��k���_4�W�J���\������Y��f�
Q��-��N�.� >=Y�s/���T�����e��e�}Y*:X�O�ncYm\��o������W��QjF�VY�X']�f~��UY�qYl���:<jZ���)�M����3��Bl�#�d��J�qYYh���O���5�����=WZ�e'���J�4����f	A
%�`9��j�b��.I3*�'��b�$Y�.�J|3�V:�4%��i��@-�c��$�l+�lh���T�N*Y3���TV�
�ea��
?-5�f�����<O��'x�(�
w|��
�Iqe����# 6�L��E���?��S������s��1�R�P�n�$Y����o����,ePU����F��d��t�H]V�v�P@�@�x@J��yk����<�����>O�x {�	�����%��Sx���!�e�O�j�|^�U���@s
��b�(�<��KB�/�x��^���Q�R���x�r�����GE�1���C�VM`kmA`Z2��[����2;���{589T,���C�P���$�;����.n�����g1k�h��#q�	X�u?�����C��MIM��s����)f�?���>4�����
m--L5P����A����\�6x0�N���A\Z�D'�9(L���5�a�[g,����vb�sXI)�w����XWi���
y&Q�25��7�GKc oy]�r���
~�WHcB��%Ld�
���`����^������j���V��]�MU�5���>�m��E[��q����P�������6��k�$>eE+���6��i5L��"q;X���($?���IR2Q+���73*�wn@�mg���7��ju1CbL\����p�{*�n�	�]����V������������H�
Z��-�^Kc�T��D{K<��c���h0��*D7�O����F7C���_�����^M���M��������6�����!�l>%U9Q�O���-=U�%g!51���H����P��6���v���8���=c5�������|��JrR5V���i��I�v����l~�{*��g������6�vy#�I�T�k�{(.��m7�H���x`V�#2hm���� )X�qt�1��B�qtq�(�`^���y��yE�E*�Dg!�~&�,T���
�:����:�����Z6E�w7��i�W��iE���M��q]<c}]l>����w|����y���KUN\�O�x����Y%�����g7�������^�,,+KUN����}��7C�������z
�@G��x�I����~#�5�cs�<6]{,��W�*K����0a�q���=g���x>[3�8�	�/9&U9Q�V����l��������Sp���D���c7�O�����0���Go�����(t���-ytC���PS���o��_u[AMA�Z��0��U�V����v����cq�$=.��z
�����l�=���:x�4��s�aeIeY�@�Vv]��b�ts��AP< o\�})�ihA�w`���X��������/]��cHZ�������_","������06���X�a��}�����MoXY�a?�
?N������B9�:�6���"�~�����;<(�>(M�@���������K|�e<�PU���`���E����1��b��[��%xu���G��F�)�T�?�������H�4hr����}}���)u���o����d������	T33���%�<���	dg�#��.�����S4x�t�4*U��]��oQ���A���kV��X�����nz�������-����� ���������O����P���n�E�)fJh��av�������>���������W��I-u� < ����\:�!��~��t�b,�-'s^i����;�|�b�	�j��c^Gx�p@�(4��C�9��;�LQZ����5�c���Cn)<xw#���������i�[�^����x���rvn��~W��AFF.�]�������"/!M���w�������\����_x�Q��Ul���w����-��9����
	���w���~p3�BU������hC��G���{��TI�E���{\�s,��4�K
<���`�:#y���m.�P+���w'e�W����}����	�r��+3x`��Q���$u����� in��
���8� &6;�����}�v�^��/���\���%�����w9��v4���&�����
�N`kK3���s�kKs,\�?���<~�
���h��?���K����v-���s�N\�i��������D�����Rm������=�������}����7�J��;�$���L���z����-�������HH�������C��<U���t�h#!)W�.������������/�F������G"��>dDF@�v��������p���t�$2\B����Kf��5����`-��6,E�����m�8��T��Q=�VE[[��y��a����Y~��K����|y���`���x����vv�UW����OPx��/���wO&�6������������[*��v_k�#<9�zS3��5���7�����\
���b��A:�4����~:�V��1�cr���Q��r�8��:��50�Z[�z~��]��n�`�g������������Wb�����u�����{��LXUn��}��B^\�s���S��~�<�M]c�7������P�����!B)���;a����;B]S���CzJ<:�("������k���;�������c�Z����^��������;�b�y}7vL����5�	��0�v����y��=��}����5����B����� 3#�g@��&���������\x@n��!�06PExt&�l����lA���WGm4��K������4�����
��L����x���6�p �^�bH7c8�i�rMr������+[<Q��Kqx�6�+����T�OKCQ�M-��Q=*X�-�+k�e}}�������I��[�/)%1q�\��H_���P�H������/2&�j*X�1�]#{�wX6.�N�m�&�����������D,�s��vBDr"V���U�a��M�������,|�����"4Q�6d���:!�F�0��L����� +%�~t�Q>��=�nn��'��u<k#j�B��U@fX(��t���#�CF���6�7���0gG���
���r��v]�;��}���)>w��c������s�n7U�����3�-�5�>
5sKd�t�Tn3v�F}5��Oyp��F$��	�^$�"i���,���������pil�F_Y���X<�����R�U8`��b�L������@�����F���^���mapkm�������Fp�?RHy�����~��d�Z�������f����x�q�T���5�'S0�oGD�K����X��sh����$F��\U]���+t�l�k;��u5���&���v�����,��m�����Q]o�X��F�@U���������6��rp��X$�������^����Ll5qs_8�������7?iY�7���s2
��G��S����lo���F�w���D��~���
}Su��3��v����������U����qh>��~���C�0��	[7-z������	�Z�P���)h>�����c������:�:���v����7����:\��	�V��%!�]:W<xt8^��p��hX�j�|-m�Gv�"�v�J��R<`���}[�DO��	��������������&Z�p���
~?to#b����]G�=��I}��m(�L����{�mWUl�����i[N�*��]�:�����c<{��Nu����G���{����E� �e:�N�>���K�V&�\NF9-R2����9���m������c&]����[��_RLe
zO�k��� ��f���z�g�����:�������������^�I���+�i�� d���Yy
�����E�0�k#�b�6�ozw^�O�Dg��hC�xp�`��p�����H���2z�M�.
��]���=��D��k��{���&���}�W\�iS	��{&3-�u�il�N�2Q��kh����W9*6U5����x[���������T��!+3��7K����!�A*^�d1��Q�����
�����x�"
u����)��E6�z o*
<p\V�yw�D����[�{|��.����c0���-�@]_A�q�@]_�F���
�7��mg���u]M��q����cNn#�e�.�����z����g�1V���*^m���W�����b�i��#w����&5CB�Q�Y�RO����S<`���i�hLc���P,:8������-������)��i�
����"+����Q��q���3a\�!,�A���yr�Z����o���W�3�<�*v�j4�V�5D����&�[���#�]���C&���{����C_#��Z0��'�G������H�8���>�
!)a�<�w�FC��{�a�i1T�TP��TO3:V�:=�������X?�6��S���K��e���i���H��cL���w/!q)�V[x��������B��nz�#:f�p�����N����**4���x�/U{j!�a�|3��44#@�J7-$Ed!�\=�r�4`�D�'�H}"����U��r�|3�o�
Sg�s,�w���*�7���
)T�
C���E����0�!q%��`M��U<�S���oA���XH��q�X?~8�C�1}����N�^�b����k���f���k�{�g���L��������=�����e\x�3�v��}/P��7���~]��A�z5�$�=Ny?�/�zA���y�U'�����(�����;h���
�A����f���-[O�E�%�S���[����_�����=9��O�@��C��{�M�����GZZ<�z��C]\���I�|����T\���+<�;sKG8��0�'3��y�N�]�+���QV'�����RW����"==)�q�N��L��5}���]Z�2��
��P�n����W7 ::��6k9��H�9�����S��06���-��I~NgN�A�8]���p���7��B�Zptj���6R�,x���]������D�*�h�r|n��������������:����������kz����o!<�%���on�G��]�oLM�)t��K�uI|��1���*�3�w�*�i|�vO����5�1*��G���b���05�AHTf�?����B(����+�I�A�����]�l����X���1���ApD<����BP��������1�w}T�`�LzNM$Ug�}|�z���q�!��s��?��o��`��Ch�Y	]9�z~�p���CW�}T�� IDAT��
���M1���������$�x`b��	d{���IRa���g�
�����Y���W�M����E�����5�f������2R��h������IxC�N��F��N�,oA{Q)����Md�=���"j��`����3�l�&X��b�R�p���C��;�*��g#����\�+p!!�~�Z���F�*\
Bm>hU�W>`��T	j�Z��}U���I7O�
�I������jb�?�@*���48m]��@�|�l_�2��?�wd��4`D������)��Y��(I�H��8�`B�V4��������1���;���t>�	��>��V�GcK,�<���a�kC�zv�)������!�������BQ�A[{4.Ost���{��9����{N���l@ &����[
X�������CP������.�	��-��-��g]�\eHx����+����{��-~�V���k>V����G48�*�Y������7}�i��d�f��1��5�i���4�eIc�N�x�.��^��.^n�w�H=<Z���4�J��v��aPI2�'Q��S<�����}s�)��Y7�jy��8$��^1�W��b����gr.���Ps�-����g�{8O�����+�A6��m�5|g����!��"pg����G�C��,���Q���i�%��!��oGISa��zeGh�n����C����]���C� �T�A������y�O�Tl*�~4{Ux��`�ZL�8��m� R8r��wl�w���������1�>�(��s����W`��R`�,$��C�1�7�J����1|@^��%�`�������3����>y��Ob�c�>��=c�}��?���(��k�1�W�O�������K��c�E?�7����T���(�����B>:�-���y����f�0� ��_`:l2��C��	�OB�f]h9I���l�A�]������gM����rq������x����/�J�_�����0�`y�64���
FF���~���A����m[|w��LM�@�O��cj��X���D�$M���'���������	�
n�+<0�	�?}�q4Q���'����	�=p��7|�_a5M|{����\T��?z����" 6��{����M4���)��]cb�{,��wQ�& J���3C)���n�������{f���3���*4���������<R;X��8]SV)���
��.,��"�+M#�s��Xh�[�~�.Qb]H�L��>�w��Z�x�A��O���Zi9h	a�E~t��O/�A��	�B���<���D|�Ct�x���u��O��I����"��d��'���m����g*��%-�6���w�)�x�����������I��T������k����{mMkX6�
�?8x��s���fx�,�M����&��+�=<F�����|Zx�E��Kf���e��h���w��f�9f�Id!Ve�?E���2l&8w#
��g�M�N��	<�Ey
h�;a�~�+}:j���T|��!��J������P"��J����)���-��a�������f�N�&j�'P!26f�J�u"�XUa�BsL��\��SK
������<������.m
:��/���g2>�K'�N%!����ei$��;Uh)+ci���u�]�mp)<�z���s�a���A,�s���!8)A�	���#LW���e�<(��@��?���td=~�&-�J��jSW(��@����l6������Z�VH!PA��@���!a�o��4�)�H?{�� d��	�6�rp�;uGNH�H���M;}���9x�V��EcS$l���fr!/2�`��d�`�^��@uL��{�@�'�g]=$����Fs�@�{_����;#���P��J�E�WUIR�`��F�6;��U����'�
h����H�Yf��+#�E����6�[1��-7S8x��T<m��a�^G����6��p�HX8�h�*+����������������C4<<�@��6�����\
�`��B1�{�Ap�����D��Y��s4�66���]����y!����A_Za��`��3��E�
��f,�}W���{���g��1Q�
�TB���G#;��Z�/�����,��]������h��Wd������=���B����-%4����=�6#���k�@��w��0�
4��$
YQr,T(�&i�Iz��&�-T��A:�1����;�~�������2�	�I���Hm<9��<��f���U�g�S?M�����mi��ZZ����s���KOO��5m;��B��t4B�,����� -&�fS=+`������8�<�VW����b������<�1P�~�{���k��Y}�Fh`F����aX~���r�o�0�[s�:���
WA��	�����Q��������
+O�D\j�����^�"-��z�Bc$)Q��m��W"���)�I>A{h�S~W3�D��=m��=���h�v�-
4V�8������'�o�g��E!1�M��\wQ� �;mRY}�n�-`e�r�!�f���pj�th�'��]D�� ����/��m �Q���d���].���1N������'��^>mf�D?	L��/��������<�$��9)6���B�x�_jk�ii)r���U��JA��������#��i��)�5]�d�~��|�I���X96��*���9�[���AFrQ���|������O+�A���pg����5DFd
|�'�"�N��\>�+."+6
�3:��o����/��������|�:��a[`��+�y����9���<��!	�'p����]B�=�h�/�6�����j��?�����t�\1���D�����=h�MO�8����t�Ed�Jk���-U}����<�@KMK�m��?G�m^z|
��������w��_x�8�/���F6������T������}�/��#0#�?E��50r�l��x�����H{�N���w�G0n3��N��E�<Z�v��i��4����������<DC����?l!"/�@.���F�D��?���oh�x-*���g�����"g�������_F�F��|���[����`I��PWK�r�}\�����T,�0��f��Yx��|�-�&NZ!Tu�t2��Ty/
��7QD��\XwVDVb!b}�P�C��Y��c�@��lr!��_��R�u�~�("�n.��� �Q44�~�%z�R������f�8L�x{�V��m�p��
�(4M2����u?
�+��wT��k|9��C��O���"���t�kt��H�0�Go?��!}����2����-���YX�qP���
�
7k��E6�f�g�;���^����0�R`����1I�0�0����Pw7�1���������9bJ��<�F��m��G:�j�;�ERH���� �]5����q���H<��H�
�q� %%��l3�m�3ZZ&��O�|sz�f�]���������)8dd$���t������8�p����g�M���~Ch(�S�oa�>�Op�.���g���w�������a#W#9�������>�PE�>8���c�/#q�"�A�,�X����n%�`��p��7���jz�<������B��t���C'�_A9��W�6�o����1���i�R�-�j3"�� z������~�V��$x�@�S���\K�jN�!i��&Vl�"�@GC��
����_��8y+���E�E�^������lc���8z�+����5���#?~����ib��v���#�4��s��+)l<z����o�����t���<��q��.���� �U"|?���hn�z�6�6�����	X�C���c9|��%�i����;7���\R��������C��72���L���F&P5�D��
bu_y����*	�����j����&����x��&\�
�P��'������$�XXf���gD0����B����B1��'0�`��}(������n��Q�Nv&6jM%e���CC}L�~���.f����v=�*3
;�`�����cn����A(DV��]�m0��i�w���	1�N�Q<xA����y�bu���*lu�0��+~�{��x�O,F6j������
��b�����}�]����vthM���@�x������_�rY�+�������i]Z��K�47���~��d����y^�L����))!��7^� R<0VW��6n�wQ�p��M�����b��40R��!��U��Xx�tM�/	�~����a�d��@��0l�L��\�7U��1���jU�0S<P�go(�
5�G��"���*z����\�E��w�1�H����FA����V����	��8RU�<0j��j<l�IM$zg@`���_A�N�Ct��,��&�D`*�2�A����,�i���S����g�D�5��:���E�2�0���"�@m@?����*���t�����x���2
����@h����S�`_��F�������-A	���0����3�o���v@`H��kcmQ41"�o�|Z��P^����I�N��Ny��_\6�l�}�{z����	I�@e�<h���Q.V�H���Ga4�y����x@�t�w�C�>y~	�J��<��
�:
�HE�� �NRj���2��&<�S���>�r:z�7�6�T��m-
�J�TW0�`��3"RS���cLo�'��m���\�P�P�0��
���%������pe;?����b+j�e�*���L������p�8p�T��4�2Z`�yy}�kR�jK��z.�x����E��~�9W6�-�D��f���^�;�&���I/������tL���x�xA����m� ��~�����{f�^�k��u�xpl-��s� ��$@�>vW&0 P���7�����	*��2�-����������m��=G�1�(K*l!EAI��~C��3I�`)!L��������tz2�+&\�2��=�����Qc�v��p��,%������-�0h����q'�C�
����:z�k��=����V���L��?�4��E��r�>����K�P,�O�w.��Uv�������6���"9�"3��9�i�"�s1gY�����%WKP";A�9����t�����"(��UQ�~J�}:��N��_M4�u�A]��0��o&WZ�rE4�(��J/����H�����B-xX�C/[{���p:$z��d��hI��.Ra���j�����$I��Z`�A���Pi�j�m���Z�v�,`���J�V\UaNRO�
�!����/�������A��"�!��r#_��:��"��C1(�;�2LM!a�2�O���_�^�����z�t
1�f�P�p��������'�x�@�_Z���v�*�P��!�[&����B��:��������:W�
��YR#`�Le��L���M�������1�����~J��L	�m�O����	�\�h������%�-#%���
�[)�M���3WJ�49�o��gC�������</
���V��y0����j
����v*����!R\0�V�yC�H%���4j�k��S�A8�2���p`"�~*zM����\AJ���A�i��(Y�5F�Z���]�0�N������F���ftR\����E'�Yb����}fX �������]����1�Y}U�Z�h��z�X��;a�3��'�u�����-���[S���I��Z`�K�'��*v��C������ ���Y^dE�6��~i�4:�uu<����H-!�o�&�K������M�0�����?�x��	��$b�'����c���J�q����+:�)
��B']�O�Oy�bt�&\����_���|��m�=+�t5�����M"���>���W<`���L�y_�t���O�O7�
ws��'������M����l�pc��ab�D`���d�������h��uh��B��i��R�{P� �t~�_�b�g����GZ��g*���N���@�*s���_)h3T��3$F��Q����V�%5
6nL(�2>3HYE��+<9���p
��U&����A�_bHy���\�$�� $��V�8�6	*��$���6���@'�l�*s�A�J���	�cC%^N��\Z�:�g
zO/
����$~�e��Ak�>�
�������Sw��%p5��z�Op�17?�������@
M�������.j�}��L`���NN5���:WHP1�$� �7_���||��Tps�^���n�hZ�����B��6q�x����pw�a8}�1���8���P�����Z�q~)<��&���r/YOS,v�xp�6 %�Ux�n����@�/I�@��u}c?�
�Hj3J�
���!q�����p����
\�@�~s4�M��zH��
%mC�d���h<k/�P����y�O���}z�F�<�������3�{�D���RCJ�����,x�N���m=8Q���7���e2���O��E���hbI����Sj,5����1=�H�@�Tx�6��.�������s���A���PH]��2�l�_�T4	b�S`�A�e�8�q=��l����R#
a����c0�($����"�J��A��B(��:�(��@�NP���i!_�T�/8���V.���WS�}-
����JXN��X��CR36���=p'07����;�O\|�������c&����	��Wg���D
��n����
V�(RK`i��A����5����;�����G|*}�j���R^�_*��������E��m�}���vez��7�o�%�T�����z��oS�5)�q� ++��S`��}z�e�LE�A�Q����P������S�n����n$����tI��T������x�����=���9����+����W�!Xm�3�������(:X��DE�#�����>����~���fx�|I�|�:�������55��/#�����!>���v
:���g�52�@��Pz/����-��j�$����K+�K����<�(�n3��#���z�,U�2�[7��NN�������OPU&�4��.9Tl���W0�y����Fb��������_��%���<`'�����G���H�<��@'~���D���o��ui�x�������"��t�T���7�?9��sp�.�&����������7U(��5�I� O
����v37(�`���b�.<`s���Ks� R�J���6��&�A>��(t�3R*^�������p/��&�d�� Z[������y	��x:Dd����������E�F<�K*����g�K�����,o�
�H�`M�^\a�}/�u�zc9�p��H����U�v����w����6��Ky/G��J����qL��Z�L��n�6p1���Jk����K��C�����{�X�a�����z&���F)�@[E
������W�5��h]�r�%���_\����~�H�uw���&����H��\��}�U
<����_��(��;���0�p�����*��=+pK&}��}���,h�)�R�"��9��D�
A*M��������`?V�4x�:
�34�
c��t8~�Z!N�(<���&�p5�,T^e�{&����U�+��
���(�>Q���*�7�>b;N���9���<�#��fj�!e[C<"ECE�����\n�@E���9R$P��������I&���L�)�`/�����&�v�vm���c�vlCRP�����HA`��������+0���R�w_LF���}�UJ��B#�<e�i���{G^���	e��E{Q��B<P�$�9Y��o>ki��\	{-�[�:^; IDAT<��0��Ic�.c`���<��y��<H�p�]{#�Nc2�������������}T��G�mZ�rn��nH�X:HE��GG�����-�K�>�������DZ��W��VW��_P�I[L�\��Pe�Ux���Y��Fb��
��s�)b�wU��1-<46���$����T|sc&8�*���:�^XI����L'��5]�,����t�/��C�vn�$\7�x`O,A$���m&�)����"����I�`=��C}Z���S!
i�D�<��Ov�k�X7�����-�g����h�������-^h�c6�3IY��^�@J
/���
����[�I^f��R��\]Af����L�����i1���2;nI��PZr!�t�%I�Eff�2��� '[�q~@������1�a�1����|
�L'���J0���2;5I��r�HJ���������h"���b����3��O[H� �NO�� ��~:W<��0ftrs��$�F0����2���w(	��%��"�v9��p�`��d����C@�����x�`�'��t@�������������t�������i��EVu���W/�'R@`�������heM�9������R(.S�S��"� �Tr_�B��b������	H��R(�[+���A>�-00�9�)#�TR� ��?\y �����P�x��r�A�r��A��y��4C���PqrA~�P�������Jud?}�x��o{��-%2��)s��,��p� 5�����;���k�)x�������ioIr��NE�x�|,S<X�������pc~�����8�����f�w���~p���ox2?0�{��)�9Il����yh��_X����\���A�
����Wz<0oH'�	N`����J�����V:aJ�x0������N#
�m���&n��k�TL(T����o�	��Z8�����#'�����<`���]�p?����,�5lS��M�d}��W����m#e\�E!"����H��7*n�]O�Q&\����.���BLh���}�U���"���Q:�����IhK
���ss�xp����:m��#�� �J*8����IZ��O2�[���A�E������	b�����T�^=������J+RV���M�?1� ������+S<0%�i=S���Sa���<,�)$���C1z���v`��/(`�n����N�T<�A�k����>m1g��x���CL����'o�y:��m��80���>�aI�)������Y���X9�I]�p��Mv�@0�F����g��O/g��+Z0*�x����Y`?��)�A:��BW<�P���5��s�c��L�B<�k!�QN��B.-|)QY�
�<PV��a�B��?�yX��t���*s�(�C����%�$ni<��v94j���=���p`�=��j�3`.��ZN�9��b���,�����<��=���h@��kgmt����i�N��P��Nj@"�0��]������*������-}f���V�H�<D�k`}s�p�|�C����x`?�
����3m�'z��Q[�b���0����4���ND��5������Ty��>���������y�xp�1|�A[o����x0�8�������Q=�_���	<P���e����\�����S�q�x�� I*<0����u3x�v���X�k�������uu7��O/�G���D��z����q��\���c\qx��������	n�W;`����?8	�N��u9M����~��u&�f�������*�Px=��$��x���,�o�[0�`���������������};q��!N�<`*,B��$��s�x��
��7�Sz7(�}p$��Y`���������@n
gPx�+��t����y�x@'����f(Gy����d���h)��=kX�,�BI���Q��N_
OBmQ!����L�����6h��[(<�<C���sp��}L���B'\���|��,���������K7�Tw.�P���K����y=�7&'ukO��7�����l���oY=�&1KU���L���l�=��7� �0�}��O��H���g��=�3X*�x����G���T�{�.���R��"����=}k�*���3�
[��7�N@�*��m������g!���mz�fm��&f��A�?�4�R���*$QhH0����l����i��K�DC�����8�
F�Z��'Zg`�S�J�*�<O-�p��-��]0����=�K���\��%�xpy����hC�U:lP��<2l9�%\FR��U�x��WQ]���U�)	(��T�F	I4Wl8��ClM�T��"���@����N v/�i���?��0KX0�~w�2����:[���!��X*�x��Hw�~����+Or���N���nX��b���aW�+�+��+R5Xu�&WV��~��������F}��"�v5o`������m|:�
K(�$�"���� $^��&��&?���<0p�p���� �������u�XM�	x�(>���fB�����D0A0W<x�9B�Z�Xkjc�,�K<X�{�];�dx � R<`yY�t��
,1����-t����2��I� "={�|0�������������l�Z�^�����R<�VF�@f��][��6�;
E1�AK,�{-r���9��n�[xN���:�/����x�|��T
����-�.g����Y���?�)kzt��s��Am��-#(������D[7�WR���J���I���d��\.�����T=�I�ZtP��So��I
�M� Xy��T< ��~�k�A���<���0T�w��x�/�%�G�\u��Tx�`�|
��������Ud1x������10��A�c9��h��,��<���|Z�yu�B���N�����.��&�w�!��f!��x`&�]x���
�O}�h[�
��y�S���x���O*{�z��vR�Y��z^���������g�Xba��>���Z
<h��)�ix�H�AW����|�)/�F1~45��V<H����wp������C���k�U�We����L�.Sd����< 	x0����y��7G2�T<��W�G���KM.��������RE�A����	�;Jo�x���G���q�I�3p82�\�m����KU�7.QP<���k���<Pvk�F�M������]z��"�`Lc�ofh�Oh�JJ�sq)z����%�����w���]u�b��+��e�6����9�H~��S462��.����n#��1�H"��p�D�F����Ae�7�_�^�K���{��HU�,�|��4��t�'Z<�C�"5�>6����(R�����������W-�2���	�P���'fS�=U-�����J>�P��z�k�Z�H"��n�,�-r�����$��S
���,.���������x�k��F'�+P�1����`����:�=*�*�$���zV�)�B'��!��.4�0`����U�X��T�
Art;M�2������*�S*zH'8A���'�i��<$K<h���H��5-c�;�
��h�����l�'0�BA����v��n��Xx��Re������B1�hB�ls�D�A/wM�kN1FiSu�^�	O�����E��S�+�4E(�1�g���)0������m��>�~��gjc������R�"���c��ll<�@**����l�49J*�t��,x��g�H�����������E�<�A�M%�{V��-q�6S��a�\����nR�C
����$�k�CA8�����$q�����b��q�{I$����k<�X���5�)������u�k��n�Y`��e����>z��E
-�����A��Q_V�s&��0%9���3t4R�,2��B������o2��A��:�%���J`!4{����I�����1�a���&f<<�)S���\)��Z��p<��m�0AnD8��>�<�S�0
Y�U<�#E�t���a��������{��E'�x���6���)��"W[�����;?'�����N!�t�|���T���$3^�I��.�6����+gR��b�O�^�=SeD�B;���u]��S�$�p�����^�gR���������#K)��/�2x(���<��L�)%�U<����E6<�mM�95��Xa��E�1x0q]:���C(��3(`��6|���e`���a-"S��["IR>�_�����^j��nJ�X�����)�v��gZ>WYH"��!_Y���;)�`a��A}j��@�?'[lu����������������?U����<DDZB�
���]��9����'U0���(K��s�)xP�x������>z�w
A���H���L}�F�A�T>�S�L��m&����,�b��t�QoM����H�g�����5�T�x�=k:�O��n��t����N�����v�����$��N��M��J$��xd��	���\|M
L�@|��]��>�[z�*&D���+�$�]��O������a�?79��jB��TK����)������n�Y��B0������|�'���n�:�y4��s���Pl�p��������x��7��xs��q�� X8���m�����*���3������B���H�C���q,)���B�R�!� �b�w��M��i�.��X�V�m�gR�����b���4�a��.���Y�\J���]��K`��$�N����<�K<8Ga���������V��"1�L���s����:\��D���64����"��Xa���;�u.�x�T�Og@� c
O����� q%Nt���ca*bH�!�6�"X�Esb0��]���^�fb���r��z�q���e���X��<'�wG|�SX:�D@���W]`�,����<�
��>�]�\��������]~��I8Ln_��<~���g����Yw<�����$Cx G�u3m�n��.��A��9�YH��B��Gh��B�}���g��+4"�L
����8�rR���0Q�
hs���v z.��2r����6\G3jG���$�j��
���-<P�A8o�R���X��>�%f
\�������$]M!!�	�k��M1�_+���X���Y�	����Q?�{	�m]��
K'�w�y4�%���O��1!\��%�y��.)��]E��<4����)\	��]�?�h�����_p��������g<�C��
�0�N��"-�1����x�O�P��lRf�%u8��=�����7��*������_����-D��:�g����O���UG|w�(�{���.�wc3$g�����Q�<H�*�wI���e���Oc�_��\z���>�0������eJE������L��e
� ��E��
)4=
UA��
Q����(T�����	�U��ge�O>l{(#���)�e�K	��R���N�����R�!u�s���]���}�O���^���K��)RL+�:5v�G����������b�@��H���,[��
��}h�:c��"U7�vu��h,$��m0�us���Ab��!L�c�9�:Z������������m0�f��'��B�2� ��ZY����
��,5�\BRM�[�j0��G��mAauu-���L�7/Q(�NfD��v��@p�o����� Rd[W��k�����ON`P�o����x/
��Na�a��������+0��B��c2.�[A�:J�"�:O��}3K)�My����J����=�"�>:zL�pK�vO����F��s5����"�@V�s���N��$����70����
����S`y���������jSg`aL����>���E���{�/(��I�v0����!Wq��{>n^�\����
#�����kd�:
`�bc������KH]aq�u�S��&�>����xh������CZHa����	�MsRW��9�6�/����i/
<�R�NZx�D���������9�p�C"�`h'gts����w\��!��-
�����������>~�{��l��?�S�2x�B6���?�v�{:|6LG�Xu[����A/R^��r;)��"�T<`���nM���9�?3���2��N��"%���AG�E%!!5��9��M���^��<�m�	f����1/w�	%z����#;-����q/z_���i>�L��%Sy��$��d�.����f#�`�6�
������r���
B�SK�����\����550AG�z���c���H�&��^r�4���H��o��g���+4 ����,h�RN`�Q��T'WZ�(�Na�A{��SL����8���g��k�P
�0�TS��_�D�#�0�����&J�s�"	}�U��{CU�b��I��&)0��Y[�����_��B]:��q�UA�Iy�h�C�T���5��;���d?)�,�}
������3_���P�bu������Ik����K�����[��!�g�|or5��B0Tj��]}�[Z���5w����h��t��K�}J�\���2�p:�9D�����.��<�
�����R||�ucy�z;���N�� �5�i��y�7����$g����~=�i��(JU�����H!�
iM�z�*����9�N`kTJ�{��j�aJ*�����~.��R+<�]G�Y�*3�V�U)���m��u_U*G�����I�T:�RW^*<H����B�\����u��o��E���'�1���	��������5:,���1�������V0#�����r �-�Y��m����_!��G�$��W&<���[��������O��q{M���s����cx/(:�V6U(:9B�S�N�/\D^@�e�S�k0��������Dtl<Vl��_�����q��?����M�������,�l�Y�0
�zPLAR<x�@rQ*hD�^,������Wn���S�r����CabT7�d*k�3&����k��rG��G��I���V^����WH�S�@^����<���*�*'����k�*���v���8�A]�O�u�� M�U�Z�f]ui�d�i���P���2;��Zx���:J�Z��>I�I����K�Z�I��aNF�ne�#��fuR�P�)/i��B-Hj�]�_x���U��T<�����d�������lc��G``����N*jA����q��<��,��(��4��"�@��5e���n_E�Am��.��<x�V�6�<�I��ZY�JBM����$����LX���4�� i���_6��$m�,��$vd!oE�AM��<���6kT�NV�d������P6�tX���)��
����7������Y�U�B-Lq���]Y�%���|P��U�U����+j�����TU�����c�m�)<�n�����Y��*���?��!��Y���}�f��vzz:�4�����f=(���Oj6�Xi<����������������(`�7�H���E�f����ivqZ'��xI�<x ��������gjYt:��c
L}�:I����[F��o<����"��x���#
���!df$s%�n=��wX�'H���T�!��\*�WI6�%���BR)�P�_4i%R5�(	�A��{xP����u<�G�&[��:�A��&<��x@������� u�"d_;/Q���D�z���K�Am9�������6�*=��U��y���$(�_��_V<x�z��[+(x �q(����8V�@/	y�����x ?
V����xP��D9�W���.��*�)(�����8hjjBUUU�R�%gV�����B���-�:S��[�A�w��^�����$�5�L<������{%��mx���C��>��Ex�~�W]�V�@Z�O������A�>r�7�5�} IDAT= ���w<��+U{@���(����x ��?1���)0��yt2�|�J]w`#k\���������+v�P�a�*T;E322������Di��4+�~�q�R6 �Rvh	sY��A^�S�*����G��uB�9j4D^n���^��)(@�4�SG������c$���m����%5�6++JJJu��J�7�ZSXX��RWW�V�w�Pu�C�>I��uv�j��U�*�_V�#''�_��r������������n\��$O��u�����a���f���Q��<��5kE�K����:&�A57XJ�G��z�V�>�����?�Q�u�JT6���

(�F-��r�+���w����V�����:�������
}�K��k������I�B�s����5?�k��r�s���A�L�eT��z���&�UW��r���V�s��3�A�����0U�C�����ce����#U���������A.?�Z���P]���ni����1H����\�Gt�L��]�g�4�\��.L��V�w�$�aj9������l~�0�����$�� 1\��8I.���#r�����.IS�������H\VP<��eB�u��ij_7�K��W�^������y�K�I���]V�d�?���X�$��4�Y3[���������Y���e�����HII�#B[[��o����]m����!�������2a�J���x�T��0���j�����Y������0?���k��,|�	���!�������6K�J��|�����9�%�-+�v�uy�$wB��������|�u?�J��.����	Y�?d�?���4Gv�m�J�5�� +�!,,KsT���,����G��z���4-�Ciz��������eAV�#�|]Z#B:vda>�<!+��,��0?���)-+���0a}*���Fv����|�y�.��r�/�#5�!�������5���^Yjj*455K�Z��b�2BmIVV��Lz�I���|���Q]��f9Y�&����k��6�]�������,���`�\iii��z-�_U��������Lvv6o����k��
i=d������F�2�0a�!���FD����|��-���,����|D��[�%D������5q�[�������O����gqk���OZ�	��O�|��P\O�~>Y�����Sm���~������������K� �!+��3u����������k�u�}�B2O
�r��'Q����d�����Yi���������;B�|LK��,�G�?d���������0_��������a�}(MBH��5�%+����f�@��ea>"��=*jfO����.-+�!���BH{�W����G��������A���xP��.+_��Bf����-��/bizBV�Y�a�*��]s[����r���4-�J��5�%�!+�a�^��,M��P����-�?j�CiY����0_�����Y��0O���!�!��soJ�����,�GX�
�!��]s;�2a����Cj>�!�A�w��|�u?�J��.����	Y�?d�?���4Gv�m�J�����5��� ����4GD�m��|D���|,H��0?��7knK����PZ����<);����P:�AZVd�?����F�t��J��|��������"+�U�uy��4F�`�?�����-�S�^��m(�JX��b��)��b��+���3�������_���[z_��|�����pf��
��#Z�H��F6*+������{jd_��������vf���#v��2n������
K���a{D�TZ��A��bK#���#B!X��B����Y,Z^�u��q��������]�p=��eI�W���]�1�"��B�^���wrs2k��-� &�f��Zm`oj��r��OK���~�q���4L���	:n�}��[Pw��Q��Z�fI�( Y��$E��x@1��o������5��
i�/��A�]'a����J������0���UU%�� -�VU����s����8�_G�d-��)u��<���c����2
����o��B%u�
C
t��S7�WQk�x_$��H�m����������r��H4��n�o2���I�C�����*(bS�����ob�S���=I
	�����#�A9�D�xP{} ���Vjo���e<�+�����@����}���������^;�����lMx�������(��{�
�A��+�����PR��}�5i�T�{xP=�I��H��E6���R�����}'�A�����[<��1WW����</�+K��{S$���RB���z{�������5	������������*����T�w�CI<���a����xP=�	�A��&�Rx 
/��x���C���#�M�����?������}GN���������y�e3g�����j
q��7�s�N���&n�y���O�m��c��_�;+;g.\���?�������z�.���!#3�O���J�G(�����}_�A������w<x���S	�����|c�������B�����LhnmU�R��~�ffZ��W�L�<�]��F�@<������9h4D��d���+!A�N.�����|uR���<��]/e^<�Q����@�:��z���7?���ra����+J/o�B��4L�F:Y����o�"u�
h}1Is>������UNT�Rcg�
���R0II��rE�vT��m�g�]���n�>D_��h`hSU�J}>��wX7�{����\��������OZ�����������Cc����������_~m�Z�7��J��9Md��/Q��?���KG��L�r���3�!}��(L*
��1�G����Z��F��<0�TG���<)���8�,D"w�n�'�#(1Y�r���;���;��������_�+�-i�)w�BACN���_������_o����c��I<
�y�-i���z0�q�����[�p}�
����K�^�$����},����>+��6������`�`,������$jSlr>v�O��!���z���Y�����2���.����/%j����
h�����$h6���G�Q��q�/�P�M�"'3	1������y_��g�����8<:�-Z[%���2J3�B=���NO��SG��:��W��������f�De��,�u�i���4�������yh��
����k'���7e�-��@��O�������vJZj��~.������b�( ����T�o-{|�p��0�h5
]�?/y�<����+U-��m�ge��K��<�������PVR�/�7c���(.T���5����O0jh_�jM�E)2:���h�L���z#&Xa��������������=n����T���.=�
�d�xP�]*���xP�o�u���O��jB�6����
=ljo�H`9�^�V�������:��z�W���x ��R_ �E>,�(��A��l��W�|5���'y��,�y���J���S90i��:	��sI<Pj����!���j�t�.E���@n��n�4���^����&b���uxtM�����Z~�N����ba���*�6I<PRT��C�`��y�i���x��gr�@�������Pl��g�T���mE����._U��<�d��8X����
����p�U��R�K<���3�G|9���
����e����~�U����vH�����w<������Xt�g���/s��~���	�`��|�OJ
r�O�k�>YH�(@�V���I<0�=��,�����+�����F���~�>�y9���N������u��#�c�
�'����+/t�M�3�ey�Q����O��y�Q���F�KB�������6�#���������z�}��a�S=8�uh�x_$��Tk�VTh�`�7�������thCQO��m��}]�$��Xy���m`��#�����fwj;@��L\\455��*�A2q���<���S���iL?��6V|S��sC��j3���r�����Ustl��ek��:�L�
����L�
��Z��gL�5��>Fff6�uj�?�������@�.�h�����l��#�y<���(���#�7�bQ����WoC�`�mZ���u��h�u��|&|��@u����<����B�%�������������Y��x�R�u�0�C���
8�T:��?�+���3���-G��K�u���*���h���zj����u,����t�4��H����x<���jI'���*Lt:������h	#����2���Z�����-������a�m�E��c��?���9�_��A!�/����#pw�Ef*���(�k#;*~�V�F5Sc4j�Lc��_���^�K�Q�R~��R<�
�G��tO@��P(��UY���}�O��2���4�~���B|L
�jJXp.V:*���
+oFp�tU1��)�������`�.�02
�����	�0�T���������d�'g����p2���*D���3A��[c��(0E���,ld�nvz(����J�������[�h*�X����p!$���m-`J��OF:��u����W�y�|h������f�
5%y�������`�v��_X=�b��
j� '�R�[�3+�P<�W��w=i�L������vXV���x|q�@�UY��M?h�y��1���������$��>��gBbr4�X�.��BKK�_��=��'�T#���P���[!�M��\��BE[�����+�~��MW%�D �?(�C��JP3�'����T���<�����<2bP����v)�1����0X��xq%���L��@g�6]�x"N#T�T�X�<����2R_������lI� �n���"%
j+�-'��6+�6����e�V�$���G�wQ�6���
�+RH
):�`�C����B�p�2�S
~9j�E��0HO�f��v���9�J*��j8��C���F���z]��e��~`jZ����+�e{E��oJ���g�d�9Cg�����
y��a���}_e<;���EJ�������GV���
�Q�N�_KB`>r�X��S�*!�d��4��U{�R}��Q�B���Sg�b���� :�����}���SV�����3}k@��tZ�6��>����{�����F^P�
���|feA��o!�����O��a����9�)��!��A�={�������b$N�:������D������|9uu(��#c�d�<	�Q����#
��Q�����9e
��#t~KU�C��r���mT��
j�����Y�<�OMI
z|�"�N�,�2[�DTj,�:v���v�?��|?R6hg����l�w3;|��W��38�Yip�j�!Mz�J��
����,���
e5��Z��YO��ZS,X9�[|}�7Ln;����Az��c�KOX��c��U0�6Frf*~�3�q��m�:��{6��}��tn
�%h�������o�<�IP���W���K5�0��<z��������q��|v_��v44�������"�#�C�9�u�h�?�������3:�����'���]�q�(��7������:`�K����}��C3����=s0�|e�g��@ME�w�s�m�~DT|8Z:w��k�*���YG��	,�������^�PUW�@�QR��Mw:,��-
����JD�#��%P_�f��2YG�NyiL�	�k��r�^Pi���i(������A�����BNMY�� �������6�������{����+(��F~x �S�����LSD^�?��o��w�IQ!��
��b�&A��E(��
�
���t�x�6r:����6���|K[j�_��c�
�L�D=>W��BJ&J��0q!��z�o����<T}�����������r���5���}r�*���|_����
�o���
�>:���>����q`�L���5��HN;��+��17�o�1�9�6���!�4n��M�����Sv��*���1�us^.��w�?.z�}G
���@����ikM��<�������aM0����P'���A��2
�[6��*S6*��0��	W<�Ae�I��J�K�m�������'�zuBhR
��t����H�C-�]���CjX:�{�:W<���3���Bt�d��IW#���>23~w�t�(4��N�	�;�
���/��n�<s	�;`<�����<���x4n��O��3��Cc��:����8��v{��9�[���-4T�p��Eh��CGC������G���=��w����[W�E\�XC�2�E
X�0��I�>H��������`1��5����7G���G�_�"����d����G"+(��h"|�a#���S<H 5��n����x��A���r��4�1�E�F��Y�o�����Gtp�[x�2lh��Hy���;P�
kU)�w��'����O�,
��G�7'@_[c�h�w����h\wM��+r���-�`���/7'��Lq���C��J�w9
a14�����A��������F�j�1)�1��&��H��:x����wER2`�^y�y�n=L����w3q?0�4���������q�J>���M�R��]FV!oGo7u����Eo�2R����o���w2�(�h����T.��S�i�x]�����N#�>l��En���g�#��&�|����$���!��a�����A�I�9�&��C��w�i}��O����]���/�U������"@a.���Q!�v}/��E���Z�A��4MT�����0����p��D���p�W�=��@�?������&���2I\W��A�Vc���=����p���>n��|
w/cd���og���Kb�ik���������G�/�$��d��:���t�=0*��}�	H��Cl�
rm�c�u-���_�c�:t�����m��	�\A���Xm�H��A�Q0qh�m���f�:��}$���@���zL�� ��!�oe�c:w��.E��_CIU�4^��]G��=�p�RDP�����\���B�J)���=�L����	h?a
����?s�=�?3��AjL��o9]�+�����y*|!N�H� '$��/�-�h�����8d���������yk�d-���F��@�_x(|q4���Y�Gu�Q���	�
�����k�R�Z��P��@��@������5AB� q��?3iB��dC ������o��;w������>�5>{�:v�8�}w �\�*M@R������C�9��p�tvM[�H��]��(=���������@n������x��8���)��������Ue����IP�M�o]�o�&����#�FR����p]�����:|
��O`�h�s#V��\A�x�d��~�	�B�Y\{�����g�������W~�6kj��7QU!+���p/*�n������9j��G��c�e<�t�M��H���7~��{�U�su"��x�F��5nn��hN����-��������oJ����/q���������T;\t������_�~�R)~��jH
X������s>7O����*�D��MY�8���o�}��:\r� ���S���|�s@��U�^r� ��
����{B�:6������{���9�;6M7���_�������%��<s��.��!<,�m�&���Y�3<��J4����K�>��Z���(6��;���J����7i�
{��on#���|
�9^�k�b>tz��x��>zN������8��F�F���x5�0�T'����9G��3���S0��C���!��}KG�k���:�l�&�ks�����-������u���K~�V(h����>TMQ�B�������?�_�����E���W���s���h��7��W�;a������	"��_~��'�^����!!�x \2l�u������	�o��=��4�,'��%��%?O���<��A����9����<FO�#���D��O%y�@F��������n&8�� IDAT�qS�����_���s�I��yNx'7����	��c�>�9z���/Ep��#DE�o�(���58===aoo��� ��}nv�^�����S��x~�1�����ZH�{~	7�����=q�������K�S��x���\���j�����\|,����OE&t-LP~�p\�1�-�����\��i!%����1�Lo��B.CK�5~O$BNl�^�"��u@%�8�I/�
�y��
,�	���>7��s��0v=����6����=1��=^q��(7�����.<H�C#������f4*��PhZ�
ko���K	 T!P.�)#�1��;f~Q���!�z�9�:[K�A�N����� �{����<���a��b/��S����;o���.!F�<<�`���l�
��U�D�� ����6(fc�o����V�X�����g��~O�)T�`��ch�\�_>��/Zb��u��x�R��;W�[�_P��).\��	?����r���jTO*FMD�����r��^�K�,!��A4O�����=
�}/�����2ez@G_Knp��g�����y�\et��3�@A���_�(���|��
{�������`���H8��%%�}3-'Oe]<9��~�6
4��17�e�}	 DT���A�_��PU�e����[E�e������#�����`@�������]��yXo�)��Q|�>��{r8���!n�
G�����>a�`*8$(�n��S==����a6`F���!�@�@
O	X�����;��8��������� ��"��xFkg�^}]wD�����e�Ne�H� y�M���%���g���&�;�����E������6��C0]T������7�VE$��JM�H��Z���^�>}���YS�<�uk���77�tG�����A��+7�]a9{6�G��FaXL������k!���:8 ��	0xw�
�9s4>bHo�
��@�F����E]��3b���f�Z���
����W�8tr��u�vw�@���!������@����M�H���C����M/t�vD���X��&��GO��(�o�j�R����CvN�dn�?�E���~o�G�"����~<�����x����+[�U�n�w��=Ur,#��E��L�b�n�d,i?
��C�bup����
4�5D�b����
2����3��(l�����sb)��k	K.��8�?����'�cN�1Xxf�����>|Y���=d�T��YgO��j��%x���ZLm2�D������R�~=�����O.��]�v�O���r%*��s�u5��F����'x�`��;�bA���n�7��8�A�/	0�$p�E�w�v�6"�b�
����d}3R~�	��=�����>l]�K����X��7c���(������$!�v�f�lna�������-��������{���*x 6���A����mr#����s��p3�!z�Cy���
A����n�m_*�m[{	
.��r!�y�M�V}����]��kS��#�ihG&^���F(]&��i�
mD��f�D�,nNLZ��p Pj>�����0������'E�a��t�,� mb>u�T.��s�a���+y� ����5b^?#�T���b�Wi��s��x �����"paH#�
!O.^k����]+T�{J�R�*P�
����^��_E�S��������r����}
\*���W�x�1�^H<������nly?�elH(�kn��M��I�q��9��P�&�53!p���\���7z(0���6�
�L�*8Tn��(]��=$�Ps/����
Z1_��p*q`�4+�����>z��kK�`Q�:z�4���gF�q�����0��;�������Z�0��j�MR;���m(��LB��s�Z�F��}D����=�z�X7�].z��fB��p~�f;Sm;5�`��y�j�4�w����n�	�.�����h�X���B.`�h�3����}������q/���������Z�8���������F#�����7D��i������rA�Zp�_�D��gp��
O�^C����V/���Uk������U�2x��	8Ll	�o��������Qu�)����}����������F�
����4& $���W���c�xaKK�t����EH%������@��1��x�tm�x�Y�0��%��G�R�����zY�@_��JaF_K�s���W��6�o��$P ���z[�7(�	������`����hW���A(�cXl�t2M������'H���	lu1~����"�����7���`�
?��k��1���?����<8z=�,t�RH_�
�Jb,��`-�7�O|�V	����l��w0�K�7l}��%�N���������L��k(=�d�=�y���=��C�` �w/�Eu�y���^��A��C{|N�W�������<$`^���}��;���o6��w-��P-���%
����7a�5:#�?��G�W ���C����x�/��KK����������RS<���:��:6�c�B�|.��t��3��v�`��y���������hJ�)�Q����7������'a�\W���M����g���a��q�G�x� ����B	_r3�W)�g���
���M����Bj�A��V���0�x	�x�q*�|�l�v���~C8��������`�v�{��_�����F\#L���z�p�Np���+��U`��;�kT�j�����|���t����AT�<���d9�z��=�Q�a
N-���������}���JmN
<���N������@��__�4����R
/����a�����Q���
�������$;�Z��h^�v�/��#��3�I����MP��1��F�f8x2����������/`lo��-%p{�~�UQ��p�q�u��9;P�c
�����3�%x 6���Aun��[v�~�pnRk���&y�Qirg��
s�^"H��&��t��h�i4�<G{�G�m�q��(!n��2��N����C����^\���W�����8�~6�h�J��������������v
��2���	�	�w��
`���h����Px����hQ:}k��o�����	P������J^���A�������aB���������v�����`J�������&�^�
=��E�}����r��|�H{_H�39x���r��������q<�-eR�2����q�
���=��x��gO������(8v,�r-���m����y�)����S���l�_��Sx�d���F��kD� �C1	Z5A�o�?@�~3���N0#<���l�������F(�>����K\�W�@�Xp}���%��id"x`n�����fJ�^�[��<�5~	�����E�|a�o(!��'vbV��Hh��{��l
x����O���B�`����n�zv�B�*���bE
�����A��{�����^uB	�����W��Kl����������N�d���.�LTPH�B)�Wn�e��P=�6$���_��"���`dd(���X 5d<�)�������
`���BJ����p��X�4Z�:\��kBH���V*��5����'�~���U>������Z�M
�@�bxq�	����;19x Nn���>��d;�T�����0��H\��NI����M���@��)��UA��u���%xnM�wJ������~L=5�'%Br� 64���s�&F�;�4�I�������Xy�"x�y.�3��@|/\*T��������Q��El�SH��jC�?�/M
sC&'�PP��\��H� ��8U���5��Q�`�_W=��2��-t��� ��WAhQ�y�0�j3����LD�Lak#t.�/��H�(����=�����5!��`��W�E�B�/e��D9�l�0��g�}����t��F����X�[�7�����9�
��:_`�����x�M��Y��(�T����5��3�wDIn�)X���n��#d<�x��������7�l 6�c"�p_@	��Iox�H���q�0l�&6�z^���B0�m���C<���{m�x	���X\_*T�$�������e� N��S�FVZ�0���/�E�F�������U���$�����Z<HpI 6�Ktd���iD�% 
�+�U^������|1$��W��d7Bz��Eq
B��x���8�����`y*S��j�)b�,w�G�wc6�6�qx����=
�������(����H ���A�����w�����P4@�@"T��Cx �H���_O�NF����[�!����	s�&�i�Z0������0���lX�n��aY���!x��E
�J)�^T�	$u��_��B�����x�������U+X�\��_�����D:�m[�
<�U�� ��uhpa����Bu���/`��\�}�=������.%�+��9� ���y�@��fz��W������y2�6����{�*�*A]�����7\��|�|�]����oAug��a��j>
B�;!0`4�t��!6���=S*�z�@�e��*�7�e	1Ttxw����c�Sj?5��T}�	�<&N�GPfdP���0�������[%�`���PLX�~�����)�VI]&\|v�>��K�($!�
�� �yE������\-���B�<�e����c0�D��8?��aJq�V@
��Q�56���������	`$���F��g�==����7%�@@�~�W^O���}�L�Q��%O����S�|w��������EHp��G�b���1��|�
h���Q�����I��%���
���X�7��:��^Jl���*B�@�Z�80j��^��eo.�r!�c2���^Q	*$���s�ZRA ��]Rq@�Xy.��Ip!�e�}?WBz�jA'?O/������;�`:tB,�����S�x B��.��
��*��[��,[�PI	L��_�V}��������	�tKWM����xrE�	mL��S�=%�@���U�K�u(�s���@nB}�r$�����8(��G�UdZ��%����l����bg��>��K	n�z��k�����0�y��@�	��1����T�
Ew�\�C!z<�-@������_����U��:���o���G�S�8�R��?<B�SN��W
�<)�g*��]������0�nU,�t�AE�T<P7��?w���
����&�r�4ZaY�^,���F��w�7kf"w�Q�cZ��xP:j��o^��sS�}��>a��9���xDF��*7�x���;�d BRW�F�A��P�hi���6��8z�"=y�M��x@2��L�`T:��8��7������qy'�Y�Ob)��W�����F�y�7���-0e\�
NHP5�������w�J���K�Di�~���f����)]*�qqI,���7p��C���%x �&Q�H����}����Z��D:���j%P��0�}BD$����JHw="��jBM@��~�g�H��gn��^��OEXaPs�8���,�\��G{�`�2?�����R�n���(����%T��)e{k�D@����c�� ��#�(�7\�v��Vf�hI���
�T5����~���n�O#��(f��O^EaO<�n`�PE�
W�t�i�OBA>���\�[���&8�/~��$������Wk���'7G	���!A���3�P)�J��cj%"������~�<Ru|�x���?�����{�K`C=#<��	E�}
_�k��~�-�~:n����x	R#��/��T��f����Q�Dc�Yb�����k����9F�S�	�I	<�6xx�
G��
yXN�����pB	S%�Jl������h����s�[{&�|��*�>5��2_q�h0A���F�'�X��������z9N/��=���������x���6	��L*�*TN��S���TH04����U�}�i��*%�1>��<A���Ddh�TU�c�l�m9��D��C����c��������`9(��L7E�Sw���ps1^I+��x`T��{Z����^�y������#QhA^��x��<bJ��<gF�t�FIg#��N���J�A�������:FTt��vU��oe
�U�����\|��g�m

��������J� !n��me<��m$x��baXw��<�0�#N�y����!����A��D�sWq�� �Y�����<����dU)�Z D�o������q~5��8�-~��t�l��ZV}�3=�`��s���e�
�	�P��b�\�J�07���N���vb�����u�E�'$�K�������rR�@��n���xw��X9d��<J��{���14�2�����D��e�PX��%b�������X~��c�/Z�%
#��9�p>mD�8��x����p�U�����?J/_�[��q����(4~�SU���Q�=y
vv
����8�s�,_��3�-����J%�&n�����6��A�v�K�����FT�pAR� ��Z�����<����BR�����U�f�����j�?�����{W�����o����T�U��d�Q<�@uC����du��e%4`A���u�q�5'�]~l����j`��]����;�b��o����=�GR5!iH�P�������KVa���0`�R
I��e�*��23�p����6c�@�u����9�����Y�����=���-��xp��f�������|�h�*Q7����{N�����kO�zd��	�xyJ<����������^qG��[�����8�-u�<j�:<��.�cR�����c?w�x�C��p��y��w��i����<��,����.���	�9h��sK	<���t,PK��������[�J��>
���M��H�{0m?!J+�
z��j�\$���J�Nv���1�j�x������S���o�x���KLiPIR�Q�`�}o��!�/]TS���A0���GJq����	�[�C�=)x0��� *���Yt�o.��F�
��<��-O@	���=���.%)�I5����)� ������T<x�?ZMt+�����=9xP!��I��
���X�gK�����+sO4>~/1��0c^�D��!o1*�&�9�����Gx��(UBF����8���Mqm�^����O�-6��P�@�` �)���T�z�I<NP��j���
��A�j��=�x �#��.����u1��o�Ke���%�&�/O�'�<(�K����$�s��n�TSxy.���������P<��e~��4�W<`�Q�T<8�B�|��#�t�@��*��D��zx@�QW�vBT<Hp!�=i��.�`���hX;S��*Oc�"���xFe��T!�I���3��x \&�����T<H��G�#$bd����a���c��`+]Y�R��B�^�E��T��h���m����?z6�V�o7�-���.O)������)�eA��G0��_�JJ�ss�C��x���2_�C�f�v�&xw����x��7�����EYB} ��q�8:ps1l������z��g`�$'|��D�qS��E��� �
"H��Q<Qa�q�TG���>T<.����/@$\���BI�s����z����u*�$���,�����������;���xc/���.������&ba�I���P;�icnx7�;��<����������w��S��y�w	��I�p���[���w��]	Zc0��B��Q,:������{���mnt�����F�5���%�9����n��BgK����&C��6���\� �������>D���`�M{{*@����{��6����D�-A�?�H��U�uq� IDAT�C5�����@n,����8s��[��j���Jf0���o��^N�x�����v�*��
���gxM��@E�r <0h$�yf[����|K��Y���#������&��!l��.���A�.�k�*��.D�������c�_����r�
W0m�Hw�R�������k�']���.D��S@���Q?������D�Ui;D?�/���
f#�!pr�$���[W�)LO� +����(�?Ot��;�����SU�rd��I(^��(�,\0���
�	�Pq��}.<��M�	�R� ��6��<C����|�&Ra@�Y!���v��v���`:5������Q�1�t���D���2��D����A��%t��<���@���fJ

�N�� \.�R�Nl�U�����'�S���Sx�z���i�ht�H��r��w|r�.}T��_5�������s��<@�����T<��}%����g�x��-�w%��]J��'-���a�Dw2�x`R1�T1���GA�Xx���D����l�S�`�X4,���oa�]}�fA���:&����9�R
�������������~t����T<8���S"x����D�e[��+�q�N	���������F�����&?t0��-�&!A�@�x����GZW3�nDH�x���]��H���,��A�j��~&�������#��Y��T<�\T�c$]�F��#�	�;���H�	0��P�a��Y/���8s7�kc��0�k/�.��z'���K?�7{��TK������N�}>���`5�=8�������<T���;����5���\-X5���mr�*�	��%�y���7O0Fz��'!��u�>����))����������u��,�v��1�r�"��D��P����B����iX;��m�J��������s�P����k����A������z�R�T��]V�o��p{y���D�`x����M*v�����O	<��������pM\�1
������T����$��u]�C��S*P�s01��s�#O���*�n?�H/��A,�S������[����j=���B�DP�Z'�NP�~�D�))4���B�J�������#B�qu�J�eYk�`�j����V#$�P��O�sp!^J����4
�]���%���|_�st�x`�������[��
�i%�D��i�^S� �**6Te�����ZB&��2��
]�xE�����oD�����&��B����[�U��k��
�D��h�z����J~�D��/���i��4x`D0�����9�?��~0Q��������*o$xPyjW���%p�F�� XR����	w��T���I���;���<��2RC�V�/}�`�`h=�v�����^�U�AE����4��==�`a��|N[�}}����+
��V<Q����
���K*$<h����x��A+���g�����Y'9w�9n>�Q����\��2�xp��.���a���q��F��������%W<����
��A��?������:��y?����~������p�P��a�@�X��y��F�N����t<�:��@�`�>�b��:�*!5W���"����Hw
-����]`DP�q�i����������a�	��h��AJ�AR��k����*!������:�������|BC�K\sb�v�:���T<H=o<HfuU��wP�`~�i,��J�� 0w�H	��h�t� �p�0rp��p�{�A�r���B��EC��c
&(�����j��"�_k��t`��@I�[M �~�*p$i���;n�uE����DQe�*qr�2��E��%�r��w��t�����BQ�C��IW��QD�f�B�'�RN�Y�/�s�$�[�s�w�s��=n��[_�����|�X��'V�����:x����*?���?��B�pq�?�2��������K���2�����h�������Xty�\Lw�/�:�k&�"��KK�Nw|�^}~��'���(��Z��TD�Q�Sb���-J����?�����p�E��+%t}����<VB�!�q����y��r���X,���$�-$���A����z�?����#u�!h��0��w�A���yy���;�TU�@Wl�2�y�� <��p_��%�P����������j4��z�.T�{N����������o�	�������J^�t����53�E����C�
s�����Fzi�xp��������n�0�q�J�Sf����(G��!���-�xHW����.(O����B���G�@�)�	���|D�T9�I�CC���=��gf����LP!�"DjW|r� ��%F5h.��W�?�Q�{��A����G����y��"7���p����)�R��G���o����E������{�I�^�Sn+7�A�*��2������������,d<�k����p]��B~?^�@�77�����H�+��n���e�;�S��B�	p�^l�?�)zmFi�U��IA�X�i{1���h 6������
�rC>�3F�O��{{���{<��b�<�e�iN���E�pq���@�B]@��n�*�pE��z�u%����H���I����He����g'���-��{<>)!��[���TOxu�
e��������Re��<Y�,\�
�^T$�mD~I�+�w���� �&r����D�6u���;
]-��x `�w�T� �CM=<�����cC-j�Gw��_]�f����Tr6���EFB����g9}}��"�������I�k���
��?��S�fa��M�*�����h�������y��O9S�_(u��7�J	��Y��_H��#�O�����_~�^��0�����~7+�w�&��1!��S��#�J�)%h��w0e���9)U0a���B,���}�>,�OG���& �

R��C��.x N����P^�K���+<x@Xi���r_�+x���8�/TD����{��R��<��n,7�_�����)�s��n~=�B�Q�*
�+�KT,
��i/�����nsL��TJH��/����p�������_�
m��/\`.����7�9���Ra.7��O`k�=���I.�3�k��T�)��{gR���v��c���&� �5���D��q�.N�U������<�����r�Q�6�P�)�_��0Z�&$2���`������?�����������e��trB�U�>RR<h���_N..��e<:4�.<�_��psYG[+�RC����F�^"L�n��~�|���J�,�Z���C��P�y\��G�������K
p�]�'�
�ox"�_���n���\P�~����'�W�N��wbBGI���S%�`��wh3��{��n���M}��? ��h�Y�����/y
��^\h�t��<�8�&t�K����!h�0�2HB	�|:��N�B�-�P30��
�'N�4b��Y���a�g��n��]��B�!6�G*0�����	�)F��8��������#t�B��jF"�����#���))XRE�y[���x����:���4k3&������-���$�>�'�s�p��2�� �N����C��s�
wr.g�5���8>��{��3�=Q�1�t� ��R�R�F��g��*�0�r.�\�����T.�|
y����s�0��qs�%]-��������$�L�@�_H��#���64����N��p�c7���Z����.XO��4U���M	<�=���+vOsu�������A�3W��sc�m0��1T�������� r��=��
{p������Z��?��bS���
������V���V=��E�}�l��V����%<i���A,r�2]^�\8z�"V��i���I�����������5��[O���u�z�jB���_Z��V�7�����/?���{����$��f��5��������FE�fi<!����; �����	�����t���,"��"�/��J\��E�!���;�E�/�q�bg/UD�/]��8�8���$����8�.� �����Z0�;N�������O���������oO���9!�����������~�����W1���p\"��1�nd�mg�0�m��&2�C.������V�js��g���x�i]�X*l9"���T4B~*��������hc z74�*By@�whZ���9!,��>�x0��_
�F4!T�<u.D�����7	� ,��8����/UD��o�IU�N��Q�P�6�_F�6}����2�i�am�p�=
f�Z��(��
��n"FVH-�X7��T^�����a���	���SI�4��2aE��[�[��� �Q����9��>����6#w�T6q�&m �Q�jX��FJW*q���^7��F���
�����0*TV�vH)��x��H
��M��G�V���M"x ���'��^��t�?]<�*"��E�����9"C���s�[{~�pk�<�t�5��^A�1��D	����A������w�<pe]s����"����f����
�~�������<�l�Y�)hdD��	|����
��x��s���aO��:|������B~��a�~��/��{&�@e�c<�����Y;�����%~I���l��-S	DTJ�J��Ts�o��m���=
Kx���"����n��Lm������+�^���8�g�\��wt)�2��[�^(��[�����+?C�=>�<���xE���+�D0�E���\S\�:�����qj��!���.dR�>by��F�j��_0k�a��r�bD��`P��=���x��]�4�;�|�[���N�;����*��;t!����?�a����p��+_{�0RR� ��F�/�7��	���~�0�+��`��v�{����-������+����
�$�]'$��[�H�@�������F�]o\t����]/D� ������E��t�pf�_2���$U�;�3C){_�`��A���x��>�7�+������6|deI���s����=�U�u��Y����>�J86�:]G���[��H����O�Q�]UH	����x}.}����������X�wy�'`�r���G�	�ok�_��T){����8���x��y�!<�C�C�E\����t���`��J���J�x`ib&�]	U�;�0�:4���K�&�.��ZCF|��#fn�K���C�p��}��#����y�8��Wiw�<EP�~/������g�.@��]���=T����br� ��u����6��Y����0C],���-�]���|3���#������`=�Kb�RR<��:����r]%�0�����i�u�:</d�����x���b\��?d(��&�����"�B��Cp��3�����Q��0�������5F���M��Kgw��7w?.��������t������bT?yD������P�~w����K=\=�
5�X�!d�<�\�9�P�O���IT�{���9}G�w(�.m���t����p�/S+�n��T���x��
x����
xF��a�g����e�7^>�����=)^z���+�x��\��Z�u�W|"�xP(��t���q]����M�D����sA��A�`���2�2%��v�{/?*������_�nA	�R�@F�u��x�V)�ZH-���Y�S2����AF�H+MJ��-#%� �<����'��
d$���&��M�19x���S2�gZi3
dU}�#���2Z�P����p���!#�%�ZP'�&��NyY7-WYQ^v�����&�W<�D��BI]-d�>���7���fbF���2�����Bf��4mJ����V'U�u����&�Z�LE
y���Pc�n&n�td$�������^���������S�����Y]�����jA�L� ^J�A�n����f�EH�j�cU;-��c�!���d4?u�����*�Ss��JZM�I
<�t9��_j�Af��x��|SJ�<P7M����4~RWi����B�xi��N�>F��GSq�4UNF�I
d$}Ji���79x��|��K	<�D����x�J��'9x���� �U2kt%�b���
x�����d�%��<P��@}�}�)� ��S��xWv�j`������sQ����<�u�FA5�)����� �h��4��P#."�sPK� y+�@3�����	����ph���2���9E��g6(�Af-���
x���� ������TI���X)�8
x�q�})��������R���7�d��
x�1�i"�h���yh�)X*^�=IP��X�)gY@��?� �� �3�l�T��A��S25�4�XQ<��I����/(h�[����������x�)�J��I���
x���� ���_���T���[]2n��!�d/x�9�����
x��T����M��@V��C4gK%���� �;Y��� e�*��n�eW�
x�]�W��IP��{S�����B>���x�T���g��%)����W�����d������d�v�CJ<P���a�f��
x�1�)�A����T
x�	+����������<��
�[�gi�6��9��3&�i�]q�����&���OT�~HPz4���e\�Z���0�d�q�C����c�
���BDDLMMe:�<�0�0S+u"G��#��#u�|W�P�y
��}pp0����A��Vx��K�V�#��Fd���$N����������m�Fi"'�@+��O?�,66A��ZXXh��s1�4E�Q�F�L/���������Y����:y��������m�NY��-���w���������q(
-K��,+����{���VV��yg��q3�2���5����G�Dj��������0AF�C����!&&k�����H�]PN�U�#��&��y&F��I#|���E�	����3�6J�~�DP�?��S�DF�|�R����&���"�_e"��M���?UZ�����t�f���V�BM���}\�����x�J�v��`��z�����Ou�	���7��
���T(I&1��p�-�R����y�.�����of#=3���h��'��Gr#6�i��g�~Y�^����:d6��1?���F�Y�v�����p?��yO������2����A�����`��|��j*�T�I�?"m�����dUC��&r/�@c����fhZ�vVU7�|�����Mv�!*�A���DP,��<��R��5���'������A�?>��`5��A�I+�0''�GLL��}�<y�h���%/�?���)(�77��*��@N�>rJ�����Jh�J�x~9e>",������|$��dV�T�#+���<s��O�f���*UNx�)����7��G��a��?�R�����MN�>rB����W��
x�Uw=%�i<��n�)be���c)i
��A�IK���#'��2Q����|^9�?�����M��S�CYX����|^9�?r�|D��g~<k2e~�Ikf>/�?2oCM��S�#�|]S#B3������DN�>rB(�C�\���%��GN��(���F�f��)��O<8yh�fzI�E��b�O�bRad����p� ��>� ��-1��������5�_N�!�����Y�������������qqqR�Q�{�&����C����j���{"��&c9��JS���r}dw��{���	��:�?45"2�OV�G2_3�s�	�GN�e>�����	���������ne>���>N<�?>��U-E�����T�����������x9e>",������U������}/�	�C�{Y�������	��S�#�'��?���]KJ���������Bd
K*�r����(�����&9�?B��S9�?r���?>��#'�G�5\JT IDATEs����C��Z�xN�e~�i�+�?>���)�?e~������^��?�1�S�#9���)���#bL)�����r�|$�������JM>(�A�wRNy+��KIk�LT��������-���rJ(���N�S�#'lt+�����O��g�~�N�S�#'��s�|$�25u�����)��?45�5��2?��5�KN���2Q�s55�5�ON�*��f���r�)�����+���F����<p)d���@�W^��*��6�f��*�O�_�b�"3�6i��0�)��ZN^��fz��AL�/����!�LKKK�������z����all,�-$
:�q�e�1���2>��P�q�����dg|!����[[����F�V�C#f�H&!!��#���]����#�����lll�}~�����,���)���
�����QA�Fn��|$�~B�^�����>�t�h`��~���#��&�G(���;J�����V���r�)�?����(�e	�O�;��=�S�#�<����������G�Z��m��:������8�#���%T}�E�-�c�5^�:F�Y����c��:�N�J�&�V����pF��,3U�H��(K�e�$�����]����4R/Md�������*���Gju��
�N�K�V9�@�z������WY���mq�Thq���s��
Y���G��F��g��O�~��|D#R!��HhG�������5,Ls'F�N0G��-�w�I, �C��x��b���G�
*�gZ@�������S�V��R��R�?j������i�d�z���;�>������4��8q�\�k��6=��g:%��(P,�X m;��#���y3����lXX��������������I�]����-�I�-�*e�k;gW�*�[���Ff����fS��^������d3���[`��'���|Fj��di����*k�GF����������k!�=��=��[j\����� [����GU����?�C
�������R��������3�GB��������L���v�`�>^�%�V��?��4����Y�����4s��viC���~JM�H]��`�����x�������fFQ]+~����v��hUgHb<<H�dJ���� ��A>^(���o�)%)P,�X@���
x��
x���<��6�L�
x��i>�h��J��[@��H�k*��{��Qbd��@}�*��j6S�<Pm�(�|�P����8<�x}�I����x�����$��x����R�f,��7����c����P^��4�=���2vBb��M���^�"�A��9��E��\?c.�4c�s�����G^�bP���7$��)��_�P��.6�2�w������2V2R,��4
����'Q�p����k�w����q�F�F�6*���hg\����e����^S����'N�����T�|M*������y	,��R���H1�;���T�wJ��=G�r5	|�r&���
5�
��=c�j{J�5�x ��k���e���
�^u��c�_H��%��W���]����mb��?�4
L������e�����Vj�#���R<}�~L��G���0��N�:�_��8�\4�YI�t�F�����3��XqeZog�B�VU��s4���V������|�����*=3���L�j}��\�a�������Cy��[:S����S*\�����u����E��NM+��?
����M���~��-?���v���-���hZ���i�|�W����A���#��t���/n��f�c���j�Kk�f�4�����J'"j��f���h;<�{3C���I�6}������a$���B�X�O}(�P��.�R�I�h�������I�Yi�L[s\Z���al���5�pwO�N������S��2�
���#�����U�`��%�`L�>���V�m4��D�"S������.aX�JXx�Z8�����b<�����|Y����(�x�2xI�tmc�:;f��i%��(,_�
��A^�\�������O�/�w@E��p.��L��]�P�\)���v�����o`����4�X���<�X���7���k[89�I�[|��Y���SF}+���D�o����f��_��j�EI����d+����M�Z����:��N�h�W���fj� 
Y�����{�����<�������0�l��N��K��E���jBM�W�����x����@�+q?gh<8E)�B������?	���\P���J�BS�A\tB��i�>P����<�a��,���d��hoD{xA��S�M�����S5h�������$x����{������e��O<�z��}����������H�;�F� d7x���N��)�b����)��&�^X�I�Ff(�������G��v�[$f�������`b�z����J��$x�=���]��X�r�'�u����.�W]�^���.��_v�lPZ�$x0�V/\r�
�`��<x��t/�z}�N9<Ho����a���U=�����_#��\4	870���H�=�R�^�Z����^��#x���D��3=�������k�b\�~�rj�����=�@ �W��(����_��"x������F1[���O����A��S0lY���"��~���jkJ��3���K��������5�wc��1�����������B����Bf���x���[w���cX����sO�>�:��0��6a��}�p��5����v�
c����:p���\��X�n;jV-�bE
j|`(��D��D��x�P��3i'���Oh��w���������I��+��-�w;m� 8�mCj�I�)02�Bp��7C%#�T�����A[[[���b$<�x��x`Y�+LJT�y��D�j�t�� ��Nh���l=hq����+��_��L����+`^��{�G����x��AO{��������:�6��=+{�Z������
S��M	<(\�
;Zr�ka�_<�������o9�$��P�z��ccQ�
m0��>8�Xbr��X|�4����F������2��v*---L�v�M����.
a����L�4�,r��se~�g��#�0��%j�5��T<���s���/S�T���@y�U��;�P.��	
B���P?�3~a=��I�N%����7O������J��X>���w�<hCE�3��� ��U
�Zc������MQ?o,dYNl�Pn��������1�u���P�D{�d��9�(������T���z?���.�f��.�
����������<�my&���#k]A�� � D�1�����%jBl�y�}������,�_�N��D���[A3<�}��]A�b��r�w�����q�����8�����<����d-�����o=`��3K}#|�2��gH��O����|�^����_�e8�x����[�N�cA���g������H���-s0�Z�}o�6�Br�V�]���=� ��Gb�(A��:H<
�����-��*`��	�e���5'a��%����B���������fR�`�C�b����3���p?t�6
z:�uu1B#�`]�J��U�#�����hQ�+��u���F�p{}�+���+����Ut�2B���7�V�\��c�����g�A�Z��F\����K�������m{����x8V�'M����T�-?��w:�n9Q�.H	<���9��:*VA��
&M�*�@8���j"."�n7�q��9������}JWE��Y���1>�`T�5�� ��n����Rm����8>�B��:��@�Lu�x`T�-B���Y�o��"�^f1�0i��/#��%9��������w�'wC�u�~�}�����������$�����Gp��.t��7B�Nv��B�)�F�V�r��T��D�:�i��������_���c�c�'!:*u��������+���T��d�l����ph[��m�`��l��������3��Ku��B���Q�]���cg!��v��X]�n�����q��qcD=�A��)�iX�:y�%�`��C6��Y�z�z���k���C%��<a)V/
�
~���_p��-SCO�v�L�����z7����UF��5���A>l>�&��|Q�)��t0s�<�z��.����/n���p��
��h��9�����A��bbb���o9��V��HI�@�(x��=:f0m�~������A��+�7�?f�[�>���Q���\�
:�m�8f]���>�q��ht��Z����z���>�R��X�T<���Y��c^S�ym�`���)�C���yp�/��V����Tngf����+/o���P%D��	�B��_ ��-�\�?���5
T�9�K�����s]	��A�rs�}��8�~G�N �s�u����	A��e�����b�x0���p���O����:�6�������zd��r#��3���C�'X����,��?/i��L7��/��p����G�amb-�S#����s,��:~^T����M^���o�e}Y�'����wd=�r��~���9^xbZ�1�txrq��U{���;������5��9�~9���E���7J�3a��X���gtY�Rh[��{���i�1��B�%r����d�G��������D�'�|���P�������!����^S���+��))[On[V�Fx�{OB���4����`b��%
���_��s�@�-V���c�-7���xp��v<~rE����?��oP�|sD�����Y�Kc���o`c��n���
�2���_� _�b��~F�~�����]j�&��h��B<nq�N8n^C��l�G�P�
����;���}h��W.� 0@���i�Mj�A�b��oK���.�G���'.l���)*����;m��5o|��B��0����k�U���H����6��~2����w��>���}�������-F�����F3j�dD�Y���,�8y-��{�_���c��:�e,��7��`B��Xqv
N��A��-�E����{���(�XF*�b��+Z�w��r[RR<x�q����������_J���W@W��|���������d���c���Rs�����	�^_*?���f���������D�D`��I��ADHI��b��P�"t�.���,����.]@���(*XP���{��{��Ml1j�5�EM�-�X�cE���(�"(����R����N�<.�����s�����MW�����k��g�$�/�
���$���::�����a����
�:w��$�{��yz�
N����S��:��U���X���!/R@���<j:���B
iI�HO���Y

���w+	����	-E6
&�(�5U�i�S2�G_���e��S��HE�zv�����T��W��ih�Wz
��dej�*�~:pK���k���r�/G��Gh�m[$/��x����"�&C���!��7���������T��y=�u�����;#y����K������_�"6$*4>��)�>�����~���0���<�a:p&T�j��0`�/H�����O�6��Tt����#�����?��	3z��l1�����=\z}�z������W?SkCLj���.#"1C�:�.=�_���R���r���g�ud �(���������@]I��)K�@����wG������m�
����;�!,����<0\��&�	��O���a�BA�������bb�}9��-���U�7���GU�FY[��;|���MK�z�
U��1��
�����n��ABj������*�(�Bq��oM�M��n�:i������t�U��-k�
[����_�uq�DcS���N�}�B��g��G��T�G��@$�%S(��A����M-�dY��Hvv��}c$��	����=2SS�|�1��	��V�7�E�#�h,W��E��[/��7�����Fa��EH�u�5�
}��4;���ASS����f+W���U���Ud#EE������6~v8���L���u��X�q���u�!�X'n��	�����?w�:����H���x`L/Mk7���Y�Bp�3zJ$2������������m��Q��+��������8�����!$��n��1C
\Gv��l��'x����~��I�*D���@q�A�NO��Df-�h+C^/4`!7x����k���S�'G�Z���&?x�J��#6���I�l�
>�h��&��<(�B��{PP���?[�0�����x�{!�
k"�6��F#��_=F�y��v���YB�6c���j��7!#)���rJ*�E3��8��}���g�����GZ��M��7��C���B��*Q#�z��C��$�I��>-"??��]�Hdn!R>�! ��6�'�m���I����
����yo�i}��S��
e�A\�6����=�aq�.`��i�������I����6��	 haX3\�cs����vZ
���0��
_z��c#��I7�%�����\�`'A
��T�s�k��Z��D�#k7��w�hs�#�z
m�a��:��t2���Y=��
��n'x�3���-���+�p%x�#�X��E_8x�a���^�V<`�7�
�Wd0m��q� �����-�L�k�ywOc�h���X$���^,0����������O��y����U�'��P�����D<-���&]K}'F#4)�j5��c��YO^���@0������>����ET'v}�_���x^�W��UL(��c0��-��F��w�N��\�������&�Cn���o����%� ��*�aPZ��h������/��o�=��������Q�}@��������w��+�����M����;����?��~���0��������_�'�[���w�a^�N>��	���C�?�|	�����:�,p��.��p����Mo�+�=�@�& �����faF�M�zu�uZ� ����6O���k|�~Cp�R�$����#��;\��Eim���UkGD5�~�V�q��9n1�����D&��1�m�mb3�����-�������uwG����������m& 4:�^\C�6�$nHq�AFb<�����9H~�*V�hC�_([�B�zR4X�1�!�6��C�����*�uH�j���
Z#��Fj4��
B��+T��#��>�L����j(T�D*M����h�&���h`���k�=�[���B���G�B�m/*c5���C��P���6��s��R�5k��I5[�����v����<j?N�m�j<p���
z#�6��B^�s�_��"c�wY��'g�����pZ������'���m�2��}�������5��2D�tEFx,���$5���	��BU�v����
�?Au����LI�Rc�G�A��)�g�D�A�u��Mku$^��JK$�y@��P#w
�.D�y	���X��A���I��M
� ��eh��G��gwG�(R<���������&�";RQ����1���I��6�#�0��T�p�_�������/��7D]��9}�8~��O��8�c���F�Cc����������q�y?�����/n��s$
����=���#��TH-4j�~hOEmI��#��@�CO�v��{�,�F���@�I���a�w(Y�DFD�Ym0���r����
���6�'��GrB!=���t��A4�7�@P������u}(�Z]��KtOI�Z�`��b,�4�h���6������=�"���u���>�V{������ �/
����mdl�a�-����K�f��+�����F������@�>����K`M�[��`�k���0��!�7�cn�i`������v��9�q�[��0�l��9x�.�=����F&Fap��<?��a�����@�a�����wv��VF��E�a	n�V<8��TU���]���K��
H��:%9 IDAT��Jsr��������GxMB-��2xa"�y��w��
�����S���O/(P���7��>���]r�	)	����d��}��&fO���M B~�Iz�HOx��F�.#za������N^���G;\����7A�7i ��<�zU
h��s�>X���_vC�7�����]{i��a��i��6�6���5l�s�LL�	��1B�Sc��8{~�t��64�}�7?f=b�]����<�I�����TA
se��C�<�0~�>�
�.���xp�l5&P�C*>��c��$�\:	�����3�b��01����`��0	w�������q�1���P�4m�jU����S�Hj���F"A?�����z�aW�9~��'�7���o����?`�������a)A���I$h��J�x�o��o	&���WSV���wxO��	<�~_�cS�`���h`B���g:�_�"a��9�-A��x��Vq����m�ffC�all�O�q������"�)B�R�@��� S�9m�z�i�0�^_�d�O30���������d5������9�i��G�W
���������#|?������)I(<`������������t���*4��}���`��6���@�o�>I�qY��
�����|�?<P'��)M�k��s���m<�G�����R��KlGi��JtH-D�6�_^�G���
�$����w��
���p�<u
~��z�4�����}E��<�m��'$0d�S����a3H�
r4� �MCT�U��q��]�G�(:~����s����D$D���4]\[�a!�5�&g����,�����@����,�[�6"	`�4�j}�
�'6!5:���A��#Lz
��������������^��B�C�w�J���e���^���{��=�p0��o��gW'hS�L�����]��A�Z�`"2�n��hK�g������u<_5zg9N�X��;���GG`�,��F6��J��7�w���c7�-��;2�@�*���-�9~W���~�u�4�>Az{����vM�|�%�[���7�LJ�������6
0��l������(L;����h������������
f\��-����.��0�q#������L$����s���v+Ox0�j�	@=��������k����Px��<�w�y9��Z�x���8���A���P����|u$�|��������?5�X��O���?���3���� B
5$�t��m=�C�����i����V��<�C���OC�F�~@XT ����E�����L����He�/�^���:c��3|�����d������/�y��-�9y$���s��/���G��������#�4�6�$�a�|���]*v�27x���9|�t�����_B]� ��<X�u�L�O�}����0fX_I�[��h������8����I2u�N'>-�����>?G�d�bl��0T-Zn���P�4���������ZC$2S�E�R��w���w����!��R�����������9��
���~��*~7��
|!��t;�D*I�k�&�/5�=L&����v�����.Q��4���>BJ�r�p0������8	���;�t��	W!b��j��D��l3�!��Nn��jAv�O@BW`���q����`���}/ � �����z0�=������.��l��:���F�������f��6��)|�����=������%���t�_v70e#��{C��?���]�2���wNbc��5������*d�c*K]���]0� ��E�������%_�p��	������Y�m��t-���W��~w�V���I���D��T'����;=oEH�L�����si�|u�>�p&��A5�s��T��)���X1�@�M��4A#�).������$����i�����zg4hW�>��Mn;�>r=��D`���PR�)c).4$����<	p�m�����{�,�7
���t}���r�_V^v�o������JG�B���.�);0D�$�@Q�;�u����D{��t��J�������6�9���4&��=�0�����;H��N�~x�7�^��?W��#���0�����GL��*'��������5�l0�>>�|v�PT������A���v:�Z���F����po<���$���I�A�P��V23���O!���v�C��R0��x��2	2��i���}oif
�t"��p��A��j��t�G�P���x����&P�n�T����!����6Dg�����������������n��sh���>rXA�@��G��PJ�Y������+hC�"�[�Vv���iE�����-C3(�V�E:Mo��C��ssp���I�Me�]<�S<`�6m9������~|����{p��x��h���6x��u"����q�O�|^��r��5��v:�����)�}h�v*UaZ��)xHB\[���o���-^U�J����t��z��� ��!8���
�����	����E�S.���T+(.j��)X�i%WgA_�����Nd�,`���Y�"��*��D�v�bMj��t8d����#��i"��mh�iG�
����i�������q�\H��5-�K�0�`j��xC��s��d�O8z� ����������;���������e�ZP�w�3`����0�i�����1�|���$I�tI�������NPmn�����3��?q�C�k��`R^�E�������A<�h�@m���7���{��ELE��[�~�5��>��9���S��g�\r�D�CkXR%yC��IaD����?�"��/T[6�6�y�������$����<x��o���S#�zgw���o�.���KiN��u4^ov�A�3���]-|{nW&x��CQt�U
[��G�������&��x�H_�������/�����d�3Oo3)�v5���V�\����j|�/ZV����9/3{�~�ML��Z����x���\0��^SNH��l��>�g�L1�QU+��5��WVcF�I��^��{t:���k��cD�A8�q>��0��?R��m���K8Dq�����J4��++�����s ��C,$%�M.�
�L�N%ADq�K��Am�i\�����'�\����gt�=�F�����N���=��W;�x��%fE)
<
~	����5E��cp�i+�5�E��p��;���rRi�������'k)��B*���G����H\����G�v��R�]�L|��q���wG8�k+���2n���(Y����4�}�$��T���T|{�NbL�p�����������,�&�i�h�l?�u�W�Px�N�O��Ff
���>�I?��Ohka���m��������O$��!�����s1��B����5����yLi?�+((�����?a����{jN\��m&��~�U�	���x��;�s��`?���W\h��bl�i|L��p��4�q�0��T<�9����9Y'u�{������Yg���&S����i\\�x�K�p�8� �J����GR'�$�S&��xq�S_n?[.[�N��M��PB+:��R\%�@�L������x}+!x��]}R6M�@i��p���Y�HmRI���t�E	��	��Nc?G�7G������3��Bv����������!��N'R��:�\!tZh���t��Nj�eW
|x�Lji�n	�^"(��g�:���[�������9�����B��B}������!��A��<���/�Cs��<���Fmk���
�g���)2{I������1���ON�����b���;���4����R/`�A6X���1x�MkbGi�%7x0��0,��-���Fu9�0��h�����%K����T�|�wo��E/���'�O�N��,���Bq�����ceg{�_e����R�s:����p
�3�������4��v���#��<`

u�u�-����������	,�t�b�/o��G`��%I��Ux0��<<z}wIQH�Px�L�*.�4'���}�<���]���ny\�%T���-����<�?p���U8��I�VjC���� �0(�j��F�T��3���j7��oq��oR����*x��fN��'�c��A@hM2nQDO3w7Ifc������uDz!�w�1��<�|���	zPG�%?![wAM��`!6.?����� �%r�A�2v��3���!��Wn���Cn����;�����m[`��SP'�gX��R5������)��Pnc�����7A��A��r�NAnhi���_�#���~Zg����H�U���}~
������o�^lc�A�&*�_*x��0���J��H|��
$����R<eR;P"Yv�����c��|&����P`�Q.'`8�;�<��Uv}�<�����`^_u��4���<(�B���,�@z�3R�R�X��[�f�mX�	�������$�x��s&@����x����Fn"�,��Eov�~k�!|���gj�4<s��\<�����l��m��r�������&�2�y*{vC{�������e��,X�.1�D�R<`����lc��|C�^���������X�����RI�3��M'�V<���-T���N�3����~�(���Fn��J�62��Y�������M���]����.}��	ThQ�)0%�����J�.x�@�=2,��d�C�m
�k	�G���Pq�������>�7�����5�����J�9c�An����O���w~�����]L��zd�����\d���H�FvX�q�_��Hs	B��l!(c�4(
<`p�2-���a/���j�CLL��w���x����j���w��B~��d:���b.ZY�����0�������p�\'$��klb$�5�����l�|��r��Dy�~�g���5-��i������t5�d�<�s;�
"��w���lpxp�dUZ�j��+.<8B�
��+�r���$V� &i��HF�1bm�f�IHt���E�j$���NP���d���Lz�0=S��YD^�:���W>
��T[t���W�SV�j	�w���v$\;	�:�H�
�i���h�f�(��Hy�^<�?�j����),����H�F�K��n�
���~R<��N���NGD����@�?�	��]���K�NK>}|�G����@��*Z��AT<�����b���!�Xr����4RH&W�x���-�I} �m.���'�b��x�A��I����J�1�d������6�{4��H
)�P���:W<PnP��#0��)hM��_��#���1r����a�T�T�!R��C�SCr�@���l%n���E��L��+��p�R��=F��m9x����-r��U}��s��������s<�<��b����G�fm��v:�]j� =*it�K��%���hT��;���4Z����
!����R�=��o�]1P<��r�J��"��g4C����;{<A8��-�=��&�w'����Sk��Ia�>�#Ht}��a2�r�2�))Tx�6������������gx���?0��H�6��yo'.u�U;�����x0��w��w%�|o�o,���]�v��Sb�3�,�r��7�����77p�D�I���S<p|~���r�Ly��+d�Y`ua�S`��IA�?WI`�����RI��7)����
^_����!��8l�c�8�E���V<�X3O/��	��2�;��g�o�i��/����!�6��:���*�x������7<>�\��'r����ZmA��$U�A����C^��>_XY�<�b���X�e>W<`����cl&��^Dq������fD��vN����^��Xx��!�'��'H�@�6�E4(����g�%�ZQ����ch�j(�	uSg���p���q����PD�{� `���U^vn��k7wa�@�]%0�����N�����=<<0�S��-�q�1��UH��T�l�q����b%w���^x��6�/8���>��*�
����A����i��X�i�X�@����X���qQ����Xx��&�"��=�-��	3���	,�]���s��������������+���uC��8p�(WF���k�=�=���C���

&:Ui��	������=��J�b�q����e��c�w��'w@=�M/6;q�A��$h`��I��'�YL�����\}uC�=�u�;���,��_����#H(.��4����h\�*���b�E���P���=)����
W%`�/�S<`��M����<����Z��;������ ���j������H"W$�U�����g������7wQ;_=mG���S����8����������A2)��Q�{�$�x���]J0��l7��5���H�X}H����,����U-������I�K0B�{"�-hq�
�jMY��'�D
)v�h/7R<����k��z���t�� 	x`A�B��:�7�;��T&�������k����������������B8=+�{�koH��,�k�!H�{����hf;�$��]���DR��AGr�v�q~��*<��?�=:�}��lM�p��|��7��Eh|���
��05�A
�W<�v��*�A{�L!�����_������A� <���r���'0� ��7vp���B����B�u#r5w
�G����*������j�"��K��3G
�W��������$zj��T�:��gp��`yR$;L�m��;��<ph>��GR�xC�g��Wx*xp��	T����!Z6����6M�:����t8������#�vh������1�^�b��ix���}^q���!7(�����n���^�l���������<;@uc�K[���t[6)�o
��[�X���2I��o�kA�:D6�r�����t Q���1�F7r�PK�7c��@\�p"E
����^������<mhu��#_�J%Z�����n6		��e���D+��$���Zx�yu�/<��:j5�o^��:�+��M����M���N��&g����2�G�7��o�����"��/��Uy���l��u0��P� �Nqk5�I�����]������'�8��zM���7I�����SQ���f�D.�".&M�4��-aH����-���=������oy~��+��i�<{��]�f��$H@���9V����-,������u&YoH�B4��^��3������z@p|4?������4��6�~~��m.��~z|	�(�N����{��a�Jq�[���Ng��6!W(]	`*��"�,�
�x��ciq�e�\����
���	j�F��OR��U�|r�����;+���VW
Ee���Mn���:r��Lo���x:� ���v�6�3�9��������z1����}0D�w);�zy/O}����W�B�
l�M�R`y���l��V��54����2w}������z������p�\%<��4�4����zJ����l�;\}��c/WQ;3{X��O6������f�L��)�"i���s����
q
����Lr�_���o���e.<� f�9v�m����`!��E�q�p|������a]�}x��p|��C
t���;/?<�nX`������C@|R��-D\R$w��O�q$��a���s��A�|��L%uZ��%p�=����V��.J�}���_p��x0�~N�_��F*!��]����\���	�����3�v�U�\���<�����S���|���v��A�#�we���AS�u'���F������:�cH'05�7�}��e�>��\Ax�@���hs�mp�@��:]}4<H��C��gn:A���P�2��e!��P�R�a�f���
�'���t���I���B����{�C��H����VH$��'"��bTKh IDAT�;Dj0���v��qe��������Az�$R��
CZ=7���uWm�����[��H����=
�\x��m�v$�����Cx���l��e��~SW�������C�nK��B�F�����`���)�^�6,����(��&����A��}��dIa����#�m=��,�S����0�w� G��5I= zs�?������ ���"W������7��� #.��������M�����t�>�T,<��d�Vu��SJ�E*;�C�O3��
��h\�M]�����D��7�)s6.��Hm�M��@�v�i��;/!G���H���sH������B����E����9�����M��9�������q7�M�Y�i=g���K�H��,������]��8��`�g�:m_�T��e��_4���_�A ��R=��������q���b�=�
�h=M4��Z8���N���x~�Jc �]D��&x{��?�����(`������U����H����4�5	�VM9��I.T��B��<N<�X���>�=4�t&*�����[S�.C��B�S���P����������v�� )����u����0���M�Zu���{�N*L����8F����AO��=�B"��������������������(0�CQ�ra�0�
V��hU�y�@��{��2CU�������p'�[5�:�����>�y���W�����w��a?��V@[������$�zv��+���5)�|w~���76�<X��=��(�2.�\�m���G.
����m~0�`Sf`�I�w���@�����,?N��Ac�����������%s��ySW��D��,�;05
�������~g��m�g�U����x6����@<���a��U���%RO����C��?�N]��^�s��~M��C=s������m�g~������%��c������������	b0��[����(����A�'7r�L��k������K��q�s��]����0�@V&�������
�k���E��afZ�+tq���W�F�8���o�Ca����w������'��x�V<`yt��E~��iO%�OG�W�On����������6j����ga*�S��sQ�A?�������g
�ql	t���7�f
;����S?���G�&��v����8}�/L�I��.A����`�PxP��>��,���=���H��V1`�,��U��a*��].���nkl%���'��Z�S������$|E�~�]�->��Bj��	 Q������A�j��������P����#�b�������|Z+x��w��6-sq��K�{�On(�����0Rw��}BO���!Z�zv}������8���Y�"5j�c��hcQ?<��tN�����)w��D+�n�x���3�#~'�����!���,���cT�����������u�c���T��.OM�;�l��]D4��I�NnR~:s�Iy]T�����*)�f��G����������A�Q����W�������K%U9���icU~��%g���h���r��S��L���7�v��W`.
S<�<[���g��!�����<���K���Gn�=���+�Ftm`n�]i>PU���`���h2L������������0�4�J�-�"*��q2���R����\
q����A
jx|8����#���z�0�;����8�h�[00��5�3p�W(�B�A��H
y�4������7�~B:�aA����o7���6�������`J��f�J�r��G���-G� �����c9L���p�)��a*�����#-#�w3l����� �?7*��AK{���E3y�����c��?�
Yy���))Y���,���{~@/4����Dm���jHsA�����N��+��.��D��=�D*O����j���Qx���^|����ZU3��'O�[��4����P<x��t�|	
+\��U<`gB�	��F�I���� �����b�6��'��~���u	@�����|�u��P���V� <�V����Vr�/��\}�N��ugV�O�4�D���cr�����E�I��io/4^����#|����B�-w���L�2��	���b
c�z�Ms$7u��`�dg���3CriW
I�raC��
,�r[k$_�C�!��e.����AW���i���]�/������R��$��y�alZ���4`��o�����s�`�����m������=y���
C��)��
��	�>�����B�5��+<%���^��v��dz�ZOy-�=�@;���q�L?�`�O���B��;e�������jA�<X|<(���.��
��Ed��8��$��AI�&��L�����OV��>s���L�#�%	�]-�$�����$��$���"�&>�:
�,P(
<���TT������Ka�����.CxP�u�.�8W�K=��E��Y���*��Bq����K|i�ZX}s�Z(�51X@�6��=����
YH�gnW���$>Sk`*���L��<Ca���E�e]va��W}������U����$oq�AI�)mq�AI�,
<(i�B:�[ ?x �$dQVE��<�E����(�"���E�%�����
+�R��D��Y�
����W��|���k?V/���vv{�{�<9����
��j�"`�xP��w����=������K"9UP��9w� ��+s���HHLBl|<F���l�
�"~GO_"���XhT�NY�!�/�xP�
��H'q�70�����kU��A��&I*<��JB��[@�s���	��9�
����������4��, �Y�,�������m^���4��}Z<�R<`��*��Yz�� =3�+>d�)�$��JR'Y���O�:|Z�9y����{~xP������c�
���&���LH��x����A�W)D,P	- ���xP~my��/n/�eX����BV�, X�, �YF��r�l������yiJ���XO�i�@�6r,�x��Fx ���A���1D�Q6���*���L�@��"�,��Z@*������@���AF�)?�%	, X@��`��S�AV��A��xP�6/M�xP��>����B��[@>�H� �#���!B����HoW<��fx ���!�`�/�xP�
'���x ������, X���x �u�AEY�d�
�A��VV����,+�[��@r���B��E����, ��[^$����d=E�%X��lji"%9��@���_�A�:DI���1J!�|���(m�D	�@�u!//_��**<(?���F -:�������DGG��*&AII���K��NQQQPWW���r���3QE%^�?�(�k{Hk���C�|*2~FF"""```P���I�B{���2�$>>k<����I~�Ie�?*K{���B__������H�Z��eei���0���{D��"�%���_�|��r*b?�����?2��"*U�|i�Q����G�\�;J�&������D������c&�n�Zr:P�����9������'M{D����4Z�*��('C�����=��3���)sKH��KC���d^�4���2%S�@T��!M����U6���n��#�4��H[���$mF��e+��U���Q�6�3�dR/Yd"��!���*���Gau��K�B�{�V9IEaJ������W��'��eBV�!G�Uz47��PV���$����������'��GdR!	2Q�H�|
��,:�����i�),,���PU-��dq���\U�f'A~^��SH+X��Z��v6_��������Kc@<(��d����GE>�e�*B{�����+==!!!�Z�j�2�RW�����GLL������g�3J^�=Jn��HY���.�����QY�#�_	�Q�N���#%�[Y����,+}����'��o��LQ����,{��y�C�mV�)*K{T��kg�=���K�we�������C��wB��s�A�w��� 2+�/��AE>�ei��rT��&������������\�� �*K{������2�Ge������gY� �ei���%�G�m(�*�|D����G�&��0a��,�Geha~(�{SV�T������B{��g�>��2a����C,x�|�T�[H�A�@%���w����^YBB���40�L^�s
�>���PQQ���U��H�%*��U��HJJ�n�d7$����=�{,�����	vjj%�
/��W������Te1--���H2�d5T�����CV}�2�G�-���U�(}>e5)}����2���=������,Sd���|nk�^�0��R�Oh������H����{����4�0?��Re���G����?�����PV�Q�cAe���+����g�.Eeh��2a-Y��!(��^R��Y@P<���, ��@,W|��AE���Be�?*C{��,{v���,�QYN��Q�>-�*�|�������=*�|D���r�)}^����6�eB{�������<���a����SW���0?�u�(]~���t��u����a>��VhY����WY�#�y�A�������xP��^Y��Bf����5���,-QY�����DU�=��yU���K�d�CeiaaY����yU���,�a�^��,����,�Y����(�
e�Ce���uY���S�#������!�eso�*����a>��ThY����SY�#�y�A�������x �*����/��������
99�/������Brr2455�y9yj��������!#6	��Jl�d�L��K�gZ������%%��Z((j N�J��E�%">�������y}eU4Q�d{q�Q���qL&-66�����[��Pvnb�R5��,���,�##&	�q2�~����GI
U�PCjz����L&�UU��(��2-4#��-Q�d�V����=tT�
���FY�_$]CJzV-�P��P���$y���j���j$i�V9���E]��$���. 
��hT\4��^E.�����,�V@t4��������E{���&
��aR�l�r>R���K|C7i���V������C]])��A��n�f
y��$�<�#r��!�$�,6Mi��f^�d��J�0Hw-�Z��Z!)��@Y�Z��zBD��;MS�5�i���'M%UC�1=R�$�E{H[����0)z�,M{�Z�"M5A�j�q�*�SK�g���yV�����T��Qbi����P�l?��a�/B���,��4��L����$�k9$�J6�)Id����av��P�K�E�E��F��
���6���D;��e^gY ������`�2�?���GeX��ui-�� ���K�M������T���A�k����U-�$��%F����OZ�/���������_T�Ye�[`�f�m����v����K��^T]k%Y�;���/;i{����,�.�<��U�_X����b�A��� %��gP��U�F'�^6�ej�����U�e�2�:���3�(&��e�W55l�B��mYf�Y�����q*v�Z��Ihp�\����'������A-~�a@���*e^��
�#)���k�3d�z��,�d������)���L3�
v�+��	qK`c�4��Y���'In�����>a��6����D9'4i��JuJ����2��0��.���_�J�*�_��	+���Rf���V���'Hv�koCDG����Bf�*�
�����k���IzE_V��������.���|�a8.�khdR�GM�I^�������r��xPJ�Sr<���xP�fx }?*i
<(���������\��p��A��?<(���U�����"��X���+�����x���x �&>?<���x ��d�BdmQ!?�c<���x ��JSJc=!�`�r�@y����cx�6Xs����-���/p�������aX{�,����h��T�u�D�^�Ef��'sg���.��k�:�|	�@z~.����)�5���G1���Xs~~��XV�FM�����x�8�����@z�IQ������������\�t

�`�g����SS���������y�����'������6&��z%AKM�^'���*,�>�p���sDb�h]I�J�KR<H�r���)���j��FesJQV�f�:���z���`����	�.W�����GTB�[������� �;�����GJ|Y�����7J�sV����/H�_Y��;��Gw����L8_�A�z���Jnt���U2%�*�Q����������II��,�&U=JY��AXT\</����I1��t@i�VdZY*�g����
�dYyY�)�O!���������1�e�2�,��Rq�i4��h��[a��w��>J���d�MG��3IJ����<WY�������h�<~�N��'|��}g���}��e�B<�x����j�)��b��>R��&�,��*�Pk����I��P@��0i���fHrG����w�������[7���ph����O<���E�;���|J�.rD��������I��
v��>���/�0��&I/��xe	t���[��0d�!,�Pl]rG��W@�Q�8�Q��(w�6�)W�P�4�|�bT��T���8m�����������"��q���j����z�T}Q\dY*,h�?��u=�`��R�mg��%J'IAx ���.N]3tl6���/P�������6��d�T�����mD\b^7j*��1t=��,��6�k���q���<��6��I����.C�k�:s1	�N�����L����>�l9�m�R��K�!m_:x�M����e&�^'�����c#�)���l��4��A�M(Q_x������=L�� >!���M+��=r�"��X�N��������
P�FAX�Y�-p�y����b�w������������}��2j���|�p��(�_L���������y�ar��I~����� ''{���]����c���������o'7x�L�y���������<���S�`���HM�~"Q�5��G����\�����i�CD'�K��P����4�����D���������6����/
���������������"0�K�����"�}-NJ��b�m�f����v��&tn���������t���W��G�
����	��#����������x��a�n�DF9j:�<���,�l�����v7�+R��e
$�9���\����GF��L
��
���l�<8	N�L�������;�P�nS��._*x���������s����u7D�w=*���(�&x��uu�@�],KW��������_��������-�>Y��
Gn�����Z����d|�+������Ktk*A�\	�n$|���-���e��*��x�D~�����o�GI�����^�I�Tvqz�������fn�@���&��	�Oe����L�
��"-]z9I�QVV.+����5�Tk�Kw���H�z�jw�HU��hJ��b��~�F�Y�#�
{.ya����R�P��8����$%���]K<h��V,���Vo������=��
�^�@����^b��^��! 07n������������W{�Ta��X0k"���j�.��:�?�����l�Wo��@��B,P�J��G���t�{B��^	�������_�G��?�����>�aa�����e���E_�f�4l3}����
t!_l��v{�������7�kj���/�e`p��A�����A*�������=:��4��s��cu��u_����t44p��+\�y���'���=�l��0��I{���T�X�(��[Px�j[:��@��D��sH���D�Q�S�� IDAT��NE����Y]���"n�\���;X>`+�G`�����a!���(�Ll�L�g��Y�s-�\��*"c,�&o�_�������c��
��Ct :��M�X����*^�q����;;���E�����'��L��i)b���^x������AQNW�������?	��1�L�C�Z@WM�j�r�R3�1�Eg����|L�E������)XU1A]}c\�����CUu��t)����-
<�|4�j������|L�0��&pt?Nv��v�9|��h[�����,4���j����}p,���u?�Q��� .9{����{�]�%W[)L����<~��R5������Q"lk)���-��0P�����t�.�����S,�3���f�� o��d0E���L�%8ACE��c���"F��S<X;B��G�k
���[	Dj�����
��T4�u������i,�Z��x�Ls��K��;#�~���8��P���F���>|���X��^���s����	�o�^�5{}�T��H|t����T��n�����
)��i�t���;�.c������L���y#��vE��\�����95�S<L����u�� N��@D}j4�_4�\x��/��s����c��cX2�;�EtQ�,�O���&"����K'v��oP(��40�)j�T��UOz����M �\��v6�lS
��W��������)4#�vR��|����������6p{g?L��N�������o]u5��������P�-U�����=wt�o�>�����L���G��}��jl������{�PL�}�������igun��p����E����Diu���O�r~%�!�bK��8��ti����-����U��t\Bso����W�g�k�.$�����V�#�U5>F�^��o�7��Nj��z&:v_�������������v��B/�a����nR'���5�C�����F5������p�y���MQU�q��3Z���J���1|�������Y��HMI@bbW<PQ�Ac�����/�L�[���:V7�G�z}���xr;"�����b~M	q��{{���E������<p��!~��_�I�������H�Fu����N�T5��^����;���I}����k���	���_�`\�E���o�DRJ<:�A��v8vm3������1=�=)���8����r?����S�0�a	Dd��������`��N�9@������R_~'�����?D��?�G�_o���C��GP�]���|����L�@�nd��#��+�ztE���4V� 31��Wia��>Hy�Eck
������x5q/N� ">
k�>��$�3�"��P����QMO��5���!�JL�Q�����PR��O���b���T�p&5�����%=���1�!I0�V���dW9T�����������u����g�Q��*�)����!�W^�Hs=yF���~&0��2	�8� �N]'9�D&����Y�X�����.��t@���1P��T�����'��6��D�8?M������J��0�T�2����3��|�F�+����PE[^�����I�����U���hj���w�Lt�:������Q!�pI����/��{WP���]�4�q�$T�EP�������sf:��F5�#����V�����5y�7�S<�9 F������2n1�Y��^a��>�����/���d���E*L�@�R��H�����##:�sk#�C2b���hL5^FZP�d��M�����@�N���h��N�Ybw��BUh2��)!\A�g4G�BN���bw���pS�x��Ji���(����;���p�#t����
���x�t*_�P��AS3S������<6�vCD|6����H�z�wq����/�n�������s����%z5��x;��������y��v�iNK���O�����G�Z|�k���e��+������0\�}�%]����{<{�=��C�|�)/�t�*����;C����i�����LYZ���	��_\]aG��w������=�[[�������%	E�7�N���,E����=b�����a���p��h��
CR��������������zK|�
 ���0n���"(���B���==%�$R<�����zP) 6"N�#����(��z�i<�K�4�}p��Y�>����O�U���5c3&���*q�@z�i;D���i^�	�?�(�<�Mb��@X`*�����7E��}�X��M�`E�E��+{"`f��m5h��Ai��/�uU�~�6"��h|Q�����~�pfS�WG�V��J��09\�}SEtA�=^���un�]s��Ccg���~�j4P����.�}��W
����Qk��_�!�i�._!��b�8�h�46EG���oIBr�����U���G���~�)����#�����s:���B��KM�U�m=O�">,
���w+	��8_���2V��s���l�1�����D�i,!�'��F���U��Z�����������4�5j�=�~@-3�j�����XM&����4��W�!��r�=���`��O0��A���f����y�	)10��D���$11
S<��Z���<~�~�Z��X�
�����f]>g�x�c�����	����9���4��5�6R@�����mI����7K�9�:�2��������G�X��x�w�
w����fa�����
�����N~��=�����D��"(O��AAW������094����,R�V�KX!����y����o�, h�^�L�����O�(=:�[����	
�������z"-|�������������c����S\q���1Dt�K��J�^�����kzV�
�qa�n�6�����2����g�>�5N��Z��>�N���-Z5�
�F=F��"v��{gVU���?���
b�(bwww�k�����Zk������-�XX(Jw���3,W@�^�E�����g������9�����Bf��Z�������O�a��x�������M��F�x����G`���RS�����8�0����Oe�.s�
���y)������u�#4�O)��7p�Fc���b�9��|w��K�@���f�lH��?Z���2�k��������K�������<�����qt��5<*��-$>�j1�?�y9s�f������|
\��_i��s-�~~�����L0(!�B����,�gW<`����K��
�=��b@��020���>�{]]S���o��1����G�o���N���M��9zV|~�����Q�
��I_C������cJ����[wc&��a��������s#�����������8�<]a��[um��X��'��B�l��@b�e��v�A�������!9<�����\I����rX��EZ+W+n� ���q>�v����y�W�T����Z���c�����-�������#����<��3/���F�������"�	z��3F��m{����L���m9���>q(n���P{��s���5�b��H�@����H����oZ�+7�����}O<�C|�h��?>{�:h���U������e�6�:Lp-$S���F	r������ek�S?���?{�v���'���~]���Y�"��.9P���:9_�u/<y�����R0<���#�|��O_`j�_R�`*VnD��
H�)'	���V=C���X�&�>q�������u���.\C���D��R=K�D4�qf�4t\��M�1�S��}X	d?���5o���qZ�-8$��h���8�����~�����/0x��a]|�����_�Y��Y���~+�9z�!M����x`Hr�	O?"���d�����#�X����!�J8`����_�9�����f�0��hr��E������"�$��Mh�hX�-�����1M�b��1��:M����E���^	v���z����}����K���t^v-,1���m'�|���2�y��%����5�ypMJU��g��y8F��	K=Cja���hS�*���Mh4����N����;��P;��b"E����1����k��T�� �����l���ODI#n�>u����<��:��M�#��c���c��U��\�
�V��B.??�'��}�a�������''���#�.��5�V���`l�i����>��SC�
<��?3;����:�xM[�����&������0�V�����H�O�i�C	�iA��*����
�X;������:�>O_��J�g�GkZY���`������V�vk(�q%u�����5�aK���hLh��5��XB�b�\h���*�����D���R%�.�Tr���G!%4:��{��U�IN�(����)�+�D�_�����EC���CjD04�u@��M�l�
����}����Hx�
E]c�������u�lY�{B�<$<�5�H|N�6��8��C�r}�^?M�n��@��x���������W��Z%<x�	�����
�Q��8��3i���x�9��j�a�yW,����9��k������(aL��oq��a��b;M�^��J��:O�=���<`��g�y�{���]���0�����X��5�]��r��iRk�����2�	�������'��
��~��{�*=G;
�����dXt�*:��Maf�o��T���E��X��v�~�
���&,<����s��A��BK3���x��u�<�X��R�O� %M���V�0����n�`m���\B�����S���gI����s���>,�
4��[.>i�"����za
?���R���5���`8b(Zw�
��#`HayKs����O_�8��)�*$�|��"T�3�B&�C������*"�����~��������YUX���*��	�vp����s
~)j�m���Hhh���$�q�M[���3�`]�)�q�@J	��'\���y%Z���jFz�8@���n�p���
4P��9N����CI���w��F>���������z'D�������A4��������d���Kj��I���8)'�@�y����Y����O>��	];��`U��r�V������gxEr������W~)/� f�>hv��TZ�P��%��""��Xq'�@��=[���yM#��c(���U��*�+A��%bw�������|��vH~��L�Z���':�xp�m��pG#����{]��aEW���	'G`js\|���h�SY.�o����.AX����ON#�SE|���a��O����t�������`7\��$ ,��w�ZW����?�`*5x���=�~��Z��H~�e+s$��MzG$= �����U�#��]���W���@���X6�
<X{&����F���?KA��J(c���O%`RG5�.J�x�����<��)�s�Y�Fd���������}�R�Wv-Etx�����;���o.n_���h<�~
��a����uZg�l�������5�qdl��Cb|,92�����T�2�������O@�3j��o�q��F����qj���<i%v�����Q'��)�:Nn��Vws$��"��[%U|��TgPID���zcc$��Vs��T��[�N��+(�@������r��
,�.A�@��=�P�o���74�yP2�uT��3��	KN������^�@fYD,�*���"��7�Lp��g�x�������5�?~���h.���1�a}�s�-��5[��q�����(0�ES�gM1Z+������j��|�D0��Q�/^e��`gn��	>\q�:�3�9�N�3hk��w�����������59�������U��`�!T�/=�djaC��{�&J�32��T��fd��^^�S�>�=~�P��T��-��e����Ug��&������bp��}5m�,��[yf"��__�s�� ��9��Ag���^~z~k��+�1�`@�i�K0�S���scZ����~I���2��k)���b8�(�;�_�'p�!w����@�&�7/�;�������X��7Sb|,6����1P"(@�6��*�=xt%mGDIN}u$Q������`�G.�hB����� A��&�{
jK�������HXd�=s�i�1������7��9�p�nh�)��B4���~>
u����L�-0����3��
�!`�LQ�_����9)B?�����M���5���Y�
T�Y ��6���G�!%"&]� ����5'�@ES�F��z6����gN6��5�`��N6���a��T���2>=H@�zx�;]��A
7(�A���i��_'eTkZ���������!2�0)9�/������hUe0���B�bv8��C�I���q��t�5�_��~)<�x���p����:n��O�u�2&�����f�����k!^����-�b��S����A�}�8���K<������0��>�76!8���xa:A��\����u�Qg���S#k9a��s�P�*N�x����b��{�an���$\|��j7�&�����/����`������n	���l`����y���N0��q����(�j�t�0�
����!��#X���A�	\�F�	<�{K������_�O��G�d����q���cv�@OK;'�D��s���g���YK�u�,��W<),��9�}��)���G|����r�4�������&9���P���zU����
<��6����p��N���Aj��s��J�#����m�`bT������D�A�c��D��}���th0��+)%�8�`�~��x�������4��
!_���=�|/�sd�A����h4�Rh�0���=d�o����u�'�^�~��9|e}o�a����.��SL�������)�����q1���A�[r,��W�!���#XdT�;L�o_3�m5��1N��p`#,*���4�0q�V,���m�����<n����O:`�W�<����<�A�Uz�	�7����P�}}�
�f�p�L	c����������P<X�i/f�F�����xp��"^<�1'���������S�g����D
����7�]~���xv�����x9�/��+B��,�J$J/��!X����+'`��3�n]D�����\�]<>�63��;���k�i�,c����0>'>�qs�v��G�x����xF#x����dP0+e�6eI~����fL�
��?��?{�::�m���Nc���X�~f�6�����M��y���xr�2H�)��Gi�s0�������h��K�K�_p`����r'O�����%��mFV~�/���a�o���I&2|�Vr���Uw��L�!�>��;�����`��,P���"'wm��+����Y�;c�����m���-���>#1��c/*0�����]Wn`Z���C�
*W���
��������EO���NVA�v1n�{s���"� ��-�]P��
���j�@�}�L�KF�k��&e��+�{L��X�<#�4�'�i�Y�`����B!R�s����e��"�:��/����^�x �����E��
�����4�[���I����Vk�����v�S;@$�lO;OYX���7���N�<�n�nyov������dT"g�w��<��������1��^�5����R��u}0�f�R��x�������HJ����S����v�
�a6D������vJ���$���+0�`B���u��[����"2��q��+�������]�<(gZ	���g��aj����O��w~;D;���fI��z�[�����q3�ZXOy�	�5��r{��m�;o\a�mL�<>���s�$���8���S#���H���<��������PU��6�`�)mt��#]��uUuZ�P�#�2���$\�H���]F
a1_	2PE5Z��H�igQlb*Q�La-����y IDAT�"6
IHN��f:R��Q����9T)��|^'�<H%Go��kt�@�}$�����xh5���3��/g�
���gn�AJ�����&\� ����1����T�B��T����g7C��00�@���M�(�2�v������������Z�_c"�R�T�%W��	<P���-aG�m�<
 ��]����1��h��6%���]��8�Z9�����������*��fi"�����v��=���d��K�b����N��,��L�`l�zK)c=ALAOSI�`��n��$}�}r����K|w
�{<�+�	�
���	jXY��HE�,�����~��P�\��������G���;I��0l��$��mL�h��+��p����1��#WS�[�
��r�au�v\q�$��e	^<�.Y�����(�G�]�0"����}|�6������0�t@1zV?��!:/3{��j<�Yw<n\�
3�Z01��g���Z��B0�w������Ts.�� ��T��Q{��x��������Ajj���%�����iDG}A����zy�������aT�"��0B�A���9��F0X�0z_������@��Kx��q�+,�(�BE�}�?�����x�����I��$�	S�40aX��F��+Q�v��U�|o?*��M;R�p� 6�v�U�Lu�������e�C|g���mK��#���@��A�3�H:/�������1/8���[o,9�5�Y^������0����U�R�I�x�=Ciw��#I����_<W/��{Z�{�3���9��Y�}�����������djByB�W7�+�K��TG�����F7�|����{8^&�gM��E�|����\�H������k��2��9<��f�����}J����A��A$)u���q�|���%�}�����R� KY���xI!��P�B5��0��&6).5x�F���;���j]{<����f��H���AezGd��[dc+(���8)7��7�+\����Z�P��{��v�L;���r"����Q�vX������i��x�~y�kV�����	C���9}���>gS!��v�����X��C-Yz�+�l�f6���e�*7hG�|����i�F��R����L*��<�xR�J%�������s�j�^:
-����x�L�9_n�S"��l
UE�'���u�=-��4;�"���1�~j�3A��H8x��E������r�@�Mq�^@�dH��2Z"�V�vKTH
�L�
4;��G9-�F�pp���7����J�������;��<0�o�Q�u������o���1��3F��O�/p�gDFbN�[�b�@������'Y�6����@z��_e��2P����1��IQ��5�]i�\A�4���:���9��9V��f���U��a��#p$��/�`gf���>5�Lj#�����->GGc���hX�$ti�����X���]�FJq��"�����O1^f��*�����������	Z�|e.&�Y!j&�����������P�9���lLl���O�s��X8����$q�VOy���~�GP,W<x|-a~)�FP��?�A0��
h>��[�x2B-(�[�?(�� �h���V*V`������GR�c��6���r���5���H��#�IEE	/Ed`��{�	/	�gQ�����t��OJ*�<�(��>P{�]���^��dc\�me$�����h�C�0�
�
(�~(?!����j%�.�r63����1H�9�$)G����^V�5��>����'0���#
p{�7�5��* ����8�t�)Fp]
b�Q�!n� N�0�J�suRe*��S���:]�"��x�J`���#�v�
����/&
��M2��B_�jAQ���$����Ks����m�~0o<i��V��+^{h������m��sZ�*0�`�}�F�c���V�)N�|���D��U7�?��;�%uz�N���H��3B&��<mu��w����@Y�� XD�����c�|�����`h��:�����^#�Z�*}3�!�)+��;����``���L��;�K���S���Ui��b]� ��;��M�_?������/��r#�F��p��'^�>;

����);x����U��7&%�{8r���Y����Q�/�Z��J��Uic���khg�"z���
G'�k��x���;�3s�?�v%P�5��Q|�m?�5������S}���������y�y�q�)�M���;����+�����;;P�du7��;�����
��j������]C]���cy����0�,��hr��lsOa�#������������8g+�Jh�`8C?�j�F�1pV��%ON�*��c�Nt��q��I��+�^�����a�����L�i,���0)G���k��V)��������<`�R�jk���O/���q�x�z�>}�?\A~���6[���x�;����Y��y��P��-�?A`A}�����u���g�������N�}(mli��T�&��]?<�t�h�H&p�),<��������r{ dT�Pn�F��=T����DR%rG�`&��'���u|�(|Qz�jx�M�=��2�;�����D�����>����4$��pR��}S��g���0�����`���\=���A;���)�;����om��3h��.A	g�K<xB���T�^�!'����uI~<�>lfO)RP���2�������O�������X<���cF��O���lh!8;xp��y��.{/$�9Y� �A7��$`��z��a��5�S~]��������a��C��Y`��&�z��La��+"�C��f�(�	KL����U(eZ��dW<�|l)n��C�A����|!��SFc�������"�m��BC����0�`�~&8�/�������:GA����9��j!���W+�Ze����8�s$�Np��v���M�����}olpY��$e��p����,��]�@�d����P����N����E}0/;���I�XZ�u��KE�+0� �B ����V}0��vx�$���:`��shd]������b
��]d!����x�$���q�j��������s'�5�F�O�PW,��
[�U<�T�'������W��x��x����0bw/r�v�j�yO���N�o����.����xp�=��y����hM
�Cf���Db��6�y��$N�p�vF6�����x0�dAW���)0����A��*���[,����$�9�-�P'9S+�<�
�h'��h�����8�;�fW�v��R��������rA�ds5�����6����aO�J��q���th����l�BAx}fc�B��-��B�Bm$�������rR<��=z}g�+P]��
��^�qTV�V+��Vg�8����ZeJ��S�����������`���������v�
xC��T��,��]�@�l�@�L�x/�����e�6�6=W���X��!��'�0����|���^Cd����&�.W�^���v�%
������}��!�n��
�>��wm{,<��������vn�C.Lm�c	>`0��kw���B��`a��0�"8���WX��WPHjK��z��I��$H�E��hVq�����T���C!��$c\�R'x`O�~v�R�au��3x�)'�;>X��g
,t�
�X� _�����P]a��o;J��+�VAx�r�7Q��Q�/<���������ZnV���\��M��8O���L���V��`*�d�4�}z���'�^�����4�0;�:�����$���f7xp��iZ�4�{���!:a��%<�K�V���O�Q��|�����h�������<��3#+���qSN�����VU�gy�gV<`�6�`�?�� V�9�����^�0�P?��T�Bj<xS�.�$�s�z�����)��D8�C�A����+�$�i�q2�>V�T�vg��F�f���bv����~\� ���%x��7��'ER[Q���_����&����'��A�|+C��Gr���]� �����Ts6���>��]=��S8�4�/�3BCE�te�x���H)JQ_��A�B�d�I���xP���=9��p�E�0�����$�IU��O���)���KcE�9�������P�Jz���]F���-������	v}���$�������^F2�Aph���R��^N����xp���h>p:-�n�������c�`t��'�b��38��7�>{>�>m\�,'g�'(�;^K��P��B�D �JYm�T���2��&�*�
��%�@�c:#��,������`h6�|�z�L
A�)��%H��L�h^�n�����)dC
��H�
�X�,r���.W(��p�B�����&)����AwR<��9���0�Vu~lQ��<�K��������Ox��a�>	;I�`0)0���P��W.Q���
����3��+���X;l������#x�B6t�ZK�\�}���:�zV���/_bt��x�%2�����\� �:�-���^����<pyz��]r�m+�)d�k��<(a\���R<`ja1��fs����Rf��3;���@R>��aM�p���4��5x�C���3��9��@}r�3� ����_h��s���.�`��k�t�uv��[G#�����!\������7SrBWK��^��*4�o@0Q<�tQ�j\Ya>�6�3eCy������)LK8	����
BF��h���;}K�c��jw ��Ch�u�y0��CM
���4�o4?���{�H*t�!b��L��Zh=!�{`�{2��>%`PU��G�#9��wG��}b��x�����)����	���#uI��,5"�WR<`j��/�
�kF(2���x`K��P<P�D��DI���;�-"�H�N�-�08@UY��
;8��+����p�+L"������p��x���+$&�����e�2����o�A,��x��J-x���4�W�jYXq��;4�����^�6,Sm]��P���o���x0��z���,��\�`�Sw�S����d����jmj��(��b�&�iB��Q�x0��Z� �F��x�d��*����f;�"h�.��*xp�����y�9V���� #i�sC#T/]�����E�a%�7qz�����8H����k���.���i������ON�m��p������aXb�n}R� �����"�������H_#c�����#+tp���A�c��-����B��A)�%Q���?L��	;�-@3��\�}�<lAF�WO��u����d�92� ��w"������f@�{��A�z�������:`
L�!$���Y��P�eJ�������wc=���<�2X�
���d��,�����zW0���� �o3k�C��y���Q��P����yH��c�c��q��r��������|��j��bWR��G
ZC��u6��j#-
��x��1��s��dW<����A���&4\H!�vI�x��������R(UZ[g;��)�B�3z�,�H�"x��K?
=x���ht�Q����k��������={H�~���@�W�(S�����Z�q���Y�F
���lS�:��7H:^�t{�F�����,����@�7m4����$��T2���
9�Vf��w�y�h��-9A�}��Q�zd)���)�C��Mz��m{��G�V��,�BfXB23
��+(x��J%i��OP���{�_�P<��������9���}q��)�W���3�tk@q�)�c"Mz��Z��0��@3o�Q�xJ���-��)�CY3�����7���+�����7�y�]MM���������c�����A�G��he
�����o�����O�����R	R1�\�<���c�&��p�FUm���+&uj���� n����|9�������;��3��cN����d������z���v�����*�eh�39��A
R'8��N�3x`j����'i(��
ei7lN���c�1��B�'�����6�-����F$���b;�4�����D����+�	��=�y^��:��Z���J�C?��N;�2X��k
#
rB���%��`f��GqwYb��"
��O��(6��Rq�\�k�b�H�%	��8����5b��#9r^�����EU�n���T�<�hVC����a��X}y1M��y;<`pAq]3�-}�<����`iP����x�
��'����@��x{f����l�T*���V�|��]���)7����X
���!����-Re�����;������Q�`Z�/i�L��;�x�>����K���?e���I]���2%va�E
q@u�6Q��
�<XC�o{n���(%�������j���5TH�U�;�@KM�f`��
�A��XuH)!s��x����XW�W��H�y}�F����T���8@�tL���$��q?t;5G�HW��*�,�N��3R����3^�B�����j0�3~-X���;�x;����n�0�-��J���V<A6�w���P'��X�}�H� ���s��9������B�3Q�u�!����n��_����SN����>��l�W�����B��sz���.�_ta�t�'���t1}�&V�B�9")�&��$96��-����)�����v��Y����W����L��P�(O��mkT���g�s>s�<p,k�>�������=��%l�M0�Q
�JRn���B)���!�YYb����~�A �!��<4S"`
�I	a������1=�4����S��cHw��vc�����<�h����)�\_��<�!�����0�K�c������3�
�����_'��y��K���������ms�n0%=���'^<9(r��:'sH ��	wo,E��3p��|���-@AQ���e>��5B]
�M��:��Dj6eZ�D)����S)06�%e�eG�A���p��D���R.xpg
�k��x�������K2�z�$�DD�{����<P��-j�z�L���*&�T ������y�z�f�Nu�s��r;"!!�����T�9�������
<��q�+�a���=Q��B��GQ�����%)��e;u��u�t�����o�@j���m����yr���T~x�y8��Q�A�Q����C.hk����<<����0�S�eO9���6\Y�q��ey�g��SX�1����D�\���B�)�����v}������'xp�.=���3T�m+�X��P������l�Z�=���Da����!
�1@�~���j���
��!'�\V63������B�I#$=����pP)e��]�S<�#��u�����=��oTNG���^"H�+I"�nXr���G�:���<��B���Ym�H�%!G�`u7����mLEeg��CySuz�&SY���P(�'�!4	+(������w���8RJ����a<<CN)��,���r(�����Hc��I�@����R�9�p������19�m�B����_B�L�l	6S %�d��Po���-��r.{&�cP/�l��+�~���N�����\�s]��x3uEhQ��>_���%;dNy)4�9%*T��J8�v��(,(LW����������Ds�s���#1����Er�����k�+xx�90w ���J�����M��5:�_A������k0����Ba������`?������S80�W�9y�;��X�������MH�}��7�1���Hn��v�`)�9��E����$�������PgOJ���x�VS��y)rD����hD�(E`�v_KR�P���i���'h����(:���)��/<������������QP�g@���2����	f`�������Bo^p-p IDATRAa7����H)������\�uP0������
�w?}��+���xZ`aX���
�j�I9�}��$�kCs
%�u�������^�������c������)�/� �6A������&�����p��%>�s��m���ZT(K;���:rJ�H��9�����U�[
���V��{xP������@x{�����h��)�B�R�E�$^�30��D^�������%W���`.���������N��nuFse��u����,��0
f������5�pXa+A���������� �Yno]����q=<�qE���o��L"���T�z�E0S�{6
H����t��5�B���,�1\�f
.��������9�C)����
��!	]&���TF���aZQx���x2�H�-Ca�����F0�9����B
������*Bv�sR��C �`VZ����}o�;�������'��r����C�_�����*x?��s��9���99o
C\�W��m�mCR4�J�M5u<�Pw������y	���;��������PSh���Ig��M�q9���wPj��S�����56��
1/��b�����G�j��"�y��$� ]��%��`V�����B�6N��0���DCD�����2��D#�'��2���h����$R��q�����Y�@�D����%
��� ��h�i����=�	�'=�\���o���f�����b�q�s#U��UUP���<`e�x�C!_��{��\gR�|H!2��xp��2���+���=�����p~�H�����0��2Z�@s�^8���Bn������:2n��������29����RR2\��<hW�N��b�����w�$���(����Q��R�a��
�V��E�\e�b������
�����
�	��2���tD 9��b]�R����r`B�Cv��c���yY��
�Ckh���q�������N����bz�E
�q��s�,�)����v��H�
��R��}_
!���)}������eU��t=|����+�;k�&���u��ew:����G	���kZS)O�u��]�@������%�]u�xL���f/��A����Z�>�#4�����?vn�o�o�{a)T)�-k��K��k��3^���S�6����/��z��8ss?U4 p!����Iv~�����l2W<p��{/�I��t;/y��<�E���a
w�g(d?�����I�
R���q�������6~���;�Gt^JstU��2�.d�1���Cj
����:Gd?��%��{�I\���i������I]OIA�BC��p��21���f	N�j�A��?z}��V`p|Bb���I`�5y���/������(0p$s_�����]�R����
x0��&�r����/������S���o3�Bg��E0�/��e��e�%���X�!��re�
������u>���n�N��#m�C�jm���,���xF�O���q%��>��NJ���(<H��O�10����[n/E���,(l�������,��xq���{�����N/R�q�j�c��*x����Ld�J������!����-��<
=���
����9���X}������K(,R��/��ArX0|�/����������V:F�G�C�b5�w�=�Rf�[������{��o�������=�c����4����}��J@GZ�V��sG���)|)��)�K���B��6�5S����
<�zE*�n�z)�����`�V-�����$#�B1���&L?+������E9��xC�AS������^9Z��4�V<�l��$#_�l)T"�;#��c/)/L�M.��}O���vx��r���y�!	����f�P���N!�|9�"Y���D�������^��DF�g���uC�������������/'� �Z�$��lJd� M�y���[�e�
�]i��
<�����|v�@���
<�u;��/'�@�������Y��+��x�+�K~}�j!����
<����.�xP�mJS^��4���l~�������a2��K�
MU%L:�K;�s�!qSN���e�/7�����U./��0�+�:s��_��~^�Aa�����xP}�<(��
Z�8�AA���e��#��xP}�-�Ba��_�YB-��9����	�(������`U�S�i��x M}�lN������i��Y�?�z2���/�c����@
�,���x�C�����P/���
���u�9c0SfPW��p�l7��{��.�t6���j!{�Mk�"p�[���+�*I���<(pE��<������j��ud
ZO~�2�������g������r��e��j���:X�i������I�2����v��p�[#D�B-0���<`a��h����|B��4���@�� ���=�=��l+�A{�a�9��s����,5�SUm�c���|7��6vho���X���R��_��<���u��e!�X���L1�������G�8LMM9m[�I�<�qW����x ;�U��n<(��O
���k����x�k���U�W)+����k�_#���$�^
�AVk
��,�������,���L�%�@�-X}�9�3�*)x���L�jr���3�.����0�6��p5������M��dn�g
6��)%���Q���49I�iNX(+X�W���~U;u���G@����>�x +K�_��o#qr��8V�.��n��x �U$Yi<��^�-��\������mQ�,�Ea��mS������'��[^$���K���-*�'X�h,�_da]<����C����C��Oa<�)�!�N�A�&�.�|o3<��:*h	<(�������1�Z� w��A�\xP8v�^��;K��Hb��?���c$�
�AV�
����������,���L�%�@��,P4���.���J��x �����~���[���@r�	���6���������Z.k9<����Er����'��c���
�����$���$����
���?F���d����
��><���x ��d]BdmQ�>�Ec<��x ����)��XO(+X�Z��u����-��)???���BQQQ�������cc��j�4%�G��� ���� �������0_�~EPP���d9�ER�0Eb����������<�*@O������������(��XHE�e>��#�����0)����
�Q@�B1yy�	��B�8��R���P�����|D���!E��0a�//��<����G�uU���`V�6-�����K��](*X@~- �E?���"&�E-e�AQ��ei	y�?�a<���,�l��������dY������,��B���a<�e>"�����eY�0?��5��K�m(��e>"��euE��y��0K���!�!�eso��yy���1�CVW�����|�Y�(�����NJ?BB
����_}�}�_����[� �������S�oBB�T�*Hg$���Q�e�e<������	55��6Y��_X�����0���b����������V�����Q[[[�2�%�g���E=�^y��0[�!�+B�z
k>"}�$�A�ya>"��[�%2�CCC��[3��������1����1v�I���N������Z�����|�YJ�����+y�5?�Y �C6z�5�_����������A�@�{I(�����x���~��KNNFbbb�9]di8a<diM��b�:PQQ���".-/��<�GZZ�]���W�W����!�
eU�eI]]]VUI=�r��x��|$c�F�yy����I�"yM���0�y���D��g<�e>"��kJ^����������0�ay��0����!�!/������Aa<��:���:x Hs�\��0?�x���,� Hs�����%HsIg?Y������Pa<d}�KW�<�G�����������������"���0_���Wa<dyuKW��������������0?���"����P���>yy�����C��Y���e>R��u<��U)�%����byy�E-e��0Q�C�&����t���x��B�0�]��.-,,�����'�!����d]Z^�C�����+��LY�#�2��PVW�l������������U-�2�seuE��y�
��l�Y�"/���������H����x`��!~��H�
��%�e�Vh
��vA���PS�����?��YE�m��{�]���8��?"���^%��4.���YF������������'q�)))`�e���6O�%�O�%i]� 26E�b9�g��,����?����������x���O���JJ�L��>2��W�����JSS�@-���GDX@�����0��h��KJJ��UUUT�e��PBL���������z���dy���,�R���� 5.	?r~X�~�[F��8e���)q[*�|�0E9�����x����H�b�|�a>"��[��:?N�z����I�������������J���Y����g�$U#Hl�B�CH���/�������OI��4Whee<����yq�'E���$��,���z~���
�d�|O����
�3���QI�
����m�Gf(�x��* �����j�m�r~��j��Fx���P�OCCj&V9�-�xT�����E������r<2���!�:�2.�+-�|DI;�i�����Z�YK\N�E	�����$�,@`��������W���d1�k*L/������j�S��y;uCz��fU��%��v�����xYT��<��Iy�_?� j��T~���)��I]yURF���J;%�L��X�	C�t���Z�(�D�"������~�<��
=��,���	R���R}���6��s�N�g�k�D��])�>�ns��� t@�@aY�Z��x�oVX���G-��j���g/�����e��y���T��& .���E?E�X'TT�(V������
���u����YJ
E
�i�����ou�b����|�I���est�����O�7MW	;>�i�'M��4-��U)�}pC�jr-[��*6U�����b���W� Rg9^Fl��8O5c$�~��)�&~�TK�r��q-%�,P���@����$]'�Y�K��~����m�W	<��=���- �����x��x ��l<���-�s����������H`g<�b,<�����Y�@6�����Q
n;<(��~9�`���h��	������`�����tF���P�&g��9}	5�mace)���c��y�!.3�5�+&�EE�:�!!!�����7��7�>���+PVVF�����9�����1��s�������-q_��-�W�_�$�j*�����%� �{C��Q^9~u��N
�"<:��zp���C�2���UQ��!��s]�z
ZX��{G����+���>�S�V��]����dt.%�<�5�:"
W>`\�r�����SSA��F�����<�1-�
�z���+0,U���4x���G������$U=�;�[���B�y�q����m?���`P�,�t
�����W�i$D����|=n�kr"��gW�6W��-P�?C!Y�w��@GMqIi�ILC�J���-��M�Sye�4R��4�T<�������Q��Q����D�qy��@�29�������\������1�N�Qh��N��������P~�(���Z�������N���S�r�3W:4Y�����u������
L���/����q����Q�	��1�0zc7	Jd�����a	�w����*p}?�`A�[��-�w��3dw�kk�������H=oj�?�.�5��Q�}���A���P��DZ\Rc���X�]<����X
*%Md��-����%��u��O���0��@u��B��7d�nM������
�$�Jr�?xp��s��j�-�mJTA]IN������$*�9s���q���)��s*p}?����=��U
K���j[��QI�����)�������%�������T�%���O���QX��A��zxw4�{���f��d�xPq�\�=�e�O��kG�����'�����]��5����� ���AKNa��N>�������}��p=�B��
<�3�DU�nx|�0���3�'��U�~��{� �_sK�������}.9e4����5:����R���p��sq��Zt�l��u��s16)
uM}x��/u[�%�@����(T��W���1k�~g?�at�rF��$I?<�v'�����J!?d������N;G�K+-���a������
�9[��=�VJ�NER|lje]�ac��TjvV��R�(�,����3��Qvk{�����Y�Pw�!!1	M�&���=rk�L�*��^�n���o�7i���N�eG>��r��
�TO8c4~�p�zC�~��\�f~�0J��X�v~�?�#($O�{�O��Y@��|!���U���H��h@QYA�����M%���(��:x�rLc��z�)��th_������R��
tk�Z�g����R��5x�2<
/�#�hV���?z��U�C��?"%xP��p�?uC�����j�F�s����e�9��V�fS�����u�t�����5�o�����������?����������� ��v�L���jx�!��{z���>GD �%x�������az�2�_r�LV���*��z���}��{�L7A������;4Y���H�@EY��,��#��E
�l0O������I�7��6�1��q�\�|���T���A����Jeq
�h� |���o���E$���$���nV[S��'d�N�1���%)(M3���2��g�?��������Z��G�?@r��+XX���(l}����$�d
�7��^#.*9���������L���a��������'0�R3�(������TPV����
�J� �aB���4�4l�6�~V�����qa��h>x~�������������q���0��ZN��C>.&�;� ����-+{x��.����%�.[v��Gf���}<����d�V�X��5{]����sT��=�b6�����xa�a_���$���M��O)�f�*��f�q��x~-�r>{���IE���(� �fI�+K� ���_�@�V+D�]����	����Y � "2J������KX�������N�����=%0���C58�����G�:0������)�7��
;���!�}��_� >>����g/Ym���I}��U�g����U,���y�!TH�@YY	q�	hX�&��h��2�Y�m?���


u~x�������Hr��G�������S�����uTP�D)��j*L�������M��<�YO��k�i������n�Z�T@�g��!=Tp��k����K��D��[�!64�h��I9Z4���'��y9���(�L�1�x}5U:J��N��I~z����Z��BQW�a���v)������a���,ykX�bX��)a��=�!;����/�u�4����~�f��'N�
<�iU�8r�l��5���`c_��M��oG��S5$
��P��:V#�N����T�������q��#�w������@G���p�L����O|ab����e���7(
�����	��B��~�t�m���L�g��;�Q�T�SN`�[�<��[�X0���
����-e���_|��aN��T���!�|��Xv�+S^�A)�zJ��SS���8Z�4��[��E
�+������L6R�4�
�����[t�����{�kM��8�Z%��M�?{C�U������K���?���y��Je�*2�+�6��B	���/}@������W��
��rR ����j��� IDATja�S�?�-0��!f@
L� ��������a���|�b����:���m�`\��YT�6:ZXM�"����&��������j���X(*)�}�
��[�)|�����w�q����O�������t�\]6%����-��G�Y����$��z
M^E0�
9�'�XY�a��#����q.L+�����v�'G6���}�A�|�~��5W�O�Q�
��w�������*�mK���������r��O`U��

m��~J�8��ZF&(��+����5)�����@����������v��NH��BBd(�m]D�g���&�.���OECSd�s�!��74��J
���i���Adc��{��?����``Ug������1��
4w}w�,^_>�z�P�%��k�c�*���l��$Wn��_q�I
�R��PAPT��LAe%4����	X2�WD�j*��O���)�SWn>)���+���nuR�D*Nx$��~n^YUJ(���$D'P<h�gp5rKW<�G�	%H��^*,f�M� ,6+�^E���hD
5K�����Q��S�6����g���
�NwB-tv�������/_B���h|f���SX����8z�t�V
uK���/p���d�1NNxH�*��PL[n?�vX���(����9&��%CC�	����������}������+s��;����D�W���G��������V-���c������zk�Z�����"��PLG��&I�
<0��z���]>������P�0D���P�V�A�*=G?-?��O!�o\JZ�=���S��4J���y�x����6�,gN�}*�N������������n\��w�i�,��1[���F�jP;����(t����=����H�o(>-9�j�`9�>A��%^�X��,�j|�I�4�A�z�P�on����r*L�q��"�`p3��W���]r������jZ�������������_���������mK�B)T�R��PZ���X�����[���;��BBron��N�>@2�gvgg���G:W�_;��G�g�Apw+�K�����U��-�W��y���gB>�������-������{�k/��CZ�-�L������G������`x=��|Y<�wV4��m���l ���U�xc��K�3a�W��1�5���8'����\<w9t���Cc�T�i��y*�~���z��m���������s�'���'��\u�/s3L�8a|������%����'W���F�
Nv.
�X���q����o��]Q�`
�o����A����5+��(��j��M�k��S������R'�b?�?��%�fC��l�*���'�%�n��q�O�?~����b,\�]q��,r��S<�~2����o�&��M���<��)�v��/����� ��]�8��=��5����-�j������T�E��TE� ��K�>~A�\���5�xH��G3Dp���~��6��h>����(���x���~��R�A�.�*{&��(��<����� 85��g?-�U����i>js��|n���"����wT��k����������ZXq���.,c����+�&y���E�o7 �r��{����D��Cp�]N���`3^q����
EF�D���C������f}��P�,�����m��IB���S���Jl|�2�]�����|�T�.v_�Z�L���o�l/���R��6j?�L�oQ�����T���/�,V�������|bO����:�J���9�S/���}Y�Np�x��d��������D��8[qT����� ,�yD9�g\��@�'��t��F�\�q��u�����-�V6�~�/UN������R<�\�#���������������B�����7{���������t�d�s}��	fq������Q�) ���F$�����m[s���#Y����W�&�����?j������\�Y~K?���a�
Qsx��1�Z`�>	�EC:���R��B��h�)w�o��|H]���D���k64�&��W���_k�����F�/����+��$��gv�t	��ks��C��L)�|S�	�	1L��NV���w�W�����b������t��]L��������'����E��z����qr-�9������hO�sx`�l��=\�(<=���Qj$���#qk�?�����awqu�/�-����T?+2��"`�<W��"�?�C�����A��]��X���/���� ��'P��j�<{�<��4�������j����oQ��%���\���A������E��-`���KsG"�������8��C�F=�^<Z	d����S�&�4��[����nTm;X���l ��sJ�j�a��������am�
w��~��6�7D1*"X�:��6�A~h�;����}O\=
�X�xt[��jv-�^C��8<���u�xp�����S/���o���ps/�����G����0�
�<��~�4;��+���=��Fm`�,q��v��<�6=g���;��x j7��������j_�h�i26-
�4����L<|N��e��([�v�vN��Q�)������>�l��O�FCq��rU_������y�p=�m���9��`�9��sb�����.v*U��VG�T>�8�U�~��+�F���c�.L5�>�A/��=]Fw������������&����|fKxP���o���c���)9�%
VD���Z{��q��}���.����9�W�]j��.Z�|=��W��zX�-��n����;7QYC��E����YW��n��#0���]���za�����^���T������'��I8}��T�4��Y��ex���E��W%u�������(��Q+'\����B������g����T��d���#��y��k�������o��h0<�� <�<�Y�����3��������sn��nG���Sm�����[ �m��I'������AQ��i�E�UK�o��+g�S�������s�]1'If�/�B���P=W~�a������h]��C@����*���{8�����j�G�"q�{>��*T�|����P�s�'�J�����p<���u���FD�U�
��wet�@�?��/D�����P�Y����=a�]�?��O�C�,��}���d�g6�SIx�rml9��7.�FB�Ad�w�S{�6�mQ�:�	��������C�������������V��T���z��F�����x
����v,�r��b��<�I���v{�����c����\:7��O.�}�|��P�iQ�zPo��c��k��;��e�:X�b#�|�g����(;|��o���N�zwV��(HH���B�N-����e����L���^�;t,~�4J=�����/A��mp��98;9*XA���s����o	��3�e�~�=�wx������71�`;7�s�Y��hN���$|��7|��3�|�q�:
���[��X���m�H��Nn���~���"y�
�k���?���6C�R���-D�	�N�������'i�A�����3:��l�1Ka]�aG(��
��R|�����p��?�����W�3���'��74����'<W��G#�����j+!�`p��8��?~�L�����M����JZ�<��<�z>��{/�F�@ �l����3��Y-#<�	����1i�q��Y�����o�929��k�o�6�6 ����1��i�&T/��r�Wp��
q�/��lB��.���Y�kh��#������|��j�UU���m�?M|l�e�w�G�Dt���t��GOQ'�>!x0�bI<d���t�& �@�=r��|��+���7�B0��������C��R\����2
��K�2���)L�\
7�u���b�������.����^v�.��(���P��������3r��@��2E��S��Ji\x��
�g
<�v�!2���t��
<h�=3�s����?e�i�J�6~#01��2��L�P?|�Y3���`,��\�����Y��}������=C)�Y1���V����Q���q|�$8�wyk���%S�����#��R�1����9g��A��k�\o��ej�A��G�b���O+���6,Q�~ �:gW��R?W����t�!t��D��)%�r=����od/[��k�p
U?�c�Wp�N� 6x��)+���UNP!�Z��\�TZL��
������X�yS�1�B�J�xP�~{<}�g�T�#v����+n�	� ���*�����(M����	��!����ytr���,�+�����]���e����ih+��uC��������sJ����5'����Y]����T��Wx�����K ��AE�kN��E�hX ��9<&x��y1��C����5P:������#P���W���
	G<#�-�9\�`8���� �>)!�@����G�J����
���(Ll����_�
��C���bE<$���A�6��	���N�I�Z/�t�g�C_�d���J�@��Ym����3�~�B}�x>}�;��6j�gXz���;�����K�7�uk�sO��Q���x����?��i�(�`2���re8�������];<`(�E���~-a�#4P��7���pa���SZ�����UV�PMjJ<(�dn�����n=j����JE������i*�=��._f��x��������������u:�3�((��WK��ME<]q������]p.���!x��$��O���[����~����OQh� UO�j�/�
����&{z<�mg��B�i=�5e3�����2���2*`���hghRSr�q$�^JX����>���Z/�9�E9�Gu���;V���ub��It`�@g�D��+�`7���)e-��f�G����������O��]*OE:���_�}Ig�d:�W���c����jK�������t��qv������G���������L�!(���!f���,;t��5]��\��>4_�����]j�S��y��_������������W���
����(�������6~�l�B��K��0�#�������(hA�t�	��Kb�mD�Aw
q��G����9��>�Z�X�2��5�q
*�}�1:�*�?��I�.v����[N�����0�������=�A���Z�^����w�0��1B�k����r�d�}�$*`������q�
�e�|����wjX��O����t�����f<f��`�����)/����-*��8�-��iG��P�	2���AG���h��3�!�5�A�	���<>y�}�	���C� ��MD��-�bsn��W��=s9#8F�����-T��!E'��'`�J�u�^>K����~�'L���&7*	��/
��A���N������C��ZR�l������p�WfA����-���UH;�3BN^���t"H�H[_H9���	o�����t:"�@l���H�������)���]��kE���#��=�|lR��m����[�J����|���L���O�G����>����8��<�#_��q���0z����u�&���Z��53D:�?��9��6s����v��&�U$�,�Q�@��k�U}C�-�JAv~{dD�,��3���W�rw|����g{����P�-~���O�R��S�����Y�(mN���G���u
x�����)���Wx�w-�-9Jb����/��m\��Zn�x�9����S<�0�Z%�7'�`H��
<��k���5N!0!!	n�=c�3���z�1/�E��1c(��OY�����������8��?:����<"��P[�h87�w<����'���Z�
z)b_���>�Z��|�����:�>	� a�L�y9�S|�A��6HS����#C[<�����t8;��2Z"Km{x.������#�+�z��������7?a�y��[�y�p_�$���^����!Kn��x�\�{������J�O'�����y�<m>���)��x,�/����<>���N���8�md����#|�t��/i7�|��Z�������������$$|��u��|�� ��)a�!��tJ�������C
<�th#��'L�����T�.8�o�Vk��(N{qJ_<���~�����5�{������|x�|2	G7�F �_[��ms�B�~������s.��
�������te�|�i3��H��8�j�^�[R��<�j g����c*
����O�~�1X�g_dp���t���n�
k���u�s���d�5K��Z}�5����[q�rN���O�.;���������Y���i����|�*[��W
n(Z��@�	t]<�����X3�-����Wc��v�F��`��	��.�p|�<t�k���r!g�
*<D�v�[�����3B9�:�����3����E������%x�y�����_���|�4nz]F������=��u��������������������`U��7�E$��w�g��gK�=����H�����)���C���?V�
�������\��������nQ��)1��A���	F�N8z:��,�tc��\���5����&�������"�o:�Ky�X �/�����=6��^�g
��%��Q������B_=�F������|(��:wv�|	���~M({����->��������}�1����n��o�k��2>�`n�v��q
��w�-m�L<�Mb��m�����T
��[���PT�j���\�����qv[*u��������%�"�W�@���H�������A
�W������]�
N�m
C�6
T��;�Z��.!��H.���`a�
9�_ttEa�����%�R�Z[�^;���|�N����)B�96����v���	���S��j�t�!��� ��B
�����n��I�t�A���0�[~���B����?�D������	K�nU� T*W>��/�77�>|��DSY�VnB�	%lRj�<8w��T(�������]�:or���~���C��((�70�6xN�@�z�����7����K��f�rp��:��$:/j��@b�A7�wW����,���M`&���u:6����������u"����Q0��+�1����l��$��m�T;��W0�S.C�S��V�d[�Y�In}�$n�<�+��P65x���5�I���<p�F��:��3�y 4��*=0���>��O1>�1n��\���Y��������:�^[��0��i�m1�mY�Z[`��(K]���#���	��p�O&��%U"���x�+�bL3t�n3U���Y����ip��c��r��=����<������e`gc��Y���U����Z�B�����/]0h�n<��V;14�<����7��������"i�`��3��?I5�K�����t����DM@���	
�"�}��K\��q��9���m�r#��s�g����_�f���	���A�ti�%U����+�����?�Z�g�?O��1�������K��oO^��"���H�x0��eX���)�����#�1�P�w�/�2������O�@�W�	���M�l�����6�8�p2)����t�?8{8�{��p��^*�V<(�k���4�/�6T?��m	���O.����
���L��nL��i�p��H�^H)�'\P� ��Q��N��D}����k$|�n������B<���V��!�����e8�������7Jw���N w�TTX�7/�	Aq����7l��2,�<��(����i��P�t|�:;d-YE)�����2T\xH[J��i��B�����%��G���pn�����������S�a����C�x��������,�<���}���6@����`�?���{+Xrm ��.���a�����$���'D�����R^�|�
����K��p�+MJX�j���I����H���O�R*�K�BFB����=�B*��
BL���@�.H� IDAT��2(�@�Z�(������������� ��E�@�����%)7�
%�eS*	���h��*�T3h����}{�}7,�c{W�GV�9��Tw5���+A�'+W�2��0z�V��p��cU�
�`�����7���W��Z��h������9'!�@��,�yr��3<�ur|�J��z���������ToN���#����e�g�Pf|��W{�B���dU���Y���K���
���4�PE�
W�]��-�i���f'����t�>B�����O�P���n3Ph�\��^�F����o=�����&�1y���R]j��}�]�g&4>aZ�%6�'�*E�q6<Z2�����&��V�PS{/���{�I���K���;~�p�,G�)�H��y�������?�
�
L�x�__��Rm�M��3O����]�������<���D1���m���8JG�M��@W�W�!8������Pe~��+&�M�oU
�v�����t�Pr����m�������a{q�����&���}��s���0����E:�t)�m��?���u�����k�F����['`X�1xnW���68H��'���������L-&����������7��n�?S��7���y�P�OW�G������)\��V l��P���������
x ��M��M��c����>�o���aa�B��p�t���}q��s=*0X~����k@Kn�����_v�"���%D���$*
!n��q*	����g�s��"����qKx�^���PK��W\�Y��/���9��k_O_RF��R����k�V�xaw8G��]W&`�?���jpC>��#E�PM@�p=*a��VG��cJ�@�Q%����R������!�I��-�O]F0UlKT`�.�a�
��:����_�y������t��L�g�y����H;�^N]��t�/���D�!%���O>w+nC*	���t�9��8�B9�E9@��S%eX�\�SQ���F<���9�_��	.���^�3�aA�@��!��i_�'yu���TJ���[S]-=��R�����n���[���v  �
�QL�A�a���(�6�p~�2A��k��9og�I�!� ���e!�B�n����$][�P�a$��3T?<�k����	��)�0��Ch��{�$�v�6l��J]�m-&R�P�	]���������s�M�W7�v3�J
{	�� �z�(����1��EI	\��B��
Io�n���i\�\V�b,q��(9"������v�k��t���K~+8d����A
<�C����>p���K>k����]�iB��S.�7����wqs��(�����	eF,���}��������TJ�b�Z(��|����K#s�&TdH��v'M��]��[�"���*	���5�P��v<�zr�t�vV��(�[P��������P:�"x JO�\b��J� {�r�Z�����'���5C!����i{���'�����RA�8j	�m>j�dE;�5jwA%�OQ����I5����b��]xR?T)&,��*��7N�����;c�_R��6�P�$t������IL��\�*!k���^��+����W����k
��x6-���**����:�[�OY��������]�F��� s��J������.� ��{��o��H 
+���+�CB���^1�'2�*X�N\�g]����G��#�������]}��~��\GJ
I��PU��������w��������/}���D�~�8�~��>9�<�����Z�9
���?���m}*��(��9�
�qs���4E���o�1?���%o�����������.{�1�A8��vPECB�0�J�>�V|�4�����O���K�W���
%mbB%��<���fE;l�������H���Y�P
�2���;��x�j�O�2e�q�La��;�I������S�5�|J�����3.x`�u��
�a����WK#��W�_#�@����k8�v��!x�9Z�����<t�/d�������^M\�
���{Y+\=���,�/��E��B�P
OnF*�Q�NGLQL8���K��x J�!�l���m��k�l�c`���A��*����J7/����l���g^O��;~��w�'\��[�$����B� ��EX)���U���A4� �,�:�-)�,nQ�t1
���b�j(}��GN�VmB���`��7���"�&|;�?n����k7�jB�����^xc1��!�tS�:y�eT�P�r�4����|���S���N���$�5� �yQ���N]�@����8
7�G�i�7_p���Ug�]�j�}x+
e���y�=<�L-)IQ\9�����G�x@�Z<�� +i�[��P��~a�\x��c������`�����t�������D`")>��Y�Z8�
�<�V���xjO���fe17s��{�VX����L,%4+^�{�d��(�;�'������cC(H��
�����g1P���	#��A:�����7��-��Xzx�����b���X9�9
6*�*�����<hS���Xa���X�C+��q� �A�@�p�S�!a�S;��xx  �-7�31������J�<���ojAB!H���{�����Pq$4�-�.��`�"W6|JG�o�^+� ��x���
w)o%�\�f�0
�N(g�:t�<_�>?|Z��A���t��+	M|R8:�����-3
p�Yz��������M�TN��H>\!LQ�-���F�*���}���9�/ ��?�B���k�b�M(�K��=�P��.����OWa$�<�O�6�����Q4��S����s��\���8����T)�_��
� @D��g(���r��pp���.q���	D����m���+,��Ag\��&Z�`���-�4 
@ `����Q�m? H�<xC����a� ��e���E�/�&�����h��
M�l��7�QW�
�?��c�)������O�XHH�]�'m�B��I�7!�@T�r=p����G����<&�JJ(��	���c��H�/����xP��%�^�D�Bt.�1$C8���A>�l��3��v�e�����o
n����n�u&���
U
�|�i�4nl8wv���O��	�L�q�NfAR\���T<X{�,�O[�l�)���N�@�$���a�w�x �i	��c[)�r�N���
TA�|�"�����"��89D[BDH��YT<�QE�R��R<Q���
�RY�F�|
F��'�[�1��������������9���s�
<�r����q*��g�M��DR��;�C���x0�	����������J���|��.��A�J-��c�)��(����lTE�Z�RV�<M�+1��[�-� ��n��y�����
	�;L1(���;9�A��c%�@�}�N����L�*x���h�J��/�x��\����)�%`����?���T�v��x������~0g;�|�H��JJ��i�	��T�/����S��_S�����	����h�/���3:���(��,H_<H�S�r-�����:U�����t�����;�^����_���V����-FP�a�R[�����N*�]�������+�	r�[F-D'�(!<f��	!�uIl�����Q-�����(J
q��)�(���u(���N���>��u#T�h��g�k����yb�:����W�,J:%�j�1/���
#��+��I_Q;��v����T~QH�O���������'�[���B-�
�
7��oz��]X���R����W(F��(7�<��8\�@R\��eD��������~�h��.�r�*,x�?h/O+�-�
��
���y�J��0V�\������v`Fu*Q(�	k�� �V��`���g��&	�$:T+��=��+�0

x��*��Y+��&�W�C��c��}��x����@�����2����]�n?P�"^L]��Q��F��?o�28��@��so�WJ�H�������	�aW�X�����+���D�!��Y*������8��i����Q��n$���qc���\�<m#($�V���oLI�)|J�hUv�����7����T<Xy�8�pnG����M�&^�� ���s����q�����;u2a��eJ]A�@�"���#�%������f�w������/���6���Q��<��/q�;��[�3�s���TiJ@�@W<�Sym�>����c����C ��$��k.��
X��.v_������U8��w�z&���Q�	D+�)�����	�%m�b���1��!�2��x}N��J�A�Zd��Ctm��/c+�J�\����~~�1OM�@@�(��!/vo�+N��"<p�f��T<����K1���d�n/��
c��l�x@ !))!� g����m�w����p�����?�s�4�R>{��y)P������A��W�����Z����6xP�io�<W9�x��<�Ux�b����d��J��b�����;���zL���#�dT��:����E��E���T[�~\�-�j4+�wW0�������
�tKx���A�z]�g�8��N�~X��	� �N*x�-w����!Z����q�gp��R�;c��o��H<r�a
>Sa$%�x<���?0_�R�v�oNa��k�l(����'�'�x����X�KGd�\�Q�1�����-F)�����*�������1���+�.D���*�������A�v8zv��/���*c��9�dLu��%��M��T<�G���p�)�����}����f���*��
�J�!)1��>!���x��	g.�"3�R%fh�4d�����s����m���	���W�e��0��b���)
�B�����S��%��� T�'��ma���	�7��y�����3�����$�>�������p�)�xP����7.�G��Vo�T���+Z�@��T<�{�����y�,Z�@�����3� a�����~R��T�L�	����%=�VOaH�110A��{a��=	��y�,T!�ve�P�b��a� ���(h���>ID�[���.�Pq�/�S�/��oBI�����W�r�3�3�	�;���c�w�x0i�<�A��MF`�L�6�R<��~��p�����f/������8:���x '�&N��v�O)J������[���I:=��=�b�6����
�/I�y����&\��8��p���zIK�!�;�������K��Z�5|�P�u�4�v������<�a���K2x��j8n��9/�0��<���u<�����d����f��E����$���RwL'��G��p�he�8=o;4� �g�Cx����
�W����%R�5B�����b���G`U ����\u|�A���T��T��|n6����<p�����$	�h��S!�sCxl��Ky�����M�<�7����SB�A��y��B���Q� ����fM0��a�l��	�����Co
������ET�s7�E�4�1P@Q���u)u}K��������7�_y��}x�;sL�W�g�E��n�_>7�'G`����1^� v�"��*|!�>�a+
�H�FN_��T#p��0|��0����_�����U0g�Y���I��Hjzx����f]"9��D��m�1���?��u�	�D�9��FE���R I����/�P>�������~!+!����'�4H�0�K��O<�R��~���`�&R
�* x��3�����E�o��x0�Bq'\�BQ�����PP9)�+��$�A��K��wWT���0���5_.����sWS6�uXbX���)����T^h�X{K<�bC;$��d/SE�3V4�&Nq{��A6NiPu�8n*Y���K�{t'rV���0Hzx��B������\��
�4DDH0.m^�Y�,m�Pw��RY���Q`�8�����-KI�Qj5������C��E��	qd���=I����6R1-��?����b|P�4
���y�����MJJQ*���mx����r�xP����C�$��4��|��n����k��d5	QCe���[����pz�tu����N?<�a���EP�@���g��L���U4�n>������(����r}���a';b�c	�(��J���>?N�H��T
a1�
���<���M�,� ���R�<8E�@b*�?��\[��P�G ��S����pN����0����j	+�U��%����V$��������z����xJ���5FB��C�%�I�I�@��:�_�H�����*t��A�0�$��~OO���Y��]T�B@ g����z�*'l�|�A�o�V���D)A��Q[����-�;$����GTb+t%D �������J'���*H8I}�/G!77��c���?�������
�YS��z�	?����n]��g:�)������	QL�]c��&!�@T��T'�o�Z�,�����[��k���ww��E�>�p��5��:AR!n<�x�<n�?u���1�idP����������R��!q���7'��7��G���3l�8��z%T�O��
��q���{�a�p(�w���k��x8':���,�k�����!�e�5*����S��m�����P��rRl�����4<�S�������
t�T+R�7}��ot��.���S����<)�?v�M9�E!@���h�E��U�3H��3�g�A*t����3���/.�;�?��
g/�N5��!@�����G��Gm,������
�x��pOG��BN�����K��|�/�E��&�
Ch��G����,��g	��;�XV���/�*����Z�H��R!����t

1���*��Y�t^}x�����b{���@�i'n���y:8n[�)X�1��yz9��4���f�V"�
�5k��O9���t������yp��i���By�����B��-?*0��������b��-���#K���GWL�����I%�P�)����l����\��m�sl~S0�����H�R1c�YN��%k|�[t2�Dy �o|H�(���@b��,%D����$�(H�	; I�	W �>Jv�����]P�,���z���w���|.��"!�A���T�>~I�>K�����\:S���O�P<p�Z�y������^p%`�O%	w I�����5����H���|YF���U��x�
?
�����0@���<d����
�E�5*8UK��x *
[���e���b���f���[��(9��C���0s��u�4��g!�B���<����D}BBJ8��T��"`+6�)�W�:<���
��p:*������$��M�<xI8����Ali�0�_+V�s�<��+|d>D���*xp�?_L����3����gXT$�s]@���4�3/�����HXH�$��H��: /c]��Da@T�8gP�HX�4YP1c�����+9_	� j�8��<-!!$	x0����)5��N����"'um���&����7����\S;�r(J%�a��.WY�a"���;�/0��:�����p�@���hF{!�+�x�h�o����Oe���:���(�Al��RF@		�M�@�5�P�}����}���$��.���)v[�N�1��~l�\��v�}v����B�"A�<���k#�C���.�D�BBV��uW�X��&_�A���
Hh�?/�<�}������x`�����0�u���P��I�������a�����W����1����x��)������:������3��n���Q�X����/"�������1�1���?F������?O�;�A*
�C�k�rd,SW�H:z
"��8�m�e�������R���g���@������"s�f~r��cX�
���h����c':}��L|IT$����� IDAT9�9���
9<�����C����{����p�S����J�@���G��Yp��n���P�Fpe��`*<�}�v�a����'�/���1���a��GJ1�Z�����������-� ���@>��,y�c��_#��*$�$�c�o`���(R�%������7��$oR�*��iy��yB9�u*RO����O$��O\�U��_��M;N�/�{GWlY�%�V����r�4j����V�������Tu�\%�d]�����"�[^�A ���dEB)TN��s����"4�4Y��#�����&
�m�F�!��i�
#!)>� ?�P�C�6���%*P��{��$C/T����K�*��6�z)���������1��WO����1��x,�2E����M���N���mS�,�e���L��7�u�}g��S%*���1���+��g��}�)8~�Q��2�Z&`�R�wj���'������8|�J�!X������	�31�@
����=�7���V�*���S!|�x���C��Vo����a�<_���91�t���\��J�h<����	@�vN���)������dH�{��'���	zHH��x�������[�w3�\=�o������0f�l���������0�/���`*�P�V��/�B����]�L=�_}�7�W^~>��>C�<Ta=������1I<U	���;T,(���G�"� \�F�X���Z�@�h�6�9�,U���[Q���r��K{~�0l����(�<�P���V�"
3��N+�L~n���@8�?�
�y����c����^���P
a�w%_����}[�"��w/QE-s�=Ut0��,p�b����<�P�;w.`��~1M���T=+U�;��k�A��P����]�&�cl�7f��u�(n������z+���7�S;����r��P��n��2�>���U45� c�#g��	�3�[��'�^`�o�0q�`���GNBd2(_�8�U,�D �<���A�%\���9:�H���[�`�O�`���p������sdC�5�f�_�z���������'I#~�A�����
U+�B�b�N

<��y�~�3Zl� ��qo,�@�v
����[����xs�X�;�%�-}�c��_��]����b�?v����.c�)���R��B-��w�P�^S��c ����
��o����x`�vR������n�}��SIH�6R�������5������-��o�$q��)�?�M�804��`h�����t���C�s0��� �����|���o�b�Z��l������l���;��!���)-R�e�
�OB�C-$�?A���������� j
����)�X�s/�)
]�@ 7������Oj;���7��!�LB���6N���������uU��4����
:�]���F�Z������������5�>}�%<������$���U>)�������I<0V;�����x`H��(;�B��$��/
E�������[�J<0F��QG�P�����XK��Y��-��I\
<H�Vx�����C�g?c����ZT�kO
<�����J��4� %��v�x�x�S0�����C�^<�d�uT48v-Z�������>���}��zy�HH�(J������V`H��C���(c�������
:5C,����!}�����=FJ�0�<��wQ�,x�����1�
z��f������O����A7��#x ����"HHC���T�4$i��!V�?GGG���VA2J�e�]�-t������R+�Y�t-��I[
<H�Vx�����C�g?c���m�������e���v4���k��ZM����4� ��E������y�>��k���h=3�4�@;j������=F���j��N
<0���n��Kj�A�6�/�f7��f��n
<H��5� q[i�A�6zW
<H���]Z�kQ
<0�=���-�����x��x�=�l
<0��M�k������������ag
<x�Xx�����j��q�����Q��f;
<0�nZ)���8��[G��h��.���x������t�KYgx����������:p����������J�>'��2�K_s�3�x������������]��D=�A��-z� �ZI��e,����,0��u�G�+Mb7��x�M�S#��������%e�q�O�cN�+��"��HV�z�5�7,CSf<����UbA�}e��{������ �'���AtJ�N$w<�l.��GFF��-,,j�P�bx�����,����f����1������
��������>4R���&9��[�c\��H7�E��x��z���a�G�bM��9��uc��}���G������G�`�������pr&w=��\Ir��5H?>��v��w3�m��3�I���w_�S@������'��+���Xg��_�����{��C���_��^��K�m!.�^ps?<}z������J���t���>3<v�xX����{s}hc�	��f����Rd(�8��U�����x��xa�/S��������/���p7�!��KRyC�#���.�$�LE\���������]�n+-�f�T�����M�>$����m�uh����K�r�2��"6��h�aLk&�.��x��)2g����>����|��x����;�����3��6��.%J���P�b*��)����G����#%f����#��-�Ji��R���^Sy�i�C��>%K���O[������P��d	SSX��8k���w�~u��zD�:5�����u���������[����4� ��T^��Ff��K�{��/bcZ�T�Sm�j�;;�u��xh����Y������l��"�u��x��zD[�'�~6f
�����L~]�x$�����T�#�z�Xw�q�1���X�T�Sm}h�g�X���x��zD�Tc�����T�#b��|>���\���j�,`�8{�.J����29}+!
tr��]����)�����������-����x�H
2��������=lllR�b)[}J����La<d�|��2d�_�3e��k��C��T���U���cJ5��z�5������a����#bm<�uG$���Z�$�g��`
���������M����������z��z$��z?���x?vNj+���������%5��>L��R>���G�R�>)o]�[H��x�s�)�e�Rj<��3�W���T�#2��9��A��%����4���pS!���������I�
��|��xh��1����e*�a*'v��H�=m�La="�0�����T�#�z��3M��������1k�����L^]���������]��#����wE���������K��x��zD�Vc����g*��@j>x`�=���?��������X��L�{)vR�ElLK���a
��-T�yg'�.Smc9���1k0���6��yW$�.SSY�h�������A[����K����X5��zD[���0N=��K���a
�����l�SSX���j�a�;;����zD,����$�^�j�?����`���X��L�{)vR�ElLK���a
��-T�yg'�.SS�8��#���1k0��Lmc��wD��2����^O��`����1������H�
�U��>4�%�S�����>4��`�ZLa<�������c*�a
�Qm<�s_�S��[��������:�o, ����p��5u�u�aq�������4<2<�����Tt���I�Cxx8���b��w�B�|����F���T^��F����<��^#fmo��-\`ii�W9cd�i��2^��U����e{�8d��9I*�?��\����c����~����kz�����b����@o���d�o���\GR���_i�s�/�u��������a�H�;�}\�|I���x��NU�b������nC�����An%�����]����T�q��)�NJ������}Yx<3������>{��i�9N����1EL�6�U�_��n�z$5����Xc���}h}�_��1����H�������4~������+����Kr�)����e�?������S�kU�8��#Bc�~���;}.<y���}��2��Rb<�[7F�K�z�"�YSc<|K��a���w>V
�����x��eD�l���lB`x�(u����ao���x�����\��};~�L1\|�o1�W%����%,�"����5���3z�=H��a�vC����\�q=����xe ��D��Hkc��/��o�Z�SxF��UJ�G��3[��nOR1�pV������$�P��Y �- ��������Y���.A?�����-���
��t�3C��ip����g}:S<�5���H�������g��1��~�K���!�:���Y=E������2����r���g��C����8c���un�:��5�4�b1T{������+3����\�������"0��wlr������c���}��[wj����>��,5�@k�M�OS���g|��:X���S���\a�3[����{�����&Q�t�?Zi����dz��!�Q�� �^
1�h����f���;�S���\i�,g������j�5w/�#�b�)�R�j.��$<o�I^%Zie��}��(w�M<�������;�a�&z�����#O��F�l[� X{���z��������L���+�k������j��@�Q�8�����7�-P����ppc�wD�A�[����I�~DV��S����H�EY�E���}I������!�����I2��I�@�[@R4� ��@R����f
<xmq
<x?w��;��
<H�1�z��a
<�g
<x��������NZ����ko]kx`<�k���lij5i���#����N+m
<���4� �{��<�c�Z4�S
Y�2 0(_?
3����b�v�.��|�9�����eJ��'0��0{�
X[[#2"��}Dyl3\�y���F���P�\�7���uk7�Rr>�sdE��u�P=���Y !h�A��x�rc���A��G�sz
��8I�!+�,����p��+��k��6L�P��Z�	C�:6��!�[�'U���������{��p�zZW�V�����3���m����O	�`F�O���_����h��wz]V�t��U�����2[�`��Gp����[���hV���dP��	T��NM���C����x�>��������f�S$���R<��C{L��C�6��C�q��~am�r1���j������z���yI�BL��i��U��8w�^������?����'Va`���z��z���{E��:`���z��e�T�>Cnyc�����_U���N��oh�A���B��V�O�?�?���~g{���B����X�4� ��)	�h��0�`d����+������(��+;b_{�U�*�l����E���g����8>dkb�����	�(�A�>(��*N^\�G��;����|���������O������]�qX���$�gL��.�#����OX������I��.���gL�5K���S�q�����)]|��1��9��w�������
T���/a��GGW������s�	8�{	�nv�����{�����������S����
<��>;�W���������^�W_?��#vZ�[^��*������x��OmQ?��o�y�����)dL����^���J�l8���������3|z-���I���E������P��,��5�}�e�4x�A��+o�.+rTl�k[f����
h����4�����0wj��Q�T�p/��k�����]N�y+��6����BB?��V������p�Rt�y�mX>��o�ag��>C�`�����m�]A
���K+��	�o_�e�G�����#��wo�?
gv�������0��Q
�a��}���^���hc���>E��?'��.��n#�}�xD��R?���?��\�nb��Uz�����A�_a_�5��S�$���[����3	
C���q��9,^�	��}k���8�O|�i�xc��������G�ZU��u�dL�E
�������5��T�J�7~�������`��	����~]�l����)[�H��0Z��}h�A������6x�yd5��,���t�2x~�aXn��^�rN�/���N�����d�8��	�y�;O"Q���,���l`�4��J���R�y1o�N�����/�����������k�_���Xz��SG[� �������>���{��4xP$C��{��Lu�����T��1�|pa��}��2���cte�V���CxTDr�1zY
<xm��j�������P|D�T�wC��Y���p�����Z��
{~@�jCS<���rd.�#g�%y0&x����O>�}N�<���"�]���n�L<�9`�6�+6����r�D�R�f����=�A���S<����g�'`��!I~�������������4y����T��h�[:�����w���5������5~������,Sr�+�<�`����2D\�@����+�1�K+kt�;	�g
|�~
<0�>��db��������`�V~�F&��7��������bY��D��Xt|�q�����k��+��;���q�`[�,3_��<�����u\\�h���� W����!�����_
���TP�����jK������������2���Y����=q����t�&��CQ�z����f���
jUF����|��'����~��)XqC�b�����N�'��x����K��Kk����`=�|f��&j�w�ffh�o"������c��;"Q+�-���-c�5���2��OO\�!��Y�����O����O�����S����UG�
�Y�xk4,f�h??�x�r�x���|��i,��Y�Lz�����%��y����,g6MFeY��@Fn�Y:N���|�18����	3�n1�$LO��e��L��:�|�
O_�!��
U�H���e�c���w���
G���x�ri`W5^~�Vph��{�#�?b+'*�Y�!`�C��L3{����4C��=�Yl���������}X�w@�"i�,s���q�7��t�O- !� *�V���BG3��b�������M�[���(���w�ZT�Bs���jaK�u2g���`���Qh\�
�n�v"_F)��n�����y�u���-�-������|(z���e�(��AP��P����(���!��ZW���K�t7��fp�\'����u�a����H{�;�D:''<�����~����7�D���P�xiB�f�a�2�}�_�h�%v�:_`���8���e���kq��un�
�dG$���TE(�56n�������������
+1�s/��=�a�sxR�������w_�j�nP������^(�+=*�N����V�"���d�OP����Z0u�U�E�?$es�E�R9����<	)xt������l��B�a���-
��8��>(9��zv0�br�)+��xN�VN��q��������(r����*�<�G�\����w`U5[��KJE00[DDlQ��������n,�nl,DPP	����rD$p=�����U����kf�={��o����Bn?��w<]{L��\��h��'�?�c����������{��-=���6
P�,��2n�#&8�C��6��#�A�e��_�!R6�����T���N��r�@MY	**���5����1��PN���L��]������]�p�������x�Z3R<`mY��5�
����p�>x'����8�������T-���EG/�'�&�k��7������x���2�u���
�w}1����\��y�nwB9]�lmM��=c��8����E�Zc���/���V%�Gs]���I�*h+�c��3�3oo���l|�
�R4�X�1�(=�0���Y>�f'{�|r�R�^ IDATeE�����3�����!�b@��|
E5�|��g��N��U�L!�~t\`��"��A,��#jtDq5$��L���r����
�����������A�^kC��+����^�KuE<���<��!�k_����[;�]�/fX���Ra����M���?�����	,�M?b��}//`M�q�	�����az��p��3��/�y�����/f�����(Q��l5/���f	����CS�0Vk����|�Rh������7q���Vo#�����9���v���������fq�q9���P��������������1N�l�j�����wv,b��&u�w����x���o�N���(W��������{�I�xAm���l���z�R�v�8J�kc�5{�g���Y����(�B=�MCh�(�{X$:���A��Xs��K����1��BXq�.|��2��x���u�8�"#!������{-d
�<��%d����)���IO�Z���t�xz��Q�GU|��
�^0Q�^��8`��������)X�iy5��+��o����MMaD�r*�p#8!><��6�����c�C���[=��rK[�X|��Vi�
����'����Z#�K(5�qw�I�Gx�%���Eq��	�xPyB}|8��=:P�����C�@nS/!)6��5�s���x��tj���Z�����.�Uax�^�<(U��k����,����"���]���<���w��� ~���;����(i������2���EU(+�����0������Up��|����e�	PU���N��s���6�<1=Z���;��o������l{�K���,�o���T��=S�9=�+4��G/�"4\����Z5tQj@e��Bx��	�c`��"?�����0�ok��xmIVi���/'��^��(n_	q���x5������t4T�l�=ke��������I����)��`a�V��w���������1r�	8XVF;�*4g�EL\�o>�2%t0�K#�G(b�������7G����{h��K`g��ZU���I�xb��V�f&wol:}W�kc3S<(kV-���CGrp:����F��}���M�d�c�R^���8[5z&��8�vNG��m�	�z~���`��Q�V�%�['(�{u��q�������0����
�1��w>W<�c���_���c�����
�`r����x�N��p[&�A@�?��^����	�v�}�x�x$$�cp��8u{/-�������C}����&�&<��a����jgf��Lk�S����s��k�3b�|�����0��"^���;:�|ZwR�
X�s�t@�:�^G\|,V9���^�v���8uu;=/�cP�9�P+��k���g�
k����]�����<>������X>���YZ����@~�1�V@��2�Ie���\��v�&P�>��r����zBRY>�^���~"�u��������U��^��8���L��#��eF��r�jP�]��
�s
u����q�w�TX��7���w�jKD���I�Q��Wd
+���G�@��J-+��?}�.�����(<�	���1Q;��+=�m�&9n������E6��M}�=��i�D���#�0�>'e�xP�����k��t�T�o5
��%���	r�������'�#*����#��
���Po�!���CM��+ ��z��-��p	SZ{L��=���J�fr�_?���-Xx��jZ����V��N������el�vt��$�3^;-�V��(g7��iP�V&����������[�T�.����{Q��,����q���Nq\%��x���6�\�PR*���!6c������+=����o��p�:�QA��X�N�,����_�T�F��t�)xso^���������S��/JYXsV�F���^L�W�=�g�I��=���8���3�F���R#eCD=��U�,W�(���W�����3�w��-9�A�8�!�������{���K���>d�x�{�b�p�8�M��R���*A!�fV�g���q��n��]�/����u[��u;��x��}&�k���

J"��M�D'��q���g���1J�,������x���o��T
�+����w)kG���s� ]G��T��W��+��8$�+l������y�F�cm���[�3�RF�Y����������94��Z���Xv��*�����t����\�p��������N�p��l��-w�`L��\Q�H�9p���2:%���	<�}K�e�1�~,����� ��{�����9��W.pz~�l��T�����{��������|	
�&�c�Y�������Uq��Kp���������_>��h	l�s��p��9�vcu�xA��k���;����_<��������V�����D��l;���k4�I���=1��zt���������5M��|l7���Gpv���_P����;x{$�2��O���6U���L�V��hb7���^=���O�U��J�V��8:�o�h7���N~^2� ��	$����y�.�F�;���9���+������h�*K���+{![�
;G���^?��E�&���������E��������l��qh-Ue|������E��pi��t���%Zg��T�x���l�ye-[����
;�g'{��tm�c�����#�����c����b3����1r`w)0���������
��Tq��<�wo��,Y���<~.6-�������cP�P�E\�2R��'$`�?��o��������7<�x����N�wa���0����O��L}�i��U�b�� ���C@h"�d���<����}���M?�{��A��E��������������Rz��m6O[n��#�a�H�&�aH�����<���@��0��	_^�&%��x���=#�E�����X|zv	�e +���/���mo�]�<����kO��Yu������� O����8�A��P�{FB��b�B�TW?<��TIq����%}/r��+���>Pd����_����2q/���"���;�YL�'e�"���6tTY���!�(���T�x��/�b��"�~H�
G9�=���i��W4�@}�D����a"K��q�e�>�"�`DkE�E��9�xt�Q��7��2������.=��]
yZh+���AN��i�p �AWKkN�`��^�$�F�O�l�����:�8(`��8�k�/�!�L����x�<�Ay�}�x�����C�����hU�6�=q���3�y�����?wX9KL`��.�����q���qj�t^���Z��=������
p��u��5�/����1w��B0��A�0�CwM.r:�o�#�x0��}tT���(��0Z��������;��+C(������������fN
�"<hTN��51��6w�)���2f����B�@�H�PTh/����
�v�����=��6���K���
\_���X|8��\?��I
��v�w��������dh!=>"N=C����F�Z�Gy���/PY;��z���Y�����������w�XW������?����X��V�����0,;u��,q:IPG��������4�W�F�z�8p�����-�.�N������\\1�mn�mhf�24T��ux�X�����8��G&�E���4�pdR_t^������l�b8��V�k�q;O�*��m��(L�dCL�}
�����-7,���-��9��+O]��K���t��N��F��cW.
�a������	*�����w��$����A��UQ�xlt;��5�F�^�9xn!m�r�`�}G��M������1�6��T�`J��sy��mp�|y��E���K0�9;l�����m�e���rEQ��<��:��j�_U{���	(A��<���1(`�+4���;���5>�}����z}���"��y>N��(�{��l^wQ�W�� i~U�1ra	�����dc|��"���-�U�-����:F]^	{��|���[��r*F^\�M-&c��
(E���� �������=;��X0�uk+������+,h0)DD�������w������EKs0��(m<�{y����+�	L�C��f.`����k�����7:��l"�_������;hI}�����b��3��zo�����R�����$������I���A����}�wxNd��Z���T�����.Q�:fYMZ�@�6�u�����U6�e���3�=��tB,��C!PzS��������e�3������#��9���g#�z���'�������B�X����6/U������V������	���(K����R*!�/���p�����n_��(�O�t�]������0����3�<����9������������x��
1���Ma��p>��.��3���oW<m<"��������y�j-o	�	��\�0�������(��6����"l���sX�m��0 0"��?B�BYW
����R<`�������w4�*Fk*���^��v�c���`#������`\����B��|q����K$���;:b��>�Y�=�x�E��-��}���A�37����7��u�)����o���e�m4w��E���&���m� �`��'����(�W�6b#��l��_G��	<�6�����C��M��c�!�E ������
�?G���:x:�:��1����^0W��	�t ��4�6=���R	Ux�pG�9uy���#N�<hT�,����������\=}�� �>K�G�t� �����n����u�,��z����M��������)��#�,��!|�
����-�pbN?������\�b�0-��2�a��tlP������g�A���G�qSf���������^CK�84���M��'��A��*xt����������>���m���N�id���	�r5q��a$��6^�f����Q���z��@��oP���CvSF��e���([�N/E����z
['��������Ao�<4
�jw��/����5f�^����PL��w]�������i����]�1����`��>[M�<��v*�EO�>� �H��K_�����Lz":&7\N�o�i�{j�>�hP��Ws��X
���go����.���q���p8]��V6���?�>R=���!8��:�rd�Xv�y�,.�;�%��b��X6����D�[�����}�5��u�&qP�?���#�/���8��j��_���EK���h�vun1+v������Q�\]Y�����I��[�"l��p��-�K�!
D9>D��v��rI��PT�oC��2��*��Kx{����@s'��@��9b���D�x�9�O��c/������|�����<DC�O��Q�\�	�y���2
Ok�����6�1TG�+�����v��]���B���0�u�'��1,����5��F�����z��x�^�O�����}��Q���xF*�u�����0�������IM$P��/n�P��yXHVg��������;z�}Q��
����*t0���m�7v?����j}W���:D���%����;T�d����9x�Ba�_�����H�7O��.�� �������������6+p��M�3��5%�,M�l�wfzF(M����0��gi�eH��O��5�rg#J�m��YC��������!�6(��?:4oi����Gb��eJ<��s3�8M��5�5�o�%:�$)��J�&(_�����i�7��/��e3��mP�}�|�~���7`������G��s�e����B{����/�u��xp���O�s�a�����i���4��h���lQ�t%|�$zO���c�2��7�Q�����v(�W�`�q8�c�<H��Y����J	�zL�����i�@��i��
���ThSy��=X9�j�����3�3l5.��@��[=,�����Y�sz��<X�f����
��KH�y|�[�����0��EI��,8�w������2��w!��r�P���F��S��F�t��S������B����+xP���j�"���14�P_?a��=���V�,i�M�@W�m������=p�6���p���1�;�Mi����VC�bJ����{E�����80���>o7S`������n��'������@v]����Z`��R��Y����������7����52_����8��g!����[ks�(��Y?��3&�������
�����z|#��n�>4O�I��{�~�6u���Y�������0��������E
��G��y��1��	��@��R%+Dp���3�����x�>4�MG��s$|��l��t��*���J��?qSZ� y����	��Y�����-��:���L�`��n8@�
�z,kUEHh8�����{.��!���{����D���������U�hT��>a���(e������q�E

�u�C��A���������������x���w��[�*�By�����������5}�<0).��������7��&��gZ��Q�����q���.�y�<(���/��C���h�Rn������0f�����a�����:A�6�/oC-����D^0I�U ����y�����fq�;%�P7?~�e/X��������8����������h(7����~,|����u'�CT�D����@��h�4*�;x�R�9�������<�<����h�#���xl��
������B-<���w�0/-����D��(�~�A	�(��~�\���R��6��Q����v1#Z)��{<�IV��PN��0��"M��	��H�����P���Yx$�$di���q��2�8Z�6Z�z1��v_���}���6������[y"��m���
����&�����O]q��Q�%
�c�8�X�|Z��Z&����>R<`���Yh�bXL����S�%���	*��`��"���}7� �%K�����������Wt'���I��oi�� -���	��u�q��H���EI�����m-�@4)i��W�����x��L�����'X�����T�}�Eh�����juf���'�8���8-����U�G�9�qwr2e�:�B��p��^��,�2�6�"����*E����~�>�����H(Pq�����l__��Ds�\NI��[5=��bIi������fth/
���(���I��J

���#��O�3u����G�����lU���>�Jb�chQ��C��d/�vF���y�
hgiN`�N�.
��$/��#�����"��45�jL���cS����]4��}DW�Z�=�����7��4fvn����63�k������� �\�����$����������$���U�`�c��/��S�)���KT���)�=��Xm�[&���Nj<]�3W
�Ey�f���0�z;�LP]�<z����M�b��e"_57��5;���5WQ`���Z]��@a:%v���'%�j�6����W��R���'��b3�Vp���pg0K�C&00`���X�h$�]H~�j5����Q��hej�CE�}wGT�;��I���7�)�a
�\�����+��a�zc#�Ti_Z(�A~�K>!�������K�9��/r3A�/��a�	�)��FV�2u�:�#W�8��*X��������Dmc�fp!���?f�)V�%_E�I����_Lm���G�PS�1�]�8������r�N����C�h��(-4m�����'��d���,o��e��TH�����O=�o`{��~��5�X����deV�{f�b	8�I���*C��&��C��H�m�h��F��Z���r�M%|���{:��@'�{�U^kE�N����4�����k�\�@����6o IDAT[����
WHP*��7��?�b������������>�w�G\h�8�	Y%9<[xU&[���s�4�
_IMA���r��)0�5CMh�+��q� ��n�R��B�0�'\������(��bma�,�o^�����
<PU�"�!y)���M`
*Jx���������NMv��~��s��2��O�?�
�����	�JX��\0�L!!(��N"��&�/��]����E����FD����_�C	�n��M��8rq*)!��j
&�u�����\F��i��zELH� �o���2#�@^KeF�&������M�W��e��SH��~�k�������<��T����0s�<������<`�YC07.������i��`�����.��p������;���T<|�q�@��2.Cy�Z`��`�z�����dRM�1�+z,�'�1��l-L����x�Q��Q���B#��]��H7e0%�.��Nm�:��fuD��;O��A=^�z����o�0E<��iqe����N!�>c��N���_A�Wo.�}��JQs��O����)��t�3�)#���to:��q������MNa��6�Q�>�T����E�U1�E
�q�x0��t��9��[�J��8xe��G��
� u�k~�B�^Gf�S"��z)�(c��e$��~:�������#<�����6�]_^������#�����]	:�����"9�����*��<��z�u]���mIAa-.�;L�&�Q���LA(B��{�����
�KV$���(W����#8�\��;��0K+&��e�*����J�!*cjd�ZmHaeo_Y����[�*BvRF��\�bP�U��!�$5��e!C*k���Bcc'��!��TrF�G�-��������
���	��@��dH�'��d�[%����]����������������#�����O�wS�*z���A���PV��)�?��r�T`B�B"|���V�����'��#W$x�1�� K��V�0/��O	y��/����D)��P/Q��
��D��MDC��_���'�<��u�:���p�3�?>��]���TT5�}�����:#v���� H����|��,�~o9x�R���`h���������I��$��X��B-0��&)��
�F��e/=� �����.��_��n�b�*%NJ"��j���m��.{��/Y�'��xP��j��o<<�
h������MUqSz��}?
���O����B��9yVIR�{�7o;�����SI�
S9c��V0�S�i�%�}e`X�+0��C�Y��j0*Z4$�^�����.�b�;��1a�V����s�c��v\i �o�t��u���NA��A+_�o�7o��/
�~�����)9�LJ�����I;�u�@x��7�u�M��_�q��N�R���i�f��:b0����p��~k�E*8C'���mSF'��:�<�EJC����C0��O��]����F\��6���I�c�����)aR�2H�7�����8�?�Kc�Y����n���'��-�P��1v=8��
��M���I���hEj{D�����+�%E��^/��������'s�N)mP�q���(�=�A���*C��T7�SR��
�g�r���G���|�[
xP��)�3�!�k���h����o��p
��M���Mk;���{D�x��o%�C�)=����%)���+EU���wD)Sv��������CY�����oF?t���.T��A���<|����X�.�EU���$��j-���SB-0������C
"tZ��*��I�g	_?B�V��������^��&f�"ja�����:��g����H�@�dJ�C��U84����F�uh$��}�_���3hjc	�C��7�)l���C���/^�y�UR���
i{& ���0n���c3�o�������\Fv�5���d����~�j\D�9G��r"I�%��<h_O
'�E������+��$��>��'�������X���iy<(���/�E���\%<����Ja�4_��"b2H�@�>XU4uy����f���P���ra����q��/����l�Y`=�<�C!��S�.�avshS����8�	
)��|�B�zA{fYxOab(�BaR<�}J�$s+���<�o�i��z����R���B�2#hs�W�r�7�d�f���I�I�RJ�c���v^��0KL�`��"W;O�{�$4�"
R/`)����k<ZR��s.���D�+4�"�+OI���]��#<�LD��2\����,�f�
``�0Yn����;�7�`����Mn����xB�LM�����+�I��e���Ei\z���c�b����:x�	XJ�������3�����=4�I�x0��V9����1b��x��k�+���]�ly]L�����)�5��O���2��}B�F�|���P'�����%+h��7S:hXV�)�p���o^)T`�w�A-���,#l�v���x@J���B�?I����&u��S<�?3�����C5�v���t}�����u�:1w&�@�i-V��k��z�����N�1���K<���;�]��vm���7,���k�����g��A��V\��\_x��_SZ����{0��5F���v\���&e���\0�Ic^���*e�RGUc\~����{c��c�<�3�	X::�:-����kkP����q���dy���k��$�[��v�+� ���-�H�$Y���uu\�������oH�I���)tY����3�!���I�*0� �dI�#	�O��l@�h�$���<Y����5�~���O��iX��XZ�d�Gi����:3G�����(t���2?�_�B0����P.���al�-"HX���t���=�Y�%�����l�\�v�.ae���%�/�x��f'���E�B*�|x�o�� �`K�)�d?
��2�g�O��JAj����Cy[J���{P�v�R;�Wj��1�fg���fHI�V����jk����XE�&XZ`3�I� �|�����gwR~hM!�r8�)A��S��)W0�����ha1=�`��j�r� e
����5�3�2��<xNWJ�8�K��,��l���)x�K���%u	:���~m0��E�����,�%���DW%H����O�^JF�A���|"��"l�j��8�'O�����n�cT�d�`R`��)�A��-�j�=�DP�s|>���k��#��x`{�;nt9�RmIu��t�H������(;������p�z�@��7�$W-x��"?�\��,�CZ�@���|�z�r�������j��.RJ��<�J���A�N$IJ�����eu����tR]��zm���B���(V�$�/��g�S!xK��a��06�A��D�A�fq��&R<D����:A���E��S<�i/���
��&�'�g�S�3N�XHa�{��7�����Vc���h�Zp��f��B���.H���Q�ax����ZE

�ae�w���!��2X������iA�5�����<0�\�4F��z��oE�[�%�9��R^)�*o��$|����0l�1x��I
������ne�C'����Y`)���^����AfsT[k����sI�`�.�v�����eq��K��dK��14�Y�|�\���/���x�6.^ `R�?i���S���M�>������9��O���Q���������B�a+i���
�4=��c�5�-�a��������M7���'��u2����������l���/X2t7W(H�	0hgC�V���ys
M��V�	P�F@��?Th=&>* :�"5RN�4�P��)3����
|�25H	���GH��@4���#R�h2'�m���ky���*8�p��m?8��C��h����`��)�[�9��`��\O�b�,�>�-��Q��R]o
D���
L)a����-�i3�A���}�Ir(4�x0ay[�+�N-F���
���I���
���������A_0{�n�[�=��C-t����nP����\�&<(L�\� ���<�^��rO�V�x��4w��@���pL��]'W<���=j��4�wC���Pe����sHYa�]$�*���!x<����
{������0?�_@�lm05�1�H��'W;P&�������%�S<h5o)l&���q"W<����	4&�Z��m|���+)<?8����m�I�`���5|�`u��7�<��k	<Ii!&�;��TR�,������K���NZM�
���������x��5����S�1��,��fR������Kn�C'��������G�o���X���p�[�[���V	�<��0ONoG}:����S��RO"�A�Z]�H�	�~N�q�����m�x�@�8�D&U����q%��Mz}�
�K4��K�7#�tx���lZ��w�*)�w�D�6�E�.��y���Nn���A��R�4�<�Q:����@jt���w�$��3U�%�ZC�6�[����A���R�m���=��3x 5�<���Q������yL�{[j��k&)l�w�'&�?����#�C)����A�j
M!d��AS�v��a���x0�YwRC������x�Z�`T�XJP�^I��M�H!.����}(00a0�_O>��+ �p���x ��Aw�H-e�L�x0�B=�:�,hc�������K����Q�\ko
x0���h����Z��w��H\��F�yx[���I ����4�����` C~��(S-�p>1����	�����������C�������D�\.@���HR��+n�x��!�����r,����C"�4�e�����!O���:BwRrc���/�� D'2��F��f�9Y>SgH$���u�w���#�q&5����R<s�$��CX�x*��Se7����{X9o"�o��C1���&L�����
<�Q�"��#������l���'w9NMU%]����t�N����
��>#� =� 3;�	B���2����e�WRA��:o���2�Bp=��;����c����AR;�P�J������-�FUU�Bh�����5�~�,c��}Z� ����/
F��"D���������eW�_\�2u;�	tZ���'M
v�������V�b�d&:	����F��xIE/h��
F�R���H���W<`����@dz0-*���l����P��;��Na= X���>��rJ^���(`��<`C���"	�D�,�S@V����kt�\ky�k�Rx�U~I��$�"� ]7�O��T��
?��N*���o�������
��%u��4��J��]���E!o��p���[��{���Y��+D���$'�2J�� �,��^*���x����S�l��fC-�)���7	x�)����E����D���������(T��IhUK:2\`�(Ll����[!\|�7�Q�"28�0�)`��8n�' ��OP��eaB(tCj������|�N�2?�D�X�=�B0)�,m�~W%^��7��9�R[�$iSf��&[��?TiQ6�m�1
��t %�&U����,?�Qvm0�q����c��������2
����6�(Z�d'��]9�
F�l�enY��/����F��S_�'`��a��m�M�a^���r���M��b�qf��~
/��N[2�������x��5{z�~���O�N���T��A]c��Z�.{�{-#���]	hxE�Y���RF����hUCZ\*��SN��x�C��e��1{�{�f�p�Y$D'�<(Dwj${�C����uf��z)m���A�RxGJ,<[ z��g�o���e 8���F� ���\���6����N
y|���z��B;������(����"mJ<����*E����Ao�\T62��n�C��uM��c��c�1�,���6�Jhi����8��!�Hc&�o�n�z�����kW>f^��b���4N�c��K�����Q����=u�<`cqQ���.�7&�iij!<hOJ����v-<z	#[7����Y`�N�M�<e��������6
��m1���p�`D+kjs!���h����M0�6Hw��������Q	4#����xRur�{>u��}���(��Y��9#,*���<`a&���$��cO���0��� H@�����nL���7�Yb���f���g��P�)�}�9�
�'�������L��Z�p?W.`��W�\��)�����8���3����jmS<yi�����S=:��LJuH!��c0K<`������>���h]�>�i���~|��~��S���XR\�����������-�MzD�V<P����l��qQX�`�����;�k���Ar�@`���`������6�������L�`��?uy��:o��j�aH�X\[Y�30�1x0�����<����� 8�U<`m�E0�����X����H{MJH�Xv��m�__���m0���t�q��1-x��
nW9<bN�{��g�>�:��q���6�����5�����*���s�Q&8'���Y'���
)���Ey����e��N���A��UYC|H�651������Z��A����9=�
�2�j���������KJ�����q��A�e�(���q������,�A��"�@��.*���7�?|��{�UXb��_�����L%��F`J�P
,4B5
s������ME�Ly��w`��FZ"��?������To�yMH� Ej����S�<�>�YH�e�A�-m���7
�@'8)�������~�������.�^�x�7;\���_�+��~��CD~
A��h�lY��$>,����1��1����ijd���]����pj*ED��~13�*�ci��<������8��x��Ek��ru�G/����>� J��v�����x�������b���\i!4�+���?�2�����w�����p:��F�
U��y�Z��������i�����pU�������\%!m�<(b�����b������.�5PaV]�O�������6%�q�Kn�����������q��"�Gt��s��C����[�'3����41�wK��������j�X���A!��&�67O4�^O%+0��E�
�l
���a��R��/zL��G
�����w���0����=���
�P���(��@{�����_X:���3�_Kl>s������3*Y���]r<�K�7A��
�l����A��K��d�C'C#(��?�
3�g�x���Yl��(w�0]��'I��tz-�k���-|3HC��1��i����g?�����k��)~v{��N��k�s�0Q����N�<(Nq�Gw����O�=�Q��O��Q��O��\9�	@��m	8��50���}��@��"^�8���`�_�Bq�K�a���hQ�N���om3����[�������R773��zE�7��7���XO
������y�)>�������
}�x�6��u2@a���\U�>������L�@�]/;��o"v���w)t]_��m���<�����
�t���_H����s`��,�SR�0���#�	�H>`�f�3��xF��)Wo`j=n0�5���F
o����!����%�=I������51%�cJT(S]t�i�=#�@�wm�U*��C�_�<)���r���?��}�dti^�1��$$��x@&����������PhYMZ��J,�B�)M�s��=j�h���@e`=$�R]����DRx�~��������H��E���:���-6���;+���Y�
]�,^���E��Am�Vn��	�����}ub	��OuG�F8Q�~y��a�f�~ IDAT)�Q����B�=�u���^��Ln?�����XP��0DS�1���������a(��`Z�M
�Y�q?���iT	/�������
,��U�Q��$��W��J��<o������.hW�M�����x��7^_��!eR�h�Y����:�����ru���-��f.=����'N�f ���R����TgG�l�+�OPXIf��U�����i������h"��}����a�h��n��i���%����|~�33jQ�x���'����V��<`q�+4hKJ�M���������Ka"���]����w�L�n�%��`��[���>�cF�^�)C�$)�����:`!W_z��>���*X}��%��L@�!+�s�p������h�F����&���AD����]lS_I���d���W�b���E�ic!�����P���S����:�s�I�@���">�{�t:��)b���q[�vA�?~c����I�#��q���
�N�P<(�o����)�}�a��H��w��WO�X��D�?����[�y�A�����c�(��Cn*�F�0R�c���^���s���wc`D(�Hu ��A�Jux(v�?=�`m��Mwc��5�d]N��������������f=�<��������yhv�`>)��3$=�@���G��[��� }C�MG����/^0)���� ����c�����y���R��&��������z� �c�����?�����b~���`)5x���*4��l������E���o����"{)���{���eV_?J���N�����������)�[8L�{M����q��
�e�&v�X�t��O�������� �Y�a;WI`O��R<���#	���J�Tm������XR����b,���m7�<:�F(��K�����>�;MD��{�F �"��5&Ec-����)�(�h�������b�9U����J��B)�Ii��N��������f����X�:� ��L_��+���oAX�y/����~��� ����a]��o������i`�^���s��P���MK��)?{�=�e(mh��6������������
��T��������"�zdj!�Hd�|Z� ��� ��l�<���3�*'�����]������7��,������lCV���-��+3�@�sj##� ����r��K���#�Pk��i����8���<�C-���\��ES������$9�INRj�#'���2��`<�v2x���O�E
�m_Z� ��S�O/�Bn��-�Y����#.x��z����C-�w�2��C}�������j�$��<�d=�e+#� ������qm��R`��lkF�A^�Y��
�M{��Z�I��rb��I��Nf�AN��-�x���rRwJ������ZM m��~��n��S��+��o���o��[����af��8��&<(��$RM�;�a����H��'
�����+����������QX��!eH�mY���G�v���QRH���=������{):����H���|cr�<��� c�	��/��A��3qK������|x�w��o�����A���JSS`�r��<����WN��"��U����_����w�&<�_��&����H���fIr��x�2u�����<�00��F�H-a%W9���:TB�:$,���*~|-�.![v� }w	�A����Y����<(�>����������O���j��?rcY~yOr3��/+���*�r
�A^yV�+x�w�A�?�k�AA�x���x��#Q���)��W����������:� ��&M�A�� ����E� 7�+���x��o�@�k��< ���x�w} �y����,��<.��3�� ��Y-xP�} ����<H�g<���.��|-��7�XMx���N�M$�w<��/�����G� ��J&{@����<H,��p���y��I�x������L8����%� ,N9����nEe|H�FTT���Q�P!����*��U�o�$�y�a�8�3{R����z�PRR���e`�h�p������%��������CVV6W�
�pBB��
����������%�a28�������O�����J���^�f�:�P���������\T�=����jcV���?nUJ@l�x���� ������^AA�s�U*������&�md�?��e��-����
2����+�2i�������_��T���Kf�*'����.]���B�3Y���6���~�������2)����/V�����EZ����_N���!��_�6������s��\�R��Jv�b���U>"!<��'��0��#��
HHJ��[�CGU�b_c~���nP3�EX���/t��c*���(�`���U�
�?I\PF�!���bE�H�
�)�B>V2�+O��!����TJ��rPB�W�D�-=#���M������C�@��7�v����������� ���l:����q��8���C"�#��5Z�7���u�#;�C7[����l5�2��!��bS�����V��
���Z�|*^��������3V�XW)d< �`�As��*���������7��]�&-�Q�/bI�����f�l%&&����(^�x����������#B]]�/9o��9�]^����!�������2a�J���x����0�������y��������0?�~��e	ix�	���!��-�����,!-�!
���B��h��mi����.��C�7����q�A�iy�?�R�� _���������DU�#;����?�����IZ����%9*roK�CZ�#�|=��Y����$��{[B����� -�a�.�!;�0a����C�C�J����i�i���>�CR#;�v�e>�<Q��G����K's�C��R��g��P���?{e���\^%%�BV����������3)(&�&i��|���W���(�6fU����Ic��rr;�Ny���,���`�\(\��?<���.���������1����(I=���(���� ����������W����,��������#��yY"�?�7���f �u�q=�?����?�[Kv���N�}�����z*��I�|�y*��G�{7�5�U���@������?�?2rWB�CZ�#�'�?����KB�������pi!�'b���SJ
���������YI���������;B�~LK��4�G�?����������0_���&����a�}(IBH����%-�?a~��q ���0�����'�s�?I��������[�?$=�snOZ�#�y�A���P�?�<(�N�����Y�c)u
�E,IOH��!
�!LT%9�soKZ�CXX��X��i�aaY��"����?�e>"��s?�%iA�J����%�G�}()�2�����#
��	i�?��?���d�MIY�������S�?$5�soGZ�#�y�A���`�?�<(�������Y�c)u
�E,IOH��!
�!LT%9�soKZ�CZ��������iX��%9"roKZ�#�|=�cA����$��{[B����� �%�I����������"
�!�%5$cGZ�C�#�G�������iY�b�(��C$1�0���~)<���?s�u�B�������E��-d���a�
�\u���-�KH��
=SG��V���\s�^j��r��Z_b����W�	�p��O~m�H��h�B_�6sb���8D�~�I����G�Yx�Mr��ni#���u��Q�������m�����/�6H��YS�u+/)s�uYy	1���Y�
t���RY��nF��/����G��#�����"&1Q��B����������_���y�[�	(���N��S���F�^�P�d<��m��;K���J!YY$~������1V]�)�6���{�$j3��^�A��o^���/���:P	���r]O�s�P��i4 ��Q�riJ;�#��*�����I��`0s����Veg|
�W5+������v^-W������WSJ�8��K�n�mW\10����4�r�g(��|��Dk����u�i�eP����D����v�q��

�A��U0*x@����4#�x��f5	��/��/_����C<�I�*<��7�����/� g~+�RxP�= ~�x �����< ��
x��K<�|L	�������$���n�x�~�	�A��i<���� ��J
�W�A��[����&<��o<��<��}(�x �Q%�������������o]J
���_�������@r�A�})���)<��=W�����{���_��;<(�1-�9��?��-[��^QDFEc��5X�x*����P�����K�=}	5�V���A�=�-��������D��22��m�1D��"<"C�tFmM��w^�p��������>��n����s�d'���G�y�]H�2�@~�J%P�A^���7�����y��Zv�>��|EB������2�����|�v�����|C����m;9- �9�\��	��/��x��0�����
����X��9��LJ����k"),�u�}.	�'�'�P������Uh9aN�����P+Ru�N��
9�,�[���?���E�n3�ol����l�E�����t�1&���d��C-\�+Ky���*���[LF\w�|��{�l�I�,i��@[�V�;�@h�*���g�j���8��%<���$c^�ZP�a����P]	���w�2��P�d��-9�Z��VUT���������-���,i�`����^��������l�MWM�j7��k��U�e��P��u�	���#|�.��/[�H

E���Pm�>[�R2'��!���4o��)��sRQ�����'��K��W�5��8c������/hi��}�)��;g�����Q�V[8O��f�����7s4��B���<�~uC]I%�K��P����F��(
A~�=�0�No��:2���|amY����9����4x���>����b���\�l]�5o��K�����(+������W7��R����jGN2K<P�YI�c�,����?���KEDQA����vn����t��������`v���Hw��s��H\������^�|�9�|���y?�'6�+"��9��|Y�!�y���TVv�[�'^�����N_��|e����t�����~w�u\a�����S;����X�S��1y
�c�Z��������T�-��~��M�����N"!!
.U:�5�l?�~u���5��{�X�Zu@O�8_�������w��5��#��;���zX������iq}T�Z�������o�"LpvI���lv��g�h6�:�q���W||N�/���:h��+���#�
��%�{x�T�A�Ss�:�%��5B<��s������!��uT�A������9�����H���{M\���u[�b�/_C[K3������a��Vm�����I�������4����k�n��W����C�������e�4z04�����+0����u�<jW���� �o�������f�S�v��q=����Nf(@MK
N�����uSX����>L*�����Ovq���O6��#x�v�?x~e;��W�n�r9�����=�E�L.���7����#j�?��3g�?hhj�c����s:~�]�}����`�,���*�1�K9�?�:_�La�))op�D2Z6���I�y�``���~���V��?�M5�sD�J_d���
<�k^��Hy�a��������-~������e/�L�R�����tk��W��{vC�M[TAJ���x���5
rx�������.�w��S����A����y��HM}�(����Uk}}S�9�V���Na�I���_7Q������=Lpz[$��3�����x�����NM�Q��1N����w/l�`���p�������	$��b��7��U���sY-L�@�O?�m���]T�A��.Ru(��ScZ����am�����������|"�O����]������4������$x���-&���R�yO���:Z����__��rf�����x~9w�G�<pnc}Smx��������.��_ F���W�������m�}+���9�y�I
�B�O�}�=@�'[� �)�x���T���L5T�A������9� "2
�v�����l�v���������S��/��EB	�d�S�
�n��p%L��P���I�R����%f-Z��F����p��1����~-���_���-��k%'9q��=D���
����
�
`������m����K�c.��!}:�|]& �2�v�T!�s�O�����<�6���d;�QP���H�]���<�=O��__�D�}��g+�����~w�l�����)�BS���~������14��t$U��A��X8���� �<I�P<��Y��8��^Qm�I|~���[:F��7F�3TJ�(��;B���^�����E|������AjLb/ee��Tz.
�l���RC`���AC�Wp��(����w>/R6aq��o}�uE�R
#���?"*!:�>�4[@�H��>wt�C�>P�-}�_!�K����"	L{��w�Rb����<�7)0t���U�j�h�G������q���l���a_�~A��4'�����n2�����
R��P���R	!��MXz����������xP�|Io_OBw37�@Hd,VM��'�O����g���Z��`�j�����^��`�v|�_�A��(���w��!��,j&��5�����bP��J�PI��[���8����=#s�����ij���p�k+�����j���7LGT�JVmm]<<��~���'�af[���C��+��y,��!����c���:1Z�}�;��~�����-3���8<w(R��r�����*L�X�N^]�����{���v�"M
���c���=z��CI�2x7j5--
��CB\��P��hX;�?[�j�!�m�#y��P����Z��������T����`jQR_��W�����c�
����R�/B���u����vek�y=�
9)�[|�yI�k!(,	���a�t'�K���/��h���My-�a��x��1�m��H0B���;�Rn�����x�\�k��*�R�F�@FF���)rm+�
�������HJz�
�5%x���$$���^nU���a
��KE2�4o��&��ba��:����A�����'
<�`e��307�#}���)4y���|��th<��-��}��r��B���%���~�0~�A��Z��W@���S���#p�6��6�`���5�����S�)����@�'��=�0���T<h[�<�S����G��[c����k,;��
���qP�Zb��cx��s@�/W�^C���n����D���f�a�H�3�P���v>���1�������4��z
�)U��,�E
��)RFA�}Ih7�� �����3��N���p:)/����A���0���w�]���.6������Un��������x�nz�2�0�h���xh�0D��
C������=������
i��V48�U����	<��o=�������1��5��T%�s��y�7�w�:?����
�{IG��#�ncu����
��Xz�7�0�����]����;P��C�����]���!��B�`�����������b9)��:c�|�/8�!|V-n7
������E��h�������/oV���L��7|��8���X^k��o�
Q+�C��z�0xIx�>���5m

s�Q�@�Z5h��"�u5�CZH0t�F�,Q�^�H}M����A�N�.�x���mhW�
M�"R�@�qc�������������Z���� IDAT$z-Z2���n����C��z�[ ����������B�@D�&�>
��-w� �H���%���������t�/W����(R	�/!��������<NM���=���G���}8�u�[�6b6m�}g��]��"h��w�g��/�p�,��4�6lM[��C�2���������������0v����=3%`P�rSS�wNGH����Dg�z����������m�)�������+h�j�S����b�����b�p��f���/�����~��?���s@�������T�j�w�^	���s�Op��+�%$�"::D*��E�����t�������M���e�=��]��f�����������~8�w�S+����g����n"�+6B�
l?���0�r9�[��AO�j��i7���|���������0�����
?�[:e��b�2�s"�caeh�1
�A�FE��s5�%%���{����M-p��}���M��*5����u�aWNy~rSJ8��B}�|�?�Tmj(����8��K����f����P��1�t��������{.�tP�MZtl8!�k�z�Md��A)�v,B�`��P4h������-
�������x��&}��
]����eq-Ton���X�ja����qoS��4�g����!TNm%��G�Gc���L�}-�
�F��e�$�����e�qqo4B��!����4�Xj���pTmlC3
��'�W���l���H�mD�n&�xr3�����s;���a���}�2Rx5������o�N�����5k`�eo��=�
�U�(���yL�[ 8���qZ��:�����Ga����MNFW''��-�#O������Z�CC%�`����V����S��hn�^��u����1�9���K�O����D�-SF*�'�G�h{yLK<��F�
�he�7o��$�rc�W�m�s����������Srt����S�T������]�����!����h%�wIT6�5C��=�}�������=�>�� ��)h��B�p�x��m���L<��+"LS9g	�)=����WG���3i��y��	���"(�)���e�m��j��x���_�{��$���f�y�	�+�*�y����2�j�y��r��g�DEc��5x�VMB������������A�a����V�=j����[4���v�X�-��]����NY�;7O�K��adl!�)�V�GW�.j���{�t~G^���g�x��^����}wtx ����f`ba�������cU�����M���9��r�����{0���x��,���
/^�{�1�..������?�9�^���{�k�8��x�R<��������}]���%��w�d��~���w�@<�7��&�{�����h=�9��;�so��f�_13�����/U���Y���;�Q�|o���A��R����~�����XyLdT�\k4m>I���6�������SC?:��8��:
���O_�}9�W���S��p_�t{Rb��m���zx�#��i��Ie�F$���{�����Rno��������F�V�5r.�T�������0~�AD�`�����a�l�-^��^J�R��J�S��3��-�bz�������1��@|�]��=�P��
t�pg�K���5���w�l|���A��Tw�E��eAu���*����b����A8����l�uB���������)T�� ��e�?�C����	'c����E��'X8"�*��	5Tj[\l
d�G�������
�����{������F�uzs:�k�g�'j��m�;jz�>�=��)�r���!^���V��������w`��pM������{� �& m����K[����{*�_?����0`��	~���'�W�yX��3��
/_���ui=�;�?����������M�
��l�����
�|<���K�[;����m�#1�v��u��1m��k��N��7���MP�Ng����w�_r��G�o�������P%��xT~�I��Q��H��q�o�G���C�J�a����)R�Bo>���{"��9��x�x�1RB#aP�I���������^�����&���}DV0`����b-�ly<�<~������D v��<��1�����@�S���c�u�6��0��;�\��u�
���*�|�5�}�l����p:��f���:�k)�<��=x����V��0��6�>��Q�?��&��-�����a�Otl�k6��J3����C�4�8{����`�g�%� DJ�m{�b`�0��b������<����`���������Xv����ch�.�@{{���*�+��!"��3~������Tlj
�?UQ�@n3PP����1���xq �� �F,��.��c����R�Rt8�Gej�����HsS<]$�.��)��bC0lZ�e@�������J����2�:�#���0����3����=%�`?�F*%�Q���5��cTZ�}7��
����w�4�����C�&x�!���c������r�����]�zy6�x�e�D�\�'J�h��wU32���.������M] �/"rr�|n�'>�x�$�4��$���"�7Iy�����n�^��y���yxz��|�w�4�\�F����_"��1�XqcAY����������5�$������S#h�����=��������"�P�:�i�36�y>E����y���4�t��K�Vy=:&��1&T_�&��F����5b���kaF�
�L
#����4Xq����F�����	<�10A�qa�/�Q�Vk<�tu�L����p�2:|���K{g�w�����1�g\�4C:�;��{~�	3T�:�K'��Aw���������}K��a.o����`B	_���
��w�4H\��+7�}��	�
�ic~]q�*���;~���*��z�������<������L<�={��8�a����hn�xP��<�}f��`jU
���{�oK��En�w�.?���%� &2�b����"�e����O'���k��A�5TN����_����y3���?9a�w�	���?��zN�(k���gB��(|� ���r6mI@���t4�����\M�S9
����C�2����/$��]G�'��;
�:j((�������9�{����T�@�;�Qh��p���Sg���&6oK����RGy�����
<h�
_�2v�w�����U�������Q�2b����}�o[�����1��9a���<(�g�~���O����^�l�3��r�* �������r��j_�M,,�1}�':�p�����t���-���������Q������K��~n����&�G;#r�-�T�"���x9)"�|bJ�_oHG���/�9U����M|*LD���
����W�B��NW�*G���mK"v�S	���G��+����:b�>Fj`<L�f?3n@����K�V�������c�u
+��l',&_�>��a�'��=�%x�F'��:"��K��P�l�	<0�����=1|�4)��O|0�N{|��cY�A�l�J��(����8���vo��������U�7���)��E����*���b��Lk�kn����Xr��[|�����q����=~�(�G*������	?=y
k�����5����=?�[��k<�zal�XpaRi�Q�(���e��>H���6L1�W��/S�1}�H�`8` ��@�����X��t�
D�^���]?�1�6�����v��/����{�S��BJP'��p���UG��#P�SK�IhXZ"�}��/*� 5,ztE�\�!������<�A��kP71�V�R �v���hQy���!����/��(�P�^���4p���Fg^�+��Y���>xw�{�B*�'2�A����*]I�V��P���
�j��==�2�M�@���!C��{�J���~� ������9���s��xqg�����}����5c��M���kbjC����@g|���q����3��-E��p`�l:�	%|I `:vV�����i�r��N�
�IY���XX�����0v�����'����Q�T5J4���A�������$xp��6���-��y�;���>�LLl����\>��l��u$���B8���������+�t��3�\2��"{:D�c��IhK���i�w�O��
	S����CAJv�A�S���������?�����b�������.��
�3�L���`.A��u��S.MQ~��v��ql]�F���H�MI��t�_?�F�L�s>>:n��p�`4����S2��v�����|�,a�>�|-=<���U����&KJL��k	���m�F��R� �U2�H@��&�y���44�E���p�b�C��Q��]O@���1Fq�����4P��\=#���T`8�6���I([�X���z��%�P���_�R`@X8�k�t�g��o1�L�<xL�@�W���%a�#�aQLS��(Fh���I�+�Y%7��<�����1��2N��@%>[��1�[���K�J����4*�`:��`����cS� �0��\����,�����]86�/���i<�3��F�G�x����W���w��K����'0�a|IXl.a�KLu�:6N*,�#�5���;wa�������C�?�9�E��������Bl����u�������Z��)�Ncv���������;�-9�Fc�R�i4�m����ioud	|���5�^����^�����J����0������A��+L��F�& z�lh����K!�1���c|��']��^����W�(V�dtl6O_����:�m�����Ek6��JN�Ay��������
��8��x(Sr:t�O_�?m,�f���@�����9����/�1����}���g����88�{�,,����?x�x[%�Ga!T=�����?�'�7��Mk������^�^�32���������x��}w�/����Q�F��>�&��R�e?�|/���mX;�+�����u��������-�!��������M6��y�-����q���2,E�v#��c6�k�� ���m�Rc�<�{^/���#�oli�9I���~�N�[7�#�K���,����Lm�_��'~G�����b�`bZ�@�"��*W�D���K����|�w�3B���!����)1�c�\�(��;�%	�<|p
e�z������V�7��������Y���T���u���MB��,��)q|���M���H�������_c��w���H���">0
�����5;��b��([�.�����������0�~���{�BN��<���/�aY�pw@<j*���	�����2M����*��s���.81�.cR$xpc��T4���������Q����}%x�����>�.�J@�J�Q�	�����T!h3��V=F�~�$ Po�#��vvn����{`]�s.���S�Y�,vO�����C����x��a���;S3���0�����x�my��y��RN���	��u�L8�������x��c��S��go!��M�_�*y�_���Kz�X�
���B����K7�C��q����u��[�y�1 ��wXO[U������z�P��f��Gn�_K�������/�e���������m������G�7��W��N�/x��ukK���O������A9�H&����>�u��k|���	�f����5jt��J�y���
<�=u����kUD�7F�<:{�'���@���0�=(b�!X|��[���
��.�Vs�)�v���`���<V�\�,f��U`6�� ��&'3x����!r�"�4��DOq0X&��<��Je����Ix�I���P�
�N�A{���KN���9�`�eR��K�
�.�����i��=<i��+����,�+�F
��
;H� �����Hn��8���e����Y�n���
jJ�+�D���;��W�
Z6v��'��x�f��PD=��)�>�PP���^�r!ah��~�����������O����
;��^
�*Y���w<��L�P�j���u����g���������*~�^#�u2��**
>�� B��[Y����z.
1���%x�E#��m�(�E���yMC	D���q�-�OW8U��+�
FYT�a�;�<{d�����(;�(b�%B�X��B �W�@�y��5�2����0g�#�vB�������������<Tf��}H!��[�5�I��U��b�F�=c$�B��*"d*�8��:}�<�%�]��\�ds�L5�a�%�W5�\"i�n�������w�<s���A4t�p�dDyz���gW����}3�+��&�;��.��������Y	}{7��E<07���.
�f`���2����M1r�rrv��&�=����������c���&����l��'?�������pT�,>���Az�������
�y�x`�-Q���x���R���s�Z���������.��gT�2E�Jz�
F�����u��b�~�(�KM<����}����A��R�����e�^D>��_� 5���w�
��M�����N�}����J�������P��d�������/%�Q�RsZ?-�,`�����j��y	d�bxNU�K����_�h?�x=�~ykv'\����	�*G��+p���]!���!"�;�����2C��8~){�B��g'��r:�jX�UY��-A�V�eK�a3�[r��Rq�;���jS���TrF��-�����Q"n��9���^�T2P�A�T[E���i�T��Me���.E'!A1�,��H�z]<�@'�mI������1�quT�����W���$��Q�`d�����%.>|��i(a�b��*D��$�7�����p��+�:���TP��P�j�q,������4��+8PA�"v\��a�j�Z)[������T�),�=�"�	`a�1�X�*p��,�[����$�2A*�N������)J�������i���2R-h���K��}���A�8A���D0�YQ�oL�!�H�`���qx�f���ZUo�N�_��5�p��D��	���w.�If��~���vH����Xx��1�� �������un�9T@kGx>���nH���T&x�9-zb��d�(��Z_�%�����%=��6���������s
�r�hQ?��M�������b�oC5���>��<$��X%KN����	F�����`!��?��@L<4�����wq����e����o�"x�D����	i�<��*���k����il�j�0�h� �a4m���0���p�u�	+��m�qG�H��f������/�2��GF�D/YL5�g=�ncCe��0����}�l?���$�W���w�a�=�@<�
��^�]���)��<�F�����f��������-������:�A�d:��q�a�N��R�A�`0�N�4Z�/�%�s�x �sqm�5;�����|iGF�a������x���b������Pe����?�k>^sB`���T&�Gx���;K'}��S��^H"�bfV��Kc�3�������<�$�>��v��*A(���P`���a��?d�v%*�z��<��.�&�6xp��f:Q|0���X���������s�J��I�/d�G-��o!��xa+>�b�;}�@�3�Y5����h��AAOX��O�#�p-[��F��������K��)�����8�{����|U�x ����2���&��^�����Ll�Q�1�<����kCS�$p�x�t��Pe@�����W�9��1���	��DJA��'����.�	�8hS@�NLu���g��@:������<�jb�T'Z�� ��JQ�� IDAT��\7��e����'*�A%��I����)��9����2�L(^N������d4�c�MH������P��mi���T*�'<pkfH�BQ�i?S�����wj
���B��$�Bh���X�����p�+AT[(��x�J��f�U��a��g���?���4����lm-U��p����A33	�������m�0P�Q�}�I�������r��t��q�r*�������������B	�M!(0��Y,j��_RGY�w�0��������TSXt���DI�A���w<��S9i��L�p�
/��8w��hA�,?%'�@�Ot�h���!���M(�$��d8r4b�.�����O�-n=��'�wD*!���Xw	4	�i��TH ��B�,��o~�+�f�o�h�t��NY���b"�o�T�9��z�(Wg(�;]�?�T:�*x���S�jWT�	<04�@��������;f�1w�1+Se��`_�s�u�;7OH�@��f8u|5Zw�����x�����Hr�]<�
��V�A:��K�~�Q��~����+@e�x�F���D����{�n��.nxQ����c�a������n��{X��Nz����m�
l��������<a�
L�0	M{O��9o���Nz^��PT�����>�T(�Jh�:#}��gWH�M��o���o�PV����,�)[����W	����@��x'������=����[P���I�?���\$l���:��3�TB�n��\\B�J�`L;��?�=���TW$�p���s�)��i*#� %�T�7	�]I�Ye��U���V���k���+�%����x ���t�e]qb�xz�@�������_�L�/x T�%H�<g�����5���D��u�i�E�p����O����o��x�^�����0�<����������2x����Q���d�3v������(V�w#3���4
B������^fV�@��0��K����A@�L� ��s��xu;<THW`��bkG#����x�,��b^�s�x���e�F���*�(�	_|���?��������*���9����X>(�	<}|�]@�z�A��t�Z2�BXA��
2��ZM������S-�5}��K�b��5f^c�g��[�
��:8�����Y��v�P��
N��5�����mG!��0�/�c5u��h�8:_1�V7����y��x��t��A���l'��)aKv�r������`6�}d����T<����V	�w��� ���}g�]�8��H�*�!����5��vCW*/�@��M$T�w�V���Td�Bu'���,j���*��3	�:K��j��)]����E����Fa�]AP(0Bd9{��N�K��bE�Q�'F@&��h�Q���T�:��<��@�u�z��eD�w�6���������>��	�Kz�����h7��Gb�1s�
���U��KWo! (Z5�y_���UrkA�8�u�����ZU}��x

�� ��
	��<�w�}��v��,{��D+�1j��GE�Q����^�����Ip!]�@����O���"�>{�:�`���A����F�n��e�u:u���sd�����H��G��$_��#�v
�Q��1����<H����6
�V��6f��������\x�����N�q��������=�����F#p�N���V����in�[b�h�C�*�8��F�B�^��:�"M����P���t� 1�	"�x`Mb>��9h�^��^�Y%w��BN-e���y�uv�K����')�U�\	��`��/~0x���qL�b�Y:�x�p��7x`��%��<a��~ksFsRn�;#3�*���x``^6��>�>�v�7��JQv-����>T<�F���0g�#�_���BXT�\V�{fV<��u�w�'5<����7�@�v_P�`.#^�Q�Q��P<xv�8���pe���:_Y�}T�����/���F����6��A��������c=�<���k��<c���P<h1~�R��<�
��@���W<������x�bh�C��x�1N��U�x�G�gq|�j�h��JN����\����p�����}���H�@�uT<�K���F��FX�/���7j�x�S���N'H����H����Qu�?H���T<�W������V|�r�
�`v��72�Bw�����.�D��;W(\����M��	h�\G�����TP���I�W�Q�c�j:j�z
���d��B7~"u��>-% JV� ���"A��
&�?����{"([����&8p�>F���qk�i�2���J�%��M<�c��f�BJQ]%D:������<��}�x@�
F�0@�_Q(���x���=��K�)�:�O8 v�3�x�[���K($��U
�Z�TV���+�&������FC�x@��4��0��o���,���@(/�>
��C/
E����m�K�`I����V�*��by�A�g�T;�` &��S��`f��a�����V��=�]*l�u\�a��I����cy7x>�/N=�����]�R���I/��7$�+���z��05�W���{2���4���y��JC�v����ee�2�AZT$�)�S��	���������J�@�t��v�����Q���t����Q<��uDI}�Z0`;R����	g�1
AC��I�~]�%�)GL	S=#��?@���3H�w0��dB����@,a1.�x�t�.t��E����k�\�E�..�����"���PI`�iqq�����k7$\� S(�?
�FxC��7���YS��H�C�*dp!�=��n#A5+o��V��2�B2g��c���x`��D{W��y#Fo��#1x�R	������9�����q��rJa+N�*����)�<�QT������LE��J��:u{������[��j����
�u���nuqm�x�hA/��*���CTe����K���P�B\�������Y�Z��lW8��v�������`FP��@�P+P��lD��i�5�8�Gf��t�@��G�~��,����H�|�z��L�������������	|��0n�
|���z{J���U1���v�OC�A0Y����-�*y����8�F ��S=<����A*�������
p����)tM��?B��tB�@�d:<^U��>��#,��5��VG#�����T:@���@�=�@���?���4�x ���,�>xP��1�#D����|T�`-�����m�PN0��$��(M{���Vp�T�TJ8N��GJ6��pE����8L����������,)!Z2�*�Qrn��!����o����t�`�*p����&��_.\�iD��x����|0��,���::�����cT<���P8
	�~LA[���b�e}�O����t� <�Y����>��K�7���Q���B*������>��t��o����A0S��|� �NP`�IOL�w1'��l�1�S�$z��j)|6�-<0�;!~�>�x�#��]%�������)1"6z��[�)A7Q�0�D��e��> ����Zt��~���%��e���[](�A�
����m]`iWO�n*4�@���4���L�������G�~��������B�N���2��(Y���� �k(�����������l\�5\�Z ������=h�H��������dN�Mv������������zv-)�"� ����l����<*'�/h��$�����}����qz�<4�<�����/G�6���a�T<���'���R���<xI���7F����=��L��	Bh�Q(���._\'�,��U�@�w������^�#����[}�m��x�}�T8��z�H��0�Q*[��9����n�O
a~q�����u�
���5�R�
b�Po�FAJv�ARDb�����&�/�E���xu,Q��T���Ay*����4�9�E�D�<(]��y��A���S�a��V<�9��Th<��L��P�*&�0�
^R������S� ^�>��"PI�7w�@��z`e���B]@�YE8��O��m#.�J���y�Y���ZW>F�Upa�#�� �
���S
�S������'���{�������~�(�D�o^�}�"&$�=��	����:!��|,���'����(G�[s���E���Tl��}���������x0|�.�I�G�J���J*�\��m�~���P��{�A��S�Bll8�2+4�
��M��z�����S�#6:������,�4����I(���T�>�&�)�{��{"%!���{��t0�YW3`j��
]��k��F��y����x@�I�A(�0���QBf�����H�a��Ga���{��������e��������L��p�.�D7U���S2�����t�G��[0Y8QSW�MX��Y����J��*YY���5��{�t��A<�VG�x��B9��H��[y/�B��������)�����{Jx�evo��O��MX��7����Q��8�ys~�(��Y�V�T���	G
�������:#���}8h��K�a����11�#34��V�@3~_!U
2�6���B*.��w-d*��v�T[��-�K�nsQ/�TE59�@A��b�R�@,��������@�
��B!���� ���W+]<(��)QtZp���jE�r���W$��j��R�=�2eC�������E��C����m�I"�p>s�R}���r4����H��]��c����7Y�/����i�|�?�'x�i����Aj�k�p#+�V�
���Q�g�����g�01���i�+�-Q��3����)|u|�a=#n����|�T��9K9���f�Q���<�G��X��
���%S1��xP���t6��C���2)<8���E��68�1e*R�}�eYJ^��$kEz��^��0t���ec>��������*G2�����
<��w���L�ua��P�3�3�����
���@B�����
\�`@|8�;�g�a��������3�iP+,�{n�v���%;���Vt�P��6��y�tZ�p�7x����HO����,n_�:��tI`d�B"\�j4��[��p)�*	a0g����0U��������i2�����`���d�r!A���W�������Gg��5�����	���?"%Q�s���MgM3�2��e����Y��D������e��)k6Jn�E
�P?_.����E�)s���~C��q}��-�����cU\��k$��<���1�c
�iS5"1������*�a���=o1�MD�J%�����Nx�l�N� �V������MF��m9�7����(��/B<7b"B�f�1�tt>��Q�@�@�Q0�t[s]�k���+�/���sM��@���<�N����-�|r�0����}z������w79�Z4���=�u�������a��
��7�@�j�`���5/�E�b�f��4?|Q�vb��X�'�����m~���"7����$��-�
�5a���)�A �/�/&I����&=NC�Z��R8x ��������IE�$�m�<:s>[^�H�@�c6L� T6<��Cg�'�����3.���y��h����o��7���g�����M�7S���0<0����]K������Q����o�����
p��MGe���+�	�#&�,�H�=q�P@�e�6p���m���MU'���~��	I)��O�����Nxc�g0w�Y��D_d\�p�c�ZrU<��a8�j���ML�d0
z��x@�@��
���3(f#!��%���;���+F���	�g� �����g��8&�0�!�P �-��!�,�P���[)	'��(a��F�q�����������x�Y��-�Y�{��1kR����0
�T�:ul����-��A~�E)�,S8���PE����
��x����d�vt�h�q���N�����2��6����/'��s�BWw���	"18����4<�������f4�������3r=��h0�j}������^ct���L8a~��L�p=+����g���
ko�C�"vX�������z�������LXuu'�?�����6.����1���[�C�QXve&7�+A�Z�	����Z��P�!n�>:��x��@K���5�3����7<��<EZ���ga��md������T:�\�Y��c�)����_���F�����[5����*��:!v�&��i#T�����*}C�Pf�@�sH��u*�����j�:2E��;=���#�
#t5����������*y��������Q�#"[D�c�(�������1��/����E��L�b~�����g��5������n���@��������Q��WG�A��>=�[�=�g_�?*�h��~�L�>c�P������5;3�2�X��p�7o5�������&F!>������-����\/�w���d���-GI��sL����o�����Vb���P�DE:+ZH#���� �;3������	�RU5�,��X����@�:��m``��w<�*Ce�f�Q���-}��B���%1�R��2��D�^�g`-�G�/�Ng�����Df�1���L#�`)#9w��vv	#������B\l�U�������	��+D��I�[�<H�3c��]�9�����&���������k8�D�>��6]=���e]Q����y�w��������~�S��;��x T�KP6������(VZ;<��U��u�HW`H�5�/��"������|q�|�L�`lA�.>
��)���{g��P	�~����i��@,U�b��Y#T�|����1N��@���Xo�zp�p������:2%�(<h>�!/	3������.���'� �	�r:�XO��T)��
������!$aVD���2���IE'�=���4��`,�I�'���8	 �"�H!�$��T�UO�oR|��g����:a���b�Lg`-���A�U"����,��Y����L� �N��+]��B����g8��%�E2~��	�	�T��B)A��9C��.��r�6��T���FX��;�}**�9��.R/��+L�#D:Q�8|�--��(R��
+�� �
&�K>�E��l'�����j����W�����U��K0!�;f�st	�i������Q�6B�L��@�s��=�P�I��U�\�HQx ry��'���:��G�N�o��]S�_"�����~�����/�p�0�{���G��	��r=TJ�v�Z�S<p.���T����*�<<���g:�'zr�|��2�	U���KN�����P������z��/2��f����jTj<�����Xe�{����A��
�����p��RF�?������_��|~7�A�*Mqx�"���To�u��^X�|<������{!��C	�	��k�(�5���WLD�?������e�
+'a������W������HF_��{�������Z
�����H��[(4��}xP�^8V�n�u6�$!��~��Z�����f�p�mI�'�JV�2j)U���K����k�����[�`x|��S������'p��LW���"�7������� �?��.��g���S'!���>w���`�T��K6/��#�~�����7k��T>�{�r����2L%�w�sy�s�
�����������:���L� ���{�����_�x����8qt���������^�/����=�('���[���BT��]�5�������<H�r�����sPU�J������.��������=���t�����*�k+
h�u!�3�w����2�������t�>yx�<<����m�1Q���o������8���~���*���,l]�$�w`�M��?]��hES��p�������\��8��m$3��(<�6���G^�8�] IDAT�RM@(���6����e=t_R�*0���nB�*�e(�t�C|d2��i��
��,]��A�^\
�%a����b���L���x �)���	������n����;��:*1�e'�4#��R;;�q��~��mq`�M$D)��S��.\�7�����~�F%��~��W�K�	h��}zq��s�oW{zbt����������F��sc��4��A/�t�w�����G0�~�H��Y��J�v���b��i��C?_� �D���������`��Kq��3����}��wOgE�xP�������{���Mx����_������|�0������	#�s�\�J+�:�k��k����H-[��������KP��	��a�[7�~'���G,��]sP�f;$�9�����^r\���lO�J�F�����k��o�u�a���`�tu�t�m�j93A���f�3 E��h0�i���X��&�/E {��a��>����N��V�b�u���Q�w�����'��:��&"��
�mWG����U��OA@DOY��VV��f�"�������s/�b2�c����t���C��Z{����jX�R7l�{�k4K��2��
���K8�V���;5S}��*I���8�	����D+�����,�=>!c&��?�|'?	
��%k1c�"����W �T��<j���T<)D��.�.n�y==8�u�P@v�����K�3�28�(�
�J��YKd��h��6l ����d���^��v�U�I����:wu�Sl���H�*��i

|��fN��W;�i����gy�����j'�>U�A^3T��g
�zv�A^�d����u��G��J�>��i����x����<��6r|n�
��?yLv�>d<9�Z��6?����Z���fn;7��S�����
<(�>�M���j��4�K�Ti'�Ti��:&'��c�G��c��O��9�BA�O�cO�R��t@IP�A��6U���
�������
:<�'Z8���{P���Tp�%�T����{,�����>�OM�4	�@��W���?u�
<��c�����$|�>r>f��vv�����x�����s
��O�FN�>U���'/� ���/��)���������O~���3s������� k��i2�eau�sE��]rOA��	<(h{Y��<(�~
�������#+xPX��V������_V� ���U?+x�W�����������j�g@0�|9�9Q�������9�������
<x;*����Cx�����y���nQ�=G��*�@�3������T�A��-��5)�MMa�2m�#^?uQ�����u���	::����G��R��x�	&��.
<�aj��Tq�`�h�?��VS�t�B��
<(�W���T��_S*������%x��3����6T'����
o�7��k��������R��n�3��
>�!T�2d�X]���V���=����;�z��T3����<�OL�G�
<���K�*��������s�
�>T�*��0�*��Aa���N[*��`���xP�Y����
<����G���+U��3��<��\(fY�~����Oq7~�>T�������^T���Ux��\�*�����
>w�#U3�Ig@|��V��n�EO*���|����s�
�>T�*��0�*xP������
<(��T����(x�O���W�������P��w5���\�����)xPx��?��
<�����x���S���5�
>�*���s�:R5�txP�\i�>�I�-��"""`bb55��j���cV�:�Z�����XXZZ~��?U��^�B�"E�����������4\����8����#6Q���������|��c��7)�:FT6H��A`�|��111��������� I����d
���!��x��(��4L���e�3��=^�Grj|a|�O�FZZ����37s	6vBX�~���TOVz�e=2��q�FS?����|T*qjH.P;��A			r�2i�����zX��?��#��4�4�,�4�j�������u�GGAF�����p���C
.���C��z>���
��t������K��a~�+H]�h?��	,��J�:JM�R��������Ru��T��H
4�"������}��
�������_�d*4^?��aJ��_9����RR�����Sew>R�mq���������\��l�|���t����1���q��Ce
uM�������3���n�SQ��(����m�|��HF����9���5�GA����������M��o�[���IND>:��|��4����i���B'
�o^J����Y�U�|m����.����������^�[���NT�D�;�5�,@��w��8gj���{������#��j�z�NMFRb�P��m&Ri�HIJ�����z��f���U�Q�Cb�?��� ]�6t~h��/�E�����J��aZ���%�����LE- �`�AM;3�g��r����{�"���-W:��J���0{F��l���������0����,�� uY�?�J�������w�wx����-W:������LY�?�B���W��(��Nqr�G��j��F������\V�����=_�����O4?,�1"h�����-V���J����iQ��x$��2a��'�1��6�?6|��� }!�+j��7- �|W���h#����ok�'_��l��r���MT�9�K�WY���r���0s(+�!�X��(y^e�?��|D4_/�xf���0[��y����m(���|D4_��N>ea>�Z���e�?D�C��������GY���>���Fv��)+�����<�}�d�{H���D-���{�����^���������"������ge��mA�CHM(�l�J0�=ii����EI:����w?�Bdg�L�+A��%���L+���l]��fr�,0�0"�YPV��?��ea>��B��%����#%���9�������h>"��-���!))�����E�������'�����E-E�����	E�_Q����Em���WV�#���?J�u/����w?�����^i���#�d)�B�����?�"����K����Z@�x��;����%E���O�5���0[���e�?D��0Gv��*+�QV,vD�Q�1-���|��GY�?�B����h�.�'M���K����A��l���UV���a����S����h~(�QQ��D������S���(������/~~ee>�Z�O�"���cP���a���?��e�E,����c�����0[���e�?DUa����UV�C��\�� ��J�6��9*J�WY���2��K>����h~(��,y^��(y
+��2���5"��OY����(+�GY���P8���r)+�Q�#�OE�!��]�|��|�����?D�A���(��G-��GSDzE������)���x?F�C&$�RN�dIK"U,����������r���V���PV^��Ffz&2�#iJ������@��Y6]�i��eG�H�l�wibbb //��-�4�J) ���B
3�!��Z�j���������"U���e����fR�o�fH�#=������e2iQQQ����U����?���
H/���o��l1(gd��y:�b�$Q�\2����$_>_)#����!�E�zR����M�/������=������?����#[�\ue>/��������&�$����=�HLGVz��w�.��D���Dmi�K���J�/���BrI����4��|D�����������?�NCZ����M�H�"��B�������
�^�/������2 ���m��?��:�$J��F?���c����lad���\��P��U&%��_�]���d�"�Sa�G�Soqq�7���#�2I�,d�D��r���H��Dz��q�X�K��5UD�e�4�?��W���T�XN�tVRZ!%)����}i����� %�]Z��S���I�,d%��k��A������d����e��*%j��[����z����/�'�J�
n�2���H#�����X�j�x��Hi���I:���xPz���>�*@lPu�}0^�4��\+mR^���cy�i���\���.�T����%Rh�OK������B+�7d�ZUQ1�����!iYo_/�(��Z���3^�UZ~CF�a��7T��:�;�GbR�{��V��e�������^�|��d�,L(p!�������������
�� 1����H>5�y�����U~
�z�>������T���T7_+A����������%j���B���_h*QK��tCp�.���*J���R�_E�#�g���n�`{/UT�L���#���]�^���t5.�\�*>E����m= ��k�>�*����MA�����=k�,U	l3���'��u�ew��d�K<x�7
���%��Y��PSl�G���P�j�H������0*"]�25�������BoRQ��(�������*i-���������"��h�(��N��c���?7D��`m/k��[��"�@�6�U
x��B"��W#�l|/�F?��B��^��igx��E��p�TIs���R��N�!\�W�t=�<(z[	#�<F+����ohx��E�������<h7���]AA�x �x�m�Yq1�����n���(5����G�4E&x�}�\w���)��yeg���4Ft\����w�����~�����1�1���_�����
��F7���J�:����&;�a��wX�������u�_�t?$l���o���ym�~v�ku��
JP�AXT&n?OA#Y�^I���*���u
������@�r#_rO���8jT����{.�)@Q���
��BEFCC���f*���6a+(��$��P�>q����������	�)N��`��H�}�'�R��sM$�P���
�N]����a8p
|�O,r=XD�r��J�[��y%h6j�O[��i4j�z��>��VX��D$~���K�S6FbZ<V(���0�e`�A��I�V���k�@�)Hda���y�o14�E�����7W�� ��ud&�A�~���FN���O��\�1����a��H�N�NCsy�����Y�U���;]w�*Z��;n���/!%,�
�amG<�p�������������.�qe��"7��P<������84����.�]�_���"���W������fa��������?
c�����@W��������f�����:��8������ni��/�*B�EX���p��b4�6'��F�a�U�o����F��H����"$�T���@�j�l
�_�FR��@�r#W�����FzB����
jh�{'�{3:v���[���jySX���=��xl�����5�4(�����g����cEkEH�����l,����K���;l{"�i4�+(BFU
���WT�������I�@�\�M�Q�=�������gE�v�M�]�
�O1pUqIiXs���bq`�3�-��������z�+���<�N�c��������3{,�
s�o-���H� �� �[���;3�����nh��>�t��k2f,r���3x	�'/���"�M�|GO_�C�<H���e�+���I>r�����I�JHJ"�������O+/oo��p;{���(o��Nm��}�q3����e�E���W���?��"�����O�z���_��\+�&�<l<(OY����4bj�M�`dZ
�o��O�R���y1\\��<h�4���T<I�r�z�z:V+�`,bla�R��mP��?Gq�����R�	�ef�������a���_\|�Kc)�(��q� �|��>���/��0���/^`��6�}�w�R�P�	�\��x�d[;!��2}�l+�+�	(XV��UD?�Z,�@��A��K�~.�3���CX��5��0��EX���<�����gqP2����)�#��-�����n~���b�9��j���5;}�W5����K����5'�����	h�iC��.^�.�����3	����N��8xP����[c���x�>+)!�8F}s�6x0�VC�xtc�k�g���������t.��A��spq)�,��;7�#�����	<���U��x��f"�������O��-x���w��h[r���(����$s\����yK�|�-[e�TQ����~���}�����}�q��/�@�_(<X6���~�vuL��,��������e����@JY�g����BX|(v�o������}^�Ahb,������<��G|�[����Q�{���"� ��+x�������Q�p�
�������������;1yTHHH�a%v:�f��r����;��T����B�s"�����4���W��.�1u� "���l�NL�22������ $,��*� %.�-�x�����#�A�&6�W=B��_]V�n�3U���9�W���L��q���'�j �P���{eeM����'I<yr��)����9�A���I��}P��.O3�������?7�d$e�s�&J������<�5h"��[��}�]�U���(���e�%�WRG|t(.��~3����Wp���j��3����	
;M���\���<���E���!N��K>��]~�i����%H�f`U�����iZw�
5M<�y�����GWb��;����B�"q�IWM~�bc���iD�K�xZ"?����k���x]����t���o�i� ��(�N��!�������*zG��eP3b�
STF��H>}2u�!��
����f>��O����<����H<�\�`�@�.\���9������G��CT�{��._�j����@AQq4VN�����n���/�Zc*�5���8����(7��O��;C�f�����Z�p��Z|	z�v�@^A
�/q�B�-=��x��n?T����{�����b2����������M���.?r��w7�X�r�
d�}��r��P�S��wq��^��m�F� +����@Rr<FvZ����
����)���sn��39�}ZL����w� (��������P�k_�s0�*���|�@�����#O7��:�<0NU��^�V�����$���
��j����W�y�mL��y��$���*4���f5y=|��b|���K��^9,�33�oFdl(��_�`*[�Px���)
�yv�=�����$��� O���M� N�i��7����&:����� ����a�0QS��G���K$;Z���
'��]y��N!P����x�z����Q'�aE��X�
��)���$���w_!4>�H�Wx�������%����6�`j��qhah���T��EQ����C�����NJO���5F=8Km|��`Q���������F����v-�o��{�R<�����3	���&T2����������n*8p!���h��aH{%����XFuQFdL&���A��b�0��2d�0e��$&g���$:4P����x�>����L��3��S-x����m�p�j�)?f�2����@��lD�f���j��`��x��g��������HEJJ6j��b��h�G$i�f�m}9X��	�'���,"�jz�*x����p��BM������0�%)���ALj*�l��-��y��������\9t45-r�
T<���0������n`j��jH����2�>�D��H�{Y���������{���I-'�ZH:r	������F����B���0��|����)��;$�+$<��]�b��Z�{��#��]'!ieB���&�Tf��S�mVR���MPyVlB������HXw��m�"P{��YIu�G������^����P�Y��=�w�^�.����A�I;�?�f����>�R����i�"I��s �����BzB IDAT���*B��(zw���!����F�����pT���F���v����vqYy�h�!��D�>-�����h���$��(�����*�6�IE�{<�uT������}6��S]���t�x���>��=��v�U�6<�
m%��:�_��a���A+����O�`p��xx�>]��m����������]H�H��YG���(R��x �!���*�P��#�(���F��d<]��j�����|��n[���2s<��
��0i]�,3�����s|�d"�1F�R����`|�c���P��
x��#�R�Tg�0����(�����(�U@�fK�	I�r�h=��N!3�6j���{L���"H�@�.)H�g!;�BJ������=�R2w[�
d�����/�_F���4���nR?y��%U5���1��MB���t/��#@Z=�!���4���
�:m�d��������!$h�J(�����Fu#X�1����Eu��r@�=?��������;S6��
i5y��>W��O�>Ez���"��/��=�^S+v�Iyi'$�p@AF�,���|��=��z�C����f�U���
i�/�}��GR�biYy�C]i������H�I���6<�l�8���S�q���/� o����LMG�Et��^Brh<<���W�ZV���g�#�����vH%5��F���z��WA���|O���-�O1����J�@�%4��u��������{�6�`��)�	��3�����orpl��v~�Y�h	��������so��[W�����K��iS~
�����O��=��x����"�IP���S[������{W�����o�;�����c�k��n51���~Dk;e�k���m�����Dk(9E���{n�As�:�X�
2r�v�A��a�����8�|`
��_�n.S�s�|,:���=�m>_�}�4|C�i�L�V���7��u�<V���h�d��7E�M�����v���9�:L	�E�'5t0��I�H���c�~h�?���f���+���8�
�cL���y�$�<�UD%����>�m_���z�@]���y��94�k�yG7#��_�k����;8�~%��X����#<.��f�z���[���%�+^x���us�>��ZzF�`a�'_�p��G����*0���[EF����>&����4��e��K ����ay47��=���;����s������������g��Asl���?}^����[#�9M���#��v<Nl	�r��t���GLj�
}<��65�AIM���@9}KD���z��5���Q��|���u6_G�*��x��H��+k��B�-'��6G�������F���l,��P���"��B�v_���nm���!��;#���Z��Is�6�#�|o'����;�+�Wl
M��\MD�I�s!�a'Z���:��aR7z��4V�Uy>���������Ms$�y#��-���N�eI$�|��}�����)�e��d$��������k����x�(h*)cy��^9��	�y���������7bn��Q��S��B:������@OM[������`�L���������"����_G����Uw��}~�A���Q�2g}2��i�o��j*8��%�����2
s���K��H-51��,���p�#�R�h ���R����4j�H#�����Qu����$6�ABZ6*�H�-���v<LB�L_|5VZ����'9��	���+���4z^����*{c�[���U=���
��������
E����zB�Q���^�Q���
x?������%���HK����������9��AH�R��)K'(xP�X
��W�k�|�q�lQ^G������N�����q��O��'����~_�0q����4��|�-&v�����ql^S�����*�s{��������l���Kl[��;b�p��[Xa��{�\�����y�G�595���Bc1�4��p�����ME����q.t����F}�=��R�V=i?���%:�||��5��_��o&^n�z�4lGg��(�l��TZ�H�������k� � >%����6R7AO��x�wW=s���8����^^me���b^�%��`3^~���G��Gw0��uK�6�y�*���c����MT4����~�%����vN�N����'���J�DIX����_��������}�@��fU�������}�+~o��.z�O�������u�3��wy*z�����1��q�n�K��3x��<�����1b@7l�&���.���6�P��A����C	�eX��*�����wAEY	:ZHMK��:Z�X�a7���{���_�X���&�~���PTP@s
��Z��x�������;���r�D��vyW��3�R^}������4�n?���;ANN|���G��rY�EA���@~�A��5�2��P�Q���_x�G'����.0����l���������]cXZ��	���wh�G����=�Yn�`�a���/����$��X�2����������	7��L#k�^�^� �@V^��l��U�`]�<�^@��Gq`yd�����/�
m#Z[���v��kpf���"?�@����:�Y�ZM�r���<��s�n������h��4j=�������"��G�@�6�6������e�j���9����[�"%�����jk� v�dH� +<�ml!��O��;�<})v�FqT��@��u�m��s� ��C����t��P[G0��>�k��WN|@�	���NJD�
:(<��[��{���):}@��KP��I�� +:�3�#v��"�S~�����#�a�K/T�o�7�.`�����&g������
=C�#�x|
�������q3r�	l[����h�v��[uMCx����M+:�~E��:���FC_�1_��i0��<��~�1��Z�� ��{6��Vb$��9�I4�g���g���)�n�>������O���}{^W	q)$�&�����q5��r%��G���=������p��6*'�{�`����e	�m��!���2X��Q]���y���;P�����?U5p��n����;���p��������b��np����_<���CpCP��A�:}�������
������[9$�F�W�Px��c=�������V������������>���M�j(�!Y �D���Y�f`Gg'�<y�
�Z�"� <C��&8�����������C������l��\4�2_P��1T�g���wP�H��T����7WX�S�%w	+��M�\N���������G�.5��'.	�h�_.�0��Z@�v?���]�B��L!���g�1��������:��)j�x�������$*��M�J��%`ro���GI�V��F��(���u*:�k�!7�z���SiS������LT6���mQ�?T�s��#m<�1�������J4�i�NW-8BBe3i<��T��$=MI�J�-Y��x��A��(n"��%8x���5Q���8/o�`5��2q�V"�w��AA�����1���		��������B[/ss,y�,-�!+��>`H�����#���aO����V]c����zE[��>.<#X[i� �-���vHs����z�2HE@y������!i���;��@jI�0#)*K�!v�F���@�[s��\!�\�W@qdw��n@�s�!+&��fH�r
���&)���g����G�H� i���0�L��D��U(�C�
��s�!v�:z���tM;�����B���E�<^A��x�s7����P��Qw/�z�A�����F������pnG��^
x�t�r����]&��������6��;dt���O���+�������5�FChC�6�w�D�gX�8�i}	,�DSkHkh����Ss��x*���	]�X��u�q�@�i'���rx~���=���^s�SzA��ce�P�5���������W6AlJ$4�up��:���n�����j5���bD����A7iC�/������;<_��r!6%��`*��yA?��E�^A��n}5hUW��?��Y/�`?���~�
]������"Py�1�l�p�vK�ue���3����\.�iJ#1��_�!h=P������J�1��V
P1���s9�yQBa�A������z�AHxu��	<��k	�	F��]'rx@F��4W
=�:}f��
E�Q�
[���JK��E5�@����7!�e��Gj�7�B��Nj��������k�M�A��m���	/nA�����~lt.��2��	����Hu-mW� <��g�y�BV[	r��-o�
�������������:���0�RI�c������>�i ��
��.�`����^��c`!��g��v���8����[���?"�\4|>�U����v�{#���^�9����&��*�n���P'e�t��t�j���3��z9�����NBNW��G�Q';�Cr`@v����,l���f��]o��O�U<0�]����+��ATG��?���'30`�����i�wl�5�F���k90��)1������>�y�-��.,NA����Zmk�S�N���9�/x���.p�����tb�w=�r6��n���<�tM3\� �s_P���x���Z�
Z�	GU+������X�o*V��C{*����7����n���sT�}x���3�n���[���VO@��-q��Uttl���E������l@'r��>����&K�7x��g�������z�8��p�	3]�cY�q�Kp����q��M^���$t�G,$�^/��S0n�
:|,�9�b����f���9P'Z�������<��
ZT���Oz�|���M��.�h����kye0����;<��	�����X0�{���ye��6b��z�h�����m�~>tP�[���3��0�`c���s�*��:4���6�Z�UT�>��[���|L�T�[�������!�9xp5��i���`�a�>��9��h-��1� I{9I�����Uk��66mG ��E�u�	���t`r��l��
��P�R��>m�����:���G�:4��3�G�y|)�x�'��D[���'�w�a�i�|v�����I{�U���Z9�_V�G� ����)��^g�xJ����@��Jz�nI^x`�ph���i%-H)�����<��rU;��-�o/�A�(��B�AK��� .�	dh}�@�38� EDZ,���{\�V_�<:-�Nt���Z"9������H��s�A�2�������z��un����P�P��u8l���7�a�u
.,
x�lk��VXy�
-�:������6����>�89c��}5��{7�i�hW�&\������}1p��^���}�����i���gqb�,t\�c� H�<80�/�Zn(i��
j���wx�W4����XkK�D]��G�Bk�Ue��F"�L�N*z��:��.��Mpz5)4���9��@_Ok�\���F+o%a�I����=shMx��t�F������+�Rw�Y�	K"��4�
'�<��@���<�5:v����`\O�������x��
��	�������E=Y�����xC.���x)�Y�.��6V���Dh9��-N����66������J�C-E��iB.��[��^r�+�Y��G	F���:�T�d���[����)>G&��m(:��5!�����na����9=����w���\������b���ha�������	F��XG�������'���}�	&
�g�8^?	�n#�l�D���N�#x�nD���qgRg����xp��������	)lC_���rj,V�_G�[����auGa���X�f������P�ge����;.�o��z_�e�\)<8����>i41��6R0H���+���ID$'`������]��F=���8��@���\�������"�������<� �`����`���ho����-u?�Yur�^�>�H�R
�TB-��w|Q�<�����������C�a�!:�o���o�C���KJC�v��wb�������6���-��1�B� �x�\2;}z�������A�r,����A �`���V��dn~a����3���"�e�~�x�v��<E�o��8�)�������6���}����"���w���x��r�$�4�:$e%�`�c$��(��`-Dh���Y"���6|0K�-G����/]�_�g�������NE��=AQ���F�a������??����D��[��zH:���79�a��@��`e���;���%�����3�c�����Eh���q����yu�3��sR<$�0�!����\I�=���
����`4n7
��{����������cA\��#x��4�����5q�68N<}�#�&�����_���I3+:����O\��)���J�i�p\�1�H��,0r���%�[5��29x�|��O�.���9�!]��%-!N��i����-��b#��W*W}�Q��rC��Q�����[�O�PD���uH����#�*Pe+Um�j5;���Kx����>���~%�\�u���U�Yo<��3nFL9��+i���K�Q;�o�4n=�\3�����.l�����������
?��B��L�`p��y�?�;��$�d��v���y}�q��h�~�L`C��9�:)$���r91������n�9(�*a��At���C��%w,uC/c��Ey0@��S���z5����S]R�b���c����X�Jd�q��>RF��W>���X��43�m�f7��&������r�_\�71s]-��2��=������������U�Px���>��M�j�����m>E���V�0�Yt�/��a��z�����I��i:�^���������$�_{�Ffzbx�����[C(HKa�9w*7Gz7!��(�|�#b�������/^�J@I=m343���-I��@^
sIqb��Wx&%3���$��a��R��e��SX���>��o\8�
��Cy%�"w���f�p�^2���E9�`��s���'>������Lv�og.
c])�^I���*�����V��q�6��H��=
����p����Hb��u
�^K�uy)��K��+���M�D�riRC/�R��^��G$��BS���
")M�\������X�pe#��p{4�Q#��,���m�Em���o
���B��XX�nm���A���1��,�Q���W%���fa
�Y`�<hEJf**������/�jE��tA�5+C��:=�_D��+�\#e��0(O��E[�^6�y�����(�,��)�(OLq��V�z�$X!a�a2�-�A���9���*T�OD���-�L��,�����R>���E@���)���@	�vByR?��DC��w���\g�=G*
9�oQCa���4�&��uB����^u�'�V�6��"����b�V������LP�R�!n;.Cjx�V���6�\�^��!��d��f��9�?/�n���w�!FV�I~�!MV�L!�,[*L_��`N�
f
��y%h6j��5���w
�����@�����7A$f3]x�W�������6�<�O�!e�}H�J#��%�&�`;�����w{	��LVcU����y�,�a�Z���i�hH�����`�Q��mR�9JD��O�=�O/R����a��d�m��7�,�SQy�1N���C�R!��W+n�A���X�$H�H�����-�t�J��$"F�(�x��u�Y���wE����
���o��
��6�
9�J
����
H�|�����Z��<'$�������s� ��t��E���x@��;"/�A6m�%S\�I��e�l���:��v��v@�,�tzMC��s��A�I��7��o��R�H_� IDAT$5t�wt����
��V#����J���������I�[{���!M��~�����>p|������~U{�&��������������	4�`����BB��hhT3���w��hxf(x��}�a:��@�����L����_F�i��d�	T��a���U��8����3W\P0V����I����i��U�Y�KK ��G����H�C����]oJH|x`5������v�q��hrm4��B��"�5{m���u�f�����_�r<�mG�	
���kr�[�A�M��\-Tha��������n���xW�|��mk�N�=���^u=hXjr�A�����A��u�z��+a���84f)�o�K{7_�q�~S0y�d�����\�� ?��L����
�;4�)0����4z�`�e\�������!��)������di��m+f�����a*)!�y�������5������a��G��&��r�8�����%��X�!,���L*�|<0�AvT��s���0"<`p�(�-�����|���;����+���MW�`x���32���3��y�����v���/�{��WVf^}����X�i��M��u���h`T���u�z�u��1������aN�FX�~��K�<8���.w�����wx��fP%%���A��2����v��Ej�)�� �Xz�7����*Lm���Z�<�	����|0J�
�����A��9�)'��F�a�O���3�f�jx��DD�/"��Iyr4t~���#x�,r��Ej�TI�@����������_^rA�S"��7�����
%�*y���
AB��HA����|��'u@�$�T����
����J��n�>�� ���dTa`��r�q�)�A�����^��P�r3��9��{z�;-��}C8x �m������8�P��R,��P��4�.>��-����M[���	�K���>���
�M������bF6k���	�	�����]1f����������x���������������]$	 @�<����!���1<
���%%�&\����)����`����z�� ��L���F;R��J��������R������s��SB0#}��x,i��������"����Ux��a2f2��S:>�g���\����0����:w}�t��.%/����pv�s�w�8��)��N?�����Y)���/��2�R� ��[� �3���y���,h��
��{�5�P�h��B=[�U��J�������7~Q��%�����T	f����j!�����Tx������Lp��7�bXM����+)�� ��Af_��U�V�5��'�`�kr��8��� ����"�7,���[��=?�����p�7Y�[#j����%Y�ZU���A��s�*�]����{�3��P\-�������B��B2)o.�4K���O>1S�����<��j�����x���*�+�A}a���W�Q��!�:9*uL�sS p�Q�se/f(�����~�-x���6��:��qTv���=���R9R���?��B`��]���i�o;���D�A��Ul�������s� �v����xX��������s����#g��A-����3������Y-�����#6�r���>O������)(�W��O_!"*���H����A�~�!���y�{��hX����q��h�G�j���#�@�-�-�x`���7?A�^5�pgq��PA���F���,�g����DE_$"���-x`n�H��)����1�vc��)�����A�p��n�v����_���W�;x����<��b�l������3h�w
Wx���K�����+�5� Nn�N��p���>3�a��.\�OEC������$�&��x�j����L��K@���x���wu.<h�rn]���=g���X
YR�@GE
UH����K�6��o��~�J�w��$���w{��&W��(<P��	{r�Zu�������	�s��������=�/d�*��0��l��I�v�,V����\��0�C'!�`3$���,��B8 ���!?�@���Q�*�xyC������g��0|�1lY���,���S�Z�{m�cs����M�N��{r)C��n��n6.��|)J(*x��� ����� %;��y���^L�`
W<h^�;�!|{��E^��V�;��$��������n2���|v��vq��uG�a`�V��c
\Z���@"�e����x��V/�>���=X>�(WW�u�����90����W�)tl8����S���t��-���Z;+T,o�
5q���-fa��1hY�7��'�b�[��Ai�������F�����hZ�����K�anw`�N>���4Q�l�p�7������E�r�0�~����+z��*z����j	LM�������s��S	S>`�#HY�I<2� �6��
R<#����Q�$<'���r}q��!���0�!)�������4���=QRF���~�x����~4w{��}��\����0���4�b��*�5cH�@%&���k�S�+��d}�G`�I�,anX�Q���F���RH������p�W��pA��CD��)�TT���I2/��>L��[��+m$��M��m��H����Hj;G���x0�B"3q�	a*��E�
���;X��"�:-<���3���Y$���	
H���ic��U����47F��7P�7�k���0� ��W�R�'wvb�(�a���w��[ ��%�wo����r���\{g$�^����k����A�S��ES+��
s��
�T�t
������r���!iA��u�q��8nX��5u�`eG��5X-�C�����L,��B/l��]�|�E�]rb7���5?��,z2	a�����x7�L����}��F�,Z����������!�
rT��kj1�l7B���^s��
VU���
_��As'�v���b�A�u����@ER[`���Iua*)�K�s�C�E
�����;G�F����Whl�)<��w�����
Lc8�w��-�nX�Q����,-�N��������%4�)��4I�~IE���p��!<�����S(�������O��~R<8�����,��C
�h�7�!���\��)$|!p���0����d�*����m3��P��~����+���w	0F��y��+��hcM��e�E�J��\;F�� ��I��V�NIs���	JU� A.�b����d�F;�	;��x�7l�����J����7J<`*����Y�G��;0g����DJD�w��-�-������uo~�
��v��0�H�4G���z�$�Tt�
C<���l���J��p���0���V��qr��#x�l�E���\U���n��pf�j�g'Y��T����G0�J�����!?�j��V�L���}���<��<���LN�I� ���=��w���$�2S��D�m�q��������r�\��~E;x�`��J^}�:��Wx���H1:����;���h��5X�|��w9F�����`P���:�#1�{��������Fh��$���}O~��{`���T�:������N�%�������G�O����u��f:�������[�#w3�G3�����5}'�+����a0n��UH�N�N����b������s1��4���7����'u����G��|���h����{���SOn�\�7�>��iE�����n����>���,��UU�\�6q5:�����!�D;cR�K%��0�>�W}��x���N�;��7l�z��E���W�X���YU���Y�&�q��g.x0��3��z�(Z��5�H�>�E����s����vRA*���[pH�M)�H�����v���M�c��[U�&����
E
��	��

|������Ih�}..��aNm�vC�s� �\��D�:]�[�S<������N�gW<`q�$���	)ezo�����K0�X��T���=���`�j�R2"=.B�F/�|�~^�~R< A����g@SC�v������J�!R�}�v�n���"�S��f����9���AC6�����;���d�+�(��Y�\AA�����{i\�`��q�cSL`�g��
�1��^z�T#X)�[��nX�Q�@�C�h?(��Bi���j�k�G��������������@�hDpSh&^��RK2<Xv������.z���EI��a�r�4��&�I���Jy�;��Seh�Z6?H���
\1�����x@�l�m���Q�����B�lp�/��jR�7�
�'��	<�<�:��pe�0�����o�`�N/�|BRx���r�K������)����[�
��&��V������!t�$�������������x����xR<Xz����2����X9�����������(z�gt��\�m���3.�;����S��s������Ew�=�K�x0��W�!G�[*)����m�����-��� W�<Ns�g��8����`����Va���Zg�O�����?�������<8�E�=w�����;wt����Wsbi����e��o�x�G��6=����:�)�|�x��������5	2ea�K�^x5m40�.R��F��7W�����N +#
=-�������\�&2H����'_���g��Am�9|�;��U���&��2>�������&|r]7�X���h�'�a��������!5��
���=z�_���}��3O��5����[8�v��(�Z���<0v2D�~�G�t���D�{�\x0�$����q_z3m�����U���$���B�����������{�vl)j�"�Y�����9����A���`�o��Zv������D������@\OJ����\6��D���}RH�FM�~K!%#���D��=��W�l�t�E����T
�\�n��8�cb^���.lF�^�~q+�����M?uZ~����",g:�F�$��}o�Vx���h�U�zI���ih�a�zb��=8{x)�vD��
�~�w_��s+����mn���7��'�^���qt?w�����d�j��N~:���s�"��sCA���C���v%��R$�H��J�^�����sd=TN$��N
,0��9��SI� ��+GL���!��$���/����9��c:��L�����e���7�D&��0�
}�S�8�^#��q�.�	���s+RC`��B��'?�]~��������@�����M��r��Z�`]�1U]
��/�s��8����:�0BIbRK��O�B*���="2��Q�c��>p���	Q��q���{)�18���!~E�j��Q�y��Y��xTx`F�����+�����|SRXH��9����OSSU��o�����5���1W0���v�?��"����w8rmC�bS��	����g�q<�'Y���rUr2�
��!��07�y��9p�q���9��O�*�B��#Sa�U��w��nw�+�EV��VNh]��18�)0e����`��s5�#���-0��<���z�-���������G����"+��B�)�%�muz��a9)�s��ZZ�^y]��r�5X���3�i'R������`���](x���Yh��z�����������gj�J	����C2�����|���qP���!WC�II����z�x���
���j���`J�o,s����2<���|�+#�\��b�u��	� ��e|L��@�:VX��I�K�5^�x@m�B[O��hol���c^����������R���J�
k��i#��|�_�G,m�0��f�	��'��=`�����8G���;)��{�zE[C�\xdr���oR�\:0��gsRW�@Y������b*�9J.�(-�����"w��-x0��*v���}��z$�����^-!+�C����
$���������5c���"�J�mj���;��BA����I��rnB��x�|������dcc����XI	v����wBMmm�'��U�^�����w�����h����P��)�(�J*5����J
�P�1<�iP���v0w��
�'=�x��I�&(��^����&�'H1��5	z��$���w"%��R�C��`��n�z�(�B
J��75 ��2O�r�>WE�N����&�8t�M�X6�S���!m_	�'���0������ ���:�
�Cv��whn�0w&c����%������������!���C�1��x����@���VO�m1��t�$C��Lm��=F��5SJH����)�%�[�k��2V�N�C
�9�����V=�C6pd�!Ir�/�>�����c����$I�:��-^&�5���q��7"��=��/G�Q�9�rl��A?��������w��M�Xt���~x��G��u�;R8��[�C��eN[2����{��!#I*F�S���u��JJFHL��@���>�+
�c�N^J�\;X}����*H�@A_U���=3���"�Zdx���g��������7���I
�w���x��3��g$e��<_��i'm��%�|���y��m9�7 (�T^� ?��0nU�,+Shs0��4�t����Z���ma�A:��
w�C$j93;���A��K��/2����Y��D[�>9P�B�/��Jp�Qu�s0h@���������H$��4'��0��<����
�e�<��X���c�,��:�0�����"@��^�)���o���RZ�(P��	�.!!	��=��L�!�Mv7���>}���g��;w������$�>��j�{"bNo�<��qW#�5��i�H�~Y��
����8$�;%
���rw�B[��_�wK�ZV����|�l�5c:�����~-�|���?y�
��>;��TX`��=�4�w�n�r�]�A��g��x�O�x�=��7'3��Hh�}���0�J���}��:�2��j@�����rS��C7��%pU�[_����v�?3�]"�[����,�2����9��#��q�Nn0Q��L�����yx���� ����&�1f'D�L����O�|Y[SI-�cAg��"����K���WaD �-A�9�Yx8��.��__f�&
&�^��Y��Cn)�H�A�Px��C����N~� 39^��s�
"����+�;rW�~��S����n����N��C���q�}X�����k�
|�q ����>}�%8�q�Z��Am:�?��(�����'��>S(`nX`����~g���Js�`ol��f=�xg@�	�/�_�ov���������}C(��c�����)�r���}�#�����i�d�E'��1v�b��5����Ng�:l�r������i�~!�NS.<��C������q7	����aL�Rp��X;�i����������v�|�|�5j���������h,�?��39������L#����_��\K��y1����������_��G6�w��ym'��&�G�Px0��n�^�����/���2<p14����r���`���
��<`�c�3u����0�~SX�H��s�0���<h�w+�2������[�1�����$<'�l���}����,t5���t~�N(j�8� ��v����I'qUH��M�op�\-��?R�|�{��2����x<������X8�aL��
;���}+�ZH�4x��EFA]So�r��D�q������A&���[���0��/<�|��$z4��]re{{,z,���(�=�&��k��P!�^�b���K�s��8����B}�2p �TX`���K������N�H
H�`J���:���.	,��0������N.�m�i�|t������#��`��;���Y��t�Uc IDAT�
��������H� H�����-�Nq�����y�l6������l���h�P�mp;�'��X��g��l�"�w�ZXs�����!V�����(��t0}�x�;	j�1I�h�V[/����=1q�{�����x�%���#�lt���Gn2�7���h�3�����4w�OI���`zf}�mq�w�d����(��PG,}��	B�q��]t�;�F���I[R��m��Z��)�'�BBC[e�n�\-��U�^I�nX`����I�6QQ��o���9�u���K=E��+�2��M%e>r�'.�x��7�SF�4�rH-���N���%oSB��M�<x��5zm�������E�����|�g����B_��6O��������[���;m^'d"�q<����
�$U��������]^���L�S��:�L�����%�����n���+�VAx�mN[�N@5K]���	���#����~y
!���[9"&1�����?���?��`���?�h���y}�����sE���L�!�`.�;���>�~[E�
�K;-�wg�b\�����<t�t�j���VyJp��i�Qc�$�������:l:=Sh�F�����<l�x�m��i�po�t8���k�1q1=����T�����`�Px�@���W��M5c'�?7^^�����;��[W]�#����&�;6}=���;<�'��N~�Q������~3WxX�-P��S%Xy�$�N�^�9�����@�i����zqa��`0����6����b��+�������f6���������������A���������r7���������irkRDJ��<��<x���Tva�Os�In�^��3����gq�`�sW,0�	�&����S<�_�	��q�@�A;�&a���QB!)9��F  `r@����_��f�v��S�ED�g�6���B�
�1�D�0�P�E�L������EY�(�@��
����^<(.��j]����I�.�������.<��oq�����\�jA�tE�)
<(M��!mQ�*C�X�*K}K[���J����&�ZO����{\>dQ�<�J�_eHWxP�V�����V���G�j�4y�&���-��Bi��T��j�SmS�zt� �6����<�(
<�G�e�Gq�AY�[���<�l�/i}
�Z(i,�m�g�d��6r3A�#�BIBAW%I/)Mq�$���uY�y�Y�(�j�4�����)�i�5e�1,"� �D�t�P��HTx E�J�(W���������(��4y~*i�*s����oq�Ai�.�j��|
�Z(iy�����[��d��n�UVA��,��E9��,
<(���SxPQu*m�x ��%R����������<���h�\��/����|����g��@�&�>�D�sy��40w	�H����?44��R���`�?v�o?�w��`kM�Ak07
���!��������[=w�j4��/���q]����]J{��7��A��s*��KN&�dc��TW|���@J�3xPzVTxPQ�_�<�����g����
�����J�R<(��J�Vd���f���-��[\d���x�g!<8(i�y]��<v!5ERN���k%�KJl�J�P�s1�=��T!U�w�Xsfw��,���Nd���[���T�,����X����5+)**
�������f�<C������P�`��b<����������x�� S������Bx ��������F�	<����@V,�<�����'���( �y6����Q�;GA��r�OU���xP>�)(���x���e�����EP<��N�=��_	�A����$��ko�4�%����trK(�r3�G	��|l+���Q���=�T���l/�����c�����m&)��YH$���q]�F?~
�����%<�������@>c������Ai��,��@k�>����B���xP.f.�<(�>���V���Hg��z,<�� ���^d�Wy���-.���LR
<���H)U��T�~�Z!���Kx ;��{;
��|�Tis�<(��%��b�������P�A�@�X��
��+���\Dk$I�W8�����&s:� GU�
9E�������Q��
�����{,3Y��d* CG	o�����/S:yEV�4�b��l��=���A���8hjjBUUU����NW�B:d�S1��deB=3]�z�����#�RU��H�j@�?������`�,%Ed��<��oNNbbb`ll,)j��^������L��?_*S�*@7+�D������iii�(�,�r4R��(��G�|�|����C)G�i�{��j���2s��-�3������Vd����\�dd�>/���T��PT7F��a�LP�����L�dJ7�K������f��TQ,m�dN_��!k�4R��� k2T�|D�������X�$�[i��-��.2}�6})f�uU�?�s~(�{A\>%�M]@���m��?�J����G?~������\yd���$=P.yI��4�!)��\�VGz	�0��������j�-e���8��@��5��������#%��*�U�\�����>�4���wyf&i>"M]�4��N{%e�RB���Xl�e5_W�0���YY5��|%���Fr����*k�u>���-�J�<���"TJ���`�Ac�O�4!!!077������r�\U���|��G����5K�Wvv6"""`aaQ��*A��pT��HH�������O8�Q�:�*��E���Q����G�����<���H��V�?*OT���0?�<c������a�S��P����@U��0�T���*�GU��T�|]����#^-��wY<�<|��������"�*rU�?���H��V���`
����eaaa�,�Z�<�JT��Uaa����,RV���0_/��Q�<��|]�����"eU���2��,Fy����%�]Y��
�!��bd�<���Ua~(���|�E��2�����3�����<|�x�<u\�>�v���p9yiSF`�2�)��dffBM�t�?� kT��V��HKK�n>e56>��?��YP�#�tY;444*��+S�����\e9++OQY�b$���,�*�GE���[U��0[�!�Q�|�j>R����CU�?�J���oY����T�5i�-�G��T����|�,m)������ m���'���T���*�f)Y������%�U����*��r=W��Q�U�?��|��dE���xP�{IH����xP�^U�LfI�X���$��@�V��`5�
�!��kLU��N�U�qUU��*�G�������|����IU�a~X������?���O��W�1UU����a�SUe>RU����Ua>"��+�����G*z}]*��jS�- ��AUeb$LT+~,��0Q�C�&���h���*�!,,�n�;uU�<���(]~U�?��z����SW���
���2���Ly�#U�?��|D�y�l��S�#x �� �\��|DX�����O>Ua~(�������G*z�.���B>�	0������xKl��[
h�dK�')B�u:���$E����b��\���������Z�n�R�]"
����Traq�/@������t�Zh!C)Y���"�@
�q��)u��f�����w����8KU�V����������.q;�b��#�3���P�!K���-K�q�l]bb"�6&�PU����g�T��OF5yf��Wy��,�p�6�x����������������^�S�:��?Btr�EnM**T��p{��T��Rx~(u�J�����fb���%���dMZi��c>RY#��#>�	2���'��]��Ck���Q��fZ&���e���<)��5�&��.���OT^�I��V��O�?D�RU"7h��*�e���5����r�|����|���aY��f�:�S����p�ke��,���1S��nzd���6y�G�-�4�4��qH��,d��8�&�8[��4�i[����#[����*�����?Db[
�y�
�!H;	����c�2����!���������hr�.���e&�-�����|$�����AiC;�����"�<(�����,��'g3=�Zb�^t��~�nL����X�(���@�e�mLH
��\1����h����]w�%$b���%*�~m-�f��(m�D�
Vx�cP�|*"c]��V���<��Y3Y	�?s�YvE��i�+.�K��:�CV�l��4K�v���.�D�Rq��4�R�#��9f"!K���������|+��V�E��g��W��K�C�������H��F�����-��hh`���*c�)qY��2�)���Z�~t�\����O�����X
���JU�#X@�@X`�M3d�+`'Ku��r����,I���g���s����e`��,���;p�C<L��|2&�uY��X�O��%����L*x m;N�\�����^e��{�ClZ���Q�l"�?y;^P��O����3;vC����G��@V�	�T����_�X<(�>����VJg��L-�i���-������Z���|�#��O��@>�O<�����(���J�)X�", �au��)�x �Q%��@>v�6<��Rx��=B^J���v�	�T%�A����]T5���{5������weg�9�<�%���M�a8�?�~��o������8$<��dJ�"�[������D4�������f��Lu
�����\����)�,��@����T^~���\p�Q��d1+6�h�1�\�)����<��9

]�zy5ku����L�����D�D��8���|mmc��������m�Lu���e]_y��QaH�y��� ��f���-����]Bvr"t[��)�(r���P�3�V�����k��m��d{n�5x`���b����&"��@��l�Y��3�3he�l�9�6AK�#3"��Q����zk����	�<�~|����NKFVjL���oN��q������Y(*�������Tu��i�,�c�O��&��
D���������B]I���:25��7	i9���d���fu^���W!!5��P�P�|>u���[�b��X��.��[&�i���f5���c�����_��r-u5����o�^-�S,�����	�m�������ls�Nnv�SW��%;e8�~
D&����<���`���t�g��O�3�4��ii��&8�<?�l�)�.����mV��J�xP�x�6�q%����	�A^��>7��@�a`����������g���%Ev�(mZ	��5�;W]S�o�*�`������%�<z���u�����������5������zd�I�R��w���x� ��]an���<6>���D�Z=�u�/��2�T}+J\����8piw����O�7t_�4�7x����o:u��'c����i�GU�Q�.�['�j�_I�%1�A� =+k������0q�Q���#���	���:;�H�Y����L�� r�\-l�~]�����	�SR1��UX�����C�P��
������#gP��;��e�}bR
������������#�������b�",�5���)���A8p�Y��w��B�x��f/������j�]KA�W��%����l<(�>�j����-������.ny���!��[h�k�����3�*��x@����jAEIs�������R��4xp��r��0W�������P_�����^�������%��*q�����C��A��CPs�	%m�
r33�g
��M��+�<p\6�������h�������^��N��!J\p1	�<x}x9l��@���
���"��������i
j�)�gZI��2���Y�	�D���U<PQR��]�����<�K��t��6|����]\0��������7m����7
��A��� O{<
����7~����m�B��II�p�����:5������c ��G/hC<��yH�PR}�������NKME���S�k_XD��U�xx(�{�]�8{h���x ����W���x`�`��>��TP���xq��LYV�������C<,|��j�����`kUZ����,��e�:�
�kw��Yu��Wf�`^�������w#Vx���,:v����ek�D�x�����[��k�T��������{MT75[������\����i��$U�E��@&s}�D���;�����-�������(V-��**X�zf~�9�,������wB���9�p�����gM��S^Wq��}L=����U���1PRT���6a���PSS���[1c���[PH���@i���u`����������z�D������������"�h������"�z�|����@�e�����T/R1�t]�@��8�Z{3WLtj%��)��]o��y�:�@S�IXv�B������'�����y�NA��Sio%k�'������������cT���W�W���@������`\
|�qM�@AA����k�a\3O�8.fF]���.���j�Xz��;Z��������E�
���Xu���J�'�(� 7'�;�!'1JTo�����/�w��8`���lGv���	*4y�'��V
�l�Oq�C��
�������NvH8zY!� ���!38I'.#���l^���\�@����~��@��y���R�q}g�����*��h���b�����=i\IEZ�d�Cu���@�A\Zhp�zmL���Rs�j����us_2)���N�]��&O����h����\�x����`�4��{G��������qk2��ARL\���Z}ui���(��.����vk��5�0x���X���N:���;S�u�"����������0����Y�����c��gGxYb�)��X���x���k��/<�H���N�y�a	����u-����h�dM5e�y��-Ue���������_�p��	���{h�������x�����ZW<��~������k�\6�s������n��!q)��\^Y���������]���F�f��'�����>����mT|.�ku�c�&HI����n;L� #��kZl���N���"�*��"BFF*�w��z��|q
RS��3�}�����s��06��n]�Lu�A��00�����CW��t:�g�)��;���:��z�^}�r��kW6��GO�7Kcn����0��8��ZU\<�o���1Z����x�]I�e��3{��R{vP�����
��2t�n=����HL�{�.�3������u)�_�M�uL�������������6BNvo7�����}d%Z�)m(<�J�E������hz��F�:�X����V0�b�Gv��g4t����g�|�
�b"�i	T�m����_CAE
1��!'%�����2I�����&�5��EF�?W<P�7B��}
����[(�p((*Q9�y�����RV���
�;����My�4��R��FNZ
����L��f�ZA��/#�����
�CZ"��/�.>��W���������P6���� ����[0� 
u(�i"��/��_�A�n%M5����ad�]_�j��r���p�6�����/�f�A^���P�
��m���2N�F#���Py~����8�4�����b�q������=��*���0����fm���I�����l��qx��t8�����w��f
+XN����}�>�T��u{SL�����fe����L}���������d�=��D(��L�N�<Hz��������lK6�	A��#�s�R2xs�7����,Z
GfrB/o�m���yz1�~���	EU������7�������A����Z�,z��q`�s&��Y������y5��4���fe�
Bu������B����/)�������#+���C��d�� IDAT�����\����
0i�j�f<���+���-�@��1/_z�����#3)AGW�oY0p�{��^���}`����3r����QF����	2��a��jFV�����P���q��7�E�DE����?��mb�/BE��?C��\`+�f-�����c�L��3�q��d��6X��w�p�I��/gI����������:�I�.mE�hp�Q*�Rr�\lV'mZpS � ==��o�&��H���9���h/�_H&��\�0W��&�4H���6&%$MZX���&T��Lgt�{\� ��A�����9�u��Y�z:�����G�i����5�CQA��_���7Q����%�`f��z�y����kgtr���l�������})=���s�l����'b��-����|�<;&C��G�����+��c���0���;���b����,E�����^g^��;#<"H���s���u�����VdR~���f`���c>��Is����dC�~�9��S���Z*�8����7<����I!OB�0���k#����3O(%�j�������'}���������;f�&����l��Yy��-���wK����s�����F��6.�4��/�y��Sm,�r:P�v����N��~� ���"�CMu�����}���vPV�k�71��}�*f��Cz_2�����>���l���r`����}�/��a�����o -3�+�Q�z�Dc�
ot���V���D������i~�x������Xz��j�A�~m�����M��P������p����aA�����}U��~�Z8Y�=���>�y�lL��	���0Z����.��'*'9=s�4�}�G�j�J�M�x���sFK�����	�Q����^�b�����3}�����c�����������n ��g��fy�d�(X�is�1����e���{��zS5��{���jb���x����C�"����������dGf������lV����U������af��6�0���8�f�,y}���hM���5�tno{#]�v�!�ID��Gs]z�?yw#��2_D��[*���d����+��+���f6�X����T�Ax`X���8�Q�W?Gzt:�i����x��	j���HLB�z��Q��r������gS
c�t�������*�}[0Q?S5h�+�L�-�k4��D�WL��)��{���A����j�=����^����p��*������.��x����+ D����8�m����06s����AZV{���w^p�}<������zs���azz.�\�A�x�Z�2�Z���*��8�#-M,���4�>���>�jx�u��I��9���'����{sy2Rb��o%Rc������X��\��
��o�����c��0riO��hJ���SKP<0pj%�OD��_���������D���7771�C�F��<������n<��8�=�im ��zt��c�V�����	��Q��B��P��>|.#��)�����
�|��;tz	>�<��G`���0�2��[�C��8syM~�zy�Yi�$����<�N���k3�t�<�+_���u���h
%���-h���{�~���
����f6�e&6���/�2�v�5�=����u����A�W+Z�j��[Hp����v�g�	_����!�pvA�Zu���]l��<�����}�Y�wb����Os����3����]�&�Y�;8����g���kZo��e-=u\`��4���
���D{��4W�Ks-U��@p\����A�g%����M����"����z���}�)�k#�0}���"�����%�`2�xC���P�F���$��/<[o?�
x�k����%Vz]�5F�}���-�\$�����RO��;�N�Is=�o��9Z���C�\�����wA
3c���&�P�����R��������jt]x�����;���8soc�%�+�Z��D�\-��'`��S�0j 6l�{+�����3���v�\�y�C	l�4m�����?��7�tu`N�*�4�d����X��f��2�n=�3�@ZtMG�V���yKWC[K�I*�N��E������G?]!�@�T�4� �+�8Heh�u������a��K"J�k�>L;D��"`(-x��m|����!����V�da� ��"vd��sU�xgC��2-x�����A2-����@�\����R���T��		�M#s�VBA�@�+V~����Gg���/V9@x�~��lt�h����(��IlfQ���V�ia!�10�����&�t�}�1~��
kF�NN����p�j9#4!	w�B>�~���|x`�����V�{�)m*Lt4���7v�������Y���	E�9�w���0�6i��A��;���	F�Gq r�F�����D@�am�m9���R0�1
9��H$�@odo�^H`B�m=�N��x�2tz��I����]��G/D���H�gy�>�����7O����=4��Q:�����Xt�����4����i0�T��}DoKD���d���$t����gP`YC��X��r���L\���z�5����'�ah���w����ym�� %.�����0�=����z�{OU��)���$�'�,yQ�����`��q��������>7n���M���>���}-������}���H��f�����s�m`���T�;!���'�')H��s����6}�bh�j8�L�1���'��K���t����6j��/- fq��,����o�	��~�<lq�!-Rv���7_���- f�4����k)?V��7��E�9�����m�C��?P����ae�����|G��-������p���m�G#)1�o�7���3'B�f���e��7�A�c���$f����s�6����}L5`��x��\�;���<�"3sW2�%)@�ggaLE,�gJJ,����6M
�9�����s+���2�9_��-�R[�r���������4�9R_��u��B,�z,���i���b��bm��@�n5;qH ��cY0H���D����*��<��8����u�����=~d>��3�/�z�V���0����)1����?
iaCT���W�EV�������q���)���@���P���R0��!��x�8��8<�je��������u(��������:5�=�
����X�\��_g�|�
d�$8,�/|e�{��n<f���v/W-`��k=$?�
�:��jfM �Z�v��k�`4d
������%����������t�t]��u�4���7�	L�����=m�!d�YT[1o=���XM��w+���_$����A���H��j���f�<x�=����������@B�_�@��Hy�1'��6�C7y�r���s�^�?����Z�>~��+�6�������\q!3���<����*md�~�/�n�q����y<[���}
��"����Hz�)�!��H���}���@=����/��1�x�;��&`���.���`�6��2;����W�<`���Y�n�@����L�BF\����{��|>��Y�E��Y��K�Els=#.��A�V�Y��
]g��a�v��ID�=�����,������!-��r�!�!�7h����[f�i�2�o���#����;����@Y]Fu:!`�w��1������)'>�8	5F�Fzl�#�mi3�j&
z ��*��AIA�9d�sF��A�x���;�9�zu'�
-9x`P�5t�j��?�5eZ�|}�'�S�����������VPdD$f�>�����6�K �C���0x���
��V����N
p��&	�8��F`:����f��@k)����#+���C�A����j&�����e���]W�d�7�d,�L�_O��E][������*����]q�m�^Dd�Ut��z���Q�X�C�*�}�H�9b��
[#GD$�bH��8�s�k���������p6w�6U���G0��b�qa�]�>P<X?b'&l�&�Z�:��/"���]#����
;Q�����A�|$������--=���?�4M���;��h�a|�c_dd���/��7��j����^? U���:�.�VS�E[����)-\�E>
����
1�=�Lt�h����|���
k	`s�
����w`�E@w���������a�����&��O�R2�p�/�:��������[����7��rX>�iM���BhjE���{/�U~����7���5}�l�59���N h�}/�es��M.�� K���E5+��3�������-���
S�]�q��7���������O#[vv��_�����o;6�����u�1|�u���	����0j�l�����y]����}�`_�������������M��j��VuhC<\�h!?A�	4$��)��u���n����x����9T����t0m�����O������M�nZ�	�Bu6$8������o+L�u�����gp�H�`���?gP���\l9x����7��G-G�����sp{L�{k���h���p)������fF�z�`����ARU(X���s� R<m� �,�cD(�lchdc7�������S<`�+h�Y��@x��9����������isE��$��m���YZ��8�!���A�[�!���b��g�"���C��d��08���`�����i.�}Bn$h������ZPw&���;�d!�D0\����G�`^[����i�{�x$��!t�����@I�@x�F��zY�����������U�o���4�<�w��X��^��]���\#h�m��b'���9��h�n.�1<`P�������:�i�����2������y���v`���<��
��]]8�w��[���M����\.�����Ax���8�b��+��V'��H�mq��m�������P%���p��}�a��� �d����\+�	5=+��N�o��
}[����j]�"��N��w�w���i6�.����%H�?9F���E����
4��F��I4?wu:R�Nx�����p���m�\&�����skr�Pnl�������&����Q~Gt�[0U�V�Gr���z.�c����y���v�*
��[x�b�d������OH�k������V�=���J4�����A]ZO0�C������}�a�x�E�&�[�T���1c���'[��7����u�4���>������%bb����{@kdm����x�P[�_�10�zv����B����>������_�!y��#�����.��u�l���g0cq������{N`����k0�~#~x=<<ywxpW����0x�J�n
��Pwo��K�@���w~G�����v�	��n?I��Bo�B$ym��kK(j�U���S�0�i=00i3�	3@�=�{�v�/^�hn�L�I��0��'&�f.z`��\���[�������D�E����_W���M������q��utP������FO�������N����q")�����hLA`��q�c�N���\�g��c��#�bD,�}�N���������/\���
��S<`.��2jHo�����I����Y��F����c����:~�k;���N����������o~��f�i�������#2:?��O�Z[�Wc���?�$������]Ma3�R����r3$K�������DW4��H^�Cu���A-���&���h�����l<���\��f�v���e���8�]���8� 79��NfT��BQO�)���z����5����}���zt�b�_��S����K�]*���%���?�_o�`�Z�����n�����R5��qHW�	u�o����V^�#�@)��B�}o��~uO��h���>!�&G�������;����Ij���r�~��o���W&b������i�w�6���E�������6�&
���<
)�����B�@?C�[Z���8� �>���O%U�,�l�3GU�%=���;�D���g�����j_h6�Zjp����d�M����f�vM<8A'��eh��L��k�������%v��N��K#��XT�SY�i�/���d��)q%�Vx����t�qqs":M��������5aa/���J��=�_�����M]?, ��(�(�=R�O�q��g�[NC��$DJ��UxP�L#�8������w�w��fpcL�{'.R'0�������	�zAW,��}w���-I�����w�����Cw_�W�>�%�i����������LN��2����}����_sHa�����,AV��m�������t4n�9B���F���<pp�L��l)W�'��JJ�<�Z8�oW&~
��$}H��C�~�B}�����<X��/o�A��<����i���O����Vm�"e�����<������&��m�p�����<Nm�E����g/���~u�a~�4�	+�����|���S3���t��^M������`P��2x jc�zv��~�����Uo��Q`����7i�����G����o��{�E�~.*nq�A.�W	^����N�>P�7�w��������j�{��m�k�7����<�=�&�f#��C����^���=���n�Hx
�Y�"��`6�����{�{l+�����A��c���T�I� 	�-{ ��R5�D�6����:-{�R�.&���5 f�_F(I�<��M$�q��������2���q.[&���?��Y��p�y^��N/�0%��wp�LqI�@�^5R�#����&:��^s*?���g������i�a��i"�hs���@�N�-=�Y�8c3�g��j
z�H��v�~��%��N*^����y���4z-\�U��N�+����|d��� �^ �'w���]EP)!��	+��]/XXSBQ��|$=xI5*���,����l98���UI�Kli��B��9�L���'�t
%�N����A�J��
w]���e�
w�^��H�4�����Vh�����9����������G����E����7'V#�N�[��a��X��Z��$���N������?�������@��:xx�w1�;��R#^Q]{�������hZ� `���	����	S��N�K��P�D���!��3X���[h������N�6��L�g/�O���C�A��s�wm��Q(h��S�=��y�~%	��%������n��-�O�q������6��}7�N	ga@=u��R��]��}�������,�h�W���z/g���������u��U���0�m
�HAz��o3�v��I��~��W^���t-6L�H��Ya�I0�`D�/�.&�����s������X1�OL�9*?[u�ft���'�Nh�\-�����g��������^�z�/�w\-ja���x��a>xP8���wQ�5���-������|u/�_p��I����I�����\\q���
:��j�K��x� P�xp��;:������b�������"��t���D�TiSwE���z���������X����7����#8��ja��&�\��)��re���[�)�%����x�T�<y��}b�[�Y}�8r����^�N������D���k�D��1x@�,�"����6����h3��o���������	6d 
l��z`0��q|s]�!m<���n��KR`���lL1|�i�������W'��f���A�\	�>������c�C��{��?S`0;a�N����5-�9�0�~
�p�E0f�2�X(�2����=�],���!&V�)�v5l�p�5��8N���tAT������l���3�:�!������Lh�����t0@��L�`#�#r�X�6Mp���;h��`}e�!�,Q��h���_�fc���W�LxP�������M����q\��(���� IDAT�xP�@"��/�h^��kL����:��!�]H9&��ayq����*jLt��������H��x��C8��1��u[6@Bx`����Zt�oT�~�����I����:��6[_�����#\������7R�������}��]��@��G��\-(�����58�{�{���0�x`J��������F�����}�**oL-����8�uM=v�1�Hz��/eW�0Xqt�Fp������in!^���x+<`jZ6���C�jxsu}�2W���h0�~�]*��7�(X�|l�u�D�������H=����<��CC$�r�xj���_xp�����`�77O'��}�bX���[�M�
^��B�.����D:0Q<����&N�������=����d���U���(��o��-)i��@q��k|q�A:���$W!S�/?�#���L����q��>�����C�"
�/��Xr;R<�Z` �Z:�1m�/2��4����0a�f���}�6sr���-�^:�����JJ��khb���:j<Fo�s���w� r������~S���k�|���l��>1��>����\�����&4�wD7*��d_�N������
���dR�S�q���oc)O$�7�����������m3�!�d��S!hZ����ja���P��A6^�Gs�}@��6�'���N���8
V_���y�vm�x r��N{�sh�ye��Xr�f�*���nX�
�j���c�H���Q��'���K���L&��Np� 4mXqD��pr���w0�_w�#:�nBP�Q���{��ycOti�/��������#O��1o���

�z���������[!<2'�_�����}��"��M�����8��� ���H<|��g$�1�����e����#����p��	��uN�"Sa� +�d��2�@��3`<@�:�����A��@��Z!�>�3_�A�w�	4��b�oe����.����������g2O�^\d>���!r�$ �U<��:J4xQ�s�p�\��b����L�`�Q�,����>��
k����z���=0��Z������N-3� ;6��)��zWD������~7�	X�"�#R<`j��q����MiR�wj���A�/��hK��`8nW<`q�N_�N��P�~K����r����]���H�H���mC%�[O���P bh��+�+����I}@	~7�Q��:w�PX���PP&������N��/��!��-L�@��
�����
HM�AI�:�%9Cr1�{9���������<���K?���.��}������_{����a���%�cck<x�w�]R(
<p���w���$��=��M}��C:���K�F�,$�I��0�cjL}`�?D��Y;�f%w=��s��
+,<��$�j������R1�cc�T��Nz��0RS`em$�N<���n�A`�b*�O*��U`���i����B�\*����wo�B�K����KI`4�4�3R)`�	������'p;�S<���+���o�g�&�%-��)LG`�5�F����\)������m�]^��=��f�Am����,2��c���M��&�����\�����{���&)�\:��@�g-R<�SNh�,�zT�$��6;<���^���T�t/��P<�
�I�Sb�F�����}>Wr`��LA�n��8K�u� ��3����|��]�l%�.����#��
L����������x�)LF��P6�A��]��)�kEU5��O�N����f�B)���S8`ir�5B6�x���;(����1^N,��P<0�1��O�h�W�?����d�����'1.k�<0��
��\�M�^\	@�d�E�A����;�����"����:���v����8�w>����A"m��
#���a��6R	4p\6��B���7������~;��w$wJ��-Ca�@�����*P}�8�^���"t3�L'�<����6��?I(2�f,����}=O9��]h�&Y��g���]��~�����CH� 5�Ux��
����;tw�@P�6�
9i�H�M7�6�G�����UZ����Vo�7�_?�����"��W���	j�A$m�[w�{�}�x������^m�qfMI)�)���8�kP3���,������o�~��Q'e��&u%�{>�/x�DjJ�Lc
������TD��O.�q7
,�)����w#��R��i&�{pw����Q`uc�^����HT<��hA��I�X�zf�����t�������*"�0	70U����xP���tjK������=�%����$`�f4G�{8�+���@R%`���5���*��w:�����
+���J��g)�g�:����uCI�`w<~����p�����5C��j]C�NuK��K�Pi����Fa�����n�?��K0x����I�`��v��T�N"_x�'�<� �c����TL���C���*mP�p���F��C�c����t� �#&�8���8������S�7g/~��K|Mj3<`a��#X�}/R;��W>|$���8��� wD/F���`��G���-���a���p$5,�~���H�� ����_��&���50��]_�������Z�O{\ w]�I��*��b�L��)L$e���2ZQ<X��6����
�t�K������Hya7�9�}-�x���P<�$X ���M��}[�$��|���DHe��Bh�lM�V<�h^��Y`�����gy1{��c�����il�c��J)X����G��]��!�|� �������a�gp���";����7t%��db���x��m>�4'$�	����e��&5��\@0��}S3w5-�i
�-�0��k��R�N�yx,O7�T
*�6��i�TO�������C�`�F�����Um�3��lWL5��G5���B�	
��)-������0�s#HR<(�,�->�\H0@"��]�6m������Gb:)1�9r��'Ca����/w�C{�I���GQ�����E�cA���)�kG���~"��S<(����L9Bd;R�(� <��aM.��aX��
��r��|��)d�d���`T�����*��AO�~����t@C����+o�[\�h���m����B�Q�pr��h�f<0`�6R<#R;���B���������M�M����b��P��<�}t��y�������0v���t� 
�IxP��`��KH\<��C7�,E(<0��w���=�z��+<`�l35��)X6J��P�A��f��x�e�PR:p������+(k�s�!��d
���{O�l����p��4����x������������D��AJj�P�C��!<(�x r���PX������y�(OY�)��A�iD�+�Z'`�����%�!
���&�6~�Fj��CP�8�`����G�m��y�)m�<X�.�����5���|��
)�!��Z�����������]zp���`�
*Li�	?�9���Z�?Y`�G���;H�`��?�{�����W���=������f�)��\
}�i���8R�����UH&�<�v����v]r7�<0G�z���L$I�~8u�+�����??���IOR<�����.N�t��x���[��^��@������n��W-`���<���q��I�`)T'�=}R�{.1[<��D���H���X���Q��`.�Qgf����������D��)������+���&,�5/^������P0�\7�=�V�����N�<~��x5��_�+r�`�]A��q����A��D�� �H39)���D.��!g���6_4�nms����y�q$?��0li���a7�1|���tD�0x�K�]��]J�=�j���7-�)d�Bi:��C�m��B2�� �;�+3x�(���:��#������O��������|��-�F�K'4,��Yd�� �6m\��Sin:���8�F�OVSYO#���	��wQ(
<h�`�A���b�?w����F>(�T�6���?b�IZ��0���l_�����>����ego���u���o��bU�D�������Sr�p���~�R<�%�-n�:1�I�`DoD��x�r�!��$����vD��+0�7�&Q��
ed(���=Tm,C����b��:4�J�'/�M��
�bmF��Y�����5;�K���nB�s��>���	�x�.-?�	�i���~����0wRA�v�������$�&���p4�E@@2Z��;����[9�����V#��3�e���	mNEf��$=��d��������L#���
t��1�����i��T�Qm<<��xpmg"WT`u��^�������i��
/J����SP���i���D������[
D������[����Z4�����$��fM{a��Y���i������GB��|���c�e���s$F�@������ZX�t&{$ &���O|�D�����vP���K#/=���U�\iQzlsg~��V�����3�G�0�f��|���=~��}���A��q��@�g��9]j�<��0s�����1�>��oOH���x�5]�ixGf~��cK�$�l���^��^���w`U-]��n�D�������k��������n,D,PBT����� "qD��<��z��5����=g��oa���.I�x��X�60���X����g�O��2�6�m�
���9;�R�|������]�v|�?"�����`������(vb���L��;���S[`������>��#���,U�'�@���ym5��.F
���Gv�Y�4Ir0����zFG�i�i6A	7����0�������M�x��}���p@��BPR�@h�7W{�0d�gE���qu%�%H"�	)A�����T�� ���W9,!O�5��kW�����9�_����oz�Tj�'N�y�IRN�AR�?�Nl���!��P��"VF��-��S��!��hQ��D�w�R�#��g2R��x�y
����Q���.�\I���b��CH��)1Q<TB������b�6��i�&��	�D�G,@��u�vrX��5��8C��P���)�\�&4����:#����kV��<0����`�4)~�<P�X&#)�8=���HU��6�`aXb��ADJ��v�5���7��IN;��t���
�gv���M�1�k�A��;o��SH������~`J	��V����"�t
�}�V�Ml��{y]xP����y���P��B*4�X,��!��Zu���O=�L0������>�Hn:��}�Z���C�����EF���:R��	�����gu���7D��8,�$��K��M=
7�@�I$���^sQ�����0���'4�����$E�����t���m��Q��)6es����R<{{��MY:eW��B^�@��P�'�bZx��2�6�7p�L%��1�B1A�f~�iad��>�A���(�Y��p�9���b�(\�j��!��,Im���X�Qz�u$��(���O��Q����) E
]^NB���<��!�����@����������I��23*�|u�!�fZ����s+y(9%
�0��[
���9�Ba),��/0�=;�}��)���w?,I~T��Y��8�aZ�>�}���;�{q�H�t;�����v=;;c��%xD�r��S��V��v��������n�@L
d4o�H
k(���i�3�s)�C�t
�<4&��_(N��oD
�u��-R�z��HS�o$=����F���������P
F�|B�b�'@CY�6��a_"k A��_�at:��hn�����5<<he�u�4�w�<V]���UW��%�k^�-���	���m0��}w��Ql�I&����OO8��Bc��_6�����_Bi^RG����:�0�D�j4Y�����ZA�\U�w�`����O�D�A�:]�P��;��?�b<��v�N`���
���w�E����9�
4�MkX�@�{����
���<hIJu(�;����e��������6�7��)���Q�f
�����,ni�m�y����=��hP���>�8{��/F����+.X����,)d�'���=��3mP+�0@�We�oq(G*]�o�Em��^
��Z�5�>G�z��i���h_��4W7��q�'�b����P<0!�)����_���"V������
?�w��;��4�aXb�����"@&��J�K�,����Lu4���f�4P�������L����5
���C]�!5��$���2�U7�s�!������r�@#����-������l��A�6Se8F�����<���-�����,��ga!X����Ey���6���6��X������D��x��M����f
6t?,4���N\��o~`�	�ic��K�C��=f�/SO`�����	%^>�V.am�C���\��}��,���11E��vV����.��3\�K�!�p�|�1e0��ZI���]\	Z�	<XMj��d��������BN��|n�����k�"h�)F0� �w����\��?'����|����)+��X�b��i���>��@�OL:x�����64��A��|����l�q�G������<�c����1e�xP��)=�������E���uR���yX\�����KGE�(���o������&U:l�k��o5=<(O*v�eP����KKQ����������:���@�R����"�����r��8�"5����N��2�@Q�s����]�zr�U����CpeV�,[�I����N��
�v����%I�����V8.��c��
<(N1���h�7�y�`/�����9��{������d(���1�h[���C���'O�D����`�������fU_Iq�%0p��uSS�qqJ���Ul����:K�Z���G{`�d2� ������T��[i���bA������>\���=��N�>�Q�'��}v��J�k:���0B�)��|��t��(Aut�z��U���xp��?�"E�XRjl�t�D6�>?�*)@xP(+G����d?:��~��x�����||H��dti8
Z�6q�B����R���F��U��x�����:H�f�Vc�����vu��	��<1��
��7��4`A���p"Y%q��
�j0����1����|Cy4�F(�������Q���O�A;���U�
<��<�`Y����WH�������4�<��!-RR`e~�����A']=���}�K�n.����/���=���Q�5
��sh����q��������#�55��#����*�YR��(�qd.�
�����dT4h]����*��1hfr�a�cg�{���������OX�
\Oj��n�y��1�Q�,��������>�a���Hm/��0]m��d�}}��������:�X��^bA�F��kY��+9��uy�����9�)�6���zgT���G'i���;C�s�8��K���a�!��g:
���J�5��z���p�`���<K,l��1�|���G��������4����0k�0�'�bu�S'�
<`$K����a��FTL����AfP��a*�t�Y�Z&����k�_r��l{��E��@~���8$�P9���t���E���w$����Im����b�W��)����K~��	<����9ov�AA�9;� �e������_R��w�I��1���y3^��i1�)�i��yIC-�%^����fQ�'	xP���C�P��'Y��I�M�����}�F<(��T�"����O�
]y����X��R�y2�1�B�d��<��������+�<���]����X, IDAT��]�����)_n�
�����1�B^�/� �u��e����1p�m~��,����ia�$MC-H�W���&?X�&8�m�K���_�����Y�qoY�y)'7� /6��'c��M@�o?s
�gR�i�V����J'���*�4RV�A^����&��1�B~�d��x ��
�Vn�Aa�-���
��<8��	��2���������_U����x��x����������K�ee�B��w/�������,�����9��n
� j��,����%�!���P��]��<CV���sW���9=,�E	S�m^?���f���@:����Z�zeT�-�wAbR���
="`�$x ;�A���8"�b���O�e�����zxP�=Z
�
�@����Yyvh���}s=)�%��$>�TK;��$�y�Z������VNK%�t�*�o?�w����B.<���B2;�������
��� /^�,�H�������(���*�+�09��t2P�����C^���R/!O�< ���_��Y�:���
Iu�)+D����!����PZ��m�����F��SiY���{R�����C<�{�BN������N
�
�#��}�x��2�BP<I~i�[��Sr���m=<���_��z���&(d�v�����������#xP��0���?��H��������H���
��<(8��J�xPP�
�����;+H���"(���x�w�	�A�}'��?��~��A������x�?�fn!�Baz?e�A��������[P���
�����x�s
��t����G<�W���
�xP^�~�x (H�WI��H���ZB-��)!����}�����< ����xPpm ��������[
���+[���?=�����������~nO<�N���(���J�R�@ax@
���/S�@��J:�@:~�����x ��"\'x�<����vV�/|}}addYY�?����j������PWW������`	k#���+��SRRcc�,���.
�GQi���H����������=
��y4[�������Q����GX��#�Kd�#��|��#��r������R��4W���0��@�������OsE�=��|�5�����R�^T�#�%��|��;�`��{@
�����XX�,������"��'���Q�C��J�g��VQiaa9�}A��J{�����U����G��z���4-�Ciz3�������e���G����z�t����DQy>�B{�C�<���RT��(�GX�
�!���;Ee>�<Q��G����+���B��E�/�B�����������b+0e������~�����XGG���W^*#i{�����ST�#,,���PRR*h����j�_=��`cgHH�+V�m�+���+�,^����B��RIZcAQy>
�=����|��Bhi����)��H�k&����|���#�����!j��n�@���#�z��\'�������H�����q�'�u��P\O�uEe>�<%��Q������j�_=��!k��j�{F�r��(*�������A��%!����t����.�,##���\RR
m�E���C����-�c�A


�3T�����Q����o�t���V!���/�G�}(-��(KzX���|��(
��bMQx>�B{���OB{H�
�;�|$�>���=�����**�a~��~ ��E��'���+�gO�����]T��(�GX�
�!��w{Ee>�<P�����
9�=����4���i���}��0����A�K����-A�+��v���EE*Thi����+
�����|��(*��������"��Ea�^T��]���f�������+*�GQi�������[��[�J����WT��(�GXK
����,��Ee>R��u<�f�ly�A�7qQy����2�@��
�!mUi{4��J{��L�=�����[XX��G�g�(��0_�_�v���Ea�^T����)�g����0?�V������Ea>"������RT�#�z��z�t����H�/H�JQ��|]��#;�`�A��F�;�9�~]Mlp������H@e9W^/�o�qo���X��9�Z0���������*$LT�i�����/I��-!�
������e��d�P1��Xu�|��{9���$���)Y�999����<���$����v
�0������F+��D�mD'|�gA�G��W0H��d?����`��(���3��j�7���Z��b����j��**R�����F~3��=L�
#���*H�_'�<�C=��I�=$�H3�(^��?�-11�[TT��>���d�M��8,���hi+u[�=�*}��B���OM���zoZ�pU��kv������	WA����)���=
��"��j>�+��Oh�ZuZC��a��(*�!�|D.���
~E��q�"�Q��C�K"����PQ�!����=�Y/i���=�Y��m���'��Y�!T>FI�Jy�'�G��T�F�|p3g�MKUa�_r]?�k��f��!c���?�K�
���������!�
J�H���79E\1�$%�if�X�@���Tmf6���������~�U�;��B6�ZY~o��qy��*����������'���-�?�su��/PL��5�������A�	~+������a+�|+�m��0{������ �����!���I��e(L0G��dB��Wp���&�S����B�^�������i������V!w��U�rC��k+�
8�
�"<�Qy�����|/��H��*<�$����Jr�h0Z�,��V��H�_���F��'�lD0����y���2Yu��_����z�+!8�I��TX��������*>�r����������t�J�mX�~=�V�w!�>f�	���mq�i�����Y�����wA�Z�4�Uw�7ZDR�(U������:�_����o�h�b��A�@���-�O3� [)���i�����t�o��v����p�^h���V�	�K�~MaB)�����B�������"U�����������c����YV���p��*�W^*��MiQ)2R���X*��2bN��!2�:��Q�r����jD�!��=��ja����^�����$F�Kx�T���������fj��:v�Y�?��+V��=�����)e�����t�x�'�	��z����y�����@��Vr�gxPp�af�x�7_�A���;�����5�^<�����������)<��d�����<�Z)�:
��H��A�^�i���?x����9���w|=_��+��?�������bb�0}���g:�s��%8��GiK�m=s��*��\ri���Xl�}����$�`��������
;�����51,�=;�����'�8w
����(Q��4��}�����W`eY]�5��9z�W��������>�Wk��r�/���������������k�:Xu��X}� ���M���uh[s<�\�&V=D9�nUe-�s="Q>���T<�0jFo���s'����y�O�L�����'\1��
����;����U0�3��S9�����5���Z;����Si���J�Y�^���=4�up��N��]4b�\����r�[g6*m�����`@;�|v�k6����c^�S>QAy�/m�`e�>Xq���n�	��J���2HS�@^�Z���Y:��tL�zk=��� ��]�|���ktGrd����1{!7� 5.2O�X&i���N�������p<�p_��v�o�W)����a~v�
�%NWvK����������F�|��k�����~|����8�q��9���JI�)���>a.����0��XIP��KY���;���������5���&w��q"�)`�K���L
��O2"��mi�\��������)����
��N������F�����&T�TD�gd5�wR�S�� ��k$�LZU�������G+^�_T��	�������o������Oc���y�g,S��z��P�^�=�,��~eFi��W�U7-���k`;k�F�%���:����<v�(����Cz!�?_�]���3o�nDb��	��JK�I���I���q�m_�ZD��Q���$���{�OU<8��*�~�wx$�����U�7����T<�R�+�^a\U�s���a?�����h]���sW�ilQ���w�-��S�,MA�z�5w�DI�J��L� ��1br<����b�%��b�O���
eMT*^-��\���MW���3(gds�R?�	��������l;��8�j3�����x���3��anX�=u���g�f�4�o����v`����q��sv~��]O�"pm>\�v���b_�6������,��5�0u� ���b���0��n��c5��\H�r���zW������?�Px�[k��x�}�r����0�nS<�t��/�r/���6x`nX%
m����
��*���-�����<P�����U0}���<��y����.6�p���{�x�`�th9������$��`�k'L���g� /�@�.�����J�@%��������k�D��3��
<��S�A�i8�P��=�����*�k��8�p�����Z
�����7�(t�@N^��,��'��m�BHRp~��;���Gd�^=(8iTi�n!�x����r�x��I�:*AA�%i�*�����r�:,x�Hpv���n����A�!�q`�Tt�9����F�����c�x��G/��5A��3�c��<��4S~�+*���]{�9����y���&x KX������y�zg�^t/���FJ�d�'
���I��B-|wN����s�e�9z����r���P�6K��[�Rx����������f����G.HN�=��$v���W�@�<��0
{w���U��]N���tK�����<�|)��yZ��-��9�������@W�jZ4��\����(7� <"�N^����m�q�4+�bz��P�o�O7w=�P��kV�G�X�~'�45`d����$�x`d�OJ����������y .�b�������x�����a-T�)������+��}��s(���U�r2�Y�����������3�cb�^����5dd
6�Q�=P�������Ae3#��l	l��R0�����M��EW�cz���~=�����K���m�c���h^�M�Z ������}�|�x�n.���������"���FN��Z����T�D���B��|:0����J(�Y-5R�����'��1�u��#�[����P^Aq���n_����:�tr�x�<���v���X�S!#�� ;���NP�y�v�I}%���;�������������&�r��=s)��subf��j��1�]m�-;|Fz���
������wr�7��:L��t�uw}W���?���QFP3V���|��������*�e0�A7����IGGb����
����{1�co^��_l��v�qu���ppk�~]�x����
�BVF�W���&t����@�hP��+�5l~p��<:U��65���+;��
�Z��_�'�f���HL�C����F��^���m�b�6��9�~�\`����(o^Gn/�^��Y)����A=�����p��}g�M��{���p��DS6���|�>cz�v�{��������x��	V&FXq�<��{`b�V(kjB���1�v!9%�E�(�nR�+�������w�Eq=5��	���j_�=z0���
*�@ME�}���:�[KU�^�{���h�~Knb��F��k3m�����_s����x��"��u�#�;��x�5����sD���������,G�Xv��~<�a����]Q�Y���@�vc�\y�9��A�;u?��y`���90-N���n4�]���1�i�:�jv ��b�����������
}�����N_��g/��5]Q��9�����������Ooq��x'�sR<8�����x��L���tz�e���IN��/��o^�2��i�a��&'�qq��	��z��lt
����Q���N2��6�R����	�o�����m9���z�zz��:�'&7|��J}yt�*x�_��}��cTG���v�mS5
|���Z�)-d��k`q�n��r����O������������fm�����3��!$x1�ek��~�����@|���k4����KL�������
l��v"N�������=t����3�����I�UH
�A���0h�v�/1���w�uY�c��a��Z 5!��i�����xd����b��X�	�S�fC'�O/�����v�I������aR���G���������H����(+���,�(*CN�T����j��yYQ���<��_�;��wv��]�uO��u����I�B��������������C3��4K�������Q����U���
���������q��(l����eK�Uq���4�N{FrKyQ<(Y���
Y99\;���A����y����h3x1/6���>������
8�n4lk�C�:������4�&����_PR������|-�����W��<���g��jw���wx���^BM�_���wf#�?� *���No�L�����PPR����]?���@IY�6�O�<_>�@1�2�}r->�?G�nS�������>�
�h?l9��<^?:�/��A�qt�(t���Q���
^�=��R�i?||uo�.�q��46����]�H'��]J����x��93����L�}�f|���?��{��
�����1s}�OX�X^#����O��i�]Q�*���r�M�3|y�D�;�������}�r�/��k���|�?E��#p|�Xt�	Nt��z�B����L�����	e���d�9�>�.*��9�aq�X�<����P�TM-�1�z�Td1�������7>O_%ms�K"ZY���=HD	M��5��*A���69'"�����A�
��N���&S��`RIpK���*2x�OsGE�v��,��]<��6�LB��������Q��<�Q]��&CUA��2\� <>��&cD�4�qSv���]q����J����������-R>�!j�
hLJ[TL�A���w������J�����,��$�[B2�_�\	�
�	5E�uF�#o���m>6G-��1����RSk$F���b�FN�}I��6��Y�|d&6���:�8���������l����^���!����=�R�5I���M�\���N���C��AW�8�=���/h�~�-���
\i�����������9���o(��A��~������v��CT����WvN�u�H���6��}���g�p����t���;q�P(���9��2�4N
����5*o���(Q�m:����lA[�o��
���h0�`���t����m����x��Oc.�
��eYYWC����|�����As�2�j���������
���[�
A��c����8�h�����f����������y<��]�����3�4�}ps��i�M�����r�H�@��}W����r�r�*��F���HQ �
��T�nP��a4����HMJ���q��}���j�X�HZ�U*���cg!�t�F���6B�]�n�V�wi�f
 C?\H=N��1��8���S����P53h��� �J���<��TM����8>������SU���}v�+7�yZ_�|�"/�x(ji ����LZ4D����A��|"���a�(���{dv+-���^\��j`6�������{P{�Dyz����9��,�s}7R����O[|2f�"���|<V��I�*pl2�?��wb0���p�^�9.�r�����]���t������������ �������9���� IDAT����U.6�j�^����.�~]hl8���F��SP�Tu8�V����a�m�����h/:6g� ��+N����:t

�j?����?��� ��
4J[��������'��V������Q� O6*��6��t����3�q]��+�����0��k��%��/g.�^�J(A�g���O_�2G2������1DI�l����ax��M�J��/W�S<�P/���u�45��u����S8�;����0���.�=��i�5rm����^U����
�?��f�k�&Zz8�|������,=�K�����O�3;�i�Y��|jy>��G��0���q��t�O���.�S%X����5��D?�r����>�C=�0��4z�w�1���D�'`q�Z���+8��2����_���Ve,�>(U�"����>PS��"���kW����$Q<(������|�w����KW*3�'K��]���M
����/��Q=��r����4g�����[�A�����-��i�qWp�Vw
E<�
���i��������'VK��x�X����7��1�WR���4������1�n�S��J��=���O�x���~A�RR�����+2��Wx)xY��C)�����Ov����1�#=>X���#��<h]���:"Sm_u��Oc�����k�?������V�~�3����l>�b����(_������e������w3�(�?���5���Zu���Lu�9�7�{���n�������H
x����}�>�n��v=^��o)�U�G/��x�u<o�s.ucT1���O��X�����9F���>����q�]����l,����	�����""��yY������W8�z����~ ,t�`������uR�'�xp��n�f�C=ZW��5���8D��`�o~Rv������G��v����OM�RV^�>OES�P�2������E���3��x�.c
�������k[��rZ5���g0�o,]�3'�����{.�Y�!�+)0�������=4i�=x�"����,Y����6i>6-���"����1�Og��(c�����!.>���qE��))9�(�������T����6%��;���@���q��I�<S��}��!(j4FaF�Z{�*:��<��Ko=�E�����-N/��D�m�"t�Tp���i^�d]^�S"P����x������l�������������A����"_���!��>���_�D�~���.�m5�.w�R�AGW�d�$�z"��iv���'W�db	%�4x,��xp�F�h����,�h���)3����J�zH��E�� �jk����\93x0�Gc8���>����	#M�hc���%s��l/�{}�fI%��'�\�b�t5�/br�� ;�`r�N�y�	7�/0�����`,���w�E�������N�B����
�������_;+V������
%��4M��;m��e#<�p	;���S���e�:�����!hc��/���3��n�.�f`����{%�}y=�����`X}�/�u�E�������^)��LA�����-��w*^t�Y�Zj��9q���Ze��'gOB��W#����s&���U�H!��i�����X;������=;
�,Z
CZH�B`��-��������UC�`#-~y�ZnI����7>�I���`@�������nAX>������0��
Vs!�G,?����$\x����A8<�	�/�����]r�lM����uY��=Y�5J���X;�����:\��0���_�����-��5���<CO�A�R��"47w��x���,�y����[��# ��T��c���h��-hG����c6����Y�W�#�X��}S;�����+;��cH6>����m�`��qX6�,��oKZ�.iZ��mM}l��}�-��	<��*f �9&
��8�����a�g������6�C�����X���!e��N���0��1B��������5p������2���^�^��
-�4��[����2�0��U�����6�0�����N�_�AP���:|	~�S�����5�a��{L���b����X�En������
��G5��Xu����I
�8>vz���z���f-�=y�i��{?_,�������6�u��a;���U����;���h��=��O�(7e�5��/�)l�G�k )�����*9T�6����"0a3t�C��)Bom������NG��Q��O6�f�t��E������	�����������)��,�����+�i��/�G�8���u�8���/�FB�LM�k!��9����3��S��B�p����_�����l�|�6
z���7'����l��1M�`��0�2GxL��g�k�tF�Z�q�B*D����P�w��.�������O����<]0����<5Kw���p�L�g`'�<h�s:>pF��;h�R;~F[R���/�4��DK\��B��3p��2����������Z4�0P����x|e4�
Nc	[���n���7�������O�86��(K�i,a���w����o��9G�gqo�N`����Mmm���|�����
����~4B��9x�v�?�r`1~��,��n=����i����z���s;�������
5p��RT���"���U�Y\��`���=����m���]�l���c�s�N�Z�
65�����Z����������S*�n�����>��=����S}Sia�����c9Muk�u����el�����04��<�92�@���>��/n�}�.��:��*����b��S��f�v��?�(DJ�;���'^��_E<�������%���|�E�$�8<`�%Kd��i"�TS"( �'b~e�}|�7T2���)�V7V���X�P	���������O��0��"B�����dL���]��`$�{T����`�!�M/1��"�+�)�
����\�L���,�)�$);�@mx-$�%����J}u��EBcJCDL9��6�����nPQ���G�3���A�.'����b�?���Fr�%d	�L�O�-�����_@��-�W��R�rH�r�)LC*��duT�&g`9�=�>c��e1��cP�6�@���4'8<b��;�MJ��Q	�~q���`��������IR�`����q8�K!,��[�3���H��������I<�:L��cKP�nw�����7�9x���x�?���g�|a;�i��6���*�,�M�x_��fQ��3xH��3�������-m������.nF$�9lc���i�E`��}���<�{��5���!_�����T��hC���iu��a&`cK���w���?<�z�;����3�~~m#��8.R<��������q�����<�c��X��*�6�i�����[
�*-��������!�L�a���?�W����:I��&uQ�f��g=���/��g�w:�ZI3��y�"�M�p�Su��x2z��<��}�w��A����F�pn?����}P��n�n���B������P�6z��h�D��,�3���3�������.�>zP0��lE�~]�|�|�C�������t^-ZC�@48��6�����V��P14����x6yj�Z�;]���M3n�n��t�v=��>�3m���Kg�~�Q(Ik�l���{���{=G���-x<t2��,���7����j���o��������/h�m>�nN[��-e:LB�����C��-���5�7�5=�I�1�|r�00���9����C��x����v#0�	l�����N,m55��"7����]?���k�L{������|��@�~���6�o#T�:�@����������fJ�3�L��}N^��������h�@���W�^������_��hW�F����:�;�[ipnn�ISe7e�s�B�
Xw�+�T������3����A,�Y��/ND��3�������n��.Am��PS��C�}��8(�r�����	�7�&�1�#B��FK\z��|����,����6+�Q��)��>��vAf�@��t�T!�`�� ��8N=�����[�<8C0�
�mZ��+"�`���X�����D�rGh���.kR����������\hP�v������t���"��-���C�R(�K��I�`v��<�AH��=���Mi,����:�J�}6������[���K�h��{�--�b,	t���"�����
M�c���7�w���]���%��]3�ry^�5Mk�������B80x���z�����91L���`�47��s�2��Y�)�2��H�F�^��j&��"�a��4RF�`g�.x�m������,�=O��^O(v�w����m�]�
<06��������X�#������"�_��4���4��������qMO��P��s^� ��?����m	�4��+��bI
l���T@=tq��^S7��D[���GkP��������1��Ba7�"��l���i�.J.����+9,p�y7F���[.B_�6&8�|���#���_��^uk�7Y'�;��zX|m*��<�\�3�)��Ms��[��
<���F�2e���4����S��$�S�w�S/3�'�����P��p���iu��� ���#g�dj
��r5�x���
����E�:���	�vFI�t�ET�,Z�)(d�p���$*4��Ze��&��h�������3�N��������=���c�i�9���e`��d�I��H�mO������YZ,�������0�r&�����'�T��}��*�q�@KE	G^���:����{�#��-V����)�x�:���S<�u��w�i��u=u(���s����tvf��-��<��a���+�u�!��������O�z�������bbRq�n<h~J�8J����"df�@F]*�k�iN����o��2�����y��dc����V��`���v*��x�c��
�9���0�O� �->7�����]:]<�i[w���i�)�W��`+����<��=����-q��+���#'���4�L������x��������dX�V��q;\~�%�KW�Mm+�}��mk�����P�&u������U�������^�j
6����w(�����"�����)+���hI�H�kW���/q�����	���8=�|���Z[�,{������;	�������'�@���z(O��
4W�H ���\�*xP�\�|R�!����kL�i�>a�_
0t�R�H{~��0��f�L��C-����W���)
������D��zv�(G'�6�{�k}3_�x@�7z���Z_G^�!(&���c�M8WEe�u���k��,��MY�Ztz�W��P���}G��*m��9�
���S��d�]�|�����b�����lhP\��Ww�g��x���C����S%����@s�I�3i/f��5��#,�p`����5:�'n�	<�@�1�<��8���Cj��{�VfV�,����ocy5R}�/��
��7�0��:�D� �>�I�+B8��F�@(>F�Q8����[=T��Qz�<�ispq����w������xPJS&D���%�����T��N���jC:+�������
acj���o���7������sT.i�
�������e������n�	���k����[71�Ys���Y�H�V+��/�M��r���k8��r��<����!E�Y�m0q����,�������
<���N����t-�Ft�S�-b����"_^���M�Z3T��
j��"_�����y%���A�6�����q����mT	<P6*�xRBP6��������Q��D#�d:d�#����K8� n�.�Bq]k:��AQ�q���w��>ad���zs<��i�
r��Te?���?c���7PND)�J��������������XU�x�FcI�.�@�``��%�z��������������lC���
0�@���+������=EX��iCj�����l��DG�:�:��F�u����Z��u�;��y�����&APG��B�I��mN�����^�0����C���7�G��9�����yE��zL�����tZ�������qy�"��S���"`�"�@MC%����`�������8R�b�(
4�Z5���x���WQb����Vv�aJ�=8�5����z��T���8xt��J���pP����b����A�	���w���1e������-#<��kq%
��2�]���4R�����9:x�B����%�Ch*:Z����&(���2^�'SH�o�U���k`
�<KE��
<����i5��T^
)�\V��$��2)Q��k+c!���]��)���P��5	�
O$����x�D��dEJ���4������<J�t������Nu��)��+�I�A���$S��<`Jj��CFI1���Y}dmD�����yH����!e$<��d5�	8p���jHr�E*�*=�8��'��;(�sPA��'6�b
Z`'��o���E9�*��=>�c�������<�A
g���o*�o����~�i73���S	I�3��h�j$������Os�/>o0������/�I�I��[��4wJMM���������	��TER��S��.7��U���w{�}|���2TT5�qU?R7��1��#&&m�a��c���L���)��
��+zs����ba{�\���`@��	�m������y�8<��D�f�9X���� 
Ez0���D���#A��!t*��:0����)k�[z���l%��+�7��F����8��1��1K}3~�Q�_��������-s�F���A�G
��]�lBk�")z���)�B%�[�9�8}���H���	d�{o@a{�f����tz|$�(�X
G�h�5w������m�P6�pH���	sP�V���H���4���0��D�)���������l��+7�4������~�UZ��X�2��M@��+p�[Z�
��!��~�0��v_/\�':�&�E����������:��m8x�N�35�rt�N�je���L���3�b�=�^>\�!�T����T��k��cH�H�/TK��v�)��[�0K��e�W�
����=���;v��;�'���?��3"n����C/��������)=ly|s����dn��X2��n�d�_Xf�or��������,����w=o�R�sx��yJ}�A'���x?m�g}�����&����0 �����5f'��tDt��<X�e`����9d#n�
<`���v��P���G@h&�6��5�b��
<��"O\����	jT����S��(��k�����c�E�[X|E������h�������i/{q^!~��m�L��pf��&�0o:��t�s}"<]�0y��&N�<�����l;�p3���2��#�l��4��-��[-2�L�@j���(dgi=�������v�|Rw�Mqq�$���&5��}�!
��}T(�����T
�	�&�6�t�J�4I�lS�:y9m%#xp��m�F`�1��ct-W��N�����\x�!�tV��r<� ��h.������4��S�"x�:��6�3����j��AF�ohf�
�C�w'�����4�<P"8eu�6y�T����;a���\�ay�V���-���f[lV�A���aaYW.���I�n��-�w}Z�;����B��I���f�������*�(������[�<���dLm��|�6Vu��r���Ip����	0�����N�D����U�>����*�&���������,�h������5���\��lp��~0�s����rpp���������2�����
8��~1�~�����xp��	���iB�j$5����<�:� IDATM6��Sp�����M���)����������&��2)��[��\5!c�<�Ao
G~��b��l1����vP��i;����L��i�yL��q�\!�N/����
K������< )x��^��=?��9�0������?��)�������Z���u=f�%���)�oY{�\��x0L^�)�W��k�_lx�����T�U����4SDsE���}�>3xKj��#T�N��F���	_=A��&!��I�B��a��x��NIY���':%�E�����i��<P�VI�=!_�8��@����6rf��S;�tv��u	�(_.���������g����0��.���C
8��B�Re����t��g���MH��O�0�^3�����%
����x�@���x�E��f�Z�P L�J��A7
����0�D���p��>D�e�x�J�I<m�����e�	+��&{�dc�Nu5�i3]�|=R�$e��p��}�7������&�L �eZP;B�i�������r���Ss&����S����.�Gl��������S�T���I��~h���x����x���5v_q��nv�7CP��a:x�bx
�!����xtkP
�$)�`�+O��sR<((���H	BD'���&X@�D��%)����U�Q�\
������Da�}e�0O����uU�����#������#�N��P[���M���Y`)����4�A���8t�0+6���y�0e^����
	������t������������c�o���<��{�r6��
x`��K�WH��)��# .�R��d�31��fT<���������S�.W<�lQ���tjC��%!��}��N!(����c}�'�5�I���R"�q���O������B1��G0�)�Z` A<��|��<p0W(���PsNC��6R���S8�;��������F��������y���^q�*;����
|��P)��p
� ����(�K���a���|f��������D������A�]�r�x����HE�*�
���YP/_?�y%N�!xC!��#�<����$�SH�oT�A����%W<�>�z%(|D?�(�/���U���x��S�U���>���x���#<6��]p�I�OV�Z���+Cx�N� ��i�@��nQ�&� �0���/i,yy�j�N���e�Zf����@��b ��(B}���n�*g�MC�*�)|�;]3�����G��D��-�ta,/�m$SD ��w��U�$����.�8��8&���B ��N�o���B+Xp��R��x0��J����~D�W������oE��I�H^���T2��G������*�'�`V�2A�1p�Y3���y]XY-�����C�������
����������B`��2C��;�rD�^3�����g��7L���Th�p������P�H���^W
/q_I�z��3�2�
J���`����R��x�s~T$�]���PP�'�R5���PA�P �H���Z`������.{%�c:�'�����l1���a���mB��7I���W8 H8��0R9�L�rR*�![�>���@y����r�<XPG��$p �w>�,jYy� hbH%�75D��x�T����	�Mw�9<����B!����������Y`�g��TB�	
1J�T�UE��gP�h���7�X�R�C����������{	���_T����	<X�v����Z��K���aU���(����m�lW�P\���
�9�L
H�$I��F�����m��m&�I	���Z"�`����)�v�^\��I��`�RV�S����EP�v�v��	4�:=<�7�oRY�f��P�h��%X����8wr9WP�
Wu��D0�<���N��[2a���\]!c�t!9n�V���������~*�r�)������J;�ZAM\�����7�@�F�. �1�+3*����]���(g�jJp�H�Bi�1aW5%�����N�O�s����Z�V�$�	R��k�?���N��6f`�6dY(��I�[�!5��{����<�bM�`�������n�������T�w�)�*�j.���r�
��Bx�V��M�
( ^���E��p��7��������M5���|:z�$����Yb'�ow�O����/I�^��-�^��������)(G�����N�x�6}P<����LR����N�����7�����T�ZBTI�����
<([�=�����Ee����������_\o��TeQ����w�����$�����*4��7vK�x�BjJ4W5"�/ba^�qR2���#2� �`"�or��X�����[
�Q��v>�+�����d
������/���n�D�^��=��<��{�V������;��D��(b�=�c������Q����Qc����
("J�!M���f�A@��p��<y��;sf������;������vi+q���R��3�����a����\=���M_�r��*ux��l�����hJNT�}F*���z���5�Ds��K������jXs��;�-�
��A;q�M]���
S\��<�0s���$$E�.)���$���w���R<8Hl�Y�g)tn��*�}���<2������Z9�P
��z���Y�(8`��"�~����B����XL�-�
PUE���Xh��p��%
�+d�Y`m��I��),�2�a/
cK�SHu���!�X����|H�,[�����)����a=�E�c^���s�u����<�Q��o�y���v���O�����'�)"�E-���s+� U��j���)};s�v�P?>b�������)4k9G���]���c���x�=���BR���e�g��#�c��0��MS<(K����K��B!h(iqEd�mkw�p
�R���\� ���Z��DJ(�Qx�[���_`!�=?��
�6�������7�9^����U_�����q3R:��B8���[�>S<���AM����+]�{�����7��7�{z����[:�b�*�����DW�Hv��+hb��b`�0c�H��gG����5bH���?��D����E���C[���0X�v�TH��X��~?���'�������
�=^ ���~=:���g���A�6ME�oi�Q�4!2p���"�B1����4�=�C���(�[~o��2�v���t��g=��N��$e����$���bt{NDh=�<U�"jQ�j�r0����g�H���O�Rx��:wE�j)���2��W���u��Ri�G���|����T�[���|��4� �XU����A��@�]��H���R�)<��O��+�U��`s�}U���PrV5�����G��G�5	��V���0l��@aO�]���O�A~�����wj�'��;Cq�5Ts���c����Fv�����P�(O���G�A���KA�.����<`#�]�H	�$���`�A�~����|a�-,l0�Y[�����D;������*X�{0�-��������m����z�D}#���o>�S��Xt�k�y�
H�;AZx��"���4A����O�������fB� ���0�[����sy�L�`H{��M�����g@A
�H��s����p`[�%_\:~gL��P�$
��`T���pf������b�>�����e�Q��Q��F�2-L&�}x:M��
��A��N�@��,��;���q��]9����
��P��������� l�2��,����6����qP+�5���ML��?����z�(����������t��n��f��F���6&���6�����h�P�sC"��Hd��J_[7�����_N������s^�4�VQ����s/�b����^��Y,H�@_M?5�����!���*.<`u��qZ������>������gI��
�KV��BqE���vO���I�N�� ����
��.5v;�!�<<`jI��M*�����4�����r�<h����P����hEa:�p ��c���K��pr�D��e�e�<�]�����P����SE�?cv��I:8�v�����#��=V^Q��>�g�&�6�f����9��%
�p/��m�����D�����F�	�"���VX�v�4��N��� S
���3d���L]��O�VJ����B'���{wC�B��v76G8M6�W<��:2p��l����u�z��3R8�u�]0����$=�K
:
S<����y=i�������}+<`v���ET
��J��=�?�����xL�`���Z�RQ�L���]��/����C.���	�{���kW1�wl&E����������e���������(�����x ���C0���_�y��J��������U���v)	;���0t��C^��U!������LZh}�O�v���SjA��m��U��F�B2��x��l��l� ��d�������Q����|�0�q��xy��Ha!�g��������u��1<����(L����0���P_����K��vDx`�cIa4F���{��P������P;x��ck*W�sR7��s��LmY	)1���o��������z&�q��R$��U=*����}+8u����G��d�J��<4k[&���r	���>;x`E��tc���M���@�)f9S
``[�W������fA�v�3��B�������c������lQ��s`��4u
����]J;L���<�w��34�Ro`jn����i�l'yl�+�u�����v�3���yo�5������p
����H����>O:[���f]�!e��x�@�{�CC��z���B����s�'�� �����)l�3�����S���1}�,:k����h����
T-�la1���(�i��/x����B]���d�2�>_�6`������|�\�����j�����~F{��:w��&]���������o���!3w����<�E��^=�_����/G����������e`�{*�V��\E�T�r��f��D&e�8�����_e-�0���8P�T���3�{DQ��~�@��8A�P���C�)�X;9�R��R6ha$�������0����c'�}/R���(
��Ai�2I�F��aL*	���8�F��[)2���
�0��B�n)<�od�AvoN����w�9�����B�^�~����|�b�7���=.�(�2r����W���JJ!�
��P�T���4��2�>v�U�Nj��3���P�"�O8��h'(
K��9b������R�E��H�����l���c[0�M����CKR�iH�B,>�,���;���eI����	,�9
�o��g��;�!.x�Tj����R�v�Bg����n\�.������nS�-�BH���a`[\g�/l����*n]��C#T�3�
,��3�7�ax�������pz]�bS��k��t�9
	t�yE����rU~���Iz�@!�Lh������K���d��Y�O���o��
;)�VJj"�q"�?:�bU0aU�Z�I9��JS@�:� ��B0�7�#
�����C����S���o@a���\w������~^p��vvR�!�7
�*|���g�������:��b:�"e����h�q���j�x>��w�������)�@�@&A�n8�5�&e�c���_J@0��Zp��Y����R(��$;O!zh7�Q�N0�����������Z��������8��@�7���.X	����(�4�W�N�g@��eJU[6���	`dUT ���P
��T0�B$��/V���PwX9��)��e�i�aL
�����Q��9tl���8$�[�@�b�;P�i�!5&�s���L��)G0��RC2���EnV�7�,���7�����Gx�{/,�fG_�X6�]K��U
��m#��79�A[��v��Z��nWiA�f=����������a����;���m�}�&<P�q����t�K�#��x���&C��8�~��	�������>�+���?ww�����%-6���+��`��x��^6���v��c�8���~��P��S������"E�~����D�N��=I���
����diz�����;��BkD�Z��#gr�/����Vs�0�����!��A���x���)�����c~)��R<0����������E,.;�.��+�k_��%��y=u�������Uyl�x���B)�K�'e�w3=<�����8�eW�;�0l������'�hs��L>�%/<���������v�rp����]s��]�?��^�K��"��m�@RG�H�Egk',8������Y�)Y����'���H��l�����	��xwsL��sK^u��bh~g��'����C�,q��W.��;]/�o
�S�������w�=�
��i#A��i��P���Y����K�%����{<������(X������y9'}^sE�Q�Q��6�sZ��N�z����YM�������bA��dS���������45�F!�B���(S`���_a�)"44��*��Tx���lL���e�	j��2����T����d�P���Q��0�A����Jo��<�o�S-#�N���t� ����hOk/i��;A"iD�Jh1��~'�A�#7x����mf5y_^y����)�v3���������>v��JLD��<~J�>����5_[��������� ���#p��)8:������� ����+\�{��).��f(����������[q��_p x-1!
�_=!'�<�*���K�W���������h����|nMSI���_]�<x�������*,�8�[SG�A�z#�6��mBj
uy}�iC�e�S|N��u
qa�-V�D���6������\�=5
�\�:�I����j�(]��)(��~2��V��l���'�l��x�H��9����,��� k���X��4��-�2�6����-;��X���,L����z�B�nu���B0����Or�2�0����Z���;��~�](n�=�)es�\G ���*4w���u)����*�/bM3r4p��y@\��4��j�$v���'�%�v��Tt������xP2��0�@�r�+��'���AIld�)<(�M��0���vE�_x J�����P��������� ��K�� ��K�+�2�$UFE�SxP��]xP��Y��d�
%�QxP[e��$�AY���lf/���|yZcE���L�{d���jA���Moj������"�Ii��#;���}0����8�!k^�KE�_���XFa�AE�kau*
<��!.x�%��%��j�4�)��q2�,����Gp���C-�$qy����5��;�BI����P�~u�����q���������??xP�����]Q��������?a����a�>�P�B
Ji�L���I�9�
��-����+n~q�q�W�������7��w���xP���H�_||<tuu��2����@<(�s	�A�>5���)��	���>c9���/TS�^��F�<+�\xP�O�@�}N�%������v#��3�4��~	��JP]�%?x����A�l�Q�(�]q�	����q{����`b���B;���L%����JbPJ����H<�1�7�4!u���t�r��.��8� ���RP�V<(���@�x'	)��xP�.��
�j����_U�	�<��<�%������xPZ�}~<(��xP|����}$j
<�S����}�r�����T�\xP��D�Q���|��xP�~��� IDAT�������e�[U<��Z���
��H�?�E{QP<�D/��l�����E���w�@�(�<(��!(�]�;
w���E+M� z;�D�Uy���������x �%�9/�T�6jT�< �xP�Z�����T�6�Fx ��������H�	6�z@���x ��!x�Pp���.����Is��-���U8�5�MF3���R���y<������+��5{�A���4�y�xPv��x7�/ET�+!83Y����J�bZRqh��D6�<q�3�����iii�?;�*+�YX�X6
K�I�
�_�H�Vn#�m5�O�aD%��|]V�����kI!!�[���m0{�YA�7,%U�<%����4;���������*�Rj��L/M{X�����/�L1
�����9~�T{���sk���H}V\zz:�NFF�KU�L��=V(�" *�L���Q���} ��9�*_RvD�������#\��b�+��a��H_��)��e�e]�l�_j<�%��kh������S������8��LK�;W�]D�2Dy�e����<�gb��dbsEh�jR���d�$iK���d���U��_vl`y�IW�D���(�� ��:���,Y�Br���@d�o��e����x��I���	��ypC��Js}H��2�{<�!���S$d9�����M��+�#S*;"�I|����NM��}	�;#��PN��^���q
�X,�W�����b�"�*)q�'�����Q�=R�f������l���Za|Xx�<��{��b7_K#c��m!v>����PUU���b���&��~
�������T�[�=��';���+��I)�%�Z���,�Q�bI�����f�l�	����C�����2\��=bbbxwRWW�������*���y��\��=*�x��+�=*��J�T��(��LIyB�H����#��d�()+���'�%�$cGJ����RY��2�Y�
�!��]z;�e<R��u<(}_,|C���o��� &2��/���0P�C����h��U���,�B{��?K:�0�,i���^eha�^�> ����=*�x��<��{"SR�Heia|(�!;��=*�xD$��%e���G��\I�����C<�L_����2>,��z����K'$�N������o`_���='��VWW7GN��a��L��"III�����H�*Q]�m�R��*K{DFFBYY


e���5_V������=�������R�J�6��.��p��E��_��I���!�{Ae�>��=$�*�x��BhI����)��H�k&���p}T���#�������JJJn�@���#�z�������Y�R�}�I�=A����N����OWY�#�S�^e�]�K(�������0>d�WV�!~�(]����e<�Z�<�CP<(��$���< (���l��A�T������*C{�l��S��=*�*�=*��!�h�C��,�C���p}T������RKgOh���O�����$�Yz[��=*�����������PY�#��PR=B2v*�x�y��\��=*�|�W��x �{�`����CW��0P-������ ��'*��Q�C�J�g��Vei��2q&�G���$-���f�mU���,�a�^��,I��P��,�-�=J�CIY�����d�T������B{H�_K��0>��%g���Ge��V�Cr}���*�|�Cy^xP��(���< ������A,Ld�_�]��|K������!T%��Ko���Ge�8���}Z���eIz���*C{T���0^/}��a|(Io��������,�CIyR2v*K{T��kQ�=$��%aEJ����QY��2�GX�
�!��]ZK�e����<�<(mO�S`�����?Z\f��*�����D��&�x�H��,Qjj*���xzS���h<@��%aey3V����p��0Y����VCu�����+������!S����s�-�����L�������![e!��$��}���R��[h�,�����K�ov{�6�Z�Z�
���J�<Z�G���5I�,�Veh���L���~�������T�u'����e/@�����cJY^i0,��/��4���*)BA��qu-D�|!w�I�{|XQj��n�][��S��Q���@�����J���C+]�+I��*�x�9�K�+s|���Lx/�6)�=��� )e���++C%���$�P�d�M�R�A�rU�O5��/��j�g��m�Ke�U2�� ��+i{�u����oD*�2�GDr@H�I��j��5)���VW�L
����xD=6a�_��aI�
dE�)����ON	:e����\���9��T)�L5��R��&54A�r���o�*����^W��K�@�x$��6^���8TT��C�;	X��$��e��n,^�L]����E�[#=<��f��/�x$C..*G��W^	Dm��������Yl���Gq���##&��de�����5I��^b����9���(V<�]Bb���4��F�����r��M~�H��^E�����OT��?�w�R����I������g^W�
P������b�'�����H9'N�vB�$�d-��s��'��8q�|����2���E�
+����R&�d����7��������`�s,2������5jJH�4��u�V*gka� �����5����9R�6(�*���W�O�������-��_��W��.5����/7�.�h���5��S�F6����l#�����oPj�q=�4,�;K�����5��W1u�H�L�
R��7�[1j�m�"CJ+l{���W���Lm�������������>8A:���SXCK)�!=���+;��`�	���R��0�����#P���v�
���!&�Cb�����zx��B"E��X�m��y�W�T����%���hD��	�ob*L���qCuS��OI+bVs:�C����|���@����1���?g��oD�L�����+�� V�x �������xP~��.Y��
�����_��e<�<-.���-�����d�,����(V�@/}�4x Y�A��)�%���S4��h~5�x jo)�tx��{<��}P���K[�|��o<�����k�jU�����������7��;+��4)�>u	
��Q�����06.�v���<���1u�P���BLl��=&�4��y���|�cg�p�������=XB��y���d(*(`������������[�A���H<���
%%����%�x�f+�lt��.K����-����8��������3��l9V��?��~0����+��_x`��B��Z����!��!������#x0�_���;�R5#w����JlO�%	�bP���~�-U
l�vP"U-k��E�`����6~*���S�:hicv�����d�l�M��Q,<����>G�����gb��K%�4x���)�(�Gs�z8�}>��)��6#�,*����fV8�AxB������c���%�'j��	<��HB��PH���<>�5sot�Gx��e�2�~���!kS��|&�m�!��^������y��a�9l��>Y\5>�}���%��m(w��:j��d������D�JK(�����}�������UY(8�U���1h=Z7�����!��T���dv�}+���~���k1q��k�dB*J<���!=�����Lc e��.~8�b;3%(K���F���{������&����J9i���^^>��W����
�w���0��w���y�[����WO��A����J��??����+�����6>�0�"�B�q!�.LU���FmD�A�I���}$J��P<P�4��CO���)��{�Ie���D�~��0_Q�Wd��<x�0Z&2������L9�6�.�!_<�57���>R���<�����Y�TF�A��P�51s�����u��F}�����h�}�Cdp^�UmC�9���E���%v�������������s����W�*���UK�W
�\V��tUe(u4F���)�����xPH����	��S��y#<py�=�O��%� O������_&�,�l~S�v�?��m�q������#i���l�����;�TU>�����`��Q��x���n��qC�� �����;06��u3�_(����<(�����k<�<x���e���-���c/i+�%x��w[,<u3;7/w���zU�U��OK��j���cS�<|�D�%��k���a3y1<V��<��g"<!��d��U�a9z�,�L8!I��:�W��j�����.8����c��)w�`�����o'R�K�{�F�RQ��[����}��4x���X,�����;x`S����a�����~M�A�� H��s)��2�2�r�
�E�m-�@^V�7�o�o��AI�e_���o].�!x���@�C_K�tw��]W��Z���4
m�eT������I�����1���s��{I�Z��������l�{�B��F��]�����j������fP���6~w�.�fw��{iA��+����?{���3�h�(Z��������`x��������[-s%���o$��q���|��:���"u@}
�ARt������B�g��V������u5�d�:�/�6DQ�Elf�x��[W�,?/�sY)��w���|�(�5
{�)<�l>a�\����.���<p~wq)�hW�G�u��������W`��T�J��)���
<P�U��>"#:�#,��c������jrH<�������-R������EE����?�{l�s�F��ZEu�k�E�YSF��W%dff��c=�h�����
u5T��ArJ*W<�����w���#q��1�� 11�Z:���.YUtj���ux��y��������
r4!jci�-��BII)��=�T�?������-���,m��b�vRIY��"d�v<Px����M����m5������c��v������G>�t-���B_[�H�%�i�7�a9i�cc{�2��I��m���(���W��}��UT�A��I�C�=.�����f����~G�,�|� �e���))��Jj�������������_|N=�D���B��O�b�[�4V�a?]D8����0�N�h�Md��TF%f`��T�����T��>��&DO@BJ��U����DR��,������B-<
�>�gd`t�&�����O�hb�^vvXs�:7e���a�!*!�>�������+���C_CW��!E~5���Z����D:�Ec3#����W���18��� n�����
� ��n�������e��`�w-��(uEJ���=���&��������)��s�����G���.`�#����A]���=���vN�Iq��#���N�������,�����Nx�1
u�u1���<���q��'2��U:�Y`�����kH!��y�[q��}L/����Z8���]qF�z�hX�+/��WH8�n���D��hb�����5�p�������y����Z�\��
}/�K��8��d�2��|�>��3 km
�Z�H�w
�:P�>���}�"ap������MzE������+��b�t(�"��a$����I\S��^��S[�*� ��i�*�B�v������S�Q�iG��Ee<��7����f��~�[���L��y�@4X�^����X�R�2x}j�P�z$�����\�����5),����WP�e��S��|�������0h�
�-�"92R2�x�f6T�j�bM��C5��y^gm[G��~�����U���t�:�zD�?��/!%:*�5���x$G�6q������*�:X5bd��3.�q��3�L]�������,2���
~������7�[���~E�F���i7�&�!)5S�����)f��5E�wy/�y��PT�v�Y:p8t���y���j�����t�+��]}~}->zo>�G;[{��)g��9o_���>) ��k��}������)��CC#L����z��-x����O��A�1f�:����
(-����>8�4CO����v
���
��l���u�~��11�;mUUL����aA7��}to�_������g���Y�G���Z�CKk��G���C���/�����~��/�BQ��X�'f���Y~�(^��Y��,
<�_�#��AFJ�]��X��Y��s�'��u��z=�����M�	t��������`V�aP�S$<x��^\A��j�J���;���
���:�F����]gc���X�~*�<�����/�A_\���,k�B��������WCUN	Z�ATrjkc��\�`R��8�"�X��'x�n(�*Xx{+��S0����{s|$�<:���������*�sQ�A���H��Avh���/!�c$T�:B�`tQ�������,iFl
RN���Tdlt!SKI{�CZW	
=�IM�~�C��2�[����}���L� ���/
2�������	H������kbYm�>	C��Gj#@�S
d�q`����E�w�H!�H�B���<%Eed��C��9��r��)Y�C�j\� �;�i����
<�(���6hZ'K�p������#=��p��*���5�
��O>�k�v�����rt������I���ja�y<~��:7@m}m�e`��k|�1�_�s�?4/�q`a�?����N��������f�w����=��Y
�9������1Xz�>���J���x
����:�}h���t�_��;������oHc��[�ibz�F�9p�I�sA��hf������IT���Q�W�����^����3�����!�q"�Ev������6�z�N�TY?���'��l�.$�����`���&<�({&�O-�1F*,�M�kz�G�[~q��Cw5(�H#1&O����-����8�Q��O/�!>2��U�(	4i�f�"���VE������TX�V���,�+zH�Uea�*k��+�DD��q�f�Au����
0�U��Hwz�f�E=
R<�VV���]�x���Ny>�nzF�����;�)^t�*
������W���`�n���u�W_�Q��\A���0��"��BTL��L�@�v��s;EyU���C��~��r��N�:��{<�8�Y���M�3T#X�����E�n�^cP��I���vx:�W��0����0�s{~�u�,L��`h�f4��J�g=���C���%z~�`r�NXp��;:���%%!����o�G��f���4��v�&n<{������+�}`���"/$��x�k�����X����H���f��"6�\��
����b����?�s�_����)0n�&�{��S�S���v�k�v�>��;�!n7(Mo6jOeH�}����1�+����W�r��	B��%Q�8wlZ/;L�
��0���?�x�
&-�,������K���~C��i����i���������z|�~�A?C����t�}�q.�����e|Lx���<��]��wp^9
�����"d����qHS�Z]#����6�������D��{h0q	����1���;G J��NSx0��	M��6��:~S���whM{��`��o���Wus�-_h)+���\}Q�0� ��C������B���H���b�zP��,�����G����z�Z��Y��:#"1��|��QQXr�~m�*�>�mn.���v0���*�����X����ih��:V������b�������3Q5�����zn��1��WC@YV����i=o�C���8�����=����X������x��4���F��t�i4�n�A����;KPP���
��Y����������?�P��<=��>����@J����
@u�����5k���Yl���#P&�[)X��9��'�����2Xt�EM}��D��E�,N�@��>L������k����#��[x�^�:�e)W�����[[�gRJ�$������_�+��] #-/N�G-��@�}T����Fbd|/�,���'(<H�����Tz>e��R&�E��g�����gv�s6T��" IDAT����>����V�F�rx����4�|��J������d(iJs��n�������vr���"��CLp:tj� 9��#<���I�TU�
E9G���=!��5Fb@�LU(��F���#��c0�)KK������!E
�J}�#��mZ\��b�fH}������55D�mW��2��B!�������9kH))p�K�"- 2�zH8ti����e�sQ������K�r4��q2U����A�y��B��K�����`z��N���F�����!��sd�$A�M�>B�i�6,��;�c�y�������&�u�u]��xx|�h����U4�
���&������Q�>�A�����{<��N}���������"�����{���7���,
<x���>�x�ni����������w5���g���R4���B�S����R�|e�6�g-E]�����1��
,�;���������
b��xY��N�����"����������Nz�|�juS�Y��S4<��T��d;@V
�w������N����x@mB��)-��d�����X�
T��B����>�~����xL��}4��S_3�|��w��-��6�����a	9v���?CA��.]�+����3��8|�a��D�v�LA`��1X�u?�����K7��k;�:x
c�����a����9���?�_�/&��!�x�B29u#��:���?~���y���J�h�8}!6���'�
:�n���C���u ����NDp�{���L��gYR�����L�0<�� J��#��u���y� � �A��������"	M���R����&r�mG$���W�ix��Vu?/��<HzA7��P��I����j��l�����-Q�fC<��&6������-<(�~L�z�j���KE8
T4�c�f]>�����<�x��T�(�������(�( ),��P4�����/����EX���!�4�)x���>-F���K����:.<�\��(�`�������������'��PZ��!Nyx���:XZ����1.R��j��h`l�<����&�?t����%���;G��/�r`J$s(�@�U���:��v�Rz���3>�&`|G�����["�^H��q���3_<~�=c�b�������{��c`���OI�����F��:���t}
�p�����Nza�@������ob~����~���=|1��=X�;(�`*�yc	�q��+`�3:7���9L�_��&�v�$��%�Y���	~a����������l	BI��'��w�wN����EO?�Q}w�����N���1,��������!����Y��0� ��-2^��v}��xCRwz������D.�8��i�A<�sT��@����3!��!��#��\�C��|��Sh�~�,����H��S�8����h��(�O���?���c0l����MX���i��S�C����pZy���������v�R�<�����z����usa;u	\�����y`�����`�`4�:��J�(M������8x ����'vp{��oG��?����xh����@m���K�������x`�m0�5AW������X������v-��NC,=��k�}��a�0h�D�|����{ps�M�2Jc\�:z;u��S�8xP]W��������PU�
-��E������m�O��
h�B��q�1p�_���#�=v���~���x�����C�UK`mD������?��G����|�z��-�����[�}��w�VE���1�s7�8}���1�kO��}������?���L����"�����l`R�������9���O���w��k�2���<���9�">�����=v��+X>x�^������+��Le��������_1q�Z �����7���x�n�8�:}�����g������~�2B>=�D�8)aQ�[�g��~���IF=emZ���v��\�r�u;����?�~o�G�|����<���$o���F�BTZh:�{](;<�������	������t�B|���_>���Ga��y|L��a����94)9��J��4����
�Sq���v�N���!!�h�v��M�����
������ysz&d=������u�n2��n��i�<��8�����|[xN��Z�N�N!�d�4w�6��A����MUx��M�^�@��	���{�A�Pb��G!D
�@�^)�_C��dFR���Pz�7�(�|���hQ�@"H��-��;#0�@qt]d��#�}s}��]���}�y~�M��:TC�v(�A�6�w�-�}#ib0�+,���B� ��[���b���v ���&E��e<�3�;�����H��m������B�wJ^{�/���k���������ia1	<��4�4T0�kC����8�!���������p47@<-��u��������G�3�\�)4�G\  ��3��4�2��}]��c���80�'~Xs����y�b?�?`�	�V�� �����:�J�}����nx`t;{l��<�2��;��?u�s���V<`�Z
!��W%!95��z�G���T��:t=y_�����������;�@E��toyvn	��}��0?����^�Exr|�HE�)J��@M��	#E�{��V��pk{$���|s[$4�e�N0���Ip�Ca�e�I`��MzV"@���
\N��F}%�tMD�������*��F ^l�\a�I���@��q�zd��j����&��t��x� ����	����������s�4��A2�w��[��z�J
eD�&#"0�83(<P&y�	�������`�n����l�R���v��1��b�@�[���9�����q� �$Z$�5�0Vm
5=to7���BS�n?:�a�����-�����������w
g��.U�4���-x�{�
��jJc�d�|��Y}�c������A#p�����:Z�x�*���H}T��S�}��c����a����9��=�!V��� ��,*x`;t&"|���J:4~$8�������H��4����u
��~���U`ap���Z��r
8LXB!vAQ�g�eG�>��n������0�
�z�P��:x�e!L���P��+��j�~�^8����9����u
���f��u�l�!P".�
�����]�i��`������}�Z�V�O�zm�e��x�z�[���L]T��8����������Y�!p#�"�(�U���
h@�����H"8������f�m��y�`��+�O�9�����v���G��K�����)��y���k,����]�w�XLh�_���4WL��i�L��0� j��
�������PG�mZp���\1a���-<���1�������YI}+�6�j�
���5beCc�\���D���D`���:���VW��<
Z�Q�'��=�J{����8���d�N�	[��a�x
I��a�0�fw�%}���	^����� "%z��Do�8��"fX
��(
<��t:~��������X�&������+� �`����z|j��P_
��^��
�;
���L�H������Hqu-�����i7h5oG���y��LG���t_*~�PxP��$�����~�!1*�`���t�d�3!=9��\1#P1���P��M�������H`���;Q���{x��
���ooC�Q;��-o��bA	
B|�N��e+9`d#�X�8���kAU �B��RQ��,�v&�a��c3�{%��u6�)��R
�R�
���_���U�ex���)9�ART&�r�7��A��xs���2��84��(h+����h�.�4�P4��������P���i�5�!�����X ��-�� ��U���_6x�2�/b�m�vAq���P!���}g	jN���)���/��5�L���e�I���2�Z��C��&��������x���8�Yv�n��E���N�:*H������jBFW��<D�Rq��9m�L�����s��e^>>�V�p��,����7|������\�6���_���y���(t����7�������9��k����������`��P�^x\?�aQ��f�e��I�=hR����X�Y`a,�~{���h��d� �2�F������8l�@����?�<��_����i��.��0��\��RUX�������Volw_�5����~��e=�3�Z�RB�@��*�l	��	
M)��^���	ILC�� ���K#SM���!���F���v�q����.��������!4;Q?t#�F�!g���x c��cG��/aA�A�z�hbe�������N�w�����z������9���&�K�,�j�Y��}�4��jLP�i���<��A3�z���9���e���056�����c��?�((����O�!"
�uh�G��!�^nZ6���X��_)�B�c���h��5M�vl��}��c+�A8���B-0���G2�,��N�+���m,;��Q���A&�FH�y��cP�EK����1�<`�M����n
��;��h�ODm��K�5����v�U����q�������U%����d�"��������#��O�� � �������c������J�;
R<`;����5���n������Qx��;;��{�7	,� p$&1��������� ����K��k�v|'nn���<����}�
��"Q��0���FD��.hk]���s��3l�w�����v:���y����Ls�7��yx�LP��]H@[E�+&��)�E��/��T����i��<&�9���n�iXwD'&qb]�$�����Ln���~o1�M#��}��0��![�����j��#Od�Lhjf��z<l��� Iib���8��	&[����A0�#;��1���3�����v����pf�`��
���	��mg�h^�Dv���O��)XP[�]G�w��G��jiZ�I���~��_0���������99�-��y��A[��QP�����d���!w�����2��M��C^S�+$(hW!������z�
g ����G#���?w"%�����JS/6-��,F��p���=t*�����L�G����np���r��xszWF`�1��GsG�<�����%���C��r|w��j����LA��+>>���s����?$��s��.#`gj�
w"�b���?
�H��������1�x}"�'w���b�"���Z�*���A��c�=�	w��dO�q�"�������nQ���-��q���'�8�|�+�{���l?��}���D�%��#i�};xQ��d��mBV�a-�����V�A�~�7#�]����0�����hwp���n.X��X�6�wo���c���y6Fo\�
c&p�������	���`6r�L`�}��Bj����E�Tl3�+:0H�	���h��it�w�)k�����<}���$�D�{@Q��)
�HP���<6�%E�:�2�B�W�����riR2>-x����@�N}��'�o��v�n��L��^���T�1W8�K��4�jG�P������~�kV^S.��+�p\�qbR������y�r��)��c��
��v�15�F$�������h��
�=��Vf��q����46��u��to�I�o�g�uG���
r��������
BA�lM�����g�L�w���'�Qx�I��4��i�O�Djz�_A��\#X�T�T>�����Lm-���r� ;�B��7�6V���"�����LH�m��fH������X>�� ]C�&�� @�m�T����~H>���vH�!ER=��WA��X<���j	2���r�%��9DT0�������K��k��8r�����@��6|���xN��t�e� �y�@��
c;S�����`I����&��}?-,�A�hJ���R_���9��U(^{}D ���
>��1��������0v�9���s���n=��d�a��~A���?n:������Qh�����WGM)<�>�;^��ed�#$�������)Z���l4
�p7"=��&���d�n�F�6�����9�h��zU3R<8"R��)Z)��CE�H�����	t��	A	wv�/�K�=S3`�;Z������|7`�A���+
��8<�`"�wV���Q�����!�v�hw�	x��:M����T�Q&���Tx�<����cU��\��>;)�����D�YA����
Z�1�������-�R��F�Ga���}��Tp�<��ONp�����J;S'���;?�u�����]�b��,�$;��m��8d��1�(\Ouz��[R8��,b����m5�w�L*rXy��Cf9������8d�}�5����7�Z��\aj�Np�{I Q�u".[��5~��#8����g.���~<`���N���=���;����w�[�0��Tx��i���C\o �@0��s�a5`
>x�t��~��.K��qP�����=hN�B�~��\A��������X7D2)s1p�������!}��,X!2����9�`�mi��z����e�����<SEh<kW\�&����2�K�Awx�X
��?B��� �-\!<`���t�S��������0����e�Q�Ig����"^_�;G N�X���f���6�H`&m�a�����6t��������sN�
������B�x�.�A���%��\"����������JK
�
�G�{���:���s�^���xB��k����a�p����?�>Rx���N��%���A?R(�BO���b��X�
 �F�6�kRr���<W1��f�����8�4j��/I!O���t9p���h�:�������Tx������@��L���{�I�A����*� �����c����w�@!�f�u��-/Z�/�(<��������PD������x���=������?���'g��A���4\�Qx GJH5[�zF\�@���0o?�Gg�F���	"_}�ZLD��w��
2�#���C�v,��=C��cx���������#������}N�l���A�B2P����<_A>)<�����Y���3�q���dm
t�����9�A6X��%�<0�/�j�y���`�(���R�A�eJ���r4'ka��#�TO�L@��4�K%5�����(��u$�g��?Bu��.��<����I���wC��{h���uj"��u0�o:�O!'����g�F��M��O[x geY3�+>�	�Q���v���3A�jZ#n������U�#�@��v�z��I�6���
���u�O��Wn�������UL�r8@��
�]�ug7� tw��d� ���	����q�\�0���
�?:��`o���@����|(��oS�SQ��_�fb��bz7�
/�,�����P�$���A�QC�"2�\�o�|�;�B������C-��'c���1��rly�#H��mB���),X���������}���N%
x�`��� k���c��������&5���>�)��wq��H�<P`9km~AZ����� ��@����#� \M�s���v��0��� ��m���-��4�g����u��xp��	��2 I�Fu94�A���pB������� ���ith�;��0�y�L�����*/|��jB�#;tC�F'9�=4�<!K���RxK���[��
����!��g�69����A�@DI;�����@A����t��KC�:�X�?��,������$DP�����]c][w����]{��u�Nl�DD���;3| "�����w��{da���3s��;���9��}�p�Bx`^���S;�JG]��,,�R��f2I2$�o��� IDATt&
��<�7�'�.����f�\�Z��|�1�=����0����g��o�!\�2	1�^�������0XL1D���w��x��N)��Ja��$,��)�Nv���1���$���M��`�����Sa���7o����8p��CUR?���P��A�������'^����Y����5���]���1S GrP���jR�|�)��/)\}����jSX����)���	
�^�*W;`G7�����I����O��0�cL&���[n>��l�A���l <�O��_}�C&�c�)�����^(���L��G�c_�/�0Y^&�|��k�&5���HPYO�<>���T-H���/�R��cW1�>�����y�����x0r�).��63j���4:-��6��0'����}�Ik�e{J�[H<0�=��T;�+��5��H}�-m�'G����@���:4�~��n~�M6����a��7W;`���x��*���j��8\��A�qs	>�Y�����H���@)���xP����YCm��L]!;�kt��}r�K��I����x�w�>x��G�h�P���a�����m��W�;^���x�N'�������A�*u�D��~���w�&��{Vx0�U:��@��s��I���_��,��W�`/c�� B���u_*��!A��+���s����I���ax����3C�?W���1�_���U6>.��Rn����{c��3�I����l���n\�M������������q����/`���
�re�~�F��g1t���x0h�R �GmY�:�<���W/bB�N$�~�����$����>�I���v�I��2<�I�}.oX�Q���<�z����{������}�o`��	<dSB86-K��4��Bp�������7��9��rR�F�a�x����:��8]�(K�1?���/������)�.gZ(P�-V<��V�����%�'P��]��� +0�a�����
��r$���x��h:����jK���0�f'|E'5�}<`�3I���uK!�l��1���G�p��?�E
���7�ZDy��^�5���&^���(T����4�h&AZS��XPP-<H}H�2�e���	)�y�0,}�xP�iN��|`�m�����I�\�0�W;��J&=�td����25t��Ds��z2)l�9q'�3r�vH{J��,y[�IU�=��=%G��$Q��-m���+�|w���U�9x��C����
gI��<�IF���lL\s�:Q�[��R<�r�)=w�a��\�`/��[�icR<`j	�[���M�������
����\�����ul^�����`��6��q�,�\y�� d�Y`ma����2�Q����"�g�i��y���t'p�<�6�������p������m��BFE���LU!<`ud�&d��
����	�����b ��L���#r�5}K�<�za*��#�6�+���{��t�/T�����y84'?'����0K�H����	V�����<��M��,}�x�Fo(�B
�����x��0�_U(C���y]%��%s���d�h�����ef�A��"�1?��:���a ���H����Wb���Hc�����3����W���,�<��S����La5�����G��k�I<�HP���G���A�v@'��9+K����������x�������	=�Y���4�xp��%�
�������FU�����m����d�r|��Z���g�������*�K��6-���=�W�`J��~�&��n��C��6<d�W�h�y��l�������W�!���,:
��Yn�&�`<�o����aX�B������:��H�>9��0U�V�O��A?hT��
	&��w5O�#&
; ��X=lC��m������������-����@f�]���r�}F�LYA����GL��0�����s@@�T�"=_r�L����]�5��Z 0�fVXO��#>SU�
4��������y=�M���#��Z,?���y����������_�����\� N���s��5��a��,��~��p��K�n�k�f�D�Tx�p�!�[4F�����e�TO�Kt�bM ��PaOs�#��9�A�5�Hj[�)d����oK���1�,�k.<p���
mD(�`��,�����xJ*�3l��>W��R[�~���R^��&�p��-t7iI6	��(1����I�1��]��PU�T�H�[������T_f����hH*B%�z�@��;��C�7�7�S���ry�
���E������WGg���x��l� ��>���A���8���AJ"�\/���_�������Y`�����I�C��a�f*Ck��R4�HB�Q_���������OS!+/�|��RCY<����^IE��r��n�����x���A]&H<���-���x���i�,�B#(�jK��x�%��d�r+HQ��
����R(L*K�)������y3�x`��	��t�"�T���"�
���I�`N'��q��R>(C�����F���<�5����z�j�SR%Q������_�J�`���>8�������
��|\x�B&�&�u-���L�����:s���."�(�"�-.%mI�&,xp�+����$����)�}Xs�x���������t������@G�~��A��F@[Q��,��������XX�+d���I� )�������g�(�Hmf�%��:�/����K1��F��ROr�SKH}Ea�����{�8��??���ue���?,����6|v[�0���+wR98�M��A�NQ^sx�����Y<`�,K,l��)�������u��sc����;�`���?�H9Jq�	�N9_�F����S'��r��(>!����U�Z���'1��Odq^P!���RB4mx0E!	(����t�i��XZ����G)L�Fr�W�x�@r���&�P���(C:dz�eI
AMY
^'��.jt�'K�)/x�N������r��+[@�T�Sn�@U����N�q��S����.o@e"hSHR7��A���V<(��K���x�Nk��
r
K8)�v�����Sa�A��P��L�Rx��#4kS�x�xp2����~k *t�Bjt:�	L�z�e���iQr�&��I��dH�@����<0�R��n�y,����8x�K��0�����)�[�ho�R@��I�`��[����4��HR�� �Txp��k�xR������>~��]��;EU<���L������77�j�cB��<.�����bH���
,1�@�N��M�np�T��E�Xc
,��Y
o��{K���N*;�<�Q,`
,�S��u=�Q2�A���<`��F5�?�j��y��O[�FaXbm�D��n�BA��_`P�B
�����}��	&apC���T
��"��Q=���~�XA6c�����Hj��L���m������k
����.�x??��aGl�
�9��m~=L��w�r����H����2f�����>��
tz3�]����;�c@�/�BQ�L5@��-�^n���&��t��r���MJ��`��=�,���,1��-4*�ru�����Ft��X(v���ed���y�����9�La )41��(��/H��Q~v��x�I��	$`�4���z��7l��G���x`��7�7����Z�����
~p���@�n���9��A	���);�P�n�Y��h�V��RK�2|��5&-���;X��Sg~7�2+����ImS]c,2�?�}�O�����f�p��K��+_w\y�@�-���n^�Px6�XH�_�YHa:�<qoZ\��j���_�Ql�=X5�7l���Y�����VQ����CGBY^�o
�:�K�����v6��R��G�3��^r���,�6�t��N��%���lG@)P05�����B���;���@�1�6u�������Q���U��+0���"r+0�`0Auh��J����3(�B(���,1��)7D'�����C�2�����Fe��<����Bt!����g��}PSR��a������A���		��
=)�C6x0���F�bv��l���t�������l������``u��Lc��;���D���u�1�v����n�hs_����	x C�@�����q��e��&t�"� �����Y�;m��F�r�����.�(,�2R��qr��k���/C<���������"	F
MA[�ol�j���z6x��6���}�G����A{�)����kcad��z��cC���Lq�;Y6��fm`�
ySa�AmH���6^4��A�]f��xKx��z�����	����.C��ySA����r�m�HA
�5�r��f�B�8S����t��� iFJ<`����$������ �Y��P&5�4(�P
/�)NjH�����A1(�m��H%�Hxd!����
��y���s`��
� G�'�=� ��2XJ>�r�M�r�rM��A�-������L5��B��h��;���Nx���5Z����!�:������*���R��O��,�Ae
��� 0Xa���H$����{��o������_����?�S]���������R9����x���@����>���V5+���oz��B��d���������LR����3���z�c����B�� *>	�v����j��u��=�W���,�D��V����DR����c�����\�/��5�Q��,���y
/�C9�+_��,�3�C�D*\���Mw��Ne��ej	Vp���6�I>>�~��Nv*<������E{v�����,����SB0��@�;��J��T��SYaXj1J1����P8�x
A��F4�-f��AA�<�=��RBtpl��r8��P
�^�����|�9}s���T*oJ!�#h�0!�$���\,R��T�<0&pmv��|����|�8<�K�~�4�oB��PH����b�����S<h5����tB�ur�'������Vh��A:0�"�)��{��W�it��s8E���a=�����i�)�:?<hD�p�jmh�.��b�c��8vqR(DK3�@=[
�-p��z��3v�����$�����t��H�
�	�i��H��K���y����k-H������9���z��>�V1��g���������K�����Y��<�do��9�E�F�����1��I'3'���E{C�$�Y��9���_��� 0�E-Rm�y�
�g)2�N�����%m���#@��W<�W���4���'��
]�a�6<�K<0�pl���,��]��I��B��i���)0k�F
����/v/�u����v�d���
��?+Pw�J�����/��Nl��2�D1���*�nFyi�N�Km�<��w.P�h��B05���A��251�C�4�d*	l����{`��'*Q(�{KF�p
r*��5x]=����,I�����A����_E�i�t��t�s��'�D\��.������I_�O�_�k���i��+����)�/��e+�02�O-Z��H
G�<���}���0,��[��)�*8Da~nA!
�g���SA�A<�I��K	�RX�D�o��n�sW��h�2�2�\^A�B�H�m:�v~��H���o�C�/�1:*<PWP�
����=��p���H�t��,�e+
7��J�Q(�(������;�)���RA�A`b(��=�C?���As��9�S3��v�?�p�D�6�\0��3����{!��UQZ�j����G�p�*�����kM�aV��-o���x��c#wS<8�{��W`

S���e�Kt5����b��h�
�UYUTS�;-�/�4?��	�����u\^��h^��
��}�����6t�����8�����OjE�)(4k��C�Fm�?���m4���t��� �Y�S'D-ZL�U���y�)z.T�I���Y�N��7�����l0���]g$�D
A������r��hs���(��k�4���H-)�B�e+���B�����K,)������us����[g��~5:�I�`�ng�������j�~�e�;����}�$%�l[�=�S<�����k��'�	]ST�/�G�RP��>�L#@�Xzf�o�0����6g����!�B98��9�y3z���|vX�l����xq0��d��3�B��1 MK�5z(��|
*5��0C����>���
JE)�r��z`�Fi�#5Z�RB��i�!���R�=�
�W���1� =(����T<P�e(A����m>��]���������IH'�A��_B��/����P�@���q	H��?i�����Tx��kpH�S��u���OJvjtr�T��u��E���u���*C"#&�B���u����;���E������y�)H}O�_�_*��x�T�Z���"�h����'CM�6��;�	���
*_�������R<8B��RH�|x�"���pU��-���.�9-Ck
C��a�H����mG<��AJ���=��������C�]���+�*4$��}���'�4��L���'_���{]����s��S7`)<���l
Y��@��0
~�^���u��F��>^�����aL�Yx�����bD������zl|�}��!���<��VUT�wN~I�ie�M�����/��� 0<�R��'��}t����F�A�
h<�����
���p�=R�P��)6>���{m�+�v K���F�WH)\4��G< g�����XTq�H���12cS	T�D�k�r~�AE=m,A�.]��O��|�3��0�k������/���Lq��m�kN��}��S0��n@���P<`!X�.�5)�������Z���)�w�<z������;����Nx������$���~_��@%(�2��a�����_�
��7I�@Q((�BQ���{^������q�`y�@\�I>��u���E��������<�\a��(�K;���Ai������P�:�I�)40a
��`���
$QoQ��$��l��P�����l:-
7Xs�����,D�Yx j���'*xPm)�:r�Z(n�L���*���}����L�fa�Aqm~k�r�Z(��H����I���l�|o�TP{s�Z(�5)�����ln�iL:B�)/x i�y�j���/m���%�3?��86
�P[�Q� ��4���MQ�I��-���J�Y%Ry�G�!�y��`��%1'r������ cA�A	L����%�)J���Q��U���I�!?��$v��c/�P���]�(��$�K�l~�Aq�,
<(���('
xP�(�:
J����|�6��������D�����%�%RQ:���-O����$Q�q�}ky��j�����������j"�,�'r]WW��7��-���(���H�3ysh�8�T��T%SN�}7��Hi'<(��%�Q����X����U6(��xP��,
���*S��X�@�7q���7UJ�Bn@$�GQ���(^����*�leC�
9��
��>�g@��x ����"�b8+OV<(�����$��1������x#)���XY$<����������&�Y^���]�����w~��W$)R8���d�6���b5@�t��5�����/����/<(�>�
���K�T��xPz����
<([�J�6<��?��5<�����������<(/g��#�e����$�%�_��xP|
�A�}'��x ��D�%�x �X���� ��xP��P���%�M����tT	�|�����9xPz} ��j�����fY�O��A�����<����@2~�������#������xP|�	%E����'Q�q IDATs	���:V�f><�����(����wIk��/=(�%UBy���x���!"��Z+�e�pJ��H�kF��|�[���L			PRR���*��i�6"��V2
�A��DR|��l��L�������x�D��^��
�D��)����HC2))	rrr�h*����+�iR���P`uiii`�/��(�������R����+"43����]-2���%n� ���?233�����:��MM.3VQJJ��I^^��lr������&�(J#J���/�<�����2�����	�'��P"%`DMY��bY*�����bz"���_V���?�R��^����2a}^�������2)�rE����R��H���2T��H�B2�H=�h���5��\Gl�y��v'���.��2+ ����C�?J����� .R5�y>"���L���bT���k��2����I�l>������T�����Xs��d����<������EF�z��7���x���S\��a~u�+�����6'�\��"Uc�m'o��i!%!����F���H�iE�Jf�#����d���'��?3���yq��h����%�LF����?�u>�!�w��%��R+/jh�7�R�}�����E����Q����=ZV���:I���[�>�{M3�mVO�2aaaPUU�*�R��5���x���#��|�`�AC[����@@@*T�i���^�|[=W^��k��%��BH��%����������7P�<���?bb����Ko��,���e�e��(�Cv����(�Q^�#l\	�!����s
�����x����_��������ai��m����0?��K��0?,M��o���Gy�����C�1\Z%��|���k�xPZ#T�[.= �_�[���XX���c)w���X��(/�Gy�a�*��]r[��?�����IZ(/�!,,KrT��Vy���2��%��� �%�������>����2�����S�#����(�!�%soJ�Jy���0a}*���Fv���������?��\=]�,(�pv������+�����*,��(�)#ddd�����0�!&�V��2k����"�-�l��?�L�.�%���9�V����<��
��������<�x����v�099+�����Wi���������!�AP�#�BHjD��Ni�GJ�2�-�������0��f���`�P������-�GD�T����l�,j-���$�� j�D�'�E�T��+/��)q������5�V����<�Y��V�?2JV�<�Gy�������!(��^J�`�~���yR ���x�n��$%���r���YI����*/�Q^N��Q�1-I�a>��Q^�����e>"��%��)�-a~XrJ�����f�l����0?,�8�t��0���%�'�K�?I�./�Q�#�o����/���2a����
%@�������"2��X�����"��'���Q�C��Jrd��Vy�aa��cA��K��%�U����G��z���$-�CIz�����(�%e���G����F�d�����Dy�?�C�C�����R^��<�GX�
�!��]r;�e>�<�5�<(�X,�@�������E,,d~����_�E,IO����<��0Q���.�����e�L����iIZ(����$GD�m����0_/�X��a~(Io����%���,�CIyR2v�K�C��IY)�!�%5$c���Gy����C2�ZV��z����?�@�Q���x��5�-��F�s�eu�5�����r������������O����2��r�����*+n�_��  &��b���������0���OG�]N( x ���Ex����[����R&�[iN��c[�
�s�Vj�K���:Z�xT�%j���=:dI����eJ#�����}mC�s�".�Kb���`���x���Z�+� ��xs���fVo������)�&4��H/�*��LJM�n�z���e�_z ���=
/7�I���ce7o��~.������T4���A�wuM��F��o�w���;�.*�ogQVQ������^s�|�Cj@�I��#��������i�wWF{G/D<�*�v'UW�65������kI�MK�=�G��Dl����pDH�>n���
j�Y��RF8��R"�p5c�p(�f@��'�������4R��B��=%y�7���c�~������%�E��k����T^��hx�K��Xv���Svc�bw[��m�uDff�8���5�����e���R0$x�t= ���_<(=��bYD���G������cT�A�����o�Z���}-���A<�W�%���'��d��Ti<��'��#�xP�#����0 ���X��WY��������_<�W�J�C���<(�������(��@/	y���:���zNJ��x �o�@4?�\x ���KN<(YO
�A��'��x )O�oG��tG����}<��x ���*�����@t�
����*(g����O�s��0�����D�[��V��u=}���aU�R��;~�*���@�J&b_El\��;
yyy����������3�8�c���������~��'�_���,�M���[;��M;BYI		���1q$���=B��e	���	�-hL*�����x<?�
���O����%Tm9���pw���u�S�Vb���fA��B<�c��/����(�l~����ej��x���LQ���G�X	�fU��Q_�:INN������������>�9��+�����;��2�uW��y��[k���`���C�9U�������eYPR�����xg����Ow�k��������b��d��k�PTG\J<b�b��f��a����R�=�t+�UN����4n�������C������(M;��C-��������^�%������m���$��
�o0��%��|��]��}�jAgYDmq������L�6*�7���<�No�|���&z���aGn�x�`x��Y,�hwmMU�?$�������;m	,�o�g����q2K"�{w�<��C?�^(��bq��%�k��3?���������F�EM��C��P�j*!��S��j��#�N�@�{�X��3
����X�]�z�2{6�AZt��:*
��������	M�6��_n��5#�b����{�0z�j?���������J,�-]vt�L~�%j��j$$EAQA
J�x�r����������C�a��{�9���>$V�
��0�o+����X��3K:�B��kp��z4m?�O�*V�$	���a�^���2��{/������7����X���f0��C��^�p���>o5bV�����������^<9�V�E�d7���$$�g�z%��.n&A�@<�M�����CL���)�@<�5x�v�D����b5�k�Z���x�������8�������&c��#��y0~=,�w_a�����*]���V�9��wq�5Q�H��
��
�*����+V��B�
����Z��4�=�>�~{�H�������$%��u�p|����a��������M{0s�H��P��BRI����O�C��|�x�.�u�Q���xC����u�1������j�.��ed���z�L�i.��+�J�Y����"*&Z5i�~L�x������7����/�<�r:mShY�������)��q=&��x YeMZ^v������E���a���d�],�j��n9�aO#��#���]�b�����*���mM|8��d�c@����# �
�*5-@�-��6bF�����X���
�~���c��1�x0��j;�=���&����t�st���51���o<���	�Z�Hp��<w�����i���5x�L�r��w���|S��'
����Q I����	���/����G6@�_(�iu�@��?������y��d��,i����>����w��<������`��S����h�n.G5�6�
x /+�e�:`��K8>w�w
T0�����|s��Z�
���3�k��p��l�Z��n��SEzdK<�IE�w�l��@$��T�p0\K���g[R�<�<$bK���z/���_�V�����z6l-U5��qQ���4�CM�B��nv��l+Z�v�*�������Y�SJ<Pm�iu9����o3tg�h2A��h�h�}�A{+s�+(��W�E����KR�`Q�^8���Dj��
4m0��O������9����cp��e�<jv�f�a���U�����cp��)�u��~m4od�������*�� 9%�+T���[�b�/�q��9^�}���d�m���}��MPUQA��M`W�*���n�P������3���A�z�Nt�=r]������	D�2�w���}���rK4kXW@SC
���f2��(.x���4B��N��u���w�"1:�v���������Tk�T���������l���B����|a�d0���?S<x~z�����n!���t�����3�
$����p������:����G�vf�������W�Dl�7�\	���rTr���#BJ�����
H��9m���$���d����P�3�ax#��))���
YmM����:X���~C����;�7du4i�g�����LM�~i��������7�r���.�(�����Y-
h
�����j�>)R��f"����
Z�HI�R8��@�$���m[M�����^��������B�*�����{����'�����,�
���de`=�2���S~�[P�rR�r����s��<@*3�����_q������?���{a\
A^[��
�X�*�*�>�
R�Rx�WI�{
�������9�0h����#�9�@�C
�:j�UI���P�O;D��SJxAP����,����dhX��q�3$G��:�<x�EjlZ���~�����A��0^g�}�At���*��|��(�[R���r�!�����N!Vd
����������)����A������
Ue]�m4�.��nn?/��������Mf�)�;Ow��j7H���:,��F%:A�N�f�<G7���]k4�� Z�pr9��Y��t�������������bB���*H���&��_��tz7��7�t����K�W�6W2Xow���)��@Tb4�}v�4���w������@'s[M�o�v?:���D������u���nD����[L�V�=\�������1GS��XR��V�T���)g�R��>��ZL��v�
[��^��AC����O���A�bd�����7��`Z��}L����Sh����-8�+�O�*�f�S�_��?�/��}C�m�
*�����V|��������{6#5M��X��A��Cam��_��c�Q��9�4�������L��v$e��*�Z�@�;u~9��XH'UI�K�������4�o��uzBA^��������c<��(?�v�EATR
���k��`jAq��R�	�i���z&�\�
L�U��c�S����?]pBUu|���
�����;xE�A��k~s��|����/D�@Z[:�����4n�#��G�i���DDmu�j_3�h)��f��@j&4&UC�I�;�����K
_��I���ez&%��B�?������*�^�;����g��!�Pl���U�b=��*��e���D:9C��j��4���c��
$��}T������Q�_���������D^vD��W��5I�����&���6��#?���A��4����i�!o����#����5�3�od�����Q����xWOn=
������.�'���� Tl,��AjP�[��w��"����@��"�"*���mJm�A��-H������v�4R�aur'^�C�����F���0�:�UH�%=�/������M�8v1Enw^�������!!>�2��[�6FB]Sm;����T��JfS'���]Y\��z��9�]8�������@v>B��N��1��g�oW~GE
�f��x�����0��p��2�l\�f>=�o������+`nK��E�b�c�Yj���K���"��(�����8�1�a���������m|"���",u�u%x��w�=������v�i�u���������Tx�;%s�Mk�������<��qve��������~��������{$�-~����$����>������Z�2����P������v++�K�^�2�.~P�����G��*���	�4����K��������z���A�)�}�2
���J�O[	q��pXxN��??X���j���tm�2R3�dv��Z8�����EBYW	Wg�BZb*Z-iE-E9����|������� ������9����]���_�r��Y�)��*aq���H���pO8�������',
3�^��NM�������o��B���Z��qll[r?l�2����	n9FX�G��;���o�8�������=�T���)(+�AEE..�re�������CQQ;vLGBB,��]�����������.��Y������
�z��v��n���il�x`j\M�����n=�m�8�k�^���:��R9
�����hSY����;kQ��#��A2�^��%���E�!5���'��BN/���>�7�	%�N��s���3G�o�����v�0�m�����jc�C���J�1y��M������
�Bk[�**���78I���>A��w�zR@x�������
���������dh{n�3 '������#:��-��H������Ut�����,���
����1�oD������h�i�T�w4���Y@k>�h��W�>f���:h#�CHe��\=��#Dm
R<�0��vuF�1q�ib�1��&�D}������E��lP��>���n�_�{���g�I4&R��q��B�����d(����� �|����2o	i)�y����V���p�x�����{���	���|/�����4����[���A��� ��a���O�\������E4o�B��c7��������=��} �M��>���@Z*T�������"�a������t<8Gc�\GF����=�2h3VN4WH�9 {�6���r&U�)�)'n���f$�f��p5������xR4��n%Y����w������d�~o�}H��������&����\<b������l�*�K}�����Tm����"�����������������.{z!�;W'��%UW�6�/��
�Zar��4v����iK>��7?�@JC��#�Iy���[��s�wn���T�F(��;��'�DXL0�_�g�){~����[.���/�Tke\wOU%?������?��T�������I�s����O��kk�uh��m���'[k=�iqQ4���~�_�J�xt�g���2������,�u�v�e@���
�����3;�z�>nF�u:��w����(�@CE�G��my������/��rc�o������D	;&��=��:���X?v*����k#~��&:�8r�:�u��~���������A����9sO��)�;�� ��K.N8��G^�T�`�y����F����:V^8H��*����{I�R9���u@u-���q��HNM������Y����
z�eb���x�Guk`���1�m��w��v���0Q�ykUh�1���BA��ph�7��)�Yi����iM�`E
��:�4}��,w������(��e�0XZi�����z�Y#`�3W<`���d��(�'��D�VC�B7(7��(x�� �������#���SW��=TSMu��L���R{_A{�����As���`>����3j����V�Tq��J�x���x���mk����V�?���X,���?������d�L�����:9!0*
�w^!!�vP4�.?��o�f�`_��g�>H��(�5����w{�9Hs��PQP���.:��G���xR�; IDAT/v��^�_��������T����������_�3S{�h<����9l���)��w^���0�wZ�M��������e@��8vZt���������_�a�����;�_u@�.m���Y��k6����h����?������)��pH�)��'�^���=������.amF��z�n�b��%���|���6R�����BI)k��u����&��7?[�e�XX��,]Od6-*RZ<{b�N��������Fp�|�G�AQ]^���Q���!�4�1A����J�Z���A�V� G��NF����w��f�_r������}��Gp� �$�+�������������|pU(����>X����������wN�UT�i�GG#�Y����Y��!�%�`����d��[uL=���t��.�lw���x ������5�Whtn����<��C�@�������A�WG$��GM�DI���	�����!��+�������gUH
<�S�E��u�`�w���kA�Q��F?�E��i~o�c��W���>^�-����Aki����������4��p�=�9������������uTW��12�o���&�+�*����������T�f��X���w�|�L@@���x:���kP6R�I'C�o�/x��`C��kT�W@�IVxC�E��U�d�3X{$�������h����#S`������������"��

�0��,�w�JEeXO��0�y��p^�U�T�>�
0���C�\�AIH�+=)������X���};����X������1�������9�k<�=�CO��Z�q��Zti>L����&�n���=5-���s��'�aH�M�xw5��I��x���o��4��B��EI�;�����5*��~XBAH��
����p��e(��^�*-���~��;W	40P�C];��pP��;[��@�z?����#��>��A�������PY���AGI��Q`������R����k�,��s�a]��x��B�B����(����������x���Z:���
S=l:�6O��5'��*mZ��U'`P������.<8�t�=�pn�t_6�Zu��{���I�.f��sIV�	nT���
&O8���~�>��Q�A�D�����q���.^]���0th;�~^�u�"2���<x�r^>�0�����m 7��Oi��Nw�n�'���W�)?� �6��S���:���'��*`+��oe^��1�
6w��w����C{K#�{���ZA����L�����h�%�����P���G��X}��2�)-�
�@�^Q�"BkC$\����f��dMh���9"���Eg�x� �]t�A����1P���N��.�$��'$�n��$�P0���%�a����O���'A����>A&�#�Iy�7�T������"^��.���1b����4Z��Z��_wZ ��;L������P�Rz$Q���$���`�v�&�|���KF��N����x��*�#�6���X
�~a}t�����fd�B��e���~�9RDvMA�Aas���d���
���^+D�w�����;c�����<r�W�6g��v���E��k~C���0�4��v��U8��s����$&d�������.��a���Fa��P{�Db�$M��!4(��(���X�"��rA���G;Q]�:=������
�m��N���J���jG�����M�_������uGp� ���k�_w�B�=��A�|��?��bNK�[����F�+�B��!�?
���p��PA��W0��6��bEMj�w�](ipP�r	mjQ�y=U��`@p��o����M����Q��S�_m���ANG^+���AKW���Z�����#�=0�#B��%��������0�I��<``��_�����#�2hM���sS����������Z�T_��h���
�m_�����
t��'��G�.���������B��l����wQ�w������6�2�&�rA���pv�e�w9�}�A�"Acw?r��X�����@�?#!4
������h>�B�����*GDz�.#��� ������c�u'��a����{KL<p����1�~-,?����.(�C��
/9�
������a���g8><77GL��G��BTd����#�W`���8tp������������_���]���p��}���~�Yl%11�����!p��-Z|������������������_�a����\
�4��A/�j���F�Mu#���	 J�
��o/��sp�
�j]���8x��f�O��+I���BMEQ�����	��9�p�a%/��	MN�0��������,mi#02c����'�x��G���5�P�TU��h��5�D���m�%���o�0����!��i=�b6� �oj��w�i��3v\vBCkS��;��
������6�_+�`���mx����:� ����L��;��&X�Fd��gh�m!��}+��\���e�f�aA�x��}V����P����]���I��r��v}"z�����n�~����A�!"&�)��S��F_��J�S�K��h*tVc���';��Z4&(0��
�p�aG�L��3
�o��� ���F��BU�X�����JP�o�����A���I '����s����_z���3�Q�R^�;�'hZ�?�:,��Dh���R����t"g��b�H�{
Z��#r�(�U�2����C�]7�y���������Y����
|_&#�]�vS��s2*X���1�/�| " 
nw�d����d�e,��b�r���H�������I��0�.�sF��L-\X�.�4�����tZk ��/�~NC�1j���	�k	h>T
O������S`V[��p<�6�D�4���@�@���A�@1~�h��.�:%�y����yz���7�|�P��<r�|�)?�@��6�j����!��*R����-<P#�{����u�����K���qL�1���$�M?O��VF��� ~3I�`��5��������
e%������v�k�K��y|��D��$���	��=F�D���P�����
[�x0��x����m0�7�:��EoR�4�����`���hZ�+�6v����H��D�r���������1�K��u���t�5q���1z���K���i����_!G����{tNo_��o+K
<�R�"�4���?�E��{�/�4���w������?/���Kp|���-����	.�|��X��
L�����Y��8 <0����sX�g,<�
�����un�6���q{���2h���E��/��/����^HO��X3�^���JYL�:���y��
��\kNs��4K��Z���V<0�S�����6�� �z�\H�oWm��{��Jd���}$���	t���;/Ljh�+�1�D/�q�*C[Y�� ���]��iM���
cZo�V<�Ij�7<}�(Z8����#�&a����nl�
�H���p��Kz���'O��n]\vu�7���w����0BIN�_�^��f%3X�T$0Q��}��
�9���F�f-p���`%Ac7����<�
��i� �hg�+�C`��+���L�:���_"(��j4WV3�p��.�����.�.�R�4ZA[�65;�����[�$< /1��)c����\=������g,�-�q�u���c��N7�����K<py�M�F�6������9
3��b)6.��O�QP��c�H� ,"��d�����
w�E�|�r��Sh��>*W2�*j*�\���Na�S?����<P\� :�<�BE�V�������v�*:&xzb!^�Se:M>_]�
�.3����MFn���;��������l
�$���^O����f���<<���w��������SG�v2�A�����j�M�i9�����%5xPR��|�P--u���>��i�Kn!��W��Jhtl�����wI4uv�d�&u�B����{�n���3���	�C��&T��I�<IR�3k���!�F0|���
�h��N�KXFQ��
��yI�Gl���,�@�b�f|v8��������F��9
��M����������e����t��9h�i�-���6{���"�NQ��<����5�
��{�T�O� �m.h����E�Pc�5oS�������'}�����5T�T�n�
�c�C-4�QNS�s��]������'����A,�Yn��AUFWF�oWH�HosO���x������7^7x�����q��T��>$=��T��T�1�a�>�]�;�rAWZ��	x��W�_�?���� cyG����Wfs8AV��,(�r�O��U��~
-8�v� ��)�}z)t�jT��x�&'|�^"ymhq�������[��j�,-�3� �J�2���GP�B5���(iiH�����^�����9~�p;�>������Z;�������p:�5��,��[z��I�y�ya(M�EI�:j���k}�(`��Ch`]���pl�R�kR�Sv�4�W:����#��L	��Gg/������Ju�l��j���>���kU�N�����]Wa���Qu�i1�N~�����L{(+k���!�<vv����O�C���������t8���~������f��c����:xM
	��<O~���m� \�
D�J��hi���AEue����?;|z.'��c�#w�jR�����L����s����/)]��3<s��De-���Xx@_�Pn	����9������n�����X_�6Z���I2U�Nr�����4�TG��gP��;��
H�Z�B]
t���F����tJ�%��'�T���!b�s����#/x�N��uL�-7k@!q��q�V�R�vA�;�Ua\7������\��x�`x��jMjA�N��	��T������@B_��m\����u�S����T�W�[����>�F������1�gD��k|�+��=3P�����������9=�
*����pR<`){�"E�Q�w����i��JU-9��q�*��{gVU���?��HH��"b'bww���a����k�������k����-6�4*(�]�;���r/��g||�{��;s����������S�-�i����s�g)x���Z���@���`������}��9����FB�f���������c;�wi4���'��0��lzl��T�G��s�:�����8x�Gc~/�w���Lc�)�=��3���3�u��XIBq����&�����)����L�)m�z�Q�y������W������(�k�V�(��wH!p���&\�@���B�=��k�]��������0tw������� �zVH�J���/���~x6x;<�v���W��b����"-,Q�|`?��X����FQS5V���:��lJ��l���^�������[�qUiBq�:��F�j�=��W����!ZD�K�l^�\*����OsX�f0�f���L�lf��fx��S4���	�����:�G���p|�d����K7��p��82�2H-F� <`'��v���&�~�	B�0�C3:�w�N�Y����>��(Wx`cS=z����q��
|5|~���_f�@�O,��j���r%��Z����X�d(�Wo�f�{�8n���M2���/?��%K.CCSK�U�7f������lge�X.��M��h�A���C�����]k��5���CR;p���?&��A^v=;, ��y�|��m���<%W�!�'����3���bV7hl�60���N�M'��`����P�����Co�Xq �8uR�3�-f�8�?�u��F ���b���F

�I���Ue���=����]� ���P�g��9^�Z��6�$W�`���ls���HT��	�[��@'����������	�Tp��k��-�����#)�A�An\K������{W%_�h��S�1\}����h����M'b�����{�}x���������A0���/��c�����)��8�N2*)�pP��.+�����6���g
����&�
��C�o`GvBr4�fae���+������.��t"��.�9�����"c����������A��Ro]F���0X���A�ncr�����9�YP�U�6�\�@� <�����K�� ����:�H����D����^���)!��>i���`
r������������v�x|��HhH����nS�pyc<:��4��{�B
I0sTF�a�y�F�A"�5*q%��x�2
���C�XWiN�a����]�8�@�Tu����L����7��&H.S/<0����>�i3T:F*A7���|��M�LPt����x#�
\Q�Z�����z���s8�q����u}�F��J��9GI����s�����
�\-t�����B}��&��C�����ug_<`	��^C����vq�n����%
<0�����_�&����� ��b������GU;W<�^�|���aq��dZ#�O���W9cC�ZuP��������E���s�1{�j�e��w�&>Ae}��A�zAi��k���#�\��~���_0j���Z�Z:6��6�#u�����euW�0����7�L�q������&���Gor�(	t�s�"�w����ASg�������:x`��6>LzN�{9�4B�Y��jN:`.b��
�x{��~�1�H��Jj����|K����LA!�'f�k����Hj�w"� B��������4$��sTr[���r%l��N'R�oO���g�0�����j~L����.�h/3?xp���DHA�2�����z���������w||0��
!t�����EEa����y������*��4���=�V���?��~E}^�JHgR�� ���\�L�UaX7�G[�����E�<�����hb)QZIx��D����[/^[C������=Z�lCngi=�/0g�������G� i���^R'P�EsS4����=]m2rcz����;?�N�I�����x���%�s���o�;�z��U��\�
�'<2�h�4vx��������C��V8��x���I�oYX��vR>�%�RRS�a�L���F��B����@I��{a��^]���$cF'�	<�3u�S<�����m�-��;�59���ZS)��x��f����	���r��XB?�T<(���)0���&q����L�4�$�lY�����7��ZHK�-POY{��jA���L�UQ�T��"���f��B4����z60����~�*M��u������,����x?{)t��@����@��/)x�A/�i~���nM�/��1CI���&������0p���+ah��N}Z
p�A������64HE@�6�Y!H�I�:���������r7�Y���:�j��[d�d��{�l��)<]�
f�M��@�;p�I�a��S�W��jM���,� <��x��60�.�)5X���t�l?=�����TRH�L���#�d��&��&��^�v]������T<�fMq���J�b�l-�]":�(� ��Bh������n������,(s����|�n�P�/|��~�>�Ca��4rM���OW:����	�m-N__�fuI��Yz*�)8X5��e�������[x�T�;���^�2����U.Lp��?���j+�	������;��Mr�+���G=O�G��|aa��X�7�Q>�ir~3���>BqX^l��v
n����:/'%=��l�\��Bp���Nh����tb)�'���~��b�1�U{~Zal�^�uo4%J���������m�Nbx�� IDAT�)�i;/�h�����n�L��G��������[����T�{��\�`��e8sa%)��I��np��G����4Q�?�;����A��|�@V� ,1�H���6&���$����I�x�R<���:!��/���1��lI�,P< _���-�|0�em�x������	�S3I~1��7�
���
��h�#�r��������I�)��r�����s��@?p����x0�)�FVd
��F&)�(�A��\�{����������$��B�2z��y �H*W��v������i$)����OX�hT#�:-�\!��k�d��0����Y`�3�-u��"���}�-��>����<R<��T���D����:A*�ghs�T$
�����",o���;6P��m����G��eg(L�����O� ���\� |�>�|O�o�Y:-�
�S�;JZmbc2������U���X��S��v��:�,lYC�z6���D�o���s��q��yo���lLc�K����K�<���������i�k?w����E��B��_P��G�4�ER>P���.:�,O���DH�[�����f}.x`6�2��8�#���-���,�PX���?�`>�!B�gVJ:Wx��n����30j[��L0��g<a��;���Y�V���HJaY�����A.x��h������uI
�w'�Lb��r��������6�����n�mR<h������*)'$��@u#	�����?�
�.is�xE��fZ0s�����;�����:r�����_9����oo�(�h8t����������TO-<�������������9��k���b����:��U�m�^�8����9��@�Y3���?�8V6��F�0��5�v��xw� It��N��C�����������~X���#&&m�CdTw�u��)^�(���������������������7�[������Ob���:l.� Xa���8�	���RU'@)E�K�x�T|n���6U�#$�3&�_��E����i4!w+/��C��Cq�f�����Vh�:�C���h8����A�8}e!����s�������BQ���v����#r���q!h�d��/r���X��������`����y�(-�W<�D*=����O�����'���� �MRrbj	�;4���1�_k\~��J�X}��fJ��$H�C(��t�}�Z�909&0&��v�A�|b>�I�=*�������H���g�����I�8���AxE ���+-��{�=y�As�~\�����h�J������q7,�R<`P�2R8P���,L$����x`f�@r�f&��9����b���p�kM��y9*Jj�m�����vhZ�����%���dIM��6���nF�oS�7w%�m��c=��C�Ykd�C�K_$�As��7Os�Ex�@eUr����4hM�A.LE�G\��\!�:�>�o����u�PX� ��i��~:�P��e1�1�)����X���l$�e!������A0����r2�(�S]�7xP�w
]��i=�[��V��}�7���9��p��Q
���!�6(;YL���pr��s���]��Hx`�g��V���y����9���;���n�A�]�������9�Qj|�����D���$
<0#���vV���{&}����a�W2������e7����s����������.p��.�Z�B#W,:�W��,
<p�������������s;��Px�U�N�:�L�u����^�V��q��q���K��074&u�;����Hi���\<U��Bi����A���}d��l�����6]?�� ���#�����-����]�b��������,�W<�MPB�z-���i��E�x�Ir��_y��)QC�$�����x�wW<��A���a0�~��V+rk[Y
�W�?�=\�P��a!<(�x��f�US��z���dR9���!�2�NP0��s���o���5��i�*�.���!��<��L�@��]�>R<H�UI���\)���r��RafwR���I��0x0�gO!5�`���D�Z86�W�\0��OKX�+���rd.�
�
G��B�-e���x0�n�D���7k��k�����Ak�Am��=������m*�M��$l�[�j��ER�Y`�!�d��/_���^�^�3X�+0����r�`�����m��Fb)�n��xP�n�8�Q����
Vn��_&��$�L�6<���L����~~�n(I:���l�}�^8�v��YCXZ����<�|�=�'�J2p
i*�J
0e����&j�:M����y���g��s�|���n�H�f��4����7��	V��#��:$����op"Y�P��96��Td����5��'�+�n�����<����E�{�7��A������9xP��
D�>'�
�Z������C����_^*P�g����� �<��M :�U^�$i}<��J�'?x�B����$;L'?��t��K����;���������h!t��w�B���&��>
�4�JJ���s\-x���l�{fL�>�@�n�b����7F��C�<~����F�$���N��C���F�O�`8�m�t�#/���p��L��������s_��Z�U#�"%�V&\}���M'�_����,��t"wi���9���M2����b/��A��f�����:�G��N{��u�d3��Oh��A��8p����1:���5��
�ixo��u4��� �D��;�Wk|�����r"�+�T��+�!�;�R���AM����C���1��Wx�l�aJ��o�#� 
�s�@�^^TV����|���F��@���I��b�����)"�������*�.�-mp��q��M���Ax�I*�o�I�)P�
��'c���8x��:1�H�v�I��$a�\+tn1����3�FA�$��Rb��,.��������BB�>���+��w%�
v\)��Z=r���b��GmTk .�_�$?�`��.9~�r�8��)�<�]X
����?���7��������
�P�,��:n��3���6�����|�����T�|0��T�!9����A?�}���Jn�#��Xc��"����J������f����3
������5��3���.����$�1�{A�H��A+�����X���BA.x�N2L�At;��#?��`R�,0�@��*�E�KOa��3$�8
6&f�IL�J�)�CG���4:0e�_��[�!W)�_���P��v(����V�.�����ao�0<��pF�6c������B�N�����/ ��'X:}}3�z}��$��:�F$+J���5w�P��z#����<
u\:���9H�S���(��;{�mO0%
z�Lo��������s�C���p:	��q
�a��@���*9.q~<�6��"0at]G�g��s�)���q�N� � 0�Na���Ap$z��]���k+���+B�@��"Nv��C�������L�;ECr�F."'���.�f!�TT��1	��j9�h,2 ���l����w�J��(RA��j�����z�H"��x	mdN�����N���Z���5C���P<������J�62m��P�I5<x@r��5��?M�����T�SPNP���*������������s���V/�_�sH�=kC�4���!�kx`�|m�F@�@�S���^��_H
%wK�lA.H�@�M=������r���y4�Z���	>���n��^��=�!��;�6y�����4�����"�;A�ms^�������o���Y`�~���t���5>,��d�m�ZH��<M8�g�<��[P ��r��6�7���6��{{�w���B������0x��A>���\��&�z���r��'S��3�������o^JA���������Zg�&�Y+:�HC�6T������1�����1�<<`j+n�I��1��l��.�|Rg�&� ���1_��*L�1���9Cc�WC��v��XF~Hc����
�+����#�q�S<0p�'X�O�R�F���z��{�'x�"�����7�Y`�����q$��Z�Y'���F�[I�P����IG`7�=T��i��I��`7�>$�UR[`n�\���.V��O��
������90_���SR0hF���8�������6"��4Hn!���4l�R����s���N���|Jr�
�p\��_��/�~�]���{��;ZQ�D�.j	����qq:������>��*i"����6[���+�;�\�����xh����I��Iq[�o���Xr���#�Nq��F?���[��y��7�h>�1�N��[;���������V���j����p���+Wx`A���.n|��0 =}���nFg7�?�I4Yt��
z���h���W��?�����
H68�|� <��s�����MS����<����6������.nG���}�/H%Cx��##s�np��6���	�%�����~m?�gX��`9�'�/8EpBW��7��!����� 11>��ti'�M��];4w��D�����O�������rX�)����������f���LjGE|$�l�����������e��s�N�KJ(Q<��gg���Tm���u:N^Z��x^��������:��k�����;7�����������Ix���w��:�|M���w������s��:�����g���78�����H&����|�!�~>w��������K�Za���Lj>K�������NJA;/{`<=�����X�O�ti]�e���
���6*sU���y���v4��||>��|����M~t��q1H����k��]C>����YU��.��T����'�[�����Ov �\�*h������G������kp�u�E�-�N<�m��_��2�>��&5{#��������!���(����\�V�
w��a��B��q��
����W%��s�����y�lRU3�6#I��	B�j���)
��T����7j����E*�����y������$�-���j������"�i�&�#Aw�������/X��-������������T]�Gd���>�3uP�m�<��e�`������:�-�><g>� ��-2h!9!�_���������L�t�����/r�
i~As�l��������@G�x�Bi�����6��I*��N���8���?���j*��F�\;|~P�����
\F��]�����#&<h��=<�����m�x�Cz6���q�-]�1�Ck�7�>���r��� 
<P4�������������5������7�&���T�B�1.<PQR����HuA��Dr�2��Z�:����5�B��V������`F)����tJ���zL��+)��
g����h�Q��
��.��/�f'�yr36�Y�j�)8U1CO:ANJl�:��~m��=����n*+dS������/5`2h���~��?�
m"%�N����'� 
<h����E027���������EXvi#����5�x<}�
�s��X�V�����X���9�7~�f�_�������Z���{����8�@_K�G���I/��]`j���7��gXf��@���g�AD\,����\-'5��y
����`�v��1��K='��c�]���~��O�L���;x������L�`����44��N�������p��-�j!����k'���Y(��6��(��C��|n����Y�7aI��1�����V���j��$}�������(t��o#B��.���#r��*.H�����Hkkw4I��`��
T����G,�!�]�3� 3:&�H��\2T��$R��)�rp�v$R��B��bv����v����Z�\�r��G��g�=�C���I�r��?��}9���j�7A�������&o���]�.��JMRl)D'S[�jF.n`P��<`cV���	��IIAR�_r�.��
�/�j�Amj�*��Gx|<���!���8,:y2O� ��A��u�}����[����Xv�\/�����4(�I5!�'7
����e������1~����������B~��+���I����^�n����=�������X=V_	���4�*k*+��!
���~�oA����\@�?���7G�lN7�m���qx�A�=:����:����*��{Z���Sre���Q��~M��Z5h�s�W��K����L������s��B�����;�d�O���w�)�H�z���dA�C��������K�$��g/�����;�r���C'/�B��<��VU��$���%��_�U?�f-\M�A�es6s�K���6\���#���L�fw� ��,PR�@���Z(.���
��]MdiC(������B��5-���R����Df�[�����X��i��4����$��<����B
��Zu�����iC~u��iE�Z�6Y��s� K�_2�8��K��K�%<�e��������Y���Z(�����(WRgV�	
���H��Y3����r����"Uq�\-H�A	"�J�U�%)<(��� �\X�4�.��Bi�]y�J�,��8��������D�%-�(���y�U:q�AY���+<(�:}����Z(�:�J����_x �����[�������(W%�R�d�\-H�Q��\-H��(�@�<X|Q�AI�ai�J����YK�����O����&K���Y�+iZQ�AI��6�(�@�<��_<�&-�+
<�6������XMH#X�X�"�����O. 2I���^wTvhTd	���;pHHLI����(� �e���������xP~�M��6xP��@}L�,�@���@�N%"��fO<��~�J-�����|��&t����A�cm<���H���@:{}��xP�����+���J\L3��$0Z0��K�SS�*9��X�,���ud���x ��dM-��ZPH�_���x��hyA����IP<(=��YP<mkA�@�>((Hn��SdkI<��~�J-�����|�@J����Ai[X���Hk�/_J��x �}�@r[��)���P��?d<(�������$9��$V���x���xPz�$��g[<���x ��X,<��V%����x ����Z�eI�����n����/�_P<���x ���Tl<(]K������m%.��nC!���xP������(/f�������Cu
��PKVF���+99���066.6ny�P�\-$�f����&KOO���@X'�I��$	nWVBRvF�����![CS������6��KHH���TTT���<%`����
mm��T-����jk=d�~>veee!>>����9((*�B��=U�����c���o���W�o���������W�����VWW/7�JOM�JR����
H�+����n�D���PI���EEV{F���l����$��J.������C��'�U�������������O�Y�#
�
H�	EJ��������l���o�<SU��Va��J�xo�����eF@!1XnM������J�<�zJ2_����&[#!E��^�QE3���2�?�>���T��U���\+,&��hV�85������$m�d#M�Z�����C��?��f��,�u�4-���kq�����v���#�*�C�b��7GUFq���e��R���
M�l`*['�LEd�-�2?d�&7z����.�O��f����?W�k�T�2QUVA��gb�r�^���K%
e��������+���%�#%���6i�RN/2��h��d����y'�����Bz*�3Ja�cU7S-TR�,Q����������-QzY�Z�����,YH���b
Q���BF�0��qm��������QJj��IWQ��,�/,] IDAT��l�=�iM�����DXX���d�����GEi�����,^�������5e��"��*��Q����GX��C�1F^9�yYR>��!;�#��������
���"<�������<r��������(�Q�#�U���_��5��2av(��Cd��B���������<������K�kP�byZ����=���<{��yU���e���������,�^!{^�=*�|D��������0?��5e�Kh�m(�*�|D����G�'��0a��(�GEha~(�{S^�T������B{��g��OE��0K���!<�~���-$� X@�@��{�ihhH\/EEE0y��X}����D"F�v��=�]�<��(����TUU����9�V{|���"�Gvv6���f�-�}Oh���2L~���r#�����e����a>�l!���z�����|D��I�CE�?*J{���oi��mee�r�f �u�I-�e�	��e�,i)�>���� i�$�'�%�T���(�f)i������%�V{|���"�Y��V{H�3dKQ����GXK�e{���KB������o��B2K
�r�����%(O+T���"��@���g��WEi��rbGh���<s��f��rT���(�a�.��F������6�gB{�����UQ���P�~ ��a>"���+d�O��f?y��(�Q�#�m���w/y~e>�,P�����
)�����o��� 2��/��AY>��i��rT��&������UQ�CXX��/�3������<{��yU���(�a�.{�g��P���=/�=d���r�(�a�.�!�|*�|�Y����=���|�My�RQ��"�GX�
�!��-{>e>�,Q�������C`�A�Z6���W^uxx8�������Ae��r�v�(�����������b�_8Bjj*�����*]5Q�1R��?���.TSCe�C��111������T�4���s�R�F�F���)A	&)U��/�=$.D���

����r�/�Z��I�(a��I4�*������q�+���De���9�,ai�%�����l]TT�L�!}��O����3����(s��L�L�(���k��tE%.#�_l�/acV��r�T�����S���/uyb����(�
�de�3?�%JI�����U6E��ZI� s����((�!#+��uT�9�����V��G�k+��������\�R���":��8����$���{��gi"&�D�f-Q~��
4��OZ�C�-�=������{�ie+B/��Ke�+� �f	����:tWk��KRe�q��|D��GkD!����~��[���_s*�Zt-��@k.b���="�2�Y���G{(h���V��^��������U��^�����>�}�\Y��P���q9;���x�TMAr�
���Gyj������#j���w���9�=������!�.����X�����)�,�#���P�R������P� �HlR!�`���\��p`U���H,������-~�EJ��c�pfd��2�n�[��������`��\�<�Cb������YUL����1��XY�#��"q��������5�� �Y~G�{p>�D�Y�z^j�6�3-�^���L����R��P@��@�W�0X|��\���}�#��rs���"��A���jS�!/����sA
������hY}
|c������`k����Q�"����H=������k�������}�"��w�V�n����p�n8��M�5,yV
-��6^�
���"�,Mt�VF�7��V�Q�)�O *��@��\�W�n��YY��&��&����T�g�V
bC����>�{��-�|�2�M����(�����6|�x0F��o}d6��m/h��������s���X���{��bS�IY��������oZ��$1�����H*9<.��68�)��>I�Zq6�N�z���t�jB�\���
�A�&"(���k<(=�J��Hb�������-*<���B�M��������]J��xP�6.��@���U����d-*�%�[q���8}�^>�B$�7�b
��l�+��x _�
�A�����7!7��f�/8�vCJR�y���Z��'7�"��r�M�%�|`�g�������	����[)B������0"?��"��Q�@v��CE�I�m��4�h[vR��M�#x���2�b����q�? �'A���oV<�����=�-��x� 2�Jg��7($�{
EmMd��qVb2�Z5��1��CoP7((�>1���[�����D}'��M0���Dq����4�����Y�h��>E]������~2����	��n���Ti���w�\\��}_Z��\L����U�p���?���W���\1z�S��'7���NX~��9'q�����Kgl����f���}�����6��t����$��gF��8��,�D�I�.7��gc��u��i���g`����%/���sw�%���CK�}z��^��E������m���;,j[
�O{JU-U|W���~��\��6�{KC��*�������������l�5�@7SD+D�d����t�9-�~W%Y�������QK1�<����F��}G0kP�[��Tj]��k�#0i�)V�.����V<�����N8�*_7���K�)��pP���"N{~�,'Icw���(:Q|�?�U������a"�SeS,���/G����5��8����_�<��pBLr
��mq���	���D�7x�i�����@c��"�nH���_w��^���v��6�_�
��~�������s��6��}�)q���K�t�"��'��xp�3�f:8�&]������+���T�����z�$$i������#�a����;d!�]��Wo*EY[a��,;�(����m��=�0��O�����q^��Z��o������&�g�B��]?k���c��%�I��������M�a�����&l�./M+���a�����c��_1g�I���8_<�NOG������q��@w���1��#(jhA������4��I� �i4��T����+u:A���&���0:�ms�JHLJ��Vb��������E��5�hg]��?���5ag-�Ts<����}��������E����H!�q�	1�'��|z������PVV����tk���t�����SOG�|�W�N!$�oY�K���,��c��%�Gl~���J-T���wv���.�����{{!�_�O���������������A`XC3��V�o���#x`2�:������9�@�"�����g������G�?�;R��<(��'\�Uk��X�_��Ay�OQFIx�4�w�n�D"��I�����!�=}��]���9=�b�I��������:�e��}��3r�ZV����6��^�66ne8W�'��yT��P^���n����|���2T�={RS;,����]j
�A�!:8Q��0��T.���'R��E
�%�d!$�q�E�xP�6&�:����'�I���N��j�v1���=]4��C:m$g�9x�B��X7��_�n��0p��W
"KosX���<H�L�f���2E�j�<��S�v�"&�j��[k!�7
�&JxP�]-x�����hb�&�R���#�\-�&���G!���F�E���N$xp�e\L�Q�� � ��*2x��Q/�k`���"M�6�E��;|����\�Hdf�w%$
<PUV���K1u��y��<���JI�V�8�	$�;U�FP6�N'<H<��]���#e��C���&� ��7T�; ;!i����D��z���+C�LzWx��y��6������>|�]N`��3����%��`��PR*��V�`�?G��us>��x&���D�o������8�a�~L;"�S,Z�	�&��m�-^�?}?������9\��c��#h���9�J���H�M�<pn2U�r�]9�3����f��x�sAo��^�1����#��u�k�g����EPPP���.>z���>�u�H��gh.�
Z�����c`�k������+x?9Q���G�����8��87�g����Tp��,�v����5�������z��TLn_U���n�r�G�@]Kgw�#H6[��A��S���0o��+vsv,�����B�%����}�F7������.�X[�
�2=�>����w����;��{9������7��@�������*�M���"�5RA��,<��>���MTPIO������2�4��7��$wy'����_�^	��q�VR����a6�+)!:!�I��N��L<����R6t���r��Bw*��r��;i���U�[����R��p��M�+�[b��_>�����[J
�Z@'�5���I���x;��r^���A��������X��)�P�R���2�)~�A�6��)((���C[K	1���$S'T��;�fZ��&����k42%t9*�����!Po��__��Pws���AH�}���C{�X�FI�l�z�
�=v,�.����P�����.Rn�B��=Po�=������s��ysy���HX���~������ho�<�LG�����z��7��L���(��L�	D�9R����N�6��B��P������7�����	t��Df|"N_���.H~����3(��AAE#z#b���5��AVJ*2�b��V
]r��� ��>K���%�t�T���H�	B��+P�l����0�<�������?�C�{k-���������U/�e�����T�-�w��s�$u����r]f#Q�a���-���|';n<�*���������bv��Rat�~?J���*+�Y�����e\;z�+���S�����_5G���x��;r�{�s��o5C-���9����~P�V���&�������QI��:�z����A���*F������q��,q�"�)p����O$�(wk�80��w5%��+��o4<AK'#t�]��JXx�bR	P����*
E����7����1��a���Xy��_��66��#0"��s��)T�
&�������='��h��w���������6�a������:���,�����
�K���(|���5����PRxAx0�nm4������/�������n�[����M�f���/��@����C8^D���B��i-|�B}���k=��J�����n���:���N�)�c���������:C�)t�k�.m���DvK��������LSEn����PLi�=��y[�zs9&��L���}kxG��J�m�j�#T��:������.+���p4����V &%���B?��hh�.����������&�-D���E=��g���1�}"L��q��!���`p�q|<8�� ��^��������1��h�iC�����p��������S<`�;����U�H}�^��AemU:�N�UDskC(R��=;�����+w�?��:�uD"��5���;����:U`g��L���v�v����s���w(������&���Be�r�
U�G;c^��C(�E�PX��p?{�]dV���H��y,� ���OO��9���2�]�q}[24h^�
��:��M�t����$�-�z�`G>8��J
HM�F���=}��|)���\��T�!�7i�J�X�����u�����xu5
I1T�u�����trs��?����*����|���2�mV�T���t������g���M��N��,aW_����g9e;����>;K�kT_u]V?<:�J�����R�������i��i���
m#E����i|^�o����J����t�t�W�=���G��6N�����x�o�
F�:����M��N�S~�;/]�c���c�&8�4���a+�i-k����N���4��:v}�7A�z�|�h����$ua��_6�OG\J6�-F5R�z����h����VE�7���j����BKG	���8�;
�g�"&:'�p����&����hD�g�{_}�����LL��o�P�L�����'��qA�}R���]����K���4������L,���MI����w����O�CLi��e��aL�3���-]���"���Tr���6W4�K���IhUU��at/�=��M@U�}db&�Z�b��k���@���t�������L�v�HY��o*&������p�U
W<hh�J������{��Mh:����D����Z��S�|���f����=�#��������z�r��V:P�w35*��w
4:�����i8�,c[hC�.�?"��&����T�Q*Yq%���<BQ����cx���[k*��lGDrZYv���	����C�*�P�rcx��C2=��[���j����u]�=mx^�O��9�-�Ij��$�� �4'i�������[_C��������5����K��b���h���.5k�|O�_@J��]�2�d$6��'q��R<P��Uo�o�wOR�:��"�����X���������9��
����m1��������!3=�v�B��jv��
�}�+���������{���H<���h 68��RQw�.=w�>o.$�}�!�IQA�B�cG�K
+j�`��`�.q��1Nx�����i��5O�_�0T��}d��=H/b0��\-hj�S�9dO��y_���:p�p��D�|����z/b
n�D'F����h��@sR��mYN����%�w���7��Z����C�i�����r��V��b�?-
m���D�@������j�h�hR~�+^�q?�6�Y�l|�^���������m5��nBh�Gn�	m����Q��=��,�j���
�C6��=�'2�mUt+�����<*:��h;��^!��m��j��{�Iv��0x����N& ��lC]%�J�I�R3���{��5�w
w5�������NG�2����35��d���vX�0O>$`{�|��"0����Ih`��k���.�EJ8��>5*�2\�l1�Bq�$
<P�����<ifP�v^���vP�4&�g#a�1(h�������
z����&���yI\-��:��aKx}|C�`����{l+���>k�4���v�&��xCmC������V��_L�<�t�*8p����W(`����������W���^���7����0�>�l�jZ��Bu��bW<(�&W�`R��<����������� ��g6x0pI/l�����]G����6��j	L� !%�q�\�`��������4��.��\�`��-X3�o�����W��%R�?B�R��y�f[R"��A��C|_FQG�>����������)�B���/�Z�Q%h�����[�D�ku������3��m]esKdF�B��#�-m�R�o]�V�^`��S��;;��o���7������������nU�P<P���D�"	�������������� #�xu��\-d�"��t/�����������T�#��/��b%M���"{�!��;�u��������t��!�r�JgE;}���Evb:t��\�i���PICbP!��QIQXy=�9���%::u.`u���P1/����s���G�b���i�!�XZ�r%#����7�g�8
7�>�P{�k��Z4��?�l����!�������1�����F�����|����T�uo���������������V]�������76P!;+:q���cXN���o��$a�?�R9=��m��'��	���?zunS�[GH�_�@I�
\�;��l��&U\8���&���.�Fr|���V�z�^����`�{<x�q�������0$x�E��0�z�h�y�3	����A"Mns����U����{�Q��7�wvL��P<�q1T�/xxa5�����X�4�����Z���3��G�.����A/d�x ��dN,
<���
������>����(u�U�|kd��Z9�B#��Xq�8:����O�G~� �$/7�O�8:���=��+c�����6�h���c)��C�&�Y����$)��Z�j�#q[��7�3i��S:`� IDATE�:��	� |�=�(��
�K���$���N�"�i�'&�^(����MGu�,��Ii�6,zqU�`@�����o�{����^����Ix`8��&��@���J4�1��f����&�����65�h����	:�Li38��9x�p1)�ba����yRl����MZP�n�1VoG��xLk��W���"P�$&[���>Z mT�6,C����K��F�w!z�OP��E���Puq�R$�������+iB�����Oh���LRI�{����� ��F��"r� h���G�I�xPV�Id"�O�����<?Ii����&��p�����"Sc�bP��K�<`��j��Yka�7������N-�x�!A��lTqO�{07JF�Pw���Q�c0T�w:<P�[��ic�N�F� ��F�4��Z��b`������L8{�(����f|���a8�k^��W����7�?�����V�)��_���x�>��tG���P�R��;x�S�����l�lF )M��K0G�>�a���;��M%lA�$����"���������
�O��MS=h�0di��k/���ax��4���PgR'x,>	������9xp������O8���b�rnI��q�I?����D/p�tU�������k�j�p9�(�mKk�E�w�c��)x�����/���m����Q�>�W}3�z��>`��������% ���3��#����~��2�t��]w�!����6a�)������I����p�����L�z�?��BR\�$�`�q��7�L/�;���^��Z�4s��b��G0��z���r2.p�O�bQZ��In|����14���x�27�9m�m���ui��n��
�$n�kn���]��l��E�k�`B��&��0�1��g{��zW����7��������h�/�C�p��L����4��}*�6���>��!�}�%����;~��]	H��
@�j�A/���`����6�q��6vZ���gbs�����44���TF-�����W�[�����X�>
�\�Yt�4������L$���������k��:�oaZ�?���JZ`�������
t���	O�r������|��?���O;JTq�[t��MuL>�
-m�hA5���j@���cu���p��M�Lp�/?5���Go�F�XG�����0"pgdK�����'��bzs{�}�a��`3A	QI��������6�6<���^����>l��\2��]|a��p?{���wI����|���*y�	K����5����������	P����5Q��
xr"
�z��4Gd��M���3iil��a���2���k
r������:�=_�H������l4�����lx��@�n���@��6�+��	�2V�s*����-n#��.�����O����&vJ�.V.��7S���)���r�%���//�<���	4��*���2������o>�S<`�B��j"��-�3x���4�%�p-I�%@��S5,9p����;p�����p)�ML0�]K�����^�����{��~$&��s#C����X���I��<�`E�P��{r����E82gz����V�F�S��l��0x�@�,���b�z��������(
Mm��T���%
<�$��[y�,
E��(?�0��%�H����~��?��
m�����#����6��M9�l�	<`q������>w� I�<h@���=q��D4�U�'�;�#�_���=��7���=�	�H���;�J������1w�e�3(�m������wiXJu�z4�3�����@ %�y������B,���~`0���@`i��q��0E�0t�������#��<K�����(`�M���4PW��,�W��������oR0��~9�S��`��f��� "��I]����O����:�'.�N��n��w&���c	U��"hS�c�������]g�Cb0���q*�0������k�-�.�q�wW��/W���*9$
����������I�?'1�����I:���6�IiN���$����3������<8��O(�>dF���>�]p��':�;���ILK#W�1�����������Sg5�8����xX��#�/� =�^
���x����8���'��2V"�@^g8x�I������$h�8�H��T��N�`���VQ��9����A�_�����uc
%�IF�
q��(��d���`ZS�6m�8� M(��f[=3G���$����9�G��c
�=�
UhS���o�G��4�
�wd��oQAx`o�+���q�/Tsl�W��b����{�dx*I<�����0��(������������m1�"�q��1�i5��6�v�1���K�0�=�����@s���>��O�HA�*u	 ����
1��X,��3��E}V�?�o�9T��K�`z�y�#p��Lh;;�l�i�-\%�$��{H��(� #9~���q���������6���C�6_���j#W"��/��aT��$E�0x�@�6+������x��QMu��.~� 	xp�u4��}��!�&|T]S�p����4�O'�6����y�Euta�����vQ�c��{���&&vM,��Fcl�$j��b��������(  ����gA��eW�����ew�=3w���w��d��w��G��XG`y;�44�R�V<`�m*�� �-��������`�o�W�?�w^~��u��f�Nx�����_&#��;��uB�%7:P�
�KA�}:@#B��gM����;�3���<!������,���6�O�����~�i�u��N�O�'�A�>|c����`.�`�b���[����L����	:�uY�NQ����!W]9���qoZ���t���x���m?����8x�7�$������Z��/���?����i��?���b�R'�G������4�������c����z�?�i�����bv���0:����4���%(��F���?{��
����ph5�@.������x��+(ki#��Q��AFR�'�`;�:�q�H�q��C���
}���T������}k�R�z#�"��>���{>�x`���`j�h���r2�_�G����]�I!�~�����/��C�^9r3K�5t$#2	j�l �D�o*P�cF�o����n�f����	LH�C+Y����PkN���R���F_;$�}����<��<8�+7��{o]�4�	F4Ms��h[-���2�g
s����#���8u�zum��N�
���������������>/\����!�x�\2>q#���������!�y�ek�%�a�O�W������v����/��4�}�qx�����h���lh�wy�85Q���j��l7
�p��+�
���Ph�"�- x`bQuZ�Ft�_���5�go�w�/���D�X�N�0����_�0K�����1�pf�8t�/N�;�`�:0*W�� 0��q���|p&l�6��u-������
=c���q��j!6"���n�lj����ajUU����]��5�f*��� ��a����|�N,	<0����c������0�o�
Z������������������e���<QZP�	�xn>�4AM�#-�:��r�����H��-��i�����t��E	��E��Z,V�����_s5\x��&�Ui��m�2���D��f���t2�����I@�'���Mz5�<��_(
x��k�>=�����8����O�X�����
P�����|�U�N`��!��{X�sD���4I�tj�la
���|��j�B�w,�rD��g�H)|A&?����.��2���Y"�=H���M�r](��Bb%Z49{������5j@4v,����=�h�b��������m�?�(�O�����m�<0� ��R_z�h�VDL�������+Th,�)$��"�!����[|����Q)����$R��^�;�4�V� �6�cHe���AD������'��F�F����^9�������vO(\�6��IE@�����05�,�����bb�U����h��
u��iO\��]EMeu�lY��	<���"�b	�`@CV���^!gYb�K)d?���d�5�]?�F��B1�9Ew0��� �c�#��)oi���X����@H�����Y!�����C*t��A�NU�A��/w�B���qi�&��8A��^�o��GpD:^�wA��{t�7	�GnF��&H0E�qm�t����oQ��iQ�0�l���>���6|F���+~���L	�Up<�S\�LP�V��73�"SH�HDmz�����T�'����P��N��5����f!��k�I�U�}�}�����'&�SShT��V`����kp�kCMT���#�8x���1���[��Gz�<"������6<��y��zC�EXQ����)F:��T4���O/�����&�=�?�{���4FI+E����5�1��0~Jl#��d���.�<I��B�����sZ�r�jAZF�������/P%t���+��w�
�@#lv��0��4�q�

'6[g������(�jc���X�~F�������5�~������,X�Z�
)"��T��6H*����M�����no���s��'�>x;O}���jf�?���\��i<8�~o>�����a���t�������v-I��cS:	���C��S&����%��0����������W��w2�mY��I����c��U��	T`����1� �9�<��c�}j�����k# &����'�w�����(�����Dv� o?I(xSUZ����{}7QA���D�C�i�r��oR���-?��a�����x�qU���4(n�MCUR�zyCL*q@8�m;^w�$�1m�gm�3�/��[^�`
��M#1t���B�P�7S`�:Jx�����I]�N��Dd mx=�T9xt��j�D,X�F��+��,
�v�����5�"�Y��[GUd�Z�����r�����k���B�-���0��T'�B6Wr���1�['8�J�?�������A�_��E��h\��?������I9+�x����	���~�����vU������;-*��1
]����M��e��tY7I^��}�T�n��qu�VK3��v��V��p�HX�uhn�����F����l�	j`3(a��O�,�i�mI��k�����3����P����b�����<`�}��8`�
�'	\�adc?�_�Z
�����=+�
�����6"��Yq����j8Fyn��j�0�h$~���g���hI����T���	���0)!�y�D0�Clf���)z?�3S��Cw��#����1���$��?zx@����Q'�~JS������.�4�9J'�}S8���j�);����Y[�d�g<9�`O���	gL
"�FF������He�8/�����ho�xs����SevynB;R������0���h��|�MNK��c��OE�W~��AC#���$����V������$}iN��kN��`�E�.px������E�$S���.���	:0$e�[o����=���~����{Q�l��Z����e�	jq���
���J B���g��7:\� �}*�	$����7����=`�^����r�c��m2���Zs��_<0��wQ��&����N��
\��&�q}e8��y�x��6�;�s�����<
���o�a��Up��#WT����\���$�@I��v�E9{�>�����2`;�)u���6�:��^�x�g��4��f�Op#���\*l4<�)����.�{r�`������e�s��7�\w4��@RI��7������3;��������.�J��S������Tl�Tu,�:�B��NR]�$���g�T�R$I�KA�A��K0���u:��N�������$�9�	%5Hr�p�9���bGC{
�������2��?�����	4��'��������40����*d������vP�X;x�������J�a�4��C�'K�h�h���?��Y�5�
5{[$��U;kh�sD�������@{�7?����o�U�<���LR������I�e�6t��>��
�]��9��R�x��3/[y ��BN�
9��,W{f���C1������2<IY��*��t��7!��BV�]3q���Y�f�ur!�!U�Q���:�4i�u�s�O���6M�����$W��j@P�S_����l8����g�o��sP�����$���kHkG�HOL�f�������H���'���i�z}�<��z#�� C����2�'�A��z$��UC�����;	�v�x���Hy�Hn�A%z?�
pC��,Wh}�ZxC���y
�W��W�
�"A�UR* ����%�G��RH�@��>T*d�|����re���A�NRz�u)0��4h�����=	���1T���
	�r���c���U��:�GM�Z�LQ���^�����{�W`B�FuHN9��+�~�>����
�� I��nBP�I����<�B��u��]x�y�����m�dOl\<~�6>[AAR'���	�h���7�B��
���NP~�.���a+�Th��*�����w��S�3�
��Z���e� X ��n6O�F�4|�JnH����v����:$���}�~���<����gW�0��W�Or���L���A���;��'�wR�P4�6����
�p����y{��WPx�q	�lDe�N\�������Cx�Bu�G��MD��h����/	����@:ymnnN�r�/B������1���h@T��H"R��"eT���4y
������o}f/(�"i�mH:jWP����D��l�����T��jS;���������Ixe�yw�E�v�j��@!L�S^L������M����T���vM�����&�<��\�.�����zH~�
��J�#0����J��6_��B#o��i��	-�M�`�w�c�HcXZ������c-M�`I�J�tF��c'tg��5r���
� �����
���I��D�G#fy��UI�&�"l�h�$�0���'t�7��I�����;eV<��'xD��I�&VP��<`�UI��^�P�`���O.�hq]�q�]�Mri��B��2�<y��
@�����Yn�����A��)"�$��C3&0w
*��x��s�����J��� ��P�^���p�+$��$��	�\?J[}��+��M�]7������xp�W���M/[���d��Y[5Q��A�>
p��T�E��{��
��k�Cc`7�)|O=���v��8�����
�m�Q�^_������o��s!�z�7�e�P|��&�=�$���c�`��'�B����SRC������A���4X����\���0��M�rH�4���Ay����$�I� +�s�!M���d>��L'u�Y_���a�2lV�>8��s�p�i*��_��e�iP{�aj�f�W;�6T���%�:b#)������&m�|��Y�`�x�Tn��G�r5���6<H?&�G�	�D����a�����kJ������W���f���'�:3����$�� ��%.k���00�
��{�����Xo8�\[����4tf94O�
��������ELr,�QV�[����������G����I�A�F#�|F����OQ�U�`�Y=V`��������0~��9�k2�IZ�y+�`o*����N����7��[�&������g<P�P�H�U���S�I�Y��x0��
����2�v��+� �V�
C8��������������N��x0���� ��0Qa���x���������GZ���*�Q����{�>�|�*���T�
��,��=�5r�@.(��] IDAT��(0�,/�/s�pkG2Z����j�R�)�s���l��\��jI��s���a��,�,� <h<P���dD0�!�� �������Z27
���S<P�T<�����I� ��E<� ��7�� %/;e��MF�^�{��]ET&u/�����,U����s�`Ce�R=���Ax�@�$I��E`��)\� <`���m0g�t�1���@i���^���>S< �R,/��v\�F�	s�m�R8/��^�-�m^Z��+�������^��~
����d��RGI��8���^f���i��g����C1v��	X�R<`jF���V���1��
Q���AM�Hg*�����X`���`�x��\	0W�	B�'w��`nX��x�\0������?{`:�o[N��I���gJ���n��l�>��Cm�g�C� �������]�j��^��/�"u�Pzod0�����L�`6���^���JA����
L`q�.����U�_�&�@�	@` d7�\�
9���T~�'�������A�6F4�!�%1\f�G(<8�{�*��^�-�bP������u�����p��j�UI���6�hY�j�iP��$�iN�"���K�u�9��I�iN����^��!V]�����x�k�`��w���S;`n�^?��%�5l@e=�@�4� ��������I�@�	���52<���\������$Tk��k�h�Nw�B^� Ti���|�g@����hM��I���0��?JDM��w�+GMz�d�Cb��>����������������h�@�#O���Z���Xz�Z��
��`��.h�X[�����&����90\.�	4T5a�W�;=�:-��	���������=�[��ER��Q��E&�+�<R� �$���CO�<2	+���9GI���_\� $�wEI�Y�6����g#�y���an��+m��,�&oI�A
�]<)n�h�]3P��|�
q���mSQm�$��Ar�Tk,MQ�)�X����5��lG4&����x���d��T����g���)x���UM��w�c���g��%�L
aQ�������Y��U<(��v�z0���t�5�R\��5�5���z�ZP6�G���_<�f)�����0�u����F9����e2:�:����?<�x`�_��Z�`���x�W� �����v�M.?�+��?��/�fK�x�<8<�fm���/��C�z]���9�7L���n���D.�(08���()��XR<��Azh0��#���.h�k�xr��Q��#�><� 5em$�9����lH�w�2bs�����Z��A
����Z�����4W����|�!#��
�y�[D�Bm���)(l�@a����T�!����|�I%���}��A�V�U�xp;*�.!�%��+�r�	�g*�k�	jm�C�H��`U�c�B�A��gP�_b:��+�\�����������c�����<��{c.[�i�`?�h��������������Z6�ICn�<�:�oZ7���'r��Z��m������/�^s���!�uC�^J�pw�0mR&�x������v�oI�\=���0�������b�Muc�KkCr��������]��m5�+(�|������ <0���zm���<\r� 2�Aoq#3�@M]�������
����[��u�_9�K���u%��X_=4�����x�����H|3d
����
������o�nj7���"<8�s"��}��C"�N���5KE!K����"�#a[���P����A� (Hk)���8���)-���K�Q��6��D��<Z�����L��tz$���S,y���1�G�`�������`I�!��t{�������u%��|������$qD�P�r=��w���z��-3��t*�"-�~���A��{��3:T��t�����M


����$�+��AwZd�L���$��M��HJ��U�KTQj�j��4�f�_g��CR��K�c�<�nl����o���W�4����{y��R"9�����"|����yZ��Jt�G������JB L��!r�;��o��������6��)���7�-&���nR��F�x�B�������4�`�{(�I.6�|(����������.�
��9C~��h�8���&#s�,�F�����Z�����T���Mkr1���+�����B�O��H��z��B���h���Id�3-$��@��%�����#n�f���q�n�z]��'�yC^���a�p<�Y�W�#�H��r�=Xi��gn|x�k�n����I�_�F�}�?��O�
�,%���D�������5m������)4�V��f��n/��5��A��[%�z��A�S/d�en��TRS�i�}�Kp���R>���Z ��H
�nR��l�h��c�4������U���8l��)3�A}�|�8��>L"j�	���"������
��.g���m�������nkIy10���V
8����A!0�2��[Y�M.U^C�u#��%E	r� Mh�"��>���j]�#�
����sZ�z���qm����$\����t,������i3^���W<�����1��i`�=��2��W��
�(4!u���0�l��%�|FD�<�a)�h:��6��~T`�S
`��l\/G.�����d�����)�
��>Zx���2�.T'��t�=�c�-�Xr��!&�o}��4��5�-�+/x����K�B(�#�*����&��Y`���	��8�.b�1OZ�L�i�_{O0� ��>$��:��7=����m�$!�H��L�;�t�%���w\�8o���N��C�������OvY���N7�I#^�#�����k�|�u7\H"����LR�xH�yC~�ASre0���+U��g���e�
0a^���pD%�pp K&���`B���\	a��D��YrH�+���3O���i�}�����4�^�`@jLa��&�B�[��M�����������S��N�3Hb��E�R$���<��Bu\C.�=��.��������*	y�$�`@�q��t���[��M'd�U�T����*8�x?�����nX`����*}o����q��>��u1��������������t�.g�O���73�U"9ZR�����*�{�L�t"%�����Y���k[���Cv
k:��mT"��k�;?�O�om�Q^�<������>G0�OOz~��Hr���<������;Z��B2�=N�����L�>6���mS��E�7�c�:yB^� o?{�����<��L������D
Qtr�Jc�l�V��h��6���@���xz��{d�=x������t�'8��}r�6�	zey3�1!���'��X�6�i�3%1��9`*,S`p�'	<o�����s��>��m���9s��k����Ri^��.Gn��r&���{��5'9o3��I���4=��`�b���~��G�u���� RS#����X��gi^�J������7j����xz^�*MT�~����`�d����S�6l ��������
�4�~7��6FL�-s������a*�Y`���&���cr��+��o�	�e��}A�r���j�
���w�
K��� �	���1�As�o7�l�;&����?/x�6�7�%�d�IT�j`��L�n����|���i����X�W�t~V��x��:�T��?��������f����L�A�����G�s�l7�����!�T�	8E.�Rh��a���"�6��7����H���3E��]�8R
`c�� 1wo��<�|lH�@*���x��z6|C�Lo����4�i*c�U���p�~!�6����g�Hi@�pfc��XT3S�*��$a�7�XHq�9�8��6�������:�~=K�]-Ed��U���c��X�f,�$�����6|��O���4����*�>-0�bJ+]jc%0��uD���`e|O�����Cmv��9D�����<�x��6��t��������C ���)�O���\�����������gR��+<p~�������0��T���
�D����{���������� ���Z�F�����t=��>D������?��w+	!?�`����9	A:/���:[�����I��<�y�.��=�8 s��U2*����/��cF���!����$����.���=��+$��u������}���;]���%�;o(<�&��u���q;�����l�@][	u��SE�
#�i2,4��Q}���=K���G�V�}W��6b�S�NP�;i���F�b��Tm�_����!�
O���� }+����_�x]"U#����mC-����V��W�����,I�q&�`}�q�7���,�f���1�&��������jN�"i��65q��:������=g���Y�}��||�x����f�u� !���Tl�Gn���X�8=�����xL.�����(5�9��b�2�rs�P%rcB��������)#R`��..��B4���gq��}+�I�`ny_s��F��G7��O���PY����B,"�]w�P�H>�|���M���=@W�=����}vM������Z��x^�A�/��sw}l%w�y�$� ��w�V���,Z(�}&w����_@��2�k��$��I���F�P��G����%9|U�9C^��T��Rdc�&��cI)�:5"�o���}#M� ������<����*r����*�Z����s����a��4��~�2�&�c>P����H�s+���������s�����=k�^~�q
,q�u=�T��A�����DI����D���U6�;�{�A{d{��7������5���[SZ���z#;$s�����]�/W��(���v��[����S�H@R:���w��gM�g�Axl8���{i�$��4Y�9T�#[R���~�T��]]����F4�,������)��s��3�����]7�xph�	0�� ��������f�=�k;��k�U���9x�z�F�\i�A�� �)��[7x0z�w���n,?����`����#���n+���~���Z�N5����=��'�=h=H	�b����"=
�<�x �pG2}����d�`�F���#�
���3�C�����������AJ
jUj���fHzx��E��e]����;�
�m�"��HiH��<�*T-��f��Gj�_��������bC^���vTn6��;[>������K�Q��Jx���� �16�Th"�
aV(<H�q �F�3W	�N3<`�&�|�S� �!R�T�q�� ��A��;�C��O�$�F�M4U����*�I>�M/o�^��Y�t(%�4��D�qr���)���r�	R`��y�� Rw��N�s�6�%�!����L���=I�`?��}.wi�6�/\������������+��������u�s�
��D��={�M�A;��g7~��)#G�mD:�&��|�VL?:�0��3|��{�6������W���=/������v�nL9�`
�	Di!N���,�Aq,����,z!�����������	�A���t��s��V�i�b&�'����,y�u� K�!MQ�����xP�X��E�'?�@e�+����,�<�%y���N +�t��1!#��*l��G��(��(M��T�����B�yiR2�i�#|�N�d
����W�t���-�����j�K�)?�@Q��<PTy�9_I�AI�� W%Qy��<(j���E��4���jA�z�i��A@�HGuRjPD�(�y�)��Bq����Bq��5mQ�Y�(���\-�nL�!�6��d��w��.�Px����x��������Y����QgI��<���#���#?W��S~�������\-�R�4��,��TI��"�"x���y��%e������@e
:������w�j�Q���d�DB���y���|����W���DZ���e���NR��U����>�n�<S`����o��~.���Z`�sy��40w	�x��N�iii�z����$��#�.���[�[�������]G��LB,�q
%7YnX}~^��Z��-�C���8x�<�-�q`��F�dNa
.�^�-PV��V�~EX�Kx�+\��K��|)KK.Gg<(�m���6TT�6�S|w�����C'�5kUST���[��#x��)�!�����Zd+K�j@<��r�O'�������(�����6�x��-�\/�qE�Z��c�Wqx�-�=������x �Q�4�Z�l�tL
����D���.�����TxP��>�.��l!���I1��x�SD��
<Hv��;R�LI��*��2�E
6�����D����4xPv,W���A�6Rd<P�u��������P���i<�o���xPr�.����(��%Y��AI���V����x ��
K%��YH$YH��7xP<[}���<P�
�@��<Wd?�,��Z@�tx�8�J��Hc%����lv��J�oC!��������xPr�.����(��%Y��AI���V����x ��
K%��Y������'[����FRLA��x�SDj<��UW�3,,"�����5��)YT�I�_��Ha9!��x��f���V���@+�Gd�[�TxP|
9�7- ���v���kw<P���@�6.��@J������@����VX*<(�B�~��O�������xP<�)"����xP�=�@��M�M���,���F�����Pd����066���b|r�����P�T�"11���011)4ni�ss�R�i)�~KN[��������� WJ���QE�-wts==�'(V�&������6����M"u<�m���y�t�|���:��,���������H1CI	����UV�y�C'5���R���D��Fxxd���0Q:�U%t�/|���?������#""�X����ZP9�������T��LL�fp�Tq�D�hC]��U�_m�/acV��j2������Ce�$�#Y������"*��NL��XY�=x���HW�(V=��X��%�����\=e���)K�l�K{�\[�$Td{����rIH�DB��\K�|�J;
Z���/��'N�FT����*S~i�J4����4�GQ/���(j~%?���N�2����5���P�B*��	��=t���I��d`i��Hc��q"�"�B���~��[T����T���*[AU��\�	_c{�%�!-�m#��P��q]����0c�w#|���tY�#�P��������^���A�rF��[�WOB2��Y��]��E���#������9e�=L�!P�H�{�HT�@�J��IE)�$�#�i&�HW����z�P�"�HmR!�`���;V)�J�����-�e����SL���%� �g��!Ok/���4�������x���e��(+��{��Y_s��t�^Y�2�����,�GY���~%�G����H�iV�=JO{����0?,=}��<���a��S��PhEX�,�G�]���Q����GJz�.�ZP��'�Yf- �%��e�A\V^��J{����0Q-��)g
�������������gYi����*,,����������"z��y����0?�������GY�����^.{���Pv�)"eYha~���!{�e�=���PX���+"eY���J���gE����`������P�z���:������d(�T���'��X,��F�����9��=�U�<�)+������,�F7$Ei/E����B{d� �--��4a��+�G�i���Li:UU�J�I{�����Q��!m��,�G�5
�QXK��5�rW����p����#%q�_fV{�9Ii[3��R�|DZK}�xB{|;K[JQ��zO��~�����9
�� IDATZJ����|�Y������[��_z,(�C�z�j������(�QV�#�%K�=����KB������o��Bd2K
�r�����l�iV���![��TYi�D[��We�=��|���=J��!��KO[���������_	�Qz���<���z��See�J���>UV�#e��(+�Q�#�|�t�Uee>R���xP���P�Rn<(�*+#a�Z�})g
�������0Q��E��_Yiaa�x�@���J{���{F��+�!���������GY�����HI/d��)+�QV�#B{��g�'��0���y�RV�#�z��z�|�)�C<�O_�W.ee>R��u<�W���OX��ujV���������_t����HKK��f1f� �P�*�yB<L�H�}}}())����c���J�IG&��k����
����60�����D<�FL,2�2�M^`��D|@�\�b�*��1Zr?�����;����]^�JnJ���y!�mE����%�G}�����	�QT�r�7Md���8>�~�A��G~�P��)�g��T���������������Y��U`J("�#��WI��X��U���kA���ZZ�P36)v}d� ��a��L��H�Q��OWM�j�d���Y��HE<�{�T�"�l�Qs$�n���J����G���DEBM5����/m���9�����X�*�t{d(���{���_�/1)v%�����]��~0T���.K{����/�0��
2e����a�!��r������<���8Q�y�H�klIX������N���@����jPJ�tJ3?,J�9��3�G@������.g{T�����3��&�@ZzZ��R����G�$Ch���5���� 25�����~X{d�����������������U*�=�������z��l/��r�������)�H�K�)�,�����\��m���R*���>�k�m�Ud��f�B+]��l����P����������=��#��"h�����}y���T(I0G�T+��	0��Jek�r�_OG���K�4�".:T�D���!,!E���b"`���Tq�"�9�	zU+)MIE��Y���x�/�$���Rb�_-�j^v��E?�]psC�~d,����(E;�_Rx9��V��[#��z���t�j? 6E�q��� W�����J��lf�fY�^�wZ��2W��'����]���b[i���T��}��)�"R�s����;g>��B%&\Y�g�.��"e�Z�O�=xUz6�d���9��j����KX�d���/���J�@
c�w--��Q�������?f����RX����'�m���J��R
�P��X+�?2��J�jf�M���E�>��&���"e�,d��-X}/D>�&<GLR����S��\����rh�@+�]���O���Va�d�=�i.�
�����K�:^CCG���N&�|M�t�^ ��d�>i�t�_[$�	4�Jy����[�8m+����HiJ{�e����(�j�2���g�d���n#h_(�{y�������2�A�Dx ���4�J�xPF�S�(�
�@>����1o.x����\���������m'��l'�����~_�+���xP|~���KYZ�r�@v�}
)�@��$���o~����v��m'��x OkJ��Ho��b
�A�m(� X��X@���,D�x ��x���Xu�t5�0�__��q�_z�|A����o,8p���������d�3���������HN�����#s��*<�0�A�f���=C��Cnu���AW{{D%&�e��8��)�B�vJc����o�����{w�q�
B�3OP,������9?I	
d����n��������	�jZ��_y�1�V�W�jEJ��+,}��{�z���>��'�.N��2�W�<pl�	q��������_�%��������!�����`z���y���<����P��������� j�V.�
6���
��{�������o�d��]Q����z:����L�f�y{��0���1��Uq�����9
2�E9��B��'��Yf�*��/ &��IK�@�������bz����^���*����x���3����v//t��E��R$x���>b�����.���������A��SS'��
�,��56�	FxX���y����L��_c���[Sj�^�a ���KES&Y2|�]�	�w��������Q8}�!oj���#��q�����7x���!�r���g6aC�ir���t������8�+wM�PO���a�1��6l-��T[�/d��k�����x���dN��<��[��#-Z:U��Q��������C�K�wK+x��W��p�FN��
+�������x�\N��k �/J��H:���f��{�G�[��C<��Iy�/
�o�'[��0��.�#�mn5	m3�o��X1�D��=/��/�x`�h;c�zY�F��O�RS���N�q���f&��|�0����q��E�s��xP,���_x�������%,�M������������9�|��Q�R��*���uj�Ry�"[0�|�����������'���v:����g�������'?^�����K���L�1�oW���a����w,��z�b�����wc�
#$P��@�&.�<(�D2G��M�+���	X2xf���qh,*
'd.�50��/���,{f��<p��.j�R�Wx0��8�{���Y�R
���3_��m��8xP���--���#��M�H�^���#4-l�Kx���=Lo�j*�9
,.!m�%����^#W���y������7i���|N
�<��|	U�"�%<(����B�.���y�\��}�����x�&q��T�0�OE�z�MQ��\q����W���<�'x�����c�����%
��z�f�� |�����-��� L��������Z����c�2�YBqAY����k�u��<_��y��;��Q�0m���6A���	�0���A�i7���*��
��U�OFc���u���3���\hs9���%ue�������_#x���<{y�|�Hu��<`��o�b��=88yz�����p����g��T�������=����l<�����Z���H�t!�e2D���/,��������^�<�Yf��L�_@p��a���0������cT�_��9s��8A�c���_x�r�
I�)h��	w<�
��X�t��?����b��PQ��a�8���}����9�\�I ��L�p��}��n�������sv
�n�������_[�b$����nN���^���a0��gi�]���4�
����q�����f�@Z��.F���M^E��*�9	�+�sU���2�%|���������xn��E�'��_L,�����q��2Jt_>[�"��~`�9�	zU+|
/��k����M

4��e�o�B�O����{?��	���0�6������<G�&�5��w�����O����~�O�
�T-kW�����fh+S}���*�8�
-0�Qf]������T
����w�<`��	RB������0l]��A���H(|A���������N��0m���
}+c#:U�MMtp�
%e,9z�h#�]m�44q��+�=~,�L���{��r%to���F`D�E�^N�����w�pU�U'Oca��x�?���ucFc��
���)�I;R~�Xq�$��{�]���hk�������kg-<p�������������v�?�
V���i�����
����k�������mS��Att����X����t�O�-W�z����.]��{��v�*?���u��I������g��bE����}��>>�4�$�3)�|�ZZ��	��zsIUB��K=�.��8��������fMh��7��RR0����&<���S<{������������hA�H	�?�[���A`t4/��c��Oi�W��B5SSL9r�+���%��sh��yK:���yR�H�/:�>�U���#<H'��U�"*)&�Z��qL:s���K��_z#��	�7�Y���������Q�*�n��;������$�m�������
RP���auj�)�~����k��H�kc������1�iCl!����x~���5�����(N���[�*hG�qOo���cH����������>��u�Sq)b�63AORT�����l|�����d���zGP������t~},����x����5�0��M��5��z���b�Y5#C�m�c/_�a`�	�9���Gm-� 	<(_�Zt�H�m\v��f���P�~q�Ww��!�y�!t_�8��"C���������I/$'�!U���3ab^	�z����.�����5t0:�F�\8�c-��3?�c~������=���l������C0�Sgi����?�1�8���3��9�
���!0���\������c~����{�2��������>�6��Z�r0�zE����fa	�.����m[`4j,�G��](Q�PRS����#��1dP����ZR7�$������	��0//lCB��o�Zf�����C�$���t*#��Z8����~����vl��.��!&]k�!�����(�N}`R�F�6�����D�&�;n��?�{�����Y;�{�����-�H�������/�������[b���!�,��DJr"z�\m]��v���R��E�F��H����+����'��`��j�M��]�1��-�Dj��o��/N���!��Y��r��sDU�	N�!�Yx�I)����W4x�������	Z�2�����j����!t����>�}����aAJ
������=�C[C��8F��/��cA���RW��uv
��-�
�C���� P�g���
��8�����ak�������ON#U��0��,��{8f����!�\�a@�rhR]�q��\O�3��~M�p�U4��(���"������Ux�7�yi;X������x���[�����<~����A�B�������Y_G7�����o��xp��
���2�w�	�����v!%3z����"������p�1!��o���9x�>��<�=�{W����x��?�����T`���.�U�NHZ���}i=�������4j��������]��b�HS�'p��
���A__��~�nmme�tU��~��@�V������(c��@������JC��&c��P�x0���X�����T�5���%8��_
��f��`1/��Y~��Q����MJ��hb��w\�`�3�t��y�_l
��0���.
DrJ~�iA�UJ#_�����u�1p�	/k���Dy
AJ$��q�R4f~,��Z�~�����0+��s�#y���=��Q�������s��{zo���gd;��x������a�k���`�>�3��y�>a��e�N5"E�7�?�[���0��.�����1�F�`����	
��m;���L����b��S���I�0y�f�l��>�����D����6�+[�cN��t�ia������
c��,L��������6�?�{��	Pck&�����Y8�����ac�����W�Ic�:��"��z�+t��=o����4�_�A5+�9q��}0�oOT�{�)���������P��N�>�������B��<`���7 *!�"���NP��Apl��7ABJn�y������5�A��>�gh:�5������-�Es����z��'��B}��p^_iC~�l.>��>D�J��M��s1`jFt��%@SC��4@�4����48T������yf�2�� 1�MTq�|��m�V"X���s��+���%K�p��|�A�N\��eo:��U4�����o��Jt�5t��y-�G����X�l��Z/�����t�x�����.����&���1q�|my��h��
z����3��E�sQB~������kB����
�)P��A���������C:`��������}�9�}�K���9B��i4�����mmA���%4h�D��_/�Z��T)�K�5�m}����2���)���\�y�$?���3��}���	�-��Q#���#Ri�5w�?�}��M,	<0����.N�����w8�LJ2�9b�r�����>�`D�b�����������K�
��������c��w�����Snq���x��������R��,������%�����'�������B�1�G!����o������C��z�i��`�U�����!NC�_W�=�1�n~&H?��<(�]��J"���=Ws�����"�����Xz�/,T�����|�-4��!��Ac������9����N?�
�{7�d�xZ�����)�\�@s^
L��?�?O",&��v�
7�9y���d�^x������<~l�^GbQc�h��["�F���?!!4
���x�!�&A��_���T#$E��c_�N4��E�\�@MK	j4�	y��7�2�6X��k#� ���H%��4#�����e��R42� ��B�j�n_J4��-sARX�Fsl�>��}�]�_���S
�V"�x-U��T^;�"��/Zn��X�(�9�	C{�����m�"���Ez,��4>����H�8_�?��Y������*�!���g��S��������1���b&�[�-=�������Z�6����.1^�:=Q�z;zV)c�������o������wa9d���cK\}p�A�m>C�`���1t��|������5��\������t�������p��k-
�<=��T��NGS������)��biMh-=X(/2�wU���+����=�fK��
^�ze���>*T�x�a�Rh�ZR�a\���@��m����m�w�q��<��i�S��A�����������"|u�A��?vG���GP��
�L�Q�f5,[�s���MZ�dP�4mT-�����A_O�f���%�������b�v��an�{/$&&�}����_��-�uj�u�g6$-(;���?���jDF�����5�g��/[�/�c��6Z�~�;����^���+��L��v��~���]�|���j9j�juM�:�:�������N^���ATsh�{��n�nxp�X.�����G�=�xS]m���9�8���Z��z�Z����A$�%�YaN��_B^���`z'#�O]#��ZX�����?�A�'�\m}�Zi�����eI���EC0y�qT�0FPx�vk�Sw_����%2%�*zj���><'����".�~+->�����t���/G���I~W!�L�/W�0e�VT�����H�i���t�}��8<c���
5i���:wv����sF,m$M��	/��q��M����V�5mJ���� @^���SX��W<��E���������6�=����
�?���,�����=������	s���1xfm�-�CBR.=p��������4�E��=���j�3���������a�O����/C:N����&=�x�u�@�"�
������mXnuu��.]���m~r��n�BO����@��n�;	&N��::�������	��	wm��xS	`��2Q�x���������r�v��%/b�7��I�����
�Q�W<m��������9�F��Gu���	sZ��Nqg�<���jA��8�[�<y���T/���&<`�\��?�i��o����-~8w�;�E`,m6�f��&
q��/*�2mB�Ns��[6�P����}+�{m�������G#k0l��
��[�Q��oL������^GD�7*�Z7#0{���l���LB#Z\��������6����+��x�6vi�g!a��.��g^�fI7��%�K�*�P����R\*{�YK������f\��zo�,p��}�v�e0�`5���a� IDAT��������b�'~:�;�������	�;���Y��\Ax���,��op�'����34���5n����� �����'���l��]�:M{#*�=�����}���}���]��WwBD��Qa���S�N�ri+N��O�Bo���D���B/'?��U5;4�Pk�\B��x���u����Q��6l��gN��c��L�	-v;�����8x������o�]�6�>�n#1?� ������jIn�����Q���d���yJ�H����O�{�����}�3�75"z;#b�.�Z�E:-x��A�Z���06�P[eE���{*Y��PhR���<+�60�������F�Q��M*�K;P��	���:�E]����AS�=~���*�����Oa}�n�&e��Ht��|O,,�����k6���Q���z�G������a0��C�|q�6�Z�E��K�m������A�QK�}�����6��aD�9��^���Nb���Z�0@�*z���G;#�����@L���6��h����rx�;(����c�E�<W��~�����E'$��`e���^��g�,��J�8���;DPD0��[�����5�v�Uw���s����VPD�K���D$���+x��>�����3��9��������QN���F8bm0����6�i���e��'�S=:������le
�g1J���H�!�����3�e��@�kd���<�Lm]~��xp�n8����u������m�K��63����0,���ak�e�A6\��x����6��� i��Zb����py�����}3�c��}(kiD��l^Z�o��6m\,��\@ht�t��_�/`��6�c�9|��%����84{ :L�X����>?�`4���Q��w�1�`�4_t12�<
YH#��J@�`�7,!�q��#-��p��!��D��Q4wXB��S4whG��|���7=c4h��)����0�B�Q\X<X��-f���lT�
GgM�q���pL�n�M�B��>M�qM(Z��G(�I��E���}���k����@�io�3'���1��L�		�p6���r{����#�x����X��d��;���)3��t�G��`Ap�[�����H��d�,�����C
�]�~����80t�fO{��������Zi_��8v8
��j���zF<%8!�e�MT�	���w4�u1��TLv<�|!��[���F�Fuwm?�z��*Z0����.o�$)?�@G����0fY74��������%]�L������)�:�������d@�T8����.C�F����C^�0�[g�'0������Z��)8��B.���><�p��<��M�M��)�zzP��P�M1���o�v�k�:|3p��k�7e<z�_��t�7���$8��������7n�H��:$��R[���O�v"��������-�q�g[��v���
F�^���y}�!!��X�=����r`A��x�6@��\�E�G����hh���	lX�
\,�1�~�Vt����x��*� Hx��8�������s��c���IRA�I����b]�ya;zTi
���oQR~�����t3��m���D�O����.�?I�}��5�����e�Ke�y����tq������O���"H�B	m<��
Bm7M\�����Dp�F��8z)���t�tp����<���t^��"9�`m��c������t�h�f��a����Q��cf��Z������it�C�r��$�'
o��Ym-������4����5���������
�j�M��o[JH�z�G��w�{������"4*hUV�'�����ZF�	)���i��xA
����fK$�o����z���������7�B�J$����XP�y�5�����6����5���6�~�����}�
h��?�o��&��"����4�w�m�z��<�W�
UK���.o4.o��~�E��x��������>�V�U�*8������>p���Nk4�����s�-q���v0��a���?�W�\���5o�q������x��������&����%�f�b��zsg|NLE�Uh�!@i�-(��q� a�]����>��0$R��������E�����
=Za��K�5�#�*A��
5WxP��4�&o[Ms��4O}��5k�������&���N���	B����A��{(��Y��5����)V��_h[rf(<�m�E��x-�=u��Z�y����(X���A]n%�u�n�
G�~��x=Z���
���\����6��(_����k��S�8����g�>�?58��l��]zVJ~� ���.O��~�z����L�b�����a�����K�\Pmf=\qY���*����'a���H�AjP�/��~Oz���
k3����v��P�����a4n A���s��R������`d�8��4�8����3���9�
�����y
������vb��(m�D�����x&xw��n�o;W@}���{�������]#98���9��`��*�������;���
j*do��@���8^������3�������9��co|�A�f��X��&Y�c/�5Mvm��A�E��]��h?'x����������z��Fk��%�����R^�A�=��3r��X"�c�W^�:�X��G��
;��k;;s	Z7���G��>]�����:&s�i�����3���o�3H�)�����E������Ob`���L80d�,�Z�_H�+1%����L4�}X����,�[�S������x}�	bh�����C2�������c�q����k2�w= 
x��j"�m��p������n���I�fG���+����-��<0�T��������k�e���)/�@�H���gu��_�D�r&<(�1]��MR�����TpuO4>[X�
;��m�-b�&�>)�ib
5R��Y8(�x�lk�a���:8
���j��t��~��q�S��.���9L�X!�b0���i3����(��pXB�����]�W�<`P������^V�<�i�;q�-P�6��!�����L�&m�<��\{��f�����h��L0�{���@ .x�G����muZ�^t���I�������0��X��j`����q*fm�?�	����od�SG��{/	T`����^����������������%���g��A~�ASS��Yo	*YOjL�@�6��z���]1�6���qVb�3HM��������I��$��t���	��)��i`H���	�|@�2���r�ew�>\���g*�:wF-l��Qj��IMat��t�8F�SSp���{������l0���"X���{i��YejS^g�	18�2=i�#���"��<`�a���^�A=
����#O��J���G'����c_R�J>����LM��k	`����/�g?Ut����HJO����������Ov��<���)�
|�vlh����@j
7Iy�m�[�hqEV��K���yC��p�Nd3�`��[\��m�0���)G�fz��l*���4��k]W���
���\L�p��:x�u��4������#h1|�h�E�`V��>.���(��#s^��&������Mu\<��jd�OhH�����W����u��7O�����
-��.������R����N�!��T�������W��c��j~~�;�;�n=T����^���
�P�LY�����+���\�0H��A<���Ny���b$����	N�=~�N�B�-mV��u���0�?�?5{�Wp��"��I�����u)d�Z�!je��L�B�9R�a��96�?P���<y��At��vA��
�����U�v��V�p��j
�J`����	��IP���.��}���[hS�=�t1��y,��E�N��������0X@q���D~��P�R=����.���!m�<{x	B`�A�SI�`�i���N�^>��:��
Ae��xBcQ�(��{����N�Z�v�#BH��6������tQ�6)���s�m��xMB"������v:���GinE����ZV���b1m��X�<�����0����%8 �T�t�D�
�]�����4���L�����Z0*����C�zf#���~����4�X�2a��
�~%�T��x�g�w���(a���#q�^xv�7tsq����gp$0���L���I�Tx�lk������4�\�yi���	;��A��v �BC�������Zb�����9C-������
�4���x@��v�x+��&5��d�O���?h�������N �+�,���+�O�����4�xIjH/�Y��1\%h�2AUHA�$*x`������p5������#H�iYiL��NX�~��c��Q�ir1N��/-��	*�hrU}}e���#e<�M����(��\Z��9u�[�%�?��Sl:?9�J���c�p3��������8T%U��x�>��^R\��R�]5�x����2�jj���:�*����2��"�N`?�I@���nD'�7�%%��l�����}�:x���M`��*�'��B�i��wm��s����	?�Dq�(;oA���BwZ{{x
�n���_c�BO���<`J�:���v�X��?�8��.��Z���������/��l����#0�@���p0�C;�� �:�Z��sSvPi���V�KT�Js��Dc��\Aa���	�A
�o"���A�����Gp���K%z~����7p#8<jN!�h~��1�7��#��#�'�2�4�Z��p�?}U�-�R���w��}��%\�l���i�� j*(��e�>���e]��BM�x���J�����{���RS���~��{���B-$��z��L����+xI���&R8�2�'j�<`�����YY���p�'�+�x��x���bG�rK��D����KY��[1��!��D���\����
:7���]����Z��4����@���&x�.�I�	`b���
�r7cJX��tfm��
P��<�K�����p<�*�� #0����nz������&��DM��*0�������q����"��+$����K����+�U(�+�z���/�b~�4h����i~��6�E���|��xaM���)��e��<`��nmG��6���a4��}:���*����\�m��v?���y!���i����	N�F�v���2��
My��L�J���Zg}�q��m�x����B����[�2�4[[��}L��y
8+��
��������]R��^
��H�I�]�V�����,4��T��H}�� u���o��:�C
:�H"�@��}�*�����(�u������+�]T,6x=���������zN.�f��%Gwg7k��9��d��R�n�D�w���v��s�,�s!X5t<z��9�}ml�pB�K��
*t�E{���`���r��/�B��&^���s/=�[	���N�.����!�`Z�>AN����x��NE���q��p���A��$��I��AV�
]t8����(u�@�T���i����g�������!^A(��2�?����^��C��O���)�:�x�:�^c�<H�����A�M�z
K��7�pdo(�V������5���?��<�<�a�����v7w'�"��m���#��4�R����T��0��j��u@v�;7�O�����hQ�/"H����;�B��q�`���_������}c��>s.S�KW������4l82���3T�����6��Z��)'x����*Z�
da�N�<�A_ZczF^���Nu4����,W�%��t��{�����*<�
��8��n(A(���j�A�w
�6<<`�����'0�W' ������O(O��o�A�����LY��G-��r5�x���u����q=����M�ak�)�������������u����h��Bh�y��S���p��	���9S��$`
-���2�r�;����u����<(��FR�����!?�b��oO{���H�*%��1|�6����+��ZW,C��Ap�2A5s,����"/��t���x���+��v����K�g0�t��b}-�|�k�:�����|Y��c���>6���-j�+��Gt����j]N����
���+�.x�j��J����550�!U��KN���7�W;P�S}����v��CQ����a���t����I��<�h3y��q��`�2���HS%����?E��,�T<`�]-��C������L-I���(�|��N��?���.����&�p �!W���5���c_��(wZ��G��9�.n���J` A�����P{/��<��!�6gn�OM���	��[��,��[��� a+)4%�o�_���
���`�6��>[���nM'��se�N�+��H�G�2��#��x��gO���mI��A��Zf�'h����q�6�:�0��d��V��� �L`c�������=m*��p���xzb��s�M���R������a��#�@�l��I��60��_�r����Ah|�h�W�����^�w��^���)�P,dAi:Uv�s�8W�ar+���L>���#���5m�a������P@!/��I�oI��),������[�FD����>F������6M/�E�J�����Ww�c��i^��)��R.XMu�?���A��`! F�����z�R���<WiX����BN����P'H�������;������OT��
lKI�G0/����?�Dp@U��uG��G�0Au�x��[�P��`<�s��
���sy{�Q< ��q?��9S���p���h���O��[3�~x����%I����&?������GO���'&p ���5jbm�7����������Y`)���&m����QR~�A�-/�P��d��o�4<��r��(0��Z�t�}�Q[i���,����AC�]�������O�N< ��r�����Z�I�������;����>ys����$�+�x���ct�Z���;�0l��>p��-,f)FD,��elD�+?���N����tm���u3v,�
��u�n�7N�s�}����0,�V<PS���T��p�����VL�|G%��x�F�@Rjm�%c�L��"&���@WR`�<(TB`H"����aX��x�I���&�C���-?;�/I'o����q�
��E�F�>`G��s�8�)��8`���&NJ��l <Xy�:��r���
H�(:��O`
&e�1xp�>m��c��<���������
���&0\����!�t����+!<J�J	V~�x +�`P�Z�p�&&�h
��i^Z&<X6�#��HR�q���*�(������37Hd�x���f]���Z�8���C�
����4�`
�z����~�S��[�`�7���j���Ag
����i��H3R<�C��,�"9����A�nF8�'�o�?{�6�����3c��D���W'���d]Wd%y)�\o���y����$qI��<��w��Y���vX��a�a30 ���U	`�Bn����:�����?Ja����������!x��fNy�Vm)>6m�����������I9�l4ll�p�&mT��+��^M��B?�24���`��s�*d�4XJ�cF����������t�8�6P��e�Q�� I�<0��uNvUp��4�������b��
R�
�����`�Z��6����0Os�7nbh�����C�0,�V<`�@����4'f�?��Ma�����>|��f�q��a���hY�
H����6�h��d�|�g���e;oSU`�_�iq��}��x���?agn�QH�`��Z��5��SNxD�x��D�7��v�2C����B��(�k�+Sc����f�fR IDAT�-�3����u��A m��P���2�pRF`�+��['�nE�l��~���AW�FR�	�#P����_zb��h�Y����!ib�
Jj��J������6)#��S��mCm���:�t0�+\�I�u�p�r��A�*�p`����IBZ	'��e*��{2��������H
a),�A�UA��8s=MI����`��z����x����Q�Mk�����@�1}�);HC����B���j4m�t�S����������(��&m~1�Q�����d����%Su�R8��K�0]U�S��d~u�d�� ����B���&�D���*��B
��Ct���6�Y>8<�+��v�`����S���������f��7/��������4����N����(�"M��
�`����v8������_�m���-9x���{�A�/�j�������q�q�*mN��1-�`��-�����T�a���e�H�R�*���x�'<PoQ�B��������t����n��,�����)R<�+=����E��������i�	~��Nk.�����Ps*X�F�F�)��*R
s����m�kN�s
7{`�<t]0�+|o���)$}���	�oG!>&��)����;����mRC������,�B~�An���0���(��'u[�l��:<W�v���O���`-Kh�jr)R�mJm�9���x��>�W�p����O�da�������.T,���h�F�K��S���,��N�W��������`��Yhd�ff��z���+�"����6u �XK
�eB.T��{����
�p�+������!|J�B^�AN�uUM������|�2����aR��T<����XC#'xp�_����x���C� ���z;��	�||�0R��l'�����,��"��Yt���W�DBl��Y^�A���{��$&�@����.|�GDv�:�:�5���_5���(Az��h\����t\���<�{����]G��H��E����E�;���(SM���B7��a���������fu�N�<���3-�"9����fw�N�Uw�<�v��5��4��{����o7����.2�g< 
x`DRC�{�XJ��p�b��N��#3t4�2����G�~U$7xP�$\�Uu���P��7_������������=_��72_����.��AWuTk�����"�^���j!�c)AmM�Z��n���`[�U��-�]���������y�V����8��@2�z��A��/pC^��=k����N�*b��S��6��
��	����2:�uFt|���/���R<P �S�i�iJ��2��j���P���m�`����������i�����1E����l�27��RQ���-��<�-��);vbD���A�Z�hB�,�����aI�����/���<��^�N��#}���U:���Iv�h���T�#��o>{����'�6l�<��X������6���&t��s�I���N�1�!�$���;��X���$-j�0������g��N�D�k���kx��,�]:5=��4�VD��'��su*7�����
x�Nq1H#��?���0�h[��p5���G��a[(��hZ��\����x����v����x0�N�0l��w
qP�|�8Qx���j����"��S(`
,1����g�_���=���F`JL����X��)M��x����n���QX��$���;0���I�3��)%�X�S)�B(�w����C�0�B7L�0,1�`i�xJJ����_`���n�[��80`����"u�:�9��d��G���3�N�(�����^w�F��7(���n�3�+H��A��^�����z��J0�� �|�>�L�|���X���!0*������v4�L�S��_,�����1�����7���H����T<`a
?���(S
Z�.M��KS(�?���M���X
�N��*&NS�s�&E;�<�}��X@��Tj�]Rn��.Zd�� ���K���]:�Jq�i#|A;��)���h��1t]�I=bhuW^OR�XF>��6u���rf��R^��=�NroDsu��g�A[�$<`jm{�N_)�#�GH��0���d��1���J>7J!)��[&�����	��b�A���u������nz:ml�����V$�6o����A�Q��f�W��<��7��V�y��}��~O��~�l#���F������b��k�qx�W���H@�)�L:x�4��Tv��6���{�A3���qr����D_����=:M�C��4<H��C���?��	�Q�
��}��"^e�A�����E@��a����s�7�A����!����+������EM-�Rh�����r���_���wOi���Nc�qG6x��9������;wR��X������T5u�s��a�����!u��0��2�q]l���
����/��1=�~M�l8�������+�m<�qM�@�6Zs���C�Rh�o6�(|��&S��,V�]�Y��8���\;��]<p�6yXb��O#VPH����5��U�)�1���B.���y���/��.)"��m���6r�Q���O�l�>x���7�R1`�~m_�b���=;w\
Fm:5�v��sz���N���R��]/aHyY�
��B.'����)9��C������6W8���}�a���b��U�a}��5��J���
�1��-���@�+�;�a!�c�Xb��&A
�6Se��J*PVG��;�-�������	�����)0��bVG�Z��Ome��S���c��B?l�D��I
��)� �W{k���]�����������s�����m���yuG��z�@�L	O�r�F����;����	=h.{�u+��]"���<$��S<���O'~�����|q'�Y��s�|}��I���q�~�G��@�x��ma���N����2�`C��{�
��Lc��
{z�1U����0��<����z��1g<���(��C_2�\����
e��-��?�����
��B;��H�	}��
�����L����t�
��.��0L%��{�����H��%�,�3���y���[^q������-I� +kb�����@!M~�Ta���?K��c�<���/0(`�K�0x�,LB��,�
��oRb`���?v(�Y�v����R{�	4k���
t�������e�z��s��b�3�b,����OF�����p`a+
J����24��|��4i'���J
�������8(�
��H4��vL$Y��o��O��a��`Zs�4AR����>)x�P,<��7oq��C4���G3O�2��m��q�@��c�oF��G��00�9�*�	��Ri���
[0�'�L�|��[:<���{0@_z�� ���X�����r���s`~�"��))4�D���]���>vb�4<|������ W3���B����S	Z�������mf���>��rH�)1�"P�)4d]cNG���r�R!JJM�9�)����������n�F ���1�N��zx#	
dyY���2
g�7�x�{R9����y��4�����#�����;4o�P�>��?�Y-�VO�O����,,���'��������w
]Z���g����h^G�+
���v2�6��iS�����\�� �o�2A2}������?�a����B0�<��r8axw:�����s��e�H]%���V�����bm
&��,$K<�I�M �sV�v�sc%�o��y/�3���`�����p��0��V���n3��)�
p��Sb��o��A����a;[�7��k��2��
x��!_�`�fz5oz�R��"d�Sh�#x���������������tD�y�C-d�Z���Q���Z�Z���4?"�P�6=G�Bo��'���x`nb��}3�E}��p���l���qx�90�3%_�� �b�����d�bj	���q�\4�q�).O_�';_Y���K=-�oZ�"��`���XJ!�V^y���v�IL���p����Jy���sn�p�!>%��n�t�.��A�j5��)s=g������w�3k=g��_����������Q<z�k����G��
��%&���k�z����5?�@���)9��?D���l�@A[��]`��i�aH���vH<��f���Ze�����"4{����o�]"�
�#=�@b�V��V_�g�<w�����o�}�yA�����A���h�s��kQ�l�/w�<�OjI�����=s��K��D�I����O0��&��������A&�=k��6&f���/=�p��m�ys{
�<`���FSh������x���H
�������HM�B�!
S<`����H������n���T��>�����
x�Bk�n�poy$��2�S��n+.�O��
�U5�(s����558�������c��m�����2PG���A5��7�H�u,���PTV���7����7�s��pR���Ug��<`���>Gn�������V�Yx�����p����;4��
6H��O�b��D:��
D���b��{�,=������.��v�-�!f�	%�0����y�������Te������fq�ltl����� >��������UhY�9bRb��������#��j��tO(c��y����f�5���0�8�g�:AN��:.�P�r[l::=O�`x���MC�>0������s�79s�����Z���������������k���;~m=������r���/�����k�^�B���6��������\����v�$�v��uh���o�Ur*(����*aJR<�n�P>�n~��j4�3w�p�%���C��,��
o=W{���7eT
ua�Y	oB��	�m�0#}��E�\D�}����.,�c24iA��%/��t�f�������x(�X����`���_��\�K���8h��k�a��!�L�f���x^�{��k�F�2�M5���N�G�rv$�D?���Y�Wa*)((�C�)t$���N����������075���$x ?������Aaer���<(���!�|_��I�:7x ���2y�E��_������lQ�i�'��
���XbaX�)��k�<(i���=9C-Hj#g9q�i�WRl�� i��������y��L���[%IM�\^�A���p~���,�t~�Aq�'�z�d����Y��x ��$�)
x ���X.g�I��Th�����l���g�����fA��$��Q&?�@�eaCT�@u�����R�:m$���
3����H��}Y��B-H����i�.)6�`Y���P��S��Z��^I,�3�����x -���/��,��<�E=�m�H\o>�$�W����E4+�����0�x ����IlJ�La��4�(	6
JB�r�EmOn������H�q��� nY�?'x I��er�Z�f^��8���
���A"I����'�.����B,^���>�����=���`���Y��kU�
"`�xP�b��0
,\�R<������*8�B0��?v7n?��`gc�v-<p��~2��
�h�����Mr�[w����-��B:�k�q?��h���SzB<������F"����S��g�GOxPp
���>���~<��?�jM����������wp(����n����N���"�b:,Gv<��<�z	�����gM
EWV���+q5������������
���>�������C�N��O*T�@��.!�E��d�P$Kx ��D-%��zJ���@r
�����fI<���x����@�@��&�<�c{@����@v}pjm$���"�#IM��PR$���TFJRoH�-�U��{��,
������/������
<��.�]I<(�o�k�A�=V|���|/j�������1�	��l�Md�������~��}'��x Mo�nKP<�W���6��U�v�����`a���^�<(�sB�������]d�x �
��t�������%�������x ���������q$���W�*)�E�������|/OK^�H��������@�����H�w<��w�,)�������@t_��S��C������<�.n.�<�]��t|+���cn+x ���xPRzB�v������/������H~_I����xPt~/x��<-y=x ��~��x �^���7?�x ���@r�I��H������}�_N<(����x��b�]��E%>|���9ea�������f�+���(�b��-BF�?Dp�w�������PXXX|�eW�<��������uuue���������bT!�Cv��r�C��|��+�?�x��8�0����4/����avy����2$����?a~(A����0?��s%0-/�!��}BH0�eTD^�#�=�y�d4@���<(�~��ba!���R���4=!/��<��0Q���.�-y�aa��cA���?��ei�����������0_/�x��a~(Mo���E���,��|D��KkDH��<�G�'����������7�eE^�C�#�O�����.�y��0O���'xp������`A��z����V(��^;}kll,��SF���(Q������
JT�$i���!I�.#/�MMM�����e2�/�����y����������L��{��{xY�:���xFmmm�
H9����rwH�{�a>�|!���FD���j>R���oA�y�a>"���e������(qk�^�0�S�'�������"�����Dm���������}>y��0O�{����� �����y����U�?2�VB�C^�#�'��?����KB���~t����.�������\jj*����m�E���C��,�-�2����*���r�C|��������+�QQ����(��e�������.-��bG^�y�y��d-����!�!/�6���(���<+�#%�/XK��(9�!/�a~Xr�����	���5��������<�G�_���������Hq���@O<���z�Gi��54��(9�Q��C��� �%Mo�� �U4�I������H�
�!�^4{�0a���C�C^�#l\	�Q���4K��|]^~�X�
�!��]4[���'/�����<��	���=[�]Z�J��E�'/�!���Bm<K����G�{�.����-��������Y�c)g�������0Q��G�fO^�C^2��(�x�viaaY�-�=y�a�^�1 �����0_�����^���="/�!��5"�cG^�C�#x �1--+�2�s�5"�cG��x �� -+�2?,���HkD
v�`�A�
�xw}������2T��db?!!,�(�T�c	�2�P���I{$1*LT%��he��
����e�7WZZ����~�/_����U���1�M�*�g��6������<%���$�{��-.���RY�E�����?
k�O�1���O����J��x_.�0��=��b�+MMM�������?�?�]q�L\PR�C*���&�5���������(��I�Ax�{�W_�#L��i	Er�����w�HL��{Y������3��V�~c�Z��Q��<b����3�T��K{eUIV�I1��_fx�-�r>"�/R�i#R=L�������Pc�d�p��=��CrVU�����J4_���dQN���J�&P��\���+��Q�h�i��}R��wtH����=g4T�V�}i���.��Y��F����G�R'��S���J�EY*-���4���PI���R*����Rjn�f����\�>bR��B���0A���9�,����&�5�e�_��?t�b�9,Yf�S�J���	��g���
G�g��+�KH��D���R@W����yf�?�sMk���R�w�#�|=���6�� IDAT3��\�����#������/[��(�g����Lo��0�}/N��u@R�aQ��IYi�Gd�0	���x������BKw/S����QI��E���<�ZV������9��JT����8eM�9A���jXJ��4���4����_7���{�eWA.���wC���b����JF�b��+s��"�e\.���b��v��W�is��;��_�L�(.�:��q�%�������HG_�	r��u�]*�����%V|�[���k2r�|P�iOA
���AhL�l�������������6����m��j��{���K{e]I��j�=�Z���������&U<��8��MK\���&r�����Ur��8}#���
������m���p"y�,����8C{�~)�1���z~n�]��8+���,����"���Y	�^��l�G70��:�|�����{i�������$qF�G�V���He:v4�Qz�=�b�4�8��E�L*�PW�-IQ^f��6dH��t�]��W�p�����B^�H�������b���$h)�s�S������K/����i�����Q�J���
W"*��v-�N�B��k�����ZZ^�?����O�x ���|��xP��@d�x ;������xP4�I��H��%��H�/x ���@t_�sN<��w� ��.��?���{B
�Af�	�A��xP<�!������G<���bV�@�7����C��@�&�ain���DL�})��1�_��C�P��	���.�o{��A5Wg�)m-�c?�a���P#��T���e�WV�>����d��
��_�!��x������L����sk.�z��7?��������m
��<�#�b>���K��*Y'	���M�R%-f���yd�^<|n��k��{�/����]@�?"x�9�g����"+��N,���)��(���Q�r�e�%x���{�lf���O���R�6������bi'V���Q;A�M(��yO��e0�i�D�d]H�ATD:�I���>�f]
�.���8T��+�HiJS�@�P���JD����&����T��B��D�|�����Rc2�#���4��w���������HI��2��?�+m�����������	P��E5���W!i��<�`���N��]���k{z��B���~o�}|*V�N��n�_��Xe�2�B��f��3�{W�E�ab�K�������b����Q�<������G��iQ1�t��D�
*$M����_��c"���+zK������x�`Au�[����V��qw������D��*1v��}{����T��
������x�%
<����ceO���w����>����S/�Z 6)+{z�93,��������lN�KS� 52���bJ3[�{���7���.Q9Y�3=�b���X�o,���]�>��7��V�0z�*��ee�dm�*u����b��5x���l��8����#��j���j��s��U.+���#��k��^��G�����}�%���QHZ�����9�����������xp��yh���q�m��m�R�������tw�J��+,�Aa#D��d�@�\i(��@��3h�j������h�A����>����\\����&4����������s���X�*�GTb<�b��^<��M���%����0��8q�e��'� �}BB�Q���� �C� :�=8��MI�O���������;�DqF��I�>���(���U�������uD�B�d<`pC�Z�8�p�&�����N�u��p�!8�.\�����c���5�'�|������!�
���'��A BNPA�~���~$�`�}?�X�����d�"���M�Rx ��TP��$��X��L���q��x
�
<PVQ@�If��{0��/%��A��cP�uBz��bR� ��?����I�u��5Sa<t���*(���
m��QFdX���
4�*��2�s�����pm��O�Jx�| j���r*�����*��a&�[.�=�_�u������&����&�tsF��}%<(5
�O]����"�GQ3J<0����.��]r8���L]���\�D����zT�����*�[�����z����+t��h��^���lY��C�<���5[E�E|� ()��*���cL��{��������f�����4����W� �z�~G��7���|��+��#ii��]��aP��E���
<�rozU�}��|�t��2	��$^����������~�S4��<PQ�����[�[lg}����3
����3NN��&S
Z;����>v�p�rXeK�X�b���b�0���
l��~�~��{�w���������q��Z��:]���{tI��t���e����H�KR�
<������_�m?lKY������������@�q(����]��@����b�
�����)�\����Vn������x��%����;�~������B�Fu�J�$r�C'/���!���v5���g/X�	����Z&��f�������;����0���j������	�C��k��GG�E��*�D
Q_��>�C����S�A�``���IG.���.~mRK.f�2�5�C_�����O^��Vuq�Y .�����������Dj�@4?!��h�
*��+�y�
4tqC��-p�����c�g(�;.���5]��-x�h������N>����_���n�
%��O��Gb��@z����U����X���q.�r!�P��d���#1>w�.S3��1���PQ���]}(((���e��
��m]��h�u�4���G�z������<9eeuT�6�|v����pqm��p��l�r�t�/yz�)�0Q���Nm���8B����*��q#�)2���VZ�JG�����8�

@��f��WBlX/S3�7W���1P�����An��ea�J�c]-����O������t[U�]��>�h:��e���������4"_w���c@2W<8�w:M1�?��P��\��`Y������A���*��!��!����M�CIG�[����%��q�������5�u������0��s��@AM
*���<iaA�=���	h�
Us|32�c�Z��qbOl����W�ba5��=���RI��=: |�4RT�FZ�^FQK1����6}����p������Y�9�
LxU�r�
Z�V�>������WJ�m?��sh
���J��j>#��.h�n��������p����4�\��_�N�����_�����qKM�o�cc,�L����6��<�mb����������s/:=� 	>�����@*Y�t�Axh:���C2���E����8u8���D�w�����\����$�[*�B%U��t�V*��8�QS~�*��(C�)() �;	1�)�0HIL�o�AiOm�N������L�b9���>U}E�����`:]G>y�3)�]'�)W@��T�K�q5uVT����#q��Q�6��3�O���J��{��N���_P=v����}���"&�v*�)�mE������x�6�H��=T���������)��4]%]c��z*H��y~=
�����o�=N~�(��Nt�� �������J*�L������P*�E�O]���0P�����4�]��j�������%{
���C��x�{��sJ�<M�` ������n�z��V��,����`�o��w�C��5M�k@�:|���x������G�y"j�<��9e�5�f��9
&A��C��v"&�=����cOlG�-�bJ��m�g_�+�A�N�CY	)��|�b��.(�BC�^p*W����o����f������/�u����������4@�F#���to;��������k�tk;�������T�4���4$&��G������8q�o0��E{cD���w�O��E�����@�j���	P6�G*A�A3�~��{8>.\-���mR��)J�0o%R��b�P��8��!(w`?��}i/����/`5s���Y������B����F�����s��^p����ky���N��G-�mBpE�^
���`��)>��,��|��F�:B���t�*-"�+(Q�2������T^�~�tO��F�f�a����|F0�/$Q��Iy���j]f����1!xpp.�����G'����V�
�o�����x���G�����M~���w��5+��+����C��]o:WE��p�S�a�7�����'��_n����T�myO������U'�,
���t�Y��?A��V��jWx�C-Pc���5U$�$����h�����H�O����
���3�M}�7���u��]�x/wG��OP7R��I�����Z��B]Oa���������:�����D��,0�V���7�2��-5���6�>���@E��-5�lo ^�x�e`]���iH�H����n�qk��1�������'��&����1'���D������u����kV"���.����!:�
����zM3C�"^��W���q�y�p|�HC=7x`�m��J)+*���8L
-��D(������O�z���������' 5�����B-�|���gh>�����hmB�����	3����N�RiR7�[��cJ������
�y��8��6�T��J���&}�6*�oABj��4��mE������$Dcfb�����~�xp���[�n,�B�V���3�A���1��B���2<�����H�d��S<H#�3��Qh��YQ	e��=*4'1j���c�~T1Q�~������)0��
�y�A��L
$�d��[�2u.$�[[����0
	OibG�*H	��t����GU��(H���qn�4t������Xa��+47PG��t����w��!���M����#g���@��Z�j����_�v��y)�F5v�*�����&���{�\��������S{1��@���]���=�0��6T�u@;�w=��E�a����\G�Gq�2T<P�G����w���0\��=7�{@(n�YEk��`k[���n�Z�Xz�w�1�~�N6!4�)�mq��:D���^��PW�CH���	���Q�
�K���==����xp���T��:3�mj��}s��p��"����wM������Cxq�;�t��HIM���H�x�N��F��{-����5z����!o��mT(��z�sf�"P��J��\����
�M�>W����akS6�j!1)
)����hZ�X����8s.�y%I�<0�P��F5�D~����������6���|d��F�`��������1������]#%�a��n���������o��y������z��#��
����`��������44s]�_�	xrW^��Y5T4���v�~a��-j�SR4N<���\F`��
$�% >�����'^�1uI�@�P���@����/D�"c���C	I�����g�+�&"fs����bu���Y��u�J�����U��3)=��ko���Y�I#8;�����N��0�>�z=���n�a��|S])�����Fh^w��B���j�^|r
���(�������5P�M����"��|:�����@_9�@�.�p
(xN�Fc_�zE>���z��K	�=�p��^�H��L�@A]���H:�R���I'�"�At&
B��0$_�e[+$_��_�#�}0�t����b��R������Mq�8�A�J�h���?K�_�������j6��J����4�}�����=����1��t�
�E�cU�ux��NL��K1d� ���O><F��Xqe��
�7����m�������3�'�G�j�Q�L������aF�Y|�4��$�7s$5�N|������LV�c���caE�K�u���&�����W������A\f��
$�����4I���z�������s��wD����3[�o<%Z�N��z;z���X[Z"����}���D~@����5E�M���8���������� c�����A�v��>��%�FM5hj)�����W����iM�n��{Y�$.x���n]�1L�^�������Rh�n�[��56�Em�>�������]~���K�6���AW���7�s(Ukv�M�*Tv1����k�:
��r�����oh�m�	���}uT�����N�j3zt���oD`�hR�T�4ai�Th��/�����0��)��F�o��E�m�<9���OIH>J�A4�U�h�*6�Y����2t�H+)X�9g����+�B���t=&���v�w�v8v�:�n�����}���1u���;���.����T��c��w�]�����cb����{�X�Az��?3+��.,��N�<�����g���;��w�p;K�X�������?����p��%�����w�\�J�����0c���u+�	p��K�'�Hi��,�|�n����&�XZ��f����4����x}�b���i�9<(����=PxP}��91j�$��z��
�?<������
��zy#zy�AX\L(,����cE�V8��
��Tlkg�ot�Z`a�z�bD��<����xG;��|}k���������f�^��c��`�ZZ�.o���0���EECc�9}����G�#82�{���C�%J�$<PmQ�N���~�������sl|��jF����DX|j���I�e-4��WNNB%g����:M����
��M�M�|lMp*C���<����l<��)���<�����H?�~n���L�-sT�3�+$�j0��q�����ALJ=�����-�67������5�-���-X]o�c��6��d�<P���a+��y-�;k���t�j��Wb��^�o2��1`ZY����G��lc�_�D�@���"6��m#z����/RAp���cQ���7v��y�>.�E���&(��h$:S�^�skBB��6�s;Uj��V�vHv��ZR��m�+����&�D���1�Nn���y���^�T�4i3�P>�6������}��i!���|��
y�$d@E��	h4��8���>��n@�����B����(�t�������z]g�m��# l�"�������F/��R'���:-�c)�� ����#k��w
^����`����A��v��{ ��
�}�����E�����Zm"��+�j5%`A�x��K��y��s�
L8x�L��EqJ��\xp�L,��J0������f�i�
��!�8�&�r�YG����U{uZ�O�s�(o�N����8E���!��u���B6W���t���'��A��'�@4���I/�l����Eb�:�-&�R^��n5e��(�=�5TH� V}���9
j&
0i��wGb8<�J`AU�1����f�-Q�{����B�5Q���Q/��@��zx�O�)l�:�lsG��	u���QP�Q�Yk
6T���H*kPK��	@0����8�k����b`J�L
M+2x��j2�+(@�H�����Z��@��JxG�"���;(��5���+���T��P�	x�����$�h�;�;C^=�x��%�����9mE��'!#2J�u�t8J�� ����kPn����t/+h���
�WRE����5C�A�Z>`��������b���aid���P�n�g�Y�F���������j(U6���L���V����D��4���uG���AEkD�A�qxu�$��+���7�-C,=�
���[�Jt����Fu�D����A����+�
��x0c�l:0�-�	��5a�g��.1��J����cB��yN\����FX�Gx����������{�Yc)|���h��wC�Z]y�h5;1)nOO�g�����{���
��x��\����!?�@�-6,��!S�����_����=h22(����u��?j�l	�B�W�c�O)2�d_�= IDAT����	�3����Z��~�LC��`��=W-D���	PC9:$����ShM���!��{XS���V��P�����rE3�`s�����=�^��@�n
��o���>�hs-�wp� ��9$�Y7o_���{k�y��7Q:Yjq����6�\�F�b�v���ZM�����#-%�������5��a�GgP�2��7�����}�Fy�h����$�?�V�z���!���^_��j�����5H�qT��<?�Z�>�
$=�B�G4z� �6�*k v�?t�Y!�:�M*�Pk������aB��?����������0�,�W����iO3�z�5�f��_���`�7_Q.��)4ZT�����+����
�x;�g��@������W�M��D;�>�����<��}�s��Zsl��V�TV�D��E#�NqE�C-q��u�s4�e;3T�U	���W�FQ��L������O0V����q�}(<��l
�����-���%M������Q�Vo�����<�7��C+h�b��]�6X��<h^���b���h��������'0��U��8x������^�<��_U!?�`����fb	KZ�
������Vt���/n���
�V��oT��� �+^�Q�3�b�9(��������lD�
����G����3N<w�O1\�p������C���'G�G�����G���F�z�/��e��u���~/Nv��0��{�"�7���2
��N���e����������K)�uV��18�mE %��Jp�N3N&C��"�b(�e3O �V*�7�:�63�L�+�X����w���S��$)?�@GM�M������F}����]�����<q`��_��*��������p�8w��	�����X[�����C����9��^���?`��3���
^<���HLi�{�]�:B�~����w!�x=7��	@�3��a��F���)��}�]�c����_P����N����~�v+q��$X[9���5R1�����Bzt��������2������Z�ZLaD�a/�N�
u#�s��[iM��]9�p��(������Crap��7�J{�J����o�w��'���74��M#��\������,\�4� ��8z|$���������
������gB Df��}�O�����y���k.]�]��T6��U�R<`����U�7�����I2���#<hla�:��XO��-����6Ig�p�Og\���
AH)�H��&�z��g0��D;����^�^EfCr��� ����'gmx>�����j�{��C@"�K�;��?���`:��e�0P�������P#�����\:T�m�����p��������aO���y�����#�����=~w����F&��Zc]�:j#b�h��
��16��	��������Ka��`����|C*��<�Z��kd1�@:����������3�a��������4�o����qt��//��e�Y���	��=��g���%p��Y��������@�'� ����#~��U#�O$������@����&��\	��!�C�w��Bcd$�{�4R�$!����T<`�?�A�����h�h�����[��"��t�.�����g�}x�3H���w
�]9
�nd%U!|����������C\x}���_�)G&rp��J���S?wX�q N3<�?�0��#�cMi>�(�A���H��{�wy��6w
�����H{+Vn�iV3K���B�4�M��������z+�U����9�0��t���������J�>9CR����<` A���t�G!2�A�����Pnb�A��mW�6��[.C}�3R�"��r��7��H���uuV����<<��{�h�H�@�����5�c[�u"�TDQ��
U�3���������@��*��J)v��)��W������BG����E�����;�+��z�6p��	M�G"��q
4i5�������XIk���7Wg�-E�^�ql���<_�@��-���f��Ax��,;�^T�'4l6��)T	�Gk�����������T��?�6x�_�C;grV��g>}p:�5�[��%eR<����U��L �jV�2]j��^0y�@�=z���B�z�hr�*6��q�
�z���]O�
���y�WC`��O_x�I�����^o��n��,���1�qX���,���{�N����qq�9��L0"w9v�j��m�0����e����h���C���;[a�<A���FbG�"i"���S$��a$M���������>��
��S�|V{���IZ�0���Atb2z�4��;O�h^�����0<���
��{�+YbR��x�	�8��N������W.����1d�R$��hi�8��(3h��e{���v
�Or�;���H��{#)-#kY�X������z��[��JG|x{o=�r��W'M���wZ�k�D��,)��A��?��u�Kv���a�M����g�e�����v#z� {tx�������u�����.>ES�jhgV�+t$��
�X�d?~�;L�.�<`FZi���6^\�����\��)��%s(a�zy�����y���qt�(of�EZT���N�G�>�\����
�L3��i��"z�-��)�*!�}2�\a�aK�=K�MJ9�I��������C���f�~|�0��n���F��2�TP�q��V�!�Z��+0� �����
e��.!��Iz���
Z�P����B�r�%�ur�<�lo��|� �?�j��~S�w%�=!5��?hE����R�VA��:e���h4l��f�t�(b�=t���8$�������0q���7��U2�%z=�v�B���s��z<��F�����q���N��q���v2���8���k�`a�+�/��n^��*&����Fr�o��mT�T"jYw��s���T�6���R�����g�����d��F$������o*���!&:�iAS[�x�y�$��V��b��jSrdZV������P�?������+R�"����h�kw4tl��e���kq��^�C�������H]���e���
���N&� �6J�N)A(���Az�T���$�8l�����xh����fjH���*$�e��f
�@U���g�Ox����
0������x_�3-��:�2`��D6D$I��iIH�	9%(��C)d���R$n��P���e# �H�zr�
0�@��
�S��������g�x��*�P�G��Hy�*G��/�rY{��wI�/�-)�l$ j���Y���F��]Gc.)�H��Ll��h�d�|�[��D������^������q`� ���UH�r��������3$��J������������#5�u�]�--�����^L�kw����_�<����yl.?�����t��C�k�����Ju�T�3��1SH��4���x�����������w�E`�OA���}����m���h���.����6����/��WU�%�(&wf�p������-7����s`B���t
Q�~-xv
�]��n�LR��|���1*��F�p�3t*�Y�ze�>'5e����t������%��a��ox;l�H�P�{;T�c!�����`�A)*$�����5��0��Y����$��)_H��
�P�FX��
��W��~2+|��MF�����,Z�!�&[R<��v��W�B���h:�_��l��i+�X�Z�g���	HO�n��������H�M�Z;C(�+#�P t��&��@(W��*��|��E[zo$p��B'x�x������@�62��
�x��#��ru�WY�x�=d�iC#�l�8N��n5E��3��.W�~[\w��9��FV���V������a\SN3�	2����2^���y��\!�?-W���inp��.��
�����<hF���M���p?��83Z�R�+?�_P���;�&���@������
Z��+���n�q���$E��,��?~ooqPA��<`'G4��j`��Mx��v�?�!�{��M������Kb���<`J����w������d���v���5LmP���"�����=l�*p� :1�N��v�3p(oM�*p��eRg��z��]�x��-�����(������8l���^�����4?_�f$^��{����x��-�+i�<`�f��4$�C��	|d�S4���U
��T2S�K
�*�C����!"	�T�(O�c����������~W%��KF��_�X9���j)��IS~���6�{�iB�p��-�xp��:�%L��-�gU�J�l��
��#[�g��T(d��?a����5����f��2�����D�s�u
pr���~�P�������Z�����~��]u
��{�������!��}�
��������F+�V�R�#����7g��'((��c��8}���~y�Z0 ��,����O�@��2�]��\�H�jf�q��t��g/L�'!Y��,�>=wq��4�;�OA���PRMP�0�kRG����6�������	���2FFv�b����-���_�
�2�ao���:�'X�]������Q�A�k
ET�?)2l��o��������Q�:��������8��)^�MQ;Z�����@�xL�Ti3t4��~B �R}�LC���_�����t_���::
7�eu5�����T��F�����c�<�����w�������"p� �4L���`<��ZZw�_�f���F@��{{���I%�N^3��)!���`�����p	���[d����3��v��HP)�7M���E��U�@�h$H-i�
(XT��R9?}@��-4���<�XQ�6�I-$���H���[1x���u���u��v�JJ��p!0�) ��&��k�$�����f�Si�Iw������'@g��gE^����={$�� j/����mRR�5}8b��z�v�t�JpG4�A���9���%���<�����T%���50�m8$�/�g�<P�9��}6`�~��Kp�s�p��z�9(���!��#?d������fa��i9���P��u}7b���X�u%��h.�Y>�M?�n4~4��p�_�����'����>��
��=��T_f��*��L��xK*ULE��f�O�Gec
�N�EI���T�@R��J�/k����Bmps~'��Nu�x�6�G�A����"��Lt;��x��E���������;c��)�����8���F�s� ;X�<H���z�<`���mG*=c���qEd������j��u�,W���������M��m���b��Sh����%�xq��^�m��p�������������8`��N�I1ah�m&����~�W!��'^����L;��w��1P����V�q������������4K�����t���+~9�Yj����N�J�&��_��t��s���ip���< e��-a���9����������~G���7WM��2C7d����8����Bp��=T�b�X�Z4v��30b��/�Y�2�����i98T���
�AQ���|A�Ay�t��J-&!&�%t,��<���
�x|�'D:2��L���SO:U��v����d���w��p��Y`��L%�_�jXF����OA��t���<��36]8�������4�	��#~��x0�ekl�$�i>q��J;:���T�F�f#h���%<��M����"8��1�~�2D�����hX����p���/����DA�mI��)�������>")hI�V�J�>p���6��i�S���L���I�u�?��a��XX����p��F�|��S;`��*/�@�X�U��F,~Xg������"0����&�^�v�����N�fW<h7��7��-��oA W<��/-�����0R<HE��:�.�x��V,�M�peK�g���bu���pI���L�@�@����Xx�L� ��"I��R���&`�Q���aX�Z��=����z�vt�I��)�A�n�'��c���>Q�O��5#���5
���x~VOzr�{�<�#�yZ�e
��W@��&��>�X��D��!-4�+h��e,����#��0(��#m�(�"|�r�	����m,�Cv����
�-�|S���B��Zx��
T���&`����,����Q���$���TV����o�R�+'0�������'y������L`C<���_$S~Q=�����J������@��`!xx��0�:)/�#`��B�wP��
�0'f������<�VQ<`

,���L�%j�0U�dR�0iJ�
T���f��1S9�0E�r
�-GcP����(��S0(gC'I�/�/
z���`�wR(��W<���B2��x{?
�mD�u_+(��A������PjB'.�C����?�I�>+h* �a��5�z�#:�B��S<H��*����-h�&�����M�b��S$e<OZjD�^��!�_��}���t��L��Lj��s�������������p�_?�E�&Y�A�y�H�`9W<��y0����)7x�X��N/������EI���Z7�+wv��L��J�����}���+���N��:A���q��#�$N�`���X�i�����DZ��O�q�&�p���9fv��^�gqX�m�I����\�vuD]r�����7e,�-��K���6P2+���z��tZ�}�]���s�
�-���������"|"����p����b��Wo�:By������,��2�@�B$d|O��~Rb�v���vn����a<f �"�_��lI%��#p���B?���&I��!<P�)�����U��wwMG��9L�R�I�I�`W;P�+c�z�t�I*,���9&�����a2����<o����(R< �dZ@�j�^�$��<H������^L�T��Bg�Ex-�T���J�q'��%�$���K��&j0���+���)�M�����������x`����RkS
��*}-�b��C�V<��i�i����r�
�^'�'<\���s�����)����|/}�� Q=
�������5d.���D��Zw����<�0�2�V<�����Oxp���Tm��O�N�
��E���%q�Ae��@��kJ6�?��T����I��,j:
�3��U�_%����<p�pB�* ���m��u=��[��@�K��G����6��6�E�2�J��L���/x��}j���R�:m���Z�����Wv�0,�V<�n���������JP���1�vR<���-��V�D�J�=��V�u���i,j;
�H*W�6X=������jA��A�o��)���F�T�����,��H� �`:!��J`)���f=R�rM��t�Q.�x�[�6'��h
�@
�tj0���l�B��Sx�#I��Lt�Q��
.�|��c�`������^���	�o��\��L������������?������q�������<�q-�p��PR<�W�%���+\}��T7H-��q�x0���0����<�i�R[X{;�jPl����1L�]���|����y|���,en�3�-M������d���T<K�n"A
�_�a�!R<p�He�P��;��������H��n���0�,����%���<`���C9c{
�����w�V���{O1�������[�:B�n[��%���.���<}����I<�<mt�$�����J	9�<�Ej���o�)&P����d�=�	6�M����:�VU������Jf��$7xP�Q)�����ik*b�L�,��U_=$|�L:3��=aER<��uml{������Y������ IDAT�,�`��2t#�-=�!��:f�p��0������Tjj��%�"����*^��h� ��
�x!��#�@ ��K�����x~/���T��Hq�?<Zn��]
qx9}{���]2�U%X����}CR�z~l��m���Tk�o�^��-��k�G��< �g)T4��T��a����x�	��LD�/�90 -x�]��������I&E��$I�f�m�����*�z�)W(`��(���6�p��i����+�`~����p������~$�a��etP��N�$<Vov�m'{3��#{T������������y���&���Y����;��/��.$Q����s���6���jQR��R���J����!g�E�0^C����I��A�Z"a�U��A�x��$t��O�P����H�@�������q�<x��"6j�����Y��L����I��A����wu����Ky���)����(��b
��?.�
)���I�Z���h��)��N�\���'�|Au��
���d���{Y���vo����A&x .���Cpj��_Gy��Sh>��[u�?��$�/;x��Fs[R�TC�^w����Tj��'/<H�`?�,�K�.Uq��]\�~���������x(�X�����g{���E�����W^8c���X0�M��E� M
u���v�*	�f&���9M�P���&y�Q�)�iAd��/R�����IAA���l�}=	p0���,	��$CT��<Px`�`���8I�����f�����o��^?�u0����@�	x�����_��8��wq�&�lC��jWH+<�JH��W���x�D7�&���1���a���Wo�E1��(���v�p��3�P,����$ET��^`Ig���=	��>���`r��mMd,��Y�7�A�jY�AMKkL������u�"�?{��?��R
���QSD��	xo/�}��,�8�@��;���$	�t$��B��39�Ax������������YNs�>��:�q�'Z��<���hS�%I�&�X��<~j!�B�����N���vB�ft�+���?)d�0<�?�RERe��L9!�&�/l��
?A��\Y���wV����0������.-�]��%7x����U/O"�NW���L��X��\xp��c�
��19�Wi�Dz����%u� ��i��������<`�z�3�2-�'����>��t���t�F5�6T�����F�a����D�����D/���<�B��
YfJ����7�FD�N������H|�&9��FN�����
�rj�R���w$I�xP�����E�N��l��c���@������A")00�=�5h�O��^�?+�
��D��w��p�Z��<d�`�W���A��D$<�E��@��W
���NS��X:iM/AlS?��N���AZ�B ���u�(xZ��'�Tm:��qA��z�)��&(�pu��3{iV�v�������
mB���L� ����P�OG/��t2:�N�E�����lY��z��(�z�>�<���I'�vVg���z��� PA�� $P�9u:�I!*T������)�y�D���������)d��$�y�6�32�`b����*$kFJ��^��^hm=�k�}��5F�Q����r���<�"���}4q�t����?N��q��!�����)���wSR+8w<��5|�K��7�u��P��tz��-������Y��aAa�`0@��8�UU��+"�|�������<���,7�����D
��J~z�!��U�G~���/]�fEE(i�#���*��B*v�z�����d�9����<���P�!��0�����J�`PKo	^H#�={J�	W�_u�'��{�@����"�(�B�����9��;y(���TXb�A�m
�5�g�c��NFeZ�v!�������6�N�)$�D ��W�z�������LB���&E'��h��X
��<�'o�����
h#�,-`�S�zN�����>�%
��JR����P��dX�W��K�`<)��4����[�	t_f����Bkz)�����[1�E/,9�	,����D��~�t��9�3`=�;w�<h4`
���9��s�D��?f��+�D�!?Q������������{Q_�Rh�0Tk���I��.�Sn�@�N�k0�<����/�x��Y����4(�^���P�'	R�,�L�������
$�N��{O.��E�,����=:������t�:&�!�����NyR7�����o�y0���8�������Q����~��iL�����5��2l��.�H"*�����{�f������i��_��}�x Gh����w@�~?��a�rQ�����^��i�� "E|�
~�I��~�(�K�{is������j�������H��H�L���*���&��#zN�;A�:>(?{�O]�-+�b�T!��@�D������,7x`��4��@I'��{{���-�8���-,���{��������0��5���5�Z/��t6�X��M{��h��-.���!Q��b���J'I�.����Y���S7��Z����'W�Z�qf��������
��6I{>?�7"<�x�_d+�������l��f,��{�<��:�Z<;��;��-
a~�����;kn� �6�c��|*��D��Nt����Azl*b(���*�A��	b��Z'c����FH�����_�s��+���G(�+ %>��?�P"����5CU��t�!0�����9[��)0���:P�S��9�P3PE��k�{n��5�B���6jM���8
��&
N3pc��nl��/P��U*�A
f��?Gm
��<�:��+0�S[R���>1��OD�U�Y"1<	��L�r�j���kS��#�Cq��^R��m,����C��:��p���)���W���q�@q���e#�;���'n�H��Cx�B1������������Aa�����6�VZ������I���5���y�7:�%fvn��L�s���7t���b���Y��9���0�4D
�,>:���FD\8�Tn�}ww`��L��EY$?��)'����� 3�,����yc_���x�M�j���s�#R�b��M����,0�y(.{��P
0��p5?��5��fC4?<�� ��s�+D&��*�m���VQ=L�BSE
S����c�r�
-�m�>R������o�V�:�v^�)�8�\*���FuQX���1��h��L����<(��7����������MC�zA��T�>$8��2�4�3�G�=N�ri\A��"�����5�r�����*����Q��i���9�9�����X����GB�����$�!��E��f�=�4E����g�o��p���S{��{���7I�[�b���V�w��4�`��-.�h#&��[`���]��|�����[�-#�c��\����C*L!����o���lh��Q[���>l"�?�BW�F���#���>����3)Y|D����]�E�yt�S��p��7� <�R�,-��9��{�Q����������e=""�AO�����F<�Mj��f\=@_�����'*_�:��p�,�N��p���AU�<�Jk/Z�!� ���������������E8�(
���ez�W%���w�*��Es
�����p`j������h����r���D���y�s�����I����	'����A5;��L��� �P��(2H��)�jk���u�s���`\���h�8��.0��MH$n���tk�CQx[]RE��GR[���Pg
����b�r���
�����y�����~%:<��ps���gB[��L�):1�g���5C���������N��������y
-B����T{*)�<�|#<q�c/���3��	��v%���vx�F��>w(�-��f�Z��w��t#��>����^���Hl7��_S_�z��H��S-��*�q4���g��V�`&}���x�#j�G��D���O�@�Rps����L_�]G@�������������M!�j5F��P��b���U>7x���6�Q�}�cw8�t������L�l��G#����]�SX�$
-�%C^�V��u�y,���"��d*t�w��G�A�����'8�
��;��E�����)�����M���(���\����j�/p?Kr�����/a
T< �*4����)U��4�W�� R��Q)'�z
��<`�1� ��q��S#=$�Bj"���P��������8

z�*4F��jJ�-��W�����T���3�=_F�BcC����$�!���P
����wEg����b�����'����X}�OT)W����@`I���%U���;��!-
��k���a/�vo��X�	Y�2{s�.��(4?�=�++0�y�����b�S��m�����;��=��n~y�A3��<`�%�#��DFM�k=�G�"���>�X��d�-D��)�P	�nB�uM�<����MT0���C�����������@�N]�xx�kW���*U��PC9+�Bv���(���H�)���-�p>��7}:�B��x�2��
l�,w��_K!%��������8�mc��J@&x�@��K������D����xH��Hb���t��/4�]��Uh~�	jR��'����^h�}�>xO�����C��~�?��$�
��S�h�Y��:w��'#x{��5r
��m��x .���}=��*����{.{�]#�pt�<4o�)(\�����C%+�<���_d����t^4OR�0�rc����<H���S�/��U��VA������b�H���5����h��S����P<��T��i�L/I����eB�Um-9\ N�������Dn��x�G����#�.�C�'�I�0�?t����R���$��T*U(�CYA$������p�8��(v��Z���H���d�^���\�$e��Z(��8�@��r��<(���*#.�����_�Y����I
|�vg}��E�����CP��%���-Z�����������3�Bii`1�#/�����t~�AI�)�z��E;�����B-�����B�+�"�Z(�������de6�P��/k;��Y�/(�����^��
�vq�Aa�HS&7x MYI��HR�{��x�=]GA���k)J[%�RGi+�=�Ba��D���+4��I
�? �^Ix ���
X@���R�*����YW�<��~n�@������ff���AQlJ���,+
x�-��=��<(�k�<(����)-x �����D�
Ao�����($D	���A~M)5�A	�K�^�@�x@J��9*MH /.���%��"�@�!a�t1��@�������xP8�E�B:)1�S��� �d�������
�A�;I$��H����S�V<�u���x�
�A�#Md}�=<�X
7�������#)@h���?)�������(*%�E�^��
�A�}�������f|1+x ����<_|��>8��4��*���9�t�����~�x�{$�,�Y��B�N��x ������	�AA����"xP4�Oi<(���xP����}'����,�r����x��S@��'��������*�%�;x ���x?
��l��"�e<�����%<��/K���xPl�����x ����8c�z�{Pp*�
�Q@� +OR�C���x� ;�b,	�����q����a ���_<��wx ���rN<���x ~��A�O<����x �3<(]cWJ�?�@6~��~���/fE�@v�)oKx�-�,�!x��`�A����<>����.^�bk(�������N�L
[^Q
)��Pq0�Ru�biOa�
�Aa�&Y��O���$��9Wzz:�����R�c��:�E���R�Sm`	E�d������ ���Y_���B^^���=�
*N��o�����Q�u��U�G�������o������z�L��i$##�:$}���r�V�� ��N��e�z����rP��������4�8UPP(���*�P�/uv������bx�����#�[q1Ejk~�����S�����Vwv�v����G�B����n=%x���Fi(���)6�x+�44I�6�|D���64A���$Y�#��S������.i��x�������i�B��4�
3�z>��s����;U97S$���j>�i�+^���6�-�M�Y��e��v1�����$lT�Q���~������s����Ym�����F�~%��o5?,�����������{�$��R��EkT��M������I���"��/��
�GI?����.�9?�����E6kKU
!6���m����a%D��H��.k}��HR�7�S��z��f���f�,���y>R��5����%�?
�OC�4����Mf�K�jZ?!&N_fu���,�#�jKQ���x�q�I���U��.���?��[V��I��E�
2�/z��
j�|��^����H<(����LY����PhjjBUU����
,��
�,al�#88�����D��V�������|�hkk��#A�����I�0KY�2w����,�GY���q%��7|P�0)=}�Z"�G������'�K��*+����t�)a~(�Gqx�,�G�_���Q����GJz�.����l�Y�A�wmY�!.+/re�?���H�����){������aa�8�Zx�e�?������\�q\%���P����(���0_������(YV����G��(�Q^x������+��e�?��aq����,+�Q���zn��qq�,+��R	�\<^}&�<��{���jU���^;}khh(��<��gR?�)%&&r
POO�45�Pm��?
UI1*+�uuu�������|q���~���`����0��P5�}B�s�/+��f
-%�d�,(+�GI����@Y��0_�!�Qt;�5)z���P�����|D��[�%2�CMM���Hz��|DRO}�|B|?KZ����zO��}�����z����������G�{W���?����,�Y�WH?2�V�,�GY����,���v/	��cJ���
��<)�%?�2[ ���/XK�B�l�Se�?�m�k\���(�62��(=��0_/=}�ZRV�C���q%�G������'��K��*+�U���t���2)+�GY���0����YUV�#%��.��k\�)�������21&�%?���@��
�!kUY{�h��J�E�.]V�Cd=2�f�,��0_/��u���ea�^V�#%��)�{���GY���!��-;ea>"����RV�#�z��F�l������f,��JY����|]d5";�	�A�w�0Q-�>������D�t�����D�t������r�We�?����5��B������\��
a~(���= �e������h��u��0�Y������E���K���(�C<���.���2��������o��L������v��M��Ee)))PRR���b�Q�z}48#_�eebT�2c�q��R����=�O��Qh��e=M:�vl5��e/ o!��)���������]���3_jj*X2���4)�5*�R,t[�����B��� ���|Mk�M��X��1P�_���vA�Q(���b��G�ej6##�:r?sU5��W2�+���:���8C��?
{11���P|?������L���%��K


�j���f�����,��?d������?l-�P���Li�&�W�u��"]{Q��"U.����?�]Ns{���l��9QT,��I�.-�����\TY�6y�|"|_Ks�E�[��=�>��3������vFX����������!���L�]����?������3vwB���y��&vx�RPW�����?d}���P|�V�����3��
i
����<���P3��w���<��jL9-;�I +s9�d��!-��{mK0-�0 IDAT��W1OEh�{�Lje��ovx��E���j��i��:=�����Z�ve/�6��6��?�4�Fj��B���`�����n�(�!�I6p���"�*��H���%99���Y$���R�*>D��������������?Z�� 1��D�������$r��I�������������[d�����0��|�
������\d�/�\�P(�M����'u�'V�p6�^�r�(;(�+.5_�J�������*l,��8����mB]�k���Vm{}������~4U�L�'2�[[|t����y�SS_*�
��.�flg[�jTn��l:DVD��N��[���SJ�%��g�j	�^_.���pt���`	r
Y����������z"�����j	n<P��}w9�_=��mhX{�_�}�:KKeOj�E��x0���h=�.R��y���0w���KaR��]��6
����~�����T��c���������?RR���w������Bp`���+��G�����I�	���i���f/R�F����-f�P7o�������v�6�D������	���T��\� ��d�Xo&����&���
�#���DK(Sj��8��XB��\�*�r�R����Z���^}_�^A�$|��=���i������3���'��O�$x@�<(�� �������A���������H?�$-!�{J
���r��t����U���$�.���x�m��|[�����4����$���%�$�_�)�9��|}�	��l�?����x��_�Zb���=G��u3��!.>s]�5��r�8~ujV��U�|������[�:�*U����cb�a�!�(+#���~;J$������\A3"��������/���55`P�N���';�Lv�R�0u�P���o��Rw��@a��r65P�e/\����^�)g�6pg�����X���+���(/���t��s��kqn�$��$i<��S��'�����
�yq�+������QO����&u�t��m-�|�T�V��=�eD�a>��~��� ��%���+���I�����KU.3s��G$�=�N������O �����%��=�)a��w��-�Fj(��zHt������N�NP�`+U9Y���h��>����.�����=��v-T��J�����`�?:�?�o	�����O"�jGqd.�@W�uj��������t96S��;T�5u�����\f����S^���?��a>��X����-�n@q�=4ADlZ��������������=W�R(��B��N���%�kFO��-��^I����M���&�i�����c���+o�#:)=��*������0��ZK'����{0�^wh��I�A���+�Ke4����@��{2��e�x���Q	Pnl������&H�K��t7G�;�*�=���e4�����#�S��\q+;�vm��mG4&O�^���u��*���������-�k�O���,�%3]��rD��k7�8t+��v�Jxx��gU��i$n�X���u�����T�23�f���D�:/
�������5���	UY���k 9"A.������]���R���y�����A��*����M\��<h�vn]^�n����_]�m�NHL���w�O=���o
T3����6�i/Q���y�~���Mk��[�1�Q
���Lv ��������vXq�3�V��'�&(&�?Mu����)���6�c���!
*��X�O}Q�Y��V]�DhlR��f���
.>�N�����^g^�K<����I�h��>��?��C��z�(S��k�b�����-
x���f
�r���=&���Z��p�6��ty|��M�������`��A,X�y/F��#�.�]�&����7	H��S���~��s;���
<��m�_�"�[����������I��0���G��G+������x������ArZ*V���Y5Za��c%��� �}4�
�A��*�P���Hy����Jx��tv���1��'� ��!�Y�DJ��w
�s
O��(glY(�@�����2�����n3>����7��{��Kx���0��=@\\X��

���iN�Z ��Kq�������[����jYZ�����^(���
B��o
�
z�W�|����������ys7��Y��2�d��FmC���h��u}�|��i�������x�D��%x���+b��������@^	h4����L��8����=��}�PX����2[��.7`e��
��B���4�9�!�O�^������������
wIRq�
FZ��-qaI%((�����85��$������!��� ����:�w���g��":��_�x���
k�
����^���o�J}�A��s���q�{�������Zv�.�~Cz�t���	���&^�+�:�-M��v&T7�������$-e
<h[�:jJ8���X�Mxq������}$^.,q9mULne�'dv�K�1��ms�qM��J
����*��)��R^>�t��"_���Q���<������������P�N�-�{+��8���J`'��@��u��?����c$%�p�cC�\�����m�Gx��C�fh����~��5��������������
s8T��������;|��m��� x�};�I100���N5e�7��2�i��Z���N+$'�">*�+44�fV�����y��Z���
�������;� e�?&Em���VB^A�w����[��p'������h1j1�t�D.���tZ�,�l���j��
��k��V��tlA�	�v������:o��{BMK�~0����xvq��M�������M�����9WB���Oh����^\>��5�f���U�U<(�';x�����)H�������Q��aM������ ����pD&��PMSk�e���(�
�{i��c��{���W�:D�A	^q���s�W����x,�����4�
=��b�����<�������VAzXb7�X~b�������zhha�?^p�[��_-'������o0�as��8��!���i��=�>|������^�P$��N�M�o�fD���vD�&�N�;��o�8�F0�~��|���f�1��T�1�_\F����~�����A���S���K�~T�b���O����X �-��Ke������,�����T��+����!g���@���+�#��[d��B�L�-�[��K����!j�P������������x'\>�����F9x~�7>��A\��z�������x��4*�bpC�������k7/� -:Q{OiiPu��z#:]�rt����
�\�#�����uw���L�@�i=�Y��P$03=&:C{BNY	���"=.J�����~K\� ��k&����B�L�@^G���94s�2R�"!G��3����CFbR�����.��j��$�|9U�kir��4�7��
���$�_Y������}ti�@���p�X$���%HUw��AUU����J=z*�a/��w��JF�6%x?E��}�7mt
m=l�e#s��������&�o7�����_a2l!b^E��%���C^I��Ar�{���B~��n�>���!��"-�NJ�E�0!������@���Nm%�S~��Z�1x9�C�+�������=v������uz���5��cG����S��F�{�>�����u����F��3����K������<O�m�8�?XY���Bx�'��7�>�������8wi=��t��P��*���M�{Q;W���:��������5�T�=�\�O�2>��	.��������#��2��;,9����|$&�b��e���G���i��]�76l��QC��wz>���x9��� ��)SA�����u����^������a`�u���#?�}��PW����<��n����;��E�S&���o��x��9~b��MDGR PW���s���5ktE�*-i�(�����`�����`c��6+�������5�9]:�D��=���[S<|x�_�C�.K���F�u����xP���F�_���a�������x���J���|�g�,��J�8����$,Q����u�u�]WW�\{um��]���DAA�n���"�E�p1��<�>���yg�;s��3���+	x0�a3��X�����o4�T�<����\x���t�����/����U������
eh�����cl�t-��@'7w��3h��M����n}���6r>���������l=	s���uO�����,�\<����v�X*	uuZ��T����E9�_��+���;</�'���0l�B�S�m@jF:�Ds!9������P���Z��[td���al��t�_��EuCtB���1���C����c����}�k����,]�6�Fm�O\�<�N���K��E�I�p1w���+a�m�9-Fb����MM��6��@(�}�T�W����������)bS�1��`(h���N:E�������������2�Y���s�zN�y�������A���������U�w#9=
�	Qh[��g����iT6	m��s����������n `����dT6�C���p��}��g&KL�F�K�x������mM������2����/P��@GU�touwn��v���lfv&��-�����M�D���k*���f����:8��]B$�z��6�,��W_����^H�������q��"\�UB[���}���]���Q���7��Mc-���
^��C_���d�3��VT�1�n4g�ti�X����&�xvd���������h^_;�r��AAM/N*R�
T��B�������(k��J�H���4�S\�M[	0x��_F[j�����������"�{T�~���������[U���"���:M�1-G*3(����(������H\q���6�������EVp$4�wF��8�h� n�^�;Cm��^GC����7��Y&q���4`V]����$
���\�P��&"�}�{i������7wR`QK
*2xy9�H�J\������nO�	�=����,�rUFZ�����i*�rj�����_:�=��)c�����>���j��R��Ix���'d��=5���������<A�X9L���s����<L������*���sW������������/���L�����cW<�4p�a*=�����v�u���:IP��V����,�z_��v()���>t����������h~�F�+���g*<��S��o��NJ8�K�/a������v�~Lm9]zVQ��M�$�!m��3�N;(Q;
����f�3~��/)��@��������/�DyX;�O���lt\�����A�D���DD@��qd�}Z_SD�I�PTW��-/x%U:X�Bc��7��?}`ZE�+��KA��F85�Rm3U�"h1�2U��e���|O��-�S���Be�
��v�������!���B���V��>C��xLp���:}f|��_!-1m�9CU�����9��� �e���
�#��6�\aT�<�'������-lz����/���s8��y���O�EU�[}<��h����������O�O�]\|z��jpE��<��p����j#�NW�x��^��i<�h�����<!���O��F�g@���>��|X
�hMs�+�.F\��M��
j�p�����16�u$���GxRZ�4���<���}@k���m�R�������WO��l�lN�4��gR|<��8�Ym��D[�����";:����O�Mtt���y�6G�Xo��u��+o.������|n��i4���9n$�{.��Y���#���u
���5��"33G��P���s��Yb���3��O����,�3�()���O��[�������o�$#�������b$��%���A���F�U���Fd"p�����7/x�S�4]r�V������C����g{3G���OJ��
�l�7r�K�a�:�����Zo�t-�:��s�Q���[R����
��gP��4�F������{�����Uh�b6��D�����5�^��BB��Y]7.H��\�`L
'��7�G���fj^������0�
�j��c���B����~U����Z{�X�
w�"�,*v���u��6�H��D:��-������yF�y���NVp55���q�}�|�d����������h=L�Tx0�Cc�nU���3v���CmLn���_������md7�Bc
�g��G��z`$F4(O!d��Fm��������l�746�oa^��4���s;TBDB�\��6N��W<PS��op�z�}�
�(��#>`�BSG#D%��Y�;�+�c�id�����p��}�n5,P�����T|0��M.�:X~�9}�eax��x�����z7
p�mK���0�R��1���Zh�k��_�_>����9����v�W�����:!.%v�����~o_	�v��������q�\�a���p�����<o��~5�$4��j�|=��w~�*�<jFk'�Cv����1�yG&s�bv����+e9�z����t��1_^�������w�5nS[�������b����$^�D�����������>��q��
�>a(Vo��������K���	��9�a��b��M�1�=����������k��?�������Y�E���j�u����r�s�F�`��9X�x9�f�yR��Pl'���������������������'��"���](C������$�A�%'�kJ[�9���nk<�wju������AGd��r0���a�����V�2*������/��6�E����c!�j�B��4�'����P��085�����d/%�������fu�}��xN�B��{j��61�����860���������}3�~h������$�����I���g��L�G��#���h4�����t	����^���Aj*Mj��]W%>����<}�\�8� !=3oG`I\M����
�&?xP�Jv��8�����J�����E�E�4������w�Z����Ud����R^�@F]Z�4@�,���g���i5�����������a��G����8k3-ml�}
�����/��+��x����"wx~� �6�f{�����p�] �"��~7�aj�*��O��kwD -�'F��Y,������F��cn��Z�E�[���������AJ&Rw�Ay@%d�DB��>R7=��@���IE���Pjg����5V����=�R�
��MC��@(����5��Z��r�v�`P�\h��f(<�1�""� �m�����24�����gh���-�Crd*��v�7�	EI����-��5���A�X�FZP5�E������>�G:���h��}i��*"��������A��������
fF���Ha@{@dE�"n�	��������
6����rE;0�O����7i02��E���`��!��I��=��U�\�v_@Pr�E�}_(W�y#}��=��=���M�����~<H�q�z�Pr�Y�*J���"��A�X�.������tiO���2��`����V�
j��W���8� ��z([9Q�dh(�g��}�t����w�m\k�6E�1�������z-�gD�C�i/��Y
m�����]#��sa7�b���_�I��sJ�6��:	y3b`�e\Q���|	<�Z��k��5������X�v <�{�F}m�A�?���%��m7��Z��=�hc�@�^�q��v��6DT- ��\�f#�,��r�afj�A�r�ifZk6�D-�6|�����:a7�O�<i-�I�HC����o�a�>���g�n>
�#^q(��u��?�B��3���%�I��m[���3k���hl�:n����A'/o����`���p���d�G�Y\��}H7j����[G=��� IDAT�M�����.���cS�~}mHA`��Q04���k�p���������r�V�|�o�n5�����3( (�tt�������[zs `��~06v�6�B�oC[��?��F�_oW-h�h���JN�ic�,�8AJa&	\k�����^�!`�<h�j6�]XF�2�����6X,��}%�V�$	x��,�Z���MF��l��\�kN���#���~��
��m;c����^�m�G��S_������px�o���7����o^%��o5�0c�t��=
}�yT��s����-,�7���@D|V�_vn��}���E��{_�s�H� !%��a�����������F`���aJ��Y]{c$]K�:��f;K��q���=�n\A���x���C_�X[��!R<`�L����u0����[<��U�%��Ap���%V�:*a�|�^��f�C<��,Cju����P�6��]���m��%='�<��I}9<`�g������0��P���m���z<�=��&3G��G��ee�<���2l�{U��������.�@����0�i>�I��A�9S-��� j�&��w��|
,��}h����S���{'iNf��s�u%U�p��
�up>�{$�T+;L�u������������d\�g)����-"��M��xB ��x �������Xk'wL8���L�OB�W���s����%���7�qx��� ��v�<
m�1��hQ�.����%r0p�]��r$�C��LQ������5�����F@��&�j�=����x��
��Uy$T���8{����b��]��Q��2�'�]5�H������ (�(� �@{]��8�r��z��f�3�F�����I_"H9jC i�E(�uF��8d�
��A�Yd<z��6h�(w�����L�x��#7��[��n��u�����_#3����AcF$��B6-�j��	����6����IU��P�U��rY������R���y��-���h��}RD*v�D��$�����=���d������\[cQ{�.�7� ����$I��5�b���""�h�!G���I_�F���`�Hm
�IPaj,q��Z�R%PQ+W@0\q��8C�A������:n*���B�x������\�,�Z4W���q������<�9+c���5\����6��Q�6m���kbxX������'���cth������M�8x������*&���}�@���#X�Q#�����O��}�����BHhk�����I(���������Pu���	���	)�_�hv���E[Ch�p��y'���
��#��5[UB��W$jJa��]C#X����eO�����	�"��Co��^���i��1����#��C+�5��U�8x���*�3�6�]AU1����wr������c'-�ip��Q����?�4�UPo�=��h�#^\{��f�"����U� A�^�81�!����0�����������cK�k�-���pc}�������R;s�#����kt_[��o�����
WHS��}w�{6�H��]g
-a���_G�����"m�&�q\�.����H�����E;%,<Xxr"�7�I�ft��OR����j/l��]4��c�����\{v
z�Fp*�F=p��%eM��_�[���Rs<�=�S���_�������c��~04!���O/t��&^�3�NMxU=x~
n�b����``���U��v�R�g�u�4UT�����lF���q��?�l��>O��C����
p41����=|Xh=,C^�@CQ�7�SNG�f�D�>��<�V���q����h[��������E�c8�YX�x�����1��n����A�������8���%�I�CVt� �f
,���)={
k+CQ���fC�`�W��Pm��Q4�7/x`;{;i]_���C;�����-H
}���8w?�PP*<h�z�\[�R�s�;�'P�m0�53a���@t]$�o�����������d0������l��=C)49�
����=j�pu�'f��r{$��C����u�g�Xkk4`�e�}8(�"&��l���^�%`U�:{�k[������ffC5z�������	m��x����o���D�!�`����z��w=��������W���A=I�p1������0�V%��S:h#I���W�j�s�,�������6��&6^�M�{$v���>�wr���T\�`m���M���t�o�7�����G}���1tU�['�"����b�6��(lX#<��Fk����������7��e����m����g�����L���y�AV��M���D�C0�������~9��������C���Xh��uT���w!j���2���`�����z����v�C�{��5���B�����7�������2q��[����|�������_Z��]z2;)X^ p�gR;XE�+���!�s��[c����|�@P����9� R<`�R]	���)�IHL
�L	��J���<o#�������^�b����-=~���(u�����;���>�9�P��3�(K@[k\�q������}�14��MP�1����<C=�jh����^a��=�*g�OHL��I�s
r��SaB'�jU��8+L��u����1jPwZt���x��"i��M�jSH�
�@Q�5���f���m:#��L*T�@��mU�: =9��Y���G2�f�1x�}���w�N#alWw�Cb�[�0'������5p���R���ovuZq(!��4�]?�3�|�&��1�������Xx{�u�L\tp�#R<��\��Dtm��i�������O��BD�/D�-�H�I=&���C->���,�����R�BxAIx��^M��7�p7UA�r����0.���*�)�m�+\��8�k[c+w��m���n�x��B�?��R(5�A���^|Yh���Cc�Y��T��[W����r�}x�����C;9�+i���W����P�/�m����+�"�s:m<�~� J�t�v��uL����Ij!��gz���Z���/��L�O�E@�I������#�����d�I�D� 38��H��4<8�n9y)����9�/B'X�)���OO�����e]ETC�������q
=(�	��;_���z8;�&�	|�$��4P���#����ZC�N�y����[_A����l$��MR!Pm\J��!r���4�O���Tr�����`d��C�A-0��A�������WPo����!#��Wo�0���
���sm��}��c��ho�a��g/�@vd����T�����9}�n��A]�����H����y����ms��D=�s��P������*>I�M�d�xp�-��b��AzX�>R���8��)D��������<��(�����W�y�����+�gwB�b-(��r� ��P��wD���P��R��@��t���4\�#5�z->�����H��
�f}��AQ���v�e�������W��t�M<v��}�	"���g�$��D'dCB�9x��.\�����#��7��C�=9RP��S[wN���tU����r��O��z/l�1m[��}yW�'F�	=#����[��K;s����^��e+g<4mH�5q��H��7#�������m��7W\(oU�����c�����8`�T�=<C��D��I�����:� I*<`*����iE����U�6�L�"ShC�6,,�q� Qb���T��9>�u#�T�
���`4A����t�?��g�U�����T�b+�#(�WQ����fM'#2�����z�{7)������C���b�������xp�����"�t)m�7��a�����}�nUt����.��x^I�����>�E[��������6�^�v�vM���#�bw���A#I��Z������k�8@�s��\����:�*S8`�	�n��vX~�p��S3����*�^�����O'�d���1g����'�lX������c�;V��s?<�=|~#�KC#T0���<�iP�
�Z�@��gn=��n����(<Lj��$�������\q7���:x���yX.�]�{/��]���Xu���}#*P��)�~�/��
Aw��|��)���w_��7��~�[<
}��05��.�����o����[H�$���)��.3�F������oc��Cp&�����p?�)��TH����x�z�aM}�N�=����a`��8�����V������0KyC&00`=?��C,1b5m�_����I��C��r�F����T������k�v�8|H�E��b��c1�)�~4�����h���������	Wy`�����m'q�]�09Le��eU�)�puv���*����M\���t�<H&��_I�bq�I�s�
���������{������9�?�Q�|�j�~�;�7��rN���<���y�6��X)���L=@�_d�D#���:���*W/�Z�qw�S����-���E:��1� ��}d>����\�@����*AVG������d�
���6t<��R������Hh����x�$��W%$�Ej
c� ~�!RBhHj
/�6�����������0tka����8�@��"�t�D<m�?���CuI� �/3�|�!��J���}���)|�:����'�$BB3h�>zz��^T��I�US��HR�����Cr�XJO�@�]"W`I� ���6m�hC�q�6��"�X8�G��8�`g�Qp���1�1x�����pI���t#�Q[��L�E�:*AY�i�j�`-er�=1	��_*p�@T���$R%R �/C�������h�����&&f������m�[GI�B0?j�6�t�%(��[o"���IM�v�A���
���u!�!�|@�yIRa�����P[�V����R!H�
�`M� ,��������l�?�r8�����&S+r���EO����[���B9�=������r�]��N�I*
`I�C�i�2������v
�9���7�k��vR��������m��>���|Ve^K��ck�k����&no}3��2��I��9�-���E���?F �H;����1���E��h���
���AM/=�����������m.K:�����[�h�����W�8�x5M��Z_�����x4v��%�~����i#��}����7���/�U�:��PvNM����~����(W<xr���47n�kn�8�.���a��q�(����=��V�n`�c��.����S�X�p������f+���j8��K��p������q�5}���W�������Zp�j�fvmp-�"����R~��em]������{W���)�����(�k�%����O�5�t��W�GeR9)B�T����E�X�)�[I���>�
k�)#��u
���g��t]<\H��"}x ���I�����c����x�h����r�_�:��T\P*<h�mNG�y9s�:�T����a`�[R:�x�%e-�>���m<%7�B��
"��}��<�����
��7�����t�7�K�
j�&%R/��8 ���fn�z���f��.��������*��O�D�@��
y�-��:��6�����{�#����W<`IT��
�*�"4>	��LI�ax���DWGk��p�u��OE!<�coE������?�mtO[���w��b@�~�,�
?,S\�`M���@��,���@e3-8�hr@�)��*���&NF��H0��X��B-��:&�{��5��)*�
���S��!�6\Y ��+v�BJ-�����~����6�7�z�.)��B-��O$�,��
��M�q���L�q�<$��a���L�z,�'���)/x��t�Uo�(�B-k]z_�D�c�
�I��|�@��dR+`pK�6��Z�B��]wH}?�OW^�qU�N���`�"�@[UU	�c}���"H
���>X��)f�xH~-�J����6/x OJ�������:x���	�I�����N'U�����:�w�	w����< e�fu�u��O��@���u�H����@���7�B7����>p��#��6<�.{�_��������eN��S#�!"*�FL�q1W������E�GD��&�s�G�=s���
}S�yK'��$<�|5:�����r�
f�%3����E����8A(�@��p~���ukA���v�I�e��M`Jux�������La��O��'5��� �Ne2����+G'���L��A�����0:yhL'�����}9g^� 1����am'�c�����"T�
n�8��=�$��N�;}�O�A�D�������)?xP�]�)�fLB�����}C����FD�W6p Y�X�r�^����/�y�Y}U(T�GA��#n�u|��rX����>.��D�&�oJ�!���<�O�kn\���Dt���]��N�����S:%W��?�9�Y��aG�7l�0���:r��p�����I�1e��*l���T���E���4d\ G�A��'P$���O`�A��$d2����������
���C��)dYx����&qH��<�bHe��(��/�C*U��q-D>��,r����H�HC�nV��|Q�K����s:�~��.V�w+���oJ0���G��%�u;s
�2B�!��
!��S��r�$���>S<HK��>��C�~MD-&�a�pD���.)d���eX���Dd���
�w`a�)��'�Bl���8R9��������t
��r����	����-��SQ�������T�M��a�������&B����������<�_��9i��]��L�@��
�A>H	|H
]r����G!���z��^�c>��R~�-����zZ�����}�:�z�r�v�����idIyA�z#60[�������/��t"7��Q��7n�F��qL.x���Ri����a�h2�o������g� 4��A�tR\i�rW�>�,���B��I~����K��

��}2�G�6�Y�D �\B�z=��gok/SN`���N��0��K��)A+R,��g��
�{��I6��1!���(o]��0�`����zY;���dM<|�� ��,<(W��t}�qa��}5�������5z�P�I���?��Y`)����|��}��n����
�zb�	`jZ�&�q�N'T�hC���$�Q�5�y:��I���)\C^����t��N���:� .�m������|3��M[��f�%�	�(m��!MZb����N�I��m�����Ga������C/��\�`D�6���)�>���.��i[�����aSL����kp�`���<�/]��+0��%G�
-�2�@WC�3���II\�`����I

C����s�x��F��(<B�z,��,�md�y���y��#T����<D
[{�����	r)��h�zF�W<���F��s���)�<V�T���J��`Lj#,��o�@ �h��d�/�P,d�%��'���m����~��d��4^���c���:��u���xD�V��F���b�RxW:I���O.�z��N�� x0�@�~W0�A_�!P�������'�+��B
�`�������T�Q��vaL��#����1��-�j��'8�P���T�*��q��2ThL�:�	@e��>�������~8�\��4���s5As[��v_��d�T�m����:���<��W�(�o��vm�;���w����(T�=Ov�G����s���r�������?I��=;��Po�s2�p���B��z�B���P�������<���/s����v�����A���)ho��a[)�B�v���

p�	_�e8 IDATTz���nqp a�q0�@����	�o%y���<P��������@�< u��&q�A���=�����,&U�s���S�q{,R��P��:�H���u���rQ�$�\MF���|����<)�dp���T�bI��$�I� ����U�����U<��6���47�w���\��A}�h
��nO0��K$�]��N�]��p�d�g5���hsibV�
��<��'���j��@���0n�Nn��$���������_��B
O*�^ ��N���)�\/��c'�����BFh����TJ<P�^�t�/���������+�(�B�gM��~���;�e�)$��a�o
������0�	88�;&0���L��B!Thj����[��Y`)���"m�W���� n�}�=W��������*�a������kp��DR�s�C�C�y%YR"%��_�|\\���[��o�Q{�-o/SN`���g�x{���VRV��R#U{R<x��#�qt�}h�(���a#����[��V�_/k�CRBx�W�[;7��P�����*NkB�|� �(��X�.!�N�Zw������VO�~�#�����,���t��~4�����kZ�asqx����\�@�$���Z@
�8�d��Y�������EU�]@��hu2�<Fp� ��?z���M}�O�r
�G=�Zh}�����N�+�����.8�����\�`���X�I�k�T�%t�+��Wx`��E��8O���A�1i���h���wo�c�0���W;0%��+�?�8_��������v��������z��81)Ce��S]CT/_�	:�?m%����M�H<�"(+��1W{����
q�Mp@a�3�R�	�O���gbH����:�n��A
e(��Mz\v���&����x���vP��{�Z�q���_��[��T�K�x����x��T
"�T���2^���H�`.k5
c
��xP��Ox�s���<��X�x07/-�s������0W���0���)P���������t��Oe[��}�
V�S:`���y����RB�gIt#�`�lQ�~��I�'�68��5X��A����$q��=)��W��?�&������������=������KU����g��Q�����n���J��C�t��6���d}~����!���}������%�Q������,���kV��+}k[a����u�<0j�}�x���6���y�X0��=~9�s����2��4R<p���M���<L���Oi���a�ZU6�������5��4�q^��)�P��w���A(S��5�]0��/?�H`+���!��,1�����y�����7�?��S� �B���,������S���).0�!�����J�z��0
{��10;�J�)�[[b�bDI���CR9����S�Oe��tg.�����p�`���<K,l�����x��O���O�O�8h���<1sr�	���d:9�*V������J���1n�B�z�������Y�3HAA�>�6x@'�iq}��M?��T)V���I���-��)def�GK.m�uz�3G���_�c�Q����Z���dCr�w����2��!��/�8����C!(7�q��XU��-+K'a��Y:������+'�J�>(_�)�hc196EQ<`�
��.���(�z��+-T]�4n=&}�x�N|:RH�����B�������iH�^dWP<�v�`^����t�b�K��h�B	����zMy\���j��w&�����d��q��(�H�B/��t�����������un��K����Cg�����QA����L*!��(���Y�&R��&IW����[���8��p�I�������x�,}�x@��1��*�8o��HX�E��l��Q�\L�|���WF��k����Ae
���	�=w�b[��NF�Z��9���]��
�������y�r�BTc
���	�l��2�^]J2����B��)Ua���\��L�?nR�,��.��|�Q��x^�&z���.^%�`�}-8�i���Na�b8O*
�(��VM�<�-_h2�v��eR��X_J����1XJ;����f�iw(���y��x�v�-�R��$Z�� )���/ �K1��iC��p�02D�f�p !��(�p{��x`�N��}r���l�
-0��iQ�y�#�����%B��i���y���m,�������N�'u�T�u��|a���+P����A��[�I�O��y�������$�E��E� ����h���MX��hguR=��l��S4f)��4��������37� �8 G�BvB�{���<�.+�l���O���QH��� ����
X(����b@yX��l���������/����$�2�I����P�>yR�R�X�YJ�v2$����5���U���Y_��XB�n:\"�����C�9�<psU�S��<&��#���,���U	J��.:A����]b���Q�Nx�D�q�(6'=�tu���Y.x�����q��G
j������V�������G4a�y�����!��<�)��"�^�J����_qp�U��,��1��"���J��q���Gg^NQ��j�H|p�@�I������K������W#�Y�-��/R<PS��P���k�3���98������%���>�4M�9S/psm��u{�-�wa��m��n]P�J��<v��K�U�R�R`��6���VH�k�������������p�b�W�8����!p�N}R�5�(^RLvS�sga!^�G�6�(>�5?�����w@�?�H��4�*6{�6����Z3{/$J��N�����M/Q�b���	i����v��d��..hk���0��������������PS��5�L���	��u)��^:u�P�o	���#����$=��B`!��F�Z��}C�:q��B��V�k��-�����2A
���������H5a�'����#)v4�j���	��<J�?����?y�������'00(���V�
�z�X����J�6t�!$�1]���b�D�`t�vp�0�4��	n���AKk�k���W=���
����,1���3��������9����+���"0�4h7�&ES�o���3�i���mLWL����,�O���|<�z�D��������0�cwL���d���q�$���
:��)t*������A�	s����!h��/b�?s7�Q�L��H�+�5�E�M�1�B=�XL���+�M�k=�$�;t�U�"�M2�mk�q�'�)X��������o�8�<?�8m�3_���$�N.N�P*�hs_$��6��8��Cq)	�����)�_��L�aq��N�_$U���m�������g�����lv���D�s�b���%��<���}�x���,����N`��	Th���O���!0UL������L������d'��iY�i��"p���:h�B�
�'�*��3t)��a�,��8�v�>Sb`����)5h��@���V��`�H����x06�>\h{W]�{��b4��`�_���\���}���?��&<A�vG#��ap����Nmd�*�����~�n.~NV�C���)8�J��J��ySPm��\�@��*����!Ol��GKx-�����1���Rc�`^�|�l��q~j�:�(���y
� C��X��j�r�yG�r����Ga����aXb�=� g���
Rx��rj�)d����Z��H���r=W�@��7d���|jC�S
U�����?>�sL�����(8�����u��M�Rm[$�����?��g�T��	����7WE�Jw�\�@�N�=��o��aIq�o��A&��c�B+u����9m��K�y/��T}J����y��D$H�G��A)���]
�����m��T�ERFhO�Ql^���72�#%�,z��r��m;�	����0���%���dmM�x��f���A����~��t^�Iq�������������7�;��5��q#U�x�K��UZ��C,�����<���V����=��^
�X[Ob����2��l2WaxK!����m+Sq�� �~��w�>J%iP��7�
R<P0����l��)w��@�?D��&��[P�1�H�#��jum��z��k2[��+�C�u>�S�p;�Sa���9�5�j���Ww����H���j>�2��.�����@ywC�X�sz���� � 5E�z6u
Q��%"_$@���M�F�N�olB*28���V��u8E�R(�L�k����C!d�`<K�
�8|�r��V���4Q����aS�$��=��9'���P
�g`��K=E��4O2���G���<�y��s�����\q�)!�P,dD���pq�*��@J\:B���������#�Rxs�-�`�I�����i��at}�[��{P�����D�D6KV=]�N�Q������w�0�w�|�l�xp��.�`z���������'��Ap�3���y8�EL��:��7&H��eRPW��m(�6r���w`d�U.Q���f�~�5/��L�5�#����A�<�����=.O'��o�*mM�|r*Tj�s�������=���]~G�4��?\�`���\��Y�Kx���m�7�����N���"`���[��2���D��
����C.&�\r��C3�M.x��Z5�8t����S')��"�Vu�X�Q��d����=Bs�OA������&��Mu���x2�\�
����G��]�g�}�
�b��M������,8�b�+����Mpd�ZT��E�:�Iu,�	�hW�1�n]�����>���A��O'`��@k�$����Th�3���L4���C^)�D��������,�=��a��h��Q�:�C�0v����.�)�W<0�gpz}��r�b��
�5�n�jA�h�4��H��iMF&=&�}�E��C���u�a5H�8��:��+
y�Ra�L��z��|>���^���z#�E�
k��-@9R���x`����b8u`�X��m�u��z	m=k����B���:�K�
����T�3}���),<��.u����p^\*<`e��V���������c�j�bxuR?����������*L�0���z�H� ��A�r&9�/��\����V���Y`������v����O�/���A�,<��a��x���}9ZON�������=f_���%q��7�cR�SC&���{i
�B�Nn�������Ga���?��0�sS��������M�U<`����Y�����C���pR(�������������;���M!�F�8�6�a��uz_���v�<TK<hM�����,�RH+
�0�F�z�<{Oac����J�Z�/D��0���^�7bFz��ML2�H�`P���1�6�u(�C���s��`��a��;���M�yS^���Lo��U��"	��1����u	>X|�=w���s��s��[)�$����7��`j�}�A���}l<��v0��%��h^�H���V���i����OX�1u�R=`0���t`��A��@6L���;Sl�4�����dm��;�����:�6a��X�4�e�eo�����_���!�@R��*��v�"`�x`ci��4�0��x��$xU���`g��q����=��[,���A=��K��o�(��Q��`in��?����w�.g�v-<$�!���$�G�����SG�����j�|���jA��j�0��������8�Aq��jAR���)j~q��ZVZ�
� �z�a� �@������������Q��� �kH�����%��4����E*	%�W�6���C���y�	��a���-<(��%�(�BI�+	xP�z���yC-��]�JJg�a��_��J#�<(��|+�yC-�
I>1���G��0	j*N�j����hoA�c[sco���H�a?�i,�Bi%q�Ai�%�[xP��~�����.I���n����7�Bq�L�P
-��"[=sBGH#jA��`�0��&~�,�P_�������_xP�ujA����]GA��]��?��$u�� I��y�P������(j���AQ���0�����V���_�-��Y��.F���@��(<�V��U��v��Z���(�2����f�*)�,$U�1�r`���N��I5����7�(>?*�����
=Q\+���)����un=|Yq�d���_�%u��$
�
�Q=�������y�:P$���_��N��D�]/���}/���M<�3<�|,���)<(�G�=����%`ag6{N����,�	<(����&���K������g�8$�����r�����SJr� ��|�A�?�L�������o
�k��C��X��}����/�^�������%�GR��F�ix�h6��h~*N.<(����x^_J>���
������6�x$�!�kK>u�4������]��B �a��7�zU*}'�Qi���s�B��L�k$<�^�<��?:x��w�|���/�^$�x �gx �X*j	<(�S�/�A��(��O��4���H�o_��|Mou�A����
<����k����W��&A�@z�d�����>[x�������}*|nMJ���}ix@��E���	< �8�Y��N�R<��#�@��&��}&���������=%���HZ9�@2O
��d�����[x]�3�����	<����k����W��&<��/�%<��O<�tl	�����H��#����Z(/VK�<(����$��<�y
�~w$,���'''CEE222��1bZ``���M��m)))HJJ����wy
�4*,,��������X��MI��#�������E��R�%.�F������\�YF2�-Df�\Mq�g�V`]���PPP�I�K�c*�"D��m�mG������X���Y�(�t6�a�Q���/5�����eYE����T�~���y�����]R=UL
�Z])�zxPKGj�����Q��1H�BV 
<1�����.'%$�LHj�X��Y�^J����*�r����UV�����lSql}�?���_�_���0?L�7�����������/����?�5���%��m�&��(++/n-v;�������J������H����K��B�*���3O���o�">I������:�^@�����V?ZtM����zj�K��_���#�?^�[ :�d�����$eJ�?J�.qeu����N���z���9��y���?ud�z��o�R��y����������TP��C�(Q|�I�b�t$,�Y�l-�N��lI�#������qU�p���*V�������r���PW:����%n33�d�����VI������4�����PbS�5)q�
0 O[21o>I�?�L����~���Mee~�����QQ�>$�.�m���4��dL�+~6�{�S$�B&��o�?�uO�����s�S���Gdd$�����/��Q:��8V������{�����wU�,�e�?��s6�55��b]iF�?J����Y�������Q����G������i��#��h��	�Q2�I�tYy�	�Ci����*�?a~X�q M��P��,����ea>�zS����iiY(+���oy���F�`���x����������o?����[������r���&���%�UV�CXX.�X��������4GE�m���(+�a�^��,M��P��,�-�?J�CiY(+�a�.�!;ea>�<QV������P:�������(���BHkd��NY��0O|��C,xp������`A�@��C�Wpv��a�,!!���.j� ;������Lz�I���//j��)������
 IDAT�=�]����L&�I�����n.r�J�?����,���JLL���F���{�(����3iii�1JJ��$i=������CZC�,�G�/�����(�������e�[(�GY�a>"��-���`�P���AQ�[���S_'��_��E�E������������E�T��++��)I������5�V|�gAY���+���|d��DY���2a=�-�CP<(��$��?���x��;������������������Q�C d�9�Kn���GY9�#�G���4-����GY�?�B����0_��������a�}(MBH��%�UV����d�@����|D�J{T���0?,���]���GY�����C�#�����|�y�[�xP�1(��?��|�N/+/ba!�����-��/biz���e�?���4Gv�m����K>�i������,�QQr[e�?��|D���|<K��0?��7KnK����PZ��|D��KkDH�NY��0O����,��0?���)-+e�?��|������%�SV�#��������E�������wvYy��~,�m��|K�e��(�!LT�9�Kn���GYY8���cZ���B���,�Qr[ee>"��K>�iA�J��%�%�G�}(-��PZ��������P:�AZV�B�Ci���)+�Q�#�G����������^�|�-�<��hl��x@�7^�R�o��[^���,~�`�����"��2�c0��U�w��Gv�~�Q$�r-V"1��Hy�g��2���%*k�^���$*S24��\B�ww)��r{�w���
z����������s��m'C;��Wi���^%d�N]Y��<��tl�1�����G�!1���2y�;�@������B���,���|�W��kWf�k��v���:�kW]��.�Yc}D����= ��aq!e��M*!6��w{-�������w������
H�6��UJ�.7�sP�*[�6� c����[�v[�a���|� ���8|�'y�R.������K�{����=����#�0�6e^ec�'J�&3f~���H�������,u�?�A9=Yd��zs����[��R���
�S�G`���1�h��0�������Y1��*����"o�)�����J�M��s��g�%�3��+F��Yb;E5 �E���O��7��|�����s<�:~�j������w����?bi<�{Mhs~���1&������x��zI>�Z�?�� ��x ���=X�@�@�{Q��-<�<����:���>�$(H�����{@������s<�:~�j������wxP2������G�9��y= ���x����~�V����%<���mx ��9���m<�A�@��P�@���[~0�`���h��>L�
�����s�c����3�>
��N�����X�w�j8W�����c&>!������"2231~x(������������$��z��������sPQQ���zwi���H� �����%x`e�3#���c
l���lq��Z8~>�)��o+f/V�W������#�U�Y����}�VL������P#xP��$�`���U�p5�-l
�p�a��6��mc�n.�1��D$���������1�Ze�r�V�jR���
J3����tvF��@��k!�����(
��A��ua5�����AD�����]�z�������9oyM38�t���+�m�K������nm�$&��s��|��$�����b��h�������9aXV��1k7�x�x��eROm�r�AH�:�������
�d�����)'�A}�5����~W�0���<R��-�5�t0EvT:��E����#q�+|H�,���]�[��4�����|9m����A���l,ti6�X�
�3i�Z���r����Nbm��R*_<0QWFk{c�$CSI��%�B��f���"0:�X���������#'��m~����^����6x�k�X~e5�w_��$�s�hcj�I�xdj���4C-�k�?�������'�n@ !���Z(R�H�@)J)J�W��
�w�����!���?3��7J�����|���������w���c��!���k�w��4����x$������y��Z����<Bvb*����<E�����0��n���P���0�Y��:EJ��n�\�������ih�����*-��lz�8���-���l
Fu�/R����]K[�i�I!��40A�����t-�y�k|[�����Uel9��)�kc�_Kt�^��B���"h��'T����*�yg[h�h#l�o��SD�P	i�)�>�����u
-y�����KW��<��Q�1��9���g����7t��3o��[x}���xf��a�ZA��D{~�<�~���`hU�����`����.7��f��z�z�%z''�I���ky�	�FSC��ha������n����'Q�t�C��k����K��|�"t�������q/
��1����[HIMC��p�������5��������r�����(��|�@�
-������K��
cJF���[��	
����1jH��2��l��uu5,\��>z��})��*�j �xS���Q��L������R�@���G=M�~���Q~<���� ����T���yU�A������������NU�`���m7Z��>l��G��I\r�q�P�A_����cj�F�����<��2	�C�L��<���F��������
�i6���r�����NV��W��Q������n`��	����z������W~J< ��w2�6���5�@��-���"+&����`<�	q�{��> �P(2�lq�X�By��_���<��Gl=�>h�U���<H����O����a����$x���'c`g����Z�����s�{����������4�[����-M�@�}�������gb����,x ���w���qf`����J� ��}h;���������L�m��a���8�&x����[;G��_���q�x��8>!������v��"��u�[W(@�_�uv�5�pD������AuS�4G����:x���������w���5�
<x}��������^�����<0�i���x���K�T���Or��_a2T9H��<��HG��M0�>���F��^x`m��1�\0�����s(���L��}0���z��MP
dgd"e�����D�?�t���
<x�����8l�uc�����;P��6V�Y��?V��	#\�P��^�6���z�u�*����R����AkK�]�S?���o�����S��Uc���������6C�U^z�v<���055���L��P<��}�,��0w�*��d tu����tjTu.��������4����Uu��"�<M
5��d$X����kn�*:�j07���kIx����!N^L���);�O"3p�F�T�r;�����>��X�#��Y�QE���4[5�GU��l��hde	(��@�C�q�l&}b��t���8t:����CXu\����~i��)�Q�d\�����L�`������:���x`���.m
�}�Kmtji(���X<��KF���7��)����6u`J����d�v��lUe�����g����;N��xv���Z�������l ��y!"����+��c��P���`�B���/�8W4���	���p��`���+>��cf������co����@�/�_��#��i��m����@0�smy�oD<V�����C�����U����)���4���$��6f���Y���]P�����*�P���>�����c��G���.����#�;�E}R���<�p=$T&�5a�U���	��]�+#���A`3�1�k�������HJOG�J1f�Q�X�#�}�a�k���V�|��������	4ECPH�O�@���#g���W� ��%8|�R�!h�w�6S����'�����+��
�M����{�JN@'��N�NY���94H[�^���|F�
S<��x�;6���1
��#�rp���1!h�f�K~�g���Z:�r; �m]C��#���.oB��cai�w(+G�O�6��~/�z��|p�����V
G���p��\���W]]w����)�kv�w'��A8w��-_���GL�?��V����y����#��b��p���	2��{f����v�(�_��e.nPd��\yy>�Sb`f`�a�>��+����� 9=	7.�?���?Ec�"e{�����/��"��}a3���K���50����a`a���g)md>��C��<k\������^s�����5��o�3w���m7L|�=���I���-7���I�����}��n����It�_6o]LY����n���r��I�W���6�;���~�������:z��C��g�"("B�7t�"����$V���] ������O�[
��p����,1y��8�0�@�E/hUi �L��#t�����
�.DVt(t;q��u�Je�����Y�)�t��~���t
��w9��5�������^��;X2������� ��x�n��/���RC��������������pt%��h�k����/�B�O�[���[Wd�'A��O���#��5��O�"�������#���4]���AVD��!~�7>�
�i��7�Fc*�N4�n�����H=�SN]c����CM_���a6�&�=��QA����
�������/�Fv�7��ihQ5!)"�����,��z��v}3d��J��=���{e�v#I��`��U%������mA9��������BvB�NnY7����5�!�.;.�������.�D��/��Ns�vf`����?}^��+a(<�l_�����;��BX��G�����{����S�1����;;�������u�g�@W�zl�<��s76��s{4�"���>��Q���rL��������\`�~��TK�DP�;���i��2
�wqBA�;�n]�Qa�F�`��+� ���ZU$���<��,ll�f�35��G��;��C|�e;\��GEcD�F�Q�,V��Gl�D�4�s��
������*��j��f9}�S����8s�WG`,����E>�~1IXw�_�=��+�w����������ff����&zY�Z�����AQ��8��[��d?��� �;T��Ot"���cRg~��0*��bQ���g����~��)����3��4���}<_(4eT_K���s���P��Z���>�Q�"	=����K^�f�2���%aBc'�������\��8��y��	4X�������h�e9���c;=�q���$�`�:�HJ����f�
t0�uUY��Fz��u��^hy���^s&���h]�*7E���U7?�@�o�����;�$>����fP��,v��m�wn����9'~C@t �:�����?��6�.���������t�[�����'��NEk��~����[;����P<������;��>�}��C��)4i0��r����NC������������\]��:4p��\D�:�8�����?�y��~|V��p�
������X��:D�s��������2�~����l�7��+B��F�����	L��F��+���B"G���A��c���T9h�L��b���FY�I����P��D�&��1�fE�W���r�;�����t��x���#�~0L7E����H��Z��'~�Ud���<�[�@�!�����I5���%��1*��	��!z�+�d�������cRb�gb�:�'��c�����B��}��;/��5�C+;<��)�(_�N-���U��U���C
�?�q�A�m~�A3��c��O�F���Q����e���_Z4�\�E�kh����0��S���8u+
	T�������<��3�h][[>�K�&���:���9������|"�),���7-������,�2d6��&��A��%T��/$?������4 g�����r���#~���� ���!#%g���f:��8�����d�2��:D�;�8=`Q���g�sa\��Rc���Zs<��}Q�Y��U<`�u`
=C
�9�S�f�7�t�X��rW����.~�P��CWq�~(�Nj	��xLX|��s���oV^��]��i��K.���>Oh��XX�`�����+�riQ4�u��m-����:��+p��R����u���4���e�|g��Bq6�>wE�6?y��� �'ZL���7�^fR��&
��x?!��`��f���_�~����A��d�6����n��������3��A�)���V�sz������p�U�;�5r�v�K�����4u(X*h��G�����l'����.�B���+n�2��Np6^c��vc$�u���z�~�����n�}�~�Q~i���2� ��0��L��U����������|���)"8_�������,��s����v���.`��
��_��)�anC��T`\c~C��m`G��A���h����:�	�qb���l��h����>������P���r,���[�5?�n����A��y��|?�,��x7��l��p�nJ�a{o�����N�������|3����t�y#)S<�u<	Il_�N|�U�Y�w:E�w�*Z�_M��|����1����n����yE~w��}5~�O��yh���N�F�8g��B��(��m��L�p���v�r���m��aa��M9=������ohX��X0��}�w�i���M�i�����u���7BA���	�W���b���-�[������Xu�q�����6B�%L����W��������hjgC=x�*�&����T��<Hc���w�Ufe���v����	��l�@d�G v�^�������
6w>4��Azp0�`�U��|�3��Th������1��:�S�_��t�j���H�F��X_��Km��b,t�6�Y�Z�9gp�&������Hh��9[O@���}�d�����|����"����9�`���Xh��
{k��='�!!�Z��U��~�(G��cYN-'�B�MYe��M��0qn,��l�������G-��g�����ZT�(�M^v��������6���X�o(Dp���uu���*�b�9�j��&�g&�^��&~��+6ap��w�>��k���J�,Z��_��e���%��Y��)�� �%���G1l��T,0��]1b`/y��?V`���g���3��D���uTZ*"^�����pt�GU���?����!����h2�NiV�*��F
<���/��]YM��M�����K�����?����n�����$"�	!,�
���P7��_���P�A�&X�>
l�&�p�j>���G��F��/FZ`��h�Xj":6������Hxa�,^�8��mi,-4�����O ���pO����Qe�����9�:���2�h��M{s��2����CN�>i���~A�T"I'�oB%	*��$�V�s��F�����1��9�v�M:��	-j�8;a�C��`�"xPwie����t��$)������A��wq!^�5�F�O��z����]G��o���5�b�����P�������{�Q���w��p�va���.�w�	=|?���3��55@'N:/?��9�@��o���j��v��P<����_y�(N���G}�|�vn���k�o�\E�+��*&:�o[5E ������m*�G�2�OE��]�q�<��XN�;pb�:F��	CZ�=p�;�A$��V��������/z�8r�
>���Iz�B����:��um��ma��=o�n����;����H	��P��x�}!t8Yg��+��Z"�m|������Y�8�	Z�VH���j�~o��(�l����F����_���"�cC!�;�����\��AR|�
.[��=���#�#-��/�������&>��V|L��^�wm���7����C���y�!�/dzT��[ IDAT��g0�
�F��g���5H"4���/���fv�~f�Lw��A���7���e|,���l L-*H����%�_=.����A�w��:�k17����C��k������	�����x�~�[L��+���A���������651��|�y������;)�����af��I]�&DB���Z���*R�2R!��X�����A��3C3S�p����X4f$~��a|�&������B�V��E�s�=$x���U\�z�fMC��?cP�V�v��� ��5$� ���%������~9KA� a�0u�z�:|��f��=\��S�'�����E���9��\�0�_���_��,�1k@_�^�7�rAQ���O�-z=1fa�����H\���9�
�__.��B������
�p����$��C��$�,�"}b�����|t��D��	wE���?�k�7!+�������vM$���NsK������#bg��FE}�w/������M��_���nC�\\7��2bg����v;F.�������Z�����'�A��Z8a�
-����c����m�//�
�UD��h���D
����di���9z��"~����!3$E�F����W2�Iw������H0���=�~��eV7�F��'0�U���B��"#�
��9e��f�SO���-���`#'�S�0�_j f�=��T�?��������!Y7�$�!�S#P �x����^�r�$�94+ iG�,[��$��f}��T/�T�(i(<��z"�C���#k��&�8vi9�7���e�����O/@�� :�1��.K����!<
���C6`��AhZ����� � ��#�#��!��I���K'�`!��]g���5��#0��/X�ml�.� �`<���tB �+NZl�um��P���q�lq�^x�	3��Htr��y'Oc4�+CB�c�����'L�(���p�m]���1�P��U��N%�<hbg�:eM���/Zq���	�_�S��c_�,��L��?��V���"�.�Jk���/���P@,���b���PZ^���5�KA������\T�je�~Q�����7�8r��'x��ka�Q7��j����l���.n=���s	C�a�`.�
�`����#$��u��qn���Z��-�j����o�2��jC�y�W\�B�@L��j+�E2���i	�a��@Dq�uf�*��]5L:�&Q�A80�`\���u�]^��L,QPy`�����|,�MwXgF���9(J���>�Y��G�k�N8�q���
=�Z�
l����6U�d�����c6����������6���5&��S���v/l��
s���.�����0��"��E`|�1�tc+�����0������W�K���x���5���KXYTDl\(�7
7������QC�a��!([�
���p��>���-�����O	P�X�1������g���n����������3W""�h���)c�=�Pr�.Rn�C���
�a6�=����t���&��3�`A�U_Q[@�������whs�'���Nu;D�t�tC���0��Q������@��O[S](	���j��n��n����f��n�2&d��Z�g�vm����ZK� n�%������x7+?� -)�V�@�O�!��)��&��x<Z�]Mm]�^�Z}�1���
�;����Q�P�����q�c#�~x�Q���ATj�����K�x@��j��5����5��=g.�(Axp�;^Ax��.nz��QUm��!���#"&�n�bP}.r���Jv��X}(#��#*.�p6����]�)U)��>i�;hI�a��x��Px`^�L]�w�BX�����7�4�[�[<e[r���b��p���G���
���	�X�E���p4��6A� HJ$��l�w��3P{�:��;�?�9���)��/���_Z(|�!�5*�]}5�m���Q��<��� �����6�����5�owC���A%���`��3p�3��vN�n�u���"<c������+`��{<�nh}��V��Gk���_(j(
x`��F�-�����E��(T�^^��@���}�������6�+��W�f��v=T�V'\��k�i\�x�}����p]�C��uU3x�}���/������/�A�F��;I����<7��!�xR�$����}*��wP�qS%xP�jA��I@V�QGC3UV6��O.���
����x�������2����Q�L8pcGdb�{#�"�K��>aaAx�|�!��a���7=9/f����a1�oa����<�U�-������7���^��cH��`��"�[�@������M��1����3E���p��C,8���x���-�?��u���K><�u	�BPc�(����x����/��W;�����.������H.�I\.x��o��L�������������T����L�������9HC9k
����v�uQ�s�7&`�@����Ba�A�Z�TC���@fx�|�	�u�&��b����T<�������H���O�P<0BU��}�4�����P60�1dT���
��6B�M/������������[�Px���IT];�
r��9�O�v�B��+��f�q
�`�����������������
��/���_(�<��'u�r��2TE�x�_��]��(���1^�	%�9���x�
�lm�$�;���A����4�������)����X��m����0�M�a1��	�N����2C�����
)�.C�jE�[������A�x U�_�����m�	��y
���	��"�j��p|����0���`��3�����������s��an�x��\���������J7fDZ����-��a�_��@x�qT<��sP�E�z����q���[M�Fw\p��U�0���n�?���	����<�s���:���>��_���b���lB�`����

���=Or@e�Fuk�(������&�������B���1w|)������"��������O�c��������k#�o!>��[���E�������'!��������t^�@q���6*W���s�����9
�:
x 2�N��CCT�A�u#
���Q����P[e�A%�u�d�4��v\�T\��t*�j������������"Y�����s������5���}���hI�
<(I���������R�<N��� =������~xHB�(�E������!�HL���'�hW������������.<,B
w��Y����wRvx�kMs���(x`�I�Q-\��g,;9>o[��\��*��kO}xE&sW��P<$��W�@q�X����`+N4+�����"��b����6��[n"��	xEFa�]�f0���k����2�M�0��9����OW
��Wor>��TX-���7'�a!��TP�������c�����B~������p��3.��j�G=A��&#`�����7�p�Jn��=F"��Y�xI�@����6���B�$t`�}�������%_V����z�X���
��SK����\�������uc9���h��n�m�T!����/��
�P�^oX�q�%�=�{&*W� !��G������TJ0���c�=�.Ejr,'������sW��	��l�#v��X���F#3#M*&�X>�Z����YD�zI�@qNc*#2��m>�?�>��t�?����d.�'�g� ������A�h��I*�q����v�PBq�q�Rc�uv-�#.�>��k<N.C���%���{P�Hs��A�*N�!f�5T/���d��)rE�����bN���}�@��$�	�8��&
���
	w���|?������8�G���-g�c�W�����p�����af��c�\�����j
-�W�%O	<e�o	,T���*�vR�@��sZ�����d��	���N�i?��AH9��d��\����#q�T*<U������s$o�Q��k�`0f�O�v�n�(W����6�A���-�<})���w�>������������\���
�������:��#q�3�A,��]���X\W��b\m.�'n���
Pc_K�@C���0��*b�y����]���88�C���rW�	G:p�2��h�/:
��B�X�7�VI{C�*a$����Q� 
�W��2��D0�=<�&3��:�r�9G��t|kk$,{$����H�A)�0	6H�����l�u�=h�>L!������1A{^#w��W�Bq??������H�,�i o�h���5����g�%�`��;[����>f:m�WgCY��]�.���\���C}3B����K�`����s76c�G+$����	z�gl:0C�(�k�0��r,�>N�_�ZW����
	��\��6��_�[.q^��-q��������[���x�����j������/�9������	�6��?�]@w����>}�A���37��!-d��(V��0����qwQA��;/��"$�P���E%���\,���z8w�|Z����/v��!�p���� ����P*��1bv?���{�qt���B�@,����:�$L�b�����TP8H�`H���am������a����m5�;x����H`��JWU��%��aU[*�����7r�0�v�-������	�
��9U,�dy�P5+��
Ux`�I��\X�����5��Pqb�7��:���S�hU���H5������<P�cC��o�T`y���WT��
HC@B�A��"E)�j�S����{8�y���J��m�w���&�0l���<t�N���5��NSX-�hjci���x�(���T9p%�0�v�t��Q[�-{���5.��#����C*��	��*h�t��8yn)-G�p��N��}�1hV�l������iv��s*�4yC���U?Ac^GY��
�f�Ix�����A��{��#����n��b��tT+�F��Cp���"�E�.��7��An\w.�x���su���V,�<Ca>�;b�<	�Is�H��	�or'f�6H�x���7�S)!
m�p1��;-��!v���tE�/A:�%��;4L��S�q�+`��������F������t��O��nR%�������1�=�P��yLa���E��+�a�y�9����bB�i�0w�,F��s8v.:(��Px I�\M���Lt��
G[M�������_:�d��<�^T���B�::<�q6�����q��3����^H�r.~gpa���1F,�i8�*TC���H�~�J�'�c�Txo�b<3�w���g��f�B� ��fT�>���&tP�������z����c���g��8���	L�*<��(*'�*��*u�P��><����r�;����n���`�� 4*)�>�i5�q����at��8}'DB<���6&�uM��
 ���(�?�(;�UM�����)��	�����e��e�l���0F�v?	�O�
�i7`����-�����pSF�,q����9��T�yg[�p�P$a��TP��R|�A�����@D�n�&&�����d�/j�,K=a3���S{�	�SA�"�@�#j�i���Q���	K�������y�Vx#6sp12����9��e���S�n�2�@��	G/S&��������`����[a�+��V�v��P�������=���k?/,����h���x�qcT��!4M�1n�T[=���qg��
F���K*��@(!$z���������jk����U0�S�N6RA��t���m0m��vH��G�x��oBE'�P��\��/�JC���o:�D�I�K�������[_�+�c=��+�`*a��00!7��
�K�@�����Ka��?���N���-��g���<H>��p������c�������0�6X�Z/�[��i����a�q',�}��5� �#|'�.�[@�NA(�����q��7���Ba��?����\������`/����w���[������yT�T��M��0����V�z
7]P53=(���E��b �	?SPI\sPBj\�J�o�����A]��fFH�q��B:=���<�<=�����D�`���c[���������V�<F�]����7��sA�6���D�����<gaAxP���T/�#��x�e�vT�A���T'���F9��l�]�016�D[c.�f����<�2A��M�f����q#�y<��)c��wOo���7(���v���.=~�c�/q��CJ��p%>5����9���}9�OS�Na�����5P�@�� (g�)��V��U<���Q<(.x�W�@GG�;���$�-�"�mf���>m���!���l\��Fb�7����e��*B�V�<hM�/(����hfK�1�(6����rT��G�@�)�AXJ� ��y��Rym����`���xP�+Y|e��5e��S~���,~�9f���
��x`?���"Py|Y��KB��gC^���a<���a����-����I�nC��'�������:v"���]��$x�Z��W�
��z�B�)I�L�������I��=������5'=+��9�uGw���^SNL+@�����@Y�*�QG9.�
}"�'�\�_���B^,��kME�*�����:5���f�n&�Tsy%�����8'�����]49<�h���]I�>�V�>F���(?�gi� �K�,;
D���L36��.U��v�!R�i�IxHI�J�r���}����EH��A�}�����Q�C0@����M��x��xp��Z��PiiI����:�?���	��qB	�;I�`�~���Lw
T���%�@�E(-$����'k�
��fA�E�FV2���~���*�m>����w.�P���a��@������/�;p&v�m��AEs�\��v ������<t;
k�F��e��mTj�a��B�@X*4pvD���C�qx ���#�m�._�X�f���M>�������Cu������Co��SW�GgJ�=	�p�B)a��=1f�2��W��]��T3'T�"x �X����y��q��

�9����i� �����0������BW��x�����C��?w.r���Bf�7��@����Y�"P�]*"�w&��YW/*$m��]G i����S[_+x�U�X�d��J@ �'�+<4�x ���NS��L�� *�fA��(�*�	0[P�n�*
k]i��n�M{}�8�������H���S@$���^�2T_��~o[Y^��.,,�G��H���T<���A?{$n
�Q<���
����J�����L���=X��	�<��	
����
�@�[d�d!�D�;s����-�v��*JH!�B����O+IE��e����8�'y�+� ��"����q�T*P�!~�����E&^�Px T�}���p�c�����<���gI%�&T2�������9�2��/�n������F�h���-�����5��Qq�-��J	][~��{��g�)8H�A�2h��O/��fA������m�N|W���fP����r|	0�R5)=3C���f�'B^����.cX�F���;�5B��o���<�Ii�T�O<���O��}��yO�rH�oG���G�*��?����Y�E���T<�M(`�G�21�f�6��@�g�d%Lp����g3�\�O����G��D�.E�=�r���,�(������*>;x��
�R�@�~�x xr�6����B�������A^U����t���n��1�
QNa� ��DP�����h�"���7t��S��g,#��BA� �eO IDAT������A�
o<(C5����p�����+0a�����<�x�[��C�uC�L��r�-�����?� ������������1q��x���Z�n:�����~u>�y	��^�`oj�E��DEi���5�W��s�Iv�&�F<x��=t=��,�Li#!��u��u<�x0'����B��e��xp���WR�B9�������b�tt�\� ��I���AS������}n�fA��5�:�����qA�Oa1�;��x`&�p ��f��8�<����TI:�!���XM�G()�{�E�Y*j���dyX(�1=�Q��x��(w�������F�g����h�y�m�B� .�65��+>pv�Z���*�?���\h;������N�����FT�2:F���|�-{����{cu,��(
�Aw�
���\��������8�����H+��<�H+������\D�>����z�L�������}��\��\�~T<H��+�`��c�X�a?K��~��x��mJA����U_S�`=K����I[<-�J���0�;�<�\�z���m�J�y''Xa��H����SxP��J
T�	�H��/Zb"�0�P<����������CK��>�!mDxQ�@_W�N����	�R	=N���F��z=&�6���i�2Hy�^���T�R�x �	����S�`usx;/�����,,;I{�tZ�)��@6��
�@-�`����]�R����Nx��}"�bTqN�g\�����/�H�X#+�?@c�
�G��\l��~����^,#��E�^�4���
87��H�;|��r,Y3���V=9.�2�q��0�=N���\��yn�FH��M��8t�#Z���C�vH��=��x��T<p��4W��������xP���x0�V�������/�&��m
�]���aT<���~��q���
-k�_JE�F:(Ku�ET<���+�����T<��AVl$����AG�x/Gu�y00Q*<��x ���
�|*`V�7��b��N5����x�bO++��9��ZE���cq��T$#HH�����b1^�����w��������	 �p�~Q���A�Q�g��l ���w���q���0��Z����XN�L��:�Q��U9�Ya���zA����>�aM��5�?���[����iV�?�M�r"�8�@��y�_��`B~��*&��UnX(\�!�{��j�L��=���& ����wOzK���;���#70�oK�������Ch*�����{`�������O����.������	�]�JZ1� l�����V?��]
q�������A;,�{=fL�!�()dH/#e���u��J��m\�yI$�4oH�{7U�Pq��K��_��t*(h�xZ�~zp�����t
}�T���@q�����k��B������w�'aa�x�=W9��G{��q,.!�)��L���>���kw��g#�'e�D��P&P'��io�y|�����$N�n����XJHc�E�P��7 ?�w�������$���/�1I��7M��{��=	K
�����x���%-$�
U�t��	��Y������6��64$��D�*��4x�xAA���Mx�E�������������
Lj��x �3JY������b���-�s�1oxQ���P���/��<&�l�o^����9Z	�y.����;��Z����~w�'�"��
������)���x����5��:U���*x�����;NL>���p ��P�1;��h� v�yr'����������
���nf�����5s�'���g}����9�P����G���	s�����d��������=1��6���GD��&5i��w��<8L����$V���u�����=A11L�MCSz��p$�0����8�/�}.|�����!'�up�/����+B~��V��2M��&x\G������P3���&����=w�����r���=������S����a��6�i�A�t��O�����9�C�#l�*8��M#o}�x T����>����F�V�������A��|�4p��VT"p��n������:U�(���y���{�����VH���7/��6mz��i�?���Ox�X �����Vc�z�P��)q/�e�kH� 6:6��qz��������������*'��O��`fU������#���A������w.oD������I�>��22����<.��P�C��M����s����Gp#��n�uT���x��q9�����i������O`�<����{�<e�r��00��������a�Xn����pj&��B!Vm(!>��x��o�X�jD��D�����b�N�F9J�?y��rv��@����{t���Py@X#%�B������Q|?�?�5�78_�XK���TJ0���PG�M��b���Ik�cTJx<x�s��$\!	'��������+eYx����p���vf<�B���Y#�����G�F
$��|�Va�:�y�\�;��m������Y�4���E�{����q�:������B�}�T^9D�����xx���^�~d\����V�6Hf>��J��i��N[�1��p�8�-)\�W��|�\<W7�b���C[a; �X\7���@
��Q�~�(���A�7�4���Nc��.����f�I��pE��{RAX!���x�,���A���(��5m�h� ������A�$������
��l�C�G<�T� �L�O�e&�':I[�l���������C�[Y�4��rb�"�*5�	���J�@��G��A���QT���+�"B�W�9�rW�$bi�`8����
��f�L/S**U3dP�@�'o�� �?O���k7�"U �� ��
\+5G���������~-s��2����~>�nn�w?��	������Ly�>�
�����O��Yy$�
�?���k����L����l98����K\,jB���-�5���8Z3��������bz�.�lw�����I���~��� �`���p'�(�������7r��C� �@�J����e�uz��>F��}>��LE�g�T@^�N�����a	De�{��@�>w�}�I�)N����7&�k�~��>�%U<(Ku)� �;��4��W�b���������\�<�f�-���<hU�R�=���_h ,
�;��?AQq�XD�L��f��Ra����?(D]��V
8H���_x<y�8b�����@�rf2=-��w�����AE+n�B��B�=XE� <n�^��):������z���S0d���5B^�������]�����5La����%��*A\�Pnx@Ycr����#mF�����zG%H����:�Jh�������!��]
,��*��1�;n�>S�(��*�����E{��V�JW?t�����9���3;N�z���v��y5���_	��G�����m��j>�lY��L	+xb���3�dy�J�B�`\���KOZ�|�v�������������������,��u�j���+�^^~�A+��5�G��������'��A]^��s��<��������\@�u��a�>��P	GO�������|�%$���m[Ri�U�v/Q�HL�F���e>))�O���x��{�%�����.�
*�X=�$ ����:�����]s D����2i9b�E���d	
hZq�$f_tD
�R)�-v�q�)�/������VD���0����3�i��������s���DJ���",�x�Q��o�(�b����]+B�ZN�w����f��B�#�5<-k���x�E����"��M=��7UZ-(��k����*�d�f�q�:�5{~&��p��	0��{���]F���W�|
��E���u?�t�A�(1^���'l�4����P�v
7�A[�������K��2� <&[O�</���X_7<���Lf��j�lO	��)�U_�����I�^���%��%fK�k3u��'~h��'R������Sm�(d�k�gcC�VAV���p��3F�����Gs��f�4�c&�	�����A��C9cX��A�� ��vC�����8g�����z�K�Zm�R���_`\��TJ�q�F����1���<<��6�8G��x_7�x*��*�v��u����(�V���G�67%qC�c5\;�H�<#Z����-<��2��A������#�s�q��Aui��K00k{�E��X��]�+����6AHd"�:�j�e�k;��S��f9�?���=�aae�(�:��R5@,��Q�@,�+TD��7	d�gq��h��h&�MxP�B����i���T4a\a��J+;�t`�����������T�2�������wYZ,h�3�0�~��\�S<�g���]"��}�0il%��b�W����Ew{��:"���mg?��[��v��!#&
����7�a�����Ge��e_B�w�XU��l�7R��r|7�Up�������9���L� #<q[�#�cS������$��%S)#���.^�`��A�����=��%��<9��~�P.x���B�Q���
��6���x��z�K�E���*5e5�sq����0��������I�I��|��d^<� (�i�����2N�
#po�j8�@�0�,�g����5��C����Q�G�x��o���<�72�m�s��U��TA��L[8�1�������

�����u��;�%����:B�.z�d���4����j:k��Mm���6v�
�Q��,th���,�jAX!�yQ���z��@��&���z��7�6��I{��qL��5h��D� ��U�r��OU�aH>���|�)�����W���TE�"8n�4���������j+<0&\3�IU	�zG�a��#�(oM;0[�G^{�[�/�B�`~��|��m-���*��wR��s.���s�b���%vzP��fe|K�e�E�@�����qT����l�G���f����OT��9�6����#n4�\�&�KJ�r����[�97��(����BH��X���NT�e���o&�]+p�����_�1�^h������]gx�
y�����7��F�F|!a�^�kY�M��z�,o�q�9�3�q\��9
���9^LZ�Qj��3���7=�o�����	$p����<(�v8����g�w��20�E����-�a��#|w��6�Y�Wx0�{C��D0�/�����-�C�����s���
]0}�1�q�_T�A����TL�>K����=	���K���osd�\��+7��.�F�j�e�z�A�jA��*�I���[�>�p�H��+U�$�<y��t=�8��;f8em��0{����hp2c��~�7�/0�V{�*C��RYAY:b"XT5�_
<x�kR������vA���7���w�R�
���(^gP���v���������"xPPzy�����<(,������.��<x������P��e(<x���JE�k��J	�pr~V���"����R����T�x�k�P���4��r^1���R�)Q����d/�� ����iX��f�8���Z(�y�3na�����M�]x���PX>%
K�]�]+�J�P,&N������R2��V���4�[�k-�j�$�������e��w~���R�7Y����d9���2���i�����+���n^����SxP�tJ;nQ��������2��U�Ox��i������nQ��W�'��BA���Zx1^~����5��X���c�*�C&���<x��U�[xPy�i��)J������W�8EJ�vi���Z��V�u��)���Y�2�������F��Vu^9ke�AIU�$xP��$�:GU�z
�����K���da�joP���4�P�e����I���|WRP�%�S*���u'�T��Vo�lx��k����4�a��]�D��S�!+�d`�
<�w�x���{qs-����V����>
O���[xP�+Y|xP�z�7�R��_�*� �NU�A�?[oC�*�xW�M�q��5*B%R%'h��=R*��x��
��w<H��Cv+�q]��=	H�vP�T�44����j��]���Ss��<G�=O�T�o��Uy��5�_���W)��;��L=�
��������/�A�k��3U������7]����{oT%+z
��^W�3�J��u��+m������*��gu�J��S�9u�J��zRT��<x�sAeP���C*����z���������T�A�=M��T5�k@����'ix�f�\��z~rQ�%�*���u'�T��V���*��]�k�2�X*���x&T���q��R���7w�T����V��������:U���l�
)��x���&�����K(�x�����b�j�_�x�������%�6&&&&��6�H��TC���`������KK�w�
�/��d����s���]����HMM��=���C���y��q��GL�� N�uF��Q��UKPCR|�<'!!:::���*Vo[����(ok�d�d���_k"|���n�����g��������x���������0�v~#�f����g~A�y?22��(����3II����7d�Jr�N���z���s|��4�GI���5u
��5E���"'�����.�]�*���u?�tS���f���W��o�}]c��TEv|��_�_��Hq3
���{��������uSX��q?
��u�^��HF�]�e�-e�/��~���t��^2���}]�~h[�#���ug���/��(� ����N7}me-(�W���f� ��_)����x?�25��v��%�a���MqC�f�R��{�+�/��g

��.�\�+�x����-�Tmc5��%O���!��4�E<�6_Q��� �2�^�]|�?�^	ji�)���(������[�]=��h��=X�����h�&����������������]��p����t��N�����<UrZ���R�<�I�m��9)����\e��XuS�N2/V:�"���F��o���^���P����x�&�zy�M�%�>xP��{=��W����!.�;���Y���Vff&���P�l�WK�-8���~�W�G\\������[�d����Q��{g����^�+���~�W�#��R������,MU�d����R���U��O����S���_�������:��������^�����_��������i/^���������Ps���%�������
UlU
�{g��F����������)���B[(�"m�"-������B��{���tC��nv�p�O`���f���3�����|��N//be!�����5��/bCZ"�<��=���!{��y���P�����!�����l�^�^��=��|D�����
��2?4�5��Ki�mh���|D���G&��0�H/�Gzhe~h�g�P����H���J{�g��Oz��K|��#Y�`��������b����KL�Ri]/cccy�O)��DDD|62���N�����A]���B~�������}����C{�RGS��.c�������tZF�������j,H/���nC���0�P��P=B�|��|D����Czx>�K{(�����L�nSS�On�@��V�#�Z���S����Y�Rt}��;A��iO�jk��/��G��t}>��uu/�}������P���j�{�~)�C{����h������~�������x��<����
�������4������C!d
����+��Gz9�����}��9�����Gzy>�C{����2_7�H�^��P2�=iM��J/�?e~�_?0t��0Q������������S���H���J{���=��2������*)�@(���o���"V2?~_JX���"6�%�O� IDAT�����C���g��WzieaY��`��K{(�������#��G�������9(�CCZS���������!��G����z�a�I�a���|���P���y6
�Kzi��0m����z����������|>�@�����Y@
��z",�O�yTLn��h��@�"����$���;F:�I�����
}�r���E�I.dFF!���N},<<\N���%�u}0�)Y�xKk���M�X��[?�����+++�n!�l���O��H����	��F�����#U0mm�#�}����L��i�G����������7�
��Z�d��L�8iif�!����ZK����7T��������i�����3�����
_����z>��%3JG����?d{��dBd�x�<==Q���QQ�����!�#��j�7&)?�"_����z�����7��NkU�J��|D�>`bC����;E��06����'?����Hj�k�G�~P����*�a������n���C�t�n}��OZ}�1� I�O!��=���`��Z�!�_��0d=��+:2�~!�D���e�`�m��u<�K8k�>Vd�K{����Q������*�����iu]S{XG��.���=$���Q,LUqn�
I�����x��p�E~nAS{|��^���a>"��������y���������mai��h��"��i[����&iXR�M��\W,��X@
��2�����[�hw����#��Y:���i[�z�7���n?a���:U������M�]�K/�j=� <p-�`w��U����'a&�0/�E�|��F���,��\��O�>S+�m�����6�T�D��
xC��!�)��(<���a�r52B�[�_$�1&y���_%�X�E�9x���aA�E/�SF�����w;�����10��	�=yi�*+y%c�+���w��b��f����)K)���@���)!�y�;��#�gm���9q����o}��+^�4�>�f(sO�m��C�������+n��c;c��m��)2T��e4x���}���,���b�nr�`���Q��(���)Kb�����*���3z=���>�z��$V,�X���@�,6�����*�YKN�f��C#��x~�2M5��0'!r��<H���D�>�����<i�
x���@4�V���h�7�3�ho]<��VJL@�^�>,�����J��X@���h�s�8��
x��[X��)��[)����������J��X@���P��z��f/%�b���
x���L�_(��f�<���p��n�t�������1ZV�G[,9�C�t"���x�s���}���Y/]������y�!{6��F#�]���t�u��/Bm�M�:��5����7�g��qox�Z�JM`�5��UI����N�D�2=1m�h��|f��fH� Kc{D�E#cU<����{�Kh�o��,(Q�%<�Bei��W��d��F����x�yW�t���JuF`�'���/�=�������J�������kt�c�{��P��92��N��������SQ�_���
a{N��T�}�#��yD�Q���I�� ��uY��/d�~�N�Q�Jo�A���pt�t��~�Oi��)`��	�������_����(�b[a������["4�o��+���������9��EP�*�P��R9�L�uO(��4G�4����U����
v��R&~��tl��"C�3�n@�
����n4)\�2d���m�s���,|h����;a�?�����S_�t�M�UKGL^��S����
s�/���
+�`��8��z���;9a�Zto����Bq���s��lcH�`|�j�s���Tc���I���;l�qG�t"��P<8�`?l-�p�Jd�4Fv��:�k�����Y��YDA	�{��������W:�A��
x��R
x�m�Q����c���FlZ�N���F!���w|����x9�����[��]���^�f�E�n��k7����q�������0��N��&v�bca��m{����: �u�� mm�M^�8������s����Y���bIL�u�`�Uh��W��j���nD�������!��q�����L�f�n�)Q�r�H5�u[��l�"��C�2�i@`�.]����/�A������X����G�N-X?��:�}����JeWgti�$�����4���l���d�>-���]�����h�����R���L���u�����tT5�IC���@�����H��^�f����t
�DF�s�td�<@������,=1_����
�$��c3����(2$�g�/���/��1�GLL����O���W�o
1�!4lH�`��4o���}a_x`��*"o?�I&�������V�{���O��� DzLL�w�v,��G����A��`����6wR��7���}�W����P���R��kh�`����n��|�#��_D���(T)��`(� �s�iG�cT��Bz��^;��3�������}���A���rS������7D}��w/���,k[+l?���f���xP��E�F|���t,:6=�����|t�`������8rf(�K��:��5�h�mW����1�g��Ysa��#���<���+��X��k��n�'�ML1�i��u�;u��]l�K��������~��A�p�s��_b����8s�����4�&������@�jp��U�X�
3&������\�����	7R��n�^������bb���������v	&,]��~������b@�.�mo��V�W�����#��Y���xa�����@J����^�p������p�^p������8�����X9K��Fw����"^$��fg���o?D�l�a����~�&Or]�h�XsS�O���������9������<�?8�#d�)o:�U�\�A�.Nrw���q'.����|����;eZ�7�}Sk��wc��c�q�"_G�s�����0/��!
0�C�����#�C�`��I���x�b���_
�)m���q�9~���|�1��=�4����<�5t�_���},;������{/�A�3h�4���cb�o�h`����b���(�#���##`��������/}�P�x�\:G�v��*������lc#���D�5?��*�������/cr�:�+�Jyr�:��e;���L���t�*^����Uim0�����F���&L���-	X�����%N=|�U��{^s��xv��hO��wA��]�7>�(Y��a��K?��������SD�����0X-����`�9;��^CE�l�rt7���d4�u�n@D8����������xy�x`U�)�w��M��I2<��%�n������~�"��������M#9��c�r������(x�\�(�����������Mv>;*�������u%x��G���P98To����x~?b�C��q8��3i�gj��xj����v�[c$6^\����Q��"Bp��IV/�*|���Yp��i�F��r�:�u�w��E7��T@���nE5�E!%���������vy����\����<��'����� �l�������������5���Skc�����t����[-[d�"���1���%B_j�	������!�_�>7�m*<yv�[�o���}�hX;��y�g���h4[w����X�&�FTT87����1'jT��P�5�]Z��ON�h�����&��?��
��A�������>8Dx�g��f�G���K���bxy?"��;����7�7ff*	;\��I*��]f��yw�L���u�8���s��k���:�@Ll4��Snp&�_�gTL	o�����G�z�803����;i�����}G}�Zw��"��9����d�V�Ux�0
�.D oS��k������.�
�]�#��ICv�Exx,ByB8onST�a�,��A��}���q���]_D����3`����@����9W��	�B�4���c'`�AU���6�[s�3F��������z�}�����a�uYN���n8$�n3�#��Z��%`Q�b	�#"As6�$sXu�#���;O"��]X�(�r��FD���P5�*,��D��W?w6}[�yI�c�n9
�	�d������F�w��m`diN�A%���2eY'��4Q���$�+B7�Wu�'	v</���\���W���W���A3�h�ir���cP���S9��c�����]�_�j�{�n���e��u�,�`���x��\��������>�1p����DX�:"��5���f`��WO����5���'�!��?�g�[�,���s����Mx��:�������pp��
B�,������C����6������x�~[*��w��
s�!O��(R��|/�[3Y�������N��zNu�	(S�����o�x��q�y�_3 (\�	��=a��]���������v�:�����T��9���f�	�Vf��q�������c�v����1j#m�J��D���w����E��y��r�o��sd�T�|r-����F����=��?�KG�MT_3+	p�����qp�Di��i4�������E���p��Q��||bp�b��q���Q�@Wc�Y"�����h�@��7"8�G�S7>2Fh��
7�D���gb��	���|����J����n��;"L*\a�LMP���V��Q��R�fK�]��,���h���5�����0	�[zv���{��Bs����LJ���k�p�y����:]�b��}$P������^�$�)�]9WQ�z|��3�+PV�����3��^m�W�� <�~�����uCHd8���s8��G��3Z~��w.D�*-�K���H�V��M1�'��lL�M�9�| �\�L�����1*�C1l��K�(T(����_�_#�p�i���I������s�����\�b�R/����}'y��^Eb�� �x�d�/wv��y�(WD��e�e9����X��-�����0w�/
����{�x�<Y�1��8��Q�\�z����^���|��0c�7�e4Eo�%�9~)X��y
[�)�W��e������[�����{���dZ3���kL�F�Da�V?��d��N�|Fb1u�7��N��s��z/���{	�aGa_�o<���A��[���|V��
��3b�bO������F2�a��1r��x����#1��3�2�����w:X�� Q���s:�fe8���&(?����38���6E���|~;��7��o+���w�o���c�r�����'����\?������^Xr�
�8��r%�[o��� �I9��	F��Y1���
I�����q�_U���q��V�R��U���8�E�MP2{%��a���\i�=5a�|����u����'�q������Qu�|O�{�/�f�hV��T,�x*f������k�/-a�A��-�f�s���-�.T�P�x�}[.-EF������|�L7��o�[�gx��irg(��W,{8�9G^q�/9gv�rA{~?����-�tbI�L������<�q~E�<����}r�v4�^�w��-�
�4��C���|
���c���8���������2��3v4����z$��4��J[Q���v���;;n��o�/7�O1$��<�gK8q���o~Y���5C�;z{/�{�<a��������;���B�������M�w0Q~1�-c
{��H��l�����v>���wE�����7�C�o�ajg�H��= �$g�=��
�sC+��� ���b5�H]@RWbN4�����E����4��Yg�z�O}<5�M���m1�y'y�v���\/;��_
��L?�
��U����l���VJ�`h��X}�����v�q��d�Z��^�P�Z������7�D�x
U1���:���ez�f�O��������88I5���������	/�F��9�j�/*��v^��{
�U�'���
s�������I�]�:Xje��X+���V��#�8�	���]���%#��m.m���%Yuh�q�a��'�n5�����6��v��;v
'`:�IG�����Kw,<�?Q;Mh����Q
Z��v��
��9�]�}��X�9��Q����Tr���3�x���R���(\9��\g�X3n�R����%��/���[���?��r��=��>�����m�O-���8��?��!���][a�����BI|[�*�;��g.c\��q}��+�?xJ'3&
q^���d��]����{���|1����z�n���Vl@�lY�1�3����-��A_� ���R�|). ����(�kg7Wg~�FJ�7R��^��{�%�n�}(���(���86l��
J+�Ncn�uysfC���4�/<y���W����m�?f/�B	��>x������V�b��,�-xp��B8e,������K����M<pl����@��0�sE�����$����Y���v��
!����E<���������>$9���fX�+��V��^��<������
�p6�7����~Z��������(��C2�+�=l�f�f�@�x`kn����c��~���>�>��������uK�C�B�1y�r4)W�O���S�f����1�F-�m�����Op��c��;�MEfnpO��������(Gv��d�d���K`h6~8f��)W���/���,�)�#7
d���gN�b��'}�����`V������O���o>�O�<�[&,���7lAN*�
@������m\|��Z5��C����5���CG�v��A��&�p��;V���n��k�KM�A��Y�j������ �NB��p)nT�A���`�} �_� \���Q�`T��q�J��%�a��{��#���u�N��ze� x�*XV��(!5gn��e�E�R���E����n��0
X6v��G���/�w���
U��TU����G�.!9��}� �����a��
���`[�TyK�����D�
�v����.�����ip��&*~�<�-]����}���6d�On�m��'�/�M!5����C�]��x���}���r�D�L�1a� �n6O�����	���'����V\���{��d*%����R�������_O	<�4?.������CQ.�g6��%�(9>3����p.����w��A6�@����`	x�����PTY�'{?A��\�����A��\��&���U
9����SsP�@�s���+��u[�T����
���n��:GG�Y(B����y<���$A�FuF���5�kg����*��)��b]o�� �K^dq+��&/�p��#��x�����7�PIl>U��G�v�r7sU�f�.�t�v�u`��
_��<h�v;|b&�����2,[��F�P����~X�o����5Z�Y@4Hx�XP+�o�2%;�x[���s���S�+�!%�`7����"TC;��#~~��^�������M;[c>�M��*\�.����
Mn�+b���L�pi0���h��>�~�}����e��������	�Z���v.l���|�A6��a{�Eh��{�"�V��y�������AKNZ��$Tq�
��4�;�}0vu�����%x`�EZ
X�k����a�h�hO_��T-kH%���\�	ye�i�l��
�=� x�vX�*�=
�r�.���>�m	������8��1�����
*��U��}$x ��r7bC�a�[����n������R������d'� �����+����x`ci������+{�Za>����_�q��.\vS�����]���93���|�ht��x���a���(�M�;����a4n��������k������0a���qf���?�i
�C�sS^l�����z�����U����Uh��w��3U�|����@��.�u�����7L����F���vF��5�����
]����9TU�@U�����f,�����E����WJ` IDAT$xP�J;��x����<��u���K4L����Q�a?��7^������2l%6�@� |^"s����-����i��]Y�e��H�B����
U+����F�����oM�xto^�������:����
xE0C�I����%�u���U�.�e������F�&O5Jj����������1]��"  �������Yn�����b�=�8����%��q������|	P`��	*��������f6���h��J�us5��++�g�J�����x\�0��A<(b�������5�r��e����eJ���I��l���a[(�����D)�7�������l�����W
%2������W���K��A�J�0��:����J���X��&�����u�,Z���W�s�:���Tf�OPa���2�A[f3���C��N��Z�KZ��)>���g�F5n����~m�p�
��C3b���r�?'�D9���	��^*���n��0�5�{��Vx�7�w�������D>K��8|>�[8`��@�i�(7�n��&��r���larg%�H� ��V����*�;��z�Hw
o|����F� ������/�[l9�����t0�P�6�3��u����0e`�&VW3x��&��v�  �e,���m�����;6��J�8�@����$�_D��	�!�`!�� ����M
��z���FHX�(N[.����%�$Da��x`ka�����m�P'ONz�s[5��[� ���~?v�
��o_<���X�Y���qd�����1�k�������_"��
�<��C�M��+��={��(��+���'?a���6�q��s�_��	<��s������p������q��Dg,82	�3�s����r�)�G�5p����Y�H��|�Z���(&�������;����g�U�&`gA��R���p~Z���?v
% ]Y	�V�SK�����2t�������`,?1
CN��3sd�����
�)8Y�B�Y�������ChQ���Q����8qoA��k55#�0C�+�k!mM'�%���9+��"j��.x���X����N	<��?����~�.�������K������E%K$0G�����A��~�|Fy�4�)X��kD*�����Q����������
�vA���i�b��u�1�c���8w��F[��Z�f\��%h`�����.f������{�c
S~g���c}3���)�&|����G�����j�Sa��?g<���n�<����u�F"��v�AR� ����?j����P3{i��O-|��A��EP.g>�up�.!7����Kg"�����\G�	�q���}�����a����d���������dy�u�_<x��TE�����w%x ������y�E��	����}���*C�4�����_
�y������c�t��[��&���h���7��7���]-$�6��O���TA@�;~���g����u��L���<�|���/�+�m��uUv,=}�<_ke;$�k�G�0�/����������vPB���s��N���Z�yxHI��h��\;���3���j ��"%�]�&����E�c�+�hp��|u��f���
�C��9�6�0�/����K����5|Wg@��e����hY����!
�[7-]�����R+�._�}��g�`��]�g�jDDi?_It�����0<}L`������|1��0������1{�*.L6������I],��@���0e�"�<��l���#�>v���/ �x \2����:�$im�U�|~���h&��� @�6�1F��	���SiA�,�x"�S�3���c^�>�R�������V�'Ts�+��s�bH���c�<����UUm��p���-G������CU99�����u�������!: ����G:X������4��k4�h4���9����W-`^�����!��f
]19���p&��W
AO�qw��&����x`��0��60�B��&�"�^�S{x�
��
�D�j9��~��8����wa?9�@���k�E�\����M�������'�@�"%Q6_!L�G��P�����<�����;�)�����7�N�@E�R�����wX;��6u'4q�-+��������k�0�t��!)x�^�Zd�i[�L����MW.���������n�U��x���y�NbD�:��t���V�C��I�<Q:�A=��c������w������j"�	<�"�v� 7�\��D?�H�T;0&i�~l;S���K�#d�&X�jA�j!6��t�-�m�ov������M�N�)
3Bf��@�_,�
c��M��r�6`�$�f���h3�H� ���,�A)����J]Br�A��{�=�f.Y���s�-��Op�=��M��&n�$T�6��J"$t��b�0d�;��#��A�~�.R	�U�k�bj����������nY�V�������f���?4�=>���0.�����a�7�������w4F6�Cc]�R�
X"og?����^p�t����T/�8';�
~��Hq~+.��W�{��S���3.��G�=?�9��(����M�B����AV��F<�\�l�-�3�s��
jW$O�W��
7}.����_b�����T*�/��>p��Z����W$tP��	qB�����O'h�m�}���<���$���JI���-K)Jl�Hpa+�n�t*����'gUdt-�W�o#K�bx(W�3����G��#d"to�D��m��)�i��)���Ht�BA
�x�&[��������� I"�x����S�8t2FM���������@��K�Y���e�<��	#���^A��@(!d�i����K�z4�6J
D�tK��0q��:-v�7��`U�|N�c�a02�n�R�U�@�=U-j�}�������U�F����=��O���0����U�R��m���4T���B����.�LMDP�ndwLx���~������
Tmj�����`��vd��#�"`�\�+����n��|�$�`��
��pw`����D���72
��`;�*8+M�e�i���������~�*��D}�l���Z�����m�T<�}e=�� �+���o�tD�KS
�Rk����Oo����_�W���P��=��`jn���b��8u��S~���~VO��2��Q���+�X�!�1X7�+DG���vN����m�y���C7rzQ�f�A�?�������\t����~v_��f���-G1��J��zO���#e	]&���SR
a�����I�������������;g�@��eu��e�������3G�����G��!U��k��O���h��[,PA�v|��������__Q�g��Jh�\�^� <��`ei��ib8w�'�e���"YD]�O�E��O8p49��!/7p�a����q����D9����WoFJ���<������pX����J[��p�@�7�+e�C�����/V��	�A�+7����6��x/_E#����9L%��jc0�nTT���M��#4/H&�_J��=Ow��tY�]��l}�}rk����[�`r��<e7�
�w��MQ+n�������cb�����<�z���Y��>�����d{{x���?���I�;'U�
i����J�
�8y%���$6�w�
���(��/~��v=������1c�������9�w����
�U������&�����p\�w�K�6�=2^xFa7��2��_����0�����/�"�]�7�'���?#�b���@����P����M�PF��c�9`�iFS�j�Z8��J ������'a5x0i�+�4MX��KP�����6�
�
���`N��/�����#�HL�?�~�6u��WW�@�I��g�|�	8���jC����-��mLp�������Z�	���l���P�nm]x��Y2�+�Gl�������1�����`����p�%!��Y�����������x�0��w�|���Bi\�	��~��xj��	<x����kk��o�Fp��^A�Ry��]�1��D�^|�~,���UGp#�T������9/��!�	������!�J%�U�����g~
���/7.�1��o�Le�i{FN�������X�;B
�%���"����j�L��b!~l6;�������H�@����9<��+Jp+!!�}76Hh�l.��t��F�+���9����x��?��!q�z�BJ�A����
�����.���[n_�=����)��<k6�l`V�Ak��
�~v����2\�����*�j�wr��-��U��y�&6���'���[�^j�)��18S'�k�2���(�n`��*?K����9���}#�+���#�U��cM����PB(rO$x��7l��SQ�s�uq�,�����H{��%�z���@�\5f���&��RE�����A%�����������Je�������c�7�w�,x0�^��U���������P�@4��`��S��b������������P3Hxm��}RI��>�(1���q@BG
\�x����/���:��������_a��%��A�kO��z-S,#9���D���������}�[�7��Hu�	���;8�Y������T=�g��v��v<HjW����Op\��"l>�C�N"$�orm�nD�V%�&8��D�7)VS�n��������=�p��j\k
n������y��x T������i&,:|��0�Y]����B��Y1g�D���T��[$� �<�erg�OP0��2�7��mH�q��U�,�2�f�|x�)��E�B�`@��X�q')�6@�\�$��Q o.9y�����=�k�Q����m���<��Ii���x���s2���5���"���F��������:����-��Sw<z_wo�N2q*j�����w\�r�r}V2�Z�A�����2-�-x���~d�Q>�n�������K<�.��wO�"GqX�*�]39)x`�7;bI`�E_��������M�A#|��E�B�]�@�O��=�;�����������O�������������J<��l��k���kF	i�{C�2XgD!�b8��0�l<�_n�%��$�����'�#
��A!N({�m"]!4*SI�T�R�!�����~>�(X��@XD��K���_��������p�����H�M�����9��C��M��V���<0+h��$��fy��	�o�
t�X+������p��*��Ln���)�`�-]������q���K� ����m!T!0�<\���<0u��@*�P� �rp�\�����������p#��B��M�q�j"��#QII�%���M��R����s1lk�o����2�B��eD���^�_*8�j����N������������s��0�uB���<aAYq��m���^�S<x>�?���������7x���z4�)�5g�#�kA���"��<U�V<p���W�k��' I8��!��P�`#O��S������\����������Elc."���R2��P<�	�<���|y���O�����A��9q�%� m����
�H�;�/	���]#���0A�7�r�B��r#�y�	���I�P�d'	"�U*��j�� ����v�T�2�^���[v������
��7"�"P���bYk�=4I��?��t�!��;�����TVpr���$�J��s��1R����	���Jt���� �0�nm��E4��1����N�	C.��;�,Y(���5x�asj�Yxs�t%E
��$���.8�!��S}�Z#�^��y$�������m��oOH�(������h�
1�$0 �������x���]�e�j�q6:H7"��x@��qe�<9	U�ZRm ^� {F�^`N� �JVt�8�.*�/�+��0�������,��G����.��B}F��g��|���������UM�n>B��a*%�fO��E�����	/��(�<�%$�jA�,�R���L���m�.U����#�;S����Ag�v �/�{pT��ul3!O����]�������z��w��Q���T;����kB���������5Z����P��[��g�/�&���P<���]�+�]9��p|��x5q�]@�K�O���E�",����-�������P���8Hr�����
��_�������y�/P���_��Tv(W��X�ZmF����Wf����C����t�u|�x��B�@
7
��-�(��� ^?,]C0������H��O����6`=]J$�o�������n ��A�4B�A��x T
xJ8���(d�Dk\��D�J(XPe@(;�Tm9q6�nt���w��|��(�R�@�*�N5�3t�������H�W��������(7�ZYQ�22^Y!"2�����4(x �T*#��F��u�t!�b]���C]t��kH	<Xw�0�S)j��m�6�A�������}q�NV�
N��`��3��7gL�x�S�.XDW
c����9����VB��`9��t�J���gJ(�B�+h�1���8�_(�N^
�J�-�Dn��@l�����+AJ��w�	B
�>(������~�u���^R�`�����0*���~�
�~8�:}-�����Z�(g���R�B@�K������<��){+���v� �"�'���t(P�)X�?��Q/6��R�@
0��i����UK�D�.��v�
�F�t�� ~�R��
�����}d� ����3
7��[b~�T��Q���(����?�W��r$3	����J��6l�oI�m�	���_�q�u3dH<p�:iQ���o�9-x�u�Q�>A�y���j��B�\����-�@����^T/H�x`E�<��������6M�����xl���R���s�B���M����8H����m�%����vn>]��TT<x0��D�x`Gw������}
*�C�
qkx�)�o�w�d�t� ��w#��y�a����W�-&��^��c�HXa��)hY�'2Pu,<2L��<J
m�~MU*��
j7�.<Xsv��3�����~�X!�7�,�L*'T�SG��.!9� {YJ��E��#�V��At.^����~��x��r���<0��y,��h��t��	��|��S���a�i~��j�H�����!��<��d�Ry�I�`������5��������H�W1��^���!����<�G�Pap*]����~����U�����\�:��T?d
,	�9	��y���4������6!)x�&�����j��~x�T����.���t�@lf����2����J%�&��$�\�J2;�������ve*���!xH����m0p�B��U���j�q2�w���}_����^=�������@O�Q��	����
]�W��Z�	�5x�@Wbf����B�������_S�3��A�kB� �2�n��Q�Ol�����=��P�0�H��p����@�^6;��A[*SQ�`b��X����6��AR����\��������P9P������M����W	B�@(K����������Kwq�.�CY*���67���k��l�l\�����������<�Ox�+~YO��b����oP]�YP5x��ri�����������!�mBB��z]�W�|�U�����2� K-|Q��j�XRQ 3��
e�Kh���Yu(��I��S���T&�O�`KWoMc��}cG�������| U������o��������'�^O��U).X�S�5���4]�4�(��-sF���1�*��jT.+!
%(H���������[�H����!kb�������`[)N
7��JN<��I�cgX�o ��F���"� IDAT�Cga��)B���un��;��Y��--���V����������'}��[�����<%83�|EI���(�_�;aH<��M58��A�_M�'kJ���3oD�� K�������~��T\����ONv#R|h��x����;"t�E��`	'�'�)�r�yh�_(}�����<����O��g��	]����o����[���vB�����r7�F.��)����y�d�B�`�7�x��
�I���P0���x��%r�����cP�
	�[t��Bc,?�6*��������?����rfm_����9;7�\����'
I�cWK�����"o�!��W<x`Y7b����#B�x��MvPn1aHN��O�J(�5��������Q9<(��
��W�Re�.^B��I�����x`���nvv8v�����_�6������c��3<Y�O$���I� �~��^<�~���G8?>��A8?�"��t� �H^e�z�`D�	rL��	�_D��V�lBX!�6,�u.t0�%N������f��m�bGw�]e��(mA�@�
��MC,���*D\9K�����
����;�6mz�8x%�x�����gl'�-C��T�Y�=���t_�g���!�O���w0�<�<��G�T7p���TD��|c.�[d�+J\����`lm� .�����T���]^E�;��`zU��WV����������"^����2B�J������MC���{��e{\(���F�=eQOR����y�[an�'
)�y{:K�
bl�>�%�(w���8O�����~y���r��"�qEE_�����z�"��<�I_�<u'\2did�`�D�D\f.�_c9Q���]���zT
P�����`<x`I5�Fte NT��I�{� _���nx 6�c������W�*P�X+�x,�XP�p3���!U����nWn"m���C�
��ihTw����S�_H
�:�H�s��p�p��v�V���JhA���V���
�P�V��j�+���>�L'�K�Kx��(Z��t��v�*���8��6�+�I�J�q���o1�nf�h!�a�`�O�BSHI����0�^A�c7�&��FW�/H�9.��r�7.��3�� '�D�����E�|����[w��Zes��������=F�mH�*�������]�^����<�t���[�x��P��o�t���B���0�c�=/,��/F����Qn���g���������:]�
��'tv��\!��/�,��A����p��Q�fY���=adk����aQ�4���^��^��fUv�<]�X��,��oZIX!6$L�_P�����MG�;�H^?r	f%�1��2�������;�<'d�>5U��0�L�2����u���)��8ylG�������^���y�9���!��x`JW�O��������g��?:<�W�*��M��b�����X�v�f��.���{�����Gtb�']����qw����BDXv.�������*�A��ua�����N@eBBi �c�]�����p���������-���oD���PQ9�o����JwB������-A�6�'B��ph�d�QJ5��^<��TEH�x ��R�;I� ����^tS'\(����X��tw��2#��8��A��?HE�{�����-���P]���)!��a���
&c��!2@�o�R��`"�@�o��HHA�O2p�^ekw���g�.@h��Vh�{�,�#�-���d���G�����fl�F�~�i�!��i.���M"d���vz�<d�SZB�����<p� ���U�@��AHh�	���Pk����k��7�	���_�{�.�����������2��X��a�P�ys��wm�&*�<�r������9���+� ���j���,8xP��1�Y{;c��Q���
���4x�87����!T���� V�k6.Z�����KJ���t-u��S��=�f{��x <������~�>������j+�:AD�_��JT��E��`y��g	����F
B�`���2��.Y��\}��aN�AXrv7O�9�9���5�Q��U�jXqq�5|w>�V��"3��Y�����t*�o�x ��zTB�X�~�o�_��gXD���<���n����a�6?�����3p>����@�9��x�C�y�lP������XH� _vsT�F|8��~,Pn��Z����7���@[.�
7r�c�T�_�5{��<�-o�@��H���{��~��*��{�j(��������"���dBP`��Ip��g$rg1����(����}l�&_��f�58�%�!�_�q����F*G�,�K���n���C��:���W�E�����!�?���)<�6��FBW���Rm�E���0	'���l�E�r�������T�JKH<0c���5\�C�����S����DR�<���G��N&�0�F%����<n^��q�q���J%�/����-n�'��e�$�7���9��q�`R���c?������ax��Xq��TZXv��;��	<���C<s���=*��j��++x�7�}�=�P�C�IA�T���A��-����Y�� ;���y`�)~C1�lNy���5^�`���t�����`���;<�ka��^��@�y�MpA�	�����1\}~Z��A�����;������1��`XN���.B`������Q�PK�&�+�3���Z���b�J���9o��Z�Z��tG�|�	G�qn�#T��6<�(��z�aQn�
��I<���te	���Q�"x�K%�x*x����H���*���`/��t��o�lj�Q!;^3���7���/��
��@����a^��+���O
�q���%]b�}E���E��k��<s���K��o��HW?-���O�!%�����p�/�����U����x�"�����(���r������0s6��8|�nF���
,	CJ�F|�f�O;p\�!T�>���S<!So;�g4F,������
Q���-e	o�������?�u�<��s2��*�r#���rD�.����9:��6Z���o���U�T�E�����T��b�9�����O��-6�]��'�����c�u��������T9p�u���Q� O!�E��KPA�FA�VT�r����{��bBB� �5Q�p �"S���$U<hF�h���\��S2[�g8=E���uh����^�����[�T�;r�]+t�s��	���DN*�
e�(���{��]�q�����r�9��.���������]�����5����f�qI��PL��!Y�@]_�����~�����n/y�i@����bN!������R=M�Wk-u�����_�ZK�r���2��Y�6��Yp���*k�����)d�����g�����{�v<x ����>\lm8����cgQ�`�;�v?��6<������M���L�o�^����w�$~i��F�\Y�M��	�����6j�(������]-����V�
k���	�M�cE����+7�P�`5fN��t<����^�aM?B��^,]1� �&��;�;�xP�$OVr2z��}u�������4A�!<-d�����<)G��l��:�Ig	YkNd_�����ZTK���|OEu�����

��4,X���u��N�����8��~����rN<���W�$s]�`����s�z���i�+9� �y����jAS�����|j��q��g���2M�5�i��3H�x�)T;5��c�/%��c�'i����J�
Q5��O^�f�,%0V���p3���v�gS+3%�@�z��6)x�O^���<0t�3�xW�����
����#����Z��"y"Um��-];�5$t��miI�)���Mi��������~�
|N����	]-h���uK���*�cP�i
	]-�5��.%W����	<�7�O%}BW��Sr��������;���0I��\-�SDJ��>y��65W����\-�Z���j����Z��OB���qS��)���I��vM�2�����BriR��.v��>J��-�x���R����i����E��<�2����75��|���i�,��_��=ug/^�j����B`�D�<��#�t���~
��= 1�'�,P���\� ��k�
R���Td��<JZr��M���A����
.�1�O�{F�*Ur���6�
�v%~���|�6%�!�y<����@;;iK����O�o'<��V2�!���5����X���Z
O���@_~�����n}jg� 3�*��S�������H��i���F����])���^�y\7xP �9������p�Vb>],���X�0q�@?;*��[�)���}I��������$n<x=R�<�@7�}Q��n�Qb+HP�����
x��� ��^�a������d�����-S<���
x������Os��8y�O!(��B+�_E�@*9��
x���� m}II��,�(���L��(��[�)���=H���S��b�w-����
<��^Jl������7���6P���U\-�k#����~�>c(����U��m��T���(�������f(��h�%J�/�
x�%�z�{V�<H�S��i���F��b��@������K��X����|�&S����
x���
x���{�������[���S�>�~,�����J��-��
x���(1�D(�����
x�R�+��?
x�������k<��W(��n�Rb+��,�BB=�'����u���PE��)�I�c�S���=���Z�������c&V���h��(D>t�����p�6qppH�.�����H�d��-�]t��6�c�b�n�8>������`nn�j��`���hS�G��R{$�Lnd�Y����G�`�"��G��23c���}�'WhLL|||��b����<SS������KZ���e3� `�����
���r4|6&*#D�y"<"(������5kkk�W�����}n����������&�+�,�OOO7��yT��3��9~��H�m��G��I����W�������u+������ZU��i3�����P����NQ�=��ba�����8�e>���������"�~��
7CX�~ki5���#���'���C����V��_�*�����=���flS=���������!��m^��1�y'�>��(�X[Gh[��9DX�)X�u|Q��0�+�@��O-��U$���
��������]��]{Hx#FF�0UE�toI�����x��p�E~nAS{|��^���a>"��������y���������2������C�L�������k�]�Xs����VPE%������� �AY�;>>�����;����������������HI�Ke�A4�l��z�R+�rPXX���!--]R���{�Z��X�]�{E��=Pz <���KPP�W����?���������uW����/��Q�x�go~_Y���		�����T	��
�GU���~E(*��7���Q	n�\M�
�!;��rT���*�����Qy�WB{���k�p<*�xT����>�<�TUy�	���uM	�C�xTDT{��KU�?��xT{�g��B��"�x�2�l���?�U�E\U&rUe<��a$4T��)w���p<*�����e/���GU�X.,��:��#��}(��+��({�U�^��e��8���GU�G��QWy����e���8�*���>��+��eV���
��p=���qEYU��J	\<��"�LX����=���6f���HHH�r��&����T������
))����2����Q�J*���2III<��9	����,�
��$K�y���N
��o�2/�2u[�����8�����U�����Q^�@U�GX_������/�����oY�K�
�GU�=R���"��f�T�5A�[h��S?&�p<~L?ZKi��5O�}������T���*�������������G?��}X�����2����0U�a#�3�C�x�}������*���*D&�I!������	��3�%Ua<��l�����x=�*�uUU��*�#���G��?��z����2B��r]W���<�QU�B{��\SUe�JhV�k���#U���*�Q���^��UU�����B��r]���T��?���a$4T����BCU8��BC��{����*�!\X�������*�!��������x��������2U�^�*���^�,�{���GU�G��Q^Wv��S�!xP>�By�RU��zny]�SNU���A�\�UJU�G~��.�����������+�}����"b�K��P,
H���H1��H�h)���U)=a_�����2�S������:WH���

������n��.U,�Err2���Ku�����T��y����8�CBB���V;U�1b�V^vA�2���Ph�?k<�3���Rn�Z�QX��,]!&�Zn��]����������24]���)����{B�@�K]yP^���������hR��`2i,IKK�9^BDb?'�BYN����,u��1)d��f&����G�U�>T���t������:2}�Y�}R��Qb�!����D����6�+���Az��}�&���?YE�s�Y���
,E����E����m<���a��iq����l{$A����J\J��c�S�6������$���%�>���e�����]Y���g�=����U��+�x�if@A3���\��H�8RR�l�����!�F�M"C�%q�h$��_7��b��S.�3���x��r-�V�="/'Kk��[_�n���4Td��������Jj�������X�g�T����<dD������/�z������K}�"�F(
�m����I�Wtd<���Lmd����RW��Q���1sn{$M9���e,��a���h���w�S�~&�#J;Z����=�
l9����YK<
�*u���M����R���T%%�����D������z��a��Z�|B��L�&�A/f������_��ra=<L���SX�����#��|�����{;#!#��F}o1?��s�Rc~x�?�����������
�"=�t�����"*>-��+[��,����V���D
R�e������V�S�iJS������M�L���Gw+�-����eJ����q5�����<���8��8�'8x p�����=���]OmDR�������{W�C>HJA-����������3*���/7_�vaTH��.����>$����r�Q�K��8��WE	T���<C�
��{3I���������x��hd��^�eWX=;�����X�������	�|w�0�oRR�F�����Z���Q�O-3��
�d���6�M�W�L~h��U�9�e�{*�I*D�m�����T;$���v���n���N�s��rJ[�<(m�	�{�'��<(����A�}����I�	���N��B�@�^��y�����!xPq�-*�o�+Y��~�y�Y���NXK���<���-k�B���='<�*��<�]!xP��\����-����#!xP1���T!xP��*����G���<(y���A�}���*���M�����d�r��2E�N�����^8O��V���,T<��S���v*����y�������up����Z
[fthK�������c1����������r �L�	z���x��"{��'h���x���wS0��~�������(�A�q8�"�_�T^�������1��L\}x���������Tu`��'��xARV	^������z�������T�eg6i2I1�x}���{{uR�_M�,
,o��A�9xu+Z�^�+���Ir��a�b2���[����\^��~]�aF��N���W{^���_��{j& IDAT�u`m�a!^��Q�����w����L�tDRb|�8&?R�@GE	=�-p��Lo�3O\*�}�3t�4���4�<s-�q��5�ChL����>���	�n=Ftb����n��������k
ddE������L�6(�
r�b",�%��U�a���SY��u����+�3�\&.�=�������9P6�%K]�u���e�y�������{�O�������R�0��	n�����8<��e�]�>+���!����W�@��x�zP�Jw�<0j3������=8�t'\Dn!xP�n���/ArWx0��Zl=6�@����a�U��n�i9y~���(E���O���P��"��)�>j2X>�ca�C���_6�}!x�c���#������c�2<�{��$�T5���y\:A���H?Z�@\J�g����h7���T����7��Fbt���-E��U��'��<x
Z5�vu
�'$b�����{�"��3W`o]&������k�kcc�R�>&6��=)II���a��A���k���L[��3'@W�[��^�8u�dd�������:��g���K
����i�R�Gx��O����Z��G�9�*x *)��L�������B�@�KB���j�B���"�����(�J[�����o�������Ll��QV����	t�P��8���'�A�O�K��Sh�������<���n���}�����j6���P�0����(�[�^����A/�����_`y��b�h�n]Z����T��C������Z��+��^���s���A�Z�_�{�W #������:����3��~:x )&�E]Za��,��,�������KhY/�1���RUX��������	h���5��
��"�ek=�� ���J����y���Z����B���*���K����s���[��A������6�T�Ul�9�����k����j�����a1h�<�"�Z���PC�5�mq���WIe@P8 �*Z(x B[d�C��aW4�;^�[���W��S�����-�P�*j��}&������P�v��BN^n�Yz
]Y(x���xxJ���R�KE� p>�������%](x &)��K�pzn�[)Ju���\&����WHJN�S�x��5?����{a��af�2b4I/.}x������r����&�����[��>�0�����1i�@�R��
;ax�nP����-�0m���������<P���=gC\T��n����}�O6
	�y=��V��<��c�hA"o��/��"()����������E9�t,9N���������-��R�/���`�����}������G7��������IB�@�^����DDPo�H�*!�K\�mS3����OG�BBN:� "*
������
!!/�3w���D�����>W@{��C��2���d�*^���_y��x����u�x���]T�T<��N�������r�f��3�A'P�-"w���"�i�����b�ug���b��	D�����4�G����1�1�=�)*;^	��Qh�
�.7�Dd����7 ��5DU���
R_{�x�wQ���(c2��R,�F����n�AMO�fR�����q��L���$�%E���1*�L�
F1R@�G����-J�@QM#�@�&>������(,:`����8�!-��B�<�3��]������>�5q�x$�����z�N+g��@$����y�!�$�Oopn{;)���"���#k� ����.N���s^�f�5�T!�> ���t�#("!9�=�yG�����8���	)�p2����"a�%���ti*]	���4��D0��")/SH`�@]i#���(c1)&�q�����qO��<Z+�=0��%A����,����K�^rg(
<��E�nJ���&�����`UD�����(�n�@�"Q~��D#��_��Q������Tx�����T������`��$V�O��E����C�Z�KCF����@5%QR+HAs3q�+�b��$��"8*��Y�����')�O��E��V�4^1�?ML�y�x���$�=L��VR����S�T��A��aW�)?��=�1��lh�R��GG�:N��������&X�����>?��Yiy������=\�������'d�����,|
(�e�(h��v�Q����
H�
C�Q[�K�%���0�9���7���7�'��}�0���IqHOM����P�4�e�_!A�����&�`C�.Mv�V^[H�����H��#�n���Qz(D������4q?�SI����^��2z6���L�����u�C�����%~L��(V3��n��_���$Hdff���r0P�^��t]��H�������<����9�D�~+!&!	1����B��B���+C����/���
bC���*05y%-x�>	I9��jN��(AVk��5���}������v���\I!��+����fM��q��<�h��gc B�<^�Fd�'W<xyw#�_�;��A��#���;GD�n����/�^a�)X��i���FS�������R�a4�. :5��iZ�i� w���v��vg������/����(�4�	I��a
(����t,DU����;��p���w�6D���iY��E�GZ@�q�?�Q�����d�����(*N�nm >�lAD�/��_�6�����Po<��u�t��'����:�`n�)�qHKK�����J��������������,��fa�v��k��������0�����O����c�|xs��--��?{tK0o���jr�X��
��DIA�#�x�c����\���c1�}sz����3���T����w�:q���w�.�
	+g���P"'�_[5������������A��y����`����F��q-#,;��meEz�db��gdz���V5
,:{���XF��!xVYF��oo��AsSc�II����?�/��XC
��=�k�}RK��R�X~������kk~N_I5�����G��OhWnX��-���C��M.��S�E���5{�a�c,��
����>�+v=x�
l�P�����SWK����fm�Nx��t�>Xt�:"�!���Nh�&���N���'/��y���_�|����x�6�|���_�[:{��C�(�����q�E$�o]����/�~����P�j6�r(9=�-��BI[/O :(�~1�g!�r<wBJ<)q����s�~�M��df�-����)0�)R2�u!���)���������w���(C�`
�_�������]YD�����$zNd��A
��$p�r"2���t#���I\����hTC������L��P��4��${_C�g��*�jY�9��rW<�����'$U���5�o79��'c�~�j)5�cY��'��~�Y��{�	��gy����<^�8���X���)D��1�tJ�:�5�W��..'��DC��)�,8��3�AF����]g���.������w�/���Tkn�42�����k7+���s`�����P�A����m�����3����#���<�����_?����������MM����$x���;�#�'�����7�� x�sFC����W��!5&��b���xD��C�f5xl����~y�kEe}����=��s�mX.��8�����l���U{�w�� �L��\E���jsb���>��|F��-y���T�����5}s����P4�N@\^N?�&'~��na4�]�Pw�	9Cu��q�O����+Oa����4~�D�Q`T]i���b��8�)�azY�{��fgHs�!v�����������-��F����uJ\(|��S3�"���7��~���	�?�����7���R�1�<��,��F����U3�������z�GCV��%=/,�?IE)�+`��6�7��W>CO]�4��#�~������O_���7���:�
|�R�v��N���#��q��[E�`|f�����}�TR5��������@�I�KH������������s���UR�������]K�:q<yr���o+.#""��D�������*��3��F��5��9�
��z=�z�\99�D��������5��ln~�Z�2�Ds��m�F Y$���+���������xh��SF�NX�"��D���=��$�����&��-t��J��8�Eyu��������]�}��X<���b��������@(���~�yj.����vn=#U�l����p���.v��c�*B������������"5:��*����Dks��b9$ &%iZ�
��@��t�RB=w����r�*�����h���������xZ��T�g��h��f@�F
b�"y������i}%�m2of=�M�������*A��]ZG�o��]��Ls�
�p,���#?A_�[�-A;�k0���}O��5�x�����E��B��+V�������5��k/��@?����_>�L���Ckrm���9V�:�V�v�~��c�o���uCq����z
�R����kg����
������S��a�����)����i0f-��8�}*�:�<_]�l��h�~46���+H��C�����
{xC&l��-jw�L��6��P���&�������j�} B��$��2�����4��":8	��"�S�����m6�I�����������MV��y5I�����)0k�N�����/0����c�x=7�y��K<�W�����cq�/F��W��j�:������s�9�����Zg���"�W��u �]��������:T�(d�$�|<���J�������Z���m:���=���n�8&r2
8����|��!,,������&)���DE����+?�/v8	C=T�	�M\W��s&�$ ��C	�a�P���{��q7�DP]S
�)�\����:Vo��������/��#Il$&�U�����m����99��d��3�o���,��B"M�w:Mu���#M^s)�>n����4�A����&�P�}*,�
�� �������k�������,�#������CS��a���/d|��h��=�p�&d�C�;H�AD�x��0�`~�]�tc��
���+jjZ�F�m���8��8�|���A���Y!x P7�L��@RI��,�������).����q�?�O����Z��6
�5�lj�S�P� ��+w����V7�v������C��T���������n�o>MkZ�I������?^.���QZ�u]�����tf-/G��:�6�7�������Tn�"�Ca���z}�6��t�i�$-�6��9��������S���~�_���f��Jc	�0�@�����<��G!ig���!��	)���U��"��(�@�&��i}oo$�,���6���T����H�=W���]�P�
qEMq����]g��N�!��� ��{"!� s��~~*/�T���4�G�zr8�1�Z*���h,>h��F����$����@m�x$a�Jl���:_�&����hQ��M^u$��8���`�C��3i�������K�L?�y]H�=��}�-ZSV��J���A���I�mj����p5#[���(~�OAe���p��q�-	�le����m(��v��D^KRx�y'�P�q8
������#�i#�����L$i���	(MJ�0��X?X������S)I���X�8���]�p��S�������4���A��T� ba%���������x��6�L��vRx���zF�Xu)	3�g��_L���R������v�O���Y�+	<����iq���Tt��@hl&Aub`�O��;h��;A	J$q|��4�-�c�R��a�z��4�0�9�~�>��j 4�&7�����y��|�#6`��?����a��U�v�;v��
	I�<����y=��Y�0���h�tn>>'
q��5�Xu�B�n49����&�#9�`��h������M}+%��l���.8xw}+dU�8(P��bxRxER>��ED�k;�����P��\N-�A�.���c(X�)y5��N�JZ�'����i4��������}��u����:B�/jP9��sP"�&�`m}sq-�Z�z�6����[����;)�<;<vy}�a~��Q���.�X�V<`�5�s�"w^9��$���s-�������&=����u|
x���v���P�f
e��R]B����rwRi������vh=�5`�t]\LJ0����$;.�����v���7#1.6M�����u8�^��?����
��V�V����>������O�&�
�����p�t����V"8)������_o�H��r�X�q5f��FHR6zm�r�����tZ�  A��<%�V}�9b)d	~L��*s�!��#$;������9J��!�|��lq�A�VS��
!�)����hZ�o�iN���}�L����%4o5�oo���.�D+��H��������b��"�<�k4����i�x$.�-��Ga�A��;q��l(�r�DS�
J�x�t7mv��MR�V��a�8��o��eW�R�@�g��
4���z4Wg���M���7�'<Z`��l��������Vf�z�6�hs}a�����Y�=��������7�I}�D���!;��LK��T���fZ4�Q���X����
x�)����/WR�����E�<�	@���X|�FQ�Q<`m]{�>������������1��*v>x���C@@Gj���,��z�
�b���hkQ���YW0��e��@�%��`���q�9���s��m��������a=1�
CuU|!��sd����fV�f�`�I���	����2����!,V���_[�ZN�SZ7���`x|
���B��
�S�(��<0�eb��"��$5�#���b�)<~�!NL~5c9��"��#������
n�����d4�d�[kJ��/<xp=Zz�,�'�#� ��Q�7���������$\�v���,(��aPC��1K2P���*�S(E+YzA@�=���hM��,����tI!T���f'�������`�����c����G���y�!�64X9����&}�mC�����;Z!��4�
�G�AN_
F���f��Rh���_�>l������R����x6j�^�6�C{AVO��=8����f���G������i�?Ju��P�:^�r���J0������3���	�m��
�e��b�~493	zl�j]Ch�����~�zH�D�#/��tF����������}�B��",�w�����W��eN���A��9u0���F��^��|����8���w���Qp�t�FH�BB@D�P����rj|������<`�A��A�D��lz[20xB��"�����l����}a}V��A���������T4����������Oa�g`�h�CO�8��v��C�i-�������w�+<��,u��|ME�6�3Q���6X�N���������?O�{i�X*y�Vx .�����~d"��Z"��m�$[��M�����x{h����U�9��+0n;~w7!���!�����$�C��x]ZM�.���4jvX�����H�� �(�`b=����Wp4�(��V���[A��H�`�t\y�I���J�{	���4���8��W�<����U=�c��G����FX#/ST���
��X��
���BsCM��%��=�\}�dN�(����5��q��oh��<:��W^����Q��!����f�Y�>��w���[A���
�5d�f��1VV����*jE���r�y����^}H�-An�\������D,�tk�
��whab����OX�b�����k$<Ci�0"m�lJ<�����m�'��E=��x���L8������>��[G�n���0��j�s|��F�q6��&"�mG��QE���T�D�\ IDAT������CNW�d+����;	0��/Q��B_$q���6E�(���P�T��EBL�����ZC����``�Xy��<��le��C�&"���s>��W�����3��Uk�m�>���743��O�i2���VVCM�_7f�����������<��>��n�Sm=&�`��]���)>������k�b��U�������f�D��������Ij���i�������<�s���Cq����`$�����3��w�0y�ilX��������E8}p	X�m����%x�����9�L������d����X�O�1e�9�_���Sc��R��3�n{vFA����c�3��(���<9���k��������o��v����_�����px�#0����T�b��+�������c]��	<?B�Q�k�����6�k���h|��#�)���r@��dF����Q�0��=��{5}Y��`��{��p��.|��c
��H�(�0������a�Fa��Q��.�X�0�#�<X4~3����Q!�c&=OV�8&B���.��Z�����w`������0������{�V�w����?6������X��V���?6�
)0������>��gr8|�2F���Y��NFa�����z!'�s'_�@�'�f$�|,�?vmZ8���'�������%��C�&
�����������a����S��Y�W�0C��A��1=��@X���"�Q��/h,hk��N�����[[�WT��<`��p����U
!acRb_�����p���
����D�fJ���fw��5W&
��%U$J��o����Z��M`��.?����\���y]y�	A	w��'-F�hv�'���,C(;��(=c��[�����dx(<�`�A��}����b��jk��5���	��>���C���Z+'��7WV�RQ����p:�wz�8>ea��
M�����4y�nq>I���\�/���B�w�+��<*�T��t~���jh��WHy��+$?|�������)���
di����kRN��8�@P����<�iN�dw9��u�j�@q4�����f/
<`�:S���.����D,�g��C}`�P&��H����p-;Y�<�x�oj5l���
(��,.�
C����"���,��)�c�8�M��������~�i��[�m�o������U��2V�S�).�6�����T�O��C&$���H�����$����L�p>������9���A���5�[�<3I-bG�I-��q`0kKLb�����R���S�Tx���&r������x����e[E�h`TC���x�2p H��#� ���	,*���O�x���P�&�9�X�m����od���tFf��]��~������ym�A���p���j��/�X��`��I��V�6f��*�&���%��"ye� ��;�0����z��� R8ri=F��|v������MC(4X��T�����>S2`)w���S�`��a��Y�h�^YA��6n���%� ��AU��~���4m�o��H�N����y�	D�� �`���6����sP������E�y��4�|E�)AD��I!-������
m8����F�V��\A����!(C���&�9�������)$�����	�uj#��;M(-y9&Mqp!�� l���0K-'���K��a�:x��5+~�*�k���k�}��g��$�T��)Re�nkvn(m*.���iK����Z(�v��<]� :�N�����	9���K�A��x|e9�,;���_p��7�3���xP��
,C�V3p�������������C�s��y�u{��%0��H�4�x���Xx��������#��tz�\�S\I2�f=\"]�>�=���M��&���v����y���e$��1�0�`�@�)�x@G��i����x������q'n"�'��g#tTV_
��dI��q��{����{�y��8r&7�@���|��;L���>y{p�@��_>?������m:���p��%F����%K��>���uMS��N@C^>��ZN��T��W����?�r�WZx�f�;u\�;W���XV�����hR�:������6�����������OsN�m����D��a|s=;oCc}��������.W���
l�c���)�9+L&���	6�o���m�r�Eiy��1�`���%��vuM����%�	0�aP#;�R;�Q;�vh��`���~�YREX��3)���^�1:�����Z�1!�n�{�����
���N�:�Sg`mK0��c$��� G�Y�/��#��������)�IQ��7���`A����s��K LI5�����
S?��_EV�89@�����yc��R��x�������/?x ��
�1S�������H	)^��0��zE4S��qo������
������
ph�����E
.<`
On'�|��'')x�s�'<��]	����6p�TW-#;����`K�+C�@Jd��x��H�����������7����D�x����R���@�t�TG��z�����-O���%{�A3�=��<`c�E�z=�|�
�\��1��h
�������j=#����xPgN�L>u��P�7����0���6[$���w��E��i�~2��G��6�=���x��T��������_BQ>��Sm�����6��o�'Cv@�Rz:0��vM?*�8)�e�l��0xN�B�M��1,5>N!�l)p����N�@���������sd��j]#�D�AZS.S��L� �7��;d�#����LI����x:lW���<`��[������H1"wb�����}�gE���gc�;o���;@�6��@�j�	W��3��O���Z}��D�\l�)���:��E�K��Y"����DX�oOs����US'hZt@��������CfJ8����(��F����J��mv��%k�ZCy'��]o��z�,����!���IE�*��:��.��D��jl���"����bL���^�;3d��(������3�7�	e�sX/L8p&�=)�y�<E�Zhf���5�p�/W��`s{�r�).����rV�.Q��
�]�g�\v�u�9��������\A�y��[���}7�s��3���<`�]?����TX�J�������
�
�|w=�����hZ������L�@��
\:��J(M*<%e���F�X��������������#L(�����r�35�]R<�������-G����	�a��w��,&���_����z�#��:�=�md��NNVR<�B")!1��m-)i�j��5�(����<�A�g*u$�d"	�+q0���{����C-X�P����LL��<��iH��5N�l��K��`f�uX~���(-���
���{���0��`�f����<hlf	{�Z��r��/Kv��130h�
������s����<0�3��g���G���g_�/����v=����<�e�8HJ�b��]���?�{2A��6��.��c?���g6W0PR��<xr�0���������s;�C�v�	f��������,	<`����`���9��jr
Z�����8����
U9d������_���4��iny����j4R%%LZ�����LqvA�y��J�iR
:�\�MJ��0�|����)��T�����N�����o���]~�p����>���|M�;R3h:�:���{?�Y+�<�G�6�x���������u>A.&!x�o/	0��I�p��%����mE$�iM#�}�{u�%2 �u�F%��j,1�����h���[6��'?l�}�4g)6.���QP(j�^�
-�<�����x��'.�x�����B1��-<�g^����^�[0�A.(a���������J�EQ_�c�*�������
�4���C������o��9&7x��7)�k a���"i<��).����o������F�29��������f�"
#�����F2T$!x @'������N��������?�x�
�O���<���N���!� F�������,�-������p��,g�����\�������oA���\-�l\/��6�� �<�H����Y�
��s)4��w,W��#MH��M5�k�����r��^�[�^.y=�`�@8����2*�,!n��W����q;�Q��rdHZ��S`�A�a�xJRl��pgg���)�!�EM1����O�����G��N��|��(����I$�����BA6x�K� �H�`��`�;)��
-z����pDQH�����x�$h���G#���������X1��d����%���@�Txp�y<z����p7�$WR(`�AM�p�V<`�,���f��MI�������c0m����)�S<�I
oRH�Y��%� %��dy�J�A���^JDa
A `k�,�CE�z�@����\�T��c�9��&S<h@������B�MS���Y`�RxA�{�(����(�n�����[)&`)[� 02��3�����),K����������T
V^H���4�W�@�TAx���������#�a'��
��0��{��8ssF�&�G���6s�f�����I� :��DXd0S���Ya�
S<X7�f��N���gy�L� �@u#R���#d�5���)��\�i�a��4�;��RA��#�E��I B:�<uZ����]\E���2�X��!L(���+a"A3�k�i)��1	)~l6D�
�67�ED�
���3.��-o�6���m:��
Hp�o��6����\�@V�:"`HO!�$���[�0�@dPy�m�U}vd�+
<�U�F�,���xm�����Y�P0��!s��v ����vE�}�����x�\��������=?�F�����bC-���Ei�x�y��:x�p���
l��I��d������0����b����������vCx�)�._�d��x���T���
z�����Z����D$���b��$im������{1�������<H�@�:�x��)P�'1mu$����RT}���!��q:�6�7�g��l��EJJ���������t��;��R��6�A���d86[.��U��x�|
�M����h�ZvZI�[x��:�=���:l���;k�~�����=m�'��S)�4�����Mo��B!��]��;`�X���+�
���h�6��SS�F=S80����G���������5Tq���;��aV=���B���!�l�����Za��[�X�������%s�=+S<B��
�QM�c'��n���@`�k/S8��u�[t�.R-�N�c�7�R1H�]�����[U!7x����aJ��+����L��C�8�0�MV���mau�!(b����ioI�,-'$��(<�����I@S<���%x�T%X?08���.��]�~��)!c~�@�CwD>�E+{(�7������

7��=>h=��-���=���Xc���*�������%�Jq�S!0&P2����'����
�>O�$S<���0���^Q�f�����+X��$u�������^2�6&�
���T����RxQ��K�e=�����e�>N��Y=�TH�MytG\�����b��/�������?�z�����(`�6�Y(� �3���k�}$��T<�
����|<���o����Y��x`��>R��yh� ��kRB��!X=�R��HN+��?{�[�V���[����fx��E>fL- ������IR u����Q��<�c�v�����N�g��,�R)�VU�
h���|>�����T�����Pgv�F|��3+�a��<����<�@���/�������zeOV�rqW���G�7�B-�t���;�jouj�����L�!���3kw<�(�8v>f����l<�x�M�CB`$����n`�+*xp��������B������txp�+��
m�%u���$w.$^x ��	m�����x��]RIb�AB���x@����/0�������6���X<�}�9<�-��A/7x��^�G��Puk�wv@|x��)�q�%��U��_8\%H*
<��Nl`���������\��w]K|�J��
4(K
%<����vXr�-V8Y~7xP��!���
��9�`��9���~m�o;�vP8�z���G�����C�����n`��}8|p2�H���<�$��tX���#�BP�EKV�
��F��d�����ig�bq�����L4�0�$)�	��|��B##���8���)�^F`��!��tk��@��V
a�������!^hAFW��)���1�`P����/hN*�,^E+�����JR�t�����&�f|��L��x0P����B(�Q<���Z�a�t�s���W<0�a�?XA�bN��������1��\�!�����]��\
a���%�wQ����1�Y[�;�m���3�3�2}�.�������xR<�����O�q5�_v�S<(O����$'����)���	�������AO
���^CW�����Eez�+������g%
�+�5������g�������j��P

���^
D�y����
]�]<�D��B|d*
r+H8�B8�I��kY�wL	��n�	$0n�BN.	HI�w��`J!����������n �f�^�p7)&���b���F��Qb�A��~@���Y�cH���-/�`��-�~r"H���^����������#xp��	�J�6��
��84�B�l����t�{��x@�m�;`��sy�V����X<s<��#���WM���C7�������gk�?
&)�w�P8�|��C����H|]��<�
�rd)�1P��Es��8�2�l�E!��a�@a= x�G2���L����}z���(�0��E�������O�N/$�����yB-�=�x���h'JDJ2]�p�v2���!Q�6R��B�O���:��@
MZ�"�v���0����4��f���w�������1���8�lL:�Wn����}P��HB�@�{���p���J�
�xF���+&���}�@�m#�4��J�����~xI?�i����*������f�+8�X�4�������{�A�db#�z���
XS��'�C�+�z��X��n��$����*B~���).g4����,�L��c
z<�x�@ds?������7�@����(��\��H�}$E�]����&��_L�0{�\���	��w��P����D��i�<�d{�\�l�V<`I�~d�F!������2)�J�T��S��B��h�3-%/��d���L	A�L����+Q�f���
���K;7��"�i��V<m����6����_�J���N������4��c�l-W��s���9
�U�j�
"{�a�Bml��O���~�A8A
���>W��,��W��������t�����+p�����Lh�Q!�'62

�*��h��?yO��Yr���)������:�MxB�n,��8N^.�ZR�5�{�f���:��O�!j���L4y�p	h��,<�I��sU�l���Oh(�6�iqK��H:Q��0:����UZ�R$�=g�.����,��T���(�e���<0�^?�d��0����6*B�X��=�G
�FH�������z,,�eh��B"�R9�r
�u�}$+Lk��-C�CM���W��\�+y����]W��l�cT�o������J&I�N�����t}����h�I��Sx_77'�
Q�|�J���p#��[��.
���q�	M�,�i��V�z+��MuS#[ZX��Cs�kbRx`B^��)�SQ�D���l�b���r,+V/\���M�7q��������M���w�:y�
�#8�1�hR�3�3�	K��� IDAT�� A��5�I��9����s��f`�s!-~�!*�=����ys���5�b����$��
/�Qy
i`L� bB>Q(%�v�iRj���./H����L|zz�hs�,���)T�z���Xb,��<xs;��I��,��/���f�@yWH��o�&A�������
\���
�8��+H�O��$�U�ogZ�w�����z}�B��HH�w����
��-v����l����Rz�e������C���!/CB	x|y)�������}�f\-����8D��~��f�_�;�	�jFxyo"�s�E���$�������f2��y���/O"2��-&�0-�l��[P#����i���r��c��l@R")��nC!pV�U������VZ' �%+�����vo�����H�S��+6xm�l���%�x���?8���Yf����!��-�
EqE�����,���T@��l�e� J*KdOD,�
��
�uk'���������},
9
�Fa��#c ��K�#3&�9�Rq��1�L�o�B�����=�$U�l�����D����P,e��ae�Od�;<�E�6X0x(\>��>�k�s
�D ���rB�.K�1�;����n��������+L����
�`A�1����z�9��F�:�kD6==����$��"�>Q��, ��uOzvGA��n/��<�h���'�SY�%����E���1������9���!������,��u��K1�e��CM�������>�D�J�Z����N\�K����t��	��?E!�@����?S%�{@�<���?��.�x;�(^4S*`u��|���,���������x�����H
�*�����B�]��
WEH ;o!�7`�#X(������[(JKq8�������8�H���.�9�K!$�|��}���N��(�8�BWD&$�m�l����!�� �����(���������������qv����4����=��b�\��V�{�6u�T��=�6��5�V�!��xh�=��f��H���������U�����+<h<�t��y|����t\��@�B	�~����_!I�/�����%���*�pa�)�|Sr*<`��0������).����;��b�Wjb�5�R@`���{*K�9���,��N���4Dy9������D���$��*C���Ea���G�T2�8�z�q%��qlg|����UY����%M>
����������V<���o�����).�+R `�x����.���@^�����=�j�Q�S<�[��6�� �*���9��B#���s�'Cvr����������K������f�@a�f�������y��"Lm�G��m�R�[��-i��X��y}�	9��q�X�_�~�����Y�����@���_����lV����G��~�V��q����X���\��D��8P�l�O�eQ��
���]����
�:�M�'�B�L+O{��q����h#d9x���:]liS�p�@��	�|�{�=��;������D��g<`���G���S��" �Z�Qp ��.)80����y��XaB��o��)#�>��#��xhw�������l��H��Zx���3������4G��9G��Amx��
Bv������Hy�~P���'���^	��y4/��
D����n���d7'���
R4��h�-�Z�)]�����:����~f�������H����!��oE�WO�v������z~�B4#��*5!��8tG��M�2��E)8�*�o�jYk(w����B�e)(�����F|>�1(�naAo#�avC��+C�w�Tx���8�Y�����������Q�g�����6Wb�-��Yz���N�)���b��A$bH�������PL����<Z��N�9E�l�jX����U^ae�x�I��#�����w��q�����7b�
(Q8<a�?S��y?Z��mK\���zN��uY���Sn����=z�<�T�Rh�v��<t�I�����k�E�w�C[�7K�����L��H6k&)���Y
]@�~���@a��I���d��.��
���T���E��� C/����a���9��������%���&���t��tH�H�^Vw<�b�Sg���9�hP����r�)�]}H��*�F��J
�dk�a�����(�K<�2����
���sc=k�xp��vL�
�����4���W�+�������d-����"=�e�fK�qtSx�A
�]2F{V����2������V<�����F2��](xP{�2={�!Aa_����q/R�=CJ9�)���c)��]�t;����w�������P�)����E�O"���n��,(��������`�����]�;���v�J>����"RV>�z?���Y�U��q�/���bvaw���k�������������v�` *������3����
.��;�=�|x��yg�9s����
�Dc�v������/�
�n�C\���4/��}�W��0�7D
��M����S�Q���Yy�^��AN�`��S�;n&6]����q��u�l9�N�G��
��e��y������0?�]#
s���sg�O���Z���)��~��
Z����o����{�4m;<W��������e
�p�(\��S"��Rh
��A��|NJZ)��T$d�#�z!����ZSJs�[����i$]�8q@��}��Lu���U;Y�jGk� 7����J�5���)h9�g�{�>�H��\#S�#��������^�P��[cR����y�6B��yY=RExC�[��u~�{R��=<�O{X��@J
l��)5����V�=r
����{?R����P
�z�^�5��R��$�B�~Q#�94\<q5zE����U�@
;�|f'����g��x�nl88��Yl$�S}��"%����!��x�"���X�p:tH9�����p�������%k��P,��	����������*�j,����}s���3'�ebIb�����v�*	%IR���9�i��a����M�����0��h�y�t#����'���u�$o�#�/a��^_�`��- 
x ��r$��jAR�����Z�4��@+������W����
<(���j��m�j��u�[>/�@���U����o��o�N^����C^��U��h'7�@��i����Q���a���I�dDQ��f"������jA���X��������B-(�/���n�����NI��$��#}/VI(H�9�@��1����{���/TT�Py�G�-���W6'x k;����!)~����?���~D��g�Pg�X�y�*Sm�K�9&5J������������,u���A!�`)�m� K*h��m9D�T<��Sn�Aa�!�P���<u��S�4e��)+k��B-�ZO��y��3��9C-��Nn�d)/��3��<u�W&?�� me
�P�zXYI�AA��^�s
�/����vn��|�����4��<�~�2����Z��4tI�..������4<��(:��<�-���&
x�@���3�����X�A$��l�.,�5����t}���ujVE�z5�A,�����a:�")3R<xJ'���/_��������wC[K�p��?- N����(��I��`K���
��$I�:���&_b6�3��2�m<�<�x �F�x ���SiMQ]x�x�F�xPp�
�A�m��T�<Z���N�=88�6���t���x ��
�O��O
6��-�G���.0f���3��~�O�$��@��
5	�A�����\�A���y���1������d��$��-�����^�s�����@du<�m�	��l��&�Hc���#������������(�����_ ��t�Jx�-���T��j��FE��[wThO�@Q��H<�l#q<��V��)�����.<P�M�F<(�U���6T������d��|�y'�Rx
����,(�k9��2[@D�+���r<��^��.,�@����#(Hk)����6�5���x ��*2n���_P<�l5<�g�e�, ��GY$�H�C���"s
��"�)�Ko���Q
nU<(�
��<�6�)���,��f�	�����l+o�x ���r�l<���6��@6{I�[��R������Y?N�x �X	���N(�h<�<�x �F�x ���SiMQ]x�x�F�xPp�
�A�m�L5���M<�ng<�6�Nh��, ��g[yk�y-'�Sf��ht�@�Y.���K��x ��
'��A����V<���@~�	%�- ~�K/j�ny�������8����S�H����Ghh(���O�#EZAY~�0iii����"����%��w1{��FGG��
�N������>�e<�a=���0r�����G�y����,�!�G
�+g��x�i�B(�,�?a}X��U*��OX`BQeY���B��R�#��������,�6���x�AnlB��?���sey��?����{>�i	e�}(�xUE�����,�!l,|.(�eacY����u)�x(�zDX�|>+�a}�Hk�.a<
nCE��,�a�����z�a=�,�,�ea}�����jQ��P���(jV+�eY�I�����3JB-���O^��Zy�����[����"�5�|���R��V�9hll���,�vd�B�H*V��������455`��_����[��a<��3,,����b��x��
,�kc
-�#)�^�,���=����a��CQ3����z��=��e�}(�x���oa�����v��3���������6����6v��Y��zO�������Z���)�z�YJ��G�[W�
k<���@��l�
k<d�+���,�6��s<��������g������<s�b�~��KIIARR�ws�(�p�x(������2�@]]�`}�����P�������+

���(x��x�������������*�K=���P��P���x�F~�0��a�I������Qa=Rt���D��3����EgN)��OX�9%���((�z��EY~�0�����u<(�;�P��Z�Gi��55��(:�!Hs��`=Q�������R��P�Pa<���C�#�����P��P�V6���(:�+a}Xt�BX���P����>,Z�J����h�)a}(�GaX@���.���P��P����^��Aa���:��x���VY��F���KY{�#a�Z����P��0, l,�U��SY�C�X�FIea�^3C�:�e<�a�.�����QRY�CY�#�x�,��NeX�����_%�e="������NeX
����a�T������,PH�)#��(��������b0�P�]uQL[ra�Z83.:"�����r��fH	�@jj*��G��f��,������6(�e�(��W�[_�.E���Q�A���E���CL����ttt�d�d����!K��:���Grr27�����6���}*�g:���!�9K����-X�r���C����JWW���]���g�R(�h&w��T�p9(\�����}$�WY�#6X�
Je�B�c�"��x<>�N�Gj�B��V�}��P��	�E[T���Y�@B|�����#��� �1�@IY��*��X�6��S:����������A)�`���>Z)��p�x��E�Gr����:�U�~zT�������M:$g#l<*�YB%*R��+f����\�.���2�2��a�]��LLq����=��}��m��>+��G�:(c����b������5|����8E�������V�NJ�DcI�^��D��j��^��xHci�#��]�&�[��$�P�+���������	���^� X��2���|�&�F���gU#�5
��D��!��+�v��l
���.�5.����Q�V���c^��T��B����:.X���/�D��b'�.�P��I���J����{��<9|�Rf������R�f2������"v0�A�o�"��!�j����;�����2'>��v:)X��-0�a=�����Z�����n�(��"]����0��~d�B�`�G�i���L��b7�
�KivQ8�p���a
�ii`F�bx���7iO�i���$��u�n:gO�(��A���(��%U�����
$e�������UQd��?�����l�X�|j��O��"���:w��>�#�+����!%I��M�5(T��.����[
���n��d^V!u��D
��B��o<P�M�5
�A��V���@+)W<P���F�@Q��ld��`�����b���W����R>���;�x�c���X�U����-,���N��[�J
��$������q�K�`���h��1l�����sW`��������f�
(W�6�����jQ����^���
;A�dfSH�{�������%k�!9Et������v�,���{=}�d�5aaf�~=�������C'.��L)���Z����, /x`>��{c�)=i�_��b�'�i0��ZH�IG�s�$����>0i��e")������F	5�nV����;J�)W����H�H�]3[x�D����l�4��?o�I����e�_� ��L���7���*�j��i�{� 12I��z��#}O������-IT4x�c�|�=�C'���9]$5��{#St�iv�%S���x������h8�F�%O����Zt�5����������#D�s�Z"f�%���=3��j6*�b�ZH<�\�fP1������YzQ���H�xP��=b"Q�tc��<����������t�����z	��Z��x���_Z.��KHjV��	h�,	�>?!������c�L}��7���G�O����Y��sZ�������kW=~\��%�`^������FW��5��[�������t�e��d{����]=U��"Y^4�Asi����4�?�ZV5���t�_�Ip�f���}���l���~�)W9�mW�n��{���?Z:�&n�'���{����=l$o��j����Q��H�u?�� ����n�����E+8��!.&
�uq�b4����'3v�
VM-����Cp�����^A�0�������FF�@C��^�4Z����������J2��>���&���-O��9D�L���Y�����
j8tFp��5
eVSh_w2{�D`��t
����e!��.EL�h�����9K���+$�_��V�z�#r�Q������!���x�*�kc��M�x�W���uzT��Wgbv�UR�!�L�<��V���vP6��o�xP�����
Ow��uFo[*�}�
<8rm�6�S����S;7'%�,),�z�E����m���H%���������f�������}�V,�
���h�VL5Pb����nh\���7�=�����^�n'&�6 ��^�i���bX�y/�����q�a���TU$K�K6��C�-���
�c6��[�s��
��;�lVs�����������
�(��rUT���VK���7���_��.V\6=Ez�'k�Y�U
U4���\��l��K(�-I�T$x����^����M0n���K�@ols�����
�	������%�{&i�����n��~L���TDei/��xPP�]�0��~��������p�\�"�[�J(mY7��+#*<(1t("]]�cg�T�AET�������<�TJ�m���V�wl�h���&�>����j���u��������\�"��*eLQ��;/���a7���Os'nt��"�[(7u%�T����������g�?:x�w�9�
A�_��<8��"���s����3�0���N��Q� IDAT�4(%�	�����:�����m�_F<����+���@w�����Aq��(iQ�=H�yr	��cl��������T,����sc�B��sR�����
o0����8�����r�����Di��o���M\�nKE�s&c��[����*�����r����\�+xp��a��T����B�=�~D����M���k0'����Q�
������+x����a������J�,KsST���Vn��q���C	��~�������`h�+S$%�p�+3R*���c��}7�x����$�hR�?s�*����M��V��WWt����.����d�c����'/����q��/=RA��b��)����oY��b`����h�TC�����qO=n������
[5u�����H@��dhW���V1����:;���1Gc�n�
��:H�H��I_�U�+�?��U��w��O���b�{7����@�tZ����P�VE��X��e*d�W��6I� �l<_'��;]�}9�/d#���I���*7��q�_Q�z����� !.*��5��B�{����:�l���.L���.�P��J����wW}Qg�3��^�kk����}��
h��C�@�)���;�]�juu�����x}��We��]�P�>�������o��)�C`�h������*��e��B]W���F�C]��=&���`�c�wR_�6�FlP���g+���"�F�|G�����X�A�F�����'A0,i�K50u��m9us@��v�[-����"��|@R���<h�r�Wn����0�{N��Yq��~Z�z�\�=/Uqr����b�������{'0����{��6�8{�_��z�6�&��dy���a��1T�.z\�������C\�����������|0��D���K��x�V�:�)���
������!��VF��H~���4Oi�2e��G�Q�@:�jq���{��&��?��u��)"�R�pBzpT����@������V��C�O0t��E1�C��gH��j���������v��4'����6C���\�@�=$����$���zA�����������z��b��.�iCT3��������NOg$�~�����6H�A��1���6}�j���������)O��7�)]������f�2��fC{�*��V������jA�� ���QL[z�E��4�p�z�����d�Un}�9��o��M-�����LMCZP4����F���l��{�[n����G��B�O!�&�����{K1=M�x ��G�z�������N�����k�c�����!H8���Qw���V�����3�	�	�4�0^w��p��L�
�y`����x�K�O���6��$����A��N��%�emj�e������k`nX
+�������&�8�s���q�x�ZFhSkW`���.t4
(�]�|~U�4C-��T�!8a�c��}m�^����L`��������U�n2��i5|yE'��a`���,ko������w��#����9`���\��c��������� *�>��6=mx;)iI�^vmQ��8qw���C^��a�:(5�7�G�����H	E�����-��NC��y[�^��]�����f5^����a��RIE.=)�'L�v����:jtj���-�z��t�ik���&���y(1tW<�$U�8��9����m�[�N���K����Mo�#mm���b��[���������>���
-`W����h��SG_x 06��u���`�66���40P�>�T<x��.>����4t�5�_��f�<X3K_�ek��Z��ac]5G%c�q_lS!����~�b��&�����O���$�nWG�!02;�V��_,�,����G<}/]\���
T�w�)�����a�����V��H����h�Lz���w�w{�`������Z=O��6����S�][B�B�=6!E��M���Q�]_U������"���x��
��q`W8:v7���og��0��kMz�a��������G���,���s#����5
�4�8�^���jz6�%��j'��&��$���j9�cX�
����<���>�6/�;�p�IFu�8�4����1��Gu��y�8�=mz'���-����7Z�,�.
JC���3�= ��8�A��	=���c�k&����^�Z������Z��Ozf�����j����F,���Y8�."��W����{�+L�U��x������a(a��?�<@RJ�W��D��E���}P��M��bt
�����:U����^���6J[�c�������������<����U�>�����/1wPm�k����b�OD�C][��S
�Q���3�>��g���	��.0�����U��K��L���j�f��2o����/�J����P��Z���1&�����_�y�x�)��/:��������/[��x�k�TW%g�N�y�{/������x��QX{�Z�xvod�~jXu�9=3��f\#�����4��1
�K���Gz��`��x�
���XO���|Q#�`k��|��F(e����r�~�e���&�����(�Z�������
�������1|��w�r��F��/�q�@]SZ|{��b�0��G��������F[�� :�-<omS<��{�Z�'�����M�)4joG����wy0�j��A;�v����x��m���.����Yt�>��>;�9���AK�t���-��D�J=]0EMm\Ck��t�a���K����`�kg`��On)���{�
��n����)8������*6�
Dj��*�y)��Ga���H#;��;�f�
�~fJYa��/Xqs����
8w����	�&��y>I���������]�}���>aq������b�{�X[4��GEb�,���1��} hcWq)�H��N��/E0��j5�Kk�C/=q/���iH*P�4xk?���B��P�x	��!&<� ��0��5��Vm���,kd������x?�I}�@S�����A*�Cm]z���y�����I}���eM����*h;����W����z~�g�z�^������`���D�sI)�.
��~���l	k^W��:s������:��~�=��0�gK^�M`�]�+�����ft(��*��eu4��_?_v[S���]������!Z{O��G����[��=�%�����B��m��G�u�8~{�m���Hh�������M��|��n�'�������iC�o���N�L��VC@�kZ����m7�Z����y���Hz��E��HX��g��\��e�QtmG�:N=Q�F4g���M�
5��[����x�N6U����bp�2����������c�i�2�F��P���y�O����2$��8F�����+��G����B[��QA�vx�������>�$��jPE�����#���l�`�^w�������Hy���ka2�/TL��x���1'�k�%#:y���g�	����_��u��Ga8yG��skE:������>��������3=��I-��JZs��D���3�R����� 4w����D�x�m����m#�{e�
J��}���A��-���_(nd�h�s#L�����C���Ls�:3
vf���E����hQIj��3J��5S#~_�����a3Y�4y�&"N]����������������Q}��R�"a��bn��?���"h�lp�$�`V��0�3�e`��5t���������?�;8��&�NX�@?8/��{����#�����WO#,&
�4n��/���T,i�c���i�4x}�3}#������%eU<�	K��������WC-R���$1�~�M�_���/}4���$�����p��n�f���`W�]�!$�#��T���8��}w�+�z'3�F������|Z��W�)�wq>��������:���������hXE�<���m9x��tMy==�N������p��J"(�#�.�v����8vc9W�4�3G�Z�d�G@��y]�{|z�L��'�h-��Gy�:��z���D��m�������x/��U�.���77����,F������z\��w�jgK�y`e#���B��x�h}���\�����1���X�e�������k��y�$����Vo����������Z��;���XH��'/RH�.0����cg�k?�D�?+��0�'��uK��J����"��Z���4i��,n���D���3WD��n����Z���E#^^����S+��t��hT�������kY����O�@��DX�n��1:�:���4X�a���`@AZT:���"�HL�G��X^���.���"�c*T�T���gN����l��e����d��)_�M���k����AJp�R5VE��xX�6A��H�[�B������� �������eY��� x�l`�h�������c���E�`Y�,"B�e�M^���gF_�qzY��j0(a�����fys����C�Qw�3�,qE�^���;�<`N��G��}�+v?�
<�>���H�����*���+?�V6k_���"�6@_�B�����AV����^t�1��:z���!�����s����68��4������2������8��(N�4�QgF]D��P�MINdm�A�z��yE3�9���q�6�%�����13�b����.K��4m;������c�<�Us���m%X�p��;G�s�B�>��	1?�V��	CcK��>�T��n�>�su7�[������S}$&�����������������:N����O�mx���^��G�]=��F����>���-�������]��	������g�#:��7R_~��?�5�(�ZWD��W�$��%h���X;Z-+�C>��:`��	'�����o��
������A���H��
5Kd�����W0�I����g���1+.���j��%���<����'z�`�i��N�����^��_�f�2�n���V�J�HL�6^g������o�J�����Yq	��!j�Ih6�G��7t���s�*@�Sb��N=����Z-�D}��;��+�g!��:��#�zA�U�l��nW9��r��N�:����=kb}S��1>�8s��wE����Q
�vfH��8R(1\Dc;��h���$P$$�����1�9n�%�	�#���K���(F�h|������V*�z<a/1��j ~��
m�����;�R_"��-guD��'2���_V�������ZU�j>�zg�2$�K$}/	<`�{������������'�V�o1g\���?mk
����Q��9�>��������#��=;�������6�N��AV�7�9m^���8����_�=�B��c��:�;q������e3z4��
��"H��W�����2����=��j��<1�����<��<��vV����&��TU���?�b���z5���?��_�I�c���M���'��}I�++$������0�?��4r�?����~��0]:�w�
h/�A���B.h�j@�G������m$^O��jG��	�z+B���5�#98�A�f�_�������<pU�����$��x�O��K��������`��>>���+F�<�����a'����P�����0�y�uE����������a�jg~.��s�'\7���	6&v��9ho]%�jr�U�t�Fn|��UMp�i8����a�=i�$��v���/�X\e��q�-s�������c,�]����f~�\���T���r��p�h�9����xL�i����`f�������9<�1�~)�?����fl����M�ae��A^��05W�K�D0,����-�|!�:-����������)��-t���i��{����O����K`A�ic���@C��z��#���B����Z�2����"�+����OD��eqk�KI������s�?�	��sPh�:$M����=�dx=�=C(=�Gw��e�����	�cNj�!g�c�R
hI���S����x�N����f���;q �5����,m*�8���n��f��#7�b��fX`u!���~5��=_r���f_
9k��9�����@�,V�7����������>uzv�{�{���&���[oaF�Am',?������+��~��s�D�6xp��������/	&H��#�c2�wXKN�����m�R8���|����1%V�>������Z�����0�cEL���a�[�?����l�)<{�h��s.a������
W�����0��OKC
�����E��� ��}gc���)W'�����Fy���O�MX�D�?�������T���n���&F����?��`�eG�Lr�p��Y�yP�B�u�������9�6����Rf�<h���;:��������y!�P��<<����a��k�Q��xvum��r�����s'�`���2�����jw���ww�����<��8�*�����Q���n<DkK��x0z�
v.�E	uD����Q&t��|$?O���=���HC�>�8C`U����|^O8x�~+o�^9n�
VN	@}r?������8)!�	��0�g�>����D�M�;b�	��v<1v��DZ�������@t�{������%}��������I�����o��u9,���:��I���V�D+�z�x�~�M~4�IoW��YsK����:A�������-���c2���]A�r�'����o1�zM��FO-H�i���<���?������`J c ��X��be#0 ����P��e��8�$�{���hnK�JZ����U-Zc��KXKe�^��z6�aAm����c����^��hL"0b��c�R��u;��p�i�y`���w��L�b�s�kh�TE-��G
i�y'�[a��A0�TC�V���5��"�C2���Hl7/�`b��x��	�B`i�KC}�01�����S�jt/O�������	V��E�%�J������B@i���~��9��mp��8;v��[����W�6�V�����'[8x`Hkr
t�?T��6Cd�'�&oH@�]�}2t'�l1=��h�5)L[���|�B&T�gU��}
������<�H����P�>o�9������k���, ����F��9�����p��z&���d0���%��
=�|��5��9D��)'x��m�����m�XVn� ��ph7A�/"��j����C�����|B���x��c�NC�����p��^�����tx�����t����m�j��U+�@��3��`��@�X�r%�������n�t�����k_�k���J����A�*F�nh����1��_B��U�$���s�0��
�'`�c�{$T��-0�vo��q��%�������� ��M��T,`�L�`J�p�w]1x��������
I)�hI��,�O5�B���YgGcf�����w�}F5�=`~���Ci���g��q��H|�����	4(w`	��LF�C����4��8C��!���g"���.�,a���a�RK����M)
�8�������/�6��
������p�s��D��V��fk�;�6_9��Ag�F(aj����)}/��4������hha�-�BDdV�IB���0�������N����@�����J�@�
�}�������K��� ��q��.�tl�����O��p{}����'�c����p�k����O��e*�>2
�;/%?���	T�o
;�J`J���FH�W������������Jw\u�G���n���cM���O���s�0��b<{sU�������~�q��������#�!/��3�6����z�g�IeH����i=�����K��N_��+]hK<�1��z��!}�����;������8�����\A��]O��K=�Nq5�x���5��������/�m;������cb�0s��LT� IDAT��~l'�^�5ujT��{?�%�����)��4��b��Z�j~���6�����=RYH��=G9!$�yY@����.=��9`>��b`N�y�|�A�~�Y����-�x��)�b�I?}�m�Be�	F]��B�[��Xh��
�������F�R��7�9D��s�U�Q��=�4���AKm�F�s�@\��t�	�D@��tjk�|b� k�Y�����G�1��c�<��+r��P/��%�TB�c�.��_�	���y^kDuz	������ocG4����@�=q�T��D�8�^�����fp����'B<��mw�r�vu������wQ~1h��%N:������	�~���j��/ ����!��Z������A��`j�.O�����HW�������8>����A�n�xs�N�}��;�����2��4�V��^�m����b�-O3�R�R%��-���S~��
Zt�
!��q��
t���]�����
�������6����N���C-������;���>h�r lJ�I6���O���n����~!��42������=:��'����4����`��6���������T�z����=�^��t�8����
w�f
�`0���	w�
���<S8`
	i�QP/o���_^�Y9����D?sd��8#��@N�	9v_w@}�,��O�3��z��H����S6`��
��W#�v������W/5{:���YF�cU��� �������3�!�u`&x�R<?ek��L�!�]�W��Yt��B��#����P�8e
g����3�6���e��"`�����C6�$�q��{��%��]N[����c�N���)k�8p@���� !�
�P�(��?�����������7���BeV�u������� G���.��]�6�:GP"�sb[���"D��\1�A$q�d�dOf��a2��a�������4n�L��=-cr$������=) �h�C� Fu���g��K������E?�4��<F�u_�I�
\���u
�<l�7�BBh�Gz�J����u�rl�����@k��t��:16�5�SL�hj 9��������X�.��q�aP�%X`������q��������/U�N�W����tZ�1/�R�� �S�t��!�������	����wK���ef����F�v�xD�>@��/2�%G�"���{���j�F ��v���z��C�F������NE��[��������7������*<�Rc���vm:�MKKx��"��Iy��l�2e��@�k��p�����	�t
jI�v����&�Y[�`�X�LjC���]Jy�d�+�_9��:iq��N��&���@c�|��
<`�W1F�����<�=
����^�J��K,��v�8h��]�mt^�I�����`G�+]������l����4q�\4��$a�VX����P�^�N}Y��u�$`@�b9x�����*�[N����]���{GF�b�Xs�]�^�I�N����*{	6(W^]���O)��U��+1�TUwo� ��u�F����hRJ�����KK}D��������*�,	��z����2���zK���<0���c*�"������hA�
����S�r�x�gg:kt����D~���L�>�)W&��`N��K�IPM\{�A1�^�����+�R���D�R��sE^.<:����L��!��0a�]�p�N�7�h�WAx`��	X`�m���t�}����?U�eU�"g�)WPx�*�����N��3���]��� �W�q.�t��GQdm��L��%)3l%�zd\2W�������/0������'���q\w&mD
[����S~�N������:�����9L�Da�X�~&�����l
��U��Gb��X3�!�����3e�C������4.kh\�r@�%�H�����,������������+�3���'����Y��c���gv+��$�D�2c~����#�����~\��Z�	������[�"��s]UM�[O��3sy�YC-4����#��+�,�?G<�p%�Zp�!��H���VC��R��Kj_��4��xP�T[�$J�,�F�t�Up��F���Jm��xs�_B���
�w��y����F=���)$�x?���6iyqh���)6|��c�i�LKR�o9�����&��o0�����|�6�0����H|�����9�jf���V����	R�� ����gP��2��JI�4�'I��9��U����������x�V�&f����*p��8����s������0��c^�0��>���:�[���!��[L��B�f�p�Rf��pREp#�`!�	*WAUsKD�*����M�Dp���||�
A2��gy'r2��.���Zu8�����my��0���O��4fn�{���dk
��z���'��Xa��@�������}T�}���=m�i��T[������%a������1�M<���}�2�I��)4�F�������FrU�����P���	:~��f��h�}�<��4�j
.�����)�T�O
�v�9�R����.RK`�}��p(��+(�y�F��L����D��3���O�E�rv(���O�BzE�5x�c��C�rYH��R��K���,��K,���?����
1���d�\/��r�`Q�9��w@�����y�+�?:Nz����r���M�6�T<�Z���F��<�������������<`������F%rn;���p�L���I��U�"4��#j����0��7�"�uv���.4'x����mlP�V���>*YU,?��),�6�[.���!�mp����65q�����M�����5����)-f�?��1�gf��=���`t���������P�������������e�<�'��NZ�%�������,d|Tz�|��v����AV� +x�f�����<hX�*���'�`���}.��Cg::3l"���<��,Xs�H6��HW;o����uFo[���U����
i�<��r"f4��wU�b�;L�
MC�*�����>
���1�O�<�xr�_@�uQ�L��C�K���@����'� ��_�YV�}V���S;�o����dj77��)�������<SX�/^�+n?�����v��A�2��\�A_������7.1����U��j���.O*�b�����v�o$�I�������I�@K�N/XY�N�*`�
�7�K�3i�q�����Z�����'���J����k�H������p���I�!�g�=P��H6�SP.]�G
�8Y���XZ�j+�oA,e-s��-������+�h\�+#$S����b��/�k��<�<�_�<�'e�tr��p	c	2�E�=H��)����4#.&�!"?+��h#-\� ���Z�����gr��-'
$�M���@����`@!"�L9���N�)10�!���$� l+m�d�7+x�T"	�H
%���<U���y���2��.���������'|�����:Z^����U�����=�I0I��	���S<��L�xP��
�:������,IR<�
\�r���/	��xp��1����������kt���^�X���|sN����
�qiC���)5����%�\|��{;�,�:0�)0����V<h�g��P��?-�B-dm��a*��%l���ZvyWygA~��K���~~3���p�������rNW�v`lV0`K�����dS<�1��.E����s�o\�����(�XI�q\-�i�x��)����%:=Y��g����<`*��}��m����N����L} �`�N���"?����q�E����@��c$�O��
7�N��S����C�����V�*\)A���K/@o`����t��������
<`!	��
��%U���\
	'��p���k#�,:��@1���S`�������O#����I���t�#��BV��+@d���6�-�|�N�����/ �6�Y����\�@ols$w��Ed���	v����t����_C�K5$S(�6�m���Yb4���6�q���]�
< ��y �8&��<IZ'�{>���DS< 5���T"��6]sTK�:������`��s��9m�������L�P��Zm>�V|�!(8�B����!g
y�1�r���B��{vV�������/-p!:.�Nu���$u=�������&������S�#�|���c�q��<T�kJ����I��\)�]��H�{*����@'m	R��$_)�������������B�j�q��nr���M��sQ�BW�������mr�%����pP���F ���3��������M����	�c�Pb�p����<�K_)�����q!���l	(x5n�#�R`j�%���iS�<�I�I��Y�6H��v� ����)/���"�D'��{�u�:������a0Kb��v`E'k�`��'|������	��uY�M������E:�Ro�^�;�	����67���B<U���5�pl��i����@������k=�����&��
���'�F�������^����x�@!<,��Zp�1x`C�y���P�NRRH�M�q�B4w��T<�$��Rl��$x�j&�r���$+0�:A�N�����
m���-:*
M���Q#�����"	���Sd�Om"���mx
�v�0�Hi��>,j�kO�7���9���9���
�t��;���:AoR28K'���s�?�������Z���K�����p#G��-0k�C.��$�����)%��P�������C�����\���Y��<p(aH�0�\��9��&�Am���kr��3��h
���IY.�)l��`��I~V"A��a���\I@�,���	�fUU�
��+�=��q�b�)1�P;I���-�E��7��oN�����!
��RBwR���_�5�k�H��,%��<��a���Y���1���2W6`�J��a$��0��k#R����fr���������K�XX�����+�;(��^�&)�ke��p�{��S<�;��e
�1�c�l�9��.R�Pt�<p��^�{Q��8��{��t�L��n���P��BQ�z7$Pl^�>�Ay9\O��P
����i\����=0+U������)���j6`�7U�����h�&]�<h��7��Hj���e�-1x���)�#%�[qh��(3<Bn���-�US�Q���L���i`�����iWQ[c�����!�n�-��o�����T0	��������I�VSbav����	�k>�)���zVm�W��f���$��*)0%��2S)���$�o����sD9�.���SE|��?�}���rS<`P�QR>H�xHu`��[��L��R����4���-�D`�J��"!5����G��$����=t*WK�������M����N�,1���PR���T��0������yth*zP��]33��R��I����p8��F(���$9�B^�Ag�����5���v��x�!0<��@�xp��'7�E��G���$�L����,���AM�=3a�ZL����O}�(���N���of����n���|p��@kR��<{�"������N����
,������p��f�C���uD����s\
i�9x���������ss1�W��X���U�C��~z�������yHE������2A����F:�3v*����^����x�iW;`��^��4<�<���+������K�>j'���:mF)<���@���H
��#x�W��;��A���:�k �'F���f�]tN��F9
��N�GIX5����$��I�x��X(�HR H��5w��A���
dU<H$�y#zWek������xp�};F7�!q�sf�W���)t��?W����ld9��7��}a�o1���P�I��;��ml1�I;L������*�����K'x��C�����Y8<~���A6�Mm��yN&�f��NB�j�0�0s������
��W_w}S���N�U<�wi�H������g	��I!������@d�H	2'x���b�#��j�l�@~��0�@�!����z���EhR����/�a�
'&|�xI�)Q��!���s�?y(q?�����+H��
� ��w7��Y_���W���_�::5��(L��{"�����`�:�$E��FzBN�5[�c��������kwq��,�3��K�l��Xba&��%��g��UD4�}��M�As���3'RWJ�q�����U�`���\%�dq����#>>
jW����1a�/�����2C=���xf������������1><�������0I�@^�<`j�$H����WDB�6�X�:��x�$��K�Fi5u���R���@�&WG��|�O�2��&X���F��Jq��@��jt)���^����e_���*:T�%�F�T�	�I���
�>t����$�� �z��0B����G��_��_�O$��������1��$k��z�NFT��8����FV��
�|��)
��c�	0G8S`���zB�F��� :���:Q�o��wW}�t�G�PY�����*�A'�������@��d�)����">4VU�q��&�C-8u)��)�&�^�������A0������hh���+ ����A�5,Q��Z�|��$d

� ���D=�!�<H��J�_A�)u��U��#���x���y���N������Q����:�-���x����H'f�V�qR��m�����L��v���T���~|�lRF�c{�Br���<z�a�{����;��`���	����2<`���L���n������0l�.�:0ej!6�N�Tq����������Z�F���:�v{����@��bD��?+��5�N�Z"g�y��@*�b�~��fp���0�A���	����w����;"��D`**���N�3����geXh�����R���7��Tb��dM��g��D�R��X�h���P�~�9����?�0����T?�IOy�/:�O��Aa�Y(���$��4A����
p{d�'����r=bW_�}�?��+0����A���u�8� �/S0����c'��OP(v�#D�M}G�p)BN���2���j%��i�s�ls)7������[�l�����$��)V��d�l��Q<l�Va��5����&d�s�)U��#l�f�5W������1��Z��y7_�6��,�BN��K'�M������$���T����~n�p�}'���f�%�+�)��4���0�S[rp�'��w��*{��>����=�C#��A<Q��ao���n
��zS�Sx���)%0����z��I������������i��bL�����x��:�N*��}a���v+�QF!4�4��B�Nz�����L���MH&�I�$��:���C	I"���)/�c4����a#����h#����^���.\�i���f-���f���o>��x��4��a����o�@���$���=`����jx3�o�:����9�-:�����pX�R��y����x;�H����0�Y3�����x��)�A��E�	$S<��5
��%<hODc:��N-��{��t���_T$���."������>^�i����a���h��@�Q�����9g�	�����/N�x�����X���2)]�@�N���\�O�X�`�9K)7�@��;3{�A�@�x���s�-� :8��IEc_v�)_iY��9Q�q��%�������X� ��5g����)�����7�Nf�?���fj���6*�q�~��k�\����k}rh���v����0|~�;��af��x������,�B(�B`��F��� IDAT���utQ�����G�E�r�t)���8E����s��v��@��F����G�'r��~����N�SP�N���1��Y[�w����YSc�d���Z*���&�Xs'��������	8�U/�~D��e�r�?�������U<hT��;����2��J�
��X������T��,�K�������${�x����D��^}���w�)�������T�3��#0��9v ���1��~�X��E��x�$H�7�����
�lI������������^�
������{�LM33�L�6������2W����{��QEp���^���r/��{�x�Y����}����'�0o\c���.#&�?M� �����3�G��;�HLTSn����Tn������g�_O�y�_�=d�=>�VI~�^0O���w��p��Hn�AW	������u	rtkT�J���b�W����B���]�����#m$�������5�QQ�������	s����U��`BIB�a(��	CF� s��J�p�`mi�_S>��J�acqf������E������R�B������'W����7�����	x��-3�'�RB|7�n���^�]��]�r�7�Jry~}�6|/<�/R���w/l��g3\�����"��{���0��/l�����X�0&x@�/��t� ��n���n����C�����A���r�R
�sn�,���Tu��!'���W�m����bJU�H�R%�M_;9w�����O�Kx ��vtIs����]�5�SDG&I%��T}����|�?����ua�x�+��@����0n,�xm��#F�?�8���<���KM*)�P�A�����X_�u	e�L!;����g���jY�jT7hZ�V:xAy�].���NE��du����A5S�Z�
~��wN���J.���������ac�u�L!7������9��/S�@�/HS<�15��P�>T8�
��b�u��<�D=8 �Z������?"L�!|MH��G)4r��n��s(O����~R��k�cY(�Bj������X�p� �*Lhr����Cr6���l����!�(A�a�c��"L1���)��n��~&��Y)����z��x��������������F2�s������/��Gus\���=m�������+�AMj�q���g��c��R�`j�6�=n=zJ����7�'~�q�kVDx7���p�R�Cn�Ai��t��G&���R����X���s�IR�+�������Xc��AT(�\n��'Ds���y�JW
�����L���2_�.a����JBm�
��sn6�_8��;S)�/d������g���O��>8�������~�B�������l#�����W�Q��k��c�	�"���1������"������w�{j�P&����xv�_:xP�zg8�o�9�1���x�\��������3�p�6���;$R�<-d��V�����]�Dc��/���P�@�����B�4��!�R���B���(2��������y������}��������0r��A7J�/��F���_UP��
V�u=� 9<
qW�!���*��7'3L�WB����D��c�O�_zH'�k"��J��^\Cn��1B���f�E@�A�DH��V�=��(�^!3x >����1]1d�x����D��H�oG5�k/�%a�an���o�|7���>����Sy���A���u��L���\���]�	<i����Nv�
~1�E]�:q(R���B�Jw��Q��}��T�C� ���������e)�4G"U��/�����,�y�NI|�x�ef��S{�gk;������sQ��0>�������l>{4]� ����}�'��gAt������!����gpP�`�?��b��nu����c<WF�y��������U5���<���������w�2���n��W�g����_�<��c��(B�%�������@A�[u>������s�^��|F���3x�c��M>���s���a�"a&�PXs�G�~A���A�>��R���+�[~���f�B�.x��s����m�?�]���s,�F��>��|��B"�6�L������w��t�� �^�6S�2�y*��T�j6��p�D���A���_�7������PJI��Ci���|l����AB�8s�kOW�A������y�*a��J
|��X�4F���9�!]i�f�]�]�`��?�T�]i(q��m�
H��=x���1\����X03�o��g!�u�2���*t��y��pU�4ukVE��5_���xw�n:�i�T<�r��{-�P�LI	d�x ���`9,x���/�Q���t%��w�#�����Z�r���{HW[�*Cq�"��
��m 5-lcF����*}K�?ju���j"Ru)�$]Ax���fe~]�<�/���oV�AN)�
�V�����A���\-�������.���*y�8���vUH��j�u�����]����_�A^�S��e����n��� ��:B�#�%d���Kzm���a�hx!��N9]k�t&]SU�
�/HEuCA���u�?7�@��J����Y���m��&��������(33x�n=�s��n>���x��|z��������6�P���jA���O��f���y	7���^�������r�K�vV\	f�}!]Y����2���p!\,xQYB����i>yM�x��<�T����7U��,7;� ?���wn������('M%A���4�/�����QVn�A~��+yf�jA�����M��������>3x�B�W���%���&7�� �37�� �1�:d�QGu�m���<2�HHKG�T(L
��e{��e�A8{3U=W��5��.�������S!*';w���N��Q5QV���i3���y��>��:d]�+x���a�`�P@��x���z�@�&U+C=x������Z���E��9�^����T?���yr��y
����f���A^m�9�.�Jh�+���f�S'�<P�Z3�<��v�x`K�S�����nR9a��T�#y	��U<1��,��h�
�_}�;>/��*�p?�@�q����N�m�R����r�������m���z�@=+���������A�[X�l;=x����[J=x�-�D�����t}Ce����]!��A��re�6ze��}9w�?�g������Y@����*z�������o���t��A�l}���5�W���j7=x�_�}5_=x��l�_%������>_�^��^����z����������^�][=x�w����m����rK�_r�����<����A�6���[ �z� �:�<�?����<P�J�G�V{��Fo��j=x�Y������Nj=x���
f\=xP0�E_+���<x{�T�]m�����������[X������R����WPS����[F�n#}�^�R�dV�[g������Ww�>���m�\k���(899���G���
���
��'�j�8�kQ��](� 99Y���� FLLL��P�B����e�Qetq�^��&E�KZU����]���K4�4�z��:
�3W��S�=���u����HJJ��ddd��M����*G��������CusV.�}wTO���ob|x�W/�27�Cm�O������J��s�B���_s�vm�G=gD<ys�������Y$�b����-�=�UK���`mV������C���h��y�ox�����}��Ob<�\�}��� �:��nM�a���j���s��
��|���U���-��v��^	.�8�x��r�1���Vf�x�1p�w�_�(@����T(������bHy�0�9����V�8�J��j�220F������a��;f9�T��/G���N������uhTA5gB�Y/5sx��<a������>>���,���j,U�����c�+��A�=rmFPe<r�b7.<��Jv����b4J����!88
������{�Y����nr}�o����k(H�y��<����'�����|k�e���Mkj��X�x��)�)�YF �.����G�������*��#������0>v���C�CW�#�_��#?�:y�S?����+��=������+�?��P���������������~|����3����.�GD;��#?{�zy��xD\���?���z�N�?n=x��;������o�/e���|k��r�B{��������+��_X��/h3]i���6{��y�B{��xD?^��?k3��P���</}{hnCm��+��x][=B;���xDXBW�]h��P;���r�������hS}{h�gk����G�%����%x�c��[H���:h����Q�\������[��@U9yOH��+_�����Zy������B�9���Ghh(,--aff�������=^��@�C<;CBB�������r���k0��E(�JSH�����g���o�=��ta<"l�om��������5S?]�?t�=����o~�Hk��f��u��#�Z����������������<A���O?>T�R�OW�#�R���o]�K���x��]�����P�gh�B�CW�#�%�d{�4�����c�+���PXRO,����V�7Ij�
�r�B{�	Ym�l�������;����Ok3]�{������+��x]�O����5��6s���6��Y^�����5��N����P��B����C��������0m�om�����+�a�7y�����A}�������ot]y�2�|_�X�7�"��%t������T���5�KW�C���y_�f����em�
���������~��y�f���6��y^�������AW�#����z�v��������������v�Mm��+��������V��<]�K���Ch��9��,��|c���X�����R����6-�+��.��~�����y^����p�o���6s���L���6{��y��xD?^��/h3��P���</}{hnCm��j����GW�C?>�N�V.������z�v��������hQ}{h�_k#]Y��x���<�Fo�����@:x��I����NHH����[U����B��^g�gG��U��Ue����|�����~����b�S��o��������������qy}�~�t6�O5����`��3�����F�S)��W�a�k\1���(��9���GA����Oq[y��oe��oh[P���z�z��<E�g����N���������Wk�k�:�1VZ�/��t�=^����U�#E���5�<����
|`��O����l������6GU�#�*K�@����w�z��2Q�����<;4��S���P����s�f�A��V��If���{��xjf�I1*�-���	*��I�����9��r�5�J��p��n��=�+t�c����S�0�nu��k|U�#s&�7� ���\�V5���CP�B����Sg��q�:�~�����yim�id=pa\���i�� ��U��������hP=�%��.�X�?�Z�i�il���z�ij�	���?{W|�"���\�=���\3V1B�6#�Y����s���bF}&z�����e4������% ��d�?��[Bo�T�@���i>Q�(�E	�P�W���t%�?q�O4��PK�B������c�I?�v�����W��r��|.%�����	a	��_P)��,}Y@j����2Ex=����Rr3����>�5��G2*id����k<\��l/�)P-4��'���k���m�=��2���l�Z#���]���L�&�~��[u
���]��o��z�U�;�/&\��P��N�
�G���Y�A�|)����8b�=��L��������i���|h�������=����Z~9ed���=-^KYo[!S[�g���p���L��9������7�/���+��Zo��x���|�UQ��.8��?����cD_�����[>��LA������<�����-�����o��%����os}�o������v�k�t�-U�=x���
^=xP��D���U���8z�@���������vz�<��z.z�����<P��z�@}����m�6���oC+i^G=x��
3���o��r�����VlD�VM������|��,���sY����Q�j��(��������U�Gqw��8"R��K����	�1;rL(�.>�k�&��
})_��~��}?,,�P��{u��C��T��X�<������Ao��,�	x��6Q�#%$Te[}2��W#%B�r������X�I�0.S1�S�0��M�����`5a$�| v�v���j��<(9�"���������S��h�)>M�f��MSX����h��Cms$�tP��xU�������
������r}
�
Pr�-�����x�>2=�eQc8�1G�F��K�+�����y�!:6��FX�����<�*�d�V<�X����U�~�>��]G�U�������E��j�K��tq��`�������0���i��j�W�����ah�q��'0�W����SF�>�����I�����`��2m�������x�V��{�	�<���1���zTOD��R�K5���E���Z�M�t/�k&L/���f
�"f��<�W�j<��sC��=��.�-lq��j�.�M�/q��F<}|[�t"���\�K<�9��p)�V�./����Q+�:��<���DcRk+|�)3{X�S%<�L���1�����<M��;�����L~�;6�],d*�����6��k:���Z��c���^���x���}����K����o�G�����6(Q�n��{���d}�	\��+s��?�:�;��Y����v������#��]��}�t���x)��4�c.N��_������A��u`j����Cj�K��X�8<z����SU,��q��xt�Z����D�f���a���=���n3����3,8�SZMT+���M�����"<:
�4��K�p��-���J=x���^��_4������A��l��y�;�U5�j5Z�x�J��i���Q����|�+�^U��j�V|?�=���H��x��A\b
����M-0���3z���r�v����_"�p���Y{�!�����z�q�/��aki��g.���f���o���}:b����?��I����	)�������m�]�M����"&J{
��i���g/!6.-���sW�|�6���L�;~����0zH��N5���~-	>;u��g����%�1�OX+^]���p�H����h%����R�����[T,�?I�=u��Q�V����������V���,�<P|��?������4E�o���Mt<00�������}ffgTM�f�33xP|�
��@J���5�`le�g��g�:�M����W���g+kl9�����*� 1�����v�"w,���{00���F(��A�����S
1[��q� �?�~�a���~9�� D��7a���F��Q�v�&�j}�
������Hz�X�*�O��S��$�&xP���x����z��{���<�������Oq�?����`��(|��&Fy��|�'��T6��-�6���n!(�&�*���=3���x���
&��u��-"P�z7��in�hZ�����{m�k�@�f���k�[��q�RH�r�?8U/	���`��4�mN��$'�m��)����-� >)���I�>�G[&������3������=x���X�j�U#i��������<���*]e<ka��W����������"1���L��C����V����
wW�Q�<�4&Gp ;�`6��[`���W���gn�x����5>m��g���C�rY���]P��+�\��|��6����������&� d}�MaF�����	<026E��a���AgO�AP�MMM��4x����7����}�h��(���$�T,�y����i� IDAT��8/�qR�A��j�������.�� \
9��?�����������}11qh����~��9PXY�]�����<s��� J�(����h��0G|B��	+������X�1#J��� >���0�;�>��������-����H�.��	��Pa	�x��F����?p\��6��1���	���0iX�{��`R;�����9�1�o�vDU;,��KU���^JkL�A=��e����d|�c���E��O���_��x�.y_:�#r��0�T.]���/b�!<5��\1e��� j�r����N���0�n���������7����FJ�J$y	<0V@l�'F����w����t�k�T�3�b,B/����vb����D|pl+��������M,`S�T��[�N
�:"�T,��'�H�T�*�d�o���VQ��y2�������;4��:%��t�������
����
��?&�F�o�%��*i��x`le��A	���S[ �^���������������BL`"������	a���D�wma������h���HT� )6OE��H;�>M����V�;: O�G�b���J�md^���d^����3'e?�G,�d�b�H��3+d�����"�<0�7�g
�-��{/BN����H*>�v�E"�(�����p�[���V$w��R����o��A	W4�e	�w�*
�vF�[�w�K%�.�ROf>}�����	�E+�8�D��f�V����N�R��@$����������.���<:4V��������J!'��$e��,�s$f����jS��3����j�1 %���#��~U�I���"7�������a�i$`b��}� %6
�.%a��;�|sr�|&�Um$�I�C�=|�B�n���CR�3��+:�@'�)��T	�y�0�P��#���!>Ky�W($EE����d����6��������5�����
8R����X~����_��dXt(���(����I�B0)_1�������
L+� Y'?��Q��"%.���0�,�&������s���`�`���������~�9���B��,�T��������l��%aTH�?�e���x(��e�%"z�%�����P�_O*Do��S�%e�"�q1{$���lp�=f�������]+"��&F v���������2D���ZG~�����#)��xm�m��2��l]����M����n��_�5�J���j@;X[ 9L��5�i����
�������U��}c�v9�v�I�R����n��� ��F.�R!��#Xtj#Wg���%;`����
XM�yIO��A�������7��N�*������n0���JG����3������9��F�O���[
���%���<�������{8�q�e���E_��u6kV�}0��p���@i���x}���XF#�k��k��m5l&J����0�OE*,�k����;,����m=�$����0;��h����h8�uF8zp����k��x��=���M��R������h�I�.=����C��P�Jg��)�����-_���$����f
�?��|��R�.(S�9����u���t���7n\U]�*'��Gg6#������&�����
{B��=�l
��1�-���FG8z�G<I�Y��cpw�$�E!��T�R��F?��������H��A������
>�f����(����*�����_��
������k�n�p*�[�����	�����;���j�M� ����	Q��$��@��&��dc��{h=	��M�c���-��w��S��X����0nc$�p����w8�p4��'b������e*��+�h��EIGc�x0��f����
�{���>	|����An=N�a�qH�bm���,��z�q|g�����B� ��^}>�[b��h�XE��]����9N�O�~*"����c'#l�����0���L��b��\@<������!�A������2�����zoGc��{ol��~��|��Yx��{kH���V���5�}������3��~Z��#(Nh�x80�w��&IF������j�P����ma�]9�\<y��~��pr���C�#6&��y���P�����:��rG8;���
���}3���4�������������l���y��"�l4�\�
��g`j�9���T<�y7k1��L�B��n�	t�3�n��#��^��p.T
�/n���{W\����Yn"Z��|����7����(�F�>���K�9��c��q��b�G<f_3��E=�S�E��~�ap)�b]f����wy<���`�*�Z��|�	5�x>Z����o�R������f���>Sm���$x?8������X-�+V�s^������
%�CI�������cs8�B4�^�h-4������;�%��W�Oanj�x�������V���*![��
�~C`����=�����?���P*l�����6��E�\�qJ"�U�w����j�$=���Q�q,�B�-�ze�x0�NC4,UV&�l��m�El����YX���e����};�����5�.{�s<�W�`���y�3_�D�m_ :(��w����s>�N~������yOx/�
�Y��>D�w ��l�5n1c�Q���0��B�e_\������'������L�����(��y%��l9�O�EQG9���7�L���������(|���uqkQ	�X�GH�3����sSV�r�����O���:mW��4�6���V��
x�z/��
M��`hb�O���U�6���*.F����}h������GG��n�x�����z���fc���J<�|��Z#:>^~g�~I��������I�����t���y<�� 4Ck@e�
���*�>��c��-�#&1���<�	�bh��B*��;�����~����)����y4�eL�:�K5A/*2��'|�����e�e�>�����{M>����bb��a�q�5ON3��s|{�A�*]a�{}��/��P��r����v|��$�T�R<H�A���r>d�����9bW�����]� n{�f�!�I��R���BU�N��y�����|��YaY������0)\�#>@��5H������;�r��3<�x ���v�&���6����c\�31�OP�Z{N������6KF�V@����e���R<0�t@�6_�y�c��xtc;��_�X�S�9�'��ry�0_��������N#��=Y����Pn;���0X5������x l�+�'�#�5�B�@�{J�eL�����O�]�m��������-�{��?��_��=����������D>H}����K���������g���{D���T}U���h��i�R\[[g��+���q��6=��|�����f�����
���o���$@�o�d������`���p���O������HW<��v@�����%_B��gie�[���o����}��w�����7��3c>Y��vs,�=��?f��o�T�r���\�,�5����1�P�X�s�z���8�y��;	r��0���s�y��X��bHs|�#
n\?���%~�R��T���^�����&a@]sT��lxt2�����\��A�J��V/f���g��9�m�2��A���J�_u�z ��g!��4Z�/�n5*�y�\�����bf�N����BF���g~S�)Y?�9��<h�jk�M�	*����*����\�<�+�����r�^Y�������e���$x���Y|A�����l!U�?3xP��8������=s�n^��v=Q����T��j�?�G��qN�C7&p�/��9_�^��J���!�fc[8t���B<���]�}�s-�����X6D�w-�k$���l[�!lW
���_V�A���hR�C�c�O��s*����8�x���S|��rs�����(S!U�u�������9�������P�������=�?{��UZ���a�����<{|���\+�Z���l[;a�U���(�i�@���Y�������Ux�*��F�������xpo��}1���}i�i���=c�����P<.�o������*�6��{{�4?����p������W\�`o��<�2*-���-���S'�F`�Slc}F�Fh�p��EY^[BZ���}��G����B'�:�>����H��0n�aX���J�`E� f�$�=���#�����}"FO�]�����\��t$��sB���E��3aD�&�i0,�v!����+7��j,��B2���� z����Z�}H�M$��$��!�K6n���:	� n�Q$?	����7os#�/�4Wf["��^���0&dZ�a�7�C������\�#����q�x�	�"�/�$��y	<p��T����E������wW�����������(�1�
�]Xp@��\,������J$�����O@l�p�pK	-(��_b�
w(� n�z)�k+DQ�J@���� ������/�$�Qf<�������pig�h.f���j��P���� ��.~Gs��9���������0a9���?7�K�������n��K����B�@��&�s�u��GN�%�pE�1v�(3�e;����g��k'�b'72X_�]����P�6��J������/Z[��j��(�� L��|'�C��H�@��Kq���X����6�m*y���!���2�;��6�;�:�������'�������I��0A�v�H9v!]�+$�`���0�Z��&5-	DK�a�%!�7����
��BN�A��E$>�
KJ��y��y�����/������E���0�$���(�;���($E� �IN��)
L�W�B�3�zT����S�},�����Ol��$>�G��(�������m�G���2m���RQ��P2(��p��v�T$�A�*���+G`h����r3�+�g��}S�6���H���0gnA�@l��p��-�#^���y
�Ve����x����
�N{�F�4��	7��=9��t�w����r�8@V��8� �V��"���E�F�GJ9r��f5��f�ysn�[���
�)���(n�[�����TU���D���D7�Y�b�\xZB
���^u	V�jJ� z�
(��F��raXM4,���W��*���A/]��G��A�	S�����d��y�&�o=����"�a���� ��T�����*�����@��5����������m$�}�O"r�JB��$L�,��A��#�6(}H� ��U0���n���x����/�jp��iX�o � $GD@h��c�`��%�����p����@���aR��b!	8:,�}Jn�G����H����<6�������v���������2��v�{��w�z�<�p�$6,C��z\(��
��l_n�bLs�  ��m���ie�k$� �����(`���iX�D�@$=z&m l�i�<h�jI�kx����9�m;M����:7�����N4k�	��[{w	x�'�
��'�7/�Y%7J��8Y�D�^���k�d�+���g98*��U����%���A�K�	<�����91!
����8Wl��Up{�(�|(�� �dJ���U�`nW�5%x�\�9l�U��>���ta;
WmK����c
72
M-P�J+�X$����x��+��w���}�����P��8�P����qo�\���n9/g4Hn����Qb:!��w������[����.sCL����`s��:���h^�39���*uQ��?rL�� �r��pl����Zt{ ��z��g���`i���:�\��E#.rLV���(��n�,������A�I�Opa<�9���
�l��o=��8^
x��f�Q���Zp �H#�����a�l�������9^
K�3#�	w�)��3��\�Z��3��J6���:X�5������;�{���t��'�.���bc#�c�t'��s�(O�5��5����L�pcKl���7���$���g���O���R�I
H�g��PF����R	����A�]�`��P�P�������#��������I1�g����
?��xF����zxx ���u��������:���G�	����kT��)�b��xP�b[*\�q���Ez��M��8�#��~�
k?�������x�<	���x ���7'�:0]{L����������u�/.����-B���T�ps���<iy��8{j��Yn��ve;���o�>���^~nm������6��m&�YX��x��6B#�E�X����;����n:���7wq\��AM	T-�%�T��M<���w��WM���t'�:��<33�@
�V�uj��*7AT	���VP������H����n��c�	�"x���2�o�����CX�CHv�B��N5�����N A��x�l�(������3�"�0�~S��q���c��1��?Q��e
�h��kA��b��������L�\�;��������O�.^Hn���b<z�����7�h�{8��_�ru@���ph�����E1'�!��]��������f�<
G��]�|�	#�{�������=*�������i��Dg��K���(82�Ot�f����Q�vi�XS���q�� �+��]{!W���u��c,\�PkJ_������-��f��Y��?��!��z?����S�uCv���m�cJ��x�{����mE�R�Q�HE�����>����m�6���<�Oh@�M�7O�o���{�9��URa��t��3��A�j=p9�,�-��l3,<�:�k�����hd�wQ�c#UCv����+����(����A��V���;�z��7]��#�!�.F4�?���y��|OJ�`���BX��!k1|i_t��;�l�p� ��GW�� �O��F���p����������8�;K6�����?�Q�aR��kw�R�������A��+����.�}�"�J�A��p�1UAy�0�B���0qs�i�b9�xO(���)�;�'�:
�
Mqc�<�nG������g!��]D����j.��	�8���P�L���z����QHVa<!..+� �����5Q���@Y���0�U	feJ�frdDZ���{��q���B�R
1���<�S�[~�k=D����C���kP�3~�s��x�e+�o��+}�p}26�<�����D���|�>���e�B�����Q����D���sU�:�Au���P�!����:u;�$�u����}��s�<X�hA�>�2o��F��CB�<�2��o0{�p4��Nc*K='���j�Y�����k�$x �_8`��_vx	<�����n�����S6`���2��R<����5�=�k�&,��xW{����D4�����������xmFO+,8��X`��HT����(�3���;�A�<g��8�Xb?�����<h��Q�"Ft���x��u*���u$�;���'mc�/,���Z�B6��0����vi��o�������m<��JW<�{�����m�(<(�5������.�x��q���z��gwCaf�������7��a��;6_���-;c���Z�>�,9�
D�r�-��]��s���0F��c���������!�HN�][s��D�q�b�U��#B&Ix�O�V����z��-�P��T)G��2��������&M���-�|�4�KGn���O�b����\���Ah����v���,>������Q��,.��F7���4q�kfT<�,��?<+6E��px��\��1�<�c����;���p2�'�=K�|i#��mh��>��mR
A\���F����ec�pS��%k�r���(L?2]A!���������8cC��i�T�������_}�	�s��C&�R. IDAT���!�$������m3���>�-���,��G��r�^1m�T
���|���@D��N�������?�E�|aY�^�"� �,v��� ���V
��I��l~����S��������H�����}j��5��[/�I�"�dB8��N�u1���'J��ToB:x���1]?�a�������/_qs���I�����?��G{�<��1�?�E��y�\<'�#�-6�K��R@$O���M����|��q���~6��\�!�Q�{YKPA$�����7j�F�M�`.�<JD���)���"?2��E:(��7��p��;����$��_�=X'Q�B��������x�F*��t<H���� �1�:$TAA�\4�'�4W��bP�}��e��%��;�}�FP���RB
!Y��3�;���9+����]�����x��[������=Q�N dM
�������D���.T6)a�i
�*������x�S�|���e���	<J-�Z����p������Z���_`���O���R�@���A���A	��q
B�B�o��X>�;]��A�x 6�bO�D�c_��!-�^������)����D��B� -�?�M`�!,8��A4��I���^G"��z}|��x$<�{N��W�@8a��T�����M��b\
%l�w���P	����;�7���`h����P�\�
��?Cb�}�]���A���Tb���Q����;!����-�8\���0~.A�@*���@�R�y"��9U"�a��R�`D=��(+j%��~��'�	�R	�����NJe���<�s�O������,	��j��^��_������T���I�S0��QZ���yov��������F�M��)D��LJ;J�A��'5�WFR���0o��
��F���$|`B`@��=r��� �x�F�|F�>.��h�.���X�x�F.
D�x���=�P��&�[�A���d�x:�LJ��S�*������'�*r���O_��q'�L ��Q���{Q:'�z��	��S����a�a/�]��5�v�\�,,7�-{��� 1��6�!���6Z+���SGH��'����,�
�;z��0	%�Z
����;��|��5o[	����	��F(#$x��h����2�bD7�(�x�)`A !��]'yb�2<��7��ie��6�*�e�fHzLX����[�q���R�T?��]�fXZ��O.sC�8OE�Sc�Z�m&�Q��R��}��g+���3�
<0���E�.n�l\B�����4��p!��{�����w�]�
y���~�K�i"�^R��dN�Ad���$����T#��o~�����&����0��`Z`@�.��D5(�.5:@�RW�O��d\?�*�8�����	1�{�H������He����
B	\[1	&�m��l�����hB
Q�@��A.SM��D�2�*!7�@�q�^<�P��������a�X>'����	%��k|��q\%�DH�+��~�K�)�� � �}����~6�|[$����|/���JJs,�����<M$���s�X�*|$J��"�F�0�����<}4��5��T�!�Z��/�0��%N
$x J9c��H|��
?���iDp�/{�}����.]Y~��TE�����3�����3����3��R��o�a([����7�.cV��v�JY��L}�������O���4�		�SJ��Sz��"$�W�	��7��6�?��}�u� �����W0h�blZ?]�O����Cd�S�^!��e����/�"�����������0�:v���;��d��TP���<�K��U��r[����p.T�����T����L#��5c	�&����������`�;RA�Z�P��o���2x ��w���|�x�o{�b�)mP�����$^o=n�*-��&�'�wn���:#��v�k@������%<��d������r��x���_\G�]�\�)���4�����0��t��_<�������]�u�w�Oq/�6C;|_n�^�9���p�/^�!�p��2�/�g�^O�����Z-�
�:�<�B��>��*?�slT�.J#v���b��F`������$x`��j�K���
�D�|7��e�`x����x���Lj��/��o�3��2����aT<�,���R���{�O�7��t�fV�
p�U
W{��S�N��s�j<��e/�E��f}\����p=Olk9��|*7���S'������M��pi����{#��c�V����T�Cu��`4��}�`>��5���
�*������E%1v��Hz�!����#��D��4"�������+���j����h������A�5���Y}�xp�p�����^r���}���%�H8���&���
�o�������E���#�Y���8~����1��4l���B|%�0��X��k���I@�'Fnw��bs�\
%�����TZ��}Pia���h���Z����\�O��O�*��v��~�?�����'��;�~�v$7�j�M����s�B�Q�������G�
<H��#�{G��M[p���x<!�>5��7��;r��V3gR���/���h�����������[\��6;�\Fv�	<��.��Q���P<(V���%�P�P��!+�@�<-Y{0l\����
�]C�~�pf����
<���0vv��@3Dl��u��0�jln!;W8��~��d=��l)4��r����W\?(6�XW��� ��T��	����-dD?���s<��1G�������n`�������T7��fx��V��^�@�*j��a����L�c�w;0ur'T��e�Ra�����z���b\��<�?h�T!�R�9J��_*_������
�X.�'�L��	?|�_|��O��x��}��f�p-K�����:���MEh m���J����$��2A�'��$�:���\@�P'H����P)���Z���y l�y#�0��Y8��L���/�v�����T�iq�Q<��y}��l��a�����]1�{)",�O*��UH����YFW	�[�+�&p0�e\b	|��)��5g���`����_3	i��U�xVF���0g�T)Z������V�j�����?
���2�D���F��4A��8�H���T�ib��9�?�����A�,#(�~���������w��;��_���uq1��������������rT���y����~G�^����gO���Q�x�5[Ss�D��V���i����;���!����� S>�E�@�q�<XMusn0��B��U$4`Kr�e�z��'���s�
B��M�X����(��T���Q���7��J���!�uC���]����SOQ6~��S�^�<pS�c�&����2��E�����Q�BY���Hi�������o[@]�@l�'GP�}�z�$(g.����T<���*���S�|�-">�FT#0,L��/F�������tF����E�d�����(�'��6`N� �RB�
7��.���JL���/�8������
x�� ,�N��R�F�@�.�E�M��^��G�%�PN�5U������B�_�4�<F���Z*���.���$��v��]��x`N������m���z"�M�������Z�l����o�K�B�������A����C��8(�(n]��r��	(i�Q�A�@�u(L��]A� �R�����<����}o*8��{�>�t3	�&���$���:����g$\�R����i��P��$uk�������v#��2'�� p����S�,)�U���E����M
���<����- ��	<*w��%�A� �i0An���=.S��Qu\���{��(���V�_���� �����-�B�*�zX�
�t���`��*!'�@����:!b��R� 
<H|��t� \!�sbiH��8*X�n/]1��x@�\�.�+��eT<2
��x��	��X����MB2]<$��������('%��X%U2��"V|+���G>��y����>�V-)����x���m��X�_F9'G4�����*��P!.	$�
&ta�(��?0O�%����W�v>B��k�8,+������zU�nA�&0*i��q?X����kART�L�B�6���H���`�h���K�!3x �|U�H�h��UU����.$x���t�w�_�����F*���H��$�����V)<�=q��`�W��+"��}��pE���'>e� m�@���3��:U7����+�/���~P.���J �i��F�t��@1@��T���4F������r�6�x{�, U�x`��*X�P<������vR�@*+�*�2�`���je_��R��J����a|�x��fA�E���
�t ����y���}� 	����9����k2�yXto��H�� �{s��u�t!>IUU�h�f5��H���r�nE���`����A�v�?;�@�A�w���UC�up���t��z��|�FKWu��w�'�;��A�Y����� B�6��<�9h�r�X�7�H��ReSEa7s�r���t����u����Z�����!n��w9&��i�T(0���K���m�N��G�Q2��.qS���Y������}j$([���Z���EWcQ����L+xo��r������O���W�����t� ����6%��#�(�����W	��J�c$2*,#pP��1b����F�pQo6����?�
P�=��[	�����A=�����HU<��P<n| �;����
��������S�/�c�Z"����2�����������7�����;��T<�t9=��c1�QO��
�a\,�Z�\�4�$��QUA�{'3xP��&A�X<���]���5�<��|��A�P�t#	�����t{���y)b��W�Y�
�Ii�����^��t� BF��S^�8����*��J��~������
�%��T(e	��R
�:B��Je��}���$B������V�&
���Y��^������Q�N\8�M"� ���Z�0a�x0p�TK��r#_����e*.�_O
����PF�1tP�Fy=�����g����-ZZs�t��>�;��u
xx�'?L��y���h�Q)�Q��s��p]!�-@������c���I���yr!�.'7���U���*Pj���]�R�)�^^��
S������FcT�Y���zB�Y(��l�#���q�^��r�DE��*�Q�����.B���EE�'�@R�`�?0�R��] �;M{h/��F�Y��� �UCV���������i������Y�%xp�e�6����j�t�p��V�E���x����� 7�����sC�!-�+�� �N �l���"�	]fR<0��A"U�L��p��@��_`W����������<g�&����B[��)����y�
M-����*�	�Axp����@��+`�k�B�Q�p~Z**��{N"���oe������������C�����5�\�����K�*%dR<��`��-�S�P��+��}�W�&i'��J��.?��jO�|��{�>��E��x���J�na������D�x���
���+�����f4����,�A�:�|�!�^V���3e��=�������
B����4<���L,�W��[��8@��A�G`6�#�R<X2t����-t��1�\Do*��k
��[����+T	Y�	������r�0&����_� ������TsG��{0i@7s����*73xK�CSS��h��?�8|d:x��cB��*��/w��K��Y�1���Ba�F8�rjt���+$x`K5M� ���t�P�L=UL���{�j����E
�����i<P����������`���}5�*�y��K���;���V����<�S_�����2��u�P��0,7�*-Y�K]�i<xra
s����"Xr���X!
<�%<��9�1�����Q����#9]�:��	��L(L��\*��E	��Z���9���G�h�����eX(�A<<�;���P��(e���ZE�a4VP�R?��y���;1���/)d��R�&L��.�������K�?��$��ja&����k����L�	qy��]������&TRK~<����\[�X�
<��x��0�0�~�BxY�!+��G���<Ks>���x��n������.����r�������������SK�x�<x�=����a�����_���Y��@�B%���w`Qfm~��FT�FA������s�5w��c����PAQi�n��a����uy9��|�'����\��ZBV���m��ix��H
��ZX�gV��x��f#�y��QM�c2)���33�(���nR<h�
����O��;h�QF��h:)!�����'H�����W��3���]H������A-�"s�p��&�����n{�����6!�,:��������e�ks� ��FL=��K����=��|������\�����<��!��Y�:��|-RQQ������{�������E3�����7\p��=,_0��l���b`��M�:v���������tJ��6R;�,�*���M��,������z���w�*	��g��c/�!�����r�n������=��#�R(����,�M���9��8�����G��0Sd�`��, )x��4�'�4i 8&z:�
�$��n�-�'�yH��Pi��u���x�'L� ��9@�j};C�<�m&�+n�F����	(�����nt,Q�'/A�^�o�*��
����ZrD�i�G���d����I�;��#w��BV���a`wR=�#0�I�D��i�����Mj'
�A�%�N�S}����o�;gY~&GqU<`j%{h��oM�h}C��
�x����(���t�>[T�����-63��i��XoB��l������I4��S`n�o������V�n��{�����
��:H#�Z����
�/����H���<�'Y-Eu9D�$#��:T6w�@�@Z|O��J��&�4x%�������EX�w�vG����;�����|V���m�3���G���nEr�_M�����8����F~���q��4Z@���r���bE,H�X�d�S�� �|3����<0$����W��;si�+��V��E`k����~%�5x�F}��������������*��
{v��������s5�|�]�F���<�4����1p$w
����V*x��F�5p��jdy�i�N!����gM�I�@������o=�dw����V�<>bi2�\��C���,���	X��=�s���{'��P�jc&��?r���sb
��F��y�9�AR{,~V�@��T$��@�--0���`hN����Y2�r����S�D
M2U|Ht9-r��[�	<�����E��v:&�r����&5��@t,k��O}0�a���(�$���;��������d��RI5 �2m\��y�%2��d`�,0����N������fu)��)���TB������_(I��d�:1�]2��s<X9j��5�r���V.s���K��2hr���h��8Y����m�t���	r��g�����[e�"0���J���r�*�ArjJ�V �N�3���������]*��(B�����
j/��'5��6�;D��������F."�����8�0�N�B��q{.@�G�L�@�fE(WfcR�8B� Aq�?SXbA�6�����))>�;�V�E�L���I��F�C�
M���c�mR'�T��	�nA����,]��'\!�����9�N�Nn�(��&�h�Nef�<P������'��&��7 IDAT�"O�R���iU#��\}8�X�<����G)1�]�������c]��X�����%{��:PL���s`���ERuP!����d��K�)Fv��	*��pO�pi�YlS�����������D���C��e�����A������!A��K�6�
q��X`��]9���������k�.}5J��*����}#~����1����c��]��q�6U���-�O�P�-?Y��)���|��x�g?bh�����m'�����AL�K��"�`t�UkG�\����W0`����p}�O������\#$��CEz2%�v���*�^�w��}	< ������N�����2�U
h�(}{����x��Oy� ����;����(�-c�0{�O� ��c�I�4��yj��2��� ��H�C�ESi�n0�E8D�mS�|�]9����4V�@.�~#�Q]Yk	0'����4��V~��=@�D����,�2P�vrs5�@����0�T�����OP�'m*�J�����?4�<O*s�����(s�P��U"�[,0� ����8t�TX�W^$�����)�����P3��l�4�S�����z@�� [��n(�����k�q���P�D�tN!;x`�]���$����p���L��M���{�3�Y�K�����H�1;��l%U<H�M�k���@\"�tiF�GM�|�]"�\����s7� k�*��

�7��{�=���LR�7���j*�H��L!��$���P�r;����-I����Y��P:���`�;��A
�Pb�Q����-��'�\��
'�O��
�O���������0�)05�g�b9S706���-����������9�B��s�Es(�OR
zfdU<`��u}-����5�i�5���xz�g�W�|�� 7	��Ar!cJ����6Fv����n���cT�:Sn�%9f����D��-(	�

��3��rS<��h?>��ev�ui0oI�@|�
����W�B;D��k}:�N
,0���
Qq�\��6I����a$��F�(ah��-p��*nss��i��8J���{�����67��o�k��!W�z������$%!~)(N������&�V�?k����7���x�0�@�?�ED�����{y]z��qZ)S���&�?��y���e9�C�6F����w�(�� ::TCc��@��EO��O���'u���qhU�����XBf���i,Wk�o\� 5>�v����<`�y~O�$�N����"�w�o��1��A������N�5��g�b��8������PyB;���r�M�
W��
t�`�(\������6������C�%CV���o#'R�JI#e�DRH$"��;(j�d��O���*&l�����<]u�/?}�^�2���l���
��`��
��I%�@���v}	<!7W%V����Mmqk��<o���=>��!����I�Fa�;"����kpyOc)nF�L��0��ze(�L 8�J��$
��6+����=��U4X������bC�����A4��rw�4N��������X�
����f��kOn��o��s�
�zep@�����A9r�2��h����������O��x�<`p�1}��
u�G���`A���1�/�j��p;&��}��R�=���`�v�+�)�����Q��k��!'� �U0R\��y�rrA���	|�O�5@��d�&��)7�#��S��A�9o(�-����4�����Ny�T�(���A��Z&x���<|���Q4gS�^���<t�-Z"������"BKZ_�/���-<�-���"�s�N��������K�uA:�s�7#��n��u���Lc�����z"}���`N�j��Q��d~E�u����L�����Z��&��v����_���6��xs�6��?���nz__���E:��~�;6C<�r�'��J�,�Z�t�MrR<H!�,���]2�fZ��Xsos���r���'��{�����.�����X��+$V������%l����z��l����AJD�5��;a5~|Fd�w����A�qA��H��&H��@&x�A�N�hN�L����_#�l�^B����M��q�����-	x`D�2#��.R���	����'tt�i�*��)<�\��;�7������*�����B[G�x����^���>���5���I]<�SL�c��L����)���������4%��\|�����=5��W��V������XN<?����4�8�Fn4��
*������R���'X���i�]���o
n�����j9�3�����<)�(M� ����=��{0���a�4��V$74*��2��9�
�������*�N��"�I��rsfwI�����]S��6�7�zH��
:�AL6��p�"i1;x��TN�
�J���K.Ur�U�%{~��U
����?;��r��BV���C9R�(�1{Obm��Xu�.�wQ����M��ATqBv���E)�i���m��u�x���-;���)_#�{|7J�r���CA���Uj`�����:��K� � F^��(�U&�E�N�c�~A��y��x�$q�)��BN�A�A�Wh��]2h7QF�=[������Ej{�������}Y��&��4N[q����1�A#s��s��=t*_�V�"A���b��3f\�P������-G���
-�*���YhDJ�"���V�#��L����hH�-�^���X�Z�@���c�@8����U[r ��c$��c�="�=�b#P��
�S��t�"��0�f��M�3t�����
��xN���-"~��<�����������������n�6'�O�x��MR�j*(K��.�I����z�z���>�����n:y\���<H�$G���
:u-
~���)��`ea�����qC�������87��������J�"&�$�^5�����P�[\���h+V'yZfj�M�������$���jA�tY��� 0w��@-� O��t�'ce��GH+�_=�\U��k������_�
EQ������#xP�|�c���
S���T��9�9�:-�����b��dX��fu�P��2u(�f���Z�:q�?:���z�������]���:�NY]-4���tO����yp��XICv�@����K
����>������A*��s���}BA���Bn��Q_I��x i>?2~^�~d=���x ���H����_VW��"�5��$?��l��<P2��r
Z���.7��g�E�2s�M+I����$i�����q�J''�@�<r��xP�|ss�P�<��;W���t����6�����)?�������UBN����f��q]�N�+3���
�oqM#	xP\�P�ze
�GNi��UFa��	<(L~Y��H�������Bz���d<�#�Fc�:���4��H�s�Xw���=LI�Ar�W+�c
�HZ� A������)'| ���p�m��[)���:�,Bo'pW	B������ ����4����)w��S*���9���-�`m���EB���H�O�V��rO!������K$��E�$�T'�~��3��*L�����Z�Hf��bKc#���9r��I�V<�pM���Y�[��@:}+���cq�E��m�z0!�J���6� I����xP(�8�Hn:<��fx����
<PS'�fSw�[�E�%���x Mk���@�}#���i^9��9��V��b����ck!�&X���,����3�)��Z�	������i}��-���gq���
<(��!n��@\K�x�O�Aq���������x �~�c���������.���L$����B~�^*|���6���H��y�(�?��Bi�����w��x�%����_����\d�/�i��c��G�_��S#<�J��#�����[���\!x ;�\�����Hnw<��fx ��~�x�+�R��(���a��@�6�+G<���J��- �DR����r����������~����j����������SU���lqk����m(+����%%%((H.\���x�4x)��R�G�^"S�O{� ����$$$@]]�@�H��O���*P���^���Jt����P�+q_M��$�799�����r�q�s�����m��B�������g���W3����9]������]|]�������*^��J��u��T-���WF��?�pEP���=*;���e��`Y�����'h�,�"JuT�i��[�?���a�"��n�Z����xD��_N���ZzF�1����?��EHB���Q����k��}]�*l���7�*��t�e/��O����.P��&*�Q�$<~~�X��U����Jh`T��J{<����xK�.�[�gE��'���������euBq����C���"���
$����U��~r����sF����OZi����r�c#��}f>e��!Q����eX��PM�Ep�Z���Tz8��������|33�C�v�,UE��yG����O�'��t�����2��_��055����/��aOyqqq044�e� �������X�V���C�#--
!!!03+��di^��K���XO�i��3�����tk�57Y�?d�?da<��.�?����<_Y������!+�!�G$��2��Ei]������0>����:�,����aQ_%��/+�a|(Y�ulY�0���!�!+�v]������~�	������w�������������g���i	Y�?d�?���4����%+�!,,�Z�f�����4����%�!+�a�^��Y�9�CiZ��y	�QxJ+Y��ui]��G�#��r�B�C�����EV�C�#x ��Z:���x�X�g�l�N/	��1x�x�*e�~�V���pyq]-0e����b�^&=���
*_^�#i����"+��d��t��b�d�K�U��g�,������������.�kP�����dy'%e�cPQQ�,��bK�Y +����)u+da<�l!�������ST����L�d������#�_�E�B�lU���m�0�R?&��?����"��OZ�q�'n<a|(���>���G��$�?�����PT�����0>d�WT�!��Q����2a=�3�CP<(��$��?���x��;\V�LfI�X�����![|���D�C d��5%+�!+'v��(^��,�G�Ee���������������������������a���de�J�kJV�#�r�J��x�]SB�����G~����kZ��/`<���$+/ba������5�BH��@U�-\~����r��i�������naaY�Ww��������S�J��x]V�#?{!SZ�������G�����-�|���t�(�\d�?de<"��J���N>�0>��\��EV�#?{�.���"�|�/, �?���������5��������������������u%+�!�xP��
Y
������BH���P�-\~B�~�N-��m���'�!�w
H;����,��@�Ww�������:R���
�|��<��U���"TC���"�C+���?k�a����(VZ�vp�]G���%�����B��\�\�����R�Q}������a����=BA6�C+��1��Z�m_��E�`@��/��
��x�B�g�/����
+��C�����z���bSiUD��
"m��VvE�O9���xQ�eH#��6�qQCYY���M�<=��,��q9Se�J����?��"/��
MD+�r�)`���D��c��5��}d��SuK��mS,��h�R��K�n��E!����U�2Ihh��vQ��Jy���z��2�**X��X��~M$��wIZ�
���XU���j����h��^�Z~E����.6�M)�����GE����Y�S��1E����v(X��j���y%�����p)x�)��
i�3
Z�E�}���\3��
�~�hk
�a=���?���K�Le�x��{V�����l+K9������N_��-����=<���� �
�A�6*h<(���M'����o;<��FB��`<(X/
������{�	�AA�������m(�������, �?������@�������No
�������<(�����X����o������ZN�c9@����o#!�`Y����@
v��ANv���^M�O'�R��=��M����q�	��p�,��K9x�����t����O]B�*P��B��������������T��n�����,3��o���?33�~����\���
�

��k^�5��B]M
�		�<j���$������x���Z���3x���,���]{���m�2�����&-�����r5�(mbB��.����;���4^F�.�q���u���&�w]�#�F��>{Y�j�ElL(^<�$V���$m��LK
������h�*���{������@�r+D����OE��M0��A��J�6����C�%J'ndi��:u��Kg�i��X�B�jH��]-�9����S��<��n��bV���v���%81oLf��F������P���{Bi����Gd\��T����}w�H�|i�Zh�v�_[��}������.q*��c���'�����D�3�������u;�25����&��=��ue mW������j���	����|��������Th�*@[MG�B%��)�,q�q|��w�
(
� ��)h�k����`4M��������>~�CzI�~Qdi�Z��PG�nVxt�M�U������J<X�k:&X�#�V���I��L�����������-:96���y�����h�z�&Q=
Y�������hT�<?|���
R�o�����c
qs�g4���S��:���Z�z�����������]�%������7D�J�.���f4m��woau��W���S������%�4����/����[WwJ��j5;(�����#22�]���z�����KW���s3�8�-U�*JX����3<j=�-�l�����6���r����%�z����&x���<��Z��qmY$�L����+
W��k��K,�����K����6Q���"n?���(��
�(*av�~���v��]�l$�Z(����h��.eK�38�?�������Z0�r���=R������;��3G���pu�q���(\-hMuD����C��x���
�x����I�h\���yb���X���PVR��5�0e�((����0�������������/�oQ��;�.������rX�e��������*����GO��~-���B��Y@
g?i��iX1�<�+x�����������;x�7�A~���6�����<0+Q�&�pP�MEI�����E���C)xD�RG�@A��`��w�[��[d<PVT��.=����84f�/�v,��7BV@�������������x��`�*�Qq�^�x��n�9�.����O���I�9�|b6��#S���;�a\�*���<�'8����p�6�g����`�������/
|IIE������+B�l�e�������k8����x�`iG�r�q�d��v����V#%-�����I<X��f9���;[���F�v*x��	*������]�Pf�eZ[����^<����y��I�a�}��&�
H<P�qD��`�V����!�������!%a���;���X��cf������^?F����m�h	k�mti��P�� �4���w)�
��j�
<(EpAS%<~��x �����+�{��{����/�f�?�j��k6��f8'�Y�S��8Q���c
5�t���w$��sj�,��&��U9C�6Nmr��*���
�n�7R�o IDAT���
(��B��N����JH���o%�G�i��n���Q�8@�F��-{����L�P���Y�
��L@�;��W�zU�������������S�����!����������x��
h��&�}��k��������J�������k���D��v���8pm�7���^�-_�v;��W(,Q��#.��]m�p�$�5%��?�@^����>��"�E�^]��3�V��W�j����t�a] �(��+k��'3~:�����wVN}��;��Jc'(�0�.����H�J�9���pG�)��������z����g�Z�����x`��,���B�������
������	+$�V��AM]�N�s��H��c����CYE�eANN�/-E����k����:��C (���q��Z��f*����o`db��� �>gM���[�j�������S��(eS�����02�E����C�2�t0Y��M'P�C�:v[��OO��[��<99y��0���xN�^ON�����BRb��?���
�)���e+�D\l~\8=��GTVtT ZuX@p��y>:�7�w����+("8�9���][t�,���H�������%a_�=/�=5e�hX
�]��aX��"��������3����^����V���`A��ONERj:������^�J�8�������]	�+eyj�Z��(oL)�����%����7OcJJ
��_(��H�g��!w�9t�
]�F�"��R05E]S����]�����3]�W#5�����<}�y	f#�#��s(Y#��f$���n��P2)��!�0���:�g�i$��C���\����uT�L���
5���ph�������Z�24���K�/3��Jq������v�}GEa���`j�z�8��
U4�H�L��9��04._���;�����(cb�U����[�k�vf�HKO��};aoVc���v����x�-v��U<`y/��Z�����'��J���MWh�
V��J]������cyh������^0O��3��	���W~���9�Z�!��1n�>�yB�f����	G�@�x���9,�
�W�D�*e��vU�/�1��P��:���]��y{N���5�tm��Aa�h]�����X;������������()�c��#�17��^mx>gx�:h^
*��������-Q��
��4��1����v�sN����Q���yto�L�U�3���V���L,�%�.��l!
���n:��x��-v_q���G�
<�V������������H��T���~�{�1�uk��z���]�G�Z��_����c9t�V��I�<I����+F��x �����A���`�8���{wy���*��]��}q)�">��}C(�����9�v����7*����f�Q04���T.�N��P�Q�	nozf��������e��?�����rk~��<�1�~'��x��c���(Y�!Ll�p{�Lh��������Z$��)?��kt�y:��r`!j��qt"���9�6�Fb�g��>��1����Iq���
�ek�S��8�*P��,��-|���{�������G����tR�=�=.F\�?��4�����E�?������������}�
�B����ix�i2�P_��+��$ �����C��5�l����t���!�N=���$�NV�Vr�yC�6���T��:UJj���&���p=��*�R�i��k(��.���K���A�(bP}S����+����%�����S�ae���K��[���u4&4���I�F:�_��c<��ZR���zp�i�Xf�O� ����g,J�����W��u��N�n�'m��{\�kk(��A���H�u�U��:(�rbj`��7���5�)}J@
���?�'�$%�)$��df5Z�`��["��G�����Xma�rR<� ����
='���B��������xK�B74�Y��Q��>3�i)����	'&=�������P�h(������:���b�)�w����S�i#8:sO����+����j�rhV�������-����V����YD��������
e�Kb���tj�
�wM��6<?���k�Q��
�6����v����o����;�w�	�{>�;�}�����j������l<�!"�lD�Z����3]���gS<`���}���ee��i���7�c�
���Zs�6�`��=��������7��CK�+v��8�.���������aeh�>��������������{���4~��zk���9�<�����q���:��|�=���y�J��T
�*�Ep�����Cy*P����C]K1i��=��4����h	�Z��V�c����8���u��r����#�}H�����C|t��vc�+�^wE��;�����H~��7��Z�����3�n����wq�5QwIgz����Y/|���w����a���	���O��'��������c�t�v����$�%������)c�j��CYS�[�������RV���w��?�����\���SD<���g���#�������O��x��j5��.��;��i���f�:8��I��2���1�����1�3�����_x�{��OpJ�b��[���#j����1��<w�����%��-��7��+V������!XJ�HE<zx�T��`��]	z�};���o��~����*�y�����a@P�NW$&� %%	��L�	��;t�N�y-Z+�o��<��cs>�>z`�KW��BdD *Tn�c�]/�i����7.�]����#0������m
��
�/�5u����}\��R�fT�����i��y�l�a5��~DJ�SabZ�����Ie(����w��o!��_����CW��
�������:7h��{���������s��{�bhi��H�fkAO�C�l���O`H��=[� 66���N�y+�����aQ�������8��V�z��n���H��a��(W�>����H��vs&'�g��]�Z�+W�������\w�>+u��sh��6g���sNS[q����f2�+1���ju��:��������:��-��{�IIr^���X��"������c��u]8����%��F�+w�@��|�LbC8t����"<O�����pu�g�[)!:(�i����
�y)h��c@c->�t{����1�+�3T���c������s���M�^�K-
���5m����:���g��(X+���"���Kd����hm�����G��`��u������v?�K>����������\�>�W��������(��k������?���i=������������} ��3w����>j:�b����w�xX�NM�O����i	,?{�o^�m���,�>���; ��]$?y���AEzh$��+��@p;��5(�j�R�x &�-|om�)�_-����������Pg�v��6�S=N�G���a`]
�.�@�k���Y�3�rhT/c]���1����&
���������/��M=T���5��9�#�_^�g;��H�|R
��_Tv=}�z�n������`��D�������Ue�Nk9��UDUC�s�FmKS����Y_�3��k@<h�H��xp9�
.!^|L<��=�T����Q�Q��Tt0�����	�IN�������1�b�s�P��2�������~Z��wG�v�y�o�\�����8~>����n����#���.$���b�����B?<��E9D���s$'�"���7�e\_5(�gw �s@���!O������!�����D�n������s���P,����4�C��gH����rH8�G�q5*"�C,��<��oe!o����1+io����m�>�C��H��L�(;x G��}i�J�����H���
���54�IO�1�]������	UUU��C�������b������=�\��Nm�b��S����
�&�u\�l�<w�:��� �x�\29u{w����?��}��H���[	`����c��?��!k��������TX<Q`�e�v`��A��������1�n�1���`%�hb���i��aS!�@^��I����u�s�
0�i�O/�J���i>���mcD�}�~�
<H��#z@�������-d��@�g"_�C�D�n_����^�055��r�!�T��O'����6������b^A�U�v���&�Ch��^���I�i4���a����&�eaH���g��6�o^Y���X���v�	�1�5C�����J8�sMF��f�-��&-�>9I��3���&�}8Tp���X#&:�o����
l��7���:|����"~��M���4�<<�&��E'�cbB`e��[����|�LPb��^4�w�Ix�\�u
}����&Vn�w�$�mfY&f�h���	5��0�Al����l�I�����M[�}X]��`�[�2s
�j[����\_�aiS<
�����0��:�/�x:�x�7#k����/a���f���������>y�i
*���4TD�9,��ZD��c-�:yv�������[�\�>���F����h��� ���P�� n�
<��.��K�m4*5A��u������W�����6#h�0(��q� ��:LG��������u$����t��.�V���q=�. �h`��NH��T�k1��'��j,�cJ����a�T�&m	5�ZT�-�P�/���;`:b+�6~�����Z,�0p�o�������j��<���k==��D��35��Gn�v�Kh�361�6[&����0�E�	-�b:� t�^h���}����"������?�C	�h�U� .x�C�m�����������������I���[�;]��C����0�������.Xt�b9x�m�z��icJ�����z6�����c��X��ul����J�}�s��'8@�?�7���E�l@#��4�h��]s�*N�[����a��~����#q��Q�0�_�25$@�+�_�����&�]���C�a���EP���7��1������84kF���2�F��RiT���AK	�`���`md����th����{����/���,<^����@���p���r�J^`�-h�
<���><��e@(Lt5a��������v��J��G>���V�����@���_����9���k��{s����8!'�@���������!�����]F�V����">������8��?��2�]�=��1)��������9l?�lMzw�jB����Q��3���y�?�vgj4�{����	C������ ������\Z��a~�6x�nk��0�������4	y��|\���[���0*U	�'V���I�����i�=�]��������P����\���S��i`
]^����F7�\�(i����u��d,���G����k�^@�+74��7��
���	&��{�Sp�?^G�"�6"��q7��G����H��[G��]���A8^��� �61�
���d:A��H�z�R��?����"-�3]^@������`�G��A�E��jb�g��8`��L�Y%���`�� tr2$x/
��>c4��x#�+��m2m��p��TG�����%	T���#�i��W�s�a��R`�tp4���#0�A��x�l���BI�*�3&��]�U��RY�FS�#�CR��N"���v���'W*�������H�8�%��{�����w�V�H�
�y�F���"�@�nuD�r"���|�L��m
��x`���5q}�s�kA�w�p�Y��C��N�}J������`����t-�����%Z����������h��Xu�
<`���~���[f�M�z8���\����"1%���a2������5N=���=�b��%��c�WQ�it]�cR��Xsu�-��������=�a��������M�b/�=����)���w�qp�2�O�j(g^��%������]�O�	�:���j���R]tsnA���{���G�/��Y6�_��S`B���vF����Z����F)#��CyY�����)�����/�����Y�`���X���_�S�c0�y,?]���zG�����g=���w�5����g�Z8��F�R q���XU�<P��G��F8�0�hC���8��o�}���G'S�k���T����d��OA��8�6����b���C��J*rxrE|`�U>;x�t����J@���R���K�
�Vu�mkn��e��0�U�K.�T��r�C��;���](��R*xs��3Z�}�ehY��OV]���f	]
�Y���\P7�B���|C�ad��rm�
��.�`P�z�&0�j���0����3����p�:�����b�H���8!7�`[�~�v�8��L��~�5p��s<�����c���(kl�2�F8����V����d�|�3C��1- ���s.�A�JUp����i����>�YZ�� �	�_�1�������BQ���4����,FU��x��������r�k����X���@��3q��C��3�N���������+;�7AD����-���JX�WgXZU�y	{jkj�g{l^3��i��P�L��0�.��I��a�?�Q�rc������7�O��h�`BC�8x���7'����)�la:�`M���z�l7�6����6��	�`�Y�������j�d.De��tCr-q� �Z��S��*!�`��p�����@�����]{�����y:��`����\<�/D�"!+x��o]7�o����YC��
����+���Y^��z�"��4��n\������4��V��
������W+�;�X��������F�`�����${�
�P��}������q���)������$�tR����h8Q����h��'�"�C*��P�Yn�bPc�6/���H4�����tx��CMr� n�<p�V�}	e�2*x�*	���a���0&�q%u��E��U�1<�R1����DC_S}ja��(�����c��Rt�t���&���m+��9�����l�%����5����4]W�Ek��[B�-r��s��#�o�k�8���XH�
����L� 2.�����!�ej���������4W��9i��)��8'�@k�@�m>E���P��6Oi��A'oCsJ/$�������s��u�`�'�(�t^\_G����>�ZF��r2�MA���q�p��S;��Z(�������kC��������i4�3GO��
44�
���uw3�
���;�������[{�Bk#�`��'���e=��t�4�C�������k0��"���pZ)L�Q��>���p�ZNj��x�5X�<�c>�/6Ii��mgY�|���yu\	tC}Xj�����0���|����}Z7�X�7n�;�^���x\��A�\�L�����P�|}h������S<`���xLndK�o�	�xO�nA��ug/"}���b\�3-�:g��x ���?�9�>T��#�nt��A���$�g|�v����@�I7>BkrU�,���)|IL�zw[����B��P(W3F���H�����*R��_?fyg�*�A��N_�r��Hv���x��DL�`����w��������� �H"{�R�y��:h�S�>t��"(�4WC`����t��fU�jR�o�c����.Y������g*(��C'�_��\)�{<�:D�bB��00a���5���{BKC�+2\��5z�0�!��y�l�bS�?t�����������x�Dg��#hWo��GRtHf���_�oq�
R����
:��U5;x����J�������+]���F~���+�Z��a=�"�c�v�'-�|]�(x�,�6�+:��	�Uxy����D~D�;����=��������L�����` IDAT:M���:�<41<�V��c�j���&�����|����a4i��������{�6���M8�w8M��3�:����UHM��+%0��a���@2�����"���Jy
��y����j�z��r���GeZ��x�J����hf,��}�OM��*mSf�xZ��JXZ9"�N�j�$���ic}��n}��	�QH���4C^�S!�[�4��b����%bT�r�{�	W#b�@�G��R��&p����0��c��1��2h�A�)�"Q��Z,�������g�N<Y:�p�8 ��|]�,�����
��H)A�����R������������n������"x���b����o;	�'2N��\-���k�9����V�n��?{��A�bc$���&C�MA��cv#���`�i\�IG���)��UFr�+�r ����G`:t#�
Q--N�
<`i[V���N�q�N_w�=t�
�`l$(a��u�E��G�nt�o?�N�jA��l4���E�:�Q�T���1���C�mD2�F�4��|[W�����p��Gn�s��7�
mBo�L�&��n��?����Fj,�\-�����)����2E�r%�P��&o>�y�:��%�2��\��k��rA/�������Nj	,��x=Mu��|�=���3����-H�	��\�6p��9WQ`��(
� �=��J�o�i6M��Y;�$��Q����_}�*i� X�n��QY��D������H~l���1��I���Jva�S���Q{�Av�Bmo!>{��k�al���n�	,�V�2�}���u�D�<����O�8p�/�3�@W]��>�RAxD	H'��x����<�yM�/>ONq�o�c�C�>����o�]
[���S
6"W�����:�;5z<`���'�@���qj��g��gz�<L���q���^0�N%�{���2B�]�z��������� _���x�N��=�oB��s���$
\��o��{vc��k@������A�����u�f��P*)	��I�JrU<�L,���U���D��~�Np�����p`���
���+x�����}f�}�l^����<�����Hq��NV�X���w�6Qt�Q��<`JI����1*����[��A�O$������PkVE���x��64�
��D`AU+�L�	C���?����������k�����"��������:�[�$�=K�k�=�Q�B�H-A��"�[RP��O��$�A��K�����4A��sP��ER7�������z|�M��Cg��/�����B:�V�X��� ���)	V��yA�}T���4����_���-��K�x�6$k��y%=���K�3�'��mKG}�^���[�������x�tZ������ N�
<`i[�&~g����}�]�t����LP�<��uff��*���&���Q+�m�$����e�|�5��C'�k����+�c��E�c��26����qz�Z��}B�-�sE�kS���{(������������Z��r���v���������l���Jx� ��GVPi<8�z>�~����g!������p� ���A#v�m�1EQ���cn�S|��%��f��`
���K�;����m[��,����6������R�'�6��o�S��hW��6l4q����`���@���D��K�x���C���3'��TaA.�����,���$�}9��"W<�=�=�5�8��$�X%���_��jS�O^ ��.49��]n���*���mxm����(T��
7����&r�C���J	�����\������8�:�	���:�D���!�$O�pw�q4#h�b���u���=,���5����;��k���H����6/;!L<H#7��Ak��?�*[����)�?��_D8Vu���Gd�G��������K��w"W�����#h����H�����14�+K�����k���<`����DIr�t��F�sfJ��%����C:�p/�lC���>}x���>p�N���8�����Z�M�g��9a;�,�����c����`�=['sH���:2���	W>~+w9 �����R��r�A�6�� �n}��2Xm���*����q��J��HcE�s�S����M{�*�<����e��~�2�}Dm���6��Q���_ ����	<�4(OjUV�p���o�+)x�`��mF��W�H�����������?�������FI�JdglZ3��:���"�\-l\5����w�J�]Eh��L��62���������G��\-|x����aQE��T3�'������1h@P�(��&#* 
�
2��-�D�)����w7D��x]���x@C>�rT�J���MP
ft���c�Q�R�N�+����uc[s%������!��R4�Y(��\��S��������0�is	G��Iq�'��BpnF�
<`���#����e&�����!%=/n���P��"�>�g�Y����b�����"W*4��6r:����}�x��z���h~�����H!���P����H���������#��1��e��)(����
<�����!D���������U?�QW�l���_��6�����Go���fI��5>�2���>t?���wb���t0?������A�xDk",����_�j`�*��i�a��G���,���<8C��IRZ�A"=W�zn�b��������_N�8��&�T�����%j�L�y����_�r���,H5��TU�_����~�.��8�����|�j�9�-����,x|y�7�S������@�]��c����S�@�x i����J�7�@��@$^���L�1�\:s0�� �H�
�@H$�D�4��9{,��s�Y?����F{�)+ n�_IEA����z��6�Z3L�ri��*����d��R'P%iBs:)P��2�t�$V��5i���[.n_�R&h��6v��aV��e�M��s���k�����jB� r���;�'�p��!��+7���i���wb���P�&��5���w`inB�\0y�o\�/��7�<�	��Irm	q��,�x�o^�?�bIVf9���lX�	<0�����@�d������3��${�B����a���
�Z���k����p��`GS� m���<������_��}`;�	QOCr��&OA�-m�H�p ��m�o#���t�w������<`�ls�=�_�\�����m�_>�0W� <��7ix��q:S��)8���6����OQ���@��*4j6������&-�H�����JAjj"�)m��k��Sa�P<p��Mr44��BC�����vT��)�,c�������;T�=��1�AyrrW�PTT�r��k�}���}�_�xP�������x�`�O��iXL���+�3��N�����
�^����9M���S< `�[%k'!���d��<��F��S8`��=u:5�������.���e��Kf�-���c�XV$��&L��G����m<��0N���q��~����S���o�#���5����3�����)$p��z}�E�
��!��(Iy}��
�)�/���$e,e��TGU�J���'v��{���p+<����)0��~��>�H��,dU<���-�\:��&������F��i1�,���W�u���M�{I\����w���E7o�5�+L����l��8�t&�{��� �������S^���S����c������r����oqWK_D(�����e1�������W+�p7It��t��x�fTo�}�,�=��
	LA�f������Z\�`����Hj#0�x�&^}��?F��_�0�E]l�p3��R+x��sH�a����}��(S<����J�<`6`P��m�x������t:��\`����Y�e��q�Ow��X a��bw����������^s���[l��F�Q	�����pA����E��}�9S��9s�����.��E�����c��	�H� �5����+ba�s�p��6UM���>��3��,�``�,��3��1�65�?y�a�b�iW�s^���)'�
���elV���k�=|'.�Jn�r���F�#������]�Y�.�������[��Y��ps������\����=h�r$�][������yL����Z:������
��e0HN�P��A��'��R&��n�Lp���s`���~Y���"���5
*���=��yRi��"�b���98���>��*t�Z���?>��{��i2�����A����xp�B�$�U�MH�;k��(K��k��)xqj)L����q���w�<H��=;��.�#�Cr��4����A3�<O�e��9W��qa�S!��&���aSE��������>i!��B�����g�
X{�#�A^� �kd�A�dr0��1���OCC,;�5�6K�8��>��G�u@D�x��(� ��mh�m�hg(V�H
�<P43A()���S;`�h����Um��"~�x@���]����e�����������L-!��-���A4[��W�a���uQ�RA�A%;=�����O	t�1�'?��	kh��)��D�����E��5���*(����*�|ui.�����������y&`!{������GS���q���1Y'{�R<h?w�%�*-L�s;��6�s�d�&��U��!��� ��K/�q����n��`L*	����R&��=z��i�x0x�L����e]�&��[���G0��/���xp�1A��xp��zQ�L-���\2,����E��'��}3����{\�
z�[�T���xF������L��`�x��q�u<r$�SY����O�BJQ�I���9���VW�����pjM(zM5��l�����t�Ma��h���s1${K��y�e8� I��j�
)��m�����B��h�^R��m�37	hK�x�=�����S�{�)�-�u��ZC'���y^�u���f"�G��������(0���`�X~g<a;�-�*w�BZBV9� Gz�x��Ca��{�?v���xF�J����Cs�W!�9��v��/(Ra����}�}�U<�r�����Lr}��,l]�T�bj	?7l���t1���x�6�SR����G��mvl��a������0�9���X�:a�/k���*0���������&s��i��?�zr�]�����<-:P������]�d�x9
47I���=��\6������D�@I���A���^�x���1���w��K�R��S<����>����]��w�p���2w�Ur�L"w=���TUsZ'�HJ
GH�`,�Y�h�,El[7�\+�k�qL��K}�]�6�J�
�HU�h��6�GL�L����S���;;0��m�ek>�� ��vl����,2y�R�x�3���K�|m9�B���j�)Z0��}"O�A������7/I����-<H��6< 
��qs]4�����m�&`�:��S�C�A<�.}��6������AS))0� 5-�+L�����#s���z����������������
.{$����|���x&%�cZ����>�HY�����ph"&��_I�f�l@�����C-RU'�r�0��P�zx}I� /x�\-05����V<�F0��]%T<�?"K� "��H��\�1bI�oCmR_$_vG��h��`���HOI� �y����v�F���]#�H�u;��#�6�| %?��S����*v�]-����s����}����I�`6�j���Dr]O
�Rz��E"};\��Z�8����1��h��S3XO����`���x��0���8�X_�B��I���'E "9�m�\*l�9Inlq���T��:��/�:2U�9q���cH��_��
�O��3��������`��<��"^_��;���+C��)$��5��M��1���e��!���F�P
�����=K�QP[� ��$�1*]�"n���
�VjM0��`r�����o'w������!8>��w�q��b���� ��<�����!�[2���.������9x�b����m���#�b������g*6���T(�rXC'����A�N�I�� �`��c\%����<#���p$�D�f����K~I���o�RP�'�i����E�����������M<_�B��(��Y�(�@U�uZ��k,�	��~��
��7C����@������s�-<H}���/�O��u!_�$_U���-�`�-������Z|dA�o_������B��>�����
�!_��<`':t[@��H�I���s�N���m�5�)��.�H�o�\JYr�����
~?�����5���W(x�M5��2�@QQ�>d���������F�>�/���NA���xZlx��=��9��Z8D'Y;���Nd��b�Sg��
S���+*��������Gh�i4�H!�G�+��������[J��
���|���t�����Xy����
�������i1���1�N��b�>���������ed��^���������������`��b���~R��	�����+{J�
n��4I}`Z�:�rKo�bp�m0��b����J<p ���t"mz2����[�JxG~�dx�N5*R����k�z�6m�0���~�����\
a) ��(�E�����K��K.~oa�����NN�yG�B������(Xer������K����u��P���$2�q~��"��*dR�`4j3RB�H�����w� 3��&�I$�*�h����u���}\���Y����0�G������tYE��P�"?��o����'U��������Gqw1nG��8����n�P��s����h�A�$�:���#E�l���]c���w�w��C�N�:Z�da���$���FXI�V�0t���+v�\lRj*�$�M��n�������w����!���.�������
4�[>�/T�g_|R
�����h�
�%�~mm��[��Ns�`���H�
m��9o>����� ��K��N��.OP���7�L�Iy��k����d+��1�9x�hC�c��<�=D�3U�����opl�VxO���d��:���6��������En���v�����!f`���p��~,/��?{�q���q5(D�?�_G��P�2=[�������~�N�4�iU�����20�,=s���~^��+G���_���*�^������w��^�L`�-}�g�?_#��Ca�A��U1��
/�_Ww����l�@��}��/���Gr'E�*}I���_�<������	������7��H�_�ZU��AQ���f����� �@�������q>���_95�:��j[wG5����{7�����]7.,�1:����N�D��J��]w��%X��X��
������ k���'9x��F>6��M�����>dw�`hR��������0-���V�.�
O�x#�
D\;�-�9���/
<�#w-O�����!��3�����O��n"m02�[�����
j;�������C�N&�������u���	R��d��@w�P����O��HE���������)�R�v�A��"�Q0�:1�
TiN��m�=�Z�Z���)m����Yh5s-��B�$��9���B�	�y^,�+��iZ�t���Z���}���W�m�\`���x�N�=�g��;L��JuI���,����fDP��K� �+;�v�~:��IR�Qn]/�����&��`~R�����|x��"�����"$!��L�8��f�,9����;�7�J�mX�H
�O~k_���E��L,>���U��'$�J�����wA���$! IDAT�%?����6���
���;�b\\I���h����NK���#���yh|�����nA�_�������`L��A!��N>�	V�z�����4�4(W@�����I��	T�� �\.�����{��BG�08���$R�Qk�q\��KV��
�+�����t�x���?��,}�?�BM��#���`��[�	���z�C�:Aj:�85�	�w&��nf�x�Z(��l��s=���.�
S<`���B�oe�xL$���dm�����-�j7�w�<�C����#+����rK������S��������*����\!a������'(�h�����9�o,#wuH��}�����IM�,WE��x�����;tP��Y��o�^�{@�j ��y�V��
w������i��v�����9�G}�4�������Vc�c�dh���C.WX]'��r�1�Z�����[��l�
WrI����M��m�{_����T� rE�����l�����������S��>����#���i�3��<����/d�y�����W�\��5!:���A)I���9��Z`�N�t�F����l�q����<�:Q1$���!�s������������j�
�i����<��p�o?��G���NH!E"������4{�F��g4g���j��DR5'��4�t����������,<P�V�n�����&u���j�s�
�/�{�l�&$��4g����@���
���*\�B�>6���6�����9�e�C���������_��)1I�����^������&m+����V��#H����	���}���4��Y���I�������]q�2}e�;��CU�O�o��5�
�t'�r����}�������3��]����n]G��uCn�������W������,�����n�.�|x����]�6|��O.|���`��lC��a2��3��*��a}���Mj;7�J��}Q��_?8v`����1��)��8�o�3X!��%G����My�����1�L]�V����|r��5��9���{���
�-S3��k)-V���C{��*���}�l#�Q�^��Dg��*4���/�!7x���<������C��H
�N��gpD�SX=��Sj��1��-��������@��t��X]�=2����P����5+�v���&������������l��f�$qWH�����|C���V�q���l����fM�����)4_�ym/A���W����L$�e7�y�!�f�����::u��]TH3d�����4���-ri��'
r���b��[�$|�"�u��u{���b����+��4�#5�t��B�
���C���h��D.�d�WUj0���P�����,���@��O�*�V<`�lA���,W�����5���,��F�������,v\���	�����L��
g�84�T&H<�������9LvM�5\p�����+����^�i�Ji0�y&�:�}Z+|GJp�����89����z�P���F�m�,�o��=\Fa����[����y_�[���=�@�����Ar7^����)��H*�X~�0�	�%��Xv�z6��yr<��!����)����a��`�S7�?�kh��y)������C���������8:n����;��Px�@����z���[��-:�B��f����0_��F}�U>����n4�~�+�����3�����-Z�a4�/��<01��c��uI��G����8L��m���y��"X����Y�B<���k�@�cq�9k>+J�@�����H��{��F3ct�0��A��^!��f���h-f
�z�������G���~�&�]s�����j`��,,S4@�g_�DP�[�����8���U��������>�Fw�{y�+���#1�c'FV����C�\����k��9E�x�"5�5��z�����t�I�@�&���A*�^�����u���-��#� �a�P��A�����[#�qx.i����/}�a����kZ��K.����s�PP(R�@^��C� �Lr]�\%p�
��I	A�	�9x���PP�+���(9���UED��1V�%W�l��#�@�B���9Kp��o�T�N7%w�	��/�-M�����ey�Y=r�������-��������D�>T�wF��;����;;�A��H��9K�ue��hph8Vm��e�~���y�<&)`�Xkl[-��~0W<�V�"w����^������4�(�&�vdpAA�+{��}PQV���,���'��]�����������=�OsU������RSGH�<'���-A�@a(
<(�j�E�/<�e��E��q,Zzq~����/xPz��snW�c#��BAqs�Z'�lW�/}Y��NW�n'�!�\-��(��G���:�jAT��zQ�������{��n�]-H�6;�
��(�F �6(���������Gv������[����Z(n~e!]Q�AY�_�:�j�,�5/x ��H����OxP�e�F���Q�8y�jA��?B���J�����U����r� i~���<(I���%��,�-<(u+����{-N��7���6;���Wy��{:?�����be���B�2�H�6�z�Z�g�����q�c����e!�N��|Z^CQ���=|�:�-7/xP�z�4��H_x �r
���8����/iQ�����V�����*KxPZ�J3_Q��Y�4���j���A1�&$,P�, ���EI�<>�����2%�����&�	
VHt<���B.xPZA�:H<h`^	c:;��nR^�����/��x ^���Xx ����6��6*n<(���N'�����������C�A�AH-Q�+@���;�����#��J<����,�U��
x��-��g;Q��@����u<���x0@2��;,������L��u���o�!�
�<�H=|�
	�	(�����:xPzm�=�B����M�@�"i<(?D�O[��w"(�~�	���m,��m*��mT���Aqm#I:<��Z_������6b(������A�z�hW��W���@2�
��H�c��������7��^�A���<�,���5������|'xP��'���������Qqc�Aq-�u:<(��@���@��������x�(�xP��#��Mp�P��T�t����m((��	9�Y 7x���p?��^VF���b���(������s�����Lr>!#**
ZZZ����FUm�[W(V9�+����##10N��������d.��#���8())AAA�G�
����z{���BT�j���{���L*��y���222����Re��&�~��=
����� �4��������$�{���S?q��n�@NEI������?��'�(�!���4m�Bo)��P�{/�8A���]���e{������f��)*k3$D���VT=Jr��GT�Rah������d���f?�������SZ����J�q���[�K�^s�+�����S��E�s��d>�*���j��~�^'�q�R�~2~�����-�x�����h+��8C�d��/���fF"���W?,VEE$*��(����4��[��������$�(��P�U���|I�(VZI�#5��Ijb��-#��������V����s�Z����GA�Q���cx��A���� +��5?�U�GRz����!SQ�
�s�K{~X�z�Mg�!�Y��+I{��%�C�c��*���m�����f���[����:��eJ��R@-d�4 _�\��IQp� �������r����.���O022����/�bVJ	���[�l�K{|�q1M_`2�=�i����������,�2��<<��=bbbx��,�
�o�����V����0?dwZ^�����e>������#�"�0�V��=��Ui�,/�?a~X�=E�����O�J���[����%����Gy�����C��[����|���{>��Ai�R!�rg<��MZ^^��B���K�k�=_���Dyy>�C{Ui����U^�CXX.y_�f��=��ei����U����G��z���4s����f�����6�V�e>"����#��Oy��0K����<��0?���)�\�K{���kS�=���K�Oy��0K|���@����K�BB��9��������b�L^�,V����^f:{R!I{��v��Kyi&�����C���6)����cAyh&����G�Y������L~����FZcAyy>�w{H�gJ:?�V���Ghi[�����|��5*~���|����#�����2�=���������+�G�����'�������H����w���7�0?�R����G�����������4�sK��������e>���s��o��	�������YR ������$�i���|���Yi����U^��������}Z�9����Gyy>�C{����0_��HS����a�m(�����5K�Wyy�	����i�.�a~(�^Q����a��'����=��|������������G����!����B��C���o���"2�_�]���"��%���Q�C��J�g�<�����r���4s(/�!,,K�W�<����e>"��K�����0?��5K���%���r(/�a�.�!�|��|�Y��<��=���t�Mi�R^��<�GX�
�!��]�|��|�Y�{>xP��(��d���Axb
"�$�%	�2A]2��)H�����|qed��� 42���������,.d��g  <F�~����'G���<]���fJ���)0A�H�^����4�NUUU�n�8,
����AFY�rJ�M^t:z�cUZ`���Q:��<W]%M��)��0w{����Ed2������Yd���^���0�f&I=���U{���BUV�T����(��DeJ���O�bz=>>�_SS+;��Xy�b��y��v{D�� ���o�w{����qQ�)��244zzz_��9�D�?����*�K{�#4������=t�L ���e�����(P�����UA�GY��$u���P&H���X�����Dk!AV����*���������?Y(��K�|ie���������'i����)�=dU��!���R���9�PHF���������>KH�*0���G�U����2e�W��#�������T�i������G�$K��Y�U��u�L�����h������%�#�sp��zq���������$�IK�
��v&i�=QJ�5�RX;��N������d������znqm!�t�I�����V�U���IWIr�_�.h����8�����&1t�� �|H��HCfZb��*���t������T��K����eu���Kn�
�A����X����@n�`��[�x)���h��H�p`=8��%{��h�C�,�{���o�e�,���A1	���Y�T�q�4%��)���A�*N���\2�FHJ�D	W��7���Y��p��K�&V����n�n�+zY�4��8��lBYV��$�8�����_<�����_��je"��z��fR&�RZ�`(���K+�R�w�6��cqiW�d+:~�������;�!CH�2�
�5)>�'�:7�Z��vaMq���t���lx|��a)EmdD�#���{[@V=�'�w5x�[N�G��Y�k��q��|��V���Q#��V~a[�����W/i���������4*X�y�TO���V���
�{��Z����	mp8]�-�b��o���Zj����{�m�P���u���m��9g���'A��t��B�_��y��E�����0�d�5��!)5����@c�����}��B�:�Ro�]�|��
x��M��������M��[����&����*G�&��D�fe?�S5J��8��:�\��qEh4�8�����S�L�@�Y@J����,(�k)��	�A���@��#*�dYH��)x �I�������AQ5��,��A���xPv�FT��@��J����]��U����!�x��G%@����w�xP������.wJ<��E�"��,$\,PF, ���!����@�l��������H��n�k���G�R�`�2IJ����K���r��;7���W}�#&1���K�.;��'�����f����������
^}���:���(�=.�1
G�������c����q���u��/L��Nk%�KT\.?��~s$J'N��P<X5h~?�
G�����S�b��6xp�c=���Mns1�A�v�}�V<H
���P4����h��)��B���V��P�X�1���`�{����j�e<����+~�o�-w�1�Skqn�XqJ<�1e��_�6?�����%���}w�h����n��eG�������1��#�z���F�%�SHb$��9�?��,Q����	�>����i�
[������%�������^�$J��'�=.�r��}��.��CKE
�+[+���H����am��W��������#+8��w�D��'H<��������+��wR��c���I[�@m�N{Ac�b�]�49qduU���q��J�����:�����0����.���h���eo-��Q���*+�vU��T���x0�oS�;��~i����I���:j���!���!Q:i������u~H���(-��+�<���������-,4%;})M�cu
t���T$4�q�u��"��x����wB�c/�^p������Dwd&�C���D���,��3�P�?q��z�'}=�(�c|�����<c-S8��������m1������G��D����%�G,��>e\���|n���'�ox��/"]kI0��V���P���+��c��8x ��
�,�����\~8�`�~gtrj	#�'$b��k�n�l~��O���~mT�V���>z��X�Z������zLl��>
%�'���������<�[�g��
��J�L�^�����+PQQ�������"]���_KC��Z$�`��, ���o�A���d���	<7h��?���C�������oiQQ��J����]�0�U��X� 0�B���v�r�7�����}��������:����7'�)� ��(T��#54P�4��
��O!4nW�������hi�.?<x�����L�3����+��;�-����Z�2,���BA�x.�J
BH����FZ�AJzV����0����+�@NAm�,�����ni�nORQ�Tj�%����JN}H#�����m�x`TE&�Jxr-N�����jA������1��m������r���py�x����=;����a������U��A���Y�����Hy��:6xP���Gp� /�����a�����"/x��n(|! �E���
����I\z�O���4"�x0�L,6t���})�jS�"��=���Xb�������	�;���~b�@p���L����L�H2����9D}�q�����?�
��n�n=����Y<�

X�n'��99�"�(	x����M�8�p��1��I��	n��?���a�-��`���r��v�~L5�|��p�`���~�*���A�����	4ol�U�gI!���D�:�
����������7�O���+�������OS��]������,��=NGh��Y������>�����>���"���%Y�P���������E���k������2�vlH�Y��������=$~�{N�6o���rH:�1P�����k��<Y������Rl\�����i�S�l�;����i4BR�>As��>�<��O ���U����MYmM�k����E�W��p������U�G�����F
���1&>X}%-����D�M=��=���;���e������[���#�*h�|�^��S����nd�~��0�{ IDAT�����z����'����i�Q�EHMx�����{��^{�$Ee%5l;2��P�T���.��=4i��!N(J� ">+�<F5p+����d�Y�n�LG�6�z���"uV�����,�
z����7��]T��DdB2���J�rX{�)�ZLAM#mb��/����G"�3�k���	����*x�.������3��i��g�o�u�H$�����V�mH�`�����0��NF���RQ<�P���.Z����Ip�L���z��M����d�,
��Px�����}�A��d<�p��;��F@�'�q���z�����|�����RX3h
�\��
����q�	H&;�8��L1��@�+�b��s���=)��U�8���0p�)t�n	��oq��-Q���^��A������S
�����d"����ok;B^���{�'3��n�4Mq��4�������D��["4�=Z7������=�|���}Z�FP�?nz;�b[�#�t���A[��8}w5�^�7�+����ttn<�C^���:�KY�h�S�_����X_�{(t�4�'����9���?.�h@����5���%��}x(�u����\�)*�'����oanh�5�N���{��9�$^�T����2��	N��������2k,7�x������&GCGELS3OF�*��I���{\�O�10T7��g7z���R,u���:����H�B���U���R<H��D�����������Q�OA�VCh����c�y�FU��>�w���a4t.b_C�����>/���
�g!%�=���@&���n�jVMzb���U2l��3zr#W<�ytJ��P�k�*'3-�T,��v>����L�����!������ K�p�'��]Zb����8���t��HK;�(�b��K�����"m,��Y��}:�����]��hU�o��c����WW���8�����1zf�4n����N�v��q��UT���q;��m�����[kV��q���C���.������EC��o�(�5R����
s��}�<���%gK�r����BMK��{n�T�S��2�.��"2�w��~xEq�qz��&'����@UC�x����0�V-����[O��"�zg�1��aa��[gI��S<`����1D��A_Y�j�S3&U��� !-	�B��w�/��`J�����m�m1��jXj��}|) t@�j�������|��]�'$�'sP���jFho��+��y��G�W�P������4���!������5:�n�q������1M���������X6��`���T��i��6�e'*�!*!��~�>�����!��i5
+ah��xE
{^�V�>V�R�=�j�p�S`���D����6����3���V��D���g�p����iMmU
�x�����"&���57���/��J]cs�����=����S#wF5]��y����{��#�&��4�����{�w����U���
Zc���4W2��W�<Bs�tT7�������u�>��v��f4��$�sE.<�����{��FvS���f`jAq)�l����t�yM�O������2����i.��\c��FM}��J�#�������J�x�I�C��m������.t��B��H��z�6�HJD�����h��	
���m��q����
u��4N�h�"."Ww�S3��6xv�0=���h�2�wn�Y���w0�s�������n�����x�#]K�o�LXU�G�J�8t&z����Y	o� !��O�Dw'%Z��/&�w%D�f����� .!=�)A]�"�
U<�,�"�� ��Q	�?�L�@VW
�w� C�%�
���c�{B�WqP�gJ�G��;h�n��w�3�D��gH�
�J���7�k��� WQ�]���&��Ez`W<H8���!f�-(�5�R�*���2"��3�P����C���.���t\?��3
���O����"��+S�����(D���EOMx���wL:�2@��T�����|�KA����7��{WE����&�5�8��v<BS������h��No
G�:���H��s�pL���������p�h4�R��R�2�@�%Q<`����BCE���8x{	f���?�`���5�}�����?�}Xx������QWB������������5�����[���.?��a�hU�jJ
8����v���a�f�������?�;Z��D�?����y�������(�z��+�>��c���H��nPP�)P�����jAEGq!����+05
ce�p�59X�1���� �C"����"���|�X}� ��+�-�������SBN�w����W�>��|>���
��DTr<��&���u��O����D�g�&b��0�e�jb��	]�����X��b����Lm����6:
��=����w�_w\�T�:T�N��$��l�����,���c������t(���j������:�h�	n7���
�>C!Cs���Rm������m���	2h^��o8d �=}�h oVm� ����=��E�s���S<���F����5�O"=2��4�R9��_��W�������U�9�&������8J��YI� t��g�����"k�<hP�C�Z�����>a�"������E�c�84��h��8�=W���i���3g(+����5��t]A��X����^��������'L��q�m+>��~�x�k��tn:�����5; *>��E;/�C6x��n�����
z�O�gZ[0��F*�������|<�(�)����0�V<���7\�8��� ��Q,��(�`����e�w�������m������]�d��5w�[>���\� )-��&�w%Z��)�d4�w���|��1�ZY��(���b���Y�[���1��1�`4��B�z��'�@F��=t�t�.�i�O����.�OCs�/H��%��pb�n�n3/x������}��8j�_\��i=t���������1)	X�l>�G@��X������j7�����e���W��L;4�6��k+�B#a�l2�_rH����� yRiU�X~��#�S(l�31��6N<����A��R_����J[���:z�R���,�c*m�#��yd�$#��y%��P��5W+,�U<�����!+h�R����#"���~<��~
��74�OV���a��#T��D/��p�������D�<�H�5�[��+
�����f�k+<5���!�>�\����cp���
��������)*����%����Y�G��C	l����5��X��_hij��P��6����b�.��4w�?��W~H��'�&�����A]M
hA�A����z��5XT1�Q?s��)($g.�b��Y}��b���8z06�<�'��	��7�����$m'��?��(��iE]Xkc��8T1�U��|*<8t$	];+"22�2�����!/x���!���a��W�f�O"[BD���G��������<haa�J��x��o�^�~'�F��]���%�?�b��2h�]��T�o�)2���>����;O89�����P�n�}A�A��y���B>���-<}U������h,����@��9Rhc���"�]x��^�~n�	�C���[���v<����
Rx0�������O>��6���u+���M?d5���>�'�����!4�#�������O���?-�Lv������ln�G��*�dk2�<>����?�����(��.��a��n�	D=S����z��X4Nz���07���>m�_z�?;6������K).������������1������0��5l��oB��?���D�mx����q�8�����F�z�����u !*�jPO�S�Z8���m����7L�5�����*�8C��u-e<|��#��zo8�:���8��Es+��x�4���/�w�1��bj��o��yz3:
�*���,t�n�uW�r��D�[]O�f�/�w���@�?�q���G7���E��O�6�
K#34�D�����#�a�������*<HL�����1��2�x{VU���w������qa
Fv\�����������;�	(���c����+���{���4<����5����`_�?nz@�a���W�}����[h�2
�lG�@�v���V�M�;-����"b?�U���Ne�"wlqJT(
<�RQ��a�����T�!\�����0d�2���8��l���l]�lm��O�c��Q�v(�b��������1�}O��rfz���9�n��8�/��6�����9� I(<�O�����1��2<�x�p�k��gu�zXqs
��\����p�M*9�����UgT����$��b��q���l���&n(
<;��Uj���jH�C��J�D�m#���(�@�a[���F`���;�z�����&il�=�F�����>"���A��S���w��_��I5D�������Y0�3	1tR�}�k���7�
�����0�
	���I�EZ����A����6�+�Vb�`���������F�F*X���4� ��E��s�
V��Hc�?-�a��sX��>E��$�S�����
��������h�nE�vV_���=����o��9&��^30l��\n`d3[����]���
�������N�\�)\	����^�2|�Y���:F�aG����?P��Bh�L���'����<���#�V>�x��H@J��hW��`�=��O^���f)<P�`�U��J5p|���$�{+<^a�A,�;�<vb��8���A��_�B+#k��1'E�uX�p"|c?�m\���a��1�&h@MA������G8C�	8�n5?=@W��X����x�Ic����(���gi��)��F�,�JxI��<��'_�j�7�<��FC�%�`M�I4���m���j.Q��g
s=,������������X~=�62l	��Nnjs�as�iXt���_�`��](��"� ����DX|�?�L��l#�Q�Z����
PI������H���>S��3Al�<8�}hC���&:�j�f���J^�8����d*#����t����
+�O�+��H���l�,��^�����,�2���l�L��������8L;�������d0��wICA�ALr������	���cUlt�?��c)��\o��6*	�,tI�����@]Q�<X��a	����g�mUE�jd��u9&�E�7��4E����6��Em���
�-DJ`�>�Z#�\j(��c��k j4��W4��6>4z?��E�8�goV���Y
x�:��n�_�S�
E����h.���M��7�Leq�z*uWBpXz��Kk%x�LC}Y������&�<8���A�����<hXOA�j�0�@FU�["f�5(�UF���P�o������&�3���*��t&�B���P��C�������+�BV��'t�G*nP�7G�M_�k����P�l��S^���U��n��Z?���)2�c�9����*�����-��?�Z��(���W}_
K[�~���
pt%�-�~���#+Bah�=j�t��#yQ	<8��@-94���K{"Q���n���P�_�E�N�{*�1�h���p�Z�c��n9G#�$��O���
�����`-y<�������s4���p(���$����&�wX�Ug��y;<����=�����`�eF@?��M-� 0�
>��*�hR��0�	#6\D����4�z5���*/��t��5�Q����z���~�v�+O?D\R*x0l��KW���6��Tz7����>����q��,����s���{7;����=q�}���x"�;���%Myt�P�G<�e�
x})�fY��K0>>�B���8:�1ji@�:�Gg�H��&n�|��8��93hA���W�QK�UiC4������CPbUk�%^�i��
t�4����,��B�cTP����9��tX	����&��(<hfj�
�|��U���	����1��2zT�I�^*.���8k)�	�Yp�j�]^O9x`D�X�_x�4'^y���/����=����{ ���X7F��%��;�#�8x��s0���M!oT�GwA{�H�GE �������
5E��<�R�:`�?���Cw�t�}���`Z����������7������m�r��U�&�����AQm/�ny���m`��	^,Y�����h8./x0����a������*<�������$����&��\��GF���W�0�q&��r�+R*``���?��a-T$����Y#��#7VP���b���0�����X������H�2�q��&h��q������4����Z`�A�k�)��w���@����������Kq��j����>0$<����/��`��YGI~����������1h�w{U\z�Lp��=K������Igc���:��%���*i�����X�V
���|SB������>U�����)��r�V'_����i�B�0I��B}z?$�{�N��B��\�6�bg��0S<��5D���3mm�+K<�i����d\z���'�o^��������*Z�l�k���������-�b���=�w��5����6�V�Z���]��5*C��������l�NB��K���->����@�.���#��0Bqbw��y��}&�#��}�N�)����Y(��F��'j����>]������"B^����[[6�����@�><%������wX�Gt���1��������>Jg����<�����<��FCp��
N������,+�R<`q�����SFc����2�
g/��gg'�9|�o�/[�s~�:I��������6�
)0�������>���T��0rp/�f��0��/S���s�&A����G�%���������)��{���h�^4�*_�Tw<���'���S���S���	��O�\����D�5����D���0�H�z8��^�~}���� � 88�p ��MhQ��������T�9��vE-������'�xP�:nYd��
mR��u����>���dh�S����JH<O'�)_�nc��w���Rx�N��w?�B���P�,�	����d:�Cr��F����������ZP$N�C+��z�d�O-*0��#o]�:��Vn+����0%�>��{QG/�BMR@�P���;{1g�~,�>���/�W�^�-�Z�6Wxp��a�����B�j
���4i���WZ�|��6p��N�	�]/
<H���C����@�0�P�q���mw�0������!H���:�����M����}
�@;R1r{A����Aq�x0��]���e"�<���A3�&����`��� M�������3���
c-u,<��^���2(�����'��O��#9����}����2{o�m����@y�-t�i�0=��-�y�.�0�������������iRt���N?���jLn��/���,��:��*>��q�����w�"mP��#�����������?]�T���a;���cA�Qp�i�
���������,��oo���*jW���E��	)tj���%,�)�m�W3h\+k>���d�&( �>\��a����K�E��
~�i?
.��1�i��YPT\�����'0�AVF�O����=/)�@z��`PD�Z��@�����Px��v��8=h�����8��n��e���0l���"��Z�����#��@�������#&c��u���T�5Y�j5�i�\�3
��]�Ua�Qx��?������M+�����v`�N.Q�/�d�/������&�d�;/*��B
����6S���2�W���A��]�6�������,�}���E=�Z���q�T�C�����t�I�eO����
�dW�5F�f�$�4~j4l�$:��G�9���5H��'�vC��A8��O��T�j��������l�����������h��D5�� IDAT
�Z���-�Ao:�@��%	�������!�N��~��NS�cXu[�V�`����A�����
.��E��U���%~=r��;���@��=�d���4nG��Z��[��c~��4n�q;����4n?F2�K�� ���7~;~�NP������v��Y�q0������ ��c[|
������Z�bM;�>�����Y�F0�\��
x���98�z<���Y���wj�R��L�[������qx��Hg2������2�=����� i(<`�������a_�.�4���L����!�{��e�Y�kYH"�&�|N��r��lW��^4��,��S�o�?���p����4���e-�������(},#�Alp�u<`s�CO�qU��^����������xHj/��rU��>F���'�&���~0�6����v�.���R���
v���O�6�	�4f��\��
L�s��I�k�S�MJ@/����u��oL`�������<����^~�����\�����X�F����:��iY&8�����q�����hIJaj6��a�A�ZM1�PBv�&�������t�Zt�>�@��m��F~4=������:����}/w��\-���e�H�����u��S;0�T�P�?,�������������]-$���������U���?�������R�1���*S<`j�L�m9'����*PN�/Y�����]���q�x�u�"H��'A	���S���
��\�K���Y����8q�q>�d���<���q���.
�A�ph��;���T�"G�hr<�v���>��eR! A�P��e�hc��U�������A�m?Z���&�����"E��-����W
t*x�bV�B����0� n�}Z��E���g�����BkN����@sO�����+��BA!�?DJ<`eU�QA�&��}��n	9������a9&4����
`aA�	
��&�9��5a\����C3E"2���
a�����m��c���4���21|��%$C����"Bth�IA��F<��pjc������PY���$���M5'4��������3��s7��F @X���G[��:�R`��^v���kP�Y���;�F���{�6�q����r�(+���>M1����lWL�n�/m1r�EjY5Lt9���1���p��g��XG
��w�;Z�����Q�P����Q��1�\	����\������ ����qbT�)�I�����2��8E�8�Q)��Tt�4f��	��IMD�J�1��n,��\�~�����V=��:����1�S�E6���:��Px���[�CM]}�~�:���M#, E��l8��8����!t���"8x�Ij>'^{cx=k<	��\qE��(��)����4R!Pm��U,�i�~�Ij�H}�u�.9E$��FZ�G�5s��A�gh��7�H!pB��=b��h��Bqu'�F����5����XU������A� @�������{[�V[�����:[w�����������({�
�7�����E���O���MN����|�}�l${=D)�T�}�
R_�@��Jt�%+9��f��4A<(����+
(�\�n�D�q��M���Q�	����jS�W�����IE��H�5$x�E�^pu��Or����G��������'x�P�n.�_�QX�u�^����Bp���N��z4/R����Z�\��OJ������M���k=�L��c��\��!Z�y�va������U<��X�@	[�x �=�HED(<p�����L|��iO�������6��~�����5���
�UW�9���5��z~� .5�k��< �@w�x����ww���!��5�iMQ}`k���R��CYA�y`A~�@kJ/�/�%3�`l�.�
��W�\t�lY�����F�o!,��/�������nt��3�u��(
(���y�"��������v���n{�n\$���E]$�����5l~����4R�:|��b��C��|���+C�j5�<�O��2��i�D��x�(��|���QQ����
�8	�+�������-S�/<����1��������;�B�;F����<�uQ��}�|r/�
8���Y����ANI0��ic�`��s;�/�5��:������C����w�BT��M	J�	*�!����'�/��I=ti�����q�AT�T�_�OH�/3'�)(�z'����\.XY��p���!�sWn������l�L=n������h���O@SS]�>TtOb�k
8�������T,iW��}����q��#�t4l�����?+����S���Se�����d���!Fl�[d��A�U��#�w��m���L	au?g��}��:���L��}(U!�L��H�qD&�S;P�Mv}=S�;8���L�������n��>�j�6�����`~�@�z�iC�A�k��t�	n+,<�MN�1oJR�l�]�2�
���uT�R5m��M��<�`*)0�)�m:�=��g���s�~+�~��~[�-�!�O������l;2
:�b�k��-�O���$`2�f�Z�K.vo��!��O^sW�_r��s��1�>$��M���s��l%S��]������C;���+)�!�:�H��`.�G��I]K����qRV`���/f�����p��go1�]}x���W��M%:eD�fb�@��)3��a���q``���1m��<�`H�B�MI�
al���y�,V
���Y`AT�`/�5��AfsJ���up-M�7�B'�+�
�1Ztp�������BD�d��X������p|�E�J�����o5�/�0��a1�%��O��V_�������<w�m����Z��X�����#�M��.���b��VME��m�R�'e���WsU�ZX�
�+s��L���S�����fc:I{n�n*�	X8H'j���v`a`Dj5���%��)�+���7��b�����s�����?�<]:�R<����S����!/<�N��(_�5o������F�q��>X���)� L�2H�����l���W<8������hl��Tx�T4k6��o$���z%:��?� �6���AGR/8��B�.�nXU<�s���['�G���@uy�"����0p�����5�9��x`��T�}�|`��~�{�g��"�(���.Iqm���(1xp�6N����wt(�hS���e��'�'8�6����,������	��q����4n��q[���o�Sm��AT� �@5������a}/n&(���c���}v�������9
H�b�1`�N�P�0��A���BuR����
�H��a$P~�x@*%�)\:��)�I9a�O��2c���y�$R���7!	m����*	����������Cs�~�	�8�����9x`�K���x�)0����(.���;���B~����x��[���<~��W<�G�����\���%~�
�
��B�M+�F)������YR��	�j$glFj��S	�������j��B`.�
�p��f�1�BU<H���d��H�M����?fsWc���!)0��q�����������[<,��"b.D�,#pa���8�<��^?�P�8H���9*X��������G	��{aeX��Nl�$pS����`
����yj=~�8
�HD'��_��\U������<8E*&l�������^{�b@�����I��P�h�]� <KL�OX���0��k�F����p���HS��a]W�G� ��/���)���I�Y*dDG���4!l�b��Y�Z�$�@��
BI��)���s��Y�pVX������	~n1p��^5��O��A�;�<�cR:�5�H��j|���y���0����L�"yp�IA��jy0A��A)����L����t�f�Q����l4�S��cn�
4���<?Bwf[�o�Knj�����@�W�Dj���m �� >S<pq�����V:����B�3)�zB�)Pw�A�)X��A�W M��|�;GYa�qqG�E|��
)h`QE~^����	�n�D�IF&`��$��:A�H�����J<cs���x������C�^4�l����)n��:�GnXg-80��7OR�Gr��i��++��<���>�m]����#���*+�9Ib�7,�����)���I.�f����4�LsbT4�E�������W�
�H,�6���3}-�a��O�c��.����������Qy���$g�M0�"�.{��Y�W<�������|P�v]���\�Q��)�H���%�j[��e���H!L.|�v'�>���fj0����W��o����F��U8x�"I��)�����:�Ts��w��S��e\��<|N��^��j�W1<X���@U�=������b�gA��u*�����������6�x�b[������k���C/��k����_*�r A�Px�@E����e���s
���Q< W)�=	0G���PP"9Q��,��1[Y���lJp��?a4u�H���)��s��M������`�;�'�3zH"�x,�,zO+�{Z� 
��E��7B&�#J��f�n�����2�x��Z���
&�gf�u���0�<0$��6�\���c��Y��l�^��!��7��	�Q&7`�8��WW��0���#E�n���=�+��Y`�x�O��.����]����;>S<����R[\OjL�`����E9q��D����!�+l5���E��t�A�{�z+�K�F-<x�A�i�������aM����R0�QUH�`�������:x@7����'���(�B�X���g�Z�� ��;)4�<����H%,&�������=���8���i7�H�@��U 7kH�@�k�v����^?@��2w��Q�
���\*�[4�������_�N�O���K�~V4�����j!W� +<��0�\�$p�j� ��r���4r�P����)��7CT ���W}8\x���
�����)W��%������sKXT�y�7��$%�y���+�2!�Z��!I���N���
3�qS��Cz��h��	�����{�>��L��u3�"�����������������5WM�r]7�����7�����������S� �S�:�]4]�4����hj���+*�%XZ+34o\���"����@Q����:�ol�}�z������/�Jx��-
�t"����<�N��*h`N��<��o#q��;�I>�/�@����A2��H�]�
xP��my,��0���g�t*��P�;c����R�6VR��M*�$_�������F�l���z�����x�1h6R���F��H%�j%�"N������x���S\T���UD�8� �6�����~�iN�>B���hZ{�$(��Nvr2�����M.�T�}�r�<4rKX�2�DA�A0-�oxy��1�A��������A����#^��U����uF~�iQ<�c�
�[��@����-�i�T�r@����[�+w���W����M��"(
j�oW\����&IZck�������N�-�>�������L��+�M������e�w� 
�b��:�D�P����X������=	H�2�3�9��'7,0���nh��g����Q�3��j���F }T����^~s��||NiU/��������=���[H��g*,���>���)��+��%-�����fXq��=�K��c�W�-D}��,���8�#���I��?�{O>A�����t�*!)�l���E"����6�+
R<`������o����y�S3X�{<��A������l�M���ytrh�7�%��G6�g]gh�o���t��o�����3������=p��U�9t�
���e�\�����N��%)d�?<x���}�X_;u�/R,��=�wi>�~�<__�������"���g����i�f��k���}�Q0'���/�� �Rn^�W:�A���aC:�eJ~�/?���-��J�/�n`�+�����5"W�U<8�`
�k�9��tc���EK����ga�LE��~#��*i�l���janx��Asj�z���30�}/�x0��{'�����eCW��TM"-z-"?��If��QRKXI��%������������c����E������z���'�7�h(<` ���HI!�6�40��,z�!<���2I��'���@���>��ea��Y0��FH|z�E2���|�+\j�!_�����C��q'~�^x�H���O��l�v 2��A.x��;�:�������}���$<�E�w�@���Pr��~q$��J����Ii>�7�[Gn�<���������A�7��I��#W
�/�"mn�����k�}��Tw���P�
���������=K�/A��<D_�����
�QT���N`�$W�Sz mhZ�Fj.x�����T�K��0��='wC�mN�x�N�wW\��!/MU���%�>�����YTb��J�IJs����|Rb���_�A��6��O��[�����X�����U}����(�����[O����E��k��K��p}�����4�~�/�0�@��:�Y�����v;�5<`��8z��
2i���&��Sk���3��e�:�>BS��~�A@�1w����[<nq&p���||i���5h����~��`��aT�E�{|=:���Ol�e�����BA�A:�{���J���c�AX��xxp)�!��='����"�%WL�N*(������Z���Mn������'��Ncb���i�����=��#�t*��I$���|�������z�	K��0����A����s���|=<�}��Q	(�����������!���su���y�S�'����������������������0���	.n��S���PZ6fNi�L] ��sk����w�=�A�^��lh�:9'�x�k��u-����	�"A������
)���~���Tr?����
E�]���z����L���H�a��t�U�R1��}�"�7�=��=�\R0���KwLj�B����#��:JJ����>�~���������l��@���r+�'�JXK����E�(�
���D��F8�,SW��9��������:������Q�6����s�p�ut��P�~s���w�8��lzf#�o&)l��z0:	�Gv��	n ��;�Qr�����P*i���\S��!��{04J$��?(�RF'r��B.W���\�0�
���Z��
�f��n�N'���WR�I�9�&-����J����`Ac��[4D�����D�*d�rE�+[�<����x3
	��4�W@��J%g��a\������{��$g�wG5(0�P���n?�wv7�s�h��=��v��N��Q(�?���j]���DP�����������{>r�fNu'��)�h�Lt��������}I�7��h=�&���Bf`4���p���VH:�E���Z���CRn�QYrk\��C��@r�
*!q�C���I%(����U���p��4:�y�\%0 <��T�H���E�q$M�����O��f#2(����C��ZA�	��'�y0�
M(����\0DP��}�pn[zO5����0����X�'7�*B~�8�`A���)^�'.S�p�Dj4�DJb�����e�}N��O�?��0}D�|��J.~v�X�]-0���A��p��L���{s1)#�$��F��������x�syv^>�����xphP�ap�/��`~�&y��Kc[�%eQe���q�`��-�HC���+��D���>�>�/>Fb��v6W���y����p�L�����~��z5���r7 IDAT��h�hbG�<���L����V�w�9&���������uX\*JHO���_|�f~��j���Z[(�i�K_�������%2��c��}��WIx��|��������ntB�T�c�o@���&I�\������������j�pr�`M�����Y��AxJ�����$�z~
��8c��9��>������ �&c=�A�M����y��.�$
L�/*�?�Gs�J\��0��}����o��a����IEK}���u�+��Ba���O��p�[����Zv�����9$�@�>:�� ��~�
��a�A���P"�;31�Hf<!��/��2�����,R:Hy����!�8���N�
����F�A���0$%�xru��@nv��t����^k���7Am��z��&��?�^o	�
���[X������f%+��}!W�	���7�w����x�d���F:m2Fyx"������*4�h�~5r�cx� 65
�F����]��X~�
	tr:7H(�gt�E��8������v�����.p�iC�e�u�=��������g�HkGn�E`�k�xp��*RTl�3r��x��V/$��r��m~A��y���l,�����c*U��?�����u���T���\A�s�L�`��q�2r16����GuRohV���? ���T���BC%s�Tx����^���9��cKMr���-�i}����-��w���o�����Q���u�0�r"�w�\1�S��2�H����7B�>*Puv�s��5�\��"��H���q���u'��*�W<P��j a�!������I��2��%C���Pv��d����`�)�R>����jbN�|^�*�#v�\F����V��h|��}	��P#
$P��d�	<�IMD�J����!��������Z�<�#*vjJ�%x.����h4\6��=�L.e�m�S7��x`���{��m:��/�t-��[ZL<"�"�^�����iO<���%�����c'(���\,�uEm����I�i�DD� ��)�5w&WY����92?~�z������������N������I�o�.l>��F<)�=���'�]�
������W�&_�����$4������h��'X��#��z��,���s��A���A<���{�xu�ka@���C��%�#[�5I��_`h�|�����*�<��~A*�v�\���2���t����G����;�+�����Fc�����
��B��yF�={wk���!���r^�	�X�M>=��[v�*	V����I�Xeld�����
R�������E�7b>)(0���{��Ft����f�L5�`
�VbG���\
HR!������*_�u<(N��n��������#�Fx �]q�AQ�D]-_�zA���v��/<���R2RxPJY�K���Y� �@�����\-|�2�v^E�Z(��Kj�0W%�]����%����JR��\-��vi�-<(��K�~a�J#���))xP�e�����Z(n�\��37�|B�1���v(����.�� W�Q��\-�F~�6�F��Q����,�,�.<���o��(x �2�jA������\-�V~�v�����8��eQ��<��\��[<(�mQ��8�D�����<(���ir� e'������1"-��{�x������/(HZ���)������_"��%�+��������5#<(������F���Aq��NQiD������.�9�"	x�L>�g���W���	%Y���vc����o�s'WO9���~�lZ�3���Z`�AUkK���{�VxN�OHJSCC
��U8\ <`y����hl��"�i��A�����G���BL"����\�
�<�>���S\����<OY������������7B��N
�A��u2�:O�g��X:��e_�/K ��������@�NSc
�A��"�����I�w	�AN��A���xP��9��w��L�S�����������]IS	�AIkP��x�����5Xx
<(^�
�A��&���)<(�����;�K�����N�{��S����	���}U�*J
�3xP�3mR�P�Yt���P����G��%�VH-���YxP��&���!$[?d��e (�����)��>�*^$���I
o<(�=�S���|�������~�_�okHW2<���d[dU����<(���I�H���S��Z��HWC�����A��YP<(~��O)(����"�E��p]��rRxP�
!���x�S�����1��BN�
�A�}Kd�������FekOr�Sd��diMdY�_��|����M�~������@��������;O<(~�
�A��.J<�M=eE��!��P�����BJ�
� �n�@�}Lr�T
�[x �gO��@�5*[{x�S�x �~%Kkx ���������wnnx���]���^'�x��G%<(�:��<���-,�����)�@6�X�<(����B
���D&�!:9]��+��%Q��E�� #KQ�4�����4�fE���*QAJ�XJX��$O���d�T��������>OW%#
����oI2L����/�2V%(:aLL455���
s����V��b(��"[I���MH�q�fb���Fm��)��V
�t��$�����!}n�#EVV���`l��st��3Td^����g���n�������T�*�����QQFi L**V���5-�����
VY�b��bQ��n�-�����CY����Z&�@�/���p}6?���V���k�ya�}jm������D��P����Z������
�,�o�_�{>�CKS��2��Xi��y���H���e?�W`��((%D��^�}�)(*@U[Yf����Z�6CR���de�k��I�H�R��E)Q~���d��"M%�D�),q6���R��F���(�BbX)[�	��?�l�����)@S����������*�zfiY���
~fK�=J��D���d".8���zq���������$�KO�
��v&m�?Q��5�RX;��L������������znq�B���S�o%I�o����r�3�P)J�_�7_����j��{O�h�8SC��H?��=�#���\��*��"SE�kc��k�@��MN]Z���|���T<(Q5��j ?x��r�]NAAA033��Ui�,	�Q���i��|��F��������DXX���e��ebKh�2�v������a�����P�(��<���0a�Ph�b<���D^�#�z�������#���������RH&/�?a~X
��&���'�K�J!���G��a)t������}yy>��=�e>��UY���]�_9x�u����T���<(�����0Q-����e�"�eM���!�!LTe��KnK^�CXX.y_��yiaaY�������=�e>"��K��eiA���6KnKh�����,��|D����G���<�GXM���!�!�e�l������<�G�@V�Z6v�e>�j�,�����#;d�J�����^�G]{�o����������d`�2�)�����CM�������J�_�hg%/������,|�nHX��V{|��@�#����}hhhH�<���B{��������QV.�eY���|�u{��g��|������%�SZ����Lz��|�K{���oi��m6')ok���0����N<�=�N=K����?Y}'HZ>I�	�CIk�����|�����G����9�V{|��@�����+}�(Y
yhy����,��J�,	��c5 (�}����jR ���?���,	@Y���<��!+��]r[���rbGh���iYZ����yy>��=�e>"��e9����0?,y�������������0?,Y?�ujy���CY������%�?Y�������k[�=d���oO^�#��������A!�����]^^��Bf����%(��,kB^�yha�*��]r[����r���,-�K{���%�%�!/�a�^��,K��P��Yr[B{��eeA^�#�|]V=B6v�a>�jB^�yha~(�gSVV��=�a>��ThY����������|>���}Q���������D��N*����j"]BO���A9)�X��h�@��bbb�����(�@�P[���Q^^��q!������	�����Thk�G�TH����%.�����Xv������MHH��;TTT��W�rT�0��VYF*�=X���Y �����g�H/���[�����nB���l]||<T
*�?Q_��M
Uz�2ej�0c�B{TT1�yz������-&�������|\��=��#��E1�9.%�:��x��C^��8���n���C!13��Mi��^��b�n���#�]
�����#i9d�
���N����������|$TQ����J�����Z��>���d�e>���[��o3��$h'F~���B{���,�������LK!���������,���[Qq�,���]T�/������h�����K��b��"C��\�+K����K��"E��;��rz�T��2ry{>r�"SI	���~�_g����@��F��K�|��[���oY{�(h�&^�����K�,(��Z���Q���5�#9���d�"\���53]�*f�H�L%��#$��Sw��rE�{,S<�����B
�m
�vz~�	�����%�$�<�w�{d|�/V~:6�rS����`��� ��������G�2�����HN,���l��-�m�kx�xa���&RQPA?��2�UVFBf��Z���}w�9��a�f�[5���
{^���N�V��)���+f��!V_1G!����t5��-���Ke����HK�*�����}�MHP-�L�����d�w�V������z,�B��$�u35�����x���6�*lDVv�7�du��������4(�r-��2H]�@�2�U�R���W�G+AC�~�+��%�������q4QC?:�QN������$�������Po������1����ry�5�5DU�
���r,
j��N
|<J����!Z=�Tl����G�2�M��l��eq+yy��[���9+$	F�L��N���x I-
q�(5 �e�xPzm ������@|	�A�}G1�@�X>l�A�h�o�x����PNVx �~ ���Oy�&�������{
���{���	��,j��l��tu/��H�g��B
�����o<(�6���hX�����Hx�*������T�Zc�(|<��x��R��Z����lB�����QR���������g�J�.7��YM������V��lkvCJr>������T����cM������1��%���s
;����!��R���<�~�'$���2����������Jl�4����`<|{fz�HJ�G3�^��E<����u����T�r#���=�&CW��t������l^�l}�d	��f����f�N�����KS��������Ug�'b�]��������l�h&9
�?����#.=sd��=R������� �
JY^��������*���K���M	k '�Z�M�Z�#l��I�.7�1�S0R7Dk+�<{#k���t��X�� ����w��S������JQ�	Y�lY��
��a��?����E"_���(l�;�_�K�.7���w��S��?]	�=m42v(�=i�x�z�T�VG��G��\����IF�e_�p�*]n���d<�����O�^���
e�
��W^�<�����.x�y��L��S�������������x��2*���W3KR��8�������}nR����]�&�������'��u����[~����IR^5eT��3�.>��{����@f��VD����\�������G�PqLh�����c�5W�t��;���I�H������tn�����x����01R@rJ6�)X�������8�@jb�^���v:L���[����5����������ga�C��v�"U�7t����!:��T���k�=���3��dn]-�������[�S���pk/F���e����PV�����V�{�x�]�M����~q����O��e��xEs���2�x���
�.3���.�v��C_�����o�nBFr��}������G��Z��uI�^�`��c���%,�L��v2����X�4��<q����m�������uk��u���D&.>��:5UU�gd`��aPQV���g�}��0_�����	�;n�u�Ddffb��|WEE�G
*7��$��B��[x�u�[\nxPzm ���,��vE��hV1��B����*�;����2tg��m�,����#+3]���[�5�����JL*s�@�|���/\���K<���(�Vp@D|`���/����HU?�#o�:���)v��N(+���Fvjx��T.����t���Cm�r8��}���\<�%!����<8���k#0!������4���s�(n����&����[|c���}+�/����;�C��PQT��	�W^����L��y��u���n��)�����
��/��o����n/9
*���mK#�,�����!4�)IQ�	�@��:u�y��\�6K����S�N��m�h*)!m�,��UtG�w$�s�*k����8<�U�b��y���;�92	O�m*�Y$�5x�����p�����{����"c���A����B�k9��#+�X���;_�{�<��7�S�Y��6�<01�(h���X��w���&0!&.��@���)G	��i���U���O8��wt�3�?0� ���_~1�����h��F�y�9��X����gdc��x��-����=�DJj�:7��GOh��4�^�3TUT�l�v�8e$�h���P���
-�6������)�lX[Y����9���|������Y2��n���t:(?O��***�Ec'��z�
9!�
����GSu������xQ��.�
�N������,�����u�}E�O>Z�����5Cc��_
%eD\;��3Gm4X9��q�R�����������Q�B��:X��_^��^K���W�������?����9}���G�D$'��S�P��?,���_n_]H~���2C`��C?M����ASS�qY�x6�����������8zz&7i5������i��~���DtT0��!��q*<0hd�*�{��������s����s�������'��������N������g3X�qFF|2������?��f�BYG���G�u/T�u8T�h�B��l�=��)���@��{��Sd=�)dge!��d��AI���"d�<�w��C�R�\"���ZP@�N�@]���a�s�O05]s�>;	UU-T�i
EE���q1a]�%T�����{�n������
W@	�B��ahlC>w3q��<���~3vbO/�Gd�W<p�����O�D���aS�3A�J�d�f���F��,�3�\W�V������b"S<P�����^[.Q]��$<0����;C�������������1}��"�p���oL��x��X��=��� ��w��o�����S�c[gP��x���H������0��%��hcU�nx	CMM,8��\�@�`�����z����Gk���}����67����6'�����1��),�t��N6�����ZBSU���8��}_�7*������S<hY�
�(��.M�<x�7|"��}'�Q��q���i��7@3�^�N��g[��
��������0�����BMY*Jj�d6��>���H�H�3���q�c#Sc�'�o���p���x���,�4r-�f8A�dd����-����Wg��N:���_���V��a��Tg��}�����������mh��4��jP���T6��KOw"<�#���n@��@<��/dfe�+��� IDAT�R+����C�>hn�G(���T��S���y����[���]��fv.��P������Geqi0-��X�<	�	
C����Y�4�gq��Zz��2��J�|�O�������2H� N�t�������?���Z���ez�P_���	">�CSO	g7D ��!�I��3q�XA�@]GU4j��5���O�u��������Hy����~:|s���4k�A����8��*!>!���7p�T"}�d��R�k�)\�������������t��U���������������8u:��Y���B�&�p������"
j�
��V��	4�r-�{i���j�l�Y��
����3�T<rg
$���QffJ8z<����c����{ �������7
/_�A���S>�Zj`��8��(aPm=AuE�+��]MI���8��A����I`9���h�h��|�[��e&O�@7��a�fx�y����4��x�#<
����Gh����Z#`�n��w�R�"f���5�����n%�1�������x\�9��
Me
��8�S�@���g�"���~�.hl��� ��3T�L��'������7PM�
�[4�|6 ��G[w������y�oc�a���L_�x
R2Rv ��*����� 7�+�*��ij�S>`���6���{���N%EL�7i4��~������l��s��PI����r7�h�I���}�64�d����h`�����N������I���1to&4�|_oR^��%�c��?aoh���P��4�4V��7�=�jV�������Mt�����2������bI���OK��Ru���)�:���^�P[��{�!��p)���1��|b��^��X�1��?*��m�;����aJ�
S.��ne$cd�^��o����?o+%��=o��{�����kEgT����c��j��XTg
Ex�5�!�721��`<'��Z��W`�a��vq��u�E<�~�zO1�Vnf��Y�b?o������e�w���`R��1����}"���Q���~�5
:*��6�<������4��d���t�=C%<��UuE�9��|S��� :��M����Ta#��d'���:� ���4(��C����S%P�_	����`�dN�S
(i#�e(�S��R�I��@��������!R]_"+��{hn����B��v���L�dS�L�+�v�G���P��~�� ��G�[mdD��1C�@��
j!��2^�BAM
��\� +��7�xdxAQG�4_Tw�C��G*��^^���y���#�M��T�SM��%�,_���}��t�WP4�F&���I[�@��
�7��#�Mo��d���v���=�������$��gi������^e�{q�������F���s����P�S�����_�7�Z�ZB*�h�a�6}V!&�
}�����HOF��?CMC�����VT��Vv��C������??J|_2W<����bZS�D�+v����x������|H#�������O��}�Yr���Aj����aP1��'�3��V��;����7��VMsXMiC���7������A�]���x��i���^Q��h6��C������5=�rG���0������edW<P��k5�
����=��z�D~���0l_�}�xY�]C�����7`�uT'�%��8[W���-�O�|R��.j�3��"��j{B��&�!p�m�k��9*f�~:������t�7���Q���C�����[mQO�{iaq��z >l����tG�8)�o>�w�)�������}3�u	����(�2�h���Y"�/V�ZS�����g�N����]8dq�a�=�h�J�����6��A����LJ�����c��3H�0D��y��$���7@U��9��K	��y�B�G�������y����[N�`�$������WQ�@�������H��XKs���l���u��.�J����lx����H��	�����$�����}`���o:��w��>0w�3���mShk)���T�+�{;U�����01TD��9��.��og5<{���/2A��>\:�I|K���Z����&�C(��o(�<	���
��4\_�CtR��gh�Gr(�?���
��]3����������w��7��>g��T���h�vh?���r�������W�"?xP��������r�jD<��aE�?�FV����[��_\k��g<����eJ�o>��)0��gW�b�V<?M�
�s;�w^�aU��5t������J'����Bbt�W7vN�o��v�6�x����)C�p��~8p�o4���
���9�	�1w�?��]��Z�a$��[G���zt1;v@��Kw��rx<�	C}S�k�I)�HKO��]?p{s�����S���_&m������5���3)��I�x�T�jZ��k�<� �T���Ib��q�c-d�Jk;Zfp�;�X����p�c��<}��l���P����������"��_m��;|o1��D�����h����R����A�v4T��m"=:��.��Bi����2��R�����
�kV�;Lj��Y�.�FZB$�{��Cy����o�AJ��P�7G��cH�
��~BR�?�.�A��k������p�����#���o�J}���HO���}K�����$*�h�����mm8~7��������������kU�����Gy��PorWd+���� 	�or�����c������V�5`Dk2'o&��Gk����<^�"��;��|y0����<����3(�+�\:��C?K.w�bb�p��L5[�Ee��051�c-;��f��6��9���f��(P�����1�U0���t��oV�+���O����x��
��S��U~��%k�����m���C�98q�l*[!08V�P�>g���mT����=z�2�y��E^�-��`P�.���v��:)!�/��e��
!�7[��������F'��>����*
����^?"3*J:�P20������A���sj���V��mgD\:]h��N=�O=j�h�����cL�N��U��YJ����=�<h�<q��������
|?|������\Wvq�A�p��|��WBRB��8���<P�P��!��3
5�����7y

��A��P�Vs:��w��;��x���[o� >-��Wx`�� �z�A���� �c8j�1���rh{Z�HF�����y0^�<�f��gs�Ys������4j.�����V!����2�'�m;�����)�|,�EjXT�u�b��w�������o^�i�"��>���"���0}!U%��,<PS�E���q��DT���7/��Y�Yx��2�?z���8�4�+T��~>��������6	<8}`,��M��y2���
��.��:��]��m�����������'������E�re���7_<�5x;N�*�)/;��R����m����TF���=8�g�-��j��<�w�E�5������Y
�m�������h��o?b�����E2�����j����n�G;������� 0���a@=,�r��~�,�B�6�{����h���Y~�An�?�R_�������n�����C�
&d����i>���x�<L���&
�j���My��mp���wQ�����FC����K���>>��r�`^��X{������<`���k������I�G��C(m����g���>h�<m�ur	�f���utp�����0
{�w��}-&E�@@�!����o��i8��i��6���7�h��W�)p{�o�0a����j	��6��.���G��<��:}�5���7��F��V3$a95���^�{R.�������x����� ��3��[t&������W�9�A���E��tp}~��Zp� �>�>\������������������^��nr�A��~X����K���/��+K<>��(<����J��q�@4�7����$|���-
���2�:����(�n����4���`�)F8�>�FJ�4�G����*j
��� Q�$�����[z�:k��3�8��s�`�x=DFe��~�?N���2�i��)��h�X=F�cG���(��Q!� ��U���S
��`�t�$`K	�iq��	
�DHHF�Al\6��&am������>y�GUT0Q�@�w�u�^����w��q���a2�`g���5l����X�!�����L�����L�>��O�$Xb�X=�#u�����\�,���zyy0���
cG���{
}���7�`�=R�+��kDQ� ��VhY���i�"�J'�>��UG,A��3�^��a��`��������Bq����v��z�6!�����c��>��<4h�io�,��Z���,��3��6`�AhR�f�K��d#��&|s�����O���7�0�i
.�T��5���lS}Z�����
�(e0���s�g�E����X�r	���m��1q����9����0,��9x��:��?-���:k[�@mf�!h���������G��#:5�@<����t/��q`!��[�9��,f���8�@���k0��M5=,��c.AK���������;he��N���3������\~�D��q4y��������BO6����u�n���to��Dc��;	��]��J\��"��'b���X��n����i���+���:A(�-��
��5-���q��Yc,#��0��R�t��Hj�]oOcv���t=,[a��.���}��0�6�
��w�=���M�!���q6}QI�3(���������6J��*��=��w��0�})�5����������t�C���jr��A%v:���O�k4��ou���|��:��u&��� 7�����	�SHD�u���O0���4����G2������$�N���&��:��*0�P����7AXY����~w����is�i�C����*!i�]h�i��`�����R���0h@A]��)�>�)��S�F��m�gx�{����r��-l8t�6�t��v���Jy(�,�JG{(���|�&�_l�E�Ek;RU�<�)���An������4:@�H���q���l��UmZ)'�@�i��y��r��~���)Rv>��y���
z�����x�r�*m��������9��+4F5���[���C�_(��&+���*� ��bu&�Px`i��J
�qs���C�GO4�<�O���
�����%�&�9���*5�����<h�i.����+�h ����,�]G�����C�a;pa�h��&7�|�}N���5x�����C�|�Nw!E���`����C��m�7��Eg�k��W!H|�e��7�(T��P������_W�u���] s�5�
������U���Qij[��o���������*�2�Z�����������,��,��&|�=�b�8�����n}ku����
}���X���l�<����M���[�ZA���7����~�:��s���?�9/0��w�T�S�?aGi����x>�_��1/g�Fc���"�Ct^[�2����jrkf�/�(x� �\���#
X��@ ��'B�j��8R�����{quV���Az�L���V'	��h��9�<��:�����(o����ix��1
�q�?f���N�������������J0Z5���$�oC^	�Q���]O!���B����f���'���E�N�cmm�Ef�A�i�,M�M����DUS����!��M�����w�`i���&$$f������cH/5�?��Ct��^W���MeD�7�7���r��}C�h��3�R��Sc��'E��6��om��7���}\z���a�w�����%(p{m&�TFRL�+9r8��u+��^��"9>�&��������6�������D����4e.m�	<��is� �{�g0��������������T���^�$�@EM�6f��B����=?S<xzq�!���/��{:O����F@�`���g���24����'�A����y��I����tmI`UJ�?<�Q}�a���X1�8f��#:�>��l9���/����1~�B�|x
Q����*a��?p��4)��;�����
F�8rq�
[�3�w�"yZ5���g�����u5M���[�{�<��a3��2��]��� lvp�������K�9�&s��v�3Z�����F�����F`�I�qT�uc&AZy�������``[;z�w.��
�4�/-��+��w�PhV�
k[�������a=�7D\9��WE�I����v�����1�-S(��+��QT�9��`^�B��")��	Bx��G#0����X*<�=
Jj�y��}��x�g:��D���������3��*���h�������V 9*uF������0l*��1U�����1|���Sx���hL��`�
�`�EZ�i\[�tXc��8�k�	}%����.3�����I��4A<P�Q��R:�<#Zmu�x���?�r��Z��V��1�����=q��u����<��#�c�����C����+7������qC9���K�#�.c�"����8m�����&�Z��+~%���Fz�����T`p��]��8�XX��V��a\^��������G�����d`�����g1et��!5 �
���1��������IEo����!����}sh5@����l~��n�#�C��#�nE�3�B,?x���-�����D�,�US�"}����f��4}��8r���>}Xv���Cc;8�A�����v�$�E�i����^����g�D�(x�H�M�^SQ�Z]�=�~������XH��
�*�������U���0?�c���hPmF?D?�E���y��:B��' `����6>���j��"��%R:�<�=�Jt��6����~}:�&G-���G��M=�]w��oU��g�,��J�8���AP�������k�vu�Z��]u�������EAB���{g�����p�����Gf�����s�����f�� ��e�'� ��-�9��f���|.L��.�m��p���ZkT��w>����4W<��8��?t��gO��O�N�5n=7/��'
���/t��
g�'e��0 x��
,C�V3p��$�Q����Z&�=l/�#��4����Q'�Z�=[�C|���
���|v�n���S�������IuT�����:���T�(��$��<P�q2�U}�47����)*3����]��2]x�@S�h#��I�z�!�B0�Ec�|�"�[����"6d Jl����A�<������$����*�p&�t���X��&�������0x����W�ba��-��]x$�UUp��q��AQ1X���?qG-RJ`�� gG�����[?���`I������bmX��]�a���	��"�D'���`cB���%�!ogZ�>X����(����Ha�&W�Iv����I:Am�>�%���|�����< �a0�
���C����~H�h��44�^�Ic��'��)r���=w�[�	D��c���o� HNM���Hq�7�a���D@�7oog�]~�6	#|���UD�|><��'���)*p�@t�[n���d������dm��o�����S�����a���N�1��GI�3?������Q�ZN� ��[d���?�2�h�(�����c�and�D�q<h9D'W�e����G��(.x�N'�n�H$U:��LU*+c�:������)�S-���)�s5�9��i��u
��o��F	.��q4�b�4=l����q/��g�
�_H���"��xM�jg��QRk���������N{��RZ��;�F�r�'O�9x��}����b�+cF�FP�n*��������.w�$*��CE�uQ�(�B=����]D�x�J<���$�#�!�j.�����)/x�F't>^���&�����?\��3" IDAT��s���hVv����q�����;=�"9#��}�����0�>-^��=;���-JlC�>��X�Zq� &%����I�$5i����rEvr��E+��x���t"Jl���K���l��	BzA�"]�`#@jN��������2��M�/lh�U�7��d����a��F#�4��^&�N�.t��	z���Y�W�\a���Z#p��(�I��o��\AD%E��N������k�u{�Iy�=g���6�������6� J<����'�����zK~�]#SYp$;�����	T ��5)8t�~'
���m�$���yX^\���&Fu���d��_Uw6�H1bA	� J�>\���	�$���y�;�.�3
'���3�0��y��'AYs3����D��6SF~j���Z�b&�
S�
�I�C�VXD��=���{���
��e��OR��F@AKt��_6Z��d���_d�ai�cQ��kZ�=���1��Kv���q~��j��j�n����IL���n<�IN��8�_&�y�OR���I�M�twR��Na�h}�)0ey:!���1��e)���N���{�����E�����>���
H��`�SH>�	�!���KLM!q�m��}5��B�����O1�I�6,����_��D�:#��3n?=(
itJ��IG�q�������|�h�5������O�'x��2	H�Mgy�C�EU��$E���J�A�S[)���D����q�����_~���L
	$����$��RA�;
Y��0V��v!����[N&E��Q�r}T��H�������@���B`�A��Nx��NM���J@�3���V}V�����:�\���V7���@��r�D�:���]�k�g7Q����c�&����3��g�!�4��4��������H�S	�u����j��>/��BfJ�)���|	68�7�+����P�V�a�+W`��
x��`G�
�#��M�x���7�D�T8r�)`��^?�����K��Q��A���^Q��������)��gjd��~�������Hz��u������_H�D`��@��3W{%	�������W���Or$y��r��9����P4��4�)��A[�P=�_���s�o<`s��z���A�F�|��A"����c��z��cX���N�?��	=h}��9�����:�����$R�r�����
6�r�u"(��)/xP����lC�c�X{�"}o�PH*<��y�
WR�����,]����Up�~
,+)����\���T��Rr`�S9c��
�X�R^���y���4��%��jc�}<���au1j�#�<&.x�gj�-G"6�=�_���m�L��}��G��[p}�����h�b�?4����{�f�6\�2����i$�Xp��IU���3TB�jth����^f��0
��1%�Te
����7j��Z��D�AK	f����V����=�vv����N&#��.B|������w����W�BE���������e3���-�!X����<�pg|<s���.q���2/�<"5'<z~���8x *�d��m�r A�$.x�H����K��Z��Km���o���M�H���X�8s� �B�1E�����:�������~gcR���v��tu�Jj�y=�����j���{nl���w�i/�!b�����0��~@��KE��(�@^Q�CV����s�6I
!�o���`R7 ��.�#�8X�F�AN��*���H�<�N��>t�~�����g��D��oqRN������:{2xa��nsRn���+``��*��x��B�)<�N����	\�����/����*,+*a��H����V�L`�R���������_��Z��@���X���=�I����8j�=�QCzs�Q='DE����
n�}��}�6sv<��-�p�+
�����h��6:�n����X��*�b5K��=w��lH���9q���)�Be
��B0L3��<q��~���f��C�n��$O��9�	#�;�|��(<hgmW��k���SEm�{�_����	D�
}'M�B�6K>������S]�f�I�� �/���#{ZWN���s:i��q��
:q���A����*��x��Ic\usG�jU������������}?\���O������Q�����6I��+s�`�}#��x�H,(�l����D��b���X0�S���Bz����oP���e��C� ��Y(��c���	�VL�PK_*\����|p	I)���'�m$����������.�^S��;���{���?����I�i�����j��zGLE��eR4��alZ������#.����.`�Ax�7)l'���<t�&�_``;���s�_Zn�:1~w�6��+�gs��G{P��pR<X���0Tw���b�~oH�]�O�m�OY��C2i�MU����>0��l!�����,,�S�mp�7���(N�<p���$R����Q�0u�L�xP��)�(H�������N���?�������x(��U�������0|L��x�l�	��]?|��������p����d���
�P�@����'���z�	�L�Eo�!'x���=�r�����0�nm| T$c|�����<`*$`�o?����6{��>)�0
u���0��?����R^���U��b�	4��F���������Uw
^�Ems��9	G:|��Nj�<���_HY��I!�se*+�D��*Q�j��\�`'�����^%��<�KY�+H��	��j�5/R<h0���Ig�_���@����5?���H�xp����5�t
��3�d���{��Ycl���!Sr�&�67����!���o_�*0� ��b�(��O����
0���B-\��j� ���h�!����L�B�@���� N<` ����H�n��h� �i����,��������P�!��/H�U�l%����r��)?���2��^��#�I
*�6�c�$V-�2�-"�E�
������"���kc��hD��*��{2Z�P��[���%k!��.uH��N�^������HL��C+���jL���l��!����d�����N�1�V�HU!'xp�5����SR2�g�N�����A��K��V��=��
F��d�aNe)�n���a����,,<`*$����-�9� �0?EJL���e+��-y���Y`)��Aw��8Nj,�_zV�%����(r��,���A�yH���%��n����d�.�^���zX(��"m��6�%��6����`��,dKL�`U��)�B0���T
��L���	a��gC��
�I�e.APkZ-��A�X8����
9�����{
kS�$NE!�"A
1���#X�)9�����������}G�1$�������y�Q�����Zu��)��+���,��������`���C�gGAy
B	�"�����|������9x���_��W;�D��{�7z[���YPPN���ba�u7�x{��r��>�w��y�x��#���&B�)44t���0����V���2�,��]
��<XJ��	X�X����a@�8�	��e��2��m���%��x���/\-�)D���{?8��*����`�]���%ro^�@���f���=�'���p4�����O�n:������"�_P�RO+*I
dDS5ZP�7F�R�[��P�C"��m")0��v�I�@&;J�$J���RN�����x@j�_�~�\�@��R)�r+RH��it�A���+(�##"�����)+�h��R��8��<P��>���B�+D��
JM	8��*���r��8R<�:��Q��������`
yZ�`
�������)�K����J�&/GJ	��x�������R< �^/m��p��8����T��W�S�t�;�]8T:J/jA�A��H'Y���h�g%n���
�1�����XTkI!|	*��,�����c�-E�~�� :���;�C�������\��}�0pA�$m�@�DZ����5w�����������^����X��D
�a�����Rx��|2(|����C�P�w�-��(O�����"��6�0Q'%
&��G!���������|O��6����	^�����H��)����d��'�xR����+����8`a�->���2�������5K)�T
D�
9��uyX��Sn|S>��i�}#������p���m�����!)4������[���=��� l(�S<�2�3Wm` C^��.�����:��W~KrKQ3E�����3k0�"�Be$������x;�N���#��W�j��]��xd<�I���Hq�t��j�����eLa�X��m4�a���i�x���M�q�_K
Ap�����T`�!���A"��U����b�p*zhe+�#�+4�oIR^�`x��~�fv�F!��	��
�[P*<p���Z|��_`:�&u����G�t`S�����$�����f����u9� N�8��re��\��	#w<*����P����;M�����<h<p	�/���6��9�q5��
y�|���V<�@�>Q��������N$��r���O`�6�h����9���
�����O����#��3�JL�A;���������R<��@��61���tn>�`�x\{p��������t�1����4�0~���|h��Ap��!,������r*���};L�aX����6a��10�������S�|��8�8O�}K8��U^����t<�o�xR��<��x��C8������T��k�l�f�j�L��O*a���?�1?#��i��.:TIQ���y�v<�4���P
*����.��
U;��'�s�X���A�.��B
�<��x������������[��[��_�m#���PT�:�pW<��B�6�
����-�VSxp��':6��ZK�"uH/R����`K�V���5�O��Gk3�D=RD�4�*(B���*�2G�|�i�K�d<�O����lJ'��;;ph@G[��5 ��t��G'.D�)�k�;������5��7�����jB�$
���w���@��5��>|
���1�7\����/}P��|}�1������d���:j+ITRb`������zt��f�r��
!���
�Q|�^t��=4���;�JX���H����!��I���8���E)/x������2���)��gi������9����1jb�����;Q��uKQ�Cw��D���3D?q�U�bh����c|�����6|�`��#t��%V�<��u����{qi��
��7�����C-�h�����p�<"����q#�}
ADl,����Y�v�Wn�����Zu������u������u��%�$:�\��
I�/����aJr�,"H�t��>�Rh���h�vQ������G��h�BG��'����Q��o^����g6f����CL8�j����[���4�Z�9\OA���a�}{������?f�L������P��?B.?�Q�:x�.��8�;��1L����FT��fZ"�
-�Qy�����aVA����9{l�~���h���m��~{4��?!%"&]��/[���O
2�R�o#��H���<��Z`�)�~�tJFDC���A����%�_����k�~��m&�����h�S6x`[�+,m������-C���q��e1RY�6`3"�}�k@����p��v=��i�D^���n:�E��
G�MO
��
ZL&8�gRIX
��+i��l�����P���_�Z06s E�4��@�����<$KF�P�F'�DPh�(
��.����|~)?������j��������w6x��-0�%��}���������X�)�`�TX���A�Js+x����1H ���}�����%��f��<��K;���a�Y���P��X(ra���hO
�	2U��e�n�&)���t�K�w�DRC��y#����+������F�r�?9���������/���2��v��`i^�V�m,4��O�@
�����������<��
`��q$a.�hgrz�H����)�0k����|C�%<���t�3X�� ~F�}�`@!d����sq���c#	nQB��~��F�tG'��o�A?�h�O��L�`��)���,��G�(��!�B=1��\x��C����N�!�b�#Yt�fp������$�D<���x�r�����������6����"$��S�x��:s*��SgPU����=��t�!&��B�}�O�6�D��9���5��S��f�q%yu
:m�M��U�Np�^i<?��$�/�S<�������e��%���Y:����+����AqV3h����pt�f�%�x��G����F'���
�&���D�t�)�N��7R�y��}�3��3	WZ�ds@k�+��b���f���ALQ�w/
;�A��w0�-�Q���k����/R���1���T�|%���m�@I&��:�I*c(d����,�c ��S�`4)&08�A���Ba'*aL�e�f��II����2WN`��#
��T}��V�	��8|��w�ae���B/�P��CGb������'-��������A��=LaH�jj4N�i��8�j�NPC�=���?
�[�9VX���A�����=N��B�~��4��bx�6P�h��Cpb9���3�a��?^���g%���><�Pg��x?:�oF�D�A='V>c��3Hq�
�M��R~�
}�xp��$�.c��?�3���|��R��+�k0k�6RX�H�d:��<���
La���wE����M2�i,&���K���#�p�.�����5��I�	�c��Z$�pu*����?&��B�j�I�!�N��r�j�G=?��>K,|C�j=q��u������S`y����U:�k)xG���yX�����d���MB`��L����uh�����
t�����u���\����g���kx�������)V�o��
�"�%~��R8�SE�c�h���6p���N��M�����������bW*)Z������Q�����P"��b�=�s�=dz&T��}~g1����O�H�����{
�1���Im`�l�P
}-��xP����mat5k�
������1�}5�P�oR!�C�T	Z�f���6'x��y���W�/iN���B4X�$g�H�>��[kqU�;4�.R�6n�T���%�{w�b�4?���!x�mz�<��D�J-yh���
to^��=�:
����zF���v��x��@�TI<P�G�,�<j�SG$=���Y�b����$��-J��$H>I!G�F�2-�z@2)���T
����)w��4
]�L��,/K	��/Oa2h�V����D�r�
t����gJLy�-h*����L9@�om�����>K���'0���,�M�E�@�B�>���SH`���F��nQx����Z���g!X���.s^��)T���Yv����2I���@�wmd��J���>�z�P�j9�v��7�q�2�60dG!���g8����x*Sch_��dpD��<���������*<�$@�^���������j6x���k3��
E ����`f���o������]���*��n��5���/�����t�DJU���E��\����eL���	�'��'�������OH<`���o$N��N*�o���x�R���H�����'`����S<���u�D�>J@��ZQ��q�j���4`�4�%}�q�MU� �����,�����m����2����7XZ�������dB$�	�9��
�M��
o^&*�$e#�O����&���eal��	����G��	�I����q�	����u���i1I��pfc��P�����S�S IDAT���Q��#�X��8�@�YW�P��APP��j�T��$
�Hk�J�fv�F���i�t���{m��h��q��E^��v��30?1�#`��\�S
�a5�3=��}��9���K�a�����������8~��H�����(��n�j��������|@���X�
�)�}�\����5�"8�?�f|��D��]���S��Q�D�BaXb��$����(:��Ku�w%�v3#H��^JJ���G�n�kb5$�'�R3�2�4���6��s�.@V;/x0�U[��-����#)l^
y��v��u�&�m�I��g�� ��5)�=rOg�4��}]�l� ������
eb$[+��KGS
�������Gg
���
�<�o&��}���
����:�3/x`J���v��[��$�=|�
��m�(�x�����lb���y��wqj���+0x����0�r��+�@��c��^�?��h�)B��Yb������W����n�}����y>V����� ���������=|����o����o:��p������f�V�����M���Q��k����s���z$'D}�UA�5�k�Ww��u����JE)hi�R���<�/S,8p�_4t���������3+C�"u�������')���.5[�4����?�_����mq���d��!���v������X5F��=�!�1�h�����B<}����U<`e��:����S��'+h}&�����$���OWe��T<�M0���{�$_�`@�_)��GZ����{��i<N?^A��Y0�<��]����[���a�&��������R%�hz'	q/s+[R������������/�9���������:��wU$t�����=08o����:q�F����,T���eH����t�0'�������V7��x`��	&��u��|���}GR�(p�ydl��o������Y��H�{��j#�@���Z�?�/(�l�@JLy����^�����6����+�LQ	Vm{"6���"P�eW�.�����1Wxp�V<������n��y+!<�
J����Y���<%�mpGMR��
)y�Q"4)$��7�hC��'����:�^���b���S��ZK	[B0q�e+��^�"����w��P�7����x����fr�`��m<K,l��G`�������`�#X�5��r�n��>�����r����x�i�a��`nf�OI"7!-�������+��Z�)�q~Id���S~R�y#:�q�L(>1� $�y�0��8^�f#W�	+�	HXT$u����@����5?��8���Z��F^�@��y�����.[X�i���P���[��xP��(<(��o������z}��[��P�kb�SW`���P����r�Z(N��e�Jj�����k�<��j���c��*-����0�@����0��YP������<�v���h#�$m�'�OCI�^��a&\��%g�����,�j�,�&��s�Z������� ��$�]Y��j������DH�|BFV�	RH(�TxPV��^i����-��j���U�PFz|
t���
�����|�]`H��6.O9��,%�C��Y.iy�*+�����P��M�$�� �@R;���<(�]q�����3�Bavr�Z�����9����k�~U�&��lQ�A�+(C��e��U]xP"�9
�H���a''x ��
�a_��Z(��L�LE`��%��|��O����������7�=��'���O�{�5t��P<�����4tiG���T�����;\�x��^�q7x�tZG�)<#�?r�J5�l��}��Dd3���l��i,E��'��IR!	(�xP�c#11��~�ah�%5�-'<(����h��C���t�	��t�Y�5<(���B<��e��}H:��'	�Aq�V>�H<p}��C/$'��)R40�8������<�eW�SC�f�����<J�|��A���4���4�Yv���F"��3�Q@(���"��/�$�e����W��q_g���"�e��y�4f��J<(n�d�������r��x@J9���
������W��#�e�%j�H�>< U����h����_
#�OMR_�}�����96�"�������v�������,��U��^����eI��4	�%�������}*�E<�K%�����k����xP>����J�k�����/�_������i��Gd���������������@|_���x Y���H6b��������;GJ���`�
��wB���}$�E�i��ix�|������J+��[�)���x �q �����[�Y�a��d�x ��>��q}x 
/��
<���x ���!���r�<(������<����.<����������z��������BK��[�%��"��t��H���nMd�����u�������	��4�Xv6�@2���H6b�����r����6-88&&&�������,����d�?�2��4{T�iz�d������+��P9(-����GLL����`d�	B�w�QR���/�r�B��|��+�?J��S<��|�x~+�RB��g%�++�?a~(y��f	Yx�	���!�������4K�J��|D��;d�?de>��UY��\5�&�yb�n�K��&�<��z@���deb$,d��X����|K��r�BUi��������K>�iAV�CXX���(�-Y�Y������giZ����f�m	�QrJ����G����F�t���|�yBV�Y�a~(�{SZVd�?da>"�����#+�����?���&�^��1�������7{U��������L!##�\]oRRW=���+W�*Nc$����Q�ed�?"##�����vY��/�����Y������Q����0.�����xu����������r.i=d��(���V���|��B�i����)��H�[&�Y�?d�?������4K��CMM����{��|D\O}�|B|?�[���?i}'��>q�	�Cq=U��de>�<%��Q����������,���!�����GF�J�B��|��dY���xP�{I(���o]� ::��3���}�=�������2�t�������7Kf�}�2�@II�d������������t���N���W/�G�}(-�c�%UUUi�,;�r�J��|D�X#��,����G�x��L^�V*�G�O_���Q~�CV�#�����)Yy�	���5�������Y��0����!�!+������Ai<��2��o<���������GYJI��T�4�Y2[�4W��'�����"*���Gx����|�y@V�Y�Y���q%�G��/�,-�uYy��~�C���d�d��'+�����,����a��-�.-�������������I�?J6��YZV�#e=_�i�J���{@���e�E,,d��X��a�*���= LT�����������L�?J6��]ZXX��GKfO�C���lH�����,��e��W����Gd�?����F�t��J��|D�3��eEV�#�z��F�t����P�3�eEV��e=_�i�H����r�������%���p]x�FKTF�Y�X	��b�5��Cu�\��b0~�P���AYQ����Q����*�3{x�����\ZZ�������c�������������B|b���
+��)��
_��S��)�1����2���&H�H/��/��X <:C�6E�X��


R��������'O�����J]]]j� �!��m��Q��E�+��(��bf��S�F�������b^J��RRR������i�����/�OH��
�Q���v��+X���I�]"��!/���Oi������z�8o�]b����>�O4�-����h�1����*h>R����la����k@�'�6�����jS������t�@��_cJ��!c�M|K����7�L������_I�#�$���K24�R�[�M}�%�����of~�&!��������ZA�8q�#R��d$SE��b����S`od&��j*7I����� o�fdR�����n�$��Q����"�e�.�5��+�|�$�|��B|
/�W��6?,��d��������#9�Xa���"�{���T@^�uz<�&�<�=�<��L��wzI����8s�K�2���V�
�ls�N0P�$v~ig��N��4+�r�);4��Y{�����bT��	����u'�<�R���FlFD�����*�el����~��v��ul�&e���QK<�
+Ns�����&���>P���&��.����N����x����!4@�@a������'��@��pV5*u��)�"�+A�����b�����2�U�C����R�-���c�E`���
q�/���n����RmZ-�>0��:��6|��5]�zM%1��>r�%1Qfe��� #,���/���I���'�s����kV�B��x�!��������P��v�+��b�^���"I������Z�d������*����xF2�?��?3h�s�I��U��t���
+v��5	< x@����*�"`�=���?%����J��bz@�w����&]'�xP����C$����+�x�uG�P�����=&��$<��.�:�����,������A��u<���eE��I<��wxP��$�< x@�����=P.��-{��S�f0%�/>!?���.��_������XU�
?�z��E�8���e���P@���(L�e	�lX�s&�ACH�/����.�y���p����>L6��#7=s�g���W�K*������AB��w?�#��<(�Ux���x0`�r9�:w���'��)���x0�G��t����6}�#��~�+�?����q��Kx��L���/����c�����H<�47@��������������n@�U��@EO�v����(����H��3��*��,~����a�q&��/��93�\X�r"9�+W2�a�V�����(��l�������wPL�\�~�FP��D��KR���Hi�F���mS0~��_�G�v����S����u�D�D��,k�N��8}(��V�~N�����
��	�A���6x���7),��g���#i+$=q���:��|�Z�Jf�n��v3�&���L����B�[G(�h�u��}G�3��D���@k^��vD��������t\vO���b3�����S�.�\���6����v�P��J|�H��4��������# ����s���i�i���/��N�y����f�G������R�a��=@f\�D��6x�<
�jrHM�DJb&���F�h�)�tR���d�����&�V;e�i�����)p��"�O��Y������8t>:�`�>��6]���&�"n�'��n�����Q���F� �����Y���FEsXu��w�P�����;$j�������~D�����,(��2A�@��$(EhX����^��~e]��~ �6��������+a���X��D-��=@�>]�6����Y���%x8av���<���
-�qX������x��8��Su�`$~E���Y�(Q���2��r	�{�I�)h��>m��c��SX��l(S<������/2.�4�����cH������?v�	8�����98�~ZZ:��C8�����<>o�O��9_PA�F�pA%���+x��z��5���)N����$������,,k�������`��E�b�(�����~��
�:��F�k����1{�50A�����[���7H"�`<�}��)+�r�(������-'jI���#:!��+$��l�UdK���f
��)%[|�%I{�j��;x`^�Vup���r���������c84F����G��A��+pz�OHO���
�<���w�B��������
�}��|�<P�7�b
s$� t����	�a�����r,��
��M���[�I�@��R=��`�[����4�5G��k�7,���������Y�^ieDe "(��$�$v"�&x`e�K<~����Jr��b�����_e%s������P�Z�U���D�P�'�P�[�@��C���t�7/xP����F��,d������`������u	E��k�uW��'3!#U�o��.@��V!�=P.������wAes3��F5,Y��o�����C	��mT�6�5t�������L* 9%�+�T0��5�1k��q}
O��H��_m�7��������@�V��T�.���o����?^R~V��g/������\x@����t��S����/�2��a�A��I�8pe�TQ�Arl�'"#=�aZ/w����8s������~�<�C:K�l�Q��%{+F�dg��~�6z�:��Eg7�*���T:}a2).g�AfF*�7�Qg<<8���{^\Z���h�.��3 ������@��s$�V<(�]�<�oS�����<�>��o��LLP��9�c�!��k�uq�OHN����u�222���qD%��HSS[������������{9���+�4��	�������".6w/�@T��";D�X�Prr���7hP=1���z���Mu^8�
���>��
l��C��p���I14h�o�q���S�T4���#s`i��V�'��	�F�^��������y}S�:�������������V�y�Y'�ASkgr����nXw�3)]Pe��Z �`Q������'�8�f`���#�BCE�k��q����G���-��7�a^����%��~��C���fbL�30c�����]x����b��b��0���Z�B������W0�W}�h�������\�3�������24��p��54�������/�c���hW�
=�B]U	sw\GlB
����5��)��6��	��������<v_�����w|{��BWScW�Erj�X�Z�����-yEy��~�w^���������������P��f����=����fk�����a����G#����;Sv#-1��G�{��/��w=��w���������2W<���J-j����QgV7hT�G&�+�N��z�@ICf���{�N>��T$�2�>��|����C������ka6�?�M
v���U�n�?��� ��'���
5D���#��
Uk3�B�oT��j���~:|������X8��Oz�k�q`�g�o��0��U�1�~�F���vB�N5�wkL�l:����wA�~g6�/��>B�ze��3�����G������^��H
���k
��e��f3R��)�s����u�`2�;��G���0������vd�k:��xG�me��hwxR>E h���Y�jg��+�1��"��G����c��B�
:�{�
�{/�j/�}^�����M!��
���a2�Kv�������P��B��|X{"�@��������#��c��H>�3%�V����~�V�4w�>���gl�7k�X����
U<`����wIL�g�����"�~�p�oX`P��-�Tg���������'������`L�u���Q��5.�Z�����������4�T���[w�D6����||���^Cc��1����u�A^^��
Kk8���}�g������-�KN���mW<P����O���4�D�'b��'H�w@�j�������C-5������D��#��Y4n���)*�)�"�+��n�t��+<	��<������7\�L1�j�����gc�%6z_dI��E��#��K���4�C�.R�w�N��P4.:Vpa�A���a����{l�dT��u��[�[�yr��N���'W���W����M��m����\/<H�����YsE��=�B'��=���
���"�
=���V�*�����G���ztF��3t�%�s'��l������D
�hc IDAT�SZK��k�����*�;��+W�F�\�@w�pD���.���.�(�����`d��=���������LRF�=Dq��������#�p�����������D>�<0vi������o�g+C��
lG���X�O��k��������h��9��Izf��� ~�Y�������P�Q���9�]#�P�I'"�St��fg(<x�>G����Bz�Xt0f
��I.�r������Ai�������/�p�y�U���(�)���nOa������ 7nkv��x�'^�C]���o���O2w`��*��gE4v��&5��w6 !%��q�[�6z���[���2)"$�&aF���T��������z��_�v��E)(V7�z�:�����Q	����AQ�[�c����H8����5�-b����U����4����Z��W�`��!
 G�����H}��Mh����/v�5��L�@�y5���#��Z��w�o(�=����x�
�
Ge2b���ckd�&B��!b����u+S]JH��Z"�����a����n_K�o����L�>I�����(����m(��T<���I�C{e�HC��t(����"P����~�����'�����R
�yd���Tz�����,�V^�X&��q>�M��
B��
xt,����r
���=���RZbB�wT�����Tq�����c)txC���F(���&��>byk�QFR\�����+f��R;�M�����G��+���=�'`�D#D����AZ7��C.�����q�~�q�~<�g&5@��T���M#h�6C{�BS]�)8y5����N
U�'�a��(�����R���K{��WE���"��`05R%H<	9�[��6}c�!v���@���Ay$]���k����PA��OH}����XE�����3�V��b��&�\R}il��A�����f����P���V�.�zb�##D�M������~�DZ_����o$E����;�������?y�����s�*�s�_����?��mwTn��	������?�A��cg�7�&�n����P{��v2�����3��3����z"��K�]_m� �;�z��f<�>���A�0}������������5N\f�j���i~
�z��$���/����#����_z��o6��BsH[����4�����E�l�4�]S�C�� ��T��H�v��A�;��1�����bk
%{k$\f��3	�t�
�����P�xIv�6p���#�������&�� ��Of.B��Yk�1>��Z���\�_x0~�{v����q��h�<��y>��5R+�����S���>��/��wk�$:�+���'��!��U�i"���A��
n��R��z���j�4��'�����=�N��9�6����6�J{�n/�fj5cC�=&�� o��a��L����n�D�M���9�I������7uW��d����,po�4$}
�5�:�k��?tk��Z�!hq|;n�Nu6���'���+���dZ�dk�:=�C~��^�d J-N�@�hW����M�e���>m��.�}���lF�q�������|�!\��5`�>Q��C_R��WQ���n�1���}F��_��vU+��}-���O[����������<%~V�T���w��kR�:��=��6�T�=.���J��"=�<���&���~G����k�L�=�='r�uV�\5�&l^�+y��.�a�Wn��SFc��}��_7��x=;���'1fh_��z+�L�HJ����?/�k-~$�)0�����K>�Mh5����l��%��0
c�/�����&E��l�L?KWo�����������\��L�,�����7����"�[����B=Si'
VT�<&u
����o���&z�p��(��y�UM��3��9k4�����J��Tx���>"�����|xu�����J��'}0�����p�4��]�

J*���f�$xP���3x0��`<�{�WA�0�5��P-8����g�O��q�E~Dtxn	�������9�����:�-	�Qb�F9R~����6�
�G��B�����y	�F���m�#-M<�Oq�55��7��x�q�C7���%��p����S�>|��������8x`&T���8�M�����9tu+��m:������K/Z����GG0z�.l�:
����u���w-y�*?�`����r�/T!��#-8�UC%]cl�{���K9�����n� |�y;::��O���#��?��w��;~��{���jR�hS��^]���%��f�A�n��
)Nj�?:�>u�q��������F}�*������<0�S;��p�C	E����}�{b����2����8�l������O0��n�� 4:�������\�����G�<8��5���Csz��G1�6����~��Y�
������S�>���!�s�^���w0��x]o�-��!,&��F��]7������l��T�;�����J�k��QU<��4,;9!��[4X<W�����)��5��/9<�*i��]���W���A�?����
��
�p�����N'g�\�e�xt����5*q������sE���u��C{����n��������g�y�	
~�w��6�������v���*���~;i�hO����q���6�m,����P��~5���8q�F"��}|s����A����F�a��������M��E�����q�.�Zq�{��}/$x�#����O���fNP��DJ@�-��qm�����j�$Q8���p�����|����~�����(
u��<,��O��`�
�6�F��@��WxZ����N���{(����x� �`j���~� d&�|���W�t}5�]���>D��a"00��y�k4��~1����n��{Sn&��Gv�����W@�m�l{"���:�u��8�S��z���Qq\����C�:H#hC��7�������"�I:2��z
�(:~6���x����8����w@�y��~05�c�jx����n��}5a�1lZ>��<o�m*�����������3�o����:���'�!6&����p��]������c������b�i[�9*�W'� ���N��	�X�woL�}k����%�����.���7�>�q�[,O~����Ap���5q�u ��}1����}[ 8:��^c:AA<�`m���t�
����y��  >T������lS�(�����/�B�����#�-�������c���8�0�`���8��8�Z#&<������9n_�^�����#���}����%��j�C��\2)������[�=��i�N��^�hA/#2
���!��Auz�+h,t�:4;�E��'�D�@k�8��RD���F#���������=�=,�
�J��#�h��A��h��T�2iS��b��z����u�������b�������;u*NH}y�T]j#j�n5��B,�/h�,D	kV~�A�is���@=/����if����6��J�LV_��A����6�k"��'tW�D��mt�]��q4gPiO��O��~��/�K��R����q���K#D�e�XG���a���U�-k�a��8iNjT:nz&cP3
�F��Oc
�9��.j�b,�i������~���3�
�
}����0�v_�q��p��w<>�1�����ek���ZY7E-�����,���7N������p�u<�N�����Vk�Mvr{�y�K
�mQ���w
���i������
�Rh����@�}
d&������6D�^W(�p� ��#����4���M���'�3#���S�U�'�����6����G�mu�7�is��P
������k�/������A���N@��
�������`D���<`j�����I�
���~%h���|&�b2�@��+�l����"<�����"�{�A��c8 ��v6�@%0s����q=|����
/�]A�niP�$?�gr�����Uh��Awv'4���)h4P�	Z�TC��(Lc����Xf��yv*�=T�xq%�z�p{�p
O�rLp;����:��gp�"�U:�k�<p�W���
_�F��j����?���a0&X�uCM�<���������1����@$�u0��.Vl�WQ���7�0�W�s�d0,Z�9�����PX�*��D	��~	��7.
������3	�m�������PI7�������h0��6��P��+Q�v`���	.��������%h~o���4��	�����J�?J��b�}BFD4	JH��i��H�����)�[a�H��\WJ�����{S���^x�0n6�_�!����L������5c�{�w~B<�/������i)4M�	8��m+8x�al�=����rA���?Rs�h���`�k�,��;�F��W��6�a!P����+%�
�w�	o��h�����	B�1���X�iZ5L���p��I��:������y��0����Q)y�~��&�����/�.r��<�K*��A1�(�|����6G���>�h��L���/_��P���m�
��^���h�73&:���J���)��I���<H��A�i���j���@,7�L&��N�	�^�	��; �����h�--.���E��SLX

�Jt����f�:�,�^�
u������0'�YhR�s/��kyz7�w��+$�,�J��)8/��7��=����k
��iq|�u��?�:��:
��B�.m���A�i�{5���{��g�m���7��/���{���������&Xh
**�����{��K�Xc��$�k���������
"�{����..�,���}|��3��9���y�����fCT�����A
6}B&�uU
u�P�C��
v�"��_����/��eJ�.
<`6~�vZ�������`��u�v��/�}O�$4?��:
��M9����~l���A:@D{��/r����_�
%������Ze������'1���"<hv|.w�2�Z��^M<��������S9����(���c�>�6~�qH�v`O���~5~�������	�k�=b><G��'A,�>=�f�b�z�������)���������kE���y3�����}�q�j�JP��L�<}�
��@;"�<�DZ�y/l�bb!����S�|	�k2�?��5�e^�	H��u�-��[[���*��k����v*|+����W���>�h��&�GcV�=:2"M-,9���y�Y�	���qtEW�fp{u�^��h�
<HKK���tB��5����H��.�K�s��"�frh������0�P����2��o����cj�>����_'�  "/���������NH����5$��}QJx��v��3�{��i��]�/)]����
�5:����C�Q;�����zF����Z�
j��"�s7<|x$�`_��R�����E������)��H �����t���|i]f>L����HbI�D���=��b����r� 
<�la�Q�{���]s}ZUr��H����Ri�.UsD�,8O��<|��{�w��f�������6}<�����eJ\-hi��N&��
��EEK8����G(�*b��U09���G+S�n_>A�XMj��6�t���N��S�I���k������0��X��ja+�e���-���T��L!��w��R��Wlq(#��zt"m4�����S;!26���$������w}L^��z��j
�T�%����U�����^��@���L�	��*���OW��,�m������8x q�`��"�k���u�Q}j�S;,���d�?�|���*3�.���A��7\E��`�Zsia�+�&�:��v���s�B�d�p��|�5l8�PyD3�Fx�������@�����A�w������x]��.U�a)7o|�l��I\�h�L���w����"Gk��\C��f�A���~V+[L�P:��I����e�}�,#$�����.�w�e��w�6�#~������Z����+������4�$������;�Y����������_�I����o�~~b\�j���`u�ZFf�Td�z�?�Q� �f���'����G0;�S{v��v,E
��2e��v�kP�+*h�#��cWR7V_�I=�&��n��po?#�mfgk�/�70%�:tR��(�T<�oD'���shC�����go3mh9�W������<�{�F;���/������2�'�khcA	�V~���T���\����������P���C&l������`X����e������{����^60*��gGH�7�"��_.�Z�C��<���+�r�#6��+�9���NZ���_��j�����������2/4g}�IX���kx���#���"��m��t��$8f�kx.k�
<�����/QFG�H��z�D%'���l��r��A��U$�)#�V��E�S��X
3:�#k�<�����]�#��W��c�v�����[1�����x0R���}��8����Q��x���	q�o���1W#H|��tHy |�V���
-JB��C������a��vh��i��[�2A��?GZl,�H)�h2Y���#a�� ��E���L*4gP�5vj����un�!"b���j
Io�B�F<D��]���N����7
����i���C��'+��) h����2e�����l�H��i3��g��`�HD�}�Q�U���Jf�N�t��	G��Tnf�\��H���}-��C�@`;)� �����j�T����g���#����D���cm��#��d�n�����'�Q�6�����w��nU;������<h�}.g�����d"�x��Rk������?aQ�9x����^�A*e�����U�R��`6����}m�����)n�]>v�C�#z�t��F��?m�~�;�H!�TRI���FI �@��}E'�	:��Fjf4�cjF	
hT����$�G7�@SPH�H��jA��"�	~#j>��"g��S�5��K~����7�
�6��1k��A�j�����q-��Q@%�hS>)>v�5��jL��H��������P�#mH��~H�z\�A��e*I����:�EA��tTj�~a*
�^�7����<�'!�7Z�Ha��c
x�IA�nZp���!��w�0�V��;��j�5I�!
Q�i�#����`i��"�S*=w����x�M���
,*���S����u��`H���%v�M������T�t������'	�����5��b�{kM���R�����`�<���kv��J�K�N_�A����"������?A�<�n�{
K�x�U��"k5�����G"�-�+���g�o"�~%(�G��Y��?�4�Y?�[��%�R��u1���:���������Cy�[��L�V@��D�M����[+�;�X@C� �x��Rx�E�9���\5-�W6����������'�����B����f�A���8x��o���*�� ��}T�?�T4��A9g����%�����a��/����'?�~��>�
<�#E�m'CSS���e��D��3�z���N��~{/=��C6�J[�e):5\���x�������9�3x���*��z�x��X��3��������]ABn�Am
���FjCB�i����e��S-%w�`D�l� Y��Y��<q�L��8m<��}I��$+��S�����q�R��n�\���mP����H�7|�[�j�����t��u3��5������JM���I���F����H=!	����|�>AQ������Bn����~�?�nX��}��a�`R����zI�e�����i}H�_�i}�����i~��_o�_�0��Z IDAT�����M��\��K������Q���kG�r_-��0-�S
p��������}Rd`����]!����!�l�<� 5c��d���Bn��;��
F�U�j�:�g���&��#^�F��q��XR�����6~$���1�T��M�G������sc	-��9�u�$�mMs:��K�8�����YF��!umzH�&B�.IF2h�@_-���,�����DjM��DJ\0���Dr�<}����N��L5!k�		�kz�����O^r�
�I*%����
j��,���r��� 1��5T�K�f@�hKd#���p�j�������P�m#U<�L�-��du��<���.<����U��Ru��'C�1��<���E��q��l����E�#��rB}�q�A)��?.������7��N�� ��
r�`��;
�f��A�U%<�Q�	.�x�Zv��P�#7� <��t(]�����#��)���e�Bxw��U��)7`~��$���>�������\D�a�pz������Z��"�/^������{��L(�������P�JKr��u����k[�Ti���A�z}�D����
��$�	�����Cx0�nl�{�Z�3�7\Y�����}�V�p��;����;�aB�f<x�)���D�5��Ai:�����A
,dU<�D�������Sw���[��D-k�&%q����`��[|�>��x0��3��=��^�\U��r�L�`)�0��:Y��I���
��2$��)��}F7r���X�8R<8z�5F�����;�;fm����9�%V���$��M>s�ZP4x`^�<R�1~ah�y,����	Ub�M�+������
���P< �,/�|���:��S��D���x�}W;�-k
]����Ax�|���hT�Q��I�&�pw
Y��GK������U�����9�8�.��������C��9#�k��-�QfFR��>mfJ6�+�%������\'0�`'
#����dS< %�O+����x?y%W<�|
��h��\0���HeU�|�g�G��F���$�^�[�%RYF�j�.�@J{����@*7�.<�07�J6KHma�I�:r  �N�;������;��gJL�������x7i%l�}�O�P<��L1@�2�D�z����
@�-�B��4_xz�b���mL3�Y�k��r��T
��M�5��"".?���	��`.�����cn&x`C
9��l�A6�U���PX��
�ik�M��DfW<������x``d	+[z�<q�����{�w4v�	X;������H���4�*��������GaV��������h����8�+\��	M�����a�u����n\����02)�����PVXJ��4�P�F�l�����c,�^V�5�-C'\>�MZ������e*i��Sr1���b�:zki�H����Lq���i�xp���X���`��Bn���w��e�����2m$���"��DR;P�� 5
#�����
�v��'7���9�������A������L� .-��-:!�e�m��LC^�A,����Nf.��
#�'����B�Ms�$�E�]�r�������S[^i����5nw����<,[��v���+7���>�i>���+bN���S-�n���4�'0�
9���U��)'D��=r��dh)?�r��Ax`����]�Y�:��S�/�(<P5���c9$�(��C5?������])�������lT�6���k�Z��wi���@!����x	�H�/�i�K�L��4����TI�@�i��K],?��,�PT���Eo��Xg+*�����$����K1����p��
M�*}v�]3���)�;2
+;/����v���HC�������r�L{��o
�0hT��F�2�?�4<�n[��H���kR�����Mn��,�������up��D�@����#�!jO���A��-�O�vG'$^���]D-=��v��r��������{6���s�!9br��?���uW�Nuf���y���}��0�RHY�cB|RadI�
��'�u�pf����Q�
��ME�V�����,@n���l����*WN��^��S�kB'�����<��K�n���Le���f�$�<�
J����B
w�'���&�LP�.=���W<8O�=���8c<�o��`SS��{(G.�3����j�
��'����w��!7����T���TLj�
$�AYu������	@&W	~A)hVW�3��-P)�P<�&{'Q^���u�����3�/�%�a!�,?Cr��� S�sT�4H�^��Q0�����B<�<<x��	��jA�\����Qh<g�s��x0�b�B�����+����9b� �t:#�fW<H�5KG�e(+L!��}^�2����!/��B���!�V��R5\�z��L��B�A\���B��ow�P�����r*x��^��yx+}�%�
��}�k-�I�����P�q[�������?�jtb��O�����Hn�A������2�*.�\��^��	�`��q����7��W7�*�������6���)
6����OH�<oei����������Hmym�.���[��?���!������4����Rn�A����������^����D�:
1)�yP�]R�i��o�_���,�\��{u"��T��U�9�m��wG����g'�?�z���!��w'��Z���P<������<��V�\�z������!)�W"�sw���>���MR$���'hE�
+7r���#@�E��{�<�C��fxn�A�rm�u��u�9L����~��S`;�;w#���B�}���s?�|�
�6����\����.��Gl]��Z�<�YnN���]��j�����_��a�0<��Wf_�lW�e��JB��U*r����~��G��t���l��(Z����%X;�|��@����_�����l�@�w;�����p�4)|>(�\w�����	��tD�+R���}R��p"���b��� ��=X�x�H����[8w�&�.����?I���b`��M�N��-����-B��yN�F�:���u;0��1<
�t���d5��:s����IL����r���L�
9�*(7���<�M���x�aH�U�'�%d�U����q��k�����O^�E6�{}�%�W�������9��I���xZ�&��	�}��?����������M��Q�r�L������*����������`��?��h��o.*7���/�����T��M����A�e%<h�XC����#��c5"6]�4�Op��F��K���Q$A������w�v�1��v"PW��ClRNx����y���d�m����N��3k���<t�.�����d��=tz����S����L/����'Wmq��/��:�B�,�L��{��D���D�<0��ZX��/�b��s��gJ���8|�gt�������eu� M��K��H�'�o��th�(���h�8�0<�[�/bc��P�1n�����������4�`4�8�)Y������Q��*�><��}�a����D��#��I��5�����A�����+��45G������.2��n����J%�S��N���f�������d"����� ����rr��A���A}�zm��a���

��n�h\���O��a���XF�;�FBd\������tj%K�<��&�i���b���%<�jc��:���Kw_~�V5��p�u�S=��X�D�R7�y�w�`en�^�����W�epS�����!kN>�����g�a����w`.&v��(J��$�/Q^9�;K#���������3L�\�d��YCn���LPgA/~�'��'|���D�����KO���')�T�o��2M�|UF�<h�rb>�����'o����[������6�[�U���B�cNt��|����7�m�O��O<F�G���Up����!���4�_p�S�e.^�����-1�G{���h\t�Me� ��e��&n���wrM�5<`�b�
D���������h	x`��1[�p����m��|nG��g�a�<$���6�x�[�����[5�_g���N��?X�B����O������g�S�����(y�6�)]�w��M�����L] ��0�������0h^�2�Cx`L�������-���M�����?�������0���� ����`j
�O %"e��A�?0�d���It�j�PZTOC��W�~�+?x�\��EP'�:0�Y�����.�����H!�'��7����[�_����>��$I��a�l�����!g;�`��R��8P�S����)Ch�Xr����=�������fCS:a�M��D�,'t����O�}q#��C^��\M:f�������<pq�As���-���������ejfi���A I��[T���I�j��������������n�-2�%7���o�}&�l�C���3�Gz'T����pw��SE��x�����������$���E���3��,[��tE)1�:���9H���$����h�s9c.\����#�o+I#���t_MoE.��a@�wi|tw.��4�zF��x���9<H�����R���r����=�<����j���C'�oG�-�aJc&K�M� %$�t�����E'��H�@�x{���A��7�s�"��|�����A�n�q�
����g���n&xP�����������ii������S�Z
DlT�k4��3[���d�_��=�3�	\��d_:�M������f{g��${�
�XD���E
f� ISx����Z� "��!�����'�������'2@:��T�Wo���Q�9w	j�U����X9�4�A��L)!'x��������H����}w�"����ua���[wA�]+=��)/�
vRm"
<(��9�^�/\z�������f�������ra%��[�W��F�/\0��x@�����N�\�>���0 W<`A<���g�����C�T�b~��?o���/��/����h.��N�#����xF��Hj����y��U�Fj��S3Xs�d��S��6!�:h��gz5���xp�#��#�R�:����x�����w��XK�n�af�/������G�*�
R��3��x<x�	�&����:���c[�����
��
)<H�qD��Z�F�*����F�E�COKLm����]_��mL�0��7���
�����7�E_��p��������V����>F�d&x��K�>�v��AHy����I������x��J
 ��%C��K�jlO�[)�������#��>�����H8�UR[�j�������t����&q5���A��K'-$�6�-��)Rj��t�h%h����PEu�%E��#��N.�$u�f������@�4�*��+R����ON�$]3� _�4��K�"�����H�I����]#���AS[�TUQ��w����JB��%s����������0���)�_�P/��z���]�H_�C�{j��J
\�d@<`@��%�M�N�Kg��L��)���m�kL�R������
���v��!�a_�k��y
������<�|	��0�;�r^�K���1����������R��r(�zd�Y`��c�#4"zb5�=z��~���)07V��Q�Y5	\P�1��D�	�p%�A!)�&����"l9�8���!W�rw�?�=�TiL��
�������
�]�`&�a�?A�6a�'t2�7ZjK�D�n��r��Lj�?[��4��� �@0��tr�`N���YHy��Q�������o�D�nh@@N�������������=E.9� j��8_���<���=�o2��{��7�w&x��o�Z���UC��K�]?��
[��wg����0�iH���{�����0��+�(o/z��"�5&�mcS:���{��@��Ir��hS�.����h��<[�;��t���������nq��8��a�FC�:�)RN
�9�D�@�c�a�~��?ws[�}����������4j���5_��<P�����UIU�m2�����Q}^��������=������
����O4����^V����zP-<`���Bnhi���aLo����o`@�w	�N����{�[d�kn�A�+/$���3��4�G���L� ����'��d���5�Y�\cm�1�\Hx���<�[H�Y��&[Yx ������S�F��;�[��l%�����$��d._����8���Q�uS�����A�tcPx@�����^*x�x������5-��"��JKkR�U��y�����a��/?�L:H�S��Lv��m�3w���x���|����27�W,���sxY<h@j-��H�����_`���+��FB����"H!k`�St`�
F��x� ���P��+��}�,_� g�"�R��N.	2`.&�I�M���^���OA�!w2�g�/r��m��n����%�����,s���j6``S!���T1�{���[����b14��(��0�j��_?��5���:~��
��Dr����<����	P(��&�,�r���T�~|����vDyeW�+6���L�����?�����l�v,�)����[p�nf��uqFcW�l�<��y���c�&xI�O_���de*��r��������K����;~D_��hiA��L^���oV� ��9�Ks��W��-W��x���J2x�������Gn��K�������w]� �<J�ui�Aa�������[T�������on����Oq�[��8�Y�eeu� o9�4g
�bm�'���*�7du� o�I���F����nM$Ep�Ix?�?����)K����Z�5e�'
<(�6�����������("Y��<�%�2����y�Z(l�2��<�)mD�<(���e~��B��2�<����ku��Z(�6�Uy��7/W���k��x�5�%O�����%K���dI�5�4���y�?7�@���#���_du
 I�FnR��]*�;w���c��+7�f�|�G�<�����Y]-d���8`��l���?����0,���Th7��+)C�������.fG���\F00��L�@8lQ���6!q� �8��7-�<��
��W��`e�����x����`��Z�o�1���&��
��.B�2N�){��\-(��Px �����w Ir-����k$w.g����i�f��S]`jIe��+g��M&��M$��<����*����.�Eo��Q�(��x�;**<���x����@��$����6��kT����P#5����!�����Cur��T"�{d�6(�nE0wf�kC]W������@��o�'���~Z��X@d�(<��Vx ������<P�H*���%���x }�A�w���'�}��A���k��_���xPV��<��V9c
���������R��`������o#!�`�b���nj<��Vx ������<P�H*���A��#��x���<���xP�=&�Eo��Q�(��x�;**<���x ���!�`���c<��jB�Ed�l�����*).�
��|,PI�rv����9m5��0�i�-~rr244�w��~����PQxA������������.�Kx���C����@fHKKC:�����@�Xd��]PV����nDAd����+AJJ
�������|�;3�����z����� %-U����s���8��)������*�����!BT�HQ���O:�hc�(�gn�
i��������Q�E���]�xfV�
��>���Q�6�?55�>VSSSd�����?�������b�{n�[�.� IDAT�0�F;�����Bn��z���"�}�����0��	6[:_i�Q:*���-t��� ��T���Cn��R��Xy�m�@���B+l[��C?��V� ���RI�
mSa2��h���<�oi>�����1�"������W�������vW34��[��T���S��q�-���&A�'����G���|7@���Bqe��+��R���-���Tz^���j���&5E�G�O�71���HY�m0J�9��������/�d>R�r�#���ae��������JY�e��o}>�u����Z�!��'k�4j
T�d�WTqpn�E���\��<!�`������b�K�F�<6�y�Vti��?BBB���mm��3V1�,�G1Y�"�GPP,--eLQr�)���,���Y���_r�5�C#ce�2s)�����,�6���(��Q>E	�����&B���P���0?,9cJY����d�)a~(�GQX@�#�.�r(C(�|�k����(�xB�Jk<��]�,/be��S��P���0Q�����5&�B��������y*K(�����,�8.���2?��E1:��S����P��/�����2��(F��y
�C�mW)��?��aQ���T��P�����+�8.���2)���������<|�x��������v����E����,��)I!!!�S�FFF%�Zr����!W!E�HY�#<<:::���*b�m�E���,P��`����P���m�C�B��e,"&&��d
-_#(�Y�,����E�e��0[���Q�|�j>R��<e�?��?��H��oQ����H$*qk��[���j���'�G��Y�R
��S�w����5�0?��REOY�#�R�?���/�������0?d�WT�Q��Q����2a=�5�CP<(��$���Y@P<���,D&��@,��$��@����`5Q����5���?�m%k\)K(�|���?J��!��KN_��(K���5���(9��,�?a�^r����W	���5��e>�,�����2�G��z�zV)�|�k���A��BmJ����w��L�����KYk LT��P�����-Z����?�����E�V���E������!��7�ZY�C���2�����G��?�e>"���F�b�Q���(f,(*e�������G��x�����\�e>����x��)�����|�n&�_���@Y�C����q��!LTK��R���K��R���K��R��P�����\��
a~(���- �m���'�G������0�E����'�g?E�V��P���(zt.?e���A����Z�@�Z +x�����-��KU�4���.GS[�#aaa�o�[
�21�2��?�ko��9T��#�O]]���T������g�F�]��z�����B��1^K��#�.7��������B�-����f����E~���?"K��z����(����fhQ�Y�2��������Q�uQta����11��C��6?�R�L���"����m�p(�M���>�XPSS+pZyh��#�7H��R������q_�?��k^�����=��M��WO\E�������{�oZE��w�1�HM�������?��������#E�I���b��x>�UfTHy�R@�ju�r|-R�
�L!q����8�b�)�N�f���������q�=��SK�|���9��v���_amZ����?
[���W��P���K�?
;�3���������I��i�7*��d1�R�G�8+X>1,�V�|]�F!)E����GJ_Ex��"�Ka2��?^���olla��+m��$h���
Q����E����{[g8h��]K��-�n_E��Y~M0GP<PH
��W,�<�:����nWkS��8����B[Rq�t����=8�t��\������������/b�
��O�&,�B
�.�oco"��F~�J�u'��P�XhB����Z�D�����%��at��Z,ew!iu��.�����<
;�<�N_\	W�
~T\����=�J�S�	����e3����7^qE��y�+�����+BiCV���F=�zV���E���k����
x�(c;����N(*��d>k��j@R�n����p��J���P9�����2�����y��x������K����a~�@��%>���&||J�;�T�c��as���,|P�/�D��U�qz#�7�yhnF�Q�9������v���p�-w��	�@!f2,P�����q~%��YHq�� ��x������6��=w
����_�������(�xP���P?�X@�_�@1=�A�-)������`���A�����Y	xPx;�A�6�����x�q�!�o��-��Y������x�{�����#����������V�*��.+�h
�����c���yo�����h�Z���������q��]��a,�c��n�^hjj"5%��&)a�&��C�	���w�_(<0�-���]q��� (�m�2�;!)6��4��[��Wt��	h��H��H�'����������pT "�����Pp5E�+�����50��E�j�����wgN��NZA�T<������o`�s5D�"�zI^Q4x�Y��1	��f�����1���!-�����g������H�]�/)�~Y3)�`���m���;��,)P��kC]}l� q?�u�)����r�%�v "6�@��Z�{�o���(\z�@aUP$x�d
��{B����} R�M��xw�!Tu�Hx�
:
�@�\��c��a6cB��d��~�t���X_�o�
�����8����[A�����' nZ���)��q�<��T�q�hj_��G��Uk^�>r�+H!�T<�����`[�%���F����
�.9��?\5�(����D$\�vS���������r64�N8�bR����@6�D�s�����d�LG��q7r�[4.�	h����'CUG*T������A�D��A�f��*F,����:�u-?$��Sg[`�����9kzSu�o���#���8�Z�&-���:5����E<�]8%��Mqpw8"#2��4Tq������*PR;M�.��G�b1l��.W��U���-�?5t��������a�oT�/]����� 21w>�wtu'������3�
Tc��"Pm�!|.�"�;�3�\c$E�AC�
]U�?+���Y��z�A���>����� ��U�q�oRU����S��t�/)X:���Mex?���C���__~7�n��	1���+5�m=#<9�5����������+"�A��n�{���$4oT��?�����b�Lh��{��M�6ah��g���$�������n�����oF79C
�k��E\\fN�-���M���8u��M�Q�FUE�/!%��|������E���M�#��f�`�5x������g{��J��x�?}!������P�h�����pz�,��?�D�I��X~�6~l�����6����������S��xH3���
�^�K$x0�^k��y�R�,xP��"jU���n}u�@S]��7��_r�0pa���x��]A^qr��{�TL���
t
�H� �')����l,�Rz9|�>���'�:x������@�E#��cqn���E]�8Z/I���n��v����\F�ml$,
�`Q�����.�l�S.��[�LZ���g�����<xw.b���u� =9
��?B��F��,	�����mo��b&�E�c_f<p�	�lE���_<h��m�'���|R�F�j���[�)����.���.uu �U����!�N=
T���E����9�m���bh)q�5����	���_���	��_����O�
L����o�.�TT�A���<�������hsv}8J��;�,CJ��A���xy=!���#f�cQ)Tt�m<��K�I���I*xP��0|��� ���2[E�z����~<�C�:��A^`��ii�����&Z���VNr��@�.VH$�����(�9|�����aC'3J�����~�{���v���I�>������z�07AbR2W<�07�����������Gx��-A�h���>w�J���h���W�����^�������'	w>CA������x�{���i���D���<���������
1���rZ _�@EM��
��b#q}�t����}��RTi<"=c����;g#-5��]�9HLi����~�p������E��([������5�U�P/tj@U��� <(���
<��6���si����y�����Z,G`�������+�)�=N=����x!6^�M}��eiUN���N_�*_�'}pd��>�z������!�Nq�� -.jz�(���G�\-0����g3]=Li���m�)�=�~S�3��<��6�&�M�~���q�U��sx�c���Q_{�B���ph7�_c�A/�BSl�vc���bT�5��������W7�}m7,�[�,)"�i�p8!�lU��<�GL�[x�]�_u�]�M�@���}�������+�V�
:��"��-$�������
��B���P10�x�X���P.�%��j5vU36L�����NM��b����'�����P����+{��g��F]'�m�|��Z"]�����5<8�M���8y)~�����f6h��O!0&��G��o~�@��t��Ue��q���~OBK��w�$*�����H�Q��Ka�O������#>9�I!���`��XX��-�\��q.���K��!5=
�������m�
�8����P��@Zxb�����j���}>P��G�t��T�.o�%@��N;_@Zh"q��H��J�w�R|b�;��N�i �m4��~���:��������Hz.S��R<�jZ�J[�[.A����TA��G$?����//����*�����}7���!TD�P��B�K_$^y������-
'���~B^����X�v
uU5�u��������$x������s�A��^!���Z�����������C��������x�3$c����5�����!�a�7\�z�.�E�|��m|����kA��
�t�$��3�����{�<N���������Vm���'��lZ�7�����O���4i.^�������KG'O�F�=[�{�����W�hS���
����v\��?,��\0c�*��9�LK�1?y�2,�����6���c��38B��e#&CGK���@�x��z]�E"�}����b]�}������+�6j���?����7�6&����.4���\�ax�NhF����HD'������>u>��a��A�����[�:y��oZ�&�����B$���cs����p���
���W0�vO��sw�C5���oV�]���O�����E�
<H�JB�^*R��K
S���Z��N�jB�����RI���N?zF��"�T��������"�G'Cg�=T�"K�M�@Gd�6M2�#������=tk��p��"�h�1	
�;3�#��\-��H��,�����s�D��U��O]���q��99"5:��f��+"�AzB"Ri�����%8>��s���q:��{B� �����M���i4�B�����1]�=:����������:�a���i�bba<~�������y����L�7�#���	�=���)���RC�a8�'T��A���<_��gG$z�C����7�.m�����/���Z�Ne���:(`B���g.!��7�l�u�	?Ub��+�uD�<�t��D.Nq��&~���P3���Y�Y�Z��md���o�[onus3$���l�D����!�O���H	�
=�
�wC�3w�����k�_kI1�?P��^�v����X��0l�n�M�.�}?AT������m�h����u�����F0��M�a,S����ZV0�a��]q�8�����Vc�|�
W����&��p�AR6���F:����=�������o�I��*ZV�N��:kj�{m7�"B9�`L�Y�\�{|G&�����&���������A�v��������H��HG��{��{��;�)T�06�"�����`��������5�{p��L��2��������������'���E���5��XW��TpmGRD�$E"�U3����	��N�?��o�N/t��W7���W6���)�F&���#��4h�����"W����&� z����(��p+�U���c���OB�*o��i�*Y2�G����*bv�!=6��"�;[ �fE���nK���s�U#u$�����r�9����D���R9������4^�����"z�/=�����
�&&\� �I$�����j������G���0C�a�7�������2��)�*Bn���}v�6S�q��f�D�n^���4������5��Oq��B�WR����E�1�V�RT�0x"��{j����aK�Hu����������K�MZ��RUmn��B���!�M�p�z�CS�������O�i�Z��7vz��@c�
eU�O�U�0w�)B��tO�:����H�KG�������q�x$����`�Ds��������
�^�F�2����h(=���u���&:v3@P`
�������	C��b��0�`�x3��K�1� ��J|}F�jj*�O�*���Zu0�9p�P�5��}%-~����a���T�������h�� �j46]�$D9�;����	=�U��~,���<d�a���X�+\����L��]��D6'���m����ue��o�����UE���&��%y���J���Wq:�	+{k��eHu`��!���(������pf��������#���������x��kl���+X]��Q
+~�N��LC�N�|>
���4���(�s�����:��p��C����p��#�s�������{�)���]9���������@l=��G�Cxt ��_��P�|
c^�;����������P[�����C�k������ST13E�re�����G�-cj8��O��zu��x��n��i}E�x`����NU���Ghic��6V���or�^�}���u9��.�f?#��g4��_�2~�y��u��#Tq�OT~�~+�vK��x``��J��yR���x���}��kI���'�aQ��y��m���}8�&C����V����R�rwj�3����\�@���t�=M��3���SE�^zx�9������XOMJ�|d[������3�/�t�h	��j6����cI���H8����(6���{��a<x�����"�i�	"��g���~�<��5���~�u
�����V��bKT���?on�Y���H��Qa~��w�5�,����v��K���7*�w���	���P�4�2���zm'/����8�����4�`z��0��'?�����&���#no����#l�3�h����4���Eo���]�<�^=�������
���ZX������on��������a�~�����3
��\P���xt|#�"C2���^�`nW��������5tLqv�d�
�����;������a��*�k��0����;O/��P�YO$�E#%)������q��h0p�����'�������>�f@X��o�����v���p�-W�9���@����i=���\����0k�(����A�;�������%��=������M�3e4o��g��d5&��!�x�\28��a��B�$&w>���4���������/X��<���5��z+���?��"x�}��+�������2�UD������t�<�-�x�^NmG�����|�vx��,�N��c+���U���}������^#�c�����n77��Ee���":66e��m��k�b�����
��8�m�Z8�h5jZ7�W��	f��������FSbq��Ytw�Hq��L��������^g�,!'x�h�F�;�#�Ll��p�<��
�������0I�����S�� IDAT-�e_��D%�c��CX��/.{z��}eL<�+��6-���\'m���� .e����8A����6������$Mt�B@�+P���G��;<�����=B�);qs�@X5���w��L��M	�I��H���P���_A$�r������)�<�jj���Y�Am��\��-� �6�������n�
���H~|G��8y��f��������Q��(S�:={����5�2f9��1�h����������79x�~�|����y����2�)/�`�����qS���9m��w�f6�p.e���l��aa��G�����-��Y���?}��4N7?~�U�xy�s�JXr��U��'��)�V�����0������� �
��hnk��������p��G�
�@'�!Ki��
-�L���E/i����B`8��'�F�vR��<���j�t�x3zc����rD,��J#M�{Z#����k#�Y"�?��8{� (#"	�Vh�%����1��2�c����9�Q=$�}����?v���i��G���q%�������x!�+�3�"����j��������7��@��Ax���ul*���a�������5�� ���7��4ElRN>��Z�����Q�����j�8d�Ai���p�4~�8��]�g���a5�������s�L��;*[X����?�Rz2����^�+;a��m�P���?��rt_�#lJYr�`���p�}���3�|G��ehCk��	�|>������O`ef�+�r�����`�]~�����^�m��d�wYk�\�,�M1�S�Z0��P\����4�`���G^��c{0�EL#@jb��������p�fD�=��N<}��Y�)�CW*���	��E����I?���Y�T�1N����Gg*���u���NC,�.�}``�7���������_��o�o�z1*X����`���e��Dy��[bJ�~����5>����'X5f~?�A�,��m�*�-#5Nn�A��0�zEA�6d���B���	<��t�XJ�������DVt���A�./�����KD��w�S�_g�
��2�17����!�����V���9���U�Y8|f2�{ )9�<��q��g
ve	��l����uSiSZ�T���|�q����al�����k�����a��=bo����!�+;p�@T��l�N����b�����q�*�M[���rFz � �����s����wi��f�����	�a���������!�~?����CDq�^j����Z!��nD���t8�m�����pD�f���A��u�6.3��B%�&��u:�k#��M[k���@L����ug�b��������`�k#��������H!`A�����m��9t�f8,p��tgJ�}����������I�����1����k;�r@��������%�Ag/q;��}D�����������L��14���v������A���\��m���n����`Bk/,_3����x0�E<��&�2?���P�
+C����8�%���o�B����&���1t��
��0�~����^<�#���=|�o��]���;`P�(o2,8�������^5 (&&b=0ts��a�C�oa������.�i�cv���6=y,�������x���0.[���`I���y9��X�vSW���?�0ol�U[�ET�G|xz�������=�������6���~0w,�y�O/��
GZ��~�c���wL����enF~���O���9�Dr%�R0�bG�\<�.�@����D�B�p�]-8�6�
'���
�t�Ejp���#��70����E�0�U)�����7�%�����~
�Nr�����Ii�G@������&�A��9���V�'i>����v �iI��x]��*B�BO�(��MP�-Z���M���2�N17�@��-}����7���Z�<��om���@n(,	�H%[���;�
��f!4�@Vj��&Z�?�]r-���K�Y�'[l~-s]�K������ym0��
�M�m��,���De���� *2���8m��6��@�k�<������:��'��M	�����5�! !!���KOC�a�L���7������D"**
CG�b/m*�b�5$���6�P�^K��-���2/��A�3�"9x���6�	!���B������q%}gx���N���m�K5�C":�n��&��l
�����V/	�c��~��}%m�W8����6�e�1fVSb��l���9���o`���F Q:�������%�3�����Mp�t$%"$Ht������x���w�	�����I��G�������vt&������a6���c�(H`���A�1�.�2��/�p�e
���sX��@����E}�����n���2��%0�4�@,2�����h�P����^��������HJ��-�,���)5m�).���.��r��{��H$���=������n��1��+�X`�����Q���C��b���C;��0 ��F70��]�`��Z��pW<8��������R~kX�_��V�����(j������'
��!��kqp����+�Q��Zj�c�,��J�8��.�&*(�X���`�����k���������v��k�����`!%�q���aAD�^�(^�|��,�3u��3g��o�/��Ac���qh��1����@����K�q}~82 h��8<����g��4��;.,a�Sxzu��|����gx��X������v?���c��q��.:�
O����Ur�5��Vh��5Q���2���C���gi��L���p�/�]b�l���^���I4�2�N�D���ppUh���e���z� ��ql�p��1�����Q���n�����B�N?�����F����;i?��=���%���g����T12C_�~s��j�'���T�%v��D��{;�;�����Y��`j^x�\�����'��z]G����4`����=i�|�f�!�eN�6�����r\�1u���x�zN9�A���ql�>�V!���m�,����9P��x��������n��w������ub��y��8,��3Wm�,���
H�u���������.y��q���f���I���D�+W�����z�8���>��$��&�����
-�\�y�$��@�V�	J8�	0����9�5�WZ<�%Y�u���b�,��q4�����

�[���;�����uk~r� ��
;�_w��I��y������D�4B,P��X���a��^=:��w�����8������Y�:���V*#�$$E����H���S�!��.�C[�2�g������}����F�q��o:��=����k������
}�g�96t�9�n" �7���;/x�kf�j��"!��]�L
"�����S�z����P���jm:��'��(W|}p��7ZX�����10��#���0�@��U�@B�?|�m��"M�b��C��\l�����0h	<�����Bl�34�i3<6��z�����e��b���"^�G��;����x�
����F��Ejt�j
Tj���=�����7#z6������Ag�b��f;(i(<0�`�&G!���8���]H�@�.�B�����aH�e�.#W���itZ!������{���?�o\����c�0��ED�y?��\m�F���]t$��r�n0��%���}��'���5w�`J����l�	�$��K�X��=�>��K|##Dh��o_�A��-r�q�8mR����3�������)�����c|P-I�M������T��Z3�=������D�b�>�)C��N���L�,��'�����
�&�\1+|8\�@'XT�� j�#���C�2�#M�$��J�������1� ��:t�LS���@{b'��q��>�E#$�d�y39x�r���8>���u�rUs�6�B|�\!!���{.����J4��������Y���
d���|d#����{�/p��`�G�	���N�2�@���=�h����~h��T��{r����^QT�>�.
x�6����+U��3����s�@��S�����������V�C�r��������9���u��DgBc��p�?;&�C�esr����%f`p�N�N��'��0��W���q���O�L���6�7���-��.�xXNu��+B�#q��ar�L``�-�����������9t_��p�����U��s��$�a�$(~�JU�����qR�~p�fOj�0#���7�v�����H�a-�}P���#���q�����	6��y%���� ��h��F���� � 3=)����Qks�T�A�������W4���PFJ%��T���	���<H�������<�o���~�[X]��qtLP{u����`��h�h<N_��&�D@�C�~��Hj���b�@���D���I�s6��V�2��a\9 ;D�@�A�iY���*PDJ��n��bR�K�`��	P�Mk�/s����mN������0�iT,L�j3���.��I�]: Kp����9��������5"7��n�.�JA��!�j�$<�/M��g����46�V����]�e��gA���t�7
��������,����e0������)B�/���"�	�8t������B�6Zm[@�]�/�v[��Tmh���&����#)O��/��77�"^OCZk���:����C�����&�������y�'�T0���D�tP'���U(
<`
c[�l,�]>���@��5{I�`����w����v���Z�N�@s�L�:pW&�K

���@CWI!��Tw�XU��kgrn��kQ���}����1��+���F$���P������I;R����N]HM��\e���������h�s������?Q��}��Z@���Gz�y���U\� �l�[����}w,k8�z�n\����;���z}����������I������|'�}��:�-�o�loD��(�}B�w,�^&B����m��jiC���Cwt���!�7�T�L�p�TmK}O�iU��~�)�9fO������M��a�O(%sUi#�
���������"����lD�����HAG���t�2�X���Q�@�������it_,M�+�t�
�����	�L�K�[E�I���k�6����2������R_���AF[k�-W6`�E|������d?RP�
h��f�A�o	<`�m;�b_h�D����	c��`mD�7a0;��N����[����
��	���fm��]���Crbx����0�s:|�����
���M�H�X�����i�����7�;v���TR���f�����Td�I��B%U0V��N�2H�u[m����E2:P^"�:u4�o�e�c��`�c�Ux��180s�X��o2T(-�g�������T��[,^������6L`���h��������^��m��^ai�+R�`mT��&|�%t?���v(<x������"���s��@���E�y�\v�bv�q�1��@�<��iEkU���(�}�)"|� W�5��Y�n�xz�������~�D��e��|9�T��k�,�F�:g�9{�D-!(�g�+9e�"u+kR78�����W���-�a���9��������R�������G��bx��Fh`n�d�QX��	��/�Bm�������:x�t��]B����&�0�*��Cq���g���_�s �l�������"��d���^L@��T4�k��K�Qg�>��"�1|.��
� M(<���A��N��[��:����O
��G�%;�F������jL{,t�����iO]��,��+�(����8����,pEE�����������Bp��3A	S���-]����[���x��[�1�q|�(�m=��\A8N-N�4*_
�i=i#)^f�-��`�d�9�������]�a���8x`KRN=�'s��|����{{/:�#���t
:O�����e����������;�Vd��s�-���j�	�������G���0�B�y�C�!��P����00���<���@�j�����v"9>���3�L��'�f��6���;z��g������|���>Z�P�����
��g������hD��t\��9���hG�;��<`���E��SG���;r���Ur���=�R�,�{�-�$�X�<H"��_~_Gu5�I3�gG��d�B�M`��cK��B�o�E��zf0������e�N��:�+ 0�����[��}�P�6��_":�u���<x�sU+6��`��
|��c��G�4�g����UMh�����r������Z��DJjn�:�vvq��^k���Y`!��LL��<��h�n����Dz#����\�2h�'-�Tl�H>t34{�'�w����<��%�� 4���IG��r�0�����Z���w�z�����d�D9�AR<xvz5W<���7�HY��y(�]�����A���p��A�r�����FZJ"=N��Mt������������
m�j7��I��@�6��wd)���d��st2v����4�0�����{n+�����G��C����]G�����s��:����;����H\���_Z��x���=6�����1�B����R<p%��h�~AL��Lr�)"��[�`���P[I�`~�V\��w
;<~��*�\-a?�7����M���=,vj�	�����+�|�*�I���EZ�V!w
)�"�7�1��Cw") 0��B�������T���.m�q�~=��AoZ�}L�mjJH��um���T#���t�6��M�t.X�nRx���-{A��U_���}�����6�)$r%�n����\Ad}l��x�3�;�3���:�^b��^��H&��$��I�l���o�D��c
��'�	���p�f����{	@��L�C�(O1I_w�����g�L����0����^E�U�������P���
�7��[U�P�N�sY�"�[�b���������$�D���83o%\�������mu
�T��N�jAXL�9��R9����B6�����0��f�Z���=�js���!N{��6ai�p'��\�����pr�rt�m�	�YB�-��lB]k[��;�C��2r�L$�`���}B�JAn��l��{�H$��n]"������c�����w�|N0CV]X`yu%����%�u������S����eXX;j*����������l��"0�@A�EU�oz��k��i�	�x�������)���
��Y�=�(d���6	����Ks��������8yafx�Ri>�������^{i|�l�Q\� ��5h��y��L��m�g�z������W���D����9�6�u{w�&�O� t�j�,�[`��
m�'���x����S����z��S�*:] 7=)b*?�� ��+(j��7�
0
�]@����rn��(0� ��I�!��.q��N���&}�3w�u�J.�)~�� �����
0eE�^����
0�"t)#L&�Q�^b�B*m�+�l������Av���j9������%I�!w}�n�3�y�O��)M(���S< U	i�����9��K�����#�n����c�-YM.�r��JC�~c�'r+0�L� =,��Z�[�:d���0���j�22�����r�,BQ�S!�F�@�r�I������������H��w�f8��>�5m���S<���4��]k7�P�CRC���%~9�mlk�%;������o��o���hq��)a@0�d�����SX�o&	���N�J��^�t�y5n�a�$I�~��@���=�~��)���$-�vG
��$��L�*`�E�K IDAT����@�F�hEn\&��s�'���98�hw�(I(
<�@�J�"D�z�1s`��wIH��]!���!uU$'r���'�t����l�Vw2���>(0���p1w���mi�)Pk@r���Z��X9X`��������H�JP��VH P��L�����`��ij�x��/��b���D2)(dD�	F(� F^�0W	b����D�Gs���@��i\��_��X!�6���3e��<����Z��������������6?9��7������ZL0������?s'���6�s������9ftb=��[`j��)���l����XL�i�=�#h�_	>4����p����E�B�&x6x���6���$�L�H���B��vk<���[���I-���I��$�����N�?�JB�*�\A���X���m}8�����N#�V�h�N��
v��2��B%���\b�x�j��m��"���Y��k�����UD�\������ih�(qwyX����4���Ly`��p�x�N���/��#��0b�1���5���.#w��
n�W�l���$�N���]��B6` H�D�0��E�y����J��L���s`m��)I���`�L]B��*._�vt�P���=��YCwb��	�H
�L�=X
��2��m��#p��V�8x�SC��ikJn]�����T��eL��]/G���5k�(0���KXs?K]����
v��9f5i��O|>R<8��
)D`�K;�t;�zf��������{LlP�T^�����r��|��"9:�5�[�x�:
�H������r@��A6X������\(�V<��,U�j�{'�S�����Y��x[����6(P�`�>n��A�F�o�I��4_����Z���������9/x��o�BR|d
�j�)$���8�L���@�	{ph)��[�fp���O�Mmchh����<N~�A^����Y`��T52G_�fXt�����Kr�0���v�������'�xh=���xp������i�vI�u%q��6���{{�#��
�MB����f_�]rXj� ��Ab4}�����V��\-x� ��r�0��������a��G�gvP�E<p���������Hu�8����x���I��}b
������,��-�������A���[8G��/����ek�qW,0�	S�wdn�L��>}<���������vc���<M<���"U�����
��zA���a$��Vm����I�/B,P���/�V�A��)�����gqW<`�i����������J��m� �*�j� ����2��
�C~���7wp��q�A��n�[��ga�G2�j�������'�����������V��H����<q�E�}<x��h�t0��L:h��������Z�Z���vn����xm��&�����M����`mR+'~�V�Tk6������S�`V�M*�aZ�	^���#p�P��B����L �	�eO��U����C�Qg�<`'������P"�i�hz�{�o����yRB��3���:.�2�d'�q��{�0��*m�s�
����U������P�e$������G~�"I��0w���O�������c:4�I����<��;�P��\�G�|�;�	�����r`�_^��������D
��3�1N�hcO�N�f+(����z��}�N��NfH���T�AgA�N�f��������2�C��yCa�A�Nc`A����v�By���x`^�&�uO1�xpit����Y~�x�Dv�1���#w�w������&�ip�k�No�U���mC�P���/O��O-�k��FM���+<8���[���P~����~j�H A����g�PAO�1���N]r�`��W.�kr�As�>vv��P+����
g���A�R��G��-����u����bW�g/�z	KR]��~��k���	�;o�W���j���P�_�6�e���j�M �G�D���=����\�����l{~I�[����i]��=�2��'�5D/y�r���n�7��H)A�������g�1��T�x�������.uH���	H�s*U-r��
�$K���?S�>��U��B�o����NI��������&�TZp'%�Tr� r$I��X�qL>H�YS9���>Uc�O��J��\��w����q���l�v�t~�A\��'����u5��>���������K����'�����n�
'����|x#��n
'�����>����f#�#�hv���F�����o����M�h�(^�[>��&z6x����u�I}#
�����C�a�����9�ic����a)�FxC.Y*�������mD*J|��N�j��"������)���Y5��J:��������|�x0`�<,������!-�`������)Y�7x�I��>�h��\���E�V�"�����c�x��<� �I���{�V���5X��:R]"������En�=z6�
Opm�����7p�uIEG��g�ZL�!�@7 ���_=G5��X��.�(_���	�b��*0�����i�bb��_���v^���x<x���!��M
�I*:���Q�\El&[���������E(zV�{WB�!z�U��c�A�nr���F~�i���/d��	���F$�M.\��0���,*<����S�)��y|/^���j�:p&�L�=4�9n?��v-g���h�l<���i-�w��$w(.x���T���		=����r�v:>�-���y�eR(`�,0� ��k:���
4	�g�Ri�A�T=�x�>p�o�3�}=��Wn��
���)�0�qtb^���E�+@�V�O6�UHq��K�� ��������9�Lg��H��B:��e�3( z��mz�p`"��������V���Dn�I��{-���Cn� ��=$="�;"�{�lDu�E����Z��Q���v�6lH�}�����B4�\�]����*�>�/�'���HY�L��K	���0[��;
����]w�D���"�\H
�����z8��w����(<`pJ�3:�NiU�}�HN8w_a*�L�B���z��2��t(j���������\cH��Y� ��_�v��h��V<�3/OP�+s��3�8p�?�t!�h�6����>�>�k�5B9}c��;�yHv�v��zS��\���Q���'=�	}#�:���������-q�n����������#WP����z�.�K���
��� ��^c�{���zq�X�{4<0�R�NCM�j�n�I
��
^���,�00�@�|�����Ggv���_�gNn�����)��e��4�UR���5S�N~�S^�}C����y�JBwRGx���H�4��k�#%!���(
<HK!�� >?T�!������b�2��HcI*�%4^�5B�w�=0�e0� v�d1"h���� �	�_��@�T�����tP�`�h�<�z���f?s��O��Ae��<�!5�����'��BP��_�~H �!����������dD�r� �T���M��g�4W���K�����	G��B�kJ�=������z
-r���o�SH��Z��C:�*5������'�}G�2�������'[�&���x-��F*,0�@T����`nT��=�}HH���m�����H���������$e	R��%��P�2���O�};�\d����.�u�g����|s�)0��:M��we�<p�R��7���R0$W
�o$��?}�P�a���N��(0�����s�����R
`y��P;��d���?����������QV�i���[zN�e����|���`V�w���5�h����S}���r��������A��x=�	P`nr����&�U���F�k�>���K�0``��'�6�j
�:AO�~��r������`�sA���N����	�~!��BT��e�u3�"R����!&-��-x���}H*w�M�W*��<�5s���� 7x�_���������t���@�����S��$S}`q��������`n)r�Z�������3�aSM��C=��0)N������:v��.A�|��H$%J���>��~�O�@����w]U���5�M�fa���<(of�����}�?�#������G����3I�������I��@IS,���0��?�����ZY�7�"��{H�����w��\��������a�#/:��n��M��34K��LU!��\��^���r4h�F��i����+oWgW9���3�m�
��KWy}��~��0�a�w�
�E�L�����^�O�����WZ������:j���z���.��H�g���C�r?������K�O�:,��E������*��������Q�@�M/mx,/Xu� ����
t��'�+	 u�A�x�H����1��Z������M�z������D�`�
�K	p��
�
���(�5r����W>����������3j8�{x2��sk��C�'�AR\$���
gwME]����� ���9W9��@e������������wA4)�&%D�Z�p?0)I?3������6�uw��X)��z� ,u
0�y'��x��1N����~�?����M�Fc'
!4o�HkK�h3?*)�i�h��C�K�0��<`u�;��5-O��,>��s>W����V<`�j�� :�u�\<����������VND���������U���z����L����MH�o6O�l#���I��_CHMN��e���*SAH&�o�����t���\�-������=&�������Y�P�
����L�dWI4^\����)����kW����A�y���L��I����D��X���7���*}�3�M������27$�
T�E����9xB���/H�J�$��\0�&x�IC�$����*��J�V_�{_��g�@Q�AiT'?��8��Aq�V�i�V��t�Rp�y�i�Q�����)��BQ���^xPT�/}� ��s��0��s��_��_�N�*� W��_��������xP��J3�4�Ai��s����Bq�f�Bm|��Y
�T���7���bg"a���	��<ZA����/����U���onW%);���On8��03�o�'�v�P��%I�p�_�������������>��GA���t�E�_��U�����+����i�(���xP���\���8/n���
HI�$��o�3��8!�����/*
s�������HJ�^�r�x%�@A�J��$�AI��v�PT>�]-��;���]-d_��M����b1)'�"���/�GA����OQ����Sq��<(n^���<�&Oy��<����y�@Z�	�������bIe%�l���$���H��x ��J3�|l]<(��&]�x ��$�-��$1S�q�l�&�kA������O�8�
��#������`!"r;���prO�AF|������3���N�����]��$�O>�,4������6r���4��9s{���1��l5���������IH�uZ@>4I�`q��\A�;�d�e�@F� <��HED���
$�Y�Q�V��'���G�K�������7�|�6p���S�Y���B����
Yu����B�N������
���_O�x�m�_OOjZR����}����kn=���|n|�����Uq����ZN�tx ����-���P��#�%���!���ol<�|m �Y�\-|����c������*I������@z�}�)�@��>,�_2��H�S�3��g�
w%X@�@�X@J���s����1+AJng<(��x�e<(��&��
Y�#� 3�/-���5m	EQ���,R��i$������&��w�3x���k��O#)b�555��-n�r��VDdq����-B2��grr2TH*MII���;*+�,!����0,�b#�/��_���=�2
 
-~[e���#AG^(����[~�5T�Q���G�233��+

��dYf�d�Z!!�����T���(�d S���}Yk������$���b1O#��N[�J
J��.n�|����(��}��(n]K���uuu(((�h��j��/;c�
��j��"o]V�T�#3�,��"�m��*�4��\���������=Th���s�Q&e6?���&�m�x�8�S%�C.M��������{/\My,�j+Y�G�
�A�>�C�P���~::��%��"���E�S��e�|�v=��_^�C�����(��Jv]��R��6�����PU�BT*KV�2�4�����0{�����s��3���^*�&�|DM�!n�J]J�iq���iM����]���)I�~�<�(��GIlVZiK:13.���z���J�zP��X������CKK���������	�L����{

��2�pB{�����/bYZA^�yh���t������\�M�E�����=�Bccc��:��5yy>��=�a>���=��� /�fQyx>��=��H�y�YM��(;�!/�?a~Xv�������a��S�2���C^�C�#�O	�Qv�+y��|�����>-��+��|�F���0Q��})w
�������0Q��EK�������\�~ �������*,,��w�,?a�^2��:����<���e>��2e���K{��|DhY�l��#�ecGY�"�!/�a=WV�Z6����Pd�d����G��|=_����m�j'!�re�G������W{Oqqq\^%[J��a.222���Y�3�!&�����3�I����&/��d��t��r�R����D+����c�<������������,ThYZ�dy����TUUK�Q1S�j,����K�G1���d�0a7%���zD��)��H�k&}��|�K{���oi��n�
U��$�oa>"��>O<�=>��%-E�����$���������*�x�2a����(}�J_Bi����a~�Z���C��Q����2a-�%�CP<(��$���, (|��/��k /�!�e�_�C{�l��S����������=���B{���C^������|�K{��������Qv�C^��|���)yy�	������e>"/�����<�GX�����W�2���u<(;}Z��W`<���$//ba����R�U�=dma�*k��,?yiaa�d�@����=�acUXX�u�.Y~�|�d��ujyiy����|�K/d���������������G������E�C^�#�z��z�l�������/�*y��|�����G
�|��/���D���A��K{������=��j��S����r��W�����)�e��������\���0?�C�����h����d��uja~(k��,?yha~X�> �����0?�Y����'/�<(Y?R���<��@���R����K�Wl���<%��;��{�s�m���:��k+(���,[y������h1O���2�Y�}�G�����z=���/*Z�\�4���q���7��m�^�KL-���b��M�Q+�EY�ZN�B����F�VG��x�F������JGe�oY�p�� ���0�z4���Qv+(��5������ �/�E�HD����
�-
�1��w�wid�U�Y.��;e��)��Opp��N�]����,0�IX��$����l��[B����Wq	kl��	���K�����3q����gT�sx58
gc�����6��r�����$V�Iy�^����2���L*����7�^��(�W�R$�3�]t��	�K?Y��y��l�N��2�/;���eHO��y������6HIK�O*�pv{ ������.2�+w&�����d�oie���5��+��?[�f�
��ex��?K�@^��>�]J����������[L3��g!1�}+�?��R�����4p"\�k�u,T0����]I
��`��xP���~s���\
�YY"����v�����R�'z�o IDAT �E�����t�*��xPV�,��@J����Y@�@��"Y,<��N_S,<(����`��A�=�xPz�����m~9��t�����7��~xP<�	��Q���
/�x }���BP<(���^Z<�Y�J<��E��O�����t- �xP�=L��Y@�@�O����e#/<����D<(���N'�E���1����+^:<��nx ���������X������sX�#!1	3����dI��?��z�k�j�
�����s��`����WsJ�	����
Ky�vBRr
��0zH_�}���;q����<
�q���� TE"���������\��	���x�����g�cd���p�2��v�����`�	�Ew'Y�5[�Dbl$^>�\t��kS<0�RG���q��[��[�^(�}fGjS���><���T���,K���Ogncd���p��;6��*�\-|0��a985����``�YX�m�T6nZ�+�5�p��N��IY��A��u�������wi�Q`��p���qO��F�^-g\��o�=�����8��K��T�,��	����%��.�})�(A{��FI���j!4&����4TDBR&���JU�]�IhYS�
t�	kN&`@ku�k)����$btG��d����%x�lv��������d��&����\JEJ_���w��P��H���v�Po�"<��j����'�!�W�1G�����=utu���������=��p�����G�x��x���GX|
�}�ss��6\}��d���JjkY��5x`�����0j���N#��K��Y��*��9A�4�#K�^���X��]���Tp�v*�8K7f��KCBr&Z��Fn�kv�`��������
5=5<��H�~�bA<�����aR��$�,]-t��Q	q�Q����v��Nr��n#p��E�����R����M&k����"q�|h��	�k����L���'$��'U��"��gF��xe#*�[���G�d��,�y�	r[V��s�������tE�����Q�J��UC���Zv[�'�Jl��	���F5�r���1�8���#�>�����1����Z�
}NW��iH>���&EU���_<X��x�9����}��}����r�f����Nf�#i��jAkWp���}�:W��>Dr�N��_O�>x.���
���VL�i��
_�x�~�������?���g	E��-�S�����{d���t�������1�I�h\���e~��C��-�Y�[���Ip ZT�&���X�A�F�%x�y�J��0
�i�-�~m�A����>Q�}�����"h|�����}%,P:Z��%a�NmF�������=x� RD����v�]T���L�c������0��/��^���z��_4��
xp�~
l,����������NC���mh�2����~e���,����D���Q��UD�?u	�.� |��A�����?�4�8x�������Xp���o�O���(v���<��||f�@�yc�I��Mh��OG�JJxP���\�y����<���8�>�.5����e�t{}��6���\���R�P�P)7�A>�g��"M�n)cg,CzJ����E)(�����X���?��V���e���Q$�}��`�Ol�<���������C������V�\�0_����5��`��s���[Z�A��[�������u�/Ai�]�����6v^;�o]��)_�`�S��{/_���k��YAWC=$��:�@�8Sj�H�@>��WD��b�7���w����,ajl�Zv��t�V����{J`�v�:��_���]m��"E���L��l�vL?7n?���/��������9�����&\�����m������s��xJ�Yy��B��E�/���>t��/w���y����gy����wT�X5kT��?��!x��c��{ddd��z��n����?�\��ZM�E�Z-�o�N@R��R�q#\����4
1��b()*���Nz.��?T���)�92!�������VU���]m�>�FZ���I+�����D(((`�sG�<�T���K�sOAE#D%&`V���������xPpS�e����Y�x�+?�i4t�
�d�����s=>�Q
=#���J�x~��\<��~?���`\����EOP
��h�&=�B����{�����2�<���m;\G,��	���CB]�-�L����S���C�:�	T{^��
�0�wOXa���8{��D�b������?��&��&��L�������99�]l�]����k@_M�p�L,��I�u&�5���r`���E���Mt����GH!�nbC{�����]^�h_�
���B��X{�)��q��PR2jhi���cD�ii ���Knzb�����`����o��:H�{��T��AdB�]�O���V�����2F��#mu����2���)%k|j���'Et�]
���'o����O)���U���K�$��f���N�z�U<��:E�_���(����(��1�����{��~�$�;�.f@��0��Z��H	K<o#���'��\�A��
�=~�^h|��F�H�t��Y�ca�0�@W���N�e��������1���Vl����AG+�#p��)HKO�����j�8�[`����.�X>kvM�X��a}���>��<�a����aO4����KE�:���U\� ":5Zc������4Z�{2�vO����@MUF��xc/n�;^�m~t=_�zg��[���H
M��%��D��?�
J���ke	() `�'���maE�=��6����4j�t�B��p����_E���x=�6@��$�x��4������N@��pi=��\�}����y��L���[[��~��m��a����Ac���.y_����hX�-I����	��0��/�n�|�X�}2~�z�����q���`�"F����x����O�Irk9q�U<�6���E=Ed��#fU��������������@����C����D'���#���Q��-bR��
����L��Z�������x:i/S��A��X�N�C��Hd���"����p�n
o�^MU�c[+�%�\_C�j�i�$^S7��(�d�z�0�A����z�
�!RV�
G����d$�������\NB)#��������J2W<��#Fyc%����TNU�"� tr�1�`V�;��0J�M��r.	ZT�w���]�+���6�E0�Q�i�����.���j���7��N���wR�2�m��N��j"��N�IF;�k�:"^�8-��4������H��������z�����P���;q��.�����/D�f`-�ae3%������C����� ����=�R!N����j��pu{�Q�I�~N7��;g�_�xB'�+�S�������g��x��mK�=�\#�6�f���C������
��5�<H����O��aoU����'i�{�V;/�����5�P�~{}/
!t�YYU����J��j�!0sl�M{{��9
��xu�C`7t"�=�:�A��a��*t����c<`�h�"��U���V-]P��'�������!5>��d��b������$nFI�����&�hW��+~�Hce_��H��3O1��:/�ux<����k.�f�9�����j�#!%��FXp�	*j`L�*�TU��;���2��iY����*���X�+�����}<�<����B��<$;�}�������T1��"�
^��s:��:��������\��yU#h��q�IO�80��4��������	�`s��n�h�P�l�G���H��#1��
��'�==���v4�Q����<��o�zV��*���b4�����?���������.BX\
~?�L����0��jp7��:��d�R�r���]y��iNSi�@�����g�~*��4~ ^��6�C�����Z��z;�����{����:���`�h<�?������L��~����e!|m�����}���q	/�����H���.<�m���<y�^B��������)��8��Z*�iPt�VFc[e,?�=MEtn����i�������R4m%�@��v���-��0�� ���Ti��sS���{@.�D�Kc��kh���X�a�Q���
�y��~-D8yW���L���[���J
T<�,������2�R�;zs���A��&T����{��@d��%*� W�V�;���'q{�
�V�C�A����w>B��mx��~���m����������%T�b�5 ���`������Mi���[�����h6��i`��K����[s��j�j �'�����o��T�$��E�C��C[c\�~Q��$� ���j`T�|�g��=�hd��]p��#�d�k���~��a��!�k�`\��Xpb+:;4S?�ON�qM�iW���%&����:��8�+�`v�a0�tlf4����P�x��N<~���w���(��$�56^9����2`k^3�YK���j1�)���i��|�����w��qb��q��L86�5u=^����{R�O��I~������/���������Y��_hS��t
a��o4�(#�_7Dx�B�i�H�����A� �1�|3�x�,dJp��@����3��D�aH:���nFFL���C��=T��AAAI��BFD �:�A�����~�q[���&�|n��}��}2��u���)R.n���
�����}���H����g�C��L$���&PqhK���[���4�U<����kd)���GsA�`�s�0�AK4���S�8�������-p���_+\�#?��}���w1��0����������0R������6.�v`�i&}s�!���)��"]3D>:E�&tm���������8*���A�~��>�*?lCb���+���MH�C����f�$X�����I�\������r�H����_GBQ_����Z���~C��HD���4Z�*(��u�
�O.��D�EZ� [kthEM�n:%}��X�}����7��OY�V�g���������w+���f���$(��Y8����SQ��B��ST���O �u�wt]���k�)�n�"+�+BQ���v`������'����	&;������wp��_�=x^�xecRsNm��e�j������n,��6�����kT7��^7�W�	�����c�I�
?S����#��)�}��C|�!�7	Tl�#��}d���I�-���~?~��1���\��#������^����mM�H�TLi5����<�$��}�*�����c���p����N����}�f`���hm������n���>�����w�2&�^NO�Xz|�
��~M����f��U���q��K7n{�*��!7x�����x�����y��s%h��%z�6�Cc��'
FzX$�e��- 9��-�����
}����^��a���hec�.���h�U�$�bi�����E�����\����r���%����A`�s\��������*8����t����1�K����v��������o���Va�$��@��=�����
-��������>���B�<��	�$j�O"���e���1s������t��s����3v�?����z+fO��/�c=�{���b��R`��%����1�7Z����#g���������0#'��u�������?������c����@'�^A�J�P��:���c�p�����{�����@�"������`��,Px��#5L4Q�$�"��P���������y��g�(���P���s����F�

���
8������������7_��3����U�ghkk�Qv����Lvr�Y���62���1_8�9���}\V^>��]�����b�I�Y��`3�e�`����v����1mFZ�L�Tn��r��q����j�xv���qg�F�8Y��Sx�4p&}"���
����Hj���5��n���}�(�h����Q�U/��d���
��e�
���Q�����m�Db��N������K�a�Ac+�15����������or�Z��~��mt���w�9<�2*���p&W	;<}9x�s���q��_W����!���E��AaX����nb�K�={U
tx��4��J����`��{0����5�p���:��6�+Z���` �1�@�9W�Z��� ��&}�z�cxS{\�
@��0���?{���)G�b�s}�}����4F�b�9�qm����X�~K�7���i�]��	M����9��w���y����x�m�
�c ��Mh�i�������h�@!+g�t���~��`h:�.�����c�b'�,Lh)��[!��C��|,�VP��u����Zc�;�;�q���~�n1���r6h��{l�?����>�&��J8t�O����~(��&����7`bT�6��b��c����|�V�DE+;��<�����U
�����`�g�.c	8���]���mL�>8�  ��[�?6I'
�x��#�����yz��#��;XMq@��w��j���b�%���A�Z������z\�E�I*lv9���KP1Q����x;��UF�?/Q�WG�l'����tKQ���i��b�(R��FDT�V�Cv-�#g�`���������	E�.?c���pj�ax�s��7��3���m�q�^�m[���	�������hO ���g��o|0��=}q�\4<�M�=xN���hZ�0b
�*|A6o��<P����E�.ar8�[�#�Jt�Em����0��
��C��
Th�:�6�u'���M���Ma�uF�%Cr�0��'�/��4�x"z���/Z�6��t�������	��2@^�b7���
�������}seX�&��XG�Clc��g
m�)�I
^OF�&�#����S����;�_H���*�2`Hy����)h_O�6�SHb[7��Q�@����|#)61���i�JL#�0������C�&`zoMx�NCd\m���a��ND�]���O#�y��@�Q������R.`� ��N��:IP�~�)m����)��0��WS5x���Iu��	r��0�@
z�%��6�xN�\�	d�z>�����nY���6���6��&�6*����	����j�v�����������Px �M�;�R���*�|�aYC�w&�� �����F7�^1!�������^���\�Nq�"9>���T��$��g:��\G/n���6���h����y_Hel���y�����������
���L�4�RUh���w�&�UD�b��t��Nk�����XV���A���G���D��;h4o�6-CrD(��^�������\��$������#�������n��:��B��Y��
��0� ��������<��t��EI���ZW�������X��2��IA`��G�Q�
�D����X�*&��%�YhO�����8x`���A��0�FZ��&h������F��Sm���BMK]���}Mz��?G�Z�����GAX?���{�M�f���ic���j��6
�����@��<`u]}���[�4�������+a��7���������1
�U��:�'[,d+������a��e��e*��������.����<�e�����p�a���*!H�w�/<�wp%����!��Y��P/g�7k����P/�m���HT��=^��}\����8xr�b<�Q��_��c<,tB��s0��5�c�,=!!�����x��6�;�Qw����O^A��M��M!����Yx6�OT_2	��D��cr������O�9.������28I)��U:�We�A2�uREx\&�s���B���>�0P��W�|�"*>��!b��P��S��F�9 �Q�6�	`��]+�%cbWU���\���a�"D�;���4h%"`L��JU-��� IDAT���eOA���&�4�+#�w?�:�!�#z��"z	��K���l��7_�isS�6C%sTx�xzs�<
F��ph�lI�+:V��������I��|�xF���l	4��E�Mh[�pP�����r�!4����uG9���{d�:�"�"���F�ZHM���l{��f�"|<F�}}pr�at?���;�
�+A�B������ �`��@x�	�g!oaJ�f��mE�R�/F�F�����a�� �8����B`Tn�yq��B����z�&P�Lt�i�	����V����	l��yG7�{�V����������.z�w"�K� ������m!��Z�����&D]�S�(IC~��U��,������X�	���q��xz��ak����k����Cd���������5:����p���S#C`�v@����i
;G��_	���w�QT>$�B ��{/!t��K��REl(R��b�[��(�J�� EQ�H��{�Z�����;qC�$�M$&g��!3wf����������W�oA�A�c���!g�
(��7�~��4���'�:�Q$���y� G����P��h���+���)������S<�q>/V�K�2�����^��9�[�4�A��'9����C��_�%oD���?L�},B����/����_?����ZbE���)
��������R��<����t^B���QU0j�!�*�{���V��JbIL<���9���zq��[����������������7��_��O`���h^�&�]6�z��ORV���x�����=?��YO#w�V��w�����e9����L���,�w�;a��h�]F��}�#3�����?��K����pt��03��(2\�@�����x`��|�F������D7��G�Yo"��X�d�uR�=� x��p��,���p�h\��)����X�qR��O���Y�������[��v+1���Kd����7�v�0b"���z[�_��%��0�B����>�Z`�x�/Rt�����xP>1������LG��p�W������h`��Gf��o�����a��?
�{`��_`K<�T�~����������W;���~d���������{��������Kr�A��UpoQ�����L����r��s��k����,j�,���<�P2X��:SlZ�x��������P���t&�{�*{�k�s�����t�^xv���V�':�Z��%(���������C����GM@����q��}'��e6��M�E�]�_��������m�fh"�l�7����l�W���8��F-���A���1����)��wclE��[cJ	��xp�R[����S�b���|>i���5|���sm�c��]�[�|�#���\�h
TN&����h�| |8If������$.>����?/���;�r��.�A�����/���>�D�������%���Q�H~��~|*����sP����w�o!������X#���I/�ho����>|�% 4�W�/G��b��|��}�l���~F���PJ�9N0������A:�j��'0��oQ�g�q1�c��M����5qv�7guU���.]�7?.��C�Ek�:�{�����s%���%�`����G 9� (,
_m=�p��Pr�~��P<(R�Zty���y�EC���\���o���\�:���9v�J�v{b�A4��9[6`�Y����E����gbr���t�(��;���������8z�������~0�C7l>��8gNa@�[�&���x`�NF����m�%��}g[��.�'s�._~*��M?M�Y>��zo>�������oF�5�9n��a��������n��I��w������	X��NzH��o�aR�A��%����p��y���c�<�Y������������3��w5�|��s�����'���[��y0����O�r�p�<%���x`[�6��N�|���X���jRhxl���E]�X����,�(.�`�9���

���+���`���a���hX� <���70�i-<O����x`]�6�K���Y�"_�����.��^����9��B�{n��8�Y�W��fyK<0�c;���'���t�&x%|�~�#������w��o���f�
76������
�>�B��CLD8.~�?x:�EOJ�����E�@���N8�e�����+��m@���)iI�ffQ�6��lI���4+����/a��O�z���X�~�d`[��{
�v��	JF<�[�bcT*[�MC�N����U�7�������oM�u����B���c������HK|x���8}�r��_�z&jUk��k�����1l��x��~):W�J�&�����!o�R���.�|�J<�8�(�(����X}��������76[�f+�`�/����_��=����/�)+�	a���:Kr�A����@�����[�9s���+�c��o-	 2���3�&��D�DY��IB8���:|������C�z��0�[v,���Q�������;�^��^����~8u����|�23��=��d���D�7����j��0���J;��!&��d$������n����A�\Cs���A�q��Z�m������K���ne)*p��r=Mi����d8W����i~Dq�����@�&Y�f0���a�d������x~Ov���u��X�
UK�|�g1�����D&�P<��wk��7m����9CyS�^8���5fj�a�C�FQ�������X$����l����1���q���)L\����v��	
��T<;��t��C����E[�RFx0�M c��$�c�/9mIG�EQ�3c�X�9��u����&������8�c5�/�jd�Y���?�K9��R���y�Kl<���}�Vj��"l�lw�\�2n��?�)�5�c��J-���S��Q��+J�g�+��c�hI	��_<�k�E\�N�=�����D4���}8�!�M��b��j���]�����\�ja�;V�Xl�����bj��Q���?��`�#E�����3�P�Awl�a���vE��x�[�**?�$�O���y5�|B�	s���~|9����{�Z���M�>o�=~�������@~�z(��+<���$$x�-`I����Ki�T<��K�����=
��V������5�p�2��w�.�����=|��x`��p`[���P<B��$
d��������:�V���oT.���g0�qi�,�d&W���`����xt�&��P���i��Z������n	\������`Z����y?����S������x���6U
���w��C�{OIT)�����Rl��a�_���}��v�{0��3���ix�����:1�a%S��?�1�~KJ<��Z%����1i�7a��� `���>�e�d�m�J�s�(J*�Y1���9����~�J&��[
���{^_&$�w��1	�
�L�Ro�Td���l;�/^k2]-��_&���Q3����/���o�������	e8S��1T1�	��6����yR�&%f��(+��e��V������������5����a��������,�`��H
h��y=�\\�����D(r���=��o�x�����&�,����]x���A~O,�+�RX6�`�i��)]�&��:��h���-A��2|�T@�[ ���{X\��HJw��=������k�������?a<9�c����;�!�n<�S�n=����?����K<�[�)g7��tp
C����.���?w
�.�M��K�7ZQ((����c��`�6@��Ez)9(?���"t�����c�����On=S%u���?�T}�M/
�������$ �2a��<��'�J�b=��m��=��RL��l�>�Z�������������j����e%'�T��e����Z��hQ��������x�	
uKU�f���0���0��h����W��kPL^�c��61���X��yT��m_�FH ��3��"��!���������bB� :8��|��A�:@��]�����i�d�NL<0�5J��(r�����(+Qb��{vL�����|���$�����T���-�^�"w�B��%��'�yXRB�g��U����J�9���Yr>�)�?��<�s�!_��g����{��ep}\�xl"B������� |������)<���\����;�vLjB���)>���A����3������VZVRKb�A�B�8I�-N\���L8hS�&��8�q��g:{m�+��������&�jp�F=�}&�I��@R��`x����o%��Xl%\���3�O�T/J	_����%����S�b�l���}�^�p��n%�S�!~i�wWL���W�������2
�~���I�y{�A��p��yp��p��N��k��_�d�4+$%p�2
4��"�qa���8P��P&�AN��w���Xb[�7�����Z�%��-��J;=��.���m}���g����������<&s2�m����2�C
�����P���Lz�Y���M,�������L�M9,�x0����&���E�
���g��������[79� d����{O��C��G=��B���d�A���9p�zUx
ZoJ&��Vj!�##��t��t���Oy����{�f�k#�teK�Q�����q�`\Y�X��V���7�#�7n��}|�`���r��l�c���x�ew�������%�x����5�(rW�;_#
d/_��p��-����x5��{<~�{wD���������x�X3�>q��N�M�3��=�SR^g��H/���g[W��|�E�?z��?^N������C� �?����_��W����u~@����e����G�r����#+5)�%�xp���Q��[���}�r���Xr%o��������O	-�E�Aj>��~�����o���$���x2��H��_��%
�����6��i4V��tK<`�@��
1}��������a��'p���,�p�JM���J7��7#=xp�f��}�5�c�f����_�����[����w����y��QIf�>�wB^?_�
���>{�~_�}{vI���B�%��x��{
���n���^�����+�x���`�Y�:�~'o���K���/�,^�7#���z�zL���=�����#x0���Q_\����'�h%�d���#P"O^,��=�Y�&�FDXBBJ��)ed�������f'L]�
*�nV����'�R�J6�x��|�9�wI3��z3�)���+�A��
q���8��6�#�B�k�\4��8v3V�A���l�)������x0�};|��R����9�FU*��xP���h��;-�b�[�d�2&��R)�B3{����
V��$L<07�����[v���8�vl�!K��'4��b��I;(�(/����%mk�;\���}����/�#8*fR�C<0"�g��i���5VB�M<8r!?�����5�O3~��wC��x}�`Z�����H��P>�v�/�'�,��>mR��	���+��;~^5 ��W�o�(\��]K<0�y�,/���H�D]�w��I�+�R��!l�y����C'�V�|�����cy�0\�|
�?�%���'�d�E*�]3��g)�z�����)�2f�#����j���/�c��/��o���W��o%(�g�/����l����a����~��������e��1���Z<p+�h��y��4*Lk����C�!U-� �@P\��'K'��fr\8���u�	�N��"OU�����������x���`,��3<���8xt�0�����G'a�|�xp����:�tm��#�^�K<x����nw4o��UVc?�-:���i�^@���8u� �4�*����1��0�2���?@ _6���Wg�8�$&�p��{7K:���4�~>}}b�����;��C�x�AyS~!�{� m����-�`�'|u
>�3��+������7�d���h��Ly�/�x�6�3k�#xF�R)L
������<2���s�T���h��#���O�4F1�,	L���Y���������������^�BN���l[�3`��X����Y��'<2���'��o��'��P`RLY�_��3���*s`�x�2e��Wb8X������!L&0��e��-�Aq��T��,)�*��%F�X#���l���_n0��r�X���5R�)����!0c
c��b���,)�Lo�b��M��G�A(g_>C���f��Nw���a�f���xp��MK�x"e������x���,�������J<(W���"Q����������b%���� �h`��IVh��#!�!by�"����}��vV�q]����=i�xP��`��3�?�.����u��
�N�.�x���e��f"�y��V�>�$�x��3��=qJ����n$�xp|�<�)��>g&�l���T<0e�H`�k1	`�m���V�A4g�P�kP��t�]Y��e��X������{����X�����L;(��#,�{�*���O�8��K�����90el�M<0��-�(��u�u,g��Y�5,��%�b��l�V�����=��s��{,A� ����f�o�q=j�9pF����;�XePz�-~[�B|��u�L��q���8��`���.`r�Zx��b�R�$%�x��I��E9�_���o>������x�!�M�xP��N8�hJ�W!����>�0��g�7?g�;;�R��y�P��q���������P��!�1p��pd�W���%���OB��_�~�3�1�K��t��.I�F$p�u����i���%�����aiS
a��hKX�?
-j�Y�6	�(:���)��R�g��'�/��]�����t�w�&�\�My�\���`I�3�gJ�8��\���es �����������#p�%��dj���V)���oO<0)'VE��EQ�Aq�<'T{�$D��O{Q��:8�`j���o��vug��v�`IQ�0R���6m#����Q�]9�dB���ph�~��K�.B�v�y]����'�6��}sJS������_�T%4(S
;O��	L��
�w����6���|_;�i�o�t�<&|�~	�5�dIf��
>]�n������`}
��Zg��?1��C���m�q�1����'����A��5��8!���U�qX��Kq�A�xP�A�_�.J�n��+�p�%R�$����w�;��|O�Y��S�A�s�f�]<�Z#�`��aq���x��a�eI���|��U�!��n�Z�����r�!��PF7V&����i�F�3��%O!B�F�s8�����y����Cu�����c6q^��0�0���~W�k��x�w
\��X)	V�����m3XO�N����)��?�a����c�X����X[������
+���
;O�;�g��@J��.GcP�\9�4�����N��-Wx����W�L���Y�
4d�a�R,`��WL<�{6�Z`�Nru_li��Z������x��I'����l#
|9���G9%�m������<~�����tZ�9�P����g-9�0��V�A���]����*GQ��`���Y�xP��p��~4����3[�A���}��g=���*0��w��x�BT���q�)Cu���L���������~/;,�O<��`dJ8|��0(`�fIN<�1w<[r<�����k����o�!b���t���C<����8*{�|����	����g2��2z7��?�m���{a����&x��g�/x�`�����M�4��V-�=� a��3eL?%L<�2����Ks&�P�1�,���$\��L�J��������%����]�7���
�Xc�f���io������rx��M)Kg5��������B���I[�-f!�	�����b���Q�Zk\f)g��s��A^&��L��]���dm+��`���~�D_@����������8!l���)s0G�� IDAT��9k���\��+�b��,������J1���M5t�meL�A��Uq�z0v�=D���O��1#�X�3:/'S
��j����OL]`�B�$i���t�V�B������]������������6�}?��h�:�U�j��=l[�-�>��,[k���x�r.n���A�b��
�uc���F����9����S1��X�~�5������(����3W�0i������EK�g��q���f"v9$�2���h��XZ��v�Z�����-i!(4/�����\�m�n��CnO/�8����#�?�"����FF��2��XQ�#�=��'���sb��;��Z[���^o�:�\���G��oX7�^�����5�=�P���bL��E_�A�aX�^��?�b/��l@s��[�p#�r0r��x�����C	�����
Fg]<u�JA0KA�.V�l�+����c���75SG#�� �/I�O��e�X�HF��v����}
�G�;����5�l�l=|�3<��[L*��0o���W�b��	�N���1>S�*�xyp�K~�{�����[�o��W�#�|)����vk���N_����=N��$4.^�*e4i�T������Xq��lV#��9�V%���ZS����{-�!�x`�9�K1���,�R�(������W����{�g��0i�vk�����g��q��u}Z����0����V���r�)e���D���_������S8^n_�u����^�r�tP�����F���0a�V<�?M����b�@�_��F��9�0b0.����g�Uj�&�����B����}�~`�r!t�V�4���K�G�A��v��x����e2����O��[�X������ ���Mk�&gD<��=�}n[�J<(��8�x������l��$N<0���5�2�1���`=�*������;F<x��\�|�������a�M�[��sF}�|%���>h�H��5����#�x�J��k+���#O��?b�X������6c�x���������h���M8s?��U:�{�����K<��������Wv������6�����#�u)�fE��'��`;

��SlCLh��X��[pf�Ux���3�v!�`J��?���9?�"
K4D]	G�F�pa�!z�*������/�%t���U^����i3_@�
�����%k��{�������f!�����,�{-3��am�}��e�u���
��kpH�UJa�o�b`��i��G4?�Sf��k#����v��7\�r�e����.�!���4���g����Y��4��=��ler���g�#������E6�x��H� �f��M<�j�
OJg�zW?�jI���M���>s��q�U$_����)Y!�~V[`�|���7�r����X!�:�!����w����U��A�=8�2��-���� �����<�������@I�����<6Sv���-A��g�o�1��f1��f�+0�6��`�A��a�R0Q����S�s�k���������:�*�p�i�Y��w3�kf��d��p��-<��w!�%4����������Q�������R�mym6�?(h���q?������p��+L��G(+�z��y<f��R1W���	��`��2���S��Az������xp��	�7��9s��1��%Kj�s�����7���~����$JQB1�n����R�OA_W����A3���{��;~���������<�}���s�0`Nr���C�f����D���D�[�f�\�]X�!�YN����%.�r����l�4�|���?�kq������D�n���]�eb���L���w(�Ra"�������Q�r���.7y��P�
g�r{S��$ ��v�����K�9��xp!xp}bK�G�B�*V������*����T������k���_�X�v�:~,�X���L�w�"V���y3��k�Y�$k�_E��=V��:#�g�������1u_x{g~�������S8;�6���	������A�0������o�0��V�R�2p������X}����g�0������2���,�`�0A���k`���kF�
��{����z�+���O�������eY���%v^� �)��P<�j�1����
��`�����9��}3}@=�lD�|9Y���f0�i%Xo�l������9��h`�y+�7�T�,���Za�v�UN!'CszP0�v��|+��2Se
�u��f�x/���(���k�t�Y���,�R./���7Q�xqg�&�$%�|�!�f��������[�?N<��^��y���?��Bx.��C'�`�O#�Yt��c{q�_85s�U��dD2��$!��q)*�=���^�{�'��K,(�\_����u�gJ9DR���m.,�p�x`J>��'�!�Ely`*�;�'�A�7������[��U""���xp�2�<JH���\aW��w�K<0��]k���w����d�k�XJ'�Zc��3Wp�6%1����/\���)���"�i��N��GcSYx[��7+]!�����`�Yg!�s[S��=����%\����o,�0�M�em�&��3�����f?�_��l�O������r[u��s
�U9g�z<��f��@��R�(+$\��%���D�E�m�&x��'x0���[�����=�����g��`#��P���LI�LB(����������g��(4��erp++_�
��4��ow��BP�����h�NKV��n�_H(_q�U��A����+b�K�#���_�%4����N��������-����Fw4��g��cLZ��C��������s����IB���Q�
���T��X�J�A��Ys��_�;/u���6.��A.��w(2�}��>��3b�_H(���]�Zu�/����#���`�O�$�x����7a�?8wf+NY'���5//?~���v��h�dvm��mF2!a
���[������A������b��eODs`��x���LF��������4����`H,���1�������.������nK<0S�����|�{�=��Ae��]0
U�����Y�������n���������n|��X	����NGd��$�,����l=7�������O}���R�����}�(���`UQ�Z�LH0����)�}��:=�g�W9yB}�b�x����a\g.�op�r;�<�(� ���fB�{�7�S�M(�P��������uMk���.
��1�q�y<��(FN�����x0�Q;��,e�ym�7�[��%|�y
&?��������X��K������t$�x`~�m��a�9�5��C,�0�s�k����8�{�dy��u{��G��^�A6�a��/QngJ����-t����wB��M��g�~�����?M9���;���#_)��@���v��k����@{��Vye
�*������l��|��{�q>?{��9��L�J-����=� ��=��01c�/�������8���c*���{���jW�o����]oN,	� ��YS.���>�#��w�"Ss-	9�5���?)���0A";�[�r_6�A�r� ���k�J���J90�,N��J=0����}�W���5k�_��=
4d�hHlIJ<0���w��r�����09�������\���,��..� ~��+����U��:������w���E����%�s��F�����yK���2��X�a�����5�[���j����_��4�V��Vl��!���g���>��D���(��F�<b�UHL<��O����pS��QuD���&�v�3ov������j�(�g:�����,�	Ft��2,�`&/�����Z���#���K2���,��X��y\�������ZWo�O�~kO��e���'(�]f��[�^�3����v�7�x��ers���kt��L�W��VIVs�B�7W��|/l�7�����^�E���29�r�����5��������v��ua��_�z��l�~>'D�!\�}�+����6�~��:
��}K�6���?��,�P<8}�V�1��=�[�J���)�`�������>�����5A������&�zc����a/�}j/�6�UJ)a�A����a6?�1�U�3r2�������u�JOi9Q�qm�r�����V�@�ape�#�H<H�W��S�x`R���.��k5~��%|4e&�{�9����m�_[vZ7��k���l��$�xP�d1�LC������;v���*�/mI);��?�b�fq�U��������Ms����<��|Xyb`/����G 9� 9r	�����/$�n��'&8�FZ�/��>��,8����G����=� -�N�������M���R��q{�AF:��J-���%%8����g�����+��Q�79� ��3�a���3m���: �����;�%8����xq�i��0��0�n��p��������I�ZH��3zI���S*d�sp��l�����_�����1l;yKz&�3���mR�AZ�##���x���;���T������z��G��/�kO<�/�����x�h)]?�x���[/1�����m�T�������fB���}'&8�F����Zp�M�mR��m;��O��Bj�iO<Hm{���,��D��K-8���&'������������#m�D<p����n|� =���x����fB� ���P<H��H<H�T�������6�������$$�y�x�<���8C������U��Fu�?%8C/}��x�>\��U���i��lZ3uP[/��8�m����TwA�J<H[���ZZ�����<��V����p�\�����|$0Z�n��e���������!-� }�J<H��mU�Aj���vb��#�u�iE2e�H<H'�Z��pm���'� u��U% �����x`�����?O�g�_ZC�������*� ��:��g�-�����ZH_�����#vw��x � -?�J<HK��-%$�J<��G���;,� ��J<H?���,��1��%��9^��%�
G��EH<p��%H<p�Ssk����x�J<�x���J�iM���$8�L[�/�����
���7A�AZ��mI<H�$��#� �~�%�[���6��%8�[��c��������x�:n�*��M<`�e��u��x���,�2"�7.��;��m���Q����!w����-uQ��9���y�n��4�mBCC�|���Y�w����x��D�vEdd$���q��Z��M��^��M��N������F�y����N����~� ��=M���G��9����j�b�H�N�s�X��1$��
���������cbbp��u���`y�K��>�l����&�f?��f��7�#���~�.��Xi{��\���<�;�w;�L��aaa��{zz�Y��6��R��j;��������W8"�ot��m+g��H�������gr���#<��bRw��>���;��a��8|��8T��H��Hx��8���]=��v�ld�JM$w���������k3��g��W��@1��3��/)���q�t�]���q3�M�8{.��@�������E�������x?��3�o�R��������Ky�"iso\��a�����g-%�����.�N�'�7N������,���w�����w��^�OT�����O�1;�f��\C�������*�h>;��������Z����K����;r?�W����b�*�+%���yp."c�N'<����;o�^q���J�Nm�r3�����H����������\P��~==������
|F�������e�?j���MG�sx�H�s=���b���|9\Q� �����������x�(��?���!�=��w�8R��5�����x�Jp��Yf����E��]��HK������@.������8�uf���,�q��5�Cs���|����w~"������2��Gf���r?b>W���s���H��s$�������O���3�Y��t��>S�?T���p?b�d�������~�n��K<H�+����$����,_���A.��Gf�1�����>�?���?���^,�����Y�#3���r�?���ef�?��zz|:R�ff�_��a��?=��,��Y�G���)O}��?L=���23��������63Kd��C��M��8=��,�#R<X�����gjS����?���J�g�#""��)�vwqqatXL�:_s<� ~$~�:@���p��m���&b����3�_^��?��kAf�����3���57�~���g���Y���n,iu-�,�w�?��3��G�GZ}"�o'��G�?2�[����?t?���7=���G���3�;�����GRJ��YO���pN�^��K����_J���aJI��z��~��r��#��:������Z��M��W8��pn�����~�����%8����E@D@D@D@D@D@D@D@D@D@D@D@D@D@D K�x���_'/" " " " " " " " " " " " " " ��x�?m-" " " " " " " " " " " " " " Y����,��:yp�����ik��$d����������������������������������s$8�O[�����������������������������@�& � Kw�N^D@D@D@D@D@D@D@D@D@D@D@D@D@D@�# ��9~�ZD@D@D@D@D@D@D@D@D@D@D@D@D@D@�4�Y��u�" " " " " " " " " " " " " " "������" " " " " " " " " " " " " " "��	H<������H<p����,M@�A��~������������������������������8G@��s�������������������������������di�t���E@D@D@D@D@D@D@D@D@D@D@D@D@D@D�9����E@D@D@D@D@D@D@D@D@D@D@D@D@D@D K�x���_'/" " " " " " " " " " " " " " ��x�?m-" " " " " " " " " " " " " " Y����,��:yp�����ik��$d����������������������������������s$8�O[�����������������������������@�& � Kw�N^D@D@D@D@D@D@D@D@D@D@D@D@D@D@�# ��9~�ZD@D@D@D@D@D@D@D@D@D@D@D@D@D@�4�Y��u�" " " " " " " " " " " " " " "������" " " " " " " " " " " " " " "��	H<������H<p����,M@�A��~������������������������������8G@��s������������������������������o�'�IDAT��di�t���E@D@D@D@D@D@D@D@D@D@D@D@D@D@D�9����E@D@D@D@D@D@D@D@D@D@D@D@D@D@D K�x���_'/" " " " " " " " " " " " " " ��x�?m-" " " " " " " " " " " " " " Y����,��:yp�����ik��$d����������������������������������s$8�O[�����������������������������@�& � Kw�N^D@D@D@D@D@D@D@D@D@D@D@D@D@D@�# ��9~�ZD@D@D@D@D@D@D@D@D@D@D@D@D@D@�4�Y��u�" " " " " " " " " " " " " " "������" " " " " " " " " " " " " " "��	H<�������?�vmMh+��IEND�B`�
.ninja_logtext/plain; charset=us-asciiDownload
#131Andres Freund
andres@anarazel.de
In reply to: John Naylor (#87)
Re: [RFC] building postgres with meson

Hi,

On 2021-10-22 11:55:05 -0400, John Naylor wrote:

On Thu, Oct 21, 2021 at 5:48 PM Andres Freund <andres@anarazel.de> wrote:

However, update-unicode is a bit harder. Partially not directly because

of

meson, but because update-unicode as-is afaict doesn't support VPATH

builds,

and meson enforces those.

make update-unicode
...
make -C src/common/unicode update-unicode
'/usr/bin/perl' generate-unicode_norm_table.pl
Can't open perl script "generate-unicode_norm_table.pl": No such file or

directory

It's not too hard to fix. See attached for the minimal stuff that I
immediately found to be needed.

Thanks for doing that, it works well enough for demonstration. With your
patch, and using an autoconf VPATH build, the unicode tables work fine, but
it complains of a permission error in generate_unaccent_rules.py. That
seems to be because the script is invoked directly rather than as an
argument to the python interpreter.

Yeah. I encountered a further issue: With autoconf on HEAD, with a source
tree build executed in contrib/unaccent:

This seems to be the same issue as above?

$ touch generate_unaccent_rules.py
$ make update-unicode
generate_unaccent_rules.py --unicode-data-file
../../src/common/unicode/UnicodeData.txt --latin-ascii-file Latin-ASCII.xml

unaccent.rules

/bin/sh: generate_unaccent_rules.py: command not found
make: *** [unaccent.rules] Error 127
make: *** Deleting file `unaccent.rules'

This looks more like you're building without --with-python and you don't have
a 'python' binary (but a python3 binary)?

Independent of my changes the invocation of generate_unaccent_rules looks like

# Allow running this even without --with-python
PYTHON ?= python
...
$(PYTHON) $< --unicode-data-file $(word 2,$^) --latin-ascii-file $(word 3,$^) >$@

so your failure should only happen if PYTHON somehow is empty, otherwise I'd
expect python in front of the failing line?

Anyway, this can be put off until the very end, since it's not run often.
You've demonstrated how these targets would work, and that's good enough
for now.

I'd like to get this stuff out of the patch series, so I'm planning to get
this committable...

Greetings,

Andres Freund

#132Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#128)
Re: [RFC] building postgres with meson -v7

On 09.03.22 17:44, Andres Freund wrote:

v6-0009-prereq-make-unicode-targets-work-in-vpath-builds.patch.gz

Another directory issue

I think it's a tad different, in that it's fixing something that's currently
broken in VPATH builds.

Ok, I took another look at this.

-override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
+override CPPFLAGS := -DFRONTEND 
-I$(abs_top_builddir)/src/common/unicode $(CPPFLAGS)

This could just be

-I.

-   $(PERL) generate-unicode_norm_table.pl
+   $(PERL) $< $(CURDIR)

I didn't detect a need for the additional directory argument. (So the
changes in generate-unicode_norm_table.pl are also apparently not
necessary.) Maybe this is something that will become useful later, in
which case it should be split out from this patch.

The rest of this patch looks ok.

#133Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#128)
12 attachment(s)
Re: [RFC] building postgres with meson -v8

Hi,

Attached is v8. It's just a rebase to resolve conflicts with recent changes.

- Andres

Attachments:

v8-0001-meson-prereq-output-and-depencency-tracking-work.patch.gzapplication/x-patch-gzipDownload
v8-0002-meson-prereq-move-snowball_create.sql-creation-in.patch.gzapplication/x-patch-gzipDownload
v8-0003-meson-prereq-remove-unhelpful-chattiness-in-snowb.patch.gzapplication/x-patch-gzipDownload
v8-0004-meson-prereq-add-output-path-arg-in-generate-lwlo.patch.gzapplication/x-patch-gzipDownload
v8-0005-meson-prereq-generate-errcodes.pl-accept-output-f.patch.gzapplication/x-patch-gzipDownload
v8-0006-meson-prereq-Can-we-get-away-with-not-export-all-.patch.gzapplication/x-patch-gzipDownload
v8-0007-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch.gzapplication/x-patch-gzipDownload
v8-0008-meson-prereq-add-src-tools-gen_versioning_script..patch.gzapplication/x-patch-gzipDownload
v8-0009-prereq-make-unicode-targets-work-in-vpath-builds.patch.gzapplication/x-patch-gzipDownload
v8-0010-wip-split-TESTDIR-into-two.patch.gzapplication/x-patch-gzipDownload
v8-0011-meson-Add-meson-based-buildsystem.patch.gzapplication/x-patch-gzipDownload
v8-0012-meson-ci-Build-both-with-meson-and-as-before.patch.gzapplication/x-patch-gzipDownload
#134Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#127)
1 attachment(s)
Re: [RFC] building postgres with meson -v6

On 09.03.22 13:37, Peter Eisentraut wrote:

v6-0008-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch.gz

I think the right way here is actually to go the other way around:
Move DLSUFFIX into header files for all platforms.  Move the DLSUFFIX
assignment from src/makefiles/ to src/templates/, have configure read
it, and then substitute it into Makefile.global and pg_config.h.

Then we also don't have to patch the Windows build code a bunch of
times to add the DLSUFFIX define everywhere.

This patch should do it.

Attachments:

0001-Refactor-DLSUFFIX-handling.patchtext/plain; charset=UTF-8; name=0001-Refactor-DLSUFFIX-handling.patchDownload
From 763943176a1e0a0c954414ba9da07742ad791656 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Thu, 24 Mar 2022 16:00:54 +0100
Subject: [PATCH] Refactor DLSUFFIX handling

Move DLSUFFIX into header files for all platforms.  Move the DLSUFFIX
assignment from src/makefiles/ to src/templates/, have configure read
it, and then substitute it into Makefile.global and pg_config.h.  This
avoids the need of all users to locally set CPPFLAGS.
---
 config/python.m4                  |  4 +++-
 configure                         | 13 ++++++++++++-
 configure.ac                      |  5 +++++
 src/Makefile.global.in            |  2 ++
 src/backend/jit/Makefile          |  2 --
 src/backend/utils/fmgr/Makefile   |  2 --
 src/backend/utils/fmgr/dfmgr.c    |  5 -----
 src/bin/pg_upgrade/Makefile       |  2 +-
 src/include/pg_config.h.in        |  3 +++
 src/include/port/win32_port.h     |  3 ---
 src/interfaces/ecpg/test/Makefile |  1 -
 src/makefiles/Makefile.aix        |  1 -
 src/makefiles/Makefile.cygwin     |  1 -
 src/makefiles/Makefile.darwin     |  2 --
 src/makefiles/Makefile.freebsd    |  2 --
 src/makefiles/Makefile.hpux       |  6 ------
 src/makefiles/Makefile.linux      |  2 --
 src/makefiles/Makefile.netbsd     |  2 --
 src/makefiles/Makefile.openbsd    |  2 --
 src/makefiles/Makefile.solaris    |  2 --
 src/makefiles/Makefile.win32      |  1 -
 src/template/cygwin               |  2 ++
 src/template/hpux                 |  7 +++++++
 src/template/win32                |  2 ++
 src/test/regress/GNUmakefile      |  3 +--
 src/tools/msvc/Solution.pm        |  1 +
 26 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/config/python.m4 b/config/python.m4
index 52f34070dd..e500873ff3 100644
--- a/config/python.m4
+++ b/config/python.m4
@@ -120,7 +120,9 @@ else
 	found_shlib=0
 	for d in "${python_libdir}" "${python_configdir}" /usr/lib64 /usr/lib
 	do
-		# We don't know the platform DLSUFFIX here, so check 'em all.
+		# Note: DLSUFFIX is for loadable modules, not shared
+		# libraries, so cannot be used here portably.  Just
+		# check all known possibilities.
 		for e in .so .dll .dylib .sl; do
 			if test -e "$d/lib${ldlibrary}$e"; then
 				python_libdir="$d"
diff --git a/configure b/configure
index e066cbe2c8..519cef76a9 100755
--- a/configure
+++ b/configure
@@ -743,6 +743,7 @@ BITCODE_CFLAGS
 CFLAGS_VECTORIZE
 CFLAGS_UNROLL_LOOPS
 PERMIT_DECLARATION_AFTER_STATEMENT
+DLSUFFIX
 LLVM_BINPATH
 LLVM_CXXFLAGS
 LLVM_CFLAGS
@@ -5219,11 +5220,19 @@ fi # fi
 unset CFLAGS
 unset CXXFLAGS
 
+DLSUFFIX=".so"
+
 #
 # Read the template
 #
 . "$srcdir/src/template/$template" || exit
 
+
+
+cat >>confdefs.h <<_ACEOF
+#define DLSUFFIX "$DLSUFFIX"
+_ACEOF
+
 # C[XX]FLAGS are selected so:
 # If the user specifies something in the environment, that is used.
 # else:  If the template file set something, that is used.
@@ -10560,7 +10569,9 @@ else
 	found_shlib=0
 	for d in "${python_libdir}" "${python_configdir}" /usr/lib64 /usr/lib
 	do
-		# We don't know the platform DLSUFFIX here, so check 'em all.
+		# Note: DLSUFFIX is for loadable modules, not shared
+		# libraries, so cannot be used here portably.  Just
+		# check all known possibilities.
 		for e in .so .dll .dylib .sl; do
 			if test -e "$d/lib${ldlibrary}$e"; then
 				python_libdir="$d"
diff --git a/configure.ac b/configure.ac
index 078381e568..79ae882133 100644
--- a/configure.ac
+++ b/configure.ac
@@ -397,11 +397,16 @@ AS_IF([test "$with_llvm" = yes], [
 unset CFLAGS
 unset CXXFLAGS
 
+DLSUFFIX=".so"
+
 #
 # Read the template
 #
 . "$srcdir/src/template/$template" || exit
 
+AC_SUBST(DLSUFFIX)
+AC_DEFINE_UNQUOTED([DLSUFFIX], ["$DLSUFFIX"], [Define to the file name extension of dynamically-loadable modules.])dnl
+
 # C[XX]FLAGS are selected so:
 # If the user specifies something in the environment, that is used.
 # else:  If the template file set something, that is used.
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index bbdc1c4bda..0726b2020f 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -545,6 +545,8 @@ WIN32_STACK_RLIMIT=4194304
 # Set if we have a working win32 crashdump header
 have_win32_dbghelp = @have_win32_dbghelp@
 
+DLSUFFIX = @DLSUFFIX@
+
 # Pull in platform-specific magic
 include $(top_builddir)/src/Makefile.port
 
diff --git a/src/backend/jit/Makefile b/src/backend/jit/Makefile
index a895ebac5f..a9a603e639 100644
--- a/src/backend/jit/Makefile
+++ b/src/backend/jit/Makefile
@@ -15,8 +15,6 @@ subdir = src/backend/jit
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-override CPPFLAGS += -DDLSUFFIX=\"$(DLSUFFIX)\"
-
 OBJS = \
 	jit.o
 
diff --git a/src/backend/utils/fmgr/Makefile b/src/backend/utils/fmgr/Makefile
index f552b95ca9..ceffb807fb 100644
--- a/src/backend/utils/fmgr/Makefile
+++ b/src/backend/utils/fmgr/Makefile
@@ -17,6 +17,4 @@ OBJS = \
 	fmgr.o \
 	funcapi.o
 
-override CPPFLAGS += -DDLSUFFIX=\"$(DLSUFFIX)\"
-
 include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c
index 050da78080..3774f33e0e 100644
--- a/src/backend/utils/fmgr/dfmgr.c
+++ b/src/backend/utils/fmgr/dfmgr.c
@@ -483,11 +483,6 @@ file_exists(const char *name)
 }
 
 
-/* Example format: ".so" */
-#ifndef DLSUFFIX
-#error "DLSUFFIX must be defined to compile this file."
-#endif
-
 /*
  * If name contains a slash, check if the file exists, if so return
  * the name.  Else (no slash) try to expand using search path (see
diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile
index 49b94f0ac7..7a3225b27c 100644
--- a/src/bin/pg_upgrade/Makefile
+++ b/src/bin/pg_upgrade/Makefile
@@ -25,7 +25,7 @@ OBJS = \
 	util.o \
 	version.o
 
-override CPPFLAGS := -DDLSUFFIX=\"$(DLSUFFIX)\" -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
 LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
 
 all: pg_upgrade
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 635fbb2181..9e2ca83993 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -42,6 +42,9 @@
 /* Define to the default TCP port number as a string constant. */
 #undef DEF_PGPORT_STR
 
+/* Define to the file name extension of dynamically-loadable modules. */
+#undef DLSUFFIX
+
 /* Define to build with GSSAPI support. (--with-gssapi) */
 #undef ENABLE_GSS
 
diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h
index d3cb765976..4bb6fc5e1e 100644
--- a/src/include/port/win32_port.h
+++ b/src/include/port/win32_port.h
@@ -529,9 +529,6 @@ typedef unsigned short mode_t;
 #define W_OK 2
 #define R_OK 4
 
-/* Pulled from Makefile.port in MinGW */
-#define DLSUFFIX ".dll"
-
 #endif							/* _MSC_VER */
 
 #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || \
diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index be53b7b94d..10f53c708c 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -12,7 +12,6 @@ override CPPFLAGS := \
 	'-I$(top_srcdir)/src/test/regress' \
 	'-DHOST_TUPLE="$(host_tuple)"' \
 	'-DSHELLPROG="$(SHELL)"' \
-	'-DDLSUFFIX="$(DLSUFFIX)"' \
 	$(CPPFLAGS)
 
 # default encoding for regression tests
diff --git a/src/makefiles/Makefile.aix b/src/makefiles/Makefile.aix
index ba3695dd57..84f26b49b8 100644
--- a/src/makefiles/Makefile.aix
+++ b/src/makefiles/Makefile.aix
@@ -14,7 +14,6 @@ else
 	rpath = -Wl,-blibpath:'$(rpathdir)$(libpath)'
 endif
 
-DLSUFFIX = .so
 ifeq ($(host_os), aix3.2.5)
 ifneq ($(GCC), yes)
 	LDFLAGS_SL += -e _nostart -H512 -bM:SRE
diff --git a/src/makefiles/Makefile.cygwin b/src/makefiles/Makefile.cygwin
index 81089d6257..6afa9a06a1 100644
--- a/src/makefiles/Makefile.cygwin
+++ b/src/makefiles/Makefile.cygwin
@@ -11,7 +11,6 @@ endif
 LIBS:=$(filter-out -lm -lc, $(LIBS))
 
 AROPT = crs
-DLSUFFIX = .dll
 
 override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT)
 
diff --git a/src/makefiles/Makefile.darwin b/src/makefiles/Makefile.darwin
index b17598f058..4fc81c1584 100644
--- a/src/makefiles/Makefile.darwin
+++ b/src/makefiles/Makefile.darwin
@@ -1,7 +1,5 @@
 AROPT = crs
 
-DLSUFFIX = .so
-
 # env var name to use in place of LD_LIBRARY_PATH
 ld_library_path_var = DYLD_LIBRARY_PATH
 
diff --git a/src/makefiles/Makefile.freebsd b/src/makefiles/Makefile.freebsd
index 75db21ba14..0e77616b0f 100644
--- a/src/makefiles/Makefile.freebsd
+++ b/src/makefiles/Makefile.freebsd
@@ -3,8 +3,6 @@ AROPT = cr
 export_dynamic = -Wl,-export-dynamic
 rpath = -Wl,-R'$(rpathdir)'
 
-DLSUFFIX = .so
-
 # extra stuff for $(with_temp_install)
 # we need this to get LD_LIBRARY_PATH searched ahead of the compiled-in
 # rpath, if no DT_RUNPATH is present in the executable. The conditions
diff --git a/src/makefiles/Makefile.hpux b/src/makefiles/Makefile.hpux
index 7e18770d89..25e036bd8d 100644
--- a/src/makefiles/Makefile.hpux
+++ b/src/makefiles/Makefile.hpux
@@ -25,12 +25,6 @@ INSTALL_SHLIB_OPTS = -m 555
 
 AROPT = crs
 
-ifeq ($(host_cpu), ia64)
-   DLSUFFIX = .so
-else
-   DLSUFFIX = .sl
-endif
-
 # env var name to use in place of LD_LIBRARY_PATH
 ld_library_path_var = SHLIB_PATH
 
diff --git a/src/makefiles/Makefile.linux b/src/makefiles/Makefile.linux
index 645f73aa2b..1ffec9d169 100644
--- a/src/makefiles/Makefile.linux
+++ b/src/makefiles/Makefile.linux
@@ -5,8 +5,6 @@ export_dynamic = -Wl,-E
 # This allows LD_LIBRARY_PATH to still work when needed.
 rpath = -Wl,-rpath,'$(rpathdir)',--enable-new-dtags
 
-DLSUFFIX = .so
-
 
 # Rule for building a shared library from a single .o file
 %.so: %.o
diff --git a/src/makefiles/Makefile.netbsd b/src/makefiles/Makefile.netbsd
index 6f9cb1d45d..421b735e40 100644
--- a/src/makefiles/Makefile.netbsd
+++ b/src/makefiles/Makefile.netbsd
@@ -3,8 +3,6 @@ AROPT = cr
 export_dynamic = -Wl,-E
 rpath = -Wl,-R'$(rpathdir)'
 
-DLSUFFIX = .so
-
 
 # Rule for building a shared library from a single .o file
 %.so: %.o
diff --git a/src/makefiles/Makefile.openbsd b/src/makefiles/Makefile.openbsd
index 6f9cb1d45d..421b735e40 100644
--- a/src/makefiles/Makefile.openbsd
+++ b/src/makefiles/Makefile.openbsd
@@ -3,8 +3,6 @@ AROPT = cr
 export_dynamic = -Wl,-E
 rpath = -Wl,-R'$(rpathdir)'
 
-DLSUFFIX = .so
-
 
 # Rule for building a shared library from a single .o file
 %.so: %.o
diff --git a/src/makefiles/Makefile.solaris b/src/makefiles/Makefile.solaris
index 62a6c01c3a..5496edcafc 100644
--- a/src/makefiles/Makefile.solaris
+++ b/src/makefiles/Makefile.solaris
@@ -9,8 +9,6 @@ else
 rpath = -Wl,-R'$(rpathdir)'
 endif
 
-DLSUFFIX = .so
-
 
 # Rule for building a shared library from a single .o file
 %.so: %.o
diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32
index e72cb2db0e..17d6819644 100644
--- a/src/makefiles/Makefile.win32
+++ b/src/makefiles/Makefile.win32
@@ -11,7 +11,6 @@ endif
 override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT)
 
 AROPT = crs
-DLSUFFIX = .dll
 
 ifneq (,$(findstring backend,$(subdir)))
 ifeq (,$(findstring conversion_procs,$(subdir)))
diff --git a/src/template/cygwin b/src/template/cygwin
index 1e7274bc33..3f42e2f8b6 100644
--- a/src/template/cygwin
+++ b/src/template/cygwin
@@ -13,3 +13,5 @@ CFLAGS_SL=""
 # we'd prefer to use --disable-auto-import to match MSVC linking behavior,
 # but support for it in Cygwin is too haphazard
 LDFLAGS="$LDFLAGS -Wl,--allow-multiple-definition -Wl,--enable-auto-import"
+
+DLSUFFIX=".dll"
diff --git a/src/template/hpux b/src/template/hpux
index 50fff80c53..5105a74c78 100644
--- a/src/template/hpux
+++ b/src/template/hpux
@@ -25,3 +25,10 @@ case $host in
 	fi
     ;;
 esac
+
+case $host_cpu in
+  ia64)
+    DLSUFFIX=".so";;
+  *)
+    DLSUFFIX=".sl";;
+esac
diff --git a/src/template/win32 b/src/template/win32
index 1380d16548..1895f067a8 100644
--- a/src/template/win32
+++ b/src/template/win32
@@ -7,3 +7,5 @@ CFLAGS_SL=""
 # pg_toupper() etc. in both libpq and pgport
 # --disable-auto-import is to ensure we get MSVC-like linking behavior
 LDFLAGS="$LDFLAGS -Wl,--allow-multiple-definition -Wl,--disable-auto-import"
+
+DLSUFFIX=".dll"
diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile
index b40361c84c..88b82d9268 100644
--- a/src/test/regress/GNUmakefile
+++ b/src/test/regress/GNUmakefile
@@ -25,8 +25,7 @@ endif
 
 # stuff to pass into build of pg_regress
 EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \
-	'-DSHELLPROG="$(SHELL)"' \
-	'-DDLSUFFIX="$(DLSUFFIX)"'
+	'-DSHELLPROG="$(SHELL)"'
 
 ##
 ## Prepare for tests
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index a21ea9bef9..ef5476d034 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -216,6 +216,7 @@ sub GenerateFiles
 		CONFIGURE_ARGS             => '"' . $self->GetFakeConfigure() . '"',
 		DEF_PGPORT                 => $port,
 		DEF_PGPORT_STR             => qq{"$port"},
+		DLSUFFIX                   => '".dll"',
 		ENABLE_GSS                 => $self->{options}->{gss} ? 1 : undef,
 		ENABLE_NLS                 => $self->{options}->{nls} ? 1 : undef,
 		ENABLE_THREAD_SAFETY       => 1,
-- 
2.35.1

#135Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#134)
Re: [RFC] building postgres with meson -v6

Hi,

On 2022-03-24 16:16:15 +0100, Peter Eisentraut wrote:

On 09.03.22 13:37, Peter Eisentraut wrote:

v6-0008-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch.gz

I think the right way here is actually to go the other way around:
Move DLSUFFIX into header files for all platforms.� Move the DLSUFFIX
assignment from src/makefiles/ to src/templates/, have configure read
it, and then substitute it into Makefile.global and pg_config.h.

Then we also don't have to patch the Windows build code a bunch of
times to add the DLSUFFIX define everywhere.

This patch should do it.

From 763943176a1e0a0c954414ba9da07742ad791656 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Thu, 24 Mar 2022 16:00:54 +0100
Subject: [PATCH] Refactor DLSUFFIX handling

Move DLSUFFIX into header files for all platforms. Move the DLSUFFIX
assignment from src/makefiles/ to src/templates/, have configure read
it, and then substitute it into Makefile.global and pg_config.h. This
avoids the need of all users to locally set CPPFLAGS.

Reading through it, this looks good to me. Thanks!

Greetings,

Andres Freund

#136Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#133)
Re: [RFC] building postgres with meson -v8

On 22.03.22 03:22, Andres Freund wrote:

Attached is v8. It's just a rebase to resolve conflicts with recent changes.

I have committed the DLSUFFIX refactoring, and also a stripped-down
version of the patch that makes update-unicode work with vpath. This
takes care of patches 0007 and 0009.

Patch 0006 (visibility) has its own CF entry.

The only other thing IMO that might be worth addressing in PG15 is the
snowball scripts refactoring (0002 and 0003), but that doesn't seem
quite ready yet. (At least, it would need to be integrated into the
distprep target, since it adds a dependency on perl.) Maybe it's not
worth it right now.

With that, I suggest moving this patch set to CF 2022-07.

A general comment on the remaining prereq patches: We appear to be
accumulating a mix of conventions for how "generate" scripts specify
their output file. Some have it built-in, some use the last argument,
some use an option, which might be -o or --output. Maybe we can gently
work toward more commonality there.

#137Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#136)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-03-25 10:01:09 +0100, Peter Eisentraut wrote:

On 22.03.22 03:22, Andres Freund wrote:

Attached is v8. It's just a rebase to resolve conflicts with recent changes.

I have committed the DLSUFFIX refactoring, and also a stripped-down version
of the patch that makes update-unicode work with vpath. This takes care of
patches 0007 and 0009.

Thanks!

The only other thing IMO that might be worth addressing in PG15 is the
snowball scripts refactoring (0002 and 0003), but that doesn't seem quite
ready yet. (At least, it would need to be integrated into the distprep
target, since it adds a dependency on perl.) Maybe it's not worth it right
now.

Not sure myself.

With that, I suggest moving this patch set to CF 2022-07.

Done.

One thing I'd like to discuss fairly soon is what kind of approach to take for
integrating meson support. Most other projects I looked kept parallel
buildsystems for at least a release, so that there's one round of "broad" user
feedback.

In our context it could make sense to merge meson, after a few months of
shakeup remove the current windows buildsystems, and then in release + 1
remove the make based stuff.

But we can have that discussion that before the next CF, but still after
code-freeze & immediate mopup.

A general comment on the remaining prereq patches: We appear to be
accumulating a mix of conventions for how "generate" scripts specify their
output file. Some have it built-in, some use the last argument, some use an
option, which might be -o or --output. Maybe we can gently work toward more
commonality there.

Fair point.

Greetings,

Andres Freund

#138Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#137)
Re: [RFC] building postgres with meson -v8

On 3/28/22 15:59, Andres Freund wrote:

One thing I'd like to discuss fairly soon is what kind of approach to take for
integrating meson support. Most other projects I looked kept parallel
buildsystems for at least a release, so that there's one round of "broad" user
feedback.

We did something similar when we moved from CVS to git.

In our context it could make sense to merge meson, after a few months of
shakeup remove the current windows buildsystems, and then in release + 1
remove the make based stuff.

But we can have that discussion that before the next CF, but still after
code-freeze & immediate mopup.

I'd like to get a stake in the ground and then start working on
buildfarm support. Up to now I think it's been a bit too much of a
moving target. Essentially that would mean an interim option for
building with meson.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#139Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#138)
Re: [RFC] building postgres with meson -v8

Andrew Dunstan <andrew@dunslane.net> writes:

On 3/28/22 15:59, Andres Freund wrote:

In our context it could make sense to merge meson, after a few months of
shakeup remove the current windows buildsystems, and then in release + 1
remove the make based stuff.

That sounds like a decent plan.

I'd like to get a stake in the ground and then start working on
buildfarm support. Up to now I think it's been a bit too much of a
moving target. Essentially that would mean an interim option for
building with meson.

If we can commit meson build infrastructure without removing the
existing infrastructure, then the buildfarm can continue to work,
and we can roll out support for the new way slowly. It'd be
fairly impractical to expect all buildfarm animals to update
instantly anyhow.

regards, tom lane

#140Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#139)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-03-28 18:58:19 -0400, Tom Lane wrote:

If we can commit meson build infrastructure without removing the
existing infrastructure, then the buildfarm can continue to work,
and we can roll out support for the new way slowly.

I think it's not a huge issue to have both for a while. Of course it's
annoying to have to update two files when adding a source file, but it's not
the end of the world for a limited time. IMO.

It'd be fairly impractical to expect all buildfarm animals to update
instantly anyhow.

And development workflows. I expect some unforseen breakages somewhere, given
the variety of systems out there.

Greetings,

Andres Freund

#141Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#140)
5 attachment(s)
Re: [RFC] building postgres with meson -v8

Some feedback and patches for your branch at
3274198960c139328fef3c725cee1468bbfff469:

0001-Install-a-few-more-files.patch

These are just some files that were apparently forgotten to be installed
so far.

0002-Adjust-some-header-file-installation-paths.patch

The installation of server headers is apparently still in progress.
This just adjusts the installation directory of those that are already
being dealt with, so they match the existing installation layout.

0003-Fix-warnings-about-deprecated-features.patch

This fixes some deprecation warnings and raises the requirement to 0.56.
I'm not sure why the current cutoff at 0.54 was chosen. Perhaps that
could be documented. If we choose to stay with 0.54, is there a way to
turn off deprecation warnings, so not everyone needs to see them?

0004-Install-postmaster-symlink.patch

This needs 0.61, so maybe it's a bit too new. Or we could get rid of
the postmaster symlink altogether?

0005-Workaround-for-Perl-detection.patch

This is needed on my system to get the Perl detection to pass. If I
look at the equivalent configure code, some more refinement appears to
be needed in this area.

Attachments:

0001-Install-a-few-more-files.patchtext/plain; charset=UTF-8; name=0001-Install-a-few-more-files.patchDownload
From 15108c90960235a9c61b8d001eb68c563f9f8aa1 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:06:28 +0200
Subject: [PATCH 1/5] Install a few more files

---
 contrib/hstore/meson.build    | 1 +
 src/backend/utils/meson.build | 2 ++
 src/bin/psql/meson.build      | 2 ++
 src/include/meson.build       | 2 ++
 4 files changed, 7 insertions(+)

diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 661e61f969..e1e634b948 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -17,6 +17,7 @@ hstore = shared_module('hstore',
 install_data(
   'hstore.control',
   'hstore--1.1--1.2.sql',
+  'hstore--1.2--1.3.sql',
   'hstore--1.3--1.4.sql',
   'hstore--1.4.sql',
   'hstore--1.4--1.5.sql',
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
index afb1c0346b..a936005886 100644
--- a/src/backend/utils/meson.build
+++ b/src/backend/utils/meson.build
@@ -1,3 +1,5 @@
+install_data('errcodes.txt', install_dir: 'share/')
+
 subdir('activity')
 subdir('adt')
 subdir('cache')
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 75905a52c1..f9e3b1a32b 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -52,6 +52,8 @@ executable('psql',
   kwargs: default_bin_args,
 )
 
+install_data('psqlrc.sample', install_dir: 'share/')
+
 tap_tests += {
   'name': 'psql',
   'sd': meson.current_source_dir(),
diff --git a/src/include/meson.build b/src/include/meson.build
index c3af4a2574..86d91f55d6 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -43,6 +43,8 @@ configure_file(
   install: false
 )
 
+install_headers('postgres_ext.h')
+
 
 subdir('utils')
 subdir('storage')
-- 
2.35.1

0002-Adjust-some-header-file-installation-paths.patchtext/plain; charset=UTF-8; name=0002-Adjust-some-header-file-installation-paths.patchDownload
From a5eaca807fb46fb20148cec28392d9fc13174d4d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:07:02 +0200
Subject: [PATCH 2/5] Adjust some header file installation paths

---
 src/include/catalog/meson.build  | 4 ++--
 src/include/parser/meson.build   | 2 +-
 src/include/storage/meson.build  | 2 +-
 src/interfaces/libpq/meson.build | 3 +--
 4 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
index f5bc294c81..5ccb84ee34 100644
--- a/src/include/catalog/meson.build
+++ b/src/include/catalog/meson.build
@@ -94,13 +94,13 @@ bki_data = files(
 
 input = []
 output_files = ['postgres.bki', 'schemapg.h', 'system_fk_info.h', 'system_constraints.sql']
-output_install = [get_option('datadir'), get_option('includedir'), get_option('includedir'), get_option('datadir')]
+output_install = [get_option('datadir'), get_option('includedir') / 'server/catalog', get_option('includedir') / 'server/catalog', get_option('datadir')]
 
 foreach h : catalog_headers
   fname = h.split('.h')[0]+'_d.h'
   input += files(h)
   output_files += fname
-  output_install += get_option('includedir')
+  output_install += get_option('includedir') / 'server/catalog'
 endforeach
 
 generated_headers += custom_target('generated_catalog_headers',
diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build
index caf4c09290..a8df3db7fe 100644
--- a/src/include/parser/meson.build
+++ b/src/include/parser/meson.build
@@ -4,7 +4,7 @@ backend_parser_header = custom_target('gram',
   command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT0@'],
   install: true,
   # Only install gram.h, not gram.c
-  install_dir: [false, get_option('includedir')]
+  install_dir: [false, get_option('includedir') / 'server/parser']
 )
 
 #generated_backend_headers += backend_parser[1]
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
index ef2bbb7c6f..63b110cbef 100644
--- a/src/include/storage/meson.build
+++ b/src/include/storage/meson.build
@@ -8,7 +8,7 @@ lwlocknames = custom_target('lwlocknames',
   command : [perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@'],
   build_by_default: true,
   install: true,
-  install_dir: [get_option('includedir'), false],
+  install_dir: [get_option('includedir') / 'server/storage', false],
 )
 
 lwlocknames_h = lwlocknames[0]
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 0e422c1ae6..ce948e7568 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -103,8 +103,7 @@ libpq = declare_dependency(
 )
 
 install_headers('libpq-fe.h', 'libpq-events.h')
-# FIXME: adjust path
-install_headers('libpq-int.h', 'pqexpbuffer.h')
+install_headers('libpq-int.h', 'pqexpbuffer.h', install_dir: get_option('includedir') / 'internal')
 install_data('pg_service.conf.sample', install_dir: get_option('datadir'))
 
 
-- 
2.35.1

0003-Fix-warnings-about-deprecated-features.patchtext/plain; charset=UTF-8; name=0003-Fix-warnings-about-deprecated-features.patchDownload
From 4a5a7439265bd671a14284025b2fac3c6932930b Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:18:46 +0200
Subject: [PATCH 3/5] Fix warnings about deprecated features

---
 contrib/dblink/meson.build        |  2 +-
 contrib/postgres_fdw/meson.build  |  2 +-
 meson.build                       | 26 +++++++++++++-------------
 src/bin/pg_basebackup/meson.build |  8 ++++----
 4 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
index af277b9600..02e6a85a15 100644
--- a/contrib/dblink/meson.build
+++ b/contrib/dblink/meson.build
@@ -24,5 +24,5 @@ regress_tests += {
   'sql': [
     'dblink',
   ],
-  'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  'regress_args': ['--dlpath', meson.project_build_root() / 'src/test/regress'],
 }
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
index 507d01448b..9e8a95ddc5 100644
--- a/contrib/postgres_fdw/meson.build
+++ b/contrib/postgres_fdw/meson.build
@@ -27,5 +27,5 @@ regress_tests += {
   'sql': [
     'postgres_fdw'
   ],
-  'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  'regress_args': ['--dlpath', meson.project_build_root() / 'src/test/regress'],
 }
diff --git a/meson.build b/meson.build
index adb6a5666c..9df1c85d51 100644
--- a/meson.build
+++ b/meson.build
@@ -2,7 +2,7 @@ project('postgresql',
   ['c'],
   version: '15devel',
   license: 'PostgreSQL',
-  meson_version: '>=0.54',
+  meson_version: '>=0.56',
   default_options: [
     'warning_level=2',
     'b_pie=true',
@@ -358,7 +358,7 @@ if not llvmopt.disabled()
 
     if ccache.found()
       llvm_irgen_command = ccache
-      llvm_irgen_args = [clang.path()] + llvm_irgen_args
+      llvm_irgen_args = [clang.full_path()] + llvm_irgen_args
     else
       llvm_irgen_command = clang
     endif
@@ -1935,7 +1935,7 @@ endif
 ###
 
 rc_cdata = configuration_data()
-rc_cdata.set_quoted('ICO', meson.source_root() / 'src' / 'port' / 'win32.ico')
+rc_cdata.set_quoted('ICO', meson.project_source_root() / 'src' / 'port' / 'win32.ico')
 
 rc_lib_cdata = rc_cdata
 rc_lib_cdata.set('VFT_TYPE', 'VFT_DLL')
@@ -2074,7 +2074,7 @@ if fs.is_absolute(get_option('prefix'))
 endif
 
 # DESTDIR for the installation used to run tests in
-test_install_destdir = meson.build_root() / 'tmp_install/'
+test_install_destdir = meson.project_build_root() / 'tmp_install/'
 # DESTDIR + prefix appropriately munged
 test_install_location = test_install_destdir / test_prefix
 
@@ -2086,7 +2086,7 @@ test('tmp_install',
     is_parallel: false,
     suite: ['setup'])
 
-test_result_dir = meson.build_root() / 'testrun'
+test_result_dir = meson.project_build_root() / 'testrun'
 
 
 # XXX: pg_regress doesn't assign unique ports on windows. To avoid the
@@ -2150,9 +2150,9 @@ foreach t : regress_tests
     'depends': test_deps + t.get('deps', []),
     'env': env,
     'args': [
-      testwrap.path(),
+      testwrap.full_path(),
       t['sd'],
-      meson.build_root(),
+      meson.project_build_root(),
       t['bd'],
       t['name'],
       'pg_regress',
@@ -2207,9 +2207,9 @@ foreach t : isolation_tests
     'depends': test_deps + t.get('deps', []),
     'env': env,
     'args': [
-      testwrap.path(),
+      testwrap.full_path(),
       t['sd'],
-      meson.build_root(),
+      meson.project_build_root(),
       t['bd'],
       t['name'],
       'isolation',
@@ -2244,8 +2244,8 @@ if get_option('enable-tap-tests')
 
   foreach t : tap_tests
     test_command = [
-      perl.path(),
-      '-I', meson.source_root() / 'src/test/perl',
+      perl.full_path(),
+      '-I', meson.project_source_root() / 'src/test/perl',
       '-I', t['sd'],
     ]
 
@@ -2272,9 +2272,9 @@ if get_option('enable-tap-tests')
         sh,
         kwargs: test_kwargs,
         args: [
-          testwrap.path(),
+          testwrap.full_path(),
           t['sd'],
-          meson.build_root(),
+          meson.project_build_root(),
           t['bd'],
           t['name'],
           onetap,
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index 9bd45585a9..b5617b818f 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -42,10 +42,10 @@ tap_tests += {
   'name' : 'pg_basebackup',
   'sd': meson.current_source_dir(),
   'bd': meson.current_build_dir(),
-  'env': {'GZIP_PROGRAM': gzip.path(),
-          'TAR': tar.path(),
-          'LZ4': program_lz4.found() ? program_lz4.path() : '',
-          'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+  'env': {'GZIP_PROGRAM': gzip.full_path(),
+          'TAR': tar.full_path(),
+          'LZ4': program_lz4.found() ? program_lz4.full_path() : '',
+          'ZSTD': program_zstd.found() ? program_zstd.full_path() : ''},
   'tests': [
     't/010_pg_basebackup.pl',
     't/020_pg_receivewal.pl',
-- 
2.35.1

0004-Install-postmaster-symlink.patchtext/plain; charset=UTF-8; name=0004-Install-postmaster-symlink.patchDownload
From 5369fde7cce715a1b7a9072b724ebff60796a2de Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:19:47 +0200
Subject: [PATCH 4/5] Install postmaster symlink

---
 meson.build             | 2 +-
 src/backend/meson.build | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index 9df1c85d51..1bf53ea24d 100644
--- a/meson.build
+++ b/meson.build
@@ -2,7 +2,7 @@ project('postgresql',
   ['c'],
   version: '15devel',
   license: 'PostgreSQL',
-  meson_version: '>=0.56',
+  meson_version: '>=0.61',
   default_options: [
     'warning_level=2',
     'b_pie=true',
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 0098411c6b..6814d5094c 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -118,6 +118,8 @@ else
     kwargs: default_bin_args,
   )
 
+  install_symlink('postmaster', pointing_to: 'postgres', install_dir: get_option('bindir'))
+
 endif
 
 backend_targets += postgres
-- 
2.35.1

0005-Workaround-for-Perl-detection.patchtext/plain; charset=UTF-8; name=0005-Workaround-for-Perl-detection.patchDownload
From 1f80e1ebb8efeb0eba7d57032282520fd6455b0d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:50:52 +0200
Subject: [PATCH 5/5] Workaround for Perl detection

---
 meson.build | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/meson.build b/meson.build
index 1bf53ea24d..e33ed11b08 100644
--- a/meson.build
+++ b/meson.build
@@ -545,9 +545,9 @@ else
   # file existence.
   if perl_may_work
     perl_ccflags += ['-I@0@'.format(perl_inc_dir)]
-    if host_machine.system() == 'darwin'
-      perl_ccflags += ['-iwithsysroot', perl_inc_dir]
-    endif
+    #if host_machine.system() == 'darwin'
+    #  perl_ccflags += ['-iwithsysroot', perl_inc_dir]
+    #endif
   endif
 
   # check required headers are present
-- 
2.35.1

#142Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#141)
1 attachment(s)
Re: [RFC] building postgres with meson -v8

On 13.04.22 12:26, Peter Eisentraut wrote:

Some feedback and patches for your branch at
3274198960c139328fef3c725cee1468bbfff469:

Here is another patch. It adds support for building ecpg.

Attachments:

0006-meson-Add-ecpg.patchtext/plain; charset=UTF-8; name=0006-meson-Add-ecpg.patchDownload
From 35a23442727cdf82558c7e5eab85bc29df86b5d5 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 20 Apr 2022 10:54:29 +0200
Subject: [PATCH 6/6] meson: Add ecpg

---
 meson.build                                |  5 ++
 src/interfaces/ecpg/compatlib/meson.build  |  8 ++++
 src/interfaces/ecpg/ecpglib/meson.build    | 17 +++++++
 src/interfaces/ecpg/include/meson.build    | 46 ++++++++++++++++++
 src/interfaces/ecpg/meson.build            |  5 ++
 src/interfaces/ecpg/pgtypeslib/meson.build | 12 +++++
 src/interfaces/ecpg/preproc/Makefile       |  2 +-
 src/interfaces/ecpg/preproc/meson.build    | 55 ++++++++++++++++++++++
 src/interfaces/ecpg/preproc/parse.pl       |  6 ++-
 src/interfaces/meson.build                 |  1 +
 src/meson.build                            |  2 +
 11 files changed, 157 insertions(+), 2 deletions(-)
 create mode 100644 src/interfaces/ecpg/compatlib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/meson.build
 create mode 100644 src/interfaces/ecpg/include/meson.build
 create mode 100644 src/interfaces/ecpg/meson.build
 create mode 100644 src/interfaces/ecpg/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/meson.build
 create mode 100644 src/interfaces/meson.build

diff --git a/meson.build b/meson.build
index e33ed11b08..bd6f1759e8 100644
--- a/meson.build
+++ b/meson.build
@@ -1637,6 +1637,11 @@ else
   cdata.set('STRERROR_R_INT', false)
 endif
 
+# XXX replace with real test
+if host_machine.system() == 'darwin'
+  cdata.set('LOCALE_T_IN_XLOCALE', true)
+endif
+
 # MSVC doesn't cope well with defining restrict to __restrict, the
 # spelling it understands, because it conflicts with
 # __declspec(restrict). Therefore we define pg_restrict to the
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
new file mode 100644
index 0000000000..68ae270038
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -0,0 +1,8 @@
+library('ecpg_compat',
+        'informix.c',
+        include_directories : ['.', '../include', postgres_inc, '../../libpq'],
+        dependencies: [frontend_shlib_code, thread_dep],
+        link_with: [ecpglib, ecpg_pgtypes],
+        soversion: 3,
+        install: true,
+       )
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
new file mode 100644
index 0000000000..c32fc13871
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -0,0 +1,17 @@
+ecpglib = library('ecpg',
+                  'connect.c',
+                  'data.c',
+                  'descriptor.c',
+                  'error.c',
+                  'execute.c',
+                  'memory.c',
+                  'misc.c',
+                  'prepare.c',
+                  'sqlda.c',
+                  'typename.c',
+                  include_directories : ['.', '../include', postgres_inc],
+                  dependencies: [frontend_shlib_code, libpq, thread_dep],
+                  link_with: [ecpg_pgtypes],
+                  soversion: 6,
+                  install: true,
+                 )
diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build
new file mode 100644
index 0000000000..840a23998d
--- /dev/null
+++ b/src/interfaces/ecpg/include/meson.build
@@ -0,0 +1,46 @@
+ecpg_conf_keys = [
+  'ENABLE_THREAD_SAFETY',
+  'HAVE_INT64',
+  'HAVE_LONG_INT_64',
+  'HAVE_LONG_LONG_INT_64',
+  'PG_USE_STDBOOL',
+]
+
+ecpg_conf_data = configuration_data()
+
+foreach key : ecpg_conf_keys
+  if cdata.has(key)
+    ecpg_conf_data.set(key, cdata.get(key))
+  endif
+endforeach
+
+configure_file(
+  output: 'ecpg_config.h',
+  configuration: ecpg_conf_data,
+  install_dir: get_option('includedir'),
+)
+
+install_headers(
+  'ecpg_informix.h',
+  'ecpgerrno.h',
+  'ecpglib.h',
+  'ecpgtype.h',
+  'pgtypes.h',
+  'pgtypes_date.h',
+  'pgtypes_error.h',
+  'pgtypes_interval.h',
+  'pgtypes_numeric.h',
+  'pgtypes_timestamp.h',
+  'sql3types.h',
+  'sqlca.h',
+  'sqlda.h',
+  'sqlda-compat.h',
+  'sqlda-native.h',
+)
+
+install_headers(
+  'datetime.h',
+  'decimal.h',
+  'sqltypes.h',
+  subdir: 'informix/esql',
+)
diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build
new file mode 100644
index 0000000000..ffbe84c0e8
--- /dev/null
+++ b/src/interfaces/ecpg/meson.build
@@ -0,0 +1,5 @@
+subdir('include')
+subdir('pgtypeslib')
+subdir('ecpglib')
+subdir('compatlib')
+subdir('preproc')
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
new file mode 100644
index 0000000000..9b1d54c019
--- /dev/null
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -0,0 +1,12 @@
+ecpg_pgtypes = library('pgtypes',
+                       'common.c',
+                       'datetime.c',
+                       'dt_common.c',
+                       'interval.c',
+                       'numeric.c',
+                       'timestamp.c',
+                       include_directories : ['.', '../include', postgres_inc],
+                       dependencies: [frontend_shlib_code],
+                       soversion: 3,
+                       install: true,
+                      )
diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index ef6d645dee..747d824de3 100644
--- a/src/interfaces/ecpg/preproc/Makefile
+++ b/src/interfaces/ecpg/preproc/Makefile
@@ -65,7 +65,7 @@ preproc.h: preproc.c
 preproc.c: BISONFLAGS += -d
 
 preproc.y: ../../../backend/parser/gram.y parse.pl ecpg.addons ecpg.header ecpg.tokens ecpg.trailer ecpg.type
-	$(PERL) $(srcdir)/parse.pl $(srcdir) < $< > $@
+	$(PERL) $(srcdir)/parse.pl $(srcdir) $< > $@
 	$(PERL) $(srcdir)/check_rules.pl $(srcdir) $<
 
 # generate keyword headers
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
new file mode 100644
index 0000000000..4ae56f21d4
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -0,0 +1,55 @@
+pgc_c = custom_target('pgc.c',
+                      input: ['pgc.l'],
+                      output: ['pgc.c'],
+                      command: [flex, '-o', '@OUTPUT@', '@INPUT@'])
+
+preproc_y = custom_target('preproc.y',
+                          input: ['../../../backend/parser/gram.y',
+                                  'parse.pl',
+                                  'ecpg.addons',
+                                  'ecpg.header',
+                                  'ecpg.tokens',
+                                  'ecpg.trailer',
+                                  'ecpg.type'],
+                          output: ['preproc.y'],
+                          command: [perl, '@INPUT1@', '@CURRENT_SOURCE_DIR@', '@INPUT0@'],
+                          capture: true)
+
+preproc_c = custom_target('preproc.c',
+                          input: [preproc_y],
+                          output: ['preproc.c', 'preproc.h'],
+                          command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT@'])
+
+c_kwlist_d_h = custom_target('c_kwlist_d.h',
+                             input: ['c_kwlist.h'],
+                             output: ['c_kwlist_d.h'],
+                             command: [perl, '-I', '@SOURCE_ROOT@/src/tools', '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+                                       '--output', '@OUTDIR@',
+                                       '--varname', 'ScanCKeywords', '--no-case-fold', '@INPUT0@'])
+
+ecpg_kwlist_d_h = custom_target('ecpg_kwlist_d.h',
+                             input: ['ecpg_kwlist.h'],
+                             output: ['ecpg_kwlist_d.h'],
+                             command: [perl, '-I', '@SOURCE_ROOT@/src/tools', '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+                                       '--output', '@OUTDIR@',
+                                       '--varname', 'ScanECPGKeywords', '@INPUT0@'])
+
+executable('ecpg',
+           'c_keywords.c',
+           'descriptor.c',
+           'ecpg.c',
+           'ecpg_keywords.c',
+           'keywords.c',
+           'output.c',
+           'parser.c',
+           pgc_c,
+           preproc_c,
+           'type.c',
+           '../ecpglib/typename.c',
+           'variable.c',
+           c_kwlist_d_h,
+           ecpg_kwlist_d_h,
+           include_directories : ['.', '../include', postgres_inc],
+           dependencies: [frontend_shlib_code, libpq],
+           kwargs: default_bin_args,
+          )
diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl
index dee6b8200d..0dd9f30b41 100644
--- a/src/interfaces/ecpg/preproc/parse.pl
+++ b/src/interfaces/ecpg/preproc/parse.pl
@@ -19,6 +19,8 @@
 my $path = shift @ARGV;
 $path = "." unless $path;
 
+open(our $infile, '<', $ARGV[0]) or die;
+
 my $copymode              = 0;
 my $brace_indent          = 0;
 my $yaccmode              = 0;
@@ -132,9 +134,11 @@
 include_file('trailer', 'ecpg.trailer');
 dump_buffer('trailer');
 
+close($infile);
+
 sub main
 {
-  line: while (<>)
+  line: while (<$infile>)
 	{
 		if (/ERRCODE_FEATURE_NOT_SUPPORTED/)
 		{
diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build
new file mode 100644
index 0000000000..fb85e3fd20
--- /dev/null
+++ b/src/interfaces/meson.build
@@ -0,0 +1 @@
+subdir('ecpg')
diff --git a/src/meson.build b/src/meson.build
index 414be1db41..a7fdd5a13e 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -8,3 +8,5 @@ subdir('backend')
 subdir('bin')
 
 subdir('pl')
+
+subdir('interfaces')
-- 
2.35.1

#143Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#141)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-04-13 12:26:05 +0200, Peter Eisentraut wrote:

Some feedback and patches for your branch at
3274198960c139328fef3c725cee1468bbfff469:

Thanks! I just rebased the branch, will merge your changes once the fallout
from that is fixed...

0001-Install-a-few-more-files.patch

These are just some files that were apparently forgotten to be installed so
far.

0002-Adjust-some-header-file-installation-paths.patch

The installation of server headers is apparently still in progress. This
just adjusts the installation directory of those that are already being
dealt with, so they match the existing installation layout.

Yea. I've not at all paid attention to that so far, besides getting tests to
pass.

0003-Fix-warnings-about-deprecated-features.patch

This fixes some deprecation warnings and raises the requirement to 0.56.

I don't see any deprecation warnings - I see some notices about *future*
deprecated features being used:

NOTICE: Future-deprecated features used:
* 0.55.0: {'ExternalProgram.path'}
* 0.56.0: {'meson.source_root', 'meson.build_root'}

(i.e. once the minimum version is increased to > 0.54, those will trigger
deprecation warnings)

What are you seeing with what version?

I'm not sure why the current cutoff at 0.54 was chosen. Perhaps that could
be documented.

Not quite sure why I ended up with 0.54. We definitely should require at most
0.56, as that's the last version supporting python 3.5.

0004-Install-postmaster-symlink.patch

This needs 0.61, so maybe it's a bit too new.

Yea, that's too new. I think we can just create the symlink using ln or such
if we need it.

Or we could get rid of the postmaster symlink altogether?

But that seems like a better approach.

0005-Workaround-for-Perl-detection.patch

This is needed on my system to get the Perl detection to pass. If I look at
the equivalent configure code, some more refinement appears to be needed in
this area.

From 1f80e1ebb8efeb0eba7d57032282520fd6455b0d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:50:52 +0200
Subject: [PATCH 5/5] Workaround for Perl detection

---
meson.build | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/meson.build b/meson.build
index 1bf53ea24d..e33ed11b08 100644
--- a/meson.build
+++ b/meson.build
@@ -545,9 +545,9 @@ else
# file existence.
if perl_may_work
perl_ccflags += ['-I@0@'.format(perl_inc_dir)]
-    if host_machine.system() == 'darwin'
-      perl_ccflags += ['-iwithsysroot', perl_inc_dir]
-    endif
+    #if host_machine.system() == 'darwin'
+    #  perl_ccflags += ['-iwithsysroot', perl_inc_dir]
+    #endif
endif

What problem do you see without this? It did build on CI and on my m1 mini box
as is...

Greetings,

Andres Freund

#144Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#143)
Re: [RFC] building postgres with meson -v8

On 20.04.22 23:04, Andres Freund wrote:

0003-Fix-warnings-about-deprecated-features.patch

This fixes some deprecation warnings and raises the requirement to 0.56.

I don't see any deprecation warnings - I see some notices about *future*
deprecated features being used:

NOTICE: Future-deprecated features used:
* 0.55.0: {'ExternalProgram.path'}
* 0.56.0: {'meson.source_root', 'meson.build_root'}

(i.e. once the minimum version is increased to > 0.54, those will trigger
deprecation warnings)

What are you seeing with what version?

I see the same thing. Effectively, "deprecation warning" and
"future-deprecation notice" are just different spellings of "yelling at
me unconditionally for using code that I can't do anything about".

I'm not sure why the current cutoff at 0.54 was chosen. Perhaps that could
be documented.

Not quite sure why I ended up with 0.54. We definitely should require at most
0.56, as that's the last version supporting python 3.5.

Why is Python 3.5 relevant?

From 1f80e1ebb8efeb0eba7d57032282520fd6455b0d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:50:52 +0200
Subject: [PATCH 5/5] Workaround for Perl detection

---
meson.build | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/meson.build b/meson.build
index 1bf53ea24d..e33ed11b08 100644
--- a/meson.build
+++ b/meson.build
@@ -545,9 +545,9 @@ else
# file existence.
if perl_may_work
perl_ccflags += ['-I@0@'.format(perl_inc_dir)]
-    if host_machine.system() == 'darwin'
-      perl_ccflags += ['-iwithsysroot', perl_inc_dir]
-    endif
+    #if host_machine.system() == 'darwin'
+    #  perl_ccflags += ['-iwithsysroot', perl_inc_dir]
+    #endif
endif

What problem do you see without this? It did build on CI and on my m1 mini box
as is...

I'm using homebrew-installed gcc and homebrew-installed perl. gcc
doesn't understand the option -iwithsysroot, and apparently whatever it
points to is not needed.

Note that in configure.ac the logic is like this:

if test \! -f "$perl_archlibexp/CORE/perl.h" ; then
if test -f "$PG_SYSROOT$perl_archlibexp/CORE/perl.h" ; then
perl_includespec="-iwithsysroot $perl_archlibexp/CORE"
fi
fi

So it checks first if it can find the needed file without the sysroot
business.

#145Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#144)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-04-21 22:36:01 +0200, Peter Eisentraut wrote:

On 20.04.22 23:04, Andres Freund wrote:

0003-Fix-warnings-about-deprecated-features.patch

This fixes some deprecation warnings and raises the requirement to 0.56.

I don't see any deprecation warnings - I see some notices about *future*
deprecated features being used:

NOTICE: Future-deprecated features used:
* 0.55.0: {'ExternalProgram.path'}
* 0.56.0: {'meson.source_root', 'meson.build_root'}

(i.e. once the minimum version is increased to > 0.54, those will trigger
deprecation warnings)

What are you seeing with what version?

I see the same thing. Effectively, "deprecation warning" and
"future-deprecation notice" are just different spellings of "yelling at me
unconditionally for using code that I can't do anything about".

Yea, I'm not happy that "future-deprecation notice" was enabled by
default. It's still different from "deprecation warning" in prominence and
behaviour (e.g. --fatal-meson-warnings doesn't error out for notices but not
for errors), but ...

Might be worth raising with the meson folks.

I'm not sure why the current cutoff at 0.54 was chosen. Perhaps that could
be documented.

Not quite sure why I ended up with 0.54. We definitely should require at most
0.56, as that's the last version supporting python 3.5.

Why is Python 3.5 relevant?

It's the latest available on some older platforms. It's pretty easy to install
a new meson, a heck of a lot more work to install a new python. IIRC solaris,
AIX and some of Tom's dinosaurs.

From 1f80e1ebb8efeb0eba7d57032282520fd6455b0d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 13 Apr 2022 11:50:52 +0200
Subject: [PATCH 5/5] Workaround for Perl detection

---
meson.build | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/meson.build b/meson.build
index 1bf53ea24d..e33ed11b08 100644
--- a/meson.build
+++ b/meson.build
@@ -545,9 +545,9 @@ else
# file existence.
if perl_may_work
perl_ccflags += ['-I@0@'.format(perl_inc_dir)]
-    if host_machine.system() == 'darwin'
-      perl_ccflags += ['-iwithsysroot', perl_inc_dir]
-    endif
+    #if host_machine.system() == 'darwin'
+    #  perl_ccflags += ['-iwithsysroot', perl_inc_dir]
+    #endif
endif

What problem do you see without this? It did build on CI and on my m1 mini box
as is...

I'm using homebrew-installed gcc and homebrew-installed perl. gcc doesn't
understand the option -iwithsysroot, and apparently whatever it points to is
not needed.

Ah, I only tested with system "cc".

Note that in configure.ac the logic is like this:

if test \! -f "$perl_archlibexp/CORE/perl.h" ; then
if test -f "$PG_SYSROOT$perl_archlibexp/CORE/perl.h" ; then
perl_includespec="-iwithsysroot $perl_archlibexp/CORE"
fi
fi

So it checks first if it can find the needed file without the sysroot
business.

I guess we'll have to copy that. Although it doesn't seem quite the right
behaviour, because it might end up picking up a different perl.h that way...

Greetings,

Andres Freund

#146Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#145)
Re: [RFC] building postgres with meson -v8

Andres Freund <andres@anarazel.de> writes:

On 2022-04-21 22:36:01 +0200, Peter Eisentraut wrote:

Why is Python 3.5 relevant?

It's the latest available on some older platforms. It's pretty easy to install
a new meson, a heck of a lot more work to install a new python. IIRC solaris,
AIX and some of Tom's dinosaurs.

FWIW, I don't think that either gaur or prairiedog need be factored into
this conversation. They cannot build ninja at all for lack of <spawn.h>,
so whether they could run meson is pretty much beside the point.

(I wonder if we should stick in a configure test for <spawn.h>,
just to see if anything else doesn't have it?)

We should worry a little more about Solaris and AIX, but even there I
think it's largely up to the platform owner whether they've updated
python to something modern. If it isn't, you need to move the goalposts
back some more :-(. As of today I see the following pre-3.6 pythons
in the buildfarm, exclusive of mine:

skate 3.2.3
snapper 3.2.3
topminnow 3.4.2
hornet 3.4.3
sungazer 3.4.3
wrasse 3.4.3
shelduck 3.4.10
curculio 3.5.1
hoverfly 3.5.1
batfish 3.5.2
spurfowl 3.5.2
cuon 3.5.2
ayu 3.5.3
chimaera 3.5.3
chipmunk 3.5.3
grison 3.5.3
mussurana 3.5.3
tadarida 3.5.3
urocryon 3.5.3

regards, tom lane

#147Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#146)
Re: [RFC] building postgres with meson -v8

On 2022-04-21 Th 17:34, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2022-04-21 22:36:01 +0200, Peter Eisentraut wrote:

Why is Python 3.5 relevant?

It's the latest available on some older platforms. It's pretty easy to install
a new meson, a heck of a lot more work to install a new python. IIRC solaris,
AIX and some of Tom's dinosaurs.

FWIW, I don't think that either gaur or prairiedog need be factored into
this conversation. They cannot build ninja at all for lack of <spawn.h>,
so whether they could run meson is pretty much beside the point.

(I wonder if we should stick in a configure test for <spawn.h>,
just to see if anything else doesn't have it?)

We should worry a little more about Solaris and AIX, but even there I
think it's largely up to the platform owner whether they've updated
python to something modern. If it isn't, you need to move the goalposts
back some more :-(. As of today I see the following pre-3.6 pythons
in the buildfarm, exclusive of mine:

skate 3.2.3
snapper 3.2.3
topminnow 3.4.2
hornet 3.4.3
sungazer 3.4.3
wrasse 3.4.3
shelduck 3.4.10
curculio 3.5.1
hoverfly 3.5.1
batfish 3.5.2
spurfowl 3.5.2
cuon 3.5.2
ayu 3.5.3
chimaera 3.5.3
chipmunk 3.5.3
grison 3.5.3
mussurana 3.5.3
tadarida 3.5.3
urocryon 3.5.3

Presumably that only tells you about the animals currently building with
python.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#148Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#142)
1 attachment(s)
Re: [RFC] building postgres with meson -v8

Here is a patch that adds in NLS.

There are some opportunities to improve this. For example, we could
move the list of languages from the meson.build files into separate
LINGUAS files, which could be shared with the makefile-based build
system. I need to research this a bit more.

Also, this only covers the build and install phases of the NLS process.
The xgettext and msgmerge aspects I haven't touched at all. There is
more to research there as well.

The annoying thing is that the i18n module doesn't appear to have a way
to communicate with feature options or dependencies, so there isn't a
way to tell it to only do its things when some option is enabled, or
conversely to check whether the module found the things it needs and to
enable or disable an option based on that. So right now for example if
you explicitly disable the 'nls' option, the binaries are built without
NLS but the .mo files are still built and installed.

In any case, this works for the main use cases and gets us a step
forward, so it's worth considering.

Attachments:

0007-meson-NLS-support.patchtext/plain; charset=UTF-8; name=0007-meson-NLS-support.patchDownload
From ccfbff1beed568ef3ebe2e1af0701802d96b9017 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 27 Apr 2022 17:57:04 +0200
Subject: [PATCH 7/7] meson: NLS support

---
 meson.build                                | 23 +++++++++++++++++++---
 meson_options.txt                          |  3 +++
 src/backend/meson.build                    |  2 ++
 src/backend/po/meson.build                 |  3 +++
 src/bin/initdb/meson.build                 |  2 ++
 src/bin/initdb/po/meson.build              |  3 +++
 src/bin/pg_amcheck/meson.build             |  2 ++
 src/bin/pg_amcheck/po/meson.build          |  3 +++
 src/bin/pg_archivecleanup/meson.build      |  2 ++
 src/bin/pg_archivecleanup/po/meson.build   |  3 +++
 src/bin/pg_basebackup/meson.build          |  2 ++
 src/bin/pg_basebackup/po/meson.build       |  3 +++
 src/bin/pg_checksums/meson.build           |  2 ++
 src/bin/pg_checksums/po/meson.build        |  3 +++
 src/bin/pg_config/meson.build              |  2 ++
 src/bin/pg_config/po/meson.build           |  3 +++
 src/bin/pg_controldata/meson.build         |  2 ++
 src/bin/pg_controldata/po/meson.build      |  3 +++
 src/bin/pg_ctl/meson.build                 |  2 ++
 src/bin/pg_ctl/po/meson.build              |  3 +++
 src/bin/pg_dump/meson.build                |  2 ++
 src/bin/pg_dump/po/meson.build             |  3 +++
 src/bin/pg_resetwal/meson.build            |  2 ++
 src/bin/pg_resetwal/po/meson.build         |  3 +++
 src/bin/pg_rewind/meson.build              |  2 ++
 src/bin/pg_rewind/po/meson.build           |  3 +++
 src/bin/pg_test_fsync/meson.build          |  2 ++
 src/bin/pg_test_fsync/po/meson.build       |  3 +++
 src/bin/pg_test_timing/meson.build         |  2 ++
 src/bin/pg_test_timing/po/meson.build      |  3 +++
 src/bin/pg_upgrade/meson.build             |  2 ++
 src/bin/pg_upgrade/po/meson.build          |  3 +++
 src/bin/pg_verifybackup/meson.build        |  2 ++
 src/bin/pg_verifybackup/po/meson.build     |  3 +++
 src/bin/pg_waldump/meson.build             |  2 ++
 src/bin/pg_waldump/po/meson.build          |  3 +++
 src/bin/psql/meson.build                   |  2 ++
 src/bin/psql/po/meson.build                |  3 +++
 src/bin/scripts/meson.build                |  2 ++
 src/bin/scripts/po/meson.build             |  3 +++
 src/interfaces/ecpg/ecpglib/meson.build    |  2 ++
 src/interfaces/ecpg/ecpglib/po/meson.build |  3 +++
 src/interfaces/ecpg/preproc/meson.build    |  2 ++
 src/interfaces/ecpg/preproc/po/meson.build |  3 +++
 src/interfaces/libpq/meson.build           |  5 ++++-
 src/interfaces/libpq/po/meson.build        |  3 +++
 src/pl/plperl/meson.build                  |  2 ++
 src/pl/plperl/po/meson.build               |  3 +++
 src/pl/plpgsql/src/meson.build             |  2 ++
 src/pl/plpgsql/src/po/meson.build          |  3 +++
 src/pl/plpython/meson.build                |  2 ++
 src/pl/plpython/po/meson.build             |  3 +++
 src/pl/tcl/meson.build                     |  2 ++
 src/pl/tcl/po/meson.build                  |  3 +++
 54 files changed, 155 insertions(+), 4 deletions(-)
 create mode 100644 src/backend/po/meson.build
 create mode 100644 src/bin/initdb/po/meson.build
 create mode 100644 src/bin/pg_amcheck/po/meson.build
 create mode 100644 src/bin/pg_archivecleanup/po/meson.build
 create mode 100644 src/bin/pg_basebackup/po/meson.build
 create mode 100644 src/bin/pg_checksums/po/meson.build
 create mode 100644 src/bin/pg_config/po/meson.build
 create mode 100644 src/bin/pg_controldata/po/meson.build
 create mode 100644 src/bin/pg_ctl/po/meson.build
 create mode 100644 src/bin/pg_dump/po/meson.build
 create mode 100644 src/bin/pg_resetwal/po/meson.build
 create mode 100644 src/bin/pg_rewind/po/meson.build
 create mode 100644 src/bin/pg_test_fsync/po/meson.build
 create mode 100644 src/bin/pg_test_timing/po/meson.build
 create mode 100644 src/bin/pg_upgrade/po/meson.build
 create mode 100644 src/bin/pg_verifybackup/po/meson.build
 create mode 100644 src/bin/pg_waldump/po/meson.build
 create mode 100644 src/bin/psql/po/meson.build
 create mode 100644 src/bin/scripts/po/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/po/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/po/meson.build
 create mode 100644 src/interfaces/libpq/po/meson.build
 create mode 100644 src/pl/plperl/po/meson.build
 create mode 100644 src/pl/plpgsql/src/po/meson.build
 create mode 100644 src/pl/plpython/po/meson.build
 create mode 100644 src/pl/tcl/po/meson.build

diff --git a/meson.build b/meson.build
index bd6f1759e8..d0bed5973b 100644
--- a/meson.build
+++ b/meson.build
@@ -1863,6 +1863,23 @@ endif
 
 
 
+###############################################################
+# NLS / Gettext
+###############################################################
+
+i18n = import('i18n')
+
+cc.check_header('libintl.h', args: g_c_args, required: get_option('nls'))
+
+if get_option('nls').enabled()
+  cdata.set('ENABLE_NLS', 1)
+  libintl = dependency('intl', required: false)
+else
+  libintl = dependency('', required: false)
+endif
+
+
+
 ###############################################################
 # Build
 ###############################################################
@@ -2000,7 +2017,7 @@ frontend_shlib_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [pgport_shlib, common_shlib],
   sources: generated_headers,
-  dependencies: os_deps,
+  dependencies: [os_deps, libintl],
 )
 
 subdir('src/interfaces/libpq')
@@ -2012,7 +2029,7 @@ frontend_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [pgport_static, common_static, fe_utils],
   sources: generated_headers,
-  dependencies: os_deps,
+  dependencies: [os_deps, libintl],
 )
 
 backend_code = declare_dependency(
@@ -2020,7 +2037,7 @@ backend_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [],
   sources: generated_headers + generated_backend_headers,
-  dependencies: [os_deps, ssl, lz4, zlib, icu, icu_i18n, ldap, gssapi, libxml, zstd, systemd],
+  dependencies: [os_deps, libintl, ssl, lz4, zlib, icu, icu_i18n, ldap, gssapi, libxml, zstd, systemd],
 )
 
 # Note there's intentionally no dependency on pgport/common here - we want the
diff --git a/meson_options.txt b/meson_options.txt
index 4f90028936..e3e36678d1 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -71,6 +71,9 @@ option('llvm', type : 'feature', value: 'disabled',
 option('lz4', type : 'feature', value: 'auto',
   description: 'LZ4 support')
 
+option('nls', type: 'feature', value: 'auto',
+  description: 'national language support')
+
 option('plperl', type : 'feature', value: 'auto',
   description: 'build Perl modules (PL/Perl)')
 
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 6814d5094c..55ea4635be 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -31,6 +31,8 @@ subdir('tcop')
 subdir('tsearch')
 subdir('utils')
 
+subdir('po')
+
 
 postgres_link_args = []
 postgres_link_depends = []
diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build
new file mode 100644
index 0000000000..52ec64beb8
--- /dev/null
+++ b/src/backend/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('postgres-' + pg_version_major.to_string(),
+             languages: ['de', 'es', 'fr', 'id', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 2395ed112a..ddfc7b7300 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -23,3 +23,5 @@ tap_tests += {
     't/001_initdb.pl'
   ]
 }
+
+subdir('po')
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 0000000000..5ac33eb8d4
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('initdb-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
index 69eaef8f14..23db08fe51 100644
--- a/src/bin/pg_amcheck/meson.build
+++ b/src/bin/pg_amcheck/meson.build
@@ -20,3 +20,5 @@ tap_tests += {
     't/005_opclass_damage.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 0000000000..402e33b564
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_amcheck-' + pg_version_major.to_string(),
+             languages: ['de', 'el', 'es', 'fr', 'zh_CN'],
+            )
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
index 27742fafab..2ed29a1548 100644
--- a/src/bin/pg_archivecleanup/meson.build
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -12,3 +12,5 @@ tap_tests += {
     't/010_pg_archivecleanup.pl'
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 0000000000..db0f0fbddc
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'ja', 'ko', 'pl', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index b5617b818f..b2a82d015e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -52,3 +52,5 @@ tap_tests += {
     't/030_pg_recvlogical.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 0000000000..78637d9c59
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_basebackup-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
index bbf9582b90..5c8135e2ef 100644
--- a/src/bin/pg_checksums/meson.build
+++ b/src/bin/pg_checksums/meson.build
@@ -14,3 +14,5 @@ tap_tests += {
     't/002_actions.pl'
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 0000000000..fa8f3c869c
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_checksums-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'ja', 'ko', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
index df0eb13f63..156b822305 100644
--- a/src/bin/pg_config/meson.build
+++ b/src/bin/pg_config/meson.build
@@ -12,3 +12,5 @@ tap_tests += {
     't/001_pg_config.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 0000000000..ca8b767538
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_config-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'nb', 'pl', 'pt_BR', 'ro', 'ru', 'sv', 'ta', 'tr', 'uk',  'vi', 'zh_CN', 'zh_TW'],
+            )
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
index fa6057afa5..8361ecea62 100644
--- a/src/bin/pg_controldata/meson.build
+++ b/src/bin/pg_controldata/meson.build
@@ -12,3 +12,5 @@ tap_tests += {
     't/001_pg_controldata.pl'
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 0000000000..40f7b47246
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_controldata-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
index ac0d4f1819..60b90b7d0f 100644
--- a/src/bin/pg_ctl/meson.build
+++ b/src/bin/pg_ctl/meson.build
@@ -15,3 +15,5 @@ tap_tests += {
     't/004_logrotate.pl'
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 0000000000..3c21a9b2c5
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_ctl-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index ce5ef11eae..e3cf949a79 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -67,3 +67,5 @@ tap_tests += {
     't/010_dump_connstr.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 0000000000..6340eac3ac
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_dump-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
index 7450c0f643..01847e52c8 100644
--- a/src/bin/pg_resetwal/meson.build
+++ b/src/bin/pg_resetwal/meson.build
@@ -13,3 +13,5 @@ tap_tests += {
     't/002_corrupted.pl'
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 0000000000..31886ff122
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_resetwal-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index b1edeb82fe..81cc2a677a 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -32,3 +32,5 @@ tap_tests += {
     't/008_min_recovery_point.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 0000000000..2704456cbb
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_rewind-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index 527be88d12..a95e4522f6 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -12,3 +12,5 @@ tap_tests += {
     't/001_basic.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 0000000000..5e69b57aed
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_test_fsync-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'ja', 'ko', 'pl', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
index c74577df49..983291e635 100644
--- a/src/bin/pg_test_timing/meson.build
+++ b/src/bin/pg_test_timing/meson.build
@@ -12,3 +12,5 @@ tap_tests += {
     't/001_basic.pl'
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 0000000000..0832759a47
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_test_timing-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'ja', 'ko', 'pl', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 88d0e03446..9f6d797dff 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -24,3 +24,5 @@ pg_upgrade = executable('pg_upgrade',
 )
 
 # FIXME: add test
+
+subdir('po')
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 0000000000..268bcbfa43
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_upgrade-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'ja', 'ko', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
index 2c87b907e6..69fa010ec6 100644
--- a/src/bin/pg_verifybackup/meson.build
+++ b/src/bin/pg_verifybackup/meson.build
@@ -26,3 +26,5 @@ tap_tests += {
     't/010_client_untar.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 0000000000..3a190d096d
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_verifybackup-' + pg_version_major.to_string(),
+             languages: ['de', 'el', 'es', 'fr', 'ja', 'ko', 'ru', 'sv', 'uk', 'zh_CN'],
+            )
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index 8437c6c9b6..bb1fd835fc 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -21,3 +21,5 @@ tap_tests += {
     't/001_basic.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 0000000000..b38f6a59bd
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pg_waldump-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'ja', 'ko', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index f9e3b1a32b..8dacc61956 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -65,3 +65,5 @@ tap_tests += {
     't/020_cancel.pl',
   ],
 }
+
+subdir('po')
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 0000000000..77592ba13c
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('psql-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN', 'zh_TW'],
+            )
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index 547a53500a..c48f7bb5c8 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -44,3 +44,5 @@ tap_tests += {
     't/200_connstr.pl',
   ]
 }
+
+subdir('po')
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 0000000000..d1b1a10839
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pgscripts-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN'],
+            )
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index c32fc13871..5856fc437c 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -15,3 +15,5 @@ ecpglib = library('ecpg',
                   soversion: 6,
                   install: true,
                  )
+
+subdir('po')
diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build
new file mode 100644
index 0000000000..5a211cf3c8
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 4ae56f21d4..aa7b04e72d 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -53,3 +53,5 @@ executable('ecpg',
            dependencies: [frontend_shlib_code, libpq],
            kwargs: default_bin_args,
           )
+
+subdir('po')
diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build
new file mode 100644
index 0000000000..28849967ae
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('ecpg-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN', 'zh_TW'],
+            )
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index ce948e7568..349168b3b4 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -53,7 +53,7 @@ libpq_def = custom_target('libpq.def',
 
 # port needs to be in include path due to pthread-win32.h
 libpq_inc = include_directories('.', '../../port')
-libpq_deps = [frontend_shlib_code, thread_dep, ssl, ldap, gssapi]
+libpq_deps = [frontend_shlib_code, thread_dep, ssl, ldap, gssapi, libintl]
 libpq_link_depends = []
 
 libpq_kwargs = default_lib_args + {
@@ -115,3 +115,6 @@ tap_tests += {
     't/001_uri.pl',
   ]
 }
+
+
+subdir('po')
diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build
new file mode 100644
index 0000000000..ba2b2abbe2
--- /dev/null
+++ b/src/interfaces/libpq/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'zh_CN', 'zh_TW'],
+            )
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index dd7ecca67e..b44be23774 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -79,3 +79,5 @@ regress_tests += {
     'plperl_transaction',
    ],
 }
+
+subdir('po')
diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build
new file mode 100644
index 0000000000..846040383a
--- /dev/null
+++ b/src/pl/plperl/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('plperl-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ro', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN', 'zh_TW'],
+            )
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index b040e5e850..cc93f65b99 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -65,3 +65,5 @@ regress_tests += {
      'plpgsql_varprops',
   ],
 }
+
+subdir('po')
diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build
new file mode 100644
index 0000000000..775fd3326e
--- /dev/null
+++ b/src/pl/plpgsql/src/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('plpgsql-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ro', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN', 'zh_TW'],
+            )
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index cafb6fc087..ff3a2f7967 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -76,3 +76,5 @@ regress_tests += {
   'bd': meson.current_build_dir(),
   'sql': plpython_regress,
 }
+
+subdir('po')
diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build
new file mode 100644
index 0000000000..788d0f8cdd
--- /dev/null
+++ b/src/pl/plpython/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('plpython-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN'],
+            )
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index fe15041f52..52cdbcc5a3 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -49,3 +49,5 @@ regress_tests += {
   'sql': pltcl_regress,
   'regress_args': ['--load-extension=pltcl']
 }
+
+subdir('po')
diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build
new file mode 100644
index 0000000000..3302df5c54
--- /dev/null
+++ b/src/pl/tcl/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext('pltcl-' + pg_version_major.to_string(),
+             languages: ['cs', 'de', 'el', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt_BR', 'ro', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh_CN', 'zh_TW'],
+            )
-- 
2.35.1

#149Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#142)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-04-20 15:09:31 +0200, Peter Eisentraut wrote:

On 13.04.22 12:26, Peter Eisentraut wrote:

Some feedback and patches for your branch at
3274198960c139328fef3c725cee1468bbfff469:

Here is another patch. It adds support for building ecpg.

Cool!

I have merged this, with a few changes (split parse.pl change out, changed its
invocation in Solution.pm, indentation, explicitly using shared_library()
rather than library(), indentation).

But there's need for some more - exports.txt handling is needed for windows
(and everywhere else, but not as crucially) - hence CI currently being broken
on windows. I've done that in a VM, and it indeed fixes the issues. But it
needs to be generalized, I just copied and pasted stuff around...

Greetings,

Andres Freund

#150Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#148)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-04-27 21:56:27 +0200, Peter Eisentraut wrote:

Here is a patch that adds in NLS.

Cool! I know very little about translations, so I was reticent tackling
this...

For example, we could move the list of languages from the meson.build files
into separate LINGUAS files, which could be shared with the makefile-based
build system. I need to research this a bit more.

Yea, that'd be nice.

The annoying thing is that the i18n module doesn't appear to have a way to
communicate with feature options or dependencies, so there isn't a way to
tell it to only do its things when some option is enabled, or conversely to
check whether the module found the things it needs and to enable or disable
an option based on that. So right now for example if you explicitly disable
the 'nls' option, the binaries are built without NLS but the .mo files are
still built and installed.

One partial way to deal with that, I think, would be to change all the
subdir('po') invocations to subdir('po', if_found: libintl). If we don't want
that for some reason, is there a reason a simple if libintl.found() wouldn't
work?

In any case, this works for the main use cases and gets us a step forward,
so it's worth considering.

Agreed.

Greetings,

Andres Freund

#151Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#150)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-04-29 11:00:43 -0700, Andres Freund wrote:

On 2022-04-27 21:56:27 +0200, Peter Eisentraut wrote:

Here is a patch that adds in NLS.

Cool! I know very little about translations, so I was reticent tackling
this...

The annoying thing is that the i18n module doesn't appear to have a way to
communicate with feature options or dependencies, so there isn't a way to
tell it to only do its things when some option is enabled, or conversely to
check whether the module found the things it needs and to enable or disable
an option based on that. So right now for example if you explicitly disable
the 'nls' option, the binaries are built without NLS but the .mo files are
still built and installed.

One partial way to deal with that, I think, would be to change all the
subdir('po') invocations to subdir('po', if_found: libintl). If we don't want
that for some reason, is there a reason a simple if libintl.found() wouldn't
work?

Merged into my tree now, using if_found. I've also made the intl check work
with older meson versions, since I didn't include your version requirement
upgrades.

For now I "fixed" the ecpg issue on windows by just not building ecpg
there. Ecpg also needs tests ported...

Greetings,

Andres Freund

#152Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#149)
Re: [RFC] building postgres with meson -v8

On 29.04.22 19:46, Andres Freund wrote:

explicitly using shared_library() rather than library()

Why is that? We do build static libraries right now, so using library()
would seem more suitable for that.

#153Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#152)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-05-02 16:47:43 +0200, Peter Eisentraut wrote:

On 29.04.22 19:46, Andres Freund wrote:

explicitly using shared_library() rather than library()

Why is that? We do build static libraries right now, so using library()
would seem more suitable for that.

When I wrote this I hadn't realized that we build both shared and static
libraries. I've since changed the respective ecpg libraries to use
both_libraries(). Same with libpq (I really hadn't realized we build a static
libpq...).

Greetings,

Andres Freund

#154Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#153)
3 attachment(s)
Re: [RFC] building postgres with meson -v8

More patches:

0001-meson-Assorted-compiler-test-tweaks.patch

I was going through a diff of pg_config.h between old and new build and
found a few omissions and small differences.

Some of the

blah ? 1 : false

is of course annoying and can be removed eventually, but it's useful
when analyzing the diff, and since it's already done in other places it
seems reasonable to apply it consistently.

Of course there is some more work left for some of the more complicated
tests; this isn't meant to be complete.

0002-meson-Add-pg_walinspect.patch

This was added more recently and was not ported yet. Nothing too
interesting here.

0003-meson-Install-all-server-headers.patch

With this, all the server headers installed by a makefile-based build
are installed. I tried to strike a balance between using
install_subdir() with exclude list versus listing things explicitly.
Different variations might be possible, but this looked pretty sensible
to me.

With these patches, the list of files installed with make versus meson
match up, except for known open items (postmaster symlink, some library
naming differences, pkgconfig, pgxs, test modules installed, documentation).

Attachments:

0001-meson-Assorted-compiler-test-tweaks.patchtext/plain; charset=UTF-8; name=0001-meson-Assorted-compiler-test-tweaks.patchDownload
From c3f4f4f8002e473284587d21f89cb66364365a26 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 4 May 2022 09:54:36 +0200
Subject: [PATCH 1/3] meson: Assorted compiler test tweaks

---
 meson.build | 46 +++++++++++++++++++++++++++++++++++++---------
 1 file changed, 37 insertions(+), 9 deletions(-)

diff --git a/meson.build b/meson.build
index 80af8e13da..27bc9dcd48 100644
--- a/meson.build
+++ b/meson.build
@@ -222,7 +222,7 @@ meson_bin = find_program(meson_binpath, native: true)
 # Option Handling
 ###############################################################
 
-cdata.set('USE_ASSERT_CHECKING', get_option('cassert'))
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
 
 cdata.set('BLCKSZ', 8192, description: '''
  Size of a disk block --- this also limits the size of a tuple.  You
@@ -241,7 +241,7 @@ cdata.set('BLCKSZ', 8192, description: '''
 cdata.set('XLOG_BLCKSZ', get_option('wal-blocksize') * 1024)
 cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
 cdata.set('DEF_PGPORT', get_option('pgport'))
-cdata.set_quoted('DEF_PGPORT_STR', '5432')
+cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
 cdata.set_quoted('PG_KRB_SRVNAM', 'postgres')
 
 
@@ -870,8 +870,6 @@ if get_option('ssl') == 'openssl'
     ssl_int = [ssl]
   endif
 
-  cdata.set_quoted('WITH_SSL', get_option('ssl'))
-
   check_funcs = [
     ['CRYPTO_new_ex_data', {'required': true}],
     ['SSL_new', {'required': true}],
@@ -1381,7 +1379,7 @@ int main(void)
     cdata.set(check['name'],
       cc.links(test,
         name: check['desc'],
-        args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))])
+        args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false
     )
   endforeach
 
@@ -1609,7 +1607,8 @@ endif
 
 if cc.has_member('struct sockaddr_storage', 'ss_family',
     args: g_c_args, include_directories: g_c_inc,
-    prefix: '''#include <sys/types.h>
+    prefix: '''
+#include <sys/types.h>
 #include <sys/socket.h>''')
   cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1)
 endif
@@ -1622,6 +1621,30 @@ if cc.has_member('struct sockaddr_storage', '__ss_family',
   cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY', 1)
 endif
 
+if cc.has_member('struct sockaddr_storage', 'ss_len',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', '__ss_len',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN', 1)
+endif
+
+if cc.has_member('struct sockaddr', 'sa_len',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
+endif
+
 if cc.has_type('struct sockaddr_un',
     args: g_c_args, include_directories: g_c_inc,
     prefix: '''
@@ -1701,10 +1724,10 @@ endif
 # needs xlocale.h; standard is locale.h, but glibc also has an
 # xlocale.h file that we should not use.
 if cc.has_type('locale_t', prefix: '#include <locale.h>')
-  cdata.set('HAVE_LOCALE_T', true)
+  cdata.set('HAVE_LOCALE_T', 1)
 elif cc.has_type('locale_t', prefix: '#include <xlocale.h>')
-  cdata.set('HAVE_LOCALE_T', true)
-  cdata.set('LOCALE_T_IN_XLOCALE', true)
+  cdata.set('HAVE_LOCALE_T', 1)
+  cdata.set('LOCALE_T_IN_XLOCALE', 1)
 endif
 
 # MSVC doesn't cope well with defining restrict to __restrict, the
@@ -1781,6 +1804,7 @@ func_checks = [
   ['getrusage'],
   ['gettimeofday'], # XXX: This seems to be in the autoconf case
   ['inet_aton'],
+  ['inet_pton'],
   ['kqueue'],
   ['link'],
   ['mbstowcs_l'],
@@ -1852,6 +1876,10 @@ foreach c : func_checks
 endforeach
 
 
+if cc.has_function('syslog', args: g_c_args) and cc.check_header('syslog.h', args: g_c_args)
+  cdata.set('HAVE_SYSLOG', 1)
+endif
+
 
 
 
-- 
2.35.1

0002-meson-Add-pg_walinspect.patchtext/plain; charset=UTF-8; name=0002-meson-Add-pg_walinspect.patchDownload
From 258c06186b7a4b9beabde33eb3677dbc89117418 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 4 May 2022 12:21:03 +0200
Subject: [PATCH 2/3] meson: Add pg_walinspect

---
 contrib/meson.build               |  1 +
 contrib/pg_walinspect/meson.build | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 contrib/pg_walinspect/meson.build

diff --git a/contrib/meson.build b/contrib/meson.build
index 09c0f8ab03..84752d4bd0 100644
--- a/contrib/meson.build
+++ b/contrib/meson.build
@@ -48,6 +48,7 @@ subdir('pgstattuple')
 subdir('pg_surgery')
 subdir('pg_trgm')
 subdir('pg_visibility')
+subdir('pg_walinspect')
 subdir('postgres_fdw')
 subdir('seg')
 subdir('sepgsql')
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
new file mode 100644
index 0000000000..7977d4b1bb
--- /dev/null
+++ b/contrib/pg_walinspect/meson.build
@@ -0,0 +1,24 @@
+pg_walinspect = shared_module('pg_walinspect',
+  files('pg_walinspect.c'),
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_walinspect.control',
+  'pg_walinspect--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_walinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_walinspect',
+    ],
+    'regress_args': ['--temp-config', files('walinspect.conf')],
+  },
+}
-- 
2.35.1

0003-meson-Install-all-server-headers.patchtext/plain; charset=UTF-8; name=0003-meson-Install-all-server-headers.patchDownload
From ecb38fbf49cec66ec4eb77cb4fba0fac0df1241f Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 4 May 2022 12:22:02 +0200
Subject: [PATCH 3/3] meson: Install all server headers

---
 contrib/cube/meson.build      |  5 +++
 contrib/hstore/meson.build    |  5 +++
 contrib/isn/meson.build       |  5 +++
 contrib/ltree/meson.build     |  5 +++
 contrib/seg/meson.build       |  5 +++
 meson.build                   |  1 +
 src/include/meson.build       | 64 +++++++++++++++++++++++++++++++++--
 src/include/utils/meson.build | 12 +++++--
 src/pl/plperl/meson.build     |  7 ++++
 src/pl/plpython/meson.build   | 17 ++++++++++
 10 files changed, 121 insertions(+), 5 deletions(-)

diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index cb6ebf481b..e15a56f257 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -31,6 +31,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+install_headers(
+  'cubedata.h',
+  install_dir: dir_include_extension / 'cube',
+)
+
 tests += {
   'name': 'cube',
   'sd': meson.current_source_dir(),
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 3026fe95e8..3aed37ce8e 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -27,6 +27,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+install_headers(
+  'hstore.h',
+  install_dir: dir_include_extension / 'hstore',
+)
+
 tests += {
   'name': 'hstore',
   'sd': meson.current_source_dir(),
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
index 8178c1450d..508e2dfa08 100644
--- a/contrib/isn/meson.build
+++ b/contrib/isn/meson.build
@@ -15,6 +15,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+install_headers(
+  'isn.h',
+  install_dir: dir_include_extension / 'isn',
+)
+
 tests += {
   'name': 'isn',
   'sd': meson.current_source_dir(),
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
index e2ab05ddba..222c64bb35 100644
--- a/contrib/ltree/meson.build
+++ b/contrib/ltree/meson.build
@@ -26,6 +26,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+install_headers(
+  'ltree.h',
+  install_dir: dir_include_extension / 'ltree',
+)
+
 tests += {
   'name': 'ltree',
   'sd': meson.current_source_dir(),
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
index 21561f6651..10e9b8562b 100644
--- a/contrib/seg/meson.build
+++ b/contrib/seg/meson.build
@@ -30,6 +30,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+install_headers(
+  'segdata.h',
+  install_dir: dir_include_extension / 'seg',
+)
+
 tests += {
   'name': 'seg',
   'sd': meson.current_source_dir(),
diff --git a/meson.build b/meson.build
index 27bc9dcd48..70951efeb4 100644
--- a/meson.build
+++ b/meson.build
@@ -297,6 +297,7 @@ dir_locale = get_option('localedir')
 dir_bitcode = dir_lib / 'bitcode'
 dir_include_internal = dir_include_pkg / 'internal'
 dir_include_server = dir_include_pkg / 'server'
+dir_include_extension = dir_include_server / 'extension'
 dir_data_extension = dir_data / 'extension'
 
 
diff --git a/src/include/meson.build b/src/include/meson.build
index 2f27d6f33e..e5ce901e9a 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -68,10 +68,23 @@ install_headers(
 
 install_headers(
   'c.h',
-  'port.h',
-  'postgres_fe.h',
+  'fmgr.h',
+  'funcapi.h',
+  'getaddrinfo.h',
+  'getopt_long.h',
+  'miscadmin.h',
   'pg_config_manual.h',
+  'pg_getopt.h',
+  'pg_trace.h',
+  'pgstat.h',
+  'pgtar.h',
+  'pgtime.h',
+  'port.h',
+  'postgres.h',
   'postgres_ext.h',
+  'postgres_fe.h',
+  'rusagestub.h',
+  'windowapi.h',
   pg_config_ext,
   pg_config_os,
   pg_config,
@@ -83,3 +96,50 @@ subdir('storage')
 subdir('catalog')
 subdir('parser')
 subdir('pch')
+
+foreach d : [
+  'access', 'bootstrap', 'commands', 'common', 'datatype',
+  'executor', 'fe_utils', 'foreign', 'jit',
+  'lib', 'libpq', 'mb', 'nodes', 'optimizer', 'parser', 'partitioning', 'postmaster',
+  'regex', 'replication', 'rewrite',
+  'statistics', 'storage', 'tcop', 'snowball', 'tsearch',
+  'utils', 'port', 'portability',
+]
+  install_subdir(d, install_dir: dir_include_server,
+                 exclude_files: ['.gitignore', 'meson.build'])
+endforeach
+
+install_subdir('catalog', install_dir: dir_include_server,
+               exclude_files: [
+                 '.gitignore',
+                 'Makefile',
+                 'duplicate_oids',
+                 'meson.build',
+                 'pg_aggregate.dat',
+                 'pg_am.dat',
+                 'pg_amop.dat',
+                 'pg_amproc.dat',
+                 'pg_authid.dat',
+                 'pg_cast.dat',
+                 'pg_class.dat',
+                 'pg_collation.dat',
+                 'pg_conversion.dat',
+                 'pg_database.dat',
+                 'pg_language.dat',
+                 'pg_namespace.dat',
+                 'pg_opclass.dat',
+                 'pg_operator.dat',
+                 'pg_opfamily.dat',
+                 'pg_proc.dat',
+                 'pg_range.dat',
+                 'pg_tablespace.dat',
+                 'pg_ts_config.dat',
+                 'pg_ts_config_map.dat',
+                 'pg_ts_dict.dat',
+                 'pg_ts_parser.dat',
+                 'pg_ts_template.dat',
+                 'pg_type.dat',
+                 'reformat_dat_file.pl',
+                 'renumber_oids.pl',
+                 'unused_oids',
+               ])
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
index b9c959b474..6e1437f300 100644
--- a/src/include/utils/meson.build
+++ b/src/include/utils/meson.build
@@ -1,7 +1,9 @@
 errcodes = custom_target('errcodes',
   input : files('../../backend/utils/errcodes.txt'),
   output : ['errcodes.h'],
-  command : [perl, files('../../backend/utils/generate-errcodes.pl'), '@INPUT@', '@OUTPUT@']
+  command : [perl, files('../../backend/utils/generate-errcodes.pl'), '@INPUT@', '@OUTPUT@'],
+  install: true,
+  install_dir: dir_include_server/'utils',
 )
 generated_headers += errcodes
 
@@ -9,13 +11,17 @@ generated_backend_headers += custom_target('probes.d',
   input: files('../../backend/utils/probes.d'),
   output : 'probes.h',
   capture: true,
-  command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@']
+  command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+  install: true,
+  install_dir: dir_include_server/'utils',
 )
 
 fmgrtab_target = custom_target('fmgrtab',
   input: '../catalog/pg_proc.dat',
   output : ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c'],
-  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@']
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'],
+  install: true,
+  install_dir: [dir_include_server/'utils', dir_include_server/'utils', false],
 )
 
 generated_backend_headers += fmgrtab_target[0]
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 9f0ad97936..4b14c556c2 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -60,6 +60,13 @@ install_data(
   install_dir: dir_data_extension,
 )
 
+install_headers(
+  'plperl.h',
+  'plperl_helpers.h',
+  'ppport.h',
+  install_dir: dir_include_server,
+)
+
 tests += {
   'name': 'plperl',
   'sd': meson.current_source_dir(),
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index dd5f8838e2..449654914d 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -44,6 +44,23 @@ install_data(
   install_dir: dir_data_extension,
 )
 
+install_headers(
+  'plpy_cursorobject.h',
+  'plpy_elog.h',
+  'plpy_exec.h',
+  'plpy_main.h',
+  'plpy_planobject.h',
+  'plpy_plpymodule.h',
+  'plpy_procedure.h',
+  'plpy_resultobject.h',
+  'plpy_spi.h',
+  'plpy_subxactobject.h',
+  'plpy_typeio.h',
+  'plpy_util.h',
+  'plpython.h',
+  install_dir: dir_include_server,
+)
+
 plpython_regress = [
   'plpython_schema',
   'plpython_populate',
-- 
2.35.1

#155Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#154)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-05-04 13:53:54 +0200, Peter Eisentraut wrote:

0001-meson-Assorted-compiler-test-tweaks.patch

I was going through a diff of pg_config.h between old and new build and
found a few omissions and small differences.

Thanks, merged that.

is of course annoying and can be removed eventually, but it's useful when
analyzing the diff, and since it's already done in other places it seems
reasonable to apply it consistently.

Yea, I'd tried to minimize the difference at some point, but haven't done so
in a while...

0002-meson-Add-pg_walinspect.patch

This was added more recently and was not ported yet. Nothing too
interesting here.

Merged that.

0003-meson-Install-all-server-headers.patch

With this, all the server headers installed by a makefile-based build are
installed. I tried to strike a balance between using install_subdir() with
exclude list versus listing things explicitly. Different variations might be
possible, but this looked pretty sensible to me.

I locally had something similar, but I'm worried that this approach will be
too fragile. Leads to e.g. editor temp files getting installed. I've merged it
for now, but I think we need a different approach.

With these patches, the list of files installed with make versus meson match
up, except for known open items (postmaster symlink, some library naming
differences, pkgconfig, pgxs, test modules installed, documentation).

I added pkgconfig since then. They're not exactly the same, but pretty close,
except for one thing: Looks like some of the ecpg libraries really should link
to some other ecpg libs? I think we're missing something there... That then
leads to missing requirements in the .pc files.

Re symlink: Do you have an opion about dropping the symlink vs implementing it
(likely via a small helper script?)?

Re library naming: It'd obviously be easy to adjust the library names, but I
wonder if it'd not be worth keeping the _static.a suffix, right now unsuffixed
library name imo is quite confusing.

Re test modules: Not sure what the best fix for that is yet. Except that we
don't have a search path for server libs, I'd just install them to a dedicated
path or add the build dir to the search path. But we don't, so ...

Re docs: I think the best approach here would be to have a new
meson_options.txt option defining whether the docs should be built. But not
quite sure.

Greetings,

Andres Freund

#156Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#146)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-04-21 17:34:47 -0400, Tom Lane wrote:

FWIW, I don't think that either gaur or prairiedog need be factored into
this conversation. They cannot build ninja at all for lack of <spawn.h>,
so whether they could run meson is pretty much beside the point.

Yea.

(I wonder if we should stick in a configure test for <spawn.h>,
just to see if anything else doesn't have it?)

Might be worth doing?

We should worry a little more about Solaris and AIX, but even there I
think it's largely up to the platform owner whether they've updated
python to something modern.

Looks like "AIX toolbox" is at 3.7. Solaris 11.4 apparently has 3.5 (11.3 is
EOL January 2024).

I think it's worth caring about supporting 3.6 due to RHEL 7 for now.

If it isn't, you need to move the goalposts
back some more :-(. As of today I see the following pre-3.6 pythons
in the buildfarm, exclusive of mine:

skate 3.2.3
snapper 3.2.3

Debian wheezy, I feel ok with dropping that.

topminnow 3.4.2

Debian jessie, similar.

hornet 3.4.3
sungazer 3.4.3

Looks like a newer python version is available for AIX, without manually
compiling.

wrasse 3.4.3

Apparently solaris 11.4 has python 3.5 (still not great :/)

shelduck 3.4.10

This animal seems to have retired.

curculio 3.5.1

Supported versions of openbsd have modern versions of python.

hoverfly 3.5.1

AIX

batfish 3.5.2
spurfowl 3.5.2
cuon 3.5.2

Ubuntu 16.04 is EOL (since 2021-04), outside of paid extended support.

ayu 3.5.3
chimaera 3.5.3
chipmunk 3.5.3
grison 3.5.3
mussurana 3.5.3
tadarida 3.5.3
urocryon 3.5.3

These are all [variants of] debian stretch. I think we should be ok dropping
support for that, the extended "LTS" support for stretch ends June 30, 2022
(with the last non-extended update at July 18, 2020).

Greetings,

Andres Freund

[1]: https://repology.org/project/python/versions

#157Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#155)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-05-06 14:27:24 -0700, Andres Freund wrote:

0003-meson-Install-all-server-headers.patch

With this, all the server headers installed by a makefile-based build are
installed. I tried to strike a balance between using install_subdir() with
exclude list versus listing things explicitly. Different variations might be
possible, but this looked pretty sensible to me.

I locally had something similar, but I'm worried that this approach will be
too fragile. Leads to e.g. editor temp files getting installed. I've merged it
for now, but I think we need a different approach.

Meant to add potential alternatives here: The easiest likely would be to just
add an install script that globs *.h. Alternatively we could build a file list
at configure time, and then install that with install_header(). The advantage
would be that it be available for things like cpluspluscheck, the disadvantage
that something needs to trigger reconfiguration to update the file list.

Greetings,

Andres Freund

#158Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#155)
Re: [RFC] building postgres with meson -v8

On 06.05.22 23:27, Andres Freund wrote:

Re symlink: Do you have an opion about dropping the symlink vs implementing it
(likely via a small helper script?)?

I think the postmaster symlink could be dropped. The postmaster man
page has been saying that it's deprecated since 2006.

#159Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#154)
9 attachment(s)
Re: [RFC] building postgres with meson -v8

More patches:

I fixed the Perl detection issue in my macOS environment that I had
reported a while ago.

Then I added in support for all configure options that had not been
ported over yet. Some of these are rather trivial.

After that, these configure options don't have an equivalent yet:

--disable-rpath
--enable-profiling
--disable-thread-safety
--with-libedit-preferred

The first three overlap with meson built-in functionality, so we would
need to check whether the desired functionality is available somehow.

The last one we probably want to keep somehow; it would need a bit of
fiddly work.

Attachments:

0001-meson-Fix-Perl-include-dir-detection.patchtext/plain; charset=UTF-8; name=0001-meson-Fix-Perl-include-dir-detection.patchDownload
From fd05ad3f1582884aef2db162c2c7ba4897299078 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 11:08:07 +0200
Subject: [PATCH 1/9] meson: Fix Perl include dir detection

Only use -iwithsysroot if required.  This aligns with the logic in
configure.ac.
---
 meson.build | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/meson.build b/meson.build
index 5f8165df9c..7958e8eb19 100644
--- a/meson.build
+++ b/meson.build
@@ -591,8 +591,6 @@ else
 
     perl_inc_dir = '@0@/CORE'.format(archlibexp)
 
-    perl_ccflags = []
-
     if useshrplib != 'true'
       perl_may_work = false
       perl_msg = 'need a shared perl'
@@ -606,9 +604,13 @@ else
   # et al seeing them. So we can't use include_directories(), as that checks
   # file existence.
   if perl_may_work
-    perl_ccflags += ['-I@0@'.format(perl_inc_dir)]
-    if host_machine.system() == 'darwin'
-      perl_ccflags += ['-iwithsysroot', perl_inc_dir]
+    # On most platforms, archlibexp is also where the Perl include files live ...
+    perl_ccflags = ['-I@0@'.format(perl_inc_dir)]
+    # ... but on newer macOS versions, we must use -iwithsysroot to look
+    # under sysroot
+    if not fs.is_file('@0@/perl.h'.format(perl_inc_dir)) and \
+       fs.is_file('@0@@1@/perl.h'.format(sysroot, perl_inc_dir))
+      perl_ccflags = ['-iwithsysroot', perl_inc_dir]
     endif
   endif
 
-- 
2.35.1

0002-meson-Add-pam-option.patchtext/plain; charset=UTF-8; name=0002-meson-Add-pam-option.patchDownload
From 1429482c5d3e83a89915cc332be3b0d932c939cb Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 07:31:30 +0200
Subject: [PATCH 2/9] meson: Add pam option

---
 meson.build       | 26 +++++++++++++++++++++++++-
 meson_options.txt |  3 +++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index 7958e8eb19..a07e25c732 100644
--- a/meson.build
+++ b/meson.build
@@ -525,6 +525,29 @@ endif
 
 
 
+###############################################################
+# Library: pam
+###############################################################
+
+pamopt = get_option('pam')
+if not pamopt.disabled()
+  pam = cc.find_library('pam', dirs: g_c_lib, required: pamopt)
+  if pam.found()
+    if cc.has_header('security/pam_appl.h', args: g_c_args, include_directories: g_c_inc)
+      cdata.set('HAVE_SECURITY_PAM_APPL_H', 1)
+    elif cc.has_header('pam/pam_appl.h', args: g_c_args, include_directories: g_c_inc)
+      cdata.set('HAVE_PAM_PAM_APPL_H', 1)
+    else
+      error('pam header not found')
+    endif
+  endif
+else
+  pam = dependency('', required: false)
+endif
+cdata.set('USE_PAM', pam.found() ? 1 : false)
+
+
+
 ###############################################################
 # Library: Tcl (for pltcl)
 # tclConfig.sh
@@ -2143,7 +2166,7 @@ backend_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [],
   sources: generated_headers + generated_backend_headers,
-  dependencies: [os_deps, libintl, ssl, lz4, zlib, icu, icu_i18n, ldap, gssapi, libxml, zstd, systemd],
+  dependencies: [os_deps, libintl, ssl, lz4, zlib, icu, icu_i18n, ldap, pam, gssapi, libxml, zstd, systemd],
 )
 
 # Note there's intentionally no dependency on pgport/common here - we want the
@@ -2485,6 +2508,7 @@ if meson.version().version_compare('>=0.57')
       'llvm': llvm,
       'lz4': lz4,
       'nls' : libintl,
+      'pam' : pam,
       'perl': perl_dep,
       'python3': python3_dep,
       'readline': readline,
diff --git a/meson_options.txt b/meson_options.txt
index e3e36678d1..f57410fa50 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -74,6 +74,9 @@ option('lz4', type : 'feature', value: 'auto',
 option('nls', type: 'feature', value: 'auto',
   description: 'national language support')
 
+option('pam', type : 'feature', value: 'auto',
+  description: 'PAM support')
+
 option('plperl', type : 'feature', value: 'auto',
   description: 'build Perl modules (PL/Perl)')
 
-- 
2.35.1

0003-meson-prereq-Refactor-dtrace-postprocessing-make-rul.patchtext/plain; charset=UTF-8; name=0003-meson-prereq-Refactor-dtrace-postprocessing-make-rul.patchDownload
From 049b34b6a8dd949f0eb7987cad65f6682a6ec786 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:06:13 +0200
Subject: [PATCH 3/9] meson: prereq: Refactor dtrace postprocessing make rules

Move the dtrace postprocessing sed commands into a separate file so
that it can be shared by meson.  Also split the rule into two for
proper dependency declaration.
---
 src/backend/utils/Makefile               | 21 +++++++--------------
 src/backend/utils/postprocess_dtrace.sed | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 14 deletions(-)
 create mode 100644 src/backend/utils/postprocess_dtrace.sed

diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index b1820cd959..7bc58693f9 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -54,22 +54,15 @@ fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/ca
 errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
 	$(PERL) $(srcdir)/generate-errcodes.pl $< $@
 
-ifneq ($(enable_dtrace), yes)
-probes.h: Gen_dummy_probes.sed
-endif
-
-# We editorialize on dtrace's output to the extent of changing the macro
-# names (from POSTGRESQL_foo to TRACE_POSTGRESQL_foo) and changing any
-# "char *" arguments to "const char *".
-probes.h: probes.d
 ifeq ($(enable_dtrace), yes)
-	$(DTRACE) -C -h -s $< -o $@.tmp
-	sed -e 's/POSTGRESQL_/TRACE_POSTGRESQL_/g' \
-	    -e 's/( *char \*/(const char */g' \
-	    -e 's/, *char \*/, const char */g' $@.tmp >$@
-	rm $@.tmp
+probes.h: postprocess_dtrace.sed probes.h.tmp
+	sed -f $^ >$@
+
+probes.h.tmp: probes.d
+	$(DTRACE) -C -h -s $< -o $@
 else
-	sed -f $(srcdir)/Gen_dummy_probes.sed $< >$@
+probes.h: Gen_dummy_probes.sed probes.d
+	sed -f $^ >$@
 endif
 
 # These generated headers must be symlinked into builddir/src/include/,
diff --git a/src/backend/utils/postprocess_dtrace.sed b/src/backend/utils/postprocess_dtrace.sed
new file mode 100644
index 0000000000..a68c30c75e
--- /dev/null
+++ b/src/backend/utils/postprocess_dtrace.sed
@@ -0,0 +1,15 @@
+#-------------------------------------------------------------------------
+# sed script to postprocess dtrace output
+#
+# Copyright (c) 2008-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/postprocess_dtrace.sed
+#-------------------------------------------------------------------------
+
+# We editorialize on dtrace's output to the extent of changing the macro
+# names (from POSTGRESQL_foo to TRACE_POSTGRESQL_foo) and changing any
+# "char *" arguments to "const char *".
+
+s/POSTGRESQL_/TRACE_POSTGRESQL_/g
+s/( *char \*/(const char */g
+s/, *char \*/, const char */g
-- 
2.35.1

0004-meson-Add-dtrace-option.patchtext/plain; charset=UTF-8; name=0004-meson-Add-dtrace-option.patchDownload
From bf583cd5fdb7fecef8055dfa31ef2334cdd66fa6 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:06:39 +0200
Subject: [PATCH 4/9] meson: Add dtrace option

This currently only works on macOS.  The dtrace -G calls needed on
other platforms are not implemented yet.  Therefore, the option is not
auto by default.
---
 meson.build                   |  1 +
 meson_options.txt             |  6 ++++++
 src/include/utils/meson.build | 34 ++++++++++++++++++++++++++--------
 3 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/meson.build b/meson.build
index a07e25c732..7cb2083936 100644
--- a/meson.build
+++ b/meson.build
@@ -162,6 +162,7 @@ program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
 touch = find_program('touch', native: true)
 sh = find_program('sh', native: true) # FIXME, should get rid of this
 program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
+dtrace = find_program(get_option('DTRACE'), required: get_option('dtrace'))
 
 # Internal programs
 testwrap = find_program('src/tools/testwrap', native: true)
diff --git a/meson_options.txt b/meson_options.txt
index f57410fa50..56440f81d0 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -50,6 +50,9 @@ option('extra_lib_dirs', type : 'array', value: [],
 
 # External dependencies
 
+option('dtrace', type : 'feature', value: 'disabled',
+  description: 'DTrace support')
+
 option('gssapi', type : 'feature', value: 'auto',
   description: 'GSSAPI support')
 
@@ -116,6 +119,9 @@ option('zstd', type : 'feature', value: 'auto',
 option('BISON', type : 'string', value: 'bison',
   description: 'path to bison binary')
 
+option('DTRACE', type : 'string', value: 'dtrace',
+  description: 'path to dtrace binary')
+
 option('FLEX', type : 'string', value: 'flex',
   description: 'path to flex binary')
 
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
index 6e1437f300..152a235b5c 100644
--- a/src/include/utils/meson.build
+++ b/src/include/utils/meson.build
@@ -7,14 +7,32 @@ errcodes = custom_target('errcodes',
 )
 generated_headers += errcodes
 
-generated_backend_headers += custom_target('probes.d',
-  input: files('../../backend/utils/probes.d'),
-  output : 'probes.h',
-  capture: true,
-  command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
-  install: true,
-  install_dir: dir_include_server/'utils',
-)
+if dtrace.found()
+  probes_tmp = custom_target('probes.h.tmp',
+    input: files('../../backend/utils/probes.d'),
+    output : 'probes.h.tmp',
+    command : [dtrace, '-C', '-h', '-s', '@INPUT@', '-o', '@OUTPUT@'],
+  )
+  probes = custom_target('probes.h',
+    input: probes_tmp[0],
+    output : 'probes.h',
+    capture: true,
+    command : [sed, '-f', files('../../backend/utils/postprocess_dtrace.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server/'utils',
+  )
+else
+  probes = custom_target('probes.h',
+    input: files('../../backend/utils/probes.d'),
+    output : 'probes.h',
+    capture: true,
+    command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server/'utils',
+  )
+endif
+
+generated_backend_headers += probes
 
 fmgrtab_target = custom_target('fmgrtab',
   input: '../catalog/pg_proc.dat',
-- 
2.35.1

0005-meson-Add-bonjour-option.patchtext/plain; charset=UTF-8; name=0005-meson-Add-bonjour-option.patchDownload
From c2599ec7f66c75c9c898fcf902dd3fc0209e42cb Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:29:23 +0200
Subject: [PATCH 5/9] meson: Add bonjour option

---
 meson.build       | 13 +++++++++++++
 meson_options.txt |  3 +++
 2 files changed, 16 insertions(+)

diff --git a/meson.build b/meson.build
index 7cb2083936..e724fcc345 100644
--- a/meson.build
+++ b/meson.build
@@ -305,6 +305,19 @@ dir_data_extension = dir_data / 'extension'
 
 
 
+###############################################################
+# Library: bonjour
+###############################################################
+
+bonjouropt = get_option('bonjour')
+if not bonjouropt.disabled()
+  if cc.has_header('dns_sd.h', args: g_c_args, include_directories: g_c_inc, required: bonjouropt.enabled())
+    cdata.set('USE_BONJOUR', 1)
+  endif
+endif
+
+
+
 ###############################################################
 # Library: GSSAPI
 ###############################################################
diff --git a/meson_options.txt b/meson_options.txt
index 56440f81d0..cbef629ca0 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -50,6 +50,9 @@ option('extra_lib_dirs', type : 'array', value: [],
 
 # External dependencies
 
+option('bonjour', type : 'feature', value: 'auto',
+  description: 'Bonjour support')
+
 option('dtrace', type : 'feature', value: 'disabled',
   description: 'DTrace support')
 
-- 
2.35.1

0006-meson-Add-bsd-auth-option.patchtext/plain; charset=UTF-8; name=0006-meson-Add-bsd-auth-option.patchDownload
From 2845c3f08a7e8eba5a41f2e474ffbeb5d5eadea2 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:37:28 +0200
Subject: [PATCH 6/9] meson: Add bsd-auth option

---
 meson.build       | 13 +++++++++++++
 meson_options.txt |  3 +++
 2 files changed, 16 insertions(+)

diff --git a/meson.build b/meson.build
index e724fcc345..7c9c6e7f23 100644
--- a/meson.build
+++ b/meson.build
@@ -318,6 +318,19 @@ endif
 
 
 
+###############################################################
+# Library: bsd-auth
+###############################################################
+
+bsdauthopt = get_option('bsd-auth')
+if not bsdauthopt.disabled()
+  if cc.has_header('bsd_auth.h', args: g_c_args, include_directories: g_c_inc, required: bsdauthopt.enabled())
+    cdata.set('USE_BSD_AUTH', 1)
+  endif
+endif
+
+
+
 ###############################################################
 # Library: GSSAPI
 ###############################################################
diff --git a/meson_options.txt b/meson_options.txt
index cbef629ca0..892ef117ee 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -53,6 +53,9 @@ option('extra_lib_dirs', type : 'array', value: [],
 option('bonjour', type : 'feature', value: 'auto',
   description: 'Bonjour support')
 
+option('bsd-auth', type : 'feature', value: 'auto',
+  description: 'BSD Authentication support')
+
 option('dtrace', type : 'feature', value: 'disabled',
   description: 'DTrace support')
 
-- 
2.35.1

0007-meson-Add-system-tzdata-option.patchtext/plain; charset=UTF-8; name=0007-meson-Add-system-tzdata-option.patchDownload
From fad02f1fb71ec8c64e47e5031726ffbee4a1dd84 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:53:01 +0200
Subject: [PATCH 7/9] meson: Add system-tzdata option

---
 meson.build       | 3 +++
 meson_options.txt | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/meson.build b/meson.build
index 7c9c6e7f23..b33a51a35d 100644
--- a/meson.build
+++ b/meson.build
@@ -246,6 +246,9 @@ cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
 cdata.set('DEF_PGPORT', get_option('pgport'))
 cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
 cdata.set_quoted('PG_KRB_SRVNAM', 'postgres')
+if get_option('system-tzdata') != ''
+  cdata.set_quoted('SYSTEMTZDIR', get_option('system-tzdata'))
+endif
 
 
 
diff --git a/meson_options.txt b/meson_options.txt
index 892ef117ee..250d758ded 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -20,6 +20,9 @@ option('pgport', type : 'string', value : '5432',
   description : '''Default port number for server and clients.
 The default is 5432. The port can always be changed later on, but if you specify it here then both server and clients will have the same default compiled in, which can be very convenient. Usually the only good reason to select a non-default value is if you intend to run multiple PostgreSQL servers on the same machine.''')
 
+option('system-tzdata', type: 'string', value: '',
+  description: 'use system time zone data in specified directory')
+
 
 # Developer options
 
-- 
2.35.1

0008-meson-Add-krb-srvnam-option.patchtext/plain; charset=UTF-8; name=0008-meson-Add-krb-srvnam-option.patchDownload
From 7c5c35a5ceff42dcd64e7a78f63ce2cdfc46d856 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:57:18 +0200
Subject: [PATCH 8/9] meson: Add krb-srvnam option

---
 meson.build       | 2 +-
 meson_options.txt | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index b33a51a35d..8a372282ff 100644
--- a/meson.build
+++ b/meson.build
@@ -245,7 +245,7 @@ cdata.set('XLOG_BLCKSZ', get_option('wal-blocksize') * 1024)
 cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
 cdata.set('DEF_PGPORT', get_option('pgport'))
 cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
-cdata.set_quoted('PG_KRB_SRVNAM', 'postgres')
+cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb-srvnam'))
 if get_option('system-tzdata') != ''
   cdata.set_quoted('SYSTEMTZDIR', get_option('system-tzdata'))
 endif
diff --git a/meson_options.txt b/meson_options.txt
index 250d758ded..d4a7500306 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -16,6 +16,9 @@ Large tables are divided into multiple operating-system files, each of size equa
 
 # Defaults
 
+option('krb-srvnam', type: 'string', value: 'postgres',
+  description: 'default service principal name in Kerberos (GSSAPI)')
+
 option('pgport', type : 'string', value : '5432',
   description : '''Default port number for server and clients.
 The default is 5432. The port can always be changed later on, but if you specify it here then both server and clients will have the same default compiled in, which can be very convenient. Usually the only good reason to select a non-default value is if you intend to run multiple PostgreSQL servers on the same machine.''')
-- 
2.35.1

0009-meson-Add-extra-version-option.patchtext/plain; charset=UTF-8; name=0009-meson-Add-extra-version-option.patchDownload
From 55e92f039526d9c6d01f0be1a4ad34e64d7e01b9 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 10:04:50 +0200
Subject: [PATCH 9/9] meson: Add extra-version option

---
 meson.build       | 1 +
 meson_options.txt | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/meson.build b/meson.build
index 8a372282ff..a2680f5a1a 100644
--- a/meson.build
+++ b/meson.build
@@ -79,6 +79,7 @@ cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
 cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
 cdata.set_quoted('PACKAGE_URL', pg_url)
 
+pg_version += get_option('extra-version')
 cdata.set_quoted('PG_VERSION', pg_version)
 cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
   pg_version, target_machine.cpu_family(), cc.get_id(), cc.version()))
diff --git a/meson_options.txt b/meson_options.txt
index d4a7500306..3cc211b39d 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -16,6 +16,9 @@ Large tables are divided into multiple operating-system files, each of size equa
 
 # Defaults
 
+option('extra-version', type: 'string', value: '',
+       description: 'Append string to version.')
+
 option('krb-srvnam', type: 'string', value: 'postgres',
   description: 'default service principal name in Kerberos (GSSAPI)')
 
-- 
2.35.1

#160Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#159)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-05-11 12:18:58 +0200, Peter Eisentraut wrote:

I fixed the Perl detection issue in my macOS environment that I had reported
a while ago.

Hm. I wonder if it's right to check with is_file() - perhaps there are
platforms that have split off the include directory?

Then I added in support for all configure options that had not been ported
over yet. Some of these are rather trivial.

Thanks!

Some of these (extra version, krb srvname, ...) I just merged from a
colleague.

Will look at merging the others.

After that, these configure options don't have an equivalent yet:

--disable-rpath
--enable-profiling
--disable-thread-safety
--with-libedit-preferred

The first three overlap with meson built-in functionality, so we would need
to check whether the desired functionality is available somehow.

Which builtin functionality does --enable-profiling overlap with? There's a
coverage option, perhaps you were thinking of that?

I don't think we should add --disable-thread-safety, platforms without it also
aren't going to support ninja / meson... IIRC Thomas was planning to submit a
patch getting rid of it independently...

The last one we probably want to keep somehow; it would need a bit of fiddly
work.

A colleague just finished that bit. Probably can be improved further, but it
works now...

From 049b34b6a8dd949f0eb7987cad65f6682a6ec786 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:06:13 +0200
Subject: [PATCH 3/9] meson: prereq: Refactor dtrace postprocessing make rules

Move the dtrace postprocessing sed commands into a separate file so
that it can be shared by meson. Also split the rule into two for
proper dependency declaration.

Hm. Using sed may be problematic on windows...

From fad02f1fb71ec8c64e47e5031726ffbee4a1dd84 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:53:01 +0200
Subject: [PATCH 7/9] meson: Add system-tzdata option

---
meson.build | 3 +++
meson_options.txt | 3 +++
2 files changed, 6 insertions(+)

diff --git a/meson.build b/meson.build
index 7c9c6e7f23..b33a51a35d 100644
--- a/meson.build
+++ b/meson.build
@@ -246,6 +246,9 @@ cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
cdata.set('DEF_PGPORT', get_option('pgport'))
cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
cdata.set_quoted('PG_KRB_SRVNAM', 'postgres')
+if get_option('system-tzdata') != ''
+  cdata.set_quoted('SYSTEMTZDIR', get_option('system-tzdata'))
+endif

This doesn't quite seem sufficient - we also need to prevent building &
installing our own timezone data...

Greetings,

Andres Freund

#161Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#159)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-05-11 12:18:58 +0200, Peter Eisentraut wrote:

This currently only works on macOS. The dtrace -G calls needed on
other platforms are not implemented yet.

I looked into that part. The make rule passes all the backend object files as
an option, but it's not clear to me where / why that's needed. On linux it
certainly works to not pass in the object files...

Maybe CI will show problems on freebsd or such...

Therefore, the option is not auto by default.

It probably shouldn't be auto either way, there's some overhead associated
with the probes...

Greetings,

Andres Freund

#162Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#160)
Re: [RFC] building postgres with meson -v8

On 12.05.22 21:30, Andres Freund wrote:

On 2022-05-11 12:18:58 +0200, Peter Eisentraut wrote:

I fixed the Perl detection issue in my macOS environment that I had reported
a while ago.

Hm. I wonder if it's right to check with is_file() - perhaps there are
platforms that have split off the include directory?

The existing code uses "test -f", so using is_file() would keep it
working the same way.

After that, these configure options don't have an equivalent yet:

--disable-rpath
--enable-profiling
--disable-thread-safety
--with-libedit-preferred

The first three overlap with meson built-in functionality, so we would need
to check whether the desired functionality is available somehow.

Which builtin functionality does --enable-profiling overlap with? There's a
coverage option, perhaps you were thinking of that?

I saw an option about "profile guided optimization" (b_pgo), which seems
possibly related.

I don't think we should add --disable-thread-safety, platforms without it also
aren't going to support ninja / meson... IIRC Thomas was planning to submit a
patch getting rid of it independently...

sure

From 049b34b6a8dd949f0eb7987cad65f6682a6ec786 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:06:13 +0200
Subject: [PATCH 3/9] meson: prereq: Refactor dtrace postprocessing make rules

Move the dtrace postprocessing sed commands into a separate file so
that it can be shared by meson. Also split the rule into two for
proper dependency declaration.

Hm. Using sed may be problematic on windows...

This code is only used when dtrace is enabled, which probably doesn't
apply on Windows.

#163Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#161)
Re: [RFC] building postgres with meson -v8

On 14.05.22 01:17, Andres Freund wrote:

On 2022-05-11 12:18:58 +0200, Peter Eisentraut wrote:

This currently only works on macOS. The dtrace -G calls needed on
other platforms are not implemented yet.

I looked into that part. The make rule passes all the backend object files as
an option, but it's not clear to me where / why that's needed. On linux it
certainly works to not pass in the object files...

Maybe CI will show problems on freebsd or such...

Yes, it failed for me on freebsd.

Therefore, the option is not auto by default.

It probably shouldn't be auto either way, there's some overhead associated
with the probes...

ok

#164Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#163)
Re: [RFC] building postgres with meson -v8

On 2022-05-16 17:48:08 +0200, Peter Eisentraut wrote:

On 14.05.22 01:17, Andres Freund wrote:

On 2022-05-11 12:18:58 +0200, Peter Eisentraut wrote:

This currently only works on macOS. The dtrace -G calls needed on
other platforms are not implemented yet.

I looked into that part. The make rule passes all the backend object files as
an option, but it's not clear to me where / why that's needed. On linux it
certainly works to not pass in the object files...

Maybe CI will show problems on freebsd or such...

Yes, it failed for me on freebsd.

Yep, I saw those shortly after... I've implemented that bit now, although it
needs a bit more cleanup.

#165Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#162)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-05-16 17:47:24 +0200, Peter Eisentraut wrote:

On 12.05.22 21:30, Andres Freund wrote:

On 2022-05-11 12:18:58 +0200, Peter Eisentraut wrote:

I fixed the Perl detection issue in my macOS environment that I had reported
a while ago.

Hm. I wonder if it's right to check with is_file() - perhaps there are
platforms that have split off the include directory?

The existing code uses "test -f", so using is_file() would keep it working
the same way.

I merged it that way. Merged.

From 049b34b6a8dd949f0eb7987cad65f6682a6ec786 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:06:13 +0200
Subject: [PATCH 3/9] meson: prereq: Refactor dtrace postprocessing make rules

Move the dtrace postprocessing sed commands into a separate file so
that it can be shared by meson. Also split the rule into two for
proper dependency declaration.

Hm. Using sed may be problematic on windows...

This code is only used when dtrace is enabled, which probably doesn't apply
on Windows.

Fair point. Merged.

Greetings,

Andres Freund

#166Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#159)
7 attachment(s)
Re: [RFC] building postgres with meson -v8

Here are some more patches that clean up various minor issues.

Attachments:

0001-meson-Put-genbki-header-files-back-into-original-ord.patchtext/plain; charset=UTF-8; name=0001-meson-Put-genbki-header-files-back-into-original-ord.patchDownload
From bc06fda7198d182dce73f39cfff8e4724e00b12d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 4 May 2022 14:38:02 +0200
Subject: [PATCH 1/7] meson: Put genbki header files back into original order

The order affects the output order in postgres.bki and other files.
This makes it match the order in the makefiles.
---
 src/include/catalog/meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
index b2acc3ce30..813a963493 100644
--- a/src/include/catalog/meson.build
+++ b/src/include/catalog/meson.build
@@ -30,7 +30,6 @@ catalog_headers = [
   'pg_conversion.h',
   'pg_depend.h',
   'pg_database.h',
-  'pg_parameter_acl.h',
   'pg_db_role_setting.h',
   'pg_tablespace.h',
   'pg_authid.h',
@@ -54,6 +53,7 @@ catalog_headers = [
   'pg_seclabel.h',
   'pg_shseclabel.h',
   'pg_collation.h',
+  'pg_parameter_acl.h',
   'pg_partitioned_table.h',
   'pg_range.h',
   'pg_transform.h',
-- 
2.35.1

0002-meson-Some-capitalization-adjustments-in-setup-outpu.patchtext/plain; charset=UTF-8; name=0002-meson-Some-capitalization-adjustments-in-setup-outpu.patchDownload
From b4ffaa02f1eb132b011871415c94b84e84fd5245 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 18 May 2022 09:22:22 +0200
Subject: [PATCH 2/7] meson: Some capitalization adjustments in setup output

This makes the style more uniform with what meson produces by itself.
---
 meson.build | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/meson.build b/meson.build
index 7b1c8d47c4..3acae5c3e4 100644
--- a/meson.build
+++ b/meson.build
@@ -2583,10 +2583,10 @@ alias_target('backend', backend_targets)
 if meson.version().version_compare('>=0.57')
 
   summary({
-    'Data Block Size' : cdata.get('BLCKSZ'),
-    'WAL Block Size' : cdata.get('XLOG_BLCKSZ'),
-    'Segment Size' : cdata.get('RELSEG_SIZE')
-    }, section: 'Data Layout'
+    'data block size' : cdata.get('BLCKSZ'),
+    'WAL block size' : cdata.get('XLOG_BLCKSZ'),
+    'segment size' : cdata.get('RELSEG_SIZE')
+    }, section: 'Data layout'
   )
 
   summary(
@@ -2644,7 +2644,7 @@ if meson.version().version_compare('>=0.57')
       'zlib': zlib,
       'zstd': zstd,
     },
-    section: 'External Libraries'
+    section: 'External libraries'
   )
 
 endif
-- 
2.35.1

0003-meson-Formatting-tweaks-for-pg_config.h-to-match-aut.patchtext/plain; charset=UTF-8; name=0003-meson-Formatting-tweaks-for-pg_config.h-to-match-aut.patchDownload
From 23a7e7ffb4db7554b2029ba3026d93f8e32b801f Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 18 May 2022 09:47:47 +0200
Subject: [PATCH 3/7] meson: Formatting tweaks for pg_config.h to match
 autoheader better

---
 meson.build | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/meson.build b/meson.build
index 3acae5c3e4..20dea263a2 100644
--- a/meson.build
+++ b/meson.build
@@ -227,19 +227,14 @@ meson_bin = find_program(meson_binpath, native: true)
 
 cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
 
-cdata.set('BLCKSZ', 8192, description: '''
- Size of a disk block --- this also limits the size of a tuple.  You
- can set it bigger if you need bigger tuples (although TOAST should
- reduce the need to have large tuples, since fields can be spread
- across multiple tuples).
-
- BLCKSZ must be a power of 2.  The maximum possible value of BLCKSZ
- is currently 2^15 (32768).  This is determined by the 15-bit widths
- of the lp_off and lp_len fields in ItemIdData (see
- include/storage/itemid.h).
-
- Changing BLCKSZ requires an initdb.
-''')
+cdata.set('BLCKSZ', 8192, description:
+'''Size of a disk block --- this also limits the size of a tuple. You can set
+   it bigger if you need bigger tuples (although TOAST should reduce the need
+   to have large tuples, since fields can be spread across multiple tuples).
+   BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is
+   currently 2^15 (32768). This is determined by the 15-bit widths of the
+   lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).
+   Changing BLCKSZ requires an initdb.''')
 
 cdata.set('XLOG_BLCKSZ', get_option('wal-blocksize') * 1024)
 cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
@@ -1000,7 +995,8 @@ if get_option('ssl') == 'openssl'
             description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
 
   cdata.set('OPENSSL_API_COMPAT', 0x10001000,
-            description: 'Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.')
+            description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings
+   from newer OpenSSL versions.''')
 else
   ssl = dependency('', required : false)
 endif
@@ -1639,7 +1635,7 @@ foreach c : decl_checks
     kwargs: args)
   cdata.set10(varname, found, description:
 '''Define to 1 if you have the declaration of `@0@', and to 0 if you
-  don't.'''.format(func))
+   don't.'''.format(func))
 endforeach
 
 
-- 
2.35.1

0004-meson-Remove-checks-for-random-and-srandom.patchtext/plain; charset=UTF-8; name=0004-meson-Remove-checks-for-random-and-srandom.patchDownload
From 1d2f4c3d7eb32a01e3ea75816f9ec09add6500db Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 18 May 2022 09:48:43 +0200
Subject: [PATCH 4/7] meson: Remove checks for random and srandom

Removed by 3804539e48e794781c6145c7f988f5d507418fa8.
---
 meson.build | 2 --
 1 file changed, 2 deletions(-)

diff --git a/meson.build b/meson.build
index 20dea263a2..e6dfb63981 100644
--- a/meson.build
+++ b/meson.build
@@ -1906,7 +1906,6 @@ func_checks = [
   ['pstat'],
   ['pthread_is_threaded_np', {'dependencies': [thread_dep]}],
   ['pwrite'],
-  ['random'],
   ['readlink'],
   ['readv'],
   ['setenv'], # FIXME: windows handling
@@ -1915,7 +1914,6 @@ func_checks = [
   ['setsid'],
   ['shm_open', {'dependencies': [rt_dep]}],
   ['shm_unlink', {'dependencies': [rt_dep]}],
-  ['srandom'],
   ['strchrnul'],
   ['strerror_r', {'dependencies': [thread_dep]}],
   ['strlcat'],
-- 
2.35.1

0005-meson-Fix-symbol-for-__builtin_frame_address-check.patchtext/plain; charset=UTF-8; name=0005-meson-Fix-symbol-for-__builtin_frame_address-check.patchDownload
From b831c6caef6b240bb9074018d6e4788f34b82edf Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 18 May 2022 09:49:23 +0200
Subject: [PATCH 5/7] meson: Fix symbol for __builtin_frame_address check

---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index e6dfb63981..6954fffc5c 100644
--- a/meson.build
+++ b/meson.build
@@ -1270,7 +1270,7 @@ if cc.has_function('__builtin_constant_p', args: g_c_args)
 endif
 
 if cc.has_function('__builtin_frame_address', args: g_c_args)
-  cdata.set('HAVE__FRAME_ADDRESS', 1)
+  cdata.set('HAVE__BUILTIN_FRAME_ADDRESS', 1)
 endif
 
 
-- 
2.35.1

0006-meson-Remove-check-for-strsignal-declaration.patchtext/plain; charset=UTF-8; name=0006-meson-Remove-check-for-strsignal-declaration.patchDownload
From b2b65de167610bfb12e7366acf36a7fcf1da7ed0 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 18 May 2022 09:49:38 +0200
Subject: [PATCH 6/7] meson: Remove check for strsignal declaration

This appears to be unnecessary and not in configure.
---
 meson.build | 1 -
 1 file changed, 1 deletion(-)

diff --git a/meson.build b/meson.build
index 6954fffc5c..e7fd8aa64f 100644
--- a/meson.build
+++ b/meson.build
@@ -1612,7 +1612,6 @@ decl_checks = [
   ['strlcat', 'string.h'],
   ['strlcpy', 'string.h'],
   ['strnlen', 'string.h'],
-  ['strsignal', 'string.h'],
   ['strtoll', 'stdlib.h'], ['strtoull', 'stdlib.h'], # strto[u]ll may exist but not be declared
 ]
 
-- 
2.35.1

0007-meson-Fix-extra_version-option.patchtext/plain; charset=UTF-8; name=0007-meson-Fix-extra_version-option.patchDownload
From aff3d38c793914c0098a3c25b0e583d96dd3b21f Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 18 May 2022 10:09:31 +0200
Subject: [PATCH 7/7] meson: Fix extra_version option

With the previous coding, the extra version did not appear in
PG_VERSION_STR.
---
 meson.build | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index e7fd8aa64f..b772afef32 100644
--- a/meson.build
+++ b/meson.build
@@ -79,7 +79,8 @@ cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
 cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
 cdata.set_quoted('PACKAGE_URL', pg_url)
 
-cdata.set_quoted('PG_VERSION', pg_version + get_option('extra_version'))
+pg_version += get_option('extra_version')
+cdata.set_quoted('PG_VERSION', pg_version)
 cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
   pg_version, target_machine.cpu_family(), cc.get_id(), cc.version()))
 cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
-- 
2.35.1

#167Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#166)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-05-18 10:30:12 +0200, Peter Eisentraut wrote:

Here are some more patches that clean up various minor issues.

I rebased the meson tree, squashed a lot of the existing commits, merged your
changes, and fixed a few more differences between autoconf and meson.

For me the difference in defines now boils down to:

- CONFIGURE_ARGS - empty in meson, not clear what to fill it with
- GETTIMEOFDAY_1ARG - test doesn't exist - I suspect it might not be necessary
- PACKAGE_STRING, PACKAGE_TARNAME - unclear if they should be implemented?
- AC_APPLE_UNIVERSAL_BUILD logic - which I don't think we need?
- pg_restrict is defined in a simplistic way
- "missing" a bunch of defines that don't appear to be referenced:
HAVE_FSEEKO
HAVE_GSSAPI_GSSAPI_H
HAVE_INTTYPES_H
HAVE_LDAP_H
HAVE_LIBCRYPTO
HAVE_LIBLDAP
HAVE_LIBM
HAVE_LIBPAM
HAVE_LIBSSL
HAVE_LIBXML2
HAVE_LIBXSLT
HAVE_MEMORY_H
HAVE_PTHREAD
HAVE_PTHREAD_PRIO_INHERIT
HAVE_STDINT_H
HAVE_STDLIB_H
HAVE_STRING_H
HAVE_SYS_STAT_H
HAVE_SYS_TYPES_H
HAVE_UNISTD_H
SIZEOF_BOOL
SIZEOF_OFF_T
STDC_HEADERS
- meson additional defines, seems harmless:
HAVE_GETTIMEOFDAY - only defined on windows rn
HAVE_SHM_UNLINK
HAVE_SSL_NEW
HAVE_STRTOQ
HAVE_STRTOUQ
HAVE_CRYPTO_NEW_EX_DATA
- a bunch of additional #undef's

Greetings,

Andres Freund

#168Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#167)
Re: [RFC] building postgres with meson -v8

On 18.05.22 21:48, Andres Freund wrote:

- CONFIGURE_ARGS - empty in meson, not clear what to fill it with

Ok to leave empty for now.

- GETTIMEOFDAY_1ARG - test doesn't exist - I suspect it might not be necessary

Might be obsolete, consider removing.

- PACKAGE_STRING, PACKAGE_TARNAME - unclear if they should be implemented?

leave out for now

- AC_APPLE_UNIVERSAL_BUILD logic - which I don't think we need?

no

- "missing" a bunch of defines that don't appear to be referenced:

Yeah, looks like these are implicitly defined by some autoconf check but
then the result is only used within configure.ac itself, so isn't needed
afterwards.

- meson additional defines, seems harmless:
HAVE_GETTIMEOFDAY - only defined on windows rn
HAVE_SHM_UNLINK
HAVE_SSL_NEW
HAVE_STRTOQ
HAVE_STRTOUQ
HAVE_CRYPTO_NEW_EX_DATA

Yeah, that's the opposite of the previous.

I don't see any other issues in pg_config.h either. Obviously, some
niche platforms might uncover some issues, but it looks good for now.

#169Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

Hi Tom,

in the meson unconference session you'd spotted flex flags for psqlscanslash.l
(I think) being "hardcoded". As far as I can tell that's largely just copied
from the Makefile):

src/backend/parser/Makefile:scan.c: FLEXFLAGS = -CF -p -p
src/backend/utils/adt/Makefile:jsonpath_scan.c: FLEXFLAGS = -CF -p -p
src/bin/psql/Makefile:psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
src/fe_utils/Makefile:psqlscan.c: FLEXFLAGS = -Cfe -p -p

note that it's not even FLEXFLAGS += or such.

I honestly don't know enough about the various flex flags to judge what a
better approach would be? Looks like these flags are case specific? Perhaps we
could group them, i.e. have centrally defined "do compress" "don't compress"
flex flags?

Greetings,

Andres Freund

#170Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#169)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

in the meson unconference session you'd spotted flex flags for psqlscanslash.l
(I think) being "hardcoded". As far as I can tell that's largely just copied
from the Makefile):

src/backend/parser/Makefile:scan.c: FLEXFLAGS = -CF -p -p
src/backend/utils/adt/Makefile:jsonpath_scan.c: FLEXFLAGS = -CF -p -p
src/bin/psql/Makefile:psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
src/fe_utils/Makefile:psqlscan.c: FLEXFLAGS = -Cfe -p -p

Hmm, OK. There *is* a FLEXFLAGS definition supplied by configure, and
I believe many of our scanners do use it, but evidently we're just
overriding it for the ones where we really care about using specific
flags. It also looks like the configure-supplied version is usually
empty, so the fact that this variable exists may be mostly a holdover
from Autoconf practice rather than something we ever cared about.

I think the main thing I didn't like about the way you have it in the
meson file is the loss of greppability. I could investigate this
question in a few seconds just now, but if we drop the use of
FLEXFLAGS as a macro it'll become much harder to figure out which
places use what.

regards, tom lane

#171Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#170)
Re: [RFC] building postgres with meson

Hi,

On 2022-05-25 21:38:33 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

in the meson unconference session you'd spotted flex flags for psqlscanslash.l
(I think) being "hardcoded". As far as I can tell that's largely just copied
from the Makefile):

src/backend/parser/Makefile:scan.c: FLEXFLAGS = -CF -p -p
src/backend/utils/adt/Makefile:jsonpath_scan.c: FLEXFLAGS = -CF -p -p
src/bin/psql/Makefile:psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
src/fe_utils/Makefile:psqlscan.c: FLEXFLAGS = -Cfe -p -p

Hmm, OK. There *is* a FLEXFLAGS definition supplied by configure, and
I believe many of our scanners do use it, but evidently we're just
overriding it for the ones where we really care about using specific
flags. It also looks like the configure-supplied version is usually
empty, so the fact that this variable exists may be mostly a holdover
from Autoconf practice rather than something we ever cared about.

Yea, it looks like that.

ISTM that it'd still be good to have something like FLEXFLAGS. But it doesn't
look great, nor really intentional, that FLEXFLAGS is overwritten rather than
appended?

I think the main thing I didn't like about the way you have it in the
meson file is the loss of greppability. I could investigate this
question in a few seconds just now, but if we drop the use of
FLEXFLAGS as a macro it'll become much harder to figure out which
places use what.

I disliked a bunch of repetitiveness as I had it, so I'm polishing that part
just now.

What would you want to grep for? Places that specify additional flags? Or just
places using flex?

Greetings,

Andres Freund

#172Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#171)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

On 2022-05-25 21:38:33 -0400, Tom Lane wrote:

I think the main thing I didn't like about the way you have it in the
meson file is the loss of greppability.

What would you want to grep for? Places that specify additional flags? Or just
places using flex?

Well, the consistency of having a single name for "flags given to
flex" seems to me to be worth something.

regards, tom lane

#173Aleksander Alekseev
aleksander@timescale.com
In reply to: Tom Lane (#172)
Re: [RFC] building postgres with meson

Hi Andres,

Thanks for working on this! I'm very enthusiastic about this effort and I was
glad to see on PGCon Unconference that the majority of the community seems
to be as well.

The halfway decent list includes, I think:
1) cmake
2) bazel
3) meson

Was SCons considered as an option? It is widely adopted and written in Python
as well. Personally, I like the fact that with SCons you write config files
in pure Python, not some dialect you have to learn additionally. There is
a free e-book available [1]https://scons.org/doc/production/PDF/scons-user.pdf.

What pros and cons do you see that make Meson a better choice?

[1]: https://scons.org/doc/production/PDF/scons-user.pdf

--
Best regards,
Aleksander Alekseev

#174Andres Freund
andres@anarazel.de
In reply to: Aleksander Alekseev (#173)
Re: [RFC] building postgres with meson

Hi,

On 2022-05-26 11:47:13 +0300, Aleksander Alekseev wrote:

Thanks for working on this! I'm very enthusiastic about this effort and I was
glad to see on PGCon Unconference that the majority of the community seems
to be as well.

The halfway decent list includes, I think:
1) cmake
2) bazel
3) meson

Was SCons considered as an option?
What pros and cons do you see that make Meson a better choice?

I looked at it and quickly discarded it. From what I could see there's not
been meaningful moves to it in the last couple years, if anything adoption has
been dropping. And I don't think we want to end up relying on yet another half
maintained tool.

Not having a ninja backend etc didn't strike me as great either - the builds
with scons I've done weren't fast at all.

Greetings,

Andres Freund

#175Aleksander Alekseev
aleksander@timescale.com
In reply to: Andres Freund (#174)
Re: [RFC] building postgres with meson

Hi Andres,

Not having a ninja backend etc didn't strike me as great either - the builds
with scons I've done weren't fast at all.

I must admit, personally I never used Scons, I just know that it was considered
(an / the only?) alternative to CMake for many years. The Scons 4.3.0 release
notes say that Ninja is supported [1]https://scons.org/scons-430-is-available.html, but according to the user guide [2]https://scons.org/doc/production/PDF/scons-user.pdf
Ninja support is considered experimental.

Don't get me wrong, I don't insist on using Scons. I was just curious if it was
considered. Actually, a friend of mine pointed out that the fact that Scons
build files are literally a Python code could be a disadvantage. There is less
control of this code, basically it can do anything. It could complicate the
diagnosis of certain issues, etc.

Since you invested so much effort into Meson already let's just focus on it.

I tried the branch on GitHub on MacOS Monterey 12.3.1 and Ubuntu 20.04 LTS.
I was going to test it against several third party extensions, but it looks like
it is a bit early for this. On Ubuntu I got the following error:

```
../src/include/parser/kwlist.h:332:25: error: ‘PARAMETER’ undeclared here (not
in a function)
332 | PG_KEYWORD("parameter", PARAMETER, UNRESERVED_KEYWORD, BARE_LABEL)

../src/interfaces/ecpg/preproc/keywords.c:32:55: note: in definition of macro
‘PG_KEYWORD’
32 | #define PG_KEYWORD(kwname, value, category, collabel) value,
```

On MacOS I got multiple errors regarding LDAP:

```
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/
LDAP.framework/Headers/ldap.h:1:10: error: #include nested too deeply
#include <ldap.h>

../src/interfaces/libpq/fe-connect.c:4816:2: error: use of undeclared
identifier 'LDAP'
LDAP *ld = NULL;
^

../src/interfaces/libpq/fe-connect.c:4817:2: error: use of undeclared
identifier 'LDAPMessage'
LDAPMessage *res,
^
... etc...
```

I didn't invest much time into investigating these issues. For now I just
wanted to report them. Please let me know if you need any help with these
and/or additional information.

[1]: https://scons.org/scons-430-is-available.html
[2]: https://scons.org/doc/production/PDF/scons-user.pdf

--
Best regards,
Aleksander Alekseev

#176Andres Freund
andres@anarazel.de
In reply to: Aleksander Alekseev (#175)
Re: [RFC] building postgres with meson

Hi,

On 2022-05-31 16:49:17 +0300, Aleksander Alekseev wrote:

I tried the branch on GitHub on MacOS Monterey 12.3.1 and Ubuntu 20.04 LTS.
I was going to test it against several third party extensions, but it looks like
it is a bit early for this. On Ubuntu I got the following error:

What do those extensions use to build? Since the unconference I added some
rudimentary PGXS compatibility, but it's definitely not complete yet.

```
../src/include/parser/kwlist.h:332:25: error: ‘PARAMETER’ undeclared here (not
in a function)
332 | PG_KEYWORD("parameter", PARAMETER, UNRESERVED_KEYWORD, BARE_LABEL)

../src/interfaces/ecpg/preproc/keywords.c:32:55: note: in definition of macro
‘PG_KEYWORD’
32 | #define PG_KEYWORD(kwname, value, category, collabel) value,
```

Huh. I've not seen this before - could you provide a bit more detail about
what you did? CI isn't testing ubuntu, but it is testing Debian, so I'd expect
this to work.

On MacOS I got multiple errors regarding LDAP:

Ah, yes. Sorry, that's an open issue that I need to fix. -Dldap=disabled for
the rescue. There's some crazy ordering dependency in macos framework
headers. The ldap framework contains an "ldap.h" header that includes
"ldap.h". So if you end up with the framework on the include path, you get
endless recursion.

Greetings,

Andres Freund

#177Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#155)
1 attachment(s)
Re: [RFC] building postgres with meson -v8

On 06.05.22 23:27, Andres Freund wrote:

I added pkgconfig since then. They're not exactly the same, but pretty close,
except for one thing: Looks like some of the ecpg libraries really should link
to some other ecpg libs? I think we're missing something there... That then
leads to missing requirements in the .pc files.

I took a closer look at the generated pkgconfig files. I think they are
ok. There are a couple of insignificant textual differences that we
could reduce by patching Makefile.shlib. But technically they are ok.

There is one significant difference: the ecpg libraries now get a
Requires.private for openssl, which I think is technically correct since
both libpgcommon and libpgport require openssl.

Attached is a tiny patch to make the description in one file backward
consistent.

Attachments:

0001-fixup-meson-Add-meson-based-buildsystem.patchtext/plain; charset=UTF-8; name=0001-fixup-meson-Add-meson-based-buildsystem.patchDownload
From 8320c520e01b52933f6688e210ffa9cdfdefffe9 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 31 May 2022 20:46:20 +0200
Subject: [PATCH] fixup! meson: Add meson based buildsystem.

Fix description in pkg-config file for backward consistency.
---
 src/interfaces/ecpg/compatlib/meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 3cd61217e3..84cd42ccee 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -11,6 +11,6 @@ ecpg_compat = both_libraries('ecpg_compat',
 pkgconfig.generate(
   ecpg_compat.get_shared_lib(),
   name: 'libecpg_compat',
-  description: 'PostgreSQL ecpg_compat library',
+  description: 'PostgreSQL libecpg_compat library',
   url: pg_url,
 )
-- 
2.36.1

#178Aleksander Alekseev
aleksander@timescale.com
In reply to: Andres Freund (#176)
Re: [RFC] building postgres with meson

Hi Andres,

What do those extensions use to build? Since the unconference I added some
rudimentary PGXS compatibility, but it's definitely not complete yet.

We mostly use CMake and Cargo, the Rust package manager. So I don't
anticipate many problems here, just want to make sure it's going to
work as expected.

```
../src/include/parser/kwlist.h:332:25: error: ‘PARAMETER’ undeclared here (not
in a function)
332 | PG_KEYWORD("parameter", PARAMETER, UNRESERVED_KEYWORD, BARE_LABEL)

../src/interfaces/ecpg/preproc/keywords.c:32:55: note: in definition of macro
‘PG_KEYWORD’
32 | #define PG_KEYWORD(kwname, value, category, collabel) value,
```

Huh. I've not seen this before - could you provide a bit more detail about
what you did? CI isn't testing ubuntu, but it is testing Debian, so I'd expect
this to work.

I used PIP to install Meson, since the default APT package is too old, v0.53:

$ pip3 install --user meson
$ meson --version
0.62.1
$ ninja --version
1.10.0

The branch was checked out as it was described in the first email.
Then to reproduce the issue:

$ git status
On branch meson
Your branch is up to date with 'andres/meson'.
$ git fetch andres
$ git rebase -i andres/meson
$ meson setup build --buildtype debug
$ cd build
$ ninja

This is pretty much the default Ubuntu 20.04.4 LTS system with all the
recent updates installed, so it shouldn't be a problem to reproduce
the issue with a VM.

On MacOS I got multiple errors regarding LDAP:

Ah, yes. Sorry, that's an open issue that I need to fix. -Dldap=disabled for
the rescue. There's some crazy ordering dependency in macos framework
headers. The ldap framework contains an "ldap.h" header that includes
"ldap.h". So if you end up with the framework on the include path, you get
endless recursion.

Thanks, this helped. I did the following:

$ meson configure -Dldap=disabled
$ meson configure -Dssl=openssl
$ meson configure -Dprefix=/Users/eax/pginstall
$ ninja
$ meson test
$ meson install

... and it terminated successfully. I was also able to configure and
run Postgres instance using my regular scripts, with some
modifications [1]https://github.com/afiskon/pgscripts/blob/master/single-install.sh

Then I decided to compile TimescaleDB against the newly installed
Postgres. Turns out there is a slight problem.

The extension uses CMake and also requires PostgreSQL to be compiled
with OpenSSL support. CMakeLists.txt looks for a
"--with-(ssl=)?openssl" regular expression in the "pg_config
--configure" output. The output is empty although Postgres was
compiled with OpenSSL support. The full output of pg_config looks like
this:

```
CONFIGURE =
CC = not recorded
CPPFLAGS = not recorded
CFLAGS = not recorded
CFLAGS_SL = not recorded
... etc ...
```

I get a bunch of errors from the compiler if I remove this particular
check from CMakeLists, but I have to investigate these a bit more
since the branch is based on PG15 and we don't officially support PG15
yet. It worked last time we checked a month or so ago, but the
situation may have changed.

[1]: https://github.com/afiskon/pgscripts/blob/master/single-install.sh

--
Best regards,
Aleksander Alekseev

#179Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#177)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-06-01 06:55:06 +0200, Peter Eisentraut wrote:

On 06.05.22 23:27, Andres Freund wrote:

I added pkgconfig since then. They're not exactly the same, but pretty close,
except for one thing: Looks like some of the ecpg libraries really should link
to some other ecpg libs? I think we're missing something there... That then
leads to missing requirements in the .pc files.

I took a closer look at the generated pkgconfig files. I think they are ok.
There are a couple of insignificant textual differences that we could reduce
by patching Makefile.shlib. But technically they are ok.

Thanks for checking!

There is one significant difference: the ecpg libraries now get a
Requires.private for openssl, which I think is technically correct since
both libpgcommon and libpgport require openssl.

Yea, I noticed those too. It's not great, somehow. But I don't really see a
better alternative for now.

Attached is a tiny patch to make the description in one file backward
consistent.

Applied.

Greetings,

Andres Freund

#180Andres Freund
andres@anarazel.de
In reply to: Aleksander Alekseev (#178)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-01 12:39:50 +0300, Aleksander Alekseev wrote:

```
../src/include/parser/kwlist.h:332:25: error: ‘PARAMETER’ undeclared here (not
in a function)
332 | PG_KEYWORD("parameter", PARAMETER, UNRESERVED_KEYWORD, BARE_LABEL)

../src/interfaces/ecpg/preproc/keywords.c:32:55: note: in definition of macro
‘PG_KEYWORD’
32 | #define PG_KEYWORD(kwname, value, category, collabel) value,
```

Huh. I've not seen this before - could you provide a bit more detail about
what you did? CI isn't testing ubuntu, but it is testing Debian, so I'd expect
this to work.

I used PIP to install Meson, since the default APT package is too old, v0.53:

$ pip3 install --user meson
$ meson --version
0.62.1
$ ninja --version
1.10.0

The branch was checked out as it was described in the first email.
Then to reproduce the issue:

$ git status
On branch meson
Your branch is up to date with 'andres/meson'.
$ git fetch andres
$ git rebase -i andres/meson
$ meson setup build --buildtype debug
$ cd build
$ ninja

This is pretty much the default Ubuntu 20.04.4 LTS system with all the
recent updates installed, so it shouldn't be a problem to reproduce
the issue with a VM.

Will test.

On MacOS I got multiple errors regarding LDAP:

Ah, yes. Sorry, that's an open issue that I need to fix. -Dldap=disabled for
the rescue. There's some crazy ordering dependency in macos framework
headers. The ldap framework contains an "ldap.h" header that includes
"ldap.h". So if you end up with the framework on the include path, you get
endless recursion.

Thanks, this helped.

Cool. I think I pushed a fix/workaround for the issue now. Still can't decide
whether it's apple's or meson's fault.

I did the following:

$ meson configure -Dldap=disabled
$ meson configure -Dssl=openssl
$ meson configure -Dprefix=/Users/eax/pginstall

FYI, you can set multiple options in one go ;)

... and it terminated successfully. I was also able to configure and
run Postgres instance using my regular scripts, with some
modifications [1]

Cool.

Then I decided to compile TimescaleDB against the newly installed
Postgres. Turns out there is a slight problem.

The extension uses CMake and also requires PostgreSQL to be compiled
with OpenSSL support. CMakeLists.txt looks for a
"--with-(ssl=)?openssl" regular expression in the "pg_config
--configure" output. The output is empty although Postgres was
compiled with OpenSSL support.

Makes sense. Currently we don't fill the --configure thing, because there
configure wasn't used. We could try to generate something compatible from
meson options, but I'm not sure that's a good plan.

The full output of pg_config looks like
this:

```
CONFIGURE =
CC = not recorded
CPPFLAGS = not recorded
CFLAGS = not recorded
CFLAGS_SL = not recorded
... etc ...
```

I get a bunch of errors from the compiler if I remove this particular
check from CMakeLists, but I have to investigate these a bit more
since the branch is based on PG15 and we don't officially support PG15
yet. It worked last time we checked a month or so ago, but the
situation may have changed.

I suspect the errors might be due to CC/CPPFLAGS/... not being defined. I can
try to make it output something roughly compatible with the old output, for
most of those I already started to compute values for the PGXS compat stuff I
was hacking on recently.

Greetings,

Andres Freund

#181Aleksander Alekseev
aleksander@timescale.com
In reply to: Andres Freund (#180)
Re: [RFC] building postgres with meson

Hi Andres,

Cool. I think I pushed a fix/workaround for the issue now. Still can't decide
whether it's apple's or meson's fault.

Many thanks! The fix solved the problem, I can compile with -Dldap=enabled now.
The code passes the tests too.

$ meson configure -Dldap=disabled
$ meson configure -Dssl=openssl
$ meson configure -Dprefix=/Users/eax/pginstall

FYI, you can set multiple options in one go ;)

Thanks! ;)

Makes sense. Currently we don't fill the --configure thing, because there
configure wasn't used. We could try to generate something compatible from
meson options, but I'm not sure that's a good plan.

If pg_config output was 100% backward compatible with Autotools one, that would
simplify the lives of the extension developers for sure. However, considering
that at PGCon we agreed that both Autotools and Meson will be maintained for
several releases, personally I wouldn't say that this compatibility is
necessary, nor is it realistically deliverable. Nevertheless, IMO there should
be a stable and documented way to determine the PostgreSQL version (this can be
done with `pg_config --version` for both Autotools and Meson), the build tool
used (no way to determine) and the build options (no way to determine
for Meson).

I suspect the errors might be due to CC/CPPFLAGS/... not being defined. I can
try to make it output something roughly compatible with the old output, for
most of those I already started to compute values for the PGXS compat stuff I
was hacking on recently.

Yes, that could explain the problem. Just for the record, I get several errors
regarding src/export.h in TimescaleDB code [1]https://github.com/timescale/timescaledb/blob/main/src/export.h:

```
/Users/eax/projects/c/timescaledb/src/export.h:26:5: error: pasting formed
')87628', an invalid preprocessing token [clang-diagnostic-error]
#if TS_EMPTY(PGDLLEXPORT)
^
/Users/eax/projects/c/timescaledb/src/export.h:17:22: note: expanded from
macro 'TS_EMPTY'
#define TS_EMPTY(x) (TS_CAT(x, 87628) == 87628)
^
/Users/eax/projects/c/timescaledb/src/export.h:15:23: note: expanded from
macro 'TS_CAT'
#define TS_CAT(x, y) x##y
^
/Users/eax/projects/c/timescaledb/src/export.h:26:14: error: function-like
macro '__attribute__' is not defined [clang-diagnostic-error]
#if TS_EMPTY(PGDLLEXPORT)
^
/Users/eax/pginstall/include/postgresql/server/c.h:1339:21: note: expanded
from macro 'PGDLLEXPORT'
#define PGDLLEXPORT __attribute__((visibility("default")))
^
/Users/eax/projects/c/timescaledb/src/export.h:30:2: error: "PGDLLEXPORT is
already defined" [clang-diagnostic-error]
#error "PGDLLEXPORT is already defined"
^
1 warning and 3 errors generated.
Error while processing /Users/eax/projects/c/timescaledb/src/extension.c
```

[1]: https://github.com/timescale/timescaledb/blob/main/src/export.h

--
Best regards,
Aleksander Alekseev

#182Andres Freund
andres@anarazel.de
In reply to: Aleksander Alekseev (#181)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-02 15:34:23 +0300, Aleksander Alekseev wrote:

Hi Andres,

Cool. I think I pushed a fix/workaround for the issue now. Still can't decide
whether it's apple's or meson's fault.

Many thanks! The fix solved the problem, I can compile with -Dldap=enabled now.
The code passes the tests too.

Cool.

I suspect the errors might be due to CC/CPPFLAGS/... not being defined. I can
try to make it output something roughly compatible with the old output, for
most of those I already started to compute values for the PGXS compat stuff I
was hacking on recently.

Yes, that could explain the problem. Just for the record, I get several errors
regarding src/export.h in TimescaleDB code [1]:

I think this is timescale's issue. Why are you defining / undefining
PGDLLEXPORT?

Part of the patch series is to use visibility attributes, and your #if
TS_EMPTY(PGDLLEXPORT) thing can't handle that.

Greetings,

Andres Freund

#183Andres Freund
andres@anarazel.de
In reply to: Aleksander Alekseev (#178)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-01 12:39:50 +0300, Aleksander Alekseev wrote:

```
../src/include/parser/kwlist.h:332:25: error: ‘PARAMETER’ undeclared here (not
in a function)
332 | PG_KEYWORD("parameter", PARAMETER, UNRESERVED_KEYWORD, BARE_LABEL)

../src/interfaces/ecpg/preproc/keywords.c:32:55: note: in definition of macro
‘PG_KEYWORD’
32 | #define PG_KEYWORD(kwname, value, category, collabel) value,
```

Huh. I've not seen this before - could you provide a bit more detail about
what you did? CI isn't testing ubuntu, but it is testing Debian, so I'd expect
this to work.

I used PIP to install Meson, since the default APT package is too old, v0.53:

$ pip3 install --user meson
$ meson --version
0.62.1
$ ninja --version
1.10.0

The branch was checked out as it was described in the first email.
Then to reproduce the issue:

$ git status
On branch meson
Your branch is up to date with 'andres/meson'.
$ git fetch andres
$ git rebase -i andres/meson
$ meson setup build --buildtype debug
$ cd build
$ ninja

This is pretty much the default Ubuntu 20.04.4 LTS system with all the
recent updates installed, so it shouldn't be a problem to reproduce
the issue with a VM.

Chatting with a colleague (who unbeknownst to me hit something similar in the
past) I think we figured it out. It's not due to Ubuntu 20.04 or such. It's
likely due to previously having an in-tree build with autoconf, doing make
clean, doing a git pull, then building with meson. The meson build doesn't yet
handle pre-existing flex / bison output.

I had tried to defend against conflicts with in-tree builds by detecting an
in-tree pg_config.h, but that doesn't help with files that aren't removed by
make clean. Like bison / flex output.

And I didn't notice this problem because it doesn't cause visible issues until
the lexer / grammar changes...

I'm not quite sure what the proper behaviour is when doing an out-of-tree
build with meson (all builds are out-of-tree), with a pre-existing flex /
bison output in the source tree that is out of date.

Greetings,

Andres Freund

#184Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#183)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

I'm not quite sure what the proper behaviour is when doing an out-of-tree
build with meson (all builds are out-of-tree), with a pre-existing flex /
bison output in the source tree that is out of date.

Definitely sounds like a gotcha.

On the one hand, there's been some discussion already of removing all
derived files from tarballs and just insisting that users provide all
needed tools when building from source. If we did that, it could be
sufficient for the meson build to check that no such files are present
in the source tree. (Checking a couple of them would be enough, likely.)

On the other hand, I'm not sure that I want such a change to be forced
by a toolchain change. It definitely seems a bit contrary to the plan
we'd formed of allowing meson and make-based builds to coexist for
a few years, because we'd be breaking at least some make-based build
processes.

Could we have the meson build check that, say, if gram.c exists it
is newer than gram.y? Or get it to ignore an in-tree gram.c?

regards, tom lane

#185Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#184)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-02 13:08:49 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

I'm not quite sure what the proper behaviour is when doing an out-of-tree
build with meson (all builds are out-of-tree), with a pre-existing flex /
bison output in the source tree that is out of date.

Definitely sounds like a gotcha.

On the one hand, there's been some discussion already of removing all
derived files from tarballs and just insisting that users provide all
needed tools when building from source. If we did that, it could be
sufficient for the meson build to check that no such files are present
in the source tree. (Checking a couple of them would be enough, likely.)

There already is a check for pg_config.h, so the most obvious source of this
is addressed. Just didn't think about the files that make clean doesn't remove
:/.

On the other hand, I'm not sure that I want such a change to be forced
by a toolchain change. It definitely seems a bit contrary to the plan
we'd formed of allowing meson and make-based builds to coexist for
a few years, because we'd be breaking at least some make-based build
processes.

Agreed. I think it'd be pretty reasonable to not include flex / bison
output. They're not hard to acquire. The docs are perhaps another story.

I think it might be fine to say that make reallyclean (*) is required if
there's some conflicting in-source tree file?

Could we have the meson build check that, say, if gram.c exists it
is newer than gram.y? Or get it to ignore an in-tree gram.c?

I suspect the problem with ignoring is gram.h, that's probably a bit harder to
ignore. Right now I'm leaning towards either always erroring out if there's
bison/flex output in the source tree (with a hint towards make
reallyclean(*)), or erroring out if they're out of date (again with a hint
towards reallyclean)?

Alternatively we could just remove the generated .c/h files from the source
dir, as a part of regenerating them in the build dir? But I like the idea of
the source dir being readonly outside of explicit targets modifying sources
(e.g. update-unicode or such).

Greetings,

Andres Freund

(*) do we really not have a target that removes bison / flex output?

#186Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#185)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

(*) do we really not have a target that removes bison / flex output?

maintainer-clean

regards, tom lane

#187Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#186)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-02 13:33:51 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

(*) do we really not have a target that removes bison / flex output?

maintainer-clean

Don't think so:

# gram.c, gram.h, and scan.c are in the distribution tarball, so they
# are not cleaned here.
clean distclean maintainer-clean:
rm -f lex.backup

Greetings,

Andres Freund

#188Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#187)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

On 2022-06-02 13:33:51 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

(*) do we really not have a target that removes bison / flex output?

maintainer-clean

Don't think so:

See about line 300 in src/backend/Makefile. In any case, it's
easy to show by experiment that it does.

$ make maintainer-clean
...
$ git status --ignored
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

regards, tom lane

#189Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#188)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-02 15:05:10 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2022-06-02 13:33:51 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

(*) do we really not have a target that removes bison / flex output?

maintainer-clean

Don't think so:

See about line 300 in src/backend/Makefile. In any case, it's
easy to show by experiment that it does.

$ make maintainer-clean
...
$ git status --ignored
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Oh. I executed maintainer-clean inside src/backend/parser/, and thus didn't
see it getting cleaned up.

It seems pretty darn grotty that src/backend/parser/Makefile explicitly states
that gram.c ... aren't cleaned "here", but then src/backend/Makefile does
clean them up.

Greetings,

Andres Freund

#190Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#189)
Re: [RFC] building postgres with meson

Andres Freund <andres@anarazel.de> writes:

Oh. I executed maintainer-clean inside src/backend/parser/, and thus didn't
see it getting cleaned up.

It seems pretty darn grotty that src/backend/parser/Makefile explicitly states
that gram.c ... aren't cleaned "here", but then src/backend/Makefile does
clean them up.

I agree the factorization of this ain't great. I'd think about improving
it, were it not that we're trying to get rid of it.

(But with meson, the whole idea of building or cleaning just part of the
tree is out the window anyway, no?)

regards, tom lane

#191Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#190)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-02 15:53:50 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

Oh. I executed maintainer-clean inside src/backend/parser/, and thus didn't
see it getting cleaned up.

It seems pretty darn grotty that src/backend/parser/Makefile explicitly states
that gram.c ... aren't cleaned "here", but then src/backend/Makefile does
clean them up.

I agree the factorization of this ain't great. I'd think about improving
it, were it not that we're trying to get rid of it.

+1. I think I just wanted to excuse my confusion...

(But with meson, the whole idea of building or cleaning just part of the
tree is out the window anyway, no?)

Cleaning parts of the tree isn't supported as far as I know (not that I've
needed it). You can build parts of the tree by specifying the target
(e.g. ninja src/backend/postgres) or by specifying meta-targets (e.g. ninja
contrib backend). I've thought about contributing a patch to meson to
automatically generate targets for each directory that has sub-targets - it's
just a few lines.

Greetings,

Andres Freund

#192Aleksander Alekseev
aleksander@timescale.com
In reply to: Andres Freund (#191)
Re: [RFC] building postgres with meson

Hi hackers,

See about line 300 in src/backend/Makefile. In any case, it's
easy to show by experiment that it does.

`make maintainer-clean` did the trick, thanks. I suggest modifying meson.build
accordingly:

-run make distclean in the source tree.
+run `make maintainer-clean` in the source tree.

I think this is timescale's issue. Why are you defining / undefining
PGDLLEXPORT?

That's a great question.

As I understand some time ago the developers had a problem with a collision of
exported symbols on *nix platforms [1]https://github.com/timescale/timescaledb/commit/027b7b29420a742d7615c70d9f19b2b99c488c2c and chose to solve it by re-defining
PGDLLEXPORT to __attribute__((visibility ("default"))) for GCC and CLang.
I agree that this is a questionable approach. Redefining a macro provided
by Postgres doesn't strike me as a good idea. I tried to remove this
re-definition, but it didn't go well [2]https://github.com/timescale/timescaledb/pull/4413. So apparently it should be addressed
somehow differently.

Part of the patch series is to use visibility attributes, and your #if
TS_EMPTY(PGDLLEXPORT) thing can't handle that.

Out of curiosity, how come a patchset that adds an alternative build system
changes the visibility attributes? I would guess they should be the same
for both Autotools and Meson. Is it necessary in order to make Meson work?
If not, maybe it should be a separate patch.

[1]: https://github.com/timescale/timescaledb/commit/027b7b29420a742d7615c70d9f19b2b99c488c2c
[2]: https://github.com/timescale/timescaledb/pull/4413

--
Best regards,
Aleksander Alekseev

#193Andres Freund
andres@anarazel.de
In reply to: Aleksander Alekseev (#192)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-03 12:35:45 +0300, Aleksander Alekseev wrote:

Part of the patch series is to use visibility attributes, and your #if
TS_EMPTY(PGDLLEXPORT) thing can't handle that.

Out of curiosity, how come a patchset that adds an alternative build system
changes the visibility attributes?

It was the simplest path - on windows (and AIx) extension symbols need to be
explicitly exported. We did that by building the objects constituting
extension libraries, collecting the symbols, generating an export file with
all the symbols, which then is passed to the linker. It was a lot less work
to just add the necessary PGDLLEXPORT annotations than make that export file
generation work for extensions.

I would guess they should be the same for both Autotools and Meson.

It is, the patch adds it to both.

Is it necessary in order to make Meson work?

Yes, or at least the simplest path.

If not, maybe it should be a separate patch.

It is.

https://commitfest.postgresql.org/38/3396/

Greetings,

Andres Freund

#194Michael Paquier
michael@paquier.xyz
In reply to: Peter Eisentraut (#168)
Re: [RFC] building postgres with meson -v8

On Tue, May 24, 2022 at 08:08:26PM +0200, Peter Eisentraut wrote:

On 18.05.22 21:48, Andres Freund wrote:

- GETTIMEOFDAY_1ARG - test doesn't exist - I suspect it might not be necessary

Might be obsolete, consider removing.

I just came across this one independently of what you are doing for
meson, and based on a lookup of the buildfarm, I think that it can be
removed. One reference about GETTIMEOFDAY_1ARG on the -hackers list
comes from here, from 20 years ago:
/messages/by-id/a1eeu5$1koe$1@news.tht.net
--
Michael

#195Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#168)
1 attachment(s)
Re: [RFC] building postgres with meson -v8

I looked at some of the "prereq" patches again to see what state they
are in:

commit 351a12f48e395b31cce4aca239b934174b36ea9d
Author: Andres Freund <andres@anarazel.de>
Date: Wed Apr 20 22:46:54 2022

prereq: deal with \ paths in basebackup_to_shell tests.

This is a new component in PG15, so a fix might be in scope for PG15
too. But I don't know if this change is really necessary. There are
other tests that use the GZIP and TAR environment variables (e.g.,
pg_verifybackup). If this is a problem there too, we should think of a
general solution. If not, it could use some explanation.

commit c00642483a53f4ee6e351085c7628363c293ee61
Author: Andres Freund <andres@anarazel.de>
Date: Fri Mar 25 21:44:48 2022

meson: prereq: unicode: allow to specify output directory.

OK with attached fixup (but see below).

commit 31313056e153e099f236a29b752f7610c4f7764f
Author: Andres Freund <andres@anarazel.de>
Date: Thu Jan 20 08:36:50 2022

meson: prereq: generate-errcodes.pl: accept output file

This is ok, but seems unnecessary, since meson can capture the output of
a single file. (See also similar script generate-errcodes-table.pl in
doc/, which uses capture.)

commit e4e77c0e20f3532be4ed270a7cf8b965b7cafa49
Author: Andres Freund <andres@anarazel.de>
Date: Thu Jan 20 08:36:50 2022

meson: prereq: add output path arg in generate-lwlocknames.pl

We should make the command-line interface here the same as the unicode
script: Either make the output directory a positional argument or an
option. I don't have a strong feeling about it either way, but perhaps
the solution with the option is more elegant and would also not require
changing the makefiles. Also, we should decide on short or long option:
The code declares a long option, but the build uses a short option.
It's confusing that that even works.

commit 7866620afa65223f6e657da972f501615fd32d3b
Author: Andres Freund <andres@anarazel.de>
Date: Wed Apr 20 21:01:31 2022

meson: prereq: output and depencency tracking work.

This could be split into multiple parts with more detailed explanations.
I see where you're going but not everything is fully clear to me
(especially the guc-file.c.h stuff).

Attachments:

0001-fixup-meson-prereq-unicode-allow-to-specify-output-d.patchtext/plain; charset=UTF-8; name=0001-fixup-meson-prereq-unicode-allow-to-specify-output-d.patchDownload
From 51c6d3544ae9e652c7aac26102a8bf5a116fb182 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 7 Jun 2022 22:54:26 +0200
Subject: [PATCH] fixup! meson: prereq: unicode: allow to specify output
 directory.

---
 src/common/unicode/generate-unicode_norm_table.pl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 3d0c3f0ebc..ed4181fce6 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -40,7 +40,7 @@
 my @characters     = ();
 my %character_hash = ();
 open($FH, '<', "$directory/UnicodeData.txt")
-  or die "Could not open UnicodeData.txt: $!.";
+  or die "Could not open $directory/UnicodeData.txt: $!.";
 while (my $line = <$FH>)
 {
 
-- 
2.36.1

#196Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#195)
1 attachment(s)
Re: [RFC] building postgres with meson -v8

Attached is a patch the finishes up the work to move the snowball SQL
script generation into a separate script.

Attachments:

0001-fixup-meson-prereq-move-snowball_create.sql-creation.patchtext/plain; charset=UTF-8; name=0001-fixup-meson-prereq-move-snowball_create.sql-creation.patchDownload
From 02ca51dfb918666dfde8e48499a4c73afae4e89e Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 8 Jun 2022 11:05:31 +0200
Subject: [PATCH] fixup! meson: prereq: move snowball_create.sql creation into
 perl file.

- Remove LANGUAGES list from Makefile, keep in Perl script.
- Add list of stopword files to install.
- Make depfile generation optional.
- Call new Perl script from Install.pm.
---
 src/backend/snowball/Makefile           | 81 ++++++++-----------------
 src/backend/snowball/meson.build        |  3 +-
 src/backend/snowball/snowball_create.pl | 73 +++++++++++++++++-----
 src/tools/msvc/Install.pm               | 36 +----------
 4 files changed, 86 insertions(+), 107 deletions(-)

diff --git a/src/backend/snowball/Makefile b/src/backend/snowball/Makefile
index 259104f8eb..c12a77055d 100644
--- a/src/backend/snowball/Makefile
+++ b/src/backend/snowball/Makefile
@@ -72,40 +72,22 @@ OBJS += \
 	stem_UTF_8_turkish.o \
 	stem_UTF_8_yiddish.o
 
-# first column is language name and also name of dictionary for not-all-ASCII
-# words, second is name of dictionary for all-ASCII words
-# Note order dependency: use of some other language as ASCII dictionary
-# must come after creation of that language
-LANGUAGES=  \
-	arabic		arabic		\
-	armenian	armenian	\
-	basque		basque		\
-	catalan		catalan		\
-	danish		danish		\
-	dutch		dutch		\
-	english		english		\
-	finnish		finnish		\
-	french		french		\
-	german		german		\
-	greek		greek		\
-	hindi		english		\
-	hungarian	hungarian	\
-	indonesian	indonesian	\
-	irish		irish		\
-	italian		italian		\
-	lithuanian	lithuanian	\
-	nepali		nepali		\
-	norwegian	norwegian	\
-	portuguese	portuguese	\
-	romanian	romanian	\
-	russian		english		\
-	serbian		serbian		\
-	spanish		spanish		\
-	swedish		swedish		\
-	tamil		tamil		\
-	turkish		turkish		\
-	yiddish		yiddish
-
+stop_files = \
+	danish.stop \
+	dutch.stop \
+	english.stop \
+	finnish.stop \
+	french.stop \
+	german.stop \
+	hungarian.stop \
+	italian.stop \
+	nepali.stop \
+	norwegian.stop \
+	portuguese.stop \
+	russian.stop \
+	spanish.stop \
+	swedish.stop \
+	turkish.stop
 
 SQLSCRIPT= snowball_create.sql
 DICTDIR=tsearch_data
@@ -119,35 +101,22 @@ all: all-shared-lib $(SQLSCRIPT)
 
 include $(top_srcdir)/src/Makefile.shlib
 
-$(SQLSCRIPT): snowball_create.pl Makefile snowball_func.sql.in snowball.sql.in
+$(SQLSCRIPT): snowball_create.pl snowball_func.sql.in snowball.sql.in
 	$(PERL) $< --input ${srcdir} --output .
 
 install: all installdirs install-lib
 	$(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)'
-	@set -e; \
-	set $(LANGUAGES) ; \
-	while [ "$$#" -gt 0 ] ; \
-	do \
-		lang=$$1; shift; shift; \
-		if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \
-			$(INSTALL_DATA) $(srcdir)/stopwords/$${lang}.stop '$(DESTDIR)$(datadir)/$(DICTDIR)' ; \
-		fi \
-	done
+	$(INSTALL_DATA) $(addprefix $(srcdir)/stopwords/,$(stop_files)) '$(DESTDIR)$(datadir)/$(DICTDIR)'
 
 installdirs: installdirs-lib
 	$(MKDIR_P) '$(DESTDIR)$(datadir)' '$(DESTDIR)$(datadir)/$(DICTDIR)'
 
 uninstall: uninstall-lib
 	rm -f '$(DESTDIR)$(datadir)/$(SQLSCRIPT)'
-	@set -e; \
-	set $(LANGUAGES) ; \
-	while [ "$$#" -gt 0 ] ; \
-	do \
-		lang=$$1; shift; shift;  \
-		if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \
-		    rm -f '$(DESTDIR)$(datadir)/$(DICTDIR)/'$${lang}.stop ; \
-		fi \
-	done
-
-clean distclean maintainer-clean: clean-lib
-	rm -f $(OBJS) $(SQLSCRIPT) snowball_create.dep
+	rm -f $(addprefix '$(DESTDIR)$(datadir)/$(DICTDIR)/',$(stop_files))
+
+clean distclean: clean-lib
+	rm -f $(OBJS)
+
+maintainer-clean: distclean
+	rm -f $(SQLSCRIPT)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 30aed714dc..c6326380e1 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -70,12 +70,11 @@ snowball_create = custom_target('snowball_create',
   input: ['snowball_create.pl'],
   output: ['snowball_create.sql'],
   depfile: 'snowball_create.dep',
-  command: [perl, '@INPUT0@', '--input', '@CURRENT_SOURCE_DIR@', '--output', '@OUTDIR@'],
+  command: [perl, '@INPUT0@', '--depfile', '--input', '@CURRENT_SOURCE_DIR@', '--output', '@OUTDIR@'],
   install: true,
   install_dir: dir_data,
 )
 
-# FIXME: check whether the logic to select languages currently in Makefile is needed
 install_subdir('stopwords',
   install_dir: dir_data / 'tsearch_data',
   strip_directory: true,
diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl
index 285cf4f5d9..97e6c4d86d 100644
--- a/src/backend/snowball/snowball_create.pl
+++ b/src/backend/snowball/snowball_create.pl
@@ -7,8 +7,52 @@
 my $output_path = '';
 my $makefile_path = '';
 my $input_path = '';
+my $depfile;
+
+our @languages = qw(
+	arabic
+	armenian
+	basque
+	catalan
+	danish
+	dutch
+	english
+	finnish
+	french
+	german
+	greek
+	hindi
+	hungarian
+	indonesian
+	irish
+	italian
+	lithuanian
+	nepali
+	norwegian
+	portuguese
+	romanian
+	russian
+	serbian
+	spanish
+	swedish
+	tamil
+	turkish
+	yiddish
+);
+
+# Names of alternative dictionaries for all-ASCII words.  If not
+# listed, the language itself is used.  Note order dependency: Use of
+# some other language as ASCII dictionary must come after creation of
+# that language, so the "backup" language must be listed earlier in
+# @languages.
+
+our %ascii_languages = (
+	'hindi' => 'english',
+	'russian' => 'english',
+);
 
 GetOptions(
+	'depfile'    => \$depfile,
 	'output:s'   => \$output_path,
 	'input:s'    => \$input_path) || usage();
 
@@ -29,7 +73,8 @@
 sub usage
 {
 	die <<EOM;
-Usage: snowball_create.pl --input/-i <path> --input <path>
+Usage: snowball_create.pl --input/-i <path> --output/-o <path>
+    --depfile       Write dependency file
     --output        Output directory (default '.')
     --input         Input directory
 
@@ -45,19 +90,16 @@ sub GenerateTsearchFiles
 	my $F;
 	my $D;
 	my $tmpl = read_file("$input_path/snowball.sql.in");
-	my $mf   = read_file("$input_path/Makefile");
 
-	open($D, '>', "$output_path/snowball_create.dep")
-	  || die "Could not write snowball_create.dep";
+	if ($depfile)
+	{
+		open($D, '>', "$output_path/snowball_create.dep")
+		  || die "Could not write snowball_create.dep";
+	}
 
-	print $D "$output_file: $input_path/Makefile\n";
-	print $D "$output_file: $input_path/snowball.sql.in\n";
-	print $D "$output_file: $input_path/snowball_func.sql.in\n";
+	print $D "$output_file: $input_path/snowball.sql.in\n" if $depfile;
+	print $D "$output_file: $input_path/snowball_func.sql.in\n" if $depfile;
 
-	$mf =~ s{\\\r?\n}{}g;
-	$mf =~ /^LANGUAGES\s*=\s*(.*)$/m
-	  || die "Could not find LANGUAGES line in snowball Makefile\n";
-	my @pieces = split /\s+/, $1;
 	open($F, '>', $output_file)
 	  || die "Could not write snowball_create.sql";
 
@@ -65,10 +107,9 @@ sub GenerateTsearchFiles
 
 	print $F read_file("$input_path/snowball_func.sql.in");
 
-	while ($#pieces > 0)
+	foreach my $lang (@languages)
 	{
-		my $lang    = shift @pieces || last;
-		my $asclang = shift @pieces || last;
+		my $asclang = $ascii_languages{$lang} || $lang;
 		my $txt     = $tmpl;
 		my $stop    = '';
 		my $stopword_path = "$input_path/stopwords/$lang.stop";
@@ -77,7 +118,7 @@ sub GenerateTsearchFiles
 		{
 			$stop = ", StopWords=$lang";
 
-			print $D "$output_file: $stopword_path\n";
+			print $D "$output_file: $stopword_path\n" if $depfile;
 		}
 
 		$txt =~ s#_LANGNAME_#${lang}#gs;
@@ -89,7 +130,7 @@ sub GenerateTsearchFiles
 		print $F $txt;
 	}
 	close($F);
-	close($D);
+	close($D) if $depfile;
 	return;
 }
 
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index 8de79c618c..db61b992ff 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -389,39 +389,9 @@ sub GenerateTsearchFiles
 	my $target = shift;
 
 	print "Generating tsearch script...";
-	my $F;
-	my $tmpl = read_file('src/backend/snowball/snowball.sql.in');
-	my $mf   = read_file('src/backend/snowball/Makefile');
-	$mf =~ s{\\\r?\n}{}g;
-	$mf =~ /^LANGUAGES\s*=\s*(.*)$/m
-	  || die "Could not find LANGUAGES line in snowball Makefile\n";
-	my @pieces = split /\s+/, $1;
-	open($F, '>', "$target/share/snowball_create.sql")
-	  || die "Could not write snowball_create.sql";
-	print $F read_file('src/backend/snowball/snowball_func.sql.in');
-
-	while ($#pieces > 0)
-	{
-		my $lang    = shift @pieces || last;
-		my $asclang = shift @pieces || last;
-		my $txt     = $tmpl;
-		my $stop    = '';
-
-		if (-s "src/backend/snowball/stopwords/$lang.stop")
-		{
-			$stop = ", StopWords=$lang";
-		}
-
-		$txt =~ s#_LANGNAME_#${lang}#gs;
-		$txt =~ s#_DICTNAME_#${lang}_stem#gs;
-		$txt =~ s#_CFGNAME_#${lang}#gs;
-		$txt =~ s#_ASCDICTNAME_#${asclang}_stem#gs;
-		$txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs;
-		$txt =~ s#_STOPWORDS_#$stop#gs;
-		print $F $txt;
-		print ".";
-	}
-	close($F);
+	system('perl', 'src/backend/snowball/snowball_create.pl',
+		'--input', 'src/backend/snowball/',
+		'--output', "$target/share/");
 	print "\n";
 	return;
 }
-- 
2.36.1

#197Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#195)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-06-08 08:27:06 +0200, Peter Eisentraut wrote:

I looked at some of the "prereq" patches again to see what state they are
in:

commit 351a12f48e395b31cce4aca239b934174b36ea9d
Author: Andres Freund <andres@anarazel.de>
Date: Wed Apr 20 22:46:54 2022

prereq: deal with \ paths in basebackup_to_shell tests.

This is a new component in PG15, so a fix might be in scope for PG15 too.

Yea, I should probably post that to the relevant thread. I think at that point
I was just trying to get a rebase not to fail anymore...

But I don't know if this change is really necessary. There are other tests
that use the GZIP and TAR environment variables (e.g., pg_verifybackup). If
this is a problem there too, we should think of a general solution. If not,
it could use some explanation.

I got failures on windows without it - which we just don't see on windows
because currently nothing runs these tests :(. The pg_verifybackup case likely
is unproblematic because it uses the array form of building subcommands,
instead of string interpolation.

commit c00642483a53f4ee6e351085c7628363c293ee61
Author: Andres Freund <andres@anarazel.de>
Date: Fri Mar 25 21:44:48 2022

meson: prereq: unicode: allow to specify output directory.

OK with attached fixup (but see below).

Merged.

commit 31313056e153e099f236a29b752f7610c4f7764f
Author: Andres Freund <andres@anarazel.de>
Date: Thu Jan 20 08:36:50 2022

meson: prereq: generate-errcodes.pl: accept output file

This is ok, but seems unnecessary, since meson can capture the output of a
single file. (See also similar script generate-errcodes-table.pl in doc/,
which uses capture.)

Not sure why I didn't do that. It might be because the meson capture stuff has
a noticable overhead, particularly on windows, because it starts up a python
interpreter. Since nearly the whole build depends on generate-errcodes.pl to
have run...

commit e4e77c0e20f3532be4ed270a7cf8b965b7cafa49
Author: Andres Freund <andres@anarazel.de>
Date: Thu Jan 20 08:36:50 2022

meson: prereq: add output path arg in generate-lwlocknames.pl

We should make the command-line interface here the same as the unicode
script: Either make the output directory a positional argument or an option.
I don't have a strong feeling about it either way, but perhaps the solution
with the option is more elegant and would also not require changing the
makefiles.

I don't really have an opinion what's better here, so I'll go with your
preference / the option.

Also, we should decide on short or long option: The code
declares a long option, but the build uses a short option. It's confusing
that that even works.

Getopt::Long auto-generates short options afaict...

commit 7866620afa65223f6e657da972f501615fd32d3b
Author: Andres Freund <andres@anarazel.de>
Date: Wed Apr 20 21:01:31 2022

meson: prereq: output and depencency tracking work.

This could be split into multiple parts with more detailed explanations. I
see where you're going but not everything is fully clear to me (especially
the guc-file.c.h stuff).

Will take a stab at doing so.

From 51c6d3544ae9e652c7aac26102a8bf5a116fb182 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 7 Jun 2022 22:54:26 +0200
Subject: [PATCH] fixup! meson: prereq: unicode: allow to specify output
directory.

Merged.

Greetings,

Andres Freund

#198Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#196)
Re: [RFC] building postgres with meson -v8

Hi,

On 2022-06-08 14:33:16 +0200, Peter Eisentraut wrote:

Attached is a patch the finishes up the work to move the snowball SQL script
generation into a separate script.

That looks good, merged. I did split the commit, because there's not yet a
meson.build "at the time" of the prereq: commits.

One thing I'm not quite sure about: Why does the makefile need awareness of
the stop files, but Install.pm doesn't? I suspect currently the patch leads to
stopwords not being installed on windows anymore?

Greetings,

Andres Freund

#199Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#198)
Re: [RFC] building postgres with meson -v8

On 14.06.22 20:27, Andres Freund wrote:

One thing I'm not quite sure about: Why does the makefile need awareness of
the stop files, but Install.pm doesn't? I suspect currently the patch leads to
stopwords not being installed on windows anymore?

Install.pm contains this elsewhere:

GenerateTsearchFiles($target);
CopySetOfFiles(
'Stopword files',
[ glob("src\\backend\\snowball\\stopwords\\*.stop") ],
$target . '/share/tsearch_data/');

It's a bit confusing that the "generate" function that we are patching
also installs some of the files right away, while the rest is installed
by the calling function.

#200Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#199)
Re: [RFC] building postgres with meson -v8

On 2022-06-14 20:47:59 +0200, Peter Eisentraut wrote:

On 14.06.22 20:27, Andres Freund wrote:

One thing I'm not quite sure about: Why does the makefile need awareness of
the stop files, but Install.pm doesn't? I suspect currently the patch leads to
stopwords not being installed on windows anymore?

Install.pm contains this elsewhere:

GenerateTsearchFiles($target);
CopySetOfFiles(
'Stopword files',
[ glob("src\\backend\\snowball\\stopwords\\*.stop") ],
$target . '/share/tsearch_data/');

It's a bit confusing that the "generate" function that we are patching also
installs some of the files right away, while the rest is installed by the
calling function.

Ugh, that's confusing indeed. Thanks for the explanation.

#201Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
17 attachment(s)
Re: [RFC] building postgres with meson -v9

Hi,

Attached is an updated version of the meson patchset. There has been a steady
stream of incremental work over the last month, with patches from Peter
Eisentraut and Nazir Yavuz.

I tried to address the review comments Peter had downthread about the prep
patches. The one that I know is still outstanding is that there's still
different ways of passing output directories as parameters to a bunch of
scripts added, will resolve that next (some have been fixed).

Now the patchset contains a, somewhat hacky and incomplete, implementation of
pgxs, even when using meson. Basically a compatible Makefile.global.in is
generated.

There's a lot of small and medium sized changes.

As usual the changes are also my git branch [1]https://github.com/anarazel/postgres/tree/meson, which gets updated fairly
regularly.

Greetings,

Andres Freund

[1]: https://github.com/anarazel/postgres/tree/meson

Attachments:

v9-0001-prereq-deal-with-paths-in-basebackup_to_shell-tes.patch.gzapplication/x-patch-gzipDownload
v9-0002-meson-prereq-Specify-output-directory-for-psql-sq.patch.gzapplication/x-patch-gzipDownload
v9-0003-meson-prereq-ecpg-add-and-use-output-directory-ar.patch.gzapplication/x-patch-gzipDownload
v9-0004-meson-prereq-msvc-explicit-output-file-for-pgflex.patch.gzapplication/x-patch-gzipDownload
v9-0005-meson-prereq-move-snowball_create.sql-creation-in.patch.gzapplication/x-patch-gzipDownload
v9-0006-meson-prereq-add-output-path-arg-in-generate-lwlo.patch.gzapplication/x-patch-gzipDownload
v9-0007-meson-prereq-generate-errcodes.pl-accept-output-f.patch.gzapplication/x-patch-gzipDownload
v9-0008-meson-prereq-unicode-allow-to-specify-output-dire.patch.gzapplication/x-patch-gzipDownload
v9-0009-meson-prereq-Can-we-get-away-with-not-export-all-.patch.gzapplication/x-patch-gzipDownload
v9-0010-meson-prereq-add-src-tools-gen_versioning_script..patch.gzapplication/x-patch-gzipDownload
v9-0011-meson-prereq-remove-LLVM_CONFIG-from-Makefile.glo.patch.gzapplication/x-patch-gzipDownload
v9-0012-meson-prereq-Refactor-PG_TEST_EXTRA-logic-in-auto.patch.gzapplication/x-patch-gzipDownload
v9-0013-meson-prereq-Refactor-dtrace-postprocessing-make-.patch.gzapplication/x-patch-gzipDownload
�I��bv9-0013-meson-prereq-Refactor-dtrace-postprocessing-make-.patch�VmO�H���#�DB������@@������w�z=v|�^wwM��?�f��6I��
	gvv��gg���9�������w���}>F�q��>�A<�kY�����'�?��~�>R�	��A����(^x_Z�)>[\�������:p����<����m����*����_7g����qA�FC�Z(*�6�[��0RAD9B)�)��uZ$��d��5c����p�����s^D��H�d+�"������������d�qE��y��8��]f�cS��u0�]B,��%1a�E������l��0�qh%�����*�f���B6��������Y+xZs���@0XY-�E�����.�����,N�l����=�������\F����W�`,J�'!�����p�&K��'���/��`�w�Q('�q/���,�{s0b`��Sp�q����<Q�6</'p����6<t�M�
�d������n������-6l��Y�'8TJ���M�xnB{�5O,����l-3������-�������q��9i\�7h6�X�0��u���Q��C���l�Q�����fo�!pi����F)
j���?�:��Y����M>�q�yv2�9�BI��4j���x��qwu{y���i,��p{v~9����F�%/�6�WI�SJm��e�=w���S� ���B,_,`��9g���:�HuM^���:�H{kH�_�{�|%w;��{���{�u��zv^<;��k
>�-;�T��^+v�T�j����,B�_��5���8�6�4�X���s[W�c�d��o=�&J����5>K3�*
yEtYy��YZ<��B��*�"B�1���	�*���i,�{�Z����/�u��D�|A/�Z�������z�#�U7��C;������Zk���B��b��@�^��$���>��\���@S��7��c�:pC�4*p���gp������3\)Y�����M���H��o$|��
���:Y���dw��u(�����;����q������A	F�
v9-0014-meson-prereq-regress-allow-to-specify-director-co.patch.gzapplication/x-patch-gzipDownload
v9-0015-wip-split-TESTDIR-into-two.patch.gzapplication/x-patch-gzipDownload
v9-0016-meson-Add-meson-based-buildsystem.patch.gzapplication/x-patch-gzipDownload
�I��bv9-0016-meson-Add-meson-based-buildsystem.patch���z���(���~
�q�M)#R����$s���2�%il'���@$a�
��8���������}@�F����
Q]}������~�&+g2	���;����h>�fG��t��'�l:����|�������97N���v����~����s�<[i�9��p��?y�����R��0����y�����C8���_����Np<��N�;�v�9��~����������������>;�0K�PS��������m�8�n�<\u����6_&������zW�_�?�'�����?Y��@��a��DY��So�;� �iX@:I�(�/�������u���J�k��w'�������&O��0��PV0�����o�,���o����r/N����?G�����9��|v|1�X����,L��C>������C������>�h�W�V�o`��I�|3k��R�����<Z��M�Yv(�h��q��$�U�J�e����Q�U��
�|@�d�`��������O����Ny�M��Mj��M&�c1�u��������hm���D��oV��!o���/�up��~�e��4�����%_���|K���:����/��/�7��[z�maT�oz��|=K�h�7��d��|u�����,OC3�V�KW�43����m��6����/�f�e9U���y�����������j�|m�fI�g��6�6zi��8Cm����b�1�Hkgx�[`�����:�'i-�8��A�|?G�a_GR���N���������A>} ����
b��Y�f� ���5������k�W�w2�&�<ZE��P�Il�]������T��x������/��CK�u+���q���ek}�i&�
�q�|y�G�:Z[V�y<7�9��A[��a���[
U�3��e9���}l�xj�K��m���u:���pOI�x��8
�0�Rk6o,R�d?��'�4�+��o�:��m�6�lsC;
���(��x�y�������]��h��rhc�G����7\.�����y������G��F�E>�_����������6&��X��b/]�nBN��������������c�w�oc�\=.Ye;��@��vmPs��O��R���Y����U2�:�'@����(���y�>�/�3Q<���y��|�_������|a�Ze4���������'�Wq������rZ��5;��@r]�����41�"hY����������_�{X��x�)��	v,_�<����B��u�����U��f�K���ce1���C�~(�|�<�1RIP'�������>�����r;�b����V�`��:�N8���*����/���Co�53D�/���5��
Z$K]<�H�O�g���>2*�vUsP����gQs}��-�x�|U�f�/O�8�c|�z7�W��Tj�/���������� _�]�l��)����X0�0��dqm<��|�:-����8���2�����Y�����c�!�N�������YU��}n7����|������?A�����M��
�����[��'����p��fF��*\7Q�
d>��R�]��p���UP����4��u"����|���/��pN��t}(�{�|
�#-�(��^�������6�&L��������n���|�#�
���f��F�|���w�/k���9!�.t�r���)���|B}D��fp:>����V���R�za����|�|�a���R;�J��
o6q���\<_)|�P@��j-��/���\I/}i<gq�T�XX�e�$�[�
Ky����pn��f�o40���m�&�<�Q���7�vJ���Y��I�fq��#3Z_W����md��+��a�~=L�|������[��R>��Pw����]�9����m��+/���I>i=,Q�V;d�z�:
-�	=_��L���54(�Yb�4��.���&g�R��~�,�����K��r{!�I��3yG�3����Z;Z�f���k�GK��(��=�f����������M�L*�|y/����;ZgM%��M�|Yv��A�.H�A��p�5G�z��?�W\W�*
D��6p����M�X^��?�
NFQ���P��MaZ���|	����n������,�E�E5_�w���sU�����|~z�����^�+�K��8�/�
n����[���N�/�u�{��Oga�.�'��|Mz�^�Mt��2��y�s��o����B�R���!���=i<�2$�$�P�P>(�_��\j������sh�W����m�h��D^��l���v�e��>���<�]��f:_�Y�V�S;��t�oh��r���|�V����P)V��h�s?�g�&�ab�W����s��o7af�by�1�KC������6_����A&::s.��t�6�^��/I=��Ge=��NV�zm���[�����r;�3P����KB�� �R�?#�&t6���/��S���v6���x���-V����a��I�N4���d�9��H���2w��h]6���@�0�z��P����m3�����UUU���.�t�I�����/*,T+���$ 3�/	�qXi'nl'��f�Q���r�K��r�������|G�|����%V��f�+3
C�,�co��,��j��D�$!���|]c�zE���o����|�v�S��'��4)y ��{o�n��l�(�.�6���B���xfVi���V����n��
bE���� ��N-��"_x��kd5��Q��O����(��8����v"+��YVndz>�1���|	���$�N=���������v�\�/
����Z� j�YLV+� �g��4�[�/[������b�o��7�m���J��,�u����v���������F_`ZG0�i��
��d>���~+�C������-��S������C}�"���x����m�2Dud��o��|DQ��������`����q2<�U��{�]�6��7��
x��5�v?K�G���|�����Y���$h)	��KrT6T��I�(����
#4�*���4�����1H�
�)�-B�H�}c&�M���o����M};�9_�Ce��
��G�*�5�vA�I���<L�5��|���������mu}��+����:�6��$���,��d����������N��-�����}X�p�C�`����p�?V7��<���;f}������e����YL�������y4kTk������k��:�T#���F\���Zd�7n�|;P�?n�lY�1�q�m�Oq�m�Os�m��YtW��9M��M���Msj.�;e���������Y�����v��U~���LN�����yL���2���(>����x�9T���;�j��9���;d�[.��v���{�.Y���N��Yw��\l�3�6y�w�j���L.���4�D��|jw+Hw��)�]���l�y���1y��g2��6�f��m�Uu�m���i�8��o�8����y�+^��w��z�6����6�����fTo�3���y���M�������a>���a>���a���1fg���j|n��r�L���v<���mf3��6��z�6����X���m�u�l��7y�
�V/��YvhP����9w���E�C���3:�6��ce;��*|gd29���m�
����a�.�zg��*L�����Z���0�n���aw�u��tw�]��V���i��*�9���o�*
��M��T��[��9�V�+Fs��;4�����aUN��3��2���~��l��.�
������?��e�vi�9���W�8���6(����:GC�����.����2S��i]^��iu.�����_Z���[�(G��mw(�FW�H+�u��jt��h}�Y�2��M�2��I�:��;�2���}W��p���;����~����m�9}6��[����T������=M�L���,���,��5y,�������u�l~�u�~�uY*\6k��^�uYT��:|��f].��fM.�I�&��;�&��1�:��)�2���Y��LH�x_V�����FO��~s6d����e��l�������:����2����2��A���fw�l���<�s��O�6?��y������<����s�;�T����
��.w-F�����;g�����c�V@S�CC��&���m�����Cf=���imx��eu>�����rY���mY�C����n�hq�l���L�,k�?e������79X6�ow�l��&O�f9�|-�`��lX@�/f����1w(����C	f�
�{l�P��ss��G4���!����\:w�mp��!����K��V�
=w��;|6�l��l����Y����Y�C������|� [�<m�*�����(�.:PZ���+��zd�;���h4��_H{���c
����$C��X�X��X�D��p�-���k���7��|����(w�C*�����a|���c�8��1����u:�������`���: �]��q�����������t���|����o34X3^k�y�|�������3�;������������D�,S���DXVy��>*B��2L�<�a0" ����I*���*�oe������l�o����^l�E(��EH��a��Z0Y����&�<R���H=/-	�Z/�x�f+� �� bRaJ@�3�g�y�2�
�z+�!�P�NW&��6�$t�j%��M�Vr���&u������Y3
TL�j��8~K�	3v<��9���������
�JZ
0�4��A!��@�FF�E������P�����p� �ARL�$q����T8`�	PK�L���������T#���+y��YOv�Obz�����@cp�Pk+����k=J�9\^�:C���_��=H�ng�����E�T�� ���e���<����2"/2���@����o`k
�06F��#�]�*��IR��������c����J`�� �(�$��{JH�.2�`f0aja*��\09wZ�\��;� �8h����p���H.�M�\(@-~���L����O�]8�d��$�_��(����(�VAV/��� JIK��C�r�5Zu�d
 �����t�EF�Q�#�@��N�*�kA��?u??n������c>b�}J��iX���;I����1l&���^�T�&�qI
���Y����@*�6�8J����&Km<�=!��J���==����h	�NI>$������3�c'O��X�a����9�Y��tX[��!�O����B�ph�3�V��F��������?��8q����x*J��2�m�X��S;Wr�[y?��G�.�f��=�:>O���x����)���w>^<%T�0����i�!A��6�O�t��D�����:�������C�,����!����vM�*Z��^8����\,#L%���J7���@�o}��x3���@B���Y��u�/�e��z��<y������Nr���y�n����L'�H>���P
��r8�(��xvv���e�F���bha`���4V���J��3�:�<�+/��a�178�l�l��c�]�?�8�U��l��Ur��q������?���6�i�Zt`�gN�Y�.gL����`0��gL��rL��1�0�"��=��ZS��%::�Z �8�(��c�dx;����$�jkIR���+������SH�P��[&�	$��~}�����[�b�Mn����t���j�03&��Yz��V	���
�`��/�6������O��R`���Rt.~��u����=;;���\]����_���RLf�-����7_�R]Mw���QA��r�C��O��?�,�J:�E�9}niX������F�z����7����������6�I����]�}c��.�U\[��g6��
���+/u}V�iu~N����w�U�����}����8��a���y�-2��=vhG���Be�e���b7��B�=�p���|�����'4=�h�o�y,���Z262
dy���%pH(/
�U�X�8������6��v5K������I�����@�*N�X�(�0�V��`��u������!�9�b�uP������\���o��mQ;�!?+�a��������d�A!bf8���t������|rd=@���Z�`E)��ThI�e��a�]c�Tro��!�s�t�{���Q�����8�X�7v����(��z���[h*�P��t��D�����j���nu���6z�����"r��������_p��s0�A��]��&*���Rv�/`�&+��B�8�LM�%(�9I���I�Y\���R954��S+�f�"�����lr-��$�*�$���E�X>A�v�{-(��_Xp���*�$��l�����^^��l���R�|!�x*�&|r����U���?���"�O�}f_?G\��Z��T����$��]����H;^|���y���$�@��Pqr�����>�N���+<��)4�
��IU��Q��B������?s��3*W$�x���n����3p�
�w*;"h"=��M"�`�����k/qOa�e�	��liL��j�:�-����bi����8�6M�5l��RE��@&5B�sHx�D����m������B8������{g������&�\������2�����Y��y_U�)-��E����3}��z�]��U�-���M"����fT0���-�{�b���e��� �q}C�n��}V��X����z����tX�m�FT8����)!�������������:LVbwn[��%��'RJ�G�"�����Jh������	D�g���[���\�-��Y'9��kT��V6M:c��BN������O��"]�:j�s�����9�7�������|o������8e|�%�G �<�n|�+���6��������Q',T>�]q���Y��&;><�.,Ah���1�DFY�
��^w0�|�
�s�&��%���v|�	��w���m�=���h9�u���x���	��
��D�n:-G�Y>����F��Tc%�R��4��S����i�`�s����zE��&���B�������T��3������������25�)�t��,���"�����]G��)z�v��@���t�/�'�e��,�9����$���D�AB���������wr�J2K:K�u>�vO�]�����>��g�]PQS���3���`��'�I�����T��iP5
�%��[�xk�!�������%����N��msTCd8e���*'�%��0��D?rLW;�P 3;��k����,D9����;3�p����	��{��(l�����Q
)�'���Md��$�Mo����uG������}[,��%D 0�N~��vV	��@qp���B&�F���MD�J�o�������P��w
����K�����f#Z�H�Z�%2�K$LS��$�S�_��d0S]�����h�i�0��T���R��9����}�a�����G8�d����� �2��FO�{��3�|�f�9��
��@aPi�p����i����Z���S;�/�~(}(��������&���0;R����"��J�@������l. �D��F���=�	�Jw�q������z�]�������E�5����>��{36����t�����7����z0/Q�%�_��'�7���|[j�O��wT�����U�MM�j,|q<�FYLZ��*h�|��H6�]�Ml�}��~i|���q������xQ�<��'�b���S�
gO�&T��e�xX|���o��'�
z�QN	+"�R�r��}.��
����m��W2D.#:����M�#�U��o1nM�����r[��K����A�.`�`���8��!.�����W�y�I��{.�w�mR8���k)�W�AW|f^�K|	�So�VH
��Or!�A��%w���V���p�E�K"t� ��/f6�)��b�'���,������Bp�E�CB!agpF]V�'z��0a�~�I����V�6��@���^O������C�W����e�F�hQ).Z�J�MV�[�H4��{������<�-R�`Jl5�j>]�T9c/l6/��PI��n�\���nQ=�F��������=u��CM�"�����)�7�0{�8��L��8��������X^FP�v�z+�����]�/������
�O����EPWh�KZZF�r��tM�DG(�1v�X'��^�%�@ADK�KWkxKH����e�I��/���}��������
7j�B���|�������&Lf8"�[�m���+���R�7/m�s{�{��=���U��yN���H{���9Z�Pu�:����DY��Q\�Z�v�CJ	������
���b��Aw��m�X �b��d�*�?"��Tne/�!���H�t8�9s&��N�������,���a
P�#������W>f:��X���e2�:2�W0��~�q@�]�]����/�b�y�����Wg��]��{��3��QgT�9��;���E�:��aC��Z��r���o;l�������c�l��m|h�h&�m���[,���#]��|�!{mV;u�]����fK�M7��:|i���U��*`@^�Q��yK1:�����o���UimS�R�_nk1�����H�����8�LT?(!d��a9�hM����!!�S���\�����d0Y��
$�Q	�S����I�z��@�Y���~��/<<�)���NHn(MF�L ��|\��
����,g�Bz�@�dE0O�M%��AA�^�����I�:pdaK(1��Iy�a!fKz�a9�wK-��"���(�;��=��!;���t�iFg3n�^��c��F�R�KtS�CJ.�����I�0W�h����l��Y�3Q�L�o���	�er��l��@�6�RJM36����M����]��>^8���60y��6���W�t��nla���������@l7���f�3������$�i���I�h[�XhcS�C`���E���G{�.�EK���<!#�!�=�@���>��;���]�Y�����8��{���
1����B��}+�+Eur�SC��0���=&�Y86�D ������c:�*4'J,���11I�4i1�S�������/r�����n��C(
_�M������	y�U�%b|��h�	X��rD�)�-P�?���8&���S|�W0\<�'��?��L�oP�v_�P��J�jZ�%����&��.tcSo�=����W�03U#(��Sv3rz
�,�2R14t>�2� Cx>��/�K��2�^��P+�pE��x`'���w�/��<q�?9;?}���{�N��%��\i�<vp'� ,}�{ner}}�a��$]~ ����t���C�!�<���5�,QSC��
�u�'�48_��4�*���������gl?DA���� \��;\tq�+�>���q� �$�=AY=�a|0Q�v�)I ��vZ����<p��o-�\���#�T@q��P������5�_�<�T+M.��1k��4ab7�<��BX������(��Dm�y���[�O��GF������8~��/k!]����������Y���mxc_;]wbh2.P?t�q��^�������B7�]��B\��;�n6b�R1h�
v8S)���!���!k6p�,�f����e}�%�����O^	����W�n�,{�><z�M�E�Yk
��[��	]�I��@^��&��c�`Zi,m�(���F���F�d|@��B��D58�D�+m&V�pQ�����Ge�A�7�lE% *�EpL�,sI�T*��
(#� �Ah)�bK��
7����b�h�8�*�V�W��2��Z�Z�h��~��S����T���vh[�Q��&X;��o����D}c�����`��M��������r�k��6�A3���D�������5�d\��<)/����k���xS�/�D��K&1��9��MA��Z���~o@�����>H��J�����_�/�d��%���u������<^ J���'�&1��'�!"Gw��h=����\��.�C�[��b��U���3�B���������<�
'@�m��:<�i�H@�O��7���&���Eka�������~����B
 p���)O�^���4
�MBc�N��.��%g��9���X`t����� �Q/��O^N�l4��i"$��L�qeh��5�����0LC�-$ uz�a�\���V�����n�q�OXn�L�l����+H�{���������������H�S��~8;�8����}/W!�[�������[�:������:7����xH%#��H�A�w�,����O����a�}q�b��������;�������'���N^�� ���_&I6-�P�l�Kf:^�r�
}$ ��(�����'�����4�e$�
��&��H>��m���U��������������|�q���\����2�3J��o��#�������6?�j��Jt�D{��,���ZU�D�'����������Y�FK�%t&`�����T~����F�Ud�-Z.,X��	c�/�2?d�����p��j�A���?q��qIc�cc��c�}^^k���S�:����?��������0
/"2B�X��sx�_���H{f	
;����Hl���|�/�����r���po��r�;K)�����v2�t�� %�r��
������ZfrNN�����+�w��>s���|I�/�����Y�Vley2���{H��g9
�!��GZI����'��!1I W������Aq�N�N0���0�7�!�������R����*E��	$[8��ST�C���=���qW�0,��s��>��=ph ��?Oh~�Q���z��LM`���AHp�z:�8�x��S%����J"��B��L����v��:O{O�����1�g2�4�#��������T)���(�HT����8	t�.=h&�����PHr�?;;;=9sxvz��S$�����o�	��yi���V�t ��<�-��s�v����f�����eX�,����b�j�l&�q����0n����,&$)�.�����j�`������3v`���:�SZ��d�Um���d�}a��Q�1H�e!]L+lxVf�`V����S��E������x7����
L���J@�?*yd��R��2��#��X�?��"T~'�����mvHcje��CO�`�����h���HDX������=}����>�7����7'������}�������>�=� ��������������-3�L���>;��������+AE,J����}�)����������^���|�g{�=����B��A�?>�����'�O�A��7�_��ytN\s^���P>���1����;|�}���������9�8'�)4���1A�������x�<�zo}�V����Gh����~�����//��0N6D�����#�l����
,��S�����O)*�/���Z�����&I�9T�b�,>V�{Y�C�����y��$������`o����~A�J���vN*�"n��E�`���H�\��;M�W�eH�t���PG���#�TD��`g� 1C�l�_X��:��|�H}���l�&���w���<���M�����6��������)�p�wz�������N�i�8�b��Y� f����9����p�u�u���'��x1��Q�������^��cSn�Z�8���B����V��^j\l��|s�Z/Cy�ba�8�~�[��H
��7�O_���/�?�?���?O��2�+WF:�����zS0���?��hq� �F�k�q��p� ��X���,+��i����MF��Z��d���2��Qe�\
V�1
����?�Yw����;����xo��JwY���o� �K�����+��sW .Fr���h�!��
6�`$�"���/%�M��uSg�i��kn�9:���7����W��<i0�^�K#��������<���q��F�5��� r���X�~��=<�&Rd�T�R:�z����K�'��v�#Ny/��uM��4�1�*�I�Q�\�s[MIc�dQ/���G�`<�h��(��$�����&���p&9e#`_���Gq��0|&�V�E�B��P�V+N@`�FR[��qE�D�������o�+�p�������)��h��@3����.��.�-�F�/
j�S�C
�b�o��	�L�X/@�!��HD��,�f
A��e�.�������b5��~�����?h�l��v��Eg~�!lpB.nD����\�c	 �^Pc�(�H��y�LP(?io4�y��^�{G����o<Aj]����	������G� ��0�U�E4������qTF����u�(��J�$]K��kYlYS!�O������s��7��p<j:Aze����B+1t�����,���������0M'G���7��^�a����J�R@wQ]�,"�3��o\��7���M:#��!B��"EIL�5�Q+"&� �P���x��V&�,e���������[�(���p��v�����]�v(�]�����<A.��+D�I>�!�\��cA�l6	m�l�M��K���0��ov��Q���I}���y�S�fKqS	F���No�p��8��6�<�2�����.���c���H�X�Q�g0 �"����0�l\�W���/�L���Ln�������
�pN\)e�}�Wg�/�7����+'O!�n%X>����{��7��J�����MX-ASfWO�:���$��pT�R{}m�2"�Da3X����H�����l=#�t���<��U�@9n����_"R�,jh�'q<����`<��M'Q�lGa�������}��������������|a8�w��=�}�*��5����:�������E����Qq���������{��,��n�!3T'���$��[�������;�|�%*e�����K�8�s*2�r�t[~lg����D�P����U~_'�%���W���K3A���'5?���#�Da������_
�L���\�B�G���\��!Y"����8���2�V�D�y\�6K-ez�^��c_�[Qk���\K�u��A?�4P��k�M�S>����#�n�6='#$�i�^�bJ'n����z��y���cJ�VK�Y{8H��D{4���;���p��O���vR\���7��]�N+����vb1`4?����h��z��T�x�9l���cY��Y������d5������(�$���xsH2�9�s��U`��b�Sh%d�zX�Q�B`���>A������c��g����d��&Z�
�����`��I����<����t�D�h%~Gk`�Q.�(F��C!��1`���������b�M�T)Ai��D=�:��kl"�hjG�J����p�IyN"O5�����|�N���=��h�u�_�{t����z��(� �r��L�A����Zk�����u��Z���J��`�
������e�H'��G�"�W� y_^Po��k/����R�V��6����lqIe`���a��KM����>0^��<���������e3>����2[����%�i���^a`�<����
�	f����=")��)Xb� �k,`� ���tCX�������;��������.�H����d$RF�xeF��	�t���}Ed X�y^#%������:-L)g�%0�� |K'}���
���x�-�����WF+x�	�������������^��H<�71�B��"���[byA�%���&���o#��M���"�T9�_���x+������"*�������|vU������E
.�F���Q�0�;Y��Kn%���y�X��i�F���w����'���$2�����|���"�K�W��i��xg���^.�FK��0�NL5E�w�M7�{��t
[���K�$
F#0k
3��|�M��>K�3	�v `�WI�k�����	%p�'o`3�B8���
2}��<Ny���Q=���a�,�
�k��i:�I�s���*<1���r��8��`G]�0�?R}��0 ]�)Q@D\S�����|	��o�|�b�@|���C�^�MI�1�N(_�!'s��q���D����������� �M����������������d���8���Y�P������]Z/�+�}O���XeI�/B ���3wu;]�S���'���sB*!����FK��T9iH�&Z#�P����1�
0���]��*b���_t�"�.L�#r�^�R7�r�+8�B>�k���4�����~��iYI����]B�����hS��9�[�F����91��dN����S����02W���m�[MoL���Y1�|\0��R����42D�C�Q�������3�X *t����>l�7��;Z��L���rt:�\.���{��KL*q�V3��]��`�
ga�%�Z����.�JN	�W�G%�����#����:vv@+�[I�8��F0t��+����** �L6w�����BTmF�u0{N7���5H���+B�4��������������]w������W���"R^�Y������m�z �S�jA����y��p�A$�V�>�U$J���`�8���������_�,��j���C����*�rYBh���a�ex���8�'�����v9��r�?,��t�����J���u;�	Q@��j�4�+���AMnn=����h������V"�M�F�T[���*��_�Wt������&�!�����M��=���<���c"^��{*@�3@9�pwGx�F^� M��"d�'�[�����-��h�Y�ZJ���FJ�5E���:,��"EH�=����/")A�AM��d�I+8�K�����,��������|��*]�s���F�'L������������P���h��'��3m������s������%���!�}4f<\�%P���DF�19{�����c��s���������J�~8}7���={s�����E�&K����6�R�_�\x���V�~�����2\���H<���"�	zhMs�0�A!���X
��al%�^�C�S|oMB������
����������Do*3��W=�u ��6��o
D"qU�r�<�^�c�+���p��G�I�G���u��o���,*���/��9�������RY�u�^��K�<4S�%q�h�[V�
-N����x��P��$�0�gM�Y"<[��pZ+�l['N�e���G"/	=�!=u�"�8�	/e��������55�H;��L�6�k���|9�,h)���0hN�����.;I�\`�qN2E'���Wa@G��=G4:�
�ba�15!`�;<,TN���\|�{�\��X��0��,������`���e<@��k�]x�Z�#R��NU|U8F#i������m
#&s1L����5Y����q�E�����m�G�'S��L�yy�e��PKB�C���s�P�����\J�x�Z��.�.�3���R;����x'a�,}�f<�����g��?�8qm\p�!q�E���)�5����E����������'���M����H�R�������/>�.�6)������v
�MB��tC�2`^/�O�}��
��k�����6cq�
��x9)2
I`:Q��_���@��P"�s0� �:�	��^���,y���?KK����J�L��M��S��q�&e�np��V�/�����I [p�����"-F�j����P��8�����ck��
�;�w{�c
�Wl�L�	������`�i�����+Y���C��/Ba2;R��so�q���1�]� >l	+��C#��dm�6�--D����L.�����|�\�W(o�<��9$�F�xB,Z���h�h��Mk8���~��eB#��&�c������T�����"�w�t`/H�Z�2����9� A��"-����)q{��X����~���y&����1�)�
�Z-~������d��	�?�60�
9��B$`��~�^H��s�(#s	��K"��V0at�]t�7[�2���n���t��KZ��9R�����z+ct��K1������Y�
~>��MAa�KN��!�M[bM��eB��}���cS�L���h�������-��,.\�3�Da�e\B�}6����Tw0�����N�/�Yc�w���~g��������R?7�����zx�i�����IQ�z�g
���e\�2N�'�ld�o���D��������������..�N��8i�8�b���e��e$��k�V{^��?YFA <� 6s���p�^	gm����g&~`'�C�-p�����K�i��g.,cddWYG��Hm\�� ;�l�Z-�I�Ov@Y%2y�rP��r�B;�#S�l��UNU�X��f98�jw,�SZ�=�b��Dw9z1��P��7E�t.O	U|��f	���sG2s|������[vJ�M������i�b%hnwD� ����-�]��������Y�{gQ}�N�gx��*'W$�b���Lai���V�����c��������:O���.e��h�|��Y���gN���\�v�%�>pQ�#�C'i-�p���^c<n*��Q���3� 
E+bF$�(%��w>?�D,�#m+
o-
+�N|{rL51��"%����]�T6����`G�/��+:b�@�[ii9@^W���0h�-um��U�&)
`�����RV����Ll\H32��lQ5�z|\���
xH#l:�/��TY��{��{���dv�s-��F~UX�0)�<6Q��Y�T�&�
��TY�d����4=�'�2�M�UB_���LIX���&�U��MA�8����C��^<}�������;3��?&����g��(�L�(����(����=4���c����N�������x�0|<i����/���lG�}�.|*]��~�Q�F.����(���2�����SKo��2���`>����$z-����e���8�H���/pT@��D4���F�
F����e�������kK���a�W����7��1�!�����������bz���]��C�����Q���
p%�!
����T\	���}($��� d������T@_lVJ��$Q��(����g�
m��8�Kp#�hBw�V8���`����0���M(�KA_��\��F�q�dLU|���T6Kn4B*b�a@��y�.��U�k�9�����.&��'v�L�U�]������
LtW�i(��	��������f����(�;�l���L���*�g��dV��%��03��Q����� ��	^	�-�2��I��p.�����<��j6
b�y��So4��G��a�	��d;!���`�7����(CH�\"x�4S�M��TEl����z��x<�����D�nO�88����s�&~���2$���T���CI�a$>rh]&q �?����*�O~3,�
9:O#�]���}����Ps������7��p�m���Z�*R��I���p���
L�����I�A5H�NU��VJAR|[
�:+������gHa2P�	�J�)0-�9���
#)P�4U��&��/>u�9�
��0�DQ����3�4w��y�H2��(LQ��Nr,��Q��{:h���[T��Jl��U�^Z��L�K�����^F���I�EN��0��OUW�����
������\b}��E�S�b�����,����n�N���O��<���o�/�p�a�������</�j�xE�����1G�,9�����
}�X
��Z�%��QM����tY-OWg���������2�m����6�ot-�V��� M�d��}n5#6�5g��p0����_V�Z������*���:R�J����U��`s7�E��,�M��M7V�u��z�5�Oa(��~��"O���f`�����DmF���+��c�a���� d�
���!����;�( s����/�}�&&s���H��7#�~�$�����t_�������V9����G~���Ao��3�U"z4{J$YE\{U�����F�G��}�~x~��{~������������c�2�
�����p��4�������K��mv��df��hr��K��{v��������5l�rE�J6j�N��������s��������������O��G�y�?��b�JX:�&�pw5�LYx�&ZI�
6
oO������y��U�����y���U1��e�r�MH�u/��7�^Z>�T%�M�d�y�����7����X\���p������}����
 ���ZAI�1��6��YI	�0�]5�'�E�����8�b!]{�������U����xR��$���`�G:�k�u>�t���A�����C�d.�{��F7����0rc�g���^:��f���,��������;FC��
cxK�c�h4���j���c1��~��^��.����r��fM|����
2�����u�q ����"�IG%�4��\g>n<�A��dW�G-W��AjU,�7�Iz��*�P��V��d6/C��R)��PZs��P��[����6$��)�������h0��^V�J]�"u4�����?���Z����P�����	�)�����L����'�����e�r{X{�
/�H��&ns��E9f�f�N��p����x���%!3����h.���9�f��|�kd����$|�$w�i���	Q���uS�@?��:f��k�
�8���J�t`�EqC��2L�|������[���g�P�E��E��u<D�(`�%*��I5��/D_&�)_y����T3bA���R��`yJt���M�6�h�O���FR��D�u���b�N���%M)�
�H���"B�J�$����
�t�A�%Lw1����c�nQk*��y/���+���u1��y���B�+#�-U;��^5�������j��S����U������t/���0�6�L��cg�� �����>Nm���G3Kz<U`Ud���)3��+�	sR/�jr�q�r>4��1��������zv���"^����;��D~�����Y�J���I���~�'1���\��=��J����WL�	����x�&��WoNi�H��	g��\�k�	��\���Vp����z2
Ee�������Ab����w'����o�����$��`(S��a��0�bH�
��<K���i��k�0a�j�y��Y�Y�;m��F�a��$�
�I8��)�v�
�F��mAv�P��r�^`��]��i���
���?��gn��*����+w��7���!���*)Z���Hu�b��5�T��(N�
�Xu��aU�+�T��R��58KXrF~)���k�zb��e85k�bK_n�	�"����u�~�S��u_"�,y�X��Z��g�Y���jx���Ud��E�mzY_�m���Cx�{�}�P�`�J���|t�px��b8�AH���ZFK�tiZJf'�A�;����SC��KS���-*���3�� �>���F36RP�]�������THQO�4�N���Y	��FF���N�]���?��(c����8C��3�s#+<���%���Bx��u�Y���9,^� �.�b�n��NN�1�����H{U"���Yw4�����������v|�S�(��
`-�o�����U�����`��T+]9x6���.co���p���d�nG�q(�E��R�
�� ���x�(���:@j<�X}��T��A��Qwx���ke����8�Wy��lna���V*�I�P���&��%R�1�Y!o5Xn��������G�G�X����E!�Hf+�uw�Z6�hS���k�w��3�t{�z���.����O��KA�����.�*�k����W
b�Y)F>h�x�D�Z�\!�5~������������)W7�Z����^ ,�:�nD�]C��%�����^o��f�Y�0�������-t^M��~�1Q��_�&��|2�Lw�2Q+��O�	c�+���h��	�r����r-}�7�����J�t%�l.VhvA�"/i�K��%���MH'Pjwm"��b�X�wo������L,�e�JlI:Xy�d�;���f=U������q
���z=�]A<��iR�o<���|o�������@���>;S�������wm�l�U��������t�o>�Ze��V��K
�+RF9F��&�
��1I�� ��p����A}�}ke��\�A��
�d,��������.o�Nf��7�w�V��X��F�C�!�+��&7���N1�H���Z%;a�U�{����o�e��(_D�*�����9�����T�����!�7��Y8��oM���wK,����
�(����#U��*��u��]�@n�m�m9�i���X*;O�<����YaJ[B�������
��v���t+=z]x-J�n���Q���'�YU��k��GW@��eGl~��
f�������nWA������X�����,�|r��T�k�nt`i8]h�����*\w<��M,�1�|b��8�j0�;�$�Z<�R��',�k��*��'����h�i��0��;��ox��$��&,�/����W<9�����V��
6p���Y2@��@�(����T]��(E�������|�+��������$Y1�Ig�C����dT���|�9c&	o���DX�4����Oa���4��$��"L�d�I����f!jw�3O���!��(H�u.��K��V1��������9��c&���8��Q���J�$�A���\��c:Jn�W��U1~�|�w����X K!�V�8�������*\�*<4�a�V���+�$�E�y��^�T0��oy�%QI� m�1��XmZ%v�a�� X.do��Q��-Ty!�����f�z�>#��+�e�6H�q�e��0���K�Q5b�����	���)����������k���8��E��yBvF"o��Ba�E���r"���������K�������5������R��"b��+`0Ej�n������ps����g�w��w��~);���X�������z��q���Z�J�\�f��R�!���8$Hm����m�}(��|7��"+�<[������O����`&��P�f�]��Q��@<�5��
�����F}��IC�k�8X9l�9)G��@x����8���t�	B\�8hlF:��x������/�����������&���3�a5w�����?�7�9����5��[B�fW�����������y�����C���h6��A���R��j�@���>��7l�7"�������1<��>�+nAh?��R;�*������������jU��i��;���A��S��ZP�������ip����>���c'3/�����_�vp/��UM��C7����l<��$iV�x�M�+9h��@��*�m�q�������
x�
Q�n�~�;t�����*�PH�]-�.��O9���b���P��3_�Z�%�P��s��>�#��p=�P��i��Y5��[�	
����K��uP�X�&�R�J_e�m>�H=�!���!'9+�jC�b��P���h�v�|[2���3��9T�-�/S=�ez�|[2��z���P�6d^�z���+�f�C`�����]���[�|x��������������,��\������ ���%�N��� �"�Ke}�P�0�����<8?X��>������A��q#����%3�����/Xm����`�A
6�{���p8&��>����}\qw.���|"A1���*U����~����%yX�9HxrTA��c��R��f����j��n�2��7���Y����DN-���Q/��Zp���3h��T���_2��?^ �� �H�,I1B�\�P	T�^��/Z�o��F�z-FeI*����.�T?�
R���|2���QPoE`�JZ�M��m�^�1FkY�#!T����$&��p����l2�j��X��U�&�U(������+�J2����
�N�v�[Q����l������|�m�^V���d<�7|��%pn������������n����d9��R��O��������dv%������PQ�%XR��kr
�z�[��Z���+���:��W�f��$8
�{"�}�Xx%����Yr4"dI^�$�F������E����������������Z�F#����'b����~�������!$���:v�D%�"5f�ao�ho�5�hU����Od��G�R��Q�$�P��*���R��� K���7k����v�M���v����{�)��hN��h�����$���kY���,����>^������d�{���-,N4��"������2c�x��R;�*R�%<��'G����H�U����J|��#�U����&�������7��A��v�9cz�m�f���F�����sb��[���"�f��t�!w	_���0ve�2)cy�,\�����X�
1�t%/Hz�s��V�vs��AN�`��P$}����~��4����bN
h���6k� 9�i�|���h����g��j�_�:{������V������>0���������ao��(�*��h����d^Mp�
�s��5,f�!�������
~�T"���B�zG���V���Y ?wH���8�z��P�	��]�JI���(��F�)��|rSoe��Jo��|���J��N���<9A^I Ms����G��ph�����FI�yD���_�:��_i([�;W�{����d�(A)������b5(����(������t����?.�Da^*����d��)2g�b��0X���V�����H3��AJ�(���i��?Z�R���4��a�d;qZ�a�(�u���_C��9�v{.[��O%�����:�Es�Ts�C{D\�7�/������{�`�&��B���R����e������I��D���%��h��H"c\��nq|G�`�M��|ZqoY��2_mQOH�1roE��U(��!��X��U�[����Hr=����
�ZP@��t~���i�l]�bt���PK����j����������CS�V�06�"V����G�4���F��Sf�33Bs5r�t���q�B�h�F��1��mByz)"�0��)�`�Z�o�}���6�km>�]V`��K��k�h���z���N=a�������Fn�!/����B-��n^!Y70+Ns'�n?f�q�&f���!�"��<��mc;�@�W+^s��(L�j����t�3
���}���'=�8�V1�/���<(c�u]����X�)�\�U������;��_-�V�`K���T�K��(�J2�}z�8;�Z;
�����_q�\Y�6�.y<=�H���=�0���S&��W#Jx��9�+��=��Xz��=� �$SD�M��-�e��8iH����qZx��
������CfP�a~f����m��z%�H|o�^,k���|V(���A��H1����&�]�@�V��&E�J��D����b���p����9v����2��y�����������Y��S������3@�emN�w�7#n���p�R�#Bin�nK-���/�2��!`��j�����J�}� P��0����D p�*i����q��xpL�Q�c]e�R@��%��U#%�f�dDi���h2�}�?�V�WU�+�^X��J9��"�}����(���_F=������rF�8�
�y "o2�����=iZ��_�E��:|�+���D�Z1�Zzs���x<�����
��g{uiS
����]�,V���^�eO�I�i�\�&�������G���v76W�`%�|����zf�����)kV�����v[��Z�r�LH�W�x�A2��aW]U�%]��H�Z�~��-���Y�E���2/��f�[�v����f���p\����F��g��K�������1�����no:�4�4W�GTp�7�-�{�^+*��J��w��
��|�kp�_%yh�_��w��^�n�pR+W����"��������&���*��a��]W7����AM��!go����YX;	Z�{�������Frt���l�d6d=|����'Q�:CB03y�MC�,��K�j
[i'h�%{A>��
�����;Pm�v���,��@mX���MaS�Y�	����������#����0���B7�md_�w%��c��(�m3M�D��)R���y)�(L��b'��0;XT�=�m�E������]*����:�����Tv�0����cJ��O��BRIZ�2F�dL,bH��)�F����^�p�e������`�
=��o������0�����m8��a�hn8L&��d2WD���GTqLM'�����=S"�1,�W�p����a~���M������Z���� ��|��W�R]U�z�9��=��c����BM�A����� <�7�2��{/x���A8FOe1�#&KA� "Po$Z^	DW&H���CE{�X c�����������a�z��[ba)}PV2/�����>�p��h.�P�$4G�b!Fl���*I&AVo��1i{�K8)p�\��h�����b�5��K�G
���u9NY��]�����k�.��]E�~��&���CP��C9����_�]UQ����������>f��r��7�N���_�^j���2I��)U�%�+_%1�6�_�[9�u�����0'U������-Og�#/j�����e[���l�-��������t5���a0����Uet��uDt�S3�>������[�������v9�����G��7<j����5\�4����\J�Sb@hn2�|0��F���j�81]���WN��D�c�k���o��\z�Fr������J��{'�L�/���_:fPucq�Bf$��-9mHoj�#�Ggh�W���q����/?]Im��Y��%���2@V�K;M��7i��D��v;p���]����b��w,�/�*�i�i~zOf�l�
���ug��2~����0_���#o�j����^�G�B��.=���m��B���:����*y%?x1Ag=R@�L��_�c�7z��e��/��,
.���F�o��X�1#�.('������M���Nw�n��OI�����W���~���Y�I���A[�@�!�qo�
��qP+�TUW� ��_�i��%��Y�����.2��!�?��M��q�JD����,G/��"
B�L!g�j����EL�!���:Lv�W�{G+�PZ�sj�3i��&�y7���GKM����=q(N�U������v0����t��
���Y��{;���K�YG_Km~����A08:��q&����`�l�H�<���/
b2}���X�yk�^��A��q�uV�%@�<��]�?&a�So��R��"�	X.����K�bR`F^���er?�������^���Inj��:����)t=����1g<�3C��!o��4%��c�����b�en���b	�g�FH)l��#��7Nl��ME�~�J��8E���
��8�����}S�z��!����]�������#VeFTm��H��aaF$���i�;�ISo4���A���^������b���%2�
� Y�{��-)�����'<����6�U��R����<�[Fl�<���n�k��L�d�,��d��X6���d��X5�`k@�B*��"��x�T2R�q������l��1P��0�obC�2�r�%�h��	}�G�R��KY����7W{1X�<;.�>[F~�����p7i8�nZE����16�m)I��4�G��0�����O���^(�����r�O6�W��&����(�.��!�a���a|�DPQo��Db\n2���E�8~F�������@5�dhQ)+����`�'�k�L$��=�w��9���IN��M��Z����pq�.����!I�B��E3)���
#R�������M���+�������'����O��'t�-V�a���y�����X/�j��2�:n'�0�MdS����V�g�P����'l�2��H�_���W��v���@%2a�*����v[�N��;2���o�|L����`�i������w
mV���.>:���I����e�{��&c����c�������*1�Q�'�,��^;�>`a�-3aHmn�6������|P�`�C�P��iS�J?7G�(�z������
z��'+��E�6�"<~�&�����iB����(��<�]�iH���:�2d
���Y| �4��of�:Mg$B��ey���a��������x(+�6�}�{�v&��t?��\��	�yi�Lt����JihiC�F^�SSG]�R��rDS��&$�-u�uj�{e��/��]N�zZ�H3�������5w��:�h��Xw3Bs�����^w2�V��,����Y���x������=!	w0LEJs��Q<��yw`�$��H4�R�������j�!kN�l�qx���u�^�\{���JX�D�g���V��|������w�����zi��}�Q�^�W������m����({9K�vaa;����o����[Y������A������sN�������,Z�O{�N��^E�u�Kx��m�s���u�iPy���E�A���ns�x���,�2wU�E�����?�9�J��Y�m���-�,�����������=|��x���b��u��3YP�Z|�x_U<}���O�Oi�J������<I��������e��/p.'4���K�oIq@�B�>e5S`v���x���8��a	�/W�[��6��*��i������h��RMC[O*(m�!5
�4�j�v���y�k�A<�����egy��:�6�y-�`*����]�6��g��H�L!�B��r����<��Z�)���N�q����1�/�HQ��Y�wI�����V����=;9�MZ�����F .L.����Et��%b����klhu��0wo8�>��nT������P�7���;��]y�#�PQ7���V\�nCB�M�@�����J���M���
4%�6+�M��
j��a�\��n���}��?l0���<�@�ilZ=T�����k�}�Q>4��,������p�C��@�-�~�JL����x���V2�i0����r�"���/���$%���e~�E���.m=#u��Mc;�U�����=A�����I�Z�dFYoi�����<�\��
E��G��Nh��bvAn�#��?�]e{/�C�Xm��h����c��>p" �:�6������z�����[���R�����l�����j��tzQI5"��������f��R���P;�O�~/&v������Hs#�,����A�'������]G��������(��f�EE[���������R�Z6&��C�L���p<{V:�X�F�s��x�`o+J@8
I�/���|	����5��5����i�qg��?������\���i����AL6�������k��$i��
�l�@K�k�2��%y�0+�0�����c��/�{�(����t��!_�?�v�<��{xr�$O����9�9p�|�N��i�$�N�p���SThD�i��ZB�CO�{���!��`�-�Y��W�V@��7���2���v}�ud�
*�]��%	u�p����H�yY/��6�6
� T�qs��<?M�I���h������m����)���$�.7�v�"$���]�z*�:f*�bf!*K�V�k�51A=�p�X8���87%���:7�~�d���`�G���u^������i3�V*��V5Y���w�E12dT7`��Qg�`�M@��1.��I� B�~
�=ZG���������hj��ylgf�z��o>~*�:r��q�9I8�i1-�v�)?2Z:%`���������p�h[���vR+�8�c\�5����s��@,���
N�,[l�_���d�����n�!qK���.�n�:�Na�a<V��W�F	��������U"�XW�R��	PJ�O���/j�{Pc�"P�����W�px�c��0�N�X������.���P(Y:�
��h�C��n
����4�nu�_�j�[�^L�����6K	�x��%7qr8�������Mm���R��������>9����,����������Q�h���W��*����v�a��I!�Y������
�S�����*�����'SL�XM���[F`	�](|cd�L,a�����P6����ZuI��TC��Eh�V7f)���},�k3������x{����x-������2��M�QfQzC�s������$��E=xU�w�H�;I�,�+��g]X/:�^'i�7��^Z6��i�wP6������G
E'�	W���:���n
]��EK�9���(��n����H�q�Z���_i��rf����vP4��hh���|,�P=4���(���a�����1M��+�Yl�.�"�~�YRO3A�6��8�,���3�z��z,����1�$��bH���i`��_�x�W)R�A�S7F�A�&)�H����W�-��
�������<�������l��_����hn���6�����p�V����!jd��F��vP��V����$K�d&�nOR�g�)D�.�+\�l`�M����(�4��@4�#`�a�87���`���0���Jx����(m��!�%�1��C�g�������|�D�4
U��X�Z��r�l����Dg��$S�Q3(��DC(�v
��8��\x,ZH�{zg�@'�,��0Du�:��@	��������h�=�����������e�1�M�8�����Xdf�Xh�K�_�EY�Km�/�u���������u�4���u�/�u�����a�/�u�T�uG%cAkL�*<cJJ�e�)�!o�1,*���
�����R�K��
�QRA�AW;|�D�
+E=���3��0O�*P��N����9���h�a���]G�MU�/�Dh��$Y�'iB��tk:� �s�HO��H�W��^�U*�T��&����dt�?�v5��K�$�����0
�oQ�*	;�������;�U�����#Q���("[�PHD2�X��OH/�[b&M���x��P���
E�_�k=l�~A�&F	���e��|�<�(�Ko@	A(����u
�w������=��n�A~��8tL��&m��(�B0�D2�J8L��h�6U�%d���0z��qd�6�'^�.��	m�=([�o�6.=�y4�A��G��"������
i�������hv�+`��H���Lo<%���?L�������E�4J
��m�����v���T�X6�A�:(��2$�U�U>''���-��n�my���/�U�N�b����<��Z������1��Q������hL�i���������R�2PM�E���@�x����%|
���P���.W�I�*)T�I�Qd���?}sZ����p=-r��-�]2�N�Xp�zd�`z-��|�`�����5/�m�1.�nmk�����c�������3�Cj�C��������f�6>	:�^�^���0F�q0O���?���"�q��T:Z�P$&�u���T�J��I�M���|��-G� 
g�0V�
1ws8����;7G�nZ�.�r���D��nH����D����(�Jc������F*w��h��~���p�������4�k��H�������3@ O3����k�n��2�R_���i�'7��&}�������I�����J�%�L�%�H�erA�ze_Lj-)��(O=����<\m����U�;*#
��Mf=���de#=5��
������wdy|�^�.���~"<�3�A^S�B��O9��,���$@�H+�+�o�S3�[�*�x���E}R�"��"��U$z���_V{')[~N����$v7&�������h�?�
���n�G���}B���R"��]B
$^&2B�+a��:�k<��wu�Q���ZliP��V����*�Q5�b�}�ku�tu����m���gtwa=���k���6'�y��1��E�nc�3�#�$�
h������2d��pU#$'�:!)U�
I���R��!I����������9>�q�I� b��]�������"�K��6&X��U>���0h���+1Rwk��^�:d"�EO4?�2����y���'"(���<���H�.��U�F��] �s��F���K�F����i�s�@�;<�=��?���q{���Pb;�����`�K!�B`�T�����"��N��k��(@l�B��@y_����Ad
(`F�f�Z#I
�X���PA�DUP��������a���-���p�0��n����=�W��4�FY^���d��C�+R�II���5y�F���[������v���A�C�
�������
p�
P����
�J�R�Hq����{d��������{t4���a���
�LL�k�dy(*9/Y^��C
�#xG��k��y]����2I�de����$T�ke�������A}��]�&!<��ci�*k�M�6�O�/�����W�/��t<'�i�Z1�U ��R%�X��v&*0�uP��%Ig� ��i&O��W�����w����'���n��ES�f�`���2E}��7Oi���H�6S(c)B�Y���U�"�-3 ��K��K0�4v�tf�T��Xe&��`i�Y�R�):�N1�����WE�����Qc~����bJOl~����G�����%��*�m�>�C��|��	���E�l�JV��Rg�hZ�
[g|M��X�.���[��-�2���;�8^I�b����v;��J�u �X��I�����%!0�'��~1D~�g{�r0$7^}:8��|d~W�������h:g)t�^��@-\!S*��=����;��&�3�d���cz��_�q�;
,O�U�"��$��P&�$��/�Z�N4��k0,��1�;)t'�)I�S�d�*�C�u�Y��o�M�����j�|p�-�n@���|D���o;�Xqv�
�
���Qw6��_{M��������,�������#���f��5�{0�7��!��P}
�����3%7�g���v�jcc%�>��tj�)�q��XY�D^|O�����$��&������,����F26���e�`2	�}^-��k���]K�
�E2b#'���*���2Y������\�Lob���i���C����W��@�Y����TOl��za08��Ih�h_Q����g�:'K��~L��������t��u�^~��~6y�����:�S���Y�9�r��|Q�����S���������R���P���W�e��+�4-X�d��*�2I�f,��+F!��L�T���je[I2U�B$��db��yC�����
�8���������5��{W{Q�x��NB�v��F$@ce���,GK��;��*�a�!�f/*�Z����$c&��W�n7*�UT���?e���"7l����T��?A�W}�WU��
q� �Ju����2�x�R���Xr�Z��8�\�N������|���w���oN��C�O�{Dt�:C`�=ve �{�'�pr:��j��:�j�%�U�D�~ a�����%L�e�:�?���;L�����P���������Rv
4���'@�hal���R��p���3:��^��i�8&C33=�F��a	D8�p�`�J ���~ga,��'�\-z-��o�-��jy�����' ^��bl�����D+\=<����IL������x�/��tMe6�DI��o�����T��������7�Y�Hi93�dT�����3��
 f���n,���el�N�e6
�t��~0Y�����Y����\�;��
��?�>![+���X���Ea�`})��t�M5:���a�������4,�����]��.C}�r=��k��N�E����i�7�f����y�]^EU��3����\E��U��rB�����s��N��Y����[�l��V��rr��VA~��n�A�R���������������^��4����V��Y�+N�����ew�
�&����(R�=\~��?����l��c�#�Q�������p6�����D������<��BL8s��?(=Bc��{+�
� ����8��iIrL�Va����'�;ZVu�+Z�nX/e�Bi���jh@Jy� ��vx�v�*S��L�m�SU1&����]�b��f��NT�#5�	���x�~�~����������"���H	����j��jN�����6e���5}��e�U�MN����Z�����������
���]�dx4��YP��v�@W��e�D$w�'�9$`���4V�?��W��V�;P���Q�� �/,����2��n*���|b�W&cj�+�d!�.���Y.B���A�1��9���������������S�IFvB�U� ����B��R!DQ/�2)��1��j@p��2T��I�	�a�,������4�oo`���Y���j�	kh�������)����&O�9�2�W�FI��!���M��8�/3&>'�p?%���T2m��
4OJ��U�E�(�r���M���2Q�.�'}�Um"�3���d��u����O�
�A���`Pe�Y7)H	~��E��,�O,7�%���X���Zja���VJ�ra�3K�^!$m�������X�$��9�q*e:�Y�}�u��9�Z6Srs��Ao0��z��6*+^��������#?���(��y
u���W����#A8��1l����X�;J�n�k��Y,�
YAdF����4?.MF~N���A���9��"�Y�������:D~1�.�K�����;����3����2�8��Fb�RF��-g6�
���6[=b�C�B���!K�=K�D��A�l%j&��d����
$�62$�����-��Y&��e���u�}��a�p
@��wX
|�&23y%P)�*L;)T[�A�����k�"�M��'�%�c8�������'�/��@e����]%���S����u����_����\<�*e�>���e�y�Y��3��mIJ�Z��R(���R�5�����(������Y�+��i��nO�L��t��_M����=}J��kF���o{�L���T�a��E����&�s�|eb����H��y68�������9���-8�5���(�x�y��f�I����_���)��{KY}���YM��'��,�&Py�y��q�v����C��F^�Q�t����V�l��'k1��^�Y��}<?q_�={��7���3�_�/������.�{��p���1�ib��x�~�C����c���������n8��D��Y	O��������4�*N�Y������a�,�HsY�^"]uD��e!Z�M�t���j+R�e=�SX����fY���f2��&e�mPFp��au�S�D��8 �f�4](�Pt�@G����y�(H���I��������h���j����2l2���$����D��JAbE6RqL4�����I�2
��2HS��M�(�[���.S���a������eP��m���k�q�p���8�6��
^�e���ZX��"$����lL���h���P����v�h{�?��udQU�x�>���d0�������\��*�^�ms�B���5G�������a8���3�M?Z���M��{���h�F��f`h�%j@S�lXFr}�=����P����@�s��Q�^�n�*����|��z��?�����R�)�D43!vU��U����_u_bu�,e��2W%��}P�ya4w9���������a-&���xPKfZ��?�2�u���J(���r�@`����{��zl�O31a�f��<��if�i��i�}
����R�����bA���A��\Om��J#�B3�4�������|:�����$2�#��J\���;���2������z�1L�J��%��N��S�Z}3R.�v��l�inO���l��<�g�I�?
R.q�;	�����	|�[a�^��[��^�]������!����M��7��vG,Yq8;�K�41�����W�t�3k�vO�����C���OG��5;QH+������g^?<����_L������\�eq�^���Lk���z	/�QpP��00���s�
Fd5���^����t������oX�8�0IY�C�L	�A�&��2�.�U��.�[	��/����M[i�M{����n�[i>C��B�BZ��/���c?��v�B>�d>��3�~^^������#qe����{Y>R�A�v�[��o�\�������6�T��� �������.,�B`�*��%�<]��@#o�\G�������Bi�U���
e���q4�V0"H	�� MZWqx	c|��k�<=�v������SfJ~ �ly���l.��K���A����M@��fe���$i����g95���C�h8���&���!��|@)@������`��M;�[0	�����[��r�v����T8T���<�k|y��
,&�S����p �����[x4������w�V��J�4Mz�c�uL�6�4��n_L�AIQ_�F�J,D"��DJ7�:)��v��
:F9��tS���=9)�7a��;�mYP������7���j�����YET��&Y�C��(�@~�>)Y,�f�h�A�NQ�
Xt0�B���w�&���rrWe����]g�i�u3�
��.��~X.mA`���+n�M��t>U�V���P�&`��$H�I����WHf��rD��U�@��x��A
o���]�z�����)5��j��	�3��eJ�*^y�:#A�TR��h�����+�^�1���3���s���xW���t��v���u�*��!ySQi����,[Y���|�{�no�O{������+/C8�oo�(0Y��'^��Y���J�2I�R+�f���I�R���'I��W^��Z�����/�?�B�"�~�l!K��re���`�<���g�UHu�E�K&X$t�����\%��Bdw�os����_~|s��G^����qN8��x#)����4<v�t�+Z��5�q�OR�����u���{`��8$����H�e�m"���S�o�~��G�Q��R-_���0���Rh�%����?�}s�����7��v��
%�i�n�/rYCg��@��'dk%I[���{�
��\����;&���SR)R���];���/A�����0�n����mb�����������E8��o��s��������<L!�(��:�"$�%P\��hg�<���?�=���j�<;yu��������������b���p>���vHM�jrCjcf�]E�EC!_���������������u��a�m�������,Y����E]�Uc,�K5]U�k���dj�B�]���t�f�
��Bc�!cz�����`��:J������i���SG���4�E��D��~��JG�@�T��X�����JJc����I�{4���/a�����F�k���H:���9��KW�;�6	6��n�G��`���Au�^{Mb@zE"�Z���(�QL�fW��EF�XY����O��}�=���x��d�F�;�'�pb��(�bI����O�v�"�$rc+�>��^�-@N����I�8I#9
F)�O�L&���b��,N�V��p�{RO�<
���r���:�,�,4�\9���L�d�^���4&���,��q�7�/��&!�n��I$��FHI@��.
	�Ne@2n�G�����Y)"[�g�TL���M���~7O,�i�P��J��U���#��i��0��i�6H��!���l�jJ�>_�c�G�h8����_��+�%0��S�
,V�Lh�Le�����i�����p61v�Ae4Sv#L�����b5����<�
&�n�7{U]��i���q1+	�)a�>a�1z;��0���N�)n������Z(�����t:���Y0�V���������WD^���'}=r�5ub�	�#��k��0��^��*.�B�M�[����<vNU}�\���J��X?$��5W�k*7?�x�jRo&P���-Szsm��
�����Zt��C�&
?�s�X��)�VO��j?������a[���(��Ks�����>���>Am�wSrs�t���~�?W�������E�l��O������[�/R��[�XMj�����p����j(��3�����r^�e�{o�[ba7hM&X��d0��m�W`i�/����{x��l�m<A���HK"�?8++k��n��`a�s�����,�2��c���������l6	&�70�����, �K���gI�dF����0���*]E�y��^�A�_%#���G�����5�O!Yi�$A�	;��i����2�@�+TV�f��n���e	��{�(��n
:-�����s�v��	�w�`���ol�H����Lu�:L�<$kI=�]r���� �M��N���;,�+�m�a��@�00Q��j�l�P����?�������l�[P)�x�uxi3����8_�G���/���g�p���Z�(�<���4$�%�����	�
�n���Y���3��k�Z �Y{�rRW����54&�r	��,�/XA�*y��S�l�/���Fs�H��
5�aemT��9r�}���z�|�O���;T).1*�&kc|:j��r�@�h���6��g����^l������L& ��!�=O�/:D;��=�{��(��f�����e��^���d�^������t_�+���5�5��L�s��$��xL��f��������r��|�`?..*�2�-�O���{���������W'c<��g�����.�C�����u
`=��k���_�|���~�C�CO���)�
"�'i5��/h3p<��3��Z�{�YXW��N��x�p�s� 3��au�g�HsB�����(�(�����
�?Vj7k��T���d��f�	X����m�	�lQ�Ff]�V��y�����6��XKXoWa
�B��`��jS��9��������%��q�b
��^a*�,�?Z	=����X=
`7B&��~�������3��0�~8����x�|�F!��N#���Yz� �h����Y'�������AI4���.��{d5	,��#�-?�F&w�7$T�p�� ��q[}��40eE
f���x���$������������f���EB^�D���,�rWA)�>�%_��R��]����K�Wm�W}?+�k���vx��� g�;��|\�� ��G��1�_	O��4�{3�=\��Z?h�L�(`�������=��R@yD7�T:��N!p��A�i�8K��]7�b�.���')f#�IN�t��[�w�%qI^5��A���
[X]�t<����at��1y/K4
���(Z��Sf[E�Q�mH�^���/�C�{J��^|<;;!�����'�������R����hY;��,���n�����R�����TW�&
�sGh�X
C�
<���l��Km�2�l����ilX����xJV�$q9���C��.G����m�&R���t��DXl���i�����_��P�I����=O�@�kNMM���8
���T�V�&���z��<y��u9�����(�\x��;�����zX�W���/�	����N����H0�����6��Z�l����?�EDB<��Dq�n0uu����q4�����`l���S��t�X�"��6JM�(y��<.�X�$@��uY:_�Aa�M>��0�O�����Hhz\��
�~�"�����]�!Mm����D���1N�o�������E�F��\��5���1��~�O�O;���`;��Sy�z����	:A?-�~>N�~�����$j��<��
�#�xO��z���G�Y��MGj6F�+Q�SD$��so((nr�V��C��yiY��#�r�N�0I=_�{��Kp<t���6�c��Z��L* l>�w[,���T��d�����7'�O�Lr���&5����l�ao����W*j����1{O`�}��@�=~�����a6$�;]����#otd����2Q�3���x� a��=�Kc0��s�w�0��r+]Eg$�����w��<R�`)E9�(��-
�g<��������A$�m�K�A�{�z���S�`i�.G@��{,�pa5��C��B���!t`���9P���E�06�|!��&mv+����-n�P����a��MVB-j=6�u����s����0V��dK��sU�����Y���<�}��*fL���l���3>Q	z#��Vgq<�uy�B6��o�j/r��"�<"�IT����p�MZ�w4aM���/C4����9>�`���'��s��;@@����MB;M�����1�L�@��������q���8=-6T��d�_���$�t3���UNV�_o�E�0�@L�
!+�@�� ��"&n�dV5��/����[�k������,�N&�"R}�I����x~htt��dR�O�tY��y������^b~/g�z��0�l��V�~�e����T�Y${�"������������������������hGB��IL�g rw�9�3��{9��d�f��a��m�O`�����>���y�'����IH�]�9-��jT��+/���C�y����+>AF�<Zo�Z���Y�^����:2B1*�Z���r����]�t��h����MQ���x^o�7�Q�V�t8��B����C��f�y��;�����A�-�;����x��<F�7�T��u����V��|��oaOd6��k�>�gG��d�M�YP`)�
������/���+[&EoQ�/HZ�L�W[2�_��/�W^z���g
�����@O^M�����=��G~0
�[O��l"�2o!������J�l����W��R��DQ�H5$z�|�mG����;	�4����%��
�N�����c�K����-���o��
#��0���5i�l=��� !cK��J��mI�_��1�h������Hq`���t����.7�
���*�i�X�{t�Ek�����C��������la��Z�m'�V7�����X�&��e����}�q�jsZ�8�`�n=���J���y4���	�
�� A#�6�h=B��A��taO��m
A���d�b��JtYtab�^�&5�Ms��=�l�j/����.�Q=7�Q��\���s=���Q.�B��$��6�����7�v�!��w�0Mq����-w�m� ��rL�d��2B��m%#�{�o�W�?�=9�A�=?�B�[��|����d,��H�N�����&6+,�h5��.Z�[��|���m���w��QC��]�|��X�������S*�a��]3v.l:���VP7q���3���,��p�[�G�$|@��IH����m�E���$t����d�:W^Q~����$k?��Ar	���!��� I&#(�5s9�7�8��h�Jp�'{J��U�S�R�D}�I*��0��sI���������I
k���l��:�2�( h�I�`���!N��tn��nS}P8�����
Z���A�_`^��,����[��e�a�QCj�n�)���2����j�������p��X���8��6��}�m�3THI-�1��n���P�g��O��@E���������R�����&��$P������Y���<U�U�2�EaW�T�ow�������k/�;��X�����)i�&����.��Ah��H�����h��+��������~�Qg&�:��h���r<�N�k"�f�X��!�����XwiW����N�-��8�95����Ve�Q�R5�lp����Q,]��&����w������i��p���`�un�z��5Lo� ���/���I�"0���/�v��;;�eA��F��{\�Qp��h
�c�&"�!n�����.Crb	b��D~��rH��8�8���������^�\/o����e�%����3p-����Y�[fd�Y[)�����C�WeQRd�K=�B?_oW���V�JW��j�@r�=���C<�w��=*�V���u�N������+>M�d�g���V�:�����D�0��$Z-:p��H�������$}E�q���+9�9�����h=����?�����1:����q����Y�/a�IqC�Q��w�
��4����-���H����h�U��|���fe��QCQH���<��A�9|�)5��f����!Snq����`LX]8��D�	B������&�`<�����p������5���4t^E�6�oK��!���fy���6�2QqG6�u��WL���hx��@��7R����k��V���^�	;����(��m:�K�[,��gR:�2�w���|+�bR�i"j�P�����~�e�-j>a���*���(��
/+�C�.�M�z���=�
��B%��hCP�z@4�WI@��5	�[Z�%���2�	�z��4o�G���\�� �������#�G��f���T�b�i�n�zy��*�h�j�GiD	U������6�C���$��gIB���4Gs�z��t!��{bwB���^N��m�����!cY���W�muI��]r��<V�x:��z��kpW-�/:5���?����y��'�z��#����c@y�h�����������������t:=�����y�	��G��$E��G1z����/�<z����K{��a�����������m�;�7��w��y�R	��g�]�s��(w��*��gi�����p0���++��*��@���s�<����=?}�����t�@Dz��������]	1@������������~���{�M���{�{}����vBi�H���2�'b�����yY�&KM���[��(I���$<�M����e�XA���������$�����:>6��
M���B�;��t[�ZqZ�aF�4X'���g���g�B�7���7��LE5�\�z�RKr,�k*�4r�#��[���T���u4rS-�W^��T�Ei�M
�Q;B[*�q-	>J�f��>_�DC�,������o���N,]��1Y	S���)+:���Z�����!���\�I6�\������4+��2��W�8��=����"w-.'����_������C��b���w"v��
l7�S��X��
��WFEIUD�x{�mn���(�����eXy��o���JKgLu���������r�F0��-�]a��V!�]#������2Lga���w��;<���#�;������olX�����{�0�<�v�|��v8��^
{H�\8�(<�R�����P6�

t",���DP�a�L�����+��pFn5��8�����i��i��h6���G����{�����&��i�����Y��L����q���IX#�U�T���|�B�,R�����2|� |+�J���P�"�>0������e�+UN�?#�
}
��3 ��R���'�lI�"��_H��ezi�gid��m8�5��z#�"RMuM�7�|��W{(<��D�F��6��mX�Wh�"��v�����2��U�7��Ey7����+W"6�.���^�7v������,�]d���7���jl��3K_��j�����I�����!��xp'B!���T��8�7@��m������F�N���s�N��./��*�[�[��tPV�0j8���,�u��y����;� ������36?�����)�<4���5^�!��H�hRb��+/n��@��Go]B&����?+vs��#o88:
��=Lo�:�x~�D}R�������MHOpR-C|MRITW��[���<$cO�8!�_vW��0��,4�hh���x�A����{$��u~]��U��������_B�e����J�r_�xM��B����M�	�hm����������������XQ�H��
%Y�R��t�$73A~'�+�[�m}�������B(�sq����BQ�N{��t8�?�d�D$���n 'K9�!;z@UF��mMK)����L��1�<4��ko�-hS���r���Y�[H=n����e1���,S8��>P"�QI!QQ9��d�
}5-b��@.k���FF�S5iG�$��cZ�%c$�Ee�I���L��]&��^���.�F���Db��	�,OC�����g��d����Eo��7]��8����d��M����D��2�5?�����d4�����j�Z����*<_/L���w�+���D���$K�m~H)B�y~���:b��o����`���z�U�ZE
��J����8��_ey����������b�D%����^����v+�DfEg4ak�`&���
�5�������������h<�{���oJn�~-V���sDU"`�Q��?j�HlRI�'ni��C2Mcv��fA�����5?����7O��w�\IU�,`�r�fVq/��R����0��LIUD8�����������QMa=v����s�|'I�g
I(����i���!q��o;�;�f!��MXn���nxs���A����q8�p$:����u�a��Q(,�w�.�;��`��uo�O����a���z[���]�B|�,�����b ����S�#�n��gh���(��Z��/�	��9��0r2}��
��3�8|��I����l��b��k=�!xQ���s����V	5��No�1�*z��J���F�@(�X���8��#���z�uo!K��g���f�����n������Fg*�K���O^�Z��g6F��m�s���:A8a#����4����3�g��m�
��h4��p0��^�U���d#�R}�lP�w��R$�HM�'�������-�EDR�M�����\�1>:t��(h(�W�*JC�N�B��5u"Q�/ j������$j�ON�ZH�H^*@�$��]y:�|^@�b��KM���X��0��C�g��|�@sO7!�����WQxm*&Z,�TOH�r!��W��wH���&�^�-�\�UPS`H�p�{�l��*�oe�4��H��;���w#neFo�����h�����=�q�JE^��G^e������?x���o�0�eX2m��#[��%���al�pD2��}c�#[qG��&�K������NO��n�:�n�^��\*AB�H����mH���}v!�R
�/����u���=K��V��?��7���UT�Ur��K��%09��0� }��)����������I��|nD�f���>M����N+��n\�W%��N���"y��/ m������$i�?N�jv&e4�hD�*bs���?t���tN�U'^����^��������)	&��!��&~������?��]lu-`��-L^�����b���G�h�r�0������*-��T�}S��/���/��I�\Q�4
Q�����W�����"�7�D��:n�c?�����~�m��g!@���O"��F^��-�����7�����w����������t���{��t>�	�S[���R�&��&�+!1��������soWbdf���������~?�'��x�����5Y�6���r%���_�;�"T������~<<�K��L�������������]��5T�U	��g!Wf-.+}��tB�)�I�b��H��w'Q4�oF�*fs[�^�w}���8���G��O���l�I�$�D��'�o�ML�W�,����Y���m>���d��H3�5a7?B����d>YBv�R�x��;��*m$\��Hd��_z�W�xJ�������Q#��Q���^w>L{G^Cd[����=���BG�!�������vS>��b�&���Y�g��l��n��4�>����g��]�Y����fn�����������n��q 1�����h.��������6���l��|�J���93c6�<;�O��h8�7����'���}���N�	^�:*�����Hl�L�'.���!)Y��>h�-t$����3��>�$4K�_<��m��w���z�`:��U3���Zf��w���k0L����0]a����[�r,����K�etk�t[��g��)�FCW}7��r����j�@"��c�}�������8G�����w��N�k�r)9u��d�4��u�������\?E�O>0:F���3bN�;NC!��5fC��5�j�2
�ud@�7�*!Qo�3e:��]Ekro����
�=B�DO�k���~5����(b����7��etb��|����s������h�@�:F�
�,��*g�n�<E����.70�:��h�u��#h���ta<X��t���%\�:%��9ix�T.<�<u�	m����S2|��R]�������EX�{�ZF6H�����H�/�����7���Y�n���{?G�QwXgg�D�?aB�g	�sD������0�7T��HT�2�}����0�r�r��5�7��I�}!���g��R_�n�_~�����������G���|Dn�_�w��������<:�E��l��>RW���z�"�+�&�����\jmP�="|�����S���&~�����u^���%������$r�b�E�C��Q�^y�%�5��YC��+���!����N��B7�`[��@|W�z�<�J��N���O�����G����G���r���n���4'����^�3�B(�l���7��Zh{|G
�<�[d���G��2kH?%�y���$���jV�V ��QJ�{C'�r�q��
��K�(�x���3e�I,�d����.�a�d�y���,�������=��p���5*QkM���Rw$�+��n��P���x��Kom���t�vcJ���#��L�.n�f:s�!aMG� �M�,�-��g:bq�1���G�^����,�'ql>��)���k:A�����g#&���KL`�2�#z�Ho!85��]o��NwS=)��p�r���;8AYO�pv�i��e�p%�eH����H�����L�&���y����?��1i�d�M�n���pF�c"�7�����i��
�d9���.�Q�����_4
,O�e�4&V�fp��A�fG�N�;���l�!�<QF(��Xa��,����1�1����Uj{�<�����5�k8���d�����)��?�k���C-�a�?��j���t���������L�<��c��gg�N��>v�����T�������������'���<���o)eO�
���7�����S>�YI�|���9�������6�7�%b�[;d�1(}I���>$Jy��'���#�{��<��KG�nC���|q���Mw0�gG�����������7��~��Ee�1�2�"�>��9���?{��x����k���g/O���>���������!�H���|0���h����D���U��0����}�Ml
C�o8��������g'�����_�L��YGG��Y)a)^�s�D��x�C���9�����6������6�n���'�����O{?���������S��?�����i��O�?u�/$��o��/������E��S�^���%L�}�y#��/����<0�C����Dm��?;��jsH�V��c|�o��x����gm����f����G`�h�3�
n�?�����a�P���D�K��i� ����:�#�b
�?A��?��;l��')����~��!W�����+�?1��<���{�����7��ll�U�]�M�T������`�����P���Q
H��1��#Y�j	����������y��H?������?9��hLR���KX����>��3�����HY�9�p��������#,l�����Mb[9D����%J
��3$YTA��S���@��q�9�z���;-��:!A�H�����	���N��-G�$
[L�D�D��������v7�A|�/f�&
�`�.�/�E@	�IDI�I���S>*X?_�.��^�x������y��������!_+�_��B����	�]��k8�������bD��1=�������������R�48EY=E�������2Zm�����$���rA�#!���'9��4fOx�q�Y����R��%��@�B�y���	��,��SWF����ni@;�W��"Lo�r�Ma[��������d��)5^��q%��sg�!�����,�Y�Y?o3�1�!T#a�$�l�>*� ��
o��g{��5S���_&X��BZ$����Z-�?��<~���������e�aTs����]�V� pT��+��[zW�8HNG�������c�F���ny��IFge�G.
0kv� ���-T|�
�r��Hk����-rH�fI�
~�:�}�R5)�[I%���8H>��v2o��C���.��C%f@_aw���T�}O��{�B9�*A6��=4��^d��@��>��r���X�v�Q\
XEC�;B������I��m`�,�?u?8�.����\4_�{���y��Q����X��
�BcV=gG�!yx^��e@%�<A_��}=Z��{����=��?����Z��6�/���(���OP��#�a�GF��yXb�/��)�l-�|�^__wJ������VQR'�J�0������_��>q�={{��j�\�_���������.H\���F�S��3����>����>T"~�����(2�}e
=~"���-O�4����*\���L.�i�)J�O{O6��:�i�i����y)�/��(@6�@������������?3��R�h��1��T���}���!����]U�h-����_Ts����}v����u���y��A�'�w���g�b�q�@	�I�E��H����#{�,$�J�
^�z������>9f��M�4��n#��~�]��VZ�m���{q��e$��-)d���n�����~�yEn�CvY��d����e	���S�r����QHd�2=����������~R+���F�5�RS[����?8����e�awxx�� ���b���@+��7��5�I�n���ep�H��*�ng�e��$#�J�dy��H�
���4�{-^2����"�T����ZP��cb��d����L��Z,�aYuX�h��i!	�)������V�����G�����'-I�����l�3b���8�9&���*AdZ���2F�t�t(�� ��/����1ny3nK���������?����>l1lC�Tl4���Izd��L[�;}QMC��Y��
X��f�4��kt�����?F5D��[��V�0�N��o�����z���C�w�O?����i�c 'b24H��H�V����������E���Z�����F�8��:
3�����2�b��r���sr���������+L������p����2%[U��]|�)�<&���������E&�
�(�����9�Q������u&G#��,����O^Sp@ki-�Wae���B�U��U���=]�m�r����C6�����r���P$=t?�WP7H5���W���������&�����!~yq�v���tZBk�m�k���9^��6���.Ib���(z��Ln=������F���H��y�������(�}E� �D�(�Kr���B��*�;xA3���
�%��Ajp]�4���L����N��w�I���?i
C���PA��gm������59��MA��)�@m~
����:]���a������#P$n}�98����T?�1�!�������4A���	��,�$��1Z���
)�<p��d���m;��<e4j�8��E�ZO?��~����}yzF�Nh�i����w�j/;k���#h�?�&F�~V;�RWU�hF��AK��;|+��M�*a
6TO|�smQ!���ma!�+�������X����a�v��{F����t���kEg�h5�x�G�{���U,9���O�)H�h.�wP�xAM�{L�����v��EF/�����Q�m��p2���yL��f��\I�
��-QL��q#���;i�+Zn� ����p�����	[�r}�]�2��Gl<��
���4,��/?�i1���!�z��I��T6����hO������+e������|S��k-g��"_������	��]����=�� M������_c��O�z?v�V:t�(L8�C��rG��]`�C�S�5�*���0�/O���P��$�H+Y����F���{��xO��;XJ0��{a�j�����������}�������{
kR�|/6�������9	�<����������aa�zL�T��_C�4�]:�8�/4 ��x���������t�-�E�1�aw�wp�o!�������=/��],�����/J�l}�Xf"�&:�}�X~`�p���s���3��E���@�����y�/��,�����c�Y�Y<8^C��?��s��+��h�]�I1���~��[�a�5"����E�����9{���x��eDD��w��
 �9�G�Q{cspHdF��x�&�9Qh�O\��_@��p�?
^����(��PI�-������d�{������������Fy0��Z-�@~|���[P�H_�^�&���T�G���e�����������O��Y�(�
z�������+��kv� f�,P7�2+��\LG�8����_����g��{�V�x���Yz����������i��b�-���mL���o�'o/�2�:r!_�*�e�j�'��1�%/u����`Y��������VP23����@D�����WF�pQ{�
V���=�IH�����hL�,H eE>:����r�������dr4�%z�K�sE�&��,���Q4�HW"��F�������b8�]�=�)\��~mA�L����nG���y�@����9��AjhK�7������U�2�O�
DO��Ic_r�Y�����Z%���`�����Z��J�T�W��U3��G��O��Wk��>�QA�xG�s�D�B���06������s
Lz��p�����M���
�0$S+q��|�2_�|%$~A9$j�J^X4�p�N��h��g|����G�i���'0��*���x���`�Yh���x=D��
�l�CV%3��1f!!���&��^z{�����m���lDP���%D�!�_V
N'�R�t�ez������u
)������:t�+%��1��@%���/�g/��2zT	(6�96t��}1���d�s�M��+���v�u+��I.�Q�����9�P��g!�����d����5Y�~������sZ0�����|8���$��k�6��e�z����g�'%�B�yV:p�	!Xgn��A��}�'�g��w�^V<���6�Z�F"z����<+iH��������gN��d ��M�O�������{3�p`�`��'T�B�z���i�BFmV�t���/�3)�p��	���"4����,��2����~~�*����c�r`�>	�\��3����f-��E	w����7'.L5�7�#����7'��O�Oq��EaH�/�K6S��p �x��.�c���a9��u�M>I�&��
�@O�<�%@�GI���i�\#e�03#!Y���X���
�jk9�������u�P�<���%������!��������Z���-(Qg�N�������#Vx�wa�qo�m�[2����d,�mQ��2$�������l�O�������)G�:�%���tKo��e3V�Y�EL|��,���<,��A���}������`���fM�n L��iN���f���idG�Rd|0$ �r�$!�7$:S��9I�L6�|���UVe�x��CT�:����3O
�j/�o�:��W��.W�d /_1����d�z�2����Wc,�M���K����2�_���+/�q��>8L���!�R?�6����%�_SMJ�'U���<����c�����N��t��>?/JQ����|��:��AX���l�k�)�t���1���>a���i�l���{�������������go����oh�����!mt�T��}�&����Ub���P���������9�������a��LJ;7f2ZQ�Co��N�$��}MJo���
�\��uD�� ��b�
vK�z�*I�U(��0/'O�8�p
�TF������Ej��#n���|@���v����8��&�����
�����FI�U2��������������v��D
W�I&���j��7���	#�Z$��ER"���-���k���<*���_	
c����W��9�&m�������xw.o�m����r���
�'I��v���f�*��h�Z����W^��h����cGRX�J|8�nE������!V3I
9��A�����huTM!��<S9�E��
Y�D��.p;�@@*��EX^e���j�-��X�<=}G��sh�4�"9�U��)��(o_������~���^�|�S�T��Sj������P�9���<}�rW$�#�>�� ��3r���N�]0kpf�T"���_h�-� �m�j�ms)F5�W���=K���R�>Kb$;M�+����YQ
(|V	�u����?;�U��h�K1H����D�i��bD%�DCC���B/F�z����	:m=�����)������vv{H�`�^��(���&�{h���J�|KN����s9
�QnWZwIh;g6���u���2va�*\������s#D������9~��5�����r��x7�o[��6
0��io�����R�hx!n���
%!x���.*D33n��/>�&�K6y������D��U|?�)� Q�(SqD�(\�����te����X��;�N�d"�X-�>���uN�Eij��0KY���4AY�y�e�(�a� �0UX�:O�yJV;'�o.�&Eo�C�������_����u(�AQg�xu(3���	 9���uX=�
�M�q�\D���Z�xN.��ZRo��GW�o��
��-W]�ZbT�w��<!�$4���S�K������gg'/]"����o>�<q�?���T~�� IX?0e����:��I��,�Z������-���1!�ExE�S��~.>aL�[�S�:��Qo�T��CDR��i��o�����"��H�T�n��	����,S���s�N8#�f	�fW��`�L1�/��r�'k�X{�����
����}������0&�A��DuEQ� ���L5d(2	�R4��Zm�I�/O��|6�.U�>��*54�F_�S��:Q~{�������x9�'��`Q&_5~x����jw��bk5��jS��;��	��O/��B;�g>�q���0����Mm�{�ks��Y����SS��Pn����:7�."�4,�����>��_���7&,���7�}����(H�@��`1+����U.�bp�dJt�z� ��H4���5q��������3H�Z>`P���?Eg���c��j�}��A���
1$�On���w;>>Y�������Y��y�,��+`�X�)u^6L��b��<neRF��qDX��-Wi�M#�,���I���X��8�����Ho����;"�H�Z���r�JY�0���	��p!�Q`��j(t�(�6���8TY�F�������^����7�yJ*�#�YN�
�6�>���-l-��`;
o6u������Q�%bu��r�n�MvU�%bu��^
�YPU��%�0P���d��������7��J�zm���[�/yy��c��������u���?s�&n��rb��H������
�
����
0^����9K�a�����C
#��xf��vM�������YA����+�Z~����4^����r�O�����M���a,��1�)��������EX��HO���{h������ua�p .��F���%}�l�r
�8��]u���5���S�!R��������nc��=&��9�eA�`$�D;���s��IR�d
���$fjY'��;a{��	3[�&Y&�J��=-;������H[�-9��*J�!'��A����@b��4���Iim)�XgTY�y,5�&�6��VQF-XeZ�^�!�^��Q�����$��h)�������FxCB�c����qd����`,4����N�X1Q6d���_&�
H�u��|����c�_Xl1�*pZ����"[!�
#pY�"e�,�Q�a8��f�������mg�V�n�4���������J,,����������yEJ������Uo�E��,���Gy*`qQ��cG��E��]�&}�hB�a�0�C^daM�/[*[s�c�1]��D�C�$k���������{��[�m���\Mg��.U/�����.����������eKf����cX����3!y�a�:?'�Z���r��0����A�_��>��@�EM�>��O�c���S�"�������X7����w=S8���]�n�\�����b:c��vVY�����p�$��hRQ�L�������������8�4��mTX��7xx�%�2�;�`�����v�z���������G�J�8vJ�G�����E�ZF����I�8����?�(��%�Q0h[���Q8��F���uE�������A��$t���_i,�.��J�b������0�J���BU
�W�(���)��{�*�uJ�Q�|k������_�p�1h���P6+*��Z�=A5y+��T�k���@�d����L����n���JV��UW�������
F��Z�/)+_��A!4�r�8�@�������0�0�i@�d��*��D\�K��8�������I�x���-�L����J�����-[��96UO�),M��h;}����� ���Mr�e�
���� �Esk����F�]���p#��oN�q�V2L
�js���c�,��������a%n�������l��nTG���wF��?n��{����a%Q���)��^3���<�J����U�V��J��=����&�-�����N��Kya��[y�buf*D8��Y8V��m�H\�<�N$�'e�>������������%9��bYb2�P�Zpb��*a
�T.+�_����o�g�m)k,�����du��^h��$�u�����r�����:_�w�|�+��-|`��*Q3�����M��W��+�Wd����5X�W��VA�|J�z�b���b�n
�e`���[;1������dqX�"o����9q��o�|�Ev|��9%��� `��
?-��C5/}��n���A�:�<F'��K�	�nj���Q���7Cs��7CE�g[
����Nv`���������Q-��P��N4J�!��C�PC&�cTh����O�D�o�1A�p��`R2��B7������^��!��������cL�]8`*��������j`=3e�&B�����g_P�����%i�Dm��9�c+�0��:��B��!���GR+����v5K��>�X��{���)I�[~���,����sKB������������;%�����~�$�"�G�����B�p���1YY�:�pueKt%�rN5�3��E���8���u�'������?�H#+Ix\^�@z�SD����L-��Q\��6E�K�x��8����2�>�.*q����i��(�y)g��V'c��HX/$")J1�^��0�/)P�#���7��
�&4�xz�16~�M)y���ai��3��`�,��0�@
���kQ^����'���k��1����m�i5d�3���7�f\K��?��������B,D�f{Kj�;��o)�Ldh���"�f}9�����<����n`�X�HS����h���Ol`�����m���[��j�U�55�:��2/`Y�-����[���_~(u��	�S����>\�w�����X����x���7n:�����X\�z�cF���������@N����;��G����#�k����������Z �ob�������	b���6_x`����1N�\���!�$�)B�C�$��!��\����\0iC�E�"�AZ��W��_�;*Bq�
D�>�oE.��v�;\E��22b"V`��-���������=z2�2�2��.�����0P�������f��������lxgXi^y�96�iD�\�Kr0�	z��}<�X������t����Z�9���r��gt`dn���At�=t;X�I �(�s�^*W��69�g�p{]V��sz�s5[��UGt���,�����r�(�:�!������iK�?'����=,;�|�XFXa��
�8���;� sa@������U�==�l+��������~T������aNb;pH��+MA����m�����2{��pF����D���}���{{n#	i���`��y��.�����b,h���v�9n�������~a��~ie_JNo���8K������.���^��q$�V����~Q�����1��o�����������>�&���D0�TM�T��B������� 93w���sy�����I��8#��k��Q�e:���%Cz����g>�kf_fz[����6���.�[�������'���v���d��$�M�6��F�������DXQ��j��mx}�E�����Y������$&-W���H��J�����"����w�J��u
��,<��J��.'�����&��d����L���s�; D�'D�YUWro5PER���' �������dOi���S������t!(P5�����w/���	6Br%ov)�s����e���w���S�����#��������s�3*[��Y3�N��
%py(�!0�H��ogS�S�]��f_������
��a0�������@�/c���p���f�<��eCb�Q��E�z��[Q�J�m�����5w�&m��|b�e�"��
�@��R����	�(r�&J���y��%Q!��R���/8�J��9���{�{�<�p��;�������`�����������}����P��d:�D_Sok�(����*/�W���9��o3�D�AbN��Q�Eo������]���'xf~u���g�:����=RLG�T���8N�sv��2{0����>.h��%���zR�s*E�c�?��_�=neES<�R��g��?������w
��!����.\���Q.����h/�!P!�������F�����e��U�O�P��U�Fjp��&�M���l:�����k�'�99���<�Z[d�����B2]�h�Ch"2
I@����M�CG������a�HBS��{O�xX��[��q���)s��������MV��X�d^J�������n�U�y�5������Q�rG�{u�?k�1��+0:��3�����MC4��{��Xm�.���1Od�&�Tv���L�;:�m�/[{��������Fpg9`~G#�N;c][��c��~��s:y����ylro�i�m/�0�h��'L���e����T����fS�.g;���CBf�>5O���~%R��p���upz�+$���������_���w�2]�>����N���Br6��������f�8n�HP�	9�$-��P��"@��'hM��E#N�jXW�T,�J�?�i7b=��hv��X��6��H�
���!�`����,��K�q�a��*�
xY0M���=KE�a
��\\�
��C���8�7��K<�F<a�6.b�m���&@Lp�rI����gl��r!z���F_�D���_0�f7�C6�v�p�k�5gE���������N���I���Q�
��=���h� �i�=�L�*��.[���	�u0��i��>l���cM��+��d��S������d�5*X�d��2Q��Sj����$C�}��������G�R9�V�������G��(X���eF�j�j��I�r�����
��ha��u�oC��h��M
?��[I�GNa����Yc`�(��]�3Mc�Dm�]���z�G-u�-I'���^�����<��	v���p�#\��lpII��\��X6�Q+�*�rAf�$1G���!E��|GI��\���z��%��]�������_9�������s|�r[�LB��J3r�@�����B:bZh����4���\o�i��1�]jF;dC��8�,���|� ��F���>}�{������O>�|��@Emf����� �~��h��<��L�	XMU�7��xMx_s�>��^���]�����~���O�_���o'�}zx|r�72���(�`���������+Je�
�o����I����w��p�<���?A��E�K���<)h��U��VhIG�p�{��i�U����,�ww1@m�L�Y���Ua��9N�sD�!C�e���-K�6�ay�4�����}CU���X�*N�?A=�L'O������	�?���K�\,���JD���\���1��i����3����NN,�fh��ZB���~1W)��:���!+z9v�s�����3��y{e�!.�w/C���a'�s�
�3{E�UU
'�7<��v����Q��pP������2�s�c9���=�W��!��!L�����	��M�%�;1o�5������2P��m)Y���=��bS��p��F�	G���7gb|��������1�T��3�gJog��<��P����E
��N��F��@
h$��x��"��{5Q|�+ %�h��2����������-G7y�"��O��y�}��Pv�/'��@~���i5��v�y�����#b�,�+j-�?d ���}�$j9�&��}�\��������e^�������1�~^��)7��LG#�&��s�e�eYqY�B���Q��f���74V
�>	c�3�E���	��%���:�e�X}����OE��~W����mY82��
F�X���_�<~V��!a*
��$�����Nj����@/Y�J6���J�b��
��E�3A=�m������%�V���:%R��0t��Vp6�����I8��}CLc��B_o��#Z
�[��qX������i��J���P&&�Z|��s������n�3roW���}��[B"�T�^�{c0�Wy�f�9���XQ�6���{�7�q���`�J�uc��i/��k������=����4�s9����Q�=���`�A�T���>����M)��RI�T��ff�@.�3i4U
���>[!���J(�g<��O��x��t:'��t������N8G�*?5G�t1��]��������z�]���~?��
����v�ek�t��g��=�`�-by�Nb���H:m"8L7+���U�:��q���y�fwa|�<��A+r$V�!�1�I�5U�-u��`��Xh�|=�t� 	������5��T �O5�o��?���i4�����lK�	�"6��.�AK�!��(?����wMN	75�y�Hk'�v��5��.T��W_Y����>l�Y2,"s����bN��;�Cf�����B���["Dy?2F��V���W
����]������]B����WL�0u����W��m��w�,�t�f�����*|����z���0&�'x����M��"�
F��2F��~t���<y��[z]Vs�J��m�]]��>�_�sC�����Yt%Aoq\G�}�,���u"d�<%���6�0J8v�O�
�t�lfd�����Y�0�%��#�K��H�)�n{"�MB3����A`{��A�'���e�tk��KA�
HR�����[�8�Z� �I�]��w��B�PT���v����%_����W��u��zC8(��	|���R�k���5��MC��!��,zN.�u�� ��F�����^@�B�J�=���B��/
v�$�bl^y���)������1����Qx������u[�����l����<������g���T}���g�c���4?������>���5;~���ee�S�������o��*����'�;5��J��5�D��
����zE���2}�G���`4D������g��=�?d�U�
&Q-SG�1�DT�}���$�!�5��4)���y�AxW�5�	!�x�gd0��8�}�B��;��	a���(I�}��x$����,k���C��-����#�j\��8k�������L�D��h1�b��7~	g5~�2�r��I�&s����������C�a0��Mg{C�%�b`pO_�Ua HS�C�p�TU��c���7�~8E�,����TD���q�A-��jlug
b��X�����W�-�2�3�� �����}��f�2���a2�@����J�x�j����oz#����^�a�S���Dd�w�OA�T���L���*9�~*L�8���%<��~�_� r��~�z4xC����o"��m^���&=Ds�����L�[����c��m�9�
�z�v��V�Fav��;�|.��Rf:�{�U����&��+����gD��t�2��u?.�Fo��Z(����*�q�AD5iU�U������@6/�Jo�	\3�O�6�mm�l*��.��(y�eODQ<D�W��U10'v)�;H���O�[�M�MJ1������%��;�������kx����SS�������y9?aF
5����[!ymv��>�k��K��=
:�@!g$n��.=Yv��/���C�X�J4b%�1�ux��D��6�� ���s�>�\�9�KJ<�sT)PRT��XDE�L�4���M,B��4t��m�]�ho��A�,��~
z�t���C%0q5uda8��Q7�rR�Ko�+F����%��F&��	���ui����������"�iak\a�g���\�O-���{
���E��&moJk����
<�����-��������F�s��\�n�>�A���@���:|(��s����|��~�$\n��]��g��I�����:hu�om<�z����'	�������I��g�=<:lwv��gw�n�����wW���c�x����	�c9��m�a4W�M��<.	�Fp�L|2v���j���l������/�����;�|ig4��]�<��
�1�5�T�?�>2@�Tgb(l�F��\�?�p�st�j��������u�������~���)�����
�������qc����-O?�����OD�G���V���c��Q������/����"��2
^�+��G�`�Z��m�6�<�\2
�J�2���A\#��H�pLo��p�Q����Y�z���>����>�Z�_��=�}�j��1R��6Ewk������&YD1S\����1|'�1��m��_~��qRN��;����4�e�t��o�J���
:�\����i�'=wm����_?x������\������I����|'�s������\$jZ�����sb��30G��f���Gh�,
i�4j7�������yVi�r	���H��PH�!���T0�`!��<y�v���o��Y�m�P`�`pF!9&�!������8����-�]]:R�q�i�p���~��}c������Z�+�T<�U�{������"���0�&�>�|��W�Y�Ip���#�F�Aw?3�j2 s|�vH}��s@M�����,�#YL����������Z�����@0g/VUU�����99(ZH~�;�P���!'����<���'���D!Qy\�v�b�,f�n\��WM�v5�m��T�UH&�n��C�������c=���I��Xa���]=y\B��l"���m�=*g�K��EG�I�6K����t������r������/��p����m�D~�:���N�c�a��p��?��u}��/<F�t�/���4�enfJ�}o��+\:2O��G����&��9m	a����)��W"LI����2�c&0i��q��/�C�?1�H�����~������4[� ������D���a-��&�l��J���u?�����%��ytI`�x6U�NS�QY�azt�i\J��v�����t��,M	f�<M	+����J��7
�t�������Ts����\��wr��
�|�aW�1&?/��#p�;V�9����Z����Q�����c;u�f)@!��Z�>I����t���Q���<������"R�
K�}�}�y[q��%��\�����+_GDJ)U����s��a�s�I_U�O����������������H�����p��w�I� ���	���O����'������M<W^[O�K�
M)=5���\�z��0{���u<�}�{��3
��|���d����F���?&��Nx������
~����W����Q��*Qt���`����C��+�iMVB��g�?>:nv����Lv^��^�0��;�k��_#��=��}�&����<�fW�����*M�����fv������gc!�q�-V�_�x��\��/����������k����|���:��� 	8��5
7A�"���!�G����D/�2M�qi�.�YU��/v;����j�"�,�����!�F�V]����%��9�zj�P�����[p�V+g��=���o�`�"�-��z��I4����T6���s����`�Ux>V��@>���������KnY�i�Z���GI��%���	�[���w��IB�_H����W%����hU"J��^�93DN]���+I�Z�I��{����f�p�$M��(����;)��Z�-�4�������I�����p~�����Y���b�f�����f�E��KgS��R�|4�g����a�I���Y��,&N�<����[i��g�}���C;
{�(v�`-g��x
�H_�
�3��P�ZnH ����!*z#�"qX���{jos}�a���+�0�@t����$N��R���8P�A�F��t����0�(-���{�O,&=������p #�A*O�)KBi���u����4���������&��;��Q���u�p_3c���or�j���h���J!4�NB���T�k�RQ��UO������+��w����j�:m�}3��m��+�����h&�ib��H|�J^���P�Q�W�����WxU�v��XP���t�w�����;��jD����B��`
�����d7�.}��W>��a�L��2�h�B���x�{@!��������(�,��5���x1=���E>�c���7�3���)���4\��1���V�������8}�Qx�C����q��P�Z��~+[:I��IT��z�Jss����Q����)�_��sD}zI��� 3�������3�@Xc%�I��C��J�6����
��p��f��oj��������T�����E��6>K�V�}O@��7^+EjC���8w��������u�2dm��{co���2]��g�c�h���O'�]��RE�B�����j��2���#�-&�Z�g�:G���e8}�4�^d+�Y�
�b���u���i��7�{d�P�(G�J�|�.YQ����v�V-�^�st�I�m��,��f�(��jFN�(��0M�����C�s�M��ns\�Jn��9�����$�q��\���Ks�C�\�9�.����j1#P�
� 	oT�-���/1W���_k���3V������e�y���_,Ac������M���:�]�jgw����Nv�rF�����`���x���G��3�����������_4j���6n��FN�f^���i��}�|�������1���F��z|�y�7�[�����P ��t����%Ji���~��n%F�:|�s9v��
'��~���j�jyZ��>�svKw�|��3��"�o�2����w���<:\r���K
�;���w�j���;�2��1���8�]����U�1G�k���
�?J"��?gf����m���S��B�)���X.+�zVmzS
v�c�"��O�;������S�����+Q��A(���e�kR���k
{t�7��QL(=�^_U3�b�"���~���b���-~��y�G�~��4&���h�5ON�N�?y-��\��J��a����,��E�N6��KWt���}�A��+�^�{q5����I}�s�'��~+z��&C�����h��La��=��b/x�������o&���A��4��&���-y_*�;��7���UW����E����s�t��:0gW�:��c�����z�,Q��e��4��XWm���`.���\U�g�G�&���L7*K\@9�SE��=MM��G_1�����5(
gA����8wJ���Q�{�� ���J����vZ+6��
Kw�j�Q��
�%��]�9m=�t7���W�"����*I��Y{�Q���a�
_�F�����IZ��%��?R���7��DL�^�%B!~�w�^���b��~^S���'�uNV����&���r�3�iVxTr&�Q�Q�� 4���ywrj��zgl�����6o�����=�S���L^D��(�XF�7_U	Tpzc������x���
���I����7���
�
+�$z1�2Y��n��`:�ES����1���K���8�k��@:`cW_�v
���1+�~���BI�z�tP�Skn���<��YtIm%TM�B0?�4
����0g�8����R��:��I[�`v�S��3_����q�Ui��:.��}���onU�Z��	L�'#�:yr���eV;�3�tz�1��d�S�H<
�e�T��f)�S���ak����8�N3��b8���9�ww����|�F�L�$��=����
���A��s7�B���Z��O .+m�����m
7���8��	<c���r�I�����#�V)���Jn����[� ��z�������n�����E�q8���U���5r"p����q���bH�8��C�pV���1����R��.��&�h$�P6*c���nr������]_y�4�Z�-�����cJ��UI���BX��28�(��.�%��������M�k��N������Z�+��Z[��I����kY]�-�{>Y�P�X���t[��/��.����8N�����\��>��	{{�����C���Z"6����G��v�4 H&
�	�T�d9����g�B]���F� NR7��Z~�}8�
5Q>�3��Zh��N���5����e~�paK)����B	�T�.�"M��}.�iH4e�/e��	<�x����4������2c_Dn
�%����f���X<A;-��.kX�sB�`N��U�D��My��"\$-�xt4?������(I
���%+3~�#�R
]���Ma[���t]LU�u��K'rH�
��dz�)��w�;n����O�<�\��+�ix.V"R�B.]��p>*���,'=q����s��������_��glEa8z�!���|�{;�,��weY��S�u��4�j�9�"&H��
������g�����T`���S���g�"Sv�*�pJ_�S���>@v�\E���VXL,�hBfN�L������TE�P+�9�P�@+Lt��0�������Jji���D^��3������gF�3�����P ���Du��,�f�p�o��M[Z�����rM�&eLQ�yG#���xU�n;��?�J>�0�I��;dF��2�4_��Tk�N�v���G�2���
���$"H��d���V2��Z���vW�������"���w0�bQR/t�������<�
�DM�m^h��)�0;4<�>�����&�����
��A�"��F�����Rr��I!��,@>���~����T����Erf1k�{�W�L��|t�4��%�~��v�A����j�M&�n�/�^T^�]�jP}hIU������r��?#�|�����Xf�7Bed��Q�:8�-2�ET�]j���$��Qg�76��
���7P��������j`���"Rr��:��(?���J���BX0�{����|���-~fZ�ue�w}L�V	���)�����
{�@,�&W�����rN�s+w'��7}�fin��9����8�t"s��tG�{���/)��?35��Uu����,���T�]Q���;�����/�=���"}�tI��m���=LH���=���SJ��<�A��D�����1��%�5��X�1��z����T�^���X{�jk?i�&����Z�+5�������r����<��������p���y{�|^�����D����>�2��������G�`8��Y��3�)�����xu}�Q�/���������n�g�W��h|���f�%�.��n�����)	uO>�0gr.m,�=�:�A�N����w��()�����������/�0k��.M�}N(�Wc�K���#���F�1��,�w����%g��M�������g]�< ���r��#faX��D��So�Z����!b=�Dh�������C3�*�3W���rk�h�����y��������C����aO�f�r�q�zj<'���#gk�L�A~�*� ~�[\������#����U~�J`>�E�=��XH,/���������Q�& ����M��%�4�������
�2��T�/W��;�6A;�6s��G
,��>�bo}���}�f�>�'�fE������������:�:��qb���@���O�*uOn.x�|�~&���:m[��v'��P})�E��AC��u��&O���_�x��3]��I�~M�����zy�s������t����f.����"�&wUK�S�t�J9A����J��v7Q�W�����?���,I�3�����
n85��q��l�!^�<�&Z4��rC��zk�(���������18f��*RW�����-�e��
�e�0fp���uyy��Xs���������p,0Q��s7���dz����)���p��Jz�1��O�������e��@<n�I�����"2�Fu)����sk�[�_�k��IE�������.�4�#TX3��^}����wJ�	_��g�85��/��go{Z���!q}�tUz�:<>��x�T��m���i����P�WPd�6�_���/p/X�2���~`1�~}�1:"%��9>6��j�<�mB��wc��j��@&�H�:�������/i
"�4�!K��L�*��r���}w�����G]z���I�,9k�]0�{����M^������Tg"�Z;`�l�����@`]�T��F��Q>�G7$�a*��2,�:���8�h�s�~��!�5@�F��R70���Z�nL�0l��O��.����{���0QI�a����?KS!��0�!�%�����2���P���>$�G����r�V�T&�`�����,"�;�Rv'\x�`��.��k������a�0P��
u�������@�a6C����o�*�������(�=a����:�.)�Jj�5(��=�9$���f��b��z��d�_f���L[��Yf)(
r�K�}v������X�7fI����L�5���o���3�D�T���(�t(�S���#s���������c��{���f��/������M��f��>��/Y �4����2	�SK�Z�������-�o��5���I�����Wc��~��N�����'�>�~����0}�n��r��1�H���o� �pW�$!Y�rq�&�!�n)SP�Q��\��F����rb<#�j2T�DAv��1����P�*g���8GTA��3d�X�` V,�T�������f�=�Y��=�v��^�OZ��v�c�2Y��f�TV^���I2��%�����>��h�Uu��6+Z�"f�`�"]	',[��	a[�.o]JLw�����#^+}�������4d��g����y�af*���
����-���G�5����#c*�Z�"7X<����(�d���X"p�n�q������Qw �����s'b�?������cu)���n���m�x:
fQ1�����������R������h�e	�e��Ae}6��_���"������<+V�mK�]�A\���_.�`�^�7�-��d�\����R�>
'������a�F �aqO��g��0IO����u�U�e
}�q�}-��+�-��^��o#��2�\]NYnc'5[��=���[�0}�V��z'���xj����h]�.";���7�T#���=�
_sG/�		e�uc������`���������'��k��/)��6y��Z8���>�t�����~��4d8����6��5��g�h��:l�b8���8�/��=C�����5�1�bR2����1����1�\��d��"���6,`�����ne��zD�����-1��c��K2H��Q�m��nHW�km�-����sm���1����������u;�wH�������>\����RF
�����x���4�N�����t����*Wru����y����R�����j�8��
Oq0�J�6�S�c��-.;A�F��-<�	|\��)��5�L���Kd�T�(;��~�u�d��^����P����!�A�t��a�k���3���Yqg?�g��h�XQ��)�D�������_q�R7}"�^9����!1*�=���!�v,8l����E��B3��hV�J�����s�l�]�b<n��'�|��p�*�g?�`���}�k�w���!�5�P�
%��h��S9B����xj��{���=�_U����YtB���k�j���S�{}AI���������8�D]	%���3�rA
"��l����X5�K;}�CE�|�!bZ������c�P������������:�m'���BV��(&^&r3�Kq�f���W�&�]��Q�R�
�*��Y���+4�%�7�CC�MGhK������{6�/�����t>!^�C�+.)���t����x'#x��l��%����a9cS�������G������"s����
��:���j�������A���WJ%��URZ�&�y���F��������|s=U�Oq���9�M���C(��
����zz�]K4�RK���� �Ls�EpcZ#l��0�P�m)�m�uV���9��V��E���76��;%��z��]�~��X
���l?R8�`����g-�iM������u�U��4AEv{�%�?I,mc�I/�v��e���g�*#��S�!�b��s�������9H���,ZL�����j��Jc�MV<�X���"f0��0B�����G7��J0��|��y)cN�y�����S*'�i0�#��P��r��`���PH*�p,���-b���(p:}�� ���F����?�.�y+��Hc��4����������7Q���O�?�J���^D������E�.[������c(�.��`g	���t����*�p�Z�bR��? ������F��e�]R�{;�8i�5TE
�U|���<�M�IM!��Q����}qZ��+����Gks^���G��#6,Y�1WG��������LW�Cb8l=N�D��1��n������P���OV'!��^H�2j���y3��$�|c�������uHV�&��
���I�*�}��
~3
�����|,!��!(�E;�������K���p����;��!�1�rI�i�2V ��|�$��D�����{E�jr7V4�����\�b~�l:������`hX����]��xVD^.���.�8�U^�7~i��*]�~��_^�������������Is������6
��X%��3�	��Qp
����FB)�|��7�!P^l�H�E������ZR
��d����0OZ���}�BE8+e�����d������qi����yq�A?���a�9����b��<K"O��x�`u��S�c������hY�9W��jF��%N��9����I��d��}|��F��Es��DS4���h�y�Tv4�8u�[P�QR��������)A9
��������J9Y��H�?N��-���'�F��N��q�4��b��$
���<E<��C�!��W:[?��1?�'��������9�'I��W�N��q����q�L��!��O��=J�j|��QRU����y%Vr���m����j��������W����������{�.��om}M�kx��'�����p����`�q��Z�������	���h�A~����W����y/^��BB����:����T�P������81������R4�Q�
�/��X�����g^J7�w�9����b�=yhO� �������t�2���9I��	u���'�V8<X���r�Q���������<�������\k�H-$�����j�u��=I@V�<�
�64����X|���bx�]�9�c������Y�'lco���rM�.�����X�n���2'�w���W�����p��!���G��q�������F�N��7��F�����g�|x����&x�v)xh�W�yD����<�������M�|W�[9�C#��<���J]����G��FG��������$P�$�&���\'���UO5Q��7��f��!q&�@j���Y24�ll`o�yA��YE����fl�GU�+��L'<=�hlq�;+��l�w` ���=��N��yN�:F��0t2��Z����_�y�����u%�/�'h9�
�<�n'T�pA�$����1S���y1S%�%��R<G1��{��
�#y���"g����0~�E�����=v}�	�"]~1����}
v�z�'�Y�DC}�AX{���]�����*c���/���x���(���"."��f]��^�-����?����Q
�j��.��+�H����e"Z�pvA���L��6d=;Z��v{��Ug������
O���b��0��-���"�i2+���]X[P
f��&E�������S�5q�����|�V���d�;Pk�`*)���������|�]���4�xG��c�S4�������pt�GS2�4~�
�����G3k+��x*�`�����'�kL���CX�+^�����m:�wP���X&)L�L\�@�{�����~T����,�%�2�8��M{*��k_�o�-�V����J�3�iGm��V]���Y�in�U�3�pGM���9�����8t����h{��\l��
�I��De2�#9{�����iv��'������6�Yg9,���KE�#��-�[�j��Jxg��?`����)m�@XS���f�y4�V��xh0�MF�G)2'4-]���	3�_�R�����UG=�9<z�u���`6��>�9+�������#4i��Mj��A%�����������~�
���>����s~�'!(
Vis������2"��?�0�/f��!�-�����z)`C�y7��X�����w��N��P�8������OQE-�vP���D>k �R��h�s`���Y0�9�ww���v��Pt���8�t���y%���$�;<�N��%�,�I�3���K�������������U�Q'73�@���H���+
����-�?��'e22����������4X=����;K`�������t}���kH��aQ��4��
qR�)��p�:�%���MgR��/e���I������V����h����U��=9�05*�]������]��X���\�J������,�vE��5?���K_�����o'T)���QL�`Y}���!��lb|Oo5r��!�h���D�pG��N�G,	��!g�)�IC�8�. ����kMJJ�j�b����)����!wz�tei4W7��r�R������U���jh���g�x�����*��/L��*�|�.K��P��'���&:L�p�������+���gV�F�b��w~N!^��c�����Tt�-��V�T���r5�b"l �F
+��s�
�<���:G����lwV�V(�r��/�j��;��Kwx�4���Q����L=�A��������[?�
o
���G�����,\��n��S}�K"���X�`��p�s�>��,�'rH�Y��9L���������;�S�h����t�t��N|X2~�����(�y9����J1KG�x,_�Y~��������	~i^��9����_L��]��T����D�3q��<�*�1�w���}�1�k��Mza�q�O�=[����U�qBV:� +�)�qc36anK@��P���[vA0����_����-�x����^�?%:����<���_�'��+���i�=�`�?�N�J���_����"���A��d!�j�H'�o���x���\��-I���2��k���%�oJ6W2���������B]����_���c����Y���R�����3�������Ru!��!�K����t��/WQF���y4�����2�B[T����~
X���Ow/��0�L��0�1�9��ng]T{?IIO�'�������J��UPX^�� i+�� �@ �t�n���U����Q[>\�d��l��'����|��B�	�b��O�v�t�u�7�48���/����bn�?��]����5,6p�w�����J�����E�4d�����W�x��S/�q}��:e��9��i�����_8���~���V�S���j�i���jW�"7$]��k0z
��I7��}�����*��_�����p���i�z�
3��<�����h~�r�i�O��O���9����64_@��1C���++��~�m��<;^���h8)�I�k���RM
a�c�E0�{=�����I��Ti������A�4�W����+n�����gZ]����~S���_W��y42?G��������^��V�y�1���S7���T�	;�����)��*�%����n�h��
b��k��z��ou~�w:�r/O;M����v�M�_?;����)���[��j��Y��*xzxr���q��n��d�O�hk��m6:G'P�uj]�������nU�����O��I��f�q����i�6}�&��d�K�t���Ka��Y~�u:����Z��X�6]�m�f�����
���b����(��}v����m���5����a@c�p8�l�t8�Z�����5����������!��j&�T��|L������v4�������5�e�G�e��<�emV��(�n���F�O|��6v{�W�# 
�=y�]��jE������bmd�Wg�Y��L��uq��:�fWA�B�"�I0Q	FYJ���E�BCV��MYO���&�Xa[��$��m�D�/���g��|3N�[US#f2,��#�
lfF�&(�B����t�,l��X�J�����{&k���G�n	z!>��5�<H>��!;�V8����%f����w���'t��]b�U�y�@��y�)��F�����������Z�SC�p7�������X6z���.�#bFT�E�
i��(L@]���Lq(m���W#���u��a�����'_���������O�V��o�$|	|��H��k�C��t"�J/���C0����9���z&�A��rWm��U_������������}�9j���::NQpZ����pR�0@j����7�j.��y�s��L�~�����H���������kj��=0�U��z��N�`�r��w�����
4O��fAw;�%������i�0����a�������E���j�;�WR�Z��|k�H�<G/�8����7)��VL�f9��� 6bd`n�x�rQZxL��M�I����+�0��'�M�=��M����4�D��G>C�f����TB��4�lS�����p������e���	m�vA���5b��K7��n6��:l����>n6x�(����w*O�&�7IC)	��Nx&�����axm���LB���1��/9�A���i���2-��gI�&%U4�$�%��5��'�N���P�G�
�S���tD�;�q���Q������v����!���Z(��f�80>�Q�"B�P�J�N��i>���#��t��aN1�n�g�8h�Z>����RZ
&�7��"Z!���v�T�)V1l�
@�p6@�<D�%X(�5�U�1�RC.�������p���
m���m�l�2�ZE�ZY;�B-���7�Zj���,k��U��U��*c^�1��vE5�x��dA�kE��[��I������X� �v������t�?��c��%�n�s�Fr,�2���G��
��8^��d��gf~�W�����Y�D3�`f|�i"�p��RI:i�Gv�c;�NyN*.p�/*�����'����ETX6��4��b�t��k�s������@�o2G/�������(��o�?<}:�=
��'K�p=�7D�=���=6��G��(��xe�Q%G��MX���������A���|��X*pD_.����)j��n$Q����B����z�bH�N�;�����uDiV�p�J�a:*�g�'������CO�|����)k�Q?,�i�����Y"��]fU�$�����k����������s�g`�2AP,���DK�c�������E �����;c�cI����M*��H��F$�-��nm��xLOq����"R*/�`� ��
����
����p=_	@0E6Q+����`���r�2�KRAY��U2�I����t%�a},�����X�[��hl�^[��4]5���7�������������L$8&��6�={
��m<-N.�������k�^��r����re�~t���"��r�����0y6�<;����gzVe&�S�9��������^d����Pk��a���a)����2����"�?B������n�ix�R������G��J����l��U(���l����7�$����|� �M����������%��Y4
��-D0q�g�:r��0�X�;cQ�l�.��B�U=p1s�y���%�_y<��L	U�V����=*���a�(�O��������������gkD���7L�<'���b��X��*��f�&�h?t�h���v�oJ���a��srIKN��DS5��b�C"�b�u�I9�S���mn�����f�f��!����xh� DD5�%��['��L���^Q���������UO�UZ�xR�>�
C��_*nF��11�MI���(�T��=���Kk8���\��	L��`�i?�����R�2=|���.�\t�A@T�4��o:#��LM~ T�I�����1�����%#�u������Z'jt S,@9p�y^/#��x����s�	s��#G��z#hEz5Hl����V���O��a�������u{�u�3@�BZ�M��	����[�(S��
������/\� ����[��R���>l|��z�g�����Q�c%+.n���z+���9-�H5��r�`�L/L?9%.k&����x>C���Zrp��<������5�h��iH�h�]o�?k���5-L\����^������c�J�,�[4��Q�S��aie ��l�!���%��������w-`���?��%����z����3�dB�t�)kc��D�J9A�R�q|�[9R�&q���(E������>y>�>	�Oo����G���������x���U�|���������bF������3���B�����������	]��O	�?/������O�k��
�C�z�����J������������A��;�����	�A�j@���?&��A�Nr��p@���R�������a�^C�����[�T\ ���rZ���r�FR
MzN��{����I�5�>������P���G��_?�ji!�������hn����H"�%u����|����o��)-��7���Ly�C|���s�l��H��}�����������m0�i!��������:��Y=����HL�iP}������z���=�$�W�Nf�����^��(1'2�
y�&V��TcT%z�.q�#xE�����u��^�%X�!�T� D�%)���W�5q�W54�~�
}[����O�AOL��>�����1����\-f����v������7��uO��H7F�\|=� ����K�S�M"�[��yK4����^n�k�m����]�����������+%��.�Nb��;���\J��������y��y���G�c���}��?xy�O�m����s/%�C�f�'T��r����6���7�sWv<LpA�Y���oA�'��u{N�o@�2��)�x������A �!�=	Y��5a�?����-��)jXh�J����9�\z�@�5��%^��!vpJvXRy/�w�sg��a������k�����xyf4��6��Lm��<�<{��dk�z���zO���%
�f�h�k���F�5�CQ���i���G��`L(���U��L\4J 5�^�2���%�J��=�i���0-�b��@�1D�����c���L�|IA���H#(�d���h�m����Z��.�m��I����d1U�D	�da����X�3��lW�Q<�UX��9���e�j�3M�=��=q\�QH�W���pa�����)�OB�qLb�4H�j�`1����AW�I��\D���Q-��Ef�uaz��;6���'q����P�'��^���!]�83����)@����bL���W����e�)]4�F�}��K�IWF��G}�F�y��v��=kW�V��������,��s�_pf��������F�fcVdGa�.�p��b:��IWo�����e4�9���)Q�w�B�+������|]]��'�|m�����x�,k0uh��*��B��>bj�3�������'O���Z�v#�����x����t�k���(�QY��?s3��1�������P��k���n8n��6i����G�9��z���9au��������f�����o�����������������YKw�;
��8��k�@{|��2��SE�he��Bo�m�y���=���*i������ �D��2P��r�����Z�{��-�n���|�X{�*��r2��
���_���h-��hPcw�Q$W6��L����4� �2�[#T��:�����E0bw�a�^�6~�&��/�u���{}U�������qG9O
�Et;=���s)��c������h�������	����Q�K�hy�A��^���i5��MlSaF8F�����d�r���k���L�j���B;�6Os�������O���s���p��w���I��strSn@j�e7,�-6�������o$�cWx4V�oDh)`w�M��A���N^��3�#�Y��
G<arB�kb&��Gr>��s�
T���;e7��=�� ��������|$Jj>�}E�������f�L�p�T"$X�](��;�����KD!������L!��b��(�+����uq^�����X�o?�G�E�!��0�m��oA�Xu�� ���b�����o������8�����sH��*
K��������p�nF}!�{a� *����0�^���\Q^�.���1#2�� w�=L&`�,3v|%�
K��%]\z[�L�N�y\�@��{�H���
(�����G=�@4.jt���e������%�_l{�-�p&�C���l�,`w^L��m�i{n^n�����G�� L-���J��<�2�+����-#�IP��|b(�A�>��A#\^����-D�|���@,4>v���^��
*����%���%�j�������HktH�)����x�+Bi�t�&'t����)Q?o���k������S���Z~�]�(�%������^�r$=v��L���]F qS�"�v�M���L��,�!��4�����l��~+��R��h��^'��X"�����\��6�x��������Q����{�M�at������v��8O�G���I��I�D��I����o�����V��'�Y�:�}}p'p�4�$�l��H��D��v#�>�fRI�P�-i1��D��G��u ������W	�/����eI���L*��U����~/���vm#����+����B<�>��l�F�a��sLG�_�Zd[���5�-hU�����D�C�a�����$
<g��a_�����o��&������DU^e}=��:$R*,�!�*A�Fg��c��
`�p��j��:�[K�P%�O�+�y"��L���� jE��O
��	��m�����;9�e��CR^��fRe2��J
%J'9������%*��j��e������������k.��ECNa]�p.^��(���e�`?�"$����g�,:�x�g�{��I;��[�Z
�1�.�Z�����[��T;�P��}V��3�[�P�F���|_R��������`�����o����tC-o0M��R^�b�F��m���`B�BB�>c�~�H]��"(4@�$��.e�g2�<����[o)_�l����}�/x��SPS���(���K��$+��e�^�l3n/@�!�x�%�.��"�|�"��e[5W)!�Z7��l#������N{��x�%���w�uT9���h�}�(|�h����tb��L�����]��z�D����m�U�PJ�4��������%�!n�����������F1�W��&$��~���>����:>^?�.��<�m�}N�V�(������b�D�
���T�	��3�/��h*�j`"mi|,-i���6	Kk$���$�g]�HE1 ����P SW�2!4nj�/��{�?z�����t)6
���J\f��p�]���m�T�����q�����j��b�"�[FC<]�%S�6��������IA�&d��pk���>�z�������M��6�:���j�z��}_�/�!,;��1����8�Eq�NS�#�I���i��Pl,�[�n:�P��5;2��v\�;aW��B�VE�"�L5������t-����A���D���[=x6��D*U��*sZ���7���k9������>h��P�cI�$(��F���h�:>t$��`Vg�O��P~MLo+�pS��q�/���)
3UED���Hq)����z��c8��>��`�B�e%ev����4 M��$7�$�p&W5�xS��JgN!����p�
`N��T&�t��DLv-���.Z0Mm��R�E�
U��m�
L7*��&W������T�EhQ�0:e;�7��Y���'�t��v9�e��V�������t�n��.Q�~57!�Szo����Oh��Cw}6�j��^���\�R���r� U�4���j\;��n�KeUR����R��.O'��_W�|��}��@_���X�8���>p�)�*\��q�Jv����������)3���t�~�q����R3M5E��+�����xn?��.B���9d4�p6��Ae��RY�]���>�}�y�z)��K��U]�j2�g���/U}��P�N|�����(2GO>{��
�X%��l�L�zg��V6���I0��p�����7���U��g~�h��O������p��;�
�k7�$����Y�U�o�
?����n=}t��
������'���sb�&vh;,o6�X3�?�Ig��U��Y0M��$�z2zO�`k���&CM���l~�S��������gt�l$�CR/d�����I��!2�g��^���9�\�W�x����P�T�~�b�yMB���QW�*�]�4`D��>c��R�D��;V��f������W�S�����V�
����q<e��G�&�����Y#����iwn���&���iH�@U`���Hu��e�
�>M?�A �gNj�\Sv�X8N.|X������'����tt����gG�������K��07�xnKK���|�Y���Q�����;��a+x������
.�{�
v9-0017-meson-ci-Build-both-with-meson-and-as-before.patch.gzapplication/x-patch-gzipDownload
#202Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#201)
Re: [RFC] building postgres with meson -v9

vcvarsall isn't needed in cirrus' "check_world" scripts.

I'm missing any way to re/run cirrus only for msbuild OR ninja OR homegrown
with something more granular than "ci-os-only: windows". (The same thing
applies to the mingw patch).

I'll mail shortly about ccache.

--
Justin

#203Andres Freund
andres@anarazel.de
In reply to: Justin Pryzby (#202)
Re: [RFC] building postgres with meson -v9

Hi,

On 2022-07-01 14:01:11 -0500, Justin Pryzby wrote:

vcvarsall isn't needed in cirrus' "check_world" scripts.

E.g. for the ecpg tests it isn't, except that we don't currently build ecpg on
windows. But I plan to fix that.

I'm missing any way to re/run cirrus only for msbuild OR ninja OR homegrown
with something more granular than "ci-os-only: windows". (The same thing
applies to the mingw patch).

Not sure that's really worth adding - I don't forsee merging all those
tasks. But I'm open to proposals.

I'll mail shortly about ccache.

There's a meson PR that should fix some of the issues, need to test it...

Greetings,

Andres Freund

#204Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#201)
Re: [RFC] building postgres with meson -v9

On 01.07.22 11:33, Andres Freund wrote:

Attached is an updated version of the meson patchset. There has been a steady
stream of incremental work over the last month, with patches from Peter
Eisentraut and Nazir Yavuz.

I tried to address the review comments Peter had downthread about the prep
patches. The one that I know is still outstanding is that there's still
different ways of passing output directories as parameters to a bunch of
scripts added, will resolve that next (some have been fixed).

Here is my rough assessment of where we are with this patch set:

08b4330ded prereq: deal with \ paths in basebackup_to_shell tests.

This still needs clarification, per my previous review.

3bf5b317d5 meson: prereq: Specify output directory for psql sql help script.
2e5ed807f8 meson: prereq: ecpg: add and use output directory argument
for parse.pl.
4e7fab01c5 meson: prereq: msvc: explicit output file for pgflex.pl
cdcd3da4c4 meson: prereq: add output path arg in generate-lwlocknames.pl
1f655486e4 meson: prereq: generate-errcodes.pl: accept output file
e834c48758 meson: prereq: unicode: allow to specify output directory.

You said you are still finalizing these. I think we can move ahead with
these once that is done.

9f4a9b1749 meson: prereq: move snowball_create.sql creation into perl file.

This looks ready, except I think it needs to be hooked into the
distprep target, since it's now a Perl script running at build time.

8951a6721e meson: prereq: Refactor dtrace postprocessing make rules

This looks ready.

bda6a45bae meson: prereq: Refactor PG_TEST_EXTRA logic in autoconf build

I understand the intention behind this, but I think it changes the
behavior in an undesirable way. Before this patch, you can go into
src/test/ssl/ and run make check manually. This was indeed the only
way to do it before PG_TEST_EXTRA. With this patch, this would now
skip all the tests unless you set PG_TEST_EXTRA, even if you run the
specific test directly.

I think this needs a different idea.

eb852cc023 meson: prereq: Can we get away with not export-all'ing libraries?

This is also at <https://commitfest.postgresql.org/38/3396/&gt;, which
hasn't seen any activity in a while. I think this needs a resolution
one way or the other before we can proceed to the main act.

2cc276ced6 meson: prereq: add src/tools/gen_versioning_script.pl.

Note that in the make build system we can only use perl before
distprep. So it's not clear whether a script like this would help
unify the code. Of course, we could still use it with the
understanding that it will be separate.

351ac51a89 meson: prereq: remove LLVM_CONFIG from Makefile.global.in

This can be committed. AFAICT, LLVM_CONFIG is only used within
configure.

dff7b5a960 meson: prereq: regress: allow to specify director containing
expected files.

This could use a bit more explanation, but it doesn't look
controversial so far.

243f99da38 wip: split TESTDIR into two.

This one has already caused a bit of confusion, but the explanation at

/messages/by-id/20220601211112.td2ato4wjqf7afnv@alap3.anarazel.de

seems reasonable. But it clearly needs further work.

88dd280835 meson: Add meson based buildsystem.
1ee3073a3c meson: ci: Build both with meson and as before.

These are for later. ;-)

In the meantime, also of interest to this effort:

- If we're planning to remove the postmaster symlink in PG16, maybe we
should start a discussion on that.

- This patch is for unifying the list of languages in NLS, as
previously discussed: https://commitfest.postgresql.org/38/3737/

#205Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#204)
Re: [RFC] building postgres with meson -v9

Hi

On 2022-07-06 11:03:31 +0200, Peter Eisentraut wrote:

On 01.07.22 11:33, Andres Freund wrote:

Attached is an updated version of the meson patchset. There has been a steady
stream of incremental work over the last month, with patches from Peter
Eisentraut and Nazir Yavuz.

I tried to address the review comments Peter had downthread about the prep
patches. The one that I know is still outstanding is that there's still
different ways of passing output directories as parameters to a bunch of
scripts added, will resolve that next (some have been fixed).

Here is my rough assessment of where we are with this patch set:

08b4330ded prereq: deal with \ paths in basebackup_to_shell tests.

This still needs clarification, per my previous review.

Hm. I thought I had explained that bit, but apparently not. Well, it's pretty
simple - without this, the test fail on windows for me, as soon as one of the
binaries is in a directory with spaces (which is common on windows). Iimagine
what happens with e.g.
qq{$gzip --fast > "$escaped_backup_path\\\\%f.gz"}
if $gzip contains spaces.

This doesn't happen currently on CI because nothing runs these tests on
windows yet.

bda6a45bae meson: prereq: Refactor PG_TEST_EXTRA logic in autoconf build

I understand the intention behind this, but I think it changes the
behavior in an undesirable way. Before this patch, you can go into
src/test/ssl/ and run make check manually. This was indeed the only
way to do it before PG_TEST_EXTRA. With this patch, this would now
skip all the tests unless you set PG_TEST_EXTRA, even if you run the
specific test directly.

It's not a free lunch, I agree. But I think the downsides outweigh the upsides
by far. Not seeing that tests were skipped in the test output is quite
problematic imo. And with meson's testrunner we're going to need something
that deals with skipping these tests - and it's more important to have them
skipped, so that they show up in the test summary.

It's not like it's hard to set PG_TEST_EXTRA for a single command invocation?

243f99da38 wip: split TESTDIR into two.

This one has already caused a bit of confusion, but the explanation at

/messages/by-id/20220601211112.td2ato4wjqf7afnv@alap3.anarazel.de

seems reasonable. But it clearly needs further work.

Yea. I kind of want to get some of the preparatory stuff out of the way first.

88dd280835 meson: Add meson based buildsystem.
1ee3073a3c meson: ci: Build both with meson and as before.

These are for later. ;-)

In the meantime, also of interest to this effort:

- If we're planning to remove the postmaster symlink in PG16, maybe we
should start a discussion on that.

Yea.

- This patch is for unifying the list of languages in NLS, as
previously discussed: https://commitfest.postgresql.org/38/3737/

There seems little downside to doing so, so ...

Greetings,

Andres Freund

#206Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#205)
Re: [RFC] building postgres with meson -v9

On 06.07.22 15:21, Andres Freund wrote:

Here is my rough assessment of where we are with this patch set:

08b4330ded prereq: deal with \ paths in basebackup_to_shell tests.

This still needs clarification, per my previous review.

Hm. I thought I had explained that bit, but apparently not. Well, it's pretty
simple - without this, the test fail on windows for me, as soon as one of the
binaries is in a directory with spaces (which is common on windows). Iimagine
what happens with e.g.
qq{$gzip --fast > "$escaped_backup_path\\\\%f.gz"}
if $gzip contains spaces.

This doesn't happen currently on CI because nothing runs these tests on
windows yet.

Hmm, maybe this patch looked different the last time I saw it. I see
your point.

The quoting of "$gzip" is clearly necessary.

What about the backslash replacements s{\\}{/}g ? Is that also required
for passing the path through the shell? If so, the treatment of $tar in
that way doesn't seem necessary, since that doesn't get called through
an intermediate shell. (That would then also explain why $gzip in the
pg_basebackup tests doesn't require that treatment, which had previously
confused me.)

If my understanding of this is correct, then I suggest:

1. Add a comment to the $gzip =~ s{\\}{/}g ... line.
2. Remove the $tar =~ s{\\}{/}g ... line.
3. Backpatch to PG15.

#207Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#205)
Re: [RFC] building postgres with meson -v9

On 06.07.22 15:21, Andres Freund wrote:

- This patch is for unifying the list of languages in NLS, as
previously discussed:https://commitfest.postgresql.org/38/3737/

There seems little downside to doing so, so ...

This has been committed, so on the next rebase, the languages arguments
can be removed from the i18n.gettext() calls.

#208Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#205)
Re: [RFC] building postgres with meson -v9

On 06.07.22 15:21, Andres Freund wrote:

bda6a45bae meson: prereq: Refactor PG_TEST_EXTRA logic in autoconf build

I understand the intention behind this, but I think it changes the
behavior in an undesirable way. Before this patch, you can go into
src/test/ssl/ and run make check manually. This was indeed the only
way to do it before PG_TEST_EXTRA. With this patch, this would now
skip all the tests unless you set PG_TEST_EXTRA, even if you run the
specific test directly.

It's not a free lunch, I agree. But I think the downsides outweigh the upsides
by far. Not seeing that tests were skipped in the test output is quite
problematic imo. And with meson's testrunner we're going to need something
that deals with skipping these tests - and it's more important to have them
skipped, so that they show up in the test summary.

It's not like it's hard to set PG_TEST_EXTRA for a single command invocation?

It's probably ok. I have it set in my environment all the time anyway,
so it wouldn't affect me. But it's the sort of thing people might be
particular about, so I thought it was worth pointing out.

#209Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#206)
Re: [RFC] building postgres with meson -v9

Hi,

On 2022-07-07 12:09:32 +0200, Peter Eisentraut wrote:

On 06.07.22 15:21, Andres Freund wrote:

Here is my rough assessment of where we are with this patch set:

08b4330ded prereq: deal with \ paths in basebackup_to_shell tests.

This still needs clarification, per my previous review.

Hm. I thought I had explained that bit, but apparently not. Well, it's pretty
simple - without this, the test fail on windows for me, as soon as one of the
binaries is in a directory with spaces (which is common on windows). Iimagine
what happens with e.g.
qq{$gzip --fast > "$escaped_backup_path\\\\%f.gz"}
if $gzip contains spaces.

This doesn't happen currently on CI because nothing runs these tests on
windows yet.

Hmm, maybe this patch looked different the last time I saw it.

Don't think it had changed since I wrote it first.

The quoting of "$gzip" is clearly necessary.

What about the backslash replacements s{\\}{/}g ? Is that also required for
passing the path through the shell?

I don't recall the details, but it's definitely needed for embedding it into
postgresql.conf. We could double the escapes instead, but that doesn't seem an
improvement (and wouldn't work when passing it to the shell anymore).

If so, the treatment of $tar in that
way doesn't seem necessary, since that doesn't get called through an
intermediate shell. (That would then also explain why $gzip in the
pg_basebackup tests doesn't require that treatment, which had previously
confused me.)

Yea, it doesn't immediately look like it's needed, and the test passes without
it. I guess I might just have tried to be complete...

Greetings,

Andres Freund

#210Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
16 attachment(s)
Re: [RFC] building postgres with meson - v10

Hi,

Attached is v10 of the meson patchset. Lots of small changes, I don't think
anything major. I tried to address most of Peter's feedback for the earlier
patches.

After this I plan to clean up the "export" patch, since that's I think the
next bigger step, and an improvement on its own. The step after will be to
discuss where we want the output of tests to reside, whether the naming scheme
for tests is good etc.

I did try to address Peter's criticism around inconsistency of the added
parameters to perl scripts. I hope it's more consistent now. I used the
opportunity to make src/tools/msvc use the "output directory" parameters,
providing coverage for those paths (and removing a few unnecessary chdirs, but
...).

Greetings,

Andres Freund

Attachments:

v10-0001-prereq-Deal-with-paths-containing-and-spaces-in-.patchtext/x-diff; charset=us-asciiDownload
From a1c5542929ffec296982d4f4034c05ed5bf4ba55 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Apr 2022 13:46:54 -0700
Subject: [PATCH v10 01/16] prereq: Deal with paths containing \ and spaces in
 basebackup_to_shell tests

---
 contrib/basebackup_to_shell/t/001_basic.pl | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/contrib/basebackup_to_shell/t/001_basic.pl b/contrib/basebackup_to_shell/t/001_basic.pl
index acb66eb9a84..5eb96090a8a 100644
--- a/contrib/basebackup_to_shell/t/001_basic.pl
+++ b/contrib/basebackup_to_shell/t/001_basic.pl
@@ -16,6 +16,9 @@ if (!defined $gzip || $gzip eq '')
 	plan skip_all => 'gzip not available';
 }
 
+# to ensure path can be embedded in postgresql.conf
+$gzip =~ s{\\}{/}g if ($PostgreSQL::Test::Utils::windows_os);
+
 my $node = PostgreSQL::Test::Cluster->new('primary');
 
 # Make sure pg_hba.conf is set up to allow connections from backupuser.
@@ -53,8 +56,8 @@ $escaped_backup_path =~ s{\\}{\\\\}g
   if ($PostgreSQL::Test::Utils::windows_os);
 my $shell_command =
   $PostgreSQL::Test::Utils::windows_os
-  ? qq{$gzip --fast > "$escaped_backup_path\\\\%f.gz"}
-  : qq{$gzip --fast > "$escaped_backup_path/%f.gz"};
+  ? qq{"$gzip" --fast > "$escaped_backup_path\\\\%f.gz"}
+  : qq{"$gzip" --fast > "$escaped_backup_path/%f.gz"};
 $node->append_conf('postgresql.conf',
 	"basebackup_to_shell.command='$shell_command'");
 $node->reload();
@@ -74,8 +77,8 @@ $node->command_fails_like(
 # Reconfigure to restrict access and require a detail.
 $shell_command =
   $PostgreSQL::Test::Utils::windows_os
-  ? qq{$gzip --fast > "$escaped_backup_path\\\\%d.%f.gz"}
-  : qq{$gzip --fast > "$escaped_backup_path/%d.%f.gz"};
+  ? qq{"$gzip" --fast > "$escaped_backup_path\\\\%d.%f.gz"}
+  : qq{"$gzip" --fast > "$escaped_backup_path/%d.%f.gz"};
 $node->append_conf('postgresql.conf',
 	"basebackup_to_shell.command='$shell_command'");
 $node->append_conf('postgresql.conf',
-- 
2.37.0.3.g30cc8d0f14

v10-0002-meson-prereq-psql-Output-dir-and-dependency-gene.patchtext/x-diff; charset=us-asciiDownload
From e37951875d0a92d473df61930c3517d5d5fa32ee Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 14 Jul 2022 08:37:16 -0700
Subject: [PATCH v10 02/16] meson: prereq: psql: Output dir and dependency
 generation for sql_help

---
 src/bin/psql/Makefile       |  2 +-
 src/bin/psql/create_help.pl | 44 ++++++++++++++++++++++++-------------
 src/tools/msvc/Solution.pm  |  5 ++---
 3 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile
index 58ec4a89b49..d38775af467 100644
--- a/src/bin/psql/Makefile
+++ b/src/bin/psql/Makefile
@@ -56,7 +56,7 @@ sql_help.c: sql_help.h
 	touch $@
 
 sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml)
-	$(PERL) $< $(REFDOCDIR) $*
+	$(PERL) $< --docdir $(REFDOCDIR) --basename $*
 
 psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
 psqlscanslash.c: FLEX_NO_BACKUP=yes
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
index 1a9836cbcc0..ba9a49cff04 100644
--- a/src/bin/psql/create_help.pl
+++ b/src/bin/psql/create_help.pl
@@ -21,21 +21,24 @@
 
 use strict;
 use warnings;
+use Getopt::Long;
 
-my $docdir = $ARGV[0] or die "$0: missing required argument: docdir\n";
-my $hfile = $ARGV[1] . '.h'
-  or die "$0: missing required argument: output file\n";
-my $cfile = $ARGV[1] . '.c';
+my $docdir        = '';
+my $outdir        = '.';
+my $depfile       = '';
+my $hfilebasename = '';
 
-my $hfilebasename;
-if ($hfile =~ m!.*/([^/]+)$!)
-{
-	$hfilebasename = $1;
-}
-else
-{
-	$hfilebasename = $hfile;
-}
+GetOptions(
+	'docdir=s'   => \$docdir,
+	'outdir=s'   => \$outdir,
+	'basename=s' => \$hfilebasename,
+	'depfile=s'  => \$depfile,) or die "$0: wrong arguments";
+
+$docdir        or die "$0: missing required argument: docdir\n";
+$hfilebasename or die "$0: missing required argument: basename\n";
+
+my $hfile = $hfilebasename . '.h';
+my $cfile = $hfilebasename . '.c';
 
 my $define = $hfilebasename;
 $define =~ tr/a-z/A-Z/;
@@ -43,11 +46,18 @@ $define =~ s/\W/_/g;
 
 opendir(DIR, $docdir)
   or die "$0: could not open documentation source dir '$docdir': $!\n";
-open(my $hfile_handle, '>', $hfile)
+open(my $hfile_handle, '>', "$outdir/$hfile")
   or die "$0: could not open output file '$hfile': $!\n";
-open(my $cfile_handle, '>', $cfile)
+open(my $cfile_handle, '>', "$outdir/$cfile")
   or die "$0: could not open output file '$cfile': $!\n";
 
+my $depfile_handle;
+if ($depfile)
+{
+	open($depfile_handle, '>', $depfile)
+	  or die "$0: could not open output file '$depfile': $!\n";
+}
+
 print $hfile_handle "/*
  * *** Do not change this file by hand. It is automatically
  * *** generated from the DocBook documentation.
@@ -98,6 +108,9 @@ foreach my $file (sort readdir DIR)
 	my ($cmdid, @cmdnames, $cmddesc, $cmdsynopsis);
 	$file =~ /\.sgml$/ or next;
 
+	print $depfile_handle "$outdir/$cfile $outdir/$hfile: $docdir/$file\n"
+	  if ($depfile);
+
 	open(my $fh, '<', "$docdir/$file") or next;
 	my $filecontent = join('', <$fh>);
 	close $fh;
@@ -216,4 +229,5 @@ print $hfile_handle "
 
 close $cfile_handle;
 close $hfile_handle;
+close $depfile_handle if ($depfile);
 closedir DIR;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index fa32dc371dc..37bd5c0db69 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -691,9 +691,8 @@ sub GenerateFiles
 	if (IsNewer('src/bin/psql/sql_help.h', 'src/bin/psql/create_help.pl'))
 	{
 		print "Generating sql_help.h...\n";
-		chdir('src/bin/psql');
-		system("perl create_help.pl ../../../doc/src/sgml/ref sql_help");
-		chdir('../../..');
+		my $psql = 'src/bin/psql';
+		system("perl $psql/create_help.pl --docdir doc/src/sgml/ref --outdir $psql --basename sql_help");
 	}
 
 	if (IsNewer('src/common/kwlist_d.h', 'src/include/parser/kwlist.h'))
-- 
2.37.0.3.g30cc8d0f14

v10-0003-meson-prereq-ecpg-Add-and-use-output-directory-a.patchtext/x-diff; charset=us-asciiDownload
From 18cc9fbd02e0bdbd788b5485341d2470b16aac00 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 29 Jun 2022 10:47:45 -0700
Subject: [PATCH v10 03/16] meson: prereq: ecpg: Add and use output directory
 argument for preproc/*.pl

---
 src/interfaces/ecpg/preproc/Makefile       |  4 +--
 src/interfaces/ecpg/preproc/check_rules.pl | 24 ++++++++++++-----
 src/interfaces/ecpg/preproc/parse.pl       | 31 +++++++++++++++-------
 src/tools/msvc/Solution.pm                 |  5 ++--
 4 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index ef6d645dee1..ec2359810e5 100644
--- a/src/interfaces/ecpg/preproc/Makefile
+++ b/src/interfaces/ecpg/preproc/Makefile
@@ -65,8 +65,8 @@ preproc.h: preproc.c
 preproc.c: BISONFLAGS += -d
 
 preproc.y: ../../../backend/parser/gram.y parse.pl ecpg.addons ecpg.header ecpg.tokens ecpg.trailer ecpg.type
-	$(PERL) $(srcdir)/parse.pl $(srcdir) < $< > $@
-	$(PERL) $(srcdir)/check_rules.pl $(srcdir) $<
+	$(PERL) $(srcdir)/parse.pl --srcdir $(srcdir) --parser $< --output $@
+	$(PERL) $(srcdir)/check_rules.pl --srcdir $(srcdir) --parser $<
 
 # generate keyword headers
 c_kwlist_d.h: c_kwlist.h $(GEN_KEYWORDLIST_DEPS)
diff --git a/src/interfaces/ecpg/preproc/check_rules.pl b/src/interfaces/ecpg/preproc/check_rules.pl
index 0a3fafc39fa..58a755f454a 100644
--- a/src/interfaces/ecpg/preproc/check_rules.pl
+++ b/src/interfaces/ecpg/preproc/check_rules.pl
@@ -19,16 +19,20 @@
 use strict;
 use warnings;
 no warnings 'uninitialized';
+use Getopt::Long;
 
+my $srcdir  = '.';
+my $parser  = '../../../backend/parser/gram.y';
+my $stamp   = '';
 my $verbose = 0;
-if ($ARGV[0] eq '-v')
-{
-	$verbose = shift;
-}
-my $path   = shift || '.';
-my $parser = shift || '../../../backend/parser/gram.y';
 
-my $filename = $path . "/ecpg.addons";
+GetOptions(
+	'srcdir=s' => \$srcdir,
+	'parser=s' => \$parser,
+	'stamp=s'  => \$stamp,
+	'verbose'  => \$verbose,) or die "wrong arguments";
+
+my $filename = "$srcdir/ecpg.addons";
 if ($verbose)
 {
 	print "parser: $parser\n";
@@ -188,4 +192,10 @@ if ($verbose)
 	print "$cc rules checked\n";
 }
 
+if ($stamp)
+{
+	open my $stampfh, '>', $stamp or die $!;
+	close $stampfh;
+}
+
 exit $ret;
diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl
index 5ec511fd013..a15f563ad45 100644
--- a/src/interfaces/ecpg/preproc/parse.pl
+++ b/src/interfaces/ecpg/preproc/parse.pl
@@ -15,9 +15,20 @@
 use strict;
 use warnings;
 no warnings 'uninitialized';
+use Getopt::Long;
 
-my $path = shift @ARGV;
-$path = "." unless $path;
+my $srcdir  = '.';
+my $outfile = '';
+my $parser  = '';
+
+GetOptions(
+	'srcdir=s' => \$srcdir,
+	'output=s' => \$outfile,
+	'parser=s' => \$parser,) or die "wrong arguments";
+
+# open parser / output file early, to raise errors early
+open(our $parserfh, '<', $parser) or die "could not open parser file $parser";
+open(our $outfh, '>', $outfile) or die "could not open output file $outfile";
 
 my $copymode              = 0;
 my $brace_indent          = 0;
@@ -128,15 +139,17 @@ dump_buffer('tokens');
 dump_buffer('types');
 dump_buffer('ecpgtype');
 dump_buffer('orig_tokens');
-print '%%',                "\n";
-print 'prog: statements;', "\n";
+print $outfh '%%',                "\n";
+print $outfh 'prog: statements;', "\n";
 dump_buffer('rules');
 include_file('trailer', 'ecpg.trailer');
 dump_buffer('trailer');
 
+close($parserfh);
+
 sub main
 {
-  line: while (<>)
+  line: while (<$parserfh>)
 	{
 		if (/ERRCODE_FEATURE_NOT_SUPPORTED/)
 		{
@@ -442,7 +455,7 @@ sub main
 sub include_file
 {
 	my ($buffer, $filename) = @_;
-	my $full = "$path/$filename";
+	my $full = "$srcdir/$filename";
 	open(my $fh, '<', $full) or die;
 	while (<$fh>)
 	{
@@ -498,9 +511,9 @@ sub add_to_buffer
 sub dump_buffer
 {
 	my ($buffer) = @_;
-	print '/* ', $buffer, ' */', "\n";
+	print $outfh '/* ', $buffer, ' */', "\n";
 	my $ref = $buff{$buffer};
-	print @$ref;
+	print $outfh @$ref;
 	return;
 }
 
@@ -652,7 +665,7 @@ sub dump_line
 
 sub preload_addons
 {
-	my $filename = $path . "/ecpg.addons";
+	my $filename = $srcdir . "/ecpg.addons";
 	open(my $fh, '<', $filename) or die;
 
 	# there may be multiple lines starting ECPG: and then multiple lines of code.
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 37bd5c0db69..fcbc1a20772 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -745,9 +745,8 @@ sub GenerateFiles
 			'src/backend/parser/gram.y'))
 	{
 		print "Generating preproc.y...\n";
-		chdir('src/interfaces/ecpg/preproc');
-		system('perl parse.pl < ../../../backend/parser/gram.y > preproc.y');
-		chdir('../../../..');
+		my $ecpg = 'src/interfaces/ecpg';
+		system("perl $ecpg/preproc/parse.pl --srcdir $ecpg/preproc --parser src/backend/parser/gram.y --output $ecpg/preproc/preproc.y");
 	}
 
 	unless (-f "src/port/pg_config_paths.h")
-- 
2.37.0.3.g30cc8d0f14

v10-0004-meson-prereq-Move-snowball_create.sql-creation-i.patchtext/x-diff; charset=us-asciiDownload
From 58a32694e96f6ec55dd10c85c85fded20b69ec9e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v10 04/16] meson: prereq: Move snowball_create.sql creation
 into perl file

Author: Peter Eisentraut <peter@eisentraut.org>
Author: Andres Freund <andres@anarazel.de>
---
 src/backend/snowball/Makefile           | 104 +++++------------
 src/backend/snowball/snowball_create.pl | 148 ++++++++++++++++++++++++
 src/tools/msvc/Install.pm               |  36 +-----
 3 files changed, 178 insertions(+), 110 deletions(-)
 create mode 100644 src/backend/snowball/snowball_create.pl

diff --git a/src/backend/snowball/Makefile b/src/backend/snowball/Makefile
index 50b9199910c..29076371db7 100644
--- a/src/backend/snowball/Makefile
+++ b/src/backend/snowball/Makefile
@@ -72,40 +72,22 @@ OBJS += \
 	stem_UTF_8_turkish.o \
 	stem_UTF_8_yiddish.o
 
-# first column is language name and also name of dictionary for not-all-ASCII
-# words, second is name of dictionary for all-ASCII words
-# Note order dependency: use of some other language as ASCII dictionary
-# must come after creation of that language
-LANGUAGES=  \
-	arabic		arabic		\
-	armenian	armenian	\
-	basque		basque		\
-	catalan		catalan		\
-	danish		danish		\
-	dutch		dutch		\
-	english		english		\
-	finnish		finnish		\
-	french		french		\
-	german		german		\
-	greek		greek		\
-	hindi		english		\
-	hungarian	hungarian	\
-	indonesian	indonesian	\
-	irish		irish		\
-	italian		italian		\
-	lithuanian	lithuanian	\
-	nepali		nepali		\
-	norwegian	norwegian	\
-	portuguese	portuguese	\
-	romanian	romanian	\
-	russian		english		\
-	serbian		serbian		\
-	spanish		spanish		\
-	swedish		swedish		\
-	tamil		tamil		\
-	turkish		turkish		\
-	yiddish		yiddish
-
+stop_files = \
+	danish.stop \
+	dutch.stop \
+	english.stop \
+	finnish.stop \
+	french.stop \
+	german.stop \
+	hungarian.stop \
+	italian.stop \
+	nepali.stop \
+	norwegian.stop \
+	portuguese.stop \
+	russian.stop \
+	spanish.stop \
+	swedish.stop \
+	turkish.stop
 
 SQLSCRIPT= snowball_create.sql
 DICTDIR=tsearch_data
@@ -119,56 +101,24 @@ all: all-shared-lib $(SQLSCRIPT)
 
 include $(top_srcdir)/src/Makefile.shlib
 
-$(SQLSCRIPT): Makefile snowball_func.sql.in snowball.sql.in
-	echo '-- Language-specific snowball dictionaries' > $@
-	cat $(srcdir)/snowball_func.sql.in >> $@
-	@set -e; \
-	set $(LANGUAGES) ; \
-	while [ "$$#" -gt 0 ] ; \
-	do \
-		lang=$$1; shift; \
-		nonascdictname=$$lang; \
-		ascdictname=$$1; shift; \
-		if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \
-			stop=", StopWords=$${lang}" ; \
-		else \
-			stop=""; \
-		fi; \
-		cat $(srcdir)/snowball.sql.in | \
-			sed -e "s#_LANGNAME_#$$lang#g" | \
-			sed -e "s#_DICTNAME_#$${lang}_stem#g" | \
-			sed -e "s#_CFGNAME_#$$lang#g" | \
-			sed -e "s#_ASCDICTNAME_#$${ascdictname}_stem#g" | \
-			sed -e "s#_NONASCDICTNAME_#$${nonascdictname}_stem#g" | \
-			sed -e "s#_STOPWORDS_#$$stop#g" ; \
-	done >> $@
+$(SQLSCRIPT): snowball_create.pl snowball_func.sql.in snowball.sql.in
+	$(PERL) $< --input ${srcdir} --outdir .
+
+distprep: $(SQLSCRIPT)
 
 install: all installdirs install-lib
 	$(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)'
-	@set -e; \
-	set $(LANGUAGES) ; \
-	while [ "$$#" -gt 0 ] ; \
-	do \
-		lang=$$1; shift; shift; \
-		if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \
-			$(INSTALL_DATA) $(srcdir)/stopwords/$${lang}.stop '$(DESTDIR)$(datadir)/$(DICTDIR)' ; \
-		fi \
-	done
+	$(INSTALL_DATA) $(addprefix $(srcdir)/stopwords/,$(stop_files)) '$(DESTDIR)$(datadir)/$(DICTDIR)'
 
 installdirs: installdirs-lib
 	$(MKDIR_P) '$(DESTDIR)$(datadir)' '$(DESTDIR)$(datadir)/$(DICTDIR)'
 
 uninstall: uninstall-lib
 	rm -f '$(DESTDIR)$(datadir)/$(SQLSCRIPT)'
-	@set -e; \
-	set $(LANGUAGES) ; \
-	while [ "$$#" -gt 0 ] ; \
-	do \
-		lang=$$1; shift; shift;  \
-		if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \
-		    rm -f '$(DESTDIR)$(datadir)/$(DICTDIR)/'$${lang}.stop ; \
-		fi \
-	done
+	rm -f $(addprefix '$(DESTDIR)$(datadir)/$(DICTDIR)/',$(stop_files))
 
-clean distclean maintainer-clean: clean-lib
-	rm -f $(OBJS) $(SQLSCRIPT)
+clean distclean: clean-lib
+	rm -f $(OBJS)
+
+maintainer-clean: distclean
+	rm -f $(SQLSCRIPT)
diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl
new file mode 100644
index 00000000000..f4b58ada1cb
--- /dev/null
+++ b/src/backend/snowball/snowball_create.pl
@@ -0,0 +1,148 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $outdir_path = '';
+my $makefile_path = '';
+my $input_path = '';
+my $depfile;
+
+our @languages = qw(
+	arabic
+	armenian
+	basque
+	catalan
+	danish
+	dutch
+	english
+	finnish
+	french
+	german
+	greek
+	hindi
+	hungarian
+	indonesian
+	irish
+	italian
+	lithuanian
+	nepali
+	norwegian
+	portuguese
+	romanian
+	russian
+	serbian
+	spanish
+	swedish
+	tamil
+	turkish
+	yiddish
+);
+
+# Names of alternative dictionaries for all-ASCII words.  If not
+# listed, the language itself is used.  Note order dependency: Use of
+# some other language as ASCII dictionary must come after creation of
+# that language, so the "backup" language must be listed earlier in
+# @languages.
+
+our %ascii_languages = (
+	'hindi' => 'english',
+	'russian' => 'english',
+);
+
+GetOptions(
+	'depfile'    => \$depfile,
+	'outdir:s'   => \$outdir_path,
+	'input:s'    => \$input_path) || usage();
+
+# Make sure input_path ends in a slash if needed.
+if ($input_path ne '' && substr($input_path, -1) ne '/')
+{
+	$outdir_path .= '/';
+}
+
+# Make sure outdir_path ends in a slash if needed.
+if ($outdir_path ne '' && substr($outdir_path, -1) ne '/')
+{
+	$outdir_path .= '/';
+}
+
+GenerateTsearchFiles();
+
+sub usage
+{
+	die <<EOM;
+Usage: snowball_create.pl --input/-i <path> --outdir/-o <path>
+    --depfile       Write dependency file
+    --outdir        Output directory (default '.')
+    --input         Input directory
+
+snowball_create.pl creates snowball.sql from snowball.sql.in
+EOM
+}
+
+sub GenerateTsearchFiles
+{
+	my $target = shift;
+	my $outdir_file = "$outdir_path/snowball_create.sql";
+
+	my $F;
+	my $D;
+	my $tmpl = read_file("$input_path/snowball.sql.in");
+
+	if ($depfile)
+	{
+		open($D, '>', "$outdir_path/snowball_create.dep")
+		  || die "Could not write snowball_create.dep";
+	}
+
+	print $D "$outdir_file: $input_path/snowball.sql.in\n" if $depfile;
+	print $D "$outdir_file: $input_path/snowball_func.sql.in\n" if $depfile;
+
+	open($F, '>', $outdir_file)
+	  || die "Could not write snowball_create.sql";
+
+	print $F "-- Language-specific snowball dictionaries\n";
+
+	print $F read_file("$input_path/snowball_func.sql.in");
+
+	foreach my $lang (@languages)
+	{
+		my $asclang = $ascii_languages{$lang} || $lang;
+		my $txt     = $tmpl;
+		my $stop    = '';
+		my $stopword_path = "$input_path/stopwords/$lang.stop";
+
+		if (-s "$stopword_path")
+		{
+			$stop = ", StopWords=$lang";
+
+			print $D "$outdir_file: $stopword_path\n" if $depfile;
+		}
+
+		$txt =~ s#_LANGNAME_#${lang}#gs;
+		$txt =~ s#_DICTNAME_#${lang}_stem#gs;
+		$txt =~ s#_CFGNAME_#${lang}#gs;
+		$txt =~ s#_ASCDICTNAME_#${asclang}_stem#gs;
+		$txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs;
+		$txt =~ s#_STOPWORDS_#$stop#gs;
+		print $F $txt;
+	}
+	close($F);
+	close($D) if $depfile;
+	return;
+}
+
+
+sub read_file
+{
+	my $filename = shift;
+	my $F;
+	local $/ = undef;
+	open($F, '<', $filename) || die "Could not open file $filename\n";
+	my $txt = <$F>;
+	close($F);
+
+	return $txt;
+}
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index 8de79c618cb..5da299476eb 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -389,39 +389,9 @@ sub GenerateTsearchFiles
 	my $target = shift;
 
 	print "Generating tsearch script...";
-	my $F;
-	my $tmpl = read_file('src/backend/snowball/snowball.sql.in');
-	my $mf   = read_file('src/backend/snowball/Makefile');
-	$mf =~ s{\\\r?\n}{}g;
-	$mf =~ /^LANGUAGES\s*=\s*(.*)$/m
-	  || die "Could not find LANGUAGES line in snowball Makefile\n";
-	my @pieces = split /\s+/, $1;
-	open($F, '>', "$target/share/snowball_create.sql")
-	  || die "Could not write snowball_create.sql";
-	print $F read_file('src/backend/snowball/snowball_func.sql.in');
-
-	while ($#pieces > 0)
-	{
-		my $lang    = shift @pieces || last;
-		my $asclang = shift @pieces || last;
-		my $txt     = $tmpl;
-		my $stop    = '';
-
-		if (-s "src/backend/snowball/stopwords/$lang.stop")
-		{
-			$stop = ", StopWords=$lang";
-		}
-
-		$txt =~ s#_LANGNAME_#${lang}#gs;
-		$txt =~ s#_DICTNAME_#${lang}_stem#gs;
-		$txt =~ s#_CFGNAME_#${lang}#gs;
-		$txt =~ s#_ASCDICTNAME_#${asclang}_stem#gs;
-		$txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs;
-		$txt =~ s#_STOPWORDS_#$stop#gs;
-		print $F $txt;
-		print ".";
-	}
-	close($F);
+	system('perl', 'src/backend/snowball/snowball_create.pl',
+		'--input', 'src/backend/snowball/',
+		'--outdir', "$target/share/");
 	print "\n";
 	return;
 }
-- 
2.37.0.3.g30cc8d0f14

v10-0005-meson-prereq-Add-output-path-arg-in-generate-lwl.patchtext/x-diff; charset=us-asciiDownload
From 59b8bffdaf5849ddb0de99c5152631181c86c2a0 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v10 05/16] meson: prereq: Add output path arg in
 generate-lwlocknames.pl

---
 src/backend/storage/lmgr/generate-lwlocknames.pl | 14 ++++++++++----
 src/tools/msvc/Solution.pm                       |  5 ++---
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl
index 4565ff8760e..5fadc4503bf 100644
--- a/src/backend/storage/lmgr/generate-lwlocknames.pl
+++ b/src/backend/storage/lmgr/generate-lwlocknames.pl
@@ -5,15 +5,21 @@
 
 use strict;
 use warnings;
+use Getopt::Long;
+
+my $output_path = '.';
 
 my $lastlockidx = -1;
 my $continue    = "\n";
 
+GetOptions(
+	'outdir:s'       => \$output_path);
+
 open my $lwlocknames, '<', $ARGV[0] or die;
 
 # Include PID in suffix in case parallel make runs this multiple times.
-my $htmp = "lwlocknames.h.tmp$$";
-my $ctmp = "lwlocknames.c.tmp$$";
+my $htmp = "$output_path/lwlocknames.h.tmp$$";
+my $ctmp = "$output_path/lwlocknames.c.tmp$$";
 open my $h, '>', $htmp or die "Could not open $htmp: $!";
 open my $c, '>', $ctmp or die "Could not open $ctmp: $!";
 
@@ -65,7 +71,7 @@ printf $h "#define NUM_INDIVIDUAL_LWLOCKS		%s\n", $lastlockidx + 1;
 close $h;
 close $c;
 
-rename($htmp, 'lwlocknames.h') || die "rename: $htmp: $!";
-rename($ctmp, 'lwlocknames.c') || die "rename: $ctmp: $!";
+rename($htmp, "$output_path/lwlocknames.h") || die "rename: $htmp to $output_path/lwlocknames.h: $!";
+rename($ctmp, "$output_path/lwlocknames.c") || die "rename: $ctmp: $!";
 
 close $lwlocknames;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index fcbc1a20772..664fcea0d87 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -624,9 +624,8 @@ sub GenerateFiles
 			'src/backend/storage/lmgr/lwlocknames.txt'))
 	{
 		print "Generating lwlocknames.c and lwlocknames.h...\n";
-		chdir('src/backend/storage/lmgr');
-		system('perl generate-lwlocknames.pl lwlocknames.txt');
-		chdir('../../../..');
+		my $lmgr = 'src/backend/storage/lmgr';
+		system("perl $lmgr/generate-lwlocknames.pl --outdir $lmgr $lmgr/lwlocknames.txt");
 	}
 	if (IsNewer(
 			'src/include/storage/lwlocknames.h',
-- 
2.37.0.3.g30cc8d0f14

v10-0006-meson-prereq-generate-errcodes.pl-Accept-output-.patchtext/x-diff; charset=us-asciiDownload
From 2db97b00d5710c0ee882670fc0f06341cd750d1c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v10 06/16] meson: prereq: generate-errcodes.pl: Accept output
 file

meson's 'capture' is a bit slower than programs redirecting output
themselves (mostly due to a python wrapper necessary for windows). That
doesn't matter for most things, but errcodes.h is a dependency of nearly
everything, making it seem worthwhile here.

Medium term it might also be worth avoiding writing errcodes.h if its contents
didn't actually change, to avoid unnecessary recompilations.
---
 src/backend/utils/Makefile             |  2 +-
 src/backend/utils/generate-errcodes.pl | 30 +++++++++++++++++++++-----
 src/tools/msvc/Solution.pm             |  2 +-
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index ebda1df72b5..2011c5148d3 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -52,7 +52,7 @@ fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/ca
 	touch $@
 
 errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
-	$(PERL) $(srcdir)/generate-errcodes.pl $< > $@
+	$(PERL) $(srcdir)/generate-errcodes.pl --outfile $@ $<
 
 ifneq ($(enable_dtrace), yes)
 probes.h: Gen_dummy_probes.sed
diff --git a/src/backend/utils/generate-errcodes.pl b/src/backend/utils/generate-errcodes.pl
index 5727ff76cc3..5045027fb26 100644
--- a/src/backend/utils/generate-errcodes.pl
+++ b/src/backend/utils/generate-errcodes.pl
@@ -5,12 +5,31 @@
 
 use strict;
 use warnings;
+use Getopt::Long;
 
-print
+my $outfile        = '';
+
+GetOptions(
+	'outfile=s'   => \$outfile) or die "$0: wrong arguments";
+
+open my $errcodes, '<', $ARGV[0]
+  or die "$0: could not open input file '$ARGV[0]': $!\n";
+
+my $outfh;
+if ($outfile)
+{
+	open $outfh, '>', $outfile
+	  or die "$0: could not open output file '$outfile': $!\n";
+}
+else
+{
+	$outfh = *STDOUT;
+}
+
+print $outfh
   "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n";
-print "/* there is deliberately not an #ifndef ERRCODES_H here */\n";
+print $outfh "/* there is deliberately not an #ifndef ERRCODES_H here */\n";
 
-open my $errcodes, '<', $ARGV[0] or die;
 
 while (<$errcodes>)
 {
@@ -25,7 +44,7 @@ while (<$errcodes>)
 	{
 		my $header = $1;
 		$header =~ s/^\s+//;
-		print "\n/* $header */\n";
+		print $outfh "\n/* $header */\n";
 		next;
 	}
 
@@ -40,7 +59,8 @@ while (<$errcodes>)
 	# And quote them
 	$sqlstate =~ s/([^,])/'$1'/g;
 
-	print "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n";
+	print $outfh "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n";
 }
 
 close $errcodes;
+close $outfh if ($outfile);
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 664fcea0d87..71342029121 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -661,7 +661,7 @@ sub GenerateFiles
 	{
 		print "Generating errcodes.h...\n";
 		system(
-			'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt > src/backend/utils/errcodes.h'
+			'perl src/backend/utils/generate-errcodes.pl --outfile src/backend/utils/errcodes.h src/backend/utils/errcodes.txt'
 		);
 		copyFile('src/backend/utils/errcodes.h',
 			'src/include/utils/errcodes.h');
-- 
2.37.0.3.g30cc8d0f14

v10-0007-meson-prereq-unicode-Allow-to-specify-output-dir.patchtext/x-diff; charset=us-asciiDownload
From fb8f52f21d0700ad7b037ee097fc1b24cb2ddf9e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 25 Mar 2022 13:44:48 -0700
Subject: [PATCH v10 07/16] meson: prereq: unicode: Allow to specify output
 directory

Author: Andres Freund <andres@anarazel.de>
Author: Peter Eisentraut <peter@eisentraut.org>
Author: nbyavuz <byavuz81@gmail.com>
---
 .../unicode/generate-unicode_norm_table.pl    | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index e4423455fc2..95c89282bb3 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -10,20 +10,27 @@
 
 use strict;
 use warnings;
+use Getopt::Long;
 
 use FindBin;
 use lib "$FindBin::RealBin/../../tools/";
 use PerfectHash;
 
-my $output_table_file = "unicode_norm_table.h";
-my $output_func_file  = "unicode_norm_hashfunc.h";
+my $output_path = '.';
+
+GetOptions(
+	'outdir:s'       => \$output_path);
+
+my $output_table_file = "$output_path/unicode_norm_table.h";
+my $output_func_file  = "$output_path/unicode_norm_hashfunc.h";
+
 
 my $FH;
 
 # Read list of codes that should be excluded from re-composition.
 my @composition_exclusion_codes = ();
-open($FH, '<', "CompositionExclusions.txt")
-  or die "Could not open CompositionExclusions.txt: $!.";
+open($FH, '<', "$output_path/CompositionExclusions.txt")
+  or die "Could not open $output_path/CompositionExclusions.txt: $!.";
 while (my $line = <$FH>)
 {
 	if ($line =~ /^([[:xdigit:]]+)/)
@@ -38,8 +45,8 @@ close $FH;
 # and character decomposition mapping
 my @characters     = ();
 my %character_hash = ();
-open($FH, '<', "UnicodeData.txt")
-  or die "Could not open UnicodeData.txt: $!.";
+open($FH, '<', "$output_path/UnicodeData.txt")
+  or die "Could not open $output_path/UnicodeData.txt: $!.";
 while (my $line = <$FH>)
 {
 
-- 
2.37.0.3.g30cc8d0f14

v10-0008-meson-prereq-Refactor-dtrace-postprocessing-make.patchtext/x-diff; charset=us-asciiDownload
From 8f1e4410d69d9e5a9bda2bd905bd067a61b7d1a6 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 11 May 2022 09:06:13 +0200
Subject: [PATCH v10 08/16] meson: prereq: Refactor dtrace postprocessing make
 rules

Move the dtrace postprocessing sed commands into a separate file so
that it can be shared by meson.  Also split the rule into two for
proper dependency declaration.
---
 src/backend/utils/Makefile               | 21 +++++++--------------
 src/backend/utils/postprocess_dtrace.sed | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 14 deletions(-)
 create mode 100644 src/backend/utils/postprocess_dtrace.sed

diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index 2011c5148d3..ccca0a0dd3c 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -54,22 +54,15 @@ fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/ca
 errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
 	$(PERL) $(srcdir)/generate-errcodes.pl --outfile $@ $<
 
-ifneq ($(enable_dtrace), yes)
-probes.h: Gen_dummy_probes.sed
-endif
-
-# We editorialize on dtrace's output to the extent of changing the macro
-# names (from POSTGRESQL_foo to TRACE_POSTGRESQL_foo) and changing any
-# "char *" arguments to "const char *".
-probes.h: probes.d
 ifeq ($(enable_dtrace), yes)
-	$(DTRACE) -C -h -s $< -o $@.tmp
-	sed -e 's/POSTGRESQL_/TRACE_POSTGRESQL_/g' \
-	    -e 's/( *char \*/(const char */g' \
-	    -e 's/, *char \*/, const char */g' $@.tmp >$@
-	rm $@.tmp
+probes.h: postprocess_dtrace.sed probes.h.tmp
+	sed -f $^ >$@
+
+probes.h.tmp: probes.d
+	$(DTRACE) -C -h -s $< -o $@
 else
-	sed -f $(srcdir)/Gen_dummy_probes.sed $< >$@
+probes.h: Gen_dummy_probes.sed probes.d
+	sed -f $^ >$@
 endif
 
 # These generated headers must be symlinked into builddir/src/include/,
diff --git a/src/backend/utils/postprocess_dtrace.sed b/src/backend/utils/postprocess_dtrace.sed
new file mode 100644
index 00000000000..a68c30c75e4
--- /dev/null
+++ b/src/backend/utils/postprocess_dtrace.sed
@@ -0,0 +1,15 @@
+#-------------------------------------------------------------------------
+# sed script to postprocess dtrace output
+#
+# Copyright (c) 2008-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/postprocess_dtrace.sed
+#-------------------------------------------------------------------------
+
+# We editorialize on dtrace's output to the extent of changing the macro
+# names (from POSTGRESQL_foo to TRACE_POSTGRESQL_foo) and changing any
+# "char *" arguments to "const char *".
+
+s/POSTGRESQL_/TRACE_POSTGRESQL_/g
+s/( *char \*/(const char */g
+s/, *char \*/, const char */g
-- 
2.37.0.3.g30cc8d0f14

v10-0009-meson-prereq-Add-outdir-option-to-gen_node_suppo.patchtext/x-diff; charset=us-asciiDownload
From 3d18a20b1182c647187204bcbcbe0705857fce39 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 10 Jul 2022 14:10:45 -0700
Subject: [PATCH v10 09/16] meson: prereq: Add --outdir option to
 gen_node_support.pl

---
 src/backend/nodes/gen_node_support.pl | 29 +++++++++++++++++----------
 src/tools/msvc/Solution.pm            |  9 +++------
 2 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index 975e456ee2d..f3309c30001 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -19,12 +19,19 @@ use strict;
 use warnings;
 
 use File::Basename;
+use Getopt::Long;
 
 use FindBin;
 use lib "$FindBin::RealBin/../catalog";
 
 use Catalog;    # for RenameTempFile
 
+my $output_path = '.';
+
+GetOptions(
+	'outdir:s'       => \$output_path)
+  or die "$0: wrong arguments";
+
 
 # Test whether first argument is element of the list in the second
 # argument
@@ -576,7 +583,7 @@ my $header_comment =
 # nodetags.h
 
 push @output_files, 'nodetags.h';
-open my $nt, '>', 'nodetags.h' . $tmpext or die $!;
+open my $nt, '>', "$output_path/nodetags.h$tmpext" or die "$output_path/nodetags.h$tmpext: $!";
 
 printf $nt $header_comment, 'nodetags.h';
 
@@ -620,13 +627,13 @@ foreach my $infile (sort @ARGV)
 # copyfuncs.c, equalfuncs.c
 
 push @output_files, 'copyfuncs.funcs.c';
-open my $cff, '>', 'copyfuncs.funcs.c' . $tmpext or die $!;
+open my $cff, '>', "$output_path/copyfuncs.funcs.c$tmpext" or die $!;
 push @output_files, 'equalfuncs.funcs.c';
-open my $eff, '>', 'equalfuncs.funcs.c' . $tmpext or die $!;
+open my $eff, '>', "$output_path/equalfuncs.funcs.c$tmpext" or die $!;
 push @output_files, 'copyfuncs.switch.c';
-open my $cfs, '>', 'copyfuncs.switch.c' . $tmpext or die $!;
+open my $cfs, '>', "$output_path/copyfuncs.switch.c$tmpext" or die $!;
 push @output_files, 'equalfuncs.switch.c';
-open my $efs, '>', 'equalfuncs.switch.c' . $tmpext or die $!;
+open my $efs, '>', "$output_path/equalfuncs.switch.c$tmpext" or die $!;
 
 printf $cff $header_comment, 'copyfuncs.funcs.c';
 printf $eff $header_comment, 'equalfuncs.funcs.c';
@@ -819,13 +826,13 @@ close $efs;
 # outfuncs.c, readfuncs.c
 
 push @output_files, 'outfuncs.funcs.c';
-open my $off, '>', 'outfuncs.funcs.c' . $tmpext or die $!;
+open my $off, '>', "$output_path/outfuncs.funcs.c$tmpext" or die $!;
 push @output_files, 'readfuncs.funcs.c';
-open my $rff, '>', 'readfuncs.funcs.c' . $tmpext or die $!;
+open my $rff, '>', "$output_path/readfuncs.funcs.c$tmpext" or die $!;
 push @output_files, 'outfuncs.switch.c';
-open my $ofs, '>', 'outfuncs.switch.c' . $tmpext or die $!;
+open my $ofs, '>', "$output_path/outfuncs.switch.c$tmpext" or die $!;
 push @output_files, 'readfuncs.switch.c';
-open my $rfs, '>', 'readfuncs.switch.c' . $tmpext or die $!;
+open my $rfs, '>', "$output_path/readfuncs.switch.c$tmpext" or die $!;
 
 printf $off $header_comment, 'outfuncs.funcs.c';
 printf $rff $header_comment, 'readfuncs.funcs.c';
@@ -1130,7 +1137,7 @@ close $rfs;
 # now rename the temporary files to their final names
 foreach my $file (@output_files)
 {
-	Catalog::RenameTempFile($file, $tmpext);
+	Catalog::RenameTempFile("$output_path/$file", $tmpext);
 }
 
 
@@ -1144,7 +1151,7 @@ END
 	{
 		foreach my $file (@output_files)
 		{
-			unlink($file . $tmpext);
+			unlink("$output_path/$file$tmpext");
 		}
 	}
 
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 71342029121..c80441c7c8f 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -864,15 +864,12 @@ EOF
 		  utils/rel.h
 		);
 
-		chdir('src/backend/nodes');
+		my @node_files = map { "src/include/$_" } @node_headers;
 
-		my @node_files = map { "../../../src/include/$_" } @node_headers;
-
-		system("perl gen_node_support.pl @node_files");
-		open(my $f, '>', 'node-support-stamp')
+		system("perl src/backend/nodes/gen_node_support.pl --outdir src/backend/nodes @node_files");
+		open(my $f, '>', 'src/backend/nodes/node-support-stamp')
 		  || confess "Could not touch node-support-stamp";
 		close($f);
-		chdir('../../..');
 	}
 
 	if (IsNewer(
-- 
2.37.0.3.g30cc8d0f14

v10-0010-meson-prereq-Add-src-tools-gen_versioning_script.patchtext/x-diff; charset=us-asciiDownload
From 5f70275d2c7c2b844f198aa4da0a0714a46cffa6 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v10 10/16] meson: prereq: Add
 src/tools/gen_versioning_script.pl

Currently the logic is all in src/Makefile.shlib. This adds a sketch
of a generation script that can be used from meson.
---
 src/tools/gen_versioning_script.pl | 62 ++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)
 create mode 100644 src/tools/gen_versioning_script.pl

diff --git a/src/tools/gen_versioning_script.pl b/src/tools/gen_versioning_script.pl
new file mode 100644
index 00000000000..c34ee99083e
--- /dev/null
+++ b/src/tools/gen_versioning_script.pl
@@ -0,0 +1,62 @@
+use strict;
+use warnings;
+
+my $format = $ARGV[0] or die "$0: missing required argument: format\n";
+my $input = $ARGV[1] or die "$0: missing required argument: input\n";
+my $output = $ARGV[2] or die "$0: missing required argument: output\n";
+
+#FIXME: better argument handling
+if (not ($format eq 'aix' or $format eq 'darwin' or $format eq 'gnu'))
+{
+	die "$0: $format is not yet handled (only aix, darwin, gnu are)\n";
+}
+
+open(my $input_handle, '<', $input)
+  or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+  or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+	print $output_handle "{
+  global:
+";
+}
+
+while (<$input_handle>)
+{
+	if (/^#/)
+	{
+		# don't do anything with a comment
+	}
+	elsif (/^([^\s]+)\s+([^\s]+)/)
+	{
+		if ($format eq 'aix')
+		{
+			print $output_handle "    $1\n";
+		}
+		elsif ($format eq 'darwin')
+		{
+			print $output_handle "    _$1\n";
+		}
+		elsif ($format eq 'gnu')
+		{
+			print $output_handle "    $1;\n";
+		}
+	}
+	else
+	{
+		die "$0: unexpected line $_\n";
+	}
+}
+
+if ($format eq 'gnu')
+{
+	print $output_handle "  local: *;
+};
+";
+}
+
+exit(0);
-- 
2.37.0.3.g30cc8d0f14

v10-0011-meson-prereq-Refactor-PG_TEST_EXTRA-logic-in-aut.patchtext/x-diff; charset=us-asciiDownload
From 877d418cf43e72ba7536aca59204dae7573e9517 Mon Sep 17 00:00:00 2001
From: nbyavuz <byavuz81@gmail.com>
Date: Fri, 25 Mar 2022 10:55:08 +0300
Subject: [PATCH v10 11/16] meson: prereq: Refactor PG_TEST_EXTRA logic in
 autoconf build

---
 src/test/Makefile               | 15 +++++----------
 src/test/kerberos/t/001_auth.pl |  4 ++++
 src/test/ldap/t/001_auth.pl     |  4 ++++
 src/test/ssl/t/001_ssltests.pl  |  4 ++++
 src/test/ssl/t/002_scram.pl     |  4 ++++
 src/test/ssl/t/003_sslinfo.pl   |  4 ++++
 6 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/test/Makefile b/src/test/Makefile
index 69ef074d75e..dbd3192874d 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -17,25 +17,20 @@ SUBDIRS = perl regress isolation modules authentication recovery subscription
 ifeq ($(with_icu),yes)
 SUBDIRS += icu
 endif
-
-# Test suites that are not safe by default but can be run if selected
-# by the user via the whitespace-separated list in variable
-# PG_TEST_EXTRA:
 ifeq ($(with_gssapi),yes)
-ifneq (,$(filter kerberos,$(PG_TEST_EXTRA)))
 SUBDIRS += kerberos
 endif
-endif
 ifeq ($(with_ldap),yes)
-ifneq (,$(filter ldap,$(PG_TEST_EXTRA)))
 SUBDIRS += ldap
 endif
-endif
 ifeq ($(with_ssl),openssl)
-ifneq (,$(filter ssl,$(PG_TEST_EXTRA)))
 SUBDIRS += ssl
 endif
-endif
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA to check it in individual tap tests.
+export PG_TEST_EXTRA
 
 # We don't build or execute these by default, but we do want "make
 # clean" etc to recurse into them.  (We must filter out those that we
diff --git a/src/test/kerberos/t/001_auth.pl b/src/test/kerberos/t/001_auth.pl
index 62e05426393..e403d24c0c2 100644
--- a/src/test/kerberos/t/001_auth.pl
+++ b/src/test/kerberos/t/001_auth.pl
@@ -25,6 +25,10 @@ if ($ENV{with_gssapi} ne 'yes')
 {
 	plan skip_all => 'GSSAPI/Kerberos not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /kerberos/)
+{
+	plan skip_all => 'Potentially unsafe test GSSAPI/Kerberos not enabled in PG_TEST_EXTRA';
+}
 
 my ($krb5_bin_dir, $krb5_sbin_dir);
 
diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index 86dff8bd1f3..a5afddc5272 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -16,6 +16,10 @@ if ($ENV{with_ldap} ne 'yes')
 {
 	plan skip_all => 'LDAP not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ldap/)
+{
+	plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA';
+}
 elsif ($^O eq 'darwin' && -d '/usr/local/opt/openldap')
 {
 	# typical paths for Homebrew
diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl
index 707f4005af5..4ffa18b02e0 100644
--- a/src/test/ssl/t/001_ssltests.pl
+++ b/src/test/ssl/t/001_ssltests.pl
@@ -17,6 +17,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl
index 588f47a39b9..15d45c88e50 100644
--- a/src/test/ssl/t/002_scram.pl
+++ b/src/test/ssl/t/002_scram.pl
@@ -20,6 +20,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl
index 87fb18a31e0..acd0ba8e828 100644
--- a/src/test/ssl/t/003_sslinfo.pl
+++ b/src/test/ssl/t/003_sslinfo.pl
@@ -18,6 +18,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 #### Some configuration
 my $ssl_server = SSL::Server->new();
-- 
2.37.0.3.g30cc8d0f14

v10-0012-meson-prereq-Can-we-get-away-with-not-export-all.patchtext/x-diff; charset=us-asciiDownload
From ec15e1cd0d0db16a421306f884b685fb8f0d22f2 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 18 May 2022 09:44:53 -0700
Subject: [PATCH v10 12/16] meson: prereq: Can we get away with not
 export-all'ing libraries?

By using explicit export annotations in shared libraries we avoid the need to
generate export files on windows. And it reduces the number of exported
symbols, which is good too.

See also https://www.postgresql.org/message-id/20220111025328.iq5g6uck53j5qtin%40alap3.anarazel.de
currently stuck on https://www.postgresql.org/message-id/20220111025328.iq5g6uck53j5qtin%40alap3.anarazel.de
---
 src/include/c.h                            | 12 +++++-
 src/include/fmgr.h                         |  6 ++-
 src/include/jit/jit.h                      |  2 +-
 src/include/pg_config.h.in                 |  3 ++
 src/include/replication/output_plugin.h    |  2 +
 src/pl/plpython/plpy_elog.h                |  8 ++--
 src/pl/plpython/plpy_typeio.h              | 18 ++++----
 src/pl/plpython/plpy_util.h                |  8 ++--
 contrib/basic_archive/basic_archive.c      |  4 +-
 contrib/hstore/hstore.h                    | 16 +++----
 contrib/ltree/ltree.h                      | 40 +++++++++---------
 src/test/modules/test_shm_mq/test_shm_mq.h |  2 +-
 src/test/modules/worker_spi/worker_spi.c   |  2 +-
 configure                                  | 49 ++++++++++++++++++++++
 configure.ac                               | 10 +++++
 src/Makefile.global.in                     |  1 +
 src/Makefile.shlib                         | 12 ++++++
 src/tools/msvc/Solution.pm                 |  1 +
 18 files changed, 144 insertions(+), 52 deletions(-)

diff --git a/src/include/c.h b/src/include/c.h
index 863a16c6a6c..ad86da1b90c 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -1339,8 +1339,18 @@ extern unsigned long long strtoull(const char *str, char **endptr, int base);
 /*
  * Use "extern PGDLLIMPORT ..." to declare variables that are defined
  * in the core backend and need to be accessible by loadable modules.
- * No special marking is required on most ports.
  */
+
+/*
+ * If the platform knows __attribute__((visibility("*"))), i.e. gcc like
+ * compilers, we use that.
+ */
+#if !defined(PGDLLIMPORT) && defined(HAVE_VISIBILITY_ATTRIBUTE)
+#define PGDLLIMPORT __attribute__((visibility("default")))
+#define PGDLLEXPORT __attribute__((visibility("default")))
+#endif
+
+/* No special marking is required on most ports. */
 #ifndef PGDLLIMPORT
 #define PGDLLIMPORT
 #endif
diff --git a/src/include/fmgr.h b/src/include/fmgr.h
index 5314b737052..210f9835004 100644
--- a/src/include/fmgr.h
+++ b/src/include/fmgr.h
@@ -413,7 +413,7 @@ typedef const Pg_finfo_record *(*PGFInfoFunction) (void);
  *	info function, since authors shouldn't need to be explicitly aware of it.
  */
 #define PG_FUNCTION_INFO_V1(funcname) \
-extern Datum funcname(PG_FUNCTION_ARGS); \
+extern PGDLLEXPORT Datum funcname(PG_FUNCTION_ARGS); \
 extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \
 const Pg_finfo_record * \
 CppConcat(pg_finfo_,funcname) (void) \
@@ -424,6 +424,10 @@ CppConcat(pg_finfo_,funcname) (void) \
 extern int no_such_variable
 
 
+extern PGDLLEXPORT void _PG_init(void);
+extern PGDLLEXPORT void _PG_fini(void);
+
+
 /*-------------------------------------------------------------------------
  *		Support for verifying backend compatibility of loaded modules
  *
diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h
index d1940332094..600ddfc7539 100644
--- a/src/include/jit/jit.h
+++ b/src/include/jit/jit.h
@@ -63,7 +63,7 @@ typedef struct JitContext
 
 typedef struct JitProviderCallbacks JitProviderCallbacks;
 
-extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
+extern PGDLLEXPORT void _PG_jit_provider_init(JitProviderCallbacks *cb);
 typedef void (*JitProviderInit) (JitProviderCallbacks *cb);
 typedef void (*JitProviderResetAfterErrorCB) (void);
 typedef void (*JitProviderReleaseContextCB) (JitContext *context);
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 7133c3dc66b..529fb84a86c 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -700,6 +700,9 @@
 /* Define to 1 if you have the <uuid/uuid.h> header file. */
 #undef HAVE_UUID_UUID_H
 
+/* Define to 1 if your compiler knows the visibility("hidden") attribute. */
+#undef HAVE_VISIBILITY_ATTRIBUTE
+
 /* Define to 1 if you have the `wcstombs_l' function. */
 #undef HAVE_WCSTOMBS_L
 
diff --git a/src/include/replication/output_plugin.h b/src/include/replication/output_plugin.h
index 539dc8e6974..b7d28d7045c 100644
--- a/src/include/replication/output_plugin.h
+++ b/src/include/replication/output_plugin.h
@@ -35,6 +35,8 @@ typedef struct OutputPluginOptions
  */
 typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb);
 
+extern PGDLLEXPORT void _PG_output_plugin_init(struct OutputPluginCallbacks *cb);
+
 /*
  * Callback that gets called in a user-defined plugin. ctx->private_data can
  * be set to some private data.
diff --git a/src/pl/plpython/plpy_elog.h b/src/pl/plpython/plpy_elog.h
index e02ef4ffe9f..aeade82ce10 100644
--- a/src/pl/plpython/plpy_elog.h
+++ b/src/pl/plpython/plpy_elog.h
@@ -34,13 +34,13 @@ extern PyObject *PLy_exc_spi_error;
 	} while(0)
 #endif							/* HAVE__BUILTIN_CONSTANT_P */
 
-extern void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
+extern PGDLLEXPORT void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
 
-extern void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
+extern PGDLLEXPORT void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
 
-extern void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural,
+extern PGDLLEXPORT void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural,
 									 unsigned long n,...) pg_attribute_printf(2, 5) pg_attribute_printf(3, 5);
 
-extern void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata);
+extern PGDLLEXPORT void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata);
 
 #endif							/* PLPY_ELOG_H */
diff --git a/src/pl/plpython/plpy_typeio.h b/src/pl/plpython/plpy_typeio.h
index d11e6ae1b89..87e3b2c464e 100644
--- a/src/pl/plpython/plpy_typeio.h
+++ b/src/pl/plpython/plpy_typeio.h
@@ -147,29 +147,29 @@ struct PLyObToDatum
 };
 
 
-extern PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val);
-extern Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val,
+extern PGDLLEXPORT PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val);
+extern PGDLLEXPORT Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val,
 								bool *isnull);
 
-extern PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple,
+extern PGDLLEXPORT PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple,
 									  TupleDesc desc, bool include_generated);
 
-extern void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
+extern PGDLLEXPORT void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt,
 								 Oid typeOid, int32 typmod,
 								 struct PLyProcedure *proc);
-extern void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt,
+extern PGDLLEXPORT void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt,
 								  Oid typeOid, int32 typmod,
 								  struct PLyProcedure *proc);
 
-extern void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc,
 								  struct PLyProcedure *proc);
-extern void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc,
 								   struct PLyProcedure *proc);
 
-extern void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc,
+extern PGDLLEXPORT void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc,
 									struct PLyProcedure *proc);
 
 /* conversion from Python objects to C strings --- exported for transforms */
-extern char *PLyObject_AsString(PyObject *plrv);
+extern PGDLLEXPORT char *PLyObject_AsString(PyObject *plrv);
 
 #endif							/* PLPY_TYPEIO_H */
diff --git a/src/pl/plpython/plpy_util.h b/src/pl/plpython/plpy_util.h
index 7c6577925ea..6f491b0f95b 100644
--- a/src/pl/plpython/plpy_util.h
+++ b/src/pl/plpython/plpy_util.h
@@ -8,10 +8,10 @@
 
 #include "plpython.h"
 
-extern PyObject *PLyUnicode_Bytes(PyObject *unicode);
-extern char *PLyUnicode_AsString(PyObject *unicode);
+extern PGDLLEXPORT PyObject *PLyUnicode_Bytes(PyObject *unicode);
+extern PGDLLEXPORT char *PLyUnicode_AsString(PyObject *unicode);
 
-extern PyObject *PLyUnicode_FromString(const char *s);
-extern PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
+extern PGDLLEXPORT PyObject *PLyUnicode_FromString(const char *s);
+extern PGDLLEXPORT PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size);
 
 #endif							/* PLPY_UTIL_H */
diff --git a/contrib/basic_archive/basic_archive.c b/contrib/basic_archive/basic_archive.c
index 6b550fc55f7..9816a1f72fb 100644
--- a/contrib/basic_archive/basic_archive.c
+++ b/contrib/basic_archive/basic_archive.c
@@ -40,8 +40,8 @@
 
 PG_MODULE_MAGIC;
 
-void		_PG_init(void);
-void		_PG_archive_module_init(ArchiveModuleCallbacks *cb);
+PGDLLEXPORT void _PG_init(void);
+PGDLLEXPORT void _PG_archive_module_init(ArchiveModuleCallbacks *cb);
 
 static char *archive_directory = NULL;
 static MemoryContext basic_archive_context;
diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h
index bf4a565ed9b..625134c9f69 100644
--- a/contrib/hstore/hstore.h
+++ b/contrib/hstore/hstore.h
@@ -147,7 +147,7 @@ typedef struct
 	} while (0)
 
 /* DatumGetHStoreP includes support for reading old-format hstore values */
-extern HStore *hstoreUpgrade(Datum orig);
+extern PGDLLEXPORT HStore *hstoreUpgrade(Datum orig);
 
 #define DatumGetHStoreP(d) hstoreUpgrade(d)
 
@@ -168,14 +168,14 @@ typedef struct
 	bool		needfree;		/* need to pfree the value? */
 } Pairs;
 
-extern int	hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen);
-extern HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen);
+extern PGDLLEXPORT int	hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen);
+extern PGDLLEXPORT HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen);
 
-extern size_t hstoreCheckKeyLen(size_t len);
-extern size_t hstoreCheckValLen(size_t len);
+extern PGDLLEXPORT size_t hstoreCheckKeyLen(size_t len);
+extern PGDLLEXPORT size_t hstoreCheckValLen(size_t len);
 
-extern int	hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen);
-extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
+extern PGDLLEXPORT int	hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen);
+extern PGDLLEXPORT Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
 
 #define HStoreContainsStrategyNumber	7
 #define HStoreExistsStrategyNumber		9
@@ -194,7 +194,7 @@ extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs);
 #if HSTORE_POLLUTE_NAMESPACE
 #define HSTORE_POLLUTE(newname_,oldname_) \
 	PG_FUNCTION_INFO_V1(oldname_);		  \
-	Datum newname_(PG_FUNCTION_ARGS);	  \
+	extern PGDLLEXPORT Datum newname_(PG_FUNCTION_ARGS);	  \
 	Datum oldname_(PG_FUNCTION_ARGS) { return newname_(fcinfo); } \
 	extern int no_such_variable
 #else
diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h
index 564e4fa81b8..85199ba15d1 100644
--- a/contrib/ltree/ltree.h
+++ b/contrib/ltree/ltree.h
@@ -176,30 +176,30 @@ typedef struct
 
 
 /* use in array iterator */
-Datum		ltree_isparent(PG_FUNCTION_ARGS);
-Datum		ltree_risparent(PG_FUNCTION_ARGS);
-Datum		ltq_regex(PG_FUNCTION_ARGS);
-Datum		ltq_rregex(PG_FUNCTION_ARGS);
-Datum		lt_q_regex(PG_FUNCTION_ARGS);
-Datum		lt_q_rregex(PG_FUNCTION_ARGS);
-Datum		ltxtq_exec(PG_FUNCTION_ARGS);
-Datum		ltxtq_rexec(PG_FUNCTION_ARGS);
-Datum		_ltq_regex(PG_FUNCTION_ARGS);
-Datum		_ltq_rregex(PG_FUNCTION_ARGS);
-Datum		_lt_q_regex(PG_FUNCTION_ARGS);
-Datum		_lt_q_rregex(PG_FUNCTION_ARGS);
-Datum		_ltxtq_exec(PG_FUNCTION_ARGS);
-Datum		_ltxtq_rexec(PG_FUNCTION_ARGS);
-Datum		_ltree_isparent(PG_FUNCTION_ARGS);
-Datum		_ltree_risparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_isparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_risparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltq_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltq_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		lt_q_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		lt_q_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltxtq_exec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltxtq_rexec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltq_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltq_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_lt_q_regex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_lt_q_rregex(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltxtq_exec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltxtq_rexec(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltree_isparent(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		_ltree_risparent(PG_FUNCTION_ARGS);
 
 /* Concatenation functions */
-Datum		ltree_addltree(PG_FUNCTION_ARGS);
-Datum		ltree_addtext(PG_FUNCTION_ARGS);
-Datum		ltree_textadd(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_addltree(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_addtext(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_textadd(PG_FUNCTION_ARGS);
 
 /* Util function */
-Datum		ltree_in(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum		ltree_in(PG_FUNCTION_ARGS);
 
 bool		ltree_execute(ITEM *curitem, void *checkval,
 						  bool calcnot, bool (*chkcond) (void *checkval, ITEM *val));
diff --git a/src/test/modules/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h
index 0310caf50bd..8f97be78d3e 100644
--- a/src/test/modules/test_shm_mq/test_shm_mq.h
+++ b/src/test/modules/test_shm_mq/test_shm_mq.h
@@ -40,6 +40,6 @@ extern void test_shm_mq_setup(int64 queue_size, int32 nworkers,
 							  shm_mq_handle **input);
 
 /* Main entrypoint for a worker. */
-extern void test_shm_mq_main(Datum) pg_attribute_noreturn();
+extern PGDLLEXPORT void test_shm_mq_main(Datum) pg_attribute_noreturn();
 
 #endif
diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c
index 5b541ec47f1..c4c9b4f48db 100644
--- a/src/test/modules/worker_spi/worker_spi.c
+++ b/src/test/modules/worker_spi/worker_spi.c
@@ -47,7 +47,7 @@ PG_MODULE_MAGIC;
 PG_FUNCTION_INFO_V1(worker_spi_launch);
 
 void		_PG_init(void);
-void		worker_spi_main(Datum) pg_attribute_noreturn();
+PGDLLEXPORT void worker_spi_main(Datum) pg_attribute_noreturn();
 
 /* GUC variables */
 static int	worker_spi_naptime = 10;
diff --git a/configure b/configure
index 1e63c6862bc..ae0aa991407 100755
--- a/configure
+++ b/configure
@@ -741,6 +741,7 @@ CPP
 CFLAGS_SL
 BITCODE_CXXFLAGS
 BITCODE_CFLAGS
+CFLAGS_SL_MOD
 CFLAGS_VECTORIZE
 CFLAGS_UNROLL_LOOPS
 PERMIT_DECLARATION_AFTER_STATEMENT
@@ -6485,6 +6486,54 @@ fi
   if test -n "$NOT_THE_CFLAGS"; then
     CFLAGS="$CFLAGS -Wno-stringop-truncation"
   fi
+
+  # If the compiler knows how to hide symbols, use that. But only for shared libraries,
+  # for postgres itself that'd be too verbose for now.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD" >&5
+$as_echo_n "checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD... " >&6; }
+if ${pgac_cv_prog_CC_cflags__fvisibility_hidden+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  pgac_save_CFLAGS=$CFLAGS
+pgac_save_CC=$CC
+CC=${CC}
+CFLAGS="${CFLAGS_SL_MOD} -fvisibility=hidden"
+ac_save_c_werror_flag=$ac_c_werror_flag
+ac_c_werror_flag=yes
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  pgac_cv_prog_CC_cflags__fvisibility_hidden=yes
+else
+  pgac_cv_prog_CC_cflags__fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_c_werror_flag=$ac_save_c_werror_flag
+CFLAGS="$pgac_save_CFLAGS"
+CC="$pgac_save_CC"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__fvisibility_hidden" >&5
+$as_echo "$pgac_cv_prog_CC_cflags__fvisibility_hidden" >&6; }
+if test x"$pgac_cv_prog_CC_cflags__fvisibility_hidden" = x"yes"; then
+  CFLAGS_SL_MOD="${CFLAGS_SL_MOD} -fvisibility=hidden"
+fi
+
+
+  if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then
+
+$as_echo "#define HAVE_VISIBILITY_ATTRIBUTE 1" >>confdefs.h
+
+  fi
+
 elif test "$ICC" = yes; then
   # Intel's compiler has a bug/misoptimization in checking for
   # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.
diff --git a/configure.ac b/configure.ac
index 71191f14ad7..459ae04b446 100644
--- a/configure.ac
+++ b/configure.ac
@@ -555,6 +555,15 @@ if test "$GCC" = yes -a "$ICC" = no; then
   if test -n "$NOT_THE_CFLAGS"; then
     CFLAGS="$CFLAGS -Wno-stringop-truncation"
   fi
+
+  # If the compiler knows how to hide symbols, use that. But only for shared libraries,
+  # for postgres itself that'd be too verbose for now.
+  PGAC_PROG_CC_VAR_OPT(CFLAGS_SL_MOD, [-fvisibility=hidden])
+  if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then
+     AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE, 1,
+               [Define to 1 if your compiler knows the visibility("hidden") attribute.])
+  fi
+
 elif test "$ICC" = yes; then
   # Intel's compiler has a bug/misoptimization in checking for
   # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.
@@ -573,6 +582,7 @@ fi
 
 AC_SUBST(CFLAGS_UNROLL_LOOPS)
 AC_SUBST(CFLAGS_VECTORIZE)
+AC_SUBST(CFLAGS_SL_MOD)
 
 # Determine flags used to emit bitcode for JIT inlining.
 # 1. We must duplicate any behaviour-changing compiler flags used above,
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 138d66ac006..7f1b2c52bf8 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -258,6 +258,7 @@ SUN_STUDIO_CC = @SUN_STUDIO_CC@
 CXX = @CXX@
 CFLAGS = @CFLAGS@
 CFLAGS_SL = @CFLAGS_SL@
+CFLAGS_SL_MOD = @CFLAGS_SL_MOD@
 CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@
 CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@
 CFLAGS_SSE42 = @CFLAGS_SSE42@
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 6df96c634b6..5160d5c71df 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -218,6 +218,18 @@ ifeq ($(PORTNAME), win32)
 endif
 
 
+# If the shared library doesn't have an export file, mark all symbols not
+# explicitly exported using PGDLLEXPORT as hidden. We can't pass these flags
+# when building a library with explicit exports, as the symbols would be
+# hidden before the linker script / exported symbol list takes effect.
+#
+# XXX: This probably isn't the best location, but not clear instead?
+ifeq ($(SHLIB_EXPORTS),)
+  LDFLAGS += $(CFLAGS_SL_MOD)
+  override CFLAGS += $(CFLAGS_SL_MOD)
+  override CXXFLAGS += $(CFLAGS_SL_MOD)
+endif
+
 
 ##
 ## BUILD
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index c80441c7c8f..1e125aef942 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -429,6 +429,7 @@ sub GenerateFiles
 		HAVE_WINLDAP_H                           => undef,
 		HAVE_WCSTOMBS_L                          => 1,
 		HAVE_WCTYPE_H                            => 1,
+		HAVE_VISIBILITY_ATTRIBUTE                => undef,
 		HAVE_WRITEV                              => undef,
 		HAVE_X509_GET_SIGNATURE_NID              => 1,
 		HAVE_X86_64_POPCNTQ                      => undef,
-- 
2.37.0.3.g30cc8d0f14

v10-0013-meson-prereq-regress-allow-to-specify-director-c.patchtext/x-diff; charset=us-asciiDownload
From 2ad4759ae2b0b7ce66b127209e8057dc975995c9 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 30 Jun 2022 18:28:17 -0700
Subject: [PATCH v10 13/16] meson: prereq: regress: allow to specify director
 containing expected files

This is needed for ecpg tests, so tests don't have to be generated in the
source directory.

Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/interfaces/ecpg/test/pg_regress_ecpg.c | 34 +++++++++++++++++++---
 src/test/regress/pg_regress.c              |  7 +++++
 src/test/regress/pg_regress.h              |  1 +
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c
index f920af4560c..721fa6f17eb 100644
--- a/src/interfaces/ecpg/test/pg_regress_ecpg.c
+++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c
@@ -164,7 +164,7 @@ ecpg_start_test(const char *testname,
 	char	   *appnameenv;
 
 	snprintf(inprg, sizeof(inprg), "%s/%s", inputdir, testname);
-	snprintf(insource, sizeof(insource), "%s.c", testname);
+	snprintf(insource, sizeof(insource), "%s/%s.c", inputdir, testname);
 
 	/* make a version of the test name that has dashes in place of slashes */
 	initStringInfo(&testname_dash);
@@ -177,13 +177,39 @@ ecpg_start_test(const char *testname,
 
 	snprintf(expectfile_stdout, sizeof(expectfile_stdout),
 			 "%s/expected/%s.stdout",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
+	if (!file_exists(expectfile_stdout))
+		snprintf(expectfile_stdout, sizeof(expectfile_stdout),
+				 "%s/expected/%s.stdout",
+				 outputdir, testname_dash.data);
+	if (!file_exists(expectfile_stdout))
+		snprintf(expectfile_stdout, sizeof(expectfile_stdout),
+				 "%s/expected/%s.stdout",
+				 inputdir, testname_dash.data);
+
 	snprintf(expectfile_stderr, sizeof(expectfile_stderr),
 			 "%s/expected/%s.stderr",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
+	if (!file_exists(expectfile_stderr))
+		snprintf(expectfile_stderr, sizeof(expectfile_stderr),
+				 "%s/expected/%s.stderr",
+				 outputdir, testname_dash.data);
+	if (!file_exists(expectfile_stderr))
+		snprintf(expectfile_stderr, sizeof(expectfile_stderr),
+				 "%s/expected/%s.stderr",
+				 inputdir, testname_dash.data);
+
 	snprintf(expectfile_source, sizeof(expectfile_source),
 			 "%s/expected/%s.c",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
+	if (!file_exists(expectfile_source))
+		snprintf(expectfile_source, sizeof(expectfile_source),
+				 "%s/expected/%s.c",
+				 outputdir, testname_dash.data);
+	if (!file_exists(expectfile_source))
+		snprintf(expectfile_source, sizeof(expectfile_source),
+				 "%s/expected/%s.c",
+				 inputdir, testname_dash.data);
 
 	snprintf(outfile_stdout, sizeof(outfile_stdout),
 			 "%s/results/%s.stdout",
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 982801e029d..3bab881340d 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -76,6 +76,7 @@ _stringlist *dblist = NULL;
 bool		debug = false;
 char	   *inputdir = ".";
 char	   *outputdir = ".";
+char       *expecteddir = ".";
 char	   *bindir = PGBINDIR;
 char	   *launcher = NULL;
 static _stringlist *loadextension = NULL;
@@ -1989,6 +1990,7 @@ help(void)
 	printf(_("      --debug                   turn on debug mode in programs that are run\n"));
 	printf(_("      --dlpath=DIR              look for dynamic libraries in DIR\n"));
 	printf(_("      --encoding=ENCODING       use ENCODING as the encoding\n"));
+	printf(_("      --expecteddir=DIR         take expected files from DIR (default \".\")\n"));
 	printf(_("  -h, --help                    show this help, then exit\n"));
 	printf(_("      --inputdir=DIR            take input files from DIR (default \".\")\n"));
 	printf(_("      --launcher=CMD            use CMD as launcher of psql\n"));
@@ -2052,6 +2054,7 @@ regression_main(int argc, char *argv[],
 		{"load-extension", required_argument, NULL, 22},
 		{"config-auth", required_argument, NULL, 24},
 		{"max-concurrent-tests", required_argument, NULL, 25},
+		{"expecteddir", required_argument, NULL, 26},
 		{NULL, 0, NULL, 0}
 	};
 
@@ -2181,6 +2184,9 @@ regression_main(int argc, char *argv[],
 			case 25:
 				max_concurrent_tests = atoi(optarg);
 				break;
+			case 26:
+				expecteddir = pg_strdup(optarg);
+				break;
 			default:
 				/* getopt_long already emitted a complaint */
 				fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
@@ -2220,6 +2226,7 @@ regression_main(int argc, char *argv[],
 
 	inputdir = make_absolute_path(inputdir);
 	outputdir = make_absolute_path(outputdir);
+	expecteddir = make_absolute_path(expecteddir);
 	dlpath = make_absolute_path(dlpath);
 
 	/*
diff --git a/src/test/regress/pg_regress.h b/src/test/regress/pg_regress.h
index 2143ee0e727..d8772fec8ed 100644
--- a/src/test/regress/pg_regress.h
+++ b/src/test/regress/pg_regress.h
@@ -53,6 +53,7 @@ extern _stringlist *dblist;
 extern bool debug;
 extern char *inputdir;
 extern char *outputdir;
+extern char *expecteddir;
 extern char *launcher;
 
 extern const char *basic_diff_opts;
-- 
2.37.0.3.g30cc8d0f14

v10-0014-wip-split-TESTDIR-into-two.patchtext/x-diff; charset=us-asciiDownload
From 8544e2bb6a50bce5e2b380069ef0d62d6ea7ed3e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 14 Feb 2022 21:47:07 -0800
Subject: [PATCH v10 14/16] wip: split TESTDIR into two

---
 src/bin/psql/t/010_tab_completion.pl   | 34 +++++++++++++-------------
 src/test/perl/PostgreSQL/Test/Utils.pm |  2 +-
 src/Makefile.global.in                 |  9 ++++---
 src/tools/msvc/vcregress.pl            |  2 ++
 4 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 2eea515e871..1e4e79fe7e1 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -70,23 +70,23 @@ delete $ENV{LS_COLORS};
 # to run in the build directory so that we can use relative paths to
 # access the tmp_check subdirectory; otherwise the output from filename
 # completion tests is too variable.
-if ($ENV{TESTDIR})
+if ($ENV{TESTOUTDIR})
 {
-	chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+	chdir "$ENV{TESTOUTDIR}" or die "could not chdir to \"$ENV{TESTOUTDIR}\": $!";
 }
 
 # Create some junk files for filename completion testing.
 my $FH;
-open $FH, ">", "tmp_check/somefile"
-  or die("could not create file \"tmp_check/somefile\": $!");
+open $FH, ">", "somefile"
+  or die("could not create file \"somefile\": $!");
 print $FH "some stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile123"
-  or die("could not create file \"tmp_check/afile123\": $!");
+open $FH, ">", "afile123"
+  or die("could not create file \"afile123\": $!");
 print $FH "more stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile456"
-  or die("could not create file \"tmp_check/afile456\": $!");
+open $FH, ">", "afile456"
+  or die("could not create file \"afile456\": $!");
 print $FH "other stuff\n";
 close $FH;
 
@@ -272,16 +272,16 @@ clear_query();
 
 # check filename completion
 check_completion(
-	"\\lo_import tmp_check/some\t",
-	qr|tmp_check/somefile |,
+	"\\lo_import some\t",
+	qr|somefile |,
 	"filename completion with one possibility");
 
 clear_query();
 
 # note: readline might print a bell before the completion
 check_completion(
-	"\\lo_import tmp_check/af\t",
-	qr|tmp_check/af\a?ile|,
+	"\\lo_import af\t",
+	qr|af\a?ile|,
 	"filename completion with multiple possibilities");
 
 # broken versions of libedit require clear_line not clear_query here
@@ -291,15 +291,15 @@ clear_line();
 # note: broken versions of libedit want to backslash the closing quote;
 # not much we can do about that
 check_completion(
-	"COPY foo FROM tmp_check/some\t",
-	qr|'tmp_check/somefile\\?' |,
+	"COPY foo FROM some\t",
+	qr|'somefile\\?' |,
 	"quoted filename completion with one possibility");
 
 clear_line();
 
 check_completion(
-	"COPY foo FROM tmp_check/af\t",
-	qr|'tmp_check/afile|,
+	"COPY foo FROM af\t",
+	qr|'afile|,
 	"quoted filename completion with multiple possibilities");
 
 # some versions of readline/libedit require two tabs here, some only need one
@@ -307,7 +307,7 @@ check_completion(
 # the quotes might appear, too
 check_completion(
 	"\t\t",
-	qr|afile123'? +'?(tmp_check/)?afile456|,
+	qr|afile123'? +'?afile456|,
 	"offer multiple file choices");
 
 clear_line();
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 1ca2cc59170..24017a82955 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -192,7 +192,7 @@ INIT
 	# Determine output directories, and create them.  The base path is the
 	# TESTDIR environment variable, which is normally set by the invoking
 	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check";
+	$tmp_check = $ENV{TESTOUTDIR} ? "$ENV{TESTOUTDIR}" : "tmp_check";
 	$log_path = "$tmp_check/log";
 
 	mkdir $tmp_check;
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 7f1b2c52bf8..a69535ead9c 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -452,7 +452,8 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+   PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -463,8 +464,9 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
-   PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
+   TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+   PATH="$(bindir):$(CURDIR):$$PATH" PGPORT='6$(DEF_PGPORT)' \
+   top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
 endef
@@ -475,6 +477,7 @@ echo "+++ tap check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
+   TESTOUTDIR='$(CURDIR)/tmp_check' \
    TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index c3729f6be5e..6f07a31464d 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -296,6 +296,8 @@ sub tap_check
 	# add the module build dir as the second element in the PATH
 	$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
 
+	$ENV{TESTOUTDIR} = "$dir/tmp_check";
+
 	rmtree('tmp_check');
 	system(@args);
 	my $status = $? >> 8;
-- 
2.37.0.3.g30cc8d0f14

v10-0015-meson-Add-meson-based-buildsystem.patchtext/x-diff; charset=utf-8Download
From d3c459cb50435bbdbf64e75e9c8499be9d04f633 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v10 15/16] meson: Add meson based buildsystem

Author: Andres Freund
Author: nbyavuz <byavuz81@gmail.com>
Author: Peter Eisentraut <peter@eisentraut.org>
Author: Thomas Munro
Author: John Naylor <john.naylor@enterprisedb.com>
---
 src/include/catalog/meson.build               |  137 +
 src/include/meson.build                       |  168 +
 src/include/nodes/meson.build                 |   54 +
 src/include/parser/meson.build                |   11 +
 src/include/pch/c_pch.h                       |    1 +
 src/include/pch/meson.build                   |    3 +
 src/include/pch/postgres_pch.h                |    1 +
 src/include/pg_config_ext.h.meson             |    7 +
 src/include/storage/meson.build               |   16 +
 src/include/utils/meson.build                 |   46 +
 src/common/meson.build                        |  176 +
 src/common/unicode/meson.build                |  101 +
 src/port/meson.build                          |  188 ++
 src/port/win32ver.rc.in                       |   41 +
 config/meson.build                            |    4 +
 src/backend/access/brin/meson.build           |   12 +
 src/backend/access/common/meson.build         |   18 +
 src/backend/access/gin/meson.build            |   17 +
 src/backend/access/gist/meson.build           |   13 +
 src/backend/access/hash/meson.build           |   12 +
 src/backend/access/heap/meson.build           |   11 +
 src/backend/access/index/meson.build          |    6 +
 src/backend/access/meson.build                |   13 +
 src/backend/access/nbtree/meson.build         |   13 +
 src/backend/access/rmgrdesc/meson.build       |   26 +
 src/backend/access/spgist/meson.build         |   13 +
 src/backend/access/table/meson.build          |    6 +
 src/backend/access/tablesample/meson.build    |    5 +
 src/backend/access/transam/meson.build        |   31 +
 src/backend/bootstrap/meson.build             |   12 +
 src/backend/catalog/meson.build               |   44 +
 src/backend/commands/meson.build              |   51 +
 src/backend/executor/meson.build              |   67 +
 src/backend/foreign/meson.build               |    3 +
 src/backend/jit/llvm/meson.build              |   41 +
 src/backend/jit/meson.build                   |    3 +
 src/backend/lib/meson.build                   |   12 +
 src/backend/libpq/meson.build                 |   32 +
 src/backend/main/meson.build                  |    2 +
 src/backend/meson.build                       |  228 ++
 src/backend/nodes/meson.build                 |   30 +
 src/backend/optimizer/geqo/meson.build        |   17 +
 src/backend/optimizer/meson.build             |    5 +
 src/backend/optimizer/path/meson.build        |   11 +
 src/backend/optimizer/plan/meson.build        |   10 +
 src/backend/optimizer/prep/meson.build        |    7 +
 src/backend/optimizer/util/meson.build        |   16 +
 src/backend/parser/meson.build                |   45 +
 src/backend/partitioning/meson.build          |    5 +
 src/backend/po/meson.build                    |    1 +
 src/backend/port/meson.build                  |   28 +
 src/backend/port/win32/meson.build            |    9 +
 src/backend/postmaster/meson.build            |   15 +
 src/backend/regex/meson.build                 |   15 +
 .../replication/libpqwalreceiver/meson.build  |   13 +
 src/backend/replication/logical/meson.build   |   14 +
 src/backend/replication/meson.build           |   51 +
 src/backend/replication/pgoutput/meson.build  |   11 +
 src/backend/rewrite/meson.build               |    9 +
 src/backend/snowball/meson.build              |   84 +
 src/backend/statistics/meson.build            |    6 +
 src/backend/storage/buffer/meson.build        |    7 +
 src/backend/storage/file/meson.build          |    8 +
 src/backend/storage/freespace/meson.build     |    5 +
 src/backend/storage/ipc/meson.build           |   20 +
 src/backend/storage/large_object/meson.build  |    3 +
 src/backend/storage/lmgr/meson.build          |   18 +
 src/backend/storage/meson.build               |    9 +
 src/backend/storage/page/meson.build          |    5 +
 src/backend/storage/smgr/meson.build          |    4 +
 src/backend/storage/sync/meson.build          |    4 +
 src/backend/tcop/meson.build                  |    8 +
 src/backend/tsearch/meson.build               |   21 +
 src/backend/utils/activity/meson.build        |   18 +
 src/backend/utils/adt/meson.build             |  119 +
 src/backend/utils/cache/meson.build           |   16 +
 src/backend/utils/error/meson.build           |    6 +
 src/backend/utils/fmgr/meson.build            |    8 +
 src/backend/utils/hash/meson.build            |    4 +
 src/backend/utils/init/meson.build            |    4 +
 .../utils/mb/conversion_procs/meson.build     |   38 +
 src/backend/utils/mb/meson.build              |    9 +
 src/backend/utils/meson.build                 |   17 +
 src/backend/utils/misc/meson.build            |   32 +
 src/backend/utils/mmgr/meson.build            |   10 +
 src/backend/utils/resowner/meson.build        |    3 +
 src/backend/utils/sort/meson.build            |    8 +
 src/backend/utils/time/meson.build            |    4 +
 src/fe_utils/meson.build                      |   28 +
 src/bin/initdb/meson.build                    |   39 +
 src/bin/initdb/po/meson.build                 |    1 +
 src/bin/meson.build                           |   20 +
 src/bin/pg_amcheck/meson.build                |   26 +
 src/bin/pg_amcheck/po/meson.build             |    1 +
 src/bin/pg_archivecleanup/meson.build         |   18 +
 src/bin/pg_archivecleanup/po/meson.build      |    1 +
 src/bin/pg_basebackup/meson.build             |   58 +
 src/bin/pg_basebackup/po/meson.build          |    1 +
 src/bin/pg_checksums/meson.build              |   20 +
 src/bin/pg_checksums/po/meson.build           |    1 +
 src/bin/pg_config/meson.build                 |   18 +
 src/bin/pg_config/po/meson.build              |    1 +
 src/bin/pg_controldata/meson.build            |   18 +
 src/bin/pg_controldata/po/meson.build         |    1 +
 src/bin/pg_ctl/meson.build                    |   21 +
 src/bin/pg_ctl/po/meson.build                 |    1 +
 src/bin/pg_dump/meson.build                   |   84 +
 src/bin/pg_dump/po/meson.build                |    1 +
 src/bin/pg_resetwal/meson.build               |   19 +
 src/bin/pg_resetwal/po/meson.build            |    1 +
 src/bin/pg_rewind/meson.build                 |   39 +
 src/bin/pg_rewind/po/meson.build              |    1 +
 src/bin/pg_test_fsync/meson.build             |   18 +
 src/bin/pg_test_fsync/po/meson.build          |    1 +
 src/bin/pg_test_timing/meson.build            |   18 +
 src/bin/pg_test_timing/po/meson.build         |    1 +
 src/bin/pg_upgrade/meson.build                |   40 +
 src/bin/pg_upgrade/po/meson.build             |    1 +
 src/bin/pg_verifybackup/meson.build           |   32 +
 src/bin/pg_verifybackup/po/meson.build        |    1 +
 src/bin/pg_waldump/meson.build                |   28 +
 src/bin/pg_waldump/po/meson.build             |    1 +
 src/bin/pgbench/meson.build                   |   40 +
 src/bin/pgevent/meson.build                   |   31 +
 src/bin/psql/meson.build                      |   68 +
 src/bin/psql/po/meson.build                   |    1 +
 src/bin/scripts/meson.build                   |   50 +
 src/bin/scripts/po/meson.build                |    1 +
 src/interfaces/libpq/meson.build              |  141 +
 src/interfaces/libpq/po/meson.build           |    1 +
 src/interfaces/libpq/test/meson.build         |   15 +
 src/pl/meson.build                            |    5 +
 src/pl/plperl/meson.build                     |   92 +
 src/pl/plperl/po/meson.build                  |    1 +
 src/pl/plpgsql/meson.build                    |    1 +
 src/pl/plpgsql/src/meson.build                |   75 +
 src/pl/plpgsql/src/po/meson.build             |    1 +
 src/pl/plpython/meson.build                   |   99 +
 src/pl/plpython/po/meson.build                |    1 +
 src/pl/tcl/meson.build                        |   55 +
 src/pl/tcl/po/meson.build                     |    1 +
 contrib/adminpack/meson.build                 |   22 +
 contrib/amcheck/meson.build                   |   36 +
 contrib/auth_delay/meson.build                |    4 +
 contrib/auto_explain/meson.build              |   15 +
 contrib/basebackup_to_shell/meson.build       |   22 +
 contrib/basic_archive/meson.build             |   23 +
 contrib/bloom/meson.build                     |   36 +
 contrib/bool_plperl/meson.build               |   39 +
 contrib/btree_gin/meson.build                 |   53 +
 contrib/btree_gist/meson.build                |   84 +
 contrib/citext/meson.build                    |   33 +
 contrib/cube/meson.build                      |   49 +
 contrib/dblink/meson.build                    |   30 +
 contrib/dict_int/meson.build                  |   21 +
 contrib/dict_xsyn/meson.build                 |   28 +
 contrib/earthdistance/meson.build             |   22 +
 contrib/file_fdw/meson.build                  |   21 +
 contrib/fuzzystrmatch/meson.build             |   25 +
 contrib/hstore/meson.build                    |   44 +
 contrib/hstore_plperl/meson.build             |   40 +
 contrib/hstore_plpython/meson.build           |   36 +
 contrib/intagg/meson.build                    |    6 +
 contrib/intarray/meson.build                  |   36 +
 contrib/isn/meson.build                       |   32 +
 contrib/jsonb_plperl/meson.build              |   40 +
 contrib/jsonb_plpython/meson.build            |   35 +
 contrib/lo/meson.build                        |   26 +
 contrib/ltree/meson.build                     |   43 +
 contrib/ltree_plpython/meson.build            |   36 +
 contrib/meson.build                           |   66 +
 contrib/oid2name/meson.build                  |   16 +
 contrib/old_snapshot/meson.build              |   14 +
 contrib/pageinspect/meson.build               |   59 +
 contrib/passwordcheck/meson.build             |   29 +
 contrib/pg_buffercache/meson.build            |   16 +
 contrib/pg_freespacemap/meson.build           |   29 +
 contrib/pg_prewarm/meson.build                |   16 +
 contrib/pg_stat_statements/meson.build        |   34 +
 contrib/pg_surgery/meson.build                |   25 +
 contrib/pg_trgm/meson.build                   |   35 +
 contrib/pg_visibility/meson.build             |   27 +
 contrib/pg_walinspect/meson.build             |   37 +
 contrib/pgcrypto/meson.build                  |  100 +
 contrib/pgrowlocks/meson.build                |   15 +
 contrib/pgstattuple/meson.build               |   32 +
 contrib/postgres_fdw/meson.build              |   33 +
 contrib/seg/meson.build                       |   47 +
 contrib/sepgsql/meson.build                   |   34 +
 contrib/spi/meson.build                       |   47 +
 contrib/sslinfo/meson.build                   |   21 +
 contrib/tablefunc/meson.build                 |   25 +
 contrib/tcn/meson.build                       |   13 +
 contrib/test_decoding/meson.build             |   62 +
 contrib/tsm_system_rows/meson.build           |   24 +
 contrib/tsm_system_time/meson.build           |   24 +
 contrib/unaccent/meson.build                  |   32 +
 contrib/uuid-ossp/meson.build                 |   33 +
 contrib/vacuumlo/meson.build                  |   16 +
 contrib/xml2/meson.build                      |   32 +
 src/interfaces/ecpg/compatlib/meson.build     |   15 +
 src/interfaces/ecpg/ecpglib/meson.build       |   30 +
 src/interfaces/ecpg/ecpglib/po/meson.build    |    1 +
 src/interfaces/ecpg/include/meson.build       |   48 +
 src/interfaces/ecpg/meson.build               |   10 +
 src/interfaces/ecpg/pgtypeslib/meson.build    |   23 +
 src/interfaces/ecpg/preproc/meson.build       |   95 +
 src/interfaces/ecpg/preproc/po/meson.build    |    1 +
 .../ecpg/test/compat_informix/meson.build     |   31 +
 .../ecpg/test/compat_oracle/meson.build       |   18 +
 src/interfaces/ecpg/test/connect/meson.build  |   22 +
 src/interfaces/ecpg/test/meson.build          |   75 +
 .../ecpg/test/pgtypeslib/meson.build          |   21 +
 src/interfaces/ecpg/test/preproc/meson.build  |   38 +
 src/interfaces/ecpg/test/sql/meson.build      |   46 +
 src/interfaces/ecpg/test/thread/meson.build   |   21 +
 src/interfaces/meson.build                    |    2 +
 doc/src/sgml/meson.build                      |  242 ++
 doc/src/sgml/resolv.xsl                       |    7 +
 doc/src/sgml/version.sgml.in                  |    2 +
 src/test/authentication/meson.build           |   11 +
 src/test/icu/meson.build                      |   11 +
 src/test/isolation/meson.build                |   51 +
 src/test/kerberos/meson.build                 |   15 +
 src/test/ldap/meson.build                     |   11 +
 src/test/meson.build                          |   23 +
 src/test/modules/brin/meson.build             |   15 +
 src/test/modules/commit_ts/meson.build        |   18 +
 src/test/modules/delay_execution/meson.build  |   17 +
 src/test/modules/dummy_index_am/meson.build   |   22 +
 src/test/modules/dummy_seclabel/meson.build   |   22 +
 src/test/modules/libpq_pipeline/meson.build   |   20 +
 src/test/modules/meson.build                  |   26 +
 src/test/modules/plsample/meson.build         |   22 +
 src/test/modules/snapshot_too_old/meson.build |   14 +
 src/test/modules/spgist_name_ops/meson.build  |   22 +
 .../ssl_passphrase_callback/meson.build       |   47 +
 src/test/modules/test_bloomfilter/meson.build |   22 +
 src/test/modules/test_ddl_deparse/meson.build |   42 +
 src/test/modules/test_extensions/meson.build  |   40 +
 .../modules/test_ginpostinglist/meson.build   |   22 +
 src/test/modules/test_integerset/meson.build  |   22 +
 src/test/modules/test_misc/meson.build        |   12 +
 src/test/modules/test_oat_hooks/meson.build   |   17 +
 src/test/modules/test_parser/meson.build      |   22 +
 src/test/modules/test_pg_dump/meson.build     |   22 +
 src/test/modules/test_predtest/meson.build    |   22 +
 src/test/modules/test_rbtree/meson.build      |   22 +
 src/test/modules/test_regex/meson.build       |   23 +
 src/test/modules/test_rls_hooks/meson.build   |   16 +
 src/test/modules/test_shm_mq/meson.build      |   26 +
 src/test/modules/unsafe_tests/meson.build     |   11 +
 src/test/modules/worker_spi/meson.build       |   25 +
 src/test/recovery/meson.build                 |   42 +
 src/test/regress/meson.build                  |   58 +
 src/test/ssl/meson.build                      |   13 +
 src/test/subscription/meson.build             |   41 +
 configure                                     |    6 +
 configure.ac                                  |    6 +
 conversion_helpers.txt                        |    9 +
 meson.build                                   | 2921 +++++++++++++++++
 meson_options.txt                             |  175 +
 src/meson.build                               |  269 ++
 src/timezone/meson.build                      |   53 +
 src/timezone/tznames/meson.build              |   21 +
 src/tools/find_meson                          |   20 +
 src/tools/irlink                              |   39 +
 src/tools/msvc/export2def.pl                  |   22 +
 src/tools/msvc/gendef2.pl                     |  177 +
 src/tools/pgflex                              |   63 +
 src/tools/rcgen                               |   34 +
 .../relativize_shared_library_references      |   84 +
 src/tools/relpath.py                          |    6 +
 src/tools/testwrap                            |   32 +
 274 files changed, 11196 insertions(+)
 create mode 100644 src/include/catalog/meson.build
 create mode 100644 src/include/meson.build
 create mode 100644 src/include/nodes/meson.build
 create mode 100644 src/include/parser/meson.build
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/meson.build
 create mode 100644 src/include/pch/postgres_pch.h
 create mode 100644 src/include/pg_config_ext.h.meson
 create mode 100644 src/include/storage/meson.build
 create mode 100644 src/include/utils/meson.build
 create mode 100644 src/common/meson.build
 create mode 100644 src/common/unicode/meson.build
 create mode 100644 src/port/meson.build
 create mode 100644 src/port/win32ver.rc.in
 create mode 100644 config/meson.build
 create mode 100644 src/backend/access/brin/meson.build
 create mode 100644 src/backend/access/common/meson.build
 create mode 100644 src/backend/access/gin/meson.build
 create mode 100644 src/backend/access/gist/meson.build
 create mode 100644 src/backend/access/hash/meson.build
 create mode 100644 src/backend/access/heap/meson.build
 create mode 100644 src/backend/access/index/meson.build
 create mode 100644 src/backend/access/meson.build
 create mode 100644 src/backend/access/nbtree/meson.build
 create mode 100644 src/backend/access/rmgrdesc/meson.build
 create mode 100644 src/backend/access/spgist/meson.build
 create mode 100644 src/backend/access/table/meson.build
 create mode 100644 src/backend/access/tablesample/meson.build
 create mode 100644 src/backend/access/transam/meson.build
 create mode 100644 src/backend/bootstrap/meson.build
 create mode 100644 src/backend/catalog/meson.build
 create mode 100644 src/backend/commands/meson.build
 create mode 100644 src/backend/executor/meson.build
 create mode 100644 src/backend/foreign/meson.build
 create mode 100644 src/backend/jit/llvm/meson.build
 create mode 100644 src/backend/jit/meson.build
 create mode 100644 src/backend/lib/meson.build
 create mode 100644 src/backend/libpq/meson.build
 create mode 100644 src/backend/main/meson.build
 create mode 100644 src/backend/meson.build
 create mode 100644 src/backend/nodes/meson.build
 create mode 100644 src/backend/optimizer/geqo/meson.build
 create mode 100644 src/backend/optimizer/meson.build
 create mode 100644 src/backend/optimizer/path/meson.build
 create mode 100644 src/backend/optimizer/plan/meson.build
 create mode 100644 src/backend/optimizer/prep/meson.build
 create mode 100644 src/backend/optimizer/util/meson.build
 create mode 100644 src/backend/parser/meson.build
 create mode 100644 src/backend/partitioning/meson.build
 create mode 100644 src/backend/po/meson.build
 create mode 100644 src/backend/port/meson.build
 create mode 100644 src/backend/port/win32/meson.build
 create mode 100644 src/backend/postmaster/meson.build
 create mode 100644 src/backend/regex/meson.build
 create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
 create mode 100644 src/backend/replication/logical/meson.build
 create mode 100644 src/backend/replication/meson.build
 create mode 100644 src/backend/replication/pgoutput/meson.build
 create mode 100644 src/backend/rewrite/meson.build
 create mode 100644 src/backend/snowball/meson.build
 create mode 100644 src/backend/statistics/meson.build
 create mode 100644 src/backend/storage/buffer/meson.build
 create mode 100644 src/backend/storage/file/meson.build
 create mode 100644 src/backend/storage/freespace/meson.build
 create mode 100644 src/backend/storage/ipc/meson.build
 create mode 100644 src/backend/storage/large_object/meson.build
 create mode 100644 src/backend/storage/lmgr/meson.build
 create mode 100644 src/backend/storage/meson.build
 create mode 100644 src/backend/storage/page/meson.build
 create mode 100644 src/backend/storage/smgr/meson.build
 create mode 100644 src/backend/storage/sync/meson.build
 create mode 100644 src/backend/tcop/meson.build
 create mode 100644 src/backend/tsearch/meson.build
 create mode 100644 src/backend/utils/activity/meson.build
 create mode 100644 src/backend/utils/adt/meson.build
 create mode 100644 src/backend/utils/cache/meson.build
 create mode 100644 src/backend/utils/error/meson.build
 create mode 100644 src/backend/utils/fmgr/meson.build
 create mode 100644 src/backend/utils/hash/meson.build
 create mode 100644 src/backend/utils/init/meson.build
 create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
 create mode 100644 src/backend/utils/mb/meson.build
 create mode 100644 src/backend/utils/meson.build
 create mode 100644 src/backend/utils/misc/meson.build
 create mode 100644 src/backend/utils/mmgr/meson.build
 create mode 100644 src/backend/utils/resowner/meson.build
 create mode 100644 src/backend/utils/sort/meson.build
 create mode 100644 src/backend/utils/time/meson.build
 create mode 100644 src/fe_utils/meson.build
 create mode 100644 src/bin/initdb/meson.build
 create mode 100644 src/bin/initdb/po/meson.build
 create mode 100644 src/bin/meson.build
 create mode 100644 src/bin/pg_amcheck/meson.build
 create mode 100644 src/bin/pg_amcheck/po/meson.build
 create mode 100644 src/bin/pg_archivecleanup/meson.build
 create mode 100644 src/bin/pg_archivecleanup/po/meson.build
 create mode 100644 src/bin/pg_basebackup/meson.build
 create mode 100644 src/bin/pg_basebackup/po/meson.build
 create mode 100644 src/bin/pg_checksums/meson.build
 create mode 100644 src/bin/pg_checksums/po/meson.build
 create mode 100644 src/bin/pg_config/meson.build
 create mode 100644 src/bin/pg_config/po/meson.build
 create mode 100644 src/bin/pg_controldata/meson.build
 create mode 100644 src/bin/pg_controldata/po/meson.build
 create mode 100644 src/bin/pg_ctl/meson.build
 create mode 100644 src/bin/pg_ctl/po/meson.build
 create mode 100644 src/bin/pg_dump/meson.build
 create mode 100644 src/bin/pg_dump/po/meson.build
 create mode 100644 src/bin/pg_resetwal/meson.build
 create mode 100644 src/bin/pg_resetwal/po/meson.build
 create mode 100644 src/bin/pg_rewind/meson.build
 create mode 100644 src/bin/pg_rewind/po/meson.build
 create mode 100644 src/bin/pg_test_fsync/meson.build
 create mode 100644 src/bin/pg_test_fsync/po/meson.build
 create mode 100644 src/bin/pg_test_timing/meson.build
 create mode 100644 src/bin/pg_test_timing/po/meson.build
 create mode 100644 src/bin/pg_upgrade/meson.build
 create mode 100644 src/bin/pg_upgrade/po/meson.build
 create mode 100644 src/bin/pg_verifybackup/meson.build
 create mode 100644 src/bin/pg_verifybackup/po/meson.build
 create mode 100644 src/bin/pg_waldump/meson.build
 create mode 100644 src/bin/pg_waldump/po/meson.build
 create mode 100644 src/bin/pgbench/meson.build
 create mode 100644 src/bin/pgevent/meson.build
 create mode 100644 src/bin/psql/meson.build
 create mode 100644 src/bin/psql/po/meson.build
 create mode 100644 src/bin/scripts/meson.build
 create mode 100644 src/bin/scripts/po/meson.build
 create mode 100644 src/interfaces/libpq/meson.build
 create mode 100644 src/interfaces/libpq/po/meson.build
 create mode 100644 src/interfaces/libpq/test/meson.build
 create mode 100644 src/pl/meson.build
 create mode 100644 src/pl/plperl/meson.build
 create mode 100644 src/pl/plperl/po/meson.build
 create mode 100644 src/pl/plpgsql/meson.build
 create mode 100644 src/pl/plpgsql/src/meson.build
 create mode 100644 src/pl/plpgsql/src/po/meson.build
 create mode 100644 src/pl/plpython/meson.build
 create mode 100644 src/pl/plpython/po/meson.build
 create mode 100644 src/pl/tcl/meson.build
 create mode 100644 src/pl/tcl/po/meson.build
 create mode 100644 contrib/adminpack/meson.build
 create mode 100644 contrib/amcheck/meson.build
 create mode 100644 contrib/auth_delay/meson.build
 create mode 100644 contrib/auto_explain/meson.build
 create mode 100644 contrib/basebackup_to_shell/meson.build
 create mode 100644 contrib/basic_archive/meson.build
 create mode 100644 contrib/bloom/meson.build
 create mode 100644 contrib/bool_plperl/meson.build
 create mode 100644 contrib/btree_gin/meson.build
 create mode 100644 contrib/btree_gist/meson.build
 create mode 100644 contrib/citext/meson.build
 create mode 100644 contrib/cube/meson.build
 create mode 100644 contrib/dblink/meson.build
 create mode 100644 contrib/dict_int/meson.build
 create mode 100644 contrib/dict_xsyn/meson.build
 create mode 100644 contrib/earthdistance/meson.build
 create mode 100644 contrib/file_fdw/meson.build
 create mode 100644 contrib/fuzzystrmatch/meson.build
 create mode 100644 contrib/hstore/meson.build
 create mode 100644 contrib/hstore_plperl/meson.build
 create mode 100644 contrib/hstore_plpython/meson.build
 create mode 100644 contrib/intagg/meson.build
 create mode 100644 contrib/intarray/meson.build
 create mode 100644 contrib/isn/meson.build
 create mode 100644 contrib/jsonb_plperl/meson.build
 create mode 100644 contrib/jsonb_plpython/meson.build
 create mode 100644 contrib/lo/meson.build
 create mode 100644 contrib/ltree/meson.build
 create mode 100644 contrib/ltree_plpython/meson.build
 create mode 100644 contrib/meson.build
 create mode 100644 contrib/oid2name/meson.build
 create mode 100644 contrib/old_snapshot/meson.build
 create mode 100644 contrib/pageinspect/meson.build
 create mode 100644 contrib/passwordcheck/meson.build
 create mode 100644 contrib/pg_buffercache/meson.build
 create mode 100644 contrib/pg_freespacemap/meson.build
 create mode 100644 contrib/pg_prewarm/meson.build
 create mode 100644 contrib/pg_stat_statements/meson.build
 create mode 100644 contrib/pg_surgery/meson.build
 create mode 100644 contrib/pg_trgm/meson.build
 create mode 100644 contrib/pg_visibility/meson.build
 create mode 100644 contrib/pg_walinspect/meson.build
 create mode 100644 contrib/pgcrypto/meson.build
 create mode 100644 contrib/pgrowlocks/meson.build
 create mode 100644 contrib/pgstattuple/meson.build
 create mode 100644 contrib/postgres_fdw/meson.build
 create mode 100644 contrib/seg/meson.build
 create mode 100644 contrib/sepgsql/meson.build
 create mode 100644 contrib/spi/meson.build
 create mode 100644 contrib/sslinfo/meson.build
 create mode 100644 contrib/tablefunc/meson.build
 create mode 100644 contrib/tcn/meson.build
 create mode 100644 contrib/test_decoding/meson.build
 create mode 100644 contrib/tsm_system_rows/meson.build
 create mode 100644 contrib/tsm_system_time/meson.build
 create mode 100644 contrib/unaccent/meson.build
 create mode 100644 contrib/uuid-ossp/meson.build
 create mode 100644 contrib/vacuumlo/meson.build
 create mode 100644 contrib/xml2/meson.build
 create mode 100644 src/interfaces/ecpg/compatlib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/po/meson.build
 create mode 100644 src/interfaces/ecpg/include/meson.build
 create mode 100644 src/interfaces/ecpg/meson.build
 create mode 100644 src/interfaces/ecpg/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/po/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_informix/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_oracle/meson.build
 create mode 100644 src/interfaces/ecpg/test/connect/meson.build
 create mode 100644 src/interfaces/ecpg/test/meson.build
 create mode 100644 src/interfaces/ecpg/test/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/test/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/test/sql/meson.build
 create mode 100644 src/interfaces/ecpg/test/thread/meson.build
 create mode 100644 src/interfaces/meson.build
 create mode 100644 doc/src/sgml/meson.build
 create mode 100644 doc/src/sgml/resolv.xsl
 create mode 100644 doc/src/sgml/version.sgml.in
 create mode 100644 src/test/authentication/meson.build
 create mode 100644 src/test/icu/meson.build
 create mode 100644 src/test/isolation/meson.build
 create mode 100644 src/test/kerberos/meson.build
 create mode 100644 src/test/ldap/meson.build
 create mode 100644 src/test/meson.build
 create mode 100644 src/test/modules/brin/meson.build
 create mode 100644 src/test/modules/commit_ts/meson.build
 create mode 100644 src/test/modules/delay_execution/meson.build
 create mode 100644 src/test/modules/dummy_index_am/meson.build
 create mode 100644 src/test/modules/dummy_seclabel/meson.build
 create mode 100644 src/test/modules/libpq_pipeline/meson.build
 create mode 100644 src/test/modules/meson.build
 create mode 100644 src/test/modules/plsample/meson.build
 create mode 100644 src/test/modules/snapshot_too_old/meson.build
 create mode 100644 src/test/modules/spgist_name_ops/meson.build
 create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
 create mode 100644 src/test/modules/test_bloomfilter/meson.build
 create mode 100644 src/test/modules/test_ddl_deparse/meson.build
 create mode 100644 src/test/modules/test_extensions/meson.build
 create mode 100644 src/test/modules/test_ginpostinglist/meson.build
 create mode 100644 src/test/modules/test_integerset/meson.build
 create mode 100644 src/test/modules/test_misc/meson.build
 create mode 100644 src/test/modules/test_oat_hooks/meson.build
 create mode 100644 src/test/modules/test_parser/meson.build
 create mode 100644 src/test/modules/test_pg_dump/meson.build
 create mode 100644 src/test/modules/test_predtest/meson.build
 create mode 100644 src/test/modules/test_rbtree/meson.build
 create mode 100644 src/test/modules/test_regex/meson.build
 create mode 100644 src/test/modules/test_rls_hooks/meson.build
 create mode 100644 src/test/modules/test_shm_mq/meson.build
 create mode 100644 src/test/modules/unsafe_tests/meson.build
 create mode 100644 src/test/modules/worker_spi/meson.build
 create mode 100644 src/test/recovery/meson.build
 create mode 100644 src/test/regress/meson.build
 create mode 100644 src/test/ssl/meson.build
 create mode 100644 src/test/subscription/meson.build
 create mode 100644 conversion_helpers.txt
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 src/meson.build
 create mode 100644 src/timezone/meson.build
 create mode 100644 src/timezone/tznames/meson.build
 create mode 100755 src/tools/find_meson
 create mode 100644 src/tools/irlink
 create mode 100644 src/tools/msvc/export2def.pl
 create mode 100644 src/tools/msvc/gendef2.pl
 create mode 100755 src/tools/pgflex
 create mode 100755 src/tools/rcgen
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py
 create mode 100755 src/tools/testwrap

diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..813a963493f
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,137 @@
+catalog_headers = [
+  'pg_proc.h',
+  'pg_type.h',
+  'pg_attribute.h',
+  'pg_class.h',
+  'pg_attrdef.h',
+  'pg_constraint.h',
+  'pg_inherits.h',
+  'pg_index.h',
+  'pg_operator.h',
+  'pg_opfamily.h',
+  'pg_opclass.h',
+  'pg_am.h',
+  'pg_amop.h',
+  'pg_amproc.h',
+  'pg_language.h',
+  'pg_largeobject_metadata.h',
+  'pg_largeobject.h',
+  'pg_aggregate.h',
+  'pg_statistic.h',
+  'pg_statistic_ext.h',
+  'pg_statistic_ext_data.h',
+  'pg_rewrite.h',
+  'pg_trigger.h',
+  'pg_event_trigger.h',
+  'pg_description.h',
+  'pg_cast.h',
+  'pg_enum.h',
+  'pg_namespace.h',
+  'pg_conversion.h',
+  'pg_depend.h',
+  'pg_database.h',
+  'pg_db_role_setting.h',
+  'pg_tablespace.h',
+  'pg_authid.h',
+  'pg_auth_members.h',
+  'pg_shdepend.h',
+  'pg_shdescription.h',
+  'pg_ts_config.h',
+  'pg_ts_config_map.h',
+  'pg_ts_dict.h',
+  'pg_ts_parser.h',
+  'pg_ts_template.h',
+  'pg_extension.h',
+  'pg_foreign_data_wrapper.h',
+  'pg_foreign_server.h',
+  'pg_user_mapping.h',
+  'pg_foreign_table.h',
+  'pg_policy.h',
+  'pg_replication_origin.h',
+  'pg_default_acl.h',
+  'pg_init_privs.h',
+  'pg_seclabel.h',
+  'pg_shseclabel.h',
+  'pg_collation.h',
+  'pg_parameter_acl.h',
+  'pg_partitioned_table.h',
+  'pg_range.h',
+  'pg_transform.h',
+  'pg_sequence.h',
+  'pg_publication.h',
+  'pg_publication_namespace.h',
+  'pg_publication_rel.h',
+  'pg_subscription.h',
+  'pg_subscription_rel.h',
+]
+
+bki_data = [
+  'pg_aggregate.dat',
+  'pg_am.dat',
+  'pg_amop.dat',
+  'pg_amproc.dat',
+  'pg_authid.dat',
+  'pg_cast.dat',
+  'pg_class.dat',
+  'pg_collation.dat',
+  'pg_conversion.dat',
+  'pg_database.dat',
+  'pg_language.dat',
+  'pg_namespace.dat',
+  'pg_opclass.dat',
+  'pg_operator.dat',
+  'pg_opfamily.dat',
+  'pg_proc.dat',
+  'pg_range.dat',
+  'pg_tablespace.dat',
+  'pg_ts_config.dat',
+  'pg_ts_config_map.dat',
+  'pg_ts_dict.dat',
+  'pg_ts_parser.dat',
+  'pg_ts_template.dat',
+  'pg_type.dat',
+]
+bki_data_f = files(bki_data)
+
+
+input = []
+output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
+output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+
+foreach h : catalog_headers
+  fname = h.split('.h')[0]+'_d.h'
+  input += files(h)
+  output_files += fname
+  output_install += dir_include_server / 'catalog'
+endforeach
+
+generated_headers += custom_target('generated_catalog_headers',
+  output: output_files,
+  install_dir: output_install,
+  input: input,
+  depend_files: bki_data_f,
+  build_by_default: true,
+  install: true,
+  command: [
+    perl,
+    files('../../backend/catalog/genbki.pl'),
+    '--include-path=@SOURCE_ROOT@/src/include',
+    '--set-version='+pg_version_major.to_string(),
+    '--output=@OUTDIR@', '@INPUT@'
+  ],
+)
+
+
+# 'reformat-dat-files' is a convenience target for rewriting the
+# catalog data files in our standard format.  This includes collapsing
+# out any entries that are redundant with a BKI_DEFAULT annotation.
+run_target('reformat-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f],
+)
+
+# 'expand-dat-files' is a convenience target for expanding out all
+# default values in the catalog data files.  This should be run before
+# altering or removing any BKI_DEFAULT annotation.
+run_target('expand-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f, '--full-tuples'],
+)
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..15cdb459107
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,168 @@
+pg_config_ext = configure_file(input: 'pg_config_ext.h.meson',
+  output : 'pg_config_ext.h',
+  configuration : cdata,
+  install: true,
+  install_dir: dir_include)
+
+pg_config_os = configure_file(
+  output : 'pg_config_os.h',
+  input: files('port/@0@.h'.format(host_system)),
+  install: true,
+  install_dir : dir_include,
+  copy : true)
+
+pg_config = configure_file(
+  output : 'pg_config.h',
+  install : true,
+  install_dir : dir_include,
+  configuration : cdata)
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', dir_prefix / dir_bin)
+config_paths_data.set_quoted('PGSHAREDIR', dir_prefix / dir_data)
+config_paths_data.set_quoted('SYSCONFDIR', dir_prefix / dir_sysconf)
+config_paths_data.set_quoted('INCLUDEDIR', dir_prefix / dir_include)
+config_paths_data.set_quoted('PKGINCLUDEDIR', dir_prefix / dir_include_pkg)
+config_paths_data.set_quoted('INCLUDEDIRSERVER', dir_prefix / dir_include_server)
+config_paths_data.set_quoted('LIBDIR', dir_prefix / dir_lib)
+config_paths_data.set_quoted('PKGLIBDIR', dir_prefix / dir_lib_pkg)
+config_paths_data.set_quoted('LOCALEDIR', dir_prefix / dir_locale)
+config_paths_data.set_quoted('DOCDIR', dir_prefix / dir_doc)
+config_paths_data.set_quoted('HTMLDIR', dir_prefix / dir_doc_html)
+config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
+
+
+var_cc = ' '.join(cc.cmd_array())
+var_cpp = ' '.join(g_c_args)
+var_cflags = ' '.join(cbflags + cflags)
+var_cxxflags = ' '.join(cbflags + cxxflags)
+var_cppflags = ' '.join(g_c_args)
+var_cflags_sl = '-fPIC' #FIXME
+var_ldflags = ' '.join(ldflags)
+# FIXME:
+var_ldflags_sl = ''
+var_ldflags_ex = ''
+# FIXME - some extensions might directly use symbols from one of libs. If
+# that symbol isn't used by postgres, and statically linked, it'll cause an
+# undefined symbol at runtime. And obviously it'll cause problems for
+# executables, although those are probably less common.
+var_libs = ''
+
+
+configure_file(
+  output: 'pg_config_paths.h',
+  configuration: config_paths_data,
+  install: false
+)
+
+install_headers(
+  'pg_config_manual.h',
+  'postgres_ext.h',
+  'pg_config_manual.h',
+)
+
+install_headers(
+  'libpq/libpq-fs.h',
+  install_dir: dir_include / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'port.h',
+  'postgres_fe.h',
+  install_dir: dir_include_internal
+)
+
+install_headers(
+  'libpq/pqcomm.h',
+  install_dir: dir_include_internal / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'fmgr.h',
+  'funcapi.h',
+  'getaddrinfo.h',
+  'getopt_long.h',
+  'miscadmin.h',
+  'pg_config_manual.h',
+  'pg_getopt.h',
+  'pg_trace.h',
+  'pgstat.h',
+  'pgtar.h',
+  'pgtime.h',
+  'port.h',
+  'postgres.h',
+  'postgres_ext.h',
+  'postgres_fe.h',
+  'rusagestub.h',
+  'windowapi.h',
+  pg_config_ext,
+  pg_config_os,
+  pg_config,
+  install_dir: dir_include_server,
+)
+
+subdir('catalog')
+subdir('nodes')
+subdir('parser')
+subdir('pch')
+subdir('storage')
+subdir('utils')
+
+header_subdirs = [
+  'access',
+  'catalog',
+  'bootstrap',
+  'commands',
+  'common',
+  'datatype',
+  'executor',
+  'fe_utils',
+  'foreign',
+  'jit',
+  'lib',
+  'libpq',
+  'mb',
+  'nodes',
+  'optimizer',
+  'parser',
+  'partitioning',
+  'postmaster',
+  'regex',
+  'replication',
+  'rewrite',
+  'statistics',
+  'storage',
+  'tcop',
+  'snowball',
+  'tsearch',
+  'utils',
+  'port',
+  'portability',
+]
+
+# XXX: installing headers this way has the danger of installing editor files
+# etc, unfortunately install_subdir() doesn't allow including / excluding by
+# pattern currently.
+foreach d : header_subdirs
+  if d == 'catalog'
+    continue
+  endif
+  install_subdir(d, install_dir: dir_include_server,
+                 exclude_files: ['.gitignore', 'meson.build'])
+endforeach
+
+install_subdir('catalog',
+  install_dir: dir_include_server,
+  exclude_files: [
+    '.gitignore',
+    'Makefile',
+    'duplicate_oids',
+    'meson.build',
+    'reformat_dat_file.pl',
+    'renumber_oids.pl',
+    'unused_oids',
+  ] + bki_data,
+)
diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build
new file mode 100644
index 00000000000..5e242d25c4f
--- /dev/null
+++ b/src/include/nodes/meson.build
@@ -0,0 +1,54 @@
+node_support_input_i = [
+ 'nodes/nodes.h',
+ 'nodes/primnodes.h',
+ 'nodes/parsenodes.h',
+ 'nodes/pathnodes.h',
+ 'nodes/plannodes.h',
+ 'nodes/execnodes.h',
+ 'access/amapi.h',
+ 'access/sdir.h',
+ 'access/tableam.h',
+ 'access/tsmapi.h',
+ 'commands/event_trigger.h',
+ 'commands/trigger.h',
+ 'executor/tuptable.h',
+ 'foreign/fdwapi.h',
+ 'nodes/extensible.h',
+ 'nodes/lockoptions.h',
+ 'nodes/replnodes.h',
+ 'nodes/supportnodes.h',
+ 'nodes/value.h',
+ 'utils/rel.h',
+]
+
+node_support_input = []
+foreach i : node_support_input_i
+  node_support_input += meson.source_root() / 'src' / 'include' / i
+endforeach
+
+node_support_output = [
+  'nodetags.h',
+  'outfuncs.funcs.c', 'outfuncs.switch.c',
+  'readfuncs.funcs.c', 'readfuncs.switch.c',
+  'copyfuncs.funcs.c', 'copyfuncs.switch.c',
+  'equalfuncs.funcs.c', 'equalfuncs.switch.c',
+]
+node_support_install = [
+  dir_include_server / 'nodes',
+  false, false,
+  false, false,
+  false, false,
+  false, false,
+]
+
+generated_nodes = custom_target('nodetags.h',
+  input: node_support_input,
+  output: node_support_output,
+  command: [
+    perl, files('../../backend/nodes/gen_node_support.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'],
+  install: true,
+  install_dir: node_support_install,
+)
+generated_headers += generated_nodes[0]
diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build
new file mode 100644
index 00000000000..19b1617794f
--- /dev/null
+++ b/src/include/parser/meson.build
@@ -0,0 +1,11 @@
+backend_parser = custom_target('gram',
+  input: [files('../../backend/parser/gram.y')],
+  output: ['gram.c', 'gram.h'],
+  command: [bison_cmd, '-d', '@INPUT@'],
+  install: true,
+  # Only install gram.h, not gram.c
+  install_dir: [false, dir_include_server / 'parser'],
+)
+
+backend_parser_code = backend_parser[0]
+backend_parser_header = backend_parser[1]
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..8fb0a1d6b56
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,3 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in.  This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..ebcb352c888
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,16 @@
+# FIXME: this creates an unnecessary lwlocknames.c - but it's not
+# obvious how to avoid that: meson insist on output files being in the
+# current dir.
+
+lwlocknames = custom_target('lwlocknames',
+  input : files('../../backend/storage/lmgr/lwlocknames.txt'),
+  output : ['lwlocknames.h', 'lwlocknames.c'],
+  command : [perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@'],
+  build_by_default: true,
+  install: true,
+  install_dir: [dir_include_server / 'storage', false],
+)
+
+lwlocknames_h = lwlocknames[0]
+
+generated_backend_headers += lwlocknames_h
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..bc4b904793a
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,46 @@
+errcodes = custom_target('errcodes',
+  input : files('../../backend/utils/errcodes.txt'),
+  output : ['errcodes.h'],
+  command : [perl, files('../../backend/utils/generate-errcodes.pl'), '--outfile', '@OUTPUT@', '@INPUT@'],
+  install: true,
+  install_dir: dir_include_server/'utils',
+)
+generated_headers += errcodes
+
+if dtrace.found()
+  probes_tmp = custom_target('probes.h.tmp',
+    input: files('../../backend/utils/probes.d'),
+    output : 'probes.h.tmp',
+    command : [dtrace, '-C', '-h', '-s', '@INPUT@', '-o', '@OUTPUT@'],
+  )
+  probes = custom_target('probes.h',
+    input: probes_tmp[0],
+    output : 'probes.h',
+    capture: true,
+    command : [sed, '-f', files('../../backend/utils/postprocess_dtrace.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server/'utils',
+  )
+else
+  probes = custom_target('probes.h',
+    input: files('../../backend/utils/probes.d'),
+    output : 'probes.h',
+    capture: true,
+    command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server/'utils',
+  )
+endif
+
+generated_backend_headers += probes
+
+fmgrtab_target = custom_target('fmgrtab',
+  input: '../catalog/pg_proc.dat',
+  output : ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'],
+  install: true,
+  install_dir: [dir_include_server/'utils', dir_include_server/'utils', false],
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..784ff6d1a32
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,176 @@
+common_sources = files(
+  'archive.c',
+  'base64.c',
+  'checksum_helper.c',
+  'compression.c',
+  'controldata_utils.c',
+  'encnames.c',
+  'exec.c',
+  'file_perm.c',
+  'file_utils.c',
+  'hashfn.c',
+  'ip.c',
+  'jsonapi.c',
+  'keywords.c',
+  'kwlookup.c',
+  'link-canary.c',
+  'md5_common.c',
+  'pg_get_line.c',
+  'pg_lzcompress.c',
+  'pg_prng.c',
+  'pgfnames.c',
+  'psprintf.c',
+  'relpath.c',
+  'rmtree.c',
+  'saslprep.c',
+  'scram-common.c',
+  'string.c',
+  'stringinfo.c',
+  'unicode_norm.c',
+  'username.c',
+  'wait_error.c',
+  'wchar.c',
+)
+
+# FIXME: implement openssl
+if ssl.found()
+  common_sources += files(
+    'cryptohash_openssl.c',
+    'hmac_openssl.c',
+    'protocol_openssl.c',
+  )
+else
+  common_sources += files(
+    'cryptohash.c',
+    'hmac.c',
+    'md5.c',
+    'sha1.c',
+    'sha2.c',
+  )
+endif
+
+common_sources += custom_target('kwlist',
+  input: files('../include/parser/kwlist.h'),
+  output: 'kwlist_d.h',
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+      '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+  'd2s.c',
+  'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+  ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+config_info_sources = files('config_info.c',)
+config_info_cflags = [
+  '-DVAL_CC="@0@"'.format(var_cc),
+  '-DVAL_CPPFLAGS="@0@"'.format(var_cppflags),
+  '-DVAL_CFLAGS="@0@"'.format(var_cflags),
+  '-DVAL_CFLAGS_SL="@0@"'.format(var_cflags_sl),
+  '-DVAL_LDFLAGS="@0@"'.format(var_ldflags),
+  '-DVAL_LDFLAGS_EX="@0@"'.format(var_ldflags_ex),
+  '-DVAL_LDFLAGS_SL="@0@"'.format(var_ldflags_sl),
+  '-DVAL_LIBS="@0@"'.format(var_libs),
+]
+
+# Some files need to be built with different cflags. The different sets are
+# defined here.
+common_cflags = {
+  'ryu': ryu_cflags,
+  'config_info': config_info_cflags,
+}
+common_sources_cflags = {
+  'ryu': ryu_sources,
+  'config_info': config_info_sources
+}
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+  'fe_memutils.c',
+  'restricted_token.c',
+  'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+  'logging.c',
+)
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+#
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+#
+# For the server build of pgcommon, depend on lwlocknames_h, because at least
+# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a
+# layering violation, but ...
+pgcommon = {}
+pgcommon_variants = {
+  '_srv' : internal_lib_args + {
+    'sources': common_sources + [lwlocknames_h],
+    'dependencies': [backend_common_code],
+   },
+  '' : default_lib_args + {
+    'sources': common_sources_frontend_static,
+    'dependencies': [frontend_common_code],
+   },
+  '_shlib' : default_lib_args + {
+    'pic': true,
+    'sources': common_sources_frontend_shlib,
+    'dependencies': [frontend_common_code],
+   },
+}
+
+foreach name, opts : pgcommon_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources: common_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + common_cflags[cflagname]
+    cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      c_pch: pch_c_h,
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'sources': sources,
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgcommon@0@'.format(name),
+      link_with: cflag_libs,
+      c_pch: pch_c_h,
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgcommon += {name: lib}
+endforeach
+
+common_srv = pgcommon['_srv']
+common_shlib = pgcommon['_shlib']
+common_static = pgcommon['']
+
+subdir('unicode')
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
new file mode 100644
index 00000000000..cc25f881875
--- /dev/null
+++ b/src/common/unicode/meson.build
@@ -0,0 +1,101 @@
+# These files are part of the Unicode Character Database. Download
+# them on demand.
+
+UNICODE_VERSION = '14.0.0'
+
+unicode_data = {}
+unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
+
+if not wget.found()
+  subdir_done()
+endif
+
+foreach f : ['UnicodeData.txt', 'EastAsianWidth.txt', 'DerivedNormalizationProps.txt', 'CompositionExclusions.txt', 'NormalizationTest.txt']
+  url = unicode_baseurl.format(UNICODE_VERSION, f)
+  target = custom_target(f,
+    output: f,
+    command: [wget, wget_flags, url],
+    build_by_default: false,
+  )
+  unicode_data += {f: target}
+endforeach
+
+
+update_unicode_targets = []
+
+update_unicode_targets += \
+  custom_target('unicode_norm_table.h',
+    input: [unicode_data['UnicodeData.txt'], unicode_data['CompositionExclusions.txt']],
+    output: ['unicode_norm_table.h', 'unicode_norm_hashfunc.h'],
+    command: [
+      perl, files('generate-unicode_norm_table.pl'),
+      '--outdir', '@OUTDIR@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_combining_table.h',
+    input: [unicode_data['UnicodeData.txt']],
+    output: ['unicode_combining_table.h'],
+    command: [perl, files('generate-unicode_combining_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_east_asian_fw_table.h',
+    input: [unicode_data['EastAsianWidth.txt']],
+    output: ['unicode_east_asian_fw_table.h'],
+    command: [perl, files('generate-unicode_east_asian_fw_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_normprops_table.h',
+    input: [unicode_data['DerivedNormalizationProps.txt']],
+    output: ['unicode_normprops_table.h'],
+    command: [perl, files('generate-unicode_normprops_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+norm_test_table = custom_target('norm_test_table.h',
+    input: [unicode_data['NormalizationTest.txt']],
+    output: ['norm_test_table.h'],
+    command: [perl, files('generate-norm_test_table.pl'), '@INPUT@', '@OUTPUT@'],
+    build_by_default: false,
+  )
+
+inc = include_directories('.')
+
+norm_test = executable('norm_test',
+  ['norm_test.c', norm_test_table],
+  dependencies: [frontend_port_code],
+  include_directories: inc,
+  link_with: [pgport_static, common_static],
+  build_by_default: false,
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+if not meson.is_cross_build()
+  norm_test_valid = custom_target('norm_test.valid',
+    output: 'norm_test.valid',
+    depends: update_unicode_targets,
+    command: [norm_test],
+    build_by_default: false,
+    capture: true,
+  )
+
+  run_target('update-unicode',
+    depends: norm_test_valid,
+    command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+  )
+else
+  run_target('update-unicode',
+    depends: update_unicode_targets,
+    command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+  )
+endif
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..1dc9f39d6cd
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,188 @@
+pgport_sources = [
+  'bsearch_arg.c',
+  'chklocale.c',
+  'inet_net_ntop.c',
+  'noblock.c',
+  'path.c',
+  'pg_bitutils.c',
+  'pg_strong_random.c',
+  'pgcheckdir.c',
+  'pgmkdirp.c',
+  'pgsleep.c',
+  'pgstrcasecmp.c',
+  'pgstrsignal.c',
+  'pqsignal.c',
+  'qsort.c',
+  'qsort_arg.c',
+  'quotes.c',
+  'snprintf.c',
+  'strerror.c',
+  'tar.c',
+  'thread.c',
+]
+
+if host_system == 'win32'
+  pgport_sources += files(
+    'dirmod.c',
+    'kill.c',
+    'open.c',
+    'system.c',
+    'win32env.c',
+    'win32error.c',
+    'win32ntdll.c',
+    'win32security.c',
+    'win32setlocale.c',
+    'win32stat.c',
+  )
+endif
+
+if cc.get_id() == 'msvc'
+  pgport_sources += files(
+    'dirent.c',
+  )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+    ['dlopen'],
+    ['explicit_bzero'],
+    ['fls'],
+    ['getaddrinfo'],
+    ['getopt'],
+    ['getopt_long'],
+    ['getpeereid'],
+    ['getrusage'],
+    ['gettimeofday'],
+    ['inet_aton'],
+    ['link'],
+    ['mkdtemp'],
+    ['pread'],
+    ['preadv', 'HAVE_DECL_PREADV'],
+    ['pwrite'],
+    ['pwritev', 'HAVE_DECL_PWRITEV'],
+    ['strlcat'],
+    ['strlcpy'],
+    ['strnlen'],
+]
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+  # x86/x64
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # arm / aarch64
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # generic fallback
+  ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
+]
+
+pgport_cflags = {'crc': cflags_crc}
+pgport_sources_cflags = {'crc': []}
+
+foreach f : replace_funcs_neg
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'false' or val == '0'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+foreach f : replace_funcs_pos
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'true' or val == '1'
+    src = files(filename)
+    if f.length() > 2
+      pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
+    else
+      pgport_sources += src
+    endif
+  endif
+endforeach
+
+
+if (host_system == 'win32' or host_system == 'cygwin') and \
+  (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+  # Cygwin and (apparently, based on test results) Mingw both
+  # have a broken strtof(), so substitute the same replacement
+  # code we use with VS2013. That's not a perfect fix, since
+  # (unlike with VS2013) it doesn't avoid double-rounding, but
+  # we have no better options. To get that, though, we have to
+  # force the file to be compiled despite HAVE_STRTOF.
+  pgport_sources += files('strtof.c')
+  message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+    host_system, cc.get_id(), cc.version()))
+endif
+
+if not cdata.has('HAVE_PTHREAD_BARRIER_WAIT') and host_system != 'win32'
+   pgport_sources += files('pthread_barrier_wait.c')
+endif
+
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+pgport = {}
+pgport_variants = {
+  '_srv' : internal_lib_args + {
+    'dependencies': [backend_port_code],
+   },
+  '' : default_lib_args + {
+    'dependencies': [frontend_port_code],
+   },
+  '_shlib' : default_lib_args + {
+    'pic': true,
+    'dependencies': [frontend_port_code],
+   },
+}
+
+foreach name, opts : pgport_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources: pgport_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
+    cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
+      sources,
+      c_pch: pch_c_h,
+      kwargs: opts + {
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgport@0@'.format(name),
+      pgport_sources,
+      link_with: cflag_libs,
+      c_pch: pch_c_h,
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgport += {name: lib}
+endforeach
+
+pgport_srv = pgport['_srv']
+pgport_static = pgport['']
+pgport_shlib = pgport['_shlib']
diff --git a/src/port/win32ver.rc.in b/src/port/win32ver.rc.in
new file mode 100644
index 00000000000..eb0d45dccf1
--- /dev/null
+++ b/src/port/win32ver.rc.in
@@ -0,0 +1,41 @@
+#include <winver.h>
+#include "pg_config.h"
+
+// https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION    PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ PRODUCTVERSION PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ FILEFLAGSMASK  VS_FFI_FILEFLAGSMASK
+ FILEFLAGS      0x0L
+ FILEOS         VOS_NT_WINDOWS32
+ FILETYPE	@VFT_TYPE@
+ FILESUBTYPE    0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+  BLOCK "040904B0"			// U.S. English, Unicode
+  BEGIN
+   VALUE "CompanyName",      "PostgreSQL Global Development Group"
+   VALUE "FileDescription",  "@FILEDESC@"
+   /*
+    * XXX: In the autoconf / src/tools/msvc build this was set differently than
+    * ProductVersion below, using the current date. But that doesn't seem like a
+    * good idea, because it makes the build not reproducible and causes
+    * unnecessary rebuilds?
+    */
+   VALUE "FileVersion",      PG_VERSION
+   VALUE "InternalName",     "@NAME@"
+   VALUE "LegalCopyright", "Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California."
+   VALUE "OriginalFileName", "@NAME@.@FILEENDING@"
+   VALUE "ProductName",      "PostgreSQL"
+   VALUE "ProductVersion",   PG_VERSION
+  END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+  VALUE "Translation", 0x0409, 1200	// U.S. English, Unicode
+ END
+END
+
+IDI_ICON ICON "@ICO@"
diff --git a/config/meson.build b/config/meson.build
new file mode 100644
index 00000000000..ab19c380bd2
--- /dev/null
+++ b/config/meson.build
@@ -0,0 +1,4 @@
+install_data(
+  'install-sh', 'missing',
+  install_dir: dir_pgxs / 'config'
+)
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'brin.c',
+  'brin_bloom.c',
+  'brin_inclusion.c',
+  'brin_minmax.c',
+  'brin_minmax_multi.c',
+  'brin_pageops.c',
+  'brin_revmap.c',
+  'brin_tuple.c',
+  'brin_validate.c',
+  'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'attmap.c',
+  'bufmask.c',
+  'detoast.c',
+  'heaptuple.c',
+  'indextuple.c',
+  'printsimple.c',
+  'printtup.c',
+  'relation.c',
+  'reloptions.c',
+  'scankey.c',
+  'session.c',
+  'syncscan.c',
+  'toast_compression.c',
+  'toast_internals.c',
+  'tupconvert.c',
+  'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'ginarrayproc.c',
+  'ginbtree.c',
+  'ginbulk.c',
+  'gindatapage.c',
+  'ginentrypage.c',
+  'ginfast.c',
+  'ginget.c',
+  'gininsert.c',
+  'ginlogic.c',
+  'ginpostinglist.c',
+  'ginscan.c',
+  'ginutil.c',
+  'ginvacuum.c',
+  'ginvalidate.c',
+  'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'gist.c',
+  'gistbuild.c',
+  'gistbuildbuffers.c',
+  'gistget.c',
+  'gistproc.c',
+  'gistscan.c',
+  'gistsplit.c',
+  'gistutil.c',
+  'gistvacuum.c',
+  'gistvalidate.c',
+  'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'hash.c',
+  'hash_xlog.c',
+  'hashfunc.c',
+  'hashinsert.c',
+  'hashovfl.c',
+  'hashpage.c',
+  'hashsearch.c',
+  'hashsort.c',
+  'hashutil.c',
+  'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'heapam.c',
+  'heapam_handler.c',
+  'heapam_visibility.c',
+  'heaptoast.c',
+  'hio.c',
+  'pruneheap.c',
+  'rewriteheap.c',
+  'vacuumlazy.c',
+  'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'amapi.c',
+  'amvalidate.c',
+  'genam.c',
+  'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'nbtcompare.c',
+  'nbtdedup.c',
+  'nbtinsert.c',
+  'nbtpage.c',
+  'nbtree.c',
+  'nbtsearch.c',
+  'nbtsort.c',
+  'nbtsplitloc.c',
+  'nbtutils.c',
+  'nbtvalidate.c',
+  'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+  'brindesc.c',
+  'clogdesc.c',
+  'committsdesc.c',
+  'dbasedesc.c',
+  'genericdesc.c',
+  'gindesc.c',
+  'gistdesc.c',
+  'hashdesc.c',
+  'heapdesc.c',
+  'logicalmsgdesc.c',
+  'mxactdesc.c',
+  'nbtdesc.c',
+  'relmapdesc.c',
+  'replorigindesc.c',
+  'seqdesc.c',
+  'smgrdesc.c',
+  'spgdesc.c',
+  'standbydesc.c',
+  'tblspcdesc.c',
+  'xactdesc.c',
+  'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'spgdoinsert.c',
+  'spginsert.c',
+  'spgkdtreeproc.c',
+  'spgproc.c',
+  'spgquadtreeproc.c',
+  'spgscan.c',
+  'spgtextproc.c',
+  'spgutils.c',
+  'spgvacuum.c',
+  'spgvalidate.c',
+  'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'table.c',
+  'tableam.c',
+  'tableamapi.c',
+  'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bernoulli.c',
+  'system.c',
+  'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..c32169bd2c6
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'clog.c',
+  'commit_ts.c',
+  'generic_xlog.c',
+  'multixact.c',
+  'parallel.c',
+  'rmgr.c',
+  'slru.c',
+  'subtrans.c',
+  'timeline.c',
+  'transam.c',
+  'twophase.c',
+  'twophase_rmgr.c',
+  'varsup.c',
+  'xact.c',
+  'xlog.c',
+  'xlogarchive.c',
+  'xlogfuncs.c',
+  'xloginsert.c',
+  'xlogprefetcher.c',
+  'xlogrecovery.c',
+  'xlogstats.c',
+  'xlogutils.c',
+)
+
+# used by frontend programs to build a frontend xlogreader
+xlogreader_sources = files(
+  'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..5a06f32d834
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+bootscanner = custom_target('bootscanner',
+  input: ['bootscanner.l'],
+  output: ['bootscanner.c'],
+  command: [flex_cmd, '@INPUT@'],)
+
+generated_backend_sources += custom_target('bootparse',
+  input: ['bootparse.y', bootscanner[0]],
+  output: ['bootparse.c'],
+  command: [bison_cmd, '@INPUT0@'],)
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..08747914516
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,44 @@
+backend_sources += files(
+  'aclchk.c',
+  'catalog.c',
+  'dependency.c',
+  'heap.c',
+  'index.c',
+  'indexing.c',
+  'namespace.c',
+  'objectaccess.c',
+  'objectaddress.c',
+  'partition.c',
+  'pg_aggregate.c',
+  'pg_attrdef.c',
+  'pg_cast.c',
+  'pg_class.c',
+  'pg_collation.c',
+  'pg_constraint.c',
+  'pg_conversion.c',
+  'pg_db_role_setting.c',
+  'pg_depend.c',
+  'pg_enum.c',
+  'pg_inherits.c',
+  'pg_largeobject.c',
+  'pg_namespace.c',
+  'pg_operator.c',
+  'pg_parameter_acl.c',
+  'pg_proc.c',
+  'pg_publication.c',
+  'pg_range.c',
+  'pg_shdepend.c',
+  'pg_subscription.c',
+  'pg_type.c',
+  'storage.c',
+  'toasting.c',
+)
+
+
+install_data(
+  'information_schema.sql',
+  'sql_features.txt',
+  'system_functions.sql',
+  'system_views.sql',
+  install_dir: dir_data,
+)
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..9b350d025ff
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'aggregatecmds.c',
+  'alter.c',
+  'amcmds.c',
+  'analyze.c',
+  'async.c',
+  'cluster.c',
+  'collationcmds.c',
+  'comment.c',
+  'constraint.c',
+  'conversioncmds.c',
+  'copy.c',
+  'copyfrom.c',
+  'copyfromparse.c',
+  'copyto.c',
+  'createas.c',
+  'dbcommands.c',
+  'define.c',
+  'discard.c',
+  'dropcmds.c',
+  'event_trigger.c',
+  'explain.c',
+  'extension.c',
+  'foreigncmds.c',
+  'functioncmds.c',
+  'indexcmds.c',
+  'lockcmds.c',
+  'matview.c',
+  'opclasscmds.c',
+  'operatorcmds.c',
+  'policy.c',
+  'portalcmds.c',
+  'prepare.c',
+  'proclang.c',
+  'publicationcmds.c',
+  'schemacmds.c',
+  'seclabel.c',
+  'sequence.c',
+  'statscmds.c',
+  'subscriptioncmds.c',
+  'tablecmds.c',
+  'tablespace.c',
+  'trigger.c',
+  'tsearchcmds.c',
+  'typecmds.c',
+  'user.c',
+  'vacuum.c',
+  'vacuumparallel.c',
+  'variable.c',
+  'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+  'execAmi.c',
+  'execAsync.c',
+  'execCurrent.c',
+  'execExpr.c',
+  'execExprInterp.c',
+  'execGrouping.c',
+  'execIndexing.c',
+  'execJunk.c',
+  'execMain.c',
+  'execParallel.c',
+  'execPartition.c',
+  'execProcnode.c',
+  'execReplication.c',
+  'execSRF.c',
+  'execScan.c',
+  'execTuples.c',
+  'execUtils.c',
+  'functions.c',
+  'instrument.c',
+  'nodeAgg.c',
+  'nodeAppend.c',
+  'nodeBitmapAnd.c',
+  'nodeBitmapHeapscan.c',
+  'nodeBitmapIndexscan.c',
+  'nodeBitmapOr.c',
+  'nodeCtescan.c',
+  'nodeCustom.c',
+  'nodeForeignscan.c',
+  'nodeFunctionscan.c',
+  'nodeGather.c',
+  'nodeGatherMerge.c',
+  'nodeGroup.c',
+  'nodeHash.c',
+  'nodeHashjoin.c',
+  'nodeIncrementalSort.c',
+  'nodeIndexonlyscan.c',
+  'nodeIndexscan.c',
+  'nodeLimit.c',
+  'nodeLockRows.c',
+  'nodeMaterial.c',
+  'nodeMemoize.c',
+  'nodeMergeAppend.c',
+  'nodeMergejoin.c',
+  'nodeModifyTable.c',
+  'nodeNamedtuplestorescan.c',
+  'nodeNestloop.c',
+  'nodeProjectSet.c',
+  'nodeRecursiveunion.c',
+  'nodeResult.c',
+  'nodeSamplescan.c',
+  'nodeSeqscan.c',
+  'nodeSetOp.c',
+  'nodeSort.c',
+  'nodeSubplan.c',
+  'nodeSubqueryscan.c',
+  'nodeTableFuncscan.c',
+  'nodeTidrangescan.c',
+  'nodeTidscan.c',
+  'nodeUnique.c',
+  'nodeValuesscan.c',
+  'nodeWindowAgg.c',
+  'nodeWorktablescan.c',
+  'spi.c',
+  'tqueue.c',
+  'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..a867eb60c9f
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,41 @@
+if llvm.found()
+
+  llvmjit_sources = []
+
+  # Infrastructure
+  llvmjit_sources += files(
+    'llvmjit.c',
+    'llvmjit_error.cpp',
+    'llvmjit_inline.cpp',
+    'llvmjit_wrap.cpp',
+  )
+
+  # Code generation
+  llvmjit_sources += files(
+    'llvmjit_deform.c',
+    'llvmjit_expr.c',
+  )
+
+  llvmjit = shared_module('llvmjit',
+    llvmjit_sources,
+    kwargs: pg_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [llvm],
+    }
+  )
+
+  backend_targets += llvmjit
+
+  # Note this is intentionally not installed to bitcodedir, as it's not for
+  # inlining
+  llvmjit_types = custom_target('llvmjit_types.bc',
+    kwargs: llvm_irgen_kw + {
+      'input': 'llvmjit_types.c',
+      'output': 'llvmjit_types.bc',
+      'depends': [postgres],
+      'install': true,
+      'install_dir': dir_lib_pkg,
+    }
+  )
+  backend_targets += llvmjit_types
+
+endif
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..53292563d34
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'binaryheap.c',
+  'bipartite_match.c',
+  'bloomfilter.c',
+  'dshash.c',
+  'hyperloglog.c',
+  'ilist.c',
+  'integerset.c',
+  'knapsack.c',
+  'pairingheap.c',
+  'rbtree.c'
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..6061269ef13
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,32 @@
+backend_sources += files(
+  'auth-sasl.c',
+  'auth-scram.c',
+  'auth.c',
+  'be-fsstubs.c',
+  'be-secure-common.c',
+  'be-secure.c',
+  'crypt.c',
+  'hba.c',
+  'ifaddr.c',
+  'pqcomm.c',
+  'pqformat.c',
+  'pqmq.c',
+  'pqsignal.c',
+)
+
+if ssl.found()
+  backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+  backend_sources += files(
+    'be-secure-gssapi.c',
+    'be-gssapi-common.c'
+  )
+endif
+
+install_data(
+  'pg_hba.conf.sample',
+  'pg_ident.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..83814006542
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,228 @@
+backend_build_deps = [backend_code]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+backend_c_args = []
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+subdir('po', if_found: libintl)
+
+
+postgres_link_args = []
+postgres_link_depends = []
+
+if host_system == 'win32'
+  if cc.get_id() == 'msvc'
+    postgres_link_args += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  else
+    postgres_link_args += '-Wl,--stack,@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  endif
+endif
+
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+#
+# XXX: This needs to be improved.
+#
+
+# NB: There's an outer and inner layer of == windows checks, to allow to
+# exercise most of this on !windows, by widening the outer "layer".
+
+if cc.get_id() == 'msvc' # or true
+
+  postgres_lib = static_library('postgres_lib',
+    backend_sources + timezone_sources + generated_backend_sources,
+    link_whole: backend_link_with,
+    c_pch: pch_postgres_h,
+    c_args: backend_c_args,
+    implicit_include_directories: false,
+    dependencies: backend_build_deps,
+    build_by_default: false,
+    install: false,
+  )
+
+  postgres_def = custom_target('postgres.def',
+    command: [perl, files('../tools/msvc/gendef2.pl'), 'x64', '@OUTPUT@', '@PRIVATE_DIR@', '@INPUT@'],
+    input: [postgres_lib, common_srv, pgport_srv],
+    output: 'postgres.def',
+    depends: [postgres_lib, common_srv, pgport_srv],
+    install: false,
+  )
+
+  if cc.get_id() == 'msvc'
+    postgres_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+    postgres_link_depends += postgres_def
+  endif
+
+  # Unfortunately the msvc linker whines when building an executable with just
+  # libraries, hence the reuse of the 'main' object directly.
+
+  postgres = executable('postgres',
+    objects: [postgres_lib.extract_objects(main_file)],
+    link_with: [postgres_lib],
+    link_args: postgres_link_args,
+    link_depends: postgres_link_depends,
+    export_dynamic: true,
+    implib: true,
+    kwargs: default_bin_args,
+  )
+
+else
+
+  postgres_objs = []
+  postgres_tmpl = static_library('postgres_lib',
+    backend_sources, timezone_sources, generated_backend_sources,
+    link_whole: backend_link_with,
+    c_pch: pch_postgres_h,
+    c_args: backend_c_args,
+    implicit_include_directories: false,
+    dependencies: backend_build_deps,
+    build_by_default: false,
+    install: false,
+  )
+
+  # As of 1/2010:
+  # The probes.o file is necessary for dtrace support on Solaris, and on recent
+  # versions of systemtap.  (Older systemtap releases just produce an empty
+  # file, but that's okay.)  However, macOS's dtrace doesn't use it and doesn't
+  # even recognize the -G option.  So, build probes.o except on macOS.
+  # This might need adjustment as other platforms add dtrace support.
+  #
+  # On at least linux we don't actually need to pass in all the objects, but
+  # at least on FreeBSD and Solaris we have to.
+  #
+  # XXX: The reason we only use the objects for generated sources is that hits
+  # a meson bug. Luckily we don't don't have probes in generated sources...
+  if dtrace.found() and host_system != 'darwin'
+    postgres_objs += custom_target(
+      'probes.o',
+      input: ['utils/probes.d', postgres_tmpl.extract_objects(backend_sources, timezone_sources)],
+      output : 'probes.o',
+      command : [dtrace, '-C', '-G', '-o', '@OUTPUT@', '-s', '@INPUT@'],
+      install: false,
+    )
+  endif
+
+  postgres = executable('postgres',
+    postgres_objs,
+    objects: postgres_tmpl.extract_all_objects(recursive: false),
+    link_args: postgres_link_args,
+    link_with: backend_link_with,
+    export_dynamic: true,
+    dependencies: [backend_build_deps],
+    kwargs: default_bin_args,
+  )
+
+endif
+
+backend_targets += postgres
+
+pg_mod_args = default_mod_args + {
+  'dependencies': [backend_mod_code],
+  'c_args': [],
+  'cpp_args': [],
+ }
+
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+  pg_mod_args = pg_mod_args + {
+    'c_args': pg_mod_args['c_args'] + ['-fvisibility=hidden'],
+    'cpp_args': pg_mod_args['c_args'] + ['-fvisibility=hidden', '-fvisibility-inlines-hidden'],
+  }
+endif
+
+# Windows / MacOs link shared modules against postgres. To avoid unnecessary
+# build-time dependencies on other operating systems, only add it when
+# necessary.
+if host_system == 'win32' or host_system == 'darwin'
+   pg_mod_args = pg_mod_args + {'link_with': [postgres]}
+endif
+if host_system == 'darwin'
+   pg_mod_args = pg_mod_args + {'link_args': ['-bundle_loader', '@0@'.format(postgres.full_path())]}
+endif
+
+
+# Shared modules that, on some OSs, link against the server binary. Only enter
+# these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
+
+
+if llvm.found()
+
+  # custom_target() insists on targetting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generators don't accept CustomTargetIndex as input or 'depends', nor do
+  # they like targets with more than one output. However, a custom target
+  # accepts them as input without a problem. So we have the below transitive
+  # target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: '@PLAINNAME@.bc',
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('bitcode',
+    output: ['bitcode'],
+    input: bc_backend_sources,
+    kwargs: llvm_irlink_kw,
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..3ba5a20a5d4
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,30 @@
+backend_sources += files(
+  'bitmapset.c',
+  'extensible.c',
+  'list.c',
+  'makefuncs.c',
+  'nodeFuncs.c',
+  'nodes.c',
+  'params.c',
+  'print.c',
+  'read.c',
+  'tidbitmap.c',
+  'value.c',
+)
+
+# these include .c files generated in ../../include/nodes, seems nicer to not
+# add that as an include path for the whole backend
+nodefunc_sources = files(
+  'copyfuncs.c',
+  'equalfuncs.c',
+  'outfuncs.c',
+  'readfuncs.c',
+)
+nodefuncs = static_library('nodefuncs',
+  nodefunc_sources,
+  c_pch: pch_c_h,
+  dependencies: [backend_code],
+  kwargs: default_lib_args + {'install': false},
+  include_directories: include_directories('../../include/nodes'),
+)
+backend_link_with += nodefuncs
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'geqo_copy.c',
+  'geqo_cx.c',
+  'geqo_erx.c',
+  'geqo_eval.c',
+  'geqo_main.c',
+  'geqo_misc.c',
+  'geqo_mutation.c',
+  'geqo_ox1.c',
+  'geqo_ox2.c',
+  'geqo_pmx.c',
+  'geqo_pool.c',
+  'geqo_px.c',
+  'geqo_random.c',
+  'geqo_recombination.c',
+  'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'allpaths.c',
+  'clausesel.c',
+  'costsize.c',
+  'equivclass.c',
+  'indxpath.c',
+  'joinpath.c',
+  'joinrels.c',
+  'pathkeys.c',
+  'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'analyzejoins.c',
+  'createplan.c',
+  'initsplan.c',
+  'planagg.c',
+  'planmain.c',
+  'planner.c',
+  'setrefs.c',
+  'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'prepagg.c',
+  'prepjointree.c',
+  'prepqual.c',
+  'preptlist.c',
+  'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'appendinfo.c',
+  'clauses.c',
+  'inherit.c',
+  'joininfo.c',
+  'orclauses.c',
+  'paramassign.c',
+  'pathnode.c',
+  'placeholder.c',
+  'plancat.c',
+  'predtest.c',
+  'relnode.c',
+  'restrictinfo.c',
+  'tlist.c',
+  'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..eab42cef0ae
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,45 @@
+backend_sources += files(
+  'analyze.c',
+  'parse_agg.c',
+  'parse_clause.c',
+  'parse_coerce.c',
+  'parse_collate.c',
+  'parse_cte.c',
+  'parse_enr.c',
+  'parse_expr.c',
+  'parse_func.c',
+  'parse_jsontable.c',
+  'parse_merge.c',
+  'parse_node.c',
+  'parse_oper.c',
+  'parse_param.c',
+  'parse_relation.c',
+  'parse_target.c',
+  'parse_type.c',
+  'parse_utilcmd.c',
+  'scansup.c',
+)
+
+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...
+
+parser_sources = [files('parser.c')]
+
+backend_scanner = custom_target('scan',
+  input: ['scan.l'],
+  output: ['scan.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-CF', '-p', '-p', '@INPUT@'],)
+parser_sources += backend_scanner[0]
+
+parser_sources += backend_parser_code
+parser_sources += backend_parser_header
+
+parser = static_library('parser',
+  parser_sources + generated_headers,
+  c_pch: pch_c_h,
+  dependencies: [backend_code],
+  kwargs: default_lib_args + {'install': false},
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'partbounds.c',
+  'partdesc.c',
+  'partprune.c',
+)
diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build
new file mode 100644
index 00000000000..4ace0554680
--- /dev/null
+++ b/src/backend/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('postgres-' + pg_version_major.to_string())
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..580a3631910
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+  'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+   backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+   backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+   backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+   backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+   backend_sources += files('win32_shmem.c')
+endif
+
+if host_system == 'win32'
+  subdir('win32')
+endif
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..e97676f0c78
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'signal.c',
+  'socket.c',
+  'timer.c',
+)
+
+if cdata.has('HAVE_MINIDUMP_TYPE')
+  backend_sources += files('crashdump.c')
+endif
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..293a44ca295
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'autovacuum.c',
+  'auxprocess.c',
+  'bgworker.c',
+  'bgwriter.c',
+  'checkpointer.c',
+  'fork_process.c',
+  'interrupt.c',
+  'pgarch.c',
+  'postmaster.c',
+  'shell_archive.c',
+  'startup.c',
+  'syslogger.c',
+  'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..d08e21cd6d6
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'regcomp.c',
+  'regerror.c',
+  'regexec.c',
+  'regexport.c',
+  'regfree.c',
+  'regprefix.c'
+)
+
+#FIXME
+# mark inclusion dependencies between .c files explicitly
+#regcomp.o: regcomp.c regc_lex.c regc_color.c regc_nfa.c regc_cvec.c \
+#        regc_locale.c regc_pg_locale.c
+#
+#regexec.o: regexec.c rege_dfa.c
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+  'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+  libpqwalreceiver_sources,
+  kwargs: pg_mod_args + {
+    'name_prefix': 'lib',
+    'dependencies': pg_mod_args['dependencies'] + [libpq],
+  }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+  'decode.c',
+  'launcher.c',
+  'logical.c',
+  'logicalfuncs.c',
+  'message.c',
+  'origin.c',
+  'proto.c',
+  'relation.c',
+  'reorderbuffer.c',
+  'snapbuild.c',
+  'tablesync.c',
+  'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..9d4b29df460
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'backup_manifest.c',
+  'basebackup.c',
+  'basebackup_copy.c',
+  'basebackup_gzip.c',
+  'basebackup_lz4.c',
+  'basebackup_progress.c',
+  'basebackup_server.c',
+  'basebackup_sink.c',
+  'basebackup_target.c',
+  'basebackup_throttle.c',
+  'basebackup_zstd.c',
+  'slot.c',
+  'slotfuncs.c',
+  'syncrep.c',
+  'walreceiver.c',
+  'walreceiverfuncs.c',
+  'walsender.c',
+)
+
+# [sync]repl_scanner is compiled as part of [sync]repl_gram. The
+# ordering is enforced by making the generation of grammar depend on
+# the scanner generation. That's unnecessarily strict, but overall
+# harmless.
+
+repl_scanner = custom_target('repl_scanner',
+  input : files('repl_scanner.l'),
+  output : ['repl_scanner.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+
+generated_backend_sources += custom_target('repl_gram',
+  input: 'repl_gram.y',
+  output: 'repl_gram.c',
+  depends: repl_scanner,
+  command: [bison_cmd, '@INPUT@'],)
+
+
+syncrep_scanner = custom_target('syncrep_scanner',
+  input: 'syncrep_scanner.l',
+  output: 'syncrep_scanner.c',
+  command: [flex_cmd, '@INPUT@'],)
+
+generated_backend_sources += custom_target('syncrep_gram',
+  input: 'syncrep_gram.y',
+  output: 'syncrep_gram.c',
+  depends: syncrep_scanner,
+  command: [bison_cmd, '@INPUT@'],)
+
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..8ff0a0c6133
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,11 @@
+pgoutput_sources = files(
+  'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+  pgoutput_sources,
+  kwargs: pg_mod_args + {
+  }
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..032e2e409b5
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'rewriteDefine.c',
+  'rewriteHandler.c',
+  'rewriteManip.c',
+  'rewriteRemove.c',
+  'rewriteSearchCycle.c',
+  'rewriteSupport.c',
+  'rowsecurity.c'
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..1359a002ba4
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,84 @@
+dict_snowball_sources = files(
+  'dict_snowball.c',
+  'libstemmer/api.c',
+  'libstemmer/utilities.c',
+)
+
+dict_snowball_sources += files(
+  'libstemmer/stem_ISO_8859_1_basque.c',
+  'libstemmer/stem_ISO_8859_1_catalan.c',
+  'libstemmer/stem_ISO_8859_1_danish.c',
+  'libstemmer/stem_ISO_8859_1_dutch.c',
+  'libstemmer/stem_ISO_8859_1_english.c',
+  'libstemmer/stem_ISO_8859_1_finnish.c',
+  'libstemmer/stem_ISO_8859_1_french.c',
+  'libstemmer/stem_ISO_8859_1_german.c',
+  'libstemmer/stem_ISO_8859_1_indonesian.c',
+  'libstemmer/stem_ISO_8859_1_irish.c',
+  'libstemmer/stem_ISO_8859_1_italian.c',
+  'libstemmer/stem_ISO_8859_1_norwegian.c',
+  'libstemmer/stem_ISO_8859_1_porter.c',
+  'libstemmer/stem_ISO_8859_1_portuguese.c',
+  'libstemmer/stem_ISO_8859_1_spanish.c',
+  'libstemmer/stem_ISO_8859_1_swedish.c',
+  'libstemmer/stem_ISO_8859_2_hungarian.c',
+  'libstemmer/stem_ISO_8859_2_romanian.c',
+  'libstemmer/stem_KOI8_R_russian.c',
+  'libstemmer/stem_UTF_8_arabic.c',
+  'libstemmer/stem_UTF_8_armenian.c',
+  'libstemmer/stem_UTF_8_basque.c',
+  'libstemmer/stem_UTF_8_catalan.c',
+  'libstemmer/stem_UTF_8_danish.c',
+  'libstemmer/stem_UTF_8_dutch.c',
+  'libstemmer/stem_UTF_8_english.c',
+  'libstemmer/stem_UTF_8_finnish.c',
+  'libstemmer/stem_UTF_8_french.c',
+  'libstemmer/stem_UTF_8_german.c',
+  'libstemmer/stem_UTF_8_greek.c',
+  'libstemmer/stem_UTF_8_hindi.c',
+  'libstemmer/stem_UTF_8_hungarian.c',
+  'libstemmer/stem_UTF_8_indonesian.c',
+  'libstemmer/stem_UTF_8_irish.c',
+  'libstemmer/stem_UTF_8_italian.c',
+  'libstemmer/stem_UTF_8_lithuanian.c',
+  'libstemmer/stem_UTF_8_nepali.c',
+  'libstemmer/stem_UTF_8_norwegian.c',
+  'libstemmer/stem_UTF_8_porter.c',
+  'libstemmer/stem_UTF_8_portuguese.c',
+  'libstemmer/stem_UTF_8_romanian.c',
+  'libstemmer/stem_UTF_8_russian.c',
+  'libstemmer/stem_UTF_8_serbian.c',
+  'libstemmer/stem_UTF_8_spanish.c',
+  'libstemmer/stem_UTF_8_swedish.c',
+  'libstemmer/stem_UTF_8_tamil.c',
+  'libstemmer/stem_UTF_8_turkish.c',
+  'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+  dict_snowball_sources,
+  c_pch: pch_postgres_h,
+  kwargs: pg_mod_args + {
+    'include_directories': [stemmer_inc],
+  }
+)
+
+snowball_create = custom_target('snowball_create',
+  input: ['snowball_create.pl'],
+  output: ['snowball_create.sql'],
+  depfile: 'snowball_create.dep',
+  command: [perl, '@INPUT0@', '--depfile', '--input', '@CURRENT_SOURCE_DIR@', '--outdir', '@OUTDIR@'],
+  install: true,
+  install_dir: dir_data,
+)
+
+install_subdir('stopwords',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true,
+)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'dependencies.c',
+  'extended_stats.c',
+  'mcv.c',
+  'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'buf_init.c',
+  'buf_table.c',
+  'bufmgr.c',
+  'freelist.c',
+  'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'buffile.c',
+  'copydir.c',
+  'fd.c',
+  'fileset.c',
+  'reinit.c',
+  'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'freespace.c',
+  'fsmpage.c',
+  'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+  'barrier.c',
+  'dsm.c',
+  'dsm_impl.c',
+  'ipc.c',
+  'ipci.c',
+  'latch.c',
+  'pmsignal.c',
+  'procarray.c',
+  'procsignal.c',
+  'shm_mq.c',
+  'shm_toc.c',
+  'shmem.c',
+  'shmqueue.c',
+  'signalfuncs.c',
+  'sinval.c',
+  'sinvaladt.c',
+  'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..938e7f89894
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'condition_variable.c',
+  'deadlock.c',
+  'lmgr.c',
+  'lock.c',
+  'lwlock.c',
+  'predicate.c',
+  'proc.c',
+  's_lock.c',
+  'spin.c',
+)
+
+lwlocknames_backend = custom_target('lwlocknames',
+  input : files('lwlocknames.txt'),
+  output : ['lwlocknames.c', 'lwlocknames.h'],
+  command : [perl, files('generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@']
+)
+generated_backend_sources += lwlocknames_backend[0]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bufpage.c',
+  'checksum.c',
+  'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'md.c',
+  'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'cmdtag.c',
+  'dest.c',
+  'fastpath.c',
+  'postgres.c',
+  'pquery.c',
+  'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..4144e9befc5
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+  'dict.c',
+  'dict_ispell.c',
+  'dict_simple.c',
+  'dict_synonym.c',
+  'dict_thesaurus.c',
+  'regis.c',
+  'spell.c',
+  'to_tsany.c',
+  'ts_locale.c',
+  'ts_parse.c',
+  'ts_selfuncs.c',
+  'ts_typanalyze.c',
+  'ts_utils.c',
+  'wparser.c',
+  'wparser_def.c',
+)
+
+install_subdir('dicts',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..5b3b558a67d
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'backend_progress.c',
+  'backend_status.c',
+  'pgstat.c',
+  'pgstat_archiver.c',
+  'pgstat_bgwriter.c',
+  'pgstat_checkpointer.c',
+  'pgstat_database.c',
+  'pgstat_function.c',
+  'pgstat_relation.c',
+  'pgstat_replslot.c',
+  'pgstat_shmem.c',
+  'pgstat_slru.c',
+  'pgstat_subscription.c',
+  'pgstat_wal.c',
+  'pgstat_xact.c',
+  'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..43d122e0b1e
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,119 @@
+backend_sources += files(
+  'acl.c',
+  'amutils.c',
+  'array_expanded.c',
+  'array_selfuncs.c',
+  'array_typanalyze.c',
+  'array_userfuncs.c',
+  'arrayfuncs.c',
+  'arraysubs.c',
+  'arrayutils.c',
+  'ascii.c',
+  'bool.c',
+  'cash.c',
+  'char.c',
+  'cryptohashfuncs.c',
+  'date.c',
+  'datetime.c',
+  'datum.c',
+  'dbsize.c',
+  'domains.c',
+  'encode.c',
+  'enum.c',
+  'expandeddatum.c',
+  'expandedrecord.c',
+  'float.c',
+  'format_type.c',
+  'formatting.c',
+  'genfile.c',
+  'geo_ops.c',
+  'geo_selfuncs.c',
+  'geo_spgist.c',
+  'hbafuncs.c',
+  'inet_cidr_ntop.c',
+  'inet_net_pton.c',
+  'int.c',
+  'int8.c',
+  'json.c',
+  'jsonb.c',
+  'jsonb_gin.c',
+  'jsonb_op.c',
+  'jsonb_util.c',
+  'jsonfuncs.c',
+  'jsonbsubs.c',
+  'jsonpath.c',
+  'jsonpath_exec.c',
+  'like.c',
+  'like_support.c',
+  'lockfuncs.c',
+  'mac.c',
+  'mac8.c',
+  'mcxtfuncs.c',
+  'misc.c',
+  'multirangetypes.c',
+  'multirangetypes_selfuncs.c',
+  'name.c',
+  'network.c',
+  'network_gist.c',
+  'network_selfuncs.c',
+  'network_spgist.c',
+  'numeric.c',
+  'numutils.c',
+  'oid.c',
+  'oracle_compat.c',
+  'orderedsetaggs.c',
+  'partitionfuncs.c',
+  'pg_locale.c',
+  'pg_lsn.c',
+  'pg_upgrade_support.c',
+  'pgstatfuncs.c',
+  'pseudotypes.c',
+  'quote.c',
+  'rangetypes.c',
+  'rangetypes_gist.c',
+  'rangetypes_selfuncs.c',
+  'rangetypes_spgist.c',
+  'rangetypes_typanalyze.c',
+  'regexp.c',
+  'regproc.c',
+  'ri_triggers.c',
+  'rowtypes.c',
+  'ruleutils.c',
+  'selfuncs.c',
+  'tid.c',
+  'timestamp.c',
+  'trigfuncs.c',
+  'tsginidx.c',
+  'tsgistidx.c',
+  'tsquery.c',
+  'tsquery_cleanup.c',
+  'tsquery_gist.c',
+  'tsquery_op.c',
+  'tsquery_rewrite.c',
+  'tsquery_util.c',
+  'tsrank.c',
+  'tsvector.c',
+  'tsvector_op.c',
+  'tsvector_parser.c',
+  'uuid.c',
+  'varbit.c',
+  'varchar.c',
+  'varlena.c',
+  'version.c',
+  'windowfuncs.c',
+  'xid.c',
+  'xid8funcs.c',
+  'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+  input: ['jsonpath_scan.l'],
+  output: ['jsonpath_scan.c'],
+  command: [flex_cmd, flex_backup, '-CF', '-p', '-p', '@INPUT@'],)
+
+# jsonpath_scan is compiled as part of jsonpath_gram
+generated_backend_sources += custom_target('jsonpath_parse',
+  input: ['jsonpath_gram.y', jsonpath_scan[0]],
+  output: ['jsonpath_gram.c'],
+  command: [bison_cmd, '@INPUT0@'],)
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..4fe6db6bda6
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'attoptcache.c',
+  'catcache.c',
+  'evtcache.c',
+  'inval.c',
+  'lsyscache.c',
+  'partcache.c',
+  'plancache.c',
+  'relcache.c',
+  'relfilenumbermap.c',
+  'relmapper.c',
+  'spccache.c',
+  'syscache.c',
+  'ts_cache.c',
+  'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..325446c8f93
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'assert.c',
+  'csvlog.c',
+  'elog.c',
+  'jsonlog.c',
+)
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'dfmgr.c',
+  'fmgr.c',
+  'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'dynahash.c',
+  'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'globals.c',
+  'miscinit.c',
+  'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..b84a78b6318
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,38 @@
+encodings = {
+  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+  'euc_tw_and_big5': [
+    'euc_tw_and_big5/euc_tw_and_big5.c',
+    'euc_tw_and_big5/big5.c',
+  ],
+  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+  backend_targets += shared_module(encoding,
+    sources,
+    kwargs: pg_mod_args + {
+    }
+  )
+
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'conv.c',
+  'mbutils.c',
+  'stringinfo_mb.c',
+  'wstrcmp.c',
+  'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..3a916320bb3
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,17 @@
+install_data('errcodes.txt',
+  install_dir: dir_data,
+)
+
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..2f886e407d5
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,32 @@
+backend_sources += files(
+  'guc.c',
+  'help_config.c',
+  'pg_config.c',
+  'pg_controldata.c',
+  'pg_rusage.c',
+  'ps_status.c',
+  'queryenvironment.c',
+  'queryjumble.c',
+  'rls.c',
+  'sampling.c',
+  'superuser.c',
+  'timeout.c',
+  'tzparser.c',
+)
+
+# guc-file.c is compiled as part of guc.c, generate guc-file.c.h so it can be
+# added as a dependency for the executable. Not pretty, but there's no
+# obviously better solution right now
+guc_scan = custom_target('guc_scan',
+  input: ['guc-file.l'],
+  output: ['guc-file.c', 'guc-file.c.h'],
+  command: [flex_cmd, '@INPUT@', '--stamp_header', '@OUTPUT1@'])
+
+backend_build_deps += declare_dependency(
+  sources: guc_scan[1],
+  include_directories: include_directories('.'))
+generated_backend_headers += guc_scan[1]
+
+install_data('postgresql.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'aset.c',
+  'dsa.c',
+  'freepage.c',
+  'generation.c',
+  'mcxt.c',
+  'memdebug.c',
+  'portalmem.c',
+  'slab.c',
+)
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..5d5e5ba1194
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'logtape.c',
+  'sharedtuplestore.c',
+  'sortsupport.c',
+  'tuplesort.c',
+  'tuplestore.c',
+  'qsort_interruptible.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'combocid.c',
+  'snapmgr.c',
+)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..01f060bb0da
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,28 @@
+fe_utils_sources = files(
+  'archive.c',
+  'cancel.c',
+  'conditional.c',
+  'connect_utils.c',
+  'mbprint.c',
+  'option_utils.c',
+  'parallel_slot.c',
+  'print.c',
+  'query_utils.c',
+  'recovery_gen.c',
+  'simple_list.c',
+  'string_utils.c',
+)
+
+fe_utils_sources += custom_target('psqlscan',
+  input: ['psqlscan.l'],
+  output: ['psqlscan.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'],
+)
+
+fe_utils = static_library('pgfeutils',
+  fe_utils_sources + generated_headers,
+  c_pch: pch_c_h,
+  include_directories :  [postgres_inc, libpq_inc],
+  c_args: ['-DFRONTEND'],
+  kwargs: default_lib_args,
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..131c416064f
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,39 @@
+initdb_sources = files(
+  'findtimezone.c',
+  'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+if host_system == 'win32'
+  initdb_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'initdb - initialize a new database cluster',
+        '--NAME', 'initdb',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+executable('initdb',
+  initdb_sources,
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code, libpq, icu, icu_i18n],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'initdb',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_initdb.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 00000000000..8b8a9fd2ce1
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('initdb-' + pg_version_major.to_string())
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..5fd5a9d2f98
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..3d130097615
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,26 @@
+pg_amcheck_sources = files(
+  'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+  pg_amcheck_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_nonesuch.pl',
+      't/003_check.pl',
+      't/004_verify_heapam.pl',
+      't/005_opclass_damage.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 00000000000..b255f552c94
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_amcheck-' + pg_version_major.to_string())
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..b5d393b3b32
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,18 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+  ['pg_archivecleanup.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_archivecleanup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_pg_archivecleanup.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 00000000000..37935fcabc4
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..857e2b77d23
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,58 @@
+common_sources = files(
+  'bbstreamer_file.c',
+  'bbstreamer_gzip.c',
+  'bbstreamer_inject.c',
+  'bbstreamer_lz4.c',
+  'bbstreamer_tar.c',
+  'bbstreamer_zstd.c',
+  'receivelog.c',
+  'streamutil.c',
+  'walmethods.c',
+)
+
+pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_common = static_library('libpg_basebackup_common',
+  common_sources,
+  dependencies: pg_basebackup_deps,
+  kwargs: internal_lib_args,
+)
+
+executable('pg_basebackup',
+  'pg_basebackup.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+executable('pg_receivewal',
+  'pg_receivewal.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+executable('pg_recvlogical',
+  'pg_recvlogical.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'pg_basebackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path(),
+            'LZ4': program_lz4.found() ? program_lz4.path() : '',
+            'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+    'tests': [
+      't/010_pg_basebackup.pl',
+      't/020_pg_receivewal.pl',
+      't/030_pg_recvlogical.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 00000000000..cab021153fe
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_basebackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..c58bcca2f97
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,20 @@
+executable('pg_checksums',
+  ['pg_checksums.c'],
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_checksums',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_actions.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 00000000000..2c47c2338f6
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_checksums-' + pg_version_major.to_string())
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..90664bb3bc3
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,18 @@
+executable('pg_config',
+  ['pg_config.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_config',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_config.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 00000000000..b6fb6db9213
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_config-' + pg_version_major.to_string())
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..969eed2888e
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,18 @@
+executable('pg_controldata',
+  ['pg_controldata.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_controldata',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_controldata.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 00000000000..31b486d002c
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_controldata-' + pg_version_major.to_string())
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..bbb30198d96
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,21 @@
+executable('pg_ctl',
+  ['pg_ctl.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_ctl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_start_stop.pl',
+      't/002_status.pl',
+      't/003_promote.pl',
+      't/004_logrotate.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 00000000000..947b5108423
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_ctl-' + pg_version_major.to_string())
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..9dab205cbe9
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,84 @@
+pg_dump_common_sources = files(
+  'compress_io.c',
+  'dumputils.c',
+  'parallel.c',
+  'pg_backup_archiver.c',
+  'pg_backup_custom.c',
+  'pg_backup_db.c',
+  'pg_backup_directory.c',
+  'pg_backup_null.c',
+  'pg_backup_tar.c',
+  'pg_backup_utils.c',
+)
+
+if host_system == 'win32'
+  pg_dump_common_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'pg_dump/pg_restore/pg_dumpall - backup and restore PostgreSQL databases',
+        '--NAME', 'pg_dump',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pg_dump_common = static_library('libpgdump_common',
+  pg_dump_common_sources,
+  c_pch: pch_c_h,
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+
+pg_dump_sources = files(
+  'pg_dump.c',
+  'common.c',
+  'pg_dump_sort.c',
+)
+
+executable('pg_dump',
+  pg_dump_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_dumpall_sources = files(
+  'pg_dumpall.c',
+)
+
+executable('pg_dumpall',
+  pg_dumpall_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_restore_sources = files(
+  'pg_restore.c',
+)
+
+executable('pg_restore',
+  pg_restore_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_dump.pl',
+      't/003_pg_dump_with_server.pl',
+      't/010_dump_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 00000000000..82e5e537ff4
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_dump-' + pg_version_major.to_string())
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..dd889188b6d
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,19 @@
+executable('pg_resetwal',
+  files('pg_resetwal.c'),
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_resetwal',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_corrupted.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 00000000000..d130d3b775f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_resetwal-' + pg_version_major.to_string())
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..40ae593e7c8
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,39 @@
+pg_rewind_sources = files(
+  'datapagemap.c',
+  'file_ops.c',
+  'filemap.c',
+  'libpq_source.c',
+  'local_source.c',
+  'parsexlog.c',
+  'pg_rewind.c',
+  'timeline.c',
+  '../../backend/access/transam/xlogreader.c',
+)
+
+pg_rewind = executable('pg_rewind',
+  pg_rewind_sources,
+  dependencies: [frontend_code, libpq, lz4, zstd],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_rewind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_databases.pl',
+      't/003_extrafiles.pl',
+      't/004_pg_xlog_symlink.pl',
+      't/005_same_timeline.pl',
+      't/006_options.pl',
+      't/007_standby_source.pl',
+      't/008_min_recovery_point.pl',
+      't/009_growing_files.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 00000000000..a105600b348
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_rewind-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..d51f99902cf
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,18 @@
+executable('pg_test_fsync',
+  ['pg_test_fsync.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'pg_test_fsync',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 00000000000..2ee1125282d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..409fe242353
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,18 @@
+pg_test_timing = executable('pg_test_timing',
+  ['pg_test_timing.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_test_timing',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 00000000000..cda8615165b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_timing-' + pg_version_major.to_string())
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..fb7eff3055b
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,40 @@
+pg_upgrade_sources = files(
+  'check.c',
+  'controldata.c',
+  'dump.c',
+  'exec.c',
+  'file.c',
+  'function.c',
+  'info.c',
+  'option.c',
+  'parallel.c',
+  'pg_upgrade.c',
+  'relfilenumber.c',
+  'server.c',
+  'tablespace.c',
+  'util.c',
+  'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+  pg_upgrade_sources,
+  c_pch: pch_c_h,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_upgrade',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_upgrade.pl',
+    ],
+    'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 00000000000..39301cbede8
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_upgrade-' + pg_version_major.to_string())
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..307ca23ee73
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,32 @@
+pg_verifybackup_sources = files(
+  'parse_manifest.c',
+  'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+  pg_verifybackup_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_verifybackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_algorithm.pl',
+      't/003_corruption.pl',
+      't/004_options.pl',
+      't/005_bad_manifest.pl',
+      't/006_encoding.pl',
+      't/007_wal.pl',
+      't/008_untar.pl',
+      't/009_extract.pl',
+      't/010_client_untar.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 00000000000..b583f1958ba
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..e4820062640
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,28 @@
+pg_waldump_sources = files(
+  'compat.c',
+  'pg_waldump.c',
+  'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
+
+pg_waldump = executable('pg_waldump',
+  pg_waldump_sources,
+  dependencies: [frontend_code, lz4, zstd],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_waldump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 00000000000..f335aa4b360
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_waldump-' + pg_version_major.to_string())
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..f15d3d37700
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,40 @@
+pgbench_sources = files(
+  'pgbench.c',
+)
+
+# exprscan is compiled as part ofexprparse. The ordering is enforced by making
+# the generation of grammar depend on the scanner generation. That's
+# unnecessarily strict, but overall harmless.
+
+exprscan = custom_target('exprscan',
+  input : files('exprscan.l'),
+  output : ['exprscan.c'],
+  command : [flex_cmd, '@INPUT@']
+)
+
+exprparse = custom_target('exprparse',
+  input: 'exprparse.y',
+  output: 'exprparse.c',
+  depends: exprscan,
+  command: [bison_cmd, '@INPUT@'],)
+pgbench_sources += exprparse
+
+executable('pgbench',
+  pgbench_sources,
+  dependencies: [frontend_code, libpq, thread_dep],
+  include_directories: include_directories('.'),
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name' : 'pgbench',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_pgbench_with_server.pl',
+      't/002_pgbench_no_server.pl',
+    ],
+  },
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..e49a5fa0434
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,31 @@
+if host_system != 'win32'
+  subdir_done()
+endif
+
+pgevent_sources = files(
+    'pgevent.c',
+)
+
+# built as part of pgmsgevent.rc, via #include
+win32ver_rc = custom_target(
+  'win32ver.rc',
+  kwargs: rcgen_kw,
+  command: rcgen_lib_cmd + [
+    '--FILEDESC', 'Eventlog message formatter',
+    '--NAME', 'pgevent',],
+)
+
+pgevent_sources += windows.compile_resources(
+  'pgmsgevent.rc',
+  depends: win32ver_rc, # included in file
+  kwargs: rccompile_kw,
+)
+
+shared_library('pgevent',
+  pgevent_sources,
+  dependencies: [frontend_code],
+  vs_module_defs: 'pgevent.def',
+  kwargs: default_lib_args + {
+    'name_prefix': '',
+  },
+)
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..7353d42dce2
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,68 @@
+psql_sources = files(
+  'command.c',
+  'common.c',
+  'copy.c',
+  'crosstabview.c',
+  'describe.c',
+  'help.c',
+  'input.c',
+  'large_obj.c',
+  'mainloop.c',
+  'prompt.c',
+  'startup.c',
+  'stringutils.c',
+  'tab-complete.c',
+  'variables.c',
+)
+
+psql_sources += custom_target('psqlscanslash',
+  input: ['psqlscanslash.l'],
+  output: ['psqlscanslash.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'])
+
+psql_sources += custom_target('psql_help',
+  output: ['sql_help.c', 'sql_help.h'],
+  depfile: 'sql_help.dep',
+  command: [perl, files('create_help.pl'),
+            '--docdir', '@SOURCE_ROOT@/doc/src/sgml/ref',
+            '--depfile', '@DEPFILE@',
+            '--outdir', '@OUTDIR@',
+            '--basename', 'sql_help'])
+
+if host_system == 'win32'
+  psql_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'psql - the PostgreSQL interactive terminal',
+        '--NAME', 'psql',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+executable('psql',
+  psql_sources,
+  c_pch: pch_c_h,
+  include_directories: include_directories('.'),
+  dependencies : [frontend_code, libpq, readline],
+  kwargs: default_bin_args,
+)
+
+install_data('psqlrc.sample',
+  install_dir: dir_data,
+)
+
+tests += {
+  'name': 'psql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_basic.pl',
+      't/010_tab_completion.pl',
+      't/020_cancel.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 00000000000..45fe425298d
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('psql-' + pg_version_major.to_string())
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..d6826817f3d
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,50 @@
+scripts_common = static_library('libscripts_common',
+  files('common.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: internal_lib_args,
+)
+
+binaries = [
+  'createdb',
+  'dropdb',
+  'createuser',
+  'dropuser',
+  'clusterdb',
+  'vacuumdb',
+  'reindexdb',
+  'pg_isready',
+]
+
+foreach binary : binaries
+  executable(binary,
+    files(binary + '.c'),
+    link_with: [scripts_common],
+    dependencies: [frontend_code, libpq],
+    kwargs: default_bin_args,
+  )
+endforeach
+
+tests += {
+  'name': 'scripts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_clusterdb.pl',
+      't/011_clusterdb_all.pl',
+      't/020_createdb.pl',
+      't/040_createuser.pl',
+      't/050_dropdb.pl',
+      't/070_dropuser.pl',
+      't/080_pg_isready.pl',
+      't/090_reindexdb.pl',
+      't/091_reindexdb_all.pl',
+      't/100_vacuumdb.pl',
+      't/101_vacuumdb_all.pl',
+      't/102_vacuumdb_stages.pl',
+      't/200_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 00000000000..3c531459c2d
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pgscripts-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..e726584db3c
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,141 @@
+# test/ is entered via top-level meson.build, that way it can use the default
+# args for executables (which depend on libpq).
+
+libpq_sources = files(
+  'fe-auth-scram.c',
+  'fe-connect.c',
+  'fe-exec.c',
+  'fe-lobj.c',
+  'fe-misc.c',
+  'fe-print.c',
+  'fe-protocol3.c',
+  'fe-secure.c',
+  'fe-trace.c',
+  'legacy-pqsignal.c',
+  'libpq-events.c',
+  'pqexpbuffer.c',
+  'fe-auth.c',
+)
+
+if host_system == 'win32'
+  libpq_sources += files('win32.c', 'pthread-win32.c')
+endif
+
+if ssl.found()
+  libpq_sources += files('fe-secure-common.c')
+  libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+  libpq_sources += files(
+    'fe-secure-gssapi.c',
+    'fe-gssapi-common.c'
+  )
+endif
+
+export_file = custom_target('libpq_exports.list',
+  input: [files('exports.txt')],
+  output: ['@BASENAME@.list'],
+  command: [perl, files('../../tools/gen_versioning_script.pl'),
+    export_file_format,
+    '@INPUT0@', '@OUTPUT0@'],
+  build_by_default: false,
+  install: false,
+)
+
+libpq_def = custom_target('libpq.def',
+  command: [perl, files('../../tools/msvc/export2def.pl'), '@OUTPUT@', '@INPUT0@', 'libpq'],
+  input: files('exports.txt'),
+  output: 'libpq.def',
+  build_by_default: false,
+  install: false,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+libpq_link_depends = []
+
+libpq_kwargs = default_lib_args + {
+  'version': '5.'+pg_version_major.to_string(),
+}
+
+
+if host_system == 'aix'
+  libpq_kwargs = libpq_kwargs + {
+    'link_args': ['-Wl,-bE:' + export_file.full_path()],
+    'link_depends': export_file,
+    'soversion': '5',
+  }
+elif host_system == 'darwin'
+  libpq_kwargs = libpq_kwargs + {
+    'link_args': ['-exported_symbols_list', export_file.full_path()],
+    'link_depends': export_file,
+    'soversion': '5',
+  }
+elif host_system == 'win32'
+  libpq_deps += cc.find_library('secur32', required: true)
+
+  libpq_kwargs = libpq_kwargs + {
+    'vs_module_defs': libpq_def,
+    'soversion': '',
+  }
+else
+  libpq_kwargs = libpq_kwargs + {
+    'link_args': '-Wl,--version-script=' + export_file.full_path(),
+    'link_depends': export_file,
+    'soversion': '5',
+  }
+endif
+
+libpq_both = both_libraries('libpq',
+  libpq_sources,
+  include_directories : [libpq_inc, postgres_inc],
+  c_args: ['-DFRONTEND'],
+  dependencies: libpq_deps,
+  kwargs: libpq_kwargs,
+)
+
+libpq_so = libpq_both.get_shared_lib()
+
+libpq = declare_dependency(
+  link_with: [libpq_so],
+  include_directories: [include_directories('.')]
+)
+
+pkgconfig.generate(
+  libpq_so,
+  name: 'libpq',
+  description: 'PostgreSQL libpq library',
+  url: pg_url,
+)
+
+install_headers(
+  'libpq-fe.h',
+  'libpq-events.h',
+)
+
+install_headers(
+  'libpq-int.h',
+  'pqexpbuffer.h',
+  'fe-auth-sasl.h',
+  install_dir: dir_include_internal,
+)
+install_data('pg_service.conf.sample',
+  install_dir: dir_data,
+)
+
+
+tests += {
+  'name': 'libpq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_uri.pl',
+      't/002_api.pl',
+    ],
+    'env' : {'with_ssl': get_option('ssl')},
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build
new file mode 100644
index 00000000000..eed91110fd6
--- /dev/null
+++ b/src/interfaces/libpq/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
new file mode 100644
index 00000000000..16f94c1ed8b
--- /dev/null
+++ b/src/interfaces/libpq/test/meson.build
@@ -0,0 +1,15 @@
+executable('libpq_uri_regress',
+  files('libpq_uri_regress.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+executable('libpq_testclient',
+  files('libpq_testclient.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..d9a57465441
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,5 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
+subdir('tcl')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..4b14c556c24
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,92 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+plperl_sources = files(
+  'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+  check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(privlibexp)
+
+plperl_sources += custom_target('perlchunks.h',
+  input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+  output: 'perlchunks.h',
+  capture: true,
+  command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+  input: files('plperl_opmask.pl'),
+  output: 'plperl_opmask.h',
+  command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+  xs = files(n+'.xs')
+  xs_c_name = n+'.c'
+
+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?
+  xs_c = custom_target(xs_c_name,
+    input: xs,
+    output: xs_c_name,
+    command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+  )
+  plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+shared_module('plperl',
+  plperl_sources,
+  c_pch: pch_postgres_h,
+  include_directories: [plperl_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, pg_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'plperl.control',
+  'plperl--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_data(
+  'plperlu.control',
+  'plperlu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plperl.h',
+  'plperl_helpers.h',
+  'ppport.h',
+  install_dir: dir_include_server,
+)
+
+tests += {
+  'name': 'plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plperl_setup',
+      'plperl',
+      'plperl_lc',
+      'plperl_trigger',
+      'plperl_shared',
+      'plperl_elog',
+      'plperl_util',
+      'plperl_init',
+      'plperlu',
+      'plperl_array',
+      'plperl_call',
+      'plperl_transaction',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build
new file mode 100644
index 00000000000..fe0a715bdf0
--- /dev/null
+++ b/src/pl/plperl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plperl-' + pg_version_major.to_string())
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..7c0e29cac67
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,75 @@
+plpgsql_sources = files(
+  'pl_comp.c',
+  'pl_exec.c',
+  'pl_funcs.c',
+  'pl_handler.c',
+  'pl_scanner.c',
+)
+
+plpgsql_sources += custom_target('gram',
+  input: ['pl_gram.y'],
+  output: ['pl_gram.c', 'pl_gram.h'],
+  command: [bison_cmd, '-d', '@INPUT@'])
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+plpgsql_sources += custom_target('plerrcodes',
+  input: ['../../../../src/backend/utils/errcodes.txt'],
+  output: ['plerrcodes.h'],
+  command: [perl, gen_plerrcodes, '@INPUT0@'],
+  capture: true)
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+plpgsql_sources += custom_target('pl_reserved_kwlist',
+  input: ['pl_reserved_kwlist.h'],
+  output: ['pl_reserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+
+plpgsql_sources += custom_target('pl_unreserved_kwlist',
+  input: ['pl_unreserved_kwlist.h'],
+  output: ['pl_unreserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+
+shared_module('plpgsql',
+  plpgsql_sources,
+  c_pch: pch_postgres_h,
+  include_directories: include_directories('.'),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plpgsql.control',
+  'plpgsql--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpgsql.h',
+  install_dir: dir_include_server
+)
+
+
+tests += {
+  'name': 'plpgsql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plpgsql_array',
+      'plpgsql_call',
+      'plpgsql_control',
+      'plpgsql_copy',
+      'plpgsql_domain',
+      'plpgsql_record',
+      'plpgsql_cache',
+      'plpgsql_simple',
+      'plpgsql_transaction',
+      'plpgsql_trap',
+      'plpgsql_trigger',
+      'plpgsql_varprops',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build
new file mode 100644
index 00000000000..29e0b74488f
--- /dev/null
+++ b/src/pl/plpgsql/src/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpgsql-' + pg_version_major.to_string())
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..449654914d0
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,99 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+plpython_sources = files(
+  'plpy_cursorobject.c',
+  'plpy_elog.c',
+  'plpy_exec.c',
+  'plpy_main.c',
+  'plpy_planobject.c',
+  'plpy_plpymodule.c',
+  'plpy_procedure.c',
+  'plpy_resultobject.c',
+  'plpy_spi.c',
+  'plpy_subxactobject.c',
+  'plpy_typeio.c',
+  'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+    input: files('../../backend/utils/errcodes.txt'),
+    output: 'spiexceptions.h',
+    command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+    capture: true
+  )
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+shared_module('plpython3',
+  plpython_sources,
+  c_pch: pch_postgres_h,
+  include_directories: [plpython_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [python3_dep, pg_mod_args['dependencies']],
+  },
+)
+
+# FIXME: Only install the relevant versions
+install_data(
+  'plpython3u.control',
+  'plpython3u--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpy_cursorobject.h',
+  'plpy_elog.h',
+  'plpy_exec.h',
+  'plpy_main.h',
+  'plpy_planobject.h',
+  'plpy_plpymodule.h',
+  'plpy_procedure.h',
+  'plpy_resultobject.h',
+  'plpy_spi.h',
+  'plpy_subxactobject.h',
+  'plpy_typeio.h',
+  'plpy_util.h',
+  'plpython.h',
+  install_dir: dir_include_server,
+)
+
+plpython_regress = [
+  'plpython_schema',
+  'plpython_populate',
+  'plpython_test',
+  'plpython_do',
+  'plpython_global',
+  'plpython_import',
+  'plpython_spi',
+  'plpython_newline',
+  'plpython_void',
+  'plpython_call',
+  'plpython_params',
+  'plpython_setof',
+  'plpython_record',
+  'plpython_trigger',
+  'plpython_types',
+  'plpython_error',
+  'plpython_ereport',
+  'plpython_unicode',
+  'plpython_quote',
+  'plpython_composite',
+  'plpython_subtransaction',
+  'plpython_transaction',
+  'plpython_drop',
+]
+
+tests += {
+  'name': 'plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': plpython_regress,
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build
new file mode 100644
index 00000000000..542e27fbe1f
--- /dev/null
+++ b/src/pl/plpython/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpython-' + pg_version_major.to_string())
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
new file mode 100644
index 00000000000..16bfd7806b4
--- /dev/null
+++ b/src/pl/tcl/meson.build
@@ -0,0 +1,55 @@
+if not tcl_dep.found()
+  subdir_done()
+endif
+
+pltcl_sources = files(
+  'pltcl.c',
+)
+
+gen_pltclerrcodes = files('generate-pltclerrcodes.pl')
+pltcl_sources += custom_target('pltclerrcodes.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'pltclerrcodes.h',
+  capture: true,
+  command: [perl, gen_pltclerrcodes, '@INPUT@']
+)
+
+shared_module('pltcl',
+  pltcl_sources,
+  c_pch: pch_postgres_h,
+  include_directories: [include_directories('.'), postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [tcl_dep, pg_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'pltcl.control',
+  'pltcl--1.0.sql',
+  'pltclu.control',
+  'pltclu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+pltcl_regress = [
+  'pltcl_setup',
+  'pltcl_queries',
+  'pltcl_trigger',
+  'pltcl_call',
+  'pltcl_start_proc',
+  'pltcl_subxact',
+  'pltcl_unicode',
+  'pltcl_transaction',
+]
+
+tests += {
+  'name': 'pltcl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': pltcl_regress,
+    'regress_args': ['--load-extension=pltcl'],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build
new file mode 100644
index 00000000000..cc23ef1eb3b
--- /dev/null
+++ b/src/pl/tcl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pltcl-' + pg_version_major.to_string())
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..c522738a3b7
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,22 @@
+autoinc = shared_module('adminpack',
+  ['adminpack.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'adminpack.control',
+  'adminpack--1.0.sql',
+  'adminpack--1.0--1.1.sql',
+  'adminpack--1.1--2.0.sql',
+  'adminpack--2.0--2.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'adminpack',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ['adminpack'],
+  },
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..d75d8c91c4b
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,36 @@
+amcheck = shared_module('amcheck', [
+    'verify_heapam.c',
+    'verify_nbtree.c',
+  ],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'amcheck.control',
+  'amcheck--1.0.sql',
+  'amcheck--1.0--1.1.sql',
+  'amcheck--1.1--1.2.sql',
+  'amcheck--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'check',
+      'check_btree',
+      'check_heap',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_verify_heapam.pl',
+      't/002_cic.pl',
+      't/003_cic_2pc.pl',
+    ],
+  },
+}
+
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..941bb6f39a4
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,4 @@
+autoinc = shared_module('auth_delay',
+  ['auth_delay.c'],
+  kwargs: contrib_mod_args,
+)
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..9456d569fc2
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,15 @@
+auto_explain = shared_module('auto_explain',
+  files('auto_explain.c'),
+  kwargs: contrib_mod_args,
+)
+
+tests += {
+  'name': 'auto_explain',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auto_explain.pl',
+    ],
+  },
+}
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
new file mode 100644
index 00000000000..9d465cb50f3
--- /dev/null
+++ b/contrib/basebackup_to_shell/meson.build
@@ -0,0 +1,22 @@
+basebackup_to_shell_sources = files(
+  'basebackup_to_shell.c',
+)
+
+basebackup_to_shell = shared_module('basebackup_to_shell',
+  basebackup_to_shell_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+tests += {
+  'name': 'basebackup_to_shell',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap' : {
+    'tests': [
+      't/001_basic.pl',
+    ],
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path()},
+  },
+}
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
new file mode 100644
index 00000000000..b81582c7c0f
--- /dev/null
+++ b/contrib/basic_archive/meson.build
@@ -0,0 +1,23 @@
+basic_archive_sources = files(
+  'basic_archive.c',
+)
+
+basic_archive = shared_module('basic_archive',
+  basic_archive_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+tests += {
+  'name': 'basic_archive',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'basic_archive',
+    ],
+    'regress_args': [
+      '--temp-config', files('basic_archive.conf'),
+    ],
+  },
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..71a2263a773
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,36 @@
+bloom_sources = files(
+  'blcost.c',
+  'blinsert.c',
+  'blscan.c',
+  'blutils.c',
+  'blvacuum.c',
+  'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+  bloom_sources,
+  c_pch: pch_c_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'bloom.control',
+  'bloom--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bloom',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_wal.pl',
+    ],
+  },
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..c7e75278739
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,39 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+bool_plperl_sources = files(
+  'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+  bool_plperl_sources,
+  include_directories: [plperl_inc, include_directories('.')],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'bool_plperl.control',
+  'bool_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'bool_plperlu.control',
+  'bool_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bool_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bool_plperl',
+      'bool_plperlu',
+    ],
+  },
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..356dbe84f10
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,53 @@
+btree_gin = shared_module('btree_gin',
+  files('btree_gin.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gin.control',
+  'btree_gin--1.0.sql',
+  'btree_gin--1.0--1.1.sql',
+  'btree_gin--1.1--1.2.sql',
+  'btree_gin--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'install_btree_gin',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'money',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'enum',
+      'uuid',
+      'name',
+      'bool',
+      'bpchar',
+    ],
+  },
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..40b6ccc3b50
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,84 @@
+btree_gist_sources = files(
+  'btree_bit.c',
+  'btree_bool.c',
+  'btree_bytea.c',
+  'btree_cash.c',
+  'btree_date.c',
+  'btree_enum.c',
+  'btree_float4.c',
+  'btree_float8.c',
+  'btree_gist.c',
+  'btree_inet.c',
+  'btree_int2.c',
+  'btree_int4.c',
+  'btree_int8.c',
+  'btree_interval.c',
+  'btree_macaddr.c',
+  'btree_macaddr8.c',
+  'btree_numeric.c',
+  'btree_oid.c',
+  'btree_text.c',
+  'btree_time.c',
+  'btree_ts.c',
+  'btree_utils_num.c',
+  'btree_utils_var.c',
+  'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+  btree_gist_sources,
+  c_pch: pch_c_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gist.control',
+  'btree_gist--1.0--1.1.sql',
+  'btree_gist--1.1--1.2.sql',
+  'btree_gist--1.2.sql',
+  'btree_gist--1.2--1.3.sql',
+  'btree_gist--1.3--1.4.sql',
+  'btree_gist--1.4--1.5.sql',
+  'btree_gist--1.5--1.6.sql',
+  'btree_gist--1.6--1.7.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'init',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'cash',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'uuid',
+      'not_equal',
+      'enum',
+      'bool',
+    ],
+  },
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..507745ba747
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,33 @@
+citext_sources = files(
+  'citext.c',
+)
+
+citext = shared_module('citext',
+  citext_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'citext.control',
+  'citext--1.0--1.1.sql',
+  'citext--1.1--1.2.sql',
+  'citext--1.2--1.3.sql',
+  'citext--1.3--1.4.sql',
+  'citext--1.4.sql',
+  'citext--1.4--1.5.sql',
+  'citext--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'citext',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'create_index_acl',
+      'citext',
+      'citext_utf8',
+    ],
+  },
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..6963348b923
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,49 @@
+cube_sources = files(
+  'cube.c',
+)
+
+# cubescan is compiled as part of cubeparse
+cubescan = custom_target('cubescan',
+  input: ['cubescan.l'],
+  output: ['cubescan.c'],
+  command: [flex_cmd, '@INPUT@'],)
+
+cube_sources += custom_target('cubeparse',
+  input: 'cubeparse.y',
+  output: 'cubeparse.c',
+  depends: cubescan,
+  command: [bison_cmd, '@INPUT@'],)
+
+cube = shared_module('cube',
+  cube_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'cube.control',
+  'cube--1.0--1.1.sql',
+  'cube--1.1--1.2.sql',
+  'cube--1.2.sql',
+  'cube--1.2--1.3.sql',
+  'cube--1.3--1.4.sql',
+  'cube--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'cubedata.h',
+  install_dir: dir_include_extension / 'cube',
+)
+
+tests += {
+  'name': 'cube',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'cube',
+      'cube_sci',
+    ],
+  },
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..9161f737726
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,30 @@
+dblink_sources = files(
+  'dblink.c',
+)
+
+dblink = shared_module('dblink',
+  dblink_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'dblink.control',
+  'dblink--1.0--1.1.sql',
+  'dblink--1.1--1.2.sql',
+  'dblink--1.2.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dblink',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dblink',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..2c937a3df5e
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,21 @@
+dict_int = shared_module('dict_int',
+  files('dict_int.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_int.control',
+  'dict_int--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dict_int',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_int',
+    ],
+  },
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..ec6e175733d
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,28 @@
+dict_xsyn = shared_module('dict_xsyn',
+  files('dict_xsyn.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_xsyn.control',
+  'dict_xsyn--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'xsyn_sample.rules',
+  kwargs: contrib_data_args + {
+    'install_dir': dir_data / 'tsearch_data'
+  }
+)
+
+tests += {
+  'name': 'dict_xsyn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_xsyn',
+    ],
+  },
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..35b448870b8
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,22 @@
+earthdistance = shared_module('earthdistance',
+  files('earthdistance.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'earthdistance.control',
+  'earthdistance--1.0--1.1.sql',
+  'earthdistance--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'earthdistance',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'earthdistance',
+    ],
+  },
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..26d26d1e0c4
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,21 @@
+file_fdw = shared_module('file_fdw',
+  files('file_fdw.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'file_fdw.control',
+  'file_fdw--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'file_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'file_fdw',
+    ],
+  },
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..73d88e92cfe
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,25 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+  files(
+    'fuzzystrmatch.c',
+    'dmetaphone.c'
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'fuzzystrmatch.control',
+  'fuzzystrmatch--1.0--1.1.sql',
+  'fuzzystrmatch--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'fuzzystrmatch',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'fuzzystrmatch',
+    ],
+  },
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..3aed37ce8e1
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,44 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+  files(
+    'hstore_compat.c',
+    'hstore_gin.c',
+    'hstore_gist.c',
+    'hstore_io.c',
+    'hstore_op.c',
+    'hstore_subs.c',
+  ),
+  c_pch: pch_c_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'hstore.control',
+  'hstore--1.1--1.2.sql',
+  'hstore--1.2--1.3.sql',
+  'hstore--1.3--1.4.sql',
+  'hstore--1.4.sql',
+  'hstore--1.4--1.5.sql',
+  'hstore--1.5--1.6.sql',
+  'hstore--1.6--1.7.sql',
+  'hstore--1.7--1.8.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'hstore.h',
+  install_dir: dir_include_extension / 'hstore',
+)
+
+tests += {
+  'name': 'hstore',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore',
+    ],
+  },
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..66eaf3f6cab
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,40 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+hstore_plperl_sources = files(
+  'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+  hstore_plperl_sources,
+  include_directories: [plperl_inc, hstore_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plperl.control',
+  'hstore_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'hstore_plperlu.control',
+  'hstore_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'hstore_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore_plperl',
+      'hstore_plperlu',
+      'create_transform',
+    ],
+  },
+}
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..ba53c888e13
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+hstore_plpython_sources = files(
+  'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+  hstore_plpython_sources,
+  include_directories: [plpython_inc, hstore_inc, ],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plpython3u--1.0.sql',
+  'hstore_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = [
+  'hstore_plpython'
+]
+
+tests += {
+  'name': 'hstore_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': hstore_plpython_regress,
+    'regress_args': ['--load-extension=hstore'],
+  },
+}
diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build
new file mode 100644
index 00000000000..a0f39366f47
--- /dev/null
+++ b/contrib/intagg/meson.build
@@ -0,0 +1,6 @@
+install_data(
+  'intagg.control',
+  'intagg--1.0--1.1.sql',
+  'intagg--1.1.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
new file mode 100644
index 00000000000..dfbfbc9fa6a
--- /dev/null
+++ b/contrib/intarray/meson.build
@@ -0,0 +1,36 @@
+intarray_sources = files(
+  '_int_bool.c',
+  '_int_gin.c',
+  '_int_gist.c',
+  '_int_op.c',
+  '_int_selfuncs.c',
+  '_int_tool.c',
+  '_intbig_gist.c',
+)
+
+intarray = shared_module('_int',
+  intarray_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'intarray.control',
+  'intarray--1.0--1.1.sql',
+  'intarray--1.1--1.2.sql',
+  'intarray--1.2.sql',
+  'intarray--1.2--1.3.sql',
+  'intarray--1.3--1.4.sql',
+  'intarray--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'intarray',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      '_int',
+    ],
+  },
+}
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
new file mode 100644
index 00000000000..508e2dfa080
--- /dev/null
+++ b/contrib/isn/meson.build
@@ -0,0 +1,32 @@
+isn_sources = files(
+  'isn.c',
+)
+
+isn = shared_module('isn',
+  isn_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'isn.control',
+  'isn--1.0--1.1.sql',
+  'isn--1.1--1.2.sql',
+  'isn--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'isn.h',
+  install_dir: dir_include_extension / 'isn',
+)
+
+tests += {
+  'name': 'isn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'isn',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..7fd4652fcfb
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,40 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+  'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+  jsonb_plperl_sources,
+  include_directories: [plperl_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plperl.control',
+  'jsonb_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'jsonb_plperlu.control',
+  'jsonb_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'jsonb_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'jsonb_plperl',
+      'jsonb_plperlu',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..95b3b3aeef4
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,35 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+  'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+  jsonb_plpython_sources,
+  include_directories: [plpython_inc],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plpython3u.control',
+  'jsonb_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = [
+  'jsonb_plpython'
+]
+
+tests += {
+  'name': 'jsonb_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': jsonb_plpython_regress,
+  },
+}
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
new file mode 100644
index 00000000000..224a2562017
--- /dev/null
+++ b/contrib/lo/meson.build
@@ -0,0 +1,26 @@
+lo_sources = files(
+  'lo.c',
+)
+
+lo = shared_module('lo',
+  lo_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'lo.control',
+  'lo--1.0--1.1.sql',
+  'lo--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'lo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'lo',
+    ],
+  },
+}
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
new file mode 100644
index 00000000000..222c64bb35d
--- /dev/null
+++ b/contrib/ltree/meson.build
@@ -0,0 +1,43 @@
+ltree_sources = files(
+  '_ltree_gist.c',
+  '_ltree_op.c',
+  'crc32.c',
+  'lquery_op.c',
+  'ltree_gist.c',
+  'ltree_io.c',
+  'ltree_op.c',
+  'ltxtquery_io.c',
+  'ltxtquery_op.c',
+)
+
+# .. so that includes of ltree/ltree.h work
+ltree_inc = include_directories('.', '../')
+
+ltree = shared_module('ltree',
+  ltree_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'ltree.control',
+  'ltree--1.0--1.1.sql',
+  'ltree--1.1--1.2.sql',
+  'ltree--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'ltree.h',
+  install_dir: dir_include_extension / 'ltree',
+)
+
+tests += {
+  'name': 'ltree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ltree',
+    ],
+  },
+}
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
new file mode 100644
index 00000000000..52ab66e46ca
--- /dev/null
+++ b/contrib/ltree_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+ltree_plpython_sources = files(
+  'ltree_plpython.c',
+)
+
+ltree_plpython = shared_module('ltree_plpython3',
+  ltree_plpython_sources,
+  include_directories: [plpython_inc, ltree_inc],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'ltree_plpython3u--1.0.sql',
+  'ltree_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+ltree_plpython_regress = [
+  'ltree_plpython'
+]
+
+tests += {
+  'name': 'ltree_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ltree_plpython_regress,
+    'regress_args': ['--load-extension=ltree'],
+  },
+}
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..84752d4bd0f
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,66 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = dir_data_extension
+contrib_data_args = {
+  'install_dir': contrib_data_dir,
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('basic_archive')
+subdir('bloom')
+subdir('basebackup_to_shell')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+subdir('intagg')
+subdir('intarray')
+subdir('isn')
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+subdir('lo')
+subdir('ltree')
+subdir('ltree_plpython')
+subdir('oid2name')
+subdir('old_snapshot')
+subdir('pageinspect')
+subdir('passwordcheck')
+subdir('pg_buffercache')
+subdir('pgcrypto')
+subdir('pg_freespacemap')
+subdir('pg_prewarm')
+subdir('pgrowlocks')
+subdir('pg_stat_statements')
+subdir('pgstattuple')
+subdir('pg_surgery')
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('pg_walinspect')
+subdir('postgres_fdw')
+subdir('seg')
+subdir('sepgsql')
+subdir('spi')
+subdir('sslinfo')
+# start-scripts doesn't contain build products
+subdir('tablefunc')
+subdir('tcn')
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+subdir('uuid-ossp')
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..b3139971140
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,16 @@
+executable('oid2name',
+  ['oid2name.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'oid2name',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
new file mode 100644
index 00000000000..5785c29e9f8
--- /dev/null
+++ b/contrib/old_snapshot/meson.build
@@ -0,0 +1,14 @@
+old_snapshot_sources = files(
+  'time_mapping.c',
+)
+
+old_snapshot = shared_module('old_snapshot',
+  old_snapshot_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'old_snapshot.control',
+  'old_snapshot--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..5cacb9b323b
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,59 @@
+pageinspect_sources = files(
+  'brinfuncs.c',
+  'btreefuncs.c',
+  'fsmfuncs.c',
+  'ginfuncs.c',
+  'gistfuncs.c',
+  'hashfuncs.c',
+  'heapfuncs.c',
+  'rawpage.c',
+)
+
+if host_system == 'win32'
+  pageinspect_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_lib_cmd + [
+        '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',
+        '--NAME', 'pageinspect',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pageinspect = shared_module('pageinspect',
+  pageinspect_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pageinspect--1.0--1.1.sql',
+  'pageinspect--1.1--1.2.sql',
+  'pageinspect--1.2--1.3.sql',
+  'pageinspect--1.3--1.4.sql',
+  'pageinspect--1.4--1.5.sql',
+  'pageinspect--1.5--1.6.sql',
+  'pageinspect--1.5.sql',
+  'pageinspect--1.6--1.7.sql',
+  'pageinspect--1.7--1.8.sql',
+  'pageinspect--1.8--1.9.sql',
+  'pageinspect--1.9--1.10.sql',
+  'pageinspect.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pageinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'page',
+      'btree',
+      'brin',
+      'gin',
+      'gist',
+      'hash',
+      'checksum',
+      'oldextversions',
+    ],
+  },
+}
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
new file mode 100644
index 00000000000..80667d8a9f0
--- /dev/null
+++ b/contrib/passwordcheck/meson.build
@@ -0,0 +1,29 @@
+passwordcheck_sources = files(
+  'passwordcheck.c',
+)
+
+passwordcheck_c_args = []
+passwordcheck_deps = []
+
+# uncomment the following two lines to enable cracklib support
+# passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
+# passwordcheck_deps += [cc.find_library('crack')]
+
+passwordcheck = shared_module('passwordcheck',
+  passwordcheck_sources,
+  kwargs: contrib_mod_args + {
+    'c_args': contrib_mod_args.get('c_args') + passwordcheck_c_args,
+    'dependencies': contrib_mod_args.get('dependencies') + passwordcheck_deps,
+  }
+)
+
+tests += {
+  'name': 'passwordcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'passwordcheck',
+    ],
+  },
+}
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
new file mode 100644
index 00000000000..ffd98a9bf90
--- /dev/null
+++ b/contrib/pg_buffercache/meson.build
@@ -0,0 +1,16 @@
+pg_buffercache = shared_module('pg_buffercache',
+  files(
+    'pg_buffercache_pages.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_buffercache--1.0--1.1.sql',
+  'pg_buffercache--1.1--1.2.sql',
+  'pg_buffercache--1.2--1.3.sql',
+  'pg_buffercache--1.2.sql',
+  'pg_buffercache.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
new file mode 100644
index 00000000000..03e781b7bab
--- /dev/null
+++ b/contrib/pg_freespacemap/meson.build
@@ -0,0 +1,29 @@
+pg_freespacemap = shared_module('pg_freespacemap',
+  files(
+    'pg_freespacemap.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_freespacemap--1.0--1.1.sql',
+  'pg_freespacemap--1.1--1.2.sql',
+  'pg_freespacemap--1.1.sql',
+  'pg_freespacemap.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_freespacemap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_freespacemap',
+    ],
+    'regress_args': [
+      '--temp-config', files('pg_freespacemap.conf')
+    ],
+  },
+}
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..78e132e7831
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,16 @@
+pg_prewarm = shared_module('pg_prewarm',
+  files(
+    'autoprewarm.c',
+    'pg_prewarm.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_prewarm--1.0--1.1.sql',
+  'pg_prewarm--1.1--1.2.sql',
+  'pg_prewarm--1.1.sql',
+  'pg_prewarm.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..1c76bf9cfbc
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,34 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+  files('pg_stat_statements.c'),
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_stat_statements.control',
+  'pg_stat_statements--1.4.sql',
+  'pg_stat_statements--1.9--1.10.sql',
+  'pg_stat_statements--1.8--1.9.sql',
+  'pg_stat_statements--1.7--1.8.sql',
+  'pg_stat_statements--1.6--1.7.sql',
+  'pg_stat_statements--1.5--1.6.sql',
+  'pg_stat_statements--1.4--1.5.sql',
+  'pg_stat_statements--1.3--1.4.sql',
+  'pg_stat_statements--1.2--1.3.sql',
+  'pg_stat_statements--1.1--1.2.sql',
+  'pg_stat_statements--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_stat_statements',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_stat_statements',
+    ],
+    'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+  },
+}
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
new file mode 100644
index 00000000000..70ae62fccef
--- /dev/null
+++ b/contrib/pg_surgery/meson.build
@@ -0,0 +1,25 @@
+pg_surgery = shared_module('pg_surgery',
+  files(
+    'heap_surgery.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_surgery--1.0.sql',
+  'pg_surgery.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_surgery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'heap_surgery',
+    ],
+  },
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..6818cddc63f
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,35 @@
+pg_trgm = shared_module('pg_trgm',
+  files(
+    'trgm_gin.c',
+    'trgm_gist.c',
+    'trgm_op.c',
+    'trgm_regexp.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_trgm--1.0--1.1.sql',
+  'pg_trgm--1.1--1.2.sql',
+  'pg_trgm--1.2--1.3.sql',
+  'pg_trgm--1.3--1.4.sql',
+  'pg_trgm--1.3.sql',
+  'pg_trgm--1.4--1.5.sql',
+  'pg_trgm--1.5--1.6.sql',
+  'pg_trgm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_trgm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_trgm',
+      'pg_word_trgm',
+      'pg_strict_word_trgm',
+    ],
+  },
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..7eacc25f968
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,27 @@
+pg_visibility = shared_module('pg_visibility',
+  files(
+    'pg_visibility.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_visibility--1.0--1.1.sql',
+  'pg_visibility--1.1--1.2.sql',
+  'pg_visibility--1.1.sql',
+  'pg_visibility.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_visibility',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_visibility',
+    ],
+  },
+}
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
new file mode 100644
index 00000000000..bdd817bba10
--- /dev/null
+++ b/contrib/pg_walinspect/meson.build
@@ -0,0 +1,37 @@
+pg_walinspect_sources = files('pg_walinspect.c')
+
+if host_system == 'win32'
+  pg_walinspect_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',
+        '--NAME', 'pg_walinspect',
+      ]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pg_walinspect = shared_module('pg_walinspect',
+  pg_walinspect_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_walinspect.control',
+  'pg_walinspect--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_walinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_walinspect',
+    ],
+    'regress_args': ['--temp-config', files('walinspect.conf')],
+  },
+}
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
new file mode 100644
index 00000000000..54ba2e7f13b
--- /dev/null
+++ b/contrib/pgcrypto/meson.build
@@ -0,0 +1,100 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+pgcrypto_sources = files(
+  'crypt-blowfish.c',
+  'crypt-des.c',
+  'crypt-gensalt.c',
+  'crypt-md5.c',
+  'mbuf.c',
+  'pgcrypto.c',
+  'pgp-armor.c',
+  'pgp-cfb.c',
+  'pgp-compress.c',
+  'pgp-decrypt.c',
+  'pgp-encrypt.c',
+  'pgp-info.c',
+  'pgp-mpi.c',
+  'pgp-pgsql.c',
+  'pgp-pubdec.c',
+  'pgp-pubenc.c',
+  'pgp-pubkey.c',
+  'pgp-s2k.c',
+  'pgp.c',
+  'px-crypt.c',
+  'px-hmac.c',
+  'px.c',
+)
+
+pgcrypto_regress = [
+  'init',
+  'md5',
+  'sha1',
+  'hmac-md5',
+  'hmac-sha1',
+  'blowfish',
+  'rijndael',
+  'sha2',
+  'des',
+  '3des',
+  'cast5',
+  'crypt-des',
+  'crypt-md5',
+  'crypt-blowfish',
+  'crypt-xdes',
+  'pgp-armor',
+  'pgp-decrypt',
+  'pgp-encrypt',
+  'pgp-pubkey-decrypt',
+  'pgp-pubkey-encrypt',
+  'pgp-info',
+]
+
+pgcrypto_openssl_sources = files(
+  'openssl.c',
+  'pgp-mpi-openssl.c',
+)
+
+pgcrypto_deps = []
+pgcrypto_link_with = []
+
+pgcrypto_deps += ssl
+pgcrypto_sources += pgcrypto_openssl_sources
+
+if zlib.found()
+  pgcrypto_deps += zlib
+  pgcrypto_regress += 'pgp-compression'
+else
+  pgcrypto_regress += 'pgp-zlib-DISABLED'
+endif
+
+pgcrypto = shared_module('pgcrypto',
+  pgcrypto_sources,
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'link_with': [pgcrypto_link_with, contrib_mod_args.get('link_with', [])],
+    'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
+  },
+)
+
+install_data(
+  'pgcrypto--1.0--1.1.sql',
+  'pgcrypto--1.1--1.2.sql',
+  'pgcrypto--1.2--1.3.sql',
+  'pgcrypto--1.3.sql',
+  'pgcrypto.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgcrypto',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      pgcrypto_regress,
+    ],
+  },
+}
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
new file mode 100644
index 00000000000..358d23cf2ee
--- /dev/null
+++ b/contrib/pgrowlocks/meson.build
@@ -0,0 +1,15 @@
+pgrowlocks = shared_module('pgrowlocks',
+  files(
+    'pgrowlocks.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgrowlocks--1.0--1.1.sql',
+  'pgrowlocks--1.1--1.2.sql',
+  'pgrowlocks--1.2.sql',
+  'pgrowlocks.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
new file mode 100644
index 00000000000..8e765fc997a
--- /dev/null
+++ b/contrib/pgstattuple/meson.build
@@ -0,0 +1,32 @@
+pgstattuple = shared_module('pgstattuple',
+  files(
+    'pgstatapprox.c',
+    'pgstatindex.c',
+    'pgstattuple.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgstattuple--1.0--1.1.sql',
+  'pgstattuple--1.1--1.2.sql',
+  'pgstattuple--1.2--1.3.sql',
+  'pgstattuple--1.3--1.4.sql',
+  'pgstattuple--1.4--1.5.sql',
+  'pgstattuple--1.4.sql',
+  'pgstattuple.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgstattuple',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pgstattuple',
+    ],
+  },
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..9be84a6b67f
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,33 @@
+postgres_fdw_sources = files(
+  'connection.c',
+  'deparse.c',
+  'option.c',
+  'postgres_fdw.c',
+  'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'postgres_fdw.control',
+  'postgres_fdw--1.0.sql',
+  'postgres_fdw--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'postgres_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'postgres_fdw',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
new file mode 100644
index 00000000000..41596a9f653
--- /dev/null
+++ b/contrib/seg/meson.build
@@ -0,0 +1,47 @@
+seg_sources = files(
+  'seg.c',
+)
+
+# segscan is compiled as part of segparse
+segscan = custom_target('segscan',
+  input: ['segscan.l'],
+  output: ['segscan.c'],
+  command: [flex_cmd, '@INPUT@'],)
+
+seg_sources += custom_target('segparse',
+  input: 'segparse.y',
+  output: 'segparse.c',
+  depends: segscan,
+  command: [bison_cmd, '@INPUT@'],)
+
+seg = shared_module('seg',
+  seg_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'seg.control',
+  'seg--1.0--1.1.sql',
+  'seg--1.1--1.2.sql',
+  'seg--1.1.sql',
+  'seg--1.2--1.3.sql',
+  'seg--1.3--1.4.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'segdata.h',
+  install_dir: dir_include_extension / 'seg',
+)
+
+tests += {
+  'name': 'seg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'seg',
+    ],
+  },
+}
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
new file mode 100644
index 00000000000..9fa6013c91f
--- /dev/null
+++ b/contrib/sepgsql/meson.build
@@ -0,0 +1,34 @@
+if not selinux.found()
+  subdir_done()
+endif
+
+sepgsql_sources = files(
+  'database.c',
+  'dml.c',
+  'hooks.c',
+  'label.c',
+  'proc.c',
+  'relation.c',
+  'schema.c',
+  'selinux.c',
+  'uavc.c',
+)
+
+sepgsql = shared_module('sepgsql',
+  sepgsql_sources,
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [selinux, pg_mod_args['dependencies']],
+  }
+)
+
+custom_target('sepgsql.sql',
+  input: 'sepgsql.sql.in',
+  output: 'sepgsql.sql',
+  command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'],
+  capture: true,
+  install: true,
+  install_dir: contrib_data_args['install_dir'],
+)
+
+# TODO: implement sepgsql tests
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..4c26242595a
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,47 @@
+autoinc = shared_module('autoinc',
+  ['autoinc.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+  ['insert_username.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'insert_username.control',
+  'insert_username--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+moddatetime = shared_module('moddatetime',
+  ['moddatetime.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'moddatetime.control',
+  'moddatetime--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+  ['refint.c'],
+  kwargs: contrib_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+  },
+)
+
+install_data('refint.control', 'refint--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
new file mode 100644
index 00000000000..dfa51a0934c
--- /dev/null
+++ b/contrib/sslinfo/meson.build
@@ -0,0 +1,21 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+sslinfo = shared_module('sslinfo',
+  files(
+    'sslinfo.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  }
+)
+
+install_data(
+  'sslinfo--1.0--1.1.sql',
+  'sslinfo--1.1--1.2.sql',
+  'sslinfo--1.2.sql',
+  'sslinfo.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
new file mode 100644
index 00000000000..e94d9d7de44
--- /dev/null
+++ b/contrib/tablefunc/meson.build
@@ -0,0 +1,25 @@
+tablefunc = shared_module('tablefunc',
+  files(
+    'tablefunc.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tablefunc--1.0.sql',
+  'tablefunc.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'tablefunc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tablefunc',
+    ],
+  },
+}
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
new file mode 100644
index 00000000000..c4f8207b25e
--- /dev/null
+++ b/contrib/tcn/meson.build
@@ -0,0 +1,13 @@
+tcn = shared_module('tcn',
+  files(
+    'tcn.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tcn--1.0.sql',
+  'tcn.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..0719350a0dd
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,62 @@
+test_decoding_sources = files(
+  'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+  test_decoding_sources,
+  kwargs: contrib_mod_args,
+)
+
+tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ddl',
+      'xact',
+      'rewrite',
+      'toast',
+      'permissions',
+      'decoding_in_xact',
+      'decoding_into_rel',
+      'binary',
+      'prepared',
+      'replorigin',
+      'time',
+      'messages',
+      'spill',
+      'slot',
+      'truncate',
+      'stream',
+      'stats',
+      'twophase',
+      'twophase_stream',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'isolation': {
+    'specs': [
+      'mxact',
+      'delayed_startup',
+      'ondisk_startup',
+      'concurrent_ddl_dml',
+      'oldest_xmin',
+      'snapshot_transfer',
+      'subxact_without_top',
+      'concurrent_stream',
+      'twophase_snapshot',
+      'slot_creation_error',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_repl_stats.pl',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..577482d18f2
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,24 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+  files(
+    'tsm_system_rows.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_rows--1.0.sql',
+  'tsm_system_rows.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_rows',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_rows',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..ce5fd138501
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,24 @@
+tsm_system_time = shared_module('tsm_system_time',
+  files(
+    'tsm_system_time.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_time--1.0.sql',
+  'tsm_system_time.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_time',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_time',
+    ],
+  },
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..e99bbe5bdf9
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,32 @@
+unaccent = shared_module('unaccent',
+  files(
+    'unaccent.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'unaccent--1.0--1.1.sql',
+  'unaccent--1.1.sql',
+  'unaccent.control',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'unaccent.rules',
+  install_dir: dir_data / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+tests += {
+  'name': 'unaccent',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'unaccent',
+    ],
+    'regress_args': ['--encoding=UTF8'],
+  },
+}
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
new file mode 100644
index 00000000000..dac73feae4e
--- /dev/null
+++ b/contrib/uuid-ossp/meson.build
@@ -0,0 +1,33 @@
+if not uuid.found()
+  subdir_done()
+endif
+
+uuid_ossp = shared_module('uuid-ossp',
+  files(
+    'uuid-ossp.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [uuid, pg_mod_args['dependencies']],
+  },
+
+)
+
+install_data(
+  'uuid-ossp--1.0--1.1.sql',
+  'uuid-ossp--1.1.sql',
+  'uuid-ossp.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'uuid-ossp',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'uuid_ossp',
+    ],
+  },
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..ed0740212f6
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,16 @@
+executable('vacuumlo',
+  ['vacuumlo.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'vacuumlo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..d25549a1fb3
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,32 @@
+if not libxml.found()
+  subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+  files(
+    'xpath.c',
+    'xslt_proc.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'xml2--1.0--1.1.sql',
+  'xml2--1.1.sql',
+  'xml2.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'xml2',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'xml2',
+    ],
+  },
+}
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
new file mode 100644
index 00000000000..5dbb8d8ca32
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -0,0 +1,15 @@
+ecpg_compat = both_libraries('libecpg_compat',
+   'informix.c',
+   include_directories : ['.', ecpg_inc, postgres_inc, libpq_inc],
+   dependencies: [frontend_shlib_code, thread_dep],
+   link_with: [ecpglib, ecpg_pgtypes],
+   soversion: 3,
+   version: '3.'+pg_version_major.to_string(),
+   kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpg_compat.get_shared_lib(),
+  description: 'PostgreSQL libecpg_compat library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
new file mode 100644
index 00000000000..3c40a4283f1
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -0,0 +1,30 @@
+ecpglib_sources = files(
+  'connect.c',
+  'data.c',
+  'descriptor.c',
+  'error.c',
+  'execute.c',
+  'memory.c',
+  'misc.c',
+  'prepare.c',
+  'sqlda.c',
+  'typename.c',
+)
+
+ecpglib = both_libraries('libecpg',
+  ecpglib_sources,
+  include_directories : ['.', ecpg_inc, postgres_inc],
+  dependencies: [frontend_shlib_code, libpq, thread_dep],
+  link_with: [ecpg_pgtypes],
+  soversion: 6,
+  version: '6.'+pg_version_major.to_string(),
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpglib.get_shared_lib(),
+  description: 'PostgreSQL libecpg library',
+  url: pg_url,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build
new file mode 100644
index 00000000000..246e399ebd3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build
new file mode 100644
index 00000000000..bd4b66d870c
--- /dev/null
+++ b/src/interfaces/ecpg/include/meson.build
@@ -0,0 +1,48 @@
+ecpg_inc = include_directories('.')
+
+ecpg_conf_keys = [
+  'ENABLE_THREAD_SAFETY',
+  'HAVE_INT64',
+  'HAVE_LONG_INT_64',
+  'HAVE_LONG_LONG_INT_64',
+  'PG_USE_STDBOOL',
+]
+
+ecpg_conf_data = configuration_data()
+
+foreach key : ecpg_conf_keys
+  if cdata.has(key)
+    ecpg_conf_data.set(key, cdata.get(key))
+  endif
+endforeach
+
+configure_file(
+  output: 'ecpg_config.h',
+  configuration: ecpg_conf_data,
+  install_dir: dir_include,
+)
+
+install_headers(
+  'ecpg_informix.h',
+  'ecpgerrno.h',
+  'ecpglib.h',
+  'ecpgtype.h',
+  'pgtypes.h',
+  'pgtypes_date.h',
+  'pgtypes_error.h',
+  'pgtypes_interval.h',
+  'pgtypes_numeric.h',
+  'pgtypes_timestamp.h',
+  'sql3types.h',
+  'sqlca.h',
+  'sqlda.h',
+  'sqlda-compat.h',
+  'sqlda-native.h',
+)
+
+install_headers(
+  'datetime.h',
+  'decimal.h',
+  'sqltypes.h',
+  install_dir: dir_include_pkg / 'informix' / 'esql',
+)
diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build
new file mode 100644
index 00000000000..2ef24f2966b
--- /dev/null
+++ b/src/interfaces/ecpg/meson.build
@@ -0,0 +1,10 @@
+# TODO: missing handling for exports.txt breaks at least windows
+if host_system == 'win32'
+  subdir_done()
+endif
+
+subdir('include')
+subdir('pgtypeslib')
+subdir('ecpglib')
+subdir('compatlib')
+subdir('preproc')
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
new file mode 100644
index 00000000000..a58efffbf17
--- /dev/null
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -0,0 +1,23 @@
+ecpg_pgtypes_sources = files(
+  'common.c',
+  'datetime.c',
+  'dt_common.c',
+  'interval.c',
+  'numeric.c',
+  'timestamp.c',
+)
+
+ecpg_pgtypes = both_libraries('libpgtypes',
+  ecpg_pgtypes_sources,
+  include_directories : ['.', ecpg_inc, postgres_inc],
+  dependencies: [frontend_shlib_code],
+  version: '3.'+pg_version_major.to_string(),
+  soversion: 3,
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpg_pgtypes.get_shared_lib(),
+  description: 'PostgreSQL libpgtypes library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
new file mode 100644
index 00000000000..778ba05d2f0
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -0,0 +1,95 @@
+ecpg_sources = files(
+  'c_keywords.c',
+  'descriptor.c',
+  'ecpg.c',
+  'ecpg_keywords.c',
+  'keywords.c',
+  'output.c',
+  'parser.c',
+  'type.c',
+  '../ecpglib/typename.c',
+  'variable.c',
+)
+
+ecpg_sources += custom_target('pgc.c',
+  input: ['pgc.l'],
+  output: ['pgc.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+
+ecpg_files = [
+    'ecpg.addons',
+    'ecpg.header',
+    'ecpg.tokens',
+    'ecpg.trailer',
+    'ecpg.type',
+]
+
+preproc_y = custom_target('preproc.y',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: ['preproc.y'],
+  command: [
+    perl, files('parse.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--output', '@OUTPUT0@',
+  ],
+)
+
+check_rules = custom_target('preproc.y.check_rules',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: 'preproc.y.check_rules',
+  command: [
+    perl, files('check_rules.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--stamp', '@OUTPUT0@',
+  ],
+)
+
+ecpg_sources += custom_target('preproc.c',
+  input: [preproc_y],
+  output: ['preproc.c', 'preproc.h'],
+  depends: check_rules,
+  command: [bison_cmd, '-d', '@INPUT@'],
+)
+
+ecpg_sources += custom_target('c_kwlist_d.h',
+  input: ['c_kwlist.h'],
+  output: ['c_kwlist_d.h'],
+  command: [
+    perl,
+    '-I', '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanCKeywords',
+    '--no-case-fold', '@INPUT0@'
+  ],
+)
+
+ecpg_sources += custom_target('ecpg_kwlist_d.h',
+  input: ['ecpg_kwlist.h'],
+  output: ['ecpg_kwlist_d.h'],
+  command: [
+    perl, '-I',
+    '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanECPGKeywords', '@INPUT0@',
+  ]
+)
+
+ecpg_exe = executable('ecpg',
+  ecpg_sources,
+  include_directories : ['.', ecpg_inc, postgres_inc],
+  dependencies: [frontend_shlib_code, libpq],
+  kwargs: default_bin_args,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build
new file mode 100644
index 00000000000..d73b05afd5e
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpg-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/test/compat_informix/meson.build b/src/interfaces/ecpg/test/compat_informix/meson.build
new file mode 100644
index 00000000000..17f12f1f36f
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_informix/meson.build
@@ -0,0 +1,31 @@
+pgc_files = [
+  'charfuncs',
+  'dec_test',
+  'describe',
+  'rfmtdate',
+  'rfmtlong',
+  'rnull',
+  'sqlda',
+  'test_informix',
+  'test_informix2',
+]
+
+pgc_extra_flags = {
+  'rnull': ['-r', 'no_indicator',],
+}
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'INFORMIX',] +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/compat_oracle/meson.build b/src/interfaces/ecpg/test/compat_oracle/meson.build
new file mode 100644
index 00000000000..16830c041e2
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_oracle/meson.build
@@ -0,0 +1,18 @@
+pgc_files = [
+  'char_array',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start + 
+      ['-C', 'ORACLE',] +
+      ecpg_preproc_test_command_end
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/connect/meson.build b/src/interfaces/ecpg/test/connect/meson.build
new file mode 100644
index 00000000000..1ada499e1ff
--- /dev/null
+++ b/src/interfaces/ecpg/test/connect/meson.build
@@ -0,0 +1,22 @@
+
+pgc_files = [
+  'test1',
+  'test2',
+  'test3',
+  'test4',
+  'test5',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
new file mode 100644
index 00000000000..3477c7a57ee
--- /dev/null
+++ b/src/interfaces/ecpg/test/meson.build
@@ -0,0 +1,75 @@
+# TODO: ECPG is not enabled for windows yet
+if host_system == 'win32'
+  subdir_done()
+endif
+
+pg_regress_ecpg_sources = pg_regress_c + files(
+  'pg_regress_ecpg.c',
+)
+
+pg_regress_ecpg = executable('pg_regress_ecpg',
+  pg_regress_ecpg_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc, include_directories('.')],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+# create .c files and executables from .pgc files
+ecpg_test_exec_kw = {
+  'dependencies': [frontend_code, libpq],
+  'include_directories': [ecpg_inc],
+  'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+  'build_by_default': false,
+}
+
+ecpg_preproc_test_command_start = [
+  ecpg_exe, 
+  '--regression',
+  '-I@CURRENT_SOURCE_DIR@',
+  '-I@SOURCE_ROOT@' + '/src/interfaces/ecpg/include/',
+]
+ecpg_preproc_test_command_end = [
+  '-o', '@OUTPUT@', '@INPUT@'
+]
+
+ecpg_test_dependencies = []
+
+subdir('connect')
+subdir('sql')
+subdir('pgtypeslib')
+subdir('preproc')
+subdir('compat_informix')
+subdir('compat_oracle')
+subdir('thread')
+
+ecpg_test_files = files(
+  'ecpg_schedule',
+)
+
+ecpg_regress_args = [
+  '--dbname=ecpg1_regression,ecpg2_regression',
+  '--create-role=regress_ecpg_user1,regress_ecpg_user2',
+  '--encoding=SQL_ASCII',
+]
+
+tests += {
+  'name': 'ecpg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'test_runner': pg_regress_ecpg,
+    'expecteddir': meson.current_source_dir(),
+    'inputdir': meson.current_build_dir(),
+    'schedule': ecpg_test_files,
+    'sql': [
+      'sql/twophase',
+    ],
+    'test_kwargs': {
+      'depends': ecpg_test_dependencies,
+      },
+    'regress_args': ecpg_regress_args,
+  },
+}
diff --git a/src/interfaces/ecpg/test/pgtypeslib/meson.build b/src/interfaces/ecpg/test/pgtypeslib/meson.build
new file mode 100644
index 00000000000..8f6120ca280
--- /dev/null
+++ b/src/interfaces/ecpg/test/pgtypeslib/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'dt_test',
+  'dt_test2',
+  'num_test',
+  'num_test2',
+  'nan_test',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/preproc/meson.build b/src/interfaces/ecpg/test/preproc/meson.build
new file mode 100644
index 00000000000..7f912f50925
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/meson.build
@@ -0,0 +1,38 @@
+
+pgc_files = [
+  'array_of_struct',
+  'autoprep',
+  'comment',
+  'cursor',
+  'define',
+  'init',
+  'outofscope',
+  'pointer_to_struct',
+  'strings',
+  'type',
+  'variable',
+  'whenever',
+  'whenever_do_continue',
+]
+
+pgc_extra_flags = {
+  'array_of_struct': ['-c'],
+  'pointer_to_struct' : ['-c'],
+  'autoprep': ['-r', 'prepare'],
+  'strings': ['-i'],
+}
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/sql/meson.build b/src/interfaces/ecpg/test/sql/meson.build
new file mode 100644
index 00000000000..aaa18ddda42
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/meson.build
@@ -0,0 +1,46 @@
+pgc_files = [
+  'array',
+  'binary',
+  'bytea',
+  'code100',
+  'copystdout',
+  'createtableas',
+  'declare',
+  'define',
+  'desc',
+  'describe',
+  'dynalloc',
+  'dynalloc2',
+  'dyntest',
+  'execute',
+  'fetch',
+  'func',
+  'indicators',
+  'insupd',
+  'oldexec',
+  'parser',
+  'prepareas',
+  'quote',
+  'show',
+  'sqlda',
+  'twophase',
+]
+
+pgc_extra_flags = {
+  'oldexec': ['-r', 'questionmarks'],
+}
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start + 
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/thread/meson.build b/src/interfaces/ecpg/test/thread/meson.build
new file mode 100644
index 00000000000..5e8c7cdf53c
--- /dev/null
+++ b/src/interfaces/ecpg/test/thread/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'thread_implicit',
+  'thread',
+  'prep',
+  'descriptor',
+  'alloc',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw + {'dependencies': [frontend_code, libpq, thread_dep,]},
+  )
+endforeach
diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build
new file mode 100644
index 00000000000..73fffbee394
--- /dev/null
+++ b/src/interfaces/meson.build
@@ -0,0 +1,2 @@
+# NB: libpq is entered directly from the toplevel meson file
+subdir('ecpg')
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
new file mode 100644
index 00000000000..6cbdf95600b
--- /dev/null
+++ b/doc/src/sgml/meson.build
@@ -0,0 +1,242 @@
+alldocs = []
+doc_generated = []
+
+xmllint = find_program('xmllint', native: true, required: false)
+pandoc = find_program('pandoc', native: true, required: false)
+xsltproc = find_program('xsltproc', native: true, required: false)
+fop = find_program('fop', native: true, required: false)
+
+
+configure_file(
+  input: 'version.sgml.in',
+  output: 'version.sgml',
+  configuration: cdata,
+)
+
+doc_generated += custom_target('features-supported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt'),
+  output: 'features-supported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'YES', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+doc_generated += custom_target('features-unsupported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt'),
+  output: 'features-unsupported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'NO', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+doc_generated += custom_target('errcodes-table.sgml',
+  input: files(
+    '../../../src/backend/utils/errcodes.txt'),
+  output: 'errcodes-table.sgml',
+  command: [perl, files('generate-errcodes-table.pl'), '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+# FIXME: this actually has further inputs, adding depfile support to
+# generate-keywords-table.pl is probably the best way to address that
+# robustly.
+doc_generated += custom_target('keywords-table.sgml',
+  input: files(
+    '../../../src/include/parser/kwlist.h'),
+  output: 'keywords-table.sgml',
+  command: [perl, files('generate-keywords-table.pl'), '@CURRENT_SOURCE_DIR@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+# For everything else we need at least xmllint
+if not xmllint.found()
+  subdir_done()
+endif
+
+# Compute validity just once
+postgres_sgml_valid = custom_target('postgres.sgml.valid',
+  input: 'postgres.sgml',
+  output: 'postgres.sgml.valid',
+  command: [xmllint, '--noout', '--valid', '--path', '@OUTDIR@', '@INPUT@'],
+  depends: doc_generated,
+  build_by_default: true,
+  capture: true,
+)
+alldocs += postgres_sgml_valid
+
+
+#
+# Full documentation as html, text
+#
+if xsltproc.found()
+  xsltproc_flags = [
+    '--stringparam', 'pg.version', pg_version,
+    '--param', 'website.stylesheet', '1'
+  ]
+
+
+  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
+  # depfile
+  html = custom_target('html',
+    input: ['stylesheet.xsl', 'postgres.sgml'],
+    output: 'html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html
+
+
+  html_help = custom_target('html_help',
+    input: ['stylesheet-hh.xsl', 'postgres.sgml'],
+    output: 'htmlhelp',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html_help
+
+
+  # single-page HTML
+  postgres_html = custom_target('postgres.html',
+    input: ['stylesheet-html-nochunk.xsl', 'postgres.sgml'],
+    output: 'postgres.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_html
+
+  # single-page text
+  if pandoc.found()
+    postgres_txt = custom_target('postgres.txt',
+      input: [postgres_html],
+      output: 'postgres.txt',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+endif
+
+
+#
+# INSTALL in html, text
+#
+if xsltproc.found()
+  install_xml = custom_target('INSTALL.xml',
+    input: ['standalone-profile.xsl', 'standalone-install.xml'],
+    output: 'INSTALL.xml',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+    build_by_default: false,
+  )
+  install_html = custom_target('INSTALL.html',
+    input: ['stylesheet-text.xsl', install_xml],
+    output: 'INSTALL.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += install_html
+
+  if pandoc.found()
+    # XXX: Makefile does an iconv translit here, but unclear why?
+    install = custom_target('INSTALL',
+      input: [install_html],
+      output: 'INSTALL',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+
+endif
+
+
+#
+# Man pages
+#
+if xsltproc.found()
+  # FIXME: implement / consider sqlmansectnum logic
+  man = custom_target('man',
+    input: ['stylesheet-man.xsl', 'postgres.sgml'],
+    output: ['man1', 'man3', 'man7'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+endif
+
+
+#
+# Full documentation as PDF
+#
+if fop.found() and xsltproc.found()
+  xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
+
+  foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
+    postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+    postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
+
+    postgres_x_fo = custom_target(postgres_x_fo_f,
+      input: ['stylesheet-fo.xsl', 'postgres.sgml'],
+      output: [postgres_x_fo_f],
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
+                '--stringparam', 'paper.type', detail,
+                '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+
+    postgres_x_pdf = custom_target(postgres_x_pdf_f,
+      input: [postgres_x_fo],
+      output: [postgres_x_pdf_f],
+      command: [fop, '-fo', '@INPUT@', '-pdf', '@OUTPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_x_pdf
+  endforeach
+endif
+
+
+#
+# epub
+#
+
+# This was previously implemented using dbtoepub - but that doesn't seem to
+# support running in build != source directory (i.e. VPATH builds already
+# weren't supported).
+if pandoc.found() and xsltproc.found()
+  # XXX: Wasn't able to make pandoc successfully resolve entities
+  # XXX: Perhaps we should just make all targets use this, to avoid repeatedly
+  # building whole thing? It's comparatively fast though.
+  postgres_full_xml = custom_target('postgres-full.xml',
+    input: ['resolv.xsl', 'postgres.sgml'],
+    output: ['postgres-full.xml'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_flags,
+              '-o', '@OUTPUT@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+  postgres_epub = custom_target('postgres.epub',
+    input: [postgres_full_xml],
+    output: 'postgres.epub',
+    command: [pandoc, '-f', 'docbook', '-t', 'epub', '-o', '@OUTPUT@', '--resource-path=@CURRENT_SOURCE_DIR@',
+              '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_epub
+endif
+
+
+alias_target('alldocs', alldocs)
diff --git a/doc/src/sgml/resolv.xsl b/doc/src/sgml/resolv.xsl
new file mode 100644
index 00000000000..c69ba714dab
--- /dev/null
+++ b/doc/src/sgml/resolv.xsl
@@ -0,0 +1,7 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/doc/src/sgml/version.sgml.in b/doc/src/sgml/version.sgml.in
new file mode 100644
index 00000000000..fa5ff343f40
--- /dev/null
+++ b/doc/src/sgml/version.sgml.in
@@ -0,0 +1,2 @@
+<!ENTITY version @PG_VERSION@>
+<!ENTITY majorversion @PG_MAJORVERSION@>
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..2374028cbda
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'authentication',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_password.pl',
+      't/002_saslprep.pl',
+    ],
+  },
+}
diff --git a/src/test/icu/meson.build b/src/test/icu/meson.build
new file mode 100644
index 00000000000..c78e71801fe
--- /dev/null
+++ b/src/test/icu/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'icu',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_database.pl',
+    ],
+    'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..d33f7a8f3d0
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,51 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+  'isolation_main.c',
+)
+
+# see src/backend/replication/meson.build for depend logic
+spec_scanner = custom_target('specscanner',
+  input : files('specscanner.l'),
+  output : ['specscanner.c'],
+  command : [flex_cmd, '@INPUT@'],
+)
+
+isolationtester_sources = files('isolationtester.c')
+isolationtester_sources += custom_target('specparse',
+  input: 'specparse.y',
+  output: 'specparse.c',
+  depends: spec_scanner,
+  command: [bison_cmd, '@INPUT@'],)
+
+pg_isolation_regress = executable('pg_isolation_regress',
+  isolation_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+
+isolationtester = executable('isolationtester',
+  isolationtester_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'schedule': files('isolation_schedule'),
+    'test_kwargs': {
+      'priority': 40,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..572e387a0be
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,15 @@
+tests += {
+  'name': 'kerberos',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # kerberos tests are slow, start early
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env' : {
+      'with_gssapi': gssapi.found() ? 'yes' : 'no',
+      'with_krb_srvnam': 'postgres',
+    },
+  },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..8a05b48147b
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'ldap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env' : {'with_ldap': ldap.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..c620df338e0
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,23 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+   subdir('ssl')
+endif
+
+if ldap.found()
+   subdir('ldap')
+endif
+
+if gssapi.found()
+   subdir('kerberos')
+endif
+
+if icu.found()
+  subdir('icu')
+endif
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..fd402715aee
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,15 @@
+tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'summarization-and-inprogress-insertion',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/01_workitems.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..60cb12164d2
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,18 @@
+tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'commit_timestamp',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+      't/002_standby.pl',
+      't/003_standby_2.pl',
+      't/004_restart.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..3ce0ee2e2f6
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+  ['delay_execution.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'delay_execution',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'partition-addition',
+      'partition-removal-1',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..77a4377dc21
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+  ['dummy_index_am.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_index_am.control',
+  'dummy_index_am--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_index_am',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'reloptions',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..7d320eb7935
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+  ['dummy_seclabel.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_seclabel.control',
+  'dummy_seclabel--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_seclabel',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dummy_seclabel',
+    ],
+  },
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..fc07f77faf2
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,20 @@
+libpq_pipeline = executable('libpq_pipeline',
+  files(
+    'libpq_pipeline.c',
+  ),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  },
+)
+
+tests += {
+  'name': 'libpq_pipeline',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_libpq_pipeline.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..eae91199487
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,26 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_misc')
+subdir('test_oat_hooks')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..323427858f0
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+  ['plsample.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plsample.control',
+  'plsample--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'plsample',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plsample',
+    ],
+  },
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..efd3f1f113b
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,14 @@
+tests += {
+  'name': 'snapshot_too_old',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'test_kwargs': {'priority': 40}, # sto tests are slow, start early
+    'specs': [
+      'sto_using_cursor',
+      'sto_using_select',
+      'sto_using_hash_index',
+    ],
+    'regress_args': ['--temp-config', files('sto.conf')],
+  },
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..676f2a258cb
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+  ['spgist_name_ops.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'spgist_name_ops.control',
+  'spgist_name_ops--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'spgist_name_ops',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'spgist_name_ops',
+    ],
+  },
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..f5eba869980
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,47 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+  ['ssl_passphrase_func.c'],
+  kwargs: pg_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  }
+)
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+  cert = custom_target('server.crt',
+    output: ['server.crt', 'server.ckey'],
+    command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+      '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+    build_by_default: false,
+    install: false,
+  )
+
+  # needs to agree with what's in the test script
+  pass = 'FooBaR1'
+
+  enccert = custom_target('server.key',
+    input: [cert[1]],
+    output: ['server.key'],
+    command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+  )
+endif
+
+tests += {
+  'name': 'ssl_passphrase_callback',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_testfunc.pl',
+    ],
+    'env': {'with_ssl': 'openssl'},
+  },
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..6861ae38116
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+  ['test_bloomfilter.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_bloomfilter.control',
+  'test_bloomfilter--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_bloomfilter',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_bloomfilter',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..367730e95db
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,42 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+  ['test_ddl_deparse.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ddl_deparse.control',
+  'test_ddl_deparse--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ddl_deparse',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ddl_deparse',
+      'create_extension',
+      'create_schema',
+      'create_type',
+      'create_conversion',
+      'create_domain',
+      'create_sequence_1',
+      'create_table',
+      'create_transform',
+      'alter_table',
+      'create_view',
+      'create_trigger',
+      'create_rule',
+      'comment_on',
+      'alter_function',
+      'alter_sequence',
+      'alter_ts_config',
+      'alter_type_enum',
+      'opfamily',
+      'defprivs',
+      'matviews',
+    ],
+  },
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..93d75a64b64
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,40 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_ext1--1.0.sql',
+  'test_ext1.control',
+  'test_ext2--1.0.sql',
+  'test_ext2.control',
+  'test_ext3--1.0.sql',
+  'test_ext3.control',
+  'test_ext4--1.0.sql',
+  'test_ext4.control',
+  'test_ext5--1.0.sql',
+  'test_ext5.control',
+  'test_ext6--1.0.sql',
+  'test_ext6.control',
+  'test_ext7--1.0--2.0.sql',
+  'test_ext7--1.0.sql',
+  'test_ext7.control',
+  'test_ext8--1.0.sql',
+  'test_ext8.control',
+  'test_ext_cyclic1--1.0.sql',
+  'test_ext_cyclic1.control',
+  'test_ext_cyclic2--1.0.sql',
+  'test_ext_cyclic2.control',
+  'test_ext_evttrig--1.0--2.0.sql',
+  'test_ext_evttrig--1.0.sql',
+  'test_ext_evttrig.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_extensions',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_extensions',
+      'test_extdepend',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..193c28a3da9
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+  ['test_ginpostinglist.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ginpostinglist.control',
+  'test_ginpostinglist--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ginpostinglist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ginpostinglist',
+    ],
+  },
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..b599dfc09e2
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+  ['test_integerset.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_integerset.control',
+  'test_integerset--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_integerset',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_integerset',
+    ],
+  },
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..cfc830ff399
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,12 @@
+tests += {
+  'name': 'test_misc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_constraint_validation.pl',
+      't/002_tablespace.pl',
+      't/003_check_guc.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
new file mode 100644
index 00000000000..9b20e7c56d4
--- /dev/null
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+test_oat_hooks = shared_module('test_oat_hooks',
+  ['test_oat_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'test_oat_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_oat_hooks',
+    ],
+    'regress_args': ['--no-locale', '--encoding=UTF8'],
+  },
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..35ee6ce324b
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+  ['test_parser.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_parser.control',
+  'test_parser--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_parser',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_parser',
+    ],
+  },
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..41021829f3a
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_pg_dump.control',
+  'test_pg_dump--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_pg_dump',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..001c2d848bb
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+  ['test_predtest.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_predtest.control',
+  'test_predtest--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_predtest',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_predtest',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..963a6220a2a
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+  ['test_rbtree.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_rbtree.control',
+  'test_rbtree--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_rbtree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rbtree',
+    ],
+  },
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..61217dd2ca4
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+  ['test_regex.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_regex.control',
+  'test_regex--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_regex',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_regex',
+      'test_regex_utf8',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..3f49b8ff540
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,16 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+  ['test_rls_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'test_rls_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rls_hooks',
+    ],
+  },
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..9a0f83917a5
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,26 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+  files(
+    'setup.c',
+    'test.c',
+    'worker.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_shm_mq.control',
+  'test_shm_mq--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_shm_mq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_shm_mq',
+    ],
+  },
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..d69b0e7ce44
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'unsafe_tests',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'rolenames',
+      'alter_system_table',
+    ],
+  },
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..b729c354827
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,25 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+  files(
+    'worker_spi.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'worker_spi.control',
+  'worker_spi--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'worker_spi',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'worker_spi',
+    ],
+    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+  },
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..68f316d994e
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,42 @@
+tests += {
+  'name': 'recovery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # recovery tests are slow, start early
+    'tests' : [
+      't/001_stream_rep.pl',
+      't/002_archiving.pl',
+      't/003_recovery_targets.pl',
+      't/004_timeline_switch.pl',
+      't/005_replay_delay.pl',
+      't/006_logical_decoding.pl',
+      't/007_sync_rep.pl',
+      't/008_fsm_truncation.pl',
+      't/009_twophase.pl',
+      't/010_logical_decoding_timelines.pl',
+      't/011_crash_recovery.pl',
+      't/012_subtransactions.pl',
+      't/013_crash_restart.pl',
+      't/014_unlogged_reinit.pl',
+      't/015_promotion_pages.pl',
+      't/016_min_consistency.pl',
+      't/017_shm.pl',
+      't/018_wal_optimize.pl',
+      't/019_replslot_limit.pl',
+      't/020_archive_status.pl',
+      't/021_row_visibility.pl',
+      't/022_crash_temp_files.pl',
+      't/023_pitr_prepared_xact.pl',
+      't/024_archive_recovery.pl',
+      't/025_stuck_on_old_timeline.pl',
+      't/026_overwrite_contrecord.pl',
+      't/027_stream_regress.pl',
+      't/028_pitr_timelines.pl',
+      't/029_stats_restart.pl',
+      't/030_stats_cleanup_replica.pl',
+      't/031_recovery_conflict.pl',
+      't/032_relfilenode_reuse.pl',
+    ],
+  },
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..e2ee50504a9
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,58 @@
+# also used by isolationtester and ecpg tests
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+  'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+  regress_sources,
+  c_args: pg_regress_cflags,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/regress',
+  },
+)
+
+regress_module = shared_module('regress',
+  ['regress.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+shared_module('autoinc',
+  ['../../../contrib/spi/autoinc.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+shared_module('refint',
+  ['../../../contrib/spi/refint.c'],
+  kwargs: pg_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+    'install': false,
+  },
+)
+
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'schedule': files('parallel_schedule'),
+    'test_kwargs': {
+      'priority': 50,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..7930170f013
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,13 @@
+tests += {
+  'name': 'ssl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env' : {'with_ssl': get_option('ssl')},
+    'tests': [
+      't/001_ssltests.pl',
+      't/002_scram.pl',
+      't/003_sslinfo.pl',
+    ],
+  },
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..ebd4e48a105
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,41 @@
+tests += {
+  'name': 'subscription',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_rep_changes.pl',
+      't/002_types.pl',
+      't/003_constraints.pl',
+      't/004_sync.pl',
+      't/005_encoding.pl',
+      't/006_rewrite.pl',
+      't/007_ddl.pl',
+      't/008_diff_schema.pl',
+      't/009_matviews.pl',
+      't/010_truncate.pl',
+      't/011_generated.pl',
+      't/012_collation.pl',
+      't/013_partition.pl',
+      't/014_binary.pl',
+      't/015_stream.pl',
+      't/016_stream_subxact.pl',
+      't/017_stream_ddl.pl',
+      't/018_stream_subxact_abort.pl',
+      't/019_stream_subxact_ddl_abort.pl',
+      't/020_messages.pl',
+      't/021_twophase.pl',
+      't/022_twophase_cascade.pl',
+      't/023_twophase_stream.pl',
+      't/024_add_drop_pub.pl',
+      't/025_rep_changes_for_schema.pl',
+      't/026_stats.pl',
+      't/027_nosuperuser.pl',
+      't/028_row_filter.pl',
+      't/029_on_error.pl',
+      't/031_column_list.pl',
+      't/100_bugs.pl',
+    ],
+  },
+}
diff --git a/configure b/configure
index ae0aa991407..050d08444d7 100755
--- a/configure
+++ b/configure
@@ -21338,3 +21338,9 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/configure.ac b/configure.ac
index 459ae04b446..0755afffa0c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2588,3 +2588,9 @@ AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
                   [echo >src/interfaces/ecpg/include/stamp-h])
 
 AC_OUTPUT
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/conversion_helpers.txt b/conversion_helpers.txt
new file mode 100644
index 00000000000..b94ade57309
--- /dev/null
+++ b/conversion_helpers.txt
@@ -0,0 +1,9 @@
+convert list of files to quoted-one-per-line:
+
+	?\b\(\(?:\w\|\d\|_\|-\)+\)\.o ?\(?:\\
+\)? →   '\1.c',
+
+
+# check if all tap tests are known to meson
+m test --list > /tmp/tests.txt
+for f in $(git ls-files|grep 't/.*.pl$'|sort);do t=$(echo $f|sed -E -e 's/^.*\/(.*\/(t|test)\/.*)$/\1/');grep -q -L $t /tmp/tests.txt || echo $f;done
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..9f513de6b62
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,2921 @@
+project('postgresql',
+  ['c'],
+  version: '16devel',
+  license: 'PostgreSQL',
+
+  # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for
+  # RHEL 7 has 0.55. < 0.54 would require replacing some uses of the fs
+  # module, < 0.53 all uses of fs. So far there's no need to go to >=0.56.
+  meson_version: '>=0.54',
+  default_options: [
+    'warning_level=2',
+    'b_pie=true',
+    'b_pch=false',
+    'buildtype=release',
+  ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+host_system = host_machine.system() == 'windows' ? 'win32' : host_machine.system()
+build_system = build_machine.system() == 'windows' ? 'win32' : build_machine.system()
+
+host_cpu = host_machine.cpu_family()
+build_cpu = build_machine.cpu_family()
+
+fs = import('fs')
+pkgconfig = import('pkgconfig')
+if host_system == 'win32'
+  windows = import('windows')
+endif
+
+thread_dep = dependency('threads')
+
+
+# It's very easy to get into confusing states when the source directory
+# contains an in-place build. E.g. the wrong pg_config.h will be used. So just
+# refuse to build in that case.
+if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h')
+  error('''
+****
+Non-clean source code directory detected.
+
+To build with meson the source tree may not have an in-place, ./configure
+style, build configured. Use a separate check out for meson based builds, or
+run make distclean in the source tree.
+
+You can have both meson and ./configure style builds for the same source tree
+by building out-of-source / VPATH with configure as well.
+****
+''')
+endif
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+  pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+  pg_version_arr = [pg_version.split('beta')[0], '0']
+elif pg_version.contains('rc')
+  pg_version_arr = [pg_version.split('rc')[0], '0']
+else
+  pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+pg_version_num = (pg_version_major*10000)+pg_version_minor
+
+cc = meson.get_compiler('c')
+
+cdata = configuration_data()
+
+pg_url = 'https://www.postgresql.org/'
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', pg_url)
+cdata.set_quoted('PACKAGE_VERSION', pg_version)
+
+pg_version += get_option('extra_version')
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+  pg_version, build_cpu, cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
+cdata.set('PG_VERSION_NUM', pg_version_num)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Search paths
+#
+# NB: Arguments added globally (via the below, or CFLAGS etc) are not taken
+# into account for configuration-time checks (so they are more
+# isolated). Flags that have to be taken into account for configure checks
+# have to be explicitly specified in configure tests.
+###############################################################
+
+g_c_args = []
+g_c_inc = []
+g_l_args = []
+
+if host_system == 'darwin'
+  # XXX, should this be required?
+  xcrun = find_program('xcrun', native: true, required: true)
+
+  sysroot = run_command(xcrun, '--show-sdk-path', check: true).stdout().strip()
+  message('sysroot is >@0@<'.format(sysroot))
+
+  g_c_args += ['-isysroot', sysroot]
+  g_l_args += ['-isysroot', sysroot]
+endif
+
+if host_system == 'linux' or host_system == 'cygwin'
+  g_c_args += '-D_GNU_SOURCE'
+endif
+
+
+g_c_inc += include_directories(get_option('extra_include_dirs'))
+g_c_lib = get_option('extra_lib_dirs')
+
+# cbflags is for compiler flags used for both C and C++
+cbflags = g_c_args
+cflags = []
+cxxflags = []
+ldflags = g_l_args
+
+postgres_inc = [include_directories('src/include')]
+
+# Windows replacement headers - need them to be usable during the feature
+# tests below.
+if host_system == 'win32'
+  win32_inc = include_directories('src/include/port/win32')
+  g_c_inc += win32_inc
+  postgres_inc += win32_inc
+
+  if cc.get_id() == 'msvc'
+    win32_msvc_inc = include_directories('src/include/port/win32_msvc')
+    g_c_inc += win32_msvc_inc
+    postgres_inc += win32_msvc_inc
+  endif
+endif
+
+g_c_inc += postgres_inc
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true)
+python = find_program(get_option('PYTHON'), required: true)
+flex = find_program(get_option('FLEX'), native: true)
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'))
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
+touch = find_program('touch', native: true)
+program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
+dtrace = find_program(get_option('DTRACE'), required: get_option('dtrace'))
+
+# Internal programs
+testwrap = find_program('src/tools/testwrap', native: true)
+
+# used by PGXS
+install_sh = find_program('config/install-sh', native: true)
+
+bison_flags = []
+if bison.found()
+  bison_version_c = run_command(bison, '--version', check: true)
+  # bison version string helpfully is something like
+  # >>bison (GNU bison) 3.8.1<<
+  bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+  if bison_version.version_compare('>=3.0')
+    bison_flags += ['-Wno-deprecated']
+  endif
+endif
+bison_cmd = [bison, bison_flags, '-o', '@OUTPUT0@']
+
+flex_flags = []
+flex_wrapper = files('src/tools/pgflex')
+flex_cmd = [python, flex_wrapper, '--builddir', meson.build_root(),
+ '--privatedir', '@PRIVATE_DIR@', '--flex', flex, '-o', '@OUTPUT0@']
+
+flex_backup = ['-b']
+flex_fix_warning_script = files('src/tools/fix-old-flex-code.pl')
+flex_fix_warning = ['--perl', perl, '--fix_warning_script', flex_fix_warning_script]
+
+wget = find_program('wget', required: false, native: true)
+wget_flags = ['-O', '@OUTPUT0@', '--no-use-server-timestamps']
+
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# FIXME: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(python, 'src/tools/find_meson', check: true)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+  error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+    meson_binpath_r.returncode(),
+    meson_binpath_r.stdout(),
+    meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+  error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+  if i == 0
+    meson_binpath = e
+  else
+    meson_args += e
+  endif
+  i += 1
+endforeach
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
+
+cdata.set('BLCKSZ', 8192, description:
+'''Size of a disk block --- this also limits the size of a tuple. You can set
+   it bigger if you need bigger tuples (although TOAST should reduce the need
+   to have large tuples, since fields can be spread across multiple tuples).
+   BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is
+   currently 2^15 (32768). This is determined by the 15-bit widths of the
+   lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).
+   Changing BLCKSZ requires an initdb.''')
+
+cdata.set('XLOG_BLCKSZ', get_option('wal-blocksize') * 1024)
+cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
+cdata.set('DEF_PGPORT', get_option('pgport'))
+cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
+cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb-srvnam'))
+if get_option('system-tzdata') != ''
+  cdata.set_quoted('SYSTEMTZDIR', get_option('system-tzdata'))
+endif
+
+
+
+###############################################################
+# Directories
+###############################################################
+
+# These are set by the equivalent --xxxdir configure options.  We
+# append "postgresql" to some of them, if the string does not already
+# contain "pgsql" or "postgres", in order to avoid directory clutter.
+
+pkg = 'postgresql'
+
+dir_prefix = get_option('prefix')
+
+dir_bin = get_option('bindir')
+
+dir_data = get_option('datadir')
+if not (dir_data.contains('pgsql') or dir_data.contains('postgres'))
+  dir_data = dir_data / pkg
+endif
+
+dir_sysconf = get_option('sysconfdir')
+if not (dir_sysconf.contains('pgsql') or dir_sysconf.contains('postgres'))
+  dir_sysconf = dir_sysconf / pkg
+endif
+
+dir_lib = get_option('libdir')
+
+dir_lib_pkg = dir_lib
+if not (dir_lib_pkg.contains('pgsql') or dir_lib_pkg.contains('postgres'))
+  dir_lib_pkg = dir_lib_pkg / pkg
+endif
+
+dir_pgxs = dir_lib_pkg / 'pgxs'
+
+dir_include = get_option('includedir')
+
+dir_include_pkg = dir_include
+if not (dir_include_pkg.contains('pgsql') or dir_include_pkg.contains('postgres'))
+  dir_include_pkg = dir_include_pkg / pkg
+endif
+
+dir_man = get_option('mandir')
+
+# FIXME: These used to be separately configurable - worth adding?
+dir_doc = get_option('datadir') / 'doc' / 'postgresql'
+dir_doc_html = dir_doc
+
+dir_locale = get_option('localedir')
+
+
+# Derived values
+dir_bitcode = dir_lib_pkg / 'bitcode'
+dir_include_internal = dir_include_pkg / 'internal'
+dir_include_server = dir_include_pkg / 'server'
+dir_include_extension = dir_include_server / 'extension'
+dir_data_extension = dir_data / 'extension'
+
+
+
+###############################################################
+# Library: bsd-auth
+###############################################################
+
+bsd_authopt = get_option('bsd-auth')
+bsd_auth = dependency('', required: false)
+if cc.check_header('bsd_auth.h', args: g_c_args, required: bsd_authopt)
+  cdata.set('USE_BSD_AUTH', 1)
+  bsd_auth = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: bonjour
+#
+# For now don't search for DNSServiceRegister in a library - only Apple's
+# Bonjour implementation, which is always linked, works.
+###############################################################
+
+bonjouropt = get_option('bonjour')
+bonjour = dependency('', required : false)
+if cc.check_header('dns_sd.h', args: g_c_args, required: bonjouropt) \
+  and cc.has_function('DNSServiceRegister', args: g_c_args)
+  cdata.set('USE_BONJOUR', 1)
+  bonjour = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+krb_srvtab = ''
+if not gssapiopt.disabled()
+  gssapi = dependency('krb5-gssapi', required: gssapiopt)
+
+  if gssapi.found() and \
+    cc.check_header('gssapi/gssapi.h', args: g_c_args, dependencies: gssapi, required: gssapiopt)
+
+    if cc.has_function('gss_init_sec_context',
+      include_directories: g_c_inc, args: g_c_args, dependencies: gssapi)
+      cdata.set('ENABLE_GSS', 1)
+
+      krb_srvtab = 'FILE:/@0@/krb5.keytab)'.format(get_option('sysconfdir'))
+      cdata.set_quoted('PG_KRB_SRVTAB', krb_srvtab)
+    elif gssapiopt.enabled()
+      error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+    else
+      gssapi = dependency('', required : false)
+    endif
+  endif
+
+else
+  gssapi = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if not ldapopt.disabled()
+
+  if host_system == 'win32'
+    ldap = cc.find_library('wldap32')
+    ldap_r = ldap
+  else
+    # macos framework dependency is buggy for ldap (one can argue
+    # whether it's Apple's or meson's fault), leading to an endless
+    # recursion with ldap.h including itself. See
+    # https://github.com/mesonbuild/meson/issues/10002
+    # Luckily we only need pkg-config support, so the workaround isn't
+    # too complicated
+    ldap = dependency('ldap', method: 'pkg-config', required: false)
+
+    # Before 2.5 openldap didn't have a pkg-config file..
+    if ldap.found()
+      ldap_r = ldap
+    else
+      ldap = cc.find_library('ldap', required: ldapopt, dirs: g_c_lib)
+      ldap_r = cc.find_library('ldap_r', required: ldapopt, dirs: g_c_lib)
+
+      # Use ldap_r for FE if available, else assume ldap is thread-safe.
+      # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+      if ldap.found() and not ldap_r.found()
+        ldap_r = ldap
+      endif
+    endif
+
+    if ldap.found() and cc.has_function('ldap_initialize', args: g_c_args, dependencies: [ldap, thread_dep])
+      cdata.set('HAVE_LDAP_INITIALIZE', 1)
+    endif
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if ldap.found() and ldap.type_name() == 'library'
+      # declare dependency so that the additional include dir it might reside in
+      # is added automatically where necessary
+      ldap = declare_dependency(dependencies: ldap,
+        include_directories: g_c_inc)
+      ldap_r = declare_dependency(dependencies: ldap_r,
+        include_directories: g_c_inc)
+    endif
+  endif
+
+  if ldap.found()
+    cdata.set('USE_LDAP', 1)
+  endif
+
+else
+  ldap = dependency('', required : false)
+  ldap_r = ldap
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+  add_languages('cpp', required : true, native: false)
+  llvm = dependency('llvm', version : '>=3.9', method: 'config-tool', required: llvmopt)
+
+  if llvm.found()
+
+    cdata.set('USE_LLVM', 1)
+
+    cpp = meson.get_compiler('cpp')
+
+    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+    ccache = find_program('ccache', required: false)
+    clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+
+    # FIXME: the includes hardcoded here suck
+    llvm_irgen_args = [
+      '-c', '-o', '@OUTPUT@', '@INPUT@',
+      '-flto=thin', '-emit-llvm',
+      '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+      '-I@SOURCE_ROOT@/src/include',
+      '-I@BUILD_ROOT@/src/include',
+      '-I@BUILD_ROOT@/src/backend/utils/misc',
+      '-I@CURRENT_SOURCE_DIR@',
+      '-O2',
+      '-Wno-ignored-attributes',
+      '-Wno-empty-body',
+      g_c_args
+    ]
+
+    if ccache.found()
+      llvm_irgen_command = ccache
+      llvm_irgen_args = [clang.path()] + llvm_irgen_args
+    else
+      llvm_irgen_command = clang
+    endif
+
+    llvm_irgen_kw = {
+      'command': [llvm_irgen_command] + llvm_irgen_args,
+      'depfile': '@BASENAME@.c.bc.d',
+    }
+
+    irlink = find_program('src/tools/irlink', native: true)
+
+    llvm_irlink_kw = {
+      'command':[
+        irlink,
+        '--name', 'postgres',
+        '--lto', llvm_lto,
+        '--outdir', '@OUTPUT0@',
+        '--privdir', '@PRIVATE_DIR@',
+        '@INPUT@',
+      ],
+      'install': true,
+      'install_dir': dir_lib_pkg,
+    }
+
+  endif
+else
+  llvm = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+if not get_option('icu').disabled()
+  icu = dependency('icu-uc', required: get_option('icu').enabled())
+  icu_i18n = dependency('icu-i18n', required: get_option('icu').enabled())
+
+  if icu.found()
+    cdata.set('USE_ICU', 1)
+  endif
+
+else
+  icu = dependency('', required : false)
+  icu_i18n = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+  libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+  if libxml.found()
+    cdata.set('USE_LIBXML', 1)
+  endif
+else
+  libxml = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+  libxslt = dependency('libxslt', required: libxsltopt)
+
+  if libxslt.found()
+    cdata.set('USE_LIBXSLT', 1)
+  endif
+else
+  libxslt = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+  lz4 = dependency('liblz4', required: lz4opt)
+
+  if lz4.found()
+    cdata.set('USE_LZ4', 1)
+    cdata.set('HAVE_LIBLZ4', 1)
+  endif
+
+else
+  lz4 = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Tcl (for pltcl)
+# tclConfig.sh
+#
+# NB: tclConfig.sh is used in autoconf build for getting
+# TCL_SHARED_BUILD, TCL_INCLUDE_SPEC, TCL_LIBS and TCL_LIB_SPEC
+# variables. For now we have not seen a need to copy
+# that behaviour to the meson build.
+###############################################################
+
+tcl_dep = dependency('', required : false)
+tclopt = get_option('pltcl')
+tcl_version = get_option('tcl_version')
+if not tclopt.disabled()
+
+  # via pkg-config
+  tcl_dep = dependency(tcl_version, required: false)
+
+  if not tcl_dep.found()
+    tcl_dep = cc.find_library(tcl_version,
+      required: tclopt,
+      dirs: g_c_lib)
+  endif
+
+  if not cc.has_header('tcl.h', dependencies: tcl_dep, required: tclopt)
+    tcl_dep = dependency('', required: false)
+  endif
+endif
+
+
+
+###############################################################
+# Library: pam
+###############################################################
+
+pamopt = get_option('pam')
+if not pamopt.disabled()
+  pam = dependency('pam', required: false)
+
+  if not pam.found()
+    pam = cc.find_library('pam', required: pamopt, dirs: g_c_lib)
+  endif
+
+  if pam.found()
+    pam_header_found = false
+
+    # header file <security/pam_appl.h> or <pam/pam_appl.h> is required for PAM.
+    if cc.check_header('security/pam_appl.h', args: g_c_args, dependencies: pam, required: false)
+      cdata.set('HAVE_SECURITY_PAM_APPL_H', 1)
+      pam_header_found = true
+    elif cc.check_header('pam/pam_appl.h', args: g_c_args, dependencies: pam, required: pamopt)
+      cdata.set('HAVE_PAM_PAM_APPL_H', 1)
+      pam_header_found = true
+    endif
+
+    if pam_header_found
+      cdata.set('USE_PAM', 1)
+    else
+      pam = dependency('', required : false)
+    endif
+  endif
+else
+  pam = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('plperl')
+perl_dep = dependency('', required: false)
+
+if perlopt.disabled()
+  perl_may_work = false
+else
+  perl_may_work = true
+
+  # First verify that perl has the necessary dependencies installed
+  perl_mods = run_command(
+    [perl,
+     '-MConfig', '-MOpcode', '-MExtUtils::Embed', '-MExtUtils::ParseXS',
+     '-e', ''],
+    check: false)
+  if perl_mods.returncode() != 0
+    perl_may_work = false
+    perl_msg = 'perl installation does not have the required modules'
+  endif
+
+  # Then inquire perl about its configuration
+  if perl_may_work
+    # FIXME: include copy-edited comments from perl.m4
+    perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+    perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+    archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+    privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+    useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+    libperl = run_command(perl_conf_cmd, 'libperl', check: true).stdout()
+
+    perl_inc_dir = '@0@/CORE'.format(archlibexp)
+
+    if useshrplib != 'true'
+      perl_may_work = false
+      perl_msg = 'need a shared perl'
+    endif
+  endif
+
+  # XXX: should we only add directories that exist? Seems a bit annoying with
+  # macos' sysroot stuff...
+  #
+  # NB: For unknown reasons msys' python doesn't see these paths, despite gcc
+  # et al seeing them. So we can't use include_directories(), as that checks
+  # file existence.
+  if perl_may_work
+    # On most platforms, archlibexp is also where the Perl include files live ...
+    perl_ccflags = ['-I@0@'.format(perl_inc_dir)]
+    # ... but on newer macOS versions, we must use -iwithsysroot to look
+    # under sysroot
+    if not fs.is_file('@0@/perl.h'.format(perl_inc_dir)) and \
+       fs.is_file('@0@@1@/perl.h'.format(sysroot, perl_inc_dir))
+      perl_ccflags = ['-iwithsysroot', perl_inc_dir]
+    endif
+  endif
+
+  # check required headers are present
+  if perl_may_work and not \
+    cc.has_header('perl.h', args: g_c_args + perl_ccflags, required: false)
+    perl_may_work = false
+    perl_msg = 'missing perl.h'
+  endif
+
+  # Find perl library. This is made more complicated by the fact that the name
+  # Config.pm returns isn't directly usable (sometimes lib needs to be chopped
+  # off)
+  if perl_may_work
+    foreach p : ['perl', 'libperl', libperl, libperl.strip('lib'), fs.stem(libperl), fs.stem(libperl).strip('lib')]
+      perl_dep_int = cc.find_library(p,
+        dirs: ['@0@/CORE'.format(archlibexp)],
+        required: false)
+      if perl_dep_int.found()
+        break
+      endif
+    endforeach
+
+    if not perl_dep_int.found()
+      perl_may_work = false
+      perl_msg = 'missing libperl'
+    endif
+  endif
+
+  if perl_may_work
+    perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+    message('CCFLAGS recommended by Perl: @0@'.format(perl_ccflags_r))
+
+    foreach flag : perl_ccflags_r.split(' ')
+      if flag.startswith('-D') and \
+        (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+        perl_ccflags += flag
+      endif
+    endforeach
+
+    if host_system == 'win32'
+      perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+    endif
+
+    message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+    ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+
+    perl_ldopts = []
+    foreach ldopt : ldopts.split(' ')
+      if ldopt == ''
+        continue
+      # strawberry perl unhelpfully has that in ldopts
+      elif ldopt == '-s'
+        continue
+      # AIX perl has export file in ldopts
+      elif ldopt.startswith('-bE')
+        continue
+      endif
+
+      perl_ldopts += ldopt.strip('"')
+    endforeach
+
+    # FIXME: check if windows handling is necessary
+
+    message('LDFLAGS for embedding perl: "@0@" (ldopts: "@1@")'.format(
+      ' '.join(perl_ldopts), ldopts))
+
+    if perl_dep_int.found()
+      perl_dep = declare_dependency(
+        compile_args: perl_ccflags,
+        link_args: perl_ldopts,
+        version: perlversion,
+      )
+    endif
+  endif # perl_may_work
+
+  if not perl_may_work
+    if perlopt.enabled()
+      error('dependency perl failed: @0@'.format(perl_msg))
+    else
+      message('disabling optional dependency perl: @0@'.format(perl_msg))
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('plpython')
+if not pyopt.disabled()
+  pm = import('python')
+  python3_inst = pm.find_installation(required: pyopt.enabled())
+  python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled())
+  if not cc.has_header('Python.h', dependencies: python3_dep, required: pyopt.enabled())
+    python3_dep = dependency('', required: false)
+  endif
+else
+  python3_dep = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: Readline
+###############################################################
+
+if not get_option('readline').disabled()
+  libedit_preferred = get_option('libedit_preferred')
+  # Set the order of readline dependencies
+  check_readline_deps = libedit_preferred ? \
+    ['libedit', 'readline'] : ['readline', 'libedit']
+
+  foreach readline_dep : check_readline_deps
+    readline = dependency(readline_dep, required: false)
+    if not readline.found()
+      readline = cc.find_library(readline_dep,
+        required: get_option('readline').enabled(),
+        dirs: g_c_lib)
+    endif
+    if readline.found()
+      break
+    endif
+  endforeach
+
+  if readline.found()
+    cdata.set('HAVE_LIBREADLINE', 1)
+
+    editline_prefix = {
+      'header_prefix': 'editline/',
+      'flag_prefix': 'EDITLINE_',
+    }
+    readline_prefix = {
+      'header_prefix': 'readline/',
+      'flag_prefix': 'READLINE_',
+    }
+    default_prefix = {
+      'header_prefix': '',
+      'flag_prefix': '',
+    }
+
+    # Set the order of prefixes
+    prefixes = libedit_preferred ? \
+      [editline_prefix, default_prefix, readline_prefix] : \
+      [readline_prefix, default_prefix, editline_prefix]
+
+    at_least_one_header_found = false
+    foreach header: ['history', 'readline']
+      is_found = false
+      foreach prefix : prefixes
+        header_file = '@0@@1@.h'.format(prefix['header_prefix'], header)
+        # Check history.h and readline.h
+        if not is_found and cc.has_header(header_file,
+            args: g_c_args, include_directories: g_c_inc,
+            dependencies: [readline], required: false)
+          if header == 'history'
+            history_h = header_file
+          else
+            readline_h = header_file
+          endif
+          cdata.set('HAVE_@0@@1@_H'.format(prefix['flag_prefix'], header).to_upper(), 1)
+          is_found = true
+          at_least_one_header_found = true
+        endif
+      endforeach
+    endforeach
+
+    if not at_least_one_header_found
+      error('''readline header not found
+If you have @0@ already installed, see see meson-log/meson-log.txt for details on the
+failure. It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.'''.format(readline_dep))
+    endif
+
+    check_funcs = [
+      'append_history',
+      'history_truncate_file',
+      'rl_completion_matches',
+      'rl_filename_completion_function',
+      'rl_reset_screen_size',
+      'rl_variable_bind',
+    ]
+
+    foreach func : check_funcs
+      cdata.set('HAVE_'+func.to_upper(),
+        cc.has_function(func, args: g_c_args, dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    check_vars = [
+      'rl_completion_suppress_quote',
+      'rl_filename_quote_characters',
+      'rl_filename_quoting_function',
+    ]
+
+    foreach var : check_vars
+      cdata.set('HAVE_'+var.to_upper(),
+        cc.has_header_symbol(readline_h, var,
+          args: g_c_args, include_directories: g_c_inc,
+          prefix: '#include <stdio.h>',
+          dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if readline.type_name() == 'library'
+      readline = declare_dependency(dependencies: readline,
+        include_directories: g_c_inc)
+    endif
+  endif
+else
+  readline = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: selinux
+###############################################################
+
+selinux = dependency('', required : false)
+selinuxopt = get_option('selinux')
+if not selinuxopt.disabled()
+  selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
+endif
+cdata.set('HAVE_LIBSELINUX',
+  selinux.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: systemd
+###############################################################
+
+systemd = dependency('', required : false)
+systemdopt = get_option('systemd')
+if meson.version().version_compare('>=0.59')
+  systemdopt = systemdopt.disable_auto_if(host_machine.system() != 'linux')
+endif
+if not systemdopt.disabled()
+  systemd = dependency('libsystemd', required: systemdopt)
+endif
+cdata.set('USE_SYSTEMD',
+  systemd.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+  # Try to find openssl via pkg-config et al, if that doesn't work, look for
+  # the library names that we know about.
+
+  # via pkg-config et al
+  ssl = dependency('openssl', required: false)
+
+  # via library + headers
+  if not ssl.found()
+    ssl_lib = cc.find_library('ssl',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc,
+      has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+    crypto_lib = cc.find_library('crypto',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc)
+    ssl_int = [ssl_lib, crypto_lib]
+
+    ssl = declare_dependency(dependencies: ssl_int,
+                             include_directories: g_c_inc)
+  else
+    cc.has_header('openssl/ssl.h', args: g_c_args, dependencies: ssl, required: true)
+    cc.has_header('openssl/err.h', args: g_c_args, dependencies: ssl, required: true)
+
+    ssl_int = [ssl]
+  endif
+
+  check_funcs = [
+    ['CRYPTO_new_ex_data', {'required': true}],
+    ['SSL_new', {'required': true}],
+
+    # Function introduced in OpenSSL 1.0.2.
+    ['X509_get_signature_nid'],
+
+    # Functions introduced in OpenSSL 1.1.0. We used to check for
+    # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+    # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+    # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+    # functions.
+    ['OPENSSL_init_ssl'],
+    ['BIO_get_data'],
+    ['BIO_meth_new'],
+    ['ASN1_STRING_get0_data'],
+    ['HMAC_CTX_new'],
+    ['HMAC_CTX_free'],
+
+    # OpenSSL versions before 1.1.0 required setting callback functions, for
+    # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+    # function was removed.
+    ['CRYPTO_lock'],
+  ]
+
+  foreach c : check_funcs
+    func = c.get(0)
+    val = cc.has_function(func, args: g_c_args, dependencies: ssl_int)
+    if not val and c.get(1, {}).get('required', false)
+      error('openssl function @0@ is required'.format(func))
+    endif
+    cdata.set('HAVE_'+func.to_upper(), val ? 1 : false)
+  endforeach
+
+  cdata.set('USE_OPENSSL', 1,
+            description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+
+  cdata.set('OPENSSL_API_COMPAT', '0x10001000L',
+            description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings
+   from newer OpenSSL versions.''')
+else
+  ssl = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: uuid
+###############################################################
+
+uuidopt = get_option('uuid')
+if uuidopt != 'none'
+  uuidname = uuidopt.to_upper()
+  if uuidopt == 'e2fs'
+    uuid = dependency('uuid', required: true)
+    uuidfunc = 'uuid_generate'
+    uuidheader = 'uuid/uuid.h'
+  elif uuidopt == 'bsd'
+    # libc should have uuid function
+    uuid = declare_dependency()
+    uuidfunc = 'uuid_to_string'
+    uuidheader = 'uuid.h'
+  elif uuidopt == 'ossp'
+    uuid = dependency('ossp-uuid', required: true)
+    uuidfunc = 'uuid_export'
+    uuidheader = 'ossp/uuid.h'
+  else
+    error('huh')
+  endif
+
+  if not cc.has_header_symbol(uuidheader, uuidfunc, args: g_c_args, dependencies: uuid)
+    error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc))
+  endif
+  cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1)
+
+  cdata.set('HAVE_UUID_@0@'.format(uuidname), 1,
+           description: 'Define to 1 if you have @0@ UUID support.'.format(uuidname))
+else
+  uuid = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = dependency('', required : false)
+if not zlibopt.disabled()
+  zlib_t = dependency('zlib', required: zlibopt)
+
+  if zlib_t.type_name() == 'internal'
+    # if fallback was used, we don't need to test if headers are present (they
+    # aren't built yet, so we can't test)
+    zlib = zlib_t
+  elif not zlib_t.found()
+    warning('did not find zlib')
+  elif not cc.has_header('zlib.h',
+    args: g_c_args, include_directories: g_c_inc,
+    dependencies: [zlib_t], required: zlibopt.enabled())
+    warning('zlib header not found')
+  elif not cc.has_type('z_streamp', args: g_c_args, dependencies: [zlib_t], prefix: '#include <zlib.h>')
+    if zlibopt.enabled()
+      error('zlib version is too old')
+    else
+      warning('zlib version is too old')
+    endif
+  else
+    zlib = zlib_t
+  endif
+
+  if zlib.found()
+    cdata.set('HAVE_LIBZ', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Library: zstd
+###############################################################
+
+zstdopt = get_option('zstd')
+if not zstdopt.disabled()
+  zstd = dependency('libzstd', required: zstdopt, version: '>=1.4.0')
+
+  if zstd.found()
+    cdata.set('USE_ZSTD', 1)
+    cdata.set('HAVE_LIBZSTD', 1)
+  endif
+
+else
+  zstd = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+# Do we need -std=c99 to compile C99 code?
+c99_test = '''
+#include <stdbool.h>
+#include <complex.h>
+#include <tgmath.h>
+#include <inttypes.h>
+
+struct named_init_test {
+  int a;
+  int b;
+};
+
+extern void structfunc(struct named_init_test);
+
+int main(int argc, char **argv)
+{
+  struct named_init_test nit = {
+    .a = 3,
+    .b = 5,
+  };
+
+  for (int loop_var = 0; loop_var < 3; loop_var++)
+  {
+    nit.a += nit.b;
+  }
+
+  structfunc((struct named_init_test){1, 0});
+
+  return nit.a != 0;
+}
+'''
+
+if not cc.compiles(c99_test, name: 'c99', args: g_c_args)
+  if cc.compiles(c99_test, name: 'c99 with -std=c99', args: g_c_args + ['-std=c99'])
+    g_c_args += '-std=c99'
+    cflags += '-std=c99'
+  else
+    error('C compiler does not support C99')
+  endif
+endif
+
+sizeof_long = cc.sizeof('long', args: g_c_args)
+cdata.set('SIZEOF_LONG', sizeof_long)
+if sizeof_long == 8
+  cdata.set('HAVE_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long int')
+  cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: g_c_args) == 8
+  cdata.set('HAVE_LONG_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long long int')
+  cdata.set_quoted('INT64_MODIFIER', 'll')
+else
+  error('do not know how to get a 64bit int')
+endif
+
+if host_machine.endian() == 'big'
+  cdata.set('WORDS_BIGENDIAN', 1)
+endif
+
+alignof_types = ['short', 'int', 'long', 'double']
+maxalign = 0
+foreach t: alignof_types
+  align = cc.alignment(t, args: g_c_args)
+  if maxalign < align
+    maxalign = align
+  endif
+  cdata.set('ALIGNOF_@0@'.format(t.to_upper()), align)
+endforeach
+cdata.set('MAXIMUM_ALIGNOF', maxalign)
+
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: g_c_args))
+cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: g_c_args))
+
+
+# Check if __int128 is a working 128 bit integer type, and if so
+# define PG_INT128_TYPE to that typename.
+#
+# This currently only detects a GCC/clang extension, but support for other
+# environments may be added in the future.
+#
+# For the moment we only test for support for 128bit math; support for
+# 128bit literals and snprintf is not required.
+if cc.links('''
+  /*
+   * We don't actually run this test, just link it to verify that any support
+   * functions needed for __int128 are present.
+   *
+   * These are globals to discourage the compiler from folding all the
+   * arithmetic tests down to compile-time constants.  We do not have
+   * convenient support for 128bit literals at this point...
+   */
+  __int128 a = 48828125;
+  __int128 b = 97656250;
+
+  int main(void)
+  {
+      __int128 c,d;
+      a = (a << 12) + 1; /* 200000000001 */
+      b = (b << 12) + 5; /* 400000000005 */
+      /* try the most relevant arithmetic ops */
+      c = a * b;
+      d = (c + b) / b;
+      /* must use the results, else compiler may optimize arithmetic away */
+      return d != a+1;
+  }''',
+  name: '__int128',
+  args: g_c_args)
+
+  buggy_int128 = false
+
+  # Use of non-default alignment with __int128 tickles bugs in some compilers.
+  # If not cross-compiling, we can test for bugs and disable use of __int128
+  # with buggy compilers.  If cross-compiling, hope for the best.
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83925
+  if not meson.is_cross_build()
+    r =  cc.run('''
+    /* This must match the corresponding code in c.h: */
+    #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
+    #define pg_attribute_aligned(a) __attribute__((aligned(a)))
+    #endif
+    typedef __int128 int128a
+    #if defined(pg_attribute_aligned)
+    pg_attribute_aligned(8)
+    #endif
+    ;
+
+    int128a holder;
+    void pass_by_val(void *buffer, int128a par) { holder = par; }
+
+    int main(void)
+    {
+        long int i64 = 97656225L << 12;
+        int128a q;
+        pass_by_val(main, (int128a) i64);
+        q = (int128a) i64;
+        return q != holder;
+    }''',
+    name: '__int128 alignment bug',
+    args: g_c_args)
+    assert(r.compiled())
+    if r.returncode() != 0
+      buggy_int128 = true
+    endif
+  endif
+
+  if not buggy_int128
+    cdata.set('PG_INT128_TYPE', '__int128')
+    cdata.set('ALIGNOF_PG_INT128_TYPE', cc.alignment('__int128', args: g_c_args))
+  endif
+endif
+
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang).  If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+    static inline int foo(void)
+    {
+      void *labeladdrs[] = {&&my_label};
+      goto *labeladdrs[0];
+      my_label:
+      return 1;
+    }''',
+    args: g_c_args)
+  cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# XXX: for now just assume that compiler knows __func__ - it's C99 after all.
+cdata.set('HAVE_FUNCNAME__FUNC', 1)
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+    int main(int arg, char **argv)
+    {
+        ({ _Static_assert(1, "foo"); });
+    }
+    ''',
+    args: g_c_args)
+  cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: g_c_args) \
+  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: g_c_args) \
+  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: g_c_args) == 1
+  cdata.set('HAVE__BOOL', 1)
+  cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+# Need to check a call with %m because netbsd supports gnu_printf but emits a
+# warning for each use of %m.
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = '''
+extern void emit_log(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));
+static void call_log(void)
+{
+    emit_log(0, "error: %s: %m", "foo");
+}
+'''
+attrib_error_args = cc.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
+foreach a : printf_attributes
+  if cc.compiles(testsrc.format(a), args: g_c_args + attrib_error_args, name: 'format ' + a)
+    cdata.set('PG_PRINTF_ATTRIBUTE', a)
+    break
+  endif
+endforeach
+
+if cc.has_function_attribute('visibility:default') and \
+  cc.has_function_attribute('visibility:hidden')
+  cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+endif
+
+# Check if various builtins exist. Some builtins are tested separately,
+# because we want to test something more complicated than the generic case.
+builtins = [
+  'bswap16',
+  'bswap32',
+  'bswap64',
+  'clz',
+  'ctz',
+  'constant_p',
+  'frame_address',
+  'popcount',
+  'unreachable',
+]
+
+foreach builtin : builtins
+  fname = '__builtin_@0@'.format(builtin)
+  if cc.has_function(fname, args: g_c_args)
+    cdata.set('HAVE@0@'.format(fname.to_upper()), 1)
+  endif
+endforeach
+
+# Check if the C compiler understands __builtin_types_compatible_p,
+# and define HAVE__BUILTIN_TYPES_COMPATIBLE_P if so.
+#
+# We check usage with __typeof__, though it's unlikely any compiler would
+# have the former and not the latter.
+if cc.compiles('''
+    static int x;
+    static int y[__builtin_types_compatible_p(__typeof__(x), int)];
+    ''',
+    name: '__builtin_types_compatible_p',
+    args: g_c_args)
+  cdata.set('HAVE__BUILTIN_TYPES_COMPATIBLE_P', 1)
+endif
+
+# Check if the C compiler understands __builtin_$op_overflow(),
+# and define HAVE__BUILTIN_OP_OVERFLOW if so.
+#
+# Check for the most complicated case, 64 bit multiplication, as a
+# proxy for all of the operations.  To detect the case where the compiler
+# knows the function but library support is missing, we must link not just
+# compile, and store the results in global variables so the compiler doesn't
+# optimize away the call.
+if cc.links('''
+    INT64 a = 1;
+    INT64 b = 1;
+    INT64 result;
+
+    int main(void)
+    {
+        return __builtin_mul_overflow(a, b, &result);
+    }''',
+    name: '__builtin_mul_overflow',
+    args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))],
+    )
+  cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1)
+endif
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+    #include <cpuid.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+    }
+    ''', name: '__get_cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+    #include <intrin.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __cpuid(exx, 1);
+    }
+    ''', name: '__cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__CPUID', 1)
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+  # Disable strict-aliasing rules; needed for gcc 3.3+
+  '-fno-strict-aliasing',
+  # Disable optimizations that assume no overflow; needed for gcc 4.3+
+  '-fwrapv',
+  '-fexcess-precision=standard'
+]
+
+cflags += cc.get_supported_arguments(common_functional_flags)
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+
+common_warning_flags = [
+  '-Wmissing-prototypes',
+  '-Wpointer-arith',
+  # Really don't want VLAs to be used in our dialect of C
+  '-Werror=vla',
+  # On macOS, complain about usage of symbols newer than the deployment target
+  '-Werror=unguarded-availability-new',
+  '-Wendif-labels',
+  '-Wmissing-format-attribute',
+  '-Wimplicit-fallthrough=3',
+  '-Wcast-function-type',
+  # This was included in -Wall/-Wformat in older GCC versions
+  '-Wformat-security',
+]
+
+cflags += cc.get_supported_arguments(common_warning_flags)
+
+if llvm.found()
+  cxxflags += cpp.get_supported_arguments(common_warning_flags)
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+  cflags += '-Wdeclaration-after-statement'
+  using_declaration_after_statement_warning = true
+else
+  using_declaration_after_statement_warning = false
+endif
+
+
+# The following tests want to suppress various unhelpful warnings by adding
+# -Wno-foo switches.  But gcc won't complain about unrecognized -Wno-foo
+# switches, so we have to test for the positive form and if that works,
+# add the negative form.
+
+negative_warning_flags = [
+  # Suppress clang's unhelpful unused-command-line-argument warnings.
+  'unused-command-line-argument',
+
+  # Remove clang 12+'s compound-token-split-by-macro, as this causes a lot
+  # of warnings when building plperl because of usages in the Perl headers.
+  'compound-token-split-by-macro',
+
+  # Similarly disable useless truncation warnings from gcc 8+
+  'format-truncation',
+  'stringop-truncation',
+
+  # FIXME: from andres's local config
+  'clobbered',
+  'missing-field-initializers',
+  'sign-compare',
+  'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+  if cc.has_argument('-W'+w)
+    cflags += '-Wno-'+w
+  endif
+
+  if llvm.found() and cpp.has_argument('-W'+w)
+    cxxflags += '-Wno-'+w
+  endif
+endforeach
+
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+  cflags += ['/wd4018', '/wd4244', '/wd4273', '/wd4101', '/wd4102', '/wd4090', '/wd4267']
+  cflags += ['/DWIN32', '/DWINDOWS', '/D__WINDOWS__', '/D__WIN32__',
+             '/DWIN32_STACK_RLIMIT=4194304', '/D_CRT_SECURE_NO_DEPRECATE',
+             '/D_CRT_NONSTDC_NO_DEPRECATE']
+endif
+
+
+
+###############################################################
+# Atomics
+###############################################################
+
+# FIXME
+
+if not get_option('spinlocks')
+  warning('Not using spinlocks will cause poor performance')
+else
+  cdata.set('HAVE_SPINLOCKS', 1)
+endif
+
+if not get_option('atomics')
+  warning('Not using atomics will cause poor performance')
+else
+  # XXX: perhaps we should require some atomics support in this case these
+  # days?
+  cdata.set('HAVE_ATOMICS', 1)
+
+  atomic_checks = [
+    {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+     'desc': '__sync_lock_test_and_set(char)',
+     'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+     'desc': '__sync_lock_test_and_set(int32)',
+     'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+     'desc': '__sync_val_compare_and_swap(int32)',
+     'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+     'desc': '__sync_val_compare_and_swap(int64)',
+     'test': '''
+INT64 val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+     'desc': ' __atomic_compare_exchange_n(int32)',
+     'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+     'desc': ' __atomic_compare_exchange_n(int64)',
+     'test': '''
+INT64 val = 0;
+INT64 expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+  ]
+
+  foreach check : atomic_checks
+    test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+    cdata.set(check['name'],
+      cc.links(test,
+        name: check['desc'],
+        args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false
+    )
+  endforeach
+
+endif
+
+
+
+###############################################################
+# Select CRC-32C implementation.
+#
+# If we are targeting a processor that has Intel SSE 4.2 instructions, we can
+# use the special CRC instructions for calculating CRC-32C. If we're not
+# targeting such a processor, but we can nevertheless produce code that uses
+# the SSE intrinsics, perhaps with some extra CFLAGS, compile both
+# implementations and select which one to use at runtime, depending on whether
+# SSE 4.2 is supported by the processor we're running on.
+#
+# Similarly, if we are targeting an ARM processor that has the CRC
+# instructions that are part of the ARMv8 CRC Extension, use them. And if
+# we're not targeting such a processor, but can nevertheless produce code that
+# uses the CRC instructions, compile both, and select at runtime.
+###############################################################
+
+have_optimized_crc = false
+cflags_crc = []
+if host_cpu == 'x86' or host_cpu == 'x86_64'
+
+  if cc.get_id() == 'msvc'
+    cdata.set('USE_SSE42_CRC32C', false)
+    cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  else
+
+    prog = '''
+#include <nmmintrin.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = _mm_crc32_u8(crc, 0);
+    crc = _mm_crc32_u32(crc, 0);
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+    if cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 without -msse4.2', args: g_c_args)
+      # Use Intel SSE 4.2 unconditionally.
+      cdata.set('USE_SSE42_CRC32C', 1)
+      have_optimized_crc = true
+    elif cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 with -msse4.2', args: g_c_args + ['-msse4.2'])
+      # Use Intel SSE 4.2, with runtime check. The CPUID instruction is needed for
+      # the runtime check.
+      cflags_crc += '-msse4.2'
+      cdata.set('USE_SSE42_CRC32C', false)
+      cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+      have_optimized_crc = true
+    endif
+
+  endif
+
+elif host_cpu == 'arm' or host_cpu == 'aarch64'
+
+  prog = '''
+#include <arm_acle.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = __crc32cb(crc, 0);
+    crc = __crc32ch(crc, 0);
+    crc = __crc32cw(crc, 0);
+    crc = __crc32cd(crc, 0);
+
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+  if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc',
+      args: g_c_args)
+    # Use ARM CRC Extension unconditionally
+    cdata.set('USE_ARMV8_CRC32C', true)
+    have_optimized_crc = true
+  elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc',
+      args: g_c_args + ['-march=armv8-a+crc'])
+    # Use ARM CRC Extension, with runtime check
+    cflags_crc += '-march=armv8-a+crc'
+    cdata.set('USE_ARMV8_CRC32C', false)
+    cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  endif
+endif
+
+if not have_optimized_crc
+  # fall back to slicing-by-8 algorithm, which doesn't require any special CPU
+  # support.
+  cdata.set('USE_SLICING_BY_8_CRC32C', 1)
+endif
+
+
+
+###############################################################
+# Other CPU specific stuff
+###############################################################
+
+if host_cpu == 'x86_64'
+
+  if cc.compiles('''
+      void main(void)
+      {
+          long long x = 1; long long r;
+          __asm__ __volatile__ (" popcntq %1,%0\n" : "=q"(r) : "rm"(x));
+      }''',
+      name: '@0@: popcntq instruction'.format(host_cpu),
+      args: g_c_args)
+    cdata.set('HAVE_X86_64_POPCNTQ', 1)
+  endif
+
+elif host_cpu == 'ppc' or host_cpu == 'ppc64'
+
+  if cc.compiles('''
+      void main(void)
+      {
+          int a = 0; int *p = &a; int r;
+	  __asm__ __volatile__ (" lwarx %0,0,%1,1\n" : "=&r"(r) : "r"(p));
+      }''',
+      name: '@0@: whether assembler supports lwarx hint bit'.format(host_cpu),
+      args: g_c_args)
+    cdata.set('HAVE_PPC_LWARX_MUTEX_HINT', 1)
+  endif
+
+  # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+  if cdata.has('HAVE__BUILTIN_CONSTANT_P')
+    if cc.compiles('''
+      static inline int
+      addi(int ra, int si)
+      {
+          int res = 0;
+          if (__builtin_constant_p(si))
+              __asm__ __volatile__(
+                  " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+          return res;
+      }
+      int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+      ''',
+      args: g_c_args)
+      cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+header_checks = [
+  ['atomic.h'],
+  ['stdbool.h'],
+  ['copyfile.h'],
+  ['execinfo.h'],
+  ['getopt.h'],
+  ['ifaddrs.h'],
+  ['langinfo.h'],
+  ['mbarrier.h'],
+  ['poll.h'],
+  ['strings.h'],
+  ['sys/epoll.h'],
+  ['sys/event.h'],
+  ['sys/ipc.h'],
+  ['sys/personality.h'],
+  ['sys/prctl.h'],
+  ['sys/procctl.h'],
+  ['sys/pstat.h'],
+  ['sys/resource.h'],
+  ['sys/select.h'],
+  ['sys/sem.h'],
+  ['sys/shm.h'],
+  ['sys/signalfd.h'],
+  ['sys/sockio.h'],
+  ['sys/tas.h'],
+  ['sys/uio.h'],
+  ['sys/un.h'],
+  ['termios.h'],
+  ['ucred.h'],
+  # Historically we've included sys/param.h first, due to sys/ucred.h not
+  # being standalone on OpenBSD (in 2013). But that doesn't look to be the case
+  # anymore in 2022.
+  ['sys/ucred.h'],
+  ['wctype.h'],
+  ['netinet/tcp.h'],
+  # Historically we've included sys/socket.h first due to net/if.h not being
+  # standalone on some BSDs (in 2009). But that doesn't look to be the case
+  # anymore in 2022.
+  ['net/if.h'],
+  ['crtdefs.h'],
+]
+
+foreach c : header_checks
+  header = c.get(0)
+  varname = 'HAVE_'+header.underscorify().to_upper()
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  found = cc.has_header(header, include_directories: g_c_inc, args: g_c_args)
+  cdata.set(varname, found ? 1 : false,
+            description: 'Define to 1 if you have the <@0@> header file.'.format(header))
+endforeach
+
+
+
+decl_checks = [
+  ['F_FULLFSYNC', 'fcntl.h'],
+  ['RTLD_GLOBAL', 'dlfcn.h'],
+  ['RTLD_NOW', 'dlfcn.h'],
+  ['fdatasync', 'unistd.h'],
+  ['posix_fadvise', 'fcntl.h'],
+  ['sigwait', 'signal.h'],
+  ['strlcat', 'string.h'],
+  ['strlcpy', 'string.h'],
+  ['strnlen', 'string.h'],
+  ['strtoll', 'stdlib.h'], ['strtoull', 'stdlib.h'], # strto[u]ll may exist but not be declared
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+  ['preadv', 'sys/uio.h'],
+  ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+  func = c.get(0)
+  header = c.get(1)
+  args = c.get(2, {})
+  varname = 'HAVE_DECL_'+func.underscorify().to_upper()
+
+  found = cc.has_header_symbol(header, func,
+    args: g_c_args, include_directories: g_c_inc,
+    kwargs: args)
+  cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@', and to 0 if you
+   don't.'''.format(func))
+endforeach
+
+
+
+if cc.has_type('struct cmsgcred',
+    args: g_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '-DHAVE_SYS_UCRED_H' : ''],
+    include_directories: g_c_inc,
+    prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+  cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+  cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_type('struct option',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '@0@'.format(cdata.get('HAVE_GETOPT_H')) == '1' ? '#include <getopt.h>' : '')
+  cdata.set('HAVE_STRUCT_OPTION', 1)
+endif
+
+
+foreach c : ['opterr', 'optreset']
+  varname = 'HAVE_INT_'+c.underscorify().to_upper()
+
+  if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+    extern int @0@;
+    @0@ = 1;
+}
+'''.format(c), name: c, args: g_c_args)
+    cdata.set(varname, 1)
+  else
+    cdata.set(varname, false)
+  endif
+endforeach
+
+if cc.has_type('socklen_t',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/socket.h>''')
+  cdata.set('HAVE_SOCKLEN_T', 1)
+endif
+
+if cc.has_type('struct sockaddr_storage',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', 'ss_family',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', '__ss_family',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', 'ss_len',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN', 1)
+endif
+
+if cc.has_member('struct sockaddr_storage', '__ss_len',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN', 1)
+endif
+
+if cc.has_member('struct sockaddr', 'sa_len',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
+endif
+
+if cc.has_type('struct sockaddr_un',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/un.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_UN', 1)
+endif
+
+if cc.has_type('struct addrinfo', args: g_c_args,
+    include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+''')
+  cdata.set('HAVE_STRUCT_ADDRINFO', 1)
+endif
+
+if cc.has_type('struct sockaddr_in6',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <netinet/in.h>''')
+  cdata.set('HAVE_IPV6', 1)
+endif
+
+
+if cc.has_member('struct tm', 'tm_zone',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+  cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+    return timezone / 60;
+}
+''',
+    name: 'Check if the global variable `timezone\' exists',
+    args: g_c_args, include_directories: g_c_inc)
+  cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+  cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+# FIXME: sys/ipc.h, sys/sem.h includes were conditional
+if cc.has_type('union semun',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+''')
+  cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+  char buf[100];
+  switch (strerror_r(1, buf, sizeof(buf)))
+  { case 0: break; default: break; }
+}''',
+    name: 'strerror_r',
+    args: g_c_args, include_directories: g_c_inc)
+  cdata.set('STRERROR_R_INT', 1)
+else
+  cdata.set('STRERROR_R_INT', false)
+endif
+
+# Check for the locale_t type and find the right header file.  macOS
+# needs xlocale.h; standard is locale.h, but glibc also has an
+# xlocale.h file that we should not use.
+if cc.has_type('locale_t', prefix: '#include <locale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+elif cc.has_type('locale_t', prefix: '#include <xlocale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+  cdata.set('LOCALE_T_IN_XLOCALE', 1)
+endif
+
+# Make sure there's a declaration for sigwait(), then make sure that it
+# conforms to the POSIX standard (there seem to still be some platforms out
+# there with pre-POSIX sigwait()).
+if cc.compiles('''
+#include <signal.h>
+int sigwait(const sigset_t *set, int *sig);
+''',
+  name: 'POSIX compatible sigwait() declaration',
+  args: g_c_args, include_directories: g_c_inc)
+  cdata.set('HAVE_POSIX_DECL_SIGWAIT', 1)
+else
+  cdata.set('HAVE_POSIX_DECL_SIGWAIT', false)
+endif
+
+# Check if the C compiler understands typeof or a variant.  Define
+# HAVE_TYPEOF if so, and define 'typeof' to the actual key word.
+foreach kw : ['typeof', '__typeof__', 'decltype']
+  if cc.compiles('''
+int main(void)
+{
+    int x = 0;
+    @0@(x) y;
+    y = x;
+    return y;
+}
+'''.format(kw),
+    name: 'typeof()',
+    args: g_c_args, include_directories: g_c_inc)
+
+    cdata.set('HAVE_TYPEOF', 1)
+    if kw != 'typeof'
+      cdata.set('typeof', kw)
+    endif
+
+    break
+  endif
+endforeach
+
+
+# MSVC doesn't cope well with defining restrict to __restrict, the
+# spelling it understands, because it conflicts with
+# __declspec(restrict). Therefore we define pg_restrict to the
+# appropriate definition, which presumably won't conflict.
+#
+# FIXME: We used to check if restrict is available, but it really should these
+# days?
+#
+# FIXME: Historically we allowed platforms to disable restrict in template
+# files. Is that really still necessary?
+cdata.set('pg_restrict', '__restrict')
+
+
+cdata.set('MEMSET_LOOP_LIMIT', 1024)
+
+# XXX: We probably can just rely on this existing in supported windows versions?
+if host_system == 'win32' and \
+  cc.has_type('MINIDUMP_TYPE', prefix: '''
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <string.h>
+#include <dbghelp.h>
+''',
+  args: g_c_args, include_directories: g_c_inc)
+  cdata.set('HAVE_MINIDUMP_TYPE', true)
+endif
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+    PS_STRINGS->ps_nargvstr = 1;
+    PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+  name: 'PS_STRINGS', args: g_c_args)
+  cdata.set('HAVE_PS_STRINGS', 1)
+else
+  cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+m_dep = cc.find_library('m', required : false)
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps = [m_dep]
+
+rt_dep = cc.find_library('rt', required : false)
+
+dl_dep = cc.find_library('dl', required : false)
+
+util_dep = cc.find_library('util', required : false)
+posix4_dep = cc.find_library('posix4', required : false)
+
+getopt_dep = cc.find_library('getopt', required : false)
+gnugetopt_dep = cc.find_library('gnugetopt', required : false)
+
+execinfo_dep = cc.find_library('execinfo', required : false)
+
+func_checks = [
+  ['_configthreadlocale'],
+  ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+  ['clock_gettime', {'dependencies': [rt_dep, posix4_dep]}],
+  ['copyfile'],
+  ['dlopen', {'dependencies': [dl_dep]}],
+  ['explicit_bzero'],
+  ['fdatasync', {'dependencies': [rt_dep, posix4_dep]}],
+  ['fls'],
+  ['getaddrinfo'],
+  ['gethostbyname_r', {'dependencies': [thread_dep]}],
+  ['getifaddrs'],
+  ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getopt_long',{'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getpeereid'],
+  ['getpeerucred'],
+  ['getpwuid_r', {'dependencies': [thread_dep]}],
+  ['getrlimit'],
+  ['getrusage'],
+  ['gettimeofday'], # XXX: only exists in Solution.pm
+  ['inet_aton'],
+  ['inet_pton'],
+  ['kqueue'],
+  ['link'],
+  ['mbstowcs_l'],
+  ['memset_s'],
+  ['mkdtemp'],
+  ['poll'],
+  ['posix_fadvise'],
+  ['posix_fallocate'],
+  ['ppoll'],
+  ['pread'],
+  ['pstat'],
+  ['pthread_is_threaded_np', {'dependencies': [thread_dep]}],
+  ['pwrite'],
+  ['readlink'],
+  ['readv'],
+  ['setenv'], # FIXME: windows handling
+  ['setproctitle', {'dependencies': [util_dep]}],
+  ['setproctitle_fast'],
+  ['setsid'],
+  ['shm_open', {'dependencies': [rt_dep]}],
+  ['shm_unlink', {'dependencies': [rt_dep]}],
+  ['strchrnul'],
+  ['strerror_r', {'dependencies': [thread_dep]}],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+  ['strsignal'],
+  ['strtof'], # strsignal is checked separately
+  ['strtoll'], ['__strtoll'], ['strtoq'],
+  ['strtoull'], ['__strtoull'], ['strtouq'],
+  ['symlink'],
+  ['sync_file_range'],
+  ['syncfs'],
+  ['unsetenv'],
+  ['uselocale'],
+  ['wcstombs_l'],
+  ['writev'],
+]
+
+foreach c : func_checks
+  func = c.get(0)
+  kwargs = c.get(1, {})
+  deps = kwargs.get('dependencies', [])
+
+  varname = 'HAVE_'+func.underscorify().to_upper()
+
+  found = cc.has_function(func, args: g_c_args,
+                          kwargs: kwargs + {'dependencies': []})
+
+  if not found
+    foreach dep : deps
+      if not dep.found()
+        continue
+      endif
+      found = cc.has_function(func, args: g_c_args,
+                              kwargs: kwargs + {'dependencies': [dep]})
+      if found
+        os_deps += dep
+        break
+      endif
+    endforeach
+  endif
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  cdata.set(varname, found  ? 1 : false,
+            description: 'Define to 1 if you have the `@0@\' function.'.format(func))
+endforeach
+
+
+if cc.has_function('syslog', args: g_c_args) and cc.check_header('syslog.h', args: g_c_args)
+  cdata.set('HAVE_SYSLOG', 1)
+endif
+
+
+
+
+if host_system == 'aix'
+  dlsuffix = '.so'
+  exesuffix = ''
+  export_file_format = 'aix'
+elif host_system == 'darwin'
+  dlsuffix = '.dylib'
+  exesuffix = ''
+  export_file_format = 'darwin'
+elif host_system == 'win32'
+  dlsuffix = '.dll'
+  exesuffix = '.exe'
+  export_file_format = ''
+else
+  dlsuffix = '.so'
+  exesuffix = ''
+  export_file_format = 'gnu'
+endif
+
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+if host_system == 'darwin'
+  cdata.set('USE_SYSV_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'openbsd'
+  # FIXME: This likely defaulted to sysv, but the defaults for sysv semas on
+  # openbsd are so low that tap tests don't pass.
+  cdata.set('USE_NAMED_POSIX_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'win32'
+  cdata.set('USE_WIN32_SEMAPHORES', 1)
+  cdata.set('USE_WIN32_SHARED_MEMORY', 1)
+else
+  cdata.set('USE_UNNAMED_POSIX_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+endif
+
+
+if host_system == 'win32'
+  cdata.set('HAVE_IPV6', 1)
+  cdata.set('HAVE_SYMLINK', 1)
+  cdata.set('WIN32_STACK_RLIMIT', 4194304)
+  cdata.set('HAVE__CONFIGTHREADLOCALE', 1)
+endif
+
+if cc.get_id() == 'msvc'
+  ldflags += ['/fixed:no','/dynamicbase', '/nxcompat']
+endif
+
+if host_system == 'win32'
+  os_deps += cc.find_library('ws2_32', required: true)
+endif
+
+add_project_arguments(cflags, language: ['c'])
+add_project_arguments(cxxflags, language: ['cpp'])
+add_project_arguments(cbflags, language: ['c', 'cpp'])
+add_project_link_arguments(ldflags, language: ['c', 'cpp'])
+
+
+###############################################################
+# Threading
+###############################################################
+
+# Probably not worth implementing other cases anymore
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+if thread_dep.found()
+  if cc.has_function('pthread_is_threaded_np', args: g_c_args, dependencies: [thread_dep])
+    cdata.set('HAVE_PTHREAD_IS_THREADED_NP', 1)
+  endif
+  if cc.has_function('pthread_barrier_wait', args: g_c_args, dependencies: [thread_dep])
+    cdata.set('HAVE_PTHREAD_BARRIER_WAIT', 1)
+  endif
+endif
+
+
+
+###############################################################
+# NLS / Gettext
+###############################################################
+
+i18n = import('i18n')
+nlsopt = get_option('nls')
+libintl = dependency('', required: false)
+
+if not nlsopt.disabled()
+  # meson 0.59 has this wrapped in dependency('int')
+  if cc.check_header('libintl.h', args: g_c_args, required: nlsopt)
+    # in libc
+    if cc.has_function('ngettext')
+      libintl = declare_dependency()
+    else
+      libintl = cc.find_library('intl', has_headers: ['libintl.h'], required: nlsopt)
+    endif
+  endif
+
+  if libintl.found()
+    cdata.set('ENABLE_NLS', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Build
+###############################################################
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+test_deps = []
+backend_targets = []
+
+
+# Define the tests to distribute them to the correct test styles later
+tests = []
+
+
+# Default options for targets
+
+default_target_args = {
+  'implicit_include_directories': false,
+  'install': true,
+}
+
+default_lib_args = default_target_args + {
+  'name_prefix': '',
+}
+
+internal_lib_args = default_lib_args + {
+  'build_by_default': false,
+  'install': false,
+}
+
+default_mod_args = default_lib_args + {
+  'name_prefix': '',
+  'install_dir': dir_lib_pkg,
+}
+
+default_bin_args = default_target_args + {
+  'install_dir': dir_bin,
+}
+
+library_path_var = ''
+
+if host_system == 'win32'
+  # nothing to do
+elif host_system == 'openbsd'
+  # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+  # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+  # when invoked via PATH search).
+  library_path_var = 'LD_LIBRARY_PATH'
+else
+  if host_system == 'darwin'
+    rpath_var = '@loader_path'
+  else
+    rpath_var = '$ORIGIN'
+  endif
+
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_bin, dir_lib, check: true).stdout().strip()
+  default_bin_args += {'install_rpath':  rpath_var / bin_to_lib}
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_lib_pkg, dir_lib, check: true).stdout().strip()
+  default_mod_args += {'install_rpath': rpath_var / mod_to_lib}
+endif
+
+
+###
+### windows resources related stuff
+###
+
+pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+win32ver_rc_in = files('src/port/win32ver.rc.in')
+rcgen = find_program('src/tools/rcgen', native: true)
+
+rcgen_cmd = [rcgen, '@INPUT@', '-o', '@OUTPUT@', '--depfile', '@DEPFILE@']
+rcgen_bin_cmd = rcgen_cmd + [
+  '--VFT_TYPE', 'VFT_APP',
+  '--FILEENDING', 'exe',
+  '--ICO', pg_ico,
+]
+
+rcgen_lib_cmd = rcgen_cmd + [
+  '--VFT_TYPE', 'VFT_DLL',
+  '--FILEENDING', 'dll',
+]
+
+rcgen_inc = [postgres_inc]
+
+rcgen_kw = {
+  'input': win32ver_rc_in,
+  'output': 'win32ver.rc',
+  'depfile': '@PLAINNAME@.d',
+}
+
+rccompile_kw = {
+  'include_directories': rcgen_inc,
+}
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+generated_headers = []
+generated_backend_headers = []
+
+
+subdir('src/include')
+
+subdir('config')
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+backend_common_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_shlib, common_shlib],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+libpq_deps = [
+  frontend_shlib_code,
+  thread_dep,
+
+  gssapi,
+  ldap,
+  libintl,
+  ssl,
+]
+
+subdir('src/interfaces/libpq')
+# fe_utils depends on libpq
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_static, common_static, fe_utils],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+backend_both_deps = [
+  thread_dep,
+  os_deps,
+
+  bsd_auth,
+  gssapi,
+  icu,
+  icu_i18n,
+  ldap,
+  libintl,
+  libxml,
+  lz4,
+  pam,
+  ssl,
+  systemd,
+  zlib,
+  zstd,
+]
+
+backend_deps = backend_both_deps
+
+if host_system == 'win32'
+  backend_deps += cc.find_library('secur32', required: true)
+endif
+
+backend_mod_deps = backend_both_deps
+
+backend_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: backend_deps,
+)
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+  compile_args: [],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: backend_mod_deps,
+)
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+subdir('src/interfaces/libpq/test')
+subdir('src/interfaces/ecpg/test')
+
+subdir('doc/src/sgml')
+
+
+if host_system == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+  if host_system == 'win32'
+    if prefix.split(':\\').length() == 1
+        # just a drive
+        test_prefix = ''
+    else
+        test_prefix = prefix.split(':\\')[1]
+    endif
+  else
+    test_prefix = prefix.substring(1)
+  endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+test('tmp_install',
+    meson_bin, args: meson_args + ['install', '--quiet', '--only-changed', '--no-rebuild'],
+    env: {'DESTDIR':test_install_destdir},
+    priority: 100,
+    is_parallel: false,
+    suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport=40000
+
+test_env = environment()
+
+temp_install_bindir = test_install_location / get_option('bindir')
+test_env.set('PG_REGRESS', pg_regress.full_path())
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA so it can be checked in individual tap tests.
+test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
+
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if library_path_var != ''
+  test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
+endif
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+# Check whether tap tests are enabled or not
+are_tap_tests_enabled = false
+if get_option('enable-tap-tests')
+  # Checking for perl modules for tap tests
+  perl_ipc_run_check = run_command(prove, 'config/check_modules.pl', check: false)
+  if perl_ipc_run_check.returncode() != 0
+    message(perl_ipc_run_check.stderr().strip())
+    error('Additional Perl modules are required to run TAP tests.')
+  endif
+  are_tap_tests_enabled = true
+endif
+
+foreach test: tests
+  test_default = {
+    'name': test['name'],
+    'sd': test['sd'],
+    'bd': test['bd'],
+  }
+  # Define all 'pg_regress' style tests
+  if 'regress' in test
+    t = test_default + test['regress']
+    test_command = [
+      t.get('test_runner', pg_regress).full_path(),
+      '--temp-instance', test_result_dir / t['name'] / 'pg_regress' / 'tmp_check',
+      '--inputdir', t.get('inputdir', t['sd']),
+      '--expecteddir', t.get('expecteddir', t['sd']),
+      '--outputdir', test_result_dir / t['name'] / 'pg_regress',
+      '--bindir', '',
+      '--dlpath', t['bd'],
+      '--max-concurrent-tests=20',
+      '--port=@0@'.format(testport),
+    ]
+
+    if t.has_key('regress_args')
+      test_command += t['regress_args']
+    endif
+
+    if t.has_key('schedule')
+      test_command += ['--schedule', t['schedule'],]
+    endif
+    if t.has_key('sql')
+      test_command += t['sql']
+    endif
+
+    env = test_env
+    env.prepend('PATH', temp_install_bindir, t['bd'])
+
+    test_kwargs = {
+      'suite': ['pg_regress', t['name']],
+      'priority': 10,
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+      'args': [
+        testwrap.path(),
+        '--srcdir', t['sd'],
+        '--basedir', meson.build_root(),
+        '--builddir', t['bd'],
+        '--testgroup', t['name'],
+        '--testname', 'pg_regress',
+        test_command,
+      ]
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    test(t['name'] / 'pg_regress',
+      python,
+      kwargs: test_kwargs,
+    )
+
+    testport = testport + 1
+  endif
+
+  # Define all 'isolationtester' style tests
+  if 'isolation' in test
+    t = test_default + test['isolation']
+    test_command = [
+      pg_isolation_regress.full_path(),
+      '--temp-instance', test_result_dir / t['name'] / 'isolation' / 'tmp_check',
+      '--inputdir', t['sd'],
+      '--outputdir', test_result_dir / t['name'] / 'isolation',
+      '--bindir', '',
+      '--dlpath', t['bd'],
+      '--max-concurrent-tests=20',
+      '--port=@0@'.format(testport),
+    ]
+
+    if t.has_key('regress_args')
+      test_command += t['regress_args']
+    endif
+
+    if t.has_key('schedule')
+      test_command += ['--schedule', t['schedule'],]
+    else
+      test_command += t['specs']
+    endif
+
+    env = test_env
+    env.prepend('PATH', temp_install_bindir, t['bd'])
+
+    test_kwargs = {
+      'suite': ['isolation', t['name']],
+      'priority': 20,
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+      'args': [
+        testwrap.path(),
+        '--srcdir', t['sd'],
+        '--basedir', meson.build_root(),
+        '--builddir', t['bd'],
+        '--testgroup', t['name'],
+        '--testname', 'isolation',
+        test_command,
+      ]
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    test(t['name'] / 'isolation',
+      python,
+      kwargs: test_kwargs,
+    )
+
+    testport = testport + 1
+  endif
+
+  # Define all 'tap' style tests
+  # FIXME: dependencies for each test
+  if are_tap_tests_enabled and 'tap' in test
+    t = test_default + test['tap']
+    test_command = [
+      perl.path(),
+      '-I', meson.source_root() / 'src/test/perl',
+      '-I', t['sd'],
+    ]
+
+    env = test_env
+
+    # Add temporary install, the build directory for non-installed binaries and
+    # also test/ for non-installed test binaries built separately.
+    env.prepend('PATH', temp_install_bindir, t['bd'], t['bd'] / 'test')
+
+    foreach name, value : t.get('env', {})
+      env.set(name, value)
+    endforeach
+
+    test_kwargs = {
+      'protocol': 'tap',
+      'suite': ['tap', t['name']],
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    foreach onetap : t['tests']
+      test(t['name'] / onetap,
+        python,
+        kwargs: test_kwargs,
+        args: [
+          testwrap.path(),
+          '--srcdir', t['sd'],
+          '--basedir', meson.build_root(),
+          '--builddir', t['bd'],
+          '--testgroup', t['name'],
+          '--testname', onetap,
+          test_command,
+          t['sd'] / onetap,
+        ]
+      )
+    endforeach
+  endif
+endforeach
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+  summary({
+    'data block size' : cdata.get('BLCKSZ'),
+    'WAL block size' : cdata.get('XLOG_BLCKSZ'),
+    'segment size' : cdata.get('RELSEG_SIZE')
+    }, section: 'Data layout'
+  )
+
+  summary(
+    {
+      'host system' : '@0@ @1@'.format(host_system, host_cpu),
+      'build system' : '@0@ @1@'.format(build_system, build_cpu),
+    },
+    section: 'System'
+  )
+
+  summary(
+    {
+      'linker': '@0@'.format(cc.get_linker_id()),
+      'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+    },
+    section: 'Compiler'
+  )
+
+  if llvm.found()
+    summary(
+      {
+        'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version())
+      },
+      section: 'Compiler')
+  endif
+
+  summary(
+    {
+      'bison' : '@0@ @1@'.format(bison.full_path(), bison_version),
+    },
+    section: 'Programs'
+  )
+
+  summary(
+    {
+      'bonjour': bonjour,
+      'bsd_auth': bsd_auth,
+      'gss': gssapi,
+      'icu': icu,
+      'ldap': ldap,
+      'libxml': libxml,
+      'libxslt': libxslt,
+      'llvm': llvm,
+      'lz4': lz4,
+      'nls' : libintl,
+      'pam' : pam,
+      'perl': perl_dep,
+      'python3': python3_dep,
+      'readline': readline,
+      'selinux': selinux,
+      'ssl': ssl,
+      'systemd': systemd,
+      'tcl': tcl_dep,
+      'uuid': uuid,
+      'zlib': zlib,
+      'zstd': zstd,
+    },
+    section: 'External libraries'
+  )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..3be176ca16b
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,175 @@
+# Data layout influencing options
+
+option('BLCKSZ', type : 'combo', choices : ['1', '2', '4', '8', '16', '32'], value : '8',
+  description: 'set table block size in kB')
+
+option('wal-blocksize', type : 'integer', value : 8,
+  description : '''WAL block size, in kilobytes.
+This is the unit of storage and I/O within the WAL log. The default, 8 kilobytes, is suitable for most situations; but other values may be useful in special cases. The value must be a power of 2 between 1 and 64 (kilobytes). Note that changing this value requires an initdb.'''
+  )
+
+option('segsize', type : 'integer', value : 1,
+  description : '''Segment size, in gigabytes.
+Large tables are divided into multiple operating-system files, each of size equal to the segment size. This avoids problems with file size limits that exist on many platforms. The default segment size, 1 gigabyte, is safe on all supported platforms. If your operating system has "largefile" support (which most do, nowadays), you can use a larger segment size. This can be helpful to reduce the number of file descriptors consumed when working with very large tables. But be careful not to select a value larger than is supported by your platform and the file systems you intend to use. Other tools you might wish to use, such as tar, could also set limits on the usable file size. It is recommended, though not absolutely required, that this value be a power of 2. Note that changing this value requires an initdb.'''
+  )
+
+
+# Miscellaneous options
+
+option('krb-srvnam', type : 'string', value : 'postgres',
+  description : '''The default name of the Kerberos service principal used by GSSAPI.
+postgres is the default. There's usually no reason to change this unless you are building for a Windows environment, in which case it must be set to upper case POSTGRES''')
+
+
+# Defaults
+
+option('pgport', type : 'string', value : '5432',
+  description : '''Default port number for server and clients.
+The default is 5432. The port can always be changed later on, but if you specify it here then both server and clients will have the same default compiled in, which can be very convenient. Usually the only good reason to select a non-default value is if you intend to run multiple PostgreSQL servers on the same machine.''')
+
+option('system-tzdata', type: 'string', value: '',
+  description: 'use system time zone data in specified directory')
+
+
+# Developer options
+
+option('cassert', type : 'boolean', value: false,
+  description: 'enable assertion checks (for debugging)')
+
+option('enable-tap-tests', type : 'boolean', value : true,
+  description : 'Whether to enable tap tests')
+
+option('PG_TEST_EXTRA', type : 'string', value: 'kerberos ldap ssl',
+  description: 'Enable selected extra tests')
+
+option('atomics', type : 'boolean', value: true,
+  description: 'whether to use atomic operations')
+
+option('spinlocks', type : 'boolean', value: true,
+  description: 'whether to use spinlocks')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for headers')
+
+option('extra_lib_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for libs')
+
+option('extra_version', type : 'string', value: '',
+  description: 'append STRING to the PostgreSQL version number')
+
+
+# External dependencies
+
+option('bonjour', type : 'feature', value: 'auto',
+  description: 'build with Bonjour support')
+
+option('bsd-auth', type : 'feature', value: 'auto',
+  description: 'build with BSD Authentication support')
+
+option('dtrace', type : 'feature', value: 'disabled',
+  description: 'DTrace support')
+
+option('gssapi', type : 'feature', value: 'auto',
+  description: 'GSSAPI support')
+
+option('icu', type : 'feature', value: 'auto',
+  description: 'ICU support')
+
+option('ldap', type : 'feature', value: 'auto',
+  description: 'LDAP support')
+
+option('libedit_preferred', type : 'boolean', value: false,
+  description: 'Prefer BSD Libedit over GNU Readline')
+
+option('libxml', type : 'feature', value: 'auto',
+  description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+  description: 'XSLT support in contrib/xml2')
+
+option('llvm', type : 'feature', value: 'disabled',
+  description: 'whether to use llvm')
+
+option('lz4', type : 'feature', value: 'auto',
+  description: 'LZ4 support')
+
+option('nls', type: 'feature', value: 'auto',
+  description: 'native language support')
+
+option('pam', type : 'feature', value: 'auto',
+  description: 'build with PAM support')
+
+option('plperl', type : 'feature', value: 'auto',
+  description: 'build Perl modules (PL/Perl)')
+
+option('plpython', type : 'feature', value: 'auto',
+  description: 'build Python modules (PL/Python)')
+
+option('pltcl', type : 'feature', value: 'auto',
+  description: 'build with TCL support')
+
+option('tcl_version', type : 'string', value : 'tcl',
+  description: 'specify TCL version')
+
+option('readline', type : 'feature', value : 'auto',
+  description: 'use GNU Readline or BSD Libedit for editing')
+
+option('selinux', type : 'feature', value : 'disabled',
+  description: 'build with SELinux support')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'], value : 'none',
+  description: 'use LIB for SSL/TLS support (openssl)')
+
+option('systemd', type : 'feature', value: 'auto',
+  description: 'build with systemd support')
+
+option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'], value : 'none',
+  description: 'build contrib/uuid-ossp using LIB')
+
+option('zlib', type : 'feature', value: 'auto',
+  description: 'whether to use zlib')
+
+option('zstd', type : 'feature', value: 'auto',
+  description: 'whether to use zstd')
+
+
+# Programs
+
+option('BISON', type : 'string', value: 'bison',
+  description: 'path to bison binary')
+
+option('DTRACE', type : 'string', value: 'dtrace',
+  description: 'path to dtrace binary')
+
+option('FLEX', type : 'string', value: 'flex',
+  description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+  description: 'path to gzip binary')
+
+option('LZ4', type : 'string', value: 'lz4',
+  description: 'path to lz4 binary')
+
+option('PERL', type : 'string', value: 'perl',
+  description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+  description: 'path to prove binary')
+
+option('PYTHON', type : 'array', value: ['python3', 'python'],
+  description: 'path to python binary')
+
+option('SED', type : 'string', value: 'gsed',
+  description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+  description: 'path to tar binary')
+
+option('ZSTD', type : 'string', value: 'zstd',
+  description: 'path to zstd binary')
+
+option('ZIC', type : 'string', value: 'zic',
+  description: 'path to zic binary, when cross-compiling')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..f64fdc15c2b
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,269 @@
+# libraries that other subsystems might depend uppon first, in their
+# respective dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
+
+subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to only use a single
+# buildsystem across all the supported postgres versions. Once all supported
+# PG versions support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+  'PACKAGE_URL': pg_url,
+  'PACKAGE_VERSION': pg_version,
+  'PG_MAJORVERSION': pg_version_major,
+  'PG_VERSION_NUM': pg_version_num,
+  'configure_input': 'meson',
+
+  'vpath_build': 'yes',
+  'autodepend': 'no', # XXX: Should we just set this to true when possible?
+
+  'host_cpu': host_cpu,
+  'host': '@0@-@1@'.format(host_cpu, host_system),
+  'host_os': host_system,
+  'build_os': build_system,
+  'PORTNAME': host_system,
+
+  'abs_top_builddir': meson.build_root(),
+  'abs_top_srcdir': meson.source_root(),
+
+  'enable_thread_safety': 'yes',
+  'enable_rpath': 'yes',
+  'enable_nls': libintl.found() ? 'yes' : 'no',
+  'enable_tap_tests': get_option('enable-tap-tests') ? 'yes' : 'no',
+  'enable_debug': get_option('debug') ? 'yes' : 'no',
+  'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+  'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+  'DLSUFFIX': dlsuffix,
+  'EXEEXT': exesuffix,
+
+  'SUN_STUDIO_CC': 'no',
+
+  'default_port': get_option('pgport'),
+  'with_system_tzdata': get_option('system-tzdata'),
+
+  'with_krb_srvnam': get_option('krb-srvnam'),
+  'krb_srvtab': krb_srvtab,
+
+  # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+  'STRIP': 'strip',
+  'STRIP_STATIC_LIB': 'strip -x',
+  'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+  # Just always use the install_sh fallback that autoconf uses. Unlikely to
+  # matter performance-wise for extensions. If it turns out to do, we can
+  # improve that later.
+  'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+  'CC': var_cc,
+  'CPP': var_cpp,
+  'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld'] ? 'yes' : 'no'),
+
+  'CFLAGS': var_cflags,
+  'CPPFLAGS': var_cppflags,
+  'CXXFLAGS': var_cxxflags,
+  'CFLAGS_SL': var_cflags_sl,
+  'CFLAGS_SL_MOD': cdata.has('HAVE_VISIBILITY_ATTRIBUTE') ? '-fvisibility=hidden' : '',
+  'CFLAGS_SSE42': ' '.join(cflags_crc),
+  'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+  'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+  # FIXME:
+  'CFLAGS_ARMV8_CRC32C': '',
+  'BITCODE_CFLAGS': '',
+  'BITCODE_CXXFLAGS': '',
+
+  'LDFLAGS': var_ldflags,
+  'LDFLAGS_EX': var_ldflags_ex,
+  'LDFLAGS_SL': var_ldflags_sl,
+
+  'BISONFLAGS': ' '.join(bison_flags),
+  'FLEXFLAGS': ' '.join(flex_flags),
+
+  'LIBS': var_libs,
+}
+
+if llvm.found()
+  pgxs_kv += {
+    'CLANG': clang.path(),
+    'CXX': ' '.join(cpp.cmd_array()),
+    'LLVM_BINPATH': llvm_binpath,
+  }
+else
+  pgxs_kv += {
+    'CLANG': '',
+    'CXX': '',
+    'LLVM_BINPATH': '',
+  }
+endif
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+  'BISON': bison,
+  'FLEX': flex,
+  'GZIP': gzip,
+  'LZ4': program_lz4,
+  'PERL': perl,
+  'PROVE': prove,
+  'PYTHON': python,
+  'TAR': tar,
+  'ZSTD': program_zstd,
+  'DTRACE': dtrace,
+  'LD': ld_program,
+  'install_bin': install_sh,
+}
+foreach b, p : pgxs_bins
+  pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+pgxs_cdata.set('have_win32_dbghelp', 'no') # FIXME
+
+pgxs_empty = [
+  'PERMIT_DECLARATION_AFTER_STATEMENT',
+  'PG_SYSROOT', #?
+  'ICU_CFLAGS', # needs to be added, included by public server headers
+
+  # probably need most of these?
+  'RANLIB',
+  'WINDRES',
+  'DLLTOOL',
+  'DLLWRAP',
+  'LN_S',
+  'AR',
+  'AWK',
+
+  # hard to see why we'd need either?
+  'ZIC',
+  'TCLSH',
+
+  # docs don't seem to be supported by pgxs
+  'XMLLINT',
+  'XSLTPROC',
+  'DBTOEPUB',
+  'FOP',
+
+  # supporting coverage for pgxs-in-meson build doesn't seem worth it
+  'GENHTML',
+  'LCOV',
+  'GCOV',
+  'MSGFMT_FLAGS',
+
+  # translation doesn't appear to be supported by pgxs
+  'MSGFMT',
+  'XGETTEXT',
+  'MSGMERGE',
+  'WANTED_LANGUAGES',
+
+  # Not needed because we don't build the server / PLs with the generated makefile
+  'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+  'DTRACEFLAGS', # only server has dtrace probes
+
+  'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+  'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+  # possible that some of these are referenced explicitly in pgxs makefiles?
+  # For now not worth it.
+  'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD', 'TCL_SHLIB_LD_LIBS',
+
+  'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+  'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+  'UUID_LIBS',
+
+  'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+  'ICU_LIBS',
+]
+
+foreach pe : pgxs_empty
+  pgxs_cdata.set(pe, '')
+endforeach
+
+pgxs_dirs = {
+  'prefix': get_option('prefix'),
+
+  'bindir': '${exec_prefix}' / get_option('bindir'),
+  'datarootdir': '${prefix}' / get_option('datadir'),
+  'datadir': '${datarootdir}',
+  'docdir': '${prefix}' / dir_doc,
+  'exec_prefix': '${prefix}',
+  'htmldir': '${prefix}' / dir_doc_html, #?
+  'includedir': '${prefix}' / get_option('includedir'),
+  'libdir': '${exec_prefix}' / get_option('libdir'),
+  'localedir': '${prefix}' / get_option('localedir'),
+  'mandir': '${prefix}' / get_option('mandir'),
+  'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+foreach d, p : pgxs_dirs
+  pgxs_cdata.set(d, p)
+endforeach
+
+pgxs_deps = {
+  'bonjour': bonjour,
+  'bsd_auth': bsd_auth,
+  'gssapi': gssapi,
+  'icu': icu,
+  'ldap': ldap,
+  'libxml': libxml,
+  'libxslt': libxslt,
+  'llvm': llvm,
+  'lz4': lz4,
+  'nls' : libintl,
+  'pam' : pam,
+  'perl': perl_dep,
+  'python': python3_dep,
+  'readline': readline,
+  'selinux': selinux,
+  'systemd': systemd,
+  'tcl': tcl_dep,
+  'zlib': zlib,
+  'zstd': zstd,
+}
+foreach d, v : pgxs_deps
+  pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+pgxs_cdata.set('with_ssl', get_option('ssl'))
+pgxs_cdata.set('with_uuid', uuidopt)
+
+pg_config_ext = configure_file(input: 'Makefile.global.in',
+  output : 'Makefile.global',
+  configuration : pgxs_cdata,
+  install: true,
+  install_dir: dir_pgxs / 'src')
+
+configure_file(
+  input: 'makefiles' / 'Makefile.@0@'.format(host_system),
+  output: 'Makefile.port',
+  copy: true,
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'Makefile.shlib', 'nls-global.mk',
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'makefiles/pgxs.mk',
+  install_dir: dir_pgxs / 'src' / 'makefiles')
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..799fc5ea7a8
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,53 @@
+# files to build into backend
+timezone_sources = files(
+  'localtime.c',
+  'pgtz.c',
+  'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+   'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+  'data/tzdata.zi'
+)
+
+
+if get_option('system-tzdata') == ''
+  # FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+  # build our zic. But for that we'd need to run a good chunk of the configure
+  # tests both natively and cross. Unclear if it's worth it.
+  if meson.is_cross_build()
+    zic = find_program(get_option('ZIC'), native: true, required: true)
+  else
+    zic = executable('zic', zic_sources,
+                     dependencies: [frontend_code],
+                     kwargs: default_bin_args + {'install': false}
+                    )
+  endif
+
+  tzdata = custom_target('tzdata',
+    input: tzdata,
+    output: ['timezone'],
+    command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+    install: true,
+    install_dir: dir_data,
+  )
+
+# FIXME: this used to be sorted - but also isn't actually used
+abbrevs_txt = custom_target('abbrevs.txt',
+  input: tzdata,
+  output: ['abbrevs.txt'],
+  command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+  capture: true)
+endif
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..7e0a682bd9e
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,21 @@
+tznames = files(
+  'Africa.txt',
+  'America.txt',
+  'Antarctica.txt',
+  'Asia.txt',
+  'Atlantic.txt',
+  'Australia.txt',
+  'Etc.txt',
+  'Europe.txt',
+  'Indian.txt',
+  'Pacific.txt',
+)
+
+tznames_sets = files(
+  'Default',
+  'Australia',
+  'India')
+
+install_data(tznames, tznames_sets,
+  install_dir: dir_data / 'timezonesets',
+)
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..9ee5aca19a4
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+
+import os
+import shlex
+import sys
+
+mesonintrospect = os.environ['MESONINTROSPECT']
+components = shlex.split(mesonintrospect)
+
+if len(components) < 2:
+    print('expected more than two components, got: %s' % components)
+    sys.exit(1)
+
+if components[-1] != 'introspect':
+    print('expected introspection at the end')
+    sys.exit(1)
+
+print('\n'.join(components[:-1]), end='')
+
+sys.exit(0)
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..7d3f49da427
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+#index = os.path.realpath(args.index)
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+  shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = [args.name + input.replace(args.privdir, '') for input in args.INPUT]
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink', '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
diff --git a/src/tools/msvc/export2def.pl b/src/tools/msvc/export2def.pl
new file mode 100644
index 00000000000..fb88e8b8ab9
--- /dev/null
+++ b/src/tools/msvc/export2def.pl
@@ -0,0 +1,22 @@
+# Copyright (c) 2021, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use 5.8.0;
+use List::Util qw(max);
+
+my ($deffile, $txtfile, $libname) = @ARGV;
+
+print STDERR "Generating $deffile...\n";
+open(my $if, '<', $txtfile) || die("Could not open $txtfile\n");
+open(my $of, '>', $deffile) || die("Could not open $deffile for writing\n");
+print $of "LIBRARY $libname\nEXPORTS\n";
+while (<$if>)
+{
+	next if (/^#/);
+	next if (/^\s*$/);
+	my ($f, $o) = split;
+	print $of " $f @ $o\n";
+}
+close($of);
+close($if);
diff --git a/src/tools/msvc/gendef2.pl b/src/tools/msvc/gendef2.pl
new file mode 100644
index 00000000000..3b905d6f5da
--- /dev/null
+++ b/src/tools/msvc/gendef2.pl
@@ -0,0 +1,177 @@
+
+# Copyright (c) 2021, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use 5.8.0;
+use List::Util qw(max);
+
+my @def;
+
+#
+# Script that generates a .DEF file for all objects in a directory
+#
+# src/tools/msvc/gendef.pl
+#
+
+# Given a symbol file path, loops over its contents
+# and returns a list of symbols of interest as a dictionary
+# of 'symbolname' -> symtype, where symtype is:
+#
+#     0    a CODE symbol, left undecorated in the .DEF
+#     1    A DATA symbol, i.e. global var export
+#
+sub extract_syms
+{
+	my ($symfile, $def) = @_;
+	open(my $f, '<', $symfile) || die "Could not open $symfile: $!\n";
+	while (<$f>)
+	{
+
+		# Expected symbol lines look like:
+		#
+		# 0   1        2      3            4            5 6
+		# IDX SYMBOL   SECT   SYMTYPE      SYMSTATIC      SYMNAME
+		# ------------------------------------------------------------------------
+		# 02E 00000130 SECTA  notype       External     | _standbyState
+		# 02F 00000009 SECT9  notype       Static       | _LocalRecoveryInProgress
+		# 064 00000020 SECTC  notype ()    Static       | _XLogCheckBuffer
+		# 065 00000000 UNDEF  notype ()    External     | _BufferGetTag
+		#
+		# See http://msdn.microsoft.com/en-us/library/b842y285.aspx
+		#
+		# We're not interested in the symbol index or offset.
+		#
+		# SECT[ION] is only examined to see whether the symbol is defined in a
+		# COFF section of the local object file; if UNDEF, it's a symbol to be
+		# resolved at link time from another object so we can't export it.
+		#
+		# SYMTYPE is always notype for C symbols as there's no typeinfo and no
+		# way to get the symbol type from name (de)mangling. However, we care
+		# if "notype" is suffixed by "()" or not. The presence of () means the
+		# symbol is a function, the absence means it isn't.
+		#
+		# SYMSTATIC indicates whether it's a compilation-unit local "static"
+		# symbol ("Static"), or whether it's available for use from other
+		# compilation units ("External"). We export all symbols that aren't
+		# static as part of the whole program DLL interface to produce UNIX-like
+		# default linkage.
+		#
+		# SYMNAME is, obviously, the symbol name. The leading underscore
+		# indicates that the _cdecl calling convention is used. See
+		# http://www.unixwiz.net/techtips/win32-callconv.html
+		# http://www.codeproject.com/Articles/1388/Calling-Conventions-Demystified
+		#
+		s/notype \(\)/func/g;
+		s/notype/data/g;
+
+		my @pieces = split;
+
+		# Skip file and section headers and other non-symbol entries
+		next unless defined($pieces[0]) and $pieces[0] =~ /^[A-F0-9]{3,}$/;
+
+		# Skip blank symbol names
+		next unless $pieces[6];
+
+		# Skip externs used from another compilation unit
+		next if ($pieces[2] eq "UNDEF");
+
+		# Skip static symbols
+		next unless ($pieces[4] eq "External");
+
+		# Skip some more MSVC-generated crud
+		next if $pieces[6] =~ /^@/;
+		next if $pieces[6] =~ /^\(/;
+
+		# __real and __xmm are out-of-line floating point literals and
+		# (for __xmm) their SIMD equivalents. They shouldn't be part
+		# of the DLL interface.
+		next if $pieces[6] =~ /^__real/;
+		next if $pieces[6] =~ /^__xmm/;
+
+		# __imp entries are imports from other DLLs, eg __imp__malloc .
+		# (We should never have one of these that hasn't already been skipped
+		# by the UNDEF test above, though).
+		next if $pieces[6] =~ /^__imp/;
+
+		# More under-documented internal crud
+		next if $pieces[6] =~ /NULL_THUNK_DATA$/;
+		next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
+		next if $pieces[6] =~ /^__NULL_IMPORT/;
+
+		# Skip string literals
+		next if $pieces[6] =~ /^\?\?_C/;
+
+		# We assume that if a symbol is defined as data, then as a function,
+		# the linker will reject the binary anyway. So it's OK to just pick
+		# whatever came last.
+		$def->{ $pieces[6] } = $pieces[3];
+	}
+	close($f);
+	return;
+}
+
+sub writedef
+{
+	my ($deffile, $platform, $def) = @_;
+	open(my $fh, '>', $deffile) || die "Could not write to $deffile\n";
+	print $fh "EXPORTS\n";
+	foreach my $f (sort keys %{$def})
+	{
+		my $isdata = $def->{$f} eq 'data';
+
+		# Strip the leading underscore for win32, but not x64
+		$f =~ s/^_//
+		  unless ($platform eq "x64");
+
+		# Emit just the name if it's a function symbol, or emit the name
+		# decorated with the DATA option for variables.
+		if ($isdata)
+		{
+			print $fh "  $f DATA\n";
+		}
+		else
+		{
+			print $fh "  $f\n";
+		}
+	}
+	close($fh);
+	return;
+}
+
+
+sub usage
+{
+	die(    "Usage: gendef.pl platform outputfile tempdir sourcelib\n"
+		  . "    modulepath: path to dir with obj files, no trailing slash"
+		  . "    platform: Win32 | x64");
+}
+
+usage()
+  unless scalar(@ARGV) >= 4;
+
+my $platform  = $ARGV[0];
+shift;
+my $deffile  = $ARGV[0];
+shift;
+my $tempdir  = $ARGV[0];
+shift;
+
+print STDERR "Generating $deffile in tmp dir $tempdir from ".join(' ', @ARGV)."\n";
+
+my %def = ();
+
+my $symfile = "$tempdir/all.sym";
+my $tmpfile = "$tempdir/tmp.sym";
+mkdir($tempdir);
+print STDERR "dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV)."\n";
+system("dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV))
+  && die "Could not call dumpbin";
+rename($tmpfile, $symfile);
+print "generated symfile to $symfile (via $tmpfile)\n";
+extract_syms($symfile, \%def);
+print "\n";
+
+writedef($deffile, $platform, \%def);
+
+print "Generated " . scalar(keys(%def)) . " symbols\n";
diff --git a/src/tools/pgflex b/src/tools/pgflex
new file mode 100755
index 00000000000..13d73d50cb4
--- /dev/null
+++ b/src/tools/pgflex
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--flex', dest='flex_command', help='flex executable to run', type=str)
+parser.add_argument('--perl', dest='perl_command', help='perl executable to run', type=str)
+parser.add_argument('--builddir', dest='builddir', help='build directory of meson build', type=str)
+parser.add_argument('--privatedir', dest='privatedir', help='temporary directory to avoid conflicts', type=str)
+parser.add_argument('--fix_warning_script', dest='fix_warning_script', help='script for fixing warnings', default='')
+parser.add_argument('-b', dest='no_backup', action='store_true', help='whether no_backup is enabled or not')
+parser.add_argument('-o', dest='output_file', help='output file')
+parser.add_argument('--stamp_header', dest='stamp_header', help='', default=None)
+
+args, rest = parser.parse_known_args()
+rest, input_file = rest[:-1], rest[-1]
+
+# since 'lex.backup' is always named that,
+# change working directory to temporary directory
+# to avoid conflicts
+os.chdir(os.path.dirname(args.privatedir))
+
+# make paths absolute if it is not absolute,
+# msbuild uses absolute paths as default
+args.output_file = args.output_file if os.path.isabs(args.output_file) else os.path.join(args.builddir, args.output_file)
+input_file = input_file if os.path.isabs(input_file) else os.path.join(args.builddir, input_file)
+
+# set flex flags
+if args.no_backup:
+  flex_flags = ['-o', args.output_file, '-b'] + rest + [input_file]
+else:
+  flex_flags = ['-o', args.output_file] + rest + [input_file]
+
+# create .c file from .l file
+command = [args.flex_command] + flex_flags
+subprocess.run(command, check=True)
+
+ # check lex.backup
+if args.no_backup:
+  with open('lex.backup') as lex:
+    if sum(1 for _ in lex) != 1:
+      sys.exit('Scanner requires backup; see lex.backup.')
+  os.remove('lex.backup')
+
+# fix warnings
+if args.fix_warning_script:
+  # make paths absolute if it is not absolute
+  args.fix_warning_script = args.fix_warning_script if os.path.isabs(args.fix_warning_script) else os.path.join(args.builddir, args.fix_warning_script)
+
+  command = [args.perl_command, args.fix_warning_script, args.output_file]
+  subprocess.run(command, check=True)
+
+#
+stamp_header = args.stamp_header
+if stamp_header != None:
+    if not os.path.isabs(stamp_header):
+        stamp_header = os.path.join(args.builddir, stamp_header)
+    with open(stamp_header, mode='w') as fh:
+        pass
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..ab35e952959
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('INPUT', type=argparse.FileType('r'))
+parser.add_argument('-o', '--output', type=argparse.FileType('w'), required=True)
+parser.add_argument('--depfile', type=argparse.FileType('w'), required=False)
+
+parser.add_argument('--FILEDESC', type=str, required=True)
+parser.add_argument('--NAME', type=str, required=True)
+parser.add_argument('--VFT_TYPE', type=str, required=True)
+parser.add_argument('--FILEENDING', type=str, required=True)
+parser.add_argument('--ICO', type=str)
+
+
+args = parser.parse_args()
+
+data = args.INPUT.read()
+
+data = data.replace('@FILEDESC@', args.FILEDESC)
+data = data.replace('@NAME@', args.NAME)
+data = data.replace('@VFT_TYPE@', args.VFT_TYPE)
+data = data.replace('@FILEENDING@', args.FILEENDING)
+
+if args.ICO:
+   data = data.replace('@ICO@', args.ICO)
+   if args.depfile:
+       args.depfile.write("{0} : {1}\n".format(args.INPUT.name, args.ICO))
+else:
+   data = data.replace("IDI_ICON ICON \"@ICO@\"\n", '')
+
+args.output.write(data)
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..db6431639f1
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import shlex
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    targets = json.load(open(os.path.join(build_root, 'meson-info', 'intro-targets.json')))
+    installed = json.load(open(os.path.join(build_root, 'meson-info', 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            #print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            subprocess.check_call(install_name_tool + ['-change', lib, newref, patchpath])
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}', file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..c93fea42c97
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+
+import argparse
+import shutil
+import subprocess
+import os
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--srcdir', help='source directory of test', type=str)
+parser.add_argument('--basedir', help='base directory of test', type=str)
+parser.add_argument('--builddir', help='build directory of meson build', type=str)
+parser.add_argument('--testgroup', help='test group', type=str)
+parser.add_argument('--testname', help='test name', type=str)
+
+args, test_command = parser.parse_known_args()
+
+args.testname = args.testname.rstrip('.pl')
+
+testdir = '{}/testrun/{}/{}'.format(args.basedir, args.testgroup, args.testname)
+
+print('# executing test in {} group {} test {}, builddir {}'
+  .format(testdir, args.testgroup, args.testname, args.builddir))
+
+if os.path.exists(testdir) and os.path.isdir(testdir):
+  shutil.rmtree(testdir)
+os.makedirs(testdir)
+
+os.chdir(args.srcdir)
+
+env_dict = {**os.environ, 'TESTOUTDIR': testdir, 'TESTDIR': args.builddir}
+subprocess.run(test_command, env=env_dict, check=True)
-- 
2.37.0.3.g30cc8d0f14

v10-0016-meson-ci-Build-both-with-meson-and-as-before.patchtext/x-diff; charset=us-asciiDownload
From 32031474861f410130522fd6ae647cbdc8b352ff Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Apr 2022 12:08:09 -0700
Subject: [PATCH v10 16/16] meson: ci: Build both with meson and as before

Author: Andres Freund <andres@anarazel.de>
Author: nbyavuz <byavuz81@gmail.com>
Author: Justin Pryzby
---
 .cirrus.yml                                   | 545 +++++++++++++++++-
 src/tools/ci/docker/linux_centos7             |  57 ++
 src/tools/ci/docker/linux_centos8             |  54 ++
 src/tools/ci/docker/linux_fedora_rawhide      |  49 ++
 src/tools/ci/docker/linux_opensuse_tumbleweed |  56 ++
 5 files changed, 738 insertions(+), 23 deletions(-)
 create mode 100644 src/tools/ci/docker/linux_centos7
 create mode 100644 src/tools/ci/docker/linux_centos8
 create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
 create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed

diff --git a/.cirrus.yml b/.cirrus.yml
index f23d6cae552..bf20f85f8ce 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -35,10 +35,12 @@ on_failure: &on_failure
       - "**/*.diffs"
       - "**/regress_log_*"
     type: text/plain
+  meson_test_artifacts:
+    path: "build/meson-logs/testlog.junit.xml"
+    type: text/xml
+    format: junit
 
-task:
-  name: FreeBSD - 13
-
+freebsd_template: &freebsd_template
   env:
     # FreeBSD on GCP is slow when running with larger number of CPUS /
     # jobs. Using one more job than cpus seems to work best.
@@ -80,6 +82,13 @@ task:
   setup_additional_packages_script: |
     #pkg install -y ...
 
+
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Autoconf
+  trigger_type: manual
+
   # NB: Intentionally build without --with-llvm. The freebsd image size is
   # already large enough to make VM startup slow, and even without llvm
   # freebsd already takes longer than other platforms except for windows.
@@ -125,6 +134,30 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
 
 
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=bsd -Dtcl_version=tcl86 -Ddtrace=auto build'
+
+  build_script: su postgres -c 'ninja -C build'
+  upload_caches: ccache
+
+  test_world_script:
+    - su postgres -c 'meson test --no-rebuild -C build'
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+  on_failure:
+    <<: *on_failure
+    cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
+
+
 # configure feature flags, shared between the task running the linux tests and
 # the CompilerWarnings task
 LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -141,14 +174,28 @@ LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
   --with-selinux
   --with-ssl=openssl
   --with-systemd
-  --with-tcl --with-tclconfig=/usr/lib/tcl8.6/
-  --with-uuid=ossp
+  --with-tcl --with-tclconfig=${TCL_DIR:/usr/lib/tcl8.6/}
+  --with-uuid=${UUID:ossp}
   --with-zstd
 
 
-task:
-  name: Linux - Debian Bullseye
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+  sysinfo_script: |
+    id
+    uname -a
+    cat /proc/cmdline
+    ulimit -a -H && ulimit -a -S
+    export
+  create_user_script: |
+    useradd -m -U postgres
+    chown -R postgres:postgres .
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+    su postgres -c "ulimit -l -H && ulimit -l -S"
 
+
+linux_debian_template: &linux_debian_template
   env:
     CPUS: 4
     BUILD_JOBS: 4
@@ -171,19 +218,9 @@ task:
   ccache_cache:
     folder: ${CCACHE_DIR}
 
-  sysinfo_script: |
-    id
-    uname -a
-    cat /proc/cmdline
-    ulimit -a -H && ulimit -a -S
-    export
-  create_user_script: |
-    useradd -m postgres
-    chown -R postgres:postgres .
-    mkdir -p ${CCACHE_DIR}
-    chown -R postgres:postgres ${CCACHE_DIR}
+  set_limits_script: |
     echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
-    su postgres -c "ulimit -l -H && ulimit -l -S"
+  <<: *linux_preparation_scripts_template
   setup_core_files_script: |
     mkdir -m 770 /tmp/cores
     chown root:postgres /tmp/cores
@@ -192,6 +229,12 @@ task:
     #apt-get update
     #DEBIAN_FRONTEND=noninteractive apt-get -y install ...
 
+
+task:
+  <<: *linux_debian_template
+
+  name: Linux - Debian Bullseye - Autoconf
+
   configure_script: |
     su postgres <<-EOF
       ./configure \
@@ -220,9 +263,351 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
 
 
-task:
-  name: macOS - Monterey
+task: &linux_debian_bullseye_meson
+  <<: *linux_debian_template
 
+  name: Linux - Debian Bullseye - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Ddtrace=enabled build'
+
+  build_script: su postgres -c 'ninja -C build'
+  upload_caches: ccache
+
+  tests_world_script:
+    - su postgres -c 'meson test --no-rebuild -C build'
+
+  on_failure:
+    <<: *on_failure
+    cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+
+task:
+  <<: *linux_debian_bullseye_meson
+
+  name: Linux - Debian Sid - Meson
+
+  compute_engine_instance:
+    image: family/pg-ci-sid
+
+
+linux_opensuse_template: &linux_opensuse_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: "https://debuginfod.opensuse.org/"
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: src/tools/ci/docker/linux_opensuse_tumbleweed
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" && \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang" \
+      CFLAGS="-O0 -ggdb"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited; \
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Dllvm=enabled build'
+
+  build_script: su postgres -c 'ninja -C build'
+  upload_caches: ccache
+
+  tests_world_script:
+    - su postgres -c 'meson test --no-rebuild -C build --num-processes ${TEST_JOBS}'
+
+  on_failure:
+    <<: *on_failure
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+
+linux_rhel_template: &linux_rhel_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: ${DEBUGINFO}
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: ${DOCKERFILE_PATH}
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang" \
+      CFLAGS="-O0 -ggdb"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited; \
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build'
+  upload_caches: ccache
+
+  tests_world_script:
+    - su postgres -c 'meson test --no-rebuild -C build --num-processes ${TEST_JOBS}'
+
+  on_failure:
+    <<: *on_failure
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang" \
+      CFLAGS="-O0 -ggdb"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited; \
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build'
+  upload_caches: ccache
+
+  tests_world_script:
+    - su postgres -c 'meson test --no-rebuild -C build --num-processes ${TEST_JOBS}'
+
+  on_failure:
+    <<: *on_failure
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      PYTHON=python3 \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-gssapi \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-selinux \
+      --with-ssl=openssl \
+      --with-systemd \
+      --with-tcl --with-tclconfig=/usr/lib64/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang" \
+      CFLAGS="-O0 -ggdb"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited; \
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build'
+  upload_caches: ccache
+
+  tests_world_script:
+    - su postgres -c 'meson test --no-rebuild -C build --num-processes ${TEST_JOBS}'
+
+  on_failure:
+    <<: *on_failure
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+
+macos_template: &macos_template
   env:
     CPUS: 12 # always get that much for cirrusci macOS instances
     BUILD_JOBS: $CPUS
@@ -269,6 +654,7 @@ task:
       llvm \
       lz4 \
       make \
+      meson \
       openldap \
       openssl \
       python \
@@ -280,6 +666,14 @@ task:
 
   ccache_cache:
     folder: $CCACHE_DIR
+
+
+task:
+  <<: *macos_template
+
+  name: macOS - Monterey - Autoconf
+  trigger_type: manual
+
   configure_script: |
     brewpath="/usr/local"
     INCLUDES="${brewpath}/include:${INCLUDES}"
@@ -339,8 +733,42 @@ task:
 
 
 task:
-  name: Windows - Server 2019, VS 2019
+  <<: *macos_template
 
+  name: macOS - Monterey - Meson
+
+  configure_script: |
+    brewpath="/usr/local"
+    PKG_CONFIG_PATH="${brewpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+
+    for pkg in icu4c krb5 openldap openssl ; do
+      pkgpath="${brewpath}/opt/${pkg}"
+      PKG_CONFIG_PATH="${pkgpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+    done
+
+    export PKG_CONFIG_PATH
+
+    meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs  -Ddtrace=auto build
+
+  build_script: ninja -C build
+  upload_caches: ccache
+
+  tests_world_script:
+    - ulimit -c unlimited
+    - ulimit -n 1024
+    - meson test --no-rebuild -C build
+
+  on_failure:
+    <<: *on_failure
+    cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+
+windows_template: &windows_template
   env:
     # Half the allowed per-user CPU cores
     CPUS: 4
@@ -402,6 +830,11 @@ task:
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
 
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Homegrown
+
   configure_script:
     # copy errors out when using forward slashes
     - copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl
@@ -454,15 +887,81 @@ task:
     <<: *on_failure
     crashlog_artifacts:
       path: "crashlog-*.txt"
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+  meson_install_script:
+    - pip install meson ninja
+
+  configure_script:
+    - vcvarsall x64
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - ninja -C build
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test --no-rebuild -C build
+
+  on_failure:
+    <<: *on_failure
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
       type: text/plain
 
 
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+  meson_install_script:
+    - pip install meson
+
+  configure_script:
+    - vcvarsall x64
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+    - meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - msbuild /p:UseMultiToolTask=true %MSBFLAGS% build\postgresql.sln
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test --no-rebuild -C build
+
+  always:
+    meson_log_artifacts:
+      path: "build/meson-logs/*.txt"
+      type: text/plain
+
+  on_failure:
+    <<: *on_failure
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+
 task:
   name: CompilerWarnings
 
   # To limit unnecessary work only run this once the normal linux test succeeds
   depends_on:
-    - Linux - Debian Bullseye
+    - Linux - Debian Bullseye - Meson
+  trigger_type: manual
 
   env:
     CPUS: 4
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+  yum -y install dnf-plugins-core \
+  epel-release \
+  centos-release-scl-rh && \
+  \
+  yum -y update && \
+  yum -y install \
+  \
+  git \
+  perl \
+  perl-ExtUtils-Embed \
+  perl-IPC-Run \
+  perl-Test-Harness \
+  perl-Test-Simple \
+  \
+  bison \
+  ccache \
+  clang \
+  devtoolset-7-make \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  && \
+  pip3 install meson && \
+  pip3 install ninja && \
+  yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+  dnf -y install dnf-plugins-core && \
+  dnf config-manager --set-enabled powertools && \
+  dnf -y install epel-release && \
+  dnf -y update && \
+  dnf -y install \
+  \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  diffutils \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  glibc-langpack-en \
+  \
+  && \
+  pip3 install ninja && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+  dnf -y update && \
+  dnf -y install \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gettext \
+  ninja-build \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  langpacks-en \
+  glibc-langpack-en \
+  \
+  && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+  zypper -n clean -a && \
+  zypper -n ref && \
+  zypper -n dup && \
+  zypper -n update && \
+  zypper -n install \
+  diffutils \
+  git \
+  icu \
+  make \
+  meson \
+  perl-IPC-Run \
+  shadow \
+  systemd-devel \
+  util-linux \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gcc-c++ \
+  gettext-runtime \
+  ninja \
+  \
+  krb5-devel \
+  libicu-devel \
+  libldapcpp-devel \
+  liblz4-devel \
+  libopenssl-devel \
+  libselinux-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  pam-devel \
+  python38-devel \
+  readline-devel \
+  tcl-devel \
+  \
+  openldap2 \
+  openldap2-client \
+  \
+  krb5-client \
+  krb5-plugin-kdb-ldap \
+  krb5-server \
+  lz4 \
+  zstd \
+  \
+  && \
+  zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
-- 
2.37.0.3.g30cc8d0f14

#211Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#204)
Re: [RFC] building postgres with meson -v9

Hi,

On 2022-07-13 08:39:45 +0200, Peter Eisentraut wrote:

On 06.07.22 15:21, Andres Freund wrote:

- This patch is for unifying the list of languages in NLS, as
previously discussed:https://commitfest.postgresql.org/38/3737/

There seems little downside to doing so, so ...

This has been committed, so on the next rebase, the languages arguments can
be removed from the i18n.gettext() calls.

That's done in v10 I posted yesterday.

On 2022-07-06 11:03:31 +0200, Peter Eisentraut wrote:

3bf5b317d5 meson: prereq: Specify output directory for psql sql help script.
2e5ed807f8 meson: prereq: ecpg: add and use output directory argument for
parse.pl.
4e7fab01c5 meson: prereq: msvc: explicit output file for pgflex.pl
cdcd3da4c4 meson: prereq: add output path arg in generate-lwlocknames.pl
1f655486e4 meson: prereq: generate-errcodes.pl: accept output file
e834c48758 meson: prereq: unicode: allow to specify output directory.

You said you are still finalizing these. I think we can move ahead with
these once that is done.

I tried to address the pending things in these patches.

9f4a9b1749 meson: prereq: move snowball_create.sql creation into perl file.

This looks ready, except I think it needs to be hooked into the
distprep target, since it's now a Perl script running at build time.

Done. I vacillated between doing the distprep rule in
src/backend/snowball/Makefile (as most things outside of the backend do) and
src/backend/Makefile (most backend things). Ended up with doing it in
snowball/Makefile.

Greetings,

Andres Freund

#212Aleksander Alekseev
aleksander@timescale.com
In reply to: Andres Freund (#210)
Re: [RFC] building postgres with meson - v10

Hi Andres,

Attached is v10 of the meson patchset. Lots of small changes, I don't think
anything major. I tried to address most of Peter's feedback for the earlier
patches.

After this I plan to clean up the "export" patch, since that's I think the
next bigger step, and an improvement on its own. The step after will be to
discuss where we want the output of tests to reside, whether the naming scheme
for tests is good etc.

I did try to address Peter's criticism around inconsistency of the added
parameters to perl scripts. I hope it's more consistent now. I used the
opportunity to make src/tools/msvc use the "output directory" parameters,
providing coverage for those paths (and removing a few unnecessary chdirs, but
...).

Thanks for continuing to work on this!

Just a quick question - is there a reason for changing the subject of
the emails?

Not all email clients handle this well, e.g. Google Mail considers
this being 10 separate threads. The CF application and/or
pgsql-hackers@ archive also don't recognise this as a continuation of
the original thread. So all the discussions in -v8, -v9, -v9 ets
threads get lost.

May I suggest using a single thread?

--
Best regards,
Aleksander Alekseev

#213Aleksander Alekseev
aleksander@timescale.com
In reply to: Aleksander Alekseev (#212)
Re: [RFC] building postgres with meson - v10

Hi again,

Just a quick question - is there a reason for changing the subject of
the emails?

Not all email clients handle this well, e.g. Google Mail considers
this being 10 separate threads. The CF application and/or
pgsql-hackers@ archive also don't recognise this as a continuation of
the original thread. So all the discussions in -v8, -v9, -v9 ets
threads get lost.

May I suggest using a single thread?

OK, the part about the archive is wrong - I scrolled right to the end
of the thread, didn't notice v10 patch above and assumed it was lost.
Sorry for the confusion. However, the part about various email clients
is accurate.

--
Best regards,
Aleksander Alekseev

#214Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#210)
Re: [RFC] building postgres with meson - v10

On 15.07.22 07:08, Andres Freund wrote:

Attached is v10 of the meson patchset. Lots of small changes, I don't think
anything major. I tried to address most of Peter's feedback for the earlier
patches.

The following patches are ok to commit IMO:

a1c5542929 prereq: Deal with paths containing \ and spaces in basebackup_to_shell tests
e37951875d meson: prereq: psql: Output dir and dependency generation for sql_help
18cc9fbd02 meson: prereq: ecpg: Add and use output directory argument for preproc/*.pl
58a32694e9 meson: prereq: Move snowball_create.sql creation into perl file
59b8bffdaf meson: prereq: Add output path arg in generate-lwlocknames.pl
2db97b00d5 meson: prereq: generate-errcodes.pl: Accept output file
fb8f52f21d meson: prereq: unicode: Allow to specify output directory
8f1e4410d6 meson: prereq: Refactor dtrace postprocessing make rules
3d18a20b11 meson: prereq: Add --outdir option to gen_node_support.pl

#215Andres Freund
andres@anarazel.de
In reply to: Aleksander Alekseev (#213)
Re: [RFC] building postgres with meson - v10

Hi,

On 2022-07-18 11:12:10 +0300, Aleksander Alekseev wrote:

Just a quick question - is there a reason for changing the subject of
the emails?

Not all email clients handle this well, e.g. Google Mail considers
this being 10 separate threads. The CF application and/or
pgsql-hackers@ archive also don't recognise this as a continuation of
the original thread. So all the discussions in -v8, -v9, -v9 ets
threads get lost.

May I suggest using a single thread?

OK, the part about the archive is wrong - I scrolled right to the end
of the thread, didn't notice v10 patch above and assumed it was lost.
Sorry for the confusion. However, the part about various email clients
is accurate.

For me the thread is too long to look through without some separation. I
wouldn't do the version in the subject for a small patchset / thread, but at
this size I think it's reasonable.

Greetings,

Andres Freund

#216Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#214)
Re: [RFC] building postgres with meson - v10

Hi,

On 2022-07-18 11:33:09 +0200, Peter Eisentraut wrote:

The following patches are ok to commit IMO:

a1c5542929 prereq: Deal with paths containing \ and spaces in basebackup_to_shell tests
e37951875d meson: prereq: psql: Output dir and dependency generation for sql_help
18cc9fbd02 meson: prereq: ecpg: Add and use output directory argument for preproc/*.pl
58a32694e9 meson: prereq: Move snowball_create.sql creation into perl file
59b8bffdaf meson: prereq: Add output path arg in generate-lwlocknames.pl
2db97b00d5 meson: prereq: generate-errcodes.pl: Accept output file
fb8f52f21d meson: prereq: unicode: Allow to specify output directory
8f1e4410d6 meson: prereq: Refactor dtrace postprocessing make rules
3d18a20b11 meson: prereq: Add --outdir option to gen_node_support.pl

I pushed these. Thanks for the reviews and patches!

The symbol export stuff has also been pushed (discussed in a separate thread).

It's nice to see the meson patchset length reduced by this much.

I pushed a rebased version of the remaining branches to git. I'll be on
vacation for a bit, I'm not sure I can get a new version with further cleanups
out before.

Given that we can't use src/tools/gen_versioning_script.pl for the make build,
due to not depending on perl for tarball builds, I'm inclined to rewrite it
python (which we depend on via meson anyway) and consider it a meson specific
wrapper?

Bilal, Peter previously commented on the pg_regress change for ecpg, perhaps
you can comment on that?

In /messages/by-id/0e81e45c-c9a5-e95b-2782-ab2dfec8bf57@enterprisedb.com
On 2022-07-06 11:03:31 +0200, Peter Eisentraut wrote:

dff7b5a960 meson: prereq: regress: allow to specify director containing
expected files.

This could use a bit more explanation, but it doesn't look
controversial so far.

Greetings,

Andres Freund

#217Bilal Yavuz
byavuz81@gmail.com
In reply to: Andres Freund (#216)
Re: [RFC] building postgres with meson - v10

Hi,

On 2022-07-18 23:23:27 +0300, Andres Freund wrote:

Bilal, Peter previously commented on the pg_regress change for ecpg,
perhaps
you can comment on that?

In
/messages/by-id/0e81e45c-c9a5-e95b-2782-ab2dfec8bf57@enterprisedb.com
On 2022-07-06 11:03:31 +0200, Peter Eisentraut wrote:

dff7b5a960 meson: prereq: regress: allow to specify director containing
expected files.

This could use a bit more explanation, but it doesn't look
controversial so far

While testing ECPG, C and exe files are generated by meson so these files
are in the meson's build directory but expected files are in the source
directory. However; there was no way to set different paths for inputs (C
and exe files') and expected files' directory. So, I added `--expecteddir`
to separately set expected files' directory.

Greetings,

Nazir Bilal Yavuz

On Mon, 18 Jul 2022 at 23:23, Andres Freund <andres@anarazel.de> wrote:

Show quoted text

Hi,

On 2022-07-18 11:33:09 +0200, Peter Eisentraut wrote:

The following patches are ok to commit IMO:

a1c5542929 prereq: Deal with paths containing \ and spaces in

basebackup_to_shell tests

e37951875d meson: prereq: psql: Output dir and dependency generation for

sql_help

18cc9fbd02 meson: prereq: ecpg: Add and use output directory argument

for preproc/*.pl

58a32694e9 meson: prereq: Move snowball_create.sql creation into perl

file

59b8bffdaf meson: prereq: Add output path arg in generate-lwlocknames.pl
2db97b00d5 meson: prereq: generate-errcodes.pl: Accept output file
fb8f52f21d meson: prereq: unicode: Allow to specify output directory
8f1e4410d6 meson: prereq: Refactor dtrace postprocessing make rules
3d18a20b11 meson: prereq: Add --outdir option to gen_node_support.pl

I pushed these. Thanks for the reviews and patches!

The symbol export stuff has also been pushed (discussed in a separate
thread).

It's nice to see the meson patchset length reduced by this much.

I pushed a rebased version of the remaining branches to git. I'll be on
vacation for a bit, I'm not sure I can get a new version with further
cleanups
out before.

Given that we can't use src/tools/gen_versioning_script.pl for the make
build,
due to not depending on perl for tarball builds, I'm inclined to rewrite it
python (which we depend on via meson anyway) and consider it a meson
specific
wrapper?

Bilal, Peter previously commented on the pg_regress change for ecpg,
perhaps
you can comment on that?

In
/messages/by-id/0e81e45c-c9a5-e95b-2782-ab2dfec8bf57@enterprisedb.com
On 2022-07-06 11:03:31 +0200, Peter Eisentraut wrote:

dff7b5a960 meson: prereq: regress: allow to specify director containing
expected files.

This could use a bit more explanation, but it doesn't look
controversial so far.

Greetings,

Andres Freund

#218Bilal Yavuz
byavuz81@gmail.com
In reply to: Bilal Yavuz (#217)
Re: [RFC] building postgres with meson - v10

Hi,

Sorry for the first email.

On Mon, 18 Jul 2022 at 23:23, Andres Freund <andres@anarazel.de> wrote:

In

/messages/by-id/0e81e45c-c9a5-e95b-2782-ab2dfec8bf57@enterprisedb.com

On 2022-07-06 11:03:31 +0200, Peter Eisentraut wrote:

dff7b5a960 meson: prereq: regress: allow to specify director containing
expected files.

This could use a bit more explanation, but it doesn't look
controversial so far.

While testing ECPG, C and exe files are generated by meson so these files
are in the meson's build directory but expected files are in the source
directory. However; there was no way to set different paths for inputs (C
and exe files') and expected files' directory. So, I added `--expecteddir`
to separately set expected files' directory.

Greetings,

Nazir Bilal Yavuz

#219Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#88)
Re: [RFC] building postgres with meson -v

Hi,

On 2021-10-31 16:24:48 -0700, Andres Freund wrote:

- support for building docs.
I couldn't get dbtoepub work in a vpath style build, so I changed that
to also use pandoc. No idea if anybody uses the epub rules?

combing through various FIXMEs in the meson patch I started to look into docs
again. A few questions / noteworthy points:

- I still haven't gotten dbtoepub to work in vpath style builds (epub
generation is instead using pandoc). Could somebody using these comment on
the quality difference?

We don't seem to offer these for download anywhere...

Worth noting that dbtoepub takes approximately forever (>25min). Not that
pandoc is fast, but ...

Unfortunately pandoc doesn't understand <part> level stuff. That'd probably
easy enough to tweak, but ...

- We have logic to change the man section (grep for sqlmansect) for some
platforms. The only remaining platform is solaris. I'm inclined to not
implement that.

- I've not implemented the texinfo targets - don't think they're really used?

Greetings,

Andres Freund

#220Andres Freund
andres@anarazel.de
In reply to: Bilal Yavuz (#218)
1 attachment(s)
Re: [RFC] building postgres with meson - v10

Hi,

On 2022-07-21 15:26:05 +0300, Bilal Yavuz wrote:

On 2022-07-06 11:03:31 +0200, Peter Eisentraut wrote:

dff7b5a960 meson: prereq: regress: allow to specify director containing
expected files.

This could use a bit more explanation, but it doesn't look
controversial so far.

While testing ECPG, C and exe files are generated by meson so these files
are in the meson's build directory but expected files are in the source
directory. However; there was no way to set different paths for inputs (C
and exe files') and expected files' directory. So, I added `--expecteddir`
to separately set expected files' directory.

Attached is a version of this patch that also removes the copying of these
files from ecpg's makefile.

Bilal's version checked different directories for expected files, but I don't
think that's necessary. Bilal, do you remember why you added that?

I'm somewhat tempted to rename ecpg's pg_regress to pg_regress_ecpg as part of
this, given the .c file is named pg_regress_ecpg.c and that pg_regress is a
pre-existing binary.

Greetings,

Andres Freund

Attachments:

0001-meson-prereq-regress-allow-to-specify-director-conta.patchtext/x-diff; charset=us-asciiDownload
From 9645e0a01305ce42fdacaae73bd0d021a5a1c47e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 30 Jun 2022 18:28:17 -0700
Subject: [PATCH] meson: prereq: regress: allow to specify director containing
 expected files

The ecpg tests have their input directory in the build directory as the tests
need to be built. Until now that required copying the expected/ directory to
the build directory in VPATH builds. To avoid needing to implement the same
for the meson build, add support for specifying the expected directory/.

Remove the copying of ecpg's expected/ to the build dir in VPATH builds.

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/20220718202327.pspcqz5mwbi2yb7w@awork3.anarazel.de
---
 src/interfaces/ecpg/test/Makefile          | 28 ++++++++--------------
 src/interfaces/ecpg/test/pg_regress_ecpg.c |  8 +++----
 src/test/regress/pg_regress.c              |  7 ++++++
 src/test/regress/pg_regress.h              |  1 +
 4 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index 10f53c708c8..d7a7d1d1ca5 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -59,24 +59,16 @@ pg_regress_ecpg.o: pg_regress_ecpg.c $(top_builddir)/src/port/pg_config_paths.h
 $(top_builddir)/src/port/pg_config_paths.h: $(top_builddir)/src/Makefile.global
 	$(MAKE) -C $(top_builddir)/src/port pg_config_paths.h
 
-# When doing a VPATH build, copy over the .pgc, .stdout and .stderr
-# files so that the driver script can find them.  We have to use an
-# absolute path for the targets, because otherwise make will try to
-# locate the missing files using VPATH, and will find them in
-# $(srcdir), but the point here is that we want to copy them from
-# $(srcdir) to the build directory.
-
-ifdef VPATH
-remaining_files_src := $(wildcard $(srcdir)/*/*.pgc) $(wildcard $(srcdir)/expected/*.c) $(wildcard $(srcdir)/expected/*.stdout) $(wildcard $(srcdir)/expected/*.stderr)
-remaining_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, $(remaining_files_src))
-
-all: $(remaining_files_build)
-$(remaining_files_build): $(abs_builddir)/%: $(srcdir)/%
-	ln -s $< $@
-endif
-
-# Common options for tests. Also pick up anything passed in EXTRA_REGRESS_OPTS
-REGRESS_OPTS = --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 $(EXTRA_REGRESS_OPTS)
+# Common options for tests
+#
+# Need to specify expecteddir explicitly, as the inputdir is located in the
+# build directory, because the files need to be compiled. Other pg_regress
+# style tests have the expecteddir in the source directory.
+#
+# Also pick up anything passed in EXTRA_REGRESS_OPTS.
+REGRESS_OPTS =  --expecteddir=$(srcdir) \
+  --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 \
+  $(EXTRA_REGRESS_OPTS)
 
 check: all
 	$(with_temp_install) ./pg_regress $(REGRESS_OPTS) --temp-instance=./tmp_check $(TEMP_CONF) --bindir= $(pg_regress_locale_flags) $(THREAD) --schedule=$(srcdir)/ecpg_schedule sql/twophase
diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c
index f920af4560c..84e45ceebe0 100644
--- a/src/interfaces/ecpg/test/pg_regress_ecpg.c
+++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c
@@ -164,7 +164,7 @@ ecpg_start_test(const char *testname,
 	char	   *appnameenv;
 
 	snprintf(inprg, sizeof(inprg), "%s/%s", inputdir, testname);
-	snprintf(insource, sizeof(insource), "%s.c", testname);
+	snprintf(insource, sizeof(insource), "%s/%s.c", inputdir, testname);
 
 	/* make a version of the test name that has dashes in place of slashes */
 	initStringInfo(&testname_dash);
@@ -177,13 +177,13 @@ ecpg_start_test(const char *testname,
 
 	snprintf(expectfile_stdout, sizeof(expectfile_stdout),
 			 "%s/expected/%s.stdout",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
 	snprintf(expectfile_stderr, sizeof(expectfile_stderr),
 			 "%s/expected/%s.stderr",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
 	snprintf(expectfile_source, sizeof(expectfile_source),
 			 "%s/expected/%s.c",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
 
 	snprintf(outfile_stdout, sizeof(outfile_stdout),
 			 "%s/results/%s.stdout",
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 04ab513b7cb..920974c1541 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -76,6 +76,7 @@ _stringlist *dblist = NULL;
 bool		debug = false;
 char	   *inputdir = ".";
 char	   *outputdir = ".";
+char       *expecteddir = ".";
 char	   *bindir = PGBINDIR;
 char	   *launcher = NULL;
 static _stringlist *loadextension = NULL;
@@ -1989,6 +1990,7 @@ help(void)
 	printf(_("      --debug                   turn on debug mode in programs that are run\n"));
 	printf(_("      --dlpath=DIR              look for dynamic libraries in DIR\n"));
 	printf(_("      --encoding=ENCODING       use ENCODING as the encoding\n"));
+	printf(_("      --expecteddir=DIR         take expected files from DIR (default \".\")\n"));
 	printf(_("  -h, --help                    show this help, then exit\n"));
 	printf(_("      --inputdir=DIR            take input files from DIR (default \".\")\n"));
 	printf(_("      --launcher=CMD            use CMD as launcher of psql\n"));
@@ -2052,6 +2054,7 @@ regression_main(int argc, char *argv[],
 		{"load-extension", required_argument, NULL, 22},
 		{"config-auth", required_argument, NULL, 24},
 		{"max-concurrent-tests", required_argument, NULL, 25},
+		{"expecteddir", required_argument, NULL, 26},
 		{NULL, 0, NULL, 0}
 	};
 
@@ -2181,6 +2184,9 @@ regression_main(int argc, char *argv[],
 			case 25:
 				max_concurrent_tests = atoi(optarg);
 				break;
+			case 26:
+				expecteddir = pg_strdup(optarg);
+				break;
 			default:
 				/* getopt_long already emitted a complaint */
 				fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
@@ -2220,6 +2226,7 @@ regression_main(int argc, char *argv[],
 
 	inputdir = make_absolute_path(inputdir);
 	outputdir = make_absolute_path(outputdir);
+	expecteddir = make_absolute_path(expecteddir);
 	dlpath = make_absolute_path(dlpath);
 
 	/*
diff --git a/src/test/regress/pg_regress.h b/src/test/regress/pg_regress.h
index 2143ee0e727..d8772fec8ed 100644
--- a/src/test/regress/pg_regress.h
+++ b/src/test/regress/pg_regress.h
@@ -53,6 +53,7 @@ extern _stringlist *dblist;
 extern bool debug;
 extern char *inputdir;
 extern char *outputdir;
+extern char *expecteddir;
 extern char *launcher;
 
 extern const char *basic_diff_opts;
-- 
2.37.0.3.g30cc8d0f14

#221Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: [RFC] building postgres with meson

Hi,

I was looking at re-unifying gendef2.pl that the meson patchset had introduced
for temporary ease during hacking with gendef.pl. Testing that I noticed that
either I and my machine is very confused, or gendef.pl's check whether it can
skip work is bogus.

I noticed that, despite having code to avoid rerunning when the input files
are older than the .def file, it always runs.

# if the def file exists and is newer than all input object files, skip
# its creation
if (-f $deffile
&& (-M $deffile > max(map { -M } <$ARGV[0]/*.obj>)))
{
print "Not re-generating $defname.DEF, file already exists.\n";
exit(0);
}

My understanding of -M is that it returns the time delta between the file
modification and the start of the script. Which makes the use of max() bogus,
since it'll return the oldest time any input has been modified, not the
newest. And the condition needs to be inverted, because we want to skip the
work if $deffile is *newer*, right?

Am I missing something here?

I'm tempted to just remove the not-regenerating logic - gendef.pl shouldn't
run if there's nothing to do, and it'll e.g. not notice if there's an
additional input that wasn't there during the last invocation of gendef.pl.

Greetings,

Andres Freund

#222Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#221)
Re: [RFC] building postgres with meson

On 2022-08-09 Tu 03:10, Andres Freund wrote:

Hi,

I was looking at re-unifying gendef2.pl that the meson patchset had introduced
for temporary ease during hacking with gendef.pl. Testing that I noticed that
either I and my machine is very confused, or gendef.pl's check whether it can
skip work is bogus.

I noticed that, despite having code to avoid rerunning when the input files
are older than the .def file, it always runs.

# if the def file exists and is newer than all input object files, skip
# its creation
if (-f $deffile
&& (-M $deffile > max(map { -M } <$ARGV[0]/*.obj>)))
{
print "Not re-generating $defname.DEF, file already exists.\n";
exit(0);
}

My understanding of -M is that it returns the time delta between the file
modification and the start of the script. Which makes the use of max() bogus,
since it'll return the oldest time any input has been modified, not the
newest. And the condition needs to be inverted, because we want to skip the
work if $deffile is *newer*, right?

Am I missing something here?

No, you're right, this is bogus. Reversing the test and using min
instead of max is the obvious fix.

I'm tempted to just remove the not-regenerating logic - gendef.pl shouldn't
run if there's nothing to do, and it'll e.g. not notice if there's an
additional input that wasn't there during the last invocation of gendef.pl.

Maybe, need to think about that more.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#223Nazir Bilal Yavuz
byavuz81@gmail.com
In reply to: Andres Freund (#220)
Re: [RFC] building postgres with meson - v10

Hi,

On 8/8/22 18:53, Andres Freund wrote:

Bilal's version checked different directories for expected files, but I don't
think that's necessary. Bilal, do you remember why you added that?

This was for not breaking autoconf build. Autoconf wasn't using
expecteddir, so I checked different directories.

Greetings,

Nazir Bilal Yavuz

#224Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#185)
Re: [RFC] building postgres with meson

Hi,

On 2022-06-02 10:26:09 -0700, Andres Freund wrote:

Could we have the meson build check that, say, if gram.c exists it
is newer than gram.y? Or get it to ignore an in-tree gram.c?

I suspect the problem with ignoring is gram.h, that's probably a bit harder to
ignore.

I tried to ignore various generated files in the source tree, but I don't
think it's doable for all of them. Consider
e.g. src/backend/utils/misc/guc-file.c which is gets built via #include
"guc-file.c" from gram.c

Because it's a "" include, the search path starts in the current directory and
only then -I is searched. To my knowledge there's no way of changing
that. Quoting the gcc manpage:

-I dir
-iquote dir
-isystem dir
-idirafter dir
Add the directory dir to the list of directories to be searched for header files during preprocessing. If dir begins with = or $SYSROOT, then
the = or $SYSROOT is replaced by the sysroot prefix; see --sysroot and -isysroot.

Directories specified with -iquote apply only to the quote form of the directive, "#include "file"". Directories specified with -I, -isystem, or
-idirafter apply to lookup for both the "#include "file"" and "#include <file>" directives.

You can specify any number or combination of these options on the command line to search for header files in several directories. The lookup
order is as follows:

1. For the quote form of the include directive, the directory of the current file is searched first.

2. For the quote form of the include directive, the directories specified by -iquote options are searched in left-to-right order, as they appear
on the command line.

3. Directories specified with -I options are scanned in left-to-right order.
[...]

Except for copying guc.c from source to build tree before building, I don't
see a way of ignoring the in-build-tree guc-file.c.

Not sure what a good way of dealing with this is. For now I'll make it just
error out if there's any known such file in the source tree, but that's not a
good solution forever. If it were just "normal" build leftovers I'd propose
to (optionally) just remove them, but that's not good for tarballs.

Greetings,

Andres Freund

#225Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
9 attachment(s)
Re: [RFC] building postgres with meson - v11

Hi,

Attached is a new version of the meson patchset. Plenty changes:

- Added a postgresql-extension.pc pkg-config file. That allows building server
extensions without integrating directly with the postgres buildsystem. I
have tested that this allows to build a simple out-of-tree extension on
linux and windows - the latter is something that we didn't really support
before. I think we could add something similar to the autoconf build in the
back branches, which'd make it easier to build extensions using this
mechanism across server versions.

- A significant number of the preparatory patches has been committed

- Lots of cleanup / simplification around exporting symbols, including
reunifying gendef.pl that I had previously copied

- Ecpg is now built and tested on windows, thanks to the above

- If there are any leftover generated files in the source tree, we now error
out, with instructions for how to fix it. That might need a better answer at
some point (think building from tarball), but I think that's good enough for
now.

It might be worth generating a file to perform the cleanups, it can be a
long list.

- CI for Openbsd, Netbsd (thanks Bilal!), that found a few minor issues

- I hadn't fully implemented the defaults for semaphores. Turns out named
semaphores are really slow on openbsd and netbsd.

- I went through all the "configure" tests to see if there are mismatches, and
either fixed them or added FIXMEs. There's maybe a handful.

- The PGXS compat layer is good enough to build at least a few moderately
complicated extensions (postgis, postgis), but currently their tests fail
against 15 (independent of the buildsystem)...

- Improved configure summary to show CFLAGS

- Some other CI improvements, we e.g. didn't use the same test concurrency and
CFLAGSs between the meson and autoconf tasks.

- Lots of small cleanups

- The testrunner now creates a test.start file when starting and either a
test.success or test.failure when ending. I'd like to use that to select the
list of log files etc to report in CI / the buildfarm, while still allowing
concurrent testing. Andrew, does that make sense to you?

- Lots of other small stuff

I think this is getting closer to being initially mergeable. As we'd
discussed, we're more likely to succeed if we accept working somewhat
incrementally on this.

Samay, with a bit of input from me, started on adding a docs chapter for
building with meson. I hope to include that in the next version.

I'll next send out an email discussing where test outputs should be when
running them with meson and how tests and "testsuites" should be named.

Greetings,

Andres

Attachments:

v11-0001-meson-prereq-regress-allow-to-specify-director-c.patchtext/x-diff; charset=us-asciiDownload
From 63cb79ca9dc79b2d96df143a75d34e144575045b Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 30 Jun 2022 18:28:17 -0700
Subject: [PATCH v11 1/9] meson: prereq: regress: allow to specify director
 containing expected files

The ecpg tests have their input directory in the build directory as the tests
need to be built. Until now that required copying the expected/ directory to
the build directory in VPATH builds. To avoid needing to implement the same
for the meson build, add support for specifying the expected directory/.

Remove the copying of ecpg's expected/ to the build dir in VPATH builds.

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/20220718202327.pspcqz5mwbi2yb7w@awork3.anarazel.de
---
 src/interfaces/ecpg/test/Makefile          | 28 ++++++++--------------
 src/interfaces/ecpg/test/pg_regress_ecpg.c |  8 +++----
 src/test/regress/pg_regress.c              |  7 ++++++
 src/test/regress/pg_regress.h              |  1 +
 4 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index 10f53c708c8..d7a7d1d1ca5 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -59,24 +59,16 @@ pg_regress_ecpg.o: pg_regress_ecpg.c $(top_builddir)/src/port/pg_config_paths.h
 $(top_builddir)/src/port/pg_config_paths.h: $(top_builddir)/src/Makefile.global
 	$(MAKE) -C $(top_builddir)/src/port pg_config_paths.h
 
-# When doing a VPATH build, copy over the .pgc, .stdout and .stderr
-# files so that the driver script can find them.  We have to use an
-# absolute path for the targets, because otherwise make will try to
-# locate the missing files using VPATH, and will find them in
-# $(srcdir), but the point here is that we want to copy them from
-# $(srcdir) to the build directory.
-
-ifdef VPATH
-remaining_files_src := $(wildcard $(srcdir)/*/*.pgc) $(wildcard $(srcdir)/expected/*.c) $(wildcard $(srcdir)/expected/*.stdout) $(wildcard $(srcdir)/expected/*.stderr)
-remaining_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, $(remaining_files_src))
-
-all: $(remaining_files_build)
-$(remaining_files_build): $(abs_builddir)/%: $(srcdir)/%
-	ln -s $< $@
-endif
-
-# Common options for tests. Also pick up anything passed in EXTRA_REGRESS_OPTS
-REGRESS_OPTS = --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 $(EXTRA_REGRESS_OPTS)
+# Common options for tests
+#
+# Need to specify expecteddir explicitly, as the inputdir is located in the
+# build directory, because the files need to be compiled. Other pg_regress
+# style tests have the expecteddir in the source directory.
+#
+# Also pick up anything passed in EXTRA_REGRESS_OPTS.
+REGRESS_OPTS =  --expecteddir=$(srcdir) \
+  --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 \
+  $(EXTRA_REGRESS_OPTS)
 
 check: all
 	$(with_temp_install) ./pg_regress $(REGRESS_OPTS) --temp-instance=./tmp_check $(TEMP_CONF) --bindir= $(pg_regress_locale_flags) $(THREAD) --schedule=$(srcdir)/ecpg_schedule sql/twophase
diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c
index f920af4560c..84e45ceebe0 100644
--- a/src/interfaces/ecpg/test/pg_regress_ecpg.c
+++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c
@@ -164,7 +164,7 @@ ecpg_start_test(const char *testname,
 	char	   *appnameenv;
 
 	snprintf(inprg, sizeof(inprg), "%s/%s", inputdir, testname);
-	snprintf(insource, sizeof(insource), "%s.c", testname);
+	snprintf(insource, sizeof(insource), "%s/%s.c", inputdir, testname);
 
 	/* make a version of the test name that has dashes in place of slashes */
 	initStringInfo(&testname_dash);
@@ -177,13 +177,13 @@ ecpg_start_test(const char *testname,
 
 	snprintf(expectfile_stdout, sizeof(expectfile_stdout),
 			 "%s/expected/%s.stdout",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
 	snprintf(expectfile_stderr, sizeof(expectfile_stderr),
 			 "%s/expected/%s.stderr",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
 	snprintf(expectfile_source, sizeof(expectfile_source),
 			 "%s/expected/%s.c",
-			 outputdir, testname_dash.data);
+			 expecteddir, testname_dash.data);
 
 	snprintf(outfile_stdout, sizeof(outfile_stdout),
 			 "%s/results/%s.stdout",
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 04ab513b7cb..920974c1541 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -76,6 +76,7 @@ _stringlist *dblist = NULL;
 bool		debug = false;
 char	   *inputdir = ".";
 char	   *outputdir = ".";
+char       *expecteddir = ".";
 char	   *bindir = PGBINDIR;
 char	   *launcher = NULL;
 static _stringlist *loadextension = NULL;
@@ -1989,6 +1990,7 @@ help(void)
 	printf(_("      --debug                   turn on debug mode in programs that are run\n"));
 	printf(_("      --dlpath=DIR              look for dynamic libraries in DIR\n"));
 	printf(_("      --encoding=ENCODING       use ENCODING as the encoding\n"));
+	printf(_("      --expecteddir=DIR         take expected files from DIR (default \".\")\n"));
 	printf(_("  -h, --help                    show this help, then exit\n"));
 	printf(_("      --inputdir=DIR            take input files from DIR (default \".\")\n"));
 	printf(_("      --launcher=CMD            use CMD as launcher of psql\n"));
@@ -2052,6 +2054,7 @@ regression_main(int argc, char *argv[],
 		{"load-extension", required_argument, NULL, 22},
 		{"config-auth", required_argument, NULL, 24},
 		{"max-concurrent-tests", required_argument, NULL, 25},
+		{"expecteddir", required_argument, NULL, 26},
 		{NULL, 0, NULL, 0}
 	};
 
@@ -2181,6 +2184,9 @@ regression_main(int argc, char *argv[],
 			case 25:
 				max_concurrent_tests = atoi(optarg);
 				break;
+			case 26:
+				expecteddir = pg_strdup(optarg);
+				break;
 			default:
 				/* getopt_long already emitted a complaint */
 				fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
@@ -2220,6 +2226,7 @@ regression_main(int argc, char *argv[],
 
 	inputdir = make_absolute_path(inputdir);
 	outputdir = make_absolute_path(outputdir);
+	expecteddir = make_absolute_path(expecteddir);
 	dlpath = make_absolute_path(dlpath);
 
 	/*
diff --git a/src/test/regress/pg_regress.h b/src/test/regress/pg_regress.h
index 2143ee0e727..d8772fec8ed 100644
--- a/src/test/regress/pg_regress.h
+++ b/src/test/regress/pg_regress.h
@@ -53,6 +53,7 @@ extern _stringlist *dblist;
 extern bool debug;
 extern char *inputdir;
 extern char *outputdir;
+extern char *expecteddir;
 extern char *launcher;
 
 extern const char *basic_diff_opts;
-- 
2.37.0.3.g30cc8d0f14

v11-0002-meson-prereq-Don-t-add-HAVE_LDAP_H-HAVE_WINLDAP_.patchtext/x-diff; charset=us-asciiDownload
From 717a22e3e674e778da0d488dd26a01d7fa233ba6 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 5 Aug 2022 14:09:42 -0700
Subject: [PATCH v11 2/9] meson: prereq: Don't add HAVE_LDAP_H HAVE_WINLDAP_H
 to pg_config.h.

They're not referenced.
---
 src/include/pg_config.h.in |  6 ------
 configure                  | 16 ++--------------
 configure.ac               | 12 ++++++------
 src/tools/msvc/Solution.pm |  2 --
 4 files changed, 8 insertions(+), 28 deletions(-)

diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index fc5ad5fd658..dc8b13c0533 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -259,9 +259,6 @@
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
-/* Define to 1 if you have the <ldap.h> header file. */
-#undef HAVE_LDAP_H
-
 /* Define to 1 if you have the `ldap_initialize' function. */
 #undef HAVE_LDAP_INITIALIZE
 
@@ -589,9 +586,6 @@
 /* Define to 1 if you have the `wcstombs_l' function. */
 #undef HAVE_WCSTOMBS_L
 
-/* Define to 1 if you have the <winldap.h> header file. */
-#undef HAVE_WINLDAP_H
-
 /* Define to 1 if you have the `X509_get_signature_nid' function. */
 #undef HAVE_X509_GET_SIGNATURE_NID
 
diff --git a/configure b/configure
index cf2c4b85fe2..e527363a9c6 100755
--- a/configure
+++ b/configure
@@ -14311,19 +14311,13 @@ fi
 
 if test "$with_ldap" = yes ; then
   if test "$PORTNAME" != "win32"; then
-     for ac_header in ldap.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "ldap.h" "ac_cv_header_ldap_h" "$ac_includes_default"
+     ac_fn_c_check_header_mongrel "$LINENO" "ldap.h" "ac_cv_header_ldap_h" "$ac_includes_default"
 if test "x$ac_cv_header_ldap_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LDAP_H 1
-_ACEOF
 
 else
   as_fn_error $? "header file <ldap.h> is required for LDAP" "$LINENO" 5
 fi
 
-done
 
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compatible LDAP implementation" >&5
 $as_echo_n "checking for compatible LDAP implementation... " >&6; }
@@ -14367,22 +14361,16 @@ $as_echo "$as_me: WARNING:
 *** also uses LDAP will crash on exit." >&2;}
 fi
   else
-     for ac_header in winldap.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "winldap.h" "ac_cv_header_winldap_h" "$ac_includes_default
+     ac_fn_c_check_header_compile "$LINENO" "winldap.h" "ac_cv_header_winldap_h" "$ac_includes_default
 #include <windows.h>
 
 "
 if test "x$ac_cv_header_winldap_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_WINLDAP_H 1
-_ACEOF
 
 else
   as_fn_error $? "header file <winldap.h> is required for LDAP" "$LINENO" 5
 fi
 
-done
 
   fi
 fi
diff --git a/configure.ac b/configure.ac
index b5798bcb0a1..1c392684bb8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1559,15 +1559,15 @@ fi
 
 if test "$with_ldap" = yes ; then
   if test "$PORTNAME" != "win32"; then
-     AC_CHECK_HEADERS(ldap.h, [],
-                      [AC_MSG_ERROR([header file <ldap.h> is required for LDAP])])
+     AC_CHECK_HEADER(ldap.h, [],
+                     [AC_MSG_ERROR([header file <ldap.h> is required for LDAP])])
      PGAC_LDAP_SAFE
   else
-     AC_CHECK_HEADERS(winldap.h, [],
-                      [AC_MSG_ERROR([header file <winldap.h> is required for LDAP])],
-                      [AC_INCLUDES_DEFAULT
+     AC_CHECK_HEADER(winldap.h, [],
+                     [AC_MSG_ERROR([header file <winldap.h> is required for LDAP])],
+                     [AC_INCLUDES_DEFAULT
 #include <windows.h>
-                      ])
+                     ])
   fi
 fi
 
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index cc82668457f..e832bf0c814 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -283,7 +283,6 @@ sub GenerateFiles
 		HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P       => undef,
 		HAVE_KQUEUE                                 => undef,
 		HAVE_LANGINFO_H                             => undef,
-		HAVE_LDAP_H                                 => undef,
 		HAVE_LDAP_INITIALIZE                        => undef,
 		HAVE_LIBCRYPTO                              => undef,
 		HAVE_LIBLDAP                                => undef,
@@ -390,7 +389,6 @@ sub GenerateFiles
 		HAVE_UUID_OSSP                           => undef,
 		HAVE_UUID_H                              => undef,
 		HAVE_UUID_UUID_H                         => undef,
-		HAVE_WINLDAP_H                           => undef,
 		HAVE_WCSTOMBS_L                          => 1,
 		HAVE_VISIBILITY_ATTRIBUTE                => undef,
 		HAVE_X509_GET_SIGNATURE_NID              => 1,
-- 
2.37.0.3.g30cc8d0f14

v11-0003-meson-prereq-Extend-gendef.pl-in-preparation-for.patchtext/x-diff; charset=us-asciiDownload
From b5fd87aa2f38001c81547346f576f9d599d57b18 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 9 Aug 2022 00:29:57 -0700
Subject: [PATCH v11 3/9] meson: prereq: Extend gendef.pl in preparation for
 meson

The main issue with using gendef.pl as is for meson is that with meson the
filenames are a bit longer, exceeding the max commandline length when calling
dumpbin with all objects. It's easier to pass a library in anyway.

The .def file location, input and temporary file location need to be tunable
as well.

This also fixes a bug in gendef.pl: The logic when to regenerate was broken
and never avoid regenerating.

Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/tools/msvc/MSBuildProject.pm |  4 +-
 src/tools/msvc/gendef.pl         | 72 ++++++++++++++++++++++----------
 2 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 62acdda3a19..3581fa4a123 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -312,6 +312,8 @@ sub WriteItemDefinitionGroup
 
 	my $targetmachine =
 	  $self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64';
+	my $arch =
+	  $self->{platform} eq 'Win32' ? 'x86' : 'x86_64';
 
 	my $includes = join ';', @{ $self->{includes} }, "";
 
@@ -381,7 +383,7 @@ EOF
 		print $f <<EOF;
     <PreLinkEvent>
       <Message>Generate DEF file</Message>
-      <Command>perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name} $self->{platform}</Command>
+      <Command>perl src\\tools\\msvc\\gendef.pl --arch $arch --deffile $cfgname\\$self->{name}\\$self->{name}.def $cfgname\\$self->{name}</Command>
     </PreLinkEvent>
 EOF
 	}
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index b8c514a8311..1e25c0e4d38 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -4,7 +4,8 @@
 use strict;
 use warnings;
 use 5.8.0;
-use List::Util qw(max);
+use List::Util qw(min);
+use Getopt::Long;
 
 my @def;
 
@@ -113,7 +114,7 @@ sub extract_syms
 
 sub writedef
 {
-	my ($deffile, $platform, $def) = @_;
+	my ($deffile, $arch, $def) = @_;
 	open(my $fh, '>', $deffile) || die "Could not write to $deffile\n";
 	print $fh "EXPORTS\n";
 	foreach my $f (sort keys %{$def})
@@ -122,7 +123,7 @@ sub writedef
 
 		# Strip the leading underscore for win32, but not x64
 		$f =~ s/^_//
-		  unless ($platform eq "x64");
+		  unless ($arch eq "x86_64");
 
 		# Emit just the name if it's a function symbol, or emit the name
 		# decorated with the DATA option for variables.
@@ -142,40 +143,69 @@ sub writedef
 
 sub usage
 {
-	die(    "Usage: gendef.pl <modulepath> <platform>\n"
-		  . "    modulepath: path to dir with obj files, no trailing slash"
-		  . "    platform: Win32 | x64");
+	my $add = shift;
+
+	die(    "Usage: gendef.pl --arch <arch> --deffile <deffile> --tempdir <tempdir> files or directories\n"
+		  . "    arch: x86 | x86_64\n"
+		  . "    outfile: \n"
+		  . "    tempdir: directory for temporary objects\n"
+		  . "    $add\n"
+	  );
 }
 
-usage()
-  unless scalar(@ARGV) == 2
-  && ( ($ARGV[0] =~ /\\([^\\]+$)/)
-	&& ($ARGV[1] eq 'Win32' || $ARGV[1] eq 'x64'));
-my $defname  = uc $1;
-my $deffile  = "$ARGV[0]/$defname.def";
-my $platform = $ARGV[1];
+my $arch;
+my $deffile;
+my $tempdir = '.';
+
+GetOptions(
+	'arch:s'   => \$arch,
+	'deffile:s'    => \$deffile,
+	'tempdir:s' => \$tempdir,
+  ) or die 'bluebeard';
+
+usage("arch: $arch") unless
+  ($arch eq 'x86' || $arch eq 'x86_64');
+
+print join(' ', @ARGV)."\n";
+
+my @files;
+
+foreach my $in (@ARGV)
+{
+	if (-d $in)
+	{
+		push @files, <$in/*.obj>;
+	}
+	else
+	{
+		push @files, $in;
+	}
+}
 
 # if the def file exists and is newer than all input object files, skip
 # its creation
 if (-f $deffile
-	&& (-M $deffile > max(map { -M } <$ARGV[0]/*.obj>)))
+	&& (-M $deffile < min(map { -M } @files)))
 {
-	print "Not re-generating $defname.DEF, file already exists.\n";
+	print "Not re-generating $deffile, file already exists.\n";
 	exit(0);
 }
 
-print "Generating $defname.DEF from directory $ARGV[0], platform $platform\n";
+print STDERR "Generating $deffile in tempdir $tempdir\n";
 
 my %def = ();
 
-my $symfile = "$ARGV[0]/all.sym";
-my $tmpfile = "$ARGV[0]/tmp.sym";
-system("dumpbin /symbols /out:$tmpfile $ARGV[0]/*.obj >NUL")
-  && die "Could not call dumpbin";
+my $symfile = "$tempdir/all.sym";
+my $tmpfile = "$tempdir/tmp.sym";
+mkdir($tempdir) unless -d $tempdir;
+
+my $cmd = "dumpbin /symbols /out:$tmpfile ".join(' ', @files);
+
+system($cmd) && die "Could not call dumpbin";
 rename($tmpfile, $symfile);
 extract_syms($symfile, \%def);
 print "\n";
 
-writedef($deffile, $platform, \%def);
+writedef($deffile, $arch, \%def);
 
 print "Generated " . scalar(keys(%def)) . " symbols\n";
-- 
2.37.0.3.g30cc8d0f14

v11-0004-meson-prereq-Add-src-tools-gen_export.pl.patchtext/x-diff; charset=us-asciiDownload
From 468a52cfd74daef772b379630b0e6fef78ba52ec Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v11 4/9] meson: prereq: Add src/tools/gen_export.pl

Currently the logic is all in src/Makefile.shlib. This adds a sketch of a
generation script that can be used from meson.
---
 src/tools/gen_export.pl | 83 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 src/tools/gen_export.pl

diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
new file mode 100644
index 00000000000..6a8b196ad89
--- /dev/null
+++ b/src/tools/gen_export.pl
@@ -0,0 +1,83 @@
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $format;
+my $libname;
+my $input;
+my $output;
+
+GetOptions(
+	'format:s'   => \$format,
+	'libname:s'    => \$libname,
+	'input:s' => \$input,
+	'output:s'  => \$output) or die "wrong arguments";
+
+if (not ($format eq 'aix' or $format eq 'darwin' or $format eq 'gnu' or $format eq 'win'))
+{
+	die "$0: $format is not yet handled (only aix, darwin, gnu, win are)\n";
+}
+
+open(my $input_handle, '<', $input)
+  or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+  or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+	print $output_handle "{
+  global:
+";
+}
+elsif ($format eq 'win')
+{
+	# XXX: Looks like specifying LIBRARY $libname is optional, which makes it
+	# easier to build a generic command for generating export files...
+	if ($libname)
+	{
+		print $output_handle "LIBRARY $libname\n";
+	}
+	print $output_handle "EXPORTS\n";
+}
+
+while (<$input_handle>)
+{
+	if (/^#/)
+	{
+		# don't do anything with a comment
+	}
+	elsif (/^([^\s]+)\s+([^\s]+)/)
+	{
+		if ($format eq 'aix')
+		{
+			print $output_handle "    $1\n";
+		}
+		elsif ($format eq 'darwin')
+		{
+			print $output_handle "    _$1\n";
+		}
+		elsif ($format eq 'gnu')
+		{
+			print $output_handle "    $1;\n";
+		}
+		elsif ($format eq 'win')
+		{
+			print $output_handle "    $1 @ $2\n";
+		}
+	}
+	else
+	{
+		die "$0: unexpected line $_\n";
+	}
+}
+
+if ($format eq 'gnu')
+{
+	print $output_handle "  local: *;
+};
+";
+}
+
+exit(0);
-- 
2.37.0.3.g30cc8d0f14

v11-0005-meson-prereq-Refactor-PG_TEST_EXTRA-logic-in-aut.patchtext/x-diff; charset=us-asciiDownload
From 60fd52f6ba5a0f69af8f988308954d1a096db7dc Mon Sep 17 00:00:00 2001
From: nbyavuz <byavuz81@gmail.com>
Date: Fri, 25 Mar 2022 10:55:08 +0300
Subject: [PATCH v11 5/9] meson: prereq: Refactor PG_TEST_EXTRA logic in
 autoconf build

---
 src/test/Makefile               | 15 +++++----------
 src/test/kerberos/t/001_auth.pl |  4 ++++
 src/test/ldap/t/001_auth.pl     |  4 ++++
 src/test/ssl/t/001_ssltests.pl  |  4 ++++
 src/test/ssl/t/002_scram.pl     |  4 ++++
 src/test/ssl/t/003_sslinfo.pl   |  4 ++++
 6 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/test/Makefile b/src/test/Makefile
index 69ef074d75e..dbd3192874d 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -17,25 +17,20 @@ SUBDIRS = perl regress isolation modules authentication recovery subscription
 ifeq ($(with_icu),yes)
 SUBDIRS += icu
 endif
-
-# Test suites that are not safe by default but can be run if selected
-# by the user via the whitespace-separated list in variable
-# PG_TEST_EXTRA:
 ifeq ($(with_gssapi),yes)
-ifneq (,$(filter kerberos,$(PG_TEST_EXTRA)))
 SUBDIRS += kerberos
 endif
-endif
 ifeq ($(with_ldap),yes)
-ifneq (,$(filter ldap,$(PG_TEST_EXTRA)))
 SUBDIRS += ldap
 endif
-endif
 ifeq ($(with_ssl),openssl)
-ifneq (,$(filter ssl,$(PG_TEST_EXTRA)))
 SUBDIRS += ssl
 endif
-endif
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA to check it in individual tap tests.
+export PG_TEST_EXTRA
 
 # We don't build or execute these by default, but we do want "make
 # clean" etc to recurse into them.  (We must filter out those that we
diff --git a/src/test/kerberos/t/001_auth.pl b/src/test/kerberos/t/001_auth.pl
index 62e05426393..e403d24c0c2 100644
--- a/src/test/kerberos/t/001_auth.pl
+++ b/src/test/kerberos/t/001_auth.pl
@@ -25,6 +25,10 @@ if ($ENV{with_gssapi} ne 'yes')
 {
 	plan skip_all => 'GSSAPI/Kerberos not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /kerberos/)
+{
+	plan skip_all => 'Potentially unsafe test GSSAPI/Kerberos not enabled in PG_TEST_EXTRA';
+}
 
 my ($krb5_bin_dir, $krb5_sbin_dir);
 
diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index 86dff8bd1f3..a5afddc5272 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -16,6 +16,10 @@ if ($ENV{with_ldap} ne 'yes')
 {
 	plan skip_all => 'LDAP not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ldap/)
+{
+	plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA';
+}
 elsif ($^O eq 'darwin' && -d '/usr/local/opt/openldap')
 {
 	# typical paths for Homebrew
diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl
index fa26212de9a..f58ff8d578b 100644
--- a/src/test/ssl/t/001_ssltests.pl
+++ b/src/test/ssl/t/001_ssltests.pl
@@ -17,6 +17,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl
index 588f47a39b9..15d45c88e50 100644
--- a/src/test/ssl/t/002_scram.pl
+++ b/src/test/ssl/t/002_scram.pl
@@ -20,6 +20,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl
index 87fb18a31e0..acd0ba8e828 100644
--- a/src/test/ssl/t/003_sslinfo.pl
+++ b/src/test/ssl/t/003_sslinfo.pl
@@ -18,6 +18,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 #### Some configuration
 my $ssl_server = SSL::Server->new();
-- 
2.37.0.3.g30cc8d0f14

v11-0006-wip-split-TESTDIR-into-two.patchtext/x-diff; charset=us-asciiDownload
From f107bef0bc1fb5e1bbec53213c03924921dac4c0 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 14 Feb 2022 21:47:07 -0800
Subject: [PATCH v11 6/9] wip: split TESTDIR into two

---
 src/bin/psql/t/010_tab_completion.pl   | 34 +++++++++++++-------------
 src/test/perl/PostgreSQL/Test/Utils.pm |  2 +-
 src/Makefile.global.in                 |  9 ++++---
 src/tools/msvc/vcregress.pl            |  2 ++
 4 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 2eea515e871..1e4e79fe7e1 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -70,23 +70,23 @@ delete $ENV{LS_COLORS};
 # to run in the build directory so that we can use relative paths to
 # access the tmp_check subdirectory; otherwise the output from filename
 # completion tests is too variable.
-if ($ENV{TESTDIR})
+if ($ENV{TESTOUTDIR})
 {
-	chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+	chdir "$ENV{TESTOUTDIR}" or die "could not chdir to \"$ENV{TESTOUTDIR}\": $!";
 }
 
 # Create some junk files for filename completion testing.
 my $FH;
-open $FH, ">", "tmp_check/somefile"
-  or die("could not create file \"tmp_check/somefile\": $!");
+open $FH, ">", "somefile"
+  or die("could not create file \"somefile\": $!");
 print $FH "some stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile123"
-  or die("could not create file \"tmp_check/afile123\": $!");
+open $FH, ">", "afile123"
+  or die("could not create file \"afile123\": $!");
 print $FH "more stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile456"
-  or die("could not create file \"tmp_check/afile456\": $!");
+open $FH, ">", "afile456"
+  or die("could not create file \"afile456\": $!");
 print $FH "other stuff\n";
 close $FH;
 
@@ -272,16 +272,16 @@ clear_query();
 
 # check filename completion
 check_completion(
-	"\\lo_import tmp_check/some\t",
-	qr|tmp_check/somefile |,
+	"\\lo_import some\t",
+	qr|somefile |,
 	"filename completion with one possibility");
 
 clear_query();
 
 # note: readline might print a bell before the completion
 check_completion(
-	"\\lo_import tmp_check/af\t",
-	qr|tmp_check/af\a?ile|,
+	"\\lo_import af\t",
+	qr|af\a?ile|,
 	"filename completion with multiple possibilities");
 
 # broken versions of libedit require clear_line not clear_query here
@@ -291,15 +291,15 @@ clear_line();
 # note: broken versions of libedit want to backslash the closing quote;
 # not much we can do about that
 check_completion(
-	"COPY foo FROM tmp_check/some\t",
-	qr|'tmp_check/somefile\\?' |,
+	"COPY foo FROM some\t",
+	qr|'somefile\\?' |,
 	"quoted filename completion with one possibility");
 
 clear_line();
 
 check_completion(
-	"COPY foo FROM tmp_check/af\t",
-	qr|'tmp_check/afile|,
+	"COPY foo FROM af\t",
+	qr|'afile|,
 	"quoted filename completion with multiple possibilities");
 
 # some versions of readline/libedit require two tabs here, some only need one
@@ -307,7 +307,7 @@ check_completion(
 # the quotes might appear, too
 check_completion(
 	"\t\t",
-	qr|afile123'? +'?(tmp_check/)?afile456|,
+	qr|afile123'? +'?afile456|,
 	"offer multiple file choices");
 
 clear_line();
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 1ca2cc59170..24017a82955 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -192,7 +192,7 @@ INIT
 	# Determine output directories, and create them.  The base path is the
 	# TESTDIR environment variable, which is normally set by the invoking
 	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check";
+	$tmp_check = $ENV{TESTOUTDIR} ? "$ENV{TESTOUTDIR}" : "tmp_check";
 	$log_path = "$tmp_check/log";
 
 	mkdir $tmp_check;
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 0625b60c434..d8319626d8b 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -454,7 +454,8 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+   PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -465,8 +466,9 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
-   PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
+   TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+   PATH="$(bindir):$(CURDIR):$$PATH" PGPORT='6$(DEF_PGPORT)' \
+   top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
 endef
@@ -477,6 +479,7 @@ echo "+++ tap check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
+   TESTOUTDIR='$(CURDIR)/tmp_check' \
    TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index c3729f6be5e..6f07a31464d 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -296,6 +296,8 @@ sub tap_check
 	# add the module build dir as the second element in the PATH
 	$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
 
+	$ENV{TESTOUTDIR} = "$dir/tmp_check";
+
 	rmtree('tmp_check');
 	system(@args);
 	my $status = $? >> 8;
-- 
2.37.0.3.g30cc8d0f14

v11-0007-meson-prereq-fix-warning-compat_informix-rnull.p.patchtext/x-diff; charset=us-asciiDownload
From 22f6b3c1c0eb2d562eb178d78255304a58266126 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 8 Aug 2022 21:01:39 -0700
Subject: [PATCH v11 7/9] meson: prereq: fix warning compat_informix/rnull.pgc
 with msvc

src/interfaces/ecpg/test/compat_informix/rnull.pgc(19,1): warning C4305: 'initializing': truncation from 'double' to 'float'
---
 src/interfaces/ecpg/test/compat_informix/rnull.pgc        | 2 +-
 src/interfaces/ecpg/test/expected/compat_informix-rnull.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/interfaces/ecpg/test/compat_informix/rnull.pgc b/src/interfaces/ecpg/test/compat_informix/rnull.pgc
index a6ad35e3bc9..232629fcd4a 100644
--- a/src/interfaces/ecpg/test/compat_informix/rnull.pgc
+++ b/src/interfaces/ecpg/test/compat_informix/rnull.pgc
@@ -16,7 +16,7 @@ int main(void)
 	$short s = 17;
 	$int i = -74874;
 	$bool b = 1;
-	$float f = 3.71;
+	$float f = (float) 3.71;
 	$long l = 487444;
 	$double dbl = 404.404;
 	$decimal dec;
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-rnull.c b/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
index d7ba69c1fbf..3efb2be117b 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
@@ -58,7 +58,7 @@ int main(void)
 
 	
 #line 19 "rnull.pgc"
- float f = 3.71 ;
+ float f = ( float ) 3.71 ;
 
 #line 19 "rnull.pgc"
 
-- 
2.37.0.3.g30cc8d0f14

v11-0008-meson-Add-meson-based-buildsystem.patchtext/x-diff; charset=utf-8Download
From cad29ca4616c2b36f488563a0bcf3d3cac642ce0 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v11 8/9] meson: Add meson based buildsystem

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Peter Eisentraut <peter@eisentraut.org>
Author: Thomas Munro <thomas.munro@gmail.com>
Author: John Naylor <john.naylor@enterprisedb.com>
Author: Stone Tickle <lattis@mochiro.moe>
---
 src/include/catalog/meson.build               |  142 +
 src/include/meson.build                       |  175 +
 src/include/nodes/meson.build                 |   58 +
 src/include/parser/meson.build                |   14 +
 src/include/pch/c_pch.h                       |    1 +
 src/include/pch/meson.build                   |    3 +
 src/include/pch/postgres_pch.h                |    1 +
 src/include/pg_config_ext.h.meson             |    7 +
 src/include/storage/meson.build               |   15 +
 src/include/utils/meson.build                 |   51 +
 src/common/meson.build                        |  176 +
 src/common/unicode/meson.build                |  101 +
 src/port/meson.build                          |  187 +
 src/port/win32ver.rc.in                       |   41 +
 config/meson.build                            |    4 +
 src/backend/access/brin/meson.build           |   12 +
 src/backend/access/common/meson.build         |   18 +
 src/backend/access/gin/meson.build            |   17 +
 src/backend/access/gist/meson.build           |   13 +
 src/backend/access/hash/meson.build           |   12 +
 src/backend/access/heap/meson.build           |   11 +
 src/backend/access/index/meson.build          |    6 +
 src/backend/access/meson.build                |   13 +
 src/backend/access/nbtree/meson.build         |   13 +
 src/backend/access/rmgrdesc/meson.build       |   26 +
 src/backend/access/spgist/meson.build         |   13 +
 src/backend/access/table/meson.build          |    6 +
 src/backend/access/tablesample/meson.build    |    5 +
 src/backend/access/transam/meson.build        |   31 +
 src/backend/backup/meson.build                |   13 +
 src/backend/bootstrap/meson.build             |   13 +
 src/backend/catalog/meson.build               |   44 +
 src/backend/commands/meson.build              |   51 +
 src/backend/executor/meson.build              |   67 +
 src/backend/foreign/meson.build               |    3 +
 src/backend/jit/llvm/meson.build              |   41 +
 src/backend/jit/meson.build                   |    3 +
 src/backend/lib/meson.build                   |   12 +
 src/backend/libpq/meson.build                 |   32 +
 src/backend/main/meson.build                  |    2 +
 src/backend/meson.build                       |  322 ++
 src/backend/nodes/meson.build                 |   30 +
 src/backend/optimizer/geqo/meson.build        |   17 +
 src/backend/optimizer/meson.build             |    5 +
 src/backend/optimizer/path/meson.build        |   11 +
 src/backend/optimizer/plan/meson.build        |   10 +
 src/backend/optimizer/prep/meson.build        |    7 +
 src/backend/optimizer/util/meson.build        |   16 +
 src/backend/parser/meson.build                |   49 +
 src/backend/partitioning/meson.build          |    5 +
 src/backend/po/meson.build                    |    1 +
 src/backend/port/meson.build                  |   31 +
 src/backend/port/win32/meson.build            |    6 +
 src/backend/postmaster/meson.build            |   15 +
 src/backend/regex/meson.build                 |    8 +
 .../replication/libpqwalreceiver/meson.build  |   13 +
 src/backend/replication/logical/meson.build   |   14 +
 src/backend/replication/meson.build           |   42 +
 src/backend/replication/pgoutput/meson.build  |   11 +
 src/backend/rewrite/meson.build               |    9 +
 src/backend/snowball/meson.build              |   85 +
 src/backend/statistics/meson.build            |    6 +
 src/backend/storage/buffer/meson.build        |    7 +
 src/backend/storage/file/meson.build          |    8 +
 src/backend/storage/freespace/meson.build     |    5 +
 src/backend/storage/ipc/meson.build           |   20 +
 src/backend/storage/large_object/meson.build  |    3 +
 src/backend/storage/lmgr/meson.build          |   13 +
 src/backend/storage/meson.build               |    9 +
 src/backend/storage/page/meson.build          |    5 +
 src/backend/storage/smgr/meson.build          |    4 +
 src/backend/storage/sync/meson.build          |    4 +
 src/backend/tcop/meson.build                  |    8 +
 src/backend/tsearch/meson.build               |   21 +
 src/backend/utils/activity/meson.build        |   18 +
 src/backend/utils/adt/meson.build             |  120 +
 src/backend/utils/cache/meson.build           |   16 +
 src/backend/utils/error/meson.build           |    6 +
 src/backend/utils/fmgr/meson.build            |    8 +
 src/backend/utils/hash/meson.build            |    4 +
 src/backend/utils/init/meson.build            |    4 +
 .../utils/mb/conversion_procs/meson.build     |   38 +
 src/backend/utils/mb/meson.build              |    9 +
 src/backend/utils/meson.build                 |   17 +
 src/backend/utils/misc/meson.build            |   33 +
 src/backend/utils/mmgr/meson.build            |   10 +
 src/backend/utils/resowner/meson.build        |    3 +
 src/backend/utils/sort/meson.build            |    9 +
 src/backend/utils/time/meson.build            |    4 +
 src/fe_utils/meson.build                      |   30 +
 src/bin/initdb/meson.build                    |   39 +
 src/bin/initdb/po/meson.build                 |    1 +
 src/bin/meson.build                           |   20 +
 src/bin/pg_amcheck/meson.build                |   26 +
 src/bin/pg_amcheck/po/meson.build             |    1 +
 src/bin/pg_archivecleanup/meson.build         |   18 +
 src/bin/pg_archivecleanup/po/meson.build      |    1 +
 src/bin/pg_basebackup/meson.build             |   58 +
 src/bin/pg_basebackup/po/meson.build          |    1 +
 src/bin/pg_checksums/meson.build              |   20 +
 src/bin/pg_checksums/po/meson.build           |    1 +
 src/bin/pg_config/meson.build                 |   18 +
 src/bin/pg_config/po/meson.build              |    1 +
 src/bin/pg_controldata/meson.build            |   18 +
 src/bin/pg_controldata/po/meson.build         |    1 +
 src/bin/pg_ctl/meson.build                    |   21 +
 src/bin/pg_ctl/po/meson.build                 |    1 +
 src/bin/pg_dump/meson.build                   |   84 +
 src/bin/pg_dump/po/meson.build                |    1 +
 src/bin/pg_resetwal/meson.build               |   19 +
 src/bin/pg_resetwal/po/meson.build            |    1 +
 src/bin/pg_rewind/meson.build                 |   39 +
 src/bin/pg_rewind/po/meson.build              |    1 +
 src/bin/pg_test_fsync/meson.build             |   18 +
 src/bin/pg_test_fsync/po/meson.build          |    1 +
 src/bin/pg_test_timing/meson.build            |   18 +
 src/bin/pg_test_timing/po/meson.build         |    1 +
 src/bin/pg_upgrade/meson.build                |   40 +
 src/bin/pg_upgrade/po/meson.build             |    1 +
 src/bin/pg_verifybackup/meson.build           |   32 +
 src/bin/pg_verifybackup/po/meson.build        |    1 +
 src/bin/pg_waldump/meson.build                |   28 +
 src/bin/pg_waldump/po/meson.build             |    1 +
 src/bin/pgbench/meson.build                   |   42 +
 src/bin/pgevent/meson.build                   |   38 +
 src/bin/psql/meson.build                      |   72 +
 src/bin/psql/po/meson.build                   |    1 +
 src/bin/scripts/meson.build                   |   50 +
 src/bin/scripts/po/meson.build                |    1 +
 src/interfaces/libpq/meson.build              |  103 +
 src/interfaces/libpq/po/meson.build           |    1 +
 src/interfaces/libpq/test/meson.build         |   15 +
 src/pl/meson.build                            |    5 +
 src/pl/plperl/meson.build                     |   92 +
 src/pl/plperl/po/meson.build                  |    1 +
 src/pl/plpgsql/meson.build                    |    1 +
 src/pl/plpgsql/src/meson.build                |   83 +
 src/pl/plpgsql/src/po/meson.build             |    1 +
 src/pl/plpython/meson.build                   |   99 +
 src/pl/plpython/po/meson.build                |    1 +
 src/pl/tcl/meson.build                        |   55 +
 src/pl/tcl/po/meson.build                     |    1 +
 contrib/adminpack/meson.build                 |   22 +
 contrib/amcheck/meson.build                   |   36 +
 contrib/auth_delay/meson.build                |    4 +
 contrib/auto_explain/meson.build              |   15 +
 contrib/basebackup_to_shell/meson.build       |   22 +
 contrib/basic_archive/meson.build             |   23 +
 contrib/bloom/meson.build                     |   36 +
 contrib/bool_plperl/meson.build               |   39 +
 contrib/btree_gin/meson.build                 |   53 +
 contrib/btree_gist/meson.build                |   84 +
 contrib/citext/meson.build                    |   33 +
 contrib/cube/meson.build                      |   52 +
 contrib/dblink/meson.build                    |   30 +
 contrib/dict_int/meson.build                  |   21 +
 contrib/dict_xsyn/meson.build                 |   28 +
 contrib/earthdistance/meson.build             |   22 +
 contrib/file_fdw/meson.build                  |   21 +
 contrib/fuzzystrmatch/meson.build             |   25 +
 contrib/hstore/meson.build                    |   44 +
 contrib/hstore_plperl/meson.build             |   40 +
 contrib/hstore_plpython/meson.build           |   36 +
 contrib/intagg/meson.build                    |    6 +
 contrib/intarray/meson.build                  |   36 +
 contrib/isn/meson.build                       |   32 +
 contrib/jsonb_plperl/meson.build              |   40 +
 contrib/jsonb_plpython/meson.build            |   35 +
 contrib/lo/meson.build                        |   26 +
 contrib/ltree/meson.build                     |   43 +
 contrib/ltree_plpython/meson.build            |   36 +
 contrib/meson.build                           |   66 +
 contrib/oid2name/meson.build                  |   16 +
 contrib/old_snapshot/meson.build              |   14 +
 contrib/pageinspect/meson.build               |   59 +
 contrib/passwordcheck/meson.build             |   29 +
 contrib/pg_buffercache/meson.build            |   27 +
 contrib/pg_freespacemap/meson.build           |   29 +
 contrib/pg_prewarm/meson.build                |   27 +
 contrib/pg_stat_statements/meson.build        |   34 +
 contrib/pg_surgery/meson.build                |   25 +
 contrib/pg_trgm/meson.build                   |   35 +
 contrib/pg_visibility/meson.build             |   27 +
 contrib/pg_walinspect/meson.build             |   37 +
 contrib/pgcrypto/meson.build                  |  100 +
 contrib/pgrowlocks/meson.build                |   15 +
 contrib/pgstattuple/meson.build               |   32 +
 contrib/postgres_fdw/meson.build              |   33 +
 contrib/seg/meson.build                       |   50 +
 contrib/sepgsql/meson.build                   |   34 +
 contrib/spi/meson.build                       |   47 +
 contrib/sslinfo/meson.build                   |   21 +
 contrib/tablefunc/meson.build                 |   25 +
 contrib/tcn/meson.build                       |   24 +
 contrib/test_decoding/meson.build             |   62 +
 contrib/tsm_system_rows/meson.build           |   24 +
 contrib/tsm_system_time/meson.build           |   24 +
 contrib/unaccent/meson.build                  |   32 +
 contrib/uuid-ossp/meson.build                 |   33 +
 contrib/vacuumlo/meson.build                  |   16 +
 contrib/xml2/meson.build                      |   32 +
 src/interfaces/ecpg/compatlib/meson.build     |   19 +
 src/interfaces/ecpg/ecpglib/meson.build       |   34 +
 src/interfaces/ecpg/ecpglib/po/meson.build    |    1 +
 src/interfaces/ecpg/include/meson.build       |   51 +
 src/interfaces/ecpg/meson.build               |    5 +
 src/interfaces/ecpg/pgtypeslib/meson.build    |   27 +
 src/interfaces/ecpg/preproc/meson.build       |  104 +
 src/interfaces/ecpg/preproc/po/meson.build    |    1 +
 .../ecpg/test/compat_informix/meson.build     |   31 +
 .../ecpg/test/compat_oracle/meson.build       |   20 +
 src/interfaces/ecpg/test/connect/meson.build  |   22 +
 src/interfaces/ecpg/test/meson.build          |   77 +
 .../ecpg/test/pgtypeslib/meson.build          |   21 +
 src/interfaces/ecpg/test/preproc/meson.build  |   38 +
 src/interfaces/ecpg/test/sql/meson.build      |   46 +
 src/interfaces/ecpg/test/thread/meson.build   |   21 +
 src/interfaces/meson.build                    |    2 +
 doc/src/sgml/meson.build                      |  258 ++
 doc/src/sgml/resolv.xsl                       |    7 +
 doc/src/sgml/version.sgml.in                  |    2 +
 src/test/authentication/meson.build           |   11 +
 src/test/icu/meson.build                      |   11 +
 src/test/isolation/meson.build                |   54 +
 src/test/kerberos/meson.build                 |   15 +
 src/test/ldap/meson.build                     |   11 +
 src/test/meson.build                          |   23 +
 src/test/modules/brin/meson.build             |   16 +
 src/test/modules/commit_ts/meson.build        |   18 +
 src/test/modules/delay_execution/meson.build  |   17 +
 src/test/modules/dummy_index_am/meson.build   |   22 +
 src/test/modules/dummy_seclabel/meson.build   |   22 +
 src/test/modules/libpq_pipeline/meson.build   |   20 +
 src/test/modules/meson.build                  |   27 +
 src/test/modules/plsample/meson.build         |   22 +
 src/test/modules/snapshot_too_old/meson.build |   14 +
 src/test/modules/spgist_name_ops/meson.build  |   22 +
 .../ssl_passphrase_callback/meson.build       |   47 +
 src/test/modules/test_bloomfilter/meson.build |   22 +
 src/test/modules/test_ddl_deparse/meson.build |   42 +
 src/test/modules/test_extensions/meson.build  |   45 +
 .../modules/test_ginpostinglist/meson.build   |   22 +
 src/test/modules/test_integerset/meson.build  |   22 +
 src/test/modules/test_lfind/meson.build       |   22 +
 src/test/modules/test_misc/meson.build        |   12 +
 src/test/modules/test_oat_hooks/meson.build   |   17 +
 src/test/modules/test_parser/meson.build      |   22 +
 src/test/modules/test_pg_dump/meson.build     |   22 +
 src/test/modules/test_predtest/meson.build    |   22 +
 src/test/modules/test_rbtree/meson.build      |   22 +
 src/test/modules/test_regex/meson.build       |   23 +
 src/test/modules/test_rls_hooks/meson.build   |   16 +
 src/test/modules/test_shm_mq/meson.build      |   26 +
 src/test/modules/unsafe_tests/meson.build     |   11 +
 src/test/modules/worker_spi/meson.build       |   25 +
 src/test/recovery/meson.build                 |   43 +
 src/test/regress/meson.build                  |   58 +
 src/test/ssl/meson.build                      |   13 +
 src/test/subscription/meson.build             |   42 +
 configure                                     |    6 +
 configure.ac                                  |    6 +
 conversion_helpers.txt                        |    9 +
 meson.build                                   | 3020 +++++++++++++++++
 meson_options.txt                             |  175 +
 src/meson.build                               |  271 ++
 src/timezone/meson.build                      |   53 +
 src/timezone/tznames/meson.build              |   21 +
 src/tools/find_meson                          |   27 +
 src/tools/irlink                              |   39 +
 src/tools/pgflex                              |   63 +
 src/tools/rcgen                               |   34 +
 .../relativize_shared_library_references      |   84 +
 src/tools/relpath.py                          |    6 +
 src/tools/testwrap                            |   46 +
 274 files changed, 11333 insertions(+)
 create mode 100644 src/include/catalog/meson.build
 create mode 100644 src/include/meson.build
 create mode 100644 src/include/nodes/meson.build
 create mode 100644 src/include/parser/meson.build
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/meson.build
 create mode 100644 src/include/pch/postgres_pch.h
 create mode 100644 src/include/pg_config_ext.h.meson
 create mode 100644 src/include/storage/meson.build
 create mode 100644 src/include/utils/meson.build
 create mode 100644 src/common/meson.build
 create mode 100644 src/common/unicode/meson.build
 create mode 100644 src/port/meson.build
 create mode 100644 src/port/win32ver.rc.in
 create mode 100644 config/meson.build
 create mode 100644 src/backend/access/brin/meson.build
 create mode 100644 src/backend/access/common/meson.build
 create mode 100644 src/backend/access/gin/meson.build
 create mode 100644 src/backend/access/gist/meson.build
 create mode 100644 src/backend/access/hash/meson.build
 create mode 100644 src/backend/access/heap/meson.build
 create mode 100644 src/backend/access/index/meson.build
 create mode 100644 src/backend/access/meson.build
 create mode 100644 src/backend/access/nbtree/meson.build
 create mode 100644 src/backend/access/rmgrdesc/meson.build
 create mode 100644 src/backend/access/spgist/meson.build
 create mode 100644 src/backend/access/table/meson.build
 create mode 100644 src/backend/access/tablesample/meson.build
 create mode 100644 src/backend/access/transam/meson.build
 create mode 100644 src/backend/backup/meson.build
 create mode 100644 src/backend/bootstrap/meson.build
 create mode 100644 src/backend/catalog/meson.build
 create mode 100644 src/backend/commands/meson.build
 create mode 100644 src/backend/executor/meson.build
 create mode 100644 src/backend/foreign/meson.build
 create mode 100644 src/backend/jit/llvm/meson.build
 create mode 100644 src/backend/jit/meson.build
 create mode 100644 src/backend/lib/meson.build
 create mode 100644 src/backend/libpq/meson.build
 create mode 100644 src/backend/main/meson.build
 create mode 100644 src/backend/meson.build
 create mode 100644 src/backend/nodes/meson.build
 create mode 100644 src/backend/optimizer/geqo/meson.build
 create mode 100644 src/backend/optimizer/meson.build
 create mode 100644 src/backend/optimizer/path/meson.build
 create mode 100644 src/backend/optimizer/plan/meson.build
 create mode 100644 src/backend/optimizer/prep/meson.build
 create mode 100644 src/backend/optimizer/util/meson.build
 create mode 100644 src/backend/parser/meson.build
 create mode 100644 src/backend/partitioning/meson.build
 create mode 100644 src/backend/po/meson.build
 create mode 100644 src/backend/port/meson.build
 create mode 100644 src/backend/port/win32/meson.build
 create mode 100644 src/backend/postmaster/meson.build
 create mode 100644 src/backend/regex/meson.build
 create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
 create mode 100644 src/backend/replication/logical/meson.build
 create mode 100644 src/backend/replication/meson.build
 create mode 100644 src/backend/replication/pgoutput/meson.build
 create mode 100644 src/backend/rewrite/meson.build
 create mode 100644 src/backend/snowball/meson.build
 create mode 100644 src/backend/statistics/meson.build
 create mode 100644 src/backend/storage/buffer/meson.build
 create mode 100644 src/backend/storage/file/meson.build
 create mode 100644 src/backend/storage/freespace/meson.build
 create mode 100644 src/backend/storage/ipc/meson.build
 create mode 100644 src/backend/storage/large_object/meson.build
 create mode 100644 src/backend/storage/lmgr/meson.build
 create mode 100644 src/backend/storage/meson.build
 create mode 100644 src/backend/storage/page/meson.build
 create mode 100644 src/backend/storage/smgr/meson.build
 create mode 100644 src/backend/storage/sync/meson.build
 create mode 100644 src/backend/tcop/meson.build
 create mode 100644 src/backend/tsearch/meson.build
 create mode 100644 src/backend/utils/activity/meson.build
 create mode 100644 src/backend/utils/adt/meson.build
 create mode 100644 src/backend/utils/cache/meson.build
 create mode 100644 src/backend/utils/error/meson.build
 create mode 100644 src/backend/utils/fmgr/meson.build
 create mode 100644 src/backend/utils/hash/meson.build
 create mode 100644 src/backend/utils/init/meson.build
 create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
 create mode 100644 src/backend/utils/mb/meson.build
 create mode 100644 src/backend/utils/meson.build
 create mode 100644 src/backend/utils/misc/meson.build
 create mode 100644 src/backend/utils/mmgr/meson.build
 create mode 100644 src/backend/utils/resowner/meson.build
 create mode 100644 src/backend/utils/sort/meson.build
 create mode 100644 src/backend/utils/time/meson.build
 create mode 100644 src/fe_utils/meson.build
 create mode 100644 src/bin/initdb/meson.build
 create mode 100644 src/bin/initdb/po/meson.build
 create mode 100644 src/bin/meson.build
 create mode 100644 src/bin/pg_amcheck/meson.build
 create mode 100644 src/bin/pg_amcheck/po/meson.build
 create mode 100644 src/bin/pg_archivecleanup/meson.build
 create mode 100644 src/bin/pg_archivecleanup/po/meson.build
 create mode 100644 src/bin/pg_basebackup/meson.build
 create mode 100644 src/bin/pg_basebackup/po/meson.build
 create mode 100644 src/bin/pg_checksums/meson.build
 create mode 100644 src/bin/pg_checksums/po/meson.build
 create mode 100644 src/bin/pg_config/meson.build
 create mode 100644 src/bin/pg_config/po/meson.build
 create mode 100644 src/bin/pg_controldata/meson.build
 create mode 100644 src/bin/pg_controldata/po/meson.build
 create mode 100644 src/bin/pg_ctl/meson.build
 create mode 100644 src/bin/pg_ctl/po/meson.build
 create mode 100644 src/bin/pg_dump/meson.build
 create mode 100644 src/bin/pg_dump/po/meson.build
 create mode 100644 src/bin/pg_resetwal/meson.build
 create mode 100644 src/bin/pg_resetwal/po/meson.build
 create mode 100644 src/bin/pg_rewind/meson.build
 create mode 100644 src/bin/pg_rewind/po/meson.build
 create mode 100644 src/bin/pg_test_fsync/meson.build
 create mode 100644 src/bin/pg_test_fsync/po/meson.build
 create mode 100644 src/bin/pg_test_timing/meson.build
 create mode 100644 src/bin/pg_test_timing/po/meson.build
 create mode 100644 src/bin/pg_upgrade/meson.build
 create mode 100644 src/bin/pg_upgrade/po/meson.build
 create mode 100644 src/bin/pg_verifybackup/meson.build
 create mode 100644 src/bin/pg_verifybackup/po/meson.build
 create mode 100644 src/bin/pg_waldump/meson.build
 create mode 100644 src/bin/pg_waldump/po/meson.build
 create mode 100644 src/bin/pgbench/meson.build
 create mode 100644 src/bin/pgevent/meson.build
 create mode 100644 src/bin/psql/meson.build
 create mode 100644 src/bin/psql/po/meson.build
 create mode 100644 src/bin/scripts/meson.build
 create mode 100644 src/bin/scripts/po/meson.build
 create mode 100644 src/interfaces/libpq/meson.build
 create mode 100644 src/interfaces/libpq/po/meson.build
 create mode 100644 src/interfaces/libpq/test/meson.build
 create mode 100644 src/pl/meson.build
 create mode 100644 src/pl/plperl/meson.build
 create mode 100644 src/pl/plperl/po/meson.build
 create mode 100644 src/pl/plpgsql/meson.build
 create mode 100644 src/pl/plpgsql/src/meson.build
 create mode 100644 src/pl/plpgsql/src/po/meson.build
 create mode 100644 src/pl/plpython/meson.build
 create mode 100644 src/pl/plpython/po/meson.build
 create mode 100644 src/pl/tcl/meson.build
 create mode 100644 src/pl/tcl/po/meson.build
 create mode 100644 contrib/adminpack/meson.build
 create mode 100644 contrib/amcheck/meson.build
 create mode 100644 contrib/auth_delay/meson.build
 create mode 100644 contrib/auto_explain/meson.build
 create mode 100644 contrib/basebackup_to_shell/meson.build
 create mode 100644 contrib/basic_archive/meson.build
 create mode 100644 contrib/bloom/meson.build
 create mode 100644 contrib/bool_plperl/meson.build
 create mode 100644 contrib/btree_gin/meson.build
 create mode 100644 contrib/btree_gist/meson.build
 create mode 100644 contrib/citext/meson.build
 create mode 100644 contrib/cube/meson.build
 create mode 100644 contrib/dblink/meson.build
 create mode 100644 contrib/dict_int/meson.build
 create mode 100644 contrib/dict_xsyn/meson.build
 create mode 100644 contrib/earthdistance/meson.build
 create mode 100644 contrib/file_fdw/meson.build
 create mode 100644 contrib/fuzzystrmatch/meson.build
 create mode 100644 contrib/hstore/meson.build
 create mode 100644 contrib/hstore_plperl/meson.build
 create mode 100644 contrib/hstore_plpython/meson.build
 create mode 100644 contrib/intagg/meson.build
 create mode 100644 contrib/intarray/meson.build
 create mode 100644 contrib/isn/meson.build
 create mode 100644 contrib/jsonb_plperl/meson.build
 create mode 100644 contrib/jsonb_plpython/meson.build
 create mode 100644 contrib/lo/meson.build
 create mode 100644 contrib/ltree/meson.build
 create mode 100644 contrib/ltree_plpython/meson.build
 create mode 100644 contrib/meson.build
 create mode 100644 contrib/oid2name/meson.build
 create mode 100644 contrib/old_snapshot/meson.build
 create mode 100644 contrib/pageinspect/meson.build
 create mode 100644 contrib/passwordcheck/meson.build
 create mode 100644 contrib/pg_buffercache/meson.build
 create mode 100644 contrib/pg_freespacemap/meson.build
 create mode 100644 contrib/pg_prewarm/meson.build
 create mode 100644 contrib/pg_stat_statements/meson.build
 create mode 100644 contrib/pg_surgery/meson.build
 create mode 100644 contrib/pg_trgm/meson.build
 create mode 100644 contrib/pg_visibility/meson.build
 create mode 100644 contrib/pg_walinspect/meson.build
 create mode 100644 contrib/pgcrypto/meson.build
 create mode 100644 contrib/pgrowlocks/meson.build
 create mode 100644 contrib/pgstattuple/meson.build
 create mode 100644 contrib/postgres_fdw/meson.build
 create mode 100644 contrib/seg/meson.build
 create mode 100644 contrib/sepgsql/meson.build
 create mode 100644 contrib/spi/meson.build
 create mode 100644 contrib/sslinfo/meson.build
 create mode 100644 contrib/tablefunc/meson.build
 create mode 100644 contrib/tcn/meson.build
 create mode 100644 contrib/test_decoding/meson.build
 create mode 100644 contrib/tsm_system_rows/meson.build
 create mode 100644 contrib/tsm_system_time/meson.build
 create mode 100644 contrib/unaccent/meson.build
 create mode 100644 contrib/uuid-ossp/meson.build
 create mode 100644 contrib/vacuumlo/meson.build
 create mode 100644 contrib/xml2/meson.build
 create mode 100644 src/interfaces/ecpg/compatlib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/po/meson.build
 create mode 100644 src/interfaces/ecpg/include/meson.build
 create mode 100644 src/interfaces/ecpg/meson.build
 create mode 100644 src/interfaces/ecpg/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/po/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_informix/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_oracle/meson.build
 create mode 100644 src/interfaces/ecpg/test/connect/meson.build
 create mode 100644 src/interfaces/ecpg/test/meson.build
 create mode 100644 src/interfaces/ecpg/test/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/test/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/test/sql/meson.build
 create mode 100644 src/interfaces/ecpg/test/thread/meson.build
 create mode 100644 src/interfaces/meson.build
 create mode 100644 doc/src/sgml/meson.build
 create mode 100644 doc/src/sgml/resolv.xsl
 create mode 100644 doc/src/sgml/version.sgml.in
 create mode 100644 src/test/authentication/meson.build
 create mode 100644 src/test/icu/meson.build
 create mode 100644 src/test/isolation/meson.build
 create mode 100644 src/test/kerberos/meson.build
 create mode 100644 src/test/ldap/meson.build
 create mode 100644 src/test/meson.build
 create mode 100644 src/test/modules/brin/meson.build
 create mode 100644 src/test/modules/commit_ts/meson.build
 create mode 100644 src/test/modules/delay_execution/meson.build
 create mode 100644 src/test/modules/dummy_index_am/meson.build
 create mode 100644 src/test/modules/dummy_seclabel/meson.build
 create mode 100644 src/test/modules/libpq_pipeline/meson.build
 create mode 100644 src/test/modules/meson.build
 create mode 100644 src/test/modules/plsample/meson.build
 create mode 100644 src/test/modules/snapshot_too_old/meson.build
 create mode 100644 src/test/modules/spgist_name_ops/meson.build
 create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
 create mode 100644 src/test/modules/test_bloomfilter/meson.build
 create mode 100644 src/test/modules/test_ddl_deparse/meson.build
 create mode 100644 src/test/modules/test_extensions/meson.build
 create mode 100644 src/test/modules/test_ginpostinglist/meson.build
 create mode 100644 src/test/modules/test_integerset/meson.build
 create mode 100644 src/test/modules/test_lfind/meson.build
 create mode 100644 src/test/modules/test_misc/meson.build
 create mode 100644 src/test/modules/test_oat_hooks/meson.build
 create mode 100644 src/test/modules/test_parser/meson.build
 create mode 100644 src/test/modules/test_pg_dump/meson.build
 create mode 100644 src/test/modules/test_predtest/meson.build
 create mode 100644 src/test/modules/test_rbtree/meson.build
 create mode 100644 src/test/modules/test_regex/meson.build
 create mode 100644 src/test/modules/test_rls_hooks/meson.build
 create mode 100644 src/test/modules/test_shm_mq/meson.build
 create mode 100644 src/test/modules/unsafe_tests/meson.build
 create mode 100644 src/test/modules/worker_spi/meson.build
 create mode 100644 src/test/recovery/meson.build
 create mode 100644 src/test/regress/meson.build
 create mode 100644 src/test/ssl/meson.build
 create mode 100644 src/test/subscription/meson.build
 create mode 100644 conversion_helpers.txt
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 src/meson.build
 create mode 100644 src/timezone/meson.build
 create mode 100644 src/timezone/tznames/meson.build
 create mode 100755 src/tools/find_meson
 create mode 100644 src/tools/irlink
 create mode 100755 src/tools/pgflex
 create mode 100755 src/tools/rcgen
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py
 create mode 100755 src/tools/testwrap

diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..9627e082344
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,142 @@
+catalog_headers = [
+  'pg_proc.h',
+  'pg_type.h',
+  'pg_attribute.h',
+  'pg_class.h',
+  'pg_attrdef.h',
+  'pg_constraint.h',
+  'pg_inherits.h',
+  'pg_index.h',
+  'pg_operator.h',
+  'pg_opfamily.h',
+  'pg_opclass.h',
+  'pg_am.h',
+  'pg_amop.h',
+  'pg_amproc.h',
+  'pg_language.h',
+  'pg_largeobject_metadata.h',
+  'pg_largeobject.h',
+  'pg_aggregate.h',
+  'pg_statistic.h',
+  'pg_statistic_ext.h',
+  'pg_statistic_ext_data.h',
+  'pg_rewrite.h',
+  'pg_trigger.h',
+  'pg_event_trigger.h',
+  'pg_description.h',
+  'pg_cast.h',
+  'pg_enum.h',
+  'pg_namespace.h',
+  'pg_conversion.h',
+  'pg_depend.h',
+  'pg_database.h',
+  'pg_db_role_setting.h',
+  'pg_tablespace.h',
+  'pg_authid.h',
+  'pg_auth_members.h',
+  'pg_shdepend.h',
+  'pg_shdescription.h',
+  'pg_ts_config.h',
+  'pg_ts_config_map.h',
+  'pg_ts_dict.h',
+  'pg_ts_parser.h',
+  'pg_ts_template.h',
+  'pg_extension.h',
+  'pg_foreign_data_wrapper.h',
+  'pg_foreign_server.h',
+  'pg_user_mapping.h',
+  'pg_foreign_table.h',
+  'pg_policy.h',
+  'pg_replication_origin.h',
+  'pg_default_acl.h',
+  'pg_init_privs.h',
+  'pg_seclabel.h',
+  'pg_shseclabel.h',
+  'pg_collation.h',
+  'pg_parameter_acl.h',
+  'pg_partitioned_table.h',
+  'pg_range.h',
+  'pg_transform.h',
+  'pg_sequence.h',
+  'pg_publication.h',
+  'pg_publication_namespace.h',
+  'pg_publication_rel.h',
+  'pg_subscription.h',
+  'pg_subscription_rel.h',
+]
+
+bki_data = [
+  'pg_aggregate.dat',
+  'pg_am.dat',
+  'pg_amop.dat',
+  'pg_amproc.dat',
+  'pg_authid.dat',
+  'pg_cast.dat',
+  'pg_class.dat',
+  'pg_collation.dat',
+  'pg_conversion.dat',
+  'pg_database.dat',
+  'pg_language.dat',
+  'pg_namespace.dat',
+  'pg_opclass.dat',
+  'pg_operator.dat',
+  'pg_opfamily.dat',
+  'pg_proc.dat',
+  'pg_range.dat',
+  'pg_tablespace.dat',
+  'pg_ts_config.dat',
+  'pg_ts_config_map.dat',
+  'pg_ts_dict.dat',
+  'pg_ts_parser.dat',
+  'pg_ts_template.dat',
+  'pg_type.dat',
+]
+bki_data_f = files(bki_data)
+
+
+input = []
+output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
+output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+
+foreach h : catalog_headers
+  fname = h.split('.h')[0]+'_d.h'
+  input += files(h)
+  output_files += fname
+  output_install += dir_include_server / 'catalog'
+endforeach
+
+generated_catalog_headers = custom_target('generated_catalog_headers',
+  output: output_files,
+  install_dir: output_install,
+  input: input,
+  depend_files: bki_data_f,
+  build_by_default: true,
+  install: true,
+  command: [
+    perl,
+    files('../../backend/catalog/genbki.pl'),
+    '--include-path=@SOURCE_ROOT@/src/include',
+    '--set-version='+pg_version_major.to_string(),
+    '--output=@OUTDIR@', '@INPUT@'
+  ],
+)
+
+generated_headers += generated_catalog_headers.to_list()
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += { 'src/backend/catalog': output_files + ['bki-stamp']}
+generated_sources_ac += { 'src/include/catalog': ['header-stamp']}
+
+# 'reformat-dat-files' is a convenience target for rewriting the
+# catalog data files in our standard format.  This includes collapsing
+# out any entries that are redundant with a BKI_DEFAULT annotation.
+run_target('reformat-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f],
+)
+
+# 'expand-dat-files' is a convenience target for expanding out all
+# default values in the catalog data files.  This should be run before
+# altering or removing any BKI_DEFAULT annotation.
+run_target('expand-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f, '--full-tuples'],
+)
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..eaba831f3cc
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,175 @@
+pg_config_ext = configure_file(input: 'pg_config_ext.h.meson',
+  output : 'pg_config_ext.h',
+  configuration : cdata,
+  install: true,
+  install_dir: dir_include)
+configure_files += pg_config_ext
+
+pg_config_os = configure_file(
+  output : 'pg_config_os.h',
+  input: files('port/@0@.h'.format(host_system)),
+  install: true,
+  install_dir : dir_include,
+  copy : true)
+configure_files += pg_config_os
+
+pg_config = configure_file(
+  output : 'pg_config.h',
+  install : true,
+  install_dir : dir_include,
+  configuration : cdata)
+configure_files += pg_config
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', dir_prefix / dir_bin)
+config_paths_data.set_quoted('PGSHAREDIR', dir_prefix / dir_data)
+config_paths_data.set_quoted('SYSCONFDIR', dir_prefix / dir_sysconf)
+config_paths_data.set_quoted('INCLUDEDIR', dir_prefix / dir_include)
+config_paths_data.set_quoted('PKGINCLUDEDIR', dir_prefix / dir_include_pkg)
+config_paths_data.set_quoted('INCLUDEDIRSERVER', dir_prefix / dir_include_server)
+config_paths_data.set_quoted('LIBDIR', dir_prefix / dir_lib)
+config_paths_data.set_quoted('PKGLIBDIR', dir_prefix / dir_lib_pkg)
+config_paths_data.set_quoted('LOCALEDIR', dir_prefix / dir_locale)
+config_paths_data.set_quoted('DOCDIR', dir_prefix / dir_doc)
+config_paths_data.set_quoted('HTMLDIR', dir_prefix / dir_doc_html)
+config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
+
+
+var_cc = ' '.join(cc.cmd_array())
+var_cpp = ' '.join(g_c_args)
+var_cflags = ' '.join(functional_cflags + warning_cflags)
+var_cxxflags = ' '.join(functional_cxxflags + warning_cxxflags)
+var_cppflags = ' '.join(g_c_args)
+var_cflags_sl = '-fPIC' #FIXME
+var_ldflags = ' '.join(ldflags)
+# FIXME:
+var_ldflags_sl = ''
+var_ldflags_ex = ''
+# FIXME - some extensions might directly use symbols from one of libs. If
+# that symbol isn't used by postgres, and statically linked, it'll cause an
+# undefined symbol at runtime. And obviously it'll cause problems for
+# executables, although those are probably less common.
+var_libs = ''
+
+
+pg_config_paths = configure_file(
+  output: 'pg_config_paths.h',
+  configuration: config_paths_data,
+  install: false
+)
+configure_files += pg_config_paths
+
+install_headers(
+  'pg_config_manual.h',
+  'postgres_ext.h',
+  'pg_config_manual.h',
+)
+
+install_headers(
+  'libpq/libpq-fs.h',
+  install_dir: dir_include / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'port.h',
+  'postgres_fe.h',
+  install_dir: dir_include_internal
+)
+
+install_headers(
+  'libpq/pqcomm.h',
+  install_dir: dir_include_internal / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'fmgr.h',
+  'funcapi.h',
+  'getaddrinfo.h',
+  'getopt_long.h',
+  'miscadmin.h',
+  'pg_config_manual.h',
+  'pg_getopt.h',
+  'pg_trace.h',
+  'pgstat.h',
+  'pgtar.h',
+  'pgtime.h',
+  'port.h',
+  'postgres.h',
+  'postgres_ext.h',
+  'postgres_fe.h',
+  'rusagestub.h',
+  'windowapi.h',
+  pg_config_ext,
+  pg_config_os,
+  pg_config,
+  install_dir: dir_include_server,
+)
+
+subdir('catalog')
+subdir('nodes')
+subdir('parser')
+subdir('pch')
+subdir('storage')
+subdir('utils')
+
+header_subdirs = [
+  'access',
+  'catalog',
+  'bootstrap',
+  'commands',
+  'common',
+  'datatype',
+  'executor',
+  'fe_utils',
+  'foreign',
+  'jit',
+  'lib',
+  'libpq',
+  'mb',
+  'nodes',
+  'optimizer',
+  'parser',
+  'partitioning',
+  'postmaster',
+  'regex',
+  'replication',
+  'rewrite',
+  'statistics',
+  'storage',
+  'tcop',
+  'snowball',
+  'tsearch',
+  'utils',
+  'port',
+  'portability',
+]
+
+# XXX: installing headers this way has the danger of installing editor files
+# etc, unfortunately install_subdir() doesn't allow including / excluding by
+# pattern currently.
+foreach d : header_subdirs
+  if d == 'catalog'
+    continue
+  endif
+  install_subdir(d, install_dir: dir_include_server,
+                 exclude_files: ['.gitignore', 'meson.build'])
+endforeach
+
+install_subdir('catalog',
+  install_dir: dir_include_server,
+  exclude_files: [
+    '.gitignore',
+    'Makefile',
+    'duplicate_oids',
+    'meson.build',
+    'reformat_dat_file.pl',
+    'renumber_oids.pl',
+    'unused_oids',
+  ] + bki_data,
+)
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/include': ['stamp-h', 'stamp-ext-h']}
diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build
new file mode 100644
index 00000000000..4575e081560
--- /dev/null
+++ b/src/include/nodes/meson.build
@@ -0,0 +1,58 @@
+node_support_input_i = [
+ 'nodes/nodes.h',
+ 'nodes/primnodes.h',
+ 'nodes/parsenodes.h',
+ 'nodes/pathnodes.h',
+ 'nodes/plannodes.h',
+ 'nodes/execnodes.h',
+ 'access/amapi.h',
+ 'access/sdir.h',
+ 'access/tableam.h',
+ 'access/tsmapi.h',
+ 'commands/event_trigger.h',
+ 'commands/trigger.h',
+ 'executor/tuptable.h',
+ 'foreign/fdwapi.h',
+ 'nodes/extensible.h',
+ 'nodes/lockoptions.h',
+ 'nodes/replnodes.h',
+ 'nodes/supportnodes.h',
+ 'nodes/value.h',
+ 'utils/rel.h',
+]
+
+node_support_input = []
+foreach i : node_support_input_i
+  node_support_input += meson.source_root() / 'src' / 'include' / i
+endforeach
+
+node_support_output = [
+  'nodetags.h',
+  'outfuncs.funcs.c', 'outfuncs.switch.c',
+  'readfuncs.funcs.c', 'readfuncs.switch.c',
+  'copyfuncs.funcs.c', 'copyfuncs.switch.c',
+  'equalfuncs.funcs.c', 'equalfuncs.switch.c',
+]
+node_support_install = [
+  dir_include_server / 'nodes',
+  false, false,
+  false, false,
+  false, false,
+  false, false,
+]
+
+generated_nodes = custom_target('nodetags.h',
+  input: node_support_input,
+  output: node_support_output,
+  command: [
+    perl, files('../../backend/nodes/gen_node_support.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'],
+  install: true,
+  install_dir: node_support_install,
+)
+generated_headers += generated_nodes[0]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/nodes': node_support_output + ['node-support-stamp']}
+generated_sources_ac += {'src/include/nodes': ['header-stamp']}
diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build
new file mode 100644
index 00000000000..942d9acd733
--- /dev/null
+++ b/src/include/parser/meson.build
@@ -0,0 +1,14 @@
+backend_parser = custom_target('gram',
+  input: [files('../../backend/parser/gram.y')],
+  output: ['gram.c', 'gram.h'],
+  command: [bison_cmd, '-d', '@INPUT@'],
+  install: true,
+  # Only install gram.h, not gram.c
+  install_dir: [false, dir_include_server / 'parser'],
+)
+
+backend_parser_code = backend_parser[0]
+backend_parser_header = backend_parser[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/parser': ['gram.c', 'gram.h']}
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..8fb0a1d6b56
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,3 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in.  This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..2f0434a6614
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,15 @@
+lwlocknames = custom_target('lwlocknames',
+  input : files('../../backend/storage/lmgr/lwlocknames.txt'),
+  output : ['lwlocknames.h', 'lwlocknames.c'],
+  command : [perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@'],
+  build_by_default: true,
+  install: true,
+  install_dir: [dir_include_server / 'storage', false],
+)
+
+lwlocknames_h = lwlocknames[0]
+
+generated_backend_headers += lwlocknames_h
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.c', 'lwlocknames.h']}
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..3bc22e2e37e
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,51 @@
+errcodes = custom_target('errcodes',
+  input : files('../../backend/utils/errcodes.txt'),
+  output : ['errcodes.h'],
+  command : [perl, files('../../backend/utils/generate-errcodes.pl'), '--outfile', '@OUTPUT@', '@INPUT@'],
+  install: true,
+  install_dir: dir_include_server/'utils',
+)
+generated_headers += errcodes
+
+if dtrace.found()
+  probes_tmp = custom_target('probes.h.tmp',
+    input: files('../../backend/utils/probes.d'),
+    output : 'probes.h.tmp',
+    command : [dtrace, '-C', '-h', '-s', '@INPUT@', '-o', '@OUTPUT@'],
+  )
+  probes = custom_target('probes.h',
+    input: probes_tmp[0],
+    output : 'probes.h',
+    capture: true,
+    command : [sed, '-f', files('../../backend/utils/postprocess_dtrace.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server/'utils',
+  )
+else
+  probes = custom_target('probes.h',
+    input: files('../../backend/utils/probes.d'),
+    output : 'probes.h',
+    capture: true,
+    command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server/'utils',
+  )
+endif
+
+generated_backend_headers += probes
+
+fmgrtab_output = ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c']
+fmgrtab_target = custom_target('fmgrtab',
+  input: '../catalog/pg_proc.dat',
+  output : fmgrtab_output,
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'],
+  install: true,
+  install_dir: [dir_include_server/'utils', dir_include_server/'utils', false],
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += { 'src/backend/utils': fmgrtab_output + ['errcodes.h', 'probes.h', 'fmgr-stamp']}
+generated_sources_ac += { 'src/include/utils': ['header-stamp']}
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..9d66d77b033
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,176 @@
+common_sources = files(
+  'archive.c',
+  'base64.c',
+  'checksum_helper.c',
+  'compression.c',
+  'controldata_utils.c',
+  'encnames.c',
+  'exec.c',
+  'file_perm.c',
+  'file_utils.c',
+  'hashfn.c',
+  'ip.c',
+  'jsonapi.c',
+  'keywords.c',
+  'kwlookup.c',
+  'link-canary.c',
+  'md5_common.c',
+  'pg_get_line.c',
+  'pg_lzcompress.c',
+  'pg_prng.c',
+  'pgfnames.c',
+  'psprintf.c',
+  'relpath.c',
+  'rmtree.c',
+  'saslprep.c',
+  'scram-common.c',
+  'string.c',
+  'stringinfo.c',
+  'unicode_norm.c',
+  'username.c',
+  'wait_error.c',
+  'wchar.c',
+)
+
+if ssl.found()
+  common_sources += files(
+    'cryptohash_openssl.c',
+    'hmac_openssl.c',
+    'protocol_openssl.c',
+  )
+else
+  common_sources += files(
+    'cryptohash.c',
+    'hmac.c',
+    'md5.c',
+    'sha1.c',
+    'sha2.c',
+  )
+endif
+
+common_kwlist = custom_target('kwlist',
+  input: files('../include/parser/kwlist.h'),
+  output: 'kwlist_d.h',
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+      '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+generated_sources += common_kwlist
+common_sources += common_kwlist
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+  'd2s.c',
+  'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+  ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+config_info_sources = files('config_info.c',)
+config_info_cflags = [
+  '-DVAL_CC="@0@"'.format(var_cc),
+  '-DVAL_CPPFLAGS="@0@"'.format(var_cppflags),
+  '-DVAL_CFLAGS="@0@"'.format(var_cflags),
+  '-DVAL_CFLAGS_SL="@0@"'.format(var_cflags_sl),
+  '-DVAL_LDFLAGS="@0@"'.format(var_ldflags),
+  '-DVAL_LDFLAGS_EX="@0@"'.format(var_ldflags_ex),
+  '-DVAL_LDFLAGS_SL="@0@"'.format(var_ldflags_sl),
+  '-DVAL_LIBS="@0@"'.format(var_libs),
+]
+
+# Some files need to be built with different cflags. The different sets are
+# defined here.
+common_cflags = {
+  'ryu': ryu_cflags,
+  'config_info': config_info_cflags,
+}
+common_sources_cflags = {
+  'ryu': ryu_sources,
+  'config_info': config_info_sources
+}
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+  'fe_memutils.c',
+  'restricted_token.c',
+  'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+  'logging.c',
+)
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+#
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+#
+# For the server build of pgcommon, depend on lwlocknames_h, because at least
+# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a
+# layering violation, but ...
+pgcommon = {}
+pgcommon_variants = {
+  '_srv' : internal_lib_args + {
+    'sources': common_sources + [lwlocknames_h],
+    'dependencies': [backend_common_code],
+   },
+  '' : default_lib_args + {
+    'sources': common_sources_frontend_static,
+    'dependencies': [frontend_common_code],
+   },
+  '_shlib' : default_lib_args + {
+    'pic': true,
+    'sources': common_sources_frontend_shlib,
+    'dependencies': [frontend_common_code],
+   },
+}
+
+foreach name, opts : pgcommon_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources: common_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + common_cflags[cflagname]
+    cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      c_pch: pch_c_h,
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'sources': sources,
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgcommon@0@'.format(name),
+      link_with: cflag_libs,
+      c_pch: pch_c_h,
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgcommon += {name: lib}
+endforeach
+
+common_srv = pgcommon['_srv']
+common_shlib = pgcommon['_shlib']
+common_static = pgcommon['']
+
+subdir('unicode')
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
new file mode 100644
index 00000000000..cc25f881875
--- /dev/null
+++ b/src/common/unicode/meson.build
@@ -0,0 +1,101 @@
+# These files are part of the Unicode Character Database. Download
+# them on demand.
+
+UNICODE_VERSION = '14.0.0'
+
+unicode_data = {}
+unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
+
+if not wget.found()
+  subdir_done()
+endif
+
+foreach f : ['UnicodeData.txt', 'EastAsianWidth.txt', 'DerivedNormalizationProps.txt', 'CompositionExclusions.txt', 'NormalizationTest.txt']
+  url = unicode_baseurl.format(UNICODE_VERSION, f)
+  target = custom_target(f,
+    output: f,
+    command: [wget, wget_flags, url],
+    build_by_default: false,
+  )
+  unicode_data += {f: target}
+endforeach
+
+
+update_unicode_targets = []
+
+update_unicode_targets += \
+  custom_target('unicode_norm_table.h',
+    input: [unicode_data['UnicodeData.txt'], unicode_data['CompositionExclusions.txt']],
+    output: ['unicode_norm_table.h', 'unicode_norm_hashfunc.h'],
+    command: [
+      perl, files('generate-unicode_norm_table.pl'),
+      '--outdir', '@OUTDIR@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_combining_table.h',
+    input: [unicode_data['UnicodeData.txt']],
+    output: ['unicode_combining_table.h'],
+    command: [perl, files('generate-unicode_combining_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_east_asian_fw_table.h',
+    input: [unicode_data['EastAsianWidth.txt']],
+    output: ['unicode_east_asian_fw_table.h'],
+    command: [perl, files('generate-unicode_east_asian_fw_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_normprops_table.h',
+    input: [unicode_data['DerivedNormalizationProps.txt']],
+    output: ['unicode_normprops_table.h'],
+    command: [perl, files('generate-unicode_normprops_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+norm_test_table = custom_target('norm_test_table.h',
+    input: [unicode_data['NormalizationTest.txt']],
+    output: ['norm_test_table.h'],
+    command: [perl, files('generate-norm_test_table.pl'), '@INPUT@', '@OUTPUT@'],
+    build_by_default: false,
+  )
+
+inc = include_directories('.')
+
+norm_test = executable('norm_test',
+  ['norm_test.c', norm_test_table],
+  dependencies: [frontend_port_code],
+  include_directories: inc,
+  link_with: [pgport_static, common_static],
+  build_by_default: false,
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+if not meson.is_cross_build()
+  norm_test_valid = custom_target('norm_test.valid',
+    output: 'norm_test.valid',
+    depends: update_unicode_targets,
+    command: [norm_test],
+    build_by_default: false,
+    capture: true,
+  )
+
+  run_target('update-unicode',
+    depends: norm_test_valid,
+    command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+  )
+else
+  run_target('update-unicode',
+    depends: update_unicode_targets,
+    command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+  )
+endif
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..d1ed7f1c55f
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,187 @@
+pgport_sources = [
+  'bsearch_arg.c',
+  'chklocale.c',
+  'inet_net_ntop.c',
+  'noblock.c',
+  'path.c',
+  'pg_bitutils.c',
+  'pg_strong_random.c',
+  'pgcheckdir.c',
+  'pgmkdirp.c',
+  'pgsleep.c',
+  'pgstrcasecmp.c',
+  'pgstrsignal.c',
+  'pqsignal.c',
+  'qsort.c',
+  'qsort_arg.c',
+  'quotes.c',
+  'snprintf.c',
+  'strerror.c',
+  'tar.c',
+  'thread.c',
+]
+
+if host_system == 'win32'
+  pgport_sources += files(
+    'dirmod.c',
+    'getrusage.c',
+    'kill.c',
+    'open.c',
+    'system.c',
+    'win32dlopen.c',
+    'win32env.c',
+    'win32error.c',
+    'win32fdatasync.c',
+    'win32link.c',
+    'win32ntdll.c',
+    'win32pread.c',
+    'win32pwrite.c',
+    'win32security.c',
+    'win32setlocale.c',
+    'win32stat.c',
+  )
+endif
+
+if cc.get_id() == 'msvc'
+  pgport_sources += files(
+    'win32gettimeofday.c',
+    'dirent.c',
+  )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+    ['explicit_bzero'],
+    ['getaddrinfo'],
+    ['getopt'],
+    ['getopt_long'],
+    ['getpeereid'],
+    ['inet_aton'],
+    ['mkdtemp'],
+    ['preadv', 'HAVE_DECL_PREADV'],
+    ['pwritev', 'HAVE_DECL_PWRITEV'],
+    ['strlcat'],
+    ['strlcpy'],
+    ['strnlen'],
+]
+
+if host_system != 'win32'
+   replace_funcs_neg += [['pthread_barrier_wait']]
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+  # x86/x64
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # arm / aarch64
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # generic fallback
+  ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
+]
+
+pgport_cflags = {'crc': cflags_crc}
+pgport_sources_cflags = {'crc': []}
+
+foreach f : replace_funcs_neg
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'false' or val == '0'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+foreach f : replace_funcs_pos
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'true' or val == '1'
+    src = files(filename)
+    if f.length() > 2
+      pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
+    else
+      pgport_sources += src
+    endif
+  endif
+endforeach
+
+
+if (host_system == 'win32' or host_system == 'cygwin') and \
+  (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+  # Cygwin and (apparently, based on test results) Mingw both
+  # have a broken strtof(), so substitute its implementation.
+  # That's not a perfect fix, since it doesn't avoid double-rounding,
+  # but we have no better options.
+  pgport_sources += files('strtof.c')
+  message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+    host_system, cc.get_id(), cc.version()))
+endif
+
+
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+pgport = {}
+pgport_variants = {
+  '_srv' : internal_lib_args + {
+    'dependencies': [backend_port_code],
+   },
+  '' : default_lib_args + {
+    'dependencies': [frontend_port_code],
+   },
+  '_shlib' : default_lib_args + {
+    'pic': true,
+    'dependencies': [frontend_port_code],
+   },
+}
+
+foreach name, opts : pgport_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources: pgport_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
+    cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
+      sources,
+      c_pch: pch_c_h,
+      kwargs: opts + {
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgport@0@'.format(name),
+      pgport_sources,
+      link_with: cflag_libs,
+      c_pch: pch_c_h,
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgport += {name: lib}
+endforeach
+
+pgport_srv = pgport['_srv']
+pgport_static = pgport['']
+pgport_shlib = pgport['_shlib']
diff --git a/src/port/win32ver.rc.in b/src/port/win32ver.rc.in
new file mode 100644
index 00000000000..eb0d45dccf1
--- /dev/null
+++ b/src/port/win32ver.rc.in
@@ -0,0 +1,41 @@
+#include <winver.h>
+#include "pg_config.h"
+
+// https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION    PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ PRODUCTVERSION PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ FILEFLAGSMASK  VS_FFI_FILEFLAGSMASK
+ FILEFLAGS      0x0L
+ FILEOS         VOS_NT_WINDOWS32
+ FILETYPE	@VFT_TYPE@
+ FILESUBTYPE    0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+  BLOCK "040904B0"			// U.S. English, Unicode
+  BEGIN
+   VALUE "CompanyName",      "PostgreSQL Global Development Group"
+   VALUE "FileDescription",  "@FILEDESC@"
+   /*
+    * XXX: In the autoconf / src/tools/msvc build this was set differently than
+    * ProductVersion below, using the current date. But that doesn't seem like a
+    * good idea, because it makes the build not reproducible and causes
+    * unnecessary rebuilds?
+    */
+   VALUE "FileVersion",      PG_VERSION
+   VALUE "InternalName",     "@NAME@"
+   VALUE "LegalCopyright", "Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California."
+   VALUE "OriginalFileName", "@NAME@.@FILEENDING@"
+   VALUE "ProductName",      "PostgreSQL"
+   VALUE "ProductVersion",   PG_VERSION
+  END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+  VALUE "Translation", 0x0409, 1200	// U.S. English, Unicode
+ END
+END
+
+IDI_ICON ICON "@ICO@"
diff --git a/config/meson.build b/config/meson.build
new file mode 100644
index 00000000000..ab19c380bd2
--- /dev/null
+++ b/config/meson.build
@@ -0,0 +1,4 @@
+install_data(
+  'install-sh', 'missing',
+  install_dir: dir_pgxs / 'config'
+)
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'brin.c',
+  'brin_bloom.c',
+  'brin_inclusion.c',
+  'brin_minmax.c',
+  'brin_minmax_multi.c',
+  'brin_pageops.c',
+  'brin_revmap.c',
+  'brin_tuple.c',
+  'brin_validate.c',
+  'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'attmap.c',
+  'bufmask.c',
+  'detoast.c',
+  'heaptuple.c',
+  'indextuple.c',
+  'printsimple.c',
+  'printtup.c',
+  'relation.c',
+  'reloptions.c',
+  'scankey.c',
+  'session.c',
+  'syncscan.c',
+  'toast_compression.c',
+  'toast_internals.c',
+  'tupconvert.c',
+  'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'ginarrayproc.c',
+  'ginbtree.c',
+  'ginbulk.c',
+  'gindatapage.c',
+  'ginentrypage.c',
+  'ginfast.c',
+  'ginget.c',
+  'gininsert.c',
+  'ginlogic.c',
+  'ginpostinglist.c',
+  'ginscan.c',
+  'ginutil.c',
+  'ginvacuum.c',
+  'ginvalidate.c',
+  'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'gist.c',
+  'gistbuild.c',
+  'gistbuildbuffers.c',
+  'gistget.c',
+  'gistproc.c',
+  'gistscan.c',
+  'gistsplit.c',
+  'gistutil.c',
+  'gistvacuum.c',
+  'gistvalidate.c',
+  'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'hash.c',
+  'hash_xlog.c',
+  'hashfunc.c',
+  'hashinsert.c',
+  'hashovfl.c',
+  'hashpage.c',
+  'hashsearch.c',
+  'hashsort.c',
+  'hashutil.c',
+  'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'heapam.c',
+  'heapam_handler.c',
+  'heapam_visibility.c',
+  'heaptoast.c',
+  'hio.c',
+  'pruneheap.c',
+  'rewriteheap.c',
+  'vacuumlazy.c',
+  'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'amapi.c',
+  'amvalidate.c',
+  'genam.c',
+  'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'nbtcompare.c',
+  'nbtdedup.c',
+  'nbtinsert.c',
+  'nbtpage.c',
+  'nbtree.c',
+  'nbtsearch.c',
+  'nbtsort.c',
+  'nbtsplitloc.c',
+  'nbtutils.c',
+  'nbtvalidate.c',
+  'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+  'brindesc.c',
+  'clogdesc.c',
+  'committsdesc.c',
+  'dbasedesc.c',
+  'genericdesc.c',
+  'gindesc.c',
+  'gistdesc.c',
+  'hashdesc.c',
+  'heapdesc.c',
+  'logicalmsgdesc.c',
+  'mxactdesc.c',
+  'nbtdesc.c',
+  'relmapdesc.c',
+  'replorigindesc.c',
+  'seqdesc.c',
+  'smgrdesc.c',
+  'spgdesc.c',
+  'standbydesc.c',
+  'tblspcdesc.c',
+  'xactdesc.c',
+  'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'spgdoinsert.c',
+  'spginsert.c',
+  'spgkdtreeproc.c',
+  'spgproc.c',
+  'spgquadtreeproc.c',
+  'spgscan.c',
+  'spgtextproc.c',
+  'spgutils.c',
+  'spgvacuum.c',
+  'spgvalidate.c',
+  'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'table.c',
+  'tableam.c',
+  'tableamapi.c',
+  'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bernoulli.c',
+  'system.c',
+  'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..c32169bd2c6
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'clog.c',
+  'commit_ts.c',
+  'generic_xlog.c',
+  'multixact.c',
+  'parallel.c',
+  'rmgr.c',
+  'slru.c',
+  'subtrans.c',
+  'timeline.c',
+  'transam.c',
+  'twophase.c',
+  'twophase_rmgr.c',
+  'varsup.c',
+  'xact.c',
+  'xlog.c',
+  'xlogarchive.c',
+  'xlogfuncs.c',
+  'xloginsert.c',
+  'xlogprefetcher.c',
+  'xlogrecovery.c',
+  'xlogstats.c',
+  'xlogutils.c',
+)
+
+# used by frontend programs to build a frontend xlogreader
+xlogreader_sources = files(
+  'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/backup/meson.build b/src/backend/backup/meson.build
new file mode 100644
index 00000000000..a09305cadfa
--- /dev/null
+++ b/src/backend/backup/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'backup_manifest.c',
+  'basebackup.c',
+  'basebackup_copy.c',
+  'basebackup_gzip.c',
+  'basebackup_lz4.c',
+  'basebackup_progress.c',
+  'basebackup_server.c',
+  'basebackup_sink.c',
+  'basebackup_target.c',
+  'basebackup_throttle.c',
+  'basebackup_zstd.c',
+)
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..c0bf0381d14
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+bootscanner = custom_target('bootscanner',
+  input: ['bootscanner.l'],
+  output: ['bootscanner.c'],
+  command: [flex_cmd, '@INPUT@'],)
+generated_sources += bootscanner
+
+generated_backend_sources += custom_target('bootparse',
+  input: ['bootparse.y', bootscanner[0]],
+  output: ['bootparse.c'],
+  command: [bison_cmd, '@INPUT0@'],)
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..08747914516
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,44 @@
+backend_sources += files(
+  'aclchk.c',
+  'catalog.c',
+  'dependency.c',
+  'heap.c',
+  'index.c',
+  'indexing.c',
+  'namespace.c',
+  'objectaccess.c',
+  'objectaddress.c',
+  'partition.c',
+  'pg_aggregate.c',
+  'pg_attrdef.c',
+  'pg_cast.c',
+  'pg_class.c',
+  'pg_collation.c',
+  'pg_constraint.c',
+  'pg_conversion.c',
+  'pg_db_role_setting.c',
+  'pg_depend.c',
+  'pg_enum.c',
+  'pg_inherits.c',
+  'pg_largeobject.c',
+  'pg_namespace.c',
+  'pg_operator.c',
+  'pg_parameter_acl.c',
+  'pg_proc.c',
+  'pg_publication.c',
+  'pg_range.c',
+  'pg_shdepend.c',
+  'pg_subscription.c',
+  'pg_type.c',
+  'storage.c',
+  'toasting.c',
+)
+
+
+install_data(
+  'information_schema.sql',
+  'sql_features.txt',
+  'system_functions.sql',
+  'system_views.sql',
+  install_dir: dir_data,
+)
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..9b350d025ff
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'aggregatecmds.c',
+  'alter.c',
+  'amcmds.c',
+  'analyze.c',
+  'async.c',
+  'cluster.c',
+  'collationcmds.c',
+  'comment.c',
+  'constraint.c',
+  'conversioncmds.c',
+  'copy.c',
+  'copyfrom.c',
+  'copyfromparse.c',
+  'copyto.c',
+  'createas.c',
+  'dbcommands.c',
+  'define.c',
+  'discard.c',
+  'dropcmds.c',
+  'event_trigger.c',
+  'explain.c',
+  'extension.c',
+  'foreigncmds.c',
+  'functioncmds.c',
+  'indexcmds.c',
+  'lockcmds.c',
+  'matview.c',
+  'opclasscmds.c',
+  'operatorcmds.c',
+  'policy.c',
+  'portalcmds.c',
+  'prepare.c',
+  'proclang.c',
+  'publicationcmds.c',
+  'schemacmds.c',
+  'seclabel.c',
+  'sequence.c',
+  'statscmds.c',
+  'subscriptioncmds.c',
+  'tablecmds.c',
+  'tablespace.c',
+  'trigger.c',
+  'tsearchcmds.c',
+  'typecmds.c',
+  'user.c',
+  'vacuum.c',
+  'vacuumparallel.c',
+  'variable.c',
+  'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+  'execAmi.c',
+  'execAsync.c',
+  'execCurrent.c',
+  'execExpr.c',
+  'execExprInterp.c',
+  'execGrouping.c',
+  'execIndexing.c',
+  'execJunk.c',
+  'execMain.c',
+  'execParallel.c',
+  'execPartition.c',
+  'execProcnode.c',
+  'execReplication.c',
+  'execSRF.c',
+  'execScan.c',
+  'execTuples.c',
+  'execUtils.c',
+  'functions.c',
+  'instrument.c',
+  'nodeAgg.c',
+  'nodeAppend.c',
+  'nodeBitmapAnd.c',
+  'nodeBitmapHeapscan.c',
+  'nodeBitmapIndexscan.c',
+  'nodeBitmapOr.c',
+  'nodeCtescan.c',
+  'nodeCustom.c',
+  'nodeForeignscan.c',
+  'nodeFunctionscan.c',
+  'nodeGather.c',
+  'nodeGatherMerge.c',
+  'nodeGroup.c',
+  'nodeHash.c',
+  'nodeHashjoin.c',
+  'nodeIncrementalSort.c',
+  'nodeIndexonlyscan.c',
+  'nodeIndexscan.c',
+  'nodeLimit.c',
+  'nodeLockRows.c',
+  'nodeMaterial.c',
+  'nodeMemoize.c',
+  'nodeMergeAppend.c',
+  'nodeMergejoin.c',
+  'nodeModifyTable.c',
+  'nodeNamedtuplestorescan.c',
+  'nodeNestloop.c',
+  'nodeProjectSet.c',
+  'nodeRecursiveunion.c',
+  'nodeResult.c',
+  'nodeSamplescan.c',
+  'nodeSeqscan.c',
+  'nodeSetOp.c',
+  'nodeSort.c',
+  'nodeSubplan.c',
+  'nodeSubqueryscan.c',
+  'nodeTableFuncscan.c',
+  'nodeTidrangescan.c',
+  'nodeTidscan.c',
+  'nodeUnique.c',
+  'nodeValuesscan.c',
+  'nodeWindowAgg.c',
+  'nodeWorktablescan.c',
+  'spi.c',
+  'tqueue.c',
+  'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..a867eb60c9f
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,41 @@
+if llvm.found()
+
+  llvmjit_sources = []
+
+  # Infrastructure
+  llvmjit_sources += files(
+    'llvmjit.c',
+    'llvmjit_error.cpp',
+    'llvmjit_inline.cpp',
+    'llvmjit_wrap.cpp',
+  )
+
+  # Code generation
+  llvmjit_sources += files(
+    'llvmjit_deform.c',
+    'llvmjit_expr.c',
+  )
+
+  llvmjit = shared_module('llvmjit',
+    llvmjit_sources,
+    kwargs: pg_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [llvm],
+    }
+  )
+
+  backend_targets += llvmjit
+
+  # Note this is intentionally not installed to bitcodedir, as it's not for
+  # inlining
+  llvmjit_types = custom_target('llvmjit_types.bc',
+    kwargs: llvm_irgen_kw + {
+      'input': 'llvmjit_types.c',
+      'output': 'llvmjit_types.bc',
+      'depends': [postgres],
+      'install': true,
+      'install_dir': dir_lib_pkg,
+    }
+  )
+  backend_targets += llvmjit_types
+
+endif
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..53292563d34
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'binaryheap.c',
+  'bipartite_match.c',
+  'bloomfilter.c',
+  'dshash.c',
+  'hyperloglog.c',
+  'ilist.c',
+  'integerset.c',
+  'knapsack.c',
+  'pairingheap.c',
+  'rbtree.c'
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..6061269ef13
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,32 @@
+backend_sources += files(
+  'auth-sasl.c',
+  'auth-scram.c',
+  'auth.c',
+  'be-fsstubs.c',
+  'be-secure-common.c',
+  'be-secure.c',
+  'crypt.c',
+  'hba.c',
+  'ifaddr.c',
+  'pqcomm.c',
+  'pqformat.c',
+  'pqmq.c',
+  'pqsignal.c',
+)
+
+if ssl.found()
+  backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+  backend_sources += files(
+    'be-secure-gssapi.c',
+    'be-gssapi-common.c'
+  )
+endif
+
+install_data(
+  'pg_hba.conf.sample',
+  'pg_ident.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..0e8a0b01f5a
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,322 @@
+backend_build_deps = [backend_code]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('backup')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+subdir('po', if_found: libintl)
+
+
+backend_link_args = []
+backend_link_depends = []
+backend_c_args = []
+
+if host_system == 'win32'
+  if cc.get_id() == 'msvc'
+    backend_link_args += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  else
+    backend_link_args += '-Wl,--stack,@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  endif
+endif
+
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+# For dtrace probes we need to invoke dtrace on all input files, before
+# linking the final executable (see more below).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+# We could do that only if either dtrace or msvc is in use, but it seems
+# easier to just always do so.
+
+postgres_lib = static_library('postgres',
+  backend_sources + timezone_sources + generated_backend_sources,
+  link_whole: backend_link_with,
+  c_pch: pch_postgres_h,
+  c_args: backend_c_args,
+  dependencies: backend_build_deps,
+  kwargs: internal_lib_args,
+)
+
+if cc.get_id() == 'msvc'
+  postgres_def = custom_target('postgres.def',
+    command: [perl, files('../tools/msvc/gendef.pl'),
+              '--arch', host_cpu,
+              '--tempdir', '@PRIVATE_DIR@',
+              '--deffile', '@OUTPUT@',
+              '@INPUT@'],
+    input: [postgres_lib, common_srv, pgport_srv],
+    output: 'postgres.def',
+    depends: [postgres_lib, common_srv, pgport_srv],
+    install: false,
+    build_by_default: false,
+  )
+
+  backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+  backend_link_depends += postgres_def
+  # Due to the way msvc and meson's precompiled headers implementation
+  # interact, we need to have symbols from the full library available. Could
+  # be restricted to b_pch=true.
+  backend_link_with += postgres_lib
+endif
+
+backend_input = []
+backend_objs = [postgres_lib.extract_all_objects(recursive: false)]
+
+# As of 1/2010:
+# The probes.o file is necessary for dtrace support on Solaris, and on recent
+# versions of systemtap.  (Older systemtap releases just produce an empty
+# file, but that's okay.)  However, macOS's dtrace doesn't use it and doesn't
+# even recognize the -G option.  So, build probes.o except on macOS.
+# This might need adjustment as other platforms add dtrace support.
+#
+# On at least linux we don't actually need to pass in all the objects, but
+# at least on FreeBSD and Solaris we have to.
+#
+# XXX: The reason we don't use the objects for generated sources is that
+# hits a meson bug. Luckily we don't don't have probes in generated
+# sources...
+if dtrace.found() and host_system != 'darwin'
+  backend_input += custom_target(
+    'probes.o',
+    input: ['utils/probes.d', postgres_lib.extract_objects(backend_sources, timezone_sources)],
+    output : 'probes.o',
+    command : [dtrace, '-C', '-G', '-o', '@OUTPUT@', '-s', '@INPUT@'],
+    install: false,
+  )
+endif
+
+postgres = executable('postgres',
+  backend_input,
+  objects: backend_objs,
+  link_args: backend_link_args,
+  link_with: backend_link_with,
+  link_depends: backend_link_depends,
+  export_dynamic: true,
+  implib: true,
+  dependencies: backend_build_deps,
+  kwargs: default_bin_args,
+)
+
+backend_targets += postgres
+
+
+pg_mod_args = default_mod_args + {
+  'dependencies': [backend_mod_code],
+  'c_args': [],
+  'cpp_args': [],
+  'link_args': [],
+  'link_with': [],
+}
+
+# only newer versions of meson know not to apply gnu_symbol_visibility=
+# inlineshidden to C code as well...
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+  pg_mod_args = pg_mod_args + {
+    'link_args': pg_mod_args['link_args'] + ['-fvisibility=hidden'],
+    'c_args': pg_mod_args['c_args'] + ['-fvisibility=hidden'],
+    'cpp_args': pg_mod_args['cpp_args'] + ['-fvisibility=hidden', '-fvisibility-inlines-hidden'],
+  }
+endif
+
+
+# Windows / MacOS link shared modules against postgres. To avoid unnecessary
+# build-time dependencies on other operating systems, only add it when
+# necessary.
+if host_system == 'win32' or host_system == 'darwin'
+  pg_mod_args += {
+    'link_with': pg_mod_args['link_with'] + [postgres],
+  }
+endif
+if host_system == 'darwin'
+  pg_mod_args += {
+    'link_args': pg_mod_args['link_args'] + ['-bundle_loader', '@0@'.format(postgres.full_path())],
+  }
+endif
+
+
+# Shared modules that, on some OSs, link against the server binary. Only enter
+# these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
+
+
+
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = []
+pg_ext_libs = [backend_mod_code, thread_dep, ldflags]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+  if incdir.startswith('src/include')
+    subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+  else
+    subincdir = ''
+  endif
+  pg_ext_subdirs += subincdir
+
+  # Add directories in source / build dir containing headers to cflags for the
+  # -uninstalled.pc
+  pg_ext_vars_uninst += ['build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+                         'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir)]
+  pg_ext_cflags += ['${build_inc@0@}'.format(i),
+                    '${src_inc@0@}'.format(i)]
+
+  i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags += functional_cflags
+
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+  pg_ext_cflags += ['-fvisibility=hidden']
+endif
+
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'dir_bin=${prefix}/@0@'.format(dir_bin)
+pg_ext_vars += 'dir_mod=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+
+
+# XXX: Define variables making it easy to define tests, too
+
+
+# Ensure that external libraries
+if host_system == 'win32'
+  if cc.get_id() == 'msvc'
+	name = 'postgres.exe.lib'
+  else
+	name = 'libpostgres.exe.a'
+  endif
+  pg_ext_libs += ['${mod_link_with}']
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format('${prefix}' / dir_bin / name)
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(meson.current_build_dir() / name)
+elif host_system == 'darwin'
+  pg_ext_libs += ['-bundle_loader', '${mod_link_with}']
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format('${prefix}' / dir_bin / 'postgres')
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(postgres.full_path())
+endif
+
+# main .pc to build extensions
+pg_ext = pkgconfig.generate(
+  name: 'postgresql-extension',
+  description: 'PostgreSQL Extension Support',
+  url: pg_url,
+
+  subdirs: pg_ext_subdirs,
+  libraries: pg_ext_libs,
+  extra_cflags: pg_ext_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+  name: 'postgresql-extension-warnings',
+  description: 'PostgreSQL Extension Support - Compiler Warnings',
+  requires: 'postgresql-extension',
+  url: pg_url,
+  extra_cflags: warning_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+###############################################################
+# emit LLVM bitcode of backend code for JIT inlining
+###############################################################
+
+if llvm.found()
+
+  # custom_target() insists on targetting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generators don't accept CustomTargetIndex as input or 'depends', nor do
+  # they like targets with more than one output. However, a custom target
+  # accepts them as input without a problem. So we have the below transitive
+  # target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: '@PLAINNAME@.bc',
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('bitcode',
+    output: ['bitcode'],
+    input: bc_backend_sources,
+    kwargs: llvm_irlink_kw,
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..1f7aa8d4a7e
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,30 @@
+backend_sources += files(
+  'bitmapset.c',
+  'extensible.c',
+  'list.c',
+  'makefuncs.c',
+  'nodeFuncs.c',
+  'nodes.c',
+  'params.c',
+  'print.c',
+  'read.c',
+  'tidbitmap.c',
+  'value.c',
+)
+
+# these include .c files generated in ../../include/nodes, seems nicer to not
+# add that as an include path for the whole backend
+nodefunc_sources = files(
+  'copyfuncs.c',
+  'equalfuncs.c',
+  'outfuncs.c',
+  'readfuncs.c',
+)
+nodefuncs = static_library('nodefuncs',
+  nodefunc_sources,
+  c_pch: pch_c_h,
+  dependencies: [backend_code],
+  include_directories: include_directories('../../include/nodes'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += nodefuncs
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'geqo_copy.c',
+  'geqo_cx.c',
+  'geqo_erx.c',
+  'geqo_eval.c',
+  'geqo_main.c',
+  'geqo_misc.c',
+  'geqo_mutation.c',
+  'geqo_ox1.c',
+  'geqo_ox2.c',
+  'geqo_pmx.c',
+  'geqo_pool.c',
+  'geqo_px.c',
+  'geqo_random.c',
+  'geqo_recombination.c',
+  'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'allpaths.c',
+  'clausesel.c',
+  'costsize.c',
+  'equivclass.c',
+  'indxpath.c',
+  'joinpath.c',
+  'joinrels.c',
+  'pathkeys.c',
+  'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'analyzejoins.c',
+  'createplan.c',
+  'initsplan.c',
+  'planagg.c',
+  'planmain.c',
+  'planner.c',
+  'setrefs.c',
+  'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'prepagg.c',
+  'prepjointree.c',
+  'prepqual.c',
+  'preptlist.c',
+  'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'appendinfo.c',
+  'clauses.c',
+  'inherit.c',
+  'joininfo.c',
+  'orclauses.c',
+  'paramassign.c',
+  'pathnode.c',
+  'placeholder.c',
+  'plancat.c',
+  'predtest.c',
+  'relnode.c',
+  'restrictinfo.c',
+  'tlist.c',
+  'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..b442f34b269
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,49 @@
+backend_sources += files(
+  'analyze.c',
+  'parse_agg.c',
+  'parse_clause.c',
+  'parse_coerce.c',
+  'parse_collate.c',
+  'parse_cte.c',
+  'parse_enr.c',
+  'parse_expr.c',
+  'parse_func.c',
+  'parse_jsontable.c',
+  'parse_merge.c',
+  'parse_node.c',
+  'parse_oper.c',
+  'parse_param.c',
+  'parse_relation.c',
+  'parse_target.c',
+  'parse_type.c',
+  'parse_utilcmd.c',
+  'scansup.c',
+)
+
+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...
+
+parser_sources = [files('parser.c')]
+
+backend_scanner = custom_target('scan',
+  input: ['scan.l'],
+  output: ['scan.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-CF', '-p', '-p', '@INPUT@'],)
+generated_sources += backend_scanner
+parser_sources += backend_scanner
+
+parser_sources += backend_parser_code
+parser_sources += backend_parser_header
+
+generated_sources += backend_parser_code
+generated_sources += backend_parser_header
+
+parser = static_library('parser',
+  parser_sources + generated_headers,
+  c_pch: pch_c_h,
+  dependencies: [backend_code],
+  kwargs: internal_lib_args,
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'partbounds.c',
+  'partdesc.c',
+  'partprune.c',
+)
diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build
new file mode 100644
index 00000000000..4ace0554680
--- /dev/null
+++ b/src/backend/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('postgres-' + pg_version_major.to_string())
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..b2c1c471544
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+   backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+   backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+   backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+   backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+   backend_sources += files('win32_shmem.c')
+endif
+
+if host_system == 'win32'
+  subdir('win32')
+endif
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/port': ['pg_sema.c', 'pg_shmem.c', 'tas.s']}
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..68fe4cc3cd0
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'crashdump.c',
+  'signal.c',
+  'socket.c',
+  'timer.c',
+)
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..293a44ca295
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'autovacuum.c',
+  'auxprocess.c',
+  'bgworker.c',
+  'bgwriter.c',
+  'checkpointer.c',
+  'fork_process.c',
+  'interrupt.c',
+  'pgarch.c',
+  'postmaster.c',
+  'shell_archive.c',
+  'startup.c',
+  'syslogger.c',
+  'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..c255f39a682
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'regcomp.c',
+  'regerror.c',
+  'regexec.c',
+  'regexport.c',
+  'regfree.c',
+  'regprefix.c'
+)
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+  'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+  libpqwalreceiver_sources,
+  kwargs: pg_mod_args + {
+    'name_prefix': 'lib',
+    'dependencies': pg_mod_args['dependencies'] + [libpq],
+  }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+  'decode.c',
+  'launcher.c',
+  'logical.c',
+  'logicalfuncs.c',
+  'message.c',
+  'origin.c',
+  'proto.c',
+  'relation.c',
+  'reorderbuffer.c',
+  'snapbuild.c',
+  'tablesync.c',
+  'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..31828346869
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,42 @@
+backend_sources += files(
+  'slot.c',
+  'slotfuncs.c',
+  'syncrep.c',
+  'walreceiver.c',
+  'walreceiverfuncs.c',
+  'walsender.c',
+)
+
+# [sync]repl_scanner is compiled as part of [sync]repl_gram. The
+# ordering is enforced by making the generation of grammar depend on
+# the scanner generation. That's unnecessarily strict, but overall
+# harmless.
+
+repl_scanner = custom_target('repl_scanner',
+  input : files('repl_scanner.l'),
+  output : ['repl_scanner.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += repl_scanner
+
+generated_backend_sources += custom_target('repl_gram',
+  input: 'repl_gram.y',
+  output: 'repl_gram.c',
+  depends: repl_scanner,
+  command: [bison_cmd, '@INPUT@'],)
+
+
+syncrep_scanner = custom_target('syncrep_scanner',
+  input: 'syncrep_scanner.l',
+  output: 'syncrep_scanner.c',
+  command: [flex_cmd, '@INPUT@'],)
+generated_sources += syncrep_scanner
+
+generated_backend_sources += custom_target('syncrep_gram',
+  input: 'syncrep_gram.y',
+  output: 'syncrep_gram.c',
+  depends: syncrep_scanner,
+  command: [bison_cmd, '@INPUT@'],)
+
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..8ff0a0c6133
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,11 @@
+pgoutput_sources = files(
+  'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+  pgoutput_sources,
+  kwargs: pg_mod_args + {
+  }
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..032e2e409b5
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'rewriteDefine.c',
+  'rewriteHandler.c',
+  'rewriteManip.c',
+  'rewriteRemove.c',
+  'rewriteSearchCycle.c',
+  'rewriteSupport.c',
+  'rowsecurity.c'
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..2a59901293b
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,85 @@
+dict_snowball_sources = files(
+  'dict_snowball.c',
+  'libstemmer/api.c',
+  'libstemmer/utilities.c',
+)
+
+dict_snowball_sources += files(
+  'libstemmer/stem_ISO_8859_1_basque.c',
+  'libstemmer/stem_ISO_8859_1_catalan.c',
+  'libstemmer/stem_ISO_8859_1_danish.c',
+  'libstemmer/stem_ISO_8859_1_dutch.c',
+  'libstemmer/stem_ISO_8859_1_english.c',
+  'libstemmer/stem_ISO_8859_1_finnish.c',
+  'libstemmer/stem_ISO_8859_1_french.c',
+  'libstemmer/stem_ISO_8859_1_german.c',
+  'libstemmer/stem_ISO_8859_1_indonesian.c',
+  'libstemmer/stem_ISO_8859_1_irish.c',
+  'libstemmer/stem_ISO_8859_1_italian.c',
+  'libstemmer/stem_ISO_8859_1_norwegian.c',
+  'libstemmer/stem_ISO_8859_1_porter.c',
+  'libstemmer/stem_ISO_8859_1_portuguese.c',
+  'libstemmer/stem_ISO_8859_1_spanish.c',
+  'libstemmer/stem_ISO_8859_1_swedish.c',
+  'libstemmer/stem_ISO_8859_2_hungarian.c',
+  'libstemmer/stem_ISO_8859_2_romanian.c',
+  'libstemmer/stem_KOI8_R_russian.c',
+  'libstemmer/stem_UTF_8_arabic.c',
+  'libstemmer/stem_UTF_8_armenian.c',
+  'libstemmer/stem_UTF_8_basque.c',
+  'libstemmer/stem_UTF_8_catalan.c',
+  'libstemmer/stem_UTF_8_danish.c',
+  'libstemmer/stem_UTF_8_dutch.c',
+  'libstemmer/stem_UTF_8_english.c',
+  'libstemmer/stem_UTF_8_finnish.c',
+  'libstemmer/stem_UTF_8_french.c',
+  'libstemmer/stem_UTF_8_german.c',
+  'libstemmer/stem_UTF_8_greek.c',
+  'libstemmer/stem_UTF_8_hindi.c',
+  'libstemmer/stem_UTF_8_hungarian.c',
+  'libstemmer/stem_UTF_8_indonesian.c',
+  'libstemmer/stem_UTF_8_irish.c',
+  'libstemmer/stem_UTF_8_italian.c',
+  'libstemmer/stem_UTF_8_lithuanian.c',
+  'libstemmer/stem_UTF_8_nepali.c',
+  'libstemmer/stem_UTF_8_norwegian.c',
+  'libstemmer/stem_UTF_8_porter.c',
+  'libstemmer/stem_UTF_8_portuguese.c',
+  'libstemmer/stem_UTF_8_romanian.c',
+  'libstemmer/stem_UTF_8_russian.c',
+  'libstemmer/stem_UTF_8_serbian.c',
+  'libstemmer/stem_UTF_8_spanish.c',
+  'libstemmer/stem_UTF_8_swedish.c',
+  'libstemmer/stem_UTF_8_tamil.c',
+  'libstemmer/stem_UTF_8_turkish.c',
+  'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+  dict_snowball_sources,
+  c_pch: pch_postgres_h,
+  kwargs: pg_mod_args + {
+    'include_directories': [stemmer_inc],
+  }
+)
+
+snowball_create = custom_target('snowball_create',
+  input: ['snowball_create.pl'],
+  output: ['snowball_create.sql'],
+  depfile: 'snowball_create.dep',
+  command: [perl, '@INPUT0@', '--depfile', '--input', '@CURRENT_SOURCE_DIR@', '--outdir', '@OUTDIR@'],
+  install: true,
+  install_dir: dir_data,
+)
+generated_sources += snowball_create
+
+install_subdir('stopwords',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true,
+)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'dependencies.c',
+  'extended_stats.c',
+  'mcv.c',
+  'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'buf_init.c',
+  'buf_table.c',
+  'bufmgr.c',
+  'freelist.c',
+  'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'buffile.c',
+  'copydir.c',
+  'fd.c',
+  'fileset.c',
+  'reinit.c',
+  'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'freespace.c',
+  'fsmpage.c',
+  'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+  'barrier.c',
+  'dsm.c',
+  'dsm_impl.c',
+  'ipc.c',
+  'ipci.c',
+  'latch.c',
+  'pmsignal.c',
+  'procarray.c',
+  'procsignal.c',
+  'shm_mq.c',
+  'shm_toc.c',
+  'shmem.c',
+  'shmqueue.c',
+  'signalfuncs.c',
+  'sinval.c',
+  'sinvaladt.c',
+  'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..68237c8a2e8
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'condition_variable.c',
+  'deadlock.c',
+  'lmgr.c',
+  'lock.c',
+  'lwlock.c',
+  'predicate.c',
+  'proc.c',
+  's_lock.c',
+  'spin.c',
+)
+
+generated_backend_sources += lwlocknames[1]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bufpage.c',
+  'checksum.c',
+  'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'md.c',
+  'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'cmdtag.c',
+  'dest.c',
+  'fastpath.c',
+  'postgres.c',
+  'pquery.c',
+  'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..4144e9befc5
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+  'dict.c',
+  'dict_ispell.c',
+  'dict_simple.c',
+  'dict_synonym.c',
+  'dict_thesaurus.c',
+  'regis.c',
+  'spell.c',
+  'to_tsany.c',
+  'ts_locale.c',
+  'ts_parse.c',
+  'ts_selfuncs.c',
+  'ts_typanalyze.c',
+  'ts_utils.c',
+  'wparser.c',
+  'wparser_def.c',
+)
+
+install_subdir('dicts',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..5b3b558a67d
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'backend_progress.c',
+  'backend_status.c',
+  'pgstat.c',
+  'pgstat_archiver.c',
+  'pgstat_bgwriter.c',
+  'pgstat_checkpointer.c',
+  'pgstat_database.c',
+  'pgstat_function.c',
+  'pgstat_relation.c',
+  'pgstat_replslot.c',
+  'pgstat_shmem.c',
+  'pgstat_slru.c',
+  'pgstat_subscription.c',
+  'pgstat_wal.c',
+  'pgstat_xact.c',
+  'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..e8727e71262
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,120 @@
+backend_sources += files(
+  'acl.c',
+  'amutils.c',
+  'array_expanded.c',
+  'array_selfuncs.c',
+  'array_typanalyze.c',
+  'array_userfuncs.c',
+  'arrayfuncs.c',
+  'arraysubs.c',
+  'arrayutils.c',
+  'ascii.c',
+  'bool.c',
+  'cash.c',
+  'char.c',
+  'cryptohashfuncs.c',
+  'date.c',
+  'datetime.c',
+  'datum.c',
+  'dbsize.c',
+  'domains.c',
+  'encode.c',
+  'enum.c',
+  'expandeddatum.c',
+  'expandedrecord.c',
+  'float.c',
+  'format_type.c',
+  'formatting.c',
+  'genfile.c',
+  'geo_ops.c',
+  'geo_selfuncs.c',
+  'geo_spgist.c',
+  'hbafuncs.c',
+  'inet_cidr_ntop.c',
+  'inet_net_pton.c',
+  'int.c',
+  'int8.c',
+  'json.c',
+  'jsonb.c',
+  'jsonb_gin.c',
+  'jsonb_op.c',
+  'jsonb_util.c',
+  'jsonfuncs.c',
+  'jsonbsubs.c',
+  'jsonpath.c',
+  'jsonpath_exec.c',
+  'like.c',
+  'like_support.c',
+  'lockfuncs.c',
+  'mac.c',
+  'mac8.c',
+  'mcxtfuncs.c',
+  'misc.c',
+  'multirangetypes.c',
+  'multirangetypes_selfuncs.c',
+  'name.c',
+  'network.c',
+  'network_gist.c',
+  'network_selfuncs.c',
+  'network_spgist.c',
+  'numeric.c',
+  'numutils.c',
+  'oid.c',
+  'oracle_compat.c',
+  'orderedsetaggs.c',
+  'partitionfuncs.c',
+  'pg_locale.c',
+  'pg_lsn.c',
+  'pg_upgrade_support.c',
+  'pgstatfuncs.c',
+  'pseudotypes.c',
+  'quote.c',
+  'rangetypes.c',
+  'rangetypes_gist.c',
+  'rangetypes_selfuncs.c',
+  'rangetypes_spgist.c',
+  'rangetypes_typanalyze.c',
+  'regexp.c',
+  'regproc.c',
+  'ri_triggers.c',
+  'rowtypes.c',
+  'ruleutils.c',
+  'selfuncs.c',
+  'tid.c',
+  'timestamp.c',
+  'trigfuncs.c',
+  'tsginidx.c',
+  'tsgistidx.c',
+  'tsquery.c',
+  'tsquery_cleanup.c',
+  'tsquery_gist.c',
+  'tsquery_op.c',
+  'tsquery_rewrite.c',
+  'tsquery_util.c',
+  'tsrank.c',
+  'tsvector.c',
+  'tsvector_op.c',
+  'tsvector_parser.c',
+  'uuid.c',
+  'varbit.c',
+  'varchar.c',
+  'varlena.c',
+  'version.c',
+  'windowfuncs.c',
+  'xid.c',
+  'xid8funcs.c',
+  'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+  input: ['jsonpath_scan.l'],
+  output: ['jsonpath_scan.c'],
+  command: [flex_cmd, flex_backup, '-CF', '-p', '-p', '@INPUT@'],)
+generated_sources += jsonpath_scan
+
+# jsonpath_scan is compiled as part of jsonpath_gram
+generated_backend_sources += custom_target('jsonpath_parse',
+  input: ['jsonpath_gram.y', jsonpath_scan[0]],
+  output: ['jsonpath_gram.c'],
+  command: [bison_cmd, '@INPUT0@'],)
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..4fe6db6bda6
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'attoptcache.c',
+  'catcache.c',
+  'evtcache.c',
+  'inval.c',
+  'lsyscache.c',
+  'partcache.c',
+  'plancache.c',
+  'relcache.c',
+  'relfilenumbermap.c',
+  'relmapper.c',
+  'spccache.c',
+  'syscache.c',
+  'ts_cache.c',
+  'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..325446c8f93
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'assert.c',
+  'csvlog.c',
+  'elog.c',
+  'jsonlog.c',
+)
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'dfmgr.c',
+  'fmgr.c',
+  'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'dynahash.c',
+  'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'globals.c',
+  'miscinit.c',
+  'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..b84a78b6318
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,38 @@
+encodings = {
+  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+  'euc_tw_and_big5': [
+    'euc_tw_and_big5/euc_tw_and_big5.c',
+    'euc_tw_and_big5/big5.c',
+  ],
+  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+  backend_targets += shared_module(encoding,
+    sources,
+    kwargs: pg_mod_args + {
+    }
+  )
+
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'conv.c',
+  'mbutils.c',
+  'stringinfo_mb.c',
+  'wstrcmp.c',
+  'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..3a916320bb3
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,17 @@
+install_data('errcodes.txt',
+  install_dir: dir_data,
+)
+
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..8fbb128235b
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,33 @@
+backend_sources += files(
+  'guc.c',
+  'help_config.c',
+  'pg_config.c',
+  'pg_controldata.c',
+  'pg_rusage.c',
+  'ps_status.c',
+  'queryenvironment.c',
+  'queryjumble.c',
+  'rls.c',
+  'sampling.c',
+  'superuser.c',
+  'timeout.c',
+  'tzparser.c',
+)
+
+# guc-file.c is compiled as part of guc.c, generate guc-file.c.h so it can be
+# added as a dependency for the executable. Not pretty, but there's no
+# obviously better solution right now
+guc_scan = custom_target('guc_scan',
+  input: ['guc-file.l'],
+  output: ['guc-file.c', 'guc-file.c.h'],
+  command: [flex_cmd, '@INPUT@', '--stamp_header', '@OUTPUT1@'])
+
+backend_build_deps += declare_dependency(
+  sources: guc_scan[1],
+  include_directories: include_directories('.'))
+generated_backend_headers += guc_scan[1]
+generated_sources += guc_scan[0]
+
+install_data('postgresql.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'aset.c',
+  'dsa.c',
+  'freepage.c',
+  'generation.c',
+  'mcxt.c',
+  'memdebug.c',
+  'portalmem.c',
+  'slab.c',
+)
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..a475b183405
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'logtape.c',
+  'sharedtuplestore.c',
+  'sortsupport.c',
+  'tuplesort.c',
+  'tuplesortvariants.c',
+  'tuplestore.c',
+  'qsort_interruptible.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'combocid.c',
+  'snapmgr.c',
+)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..bed3ed78b5f
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,30 @@
+fe_utils_sources = files(
+  'archive.c',
+  'cancel.c',
+  'conditional.c',
+  'connect_utils.c',
+  'mbprint.c',
+  'option_utils.c',
+  'parallel_slot.c',
+  'print.c',
+  'query_utils.c',
+  'recovery_gen.c',
+  'simple_list.c',
+  'string_utils.c',
+)
+
+psqlscan = custom_target('psqlscan',
+  input: ['psqlscan.l'],
+  output: ['psqlscan.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'],
+)
+generated_sources += psqlscan
+fe_utils_sources += psqlscan
+
+fe_utils = static_library('pgfeutils',
+  fe_utils_sources + generated_headers,
+  c_pch: pch_c_h,
+  include_directories :  [postgres_inc, libpq_inc],
+  c_args: ['-DFRONTEND'],
+  kwargs: default_lib_args,
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..131c416064f
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,39 @@
+initdb_sources = files(
+  'findtimezone.c',
+  'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+if host_system == 'win32'
+  initdb_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'initdb - initialize a new database cluster',
+        '--NAME', 'initdb',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+executable('initdb',
+  initdb_sources,
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code, libpq, icu, icu_i18n],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'initdb',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_initdb.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 00000000000..8b8a9fd2ce1
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('initdb-' + pg_version_major.to_string())
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..5fd5a9d2f98
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..3d130097615
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,26 @@
+pg_amcheck_sources = files(
+  'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+  pg_amcheck_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_nonesuch.pl',
+      't/003_check.pl',
+      't/004_verify_heapam.pl',
+      't/005_opclass_damage.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 00000000000..b255f552c94
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_amcheck-' + pg_version_major.to_string())
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..b5d393b3b32
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,18 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+  ['pg_archivecleanup.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_archivecleanup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_pg_archivecleanup.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 00000000000..37935fcabc4
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..857e2b77d23
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,58 @@
+common_sources = files(
+  'bbstreamer_file.c',
+  'bbstreamer_gzip.c',
+  'bbstreamer_inject.c',
+  'bbstreamer_lz4.c',
+  'bbstreamer_tar.c',
+  'bbstreamer_zstd.c',
+  'receivelog.c',
+  'streamutil.c',
+  'walmethods.c',
+)
+
+pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_common = static_library('libpg_basebackup_common',
+  common_sources,
+  dependencies: pg_basebackup_deps,
+  kwargs: internal_lib_args,
+)
+
+executable('pg_basebackup',
+  'pg_basebackup.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+executable('pg_receivewal',
+  'pg_receivewal.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+executable('pg_recvlogical',
+  'pg_recvlogical.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'pg_basebackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path(),
+            'LZ4': program_lz4.found() ? program_lz4.path() : '',
+            'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+    'tests': [
+      't/010_pg_basebackup.pl',
+      't/020_pg_receivewal.pl',
+      't/030_pg_recvlogical.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 00000000000..cab021153fe
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_basebackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..c58bcca2f97
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,20 @@
+executable('pg_checksums',
+  ['pg_checksums.c'],
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_checksums',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_actions.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 00000000000..2c47c2338f6
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_checksums-' + pg_version_major.to_string())
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..90664bb3bc3
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,18 @@
+executable('pg_config',
+  ['pg_config.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_config',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_config.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 00000000000..b6fb6db9213
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_config-' + pg_version_major.to_string())
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..969eed2888e
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,18 @@
+executable('pg_controldata',
+  ['pg_controldata.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_controldata',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_controldata.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 00000000000..31b486d002c
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_controldata-' + pg_version_major.to_string())
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..bbb30198d96
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,21 @@
+executable('pg_ctl',
+  ['pg_ctl.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_ctl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_start_stop.pl',
+      't/002_status.pl',
+      't/003_promote.pl',
+      't/004_logrotate.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 00000000000..947b5108423
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_ctl-' + pg_version_major.to_string())
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..9dab205cbe9
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,84 @@
+pg_dump_common_sources = files(
+  'compress_io.c',
+  'dumputils.c',
+  'parallel.c',
+  'pg_backup_archiver.c',
+  'pg_backup_custom.c',
+  'pg_backup_db.c',
+  'pg_backup_directory.c',
+  'pg_backup_null.c',
+  'pg_backup_tar.c',
+  'pg_backup_utils.c',
+)
+
+if host_system == 'win32'
+  pg_dump_common_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'pg_dump/pg_restore/pg_dumpall - backup and restore PostgreSQL databases',
+        '--NAME', 'pg_dump',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pg_dump_common = static_library('libpgdump_common',
+  pg_dump_common_sources,
+  c_pch: pch_c_h,
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+
+pg_dump_sources = files(
+  'pg_dump.c',
+  'common.c',
+  'pg_dump_sort.c',
+)
+
+executable('pg_dump',
+  pg_dump_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_dumpall_sources = files(
+  'pg_dumpall.c',
+)
+
+executable('pg_dumpall',
+  pg_dumpall_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_restore_sources = files(
+  'pg_restore.c',
+)
+
+executable('pg_restore',
+  pg_restore_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_dump.pl',
+      't/003_pg_dump_with_server.pl',
+      't/010_dump_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 00000000000..82e5e537ff4
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_dump-' + pg_version_major.to_string())
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..dd889188b6d
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,19 @@
+executable('pg_resetwal',
+  files('pg_resetwal.c'),
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_resetwal',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_corrupted.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 00000000000..d130d3b775f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_resetwal-' + pg_version_major.to_string())
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..40ae593e7c8
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,39 @@
+pg_rewind_sources = files(
+  'datapagemap.c',
+  'file_ops.c',
+  'filemap.c',
+  'libpq_source.c',
+  'local_source.c',
+  'parsexlog.c',
+  'pg_rewind.c',
+  'timeline.c',
+  '../../backend/access/transam/xlogreader.c',
+)
+
+pg_rewind = executable('pg_rewind',
+  pg_rewind_sources,
+  dependencies: [frontend_code, libpq, lz4, zstd],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_rewind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_databases.pl',
+      't/003_extrafiles.pl',
+      't/004_pg_xlog_symlink.pl',
+      't/005_same_timeline.pl',
+      't/006_options.pl',
+      't/007_standby_source.pl',
+      't/008_min_recovery_point.pl',
+      't/009_growing_files.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 00000000000..a105600b348
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_rewind-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..d51f99902cf
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,18 @@
+executable('pg_test_fsync',
+  ['pg_test_fsync.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'pg_test_fsync',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 00000000000..2ee1125282d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..409fe242353
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,18 @@
+pg_test_timing = executable('pg_test_timing',
+  ['pg_test_timing.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_test_timing',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 00000000000..cda8615165b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_timing-' + pg_version_major.to_string())
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..fb7eff3055b
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,40 @@
+pg_upgrade_sources = files(
+  'check.c',
+  'controldata.c',
+  'dump.c',
+  'exec.c',
+  'file.c',
+  'function.c',
+  'info.c',
+  'option.c',
+  'parallel.c',
+  'pg_upgrade.c',
+  'relfilenumber.c',
+  'server.c',
+  'tablespace.c',
+  'util.c',
+  'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+  pg_upgrade_sources,
+  c_pch: pch_c_h,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_upgrade',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_upgrade.pl',
+    ],
+    'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 00000000000..39301cbede8
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_upgrade-' + pg_version_major.to_string())
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..307ca23ee73
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,32 @@
+pg_verifybackup_sources = files(
+  'parse_manifest.c',
+  'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+  pg_verifybackup_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_verifybackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_algorithm.pl',
+      't/003_corruption.pl',
+      't/004_options.pl',
+      't/005_bad_manifest.pl',
+      't/006_encoding.pl',
+      't/007_wal.pl',
+      't/008_untar.pl',
+      't/009_extract.pl',
+      't/010_client_untar.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 00000000000..b583f1958ba
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..e4820062640
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,28 @@
+pg_waldump_sources = files(
+  'compat.c',
+  'pg_waldump.c',
+  'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
+
+pg_waldump = executable('pg_waldump',
+  pg_waldump_sources,
+  dependencies: [frontend_code, lz4, zstd],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_waldump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 00000000000..f335aa4b360
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_waldump-' + pg_version_major.to_string())
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..ddbaeb5380b
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,42 @@
+pgbench_sources = files(
+  'pgbench.c',
+)
+
+# exprscan is compiled as part ofexprparse. The ordering is enforced by making
+# the generation of grammar depend on the scanner generation. That's
+# unnecessarily strict, but overall harmless.
+
+exprscan = custom_target('exprscan',
+  input : files('exprscan.l'),
+  output : ['exprscan.c'],
+  command : [flex_cmd, '@INPUT@']
+)
+generated_sources += exprscan
+
+exprparse = custom_target('exprparse',
+  input: 'exprparse.y',
+  output: 'exprparse.c',
+  depends: exprscan,
+  command: [bison_cmd, '@INPUT@'],)
+generated_sources += exprparse
+pgbench_sources += exprparse
+
+executable('pgbench',
+  pgbench_sources,
+  dependencies: [frontend_code, libpq, thread_dep],
+  include_directories: include_directories('.'),
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name' : 'pgbench',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_pgbench_with_server.pl',
+      't/002_pgbench_no_server.pl',
+    ],
+  },
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..5bad0d261b8
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,38 @@
+if host_system != 'win32'
+  subdir_done()
+endif
+
+pgevent_sources = files(
+    'pgevent.c',
+)
+
+# built as part of pgmsgevent.rc, via #include
+win32ver_rc = custom_target(
+  'win32ver.rc',
+  kwargs: rcgen_kw,
+  command: rcgen_lib_cmd + [
+    '--FILEDESC', 'Eventlog message formatter',
+    '--NAME', 'pgevent',],
+)
+
+pgevent_sources += windows.compile_resources(
+  'pgmsgevent.rc',
+  depends: win32ver_rc, # included in file
+  kwargs: rccompile_kw,
+)
+
+# FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
+pgevent_link_args = []
+if cc.get_id() == 'msvc'
+  pgevent_link_args += '/ignore:4104'
+endif
+
+shared_library('pgevent',
+  pgevent_sources,
+  dependencies: [frontend_code],
+  link_args: pgevent_link_args,
+  vs_module_defs: 'pgevent.def',
+  kwargs: default_lib_args + {
+    'name_prefix': '',
+  },
+)
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..3e20e24a8c0
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,72 @@
+psql_sources = files(
+  'command.c',
+  'common.c',
+  'copy.c',
+  'crosstabview.c',
+  'describe.c',
+  'help.c',
+  'input.c',
+  'large_obj.c',
+  'mainloop.c',
+  'prompt.c',
+  'startup.c',
+  'stringutils.c',
+  'tab-complete.c',
+  'variables.c',
+)
+
+psqlscanslash = custom_target('psqlscanslash',
+  input: ['psqlscanslash.l'],
+  output: ['psqlscanslash.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'])
+generated_sources += psqlscanslash
+psql_sources += psqlscanslash
+
+sql_help = custom_target('psql_help',
+  output: ['sql_help.c', 'sql_help.h'],
+  depfile: 'sql_help.dep',
+  command: [perl, files('create_help.pl'),
+            '--docdir', '@SOURCE_ROOT@/doc/src/sgml/ref',
+            '--depfile', '@DEPFILE@',
+            '--outdir', '@OUTDIR@',
+            '--basename', 'sql_help'])
+generated_sources += sql_help.to_list()
+psql_sources += sql_help
+
+if host_system == 'win32'
+  psql_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'psql - the PostgreSQL interactive terminal',
+        '--NAME', 'psql',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+executable('psql',
+  psql_sources,
+  c_pch: pch_c_h,
+  include_directories: include_directories('.'),
+  dependencies : [frontend_code, libpq, readline],
+  kwargs: default_bin_args,
+)
+
+install_data('psqlrc.sample',
+  install_dir: dir_data,
+)
+
+tests += {
+  'name': 'psql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_basic.pl',
+      't/010_tab_completion.pl',
+      't/020_cancel.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 00000000000..45fe425298d
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('psql-' + pg_version_major.to_string())
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..d6826817f3d
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,50 @@
+scripts_common = static_library('libscripts_common',
+  files('common.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: internal_lib_args,
+)
+
+binaries = [
+  'createdb',
+  'dropdb',
+  'createuser',
+  'dropuser',
+  'clusterdb',
+  'vacuumdb',
+  'reindexdb',
+  'pg_isready',
+]
+
+foreach binary : binaries
+  executable(binary,
+    files(binary + '.c'),
+    link_with: [scripts_common],
+    dependencies: [frontend_code, libpq],
+    kwargs: default_bin_args,
+  )
+endforeach
+
+tests += {
+  'name': 'scripts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_clusterdb.pl',
+      't/011_clusterdb_all.pl',
+      't/020_createdb.pl',
+      't/040_createuser.pl',
+      't/050_dropdb.pl',
+      't/070_dropuser.pl',
+      't/080_pg_isready.pl',
+      't/090_reindexdb.pl',
+      't/091_reindexdb_all.pl',
+      't/100_vacuumdb.pl',
+      't/101_vacuumdb_all.pl',
+      't/102_vacuumdb_stages.pl',
+      't/200_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 00000000000..3c531459c2d
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pgscripts-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..bb6a47c5a20
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,103 @@
+# test/ is entered via top-level meson.build, that way it can use the default
+# args for executables (which depend on libpq).
+
+libpq_sources = files(
+  'fe-auth-scram.c',
+  'fe-connect.c',
+  'fe-exec.c',
+  'fe-lobj.c',
+  'fe-misc.c',
+  'fe-print.c',
+  'fe-protocol3.c',
+  'fe-secure.c',
+  'fe-trace.c',
+  'legacy-pqsignal.c',
+  'libpq-events.c',
+  'pqexpbuffer.c',
+  'fe-auth.c',
+)
+
+if host_system == 'win32'
+  libpq_sources += files('win32.c', 'pthread-win32.c')
+endif
+
+if ssl.found()
+  libpq_sources += files('fe-secure-common.c')
+  libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+  libpq_sources += files(
+    'fe-secure-gssapi.c',
+    'fe-gssapi-common.c'
+  )
+endif
+
+export_file = custom_target('libpq.exports',
+  kwargs: gen_export_kwargs,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+libpq_link_depends = []
+
+if host_system == 'win32'
+  libpq_deps += cc.find_library('secur32', required: true)
+endif
+
+libpq_both = both_libraries('libpq',
+  libpq_sources,
+  include_directories : [libpq_inc, postgres_inc],
+  c_args: ['-DFRONTEND'],
+  dependencies: libpq_deps,
+  version: '5.'+pg_version_major.to_string(),
+  soversion: host_system != 'win32' ? '5' : '' ,
+  link_depends: export_file,
+  link_args: export_fmt.format(export_file.full_path()),
+  kwargs: default_lib_args,
+)
+
+libpq_so = libpq_both.get_shared_lib()
+
+libpq = declare_dependency(
+  link_with: [libpq_so],
+  include_directories: [include_directories('.')]
+)
+
+pkgconfig.generate(
+  libpq_so,
+  name: 'libpq',
+  description: 'PostgreSQL libpq library',
+  url: pg_url,
+)
+
+install_headers(
+  'libpq-fe.h',
+  'libpq-events.h',
+)
+
+install_headers(
+  'libpq-int.h',
+  'pqexpbuffer.h',
+  'fe-auth-sasl.h',
+  install_dir: dir_include_internal,
+)
+install_data('pg_service.conf.sample',
+  install_dir: dir_data,
+)
+
+
+tests += {
+  'name': 'libpq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_uri.pl',
+      't/002_api.pl',
+    ],
+    'env' : {'with_ssl': get_option('ssl')},
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build
new file mode 100644
index 00000000000..eed91110fd6
--- /dev/null
+++ b/src/interfaces/libpq/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
new file mode 100644
index 00000000000..16f94c1ed8b
--- /dev/null
+++ b/src/interfaces/libpq/test/meson.build
@@ -0,0 +1,15 @@
+executable('libpq_uri_regress',
+  files('libpq_uri_regress.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+executable('libpq_testclient',
+  files('libpq_testclient.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..d9a57465441
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,5 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
+subdir('tcl')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..4b14c556c24
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,92 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+plperl_sources = files(
+  'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+  check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(privlibexp)
+
+plperl_sources += custom_target('perlchunks.h',
+  input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+  output: 'perlchunks.h',
+  capture: true,
+  command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+  input: files('plperl_opmask.pl'),
+  output: 'plperl_opmask.h',
+  command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+  xs = files(n+'.xs')
+  xs_c_name = n+'.c'
+
+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?
+  xs_c = custom_target(xs_c_name,
+    input: xs,
+    output: xs_c_name,
+    command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+  )
+  plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+shared_module('plperl',
+  plperl_sources,
+  c_pch: pch_postgres_h,
+  include_directories: [plperl_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, pg_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'plperl.control',
+  'plperl--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_data(
+  'plperlu.control',
+  'plperlu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plperl.h',
+  'plperl_helpers.h',
+  'ppport.h',
+  install_dir: dir_include_server,
+)
+
+tests += {
+  'name': 'plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plperl_setup',
+      'plperl',
+      'plperl_lc',
+      'plperl_trigger',
+      'plperl_shared',
+      'plperl_elog',
+      'plperl_util',
+      'plperl_init',
+      'plperlu',
+      'plperl_array',
+      'plperl_call',
+      'plperl_transaction',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build
new file mode 100644
index 00000000000..fe0a715bdf0
--- /dev/null
+++ b/src/pl/plperl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plperl-' + pg_version_major.to_string())
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..e29dc3a4fcc
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,83 @@
+plpgsql_sources = files(
+  'pl_comp.c',
+  'pl_exec.c',
+  'pl_funcs.c',
+  'pl_handler.c',
+  'pl_scanner.c',
+)
+
+pl_gram = custom_target('gram',
+  input: ['pl_gram.y'],
+  output: ['pl_gram.c', 'pl_gram.h'],
+  command: [bison_cmd, '-d', '@INPUT@'])
+generated_sources += pl_gram.to_list()
+plpgsql_sources += pl_gram
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+pl_errcodes = custom_target('plerrcodes',
+  input: ['../../../../src/backend/utils/errcodes.txt'],
+  output: ['plerrcodes.h'],
+  command: [perl, gen_plerrcodes, '@INPUT0@'],
+  capture: true)
+generated_sources += pl_errcodes
+plpgsql_sources +=  pl_errcodes
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+pl_reserved = custom_target('pl_reserved_kwlist',
+  input: ['pl_reserved_kwlist.h'],
+  output: ['pl_reserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_reserved
+plpgsql_sources += pl_reserved
+
+pl_unreserved = custom_target('pl_unreserved_kwlist',
+  input: ['pl_unreserved_kwlist.h'],
+  output: ['pl_unreserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_unreserved
+plpgsql_sources += pl_unreserved
+
+shared_module('plpgsql',
+  plpgsql_sources,
+  c_pch: pch_postgres_h,
+  include_directories: include_directories('.'),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plpgsql.control',
+  'plpgsql--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpgsql.h',
+  install_dir: dir_include_server
+)
+
+
+tests += {
+  'name': 'plpgsql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plpgsql_array',
+      'plpgsql_call',
+      'plpgsql_control',
+      'plpgsql_copy',
+      'plpgsql_domain',
+      'plpgsql_record',
+      'plpgsql_cache',
+      'plpgsql_simple',
+      'plpgsql_transaction',
+      'plpgsql_trap',
+      'plpgsql_trigger',
+      'plpgsql_varprops',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build
new file mode 100644
index 00000000000..29e0b74488f
--- /dev/null
+++ b/src/pl/plpgsql/src/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpgsql-' + pg_version_major.to_string())
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..449654914d0
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,99 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+plpython_sources = files(
+  'plpy_cursorobject.c',
+  'plpy_elog.c',
+  'plpy_exec.c',
+  'plpy_main.c',
+  'plpy_planobject.c',
+  'plpy_plpymodule.c',
+  'plpy_procedure.c',
+  'plpy_resultobject.c',
+  'plpy_spi.c',
+  'plpy_subxactobject.c',
+  'plpy_typeio.c',
+  'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+    input: files('../../backend/utils/errcodes.txt'),
+    output: 'spiexceptions.h',
+    command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+    capture: true
+  )
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+shared_module('plpython3',
+  plpython_sources,
+  c_pch: pch_postgres_h,
+  include_directories: [plpython_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [python3_dep, pg_mod_args['dependencies']],
+  },
+)
+
+# FIXME: Only install the relevant versions
+install_data(
+  'plpython3u.control',
+  'plpython3u--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpy_cursorobject.h',
+  'plpy_elog.h',
+  'plpy_exec.h',
+  'plpy_main.h',
+  'plpy_planobject.h',
+  'plpy_plpymodule.h',
+  'plpy_procedure.h',
+  'plpy_resultobject.h',
+  'plpy_spi.h',
+  'plpy_subxactobject.h',
+  'plpy_typeio.h',
+  'plpy_util.h',
+  'plpython.h',
+  install_dir: dir_include_server,
+)
+
+plpython_regress = [
+  'plpython_schema',
+  'plpython_populate',
+  'plpython_test',
+  'plpython_do',
+  'plpython_global',
+  'plpython_import',
+  'plpython_spi',
+  'plpython_newline',
+  'plpython_void',
+  'plpython_call',
+  'plpython_params',
+  'plpython_setof',
+  'plpython_record',
+  'plpython_trigger',
+  'plpython_types',
+  'plpython_error',
+  'plpython_ereport',
+  'plpython_unicode',
+  'plpython_quote',
+  'plpython_composite',
+  'plpython_subtransaction',
+  'plpython_transaction',
+  'plpython_drop',
+]
+
+tests += {
+  'name': 'plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': plpython_regress,
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build
new file mode 100644
index 00000000000..542e27fbe1f
--- /dev/null
+++ b/src/pl/plpython/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpython-' + pg_version_major.to_string())
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
new file mode 100644
index 00000000000..16bfd7806b4
--- /dev/null
+++ b/src/pl/tcl/meson.build
@@ -0,0 +1,55 @@
+if not tcl_dep.found()
+  subdir_done()
+endif
+
+pltcl_sources = files(
+  'pltcl.c',
+)
+
+gen_pltclerrcodes = files('generate-pltclerrcodes.pl')
+pltcl_sources += custom_target('pltclerrcodes.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'pltclerrcodes.h',
+  capture: true,
+  command: [perl, gen_pltclerrcodes, '@INPUT@']
+)
+
+shared_module('pltcl',
+  pltcl_sources,
+  c_pch: pch_postgres_h,
+  include_directories: [include_directories('.'), postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [tcl_dep, pg_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'pltcl.control',
+  'pltcl--1.0.sql',
+  'pltclu.control',
+  'pltclu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+pltcl_regress = [
+  'pltcl_setup',
+  'pltcl_queries',
+  'pltcl_trigger',
+  'pltcl_call',
+  'pltcl_start_proc',
+  'pltcl_subxact',
+  'pltcl_unicode',
+  'pltcl_transaction',
+]
+
+tests += {
+  'name': 'pltcl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': pltcl_regress,
+    'regress_args': ['--load-extension=pltcl'],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build
new file mode 100644
index 00000000000..cc23ef1eb3b
--- /dev/null
+++ b/src/pl/tcl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pltcl-' + pg_version_major.to_string())
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..b69f34346ce
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,22 @@
+adminpack = shared_module('adminpack',
+  ['adminpack.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'adminpack.control',
+  'adminpack--1.0.sql',
+  'adminpack--1.0--1.1.sql',
+  'adminpack--1.1--2.0.sql',
+  'adminpack--2.0--2.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'adminpack',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ['adminpack'],
+  },
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..d75d8c91c4b
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,36 @@
+amcheck = shared_module('amcheck', [
+    'verify_heapam.c',
+    'verify_nbtree.c',
+  ],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'amcheck.control',
+  'amcheck--1.0.sql',
+  'amcheck--1.0--1.1.sql',
+  'amcheck--1.1--1.2.sql',
+  'amcheck--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'check',
+      'check_btree',
+      'check_heap',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_verify_heapam.pl',
+      't/002_cic.pl',
+      't/003_cic_2pc.pl',
+    ],
+  },
+}
+
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..941bb6f39a4
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,4 @@
+autoinc = shared_module('auth_delay',
+  ['auth_delay.c'],
+  kwargs: contrib_mod_args,
+)
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..9456d569fc2
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,15 @@
+auto_explain = shared_module('auto_explain',
+  files('auto_explain.c'),
+  kwargs: contrib_mod_args,
+)
+
+tests += {
+  'name': 'auto_explain',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auto_explain.pl',
+    ],
+  },
+}
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
new file mode 100644
index 00000000000..9d465cb50f3
--- /dev/null
+++ b/contrib/basebackup_to_shell/meson.build
@@ -0,0 +1,22 @@
+basebackup_to_shell_sources = files(
+  'basebackup_to_shell.c',
+)
+
+basebackup_to_shell = shared_module('basebackup_to_shell',
+  basebackup_to_shell_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+tests += {
+  'name': 'basebackup_to_shell',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap' : {
+    'tests': [
+      't/001_basic.pl',
+    ],
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path()},
+  },
+}
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
new file mode 100644
index 00000000000..b81582c7c0f
--- /dev/null
+++ b/contrib/basic_archive/meson.build
@@ -0,0 +1,23 @@
+basic_archive_sources = files(
+  'basic_archive.c',
+)
+
+basic_archive = shared_module('basic_archive',
+  basic_archive_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+tests += {
+  'name': 'basic_archive',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'basic_archive',
+    ],
+    'regress_args': [
+      '--temp-config', files('basic_archive.conf'),
+    ],
+  },
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..71a2263a773
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,36 @@
+bloom_sources = files(
+  'blcost.c',
+  'blinsert.c',
+  'blscan.c',
+  'blutils.c',
+  'blvacuum.c',
+  'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+  bloom_sources,
+  c_pch: pch_c_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'bloom.control',
+  'bloom--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bloom',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_wal.pl',
+    ],
+  },
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..c7e75278739
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,39 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+bool_plperl_sources = files(
+  'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+  bool_plperl_sources,
+  include_directories: [plperl_inc, include_directories('.')],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'bool_plperl.control',
+  'bool_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'bool_plperlu.control',
+  'bool_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bool_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bool_plperl',
+      'bool_plperlu',
+    ],
+  },
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..356dbe84f10
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,53 @@
+btree_gin = shared_module('btree_gin',
+  files('btree_gin.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gin.control',
+  'btree_gin--1.0.sql',
+  'btree_gin--1.0--1.1.sql',
+  'btree_gin--1.1--1.2.sql',
+  'btree_gin--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'install_btree_gin',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'money',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'enum',
+      'uuid',
+      'name',
+      'bool',
+      'bpchar',
+    ],
+  },
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..40b6ccc3b50
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,84 @@
+btree_gist_sources = files(
+  'btree_bit.c',
+  'btree_bool.c',
+  'btree_bytea.c',
+  'btree_cash.c',
+  'btree_date.c',
+  'btree_enum.c',
+  'btree_float4.c',
+  'btree_float8.c',
+  'btree_gist.c',
+  'btree_inet.c',
+  'btree_int2.c',
+  'btree_int4.c',
+  'btree_int8.c',
+  'btree_interval.c',
+  'btree_macaddr.c',
+  'btree_macaddr8.c',
+  'btree_numeric.c',
+  'btree_oid.c',
+  'btree_text.c',
+  'btree_time.c',
+  'btree_ts.c',
+  'btree_utils_num.c',
+  'btree_utils_var.c',
+  'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+  btree_gist_sources,
+  c_pch: pch_c_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gist.control',
+  'btree_gist--1.0--1.1.sql',
+  'btree_gist--1.1--1.2.sql',
+  'btree_gist--1.2.sql',
+  'btree_gist--1.2--1.3.sql',
+  'btree_gist--1.3--1.4.sql',
+  'btree_gist--1.4--1.5.sql',
+  'btree_gist--1.5--1.6.sql',
+  'btree_gist--1.6--1.7.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'init',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'cash',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'uuid',
+      'not_equal',
+      'enum',
+      'bool',
+    ],
+  },
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..507745ba747
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,33 @@
+citext_sources = files(
+  'citext.c',
+)
+
+citext = shared_module('citext',
+  citext_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'citext.control',
+  'citext--1.0--1.1.sql',
+  'citext--1.1--1.2.sql',
+  'citext--1.2--1.3.sql',
+  'citext--1.3--1.4.sql',
+  'citext--1.4.sql',
+  'citext--1.4--1.5.sql',
+  'citext--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'citext',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'create_index_acl',
+      'citext',
+      'citext_utf8',
+    ],
+  },
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..425c258d124
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,52 @@
+cube_sources = files(
+  'cube.c',
+)
+
+# cubescan is compiled as part of cubeparse
+cube_scan = custom_target('cubescan',
+  input: ['cubescan.l'],
+  output: ['cubescan.c'],
+  command: [flex_cmd, '@INPUT@'],)
+generated_sources += cube_scan
+
+cube_parse = custom_target('cubeparse',
+  input: 'cubeparse.y',
+  output: 'cubeparse.c',
+  depends: cube_scan,
+  command: [bison_cmd, '@INPUT@'],)
+generated_sources += cube_parse
+cube_sources += cube_parse
+
+cube = shared_module('cube',
+  cube_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'cube.control',
+  'cube--1.0--1.1.sql',
+  'cube--1.1--1.2.sql',
+  'cube--1.2.sql',
+  'cube--1.2--1.3.sql',
+  'cube--1.3--1.4.sql',
+  'cube--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'cubedata.h',
+  install_dir: dir_include_extension / 'cube',
+)
+
+tests += {
+  'name': 'cube',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'cube',
+      'cube_sci',
+    ],
+  },
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..9161f737726
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,30 @@
+dblink_sources = files(
+  'dblink.c',
+)
+
+dblink = shared_module('dblink',
+  dblink_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'dblink.control',
+  'dblink--1.0--1.1.sql',
+  'dblink--1.1--1.2.sql',
+  'dblink--1.2.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dblink',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dblink',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..2c937a3df5e
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,21 @@
+dict_int = shared_module('dict_int',
+  files('dict_int.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_int.control',
+  'dict_int--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dict_int',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_int',
+    ],
+  },
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..ec6e175733d
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,28 @@
+dict_xsyn = shared_module('dict_xsyn',
+  files('dict_xsyn.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_xsyn.control',
+  'dict_xsyn--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'xsyn_sample.rules',
+  kwargs: contrib_data_args + {
+    'install_dir': dir_data / 'tsearch_data'
+  }
+)
+
+tests += {
+  'name': 'dict_xsyn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_xsyn',
+    ],
+  },
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..35b448870b8
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,22 @@
+earthdistance = shared_module('earthdistance',
+  files('earthdistance.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'earthdistance.control',
+  'earthdistance--1.0--1.1.sql',
+  'earthdistance--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'earthdistance',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'earthdistance',
+    ],
+  },
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..26d26d1e0c4
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,21 @@
+file_fdw = shared_module('file_fdw',
+  files('file_fdw.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'file_fdw.control',
+  'file_fdw--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'file_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'file_fdw',
+    ],
+  },
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..73d88e92cfe
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,25 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+  files(
+    'fuzzystrmatch.c',
+    'dmetaphone.c'
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'fuzzystrmatch.control',
+  'fuzzystrmatch--1.0--1.1.sql',
+  'fuzzystrmatch--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'fuzzystrmatch',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'fuzzystrmatch',
+    ],
+  },
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..3aed37ce8e1
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,44 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+  files(
+    'hstore_compat.c',
+    'hstore_gin.c',
+    'hstore_gist.c',
+    'hstore_io.c',
+    'hstore_op.c',
+    'hstore_subs.c',
+  ),
+  c_pch: pch_c_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'hstore.control',
+  'hstore--1.1--1.2.sql',
+  'hstore--1.2--1.3.sql',
+  'hstore--1.3--1.4.sql',
+  'hstore--1.4.sql',
+  'hstore--1.4--1.5.sql',
+  'hstore--1.5--1.6.sql',
+  'hstore--1.6--1.7.sql',
+  'hstore--1.7--1.8.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'hstore.h',
+  install_dir: dir_include_extension / 'hstore',
+)
+
+tests += {
+  'name': 'hstore',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore',
+    ],
+  },
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..66eaf3f6cab
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,40 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+hstore_plperl_sources = files(
+  'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+  hstore_plperl_sources,
+  include_directories: [plperl_inc, hstore_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plperl.control',
+  'hstore_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'hstore_plperlu.control',
+  'hstore_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'hstore_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore_plperl',
+      'hstore_plperlu',
+      'create_transform',
+    ],
+  },
+}
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..ba53c888e13
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+hstore_plpython_sources = files(
+  'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+  hstore_plpython_sources,
+  include_directories: [plpython_inc, hstore_inc, ],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plpython3u--1.0.sql',
+  'hstore_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = [
+  'hstore_plpython'
+]
+
+tests += {
+  'name': 'hstore_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': hstore_plpython_regress,
+    'regress_args': ['--load-extension=hstore'],
+  },
+}
diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build
new file mode 100644
index 00000000000..a0f39366f47
--- /dev/null
+++ b/contrib/intagg/meson.build
@@ -0,0 +1,6 @@
+install_data(
+  'intagg.control',
+  'intagg--1.0--1.1.sql',
+  'intagg--1.1.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
new file mode 100644
index 00000000000..dfbfbc9fa6a
--- /dev/null
+++ b/contrib/intarray/meson.build
@@ -0,0 +1,36 @@
+intarray_sources = files(
+  '_int_bool.c',
+  '_int_gin.c',
+  '_int_gist.c',
+  '_int_op.c',
+  '_int_selfuncs.c',
+  '_int_tool.c',
+  '_intbig_gist.c',
+)
+
+intarray = shared_module('_int',
+  intarray_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'intarray.control',
+  'intarray--1.0--1.1.sql',
+  'intarray--1.1--1.2.sql',
+  'intarray--1.2.sql',
+  'intarray--1.2--1.3.sql',
+  'intarray--1.3--1.4.sql',
+  'intarray--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'intarray',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      '_int',
+    ],
+  },
+}
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
new file mode 100644
index 00000000000..508e2dfa080
--- /dev/null
+++ b/contrib/isn/meson.build
@@ -0,0 +1,32 @@
+isn_sources = files(
+  'isn.c',
+)
+
+isn = shared_module('isn',
+  isn_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'isn.control',
+  'isn--1.0--1.1.sql',
+  'isn--1.1--1.2.sql',
+  'isn--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'isn.h',
+  install_dir: dir_include_extension / 'isn',
+)
+
+tests += {
+  'name': 'isn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'isn',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..7fd4652fcfb
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,40 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+  'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+  jsonb_plperl_sources,
+  include_directories: [plperl_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plperl.control',
+  'jsonb_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'jsonb_plperlu.control',
+  'jsonb_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'jsonb_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'jsonb_plperl',
+      'jsonb_plperlu',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..95b3b3aeef4
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,35 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+  'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+  jsonb_plpython_sources,
+  include_directories: [plpython_inc],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plpython3u.control',
+  'jsonb_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = [
+  'jsonb_plpython'
+]
+
+tests += {
+  'name': 'jsonb_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': jsonb_plpython_regress,
+  },
+}
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
new file mode 100644
index 00000000000..224a2562017
--- /dev/null
+++ b/contrib/lo/meson.build
@@ -0,0 +1,26 @@
+lo_sources = files(
+  'lo.c',
+)
+
+lo = shared_module('lo',
+  lo_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'lo.control',
+  'lo--1.0--1.1.sql',
+  'lo--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'lo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'lo',
+    ],
+  },
+}
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
new file mode 100644
index 00000000000..222c64bb35d
--- /dev/null
+++ b/contrib/ltree/meson.build
@@ -0,0 +1,43 @@
+ltree_sources = files(
+  '_ltree_gist.c',
+  '_ltree_op.c',
+  'crc32.c',
+  'lquery_op.c',
+  'ltree_gist.c',
+  'ltree_io.c',
+  'ltree_op.c',
+  'ltxtquery_io.c',
+  'ltxtquery_op.c',
+)
+
+# .. so that includes of ltree/ltree.h work
+ltree_inc = include_directories('.', '../')
+
+ltree = shared_module('ltree',
+  ltree_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'ltree.control',
+  'ltree--1.0--1.1.sql',
+  'ltree--1.1--1.2.sql',
+  'ltree--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'ltree.h',
+  install_dir: dir_include_extension / 'ltree',
+)
+
+tests += {
+  'name': 'ltree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ltree',
+    ],
+  },
+}
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
new file mode 100644
index 00000000000..52ab66e46ca
--- /dev/null
+++ b/contrib/ltree_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+ltree_plpython_sources = files(
+  'ltree_plpython.c',
+)
+
+ltree_plpython = shared_module('ltree_plpython3',
+  ltree_plpython_sources,
+  include_directories: [plpython_inc, ltree_inc],
+  kwargs: pg_mod_args + {
+    'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'ltree_plpython3u--1.0.sql',
+  'ltree_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+ltree_plpython_regress = [
+  'ltree_plpython'
+]
+
+tests += {
+  'name': 'ltree_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ltree_plpython_regress,
+    'regress_args': ['--load-extension=ltree'],
+  },
+}
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..84752d4bd0f
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,66 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = dir_data_extension
+contrib_data_args = {
+  'install_dir': contrib_data_dir,
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('basic_archive')
+subdir('bloom')
+subdir('basebackup_to_shell')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+subdir('intagg')
+subdir('intarray')
+subdir('isn')
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+subdir('lo')
+subdir('ltree')
+subdir('ltree_plpython')
+subdir('oid2name')
+subdir('old_snapshot')
+subdir('pageinspect')
+subdir('passwordcheck')
+subdir('pg_buffercache')
+subdir('pgcrypto')
+subdir('pg_freespacemap')
+subdir('pg_prewarm')
+subdir('pgrowlocks')
+subdir('pg_stat_statements')
+subdir('pgstattuple')
+subdir('pg_surgery')
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('pg_walinspect')
+subdir('postgres_fdw')
+subdir('seg')
+subdir('sepgsql')
+subdir('spi')
+subdir('sslinfo')
+# start-scripts doesn't contain build products
+subdir('tablefunc')
+subdir('tcn')
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+subdir('uuid-ossp')
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..b3139971140
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,16 @@
+executable('oid2name',
+  ['oid2name.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'oid2name',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
new file mode 100644
index 00000000000..5785c29e9f8
--- /dev/null
+++ b/contrib/old_snapshot/meson.build
@@ -0,0 +1,14 @@
+old_snapshot_sources = files(
+  'time_mapping.c',
+)
+
+old_snapshot = shared_module('old_snapshot',
+  old_snapshot_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'old_snapshot.control',
+  'old_snapshot--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..5cacb9b323b
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,59 @@
+pageinspect_sources = files(
+  'brinfuncs.c',
+  'btreefuncs.c',
+  'fsmfuncs.c',
+  'ginfuncs.c',
+  'gistfuncs.c',
+  'hashfuncs.c',
+  'heapfuncs.c',
+  'rawpage.c',
+)
+
+if host_system == 'win32'
+  pageinspect_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_lib_cmd + [
+        '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',
+        '--NAME', 'pageinspect',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pageinspect = shared_module('pageinspect',
+  pageinspect_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pageinspect--1.0--1.1.sql',
+  'pageinspect--1.1--1.2.sql',
+  'pageinspect--1.2--1.3.sql',
+  'pageinspect--1.3--1.4.sql',
+  'pageinspect--1.4--1.5.sql',
+  'pageinspect--1.5--1.6.sql',
+  'pageinspect--1.5.sql',
+  'pageinspect--1.6--1.7.sql',
+  'pageinspect--1.7--1.8.sql',
+  'pageinspect--1.8--1.9.sql',
+  'pageinspect--1.9--1.10.sql',
+  'pageinspect.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pageinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'page',
+      'btree',
+      'brin',
+      'gin',
+      'gist',
+      'hash',
+      'checksum',
+      'oldextversions',
+    ],
+  },
+}
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
new file mode 100644
index 00000000000..80667d8a9f0
--- /dev/null
+++ b/contrib/passwordcheck/meson.build
@@ -0,0 +1,29 @@
+passwordcheck_sources = files(
+  'passwordcheck.c',
+)
+
+passwordcheck_c_args = []
+passwordcheck_deps = []
+
+# uncomment the following two lines to enable cracklib support
+# passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
+# passwordcheck_deps += [cc.find_library('crack')]
+
+passwordcheck = shared_module('passwordcheck',
+  passwordcheck_sources,
+  kwargs: contrib_mod_args + {
+    'c_args': contrib_mod_args.get('c_args') + passwordcheck_c_args,
+    'dependencies': contrib_mod_args.get('dependencies') + passwordcheck_deps,
+  }
+)
+
+tests += {
+  'name': 'passwordcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'passwordcheck',
+    ],
+  },
+}
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
new file mode 100644
index 00000000000..38de7488df2
--- /dev/null
+++ b/contrib/pg_buffercache/meson.build
@@ -0,0 +1,27 @@
+pg_buffercache = shared_module('pg_buffercache',
+  files(
+    'pg_buffercache_pages.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_buffercache--1.0--1.1.sql',
+  'pg_buffercache--1.1--1.2.sql',
+  'pg_buffercache--1.2--1.3.sql',
+  'pg_buffercache--1.2.sql',
+  'pg_buffercache.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_buffercache',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_buffercache',
+    ],
+  },
+}
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
new file mode 100644
index 00000000000..03e781b7bab
--- /dev/null
+++ b/contrib/pg_freespacemap/meson.build
@@ -0,0 +1,29 @@
+pg_freespacemap = shared_module('pg_freespacemap',
+  files(
+    'pg_freespacemap.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_freespacemap--1.0--1.1.sql',
+  'pg_freespacemap--1.1--1.2.sql',
+  'pg_freespacemap--1.1.sql',
+  'pg_freespacemap.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_freespacemap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_freespacemap',
+    ],
+    'regress_args': [
+      '--temp-config', files('pg_freespacemap.conf')
+    ],
+  },
+}
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..20533fb3ec9
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,27 @@
+pg_prewarm = shared_module('pg_prewarm',
+  files(
+    'autoprewarm.c',
+    'pg_prewarm.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_prewarm--1.0--1.1.sql',
+  'pg_prewarm--1.1--1.2.sql',
+  'pg_prewarm--1.1.sql',
+  'pg_prewarm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_prewarm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..1c76bf9cfbc
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,34 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+  files('pg_stat_statements.c'),
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_stat_statements.control',
+  'pg_stat_statements--1.4.sql',
+  'pg_stat_statements--1.9--1.10.sql',
+  'pg_stat_statements--1.8--1.9.sql',
+  'pg_stat_statements--1.7--1.8.sql',
+  'pg_stat_statements--1.6--1.7.sql',
+  'pg_stat_statements--1.5--1.6.sql',
+  'pg_stat_statements--1.4--1.5.sql',
+  'pg_stat_statements--1.3--1.4.sql',
+  'pg_stat_statements--1.2--1.3.sql',
+  'pg_stat_statements--1.1--1.2.sql',
+  'pg_stat_statements--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_stat_statements',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_stat_statements',
+    ],
+    'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+  },
+}
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
new file mode 100644
index 00000000000..70ae62fccef
--- /dev/null
+++ b/contrib/pg_surgery/meson.build
@@ -0,0 +1,25 @@
+pg_surgery = shared_module('pg_surgery',
+  files(
+    'heap_surgery.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_surgery--1.0.sql',
+  'pg_surgery.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_surgery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'heap_surgery',
+    ],
+  },
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..6818cddc63f
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,35 @@
+pg_trgm = shared_module('pg_trgm',
+  files(
+    'trgm_gin.c',
+    'trgm_gist.c',
+    'trgm_op.c',
+    'trgm_regexp.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_trgm--1.0--1.1.sql',
+  'pg_trgm--1.1--1.2.sql',
+  'pg_trgm--1.2--1.3.sql',
+  'pg_trgm--1.3--1.4.sql',
+  'pg_trgm--1.3.sql',
+  'pg_trgm--1.4--1.5.sql',
+  'pg_trgm--1.5--1.6.sql',
+  'pg_trgm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_trgm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_trgm',
+      'pg_word_trgm',
+      'pg_strict_word_trgm',
+    ],
+  },
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..7eacc25f968
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,27 @@
+pg_visibility = shared_module('pg_visibility',
+  files(
+    'pg_visibility.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_visibility--1.0--1.1.sql',
+  'pg_visibility--1.1--1.2.sql',
+  'pg_visibility--1.1.sql',
+  'pg_visibility.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_visibility',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_visibility',
+    ],
+  },
+}
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
new file mode 100644
index 00000000000..bdd817bba10
--- /dev/null
+++ b/contrib/pg_walinspect/meson.build
@@ -0,0 +1,37 @@
+pg_walinspect_sources = files('pg_walinspect.c')
+
+if host_system == 'win32'
+  pg_walinspect_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',
+        '--NAME', 'pg_walinspect',
+      ]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pg_walinspect = shared_module('pg_walinspect',
+  pg_walinspect_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_walinspect.control',
+  'pg_walinspect--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_walinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_walinspect',
+    ],
+    'regress_args': ['--temp-config', files('walinspect.conf')],
+  },
+}
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
new file mode 100644
index 00000000000..54ba2e7f13b
--- /dev/null
+++ b/contrib/pgcrypto/meson.build
@@ -0,0 +1,100 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+pgcrypto_sources = files(
+  'crypt-blowfish.c',
+  'crypt-des.c',
+  'crypt-gensalt.c',
+  'crypt-md5.c',
+  'mbuf.c',
+  'pgcrypto.c',
+  'pgp-armor.c',
+  'pgp-cfb.c',
+  'pgp-compress.c',
+  'pgp-decrypt.c',
+  'pgp-encrypt.c',
+  'pgp-info.c',
+  'pgp-mpi.c',
+  'pgp-pgsql.c',
+  'pgp-pubdec.c',
+  'pgp-pubenc.c',
+  'pgp-pubkey.c',
+  'pgp-s2k.c',
+  'pgp.c',
+  'px-crypt.c',
+  'px-hmac.c',
+  'px.c',
+)
+
+pgcrypto_regress = [
+  'init',
+  'md5',
+  'sha1',
+  'hmac-md5',
+  'hmac-sha1',
+  'blowfish',
+  'rijndael',
+  'sha2',
+  'des',
+  '3des',
+  'cast5',
+  'crypt-des',
+  'crypt-md5',
+  'crypt-blowfish',
+  'crypt-xdes',
+  'pgp-armor',
+  'pgp-decrypt',
+  'pgp-encrypt',
+  'pgp-pubkey-decrypt',
+  'pgp-pubkey-encrypt',
+  'pgp-info',
+]
+
+pgcrypto_openssl_sources = files(
+  'openssl.c',
+  'pgp-mpi-openssl.c',
+)
+
+pgcrypto_deps = []
+pgcrypto_link_with = []
+
+pgcrypto_deps += ssl
+pgcrypto_sources += pgcrypto_openssl_sources
+
+if zlib.found()
+  pgcrypto_deps += zlib
+  pgcrypto_regress += 'pgp-compression'
+else
+  pgcrypto_regress += 'pgp-zlib-DISABLED'
+endif
+
+pgcrypto = shared_module('pgcrypto',
+  pgcrypto_sources,
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'link_with': [pgcrypto_link_with, contrib_mod_args.get('link_with', [])],
+    'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
+  },
+)
+
+install_data(
+  'pgcrypto--1.0--1.1.sql',
+  'pgcrypto--1.1--1.2.sql',
+  'pgcrypto--1.2--1.3.sql',
+  'pgcrypto--1.3.sql',
+  'pgcrypto.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgcrypto',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      pgcrypto_regress,
+    ],
+  },
+}
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
new file mode 100644
index 00000000000..358d23cf2ee
--- /dev/null
+++ b/contrib/pgrowlocks/meson.build
@@ -0,0 +1,15 @@
+pgrowlocks = shared_module('pgrowlocks',
+  files(
+    'pgrowlocks.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgrowlocks--1.0--1.1.sql',
+  'pgrowlocks--1.1--1.2.sql',
+  'pgrowlocks--1.2.sql',
+  'pgrowlocks.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
new file mode 100644
index 00000000000..8e765fc997a
--- /dev/null
+++ b/contrib/pgstattuple/meson.build
@@ -0,0 +1,32 @@
+pgstattuple = shared_module('pgstattuple',
+  files(
+    'pgstatapprox.c',
+    'pgstatindex.c',
+    'pgstattuple.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgstattuple--1.0--1.1.sql',
+  'pgstattuple--1.1--1.2.sql',
+  'pgstattuple--1.2--1.3.sql',
+  'pgstattuple--1.3--1.4.sql',
+  'pgstattuple--1.4--1.5.sql',
+  'pgstattuple--1.4.sql',
+  'pgstattuple.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgstattuple',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pgstattuple',
+    ],
+  },
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..9be84a6b67f
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,33 @@
+postgres_fdw_sources = files(
+  'connection.c',
+  'deparse.c',
+  'option.c',
+  'postgres_fdw.c',
+  'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': pg_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'postgres_fdw.control',
+  'postgres_fdw--1.0.sql',
+  'postgres_fdw--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'postgres_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'postgres_fdw',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
new file mode 100644
index 00000000000..b1f9db50e42
--- /dev/null
+++ b/contrib/seg/meson.build
@@ -0,0 +1,50 @@
+seg_sources = files(
+  'seg.c',
+)
+
+# segscan is compiled as part of segparse
+seg_scan = custom_target('segscan',
+  input: ['segscan.l'],
+  output: ['segscan.c'],
+  command: [flex_cmd, '@INPUT@'],)
+generated_sources += seg_scan
+
+seg_parse = custom_target('segparse',
+  input: 'segparse.y',
+  output: 'segparse.c',
+  depends: seg_scan,
+  command: [bison_cmd, '@INPUT@'],)
+generated_sources += seg_parse
+seg_sources += seg_parse
+
+seg = shared_module('seg',
+  seg_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'seg.control',
+  'seg--1.0--1.1.sql',
+  'seg--1.1--1.2.sql',
+  'seg--1.1.sql',
+  'seg--1.2--1.3.sql',
+  'seg--1.3--1.4.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'segdata.h',
+  install_dir: dir_include_extension / 'seg',
+)
+
+tests += {
+  'name': 'seg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'seg',
+    ],
+  },
+}
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
new file mode 100644
index 00000000000..9fa6013c91f
--- /dev/null
+++ b/contrib/sepgsql/meson.build
@@ -0,0 +1,34 @@
+if not selinux.found()
+  subdir_done()
+endif
+
+sepgsql_sources = files(
+  'database.c',
+  'dml.c',
+  'hooks.c',
+  'label.c',
+  'proc.c',
+  'relation.c',
+  'schema.c',
+  'selinux.c',
+  'uavc.c',
+)
+
+sepgsql = shared_module('sepgsql',
+  sepgsql_sources,
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [selinux, pg_mod_args['dependencies']],
+  }
+)
+
+custom_target('sepgsql.sql',
+  input: 'sepgsql.sql.in',
+  output: 'sepgsql.sql',
+  command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'],
+  capture: true,
+  install: true,
+  install_dir: contrib_data_args['install_dir'],
+)
+
+# TODO: implement sepgsql tests
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..4c26242595a
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,47 @@
+autoinc = shared_module('autoinc',
+  ['autoinc.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+  ['insert_username.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'insert_username.control',
+  'insert_username--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+moddatetime = shared_module('moddatetime',
+  ['moddatetime.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'moddatetime.control',
+  'moddatetime--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+  ['refint.c'],
+  kwargs: contrib_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+  },
+)
+
+install_data('refint.control', 'refint--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
new file mode 100644
index 00000000000..dfa51a0934c
--- /dev/null
+++ b/contrib/sslinfo/meson.build
@@ -0,0 +1,21 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+sslinfo = shared_module('sslinfo',
+  files(
+    'sslinfo.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  }
+)
+
+install_data(
+  'sslinfo--1.0--1.1.sql',
+  'sslinfo--1.1--1.2.sql',
+  'sslinfo--1.2.sql',
+  'sslinfo.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
new file mode 100644
index 00000000000..e94d9d7de44
--- /dev/null
+++ b/contrib/tablefunc/meson.build
@@ -0,0 +1,25 @@
+tablefunc = shared_module('tablefunc',
+  files(
+    'tablefunc.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tablefunc--1.0.sql',
+  'tablefunc.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'tablefunc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tablefunc',
+    ],
+  },
+}
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
new file mode 100644
index 00000000000..c1005774087
--- /dev/null
+++ b/contrib/tcn/meson.build
@@ -0,0 +1,24 @@
+tcn = shared_module('tcn',
+  files(
+    'tcn.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tcn--1.0.sql',
+  'tcn.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tcn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'tcn',
+    ],
+  },
+}
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..0719350a0dd
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,62 @@
+test_decoding_sources = files(
+  'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+  test_decoding_sources,
+  kwargs: contrib_mod_args,
+)
+
+tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ddl',
+      'xact',
+      'rewrite',
+      'toast',
+      'permissions',
+      'decoding_in_xact',
+      'decoding_into_rel',
+      'binary',
+      'prepared',
+      'replorigin',
+      'time',
+      'messages',
+      'spill',
+      'slot',
+      'truncate',
+      'stream',
+      'stats',
+      'twophase',
+      'twophase_stream',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'isolation': {
+    'specs': [
+      'mxact',
+      'delayed_startup',
+      'ondisk_startup',
+      'concurrent_ddl_dml',
+      'oldest_xmin',
+      'snapshot_transfer',
+      'subxact_without_top',
+      'concurrent_stream',
+      'twophase_snapshot',
+      'slot_creation_error',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_repl_stats.pl',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..577482d18f2
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,24 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+  files(
+    'tsm_system_rows.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_rows--1.0.sql',
+  'tsm_system_rows.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_rows',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_rows',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..ce5fd138501
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,24 @@
+tsm_system_time = shared_module('tsm_system_time',
+  files(
+    'tsm_system_time.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_time--1.0.sql',
+  'tsm_system_time.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_time',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_time',
+    ],
+  },
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..e99bbe5bdf9
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,32 @@
+unaccent = shared_module('unaccent',
+  files(
+    'unaccent.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'unaccent--1.0--1.1.sql',
+  'unaccent--1.1.sql',
+  'unaccent.control',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'unaccent.rules',
+  install_dir: dir_data / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+tests += {
+  'name': 'unaccent',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'unaccent',
+    ],
+    'regress_args': ['--encoding=UTF8'],
+  },
+}
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
new file mode 100644
index 00000000000..dac73feae4e
--- /dev/null
+++ b/contrib/uuid-ossp/meson.build
@@ -0,0 +1,33 @@
+if not uuid.found()
+  subdir_done()
+endif
+
+uuid_ossp = shared_module('uuid-ossp',
+  files(
+    'uuid-ossp.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [uuid, pg_mod_args['dependencies']],
+  },
+
+)
+
+install_data(
+  'uuid-ossp--1.0--1.1.sql',
+  'uuid-ossp--1.1.sql',
+  'uuid-ossp.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'uuid-ossp',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'uuid_ossp',
+    ],
+  },
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..ed0740212f6
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,16 @@
+executable('vacuumlo',
+  ['vacuumlo.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name' : 'vacuumlo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests' :[
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..d25549a1fb3
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,32 @@
+if not libxml.found()
+  subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+  files(
+    'xpath.c',
+    'xslt_proc.c',
+  ),
+  c_pch: pch_postgres_h,
+  kwargs: contrib_mod_args + {
+    'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'xml2--1.0--1.1.sql',
+  'xml2--1.1.sql',
+  'xml2.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'xml2',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'xml2',
+    ],
+  },
+}
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
new file mode 100644
index 00000000000..328f33e5de3
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -0,0 +1,19 @@
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_compat = both_libraries('libecpg_compat',
+  'informix.c',
+  include_directories : ['.', ecpg_inc, postgres_inc, libpq_inc],
+  dependencies: [frontend_shlib_code, thread_dep],
+  link_with: [ecpglib, ecpg_pgtypes],
+  soversion: host_system != 'win32' ? '3' : '',
+  version: '3.'+pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpg_compat.get_shared_lib(),
+  description: 'PostgreSQL libecpg_compat library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
new file mode 100644
index 00000000000..9914aa936db
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -0,0 +1,34 @@
+ecpglib_sources = files(
+  'connect.c',
+  'data.c',
+  'descriptor.c',
+  'error.c',
+  'execute.c',
+  'memory.c',
+  'misc.c',
+  'prepare.c',
+  'sqlda.c',
+  'typename.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpglib = both_libraries('libecpg',
+  ecpglib_sources,
+  include_directories : ['.', ecpg_inc, postgres_inc],
+  dependencies: [frontend_shlib_code, libpq, thread_dep],
+  link_with: [ecpg_pgtypes],
+  soversion: host_system != 'win32' ? '6' : '',
+  version: '6.'+pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpglib.get_shared_lib(),
+  description: 'PostgreSQL libecpg library',
+  url: pg_url,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build
new file mode 100644
index 00000000000..246e399ebd3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build
new file mode 100644
index 00000000000..c95d0455b9a
--- /dev/null
+++ b/src/interfaces/ecpg/include/meson.build
@@ -0,0 +1,51 @@
+ecpg_inc = include_directories('.')
+
+ecpg_conf_keys = [
+  'ENABLE_THREAD_SAFETY',
+  'HAVE_INT64',
+  'HAVE_LONG_INT_64',
+  'HAVE_LONG_LONG_INT_64',
+  'PG_USE_STDBOOL',
+]
+
+ecpg_conf_data = configuration_data()
+
+foreach key : ecpg_conf_keys
+  if cdata.has(key)
+    ecpg_conf_data.set(key, cdata.get(key))
+  endif
+endforeach
+
+ecpg_config_h = configure_file(
+  output: 'ecpg_config.h',
+  configuration: ecpg_conf_data,
+  install_dir: dir_include,
+)
+configure_files += ecpg_config_h
+
+generated_sources_ac += {'src/interfaces/ecpg/include': ['stamp-h']}
+
+install_headers(
+  'ecpg_informix.h',
+  'ecpgerrno.h',
+  'ecpglib.h',
+  'ecpgtype.h',
+  'pgtypes.h',
+  'pgtypes_date.h',
+  'pgtypes_error.h',
+  'pgtypes_interval.h',
+  'pgtypes_numeric.h',
+  'pgtypes_timestamp.h',
+  'sql3types.h',
+  'sqlca.h',
+  'sqlda.h',
+  'sqlda-compat.h',
+  'sqlda-native.h',
+)
+
+install_headers(
+  'datetime.h',
+  'decimal.h',
+  'sqltypes.h',
+  install_dir: dir_include_pkg / 'informix' / 'esql',
+)
diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build
new file mode 100644
index 00000000000..ffbe84c0e88
--- /dev/null
+++ b/src/interfaces/ecpg/meson.build
@@ -0,0 +1,5 @@
+subdir('include')
+subdir('pgtypeslib')
+subdir('ecpglib')
+subdir('compatlib')
+subdir('preproc')
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
new file mode 100644
index 00000000000..28c4e7314be
--- /dev/null
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -0,0 +1,27 @@
+ecpg_pgtypes_sources = files(
+  'common.c',
+  'datetime.c',
+  'dt_common.c',
+  'interval.c',
+  'numeric.c',
+  'timestamp.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_pgtypes = both_libraries('libpgtypes',
+  ecpg_pgtypes_sources,
+  include_directories : ['.', ecpg_inc, postgres_inc],
+  dependencies: [frontend_shlib_code],
+  version: '3.'+pg_version_major.to_string(),
+  soversion: host_system != 'win32' ? '3' : '',
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpg_pgtypes.get_shared_lib(),
+  description: 'PostgreSQL libpgtypes library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
new file mode 100644
index 00000000000..fafeef01919
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -0,0 +1,104 @@
+ecpg_sources = files(
+  'c_keywords.c',
+  'descriptor.c',
+  'ecpg.c',
+  'ecpg_keywords.c',
+  'keywords.c',
+  'output.c',
+  'parser.c',
+  'type.c',
+  '../ecpglib/typename.c',
+  'variable.c',
+)
+
+pgc = custom_target('pgc.c',
+  input: ['pgc.l'],
+  output: ['pgc.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += pgc
+ecpg_sources += pgc
+
+ecpg_files = [
+    'ecpg.addons',
+    'ecpg.header',
+    'ecpg.tokens',
+    'ecpg.trailer',
+    'ecpg.type',
+]
+
+preproc_y = custom_target('preproc.y',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: ['preproc.y'],
+  command: [
+    perl, files('parse.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--output', '@OUTPUT0@',
+  ],
+)
+generated_sources += preproc_y
+
+check_rules = custom_target('preproc.y.check_rules',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: 'preproc.y.check_rules',
+  command: [
+    perl, files('check_rules.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--stamp', '@OUTPUT0@',
+  ],
+)
+
+preproc = custom_target('preproc.c',
+  input: [preproc_y],
+  output: ['preproc.c', 'preproc.h'],
+  depends: check_rules,
+  command: [bison_cmd, '-d', '@INPUT@'],
+)
+generated_sources += preproc.to_list()
+ecpg_sources += preproc
+
+c_kwlist = custom_target('c_kwlist_d.h',
+  input: ['c_kwlist.h'],
+  output: ['c_kwlist_d.h'],
+  command: [
+    perl,
+    '-I', '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanCKeywords',
+    '--no-case-fold', '@INPUT0@'
+  ],
+)
+generated_sources += c_kwlist
+ecpg_sources += c_kwlist
+
+ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
+  input: ['ecpg_kwlist.h'],
+  output: ['ecpg_kwlist_d.h'],
+  command: [
+    perl, '-I',
+    '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanECPGKeywords', '@INPUT0@',
+  ]
+)
+generated_sources += ecpg_kwlist
+ecpg_sources += ecpg_kwlist
+
+ecpg_exe = executable('ecpg',
+  ecpg_sources,
+  include_directories : ['.', ecpg_inc, postgres_inc],
+  dependencies: [frontend_shlib_code, libpq],
+  kwargs: default_bin_args,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build
new file mode 100644
index 00000000000..d73b05afd5e
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpg-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/test/compat_informix/meson.build b/src/interfaces/ecpg/test/compat_informix/meson.build
new file mode 100644
index 00000000000..c45dbe1582c
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_informix/meson.build
@@ -0,0 +1,31 @@
+pgc_files = [
+  'charfuncs',
+  'dec_test',
+  'describe',
+  'rfmtdate',
+  'rfmtlong',
+  'rnull',
+  'sqlda',
+  'test_informix',
+  'test_informix2',
+]
+
+pgc_extra_flags = {
+  'rnull': ['-r', 'no_indicator',],
+}
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'INFORMIX',] +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/compat_oracle/meson.build b/src/interfaces/ecpg/test/compat_oracle/meson.build
new file mode 100644
index 00000000000..ad99457865f
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_oracle/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+  'char_array',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'ORACLE',] +
+      ecpg_preproc_test_command_end,
+    install: false,
+    build_by_default: false,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/connect/meson.build b/src/interfaces/ecpg/test/connect/meson.build
new file mode 100644
index 00000000000..7e7918148f7
--- /dev/null
+++ b/src/interfaces/ecpg/test/connect/meson.build
@@ -0,0 +1,22 @@
+
+pgc_files = [
+  'test1',
+  'test2',
+  'test3',
+  'test4',
+  'test5',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
new file mode 100644
index 00000000000..3d040933faf
--- /dev/null
+++ b/src/interfaces/ecpg/test/meson.build
@@ -0,0 +1,77 @@
+pg_regress_ecpg_sources = pg_regress_c + files(
+  'pg_regress_ecpg.c',
+)
+
+pg_regress_ecpg = executable('pg_regress_ecpg',
+  pg_regress_ecpg_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc, include_directories('.')],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+# create .c files and executables from .pgc files
+ecpg_test_exec_kw = {
+  'dependencies': [frontend_code, libpq],
+  'include_directories': [ecpg_inc],
+  'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+  'build_by_default': false,
+  'install': false,
+}
+
+ecpg_preproc_kw = {
+  'output': '@BASENAME@.c',
+  'install': false,
+  'build_by_default': false,
+}
+
+ecpg_preproc_test_command_start = [
+  ecpg_exe,
+  '--regression',
+  '-I@CURRENT_SOURCE_DIR@',
+  '-I@SOURCE_ROOT@' + '/src/interfaces/ecpg/include/',
+]
+ecpg_preproc_test_command_end = [
+  '-o', '@OUTPUT@', '@INPUT@'
+]
+
+ecpg_test_dependencies = []
+
+subdir('connect')
+subdir('sql')
+subdir('pgtypeslib')
+subdir('preproc')
+subdir('compat_informix')
+subdir('compat_oracle')
+subdir('thread')
+
+ecpg_test_files = files(
+  'ecpg_schedule',
+)
+
+ecpg_regress_args = [
+  '--dbname=ecpg1_regression,ecpg2_regression',
+  '--create-role=regress_ecpg_user1,regress_ecpg_user2',
+  '--encoding=SQL_ASCII',
+]
+
+tests += {
+  'name': 'ecpg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'test_runner': pg_regress_ecpg,
+    'expecteddir': meson.current_source_dir(),
+    'inputdir': meson.current_build_dir(),
+    'schedule': ecpg_test_files,
+    'sql': [
+      'sql/twophase',
+    ],
+    'test_kwargs': {
+      'depends': meson.is_cross_build() ? [] : ecpg_test_dependencies,
+      },
+    'regress_args': ecpg_regress_args,
+  },
+}
diff --git a/src/interfaces/ecpg/test/pgtypeslib/meson.build b/src/interfaces/ecpg/test/pgtypeslib/meson.build
new file mode 100644
index 00000000000..08e6f675bdf
--- /dev/null
+++ b/src/interfaces/ecpg/test/pgtypeslib/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'dt_test',
+  'dt_test2',
+  'num_test',
+  'num_test2',
+  'nan_test',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/preproc/meson.build b/src/interfaces/ecpg/test/preproc/meson.build
new file mode 100644
index 00000000000..27c4f45caba
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/meson.build
@@ -0,0 +1,38 @@
+
+pgc_files = [
+  'array_of_struct',
+  'autoprep',
+  'comment',
+  'cursor',
+  'define',
+  'init',
+  'outofscope',
+  'pointer_to_struct',
+  'strings',
+  'type',
+  'variable',
+  'whenever',
+  'whenever_do_continue',
+]
+
+pgc_extra_flags = {
+  'array_of_struct': ['-c'],
+  'pointer_to_struct' : ['-c'],
+  'autoprep': ['-r', 'prepare'],
+  'strings': ['-i'],
+}
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/sql/meson.build b/src/interfaces/ecpg/test/sql/meson.build
new file mode 100644
index 00000000000..f7a7eb0ff72
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/meson.build
@@ -0,0 +1,46 @@
+pgc_files = [
+  'array',
+  'binary',
+  'bytea',
+  'code100',
+  'copystdout',
+  'createtableas',
+  'declare',
+  'define',
+  'desc',
+  'describe',
+  'dynalloc',
+  'dynalloc2',
+  'dyntest',
+  'execute',
+  'fetch',
+  'func',
+  'indicators',
+  'insupd',
+  'oldexec',
+  'parser',
+  'prepareas',
+  'quote',
+  'show',
+  'sqlda',
+  'twophase',
+]
+
+pgc_extra_flags = {
+  'oldexec': ['-r', 'questionmarks'],
+}
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/thread/meson.build b/src/interfaces/ecpg/test/thread/meson.build
new file mode 100644
index 00000000000..98efbcd57d3
--- /dev/null
+++ b/src/interfaces/ecpg/test/thread/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'thread_implicit',
+  'thread',
+  'prep',
+  'descriptor',
+  'alloc',
+]
+
+foreach pgc_file: pgc_files
+  exe_input = custom_target(pgc_file,
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw + {'dependencies': [frontend_code, libpq, thread_dep,]},
+  )
+endforeach
diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build
new file mode 100644
index 00000000000..73fffbee394
--- /dev/null
+++ b/src/interfaces/meson.build
@@ -0,0 +1,2 @@
+# NB: libpq is entered directly from the toplevel meson file
+subdir('ecpg')
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
new file mode 100644
index 00000000000..2092976d62e
--- /dev/null
+++ b/doc/src/sgml/meson.build
@@ -0,0 +1,258 @@
+docs = []
+alldocs = []
+doc_generated = []
+
+xmllint = find_program('xmllint', native: true, required: false)
+pandoc = find_program('pandoc', native: true, required: false)
+xsltproc = find_program('xsltproc', native: true, required: false)
+fop = find_program('fop', native: true, required: false)
+
+
+version_sgml = configure_file(
+  input: 'version.sgml.in',
+  output: 'version.sgml',
+  configuration: cdata,
+)
+configure_files += version_sgml
+
+doc_generated += custom_target('features-supported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt'),
+  output: 'features-supported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'YES', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+doc_generated += custom_target('features-unsupported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt'),
+  output: 'features-unsupported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'NO', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+doc_generated += custom_target('errcodes-table.sgml',
+  input: files(
+    '../../../src/backend/utils/errcodes.txt'),
+  output: 'errcodes-table.sgml',
+  command: [perl, files('generate-errcodes-table.pl'), '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+# FIXME: this actually has further inputs, adding depfile support to
+# generate-keywords-table.pl is probably the best way to address that
+# robustly.
+doc_generated += custom_target('keywords-table.sgml',
+  input: files(
+    '../../../src/include/parser/kwlist.h'),
+  output: 'keywords-table.sgml',
+  command: [perl, files('generate-keywords-table.pl'), '@CURRENT_SOURCE_DIR@'],
+  build_by_default: false,
+  install: false,
+  capture: true)
+
+# For everything else we need at least xmllint
+if not xmllint.found()
+  subdir_done()
+endif
+
+# Compute validity just once
+postgres_sgml_valid = custom_target('postgres.sgml.valid',
+  input: 'postgres.sgml',
+  output: 'postgres.sgml.valid',
+  command: [xmllint, '--noout', '--valid', '--path', '@OUTDIR@', '@INPUT@'],
+  depends: doc_generated,
+  build_by_default: true,
+  capture: true,
+)
+
+#
+# Full documentation as html, text
+#
+if xsltproc.found()
+  xsltproc_flags = [
+    '--stringparam', 'pg.version', pg_version,
+    '--param', 'website.stylesheet', '1'
+  ]
+
+
+  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
+  # depfile
+  html = custom_target('html',
+    input: ['stylesheet.xsl', 'postgres.sgml'],
+    output: 'html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html
+
+  # build multi-page html docs as part of docs target
+  docs += html
+
+  html_help = custom_target('html_help',
+    input: ['stylesheet-hh.xsl', 'postgres.sgml'],
+    output: 'htmlhelp',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html_help
+
+
+  # single-page HTML
+  postgres_html = custom_target('postgres.html',
+    input: ['stylesheet-html-nochunk.xsl', 'postgres.sgml'],
+    output: 'postgres.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_html
+
+  # single-page text
+  if pandoc.found()
+    postgres_txt = custom_target('postgres.txt',
+      input: [postgres_html],
+      output: 'postgres.txt',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+endif
+
+
+#
+# INSTALL in html, text
+#
+if xsltproc.found()
+  install_xml = custom_target('INSTALL.xml',
+    input: ['standalone-profile.xsl', 'standalone-install.xml'],
+    output: 'INSTALL.xml',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+    build_by_default: false,
+  )
+  install_html = custom_target('INSTALL.html',
+    input: ['stylesheet-text.xsl', install_xml],
+    output: 'INSTALL.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += install_html
+
+  if pandoc.found()
+    # XXX: Makefile does an iconv translit here, but unclear why?
+    install = custom_target('INSTALL',
+      input: [install_html],
+      output: 'INSTALL',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+
+endif
+
+
+#
+# Man pages
+#
+if xsltproc.found()
+  # FIXME: implement / consider sqlmansectnum logic
+  man = custom_target('man',
+    input: ['stylesheet-man.xsl', 'postgres.sgml'],
+    output: ['man1', 'man3', 'man7'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+
+  # build by default as part of docs target
+  docs += man
+endif
+
+
+#
+# Full documentation as PDF
+#
+if fop.found() and xsltproc.found()
+  xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
+
+  foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
+    postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+    postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
+
+    postgres_x_fo = custom_target(postgres_x_fo_f,
+      input: ['stylesheet-fo.xsl', 'postgres.sgml'],
+      output: [postgres_x_fo_f],
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
+                '--stringparam', 'paper.type', detail,
+                '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+
+    postgres_x_pdf = custom_target(postgres_x_pdf_f,
+      input: [postgres_x_fo],
+      output: [postgres_x_pdf_f],
+      command: [fop, '-fo', '@INPUT@', '-pdf', '@OUTPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_x_pdf
+  endforeach
+endif
+
+
+#
+# epub
+#
+
+# This was previously implemented using dbtoepub - but that doesn't seem to
+# support running in build != source directory (i.e. VPATH builds already
+# weren't supported).
+if pandoc.found() and xsltproc.found()
+  # XXX: Wasn't able to make pandoc successfully resolve entities
+  # XXX: Perhaps we should just make all targets use this, to avoid repeatedly
+  # building whole thing? It's comparatively fast though.
+  postgres_full_xml = custom_target('postgres-full.xml',
+    input: ['resolv.xsl', 'postgres.sgml'],
+    output: ['postgres-full.xml'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_flags,
+              '-o', '@OUTPUT@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+  postgres_epub = custom_target('postgres.epub',
+    input: [postgres_full_xml],
+    output: 'postgres.epub',
+    command: [pandoc, '-f', 'docbook', '-t', 'epub', '-o', '@OUTPUT@', '--resource-path=@CURRENT_SOURCE_DIR@',
+              '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_epub
+endif
+
+docs = []
+if docs.length() == 0
+  run_target('docs', command: [missing, 'xsltproc'])
+else
+  alias_target('docs', docs)
+endif
+
+alldocs = []
+if alldocs.length() == 0
+  run_target('alldocs', command: [missing, 'xsltproc'])
+else
+  alias_target('alldocs', alldocs)
+endif
diff --git a/doc/src/sgml/resolv.xsl b/doc/src/sgml/resolv.xsl
new file mode 100644
index 00000000000..c69ba714dab
--- /dev/null
+++ b/doc/src/sgml/resolv.xsl
@@ -0,0 +1,7 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/doc/src/sgml/version.sgml.in b/doc/src/sgml/version.sgml.in
new file mode 100644
index 00000000000..fa5ff343f40
--- /dev/null
+++ b/doc/src/sgml/version.sgml.in
@@ -0,0 +1,2 @@
+<!ENTITY version @PG_VERSION@>
+<!ENTITY majorversion @PG_MAJORVERSION@>
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..2374028cbda
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'authentication',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_password.pl',
+      't/002_saslprep.pl',
+    ],
+  },
+}
diff --git a/src/test/icu/meson.build b/src/test/icu/meson.build
new file mode 100644
index 00000000000..c78e71801fe
--- /dev/null
+++ b/src/test/icu/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'icu',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_database.pl',
+    ],
+    'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..bda9b9878a9
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,54 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+  'isolation_main.c',
+)
+
+# see src/backend/replication/meson.build for depend logic
+spec_scanner = custom_target('specscanner',
+  input : files('specscanner.l'),
+  output : ['specscanner.c'],
+  command : [flex_cmd, '@INPUT@'],
+)
+generated_sources += spec_scanner
+
+isolationtester_sources = files('isolationtester.c')
+spec_parser = custom_target('specparse',
+  input: 'specparse.y',
+  output: 'specparse.c',
+  depends: spec_scanner,
+  command: [bison_cmd, '@INPUT@'],)
+isolationtester_sources += spec_parser
+generated_sources += spec_parser
+
+pg_isolation_regress = executable('pg_isolation_regress',
+  isolation_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+
+isolationtester = executable('isolationtester',
+  isolationtester_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'schedule': files('isolation_schedule'),
+    'test_kwargs': {
+      'priority': 40,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..572e387a0be
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,15 @@
+tests += {
+  'name': 'kerberos',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # kerberos tests are slow, start early
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env' : {
+      'with_gssapi': gssapi.found() ? 'yes' : 'no',
+      'with_krb_srvnam': 'postgres',
+    },
+  },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..8a05b48147b
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'ldap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env' : {'with_ldap': ldap.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..c620df338e0
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,23 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+   subdir('ssl')
+endif
+
+if ldap.found()
+   subdir('ldap')
+endif
+
+if gssapi.found()
+   subdir('kerberos')
+endif
+
+if icu.found()
+  subdir('icu')
+endif
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..58254d093a4
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,16 @@
+tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'summarization-and-inprogress-insertion',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/01_workitems.pl',
+      't/02_wal_consistency.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..60cb12164d2
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,18 @@
+tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'commit_timestamp',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+      't/002_standby.pl',
+      't/003_standby_2.pl',
+      't/004_restart.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..3ce0ee2e2f6
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+  ['delay_execution.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'delay_execution',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'partition-addition',
+      'partition-removal-1',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..77a4377dc21
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+  ['dummy_index_am.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_index_am.control',
+  'dummy_index_am--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_index_am',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'reloptions',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..7d320eb7935
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+  ['dummy_seclabel.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_seclabel.control',
+  'dummy_seclabel--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_seclabel',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dummy_seclabel',
+    ],
+  },
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..fc07f77faf2
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,20 @@
+libpq_pipeline = executable('libpq_pipeline',
+  files(
+    'libpq_pipeline.c',
+  ),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  },
+)
+
+tests += {
+  'name': 'libpq_pipeline',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_libpq_pipeline.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..a80e6e2ce29
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,27 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_lfind')
+subdir('test_misc')
+subdir('test_oat_hooks')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..323427858f0
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+  ['plsample.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plsample.control',
+  'plsample--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'plsample',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plsample',
+    ],
+  },
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..efd3f1f113b
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,14 @@
+tests += {
+  'name': 'snapshot_too_old',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'test_kwargs': {'priority': 40}, # sto tests are slow, start early
+    'specs': [
+      'sto_using_cursor',
+      'sto_using_select',
+      'sto_using_hash_index',
+    ],
+    'regress_args': ['--temp-config', files('sto.conf')],
+  },
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..676f2a258cb
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+  ['spgist_name_ops.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'spgist_name_ops.control',
+  'spgist_name_ops--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'spgist_name_ops',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'spgist_name_ops',
+    ],
+  },
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..f5eba869980
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,47 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+  ['ssl_passphrase_func.c'],
+  kwargs: pg_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  }
+)
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+  cert = custom_target('server.crt',
+    output: ['server.crt', 'server.ckey'],
+    command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+      '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+    build_by_default: false,
+    install: false,
+  )
+
+  # needs to agree with what's in the test script
+  pass = 'FooBaR1'
+
+  enccert = custom_target('server.key',
+    input: [cert[1]],
+    output: ['server.key'],
+    command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+  )
+endif
+
+tests += {
+  'name': 'ssl_passphrase_callback',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_testfunc.pl',
+    ],
+    'env': {'with_ssl': 'openssl'},
+  },
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..6861ae38116
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+  ['test_bloomfilter.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_bloomfilter.control',
+  'test_bloomfilter--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_bloomfilter',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_bloomfilter',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..367730e95db
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,42 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+  ['test_ddl_deparse.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ddl_deparse.control',
+  'test_ddl_deparse--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ddl_deparse',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ddl_deparse',
+      'create_extension',
+      'create_schema',
+      'create_type',
+      'create_conversion',
+      'create_domain',
+      'create_sequence_1',
+      'create_table',
+      'create_transform',
+      'alter_table',
+      'create_view',
+      'create_trigger',
+      'create_rule',
+      'comment_on',
+      'alter_function',
+      'alter_sequence',
+      'alter_ts_config',
+      'alter_type_enum',
+      'opfamily',
+      'defprivs',
+      'matviews',
+    ],
+  },
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..e95a9f2e7eb
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,45 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_ext1--1.0.sql',
+  'test_ext1.control',
+  'test_ext2--1.0.sql',
+  'test_ext2.control',
+  'test_ext3--1.0.sql',
+  'test_ext3.control',
+  'test_ext4--1.0.sql',
+  'test_ext4.control',
+  'test_ext5--1.0.sql',
+  'test_ext5.control',
+  'test_ext6--1.0.sql',
+  'test_ext6.control',
+  'test_ext7--1.0--2.0.sql',
+  'test_ext7--1.0.sql',
+  'test_ext7.control',
+  'test_ext8--1.0.sql',
+  'test_ext8.control',
+  'test_ext_cine--1.0.sql',
+  'test_ext_cine--1.0--1.1.sql',
+  'test_ext_cine.control',
+  'test_ext_cor--1.0.sql',
+  'test_ext_cor.control',
+  'test_ext_cyclic1--1.0.sql',
+  'test_ext_cyclic1.control',
+  'test_ext_cyclic2--1.0.sql',
+  'test_ext_cyclic2.control',
+  'test_ext_evttrig--1.0--2.0.sql',
+  'test_ext_evttrig--1.0.sql',
+  'test_ext_evttrig.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_extensions',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_extensions',
+      'test_extdepend',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..193c28a3da9
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+  ['test_ginpostinglist.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ginpostinglist.control',
+  'test_ginpostinglist--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ginpostinglist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ginpostinglist',
+    ],
+  },
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..b599dfc09e2
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+  ['test_integerset.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_integerset.control',
+  'test_integerset--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_integerset',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_integerset',
+    ],
+  },
+}
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
new file mode 100644
index 00000000000..9ccedc0aae3
--- /dev/null
+++ b/src/test/modules/test_lfind/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_lfind = shared_module('test_lfind',
+  ['test_lfind.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_lfind.control',
+  'test_lfind--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_lfind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_lfind',
+    ],
+  },
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..cfc830ff399
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,12 @@
+tests += {
+  'name': 'test_misc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_constraint_validation.pl',
+      't/002_tablespace.pl',
+      't/003_check_guc.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
new file mode 100644
index 00000000000..9b20e7c56d4
--- /dev/null
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+test_oat_hooks = shared_module('test_oat_hooks',
+  ['test_oat_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'test_oat_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_oat_hooks',
+    ],
+    'regress_args': ['--no-locale', '--encoding=UTF8'],
+  },
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..35ee6ce324b
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+  ['test_parser.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_parser.control',
+  'test_parser--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_parser',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_parser',
+    ],
+  },
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..41021829f3a
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_pg_dump.control',
+  'test_pg_dump--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_pg_dump',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..001c2d848bb
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+  ['test_predtest.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_predtest.control',
+  'test_predtest--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_predtest',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_predtest',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..963a6220a2a
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+  ['test_rbtree.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_rbtree.control',
+  'test_rbtree--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_rbtree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rbtree',
+    ],
+  },
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..61217dd2ca4
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+  ['test_regex.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_regex.control',
+  'test_regex--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_regex',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_regex',
+      'test_regex_utf8',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..3f49b8ff540
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,16 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+  ['test_rls_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'test_rls_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rls_hooks',
+    ],
+  },
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..9a0f83917a5
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,26 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+  files(
+    'setup.c',
+    'test.c',
+    'worker.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_shm_mq.control',
+  'test_shm_mq--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_shm_mq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_shm_mq',
+    ],
+  },
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..d69b0e7ce44
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'unsafe_tests',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'rolenames',
+      'alter_system_table',
+    ],
+  },
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..b729c354827
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,25 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+  files(
+    'worker_spi.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'worker_spi.control',
+  'worker_spi--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'worker_spi',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'worker_spi',
+    ],
+    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+  },
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..86c034d4242
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,43 @@
+tests += {
+  'name': 'recovery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # recovery tests are slow, start early
+    'tests' : [
+      't/001_stream_rep.pl',
+      't/002_archiving.pl',
+      't/003_recovery_targets.pl',
+      't/004_timeline_switch.pl',
+      't/005_replay_delay.pl',
+      't/006_logical_decoding.pl',
+      't/007_sync_rep.pl',
+      't/008_fsm_truncation.pl',
+      't/009_twophase.pl',
+      't/010_logical_decoding_timelines.pl',
+      't/011_crash_recovery.pl',
+      't/012_subtransactions.pl',
+      't/013_crash_restart.pl',
+      't/014_unlogged_reinit.pl',
+      't/015_promotion_pages.pl',
+      't/016_min_consistency.pl',
+      't/017_shm.pl',
+      't/018_wal_optimize.pl',
+      't/019_replslot_limit.pl',
+      't/020_archive_status.pl',
+      't/021_row_visibility.pl',
+      't/022_crash_temp_files.pl',
+      't/023_pitr_prepared_xact.pl',
+      't/024_archive_recovery.pl',
+      't/025_stuck_on_old_timeline.pl',
+      't/026_overwrite_contrecord.pl',
+      't/027_stream_regress.pl',
+      't/028_pitr_timelines.pl',
+      't/029_stats_restart.pl',
+      't/030_stats_cleanup_replica.pl',
+      't/031_recovery_conflict.pl',
+      't/032_relfilenode_reuse.pl',
+      't/033_replay_tsp_drops.pl',
+    ],
+  },
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..e2ee50504a9
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,58 @@
+# also used by isolationtester and ecpg tests
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+  'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+  regress_sources,
+  c_args: pg_regress_cflags,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/regress',
+  },
+)
+
+regress_module = shared_module('regress',
+  ['regress.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+shared_module('autoinc',
+  ['../../../contrib/spi/autoinc.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+shared_module('refint',
+  ['../../../contrib/spi/refint.c'],
+  kwargs: pg_mod_args + {
+    'c_args': refint_cflags + contrib_mod_args['c_args'],
+    'install': false,
+  },
+)
+
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'schedule': files('parallel_schedule'),
+    'test_kwargs': {
+      'priority': 50,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..7930170f013
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,13 @@
+tests += {
+  'name': 'ssl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env' : {'with_ssl': get_option('ssl')},
+    'tests': [
+      't/001_ssltests.pl',
+      't/002_scram.pl',
+      't/003_sslinfo.pl',
+    ],
+  },
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..fd4e183352e
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,42 @@
+tests += {
+  'name': 'subscription',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_rep_changes.pl',
+      't/002_types.pl',
+      't/003_constraints.pl',
+      't/004_sync.pl',
+      't/005_encoding.pl',
+      't/006_rewrite.pl',
+      't/007_ddl.pl',
+      't/008_diff_schema.pl',
+      't/009_matviews.pl',
+      't/010_truncate.pl',
+      't/011_generated.pl',
+      't/012_collation.pl',
+      't/013_partition.pl',
+      't/014_binary.pl',
+      't/015_stream.pl',
+      't/016_stream_subxact.pl',
+      't/017_stream_ddl.pl',
+      't/018_stream_subxact_abort.pl',
+      't/019_stream_subxact_ddl_abort.pl',
+      't/020_messages.pl',
+      't/021_twophase.pl',
+      't/022_twophase_cascade.pl',
+      't/023_twophase_stream.pl',
+      't/024_add_drop_pub.pl',
+      't/025_rep_changes_for_schema.pl',
+      't/026_stats.pl',
+      't/027_nosuperuser.pl',
+      't/028_row_filter.pl',
+      't/029_on_error.pl',
+      't/030_origin.pl',
+      't/031_column_list.pl',
+      't/100_bugs.pl',
+    ],
+  },
+}
diff --git a/configure b/configure
index e527363a9c6..61dcfa51c5f 100755
--- a/configure
+++ b/configure
@@ -21010,3 +21010,9 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/configure.ac b/configure.ac
index 1c392684bb8..d219227bec9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2495,3 +2495,9 @@ AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
                   [echo >src/interfaces/ecpg/include/stamp-h])
 
 AC_OUTPUT
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/conversion_helpers.txt b/conversion_helpers.txt
new file mode 100644
index 00000000000..b94ade57309
--- /dev/null
+++ b/conversion_helpers.txt
@@ -0,0 +1,9 @@
+convert list of files to quoted-one-per-line:
+
+	?\b\(\(?:\w\|\d\|_\|-\)+\)\.o ?\(?:\\
+\)? →   '\1.c',
+
+
+# check if all tap tests are known to meson
+m test --list > /tmp/tests.txt
+for f in $(git ls-files|grep 't/.*.pl$'|sort);do t=$(echo $f|sed -E -e 's/^.*\/(.*\/(t|test)\/.*)$/\1/');grep -q -L $t /tmp/tests.txt || echo $f;done
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..5cc4df4b946
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,3020 @@
+project('postgresql',
+  ['c'],
+  version: '16devel',
+  license: 'PostgreSQL',
+
+  # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for
+  # RHEL 7 has 0.55. < 0.54 would require replacing some uses of the fs
+  # module, < 0.53 all uses of fs. So far there's no need to go to >=0.56.
+  meson_version: '>=0.54',
+  default_options: [
+    'warning_level=2',
+    'b_pch=false',
+    'buildtype=release',
+  ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+host_system = host_machine.system() == 'windows' ? 'win32' : host_machine.system()
+build_system = build_machine.system() == 'windows' ? 'win32' : build_machine.system()
+
+host_cpu = host_machine.cpu_family()
+build_cpu = build_machine.cpu_family()
+
+fs = import('fs')
+pkgconfig = import('pkgconfig')
+if host_system == 'win32'
+  windows = import('windows')
+endif
+
+thread_dep = dependency('threads')
+
+
+# It's very easy to get into confusing states when the source directory
+# contains an in-place build. E.g. the wrong pg_config.h will be used. So just
+# refuse to build in that case.
+#
+# There's a more elaborate check later, that checks for conflicts around all
+# generated files. But we can only do that much further down the line, so this
+# quick check seems worth it. Adhering to this advice should clean up the
+# conflict, but won't protect against somebody doing make distclean or just
+# removing pg_config.h
+errmsg_nonclean_base ='''
+****
+Non-clean source code directory detected.
+
+To build with meson the source tree may not have an in-place, ./configure
+style, build configured. You can have both meson and ./configure style builds
+for the same source tree by building out-of-source / VPATH with
+configure. Alternatively use a separate check out for meson based builds.
+
+@0@
+****'''
+if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h')
+  errmsg_cleanup = 'To clean up, run make maintainer-clean in the source tree.'
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+  pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+  pg_version_arr = [pg_version.split('beta')[0], '0']
+elif pg_version.contains('rc')
+  pg_version_arr = [pg_version.split('rc')[0], '0']
+else
+  pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+pg_version_num = (pg_version_major*10000)+pg_version_minor
+
+cc = meson.get_compiler('c')
+
+cdata = configuration_data()
+
+pg_url = 'https://www.postgresql.org/'
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', pg_url)
+cdata.set_quoted('PACKAGE_VERSION', pg_version)
+cdata.set_quoted('PACKAGE_STRING', 'PostgreSQL @0@'.format(pg_version))
+cdata.set_quoted('PACKAGE_TARNAME', 'postgresql')
+
+pg_version += get_option('extra_version')
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+  pg_version, build_cpu, cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
+cdata.set('PG_VERSION_NUM', pg_version_num)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Search paths
+#
+# NB: Arguments added globally (via the below, or CFLAGS etc) are not taken
+# into account for configuration-time checks (so they are more
+# isolated). Flags that have to be taken into account for configure checks
+# have to be explicitly specified in configure tests.
+###############################################################
+
+g_c_args = []
+g_c_inc = []
+g_l_args = []
+
+if host_system == 'darwin'
+  # XXX, should this be required?
+  xcrun = find_program('xcrun', native: true, required: true)
+
+  sysroot = run_command(xcrun, '--show-sdk-path', check: true).stdout().strip()
+  message('sysroot is >@0@<'.format(sysroot))
+
+  g_c_args += ['-isysroot', sysroot]
+  g_l_args += ['-isysroot', sysroot]
+endif
+
+if host_system == 'linux' or host_system == 'cygwin'
+  g_c_args += '-D_GNU_SOURCE'
+endif
+
+
+g_c_inc += include_directories(get_option('extra_include_dirs'))
+g_c_lib = get_option('extra_lib_dirs')
+
+functional_cflags = g_c_args
+functional_cxxflags = g_c_args
+warning_cflags = []
+warning_cxxflags = []
+
+ldflags = g_l_args
+
+postgres_inc_d = ['src/include']
+
+# Windows replacement headers - need them to be usable during the feature
+# tests below.
+if host_system == 'win32'
+  postgres_inc_d += 'src/include/port/win32'
+  if cc.get_id() == 'msvc'
+    postgres_inc_d += 'src/include/port/win32_msvc'
+  endif
+endif
+
+postgres_inc = include_directories(postgres_inc_d)
+g_c_inc += postgres_inc
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true, native: true)
+python = find_program(get_option('PYTHON'), required: true, native: true)
+flex = find_program(get_option('FLEX'), native: true)
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'), native: true)
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
+touch = find_program('touch', native: true)
+program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
+dtrace = find_program(get_option('DTRACE'), native: true, required: get_option('dtrace'))
+missing = find_program('config/missing', native: true)
+
+# Internal programs
+testwrap = find_program('src/tools/testwrap', native: true)
+
+# used by PGXS
+install_sh = find_program('config/install-sh', native: true)
+
+bison_flags = []
+if bison.found()
+  bison_version_c = run_command(bison, '--version', check: true)
+  # bison version string helpfully is something like
+  # >>bison (GNU bison) 3.8.1<<
+  bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+  if bison_version.version_compare('>=3.0')
+    bison_flags += ['-Wno-deprecated']
+  endif
+endif
+bison_cmd = [bison, bison_flags, '-o', '@OUTPUT0@']
+
+flex_flags = []
+flex_wrapper = files('src/tools/pgflex')
+flex_cmd = [python, flex_wrapper, '--builddir', meson.build_root(),
+ '--privatedir', '@PRIVATE_DIR@', '--flex', flex, '-o', '@OUTPUT0@']
+
+flex_backup = ['-b']
+flex_fix_warning_script = files('src/tools/fix-old-flex-code.pl')
+flex_fix_warning = ['--perl', perl, '--fix_warning_script', flex_fix_warning_script]
+
+wget = find_program('wget', required: false, native: true)
+wget_flags = ['-O', '@OUTPUT0@', '--no-use-server-timestamps']
+
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# NB: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(python, 'src/tools/find_meson', check: true)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+  error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+    meson_binpath_r.returncode(),
+    meson_binpath_r.stdout(),
+    meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+  error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_impl = ''
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+  if i == 0
+    meson_impl = e
+  elif i == 1
+    meson_binpath = e
+  else
+    meson_args += e
+  endif
+  i += 1
+endforeach
+
+if meson_impl not in ['muon', 'meson']
+    error('unknown meson implementation "@0@"'.format(meson_impl))
+endif
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
+
+cdata.set('BLCKSZ', 8192, description:
+'''Size of a disk block --- this also limits the size of a tuple. You can set
+   it bigger if you need bigger tuples (although TOAST should reduce the need
+   to have large tuples, since fields can be spread across multiple tuples).
+   BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is
+   currently 2^15 (32768). This is determined by the 15-bit widths of the
+   lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).
+   Changing BLCKSZ requires an initdb.''')
+
+cdata.set('XLOG_BLCKSZ', get_option('wal-blocksize') * 1024)
+cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
+cdata.set('DEF_PGPORT', get_option('pgport'))
+cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
+cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb-srvnam'))
+if get_option('system-tzdata') != ''
+  cdata.set_quoted('SYSTEMTZDIR', get_option('system-tzdata'))
+endif
+
+
+
+###############################################################
+# Directories
+###############################################################
+
+# These are set by the equivalent --xxxdir configure options.  We
+# append "postgresql" to some of them, if the string does not already
+# contain "pgsql" or "postgres", in order to avoid directory clutter.
+
+pkg = 'postgresql'
+
+dir_prefix = get_option('prefix')
+
+dir_bin = get_option('bindir')
+
+dir_data = get_option('datadir')
+if not (dir_data.contains('pgsql') or dir_data.contains('postgres'))
+  dir_data = dir_data / pkg
+endif
+
+dir_sysconf = get_option('sysconfdir')
+if not (dir_sysconf.contains('pgsql') or dir_sysconf.contains('postgres'))
+  dir_sysconf = dir_sysconf / pkg
+endif
+
+dir_lib = get_option('libdir')
+
+dir_lib_pkg = dir_lib
+if not (dir_lib_pkg.contains('pgsql') or dir_lib_pkg.contains('postgres'))
+  dir_lib_pkg = dir_lib_pkg / pkg
+endif
+
+dir_pgxs = dir_lib_pkg / 'pgxs'
+
+dir_include = get_option('includedir')
+
+dir_include_pkg = dir_include
+dir_include_pkg_rel = ''
+if not (dir_include_pkg.contains('pgsql') or dir_include_pkg.contains('postgres'))
+  dir_include_pkg = dir_include_pkg / pkg
+  dir_include_pkg_rel = pkg
+endif
+
+dir_man = get_option('mandir')
+
+# FIXME: These used to be separately configurable - worth adding?
+dir_doc = get_option('datadir') / 'doc' / 'postgresql'
+dir_doc_html = dir_doc
+
+dir_locale = get_option('localedir')
+
+
+# Derived values
+dir_bitcode = dir_lib_pkg / 'bitcode'
+dir_include_internal = dir_include_pkg / 'internal'
+dir_include_server = dir_include_pkg / 'server'
+dir_include_extension = dir_include_server / 'extension'
+dir_data_extension = dir_data / 'extension'
+
+
+
+###############################################################
+# Library: bsd-auth
+###############################################################
+
+bsd_authopt = get_option('bsd-auth')
+bsd_auth = dependency('', required: false)
+if cc.check_header('bsd_auth.h', args: g_c_args, required: bsd_authopt)
+  cdata.set('USE_BSD_AUTH', 1)
+  bsd_auth = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: bonjour
+#
+# For now don't search for DNSServiceRegister in a library - only Apple's
+# Bonjour implementation, which is always linked, works.
+###############################################################
+
+bonjouropt = get_option('bonjour')
+bonjour = dependency('', required : false)
+if cc.check_header('dns_sd.h', args: g_c_args, required: bonjouropt) \
+  and cc.has_function('DNSServiceRegister', args: g_c_args)
+  cdata.set('USE_BONJOUR', 1)
+  bonjour = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+krb_srvtab = ''
+have_gssapi = false
+if not gssapiopt.disabled()
+  gssapi = dependency('krb5-gssapi', required: gssapiopt)
+  have_gssapi = gssapi.found()
+
+  if not have_gssapi
+  elif cc.check_header('gssapi/gssapi.h', args: g_c_args, dependencies: gssapi, required: false)
+    cdata.set('HAVE_GSSAPI_GSSAPI_H', 1)
+  elif cc.check_header('gssapi.h', args: g_c_args, dependencies: gssapi, required: gssapiopt)
+    cdata.set('HAVE_GSSAPI_H', 1)
+  else
+    have_gssapi = false
+  endif
+
+  if not have_gssapi
+  elif cc.has_function('gss_init_sec_context',
+                       include_directories: g_c_inc, args: g_c_args, dependencies: gssapi)
+    cdata.set('ENABLE_GSS', 1)
+
+    krb_srvtab = 'FILE:/@0@/krb5.keytab)'.format(get_option('sysconfdir'))
+    cdata.set_quoted('PG_KRB_SRVTAB', krb_srvtab)
+  elif gssapiopt.enabled()
+    error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+  else
+    have_gssapi = false
+  endif
+endif
+if not have_gssapi
+  gssapi = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if not ldapopt.disabled()
+
+  if host_system == 'win32'
+    ldap = cc.find_library('wldap32')
+    ldap_r = ldap
+  else
+    # macos framework dependency is buggy for ldap (one can argue
+    # whether it's Apple's or meson's fault), leading to an endless
+    # recursion with ldap.h including itself. See
+    # https://github.com/mesonbuild/meson/issues/10002
+    # Luckily we only need pkg-config support, so the workaround isn't
+    # too complicated
+    ldap = dependency('ldap', method: 'pkg-config', required: false)
+
+    # Before 2.5 openldap didn't have a pkg-config file..
+    if ldap.found()
+      ldap_r = ldap
+    else
+      ldap = cc.find_library('ldap', required: ldapopt, dirs: g_c_lib)
+      ldap_r = cc.find_library('ldap_r', required: ldapopt, dirs: g_c_lib)
+
+      # Use ldap_r for FE if available, else assume ldap is thread-safe.
+      # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+      if ldap.found() and not ldap_r.found()
+        ldap_r = ldap
+      endif
+    endif
+
+    if ldap.found() and cc.has_function('ldap_initialize', args: g_c_args, dependencies: [ldap, thread_dep])
+      cdata.set('HAVE_LDAP_INITIALIZE', 1)
+    endif
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if ldap.found() and ldap.type_name() == 'library'
+      # declare dependency so that the additional include dir it might reside in
+      # is added automatically where necessary
+      ldap = declare_dependency(dependencies: ldap,
+        include_directories: g_c_inc)
+      ldap_r = declare_dependency(dependencies: ldap_r,
+        include_directories: g_c_inc)
+    endif
+  endif
+
+  # FIXME: port autoconf openldap 2.5+ changes, as well as PGAC_LDAP_SAFE
+
+  if ldap.found()
+    cdata.set('USE_LDAP', 1)
+  endif
+
+else
+  ldap = dependency('', required : false)
+  ldap_r = ldap
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+  add_languages('cpp', required : true, native: false)
+  llvm = dependency('llvm', version : '>=3.9', method: 'config-tool', required: llvmopt)
+
+  if llvm.found()
+
+    cdata.set('USE_LLVM', 1)
+
+    cpp = meson.get_compiler('cpp')
+
+    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+    ccache = find_program('ccache', native: true, required: false)
+    clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+
+    # FIXME: the includes hardcoded here suck
+    llvm_irgen_args = [
+      '-c', '-o', '@OUTPUT@', '@INPUT@',
+      '-flto=thin', '-emit-llvm',
+      '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+      '-I@SOURCE_ROOT@/src/include',
+      '-I@BUILD_ROOT@/src/include',
+      '-I@BUILD_ROOT@/src/backend/utils/misc',
+      '-I@CURRENT_SOURCE_DIR@',
+      '-O2',
+      '-Wno-ignored-attributes',
+      '-Wno-empty-body',
+      g_c_args
+    ]
+
+    if ccache.found()
+      llvm_irgen_command = ccache
+      llvm_irgen_args = [clang.path()] + llvm_irgen_args
+    else
+      llvm_irgen_command = clang
+    endif
+
+    llvm_irgen_kw = {
+      'command': [llvm_irgen_command] + llvm_irgen_args,
+      'depfile': '@BASENAME@.c.bc.d',
+    }
+
+    irlink = find_program('src/tools/irlink', native: true)
+
+    llvm_irlink_kw = {
+      'command':[
+        irlink,
+        '--name', 'postgres',
+        '--lto', llvm_lto,
+        '--outdir', '@OUTPUT0@',
+        '--privdir', '@PRIVATE_DIR@',
+        '@INPUT@',
+      ],
+      'install': true,
+      'install_dir': dir_lib_pkg,
+    }
+
+  endif
+else
+  llvm = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+if not get_option('icu').disabled()
+  icu = dependency('icu-uc', required: get_option('icu').enabled())
+  icu_i18n = dependency('icu-i18n', required: get_option('icu').enabled())
+
+  if icu.found()
+    cdata.set('USE_ICU', 1)
+  endif
+
+else
+  icu = dependency('', required : false)
+  icu_i18n = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+  libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+  if libxml.found()
+    cdata.set('USE_LIBXML', 1)
+  endif
+else
+  libxml = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+  libxslt = dependency('libxslt', required: libxsltopt)
+
+  if libxslt.found()
+    cdata.set('USE_LIBXSLT', 1)
+  endif
+else
+  libxslt = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+  lz4 = dependency('liblz4', required: lz4opt)
+
+  if lz4.found()
+    cdata.set('USE_LZ4', 1)
+    cdata.set('HAVE_LIBLZ4', 1)
+  endif
+
+else
+  lz4 = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Tcl (for pltcl)
+# tclConfig.sh
+#
+# NB: tclConfig.sh is used in autoconf build for getting
+# TCL_SHARED_BUILD, TCL_INCLUDE_SPEC, TCL_LIBS and TCL_LIB_SPEC
+# variables. For now we have not seen a need to copy
+# that behaviour to the meson build.
+###############################################################
+
+tcl_dep = dependency('', required : false)
+tclopt = get_option('pltcl')
+tcl_version = get_option('tcl_version')
+if not tclopt.disabled()
+
+  # via pkg-config
+  tcl_dep = dependency(tcl_version, required: false)
+
+  if not tcl_dep.found()
+    tcl_dep = cc.find_library(tcl_version,
+      required: tclopt,
+      dirs: g_c_lib)
+  endif
+
+  if not cc.has_header('tcl.h', dependencies: tcl_dep, required: tclopt)
+    tcl_dep = dependency('', required: false)
+  endif
+endif
+
+
+
+###############################################################
+# Library: pam
+###############################################################
+
+pamopt = get_option('pam')
+if not pamopt.disabled()
+  pam = dependency('pam', required: false)
+
+  if not pam.found()
+    pam = cc.find_library('pam', required: pamopt, dirs: g_c_lib)
+  endif
+
+  if pam.found()
+    pam_header_found = false
+
+    # header file <security/pam_appl.h> or <pam/pam_appl.h> is required for PAM.
+    if cc.check_header('security/pam_appl.h', args: g_c_args, dependencies: pam, required: false)
+      cdata.set('HAVE_SECURITY_PAM_APPL_H', 1)
+      pam_header_found = true
+    elif cc.check_header('pam/pam_appl.h', args: g_c_args, dependencies: pam, required: pamopt)
+      cdata.set('HAVE_PAM_PAM_APPL_H', 1)
+      pam_header_found = true
+    endif
+
+    if pam_header_found
+      cdata.set('USE_PAM', 1)
+    else
+      pam = dependency('', required : false)
+    endif
+  endif
+else
+  pam = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('plperl')
+perl_dep = dependency('', required: false)
+
+if perlopt.disabled()
+  perl_may_work = false
+else
+  perl_may_work = true
+
+  # First verify that perl has the necessary dependencies installed
+  perl_mods = run_command(
+    [perl,
+     '-MConfig', '-MOpcode', '-MExtUtils::Embed', '-MExtUtils::ParseXS',
+     '-e', ''],
+    check: false)
+  if perl_mods.returncode() != 0
+    perl_may_work = false
+    perl_msg = 'perl installation does not have the required modules'
+  endif
+
+  # Then inquire perl about its configuration
+  if perl_may_work
+    # FIXME: include copy-edited comments from perl.m4
+    perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+    perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+    archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+    privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+    useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+    libperl = run_command(perl_conf_cmd, 'libperl', check: true).stdout()
+
+    perl_inc_dir = '@0@/CORE'.format(archlibexp)
+
+    if useshrplib != 'true'
+      perl_may_work = false
+      perl_msg = 'need a shared perl'
+    endif
+  endif
+
+  # XXX: should we only add directories that exist? Seems a bit annoying with
+  # macos' sysroot stuff...
+  #
+  # NB: For unknown reasons msys' python doesn't see these paths, despite gcc
+  # et al seeing them. So we can't use include_directories(), as that checks
+  # file existence.
+  if perl_may_work
+    # On most platforms, archlibexp is also where the Perl include files live ...
+    perl_ccflags = ['-I@0@'.format(perl_inc_dir)]
+    # ... but on newer macOS versions, we must use -iwithsysroot to look
+    # under sysroot
+    if not fs.is_file('@0@/perl.h'.format(perl_inc_dir)) and \
+       fs.is_file('@0@@1@/perl.h'.format(sysroot, perl_inc_dir))
+      perl_ccflags = ['-iwithsysroot', perl_inc_dir]
+    endif
+  endif
+
+  # check required headers are present
+  if perl_may_work and not \
+    cc.has_header('perl.h', args: g_c_args + perl_ccflags, required: false)
+    perl_may_work = false
+    perl_msg = 'missing perl.h'
+  endif
+
+  # Find perl library. This is made more complicated by the fact that the name
+  # Config.pm returns isn't directly usable (sometimes lib needs to be chopped
+  # off)
+  if perl_may_work
+    foreach p : ['perl', 'libperl', libperl, libperl.strip('lib'), fs.stem(libperl), fs.stem(libperl).strip('lib')]
+      perl_dep_int = cc.find_library(p,
+        dirs: ['@0@/CORE'.format(archlibexp)],
+        required: false)
+      if perl_dep_int.found()
+        break
+      endif
+    endforeach
+
+    if not perl_dep_int.found()
+      perl_may_work = false
+      perl_msg = 'missing libperl'
+    endif
+  endif
+
+  if perl_may_work
+    perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+    message('CCFLAGS recommended by Perl: @0@'.format(perl_ccflags_r))
+
+    foreach flag : perl_ccflags_r.split(' ')
+      if flag.startswith('-D') and \
+        (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+        perl_ccflags += flag
+      endif
+    endforeach
+
+    if host_system == 'win32'
+      perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+    endif
+
+    message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+    ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+
+    perl_ldopts = []
+    foreach ldopt : ldopts.split(' ')
+      if ldopt == ''
+        continue
+      # strawberry perl unhelpfully has that in ldopts
+      elif ldopt == '-s'
+        continue
+      # AIX perl has export file in ldopts
+      elif ldopt.startswith('-bE')
+        continue
+      endif
+
+      perl_ldopts += ldopt.strip('"')
+    endforeach
+
+    # FIXME: check if windows handling is necessary
+
+    message('LDFLAGS for embedding perl: "@0@" (ldopts: "@1@")'.format(
+      ' '.join(perl_ldopts), ldopts))
+
+    if perl_dep_int.found()
+      perl_dep = declare_dependency(
+        compile_args: perl_ccflags,
+        link_args: perl_ldopts,
+        version: perlversion,
+      )
+    endif
+  endif # perl_may_work
+
+  if not perl_may_work
+    if perlopt.enabled()
+      error('dependency perl failed: @0@'.format(perl_msg))
+    else
+      message('disabling optional dependency perl: @0@'.format(perl_msg))
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('plpython')
+if not pyopt.disabled()
+  pm = import('python')
+  python3_inst = pm.find_installation(required: pyopt.enabled())
+  python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled())
+  if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt.enabled())
+    python3_dep = dependency('', required: false)
+  endif
+else
+  python3_dep = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: Readline
+###############################################################
+
+if not get_option('readline').disabled()
+  libedit_preferred = get_option('libedit_preferred')
+  # Set the order of readline dependencies
+  check_readline_deps = libedit_preferred ? \
+    ['libedit', 'readline'] : ['readline', 'libedit']
+
+  foreach readline_dep : check_readline_deps
+    readline = dependency(readline_dep, required: false)
+    if not readline.found()
+      readline = cc.find_library(readline_dep,
+        required: get_option('readline').enabled(),
+        dirs: g_c_lib)
+    endif
+    if readline.found()
+      break
+    endif
+  endforeach
+
+  if readline.found()
+    cdata.set('HAVE_LIBREADLINE', 1)
+
+    editline_prefix = {
+      'header_prefix': 'editline/',
+      'flag_prefix': 'EDITLINE_',
+    }
+    readline_prefix = {
+      'header_prefix': 'readline/',
+      'flag_prefix': 'READLINE_',
+    }
+    default_prefix = {
+      'header_prefix': '',
+      'flag_prefix': '',
+    }
+
+    # Set the order of prefixes
+    prefixes = libedit_preferred ? \
+      [editline_prefix, default_prefix, readline_prefix] : \
+      [readline_prefix, default_prefix, editline_prefix]
+
+    at_least_one_header_found = false
+    foreach header: ['history', 'readline']
+      is_found = false
+      foreach prefix : prefixes
+        header_file = '@0@@1@.h'.format(prefix['header_prefix'], header)
+        # Check history.h and readline.h
+        if not is_found and cc.has_header(header_file,
+            args: g_c_args, include_directories: g_c_inc,
+            dependencies: [readline], required: false)
+          if header == 'history'
+            history_h = header_file
+          else
+            readline_h = header_file
+          endif
+          cdata.set('HAVE_@0@@1@_H'.format(prefix['flag_prefix'], header).to_upper(), 1)
+          is_found = true
+          at_least_one_header_found = true
+        endif
+      endforeach
+    endforeach
+
+    if not at_least_one_header_found
+      error('''readline header not found
+If you have @0@ already installed, see see meson-log/meson-log.txt for details on the
+failure. It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.'''.format(readline_dep))
+    endif
+
+    check_funcs = [
+      'append_history',
+      'history_truncate_file',
+      'rl_completion_matches',
+      'rl_filename_completion_function',
+      'rl_reset_screen_size',
+      'rl_variable_bind',
+    ]
+
+    foreach func : check_funcs
+      cdata.set('HAVE_'+func.to_upper(),
+        cc.has_function(func, args: g_c_args, dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    check_vars = [
+      'rl_completion_suppress_quote',
+      'rl_filename_quote_characters',
+      'rl_filename_quoting_function',
+    ]
+
+    foreach var : check_vars
+      cdata.set('HAVE_'+var.to_upper(),
+        cc.has_header_symbol(readline_h, var,
+          args: g_c_args, include_directories: g_c_inc,
+          prefix: '#include <stdio.h>',
+          dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if readline.type_name() == 'library'
+      readline = declare_dependency(dependencies: readline,
+        include_directories: g_c_inc)
+    endif
+  endif
+
+  # XXX: Figure out whether to implement mingw warning equivalent
+else
+  readline = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: selinux
+###############################################################
+
+selinux = dependency('', required : false)
+selinuxopt = get_option('selinux')
+if meson.version().version_compare('>=0.59')
+  selinuxopt = selinuxopt.disable_auto_if(host_system != 'linux')
+endif
+selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
+cdata.set('HAVE_LIBSELINUX',
+  selinux.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: systemd
+###############################################################
+
+systemd = dependency('', required : false)
+systemdopt = get_option('systemd')
+if meson.version().version_compare('>=0.59')
+  systemdopt = systemdopt.disable_auto_if(host_system != 'linux')
+endif
+systemd = dependency('libsystemd', required: systemdopt)
+cdata.set('USE_SYSTEMD',
+  systemd.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+  # Try to find openssl via pkg-config et al, if that doesn't work
+  # (e.g. because it's provided as part of the OS, like on FreeBSD), look for
+  # the library names that we know about.
+
+  # via pkg-config et al
+  ssl = dependency('openssl', required: false)
+
+  # via library + headers
+  if not ssl.found()
+    ssl_lib = cc.find_library('ssl',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc,
+      has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+    crypto_lib = cc.find_library('crypto',
+      dirs: g_c_lib,
+      header_include_directories: g_c_inc)
+    ssl_int = [ssl_lib, crypto_lib]
+
+    ssl = declare_dependency(dependencies: ssl_int,
+                             include_directories: g_c_inc)
+  else
+    cc.has_header('openssl/ssl.h', args: g_c_args, dependencies: ssl, required: true)
+    cc.has_header('openssl/err.h', args: g_c_args, dependencies: ssl, required: true)
+
+    ssl_int = [ssl]
+  endif
+
+  check_funcs = [
+    ['CRYPTO_new_ex_data', {'required': true}],
+    ['SSL_new', {'required': true}],
+
+    # Function introduced in OpenSSL 1.0.2.
+    ['X509_get_signature_nid'],
+
+    # Functions introduced in OpenSSL 1.1.0. We used to check for
+    # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+    # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+    # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+    # functions.
+    ['OPENSSL_init_ssl'],
+    ['BIO_get_data'],
+    ['BIO_meth_new'],
+    ['ASN1_STRING_get0_data'],
+    ['HMAC_CTX_new'],
+    ['HMAC_CTX_free'],
+
+    # OpenSSL versions before 1.1.0 required setting callback functions, for
+    # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+    # function was removed.
+    ['CRYPTO_lock'],
+  ]
+
+  foreach c : check_funcs
+    func = c.get(0)
+    val = cc.has_function(func, args: g_c_args, dependencies: ssl_int)
+    required = c.get(1, {}).get('required', false)
+    if required and not val
+      error('openssl function @0@ is required'.format(func))
+    elif not required
+      cdata.set('HAVE_'+func.to_upper(), val ? 1 : false)
+    endif
+  endforeach
+
+  cdata.set('USE_OPENSSL', 1,
+            description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+
+  cdata.set('OPENSSL_API_COMPAT', '0x10001000L',
+            description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings
+   from newer OpenSSL versions.''')
+else
+  ssl = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: uuid
+###############################################################
+
+uuidopt = get_option('uuid')
+if uuidopt != 'none'
+  uuidname = uuidopt.to_upper()
+  if uuidopt == 'e2fs'
+    uuid = dependency('uuid', required: true)
+    uuidfunc = 'uuid_generate'
+    uuidheader = 'uuid/uuid.h'
+  elif uuidopt == 'bsd'
+    # libc should have uuid function
+    uuid = declare_dependency()
+    uuidfunc = 'uuid_to_string'
+    uuidheader = 'uuid.h'
+  elif uuidopt == 'ossp'
+    uuid = dependency('ossp-uuid', required: true)
+    uuidfunc = 'uuid_export'
+    uuidheader = 'ossp/uuid.h'
+  else
+    error('huh')
+  endif
+
+  if not cc.has_header_symbol(uuidheader, uuidfunc, args: g_c_args, dependencies: uuid)
+    error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc))
+  endif
+  cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1)
+
+  cdata.set('HAVE_UUID_@0@'.format(uuidname), 1,
+           description: 'Define to 1 if you have @0@ UUID support.'.format(uuidname))
+else
+  uuid = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = dependency('', required : false)
+if not zlibopt.disabled()
+  zlib_t = dependency('zlib', required: zlibopt)
+
+  if zlib_t.type_name() == 'internal'
+    # if fallback was used, we don't need to test if headers are present (they
+    # aren't built yet, so we can't test)
+    zlib = zlib_t
+  elif not zlib_t.found()
+    warning('did not find zlib')
+  elif not cc.has_header('zlib.h',
+    args: g_c_args, include_directories: g_c_inc,
+    dependencies: [zlib_t], required: zlibopt.enabled())
+    warning('zlib header not found')
+  elif not cc.has_type('z_streamp', args: g_c_args, dependencies: [zlib_t], prefix: '#include <zlib.h>')
+    if zlibopt.enabled()
+      error('zlib version is too old')
+    else
+      warning('zlib version is too old')
+    endif
+  else
+    zlib = zlib_t
+  endif
+
+  if zlib.found()
+    cdata.set('HAVE_LIBZ', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Library: zstd
+###############################################################
+
+zstdopt = get_option('zstd')
+if not zstdopt.disabled()
+  zstd = dependency('libzstd', required: zstdopt, version: '>=1.4.0')
+
+  if zstd.found()
+    cdata.set('USE_ZSTD', 1)
+    cdata.set('HAVE_LIBZSTD', 1)
+  endif
+
+else
+  zstd = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+# Do we need -std=c99 to compile C99 code?
+c99_test = '''
+#include <stdbool.h>
+#include <complex.h>
+#include <tgmath.h>
+#include <inttypes.h>
+
+struct named_init_test {
+  int a;
+  int b;
+};
+
+extern void structfunc(struct named_init_test);
+
+int main(int argc, char **argv)
+{
+  struct named_init_test nit = {
+    .a = 3,
+    .b = 5,
+  };
+
+  for (int loop_var = 0; loop_var < 3; loop_var++)
+  {
+    nit.a += nit.b;
+  }
+
+  structfunc((struct named_init_test){1, 0});
+
+  return nit.a != 0;
+}
+'''
+
+if not cc.compiles(c99_test, name: 'c99', args: g_c_args)
+  if cc.compiles(c99_test, name: 'c99 with -std=c99', args: g_c_args + ['-std=c99'])
+    g_c_args += '-std=c99'
+    functional_cflags += '-std=c99'
+  else
+    error('C compiler does not support C99')
+  endif
+endif
+
+sizeof_long = cc.sizeof('long', args: g_c_args)
+cdata.set('SIZEOF_LONG', sizeof_long)
+if sizeof_long == 8
+  cdata.set('HAVE_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long int')
+  cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: g_c_args) == 8
+  cdata.set('HAVE_LONG_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long long int')
+  cdata.set_quoted('INT64_MODIFIER', 'll')
+else
+  error('do not know how to get a 64bit int')
+endif
+
+if host_machine.endian() == 'big'
+  cdata.set('WORDS_BIGENDIAN', 1)
+endif
+
+alignof_types = ['short', 'int', 'long', 'double']
+maxalign = 0
+foreach t: alignof_types
+  align = cc.alignment(t, args: g_c_args)
+  if maxalign < align
+    maxalign = align
+  endif
+  cdata.set('ALIGNOF_@0@'.format(t.to_upper()), align)
+endforeach
+cdata.set('MAXIMUM_ALIGNOF', maxalign)
+
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: g_c_args))
+cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: g_c_args))
+
+
+# Check if __int128 is a working 128 bit integer type, and if so
+# define PG_INT128_TYPE to that typename.
+#
+# This currently only detects a GCC/clang extension, but support for other
+# environments may be added in the future.
+#
+# For the moment we only test for support for 128bit math; support for
+# 128bit literals and snprintf is not required.
+if cc.links('''
+  /*
+   * We don't actually run this test, just link it to verify that any support
+   * functions needed for __int128 are present.
+   *
+   * These are globals to discourage the compiler from folding all the
+   * arithmetic tests down to compile-time constants.  We do not have
+   * convenient support for 128bit literals at this point...
+   */
+  __int128 a = 48828125;
+  __int128 b = 97656250;
+
+  int main(void)
+  {
+      __int128 c,d;
+      a = (a << 12) + 1; /* 200000000001 */
+      b = (b << 12) + 5; /* 400000000005 */
+      /* try the most relevant arithmetic ops */
+      c = a * b;
+      d = (c + b) / b;
+      /* must use the results, else compiler may optimize arithmetic away */
+      return d != a+1;
+  }''',
+  name: '__int128',
+  args: g_c_args)
+
+  buggy_int128 = false
+
+  # Use of non-default alignment with __int128 tickles bugs in some compilers.
+  # If not cross-compiling, we can test for bugs and disable use of __int128
+  # with buggy compilers.  If cross-compiling, hope for the best.
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83925
+  if not meson.is_cross_build()
+    r =  cc.run('''
+    /* This must match the corresponding code in c.h: */
+    #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
+    #define pg_attribute_aligned(a) __attribute__((aligned(a)))
+    #endif
+    typedef __int128 int128a
+    #if defined(pg_attribute_aligned)
+    pg_attribute_aligned(8)
+    #endif
+    ;
+
+    int128a holder;
+    void pass_by_val(void *buffer, int128a par) { holder = par; }
+
+    int main(void)
+    {
+        long int i64 = 97656225L << 12;
+        int128a q;
+        pass_by_val(main, (int128a) i64);
+        q = (int128a) i64;
+        return q != holder;
+    }''',
+    name: '__int128 alignment bug',
+    args: g_c_args)
+    assert(r.compiled())
+    if r.returncode() != 0
+      buggy_int128 = true
+    endif
+  endif
+
+  if not buggy_int128
+    cdata.set('PG_INT128_TYPE', '__int128')
+    cdata.set('ALIGNOF_PG_INT128_TYPE', cc.alignment('__int128', args: g_c_args))
+  endif
+endif
+
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang).  If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+    static inline int foo(void)
+    {
+      void *labeladdrs[] = {&&my_label};
+      goto *labeladdrs[0];
+      my_label:
+      return 1;
+    }''',
+    args: g_c_args)
+  cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+    int main(int arg, char **argv)
+    {
+        ({ _Static_assert(1, "foo"); });
+    }
+    ''',
+    args: g_c_args)
+  cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: g_c_args) \
+  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: g_c_args) \
+  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: g_c_args) == 1
+  cdata.set('HAVE__BOOL', 1)
+  cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+# Need to check a call with %m because netbsd supports gnu_printf but emits a
+# warning for each use of %m.
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = '''
+extern void emit_log(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));
+static void call_log(void)
+{
+    emit_log(0, "error: %s: %m", "foo");
+}
+'''
+attrib_error_args = cc.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
+foreach a : printf_attributes
+  if cc.compiles(testsrc.format(a), args: g_c_args + attrib_error_args, name: 'format ' + a)
+    cdata.set('PG_PRINTF_ATTRIBUTE', a)
+    break
+  endif
+endforeach
+
+if cc.has_function_attribute('visibility:default') and \
+  cc.has_function_attribute('visibility:hidden')
+  cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+endif
+
+# Check if various builtins exist. Some builtins are tested separately,
+# because we want to test something more complicated than the generic case.
+builtins = [
+  'bswap16',
+  'bswap32',
+  'bswap64',
+  'clz',
+  'ctz',
+  'constant_p',
+  'frame_address',
+  'popcount',
+  'unreachable',
+]
+
+foreach builtin : builtins
+  fname = '__builtin_@0@'.format(builtin)
+  if cc.has_function(fname, args: g_c_args)
+    cdata.set('HAVE@0@'.format(fname.to_upper()), 1)
+  endif
+endforeach
+
+# Check if the C compiler understands __builtin_types_compatible_p,
+# and define HAVE__BUILTIN_TYPES_COMPATIBLE_P if so.
+#
+# We check usage with __typeof__, though it's unlikely any compiler would
+# have the former and not the latter.
+if cc.compiles('''
+    static int x;
+    static int y[__builtin_types_compatible_p(__typeof__(x), int)];
+    ''',
+    name: '__builtin_types_compatible_p',
+    args: g_c_args)
+  cdata.set('HAVE__BUILTIN_TYPES_COMPATIBLE_P', 1)
+endif
+
+# Check if the C compiler understands __builtin_$op_overflow(),
+# and define HAVE__BUILTIN_OP_OVERFLOW if so.
+#
+# Check for the most complicated case, 64 bit multiplication, as a
+# proxy for all of the operations.  To detect the case where the compiler
+# knows the function but library support is missing, we must link not just
+# compile, and store the results in global variables so the compiler doesn't
+# optimize away the call.
+if cc.links('''
+    INT64 a = 1;
+    INT64 b = 1;
+    INT64 result;
+
+    int main(void)
+    {
+        return __builtin_mul_overflow(a, b, &result);
+    }''',
+    name: '__builtin_mul_overflow',
+    args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))],
+    )
+  cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1)
+endif
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+    #include <cpuid.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+    }
+    ''', name: '__get_cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+    #include <intrin.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __cpuid(exx, 1);
+    }
+    ''', name: '__cpuid',
+    args: g_c_args)
+  cdata.set('HAVE__CPUID', 1)
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+  # Disable strict-aliasing rules; needed for gcc 3.3+
+  '-fno-strict-aliasing',
+  # Disable optimizations that assume no overflow; needed for gcc 4.3+
+  '-fwrapv',
+  '-fexcess-precision=standard'
+]
+
+functional_cflags += cc.get_supported_arguments(common_functional_flags)
+if llvm.found()
+  functional_cxxflags += cpp.get_supported_arguments(common_functional_flags)
+endif
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+common_warning_flags = [
+  '-Wmissing-prototypes',
+  '-Wpointer-arith',
+  # Really don't want VLAs to be used in our dialect of C
+  '-Werror=vla',
+  # On macOS, complain about usage of symbols newer than the deployment target
+  '-Werror=unguarded-availability-new',
+  '-Wendif-labels',
+  '-Wmissing-format-attribute',
+  '-Wimplicit-fallthrough=3',
+  '-Wcast-function-type',
+  # This was included in -Wall/-Wformat in older GCC versions
+  '-Wformat-security',
+]
+
+warning_cflags += cc.get_supported_arguments(common_warning_flags)
+if llvm.found()
+  warning_cxxflags += cpp.get_supported_arguments(common_warning_flags)
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+  warning_cflags += '-Wdeclaration-after-statement'
+  using_declaration_after_statement_warning = true
+else
+  using_declaration_after_statement_warning = false
+endif
+
+
+# The following tests want to suppress various unhelpful warnings by adding
+# -Wno-foo switches.  But gcc won't complain about unrecognized -Wno-foo
+# switches, so we have to test for the positive form and if that works,
+# add the negative form.
+
+negative_warning_flags = [
+  # Suppress clang's unhelpful unused-command-line-argument warnings.
+  'unused-command-line-argument',
+
+  # Remove clang 12+'s compound-token-split-by-macro, as this causes a lot
+  # of warnings when building plperl because of usages in the Perl headers.
+  'compound-token-split-by-macro',
+
+  # Similarly disable useless truncation warnings from gcc 8+
+  'format-truncation',
+  'stringop-truncation',
+
+  # FIXME: from andres's local config
+  'clobbered',
+  'missing-field-initializers',
+  'sign-compare',
+  'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+  if cc.has_argument('-W'+w)
+    warning_cflags += '-Wno-'+w
+  endif
+  if llvm.found() and cpp.has_argument('-W'+w)
+    warning_cxxflags += '-Wno-'+w
+  endif
+endforeach
+
+# FIXME: copy "Defend against clang being used on x86-32 without SSE2 enabled"
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+  warning_cflags += [
+    '/wd4018', '/wd4244', '/wd4273', '/wd4101', '/wd4102', '/wd4090',
+    '/wd4267',
+  ]
+
+  # Dirty hack to disable warnings due to some files defining
+  # UMDF_USING_NTSTATUS before including postgres.h. We need a better fix, but
+  # for now this allows us to see "real" warnings.
+  if get_option('b_pch')
+    warning_cflags += '/wd4005'
+  endif
+
+  functional_cflags += [
+    '/DWIN32', '/DWINDOWS', '/D__WINDOWS__', '/D__WIN32__',
+    '/DWIN32_STACK_RLIMIT=4194304', '/D_CRT_SECURE_NO_DEPRECATE',
+    '/D_CRT_NONSTDC_NO_DEPRECATE',
+  ]
+endif
+
+
+###############################################################
+# Atomics
+###############################################################
+
+if not get_option('spinlocks')
+  warning('Not using spinlocks will cause poor performance')
+else
+  cdata.set('HAVE_SPINLOCKS', 1)
+endif
+
+if not get_option('atomics')
+  warning('Not using atomics will cause poor performance')
+else
+  # XXX: perhaps we should require some atomics support in this case these
+  # days?
+  cdata.set('HAVE_ATOMICS', 1)
+
+  atomic_checks = [
+    {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+     'desc': '__sync_lock_test_and_set(char)',
+     'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+     'desc': '__sync_lock_test_and_set(int32)',
+     'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+     'desc': '__sync_val_compare_and_swap(int32)',
+     'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+     'desc': '__sync_val_compare_and_swap(int64)',
+     'test': '''
+INT64 val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+     'desc': ' __atomic_compare_exchange_n(int32)',
+     'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+     'desc': ' __atomic_compare_exchange_n(int64)',
+     'test': '''
+INT64 val = 0;
+INT64 expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+  ]
+
+  foreach check : atomic_checks
+    test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+    cdata.set(check['name'],
+      cc.links(test,
+        name: check['desc'],
+        args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false
+    )
+  endforeach
+
+endif
+
+
+
+###############################################################
+# Select CRC-32C implementation.
+#
+# If we are targeting a processor that has Intel SSE 4.2 instructions, we can
+# use the special CRC instructions for calculating CRC-32C. If we're not
+# targeting such a processor, but we can nevertheless produce code that uses
+# the SSE intrinsics, perhaps with some extra CFLAGS, compile both
+# implementations and select which one to use at runtime, depending on whether
+# SSE 4.2 is supported by the processor we're running on.
+#
+# Similarly, if we are targeting an ARM processor that has the CRC
+# instructions that are part of the ARMv8 CRC Extension, use them. And if
+# we're not targeting such a processor, but can nevertheless produce code that
+# uses the CRC instructions, compile both, and select at runtime.
+###############################################################
+
+have_optimized_crc = false
+cflags_crc = []
+if host_cpu == 'x86' or host_cpu == 'x86_64'
+
+  if cc.get_id() == 'msvc'
+    cdata.set('USE_SSE42_CRC32C', false)
+    cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  else
+
+    prog = '''
+#include <nmmintrin.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = _mm_crc32_u8(crc, 0);
+    crc = _mm_crc32_u32(crc, 0);
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+    if cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 without -msse4.2', args: g_c_args)
+      # Use Intel SSE 4.2 unconditionally.
+      cdata.set('USE_SSE42_CRC32C', 1)
+      have_optimized_crc = true
+    elif cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 with -msse4.2', args: g_c_args + ['-msse4.2'])
+      # Use Intel SSE 4.2, with runtime check. The CPUID instruction is needed for
+      # the runtime check.
+      cflags_crc += '-msse4.2'
+      cdata.set('USE_SSE42_CRC32C', false)
+      cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+      have_optimized_crc = true
+    endif
+
+  endif
+
+elif host_cpu == 'arm' or host_cpu == 'aarch64'
+
+  prog = '''
+#include <arm_acle.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = __crc32cb(crc, 0);
+    crc = __crc32ch(crc, 0);
+    crc = __crc32cw(crc, 0);
+    crc = __crc32cd(crc, 0);
+
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+  if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc',
+      args: g_c_args)
+    # Use ARM CRC Extension unconditionally
+    cdata.set('USE_ARMV8_CRC32C', true)
+    have_optimized_crc = true
+  elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc',
+      args: g_c_args + ['-march=armv8-a+crc'])
+    # Use ARM CRC Extension, with runtime check
+    cflags_crc += '-march=armv8-a+crc'
+    cdata.set('USE_ARMV8_CRC32C', false)
+    cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  endif
+endif
+
+if not have_optimized_crc
+  # fall back to slicing-by-8 algorithm, which doesn't require any special CPU
+  # support.
+  cdata.set('USE_SLICING_BY_8_CRC32C', 1)
+endif
+
+
+
+###############################################################
+# Other CPU specific stuff
+###############################################################
+
+if host_cpu == 'x86_64'
+
+  if cc.compiles('''
+      void main(void)
+      {
+          long long x = 1; long long r;
+          __asm__ __volatile__ (" popcntq %1,%0\n" : "=q"(r) : "rm"(x));
+      }''',
+      name: '@0@: popcntq instruction'.format(host_cpu),
+      args: g_c_args)
+    cdata.set('HAVE_X86_64_POPCNTQ', 1)
+  endif
+
+elif host_cpu == 'ppc' or host_cpu == 'ppc64'
+
+  if cc.compiles('''
+      void main(void)
+      {
+          int a = 0; int *p = &a; int r;
+	  __asm__ __volatile__ (" lwarx %0,0,%1,1\n" : "=&r"(r) : "r"(p));
+      }''',
+      name: '@0@: whether assembler supports lwarx hint bit'.format(host_cpu),
+      args: g_c_args)
+    cdata.set('HAVE_PPC_LWARX_MUTEX_HINT', 1)
+  endif
+
+  # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+  if cdata.has('HAVE__BUILTIN_CONSTANT_P')
+    if cc.compiles('''
+      static inline int
+      addi(int ra, int si)
+      {
+          int res = 0;
+          if (__builtin_constant_p(si))
+              __asm__ __volatile__(
+                  " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+          return res;
+      }
+      int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+      ''',
+      args: g_c_args)
+      cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+header_checks = [
+  ['atomic.h'],
+  ['stdbool.h'],
+  ['copyfile.h'],
+  ['execinfo.h'],
+  ['getopt.h'],
+  ['ifaddrs.h'],
+  ['langinfo.h'],
+  ['mbarrier.h'],
+  ['strings.h'],
+  ['sys/epoll.h'],
+  ['sys/event.h'],
+  ['sys/ipc.h'],
+  ['sys/personality.h'],
+  ['sys/prctl.h'],
+  ['sys/procctl.h'],
+  ['sys/resource.h'],
+  ['sys/select.h'],
+  ['sys/sem.h'],
+  ['sys/shm.h'],
+  ['sys/signalfd.h'],
+  ['sys/sockio.h'],
+  ['sys/uio.h'],
+  ['sys/un.h'],
+  ['termios.h'],
+  ['ucred.h'],
+  # Historically we've included sys/param.h first, due to sys/ucred.h not
+  # being standalone on OpenBSD (in 2013). But that doesn't look to be the case
+  # anymore in 2022.
+  ['sys/ucred.h'],
+  # At least on IRIX, test for netinet/tcp.h will fail unless netinet/in.h is
+  # included first (in 2000). But that doesn't look to be the case anymore in
+  # 2022.
+  ['netinet/tcp.h'],
+  # Historically we've included sys/socket.h first due to net/if.h not being
+  # standalone on some BSDs (in 2009). But that doesn't look to be the case
+  # anymore in 2022.
+  ['net/if.h'],
+  ['crtdefs.h'],
+]
+
+foreach c : header_checks
+  header = c.get(0)
+  varname = 'HAVE_'+header.underscorify().to_upper()
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  found = cc.has_header(header, include_directories: g_c_inc, args: g_c_args)
+  cdata.set(varname, found ? 1 : false,
+            description: 'Define to 1 if you have the <@0@> header file.'.format(header))
+endforeach
+
+
+
+decl_checks = [
+  ['F_FULLFSYNC', 'fcntl.h'],
+  ['fdatasync', 'unistd.h'],
+  ['posix_fadvise', 'fcntl.h'],
+  ['strlcat', 'string.h'],
+  ['strlcpy', 'string.h'],
+  ['strnlen', 'string.h'],
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+  ['preadv', 'sys/uio.h'],
+  ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+  func = c.get(0)
+  header = c.get(1)
+  args = c.get(2, {})
+  varname = 'HAVE_DECL_'+func.underscorify().to_upper()
+
+  found = cc.has_header_symbol(header, func,
+    args: g_c_args, include_directories: g_c_inc,
+    kwargs: args)
+  cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@', and to 0 if you
+   don't.'''.format(func))
+endforeach
+
+
+
+if cc.has_type('struct cmsgcred',
+    args: g_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '' : '-DHAVE_SYS_UCRED_H'],
+    include_directories: g_c_inc,
+    prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+  cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+  cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_type('struct option',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '@0@'.format(cdata.get('HAVE_GETOPT_H')) == '1' ? '#include <getopt.h>' : '')
+  cdata.set('HAVE_STRUCT_OPTION', 1)
+endif
+
+
+foreach c : ['opterr', 'optreset']
+  varname = 'HAVE_INT_'+c.underscorify().to_upper()
+
+  if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+    extern int @0@;
+    @0@ = 1;
+}
+'''.format(c), name: c, args: g_c_args)
+    cdata.set(varname, 1)
+  else
+    cdata.set(varname, false)
+  endif
+endforeach
+
+if cc.has_type('socklen_t',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/socket.h>''')
+  cdata.set('HAVE_SOCKLEN_T', 1)
+endif
+
+if cc.has_type('struct sockaddr_storage',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1)
+endif
+
+# Check the members of `struct sockaddr_storage'.  We need to know about
+# ss_family and ss_len.  (Some platforms follow RFC 2553 and call them
+# __ss_family and __ss_len.)  We also check struct sockaddr's sa_len;
+# if we have to define our own `struct sockaddr_storage', this tells us
+# whether we need to provide an ss_len field.
+foreach member : ['ss_family', '__ss_family', 'ss_len', '__ss_len']
+  if cc.has_member('struct sockaddr_storage', member,
+                   args: g_c_args, include_directories: g_c_inc,
+                   prefix: '''
+    #include <sys/types.h>
+    #include <sys/socket.h>''')
+    cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_'+member.to_upper(), 1)
+  endif
+endforeach
+if cc.has_member('struct sockaddr', 'sa_len',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
+endif
+
+# FIXME: HAVE_SYS_UN_H
+if cc.has_type('struct sockaddr_un',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/un.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_UN', 1)
+endif
+
+if cc.has_type('struct addrinfo', args: g_c_args,
+    include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+''')
+  cdata.set('HAVE_STRUCT_ADDRINFO', 1)
+endif
+
+if cc.has_type('struct sockaddr_in6',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <netinet/in.h>''')
+  cdata.set('HAVE_IPV6', 1)
+endif
+
+
+if cc.has_member('struct tm', 'tm_zone',
+    args: g_c_args, include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+  cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+    return timezone / 60;
+}
+''',
+    name: 'Check if the global variable `timezone\' exists',
+    args: g_c_args, include_directories: g_c_inc)
+  cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+  cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+if cc.has_type('union semun',
+    args: g_c_args +
+      ['@0@'.format(cdata.get('HAVE_SYS_IPC_H')) == 'false' ? '' : '-DHAVE_SYS_IPC_H'] +
+      ['@0@'.format(cdata.get('HAVE_SYS_SEM_H')) == 'false' ? '' : '-DHAVE_SYS_SEM_H'],
+    include_directories: g_c_inc,
+    prefix: '''
+#include <sys/types.h>
+#ifdef HAVE_SYS_IPC_H
+#include <sys/ipc.h>
+#endif
+#ifdef HAVE_SYS_SEM_H
+#include <sys/sem.h>
+#endif
+''')
+  cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+  char buf[100];
+  switch (strerror_r(1, buf, sizeof(buf)))
+  { case 0: break; default: break; }
+}''',
+    name: 'strerror_r',
+    args: g_c_args, include_directories: g_c_inc)
+  cdata.set('STRERROR_R_INT', 1)
+else
+  cdata.set('STRERROR_R_INT', false)
+endif
+
+# Check for the locale_t type and find the right header file.  macOS
+# needs xlocale.h; standard is locale.h, but glibc also has an
+# xlocale.h file that we should not use.
+if cc.has_type('locale_t', prefix: '#include <locale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+elif cc.has_type('locale_t', prefix: '#include <xlocale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+  cdata.set('LOCALE_T_IN_XLOCALE', 1)
+endif
+
+# Check if the C compiler understands typeof or a variant.  Define
+# HAVE_TYPEOF if so, and define 'typeof' to the actual key word.
+foreach kw : ['typeof', '__typeof__', 'decltype']
+  if cc.compiles('''
+int main(void)
+{
+    int x = 0;
+    @0@(x) y;
+    y = x;
+    return y;
+}
+'''.format(kw),
+    name: 'typeof()',
+    args: g_c_args, include_directories: g_c_inc)
+
+    cdata.set('HAVE_TYPEOF', 1)
+    if kw != 'typeof'
+      cdata.set('typeof', kw)
+    endif
+
+    break
+  endif
+endforeach
+
+
+# MSVC doesn't cope well with defining restrict to __restrict, the
+# spelling it understands, because it conflicts with
+# __declspec(restrict). Therefore we define pg_restrict to the
+# appropriate definition, which presumably won't conflict.
+#
+# FIXME: We used to check if restrict is available, but it really should these
+# days?
+#
+# FIXME: Historically we allowed platforms to disable restrict in template
+# files. Is that really still necessary?
+cdata.set('pg_restrict', '__restrict')
+
+
+cdata.set('MEMSET_LOOP_LIMIT', 1024)
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+    PS_STRINGS->ps_nargvstr = 1;
+    PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+  name: 'PS_STRINGS', args: g_c_args)
+  cdata.set('HAVE_PS_STRINGS', 1)
+else
+  cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+m_dep = cc.find_library('m', required : false)
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps = [m_dep]
+
+rt_dep = cc.find_library('rt', required : false)
+
+dl_dep = cc.find_library('dl', required : false)
+
+util_dep = cc.find_library('util', required : false)
+posix4_dep = cc.find_library('posix4', required : false)
+
+getopt_dep = cc.find_library('getopt', required : false)
+gnugetopt_dep = cc.find_library('gnugetopt', required : false)
+
+execinfo_dep = cc.find_library('execinfo', required : false)
+
+cygipc_dep = cc.find_library('cygipc', required : false)
+
+func_checks = [
+  ['_configthreadlocale'],
+  ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+  ['clock_gettime', {'dependencies': [rt_dep, posix4_dep], 'define': false}],
+  ['copyfile'],
+  ['dlsym', {'dependencies': [dl_dep], 'define': false}],
+  ['explicit_bzero'],
+  ['fdatasync', {'dependencies': [rt_dep, posix4_dep], 'define': false}], # Solaris
+  ['getaddrinfo'],
+  ['gethostbyname_r', {'dependencies': [thread_dep]}],
+  ['getifaddrs'],
+  ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getopt_long',{'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getpeereid'],
+  ['getpeerucred'],
+  ['inet_aton'],
+  ['inet_pton'],
+  ['kqueue'],
+  ['mbstowcs_l'],
+  ['memset_s'],
+  ['mkdtemp'],
+  ['posix_fadvise'],
+  ['posix_fallocate'],
+  ['ppoll'],
+  ['pstat'],
+  ['pthread_is_threaded_np', {'dependencies': [thread_dep]}],
+  ['pthread_barrier_wait', {'dependencies': [thread_dep]}],
+  ['setproctitle', {'dependencies': [util_dep]}],
+  ['setproctitle_fast'],
+  ['shm_open', {'dependencies': [rt_dep], 'define': false}],
+  ['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
+  ['shmget', {'dependencies': [cygipc_dep], 'define': false}],
+  ['strchrnul'],
+  ['strerror_r', {'dependencies': [thread_dep]}],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+  ['strsignal'],
+  ['sync_file_range'],
+  ['syncfs'],
+  ['uselocale'],
+  ['wcstombs_l'],
+]
+
+foreach c : func_checks
+  func = c.get(0)
+  kwargs = c.get(1, {})
+  deps = kwargs.get('dependencies', [])
+
+  varname = 'HAVE_'+func.underscorify().to_upper()
+
+  found = cc.has_function(func, args: g_c_args)
+
+  if not found
+    foreach dep : deps
+      if not dep.found()
+        continue
+      endif
+      found = cc.has_function(func, args: g_c_args,
+                              dependencies: [dep])
+      if found
+        os_deps += dep
+        break
+      endif
+    endforeach
+  endif
+
+  if kwargs.get('define', true)
+    # Emulate autoconf behaviour of not-found->undef, found->1
+    cdata.set(varname, found  ? 1 : false,
+              description: 'Define to 1 if you have the `@0@\' function.'.format(func))
+  endif
+endforeach
+
+
+if cc.has_function('syslog', args: g_c_args) and cc.check_header('syslog.h', args: g_c_args)
+  cdata.set('HAVE_SYSLOG', 1)
+endif
+
+
+exesuffix = ''
+export_file_suffix = 'list'
+if host_system == 'aix'
+  dlsuffix = '.so'
+  export_file_format = 'aix'
+  export_fmt = '-Wl,-bE:@0@'
+elif host_system == 'darwin'
+  dlsuffix = '.dylib'
+  export_file_format = 'darwin'
+  export_fmt = '-exported_symbols_list=@0@'
+elif host_system == 'win32'
+  exesuffix = '.exe'
+  dlsuffix = '.dll'
+  export_file_format = 'win'
+  export_file_suffix = 'def'
+  if cc.get_id() == 'msvc'
+    export_fmt = '/DEF:@0@'
+  else
+    export_fmt = '@0@'
+  endif
+else
+  dlsuffix = '.so'
+  export_file_format = 'gnu'
+  export_fmt = '-Wl,--version-script=@0@'
+endif
+
+gen_export_kwargs = {
+  'input': 'exports.txt',
+  'output': '@BASENAME@.'+export_file_suffix,
+  'command': [perl, files('src/tools/gen_export.pl'),
+   '--format', export_file_format,
+   '--input', '@INPUT0@', '--output', '@OUTPUT0@'],
+  'build_by_default': false,
+  'install': false,
+}
+
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+# FIXME: needs some autoconfiguration
+if host_system == 'darwin'
+  cdata.set('USE_SYSV_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'openbsd' or host_system == 'netbsd'
+  cdata.set('USE_SYSV_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'win32'
+  cdata.set('USE_WIN32_SEMAPHORES', 1)
+  cdata.set('USE_WIN32_SHARED_MEMORY', 1)
+else
+  cdata.set('USE_UNNAMED_POSIX_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+endif
+
+
+if host_system == 'win32'
+  cdata.set('HAVE_IPV6', 1)
+  cdata.set('WIN32_STACK_RLIMIT', 4194304)
+  cdata.set('HAVE__CONFIGTHREADLOCALE', 1)
+endif
+
+if cc.get_id() == 'msvc'
+  ldflags += ['/fixed:no','/dynamicbase', '/nxcompat']
+endif
+
+if host_system == 'win32'
+  os_deps += cc.find_library('ws2_32', required: true)
+endif
+
+add_project_arguments(functional_cflags, language: ['c'])
+add_project_arguments(warning_cflags, language: ['c'])
+add_project_arguments(functional_cxxflags, language: ['cpp'])
+add_project_arguments(warning_cxxflags, language: ['cpp'])
+add_project_link_arguments(ldflags, language: ['c', 'cpp'])
+
+
+###############################################################
+# Threading
+###############################################################
+
+# XXX: About to rely on thread safety in the autoconf build, so not worth
+# implementing a fallback.
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+
+
+###############################################################
+# NLS / Gettext
+###############################################################
+
+i18n = import('i18n')
+nlsopt = get_option('nls')
+libintl = dependency('', required: false)
+
+if not nlsopt.disabled()
+  # meson 0.59 has this wrapped in dependency('int')
+  if cc.check_header('libintl.h', args: g_c_args, required: nlsopt)
+    # in libc
+    if cc.has_function('ngettext')
+      libintl = declare_dependency()
+    else
+      libintl = cc.find_library('intl', has_headers: ['libintl.h'], required: nlsopt)
+    endif
+  endif
+
+  if libintl.found()
+    cdata.set('ENABLE_NLS', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Build
+###############################################################
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+test_deps = []
+backend_targets = []
+
+
+# Define the tests to distribute them to the correct test styles later
+tests = []
+
+
+# Default options for targets
+
+# First identify rpaths
+bin_install_rpaths = []
+lib_install_rpaths = []
+mod_install_rpaths = []
+
+# If the host can form relative rpaths, use that to make the installation
+# properly relocatable
+test_library_path_var = ''
+if host_system == 'win32'
+  # nothing to do
+elif host_system == 'openbsd' or host_system == 'netbsd'
+  # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+  # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+  # when invoked via PATH search).
+  #
+  # netbsd patched their meson in a broken way:
+  # https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=56959
+  # until there's a way out of that, just use LD_LIBRARY_PATH.
+  test_library_path_var = 'LD_LIBRARY_PATH'
+else
+  if host_system == 'darwin'
+    rpath_var = '@loader_path'
+  else
+    rpath_var = '$ORIGIN'
+  endif
+
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_bin, dir_lib, check: true).stdout().strip()
+  bin_install_rpaths += rpath_var / bin_to_lib
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_lib_pkg, dir_lib, check: true).stdout().strip()
+  mod_install_rpaths += rpath_var / mod_to_lib
+endif
+
+# add extra_lib_dirs to rpath
+bin_install_rpaths += g_c_lib
+lib_install_rpaths += g_c_lib
+mod_install_rpaths += g_c_lib
+
+
+# Define arguments for default targets
+
+default_target_args = {
+  'implicit_include_directories': false,
+  'install': true,
+}
+
+default_lib_args = default_target_args + {
+  'name_prefix': '',
+  'install_rpath': ':'.join(lib_install_rpaths),
+}
+
+internal_lib_args = default_lib_args + {
+  'build_by_default': false,
+  'install': false,
+}
+
+default_mod_args = default_lib_args + {
+  'name_prefix': '',
+  'install_dir': dir_lib_pkg,
+  'install_rpath': ':'.join(mod_install_rpaths),
+}
+
+default_bin_args = default_target_args + {
+  'install_dir': dir_bin,
+  'install_rpath': ':'.join(bin_install_rpaths),
+}
+
+
+
+###
+### windows resources related stuff
+###
+
+pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+win32ver_rc_in = files('src/port/win32ver.rc.in')
+rcgen = find_program('src/tools/rcgen', native: true)
+
+rcgen_cmd = [rcgen, '@INPUT@', '-o', '@OUTPUT@', '--depfile', '@DEPFILE@']
+rcgen_bin_cmd = rcgen_cmd + [
+  '--VFT_TYPE', 'VFT_APP',
+  '--FILEENDING', 'exe',
+  '--ICO', pg_ico,
+]
+
+rcgen_lib_cmd = rcgen_cmd + [
+  '--VFT_TYPE', 'VFT_DLL',
+  '--FILEENDING', 'dll',
+]
+
+rcgen_inc = [postgres_inc]
+
+rcgen_kw = {
+  'input': win32ver_rc_in,
+  'output': 'win32ver.rc',
+  'depfile': '@PLAINNAME@.d',
+}
+
+rccompile_kw = {
+  'include_directories': rcgen_inc,
+}
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+# headers that the whole build tree depends on
+generated_headers = []
+# headers that the backend build depends on
+generated_backend_headers = []
+# configure_files() output, needs a way of converting to file names
+configure_files = []
+
+# generated files that might conflict with a partial in-tree autoconf build
+generated_sources = []
+# same, for paths that differ between autoconf / meson builds
+# elements are [dir, [files]]
+generated_sources_ac = {}
+
+
+subdir('src/include')
+
+subdir('config')
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+backend_common_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_shlib, common_shlib],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+libpq_deps = [
+  frontend_shlib_code,
+  thread_dep,
+
+  gssapi,
+  ldap,
+  libintl,
+  ssl,
+]
+
+subdir('src/interfaces/libpq')
+# fe_utils depends on libpq
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_with: [pgport_static, common_static, fe_utils],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+backend_both_deps = [
+  thread_dep,
+  os_deps,
+
+  bsd_auth,
+  gssapi,
+  icu,
+  icu_i18n,
+  ldap,
+  libintl,
+  libxml,
+  lz4,
+  pam,
+  ssl,
+  systemd,
+  zlib,
+  zstd,
+]
+
+backend_deps = backend_both_deps
+
+if host_system == 'win32'
+  backend_deps += cc.find_library('secur32', required: true)
+endif
+
+backend_mod_deps = backend_both_deps
+
+backend_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: backend_deps,
+)
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+  compile_args: [],
+  include_directories: [postgres_inc],
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: backend_mod_deps,
+)
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+subdir('src/interfaces/libpq/test')
+subdir('src/interfaces/ecpg/test')
+
+subdir('doc/src/sgml')
+
+generated_sources_ac += {'': ['GNUmakefile']}
+
+
+# If there are any files in the source directory that we also generate in the
+# build directory, they might get preferred over the newly generated files,
+# e.g. because of a #include "file", which always will search in the current
+# directory first.
+message('checking for file conflicts between source and build directory')
+conflicting_files = []
+potentially_conflicting_files_t = []
+potentially_conflicting_files_t += generated_headers
+potentially_conflicting_files_t += generated_backend_headers
+potentially_conflicting_files_t += generated_backend_sources
+potentially_conflicting_files_t += generated_sources
+
+potentially_conflicting_files = []
+
+# convert all sources of potentially conflicting files into uniform shape
+foreach t : potentially_conflicting_files_t
+  potentially_conflicting_files += t.full_path()
+endforeach
+foreach t : configure_files
+  potentially_conflicting_files += '@0@/@1@'.format(meson.current_build_dir(), t)
+endforeach
+foreach sub, fnames : generated_sources_ac
+  sub = meson.build_root() / sub
+  foreach fname: fnames
+    potentially_conflicting_files += sub/fname
+  endforeach
+endforeach
+
+# find and report conflicting files
+foreach build_path : potentially_conflicting_files
+  build_path = host_system == 'win32' ? fs.as_posix(build_path) : build_path
+  # str.replace is in 0.56
+  src_path = meson.current_source_dir() / build_path.split(meson.current_build_dir() / '')[1]
+  if fs.exists(src_path) or fs.is_symlink(src_path)
+    conflicting_files += src_path
+    have_conflicts = true
+  endif
+endforeach
+# XXX: Perhaps we should generate a file that would clean these up? The list
+# can be long.
+if conflicting_files.length() > 0
+  errmsg_cleanup = '''
+Conflicting files in source directory:
+  @0@
+
+The conflicting files need to be removed, either by removing the files listed
+above, or by running configure and then make maintainer clean.
+'''
+  errmsg_cleanup = errmsg_cleanup.format(' '.join(conflicting_files))
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+# To make MacOS installation work without a prior make install, even with SIP
+# enabled, make rpaths relative after installation. This also makes the
+# installation relocatable.
+if host_system == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+  if host_system == 'win32'
+    if prefix.split(':\\').length() == 1
+        # just a drive
+        test_prefix = ''
+    else
+        test_prefix = prefix.split(':\\')[1]
+    endif
+  else
+    test_prefix = prefix.substring(1)
+  endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+meson_install_args = meson_args + ['install'] + {
+    'meson': ['--quiet', '--only-changed', '--no-rebuild'],
+    'muon': []
+}[meson_impl]
+
+test('tmp_install',
+    meson_bin, args: meson_install_args ,
+    env: {'DESTDIR':test_install_destdir},
+    priority: 100,
+    is_parallel: false,
+    suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport=40000
+
+test_env = environment()
+
+temp_install_bindir = test_install_location / get_option('bindir')
+test_env.set('PG_REGRESS', pg_regress.full_path())
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA so it can be checked in individual tap tests.
+test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
+
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if test_library_path_var != ''
+  test_env.prepend(test_library_path_var, test_install_location / get_option('libdir'))
+endif
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+# Check whether tap tests are enabled or not
+are_tap_tests_enabled = false
+if get_option('enable-tap-tests')
+  # Checking for perl modules for tap tests
+  perl_ipc_run_check = run_command(prove, 'config/check_modules.pl', check: false)
+  if perl_ipc_run_check.returncode() != 0
+    message(perl_ipc_run_check.stderr().strip())
+    error('Additional Perl modules are required to run TAP tests.')
+  endif
+  are_tap_tests_enabled = true
+endif
+
+foreach test: tests
+  test_default = {
+    'name': test['name'],
+    'sd': test['sd'],
+    'bd': test['bd'],
+  }
+  # Define all 'pg_regress' style tests
+  if 'regress' in test
+    t = test_default + test['regress']
+    test_command = [
+      t.get('test_runner', pg_regress).full_path(),
+      '--temp-instance', test_result_dir / t['name'] / 'pg_regress' / 'tmp_check',
+      '--inputdir', t.get('inputdir', t['sd']),
+      '--expecteddir', t.get('expecteddir', t['sd']),
+      '--outputdir', test_result_dir / t['name'] / 'pg_regress',
+      '--bindir', '',
+      '--dlpath', t['bd'],
+      '--max-concurrent-tests=20',
+      '--port=@0@'.format(testport),
+    ]
+
+    if t.has_key('regress_args')
+      test_command += t['regress_args']
+    endif
+
+    if t.has_key('schedule')
+      test_command += ['--schedule', t['schedule'],]
+    endif
+    if t.has_key('sql')
+      test_command += t['sql']
+    endif
+
+    env = test_env
+    env.prepend('PATH', temp_install_bindir, t['bd'])
+
+    test_kwargs = {
+      'suite': ['pg_regress', t['name']],
+      'priority': 10,
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+      'args': [
+        testwrap.path(),
+        '--srcdir', t['sd'],
+        '--basedir', meson.build_root(),
+        '--builddir', t['bd'],
+        '--testgroup', t['name'],
+        '--testname', 'pg_regress',
+        test_command,
+      ]
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    test(t['name'] / 'pg_regress',
+      python,
+      kwargs: test_kwargs,
+    )
+
+    testport = testport + 1
+  endif
+
+  # Define all 'isolationtester' style tests
+  if 'isolation' in test
+    t = test_default + test['isolation']
+    test_command = [
+      pg_isolation_regress.full_path(),
+      '--temp-instance', test_result_dir / t['name'] / 'isolation' / 'tmp_check',
+      '--inputdir', t['sd'],
+      '--outputdir', test_result_dir / t['name'] / 'isolation',
+      '--bindir', '',
+      '--dlpath', t['bd'],
+      '--max-concurrent-tests=20',
+      '--port=@0@'.format(testport),
+    ]
+
+    if t.has_key('regress_args')
+      test_command += t['regress_args']
+    endif
+
+    if t.has_key('schedule')
+      test_command += ['--schedule', t['schedule'],]
+    else
+      test_command += t['specs']
+    endif
+
+    env = test_env
+    env.prepend('PATH', temp_install_bindir, t['bd'])
+
+    test_kwargs = {
+      'suite': ['isolation', t['name']],
+      'priority': 20,
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+      'args': [
+        testwrap.path(),
+        '--srcdir', t['sd'],
+        '--basedir', meson.build_root(),
+        '--builddir', t['bd'],
+        '--testgroup', t['name'],
+        '--testname', 'isolation',
+        test_command,
+      ]
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    test(t['name'] / 'isolation',
+      python,
+      kwargs: test_kwargs,
+    )
+
+    testport = testport + 1
+  endif
+
+  # Define all 'tap' style tests
+  # FIXME: dependencies for each test
+  if are_tap_tests_enabled and 'tap' in test
+    t = test_default + test['tap']
+    test_command = [
+      perl.path(),
+      '-I', meson.source_root() / 'src/test/perl',
+      '-I', t['sd'],
+    ]
+
+    env = test_env
+
+    # Add temporary install, the build directory for non-installed binaries and
+    # also test/ for non-installed test binaries built separately.
+    env.prepend('PATH', temp_install_bindir, t['bd'], t['bd'] / 'test')
+
+    foreach name, value : t.get('env', {})
+      env.set(name, value)
+    endforeach
+
+    test_kwargs = {
+      'protocol': 'tap',
+      'suite': ['tap', t['name']],
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    foreach onetap : t['tests']
+      test(t['name'] / onetap,
+        python,
+        kwargs: test_kwargs,
+        args: [
+          testwrap.path(),
+          '--srcdir', t['sd'],
+          '--basedir', meson.build_root(),
+          '--builddir', t['bd'],
+          '--testgroup', t['name'],
+          '--testname', onetap,
+          test_command,
+          t['sd'] / onetap,
+        ]
+      )
+    endforeach
+  endif
+endforeach
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+  summary({
+    'data block size' : cdata.get('BLCKSZ'),
+    'WAL block size' : cdata.get('XLOG_BLCKSZ'),
+    'segment size' : cdata.get('RELSEG_SIZE')
+    }, section: 'Data layout'
+  )
+
+  summary(
+    {
+      'host system' : '@0@ @1@'.format(host_system, host_cpu),
+      'build system' : '@0@ @1@'.format(build_system, build_cpu),
+    },
+    section: 'System'
+  )
+
+  summary(
+    {
+      'linker': '@0@'.format(cc.get_linker_id()),
+      'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+    },
+    section: 'Compiler'
+  )
+
+  summary(
+    {
+      'C FLAGS, functional': ' '.join(functional_cflags),
+      'C FLAGS, warnings': ' '.join(warning_cflags),
+    },
+    section: 'Compiler Flags'
+  )
+
+  if llvm.found()
+    summary(
+      {
+        'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version())
+      },
+      section: 'Compiler')
+
+      summary(
+      {
+        'C++ FLAGS, functional': ' '.join(functional_cxxflags),
+        'C++ FLAGS, warnings': ' '.join(warning_cxxflags),
+      },
+      section: 'Compiler Flags')
+  endif
+
+  summary(
+    {
+      'bison' : '@0@ @1@'.format(bison.full_path(), bison_version),
+      'dtrace' : dtrace,
+    },
+    section: 'Programs'
+  )
+
+  summary(
+    {
+      'bonjour': bonjour,
+      'bsd_auth': bsd_auth,
+      'gss': gssapi,
+      'icu': icu,
+      'ldap': ldap,
+      'libxml': libxml,
+      'libxslt': libxslt,
+      'llvm': llvm,
+      'lz4': lz4,
+      'nls' : libintl,
+      'pam' : pam,
+      'perl': perl_dep,
+      'python3': python3_dep,
+      'readline': readline,
+      'selinux': selinux,
+      'ssl': ssl,
+      'systemd': systemd,
+      'tcl': tcl_dep,
+      'uuid': uuid,
+      'zlib': zlib,
+      'zstd': zstd,
+    },
+    section: 'External libraries'
+  )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..3be176ca16b
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,175 @@
+# Data layout influencing options
+
+option('BLCKSZ', type : 'combo', choices : ['1', '2', '4', '8', '16', '32'], value : '8',
+  description: 'set table block size in kB')
+
+option('wal-blocksize', type : 'integer', value : 8,
+  description : '''WAL block size, in kilobytes.
+This is the unit of storage and I/O within the WAL log. The default, 8 kilobytes, is suitable for most situations; but other values may be useful in special cases. The value must be a power of 2 between 1 and 64 (kilobytes). Note that changing this value requires an initdb.'''
+  )
+
+option('segsize', type : 'integer', value : 1,
+  description : '''Segment size, in gigabytes.
+Large tables are divided into multiple operating-system files, each of size equal to the segment size. This avoids problems with file size limits that exist on many platforms. The default segment size, 1 gigabyte, is safe on all supported platforms. If your operating system has "largefile" support (which most do, nowadays), you can use a larger segment size. This can be helpful to reduce the number of file descriptors consumed when working with very large tables. But be careful not to select a value larger than is supported by your platform and the file systems you intend to use. Other tools you might wish to use, such as tar, could also set limits on the usable file size. It is recommended, though not absolutely required, that this value be a power of 2. Note that changing this value requires an initdb.'''
+  )
+
+
+# Miscellaneous options
+
+option('krb-srvnam', type : 'string', value : 'postgres',
+  description : '''The default name of the Kerberos service principal used by GSSAPI.
+postgres is the default. There's usually no reason to change this unless you are building for a Windows environment, in which case it must be set to upper case POSTGRES''')
+
+
+# Defaults
+
+option('pgport', type : 'string', value : '5432',
+  description : '''Default port number for server and clients.
+The default is 5432. The port can always be changed later on, but if you specify it here then both server and clients will have the same default compiled in, which can be very convenient. Usually the only good reason to select a non-default value is if you intend to run multiple PostgreSQL servers on the same machine.''')
+
+option('system-tzdata', type: 'string', value: '',
+  description: 'use system time zone data in specified directory')
+
+
+# Developer options
+
+option('cassert', type : 'boolean', value: false,
+  description: 'enable assertion checks (for debugging)')
+
+option('enable-tap-tests', type : 'boolean', value : true,
+  description : 'Whether to enable tap tests')
+
+option('PG_TEST_EXTRA', type : 'string', value: 'kerberos ldap ssl',
+  description: 'Enable selected extra tests')
+
+option('atomics', type : 'boolean', value: true,
+  description: 'whether to use atomic operations')
+
+option('spinlocks', type : 'boolean', value: true,
+  description: 'whether to use spinlocks')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for headers')
+
+option('extra_lib_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for libs')
+
+option('extra_version', type : 'string', value: '',
+  description: 'append STRING to the PostgreSQL version number')
+
+
+# External dependencies
+
+option('bonjour', type : 'feature', value: 'auto',
+  description: 'build with Bonjour support')
+
+option('bsd-auth', type : 'feature', value: 'auto',
+  description: 'build with BSD Authentication support')
+
+option('dtrace', type : 'feature', value: 'disabled',
+  description: 'DTrace support')
+
+option('gssapi', type : 'feature', value: 'auto',
+  description: 'GSSAPI support')
+
+option('icu', type : 'feature', value: 'auto',
+  description: 'ICU support')
+
+option('ldap', type : 'feature', value: 'auto',
+  description: 'LDAP support')
+
+option('libedit_preferred', type : 'boolean', value: false,
+  description: 'Prefer BSD Libedit over GNU Readline')
+
+option('libxml', type : 'feature', value: 'auto',
+  description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+  description: 'XSLT support in contrib/xml2')
+
+option('llvm', type : 'feature', value: 'disabled',
+  description: 'whether to use llvm')
+
+option('lz4', type : 'feature', value: 'auto',
+  description: 'LZ4 support')
+
+option('nls', type: 'feature', value: 'auto',
+  description: 'native language support')
+
+option('pam', type : 'feature', value: 'auto',
+  description: 'build with PAM support')
+
+option('plperl', type : 'feature', value: 'auto',
+  description: 'build Perl modules (PL/Perl)')
+
+option('plpython', type : 'feature', value: 'auto',
+  description: 'build Python modules (PL/Python)')
+
+option('pltcl', type : 'feature', value: 'auto',
+  description: 'build with TCL support')
+
+option('tcl_version', type : 'string', value : 'tcl',
+  description: 'specify TCL version')
+
+option('readline', type : 'feature', value : 'auto',
+  description: 'use GNU Readline or BSD Libedit for editing')
+
+option('selinux', type : 'feature', value : 'disabled',
+  description: 'build with SELinux support')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'], value : 'none',
+  description: 'use LIB for SSL/TLS support (openssl)')
+
+option('systemd', type : 'feature', value: 'auto',
+  description: 'build with systemd support')
+
+option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'], value : 'none',
+  description: 'build contrib/uuid-ossp using LIB')
+
+option('zlib', type : 'feature', value: 'auto',
+  description: 'whether to use zlib')
+
+option('zstd', type : 'feature', value: 'auto',
+  description: 'whether to use zstd')
+
+
+# Programs
+
+option('BISON', type : 'string', value: 'bison',
+  description: 'path to bison binary')
+
+option('DTRACE', type : 'string', value: 'dtrace',
+  description: 'path to dtrace binary')
+
+option('FLEX', type : 'string', value: 'flex',
+  description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+  description: 'path to gzip binary')
+
+option('LZ4', type : 'string', value: 'lz4',
+  description: 'path to lz4 binary')
+
+option('PERL', type : 'string', value: 'perl',
+  description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+  description: 'path to prove binary')
+
+option('PYTHON', type : 'array', value: ['python3', 'python'],
+  description: 'path to python binary')
+
+option('SED', type : 'string', value: 'gsed',
+  description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+  description: 'path to tar binary')
+
+option('ZSTD', type : 'string', value: 'zstd',
+  description: 'path to zstd binary')
+
+option('ZIC', type : 'string', value: 'zic',
+  description: 'path to zic binary, when cross-compiling')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..0dc93e4338b
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,271 @@
+# libraries that other subsystems might depend uppon first, in their
+# respective dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
+
+subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to only use a single
+# buildsystem across all the supported postgres versions. Once all supported
+# PG versions support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+  'PACKAGE_URL': pg_url,
+  'PACKAGE_VERSION': pg_version,
+  'PG_MAJORVERSION': pg_version_major,
+  'PG_VERSION_NUM': pg_version_num,
+  'configure_input': 'meson',
+
+  'vpath_build': 'yes',
+  'autodepend': 'no', # XXX: Should we just set this to true when possible?
+
+  'host_cpu': host_cpu,
+  'host': '@0@-@1@'.format(host_cpu, host_system),
+  'host_os': host_system,
+  'build_os': build_system,
+  'PORTNAME': host_system,
+
+  'abs_top_builddir': meson.build_root(),
+  'abs_top_srcdir': meson.source_root(),
+
+  'enable_thread_safety': 'yes',
+  'enable_rpath': 'yes',
+  'enable_nls': libintl.found() ? 'yes' : 'no',
+  'enable_tap_tests': get_option('enable-tap-tests') ? 'yes' : 'no',
+  'enable_debug': get_option('debug') ? 'yes' : 'no',
+  'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+  'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+  'DLSUFFIX': dlsuffix,
+  'EXEEXT': exesuffix,
+
+  'SUN_STUDIO_CC': 'no', # not supported so far
+
+  'default_port': get_option('pgport'),
+  'with_system_tzdata': get_option('system-tzdata'),
+
+  'with_krb_srvnam': get_option('krb-srvnam'),
+  'krb_srvtab': krb_srvtab,
+
+  # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+  'STRIP': 'strip',
+  'STRIP_STATIC_LIB': 'strip -x',
+  'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+  # Just always use the install_sh fallback that autoconf uses. Unlikely to
+  # matter performance-wise for extensions. If it turns out to do, we can
+  # improve that later.
+  'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+  'CC': var_cc,
+  'CPP': var_cpp,
+  'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld'] ? 'yes' : 'no'),
+
+  'CFLAGS': var_cflags,
+  'CPPFLAGS': var_cppflags,
+  'CXXFLAGS': var_cxxflags,
+  'CFLAGS_SL': var_cflags_sl,
+  'CFLAGS_SL_MODULE': cdata.has('HAVE_VISIBILITY_ATTRIBUTE') ? '-fvisibility=hidden' : '',
+  'CXXFLAGS_SL_MODULE': cdata.has('HAVE_VISIBILITY_ATTRIBUTE') ? '-fvisibility=hidden -fvisibility-inlines-hidden' : '',
+  'CFLAGS_SSE42': ' '.join(cflags_crc),
+  'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+  'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+  # FIXME:
+  'CFLAGS_ARMV8_CRC32C': '',
+  'BITCODE_CFLAGS': '',
+  'BITCODE_CXXFLAGS': '',
+
+  'LDFLAGS': var_ldflags,
+  'LDFLAGS_EX': var_ldflags_ex,
+  'LDFLAGS_SL': var_ldflags_sl,
+
+  'BISONFLAGS': ' '.join(bison_flags),
+  'FLEXFLAGS': ' '.join(flex_flags),
+
+  'LIBS': var_libs,
+}
+
+if llvm.found()
+  pgxs_kv += {
+    'CLANG': clang.path(),
+    'CXX': ' '.join(cpp.cmd_array()),
+    'LLVM_BINPATH': llvm_binpath,
+  }
+else
+  pgxs_kv += {
+    'CLANG': '',
+    'CXX': '',
+    'LLVM_BINPATH': '',
+  }
+endif
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+  'BISON': bison,
+  'FLEX': flex,
+  'GZIP': gzip,
+  'LZ4': program_lz4,
+  'PERL': perl,
+  'PROVE': prove,
+  'PYTHON': python,
+  'TAR': tar,
+  'ZSTD': program_zstd,
+  'DTRACE': dtrace,
+  'LD': ld_program,
+  'install_bin': install_sh,
+}
+foreach b, p : pgxs_bins
+  pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+pgxs_empty = [
+  'PERMIT_DECLARATION_AFTER_STATEMENT',
+  'PG_SYSROOT', #?
+  'ICU_CFLAGS', # needs to be added, included by public server headers
+
+  # probably need most of these?
+  'RANLIB',
+  'WINDRES',
+  'DLLTOOL',
+  'DLLWRAP',
+  'LN_S',
+  'AR',
+  'AWK',
+
+  # hard to see why we'd need either?
+  'ZIC',
+  'TCLSH',
+
+  # docs don't seem to be supported by pgxs
+  'XMLLINT',
+  'XSLTPROC',
+  'DBTOEPUB',
+  'FOP',
+
+  # supporting coverage for pgxs-in-meson build doesn't seem worth it
+  'GENHTML',
+  'LCOV',
+  'GCOV',
+  'MSGFMT_FLAGS',
+
+  # translation doesn't appear to be supported by pgxs
+  'MSGFMT',
+  'XGETTEXT',
+  'MSGMERGE',
+  'WANTED_LANGUAGES',
+
+  # Not needed because we don't build the server / PLs with the generated makefile
+  'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+  'DTRACEFLAGS', # only server has dtrace probes
+
+  'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+  'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+  # possible that some of these are referenced explicitly in pgxs makefiles?
+  # For now not worth it.
+  'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD', 'TCL_SHLIB_LD_LIBS',
+
+  'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+  'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+  'UUID_LIBS',
+
+  'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+  'ICU_LIBS',
+]
+
+foreach pe : pgxs_empty
+  pgxs_cdata.set(pe, '')
+endforeach
+
+pgxs_dirs = {
+  'prefix': get_option('prefix'),
+
+  'bindir': '${exec_prefix}' / get_option('bindir'),
+  'datarootdir': '${prefix}' / get_option('datadir'),
+  'datadir': '${datarootdir}',
+  'docdir': '${prefix}' / dir_doc,
+  'exec_prefix': '${prefix}',
+  'htmldir': '${prefix}' / dir_doc_html, #?
+  'includedir': '${prefix}' / get_option('includedir'),
+  'libdir': '${exec_prefix}' / get_option('libdir'),
+  'localedir': '${prefix}' / get_option('localedir'),
+  'mandir': '${prefix}' / get_option('mandir'),
+  'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+foreach d, p : pgxs_dirs
+  pgxs_cdata.set(d, p)
+endforeach
+
+pgxs_deps = {
+  'bonjour': bonjour,
+  'bsd_auth': bsd_auth,
+  'gssapi': gssapi,
+  'icu': icu,
+  'ldap': ldap,
+  'libxml': libxml,
+  'libxslt': libxslt,
+  'llvm': llvm,
+  'lz4': lz4,
+  'nls' : libintl,
+  'pam' : pam,
+  'perl': perl_dep,
+  'python': python3_dep,
+  'readline': readline,
+  'selinux': selinux,
+  'systemd': systemd,
+  'tcl': tcl_dep,
+  'zlib': zlib,
+  'zstd': zstd,
+}
+foreach d, v : pgxs_deps
+  pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+pgxs_cdata.set('with_ssl', get_option('ssl'))
+pgxs_cdata.set('with_uuid', uuidopt)
+
+makefile_global = configure_file(input: 'Makefile.global.in',
+  output : 'Makefile.global',
+  configuration : pgxs_cdata,
+  install: true,
+  install_dir: dir_pgxs / 'src')
+configure_files += makefile_global
+
+# FIXME: check if exists
+makefile_port = configure_file(
+  input: 'makefiles' / 'Makefile.@0@'.format(host_system),
+  output: 'Makefile.port',
+  copy: true,
+  install_dir: dir_pgxs / 'src')
+configure_files += makefile_port
+
+install_data(
+  'Makefile.shlib', 'nls-global.mk',
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'makefiles/pgxs.mk',
+  install_dir: dir_pgxs / 'src' / 'makefiles')
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..5832950553a
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,53 @@
+# files to build into backend
+timezone_sources = files(
+  'localtime.c',
+  'pgtz.c',
+  'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+   'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+  'data/tzdata.zi'
+)
+
+
+if get_option('system-tzdata') == ''
+  # FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+  # build our zic. But for that we'd need to run a good chunk of the configure
+  # tests both natively and cross. Unclear if it's worth it.
+  if meson.is_cross_build()
+    zic = find_program(get_option('ZIC'), native: true, required: true)
+  else
+    zic = executable('zic', zic_sources,
+                     dependencies: [frontend_code],
+                     kwargs: default_bin_args + {'install': false}
+                    )
+  endif
+
+  tzdata = custom_target('tzdata',
+    input: tzdata,
+    output: ['timezone'],
+    command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+    install: true,
+    install_dir: dir_data,
+  )
+
+# FIXME: make sorts this - but the file isn't actually used, so ...
+abbrevs_txt = custom_target('abbrevs.txt',
+  input: tzdata,
+  output: ['abbrevs.txt'],
+  command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+  capture: true)
+endif
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..7e0a682bd9e
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,21 @@
+tznames = files(
+  'Africa.txt',
+  'America.txt',
+  'Antarctica.txt',
+  'Asia.txt',
+  'Atlantic.txt',
+  'Australia.txt',
+  'Etc.txt',
+  'Europe.txt',
+  'Indian.txt',
+  'Pacific.txt',
+)
+
+tznames_sets = files(
+  'Default',
+  'Australia',
+  'India')
+
+install_data(tznames, tznames_sets,
+  install_dir: dir_data / 'timezonesets',
+)
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..583ec7e6f68
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+
+import os
+import shlex
+import sys
+
+to_print = []
+
+if 'MUON_PATH' in os.environ:
+    to_print += ['muon', os.environ['MUON_PATH']]
+else:
+    mesonintrospect = os.environ['MESONINTROSPECT']
+    components = shlex.split(mesonintrospect)
+
+    if len(components) < 2:
+        print('expected more than two components, got: %s' % components)
+        sys.exit(1)
+
+    if components[-1] != 'introspect':
+        print('expected introspection at the end')
+        sys.exit(1)
+
+    to_print += ['meson'] + components[:-1]
+
+print('\n'.join(to_print), end='')
+
+sys.exit(0)
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..7d3f49da427
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+#index = os.path.realpath(args.index)
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+  shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = [args.name + input.replace(args.privdir, '') for input in args.INPUT]
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink', '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
diff --git a/src/tools/pgflex b/src/tools/pgflex
new file mode 100755
index 00000000000..13d73d50cb4
--- /dev/null
+++ b/src/tools/pgflex
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--flex', dest='flex_command', help='flex executable to run', type=str)
+parser.add_argument('--perl', dest='perl_command', help='perl executable to run', type=str)
+parser.add_argument('--builddir', dest='builddir', help='build directory of meson build', type=str)
+parser.add_argument('--privatedir', dest='privatedir', help='temporary directory to avoid conflicts', type=str)
+parser.add_argument('--fix_warning_script', dest='fix_warning_script', help='script for fixing warnings', default='')
+parser.add_argument('-b', dest='no_backup', action='store_true', help='whether no_backup is enabled or not')
+parser.add_argument('-o', dest='output_file', help='output file')
+parser.add_argument('--stamp_header', dest='stamp_header', help='', default=None)
+
+args, rest = parser.parse_known_args()
+rest, input_file = rest[:-1], rest[-1]
+
+# since 'lex.backup' is always named that,
+# change working directory to temporary directory
+# to avoid conflicts
+os.chdir(os.path.dirname(args.privatedir))
+
+# make paths absolute if it is not absolute,
+# msbuild uses absolute paths as default
+args.output_file = args.output_file if os.path.isabs(args.output_file) else os.path.join(args.builddir, args.output_file)
+input_file = input_file if os.path.isabs(input_file) else os.path.join(args.builddir, input_file)
+
+# set flex flags
+if args.no_backup:
+  flex_flags = ['-o', args.output_file, '-b'] + rest + [input_file]
+else:
+  flex_flags = ['-o', args.output_file] + rest + [input_file]
+
+# create .c file from .l file
+command = [args.flex_command] + flex_flags
+subprocess.run(command, check=True)
+
+ # check lex.backup
+if args.no_backup:
+  with open('lex.backup') as lex:
+    if sum(1 for _ in lex) != 1:
+      sys.exit('Scanner requires backup; see lex.backup.')
+  os.remove('lex.backup')
+
+# fix warnings
+if args.fix_warning_script:
+  # make paths absolute if it is not absolute
+  args.fix_warning_script = args.fix_warning_script if os.path.isabs(args.fix_warning_script) else os.path.join(args.builddir, args.fix_warning_script)
+
+  command = [args.perl_command, args.fix_warning_script, args.output_file]
+  subprocess.run(command, check=True)
+
+#
+stamp_header = args.stamp_header
+if stamp_header != None:
+    if not os.path.isabs(stamp_header):
+        stamp_header = os.path.join(args.builddir, stamp_header)
+    with open(stamp_header, mode='w') as fh:
+        pass
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..ab35e952959
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('INPUT', type=argparse.FileType('r'))
+parser.add_argument('-o', '--output', type=argparse.FileType('w'), required=True)
+parser.add_argument('--depfile', type=argparse.FileType('w'), required=False)
+
+parser.add_argument('--FILEDESC', type=str, required=True)
+parser.add_argument('--NAME', type=str, required=True)
+parser.add_argument('--VFT_TYPE', type=str, required=True)
+parser.add_argument('--FILEENDING', type=str, required=True)
+parser.add_argument('--ICO', type=str)
+
+
+args = parser.parse_args()
+
+data = args.INPUT.read()
+
+data = data.replace('@FILEDESC@', args.FILEDESC)
+data = data.replace('@NAME@', args.NAME)
+data = data.replace('@VFT_TYPE@', args.VFT_TYPE)
+data = data.replace('@FILEENDING@', args.FILEENDING)
+
+if args.ICO:
+   data = data.replace('@ICO@', args.ICO)
+   if args.depfile:
+       args.depfile.write("{0} : {1}\n".format(args.INPUT.name, args.ICO))
+else:
+   data = data.replace("IDI_ICON ICON \"@ICO@\"\n", '')
+
+args.output.write(data)
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..db6431639f1
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import shlex
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    targets = json.load(open(os.path.join(build_root, 'meson-info', 'intro-targets.json')))
+    installed = json.load(open(os.path.join(build_root, 'meson-info', 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            #print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            subprocess.check_call(install_name_tool + ['-change', lib, newref, patchpath])
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}', file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..03fe135f4a8
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+
+import argparse
+import shutil
+import subprocess
+import os
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--srcdir', help='source directory of test', type=str)
+parser.add_argument('--basedir', help='base directory of test', type=str)
+parser.add_argument('--builddir', help='build directory of meson build', type=str)
+parser.add_argument('--testgroup', help='test group', type=str)
+parser.add_argument('--testname', help='test name', type=str)
+
+args, test_command = parser.parse_known_args()
+
+if args.testname.endswith('.pl'):
+    args.testname = args.testname[:-3]
+
+testdir = '{}/testrun/{}/{}'.format(args.basedir, args.testgroup, args.testname)
+
+print('# executing test in {} group {} test {}, builddir {}'
+  .format(testdir, args.testgroup, args.testname, args.builddir))
+sys.stdout.flush()
+
+if os.path.exists(testdir) and os.path.isdir(testdir):
+  shutil.rmtree(testdir)
+os.makedirs(testdir)
+
+os.chdir(args.srcdir)
+
+# mark test as having started
+open(os.path.join(testdir, 'test.start'), 'x')
+
+env_dict = {**os.environ, 'TESTOUTDIR': testdir, 'TESTDIR': args.builddir}
+sp = subprocess.run(test_command, env=env_dict)
+
+if (sp.returncode == 0):
+    print('# test succeeded')
+    open(os.path.join(testdir, 'test.success'), 'x')
+else:
+    print('# test failed')
+    open(os.path.join(testdir, 'test.fail'), 'x')
+sys.exit(sp.returncode)
-- 
2.37.0.3.g30cc8d0f14

v11-0009-meson-ci-Build-both-with-meson-and-as-before.patchtext/x-diff; charset=us-asciiDownload
From 80f87362dc69c5bff3fc1de659894860723c5030 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Apr 2022 12:08:09 -0700
Subject: [PATCH v11 9/9] meson: ci: Build both with meson and as before

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Justin Pryzby <pryzby@telsasoft.com>
---
 .cirrus.yml                                   | 839 +++++++++++++++++-
 src/tools/ci/docker/linux_centos7             |  57 ++
 src/tools/ci/docker/linux_centos8             |  54 ++
 src/tools/ci/docker/linux_fedora_rawhide      |  49 +
 src/tools/ci/docker/linux_opensuse_tumbleweed |  56 ++
 5 files changed, 1009 insertions(+), 46 deletions(-)
 create mode 100644 src/tools/ci/docker/linux_centos7
 create mode 100644 src/tools/ci/docker/linux_centos8
 create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
 create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed

diff --git a/.cirrus.yml b/.cirrus.yml
index 81eb8a9996d..9ea4365f94a 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -22,13 +22,14 @@ env:
   CHECK: check-world PROVE_FLAGS=$PROVE_FLAGS
   CHECKFLAGS: -Otarget
   PROVE_FLAGS: --timer
+  MTEST_ARGS: --print-errorlogs --no-rebuild -C build
   PGCTLTIMEOUT: 120 # avoids spurious failures during parallel tests
   TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/src/tools/ci/pg_ci_base.conf
   PG_TEST_EXTRA: kerberos ldap ssl
 
 
 # What files to preserve in case tests fail
-on_failure: &on_failure
+on_failure_ac: &on_failure_ac
   log_artifacts:
     paths:
       - "**/*.log"
@@ -36,9 +37,41 @@ on_failure: &on_failure
       - "**/regress_log_*"
     type: text/plain
 
-task:
-  name: FreeBSD - 13
+on_failure_meson: &on_failure_meson
+  testrun_artifacts:
+    paths:
+      - "build/testrun/**/*.log"
+      - "build/testrun/**/*.diffs"
+      - "build/testrun/**/regress_log_*"
+    type: text/plain
 
+  # In theory it'd be nice to upload the junit files meson generates, so that
+  # cirrus will nicely annotate the commit. Unfortunately the files don't
+  # contain identifyable file + line numbers right now, so the annotations
+  # don't end up useful. We could probably improve on that with a some custom
+  # conversion script, but ...
+  meson_log_artifacts:
+    path: "build/meson-logs/*.txt"
+    type: text/plain
+
+
+# configure feature flags, shared between the task running the BSD tests
+# these feature flags don't include --with-gssapi and --with-uuid=bsd
+# since these are not working on openBSD and netBSD
+BSD_CONFIGURE_FEATURES: &BSD_CONFIGURE_FEATURES >-
+  --with-icu
+  --with-ldap
+  --with-libxml
+  --with-libxslt
+  --with-lz4
+  --with-pam
+  --with-perl
+  --with-python
+  --with-ssl=openssl
+  --with-tcl --with-tclconfig=${TCL_CONFIG_PATH}
+
+
+freebsd_template: &freebsd_template
   env:
     # FreeBSD on GCP is slow when running with larger number of CPUS /
     # jobs. Using one more job than cpus seems to work best.
@@ -48,6 +81,12 @@ task:
 
     CCACHE_DIR: /tmp/ccache_dir
 
+    TCL_CONFIG_PATH: /usr/local/lib/tcl8.6/
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
 
   compute_engine_instance:
@@ -80,6 +119,13 @@ task:
   setup_additional_packages_script: |
     #pkg install -y ...
 
+
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Autoconf
+  trigger_type: manual
+
   # NB: Intentionally build without --with-llvm. The freebsd image size is
   # already large enough to make VM startup slow, and even without llvm
   # freebsd already takes longer than other platforms except for windows.
@@ -90,16 +136,7 @@ task:
         --enable-nls \
         \
         --with-gssapi \
-        --with-icu \
-        --with-ldap \
-        --with-libxml \
-        --with-libxslt \
-        --with-lz4 \
-        --with-pam \
-        --with-perl \
-        --with-python \
-        --with-ssl=openssl \
-        --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+        ${BSD_CONFIGURE_FEATURES} \
         --with-uuid=bsd \
         --with-zstd \
         \
@@ -107,8 +144,7 @@ task:
         --with-libs=/usr/local/lib \
         \
         CC="ccache cc" \
-        CXX="ccache c++" \
-        CFLAGS="-Og -ggdb"
+        CXX="ccache c++"
     EOF
   build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
   upload_caches: ccache
@@ -117,14 +153,274 @@ task:
   # platforms without support for locking pipes. See also
   # https://savannah.gnu.org/bugs/?60774
   # script uses pseudo-ttys, which do support locking.
-  test_world_script:
-    - su postgres -c "time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}"
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
+    EOF
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
 
 
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=bsd -Dtcl_version=tcl86 -Ddtrace=auto build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+    cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
+
+
+netbsd_template: &netbsd_template
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+    TCL_CONFIG_PATH: /usr/pkg/lib
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/pg-ci-netbsd-9-postgres
+    platform: netbsd
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:users /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:users ${CCACHE_DIR}
+
+
+task:
+  <<: *netbsd_template
+
+  name: NetBSD - 9 - Autoconf
+  trigger_type: manual
+
+  # --with-uuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+        --enable-cassert --enable-debug --enable-tap-tests \
+        --enable-nls \
+        \
+        ${BSD_CONFIGURE_FEATURES} \
+        \
+        --with-includes=/usr/pkg/include --with-libs=/usr/pgk/lib \
+        CC="ccache cc" \
+        CXX="ccache c++" \
+        LDFLAGS="-Wl,-R/usr/pkg/lib" \
+        \
+        PYTHON=python3.9
+    EOF
+  build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *netbsd_template
+
+  name: NetBSD - 9 - Meson
+
+  # -Duuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres  <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl \
+        -Dextra_lib_dirs=/usr/pkg/lib -Dextra_include_dirs=/usr/pkg/include \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+openbsd_template: &openbsd_template
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+    TCL_CONFIG_PATH: /usr/local/lib/tcl/tcl8.6/
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/pg-ci-openbsd-7-postgres
+    platform: openbsd
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:postgres /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+
+
+task:
+  <<: *openbsd_template
+
+  name: OpenBSD - 7 - Autoconf
+  trigger_type: manual
+
+  # --with-uuid option is set to 'e2fs' since 'bsd' uuid option
+  # is not working on openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # (same error applies for openBSD)
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+        --enable-cassert --enable-debug --enable-tap-tests \
+        --enable-nls \
+        \
+        ${BSD_CONFIGURE_FEATURES} \
+        --with-uuid=e2fs \
+        \
+        --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+        CC="ccache cc" \
+        CXX="ccache c++" \
+        LDFLAGS="-Wl,-R/usr/local/lib"
+    EOF
+  build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *openbsd_template
+
+  name: OpenBSD - 7 - Meson
+
+  # -Duuid option is set to 'e2fs' since 'bsd' uuid option
+  # is not working on openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # (same error applies for openBSD)
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl -Duuid=e2fs \
+        -Dextra_include_dirs=/usr/local/include -Dextra_lib_dirs=/usr/local/lib \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 # configure feature flags, shared between the task running the linux tests and
 # the CompilerWarnings task
 LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -141,14 +437,28 @@ LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
   --with-selinux
   --with-ssl=openssl
   --with-systemd
-  --with-tcl --with-tclconfig=/usr/lib/tcl8.6/
-  --with-uuid=ossp
+  --with-tcl --with-tclconfig=${TCL_DIR:/usr/lib/tcl8.6/}
+  --with-uuid=${UUID:ossp}
   --with-zstd
 
 
-task:
-  name: Linux - Debian Bullseye
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+  sysinfo_script: |
+    id
+    uname -a
+    cat /proc/cmdline
+    ulimit -a -H && ulimit -a -S
+    export
+  create_user_script: |
+    useradd -m -U postgres
+    chown -R postgres:postgres .
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+    su postgres -c "ulimit -l -H && ulimit -l -S"
 
+
+linux_debian_template: &linux_debian_template
   env:
     CPUS: 4
     BUILD_JOBS: 4
@@ -157,6 +467,9 @@ task:
     CCACHE_DIR: /tmp/ccache_dir
     DEBUGINFOD_URLS: "https://debuginfod.debian.net"
 
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
     LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
 
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
@@ -171,19 +484,9 @@ task:
   ccache_cache:
     folder: ${CCACHE_DIR}
 
-  sysinfo_script: |
-    id
-    uname -a
-    cat /proc/cmdline
-    ulimit -a -H && ulimit -a -S
-    export
-  create_user_script: |
-    useradd -m postgres
-    chown -R postgres:postgres .
-    mkdir -p ${CCACHE_DIR}
-    chown -R postgres:postgres ${CCACHE_DIR}
+  set_limits_script: |
     echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
-    su postgres -c "ulimit -l -H && ulimit -l -S"
+  <<: *linux_preparation_scripts_template
   setup_core_files_script: |
     mkdir -m 770 /tmp/cores
     chown root:postgres /tmp/cores
@@ -192,6 +495,12 @@ task:
     #apt-get update
     #DEBIAN_FRONTEND=noninteractive apt-get -y install ...
 
+
+task:
+  <<: *linux_debian_template
+
+  name: Linux - Debian Bullseye - Autoconf
+
   configure_script: |
     su postgres <<-EOF
       ./configure \
@@ -202,9 +511,7 @@ task:
         \
         CC="ccache gcc" \
         CXX="ccache g++" \
-        CLANG="ccache clang" \
-        CFLAGS="-Og -ggdb" \
-        CXXFLAGS="-Og -ggdb"
+        CLANG="ccache clang"
     EOF
   build_script: su postgres -c "make -s -j${BUILD_JOBS} world-bin"
   upload_caches: ccache
@@ -216,13 +523,353 @@ task:
     EOF
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
+    cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
+
+
+task: &linux_debian_bullseye_meson
+  <<: *linux_debian_template
+
+  name: Linux - Debian Bullseye - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Ddtrace=enabled build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
     cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
 
 
 task:
-  name: macOS - Monterey
+  <<: *linux_debian_bullseye_meson
 
+  name: Linux - Debian Sid - Meson
+  trigger_type: manual
+
+  compute_engine_instance:
+    image: family/pg-ci-sid
+
+
+linux_opensuse_template: &linux_opensuse_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: "https://debuginfod.opensuse.org/"
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: src/tools/ci/docker/linux_opensuse_tumbleweed
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" && \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Dllvm=enabled build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+linux_rhel_template: &linux_rhel_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: ${DEBUGINFO}
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: ${DOCKERFILE_PATH}
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      PYTHON=python3 \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-gssapi \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-selinux \
+      --with-ssl=openssl \
+      --with-systemd \
+      --with-tcl --with-tclconfig=/usr/lib64/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+macos_template: &macos_template
   env:
     CPUS: 12 # always get that much for cirrusci macOS instances
     BUILD_JOBS: $CPUS
@@ -233,6 +880,9 @@ task:
     HOMEBREW_CACHE: ${HOME}/homebrew-cache
     PERL5LIB: ${HOME}/perl5/lib/perl5
 
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
 
   osx_instance:
@@ -269,6 +919,7 @@ task:
       llvm \
       lz4 \
       make \
+      meson \
       openldap \
       openssl \
       python \
@@ -280,6 +931,14 @@ task:
 
   ccache_cache:
     folder: $CCACHE_DIR
+
+
+task:
+  <<: *macos_template
+
+  name: macOS - Monterey - Autoconf
+  trigger_type: manual
+
   configure_script: |
     brewpath="/usr/local"
     INCLUDES="${brewpath}/include:${INCLUDES}"
@@ -319,8 +978,6 @@ task:
       CC="ccache cc" \
       CXX="ccache c++" \
       CLANG="ccache ${brewpath}/llvm/bin/ccache" \
-      CFLAGS="-Og -ggdb" \
-      CXXFLAGS="-Og -ggdb" \
       \
       LLVM_CONFIG=${brewpath}/llvm/bin/llvm-config \
       PYTHON=python3
@@ -334,13 +991,42 @@ task:
     script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
     cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
 
 
 task:
-  name: Windows - Server 2019, VS 2019
+  <<: *macos_template
 
+  name: macOS - Monterey - Meson
+
+  configure_script: |
+    brewpath="/usr/local"
+    PKG_CONFIG_PATH="${brewpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+
+    for pkg in icu4c krb5 openldap openssl ; do
+      pkgpath="${brewpath}/opt/${pkg}"
+      PKG_CONFIG_PATH="${pkgpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+    done
+
+    export PKG_CONFIG_PATH
+
+    meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs  -Ddtrace=auto build
+
+  build_script: ninja -C build -j${BUILD_JOBS}
+  upload_caches: ccache
+
+  tests_world_script:
+    - ulimit -c unlimited
+    - ulimit -n 1024
+    - meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+
+  on_failure:
+    <<: *on_failure_meson
+    cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
+
+
+windows_template: &windows_template
   env:
     # Half the allowed per-user CPU cores
     CPUS: 4
@@ -402,6 +1088,11 @@ task:
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
 
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Homegrown
+
   configure_script:
     # copy errors out when using forward slashes
     - copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl
@@ -451,10 +1142,65 @@ task:
     %T_C% perl vcregress.pl ecpgcheck
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+  meson_install_script:
+    - pip install meson ninja
+
+  configure_script:
+    - vcvarsall x64
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - ninja -C build
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test %MTEST_ARGS% --num-processes 10
+
+  on_failure:
+    <<: *on_failure_meson
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+  meson_install_script:
+    - pip install meson
+
+  configure_script:
+    - vcvarsall x64
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+    - meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - msbuild /p:UseMultiToolTask=true %MSBFLAGS% build\postgresql.sln
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test %MTEST_ARGS% --num-processes 10
+
+  on_failure:
+    <<: *on_failure_meson
     crashlog_artifacts:
       path: "crashlog-*.txt"
-      type: text/plain
 
 
 task:
@@ -462,7 +1208,8 @@ task:
 
   # To limit unnecessary work only run this once the normal linux test succeeds
   depends_on:
-    - Linux - Debian Bullseye
+    - Linux - Debian Bullseye - Meson
+  trigger_type: manual
 
   env:
     CPUS: 4
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+  yum -y install dnf-plugins-core \
+  epel-release \
+  centos-release-scl-rh && \
+  \
+  yum -y update && \
+  yum -y install \
+  \
+  git \
+  perl \
+  perl-ExtUtils-Embed \
+  perl-IPC-Run \
+  perl-Test-Harness \
+  perl-Test-Simple \
+  \
+  bison \
+  ccache \
+  clang \
+  devtoolset-7-make \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  && \
+  pip3 install meson && \
+  pip3 install ninja && \
+  yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+  dnf -y install dnf-plugins-core && \
+  dnf config-manager --set-enabled powertools && \
+  dnf -y install epel-release && \
+  dnf -y update && \
+  dnf -y install \
+  \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  diffutils \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  glibc-langpack-en \
+  \
+  && \
+  pip3 install ninja && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+  dnf -y update && \
+  dnf -y install \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gettext \
+  ninja-build \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  langpacks-en \
+  glibc-langpack-en \
+  \
+  && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+  zypper -n clean -a && \
+  zypper -n ref && \
+  zypper -n dup && \
+  zypper -n update && \
+  zypper -n install \
+  diffutils \
+  git \
+  icu \
+  make \
+  meson \
+  perl-IPC-Run \
+  shadow \
+  systemd-devel \
+  util-linux \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gcc-c++ \
+  gettext-runtime \
+  ninja \
+  \
+  krb5-devel \
+  libicu-devel \
+  libldapcpp-devel \
+  liblz4-devel \
+  libopenssl-devel \
+  libselinux-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  pam-devel \
+  python38-devel \
+  readline-devel \
+  tcl-devel \
+  \
+  openldap2 \
+  openldap2-client \
+  \
+  krb5-client \
+  krb5-plugin-kdb-ldap \
+  krb5-server \
+  lz4 \
+  zstd \
+  \
+  && \
+  zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
-- 
2.37.0.3.g30cc8d0f14

#226John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#224)
Re: [RFC] building postgres with meson

On Thu, Aug 11, 2022 at 12:19 AM Andres Freund <andres@anarazel.de> wrote:

I tried to ignore various generated files in the source tree, but I don't
think it's doable for all of them. Consider
e.g. src/backend/utils/misc/guc-file.c which is gets built via #include
"guc-file.c" from gram.c

With a bit of work, we could probably get rid of those includes. See
27199058d98ef7f for one example.

--
John Naylor
EDB: http://www.enterprisedb.com

#227Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#226)
Re: [RFC] building postgres with meson

John Naylor <john.naylor@enterprisedb.com> writes:

With a bit of work, we could probably get rid of those includes. See
27199058d98ef7f for one example.

Yeah --- it would mean creating gram.h files for all the bison grammars
not just a few of them, but it's certainly do-able if there's motivation
to make the changes. Most of the files that are done that way date
from before we knew about flex's %top.

regards, tom lane

#228Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#227)
Re: [RFC] building postgres with meson

I wrote:

John Naylor <john.naylor@enterprisedb.com> writes:

With a bit of work, we could probably get rid of those includes. See
27199058d98ef7f for one example.

Yeah --- it would mean creating gram.h files for all the bison grammars
not just a few of them, but it's certainly do-able if there's motivation
to make the changes. Most of the files that are done that way date
from before we knew about flex's %top.

BTW, 72b1e3a21 is another useful precedent in this area.

regards, tom lane

#229John Naylor
john.naylor@enterprisedb.com
In reply to: Tom Lane (#227)
Re: [RFC] building postgres with meson

On Thu, Aug 11, 2022 at 10:37 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

John Naylor <john.naylor@enterprisedb.com> writes:

With a bit of work, we could probably get rid of those includes. See
27199058d98ef7f for one example.

Yeah --- it would mean creating gram.h files for all the bison grammars
not just a few of them, but it's certainly do-able if there's motivation
to make the changes. Most of the files that are done that way date
from before we knew about flex's %top.

I'll volunteer to work on this unless an easier solution happens to
come along in the next couple days. (aside: guc-file.l doesn't have a
grammar, so not yet sure if that makes the issue easier or harder...)

--
John Naylor
EDB: http://www.enterprisedb.com

#230Andres Freund
andres@anarazel.de
In reply to: John Naylor (#229)
Re: [RFC] building postgres with meson

Hi,

On 2022-08-11 10:57:33 +0700, John Naylor wrote:

I'll volunteer to work on this unless an easier solution happens to
come along in the next couple days.

Cool!

(aside: guc-file.l doesn't have a grammar, so not yet sure if that makes the
issue easier or harder...)

I think we should consider compiling it separately from guc.c. guc.c already
compiles quite slowly (iirc beat only by ecpg and main grammar), and it's a
relatively commonly changed source file.

It might even be a good idea to split guc.c so it only contains the settings
arrays + direct dependencies...

Greetings,

Andres Freund

#231Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#229)
Re: [RFC] building postgres with meson

John Naylor <john.naylor@enterprisedb.com> writes:

I'll volunteer to work on this unless an easier solution happens to
come along in the next couple days. (aside: guc-file.l doesn't have a
grammar, so not yet sure if that makes the issue easier or harder...)

That one's probably mostly about the issue mentioned in the other
commit you identified. Without %top, it's impossible to make a
standalone flex module honor the rule about thou-shalt-have-no-
other-includes-before-postgres.h. So embedding it in some other
file was originally a necessity for that. Now that we know how
to fix that, it's just a matter of making sure that any other stuff
the scanner needs is available from a .h file.

regards, tom lane

#232John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#230)
1 attachment(s)
build remaining Flex files standalone

Starting a new thread to control clutter. [was: Re: [RFC] building
postgres with meson]

motivation: /messages/by-id/20220810171935.7k5zgnjwqzalzmtm@awork3.anarazel.de

On Thu, Aug 11, 2022 at 11:07 AM Andres Freund <andres@anarazel.de> wrote:

I think we should consider compiling it separately from guc.c. guc.c already
compiles quite slowly (iirc beat only by ecpg and main grammar), and it's a
relatively commonly changed source file.

Done in the attached, and will do the rest in time. It seemed most
straightforward to put ProcessConfigFileInternal() in guc.c since
that's where most of its callers are, and it relies on some vars and
types declared there. There are a couple new extern declarations in
guc.h that are only for guc.c and guc-file.c:

+/* functions shared between guc.c and guc-file.l */
+extern int guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+ bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+ const char *config_file,
+ int lineno,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p);

These might be better placed in a new guc_internal.h. Thoughts?

It might even be a good idea to split guc.c so it only contains the settings
arrays + direct dependencies...

Perhaps this can be a TODO item, one which falls under "[E] marks
items that are easier to implement". I've been slacking on removing
the old/intractable cruft from the TODO list, but we should also be
sticking small nice-but-not-necessary things in there. That said, if
this idea has any bearing on the guc_internal.h idea, it might be
better dealt with now.

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v1-0001-Build-guc-file.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v1-0001-Build-guc-file.c-standalone.patchDownload
From d723ba14acf56fd432e9e263db937fcc13fc0355 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Thu, 11 Aug 2022 19:38:37 +0700
Subject: [PATCH v1] Build guc-file.c standalone

The proposed Meson build system will need a way to ignore certain
generated files in order to coexist with the autoconf build system,
and #include'd C files generated by Flex make this more difficult.
Build guc-file.c separately from guc.c, as was done in 72b1e3a21.

TODO: other Flex-generated files

Discussion: https://www.postgresql.org/message-id/20220810171935.7k5zgnjwqzalzmtm%40awork3.anarazel.de
---
 src/backend/utils/misc/Makefile   |   5 +-
 src/backend/utils/misc/guc-file.l | 367 +-----------------------------
 src/backend/utils/misc/guc.c      | 362 ++++++++++++++++++++++++++++-
 src/include/utils/guc.h           |   9 +
 4 files changed, 370 insertions(+), 373 deletions(-)

diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 1d5327cf64..cf7ce9bc83 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	guc.o \
+	guc-file.o \
 	help_config.o \
 	pg_config.o \
 	pg_controldata.o \
@@ -37,10 +38,6 @@ endif
 
 include $(top_srcdir)/src/backend/common.mk
 
-# guc-file is compiled as part of guc
-guc.o: guc-file.c
-
 # Note: guc-file.c is not deleted by 'make clean',
 # since we want to ship it in distribution tarballs.
 clean:
-	@rm -f lex.yy.c
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index ce5633844c..08adb454de 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -7,7 +7,7 @@
  * src/backend/utils/misc/guc-file.l
  */
 
-%{
+%top{
 
 #include "postgres.h"
 
@@ -17,9 +17,12 @@
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 #include "storage/fd.h"
+#include <sys/stat.h>
 #include "utils/guc.h"
+#include "utils/memutils.h"
+}
 
-
+%{
 /*
  * flex emits a yy_fatal_error() function that it calls in response to
  * critical errors like malloc failure, file I/O errors, and detection of
@@ -48,12 +51,6 @@ static sigjmp_buf *GUC_flex_fatal_jmp;
 
 static void FreeConfigVariable(ConfigVariable *item);
 
-static void record_config_file_error(const char *errmsg,
-									 const char *config_file,
-									 int lineno,
-									 ConfigVariable **head_p,
-									 ConfigVariable **tail_p);
-
 static int	GUC_flex_fatal(const char *msg);
 
 /* LCOV_EXCL_START */
@@ -159,358 +156,6 @@ ProcessConfigFile(GucContext context)
 	MemoryContextDelete(config_cxt);
 }
 
-/*
- * This function handles both actual config file (re)loads and execution of
- * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
- * case we don't apply any of the settings, but we make all the usual validity
- * checks, and we return the ConfigVariable list so that it can be printed out
- * by show_all_file_settings().
- */
-static ConfigVariable *
-ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
-{
-	bool		error = false;
-	bool		applying = false;
-	const char *ConfFileWithError;
-	ConfigVariable *item,
-			   *head,
-			   *tail;
-	int			i;
-
-	/* Parse the main config file into a list of option names and values */
-	ConfFileWithError = ConfigFileName;
-	head = tail = NULL;
-
-	if (!ParseConfigFile(ConfigFileName, true,
-						 NULL, 0, 0, elevel,
-						 &head, &tail))
-	{
-		/* Syntax error(s) detected in the file, so bail out */
-		error = true;
-		goto bail_out;
-	}
-
-	/*
-	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
-	 * replace any parameters set by ALTER SYSTEM command.  Because this file
-	 * is in the data directory, we can't read it until the DataDir has been
-	 * set.
-	 */
-	if (DataDir)
-	{
-		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
-							 NULL, 0, 0, elevel,
-							 &head, &tail))
-		{
-			/* Syntax error(s) detected in the file, so bail out */
-			error = true;
-			ConfFileWithError = PG_AUTOCONF_FILENAME;
-			goto bail_out;
-		}
-	}
-	else
-	{
-		/*
-		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
-		 * read.  In this case, we don't want to accept any settings but
-		 * data_directory from postgresql.conf, because they might be
-		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
-		 * will be read later. OTOH, since data_directory isn't allowed in the
-		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
-		 */
-		ConfigVariable *newlist = NULL;
-
-		/*
-		 * Prune all items except the last "data_directory" from the list.
-		 */
-		for (item = head; item; item = item->next)
-		{
-			if (!item->ignore &&
-				strcmp(item->name, "data_directory") == 0)
-				newlist = item;
-		}
-
-		if (newlist)
-			newlist->next = NULL;
-		head = tail = newlist;
-
-		/*
-		 * Quick exit if data_directory is not present in file.
-		 *
-		 * We need not do any further processing, in particular we don't set
-		 * PgReloadTime; that will be set soon by subsequent full loading of
-		 * the config file.
-		 */
-		if (head == NULL)
-			goto bail_out;
-	}
-
-	/*
-	 * Mark all extant GUC variables as not present in the config file. We
-	 * need this so that we can tell below which ones have been removed from
-	 * the file since we last processed it.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-
-		gconf->status &= ~GUC_IS_IN_FILE;
-	}
-
-	/*
-	 * Check if all the supplied option names are valid, as an additional
-	 * quasi-syntactic check on the validity of the config file.  It is
-	 * important that the postmaster and all backends agree on the results of
-	 * this phase, else we will have strange inconsistencies about which
-	 * processes accept a config file update and which don't.  Hence, unknown
-	 * custom variable names have to be accepted without complaint.  For the
-	 * same reason, we don't attempt to validate the options' values here.
-	 *
-	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
-	 * variable mentioned in the file; and we detect duplicate entries in the
-	 * file and mark the earlier occurrences as ignorable.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		struct config_generic *record;
-
-		/* Ignore anything already marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/*
-		 * Try to find the variable; but do not create a custom placeholder if
-		 * it's not there already.
-		 */
-		record = find_option(item->name, false, true, elevel);
-
-		if (record)
-		{
-			/* If it's already marked, then this is a duplicate entry */
-			if (record->status & GUC_IS_IN_FILE)
-			{
-				/*
-				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
-				 * avoid the O(N^2) behavior here with some additional state,
-				 * but it seems unlikely to be worth the trouble.
-				 */
-				ConfigVariable *pitem;
-
-				for (pitem = head; pitem != item; pitem = pitem->next)
-				{
-					if (!pitem->ignore &&
-						strcmp(pitem->name, item->name) == 0)
-						pitem->ignore = true;
-				}
-			}
-			/* Now mark it as present in file */
-			record->status |= GUC_IS_IN_FILE;
-		}
-		else if (!valid_custom_variable_name(item->name))
-		{
-			/* Invalid non-custom variable, so complain */
-			ereport(elevel,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
-							item->name,
-							item->filename, item->sourceline)));
-			item->errmsg = pstrdup("unrecognized configuration parameter");
-			error = true;
-			ConfFileWithError = item->filename;
-		}
-	}
-
-	/*
-	 * If we've detected any errors so far, we don't want to risk applying any
-	 * changes.
-	 */
-	if (error)
-		goto bail_out;
-
-	/* Otherwise, set flag that we're beginning to apply changes */
-	applying = true;
-
-	/*
-	 * Check for variables having been removed from the config file, and
-	 * revert their reset values (and perhaps also effective values) to the
-	 * boot-time defaults.  If such a variable can't be changed after startup,
-	 * report that and continue.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-		GucStack   *stack;
-
-		if (gconf->reset_source != PGC_S_FILE ||
-			(gconf->status & GUC_IS_IN_FILE))
-			continue;
-		if (gconf->context < PGC_SIGHUP)
-		{
-			/* The removal can't be effective without a restart */
-			gconf->status |= GUC_PENDING_RESTART;
-			ereport(elevel,
-					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
-					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
-							gconf->name)));
-			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
-											  gconf->name),
-									 NULL, 0,
-									 &head, &tail);
-			error = true;
-			continue;
-		}
-
-		/* No more to do if we're just doing show_all_file_settings() */
-		if (!applySettings)
-			continue;
-
-		/*
-		 * Reset any "file" sources to "default", else set_config_option will
-		 * not override those settings.
-		 */
-		if (gconf->reset_source == PGC_S_FILE)
-			gconf->reset_source = PGC_S_DEFAULT;
-		if (gconf->source == PGC_S_FILE)
-			gconf->source = PGC_S_DEFAULT;
-		for (stack = gconf->stack; stack; stack = stack->prev)
-		{
-			if (stack->source == PGC_S_FILE)
-				stack->source = PGC_S_DEFAULT;
-		}
-
-		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
-		if (set_config_option(gconf->name, NULL,
-							  context, PGC_S_DEFAULT,
-							  GUC_ACTION_SET, true, 0, false) > 0)
-		{
-			/* Log the change if appropriate */
-			if (context == PGC_SIGHUP)
-				ereport(elevel,
-						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
-								gconf->name)));
-		}
-	}
-
-	/*
-	 * Restore any variables determined by environment variables or
-	 * dynamically-computed defaults.  This is a no-op except in the case
-	 * where one of these had been in the config file and is now removed.
-	 *
-	 * In particular, we *must not* do this during the postmaster's initial
-	 * loading of the file, since the timezone functions in particular should
-	 * be run only after initialization is complete.
-	 *
-	 * XXX this is an unmaintainable crock, because we have to know how to set
-	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
-	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
-	 */
-	if (context == PGC_SIGHUP && applySettings)
-	{
-		InitializeGUCOptionsFromEnvironment();
-		pg_timezone_abbrev_initialize();
-		/* this selects SQL_ASCII in processes not connected to a database */
-		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
-						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
-	}
-
-	/*
-	 * Now apply the values from the config file.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		char	   *pre_value = NULL;
-		int			scres;
-
-		/* Ignore anything marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/* In SIGHUP cases in the postmaster, we want to report changes */
-		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
-		{
-			const char *preval = GetConfigOption(item->name, true, false);
-
-			/* If option doesn't exist yet or is NULL, treat as empty string */
-			if (!preval)
-				preval = "";
-			/* must dup, else might have dangling pointer below */
-			pre_value = pstrdup(preval);
-		}
-
-		scres = set_config_option(item->name, item->value,
-								  context, PGC_S_FILE,
-								  GUC_ACTION_SET, applySettings, 0, false);
-		if (scres > 0)
-		{
-			/* variable was updated, so log the change if appropriate */
-			if (pre_value)
-			{
-				const char *post_value = GetConfigOption(item->name, true, false);
-
-				if (!post_value)
-					post_value = "";
-				if (strcmp(pre_value, post_value) != 0)
-					ereport(elevel,
-							(errmsg("parameter \"%s\" changed to \"%s\"",
-									item->name, item->value)));
-			}
-			item->applied = true;
-		}
-		else if (scres == 0)
-		{
-			error = true;
-			item->errmsg = pstrdup("setting could not be applied");
-			ConfFileWithError = item->filename;
-		}
-		else
-		{
-			/* no error, but variable's active value was not changed */
-			item->applied = true;
-		}
-
-		/*
-		 * We should update source location unless there was an error, since
-		 * even if the active value didn't change, the reset value might have.
-		 * (In the postmaster, there won't be a difference, but it does matter
-		 * in backends.)
-		 */
-		if (scres != 0 && applySettings)
-			set_config_sourcefile(item->name, item->filename,
-								  item->sourceline);
-
-		if (pre_value)
-			pfree(pre_value);
-	}
-
-	/* Remember when we last successfully loaded the config file. */
-	if (applySettings)
-		PgReloadTime = GetCurrentTimestamp();
-
-bail_out:
-	if (error && applySettings)
-	{
-		/* During postmaster startup, any error is fatal */
-		if (context == PGC_POSTMASTER)
-			ereport(ERROR,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors",
-							ConfFileWithError)));
-		else if (applying)
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
-							ConfFileWithError)));
-		else
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
-							ConfFileWithError)));
-	}
-
-	/* Successful or otherwise, return the collected data list */
-	return head;
-}
-
 /*
  * Given a configuration file or directory location that may be a relative
  * path, return an absolute one.  We consider the location to be relative to
@@ -659,7 +304,7 @@ cleanup:
  * Capture an error message in the ConfigVariable list returned by
  * config file parsing.
  */
-static void
+void
 record_config_file_error(const char *errmsg,
 						 const char *config_file,
 						 int lineno,
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 5db5df6285..e4a00f1205 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -243,10 +243,6 @@ static void assign_recovery_target_lsn(const char *newval, void *extra);
 static bool check_primary_slot_name(char **newval, void **extra, GucSource source);
 static bool check_default_with_oids(bool *newval, void **extra, GucSource source);
 
-/* Private functions in guc-file.l that need to be called from guc.c */
-static ConfigVariable *ProcessConfigFileInternal(GucContext context,
-												 bool applySettings, int elevel);
-
 /*
  * Track whether there were any deferred checks for custom resource managers
  * specified in wal_consistency_checking.
@@ -5164,8 +5160,8 @@ static bool report_needed;		/* true if any GUC_REPORT reports are needed */
 static int	GUCNestLevel = 0;	/* 1 when in main transaction */
 
 
+static struct config_generic *find_option(const char *name, bool create_placeholders, bool skip_errors, int elevel);
 static int	guc_var_compare(const void *a, const void *b);
-static int	guc_name_compare(const char *namea, const char *nameb);
 static void InitializeGUCOptionsFromEnvironment(void);
 static void InitializeOneGUCOption(struct config_generic *gconf);
 static void push_old_value(struct config_generic *gconf, GucAction action);
@@ -5184,7 +5180,359 @@ static bool validate_option_array_item(const char *name, const char *value,
 static void write_auto_conf_file(int fd, const char *filename, ConfigVariable *head_p);
 static void replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
 									  const char *name, const char *value);
+static bool valid_custom_variable_name(const char *name);
+
+/*
+ * This function handles both actual config file (re)loads and execution of
+ * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
+ * case we don't apply any of the settings, but we make all the usual validity
+ * checks, and we return the ConfigVariable list so that it can be printed out
+ * by show_all_file_settings().
+ */
+ConfigVariable *
+ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
+{
+	bool		error = false;
+	bool		applying = false;
+	const char *ConfFileWithError;
+	ConfigVariable *item,
+			   *head,
+			   *tail;
+	int			i;
+
+	/* Parse the main config file into a list of option names and values */
+	ConfFileWithError = ConfigFileName;
+	head = tail = NULL;
+
+	if (!ParseConfigFile(ConfigFileName, true,
+						 NULL, 0, 0, elevel,
+						 &head, &tail))
+	{
+		/* Syntax error(s) detected in the file, so bail out */
+		error = true;
+		goto bail_out;
+	}
+
+	/*
+	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
+	 * replace any parameters set by ALTER SYSTEM command.  Because this file
+	 * is in the data directory, we can't read it until the DataDir has been
+	 * set.
+	 */
+	if (DataDir)
+	{
+		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
+							 NULL, 0, 0, elevel,
+							 &head, &tail))
+		{
+			/* Syntax error(s) detected in the file, so bail out */
+			error = true;
+			ConfFileWithError = PG_AUTOCONF_FILENAME;
+			goto bail_out;
+		}
+	}
+	else
+	{
+		/*
+		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
+		 * read.  In this case, we don't want to accept any settings but
+		 * data_directory from postgresql.conf, because they might be
+		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
+		 * will be read later. OTOH, since data_directory isn't allowed in the
+		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
+		 */
+		ConfigVariable *newlist = NULL;
+
+		/*
+		 * Prune all items except the last "data_directory" from the list.
+		 */
+		for (item = head; item; item = item->next)
+		{
+			if (!item->ignore &&
+				strcmp(item->name, "data_directory") == 0)
+				newlist = item;
+		}
+
+		if (newlist)
+			newlist->next = NULL;
+		head = tail = newlist;
+
+		/*
+		 * Quick exit if data_directory is not present in file.
+		 *
+		 * We need not do any further processing, in particular we don't set
+		 * PgReloadTime; that will be set soon by subsequent full loading of
+		 * the config file.
+		 */
+		if (head == NULL)
+			goto bail_out;
+	}
+
+	/*
+	 * Mark all extant GUC variables as not present in the config file. We
+	 * need this so that we can tell below which ones have been removed from
+	 * the file since we last processed it.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+
+		gconf->status &= ~GUC_IS_IN_FILE;
+	}
+
+	/*
+	 * Check if all the supplied option names are valid, as an additional
+	 * quasi-syntactic check on the validity of the config file.  It is
+	 * important that the postmaster and all backends agree on the results of
+	 * this phase, else we will have strange inconsistencies about which
+	 * processes accept a config file update and which don't.  Hence, unknown
+	 * custom variable names have to be accepted without complaint.  For the
+	 * same reason, we don't attempt to validate the options' values here.
+	 *
+	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
+	 * variable mentioned in the file; and we detect duplicate entries in the
+	 * file and mark the earlier occurrences as ignorable.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		struct config_generic *record;
+
+		/* Ignore anything already marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/*
+		 * Try to find the variable; but do not create a custom placeholder if
+		 * it's not there already.
+		 */
+		record = find_option(item->name, false, true, elevel);
+
+		if (record)
+		{
+			/* If it's already marked, then this is a duplicate entry */
+			if (record->status & GUC_IS_IN_FILE)
+			{
+				/*
+				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
+				 * avoid the O(N^2) behavior here with some additional state,
+				 * but it seems unlikely to be worth the trouble.
+				 */
+				ConfigVariable *pitem;
+
+				for (pitem = head; pitem != item; pitem = pitem->next)
+				{
+					if (!pitem->ignore &&
+						strcmp(pitem->name, item->name) == 0)
+						pitem->ignore = true;
+				}
+			}
+			/* Now mark it as present in file */
+			record->status |= GUC_IS_IN_FILE;
+		}
+		else if (!valid_custom_variable_name(item->name))
+		{
+			/* Invalid non-custom variable, so complain */
+			ereport(elevel,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
+							item->name,
+							item->filename, item->sourceline)));
+			item->errmsg = pstrdup("unrecognized configuration parameter");
+			error = true;
+			ConfFileWithError = item->filename;
+		}
+	}
+
+	/*
+	 * If we've detected any errors so far, we don't want to risk applying any
+	 * changes.
+	 */
+	if (error)
+		goto bail_out;
+
+	/* Otherwise, set flag that we're beginning to apply changes */
+	applying = true;
+
+	/*
+	 * Check for variables having been removed from the config file, and
+	 * revert their reset values (and perhaps also effective values) to the
+	 * boot-time defaults.  If such a variable can't be changed after startup,
+	 * report that and continue.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+		GucStack   *stack;
+
+		if (gconf->reset_source != PGC_S_FILE ||
+			(gconf->status & GUC_IS_IN_FILE))
+			continue;
+		if (gconf->context < PGC_SIGHUP)
+		{
+			/* The removal can't be effective without a restart */
+			gconf->status |= GUC_PENDING_RESTART;
+			ereport(elevel,
+					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
+							gconf->name)));
+			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
+											  gconf->name),
+									 NULL, 0,
+									 &head, &tail);
+			error = true;
+			continue;
+		}
+
+		/* No more to do if we're just doing show_all_file_settings() */
+		if (!applySettings)
+			continue;
+
+		/*
+		 * Reset any "file" sources to "default", else set_config_option will
+		 * not override those settings.
+		 */
+		if (gconf->reset_source == PGC_S_FILE)
+			gconf->reset_source = PGC_S_DEFAULT;
+		if (gconf->source == PGC_S_FILE)
+			gconf->source = PGC_S_DEFAULT;
+		for (stack = gconf->stack; stack; stack = stack->prev)
+		{
+			if (stack->source == PGC_S_FILE)
+				stack->source = PGC_S_DEFAULT;
+		}
+
+		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
+		if (set_config_option(gconf->name, NULL,
+							  context, PGC_S_DEFAULT,
+							  GUC_ACTION_SET, true, 0, false) > 0)
+		{
+			/* Log the change if appropriate */
+			if (context == PGC_SIGHUP)
+				ereport(elevel,
+						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
+								gconf->name)));
+		}
+	}
+
+	/*
+	 * Restore any variables determined by environment variables or
+	 * dynamically-computed defaults.  This is a no-op except in the case
+	 * where one of these had been in the config file and is now removed.
+	 *
+	 * In particular, we *must not* do this during the postmaster's initial
+	 * loading of the file, since the timezone functions in particular should
+	 * be run only after initialization is complete.
+	 *
+	 * XXX this is an unmaintainable crock, because we have to know how to set
+	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
+	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
+	 */
+	if (context == PGC_SIGHUP && applySettings)
+	{
+		InitializeGUCOptionsFromEnvironment();
+		pg_timezone_abbrev_initialize();
+		/* this selects SQL_ASCII in processes not connected to a database */
+		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
+						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
+	}
 
+	/*
+	 * Now apply the values from the config file.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		char	   *pre_value = NULL;
+		int			scres;
+
+		/* Ignore anything marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/* In SIGHUP cases in the postmaster, we want to report changes */
+		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
+		{
+			const char *preval = GetConfigOption(item->name, true, false);
+
+			/* If option doesn't exist yet or is NULL, treat as empty string */
+			if (!preval)
+				preval = "";
+			/* must dup, else might have dangling pointer below */
+			pre_value = pstrdup(preval);
+		}
+
+		scres = set_config_option(item->name, item->value,
+								  context, PGC_S_FILE,
+								  GUC_ACTION_SET, applySettings, 0, false);
+		if (scres > 0)
+		{
+			/* variable was updated, so log the change if appropriate */
+			if (pre_value)
+			{
+				const char *post_value = GetConfigOption(item->name, true, false);
+
+				if (!post_value)
+					post_value = "";
+				if (strcmp(pre_value, post_value) != 0)
+					ereport(elevel,
+							(errmsg("parameter \"%s\" changed to \"%s\"",
+									item->name, item->value)));
+			}
+			item->applied = true;
+		}
+		else if (scres == 0)
+		{
+			error = true;
+			item->errmsg = pstrdup("setting could not be applied");
+			ConfFileWithError = item->filename;
+		}
+		else
+		{
+			/* no error, but variable's active value was not changed */
+			item->applied = true;
+		}
+
+		/*
+		 * We should update source location unless there was an error, since
+		 * even if the active value didn't change, the reset value might have.
+		 * (In the postmaster, there won't be a difference, but it does matter
+		 * in backends.)
+		 */
+		if (scres != 0 && applySettings)
+			set_config_sourcefile(item->name, item->filename,
+								  item->sourceline);
+
+		if (pre_value)
+			pfree(pre_value);
+	}
+
+	/* Remember when we last successfully loaded the config file. */
+	if (applySettings)
+		PgReloadTime = GetCurrentTimestamp();
+
+bail_out:
+	if (error && applySettings)
+	{
+		/* During postmaster startup, any error is fatal */
+		if (context == PGC_POSTMASTER)
+			ereport(ERROR,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors",
+							ConfFileWithError)));
+		else if (applying)
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
+							ConfFileWithError)));
+		else
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
+							ConfFileWithError)));
+	}
+
+	/* Successful or otherwise, return the collected data list */
+	return head;
+}
 
 /*
  * Some infrastructure for checking malloc/strdup/realloc calls
@@ -5741,7 +6089,7 @@ guc_var_compare(const void *a, const void *b)
 /*
  * the bare comparison function for GUC names
  */
-static int
+int
 guc_name_compare(const char *namea, const char *nameb)
 {
 	/*
@@ -12988,5 +13336,3 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
 
 	return true;
 }
-
-#include "guc-file.c"
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index e734493a48..aae071cd82 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -442,6 +442,15 @@ extern void GUC_check_errcode(int sqlerrcode);
 	pre_format_elog_string(errno, TEXTDOMAIN), \
 	GUC_check_errhint_string = format_elog_string
 
+/* functions shared between guc.c and guc-file.l */
+extern int	guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+												 bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+									 const char *config_file,
+									 int lineno,
+									 ConfigVariable **head_p,
+									 ConfigVariable **tail_p);
 
 /*
  * The following functions are not in guc.c, but are declared here to avoid
-- 
2.36.1

#233John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#232)
9 attachment(s)
Re: build remaining Flex files standalone

Here are the rest. Most of it was pretty straightforward, with the
main exception of jsonpath_scan.c, which is not quite finished. That
one passes tests but still has one compiler warning. I'm unsure how
much of what is there already is really necessary or was cargo-culted
from elsewhere without explanation. For starters, I'm not sure why the
grammar has a forward declaration of "union YYSTYPE". It's noteworthy
that it used to compile standalone, but with a bit more stuff, and
that was reverted in 550b9d26f80fa30. I can hack on it some more later
but I ran out of steam today.

Other questions thus far:

- "BISONFLAGS += -d" is now in every make file with a .y file -- can
we just force that everywhere?

- Include order seems to matter for the grammar's .h file. I didn't
test if that was the case every time, and after a few miscompiles just
always made it the last inclusion, but I'm wondering if we should keep
those inclusions outside %top{} and put it at the start of the next
%{} ?

- contrib/cubeparse.y now has a global variable -- not terrific, but I
wanted to get something working first.

- I'm actually okay with guc-file.c now, but I'll still welcome
comments on that.

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v201-0008-Build-jsonpath_scan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0008-Build-jsonpath_scan.c-standalone.patchDownload
From 4d16b395978e8bc830e91d363cf9cadda0c00365 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 12:35:55 +0700
Subject: [PATCH v201 8/9] Build jsonpath_scan.c standalone

XXX: warnings about missing jsonpath_yylex
---
 src/backend/utils/adt/.gitignore      |  1 +
 src/backend/utils/adt/Makefile        | 11 +++++++++--
 src/backend/utils/adt/jsonpath_gram.y | 23 -----------------------
 src/backend/utils/adt/jsonpath_scan.l | 25 +++++++++++++++----------
 src/include/utils/jsonpath.h          | 13 +++++++++++++
 5 files changed, 38 insertions(+), 35 deletions(-)

diff --git a/src/backend/utils/adt/.gitignore b/src/backend/utils/adt/.gitignore
index 48cf941a52..7fab054407 100644
--- a/src/backend/utils/adt/.gitignore
+++ b/src/backend/utils/adt/.gitignore
@@ -1,2 +1,3 @@
+/jsonpath_gram.h
 /jsonpath_gram.c
 /jsonpath_scan.c
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
index 7c722ea2ce..d03f897478 100644
--- a/src/backend/utils/adt/Makefile
+++ b/src/backend/utils/adt/Makefile
@@ -57,6 +57,7 @@ OBJS = \
 	jsonpath.o \
 	jsonpath_exec.o \
 	jsonpath_gram.o \
+	jsonpath_scan.o \
 	like.o \
 	like_support.o \
 	lockfuncs.o \
@@ -119,11 +120,17 @@ OBJS = \
 	xid8funcs.o \
 	xml.o
 
+# See notes in src/backend/parser/Makefile about the following two rules
+jsonpath_gram.h: jsonpath_gram.c
+	touch $@
+
+jsonpath_gram.c: BISONFLAGS += -d
+
 jsonpath_scan.c: FLEXFLAGS = -CF -p -p
 jsonpath_scan.c: FLEX_NO_BACKUP=yes
 
-# jsonpath_scan is compiled as part of jsonpath_gram
-jsonpath_gram.o: jsonpath_scan.c
+# Force these dependencies to be known even without dependency info built:
+jsonpath_gram.o jsonpath_gram.o jsonpath_parser.o: jsonpath_gram.h
 
 # jsonpath_gram.c and jsonpath_scan.c are in the distribution tarball,
 # so they are not cleaned here.
diff --git a/src/backend/utils/adt/jsonpath_gram.y b/src/backend/utils/adt/jsonpath_gram.y
index f903dba3e3..a7557d325e 100644
--- a/src/backend/utils/adt/jsonpath_gram.y
+++ b/src/backend/utils/adt/jsonpath_gram.y
@@ -24,21 +24,8 @@
 #include "utils/builtins.h"
 #include "utils/jsonpath.h"
 
-/* struct JsonPathString is shared between scan and gram */
-typedef struct JsonPathString
-{
-	char	   *val;
-	int			len;
-	int			total;
-}			JsonPathString;
-
 union YYSTYPE;
 
-/* flex 2.5.4 doesn't bother with a decl for this */
-int	jsonpath_yylex(union YYSTYPE *yylval_param);
-int	jsonpath_yyparse(JsonPathParseResult **result);
-void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
-
 static JsonPathParseItem *makeItemType(JsonPathItemType type);
 static JsonPathParseItem *makeItemString(JsonPathString *s);
 static JsonPathParseItem *makeItemVariable(JsonPathString *s);
@@ -593,13 +580,3 @@ jspConvertRegexFlags(uint32 xflags)
 
 	return cflags;
 }
-
-/*
- * jsonpath_scan.l is compiled as part of jsonpath_gram.y.  Currently, this is
- * unavoidable because jsonpath_gram does not create a .h file to export its
- * token symbols.  If these files ever grow large enough to be worth compiling
- * separately, that could be fixed; but for now it seems like useless
- * complication.
- */
-
-#include "jsonpath_scan.c"
diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l
index 4351f6ec98..edd9d1c706 100644
--- a/src/backend/utils/adt/jsonpath_scan.l
+++ b/src/backend/utils/adt/jsonpath_scan.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * jsonpath_scan.l
@@ -17,9 +17,14 @@
 
 #include "postgres.h"
 
+#include "utils/jsonpath.h"
 #include "mb/pg_wchar.h"
 #include "nodes/pg_list.h"
 
+#include "jsonpath_gram.h"
+}
+
+%{
 static JsonPathString scanstring;
 
 /* Handles to the buffer that the lexer uses internally */
@@ -142,9 +147,9 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xnq,xq,xvq>{hex_char}		{ parseHexChar(yytext); }
 
-<xnq,xq,xvq>{unicode}*{unicodefail}	{ yyerror(NULL, "invalid unicode sequence"); }
+<xnq,xq,xvq>{unicode}*{unicodefail}	{ jsonpath_yyerror(NULL, "invalid unicode sequence"); }
 
-<xnq,xq,xvq>{hex_fail}		{ yyerror(NULL, "invalid hex character sequence"); }
+<xnq,xq,xvq>{hex_fail}		{ jsonpath_yyerror(NULL, "invalid hex character sequence"); }
 
 <xnq,xq,xvq>{unicode}+\\	{
 								/* throw back the \\, and treat as unicode */
@@ -154,9 +159,9 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xnq,xq,xvq>\\.				{ addchar(false, yytext[1]); }
 
-<xnq,xq,xvq>\\				{ yyerror(NULL, "unexpected end after backslash"); }
+<xnq,xq,xvq>\\				{ jsonpath_yyerror(NULL, "unexpected end after backslash"); }
 
-<xq,xvq><<EOF>>				{ yyerror(NULL, "unexpected end of quoted string"); }
+<xq,xvq><<EOF>>				{ jsonpath_yyerror(NULL, "unexpected end of quoted string"); }
 
 <xq>\"							{
 									yylval->str = scanstring;
@@ -178,7 +183,7 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xc>\*							{ }
 
-<xc><<EOF>>						{ yyerror(NULL, "unexpected end of comment"); }
+<xc><<EOF>>						{ jsonpath_yyerror(NULL, "unexpected end of comment"); }
 
 \&\&							{ return AND_P; }
 
@@ -244,10 +249,10 @@ hex_fail	\\x{hex_dig}{0,1}
 									return INT_P;
 								}
 
-{realfail}						{ yyerror(NULL, "invalid numeric literal"); }
-{integer_junk}					{ yyerror(NULL, "trailing junk after numeric literal"); }
-{decimal_junk}					{ yyerror(NULL, "trailing junk after numeric literal"); }
-{real_junk}						{ yyerror(NULL, "trailing junk after numeric literal"); }
+{realfail}						{ jsonpath_yyerror(NULL, "invalid numeric literal"); }
+{integer_junk}					{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
+{decimal_junk}					{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
+{real_junk}						{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
 
 \"								{
 									addchar(true, '\0');
diff --git a/src/include/utils/jsonpath.h b/src/include/utils/jsonpath.h
index 8e79b8dc9f..b9b56209b2 100644
--- a/src/include/utils/jsonpath.h
+++ b/src/include/utils/jsonpath.h
@@ -21,6 +21,14 @@
 #include "utils/jsonb.h"
 #include "utils/jsonfuncs.h"
 
+/* struct JsonPathString is shared between scan and gram */
+typedef struct JsonPathString
+{
+	char	   *val;
+	int			len;
+	int			total;
+}			JsonPathString;
+
 typedef struct
 {
 	int32		vl_len_;		/* varlena header (do not touch directly!) */
@@ -250,6 +258,11 @@ typedef struct JsonPathParseResult
 
 extern JsonPathParseResult *parsejsonpath(const char *str, int len);
 
+/* flex 2.5.4 doesn't bother with a decl for this */
+//int	jsonpath_yylex(union YYSTYPE *yylval_param);
+//int	jsonpath_yyparse(JsonPathParseResult **result);
+void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
+
 extern int	jspConvertRegexFlags(uint32 xflags);
 
 /*
-- 
2.36.1

v201-0009-Build-exprscan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0009-Build-exprscan.c-standalone.patchDownload
From cae4dccc5aaee93e0ed258448f60d4178163ec1c Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 13:35:14 +0700
Subject: [PATCH v201 9/9] Build exprscan.c standalone

---
 src/bin/pgbench/.gitignore  |  1 +
 src/bin/pgbench/Makefile    | 13 ++++++++++---
 src/bin/pgbench/exprparse.y | 15 ---------------
 src/bin/pgbench/exprscan.l  |  9 ++++++++-
 4 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/src/bin/pgbench/.gitignore b/src/bin/pgbench/.gitignore
index 983a3cd7a6..07492a993c 100644
--- a/src/bin/pgbench/.gitignore
+++ b/src/bin/pgbench/.gitignore
@@ -1,3 +1,4 @@
+/exprparse.h
 /exprparse.c
 /exprscan.c
 /pgbench
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
index f402fe7b91..6647c9fe97 100644
--- a/src/bin/pgbench/Makefile
+++ b/src/bin/pgbench/Makefile
@@ -10,6 +10,7 @@ include $(top_builddir)/src/Makefile.global
 OBJS = \
 	$(WIN32RES) \
 	exprparse.o \
+	exprscan.o \
 	pgbench.o
 
 override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
@@ -26,8 +27,14 @@ all: pgbench
 pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
 	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-# exprscan is compiled as part of exprparse
-exprparse.o: exprscan.c
+# See notes in src/backend/parser/Makefile about the following two rules
+exprparse.h: exprparse.c
+	touch $@
+
+exprparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+exprparse.o exprscan.o: exprparse.h
 
 distprep: exprparse.c exprscan.c
 
@@ -45,7 +52,7 @@ clean distclean:
 	rm -rf tmp_check
 
 maintainer-clean: distclean
-	rm -f exprparse.c exprscan.c
+	rm -f exprparse.h exprparse.c exprscan.c
 
 check:
 	$(prove_check)
diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y
index b5592d4b97..ade2ecdaab 100644
--- a/src/bin/pgbench/exprparse.y
+++ b/src/bin/pgbench/exprparse.y
@@ -526,18 +526,3 @@ make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else
 					 find_func(yyscanner, "!case_end"),
 					 make_elist(else_part, when_then_list));
 }
-
-/*
- * exprscan.l is compiled as part of exprparse.y.  Currently, this is
- * unavoidable because exprparse does not create a .h file to export
- * its token symbols.  If these files ever grow large enough to be
- * worth compiling separately, that could be fixed; but for now it
- * seems like useless complication.
- */
-
-/* First, get rid of "#define yyscan_t" from pgbench.h */
-#undef yyscan_t
-/* ... and the yylval macro, which flex will have its own definition for */
-#undef yylval
-
-#include "exprscan.c"
diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l
index 4f63818606..6e9d949dcf 100644
--- a/src/bin/pgbench/exprscan.l
+++ b/src/bin/pgbench/exprscan.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * exprscan.l
@@ -23,8 +23,15 @@
  *-------------------------------------------------------------------------
  */
 
+#include "postgres_fe.h"
+
 #include "fe_utils/psqlscan_int.h"
+#include "pgbench.h"
 
+#include "exprparse.h"
+}
+
+%{
 /* context information for reporting errors in expressions */
 static const char *expr_source = NULL;
 static int	expr_lineno = 0;
-- 
2.36.1

v201-0003-Build-repl_scanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0003-Build-repl_scanner.c-standalone.patchDownload
From da2b610b8608e6759f5ed9cc32b487ea8e750ce4 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 17:09:45 +0700
Subject: [PATCH v201 3/9] Build repl_scanner.c standalone

---
 src/backend/replication/Makefile       | 11 +++++++++--
 src/backend/replication/repl_gram.y    |  2 --
 src/backend/replication/repl_scanner.l | 27 +++++++++++++++-----------
 3 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile
index 2bffac58c0..bc8170418f 100644
--- a/src/backend/replication/Makefile
+++ b/src/backend/replication/Makefile
@@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	repl_gram.o \
+	repl_scanner.o \
 	slot.o \
 	slotfuncs.o \
 	syncrep.o \
@@ -28,8 +29,14 @@ SUBDIRS = logical
 
 include $(top_srcdir)/src/backend/common.mk
 
-# repl_scanner is compiled as part of repl_gram
-repl_gram.o: repl_scanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+repl_gram.h: repl_gram.c
+	touch $@
+
+repl_gram.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+repl_gram.o repl_scanner.o: repl_gram.h
 
 # syncrep_scanner is compiled as part of syncrep_gram
 syncrep_gram.o: syncrep_scanner.c
diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y
index 4cf087e602..b343f108d3 100644
--- a/src/backend/replication/repl_gram.y
+++ b/src/backend/replication/repl_gram.y
@@ -416,5 +416,3 @@ ident_or_keyword:
 		;
 
 %%
-
-#include "repl_scanner.c"
diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l
index 586f0d3a5c..95a933c9a8 100644
--- a/src/backend/replication/repl_scanner.l
+++ b/src/backend/replication/repl_scanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * repl_scanner.l
@@ -17,7 +17,12 @@
 
 #include "utils/builtins.h"
 #include "parser/scansup.h"
+#include "replication/walsender_private.h"
+
+#include "repl_gram.h"
+}
 
+%{
 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
 #undef fprintf
 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
@@ -130,7 +135,7 @@ WAIT				{ return K_WAIT; }
 {space}+		{ /* do nothing */ }
 
 {digit}+		{
-					yylval.uintval = strtoul(yytext, NULL, 10);
+					replication_yylval.uintval = strtoul(yytext, NULL, 10);
 					return UCONST;
 				}
 
@@ -138,8 +143,8 @@ WAIT				{ return K_WAIT; }
 					uint32	hi,
 							lo;
 					if (sscanf(yytext, "%X/%X", &hi, &lo) != 2)
-						yyerror("invalid streaming start location");
-					yylval.recptr = ((uint64) hi) << 32 | lo;
+						replication_yyerror("invalid streaming start location");
+					replication_yylval.recptr = ((uint64) hi) << 32 | lo;
 					return RECPTR;
 				}
 
@@ -151,7 +156,7 @@ WAIT				{ return K_WAIT; }
 <xq>{quotestop}	{
 					yyless(1);
 					BEGIN(INITIAL);
-					yylval.str = litbufdup();
+					replication_yylval.str = litbufdup();
 					return SCONST;
 				}
 
@@ -173,9 +178,9 @@ WAIT				{ return K_WAIT; }
 
 					yyless(1);
 					BEGIN(INITIAL);
-					yylval.str = litbufdup();
-					len = strlen(yylval.str);
-					truncate_identifier(yylval.str, len, true);
+					replication_yylval.str = litbufdup();
+					len = strlen(replication_yylval.str);
+					truncate_identifier(replication_yylval.str, len, true);
 					return IDENT;
 				}
 
@@ -186,7 +191,7 @@ WAIT				{ return K_WAIT; }
 {identifier}	{
 					int			len = strlen(yytext);
 
-					yylval.str = downcase_truncate_identifier(yytext, len, true);
+					replication_yylval.str = downcase_truncate_identifier(yytext, len, true);
 					return IDENT;
 				}
 
@@ -195,7 +200,7 @@ WAIT				{ return K_WAIT; }
 					return yytext[0];
 				}
 
-<xq,xd><<EOF>>	{ yyerror("unterminated quoted string"); }
+<xq,xd><<EOF>>	{ replication_yyerror("unterminated quoted string"); }
 
 
 <<EOF>>			{
@@ -231,7 +236,7 @@ addlitchar(unsigned char ychar)
 }
 
 void
-yyerror(const char *message)
+replication_yyerror(const char *message)
 {
 	ereport(ERROR,
 			(errcode(ERRCODE_SYNTAX_ERROR),
-- 
2.36.1

v201-0001-Build-guc-file.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0001-Build-guc-file.c-standalone.patchDownload
From d723ba14acf56fd432e9e263db937fcc13fc0355 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Thu, 11 Aug 2022 19:38:37 +0700
Subject: [PATCH v201 1/9] Build guc-file.c standalone

The proposed Meson build system will need a way to ignore certain
generated files in order to coexist with the autoconf build system,
and #include'd C files generated by Flex make this more difficult.
Build guc-file.c separately from guc.c, as was done in 72b1e3a21.

TODO: other Flex-generated files

Discussion: https://www.postgresql.org/message-id/20220810171935.7k5zgnjwqzalzmtm%40awork3.anarazel.de
---
 src/backend/utils/misc/Makefile   |   5 +-
 src/backend/utils/misc/guc-file.l | 367 +-----------------------------
 src/backend/utils/misc/guc.c      | 362 ++++++++++++++++++++++++++++-
 src/include/utils/guc.h           |   9 +
 4 files changed, 370 insertions(+), 373 deletions(-)

diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 1d5327cf64..cf7ce9bc83 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	guc.o \
+	guc-file.o \
 	help_config.o \
 	pg_config.o \
 	pg_controldata.o \
@@ -37,10 +38,6 @@ endif
 
 include $(top_srcdir)/src/backend/common.mk
 
-# guc-file is compiled as part of guc
-guc.o: guc-file.c
-
 # Note: guc-file.c is not deleted by 'make clean',
 # since we want to ship it in distribution tarballs.
 clean:
-	@rm -f lex.yy.c
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index ce5633844c..08adb454de 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -7,7 +7,7 @@
  * src/backend/utils/misc/guc-file.l
  */
 
-%{
+%top{
 
 #include "postgres.h"
 
@@ -17,9 +17,12 @@
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 #include "storage/fd.h"
+#include <sys/stat.h>
 #include "utils/guc.h"
+#include "utils/memutils.h"
+}
 
-
+%{
 /*
  * flex emits a yy_fatal_error() function that it calls in response to
  * critical errors like malloc failure, file I/O errors, and detection of
@@ -48,12 +51,6 @@ static sigjmp_buf *GUC_flex_fatal_jmp;
 
 static void FreeConfigVariable(ConfigVariable *item);
 
-static void record_config_file_error(const char *errmsg,
-									 const char *config_file,
-									 int lineno,
-									 ConfigVariable **head_p,
-									 ConfigVariable **tail_p);
-
 static int	GUC_flex_fatal(const char *msg);
 
 /* LCOV_EXCL_START */
@@ -159,358 +156,6 @@ ProcessConfigFile(GucContext context)
 	MemoryContextDelete(config_cxt);
 }
 
-/*
- * This function handles both actual config file (re)loads and execution of
- * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
- * case we don't apply any of the settings, but we make all the usual validity
- * checks, and we return the ConfigVariable list so that it can be printed out
- * by show_all_file_settings().
- */
-static ConfigVariable *
-ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
-{
-	bool		error = false;
-	bool		applying = false;
-	const char *ConfFileWithError;
-	ConfigVariable *item,
-			   *head,
-			   *tail;
-	int			i;
-
-	/* Parse the main config file into a list of option names and values */
-	ConfFileWithError = ConfigFileName;
-	head = tail = NULL;
-
-	if (!ParseConfigFile(ConfigFileName, true,
-						 NULL, 0, 0, elevel,
-						 &head, &tail))
-	{
-		/* Syntax error(s) detected in the file, so bail out */
-		error = true;
-		goto bail_out;
-	}
-
-	/*
-	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
-	 * replace any parameters set by ALTER SYSTEM command.  Because this file
-	 * is in the data directory, we can't read it until the DataDir has been
-	 * set.
-	 */
-	if (DataDir)
-	{
-		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
-							 NULL, 0, 0, elevel,
-							 &head, &tail))
-		{
-			/* Syntax error(s) detected in the file, so bail out */
-			error = true;
-			ConfFileWithError = PG_AUTOCONF_FILENAME;
-			goto bail_out;
-		}
-	}
-	else
-	{
-		/*
-		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
-		 * read.  In this case, we don't want to accept any settings but
-		 * data_directory from postgresql.conf, because they might be
-		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
-		 * will be read later. OTOH, since data_directory isn't allowed in the
-		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
-		 */
-		ConfigVariable *newlist = NULL;
-
-		/*
-		 * Prune all items except the last "data_directory" from the list.
-		 */
-		for (item = head; item; item = item->next)
-		{
-			if (!item->ignore &&
-				strcmp(item->name, "data_directory") == 0)
-				newlist = item;
-		}
-
-		if (newlist)
-			newlist->next = NULL;
-		head = tail = newlist;
-
-		/*
-		 * Quick exit if data_directory is not present in file.
-		 *
-		 * We need not do any further processing, in particular we don't set
-		 * PgReloadTime; that will be set soon by subsequent full loading of
-		 * the config file.
-		 */
-		if (head == NULL)
-			goto bail_out;
-	}
-
-	/*
-	 * Mark all extant GUC variables as not present in the config file. We
-	 * need this so that we can tell below which ones have been removed from
-	 * the file since we last processed it.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-
-		gconf->status &= ~GUC_IS_IN_FILE;
-	}
-
-	/*
-	 * Check if all the supplied option names are valid, as an additional
-	 * quasi-syntactic check on the validity of the config file.  It is
-	 * important that the postmaster and all backends agree on the results of
-	 * this phase, else we will have strange inconsistencies about which
-	 * processes accept a config file update and which don't.  Hence, unknown
-	 * custom variable names have to be accepted without complaint.  For the
-	 * same reason, we don't attempt to validate the options' values here.
-	 *
-	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
-	 * variable mentioned in the file; and we detect duplicate entries in the
-	 * file and mark the earlier occurrences as ignorable.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		struct config_generic *record;
-
-		/* Ignore anything already marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/*
-		 * Try to find the variable; but do not create a custom placeholder if
-		 * it's not there already.
-		 */
-		record = find_option(item->name, false, true, elevel);
-
-		if (record)
-		{
-			/* If it's already marked, then this is a duplicate entry */
-			if (record->status & GUC_IS_IN_FILE)
-			{
-				/*
-				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
-				 * avoid the O(N^2) behavior here with some additional state,
-				 * but it seems unlikely to be worth the trouble.
-				 */
-				ConfigVariable *pitem;
-
-				for (pitem = head; pitem != item; pitem = pitem->next)
-				{
-					if (!pitem->ignore &&
-						strcmp(pitem->name, item->name) == 0)
-						pitem->ignore = true;
-				}
-			}
-			/* Now mark it as present in file */
-			record->status |= GUC_IS_IN_FILE;
-		}
-		else if (!valid_custom_variable_name(item->name))
-		{
-			/* Invalid non-custom variable, so complain */
-			ereport(elevel,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
-							item->name,
-							item->filename, item->sourceline)));
-			item->errmsg = pstrdup("unrecognized configuration parameter");
-			error = true;
-			ConfFileWithError = item->filename;
-		}
-	}
-
-	/*
-	 * If we've detected any errors so far, we don't want to risk applying any
-	 * changes.
-	 */
-	if (error)
-		goto bail_out;
-
-	/* Otherwise, set flag that we're beginning to apply changes */
-	applying = true;
-
-	/*
-	 * Check for variables having been removed from the config file, and
-	 * revert their reset values (and perhaps also effective values) to the
-	 * boot-time defaults.  If such a variable can't be changed after startup,
-	 * report that and continue.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-		GucStack   *stack;
-
-		if (gconf->reset_source != PGC_S_FILE ||
-			(gconf->status & GUC_IS_IN_FILE))
-			continue;
-		if (gconf->context < PGC_SIGHUP)
-		{
-			/* The removal can't be effective without a restart */
-			gconf->status |= GUC_PENDING_RESTART;
-			ereport(elevel,
-					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
-					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
-							gconf->name)));
-			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
-											  gconf->name),
-									 NULL, 0,
-									 &head, &tail);
-			error = true;
-			continue;
-		}
-
-		/* No more to do if we're just doing show_all_file_settings() */
-		if (!applySettings)
-			continue;
-
-		/*
-		 * Reset any "file" sources to "default", else set_config_option will
-		 * not override those settings.
-		 */
-		if (gconf->reset_source == PGC_S_FILE)
-			gconf->reset_source = PGC_S_DEFAULT;
-		if (gconf->source == PGC_S_FILE)
-			gconf->source = PGC_S_DEFAULT;
-		for (stack = gconf->stack; stack; stack = stack->prev)
-		{
-			if (stack->source == PGC_S_FILE)
-				stack->source = PGC_S_DEFAULT;
-		}
-
-		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
-		if (set_config_option(gconf->name, NULL,
-							  context, PGC_S_DEFAULT,
-							  GUC_ACTION_SET, true, 0, false) > 0)
-		{
-			/* Log the change if appropriate */
-			if (context == PGC_SIGHUP)
-				ereport(elevel,
-						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
-								gconf->name)));
-		}
-	}
-
-	/*
-	 * Restore any variables determined by environment variables or
-	 * dynamically-computed defaults.  This is a no-op except in the case
-	 * where one of these had been in the config file and is now removed.
-	 *
-	 * In particular, we *must not* do this during the postmaster's initial
-	 * loading of the file, since the timezone functions in particular should
-	 * be run only after initialization is complete.
-	 *
-	 * XXX this is an unmaintainable crock, because we have to know how to set
-	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
-	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
-	 */
-	if (context == PGC_SIGHUP && applySettings)
-	{
-		InitializeGUCOptionsFromEnvironment();
-		pg_timezone_abbrev_initialize();
-		/* this selects SQL_ASCII in processes not connected to a database */
-		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
-						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
-	}
-
-	/*
-	 * Now apply the values from the config file.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		char	   *pre_value = NULL;
-		int			scres;
-
-		/* Ignore anything marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/* In SIGHUP cases in the postmaster, we want to report changes */
-		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
-		{
-			const char *preval = GetConfigOption(item->name, true, false);
-
-			/* If option doesn't exist yet or is NULL, treat as empty string */
-			if (!preval)
-				preval = "";
-			/* must dup, else might have dangling pointer below */
-			pre_value = pstrdup(preval);
-		}
-
-		scres = set_config_option(item->name, item->value,
-								  context, PGC_S_FILE,
-								  GUC_ACTION_SET, applySettings, 0, false);
-		if (scres > 0)
-		{
-			/* variable was updated, so log the change if appropriate */
-			if (pre_value)
-			{
-				const char *post_value = GetConfigOption(item->name, true, false);
-
-				if (!post_value)
-					post_value = "";
-				if (strcmp(pre_value, post_value) != 0)
-					ereport(elevel,
-							(errmsg("parameter \"%s\" changed to \"%s\"",
-									item->name, item->value)));
-			}
-			item->applied = true;
-		}
-		else if (scres == 0)
-		{
-			error = true;
-			item->errmsg = pstrdup("setting could not be applied");
-			ConfFileWithError = item->filename;
-		}
-		else
-		{
-			/* no error, but variable's active value was not changed */
-			item->applied = true;
-		}
-
-		/*
-		 * We should update source location unless there was an error, since
-		 * even if the active value didn't change, the reset value might have.
-		 * (In the postmaster, there won't be a difference, but it does matter
-		 * in backends.)
-		 */
-		if (scres != 0 && applySettings)
-			set_config_sourcefile(item->name, item->filename,
-								  item->sourceline);
-
-		if (pre_value)
-			pfree(pre_value);
-	}
-
-	/* Remember when we last successfully loaded the config file. */
-	if (applySettings)
-		PgReloadTime = GetCurrentTimestamp();
-
-bail_out:
-	if (error && applySettings)
-	{
-		/* During postmaster startup, any error is fatal */
-		if (context == PGC_POSTMASTER)
-			ereport(ERROR,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors",
-							ConfFileWithError)));
-		else if (applying)
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
-							ConfFileWithError)));
-		else
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
-							ConfFileWithError)));
-	}
-
-	/* Successful or otherwise, return the collected data list */
-	return head;
-}
-
 /*
  * Given a configuration file or directory location that may be a relative
  * path, return an absolute one.  We consider the location to be relative to
@@ -659,7 +304,7 @@ cleanup:
  * Capture an error message in the ConfigVariable list returned by
  * config file parsing.
  */
-static void
+void
 record_config_file_error(const char *errmsg,
 						 const char *config_file,
 						 int lineno,
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 5db5df6285..e4a00f1205 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -243,10 +243,6 @@ static void assign_recovery_target_lsn(const char *newval, void *extra);
 static bool check_primary_slot_name(char **newval, void **extra, GucSource source);
 static bool check_default_with_oids(bool *newval, void **extra, GucSource source);
 
-/* Private functions in guc-file.l that need to be called from guc.c */
-static ConfigVariable *ProcessConfigFileInternal(GucContext context,
-												 bool applySettings, int elevel);
-
 /*
  * Track whether there were any deferred checks for custom resource managers
  * specified in wal_consistency_checking.
@@ -5164,8 +5160,8 @@ static bool report_needed;		/* true if any GUC_REPORT reports are needed */
 static int	GUCNestLevel = 0;	/* 1 when in main transaction */
 
 
+static struct config_generic *find_option(const char *name, bool create_placeholders, bool skip_errors, int elevel);
 static int	guc_var_compare(const void *a, const void *b);
-static int	guc_name_compare(const char *namea, const char *nameb);
 static void InitializeGUCOptionsFromEnvironment(void);
 static void InitializeOneGUCOption(struct config_generic *gconf);
 static void push_old_value(struct config_generic *gconf, GucAction action);
@@ -5184,7 +5180,359 @@ static bool validate_option_array_item(const char *name, const char *value,
 static void write_auto_conf_file(int fd, const char *filename, ConfigVariable *head_p);
 static void replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
 									  const char *name, const char *value);
+static bool valid_custom_variable_name(const char *name);
+
+/*
+ * This function handles both actual config file (re)loads and execution of
+ * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
+ * case we don't apply any of the settings, but we make all the usual validity
+ * checks, and we return the ConfigVariable list so that it can be printed out
+ * by show_all_file_settings().
+ */
+ConfigVariable *
+ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
+{
+	bool		error = false;
+	bool		applying = false;
+	const char *ConfFileWithError;
+	ConfigVariable *item,
+			   *head,
+			   *tail;
+	int			i;
+
+	/* Parse the main config file into a list of option names and values */
+	ConfFileWithError = ConfigFileName;
+	head = tail = NULL;
+
+	if (!ParseConfigFile(ConfigFileName, true,
+						 NULL, 0, 0, elevel,
+						 &head, &tail))
+	{
+		/* Syntax error(s) detected in the file, so bail out */
+		error = true;
+		goto bail_out;
+	}
+
+	/*
+	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
+	 * replace any parameters set by ALTER SYSTEM command.  Because this file
+	 * is in the data directory, we can't read it until the DataDir has been
+	 * set.
+	 */
+	if (DataDir)
+	{
+		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
+							 NULL, 0, 0, elevel,
+							 &head, &tail))
+		{
+			/* Syntax error(s) detected in the file, so bail out */
+			error = true;
+			ConfFileWithError = PG_AUTOCONF_FILENAME;
+			goto bail_out;
+		}
+	}
+	else
+	{
+		/*
+		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
+		 * read.  In this case, we don't want to accept any settings but
+		 * data_directory from postgresql.conf, because they might be
+		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
+		 * will be read later. OTOH, since data_directory isn't allowed in the
+		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
+		 */
+		ConfigVariable *newlist = NULL;
+
+		/*
+		 * Prune all items except the last "data_directory" from the list.
+		 */
+		for (item = head; item; item = item->next)
+		{
+			if (!item->ignore &&
+				strcmp(item->name, "data_directory") == 0)
+				newlist = item;
+		}
+
+		if (newlist)
+			newlist->next = NULL;
+		head = tail = newlist;
+
+		/*
+		 * Quick exit if data_directory is not present in file.
+		 *
+		 * We need not do any further processing, in particular we don't set
+		 * PgReloadTime; that will be set soon by subsequent full loading of
+		 * the config file.
+		 */
+		if (head == NULL)
+			goto bail_out;
+	}
+
+	/*
+	 * Mark all extant GUC variables as not present in the config file. We
+	 * need this so that we can tell below which ones have been removed from
+	 * the file since we last processed it.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+
+		gconf->status &= ~GUC_IS_IN_FILE;
+	}
+
+	/*
+	 * Check if all the supplied option names are valid, as an additional
+	 * quasi-syntactic check on the validity of the config file.  It is
+	 * important that the postmaster and all backends agree on the results of
+	 * this phase, else we will have strange inconsistencies about which
+	 * processes accept a config file update and which don't.  Hence, unknown
+	 * custom variable names have to be accepted without complaint.  For the
+	 * same reason, we don't attempt to validate the options' values here.
+	 *
+	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
+	 * variable mentioned in the file; and we detect duplicate entries in the
+	 * file and mark the earlier occurrences as ignorable.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		struct config_generic *record;
+
+		/* Ignore anything already marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/*
+		 * Try to find the variable; but do not create a custom placeholder if
+		 * it's not there already.
+		 */
+		record = find_option(item->name, false, true, elevel);
+
+		if (record)
+		{
+			/* If it's already marked, then this is a duplicate entry */
+			if (record->status & GUC_IS_IN_FILE)
+			{
+				/*
+				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
+				 * avoid the O(N^2) behavior here with some additional state,
+				 * but it seems unlikely to be worth the trouble.
+				 */
+				ConfigVariable *pitem;
+
+				for (pitem = head; pitem != item; pitem = pitem->next)
+				{
+					if (!pitem->ignore &&
+						strcmp(pitem->name, item->name) == 0)
+						pitem->ignore = true;
+				}
+			}
+			/* Now mark it as present in file */
+			record->status |= GUC_IS_IN_FILE;
+		}
+		else if (!valid_custom_variable_name(item->name))
+		{
+			/* Invalid non-custom variable, so complain */
+			ereport(elevel,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
+							item->name,
+							item->filename, item->sourceline)));
+			item->errmsg = pstrdup("unrecognized configuration parameter");
+			error = true;
+			ConfFileWithError = item->filename;
+		}
+	}
+
+	/*
+	 * If we've detected any errors so far, we don't want to risk applying any
+	 * changes.
+	 */
+	if (error)
+		goto bail_out;
+
+	/* Otherwise, set flag that we're beginning to apply changes */
+	applying = true;
+
+	/*
+	 * Check for variables having been removed from the config file, and
+	 * revert their reset values (and perhaps also effective values) to the
+	 * boot-time defaults.  If such a variable can't be changed after startup,
+	 * report that and continue.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+		GucStack   *stack;
+
+		if (gconf->reset_source != PGC_S_FILE ||
+			(gconf->status & GUC_IS_IN_FILE))
+			continue;
+		if (gconf->context < PGC_SIGHUP)
+		{
+			/* The removal can't be effective without a restart */
+			gconf->status |= GUC_PENDING_RESTART;
+			ereport(elevel,
+					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
+							gconf->name)));
+			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
+											  gconf->name),
+									 NULL, 0,
+									 &head, &tail);
+			error = true;
+			continue;
+		}
+
+		/* No more to do if we're just doing show_all_file_settings() */
+		if (!applySettings)
+			continue;
+
+		/*
+		 * Reset any "file" sources to "default", else set_config_option will
+		 * not override those settings.
+		 */
+		if (gconf->reset_source == PGC_S_FILE)
+			gconf->reset_source = PGC_S_DEFAULT;
+		if (gconf->source == PGC_S_FILE)
+			gconf->source = PGC_S_DEFAULT;
+		for (stack = gconf->stack; stack; stack = stack->prev)
+		{
+			if (stack->source == PGC_S_FILE)
+				stack->source = PGC_S_DEFAULT;
+		}
+
+		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
+		if (set_config_option(gconf->name, NULL,
+							  context, PGC_S_DEFAULT,
+							  GUC_ACTION_SET, true, 0, false) > 0)
+		{
+			/* Log the change if appropriate */
+			if (context == PGC_SIGHUP)
+				ereport(elevel,
+						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
+								gconf->name)));
+		}
+	}
+
+	/*
+	 * Restore any variables determined by environment variables or
+	 * dynamically-computed defaults.  This is a no-op except in the case
+	 * where one of these had been in the config file and is now removed.
+	 *
+	 * In particular, we *must not* do this during the postmaster's initial
+	 * loading of the file, since the timezone functions in particular should
+	 * be run only after initialization is complete.
+	 *
+	 * XXX this is an unmaintainable crock, because we have to know how to set
+	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
+	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
+	 */
+	if (context == PGC_SIGHUP && applySettings)
+	{
+		InitializeGUCOptionsFromEnvironment();
+		pg_timezone_abbrev_initialize();
+		/* this selects SQL_ASCII in processes not connected to a database */
+		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
+						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
+	}
 
+	/*
+	 * Now apply the values from the config file.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		char	   *pre_value = NULL;
+		int			scres;
+
+		/* Ignore anything marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/* In SIGHUP cases in the postmaster, we want to report changes */
+		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
+		{
+			const char *preval = GetConfigOption(item->name, true, false);
+
+			/* If option doesn't exist yet or is NULL, treat as empty string */
+			if (!preval)
+				preval = "";
+			/* must dup, else might have dangling pointer below */
+			pre_value = pstrdup(preval);
+		}
+
+		scres = set_config_option(item->name, item->value,
+								  context, PGC_S_FILE,
+								  GUC_ACTION_SET, applySettings, 0, false);
+		if (scres > 0)
+		{
+			/* variable was updated, so log the change if appropriate */
+			if (pre_value)
+			{
+				const char *post_value = GetConfigOption(item->name, true, false);
+
+				if (!post_value)
+					post_value = "";
+				if (strcmp(pre_value, post_value) != 0)
+					ereport(elevel,
+							(errmsg("parameter \"%s\" changed to \"%s\"",
+									item->name, item->value)));
+			}
+			item->applied = true;
+		}
+		else if (scres == 0)
+		{
+			error = true;
+			item->errmsg = pstrdup("setting could not be applied");
+			ConfFileWithError = item->filename;
+		}
+		else
+		{
+			/* no error, but variable's active value was not changed */
+			item->applied = true;
+		}
+
+		/*
+		 * We should update source location unless there was an error, since
+		 * even if the active value didn't change, the reset value might have.
+		 * (In the postmaster, there won't be a difference, but it does matter
+		 * in backends.)
+		 */
+		if (scres != 0 && applySettings)
+			set_config_sourcefile(item->name, item->filename,
+								  item->sourceline);
+
+		if (pre_value)
+			pfree(pre_value);
+	}
+
+	/* Remember when we last successfully loaded the config file. */
+	if (applySettings)
+		PgReloadTime = GetCurrentTimestamp();
+
+bail_out:
+	if (error && applySettings)
+	{
+		/* During postmaster startup, any error is fatal */
+		if (context == PGC_POSTMASTER)
+			ereport(ERROR,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors",
+							ConfFileWithError)));
+		else if (applying)
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
+							ConfFileWithError)));
+		else
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
+							ConfFileWithError)));
+	}
+
+	/* Successful or otherwise, return the collected data list */
+	return head;
+}
 
 /*
  * Some infrastructure for checking malloc/strdup/realloc calls
@@ -5741,7 +6089,7 @@ guc_var_compare(const void *a, const void *b)
 /*
  * the bare comparison function for GUC names
  */
-static int
+int
 guc_name_compare(const char *namea, const char *nameb)
 {
 	/*
@@ -12988,5 +13336,3 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
 
 	return true;
 }
-
-#include "guc-file.c"
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index e734493a48..aae071cd82 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -442,6 +442,15 @@ extern void GUC_check_errcode(int sqlerrcode);
 	pre_format_elog_string(errno, TEXTDOMAIN), \
 	GUC_check_errhint_string = format_elog_string
 
+/* functions shared between guc.c and guc-file.l */
+extern int	guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+												 bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+									 const char *config_file,
+									 int lineno,
+									 ConfigVariable **head_p,
+									 ConfigVariable **tail_p);
 
 /*
  * The following functions are not in guc.c, but are declared here to avoid
-- 
2.36.1

v201-0005-Build-specscanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0005-Build-specscanner.c-standalone.patchDownload
From 4c105b7b415f0937e7fa42e8313c9452a8db1ad4 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 09:34:17 +0700
Subject: [PATCH v201 5/9] Build specscanner.c standalone

---
 src/test/isolation/.gitignore    |  1 +
 src/test/isolation/Makefile      | 15 +++++++++++----
 src/test/isolation/specparse.y   |  2 --
 src/test/isolation/specscanner.l | 25 ++++++++++++++++---------
 4 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/src/test/isolation/.gitignore b/src/test/isolation/.gitignore
index 870dac4d28..2c13b4bf98 100644
--- a/src/test/isolation/.gitignore
+++ b/src/test/isolation/.gitignore
@@ -3,6 +3,7 @@
 /pg_isolation_regress
 
 # Local generated source files
+/specparse.h
 /specparse.c
 /specscanner.c
 
diff --git a/src/test/isolation/Makefile b/src/test/isolation/Makefile
index 0d452c89d4..b8738b7c1b 100644
--- a/src/test/isolation/Makefile
+++ b/src/test/isolation/Makefile
@@ -15,7 +15,8 @@ override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) \
 OBJS = \
 	$(WIN32RES) \
 	isolationtester.o \
-	specparse.o
+	specparse.o \
+	specscanner.o
 
 all: isolationtester$(X) pg_isolation_regress$(X)
 
@@ -44,8 +45,14 @@ isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport
 
 distprep: specparse.c specscanner.c
 
-# specscanner is compiled as part of specparse
-specparse.o: specscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+specparse.h: specparse.c
+	touch $@
+
+specparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+specparse.o specscanner.o: specparse.h
 
 # specparse.c and specscanner.c are in the distribution tarball,
 # so do not clean them here
@@ -55,7 +62,7 @@ clean distclean:
 	rm -rf $(pg_regress_clean_files)
 
 maintainer-clean: distclean
-	rm -f specparse.c specscanner.c
+	rm -f specparse.h specparse.c specscanner.c
 
 installcheck: all
 	$(pg_isolation_regress_installcheck) --schedule=$(srcdir)/isolation_schedule
diff --git a/src/test/isolation/specparse.y b/src/test/isolation/specparse.y
index eb368184b8..657285cc23 100644
--- a/src/test/isolation/specparse.y
+++ b/src/test/isolation/specparse.y
@@ -276,5 +276,3 @@ blocker:
 		;
 
 %%
-
-#include "specscanner.c"
diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l
index aa6e89268e..2dc292c21d 100644
--- a/src/test/isolation/specscanner.l
+++ b/src/test/isolation/specscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * specscanner.l
@@ -9,7 +9,14 @@
  *
  *-------------------------------------------------------------------------
  */
+#include "postgres_fe.h"
+
+#include "isolationtester.h"
 
+#include "specparse.h"
+}
+
+%{
 static int	yyline = 1;			/* line number for error reporting */
 
 #define LITBUF_INIT	1024		/* initial size of litbuf */
@@ -75,7 +82,7 @@ teardown		{ return TEARDOWN; }
 
  /* Plain identifiers */
 {identifier}	{
-					yylval.str = pg_strdup(yytext);
+					spec_yylval.str = pg_strdup(yytext);
 					return(identifier);
 				}
 
@@ -87,13 +94,13 @@ teardown		{ return TEARDOWN; }
 <qident>\"\"	{ addlitchar(yytext[0]); }
 <qident>\"		{
 					litbuf[litbufpos] = '\0';
-					yylval.str = pg_strdup(litbuf);
+					spec_yylval.str = pg_strdup(litbuf);
 					BEGIN(INITIAL);
 					return(identifier);
 				}
 <qident>.		{ addlitchar(yytext[0]); }
-<qident>\n		{ yyerror("unexpected newline in quoted identifier"); }
-<qident><<EOF>>	{ yyerror("unterminated quoted identifier"); }
+<qident>\n		{ spec_yyerror("unexpected newline in quoted identifier"); }
+<qident><<EOF>>	{ spec_yyerror("unterminated quoted identifier"); }
 
  /* SQL blocks: { UPDATE ... } */
  /* We trim leading/trailing whitespace, otherwise they're unprocessed */
@@ -104,7 +111,7 @@ teardown		{ return TEARDOWN; }
 				}
 <sql>{space}*"}" {
 					litbuf[litbufpos] = '\0';
-					yylval.str = pg_strdup(litbuf);
+					spec_yylval.str = pg_strdup(litbuf);
 					BEGIN(INITIAL);
 					return(sqlblock);
 				}
@@ -116,12 +123,12 @@ teardown		{ return TEARDOWN; }
 					addlitchar(yytext[0]);
 				}
 <sql><<EOF>>	{
-					yyerror("unterminated sql block");
+					spec_yyerror("unterminated sql block");
 				}
 
  /* Numbers and punctuation */
 {digit}+		{
-					yylval.integer = atoi(yytext);
+					spec_yylval.integer = atoi(yytext);
 					return INTEGER;
 				}
 
@@ -150,7 +157,7 @@ addlitchar(char c)
 }
 
 void
-yyerror(const char *message)
+spec_yyerror(const char *message)
 {
 	fprintf(stderr, "%s at line %d\n", message, yyline);
 	exit(1);
-- 
2.36.1

v201-0004-Build-syncrep_scanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0004-Build-syncrep_scanner.c-standalone.patchDownload
From 92d48ac8354bce8bb57a43e01448835e1cd75871 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 18:27:39 +0700
Subject: [PATCH v201 4/9] Build syncrep_scanner.c standalone

---
 src/backend/replication/.gitignore        |  1 +
 src/backend/replication/Makefile          | 11 +++++++++--
 src/backend/replication/syncrep_gram.y    |  2 --
 src/backend/replication/syncrep_scanner.l | 17 +++++++++++------
 4 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/src/backend/replication/.gitignore b/src/backend/replication/.gitignore
index d1df6147bd..ad138c0c98 100644
--- a/src/backend/replication/.gitignore
+++ b/src/backend/replication/.gitignore
@@ -1,4 +1,5 @@
 /repl_gram.c
 /repl_scanner.c
+/syncrep_gram.h
 /syncrep_gram.c
 /syncrep_scanner.c
diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile
index bc8170418f..23f29ba545 100644
--- a/src/backend/replication/Makefile
+++ b/src/backend/replication/Makefile
@@ -21,6 +21,7 @@ OBJS = \
 	slotfuncs.o \
 	syncrep.o \
 	syncrep_gram.o \
+	syncrep_scanner.o \
 	walreceiver.o \
 	walreceiverfuncs.o \
 	walsender.o
@@ -38,8 +39,14 @@ repl_gram.c: BISONFLAGS += -d
 # Force these dependencies to be known even without dependency info built:
 repl_gram.o repl_scanner.o: repl_gram.h
 
-# syncrep_scanner is compiled as part of syncrep_gram
-syncrep_gram.o: syncrep_scanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+syncrep_gram.h: syncrep_gram.c
+	touch $@
+
+syncrep_gram.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+syncrep_gram.o syncrep_scanner.o: syncrep_gram.h
 
 # repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c
 # are in the distribution tarball, so they are not cleaned here.
diff --git a/src/backend/replication/syncrep_gram.y b/src/backend/replication/syncrep_gram.y
index d932f2cda3..4fc3647da1 100644
--- a/src/backend/replication/syncrep_gram.y
+++ b/src/backend/replication/syncrep_gram.y
@@ -112,5 +112,3 @@ create_syncrep_config(const char *num_sync, List *members, uint8 syncrep_method)
 
 	return config;
 }
-
-#include "syncrep_scanner.c"
diff --git a/src/backend/replication/syncrep_scanner.l b/src/backend/replication/syncrep_scanner.l
index 1952c8c6e0..8f38cb4613 100644
--- a/src/backend/replication/syncrep_scanner.l
+++ b/src/backend/replication/syncrep_scanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * syncrep_scanner.l
@@ -16,7 +16,12 @@
 #include "postgres.h"
 
 #include "lib/stringinfo.h"
+#include "replication/syncrep.h"
+
+#include "syncrep_gram.h"
+}
 
+%{
 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
 #undef fprintf
 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
@@ -82,28 +87,28 @@ xdinside		[^"]+
 				appendStringInfoString(&xdbuf, yytext);
 		}
 <xd>{xdstop} {
-				yylval.str = xdbuf.data;
+				syncrep_yylval.str = xdbuf.data;
 				xdbuf.data = NULL;
 				BEGIN(INITIAL);
 				return NAME;
 		}
 <xd><<EOF>> {
-				yyerror("unterminated quoted identifier");
+				syncrep_yyerror("unterminated quoted identifier");
 				return JUNK;
 		}
 
 {identifier} {
-				yylval.str = pstrdup(yytext);
+				syncrep_yylval.str = pstrdup(yytext);
 				return NAME;
 		}
 
 {digit}+	{
-				yylval.str = pstrdup(yytext);
+				syncrep_yylval.str = pstrdup(yytext);
 				return NUM;
 		}
 
 "*"		{
-				yylval.str = "*";
+				syncrep_yylval.str = "*";
 				return NAME;
 		}
 
-- 
2.36.1

v201-0002-Build-booscanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0002-Build-booscanner.c-standalone.patchDownload
From 7d4ecfcb3e91f3b45e94b9e64c7c40f1bbd22aa8 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 15:45:24 +0700
Subject: [PATCH v201 2/9] Build booscanner.c standalone

---
 src/backend/bootstrap/.gitignore    |  1 +
 src/backend/bootstrap/Makefile      | 11 +++++-
 src/backend/bootstrap/bootparse.y   |  2 -
 src/backend/bootstrap/bootscanner.l | 57 +++++++++++++++--------------
 4 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/src/backend/bootstrap/.gitignore b/src/backend/bootstrap/.gitignore
index 1ffe8ca39e..6351b920fd 100644
--- a/src/backend/bootstrap/.gitignore
+++ b/src/backend/bootstrap/.gitignore
@@ -1,2 +1,3 @@
+/bootparse.h
 /bootparse.c
 /bootscanner.c
diff --git a/src/backend/bootstrap/Makefile b/src/backend/bootstrap/Makefile
index 6421efb227..c39eb7089c 100644
--- a/src/backend/bootstrap/Makefile
+++ b/src/backend/bootstrap/Makefile
@@ -14,12 +14,19 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	bootparse.o \
+	bootscanner.o \
 	bootstrap.o
 
 include $(top_srcdir)/src/backend/common.mk
 
-# bootscanner is compiled as part of bootparse
-bootparse.o: bootscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+bootparse.h: bootparse.c
+	touch $@
+
+bootparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+bootparse.o bootscan.o: bootparse.h
 
 # bootparse.c and bootscanner.c are in the distribution tarball, so
 # they are not cleaned here.
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index 7d7655d295..c45ddde67f 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -488,5 +488,3 @@ boot_ident:
 		| XNULL			{ $$ = pstrdup($1); }
 		;
 %%
-
-#include "bootscanner.c"
diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l
index 3094ccb93f..3f916fbb93 100644
--- a/src/backend/bootstrap/bootscanner.l
+++ b/src/backend/bootstrap/bootscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * bootscanner.l
@@ -18,8 +18,11 @@
 #include "bootstrap/bootstrap.h"
 #include "utils/guc.h"
 
-/* Not needed now that this file is compiled as part of bootparse. */
-/* #include "bootparse.h" */
+/* XXX must be included after bootstrap.h */
+#include "bootparse.h"
+}
+
+%{
 
 /* LCOV_EXCL_START */
 
@@ -52,7 +55,7 @@ id		[-A-Za-z0-9_]+
 sid		\'([^']|\'\')*\'
 
 /*
- * Keyword tokens return the keyword text (as a constant string) in yylval.kw,
+ * Keyword tokens return the keyword text (as a constant string) in boot_yylval.kw,
  * just in case that's needed because we want to treat the keyword as an
  * unreserved identifier.  Note that _null_ is not treated as a keyword
  * for this purpose; it's the one "reserved word" in the bootstrap syntax.
@@ -60,23 +63,23 @@ sid		\'([^']|\'\')*\'
  * Notice that all the keywords are case-sensitive, and for historical
  * reasons some must be upper case.
  *
- * String tokens return a palloc'd string in yylval.str.
+ * String tokens return a palloc'd string in boot_yylval.str.
  */
 
 %%
 
-open			{ yylval.kw = "open"; return OPEN; }
+open			{ boot_yylval.kw = "open"; return OPEN; }
 
-close			{ yylval.kw = "close"; return XCLOSE; }
+close			{ boot_yylval.kw = "close"; return XCLOSE; }
 
-create			{ yylval.kw = "create"; return XCREATE; }
+create			{ boot_yylval.kw = "create"; return XCREATE; }
 
-OID				{ yylval.kw = "OID"; return OBJ_ID; }
-bootstrap		{ yylval.kw = "bootstrap"; return XBOOTSTRAP; }
-shared_relation	{ yylval.kw = "shared_relation"; return XSHARED_RELATION; }
-rowtype_oid		{ yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
+OID				{ boot_yylval.kw = "OID"; return OBJ_ID; }
+bootstrap		{ boot_yylval.kw = "bootstrap"; return XBOOTSTRAP; }
+shared_relation	{ boot_yylval.kw = "shared_relation"; return XSHARED_RELATION; }
+rowtype_oid		{ boot_yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
 
-insert			{ yylval.kw = "insert"; return INSERT_TUPLE; }
+insert			{ boot_yylval.kw = "insert"; return INSERT_TUPLE; }
 
 _null_			{ return NULLVAL; }
 
@@ -90,25 +93,25 @@ _null_			{ return NULLVAL; }
 
 ^\#[^\n]*		;		/* drop everything after "#" for comments */
 
-declare			{ yylval.kw = "declare"; return XDECLARE; }
-build			{ yylval.kw = "build"; return XBUILD; }
-indices			{ yylval.kw = "indices"; return INDICES; }
-unique			{ yylval.kw = "unique"; return UNIQUE; }
-index			{ yylval.kw = "index"; return INDEX; }
-on				{ yylval.kw = "on"; return ON; }
-using			{ yylval.kw = "using"; return USING; }
-toast			{ yylval.kw = "toast"; return XTOAST; }
-FORCE			{ yylval.kw = "FORCE"; return XFORCE; }
-NOT				{ yylval.kw = "NOT"; return XNOT; }
-NULL			{ yylval.kw = "NULL"; return XNULL; }
+declare			{ boot_yylval.kw = "declare"; return XDECLARE; }
+build			{ boot_yylval.kw = "build"; return XBUILD; }
+indices			{ boot_yylval.kw = "indices"; return INDICES; }
+unique			{ boot_yylval.kw = "unique"; return UNIQUE; }
+index			{ boot_yylval.kw = "index"; return INDEX; }
+on				{ boot_yylval.kw = "on"; return ON; }
+using			{ boot_yylval.kw = "using"; return USING; }
+toast			{ boot_yylval.kw = "toast"; return XTOAST; }
+FORCE			{ boot_yylval.kw = "FORCE"; return XFORCE; }
+NOT				{ boot_yylval.kw = "NOT"; return XNOT; }
+NULL			{ boot_yylval.kw = "NULL"; return XNULL; }
 
 {id}			{
-					yylval.str = pstrdup(yytext);
+					boot_yylval.str = pstrdup(yytext);
 					return ID;
 				}
 {sid}			{
 					/* strip quotes and escapes */
-					yylval.str = DeescapeQuotedString(yytext);
+					boot_yylval.str = DeescapeQuotedString(yytext);
 					return ID;
 				}
 
@@ -121,7 +124,7 @@ NULL			{ yylval.kw = "NULL"; return XNULL; }
 /* LCOV_EXCL_STOP */
 
 void
-yyerror(const char *message)
+boot_yyerror(const char *message)
 {
 	elog(ERROR, "%s at line %d", message, yyline);
 }
-- 
2.36.1

v201-0006-Build-cubescan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0006-Build-cubescan.c-standalone.patchDownload
From 75168640fbd4e2a23f2765b2918cd6a0676d0f74 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 11:18:06 +0700
Subject: [PATCH v201 6/9] Build cubescan.c standalone

---
 contrib/cube/.gitignore  |  1 +
 contrib/cube/Makefile    | 16 ++++++++++------
 contrib/cube/cubedata.h  |  4 ++++
 contrib/cube/cubeparse.y |  9 ++-------
 contrib/cube/cubescan.l  | 33 +++++++++++++++++++--------------
 5 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/contrib/cube/.gitignore b/contrib/cube/.gitignore
index cb4c989fff..f788440c79 100644
--- a/contrib/cube/.gitignore
+++ b/contrib/cube/.gitignore
@@ -1,3 +1,4 @@
+/cubeparse.h
 /cubeparse.c
 /cubescan.c
 # Generated subdirectories
diff --git a/contrib/cube/Makefile b/contrib/cube/Makefile
index cf195506c7..4fd19aac35 100644
--- a/contrib/cube/Makefile
+++ b/contrib/cube/Makefile
@@ -4,7 +4,8 @@ MODULE_big = cube
 OBJS = \
 	$(WIN32RES) \
 	cube.o \
-	cubeparse.o
+	cubeparse.o \
+	cubescan.o
 
 EXTENSION = cube
 DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql cube--1.4--1.5.sql \
@@ -15,8 +16,6 @@ HEADERS = cubedata.h
 
 REGRESS = cube cube_sci
 
-EXTRA_CLEAN = y.tab.c y.tab.h
-
 SHLIB_LINK += $(filter -lm, $(LIBS))
 
 ifdef USE_PGXS
@@ -30,11 +29,16 @@ include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
+# See notes in src/backend/parser/Makefile about the following two rules
+cubeparse.h: cubeparse.c
+	touch $@
+
+cubeparse.c: BISONFLAGS += -d
 
-# cubescan is compiled as part of cubeparse
-cubeparse.o: cubescan.c
+# Force these dependencies to be known even without dependency info built:
+cubeparse.o cubescan.o: cubeparse.h
 
 distprep: cubeparse.c cubescan.c
 
 maintainer-clean:
-	rm -f cubeparse.c cubescan.c
+	rm -f cubeparse.h cubeparse.c cubescan.c
diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h
index dbe7d4f742..0b373048b5 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -67,3 +67,7 @@ extern void cube_scanner_finish(void);
 
 /* in cubeparse.y */
 extern int	cube_yyparse(NDBOX **result);
+
+/* All grammar constructs return strings */
+#define YYSTYPE char *
+extern int scanbuflen;
diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y
index 7577c4515c..d3fd1fb475 100644
--- a/contrib/cube/cubeparse.y
+++ b/contrib/cube/cubeparse.y
@@ -9,9 +9,6 @@
 #include "cubedata.h"
 #include "utils/float.h"
 
-/* All grammar constructs return strings */
-#define YYSTYPE char *
-
 /*
  * Bison doesn't allocate anything that needs to live across parser calls,
  * so we can easily have it use palloc instead of malloc.  This prevents
@@ -23,8 +20,8 @@
 #define YYMALLOC palloc
 #define YYFREE   pfree
 
-static char *scanbuf;
-static int	scanbuflen;
+// TODO: get rid of global var
+int	scanbuflen;
 
 static int item_count(const char *s, char delim);
 static NDBOX *write_box(int dim, char *str1, char *str2);
@@ -265,5 +262,3 @@ write_point_as_box(int dim, char *str)
 
 	return bp;
 }
-
-#include "cubescan.c"
diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l
index bd400e3684..b7d35c6f78 100644
--- a/contrib/cube/cubescan.l
+++ b/contrib/cube/cubescan.l
@@ -1,9 +1,16 @@
-%{
+%top{
 /*
  * A scanner for EMP-style numeric ranges
  * contrib/cube/cubescan.l
  */
 
+#include "postgres.h"
+#include "cubedata.h"
+
+#include "cubeparse.h"
+}
+
+%{
 /* LCOV_EXCL_START */
 
 /* No reason to constrain amount of data slurped */
@@ -21,9 +28,7 @@ fprintf_to_ereport(const char *fmt, const char *msg)
 
 /* Handles to the buffer that the lexer uses internally */
 static YY_BUFFER_STATE scanbufhandle;
-/* this is now declared in cubeparse.y: */
-/* static char *scanbuf; */
-/* static int	scanbuflen; */
+static char *scanbuf;
 %}
 
 %option 8bit
@@ -45,14 +50,14 @@ NaN          [nN][aA][nN]
 
 %%
 
-{float}      yylval = yytext; return CUBEFLOAT;
-{infinity}   yylval = yytext; return CUBEFLOAT;
-{NaN}        yylval = yytext; return CUBEFLOAT;
-\[           yylval = "("; return O_BRACKET;
-\]           yylval = ")"; return C_BRACKET;
-\(           yylval = "("; return O_PAREN;
-\)           yylval = ")"; return C_PAREN;
-\,           yylval = ","; return COMMA;
+{float}      cube_yylval = yytext; return CUBEFLOAT;
+{infinity}   cube_yylval = yytext; return CUBEFLOAT;
+{NaN}        cube_yylval = yytext; return CUBEFLOAT;
+\[           cube_yylval = "("; return O_BRACKET;
+\]           cube_yylval = ")"; return C_BRACKET;
+\(           cube_yylval = "("; return O_PAREN;
+\)           cube_yylval = ")"; return C_PAREN;
+\,           cube_yylval = ","; return COMMA;
 [ \t\n\r\f]+ /* discard spaces */
 .            return yytext[0]; /* alert parser of the garbage */
 
@@ -62,7 +67,7 @@ NaN          [nN][aA][nN]
 
 /* result is not used, but Bison expects this signature */
 void
-yyerror(NDBOX **result, const char *message)
+cube_yyerror(NDBOX **result, const char *message)
 {
 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 	{
@@ -89,7 +94,7 @@ yyerror(NDBOX **result, const char *message)
 void
 cube_scanner_init(const char *str)
 {
-	Size	slen = strlen(str);
+	Size		slen = strlen(str);
 
 	/*
 	 * Might be left over after ereport()
-- 
2.36.1

v201-0007-Build-segscan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v201-0007-Build-segscan.c-standalone.patchDownload
From 5170d8fac8bbb9e101e10f18ed280e446b305e26 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 12:00:33 +0700
Subject: [PATCH v201 7/9] Build segscan.c standalone

---
 contrib/seg/.gitignore |  1 +
 contrib/seg/Makefile   | 15 +++++++++++----
 contrib/seg/segparse.y |  3 ---
 contrib/seg/segscan.l  | 25 +++++++++++++++----------
 4 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/contrib/seg/.gitignore b/contrib/seg/.gitignore
index 69e73d2096..fa247a4e67 100644
--- a/contrib/seg/.gitignore
+++ b/contrib/seg/.gitignore
@@ -1,3 +1,4 @@
+/segparse.h
 /segparse.c
 /segscan.c
 # Generated subdirectories
diff --git a/contrib/seg/Makefile b/contrib/seg/Makefile
index bb63e83506..c6c134b8f1 100644
--- a/contrib/seg/Makefile
+++ b/contrib/seg/Makefile
@@ -4,7 +4,8 @@ MODULE_big = seg
 OBJS = \
 	$(WIN32RES) \
 	seg.o \
-	segparse.o
+	segparse.o \
+	segscan.o
 
 EXTENSION = seg
 DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql seg--1.3--1.4.sql \
@@ -29,10 +30,16 @@ include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
 
-# segscan is compiled as part of segparse
-segparse.o: segscan.c
+# See notes in src/backend/parser/Makefile about the following two rules
+segparse.h: segparse.c
+	touch $@
+
+segparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+segparse.o segscan.o: segparse.h
 
 distprep: segparse.c segscan.c
 
 maintainer-clean:
-	rm -f segparse.c segscan.c
+	rm -f segparse.h segparse.c segscan.c
diff --git a/contrib/seg/segparse.y b/contrib/seg/segparse.y
index 33e3a9f35f..637eacd1a6 100644
--- a/contrib/seg/segparse.y
+++ b/contrib/seg/segparse.y
@@ -160,6 +160,3 @@ seg_atof(const char *value)
 	datum = DirectFunctionCall1(float4in, CStringGetDatum(value));
 	return DatumGetFloat4(datum);
 }
-
-
-#include "segscan.c"
diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l
index 5f6595e9eb..db0db1aa70 100644
--- a/contrib/seg/segscan.l
+++ b/contrib/seg/segscan.l
@@ -1,8 +1,15 @@
-%{
+%top{
 /*
  * A scanner for EMP-style numeric ranges
  */
+#include "postgres.h"
+
+#include "segdata.h"
 
+#include "segparse.h"
+}
+
+%{
 /* LCOV_EXCL_START */
 
 /* No reason to constrain amount of data slurped */
@@ -21,7 +28,6 @@ fprintf_to_ereport(const char *fmt, const char *msg)
 /* Handles to the buffer that the lexer uses internally */
 static YY_BUFFER_STATE scanbufhandle;
 static char *scanbuf;
-static int	scanbuflen;
 %}
 
 %option 8bit
@@ -42,12 +48,12 @@ float        ({integer}|{real})([eE]{integer})?
 
 %%
 
-{range}      yylval.text = yytext; return RANGE;
-{plumin}     yylval.text = yytext; return PLUMIN;
-{float}      yylval.text = yytext; return SEGFLOAT;
-\<           yylval.text = "<"; return EXTENSION;
-\>           yylval.text = ">"; return EXTENSION;
-\~           yylval.text = "~"; return EXTENSION;
+{range}      seg_yylval.text = yytext; return RANGE;
+{plumin}     seg_yylval.text = yytext; return PLUMIN;
+{float}      seg_yylval.text = yytext; return SEGFLOAT;
+\<           seg_yylval.text = "<"; return EXTENSION;
+\>           seg_yylval.text = ">"; return EXTENSION;
+\~           seg_yylval.text = "~"; return EXTENSION;
 [ \t\n\r\f]+ /* discard spaces */
 .            return yytext[0]; /* alert parser of the garbage */
 
@@ -56,7 +62,7 @@ float        ({integer}|{real})([eE]{integer})?
 /* LCOV_EXCL_STOP */
 
 void
-yyerror(SEG *result, const char *message)
+seg_yyerror(SEG *result, const char *message)
 {
 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 	{
@@ -94,7 +100,6 @@ seg_scanner_init(const char *str)
 	/*
 	 * Make a scan buffer with special termination needed by flex.
 	 */
-	scanbuflen = slen;
 	scanbuf = palloc(slen + 2);
 	memcpy(scanbuf, str, slen);
 	scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
-- 
2.36.1

#234Andres Freund
andres@anarazel.de
In reply to: John Naylor (#233)
Re: build remaining Flex files standalone

Hi,

Thanks for your work on this!

On 2022-08-13 15:39:06 +0700, John Naylor wrote:

Here are the rest. Most of it was pretty straightforward, with the
main exception of jsonpath_scan.c, which is not quite finished. That
one passes tests but still has one compiler warning. I'm unsure how
much of what is there already is really necessary or was cargo-culted
from elsewhere without explanation. For starters, I'm not sure why the
grammar has a forward declaration of "union YYSTYPE". It's noteworthy
that it used to compile standalone, but with a bit more stuff, and
that was reverted in 550b9d26f80fa30. I can hack on it some more later
but I ran out of steam today.

I'm not sure either...

Other questions thus far:

- "BISONFLAGS += -d" is now in every make file with a .y file -- can
we just force that everywhere?

Hm. Not sure it's worth it, extensions might use our BISON stuff...

- Include order seems to matter for the grammar's .h file. I didn't
test if that was the case every time, and after a few miscompiles just
always made it the last inclusion, but I'm wondering if we should keep
those inclusions outside %top{} and put it at the start of the next
%{} ?

I think we have a few of those dependencies already, see e.g.
/*
* NB: include gram.h only AFTER including scanner.h, because scanner.h
* is what #defines YYLTYPE.
*/

From d723ba14acf56fd432e9e263db937fcc13fc0355 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Thu, 11 Aug 2022 19:38:37 +0700
Subject: [PATCH v201 1/9] Build guc-file.c standalone

Might be worth doing some of the moving around here separately from the
parser/scanner specific bits.

+/* functions shared between guc.c and guc-file.l */
+extern int	guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+												 bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+									 const char *config_file,
+									 int lineno,
+									 ConfigVariable **head_p,
+									 ConfigVariable **tail_p);

/*
* The following functions are not in guc.c, but are declared here to avoid
--
2.36.1

I think I prefer your suggestion of a guc_internal.h upthread.

From 7d4ecfcb3e91f3b45e94b9e64c7c40f1bbd22aa8 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 15:45:24 +0700
Subject: [PATCH v201 2/9] Build booscanner.c standalone

-# bootscanner is compiled as part of bootparse
-bootparse.o: bootscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+bootparse.h: bootparse.c
+	touch $@
+
+bootparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+bootparse.o bootscan.o: bootparse.h

Wonder if we could / should wrap this is something common. It's somewhat
annoying to repeat this stuff everywhere.

diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l
index aa6e89268e..2dc292c21d 100644
--- a/src/test/isolation/specscanner.l
+++ b/src/test/isolation/specscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
/*-------------------------------------------------------------------------
*
* specscanner.l
@@ -9,7 +9,14 @@
*
*-------------------------------------------------------------------------
*/
+#include "postgres_fe.h"

Miniscule nitpick: I think we typically leave an empty line between header and
first include.

diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h
index dbe7d4f742..0b373048b5 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -67,3 +67,7 @@ extern void cube_scanner_finish(void);
/* in cubeparse.y */
extern int	cube_yyparse(NDBOX **result);
+
+/* All grammar constructs return strings */
+#define YYSTYPE char *

Why does this need to be defined in a semi-public header? If we do this in
multiple files we'll end up with the danger of macro redefinition warnings.

+extern int scanbuflen;

The code around scanbuflen seems pretty darn grotty. Allocating enough memory
for the entire list by allocating the entire string size... I don't know
anything about contrib/cube, but isn't that in effect O(inputlen^2) memory?

Greetings,

Andres Freund

#235John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#234)
11 attachment(s)
Re: build remaining Flex files standalone

For v3, I addressed some comments and added .h files to the
headerscheck exceptions.

On Tue, Aug 16, 2022 at 1:11 AM Andres Freund <andres@anarazel.de> wrote:

On 2022-08-13 15:39:06 +0700, John Naylor wrote:

Here are the rest. Most of it was pretty straightforward, with the
main exception of jsonpath_scan.c, which is not quite finished. That
one passes tests but still has one compiler warning. I'm unsure how
much of what is there already is really necessary or was cargo-culted
from elsewhere without explanation. For starters, I'm not sure why the
grammar has a forward declaration of "union YYSTYPE". It's noteworthy
that it used to compile standalone, but with a bit more stuff, and
that was reverted in 550b9d26f80fa30. I can hack on it some more later
but I ran out of steam today.

I've got it in half-way decent shape now, with an *internal.h header
and some cleanups.

- Include order seems to matter for the grammar's .h file. I didn't
test if that was the case every time, and after a few miscompiles just
always made it the last inclusion, but I'm wondering if we should keep
those inclusions outside %top{} and put it at the start of the next
%{} ?

I think we have a few of those dependencies already, see e.g.
/*
* NB: include gram.h only AFTER including scanner.h, because scanner.h
* is what #defines YYLTYPE.
*/

Went with something like this in all cases:

/*
* NB: include bootparse.h only AFTER including bootstrap.h, because bootstrap.h
* includes node definitions needed for YYSTYPE.
*/

Future cleanup: I see this in headerscheck:

# We can't make these Bison output files compilable standalone
# without using "%code require", which old Bison versions lack.
# parser/gram.h will be included by parser/gramparse.h anyway.

That directive has been supported in Bison since 2.4.2.

From d723ba14acf56fd432e9e263db937fcc13fc0355 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Thu, 11 Aug 2022 19:38:37 +0700
Subject: [PATCH v201 1/9] Build guc-file.c standalone

Might be worth doing some of the moving around here separately from the
parser/scanner specific bits.

Done in 0001/0003.

+/* functions shared between guc.c and guc-file.l */
[...]

I think I prefer your suggestion of a guc_internal.h upthread.

Started in 0002, but left open the headerscheck failure.

Also, if such a thing is meant to be #include'd only by two generated
files, maybe it should just live in the directory where they live, and
not in the src/include dir?

From 7d4ecfcb3e91f3b45e94b9e64c7c40f1bbd22aa8 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 15:45:24 +0700
Subject: [PATCH v201 2/9] Build booscanner.c standalone

-# bootscanner is compiled as part of bootparse
-bootparse.o: bootscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+bootparse.h: bootparse.c
+     touch $@
+
+bootparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+bootparse.o bootscan.o: bootparse.h

Wonder if we could / should wrap this is something common. It's somewhat
annoying to repeat this stuff everywhere.

I haven't looked at the Meson effort recently, but if the build rule
is less annoying there, I'm inclined to leave this as a wart until
autotools are retired.

diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l
index aa6e89268e..2dc292c21d 100644
--- a/src/test/isolation/specscanner.l
+++ b/src/test/isolation/specscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
/*-------------------------------------------------------------------------
*
* specscanner.l
@@ -9,7 +9,14 @@
*
*-------------------------------------------------------------------------
*/
+#include "postgres_fe.h"

Miniscule nitpick: I think we typically leave an empty line between header and
first include.

In a small unscientific sample it seems like the opposite is true
actually, but I'll at least try to be consistent within the patch set.

diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h
index dbe7d4f742..0b373048b5 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -67,3 +67,7 @@ extern void cube_scanner_finish(void);
/* in cubeparse.y */
extern int   cube_yyparse(NDBOX **result);
+
+/* All grammar constructs return strings */
+#define YYSTYPE char *

Why does this need to be defined in a semi-public header? If we do this in
multiple files we'll end up with the danger of macro redefinition warnings.

I tried to put all the Flex/Bison stuff in another *_internal header,
but that breaks the build. Putting just this one symbol in a header is
silly, but done that way for now. Maybe two copies of the symbol?

Another future cleanup: "%define api.prefix {cube_yy}" etc would cause
it to be spelled CUBE_YYSTYPE (other macros too), sidestepping this
problem (requires Bison 2.6). IIUC, doing it our way has been
deprecated for 9 years.

+extern int scanbuflen;

The code around scanbuflen seems pretty darn grotty. Allocating enough memory
for the entire list by allocating the entire string size... I don't know
anything about contrib/cube, but isn't that in effect O(inputlen^2) memory?

Neither do I.

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v3-0001-Preparatory-refactoring-for-compiling-guc-file.c-.patchtext/x-patch; charset=US-ASCII; name=v3-0001-Preparatory-refactoring-for-compiling-guc-file.c-.patchDownload
From 6e780de69ba59e3d921c3115de920de1f98994cd Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Tue, 16 Aug 2022 10:42:19 +0700
Subject: [PATCH v3 01/11] Preparatory refactoring for compiling guc-file.c
 standalone

Mostly this involves moving ProcessConfigFileInternal() to guc.c
and fixing the shared API to match.
---
 src/backend/utils/misc/guc-file.l | 360 +-----------------------------
 src/backend/utils/misc/guc.c      | 360 +++++++++++++++++++++++++++++-
 src/include/utils/guc.h           |   9 +
 3 files changed, 364 insertions(+), 365 deletions(-)

diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index ce5633844c..b4fa09749b 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -48,12 +48,6 @@ static sigjmp_buf *GUC_flex_fatal_jmp;
 
 static void FreeConfigVariable(ConfigVariable *item);
 
-static void record_config_file_error(const char *errmsg,
-									 const char *config_file,
-									 int lineno,
-									 ConfigVariable **head_p,
-									 ConfigVariable **tail_p);
-
 static int	GUC_flex_fatal(const char *msg);
 
 /* LCOV_EXCL_START */
@@ -159,358 +153,6 @@ ProcessConfigFile(GucContext context)
 	MemoryContextDelete(config_cxt);
 }
 
-/*
- * This function handles both actual config file (re)loads and execution of
- * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
- * case we don't apply any of the settings, but we make all the usual validity
- * checks, and we return the ConfigVariable list so that it can be printed out
- * by show_all_file_settings().
- */
-static ConfigVariable *
-ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
-{
-	bool		error = false;
-	bool		applying = false;
-	const char *ConfFileWithError;
-	ConfigVariable *item,
-			   *head,
-			   *tail;
-	int			i;
-
-	/* Parse the main config file into a list of option names and values */
-	ConfFileWithError = ConfigFileName;
-	head = tail = NULL;
-
-	if (!ParseConfigFile(ConfigFileName, true,
-						 NULL, 0, 0, elevel,
-						 &head, &tail))
-	{
-		/* Syntax error(s) detected in the file, so bail out */
-		error = true;
-		goto bail_out;
-	}
-
-	/*
-	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
-	 * replace any parameters set by ALTER SYSTEM command.  Because this file
-	 * is in the data directory, we can't read it until the DataDir has been
-	 * set.
-	 */
-	if (DataDir)
-	{
-		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
-							 NULL, 0, 0, elevel,
-							 &head, &tail))
-		{
-			/* Syntax error(s) detected in the file, so bail out */
-			error = true;
-			ConfFileWithError = PG_AUTOCONF_FILENAME;
-			goto bail_out;
-		}
-	}
-	else
-	{
-		/*
-		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
-		 * read.  In this case, we don't want to accept any settings but
-		 * data_directory from postgresql.conf, because they might be
-		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
-		 * will be read later. OTOH, since data_directory isn't allowed in the
-		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
-		 */
-		ConfigVariable *newlist = NULL;
-
-		/*
-		 * Prune all items except the last "data_directory" from the list.
-		 */
-		for (item = head; item; item = item->next)
-		{
-			if (!item->ignore &&
-				strcmp(item->name, "data_directory") == 0)
-				newlist = item;
-		}
-
-		if (newlist)
-			newlist->next = NULL;
-		head = tail = newlist;
-
-		/*
-		 * Quick exit if data_directory is not present in file.
-		 *
-		 * We need not do any further processing, in particular we don't set
-		 * PgReloadTime; that will be set soon by subsequent full loading of
-		 * the config file.
-		 */
-		if (head == NULL)
-			goto bail_out;
-	}
-
-	/*
-	 * Mark all extant GUC variables as not present in the config file. We
-	 * need this so that we can tell below which ones have been removed from
-	 * the file since we last processed it.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-
-		gconf->status &= ~GUC_IS_IN_FILE;
-	}
-
-	/*
-	 * Check if all the supplied option names are valid, as an additional
-	 * quasi-syntactic check on the validity of the config file.  It is
-	 * important that the postmaster and all backends agree on the results of
-	 * this phase, else we will have strange inconsistencies about which
-	 * processes accept a config file update and which don't.  Hence, unknown
-	 * custom variable names have to be accepted without complaint.  For the
-	 * same reason, we don't attempt to validate the options' values here.
-	 *
-	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
-	 * variable mentioned in the file; and we detect duplicate entries in the
-	 * file and mark the earlier occurrences as ignorable.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		struct config_generic *record;
-
-		/* Ignore anything already marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/*
-		 * Try to find the variable; but do not create a custom placeholder if
-		 * it's not there already.
-		 */
-		record = find_option(item->name, false, true, elevel);
-
-		if (record)
-		{
-			/* If it's already marked, then this is a duplicate entry */
-			if (record->status & GUC_IS_IN_FILE)
-			{
-				/*
-				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
-				 * avoid the O(N^2) behavior here with some additional state,
-				 * but it seems unlikely to be worth the trouble.
-				 */
-				ConfigVariable *pitem;
-
-				for (pitem = head; pitem != item; pitem = pitem->next)
-				{
-					if (!pitem->ignore &&
-						strcmp(pitem->name, item->name) == 0)
-						pitem->ignore = true;
-				}
-			}
-			/* Now mark it as present in file */
-			record->status |= GUC_IS_IN_FILE;
-		}
-		else if (!valid_custom_variable_name(item->name))
-		{
-			/* Invalid non-custom variable, so complain */
-			ereport(elevel,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
-							item->name,
-							item->filename, item->sourceline)));
-			item->errmsg = pstrdup("unrecognized configuration parameter");
-			error = true;
-			ConfFileWithError = item->filename;
-		}
-	}
-
-	/*
-	 * If we've detected any errors so far, we don't want to risk applying any
-	 * changes.
-	 */
-	if (error)
-		goto bail_out;
-
-	/* Otherwise, set flag that we're beginning to apply changes */
-	applying = true;
-
-	/*
-	 * Check for variables having been removed from the config file, and
-	 * revert their reset values (and perhaps also effective values) to the
-	 * boot-time defaults.  If such a variable can't be changed after startup,
-	 * report that and continue.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-		GucStack   *stack;
-
-		if (gconf->reset_source != PGC_S_FILE ||
-			(gconf->status & GUC_IS_IN_FILE))
-			continue;
-		if (gconf->context < PGC_SIGHUP)
-		{
-			/* The removal can't be effective without a restart */
-			gconf->status |= GUC_PENDING_RESTART;
-			ereport(elevel,
-					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
-					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
-							gconf->name)));
-			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
-											  gconf->name),
-									 NULL, 0,
-									 &head, &tail);
-			error = true;
-			continue;
-		}
-
-		/* No more to do if we're just doing show_all_file_settings() */
-		if (!applySettings)
-			continue;
-
-		/*
-		 * Reset any "file" sources to "default", else set_config_option will
-		 * not override those settings.
-		 */
-		if (gconf->reset_source == PGC_S_FILE)
-			gconf->reset_source = PGC_S_DEFAULT;
-		if (gconf->source == PGC_S_FILE)
-			gconf->source = PGC_S_DEFAULT;
-		for (stack = gconf->stack; stack; stack = stack->prev)
-		{
-			if (stack->source == PGC_S_FILE)
-				stack->source = PGC_S_DEFAULT;
-		}
-
-		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
-		if (set_config_option(gconf->name, NULL,
-							  context, PGC_S_DEFAULT,
-							  GUC_ACTION_SET, true, 0, false) > 0)
-		{
-			/* Log the change if appropriate */
-			if (context == PGC_SIGHUP)
-				ereport(elevel,
-						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
-								gconf->name)));
-		}
-	}
-
-	/*
-	 * Restore any variables determined by environment variables or
-	 * dynamically-computed defaults.  This is a no-op except in the case
-	 * where one of these had been in the config file and is now removed.
-	 *
-	 * In particular, we *must not* do this during the postmaster's initial
-	 * loading of the file, since the timezone functions in particular should
-	 * be run only after initialization is complete.
-	 *
-	 * XXX this is an unmaintainable crock, because we have to know how to set
-	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
-	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
-	 */
-	if (context == PGC_SIGHUP && applySettings)
-	{
-		InitializeGUCOptionsFromEnvironment();
-		pg_timezone_abbrev_initialize();
-		/* this selects SQL_ASCII in processes not connected to a database */
-		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
-						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
-	}
-
-	/*
-	 * Now apply the values from the config file.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		char	   *pre_value = NULL;
-		int			scres;
-
-		/* Ignore anything marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/* In SIGHUP cases in the postmaster, we want to report changes */
-		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
-		{
-			const char *preval = GetConfigOption(item->name, true, false);
-
-			/* If option doesn't exist yet or is NULL, treat as empty string */
-			if (!preval)
-				preval = "";
-			/* must dup, else might have dangling pointer below */
-			pre_value = pstrdup(preval);
-		}
-
-		scres = set_config_option(item->name, item->value,
-								  context, PGC_S_FILE,
-								  GUC_ACTION_SET, applySettings, 0, false);
-		if (scres > 0)
-		{
-			/* variable was updated, so log the change if appropriate */
-			if (pre_value)
-			{
-				const char *post_value = GetConfigOption(item->name, true, false);
-
-				if (!post_value)
-					post_value = "";
-				if (strcmp(pre_value, post_value) != 0)
-					ereport(elevel,
-							(errmsg("parameter \"%s\" changed to \"%s\"",
-									item->name, item->value)));
-			}
-			item->applied = true;
-		}
-		else if (scres == 0)
-		{
-			error = true;
-			item->errmsg = pstrdup("setting could not be applied");
-			ConfFileWithError = item->filename;
-		}
-		else
-		{
-			/* no error, but variable's active value was not changed */
-			item->applied = true;
-		}
-
-		/*
-		 * We should update source location unless there was an error, since
-		 * even if the active value didn't change, the reset value might have.
-		 * (In the postmaster, there won't be a difference, but it does matter
-		 * in backends.)
-		 */
-		if (scres != 0 && applySettings)
-			set_config_sourcefile(item->name, item->filename,
-								  item->sourceline);
-
-		if (pre_value)
-			pfree(pre_value);
-	}
-
-	/* Remember when we last successfully loaded the config file. */
-	if (applySettings)
-		PgReloadTime = GetCurrentTimestamp();
-
-bail_out:
-	if (error && applySettings)
-	{
-		/* During postmaster startup, any error is fatal */
-		if (context == PGC_POSTMASTER)
-			ereport(ERROR,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors",
-							ConfFileWithError)));
-		else if (applying)
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
-							ConfFileWithError)));
-		else
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
-							ConfFileWithError)));
-	}
-
-	/* Successful or otherwise, return the collected data list */
-	return head;
-}
-
 /*
  * Given a configuration file or directory location that may be a relative
  * path, return an absolute one.  We consider the location to be relative to
@@ -659,7 +301,7 @@ cleanup:
  * Capture an error message in the ConfigVariable list returned by
  * config file parsing.
  */
-static void
+void
 record_config_file_error(const char *errmsg,
 						 const char *config_file,
 						 int lineno,
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 9fbbfb1be5..66ab3912a0 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -243,10 +243,6 @@ static void assign_recovery_target_lsn(const char *newval, void *extra);
 static bool check_primary_slot_name(char **newval, void **extra, GucSource source);
 static bool check_default_with_oids(bool *newval, void **extra, GucSource source);
 
-/* Private functions in guc-file.l that need to be called from guc.c */
-static ConfigVariable *ProcessConfigFileInternal(GucContext context,
-												 bool applySettings, int elevel);
-
 /*
  * Track whether there were any deferred checks for custom resource managers
  * specified in wal_consistency_checking.
@@ -5160,8 +5156,8 @@ static bool report_needed;		/* true if any GUC_REPORT reports are needed */
 static int	GUCNestLevel = 0;	/* 1 when in main transaction */
 
 
+static struct config_generic *find_option(const char *name, bool create_placeholders, bool skip_errors, int elevel);
 static int	guc_var_compare(const void *a, const void *b);
-static int	guc_name_compare(const char *namea, const char *nameb);
 static void InitializeGUCOptionsFromEnvironment(void);
 static void InitializeOneGUCOption(struct config_generic *gconf);
 static void push_old_value(struct config_generic *gconf, GucAction action);
@@ -5180,7 +5176,359 @@ static bool validate_option_array_item(const char *name, const char *value,
 static void write_auto_conf_file(int fd, const char *filename, ConfigVariable *head_p);
 static void replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
 									  const char *name, const char *value);
+static bool valid_custom_variable_name(const char *name);
+
+/*
+ * This function handles both actual config file (re)loads and execution of
+ * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
+ * case we don't apply any of the settings, but we make all the usual validity
+ * checks, and we return the ConfigVariable list so that it can be printed out
+ * by show_all_file_settings().
+ */
+ConfigVariable *
+ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
+{
+	bool		error = false;
+	bool		applying = false;
+	const char *ConfFileWithError;
+	ConfigVariable *item,
+			   *head,
+			   *tail;
+	int			i;
+
+	/* Parse the main config file into a list of option names and values */
+	ConfFileWithError = ConfigFileName;
+	head = tail = NULL;
+
+	if (!ParseConfigFile(ConfigFileName, true,
+						 NULL, 0, 0, elevel,
+						 &head, &tail))
+	{
+		/* Syntax error(s) detected in the file, so bail out */
+		error = true;
+		goto bail_out;
+	}
+
+	/*
+	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
+	 * replace any parameters set by ALTER SYSTEM command.  Because this file
+	 * is in the data directory, we can't read it until the DataDir has been
+	 * set.
+	 */
+	if (DataDir)
+	{
+		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
+							 NULL, 0, 0, elevel,
+							 &head, &tail))
+		{
+			/* Syntax error(s) detected in the file, so bail out */
+			error = true;
+			ConfFileWithError = PG_AUTOCONF_FILENAME;
+			goto bail_out;
+		}
+	}
+	else
+	{
+		/*
+		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
+		 * read.  In this case, we don't want to accept any settings but
+		 * data_directory from postgresql.conf, because they might be
+		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
+		 * will be read later. OTOH, since data_directory isn't allowed in the
+		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
+		 */
+		ConfigVariable *newlist = NULL;
+
+		/*
+		 * Prune all items except the last "data_directory" from the list.
+		 */
+		for (item = head; item; item = item->next)
+		{
+			if (!item->ignore &&
+				strcmp(item->name, "data_directory") == 0)
+				newlist = item;
+		}
 
+		if (newlist)
+			newlist->next = NULL;
+		head = tail = newlist;
+
+		/*
+		 * Quick exit if data_directory is not present in file.
+		 *
+		 * We need not do any further processing, in particular we don't set
+		 * PgReloadTime; that will be set soon by subsequent full loading of
+		 * the config file.
+		 */
+		if (head == NULL)
+			goto bail_out;
+	}
+
+	/*
+	 * Mark all extant GUC variables as not present in the config file. We
+	 * need this so that we can tell below which ones have been removed from
+	 * the file since we last processed it.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+
+		gconf->status &= ~GUC_IS_IN_FILE;
+	}
+
+	/*
+	 * Check if all the supplied option names are valid, as an additional
+	 * quasi-syntactic check on the validity of the config file.  It is
+	 * important that the postmaster and all backends agree on the results of
+	 * this phase, else we will have strange inconsistencies about which
+	 * processes accept a config file update and which don't.  Hence, unknown
+	 * custom variable names have to be accepted without complaint.  For the
+	 * same reason, we don't attempt to validate the options' values here.
+	 *
+	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
+	 * variable mentioned in the file; and we detect duplicate entries in the
+	 * file and mark the earlier occurrences as ignorable.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		struct config_generic *record;
+
+		/* Ignore anything already marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/*
+		 * Try to find the variable; but do not create a custom placeholder if
+		 * it's not there already.
+		 */
+		record = find_option(item->name, false, true, elevel);
+
+		if (record)
+		{
+			/* If it's already marked, then this is a duplicate entry */
+			if (record->status & GUC_IS_IN_FILE)
+			{
+				/*
+				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
+				 * avoid the O(N^2) behavior here with some additional state,
+				 * but it seems unlikely to be worth the trouble.
+				 */
+				ConfigVariable *pitem;
+
+				for (pitem = head; pitem != item; pitem = pitem->next)
+				{
+					if (!pitem->ignore &&
+						strcmp(pitem->name, item->name) == 0)
+						pitem->ignore = true;
+				}
+			}
+			/* Now mark it as present in file */
+			record->status |= GUC_IS_IN_FILE;
+		}
+		else if (!valid_custom_variable_name(item->name))
+		{
+			/* Invalid non-custom variable, so complain */
+			ereport(elevel,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
+							item->name,
+							item->filename, item->sourceline)));
+			item->errmsg = pstrdup("unrecognized configuration parameter");
+			error = true;
+			ConfFileWithError = item->filename;
+		}
+	}
+
+	/*
+	 * If we've detected any errors so far, we don't want to risk applying any
+	 * changes.
+	 */
+	if (error)
+		goto bail_out;
+
+	/* Otherwise, set flag that we're beginning to apply changes */
+	applying = true;
+
+	/*
+	 * Check for variables having been removed from the config file, and
+	 * revert their reset values (and perhaps also effective values) to the
+	 * boot-time defaults.  If such a variable can't be changed after startup,
+	 * report that and continue.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+		GucStack   *stack;
+
+		if (gconf->reset_source != PGC_S_FILE ||
+			(gconf->status & GUC_IS_IN_FILE))
+			continue;
+		if (gconf->context < PGC_SIGHUP)
+		{
+			/* The removal can't be effective without a restart */
+			gconf->status |= GUC_PENDING_RESTART;
+			ereport(elevel,
+					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
+							gconf->name)));
+			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
+											  gconf->name),
+									 NULL, 0,
+									 &head, &tail);
+			error = true;
+			continue;
+		}
+
+		/* No more to do if we're just doing show_all_file_settings() */
+		if (!applySettings)
+			continue;
+
+		/*
+		 * Reset any "file" sources to "default", else set_config_option will
+		 * not override those settings.
+		 */
+		if (gconf->reset_source == PGC_S_FILE)
+			gconf->reset_source = PGC_S_DEFAULT;
+		if (gconf->source == PGC_S_FILE)
+			gconf->source = PGC_S_DEFAULT;
+		for (stack = gconf->stack; stack; stack = stack->prev)
+		{
+			if (stack->source == PGC_S_FILE)
+				stack->source = PGC_S_DEFAULT;
+		}
+
+		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
+		if (set_config_option(gconf->name, NULL,
+							  context, PGC_S_DEFAULT,
+							  GUC_ACTION_SET, true, 0, false) > 0)
+		{
+			/* Log the change if appropriate */
+			if (context == PGC_SIGHUP)
+				ereport(elevel,
+						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
+								gconf->name)));
+		}
+	}
+
+	/*
+	 * Restore any variables determined by environment variables or
+	 * dynamically-computed defaults.  This is a no-op except in the case
+	 * where one of these had been in the config file and is now removed.
+	 *
+	 * In particular, we *must not* do this during the postmaster's initial
+	 * loading of the file, since the timezone functions in particular should
+	 * be run only after initialization is complete.
+	 *
+	 * XXX this is an unmaintainable crock, because we have to know how to set
+	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
+	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
+	 */
+	if (context == PGC_SIGHUP && applySettings)
+	{
+		InitializeGUCOptionsFromEnvironment();
+		pg_timezone_abbrev_initialize();
+		/* this selects SQL_ASCII in processes not connected to a database */
+		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
+						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
+	}
+
+	/*
+	 * Now apply the values from the config file.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		char	   *pre_value = NULL;
+		int			scres;
+
+		/* Ignore anything marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/* In SIGHUP cases in the postmaster, we want to report changes */
+		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
+		{
+			const char *preval = GetConfigOption(item->name, true, false);
+
+			/* If option doesn't exist yet or is NULL, treat as empty string */
+			if (!preval)
+				preval = "";
+			/* must dup, else might have dangling pointer below */
+			pre_value = pstrdup(preval);
+		}
+
+		scres = set_config_option(item->name, item->value,
+								  context, PGC_S_FILE,
+								  GUC_ACTION_SET, applySettings, 0, false);
+		if (scres > 0)
+		{
+			/* variable was updated, so log the change if appropriate */
+			if (pre_value)
+			{
+				const char *post_value = GetConfigOption(item->name, true, false);
+
+				if (!post_value)
+					post_value = "";
+				if (strcmp(pre_value, post_value) != 0)
+					ereport(elevel,
+							(errmsg("parameter \"%s\" changed to \"%s\"",
+									item->name, item->value)));
+			}
+			item->applied = true;
+		}
+		else if (scres == 0)
+		{
+			error = true;
+			item->errmsg = pstrdup("setting could not be applied");
+			ConfFileWithError = item->filename;
+		}
+		else
+		{
+			/* no error, but variable's active value was not changed */
+			item->applied = true;
+		}
+
+		/*
+		 * We should update source location unless there was an error, since
+		 * even if the active value didn't change, the reset value might have.
+		 * (In the postmaster, there won't be a difference, but it does matter
+		 * in backends.)
+		 */
+		if (scres != 0 && applySettings)
+			set_config_sourcefile(item->name, item->filename,
+								  item->sourceline);
+
+		if (pre_value)
+			pfree(pre_value);
+	}
+
+	/* Remember when we last successfully loaded the config file. */
+	if (applySettings)
+		PgReloadTime = GetCurrentTimestamp();
+
+bail_out:
+	if (error && applySettings)
+	{
+		/* During postmaster startup, any error is fatal */
+		if (context == PGC_POSTMASTER)
+			ereport(ERROR,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors",
+							ConfFileWithError)));
+		else if (applying)
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
+							ConfFileWithError)));
+		else
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
+							ConfFileWithError)));
+	}
+
+	/* Successful or otherwise, return the collected data list */
+	return head;
+}
 
 /*
  * Some infrastructure for checking malloc/strdup/realloc calls
@@ -5737,7 +6085,7 @@ guc_var_compare(const void *a, const void *b)
 /*
  * the bare comparison function for GUC names
  */
-static int
+int
 guc_name_compare(const char *namea, const char *nameb)
 {
 	/*
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index e734493a48..aae071cd82 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -442,6 +442,15 @@ extern void GUC_check_errcode(int sqlerrcode);
 	pre_format_elog_string(errno, TEXTDOMAIN), \
 	GUC_check_errhint_string = format_elog_string
 
+/* functions shared between guc.c and guc-file.l */
+extern int	guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+												 bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+									 const char *config_file,
+									 int lineno,
+									 ConfigVariable **head_p,
+									 ConfigVariable **tail_p);
 
 /*
  * The following functions are not in guc.c, but are declared here to avoid
-- 
2.36.1

v3-0005-Build-repl_scanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0005-Build-repl_scanner.c-standalone.patchDownload
From 3d6fc71eaf615bee5a8789f3fdec9cb361b711ff Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 17:09:45 +0700
Subject: [PATCH v3 05/11] Build repl_scanner.c standalone

---
 src/backend/Makefile                   |  3 ++-
 src/backend/replication/.gitignore     |  1 +
 src/backend/replication/Makefile       | 11 +++++++--
 src/backend/replication/repl_gram.y    |  2 --
 src/backend/replication/repl_scanner.l | 31 +++++++++++++++++---------
 src/tools/pginclude/headerscheck       |  1 +
 6 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/backend/Makefile b/src/backend/Makefile
index 5a12666918..f527659a7b 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -183,7 +183,7 @@ distprep:
 	$(MAKE) -C bootstrap	bootparse.c bootparse.h bootscanner.c
 	$(MAKE) -C catalog	distprep
 	$(MAKE) -C nodes	distprep
-	$(MAKE) -C replication	repl_gram.c repl_scanner.c syncrep_gram.c syncrep_scanner.c
+	$(MAKE) -C replication	repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_scanner.c
 	$(MAKE) -C storage/lmgr	lwlocknames.h lwlocknames.c
 	$(MAKE) -C utils	distprep
 	$(MAKE) -C utils/adt	jsonpath_gram.c jsonpath_scan.c
@@ -304,6 +304,7 @@ maintainer-clean: distclean
 	      parser/gram.h \
 	      parser/scan.c \
 	      replication/repl_gram.c \
+	      replication/repl_gram.h \
 	      replication/repl_scanner.c \
 	      replication/syncrep_gram.c \
 	      replication/syncrep_scanner.c \
diff --git a/src/backend/replication/.gitignore b/src/backend/replication/.gitignore
index d1df6147bd..a5f600232f 100644
--- a/src/backend/replication/.gitignore
+++ b/src/backend/replication/.gitignore
@@ -1,3 +1,4 @@
+/repl_gram.h
 /repl_gram.c
 /repl_scanner.c
 /syncrep_gram.c
diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile
index 2bffac58c0..bc8170418f 100644
--- a/src/backend/replication/Makefile
+++ b/src/backend/replication/Makefile
@@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	repl_gram.o \
+	repl_scanner.o \
 	slot.o \
 	slotfuncs.o \
 	syncrep.o \
@@ -28,8 +29,14 @@ SUBDIRS = logical
 
 include $(top_srcdir)/src/backend/common.mk
 
-# repl_scanner is compiled as part of repl_gram
-repl_gram.o: repl_scanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+repl_gram.h: repl_gram.c
+	touch $@
+
+repl_gram.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+repl_gram.o repl_scanner.o: repl_gram.h
 
 # syncrep_scanner is compiled as part of syncrep_gram
 syncrep_gram.o: syncrep_scanner.c
diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y
index 4cf087e602..b343f108d3 100644
--- a/src/backend/replication/repl_gram.y
+++ b/src/backend/replication/repl_gram.y
@@ -416,5 +416,3 @@ ident_or_keyword:
 		;
 
 %%
-
-#include "repl_scanner.c"
diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l
index 586f0d3a5c..23fcb2a11d 100644
--- a/src/backend/replication/repl_scanner.l
+++ b/src/backend/replication/repl_scanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * repl_scanner.l
@@ -18,6 +18,15 @@
 #include "utils/builtins.h"
 #include "parser/scansup.h"
 
+/*
+ * NB: include repl_gram.h only AFTER including walsender_private.h, because
+ * walsender_private includes headers that define XLogRecPtr.
+ */
+#include "replication/walsender_private.h"
+#include "repl_gram.h"
+}
+
+%{
 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
 #undef fprintf
 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
@@ -130,7 +139,7 @@ WAIT				{ return K_WAIT; }
 {space}+		{ /* do nothing */ }
 
 {digit}+		{
-					yylval.uintval = strtoul(yytext, NULL, 10);
+					replication_yylval.uintval = strtoul(yytext, NULL, 10);
 					return UCONST;
 				}
 
@@ -138,8 +147,8 @@ WAIT				{ return K_WAIT; }
 					uint32	hi,
 							lo;
 					if (sscanf(yytext, "%X/%X", &hi, &lo) != 2)
-						yyerror("invalid streaming start location");
-					yylval.recptr = ((uint64) hi) << 32 | lo;
+						replication_yyerror("invalid streaming start location");
+					replication_yylval.recptr = ((uint64) hi) << 32 | lo;
 					return RECPTR;
 				}
 
@@ -151,7 +160,7 @@ WAIT				{ return K_WAIT; }
 <xq>{quotestop}	{
 					yyless(1);
 					BEGIN(INITIAL);
-					yylval.str = litbufdup();
+					replication_yylval.str = litbufdup();
 					return SCONST;
 				}
 
@@ -173,9 +182,9 @@ WAIT				{ return K_WAIT; }
 
 					yyless(1);
 					BEGIN(INITIAL);
-					yylval.str = litbufdup();
-					len = strlen(yylval.str);
-					truncate_identifier(yylval.str, len, true);
+					replication_yylval.str = litbufdup();
+					len = strlen(replication_yylval.str);
+					truncate_identifier(replication_yylval.str, len, true);
 					return IDENT;
 				}
 
@@ -186,7 +195,7 @@ WAIT				{ return K_WAIT; }
 {identifier}	{
 					int			len = strlen(yytext);
 
-					yylval.str = downcase_truncate_identifier(yytext, len, true);
+					replication_yylval.str = downcase_truncate_identifier(yytext, len, true);
 					return IDENT;
 				}
 
@@ -195,7 +204,7 @@ WAIT				{ return K_WAIT; }
 					return yytext[0];
 				}
 
-<xq,xd><<EOF>>	{ yyerror("unterminated quoted string"); }
+<xq,xd><<EOF>>	{ replication_yyerror("unterminated quoted string"); }
 
 
 <<EOF>>			{
@@ -231,7 +240,7 @@ addlitchar(unsigned char ychar)
 }
 
 void
-yyerror(const char *message)
+replication_yyerror(const char *message)
 {
 	ereport(ERROR,
 			(errcode(ERRCODE_SYNTAX_ERROR),
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 96a95cad9b..c102adf434 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -118,6 +118,7 @@ do
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
+	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v3-0002-Move-private-declarations-shared-between-guc.c-an.patchtext/x-patch; charset=US-ASCII; name=v3-0002-Move-private-declarations-shared-between-guc.c-an.patchDownload
From 0d33e92fcd15b57977d8eb9d021996912e69ab81 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Tue, 16 Aug 2022 12:01:41 +0700
Subject: [PATCH v3 02/11] Move private declarations shared between guc.c and
 guc-file.l to new header

FIXME: fails headerscheck
---
 src/backend/utils/misc/guc-file.l |  1 +
 src/backend/utils/misc/guc.c      |  1 +
 src/include/utils/guc.h           | 10 ----------
 src/include/utils/guc_internal.h  | 24 ++++++++++++++++++++++++
 4 files changed, 26 insertions(+), 10 deletions(-)
 create mode 100644 src/include/utils/guc_internal.h

diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index b4fa09749b..843838b1df 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -18,6 +18,7 @@
 #include "miscadmin.h"
 #include "storage/fd.h"
 #include "utils/guc.h"
+#include "utils/guc_internal.h"
 
 
 /*
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 66ab3912a0..293834fc13 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -100,6 +100,7 @@
 #include "utils/builtins.h"
 #include "utils/bytea.h"
 #include "utils/float.h"
+#include "utils/guc_internal.h"
 #include "utils/guc_tables.h"
 #include "utils/memutils.h"
 #include "utils/pg_locale.h"
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index aae071cd82..45ae1b537f 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -442,16 +442,6 @@ extern void GUC_check_errcode(int sqlerrcode);
 	pre_format_elog_string(errno, TEXTDOMAIN), \
 	GUC_check_errhint_string = format_elog_string
 
-/* functions shared between guc.c and guc-file.l */
-extern int	guc_name_compare(const char *namea, const char *nameb);
-extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
-												 bool applySettings, int elevel);
-extern void record_config_file_error(const char *errmsg,
-									 const char *config_file,
-									 int lineno,
-									 ConfigVariable **head_p,
-									 ConfigVariable **tail_p);
-
 /*
  * The following functions are not in guc.c, but are declared here to avoid
  * having to include guc.h in some widely used headers that it really doesn't
diff --git a/src/include/utils/guc_internal.h b/src/include/utils/guc_internal.h
new file mode 100644
index 0000000000..5d5db6bdce
--- /dev/null
+++ b/src/include/utils/guc_internal.h
@@ -0,0 +1,24 @@
+/*--------------------------------------------------------------------
+ * guc_internals.h
+ *
+ * Declarations shared between backend/utils/misc/guc.c and
+ * backend/utils/misc/guc-file.l
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/include/utils/guc_internals.h
+ *--------------------------------------------------------------------
+ */
+#ifndef GUC_INTERNALS_H
+#define GUC_INTERNALS_H
+
+extern int	guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+												 bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+									 const char *config_file,
+									 int lineno,
+									 ConfigVariable **head_p,
+									 ConfigVariable **tail_p);
+
+#endif							/* GUC_INTERNALS_H */
-- 
2.36.1

v3-0004-Build-bootscanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0004-Build-bootscanner.c-standalone.patchDownload
From ba67b6b8e5c26631d89d4a188a6b06c24bcc5f39 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 15:45:24 +0700
Subject: [PATCH v3 04/11] Build bootscanner.c standalone

---
 src/backend/Makefile                |  3 +-
 src/backend/bootstrap/.gitignore    |  1 +
 src/backend/bootstrap/Makefile      | 11 +++++-
 src/backend/bootstrap/bootparse.y   |  2 -
 src/backend/bootstrap/bootscanner.l | 60 ++++++++++++++++-------------
 src/tools/pginclude/headerscheck    |  1 +
 6 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/src/backend/Makefile b/src/backend/Makefile
index 3f01c65592..5a12666918 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -180,7 +180,7 @@ utils/probes.o: utils/probes.d $(SUBDIROBJS)
 # Be sure that these files get removed by the maintainer-clean target
 distprep:
 	$(MAKE) -C parser	gram.c gram.h scan.c
-	$(MAKE) -C bootstrap	bootparse.c bootscanner.c
+	$(MAKE) -C bootstrap	bootparse.c bootparse.h bootscanner.c
 	$(MAKE) -C catalog	distprep
 	$(MAKE) -C nodes	distprep
 	$(MAKE) -C replication	repl_gram.c repl_scanner.c syncrep_gram.c syncrep_scanner.c
@@ -298,6 +298,7 @@ maintainer-clean: distclean
 	$(MAKE) -C nodes $@
 	$(MAKE) -C utils $@
 	rm -f bootstrap/bootparse.c \
+	      bootstrap/bootparse.h \
 	      bootstrap/bootscanner.c \
 	      parser/gram.c \
 	      parser/gram.h \
diff --git a/src/backend/bootstrap/.gitignore b/src/backend/bootstrap/.gitignore
index 1ffe8ca39e..6351b920fd 100644
--- a/src/backend/bootstrap/.gitignore
+++ b/src/backend/bootstrap/.gitignore
@@ -1,2 +1,3 @@
+/bootparse.h
 /bootparse.c
 /bootscanner.c
diff --git a/src/backend/bootstrap/Makefile b/src/backend/bootstrap/Makefile
index 6421efb227..606c8021e7 100644
--- a/src/backend/bootstrap/Makefile
+++ b/src/backend/bootstrap/Makefile
@@ -14,12 +14,19 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	bootparse.o \
+	bootscanner.o \
 	bootstrap.o
 
 include $(top_srcdir)/src/backend/common.mk
 
-# bootscanner is compiled as part of bootparse
-bootparse.o: bootscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+bootparse.h: bootparse.c
+	touch $@
+
+bootparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+bootparse.o bootscanner.o: bootparse.h
 
 # bootparse.c and bootscanner.c are in the distribution tarball, so
 # they are not cleaned here.
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index 7d7655d295..c45ddde67f 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -488,5 +488,3 @@ boot_ident:
 		| XNULL			{ $$ = pstrdup($1); }
 		;
 %%
-
-#include "bootscanner.c"
diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l
index 3094ccb93f..d6eae84816 100644
--- a/src/backend/bootstrap/bootscanner.l
+++ b/src/backend/bootstrap/bootscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * bootscanner.l
@@ -15,11 +15,17 @@
  */
 #include "postgres.h"
 
+/*
+ * NB: include bootparse.h only AFTER including bootstrap.h, because bootstrap.h
+ * includes node definitions needed for YYSTYPE.
+ */
 #include "bootstrap/bootstrap.h"
+#include "bootparse.h"
 #include "utils/guc.h"
 
-/* Not needed now that this file is compiled as part of bootparse. */
-/* #include "bootparse.h" */
+}
+
+%{
 
 /* LCOV_EXCL_START */
 
@@ -52,7 +58,7 @@ id		[-A-Za-z0-9_]+
 sid		\'([^']|\'\')*\'
 
 /*
- * Keyword tokens return the keyword text (as a constant string) in yylval.kw,
+ * Keyword tokens return the keyword text (as a constant string) in boot_yylval.kw,
  * just in case that's needed because we want to treat the keyword as an
  * unreserved identifier.  Note that _null_ is not treated as a keyword
  * for this purpose; it's the one "reserved word" in the bootstrap syntax.
@@ -60,23 +66,23 @@ sid		\'([^']|\'\')*\'
  * Notice that all the keywords are case-sensitive, and for historical
  * reasons some must be upper case.
  *
- * String tokens return a palloc'd string in yylval.str.
+ * String tokens return a palloc'd string in boot_yylval.str.
  */
 
 %%
 
-open			{ yylval.kw = "open"; return OPEN; }
+open			{ boot_yylval.kw = "open"; return OPEN; }
 
-close			{ yylval.kw = "close"; return XCLOSE; }
+close			{ boot_yylval.kw = "close"; return XCLOSE; }
 
-create			{ yylval.kw = "create"; return XCREATE; }
+create			{ boot_yylval.kw = "create"; return XCREATE; }
 
-OID				{ yylval.kw = "OID"; return OBJ_ID; }
-bootstrap		{ yylval.kw = "bootstrap"; return XBOOTSTRAP; }
-shared_relation	{ yylval.kw = "shared_relation"; return XSHARED_RELATION; }
-rowtype_oid		{ yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
+OID				{ boot_yylval.kw = "OID"; return OBJ_ID; }
+bootstrap		{ boot_yylval.kw = "bootstrap"; return XBOOTSTRAP; }
+shared_relation	{ boot_yylval.kw = "shared_relation"; return XSHARED_RELATION; }
+rowtype_oid		{ boot_yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
 
-insert			{ yylval.kw = "insert"; return INSERT_TUPLE; }
+insert			{ boot_yylval.kw = "insert"; return INSERT_TUPLE; }
 
 _null_			{ return NULLVAL; }
 
@@ -90,25 +96,25 @@ _null_			{ return NULLVAL; }
 
 ^\#[^\n]*		;		/* drop everything after "#" for comments */
 
-declare			{ yylval.kw = "declare"; return XDECLARE; }
-build			{ yylval.kw = "build"; return XBUILD; }
-indices			{ yylval.kw = "indices"; return INDICES; }
-unique			{ yylval.kw = "unique"; return UNIQUE; }
-index			{ yylval.kw = "index"; return INDEX; }
-on				{ yylval.kw = "on"; return ON; }
-using			{ yylval.kw = "using"; return USING; }
-toast			{ yylval.kw = "toast"; return XTOAST; }
-FORCE			{ yylval.kw = "FORCE"; return XFORCE; }
-NOT				{ yylval.kw = "NOT"; return XNOT; }
-NULL			{ yylval.kw = "NULL"; return XNULL; }
+declare			{ boot_yylval.kw = "declare"; return XDECLARE; }
+build			{ boot_yylval.kw = "build"; return XBUILD; }
+indices			{ boot_yylval.kw = "indices"; return INDICES; }
+unique			{ boot_yylval.kw = "unique"; return UNIQUE; }
+index			{ boot_yylval.kw = "index"; return INDEX; }
+on				{ boot_yylval.kw = "on"; return ON; }
+using			{ boot_yylval.kw = "using"; return USING; }
+toast			{ boot_yylval.kw = "toast"; return XTOAST; }
+FORCE			{ boot_yylval.kw = "FORCE"; return XFORCE; }
+NOT				{ boot_yylval.kw = "NOT"; return XNOT; }
+NULL			{ boot_yylval.kw = "NULL"; return XNULL; }
 
 {id}			{
-					yylval.str = pstrdup(yytext);
+					boot_yylval.str = pstrdup(yytext);
 					return ID;
 				}
 {sid}			{
 					/* strip quotes and escapes */
-					yylval.str = DeescapeQuotedString(yytext);
+					boot_yylval.str = DeescapeQuotedString(yytext);
 					return ID;
 				}
 
@@ -121,7 +127,7 @@ NULL			{ yylval.kw = "NULL"; return XNULL; }
 /* LCOV_EXCL_STOP */
 
 void
-yyerror(const char *message)
+boot_yyerror(const char *message)
 {
 	elog(ERROR, "%s at line %d", message, yyline);
 }
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 3f8640a03d..96a95cad9b 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -117,6 +117,7 @@ do
 	# parser/gram.h will be included by parser/gramparse.h anyway.
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
+	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v3-0003-Build-guc-file.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0003-Build-guc-file.c-standalone.patchDownload
From 68becb3064c8c573212033339735b3e335eb3af6 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Thu, 11 Aug 2022 19:38:37 +0700
Subject: [PATCH v3 03/11] Build guc-file.c standalone

The proposed Meson build system will need a way to ignore certain
generated files in order to coexist with the autoconf build system,
and #include'd C files generated by Flex make this more difficult.
Build guc-file.c separately from guc.c, as was done in 72b1e3a21.

Reviewed by Andres Freund
Discussion: https://www.postgresql.org/message-id/20220810171935.7k5zgnjwqzalzmtm%40awork3.anarazel.de
---
 src/backend/utils/misc/Makefile   | 5 +----
 src/backend/utils/misc/guc-file.l | 9 +++++----
 src/backend/utils/misc/guc.c      | 2 --
 3 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 1d5327cf64..cf7ce9bc83 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	guc.o \
+	guc-file.o \
 	help_config.o \
 	pg_config.o \
 	pg_controldata.o \
@@ -37,10 +38,6 @@ endif
 
 include $(top_srcdir)/src/backend/common.mk
 
-# guc-file is compiled as part of guc
-guc.o: guc-file.c
-
 # Note: guc-file.c is not deleted by 'make clean',
 # since we want to ship it in distribution tarballs.
 clean:
-	@rm -f lex.yy.c
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index 843838b1df..9aa3abe1ba 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -1,4 +1,4 @@
-/* -*-pgsql-c-*- */
+%top{
 /*
  * Scanner for the configuration file
  *
@@ -7,8 +7,6 @@
  * src/backend/utils/misc/guc-file.l
  */
 
-%{
-
 #include "postgres.h"
 
 #include <ctype.h>
@@ -17,10 +15,13 @@
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 #include "storage/fd.h"
+#include <sys/stat.h>
 #include "utils/guc.h"
 #include "utils/guc_internal.h"
+#include "utils/memutils.h"
+}
 
-
+%{
 /*
  * flex emits a yy_fatal_error() function that it calls in response to
  * critical errors like malloc failure, file I/O errors, and detection of
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 293834fc13..92b5b18c8f 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -13333,5 +13333,3 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
 
 	return true;
 }
-
-#include "guc-file.c"
-- 
2.36.1

v3-0007-Build-specscanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0007-Build-specscanner.c-standalone.patchDownload
From 829925b21f94ed70c33882490e6fe3351f16697e Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 09:34:17 +0700
Subject: [PATCH v3 07/11] Build specscanner.c standalone

---
 src/test/isolation/.gitignore    |  1 +
 src/test/isolation/Makefile      | 15 +++++++++++----
 src/test/isolation/specparse.y   |  2 --
 src/test/isolation/specscanner.l | 28 +++++++++++++++++++---------
 src/tools/pginclude/headerscheck |  1 +
 5 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/src/test/isolation/.gitignore b/src/test/isolation/.gitignore
index 870dac4d28..2c13b4bf98 100644
--- a/src/test/isolation/.gitignore
+++ b/src/test/isolation/.gitignore
@@ -3,6 +3,7 @@
 /pg_isolation_regress
 
 # Local generated source files
+/specparse.h
 /specparse.c
 /specscanner.c
 
diff --git a/src/test/isolation/Makefile b/src/test/isolation/Makefile
index 0d452c89d4..b8738b7c1b 100644
--- a/src/test/isolation/Makefile
+++ b/src/test/isolation/Makefile
@@ -15,7 +15,8 @@ override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) \
 OBJS = \
 	$(WIN32RES) \
 	isolationtester.o \
-	specparse.o
+	specparse.o \
+	specscanner.o
 
 all: isolationtester$(X) pg_isolation_regress$(X)
 
@@ -44,8 +45,14 @@ isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport
 
 distprep: specparse.c specscanner.c
 
-# specscanner is compiled as part of specparse
-specparse.o: specscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+specparse.h: specparse.c
+	touch $@
+
+specparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+specparse.o specscanner.o: specparse.h
 
 # specparse.c and specscanner.c are in the distribution tarball,
 # so do not clean them here
@@ -55,7 +62,7 @@ clean distclean:
 	rm -rf $(pg_regress_clean_files)
 
 maintainer-clean: distclean
-	rm -f specparse.c specscanner.c
+	rm -f specparse.h specparse.c specscanner.c
 
 installcheck: all
 	$(pg_isolation_regress_installcheck) --schedule=$(srcdir)/isolation_schedule
diff --git a/src/test/isolation/specparse.y b/src/test/isolation/specparse.y
index eb368184b8..657285cc23 100644
--- a/src/test/isolation/specparse.y
+++ b/src/test/isolation/specparse.y
@@ -276,5 +276,3 @@ blocker:
 		;
 
 %%
-
-#include "specscanner.c"
diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l
index aa6e89268e..b04696f52d 100644
--- a/src/test/isolation/specscanner.l
+++ b/src/test/isolation/specscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * specscanner.l
@@ -9,7 +9,17 @@
  *
  *-------------------------------------------------------------------------
  */
+#include "postgres_fe.h"
 
+/*
+ * NB: include specparse.h only AFTER including isolationtester.h, because
+ * isolationtester.h includes node definitions needed for YYSTYPE.
+ */
+#include "isolationtester.h"
+#include "specparse.h"
+}
+
+%{
 static int	yyline = 1;			/* line number for error reporting */
 
 #define LITBUF_INIT	1024		/* initial size of litbuf */
@@ -75,7 +85,7 @@ teardown		{ return TEARDOWN; }
 
  /* Plain identifiers */
 {identifier}	{
-					yylval.str = pg_strdup(yytext);
+					spec_yylval.str = pg_strdup(yytext);
 					return(identifier);
 				}
 
@@ -87,13 +97,13 @@ teardown		{ return TEARDOWN; }
 <qident>\"\"	{ addlitchar(yytext[0]); }
 <qident>\"		{
 					litbuf[litbufpos] = '\0';
-					yylval.str = pg_strdup(litbuf);
+					spec_yylval.str = pg_strdup(litbuf);
 					BEGIN(INITIAL);
 					return(identifier);
 				}
 <qident>.		{ addlitchar(yytext[0]); }
-<qident>\n		{ yyerror("unexpected newline in quoted identifier"); }
-<qident><<EOF>>	{ yyerror("unterminated quoted identifier"); }
+<qident>\n		{ spec_yyerror("unexpected newline in quoted identifier"); }
+<qident><<EOF>>	{ spec_yyerror("unterminated quoted identifier"); }
 
  /* SQL blocks: { UPDATE ... } */
  /* We trim leading/trailing whitespace, otherwise they're unprocessed */
@@ -104,7 +114,7 @@ teardown		{ return TEARDOWN; }
 				}
 <sql>{space}*"}" {
 					litbuf[litbufpos] = '\0';
-					yylval.str = pg_strdup(litbuf);
+					spec_yylval.str = pg_strdup(litbuf);
 					BEGIN(INITIAL);
 					return(sqlblock);
 				}
@@ -116,12 +126,12 @@ teardown		{ return TEARDOWN; }
 					addlitchar(yytext[0]);
 				}
 <sql><<EOF>>	{
-					yyerror("unterminated sql block");
+					spec_yyerror("unterminated sql block");
 				}
 
  /* Numbers and punctuation */
 {digit}+		{
-					yylval.integer = atoi(yytext);
+					spec_yylval.integer = atoi(yytext);
 					return INTEGER;
 				}
 
@@ -150,7 +160,7 @@ addlitchar(char c)
 }
 
 void
-yyerror(const char *message)
+spec_yyerror(const char *message)
 {
 	fprintf(stderr, "%s at line %d\n", message, yyline);
 	exit(1);
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 77b697e293..cf75e93943 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -120,6 +120,7 @@ do
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
+	test "$f" = src/test/isolation/specparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v3-0008-Build-exprscan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0008-Build-exprscan.c-standalone.patchDownload
From 4b9237ae205a4eb817124d0347c985de7eb194e0 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 13:35:14 +0700
Subject: [PATCH v3 08/11] Build exprscan.c standalone

---
 src/bin/pgbench/.gitignore       |  1 +
 src/bin/pgbench/Makefile         | 13 ++++++++++---
 src/bin/pgbench/exprparse.y      | 15 ---------------
 src/bin/pgbench/exprscan.l       | 12 +++++++++++-
 src/tools/pginclude/headerscheck |  1 +
 5 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/src/bin/pgbench/.gitignore b/src/bin/pgbench/.gitignore
index 983a3cd7a6..07492a993c 100644
--- a/src/bin/pgbench/.gitignore
+++ b/src/bin/pgbench/.gitignore
@@ -1,3 +1,4 @@
+/exprparse.h
 /exprparse.c
 /exprscan.c
 /pgbench
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
index f402fe7b91..6647c9fe97 100644
--- a/src/bin/pgbench/Makefile
+++ b/src/bin/pgbench/Makefile
@@ -10,6 +10,7 @@ include $(top_builddir)/src/Makefile.global
 OBJS = \
 	$(WIN32RES) \
 	exprparse.o \
+	exprscan.o \
 	pgbench.o
 
 override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
@@ -26,8 +27,14 @@ all: pgbench
 pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
 	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-# exprscan is compiled as part of exprparse
-exprparse.o: exprscan.c
+# See notes in src/backend/parser/Makefile about the following two rules
+exprparse.h: exprparse.c
+	touch $@
+
+exprparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+exprparse.o exprscan.o: exprparse.h
 
 distprep: exprparse.c exprscan.c
 
@@ -45,7 +52,7 @@ clean distclean:
 	rm -rf tmp_check
 
 maintainer-clean: distclean
-	rm -f exprparse.c exprscan.c
+	rm -f exprparse.h exprparse.c exprscan.c
 
 check:
 	$(prove_check)
diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y
index b5592d4b97..ade2ecdaab 100644
--- a/src/bin/pgbench/exprparse.y
+++ b/src/bin/pgbench/exprparse.y
@@ -526,18 +526,3 @@ make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else
 					 find_func(yyscanner, "!case_end"),
 					 make_elist(else_part, when_then_list));
 }
-
-/*
- * exprscan.l is compiled as part of exprparse.y.  Currently, this is
- * unavoidable because exprparse does not create a .h file to export
- * its token symbols.  If these files ever grow large enough to be
- * worth compiling separately, that could be fixed; but for now it
- * seems like useless complication.
- */
-
-/* First, get rid of "#define yyscan_t" from pgbench.h */
-#undef yyscan_t
-/* ... and the yylval macro, which flex will have its own definition for */
-#undef yylval
-
-#include "exprscan.c"
diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l
index 4f63818606..fe8e32838a 100644
--- a/src/bin/pgbench/exprscan.l
+++ b/src/bin/pgbench/exprscan.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * exprscan.l
@@ -22,9 +22,19 @@
  *
  *-------------------------------------------------------------------------
  */
+#include "postgres_fe.h"
 
+/*
+ * NB: include exprparse.h only AFTER including pgbench.h, because pgbench.h
+ * contains definitions needed for YYSTYPE. Likewise, pgbench.h must come after
+ * psqlscan_int.h for yyscan_t.
+ */
 #include "fe_utils/psqlscan_int.h"
+#include "pgbench.h"
+#include "exprparse.h"
+}
 
+%{
 /* context information for reporting errors in expressions */
 static const char *expr_source = NULL;
 static int	expr_lineno = 0;
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index cf75e93943..e2c4ba9ae4 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -121,6 +121,7 @@ do
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
 	test "$f" = src/test/isolation/specparse.h && continue
+	test "$f" = src/bin/pgbench/exprparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v3-0006-Build-syncrep_scanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0006-Build-syncrep_scanner.c-standalone.patchDownload
From 5cff476dd0588bc6c1a641990ea5050f0998130b Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 15:02:30 +0700
Subject: [PATCH v3 06/11] Build syncrep_scanner.c standalone

---
 src/backend/Makefile                      |  3 ++-
 src/backend/replication/.gitignore        |  1 +
 src/backend/replication/Makefile          | 11 +++++++++--
 src/backend/replication/syncrep_gram.y    |  2 --
 src/backend/replication/syncrep_scanner.l | 21 +++++++++++++++------
 src/tools/pginclude/headerscheck          |  1 +
 6 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/src/backend/Makefile b/src/backend/Makefile
index f527659a7b..86cbe03677 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -183,7 +183,7 @@ distprep:
 	$(MAKE) -C bootstrap	bootparse.c bootparse.h bootscanner.c
 	$(MAKE) -C catalog	distprep
 	$(MAKE) -C nodes	distprep
-	$(MAKE) -C replication	repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_scanner.c
+	$(MAKE) -C replication	repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_gram.h syncrep_scanner.c
 	$(MAKE) -C storage/lmgr	lwlocknames.h lwlocknames.c
 	$(MAKE) -C utils	distprep
 	$(MAKE) -C utils/adt	jsonpath_gram.c jsonpath_scan.c
@@ -307,6 +307,7 @@ maintainer-clean: distclean
 	      replication/repl_gram.h \
 	      replication/repl_scanner.c \
 	      replication/syncrep_gram.c \
+	      replication/syncrep_gram.h \
 	      replication/syncrep_scanner.c \
 	      storage/lmgr/lwlocknames.c \
 	      storage/lmgr/lwlocknames.h \
diff --git a/src/backend/replication/.gitignore b/src/backend/replication/.gitignore
index a5f600232f..77d5a51068 100644
--- a/src/backend/replication/.gitignore
+++ b/src/backend/replication/.gitignore
@@ -1,5 +1,6 @@
 /repl_gram.h
 /repl_gram.c
 /repl_scanner.c
+/syncrep_gram.h
 /syncrep_gram.c
 /syncrep_scanner.c
diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile
index bc8170418f..23f29ba545 100644
--- a/src/backend/replication/Makefile
+++ b/src/backend/replication/Makefile
@@ -21,6 +21,7 @@ OBJS = \
 	slotfuncs.o \
 	syncrep.o \
 	syncrep_gram.o \
+	syncrep_scanner.o \
 	walreceiver.o \
 	walreceiverfuncs.o \
 	walsender.o
@@ -38,8 +39,14 @@ repl_gram.c: BISONFLAGS += -d
 # Force these dependencies to be known even without dependency info built:
 repl_gram.o repl_scanner.o: repl_gram.h
 
-# syncrep_scanner is compiled as part of syncrep_gram
-syncrep_gram.o: syncrep_scanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+syncrep_gram.h: syncrep_gram.c
+	touch $@
+
+syncrep_gram.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+syncrep_gram.o syncrep_scanner.o: syncrep_gram.h
 
 # repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c
 # are in the distribution tarball, so they are not cleaned here.
diff --git a/src/backend/replication/syncrep_gram.y b/src/backend/replication/syncrep_gram.y
index d932f2cda3..4fc3647da1 100644
--- a/src/backend/replication/syncrep_gram.y
+++ b/src/backend/replication/syncrep_gram.y
@@ -112,5 +112,3 @@ create_syncrep_config(const char *num_sync, List *members, uint8 syncrep_method)
 
 	return config;
 }
-
-#include "syncrep_scanner.c"
diff --git a/src/backend/replication/syncrep_scanner.l b/src/backend/replication/syncrep_scanner.l
index 1952c8c6e0..bdb1a3391c 100644
--- a/src/backend/replication/syncrep_scanner.l
+++ b/src/backend/replication/syncrep_scanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * syncrep_scanner.l
@@ -17,6 +17,15 @@
 
 #include "lib/stringinfo.h"
 
+/*
+ * NB: include syncrep_gram.h only AFTER including syncrep.h, because syncrep.h
+ * includes node definitions needed for YYSTYPE.
+ */
+#include "replication/syncrep.h"
+#include "syncrep_gram.h"
+}
+
+%{
 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
 #undef fprintf
 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
@@ -82,28 +91,28 @@ xdinside		[^"]+
 				appendStringInfoString(&xdbuf, yytext);
 		}
 <xd>{xdstop} {
-				yylval.str = xdbuf.data;
+				syncrep_yylval.str = xdbuf.data;
 				xdbuf.data = NULL;
 				BEGIN(INITIAL);
 				return NAME;
 		}
 <xd><<EOF>> {
-				yyerror("unterminated quoted identifier");
+				syncrep_yyerror("unterminated quoted identifier");
 				return JUNK;
 		}
 
 {identifier} {
-				yylval.str = pstrdup(yytext);
+				syncrep_yylval.str = pstrdup(yytext);
 				return NAME;
 		}
 
 {digit}+	{
-				yylval.str = pstrdup(yytext);
+				syncrep_yylval.str = pstrdup(yytext);
 				return NUM;
 		}
 
 "*"		{
-				yylval.str = "*";
+				syncrep_yylval.str = "*";
 				return NAME;
 		}
 
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index c102adf434..77b697e293 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -119,6 +119,7 @@ do
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
+	test "$f" = src/backend/replication/syncrep_gram.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v3-0009-Build-cubescan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0009-Build-cubescan.c-standalone.patchDownload
From e38e77bd77c803acfc66de8c76798d9d7be67c42 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 11:18:06 +0700
Subject: [PATCH v3 09/11] Build cubescan.c standalone

---
 contrib/cube/.gitignore          |  1 +
 contrib/cube/Makefile            | 16 +++++++++-----
 contrib/cube/cubedata.h          |  1 +
 contrib/cube/cubeparse.y         | 10 +++------
 contrib/cube/cubescan.l          | 38 ++++++++++++++++++++------------
 src/tools/pginclude/headerscheck |  1 +
 6 files changed, 40 insertions(+), 27 deletions(-)

diff --git a/contrib/cube/.gitignore b/contrib/cube/.gitignore
index cb4c989fff..f788440c79 100644
--- a/contrib/cube/.gitignore
+++ b/contrib/cube/.gitignore
@@ -1,3 +1,4 @@
+/cubeparse.h
 /cubeparse.c
 /cubescan.c
 # Generated subdirectories
diff --git a/contrib/cube/Makefile b/contrib/cube/Makefile
index cf195506c7..4fd19aac35 100644
--- a/contrib/cube/Makefile
+++ b/contrib/cube/Makefile
@@ -4,7 +4,8 @@ MODULE_big = cube
 OBJS = \
 	$(WIN32RES) \
 	cube.o \
-	cubeparse.o
+	cubeparse.o \
+	cubescan.o
 
 EXTENSION = cube
 DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql cube--1.4--1.5.sql \
@@ -15,8 +16,6 @@ HEADERS = cubedata.h
 
 REGRESS = cube cube_sci
 
-EXTRA_CLEAN = y.tab.c y.tab.h
-
 SHLIB_LINK += $(filter -lm, $(LIBS))
 
 ifdef USE_PGXS
@@ -30,11 +29,16 @@ include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
+# See notes in src/backend/parser/Makefile about the following two rules
+cubeparse.h: cubeparse.c
+	touch $@
+
+cubeparse.c: BISONFLAGS += -d
 
-# cubescan is compiled as part of cubeparse
-cubeparse.o: cubescan.c
+# Force these dependencies to be known even without dependency info built:
+cubeparse.o cubescan.o: cubeparse.h
 
 distprep: cubeparse.c cubescan.c
 
 maintainer-clean:
-	rm -f cubeparse.c cubescan.c
+	rm -f cubeparse.h cubeparse.c cubescan.c
diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h
index dbe7d4f742..a04fc504ad 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -67,3 +67,4 @@ extern void cube_scanner_finish(void);
 
 /* in cubeparse.y */
 extern int	cube_yyparse(NDBOX **result);
+extern int scanbuflen;
diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y
index 7577c4515c..8e210b49ec 100644
--- a/contrib/cube/cubeparse.y
+++ b/contrib/cube/cubeparse.y
@@ -7,11 +7,9 @@
 #include "postgres.h"
 
 #include "cubedata.h"
+#include "cube_internal.h"
 #include "utils/float.h"
 
-/* All grammar constructs return strings */
-#define YYSTYPE char *
-
 /*
  * Bison doesn't allocate anything that needs to live across parser calls,
  * so we can easily have it use palloc instead of malloc.  This prevents
@@ -23,8 +21,8 @@
 #define YYMALLOC palloc
 #define YYFREE   pfree
 
-static char *scanbuf;
-static int	scanbuflen;
+/* TODO: get rid of global variable */
+int	scanbuflen;
 
 static int item_count(const char *s, char delim);
 static NDBOX *write_box(int dim, char *str1, char *str2);
@@ -265,5 +263,3 @@ write_point_as_box(int dim, char *str)
 
 	return bp;
 }
-
-#include "cubescan.c"
diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l
index bd400e3684..569a4e992e 100644
--- a/contrib/cube/cubescan.l
+++ b/contrib/cube/cubescan.l
@@ -1,9 +1,21 @@
-%{
+%top{
 /*
  * A scanner for EMP-style numeric ranges
  * contrib/cube/cubescan.l
  */
 
+#include "postgres.h"
+
+/*
+ * NB: include cubeparse.h only AFTER including cube_internal.h for YYSTYPE
+ * and cubedata.h for NDBOX.
+ */
+#include "cubedata.h"
+#include "cube_internal.h"
+#include "cubeparse.h"
+}
+
+%{
 /* LCOV_EXCL_START */
 
 /* No reason to constrain amount of data slurped */
@@ -21,9 +33,7 @@ fprintf_to_ereport(const char *fmt, const char *msg)
 
 /* Handles to the buffer that the lexer uses internally */
 static YY_BUFFER_STATE scanbufhandle;
-/* this is now declared in cubeparse.y: */
-/* static char *scanbuf; */
-/* static int	scanbuflen; */
+static char *scanbuf;
 %}
 
 %option 8bit
@@ -45,14 +55,14 @@ NaN          [nN][aA][nN]
 
 %%
 
-{float}      yylval = yytext; return CUBEFLOAT;
-{infinity}   yylval = yytext; return CUBEFLOAT;
-{NaN}        yylval = yytext; return CUBEFLOAT;
-\[           yylval = "("; return O_BRACKET;
-\]           yylval = ")"; return C_BRACKET;
-\(           yylval = "("; return O_PAREN;
-\)           yylval = ")"; return C_PAREN;
-\,           yylval = ","; return COMMA;
+{float}      cube_yylval = yytext; return CUBEFLOAT;
+{infinity}   cube_yylval = yytext; return CUBEFLOAT;
+{NaN}        cube_yylval = yytext; return CUBEFLOAT;
+\[           cube_yylval = "("; return O_BRACKET;
+\]           cube_yylval = ")"; return C_BRACKET;
+\(           cube_yylval = "("; return O_PAREN;
+\)           cube_yylval = ")"; return C_PAREN;
+\,           cube_yylval = ","; return COMMA;
 [ \t\n\r\f]+ /* discard spaces */
 .            return yytext[0]; /* alert parser of the garbage */
 
@@ -62,7 +72,7 @@ NaN          [nN][aA][nN]
 
 /* result is not used, but Bison expects this signature */
 void
-yyerror(NDBOX **result, const char *message)
+cube_yyerror(NDBOX **result, const char *message)
 {
 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 	{
@@ -89,7 +99,7 @@ yyerror(NDBOX **result, const char *message)
 void
 cube_scanner_init(const char *str)
 {
-	Size	slen = strlen(str);
+	Size		slen = strlen(str);
 
 	/*
 	 * Might be left over after ereport()
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index e2c4ba9ae4..a778067570 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -115,6 +115,7 @@ do
 	# We can't make these Bison output files compilable standalone
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
+	test "$f" = contrib/cube/cubeparse.h && continue
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-- 
2.36.1

v3-0010-Build-segscan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0010-Build-segscan.c-standalone.patchDownload
From d687b826a302c0aa7123b1f6bebdef3b9a75d443 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 12:00:33 +0700
Subject: [PATCH v3 10/11] Build segscan.c standalone

---
 contrib/seg/.gitignore           |  1 +
 contrib/seg/Makefile             | 15 +++++++++++----
 contrib/seg/segparse.y           |  3 ---
 contrib/seg/segscan.l            | 28 ++++++++++++++++++----------
 src/tools/pginclude/headerscheck |  1 +
 5 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/contrib/seg/.gitignore b/contrib/seg/.gitignore
index 69e73d2096..fa247a4e67 100644
--- a/contrib/seg/.gitignore
+++ b/contrib/seg/.gitignore
@@ -1,3 +1,4 @@
+/segparse.h
 /segparse.c
 /segscan.c
 # Generated subdirectories
diff --git a/contrib/seg/Makefile b/contrib/seg/Makefile
index bb63e83506..c6c134b8f1 100644
--- a/contrib/seg/Makefile
+++ b/contrib/seg/Makefile
@@ -4,7 +4,8 @@ MODULE_big = seg
 OBJS = \
 	$(WIN32RES) \
 	seg.o \
-	segparse.o
+	segparse.o \
+	segscan.o
 
 EXTENSION = seg
 DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql seg--1.3--1.4.sql \
@@ -29,10 +30,16 @@ include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
 
-# segscan is compiled as part of segparse
-segparse.o: segscan.c
+# See notes in src/backend/parser/Makefile about the following two rules
+segparse.h: segparse.c
+	touch $@
+
+segparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+segparse.o segscan.o: segparse.h
 
 distprep: segparse.c segscan.c
 
 maintainer-clean:
-	rm -f segparse.c segscan.c
+	rm -f segparse.h segparse.c segscan.c
diff --git a/contrib/seg/segparse.y b/contrib/seg/segparse.y
index 33e3a9f35f..637eacd1a6 100644
--- a/contrib/seg/segparse.y
+++ b/contrib/seg/segparse.y
@@ -160,6 +160,3 @@ seg_atof(const char *value)
 	datum = DirectFunctionCall1(float4in, CStringGetDatum(value));
 	return DatumGetFloat4(datum);
 }
-
-
-#include "segscan.c"
diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l
index 5f6595e9eb..4744fd5e9e 100644
--- a/contrib/seg/segscan.l
+++ b/contrib/seg/segscan.l
@@ -1,8 +1,18 @@
-%{
+%top{
 /*
  * A scanner for EMP-style numeric ranges
  */
+#include "postgres.h"
+
+/*
+ * NB: include segparse.h only AFTER including segdata.h, because segdata.h
+ * contains the definition for SEG.
+ */
+#include "segdata.h"
+#include "segparse.h"
+}
 
+%{
 /* LCOV_EXCL_START */
 
 /* No reason to constrain amount of data slurped */
@@ -21,7 +31,6 @@ fprintf_to_ereport(const char *fmt, const char *msg)
 /* Handles to the buffer that the lexer uses internally */
 static YY_BUFFER_STATE scanbufhandle;
 static char *scanbuf;
-static int	scanbuflen;
 %}
 
 %option 8bit
@@ -42,12 +51,12 @@ float        ({integer}|{real})([eE]{integer})?
 
 %%
 
-{range}      yylval.text = yytext; return RANGE;
-{plumin}     yylval.text = yytext; return PLUMIN;
-{float}      yylval.text = yytext; return SEGFLOAT;
-\<           yylval.text = "<"; return EXTENSION;
-\>           yylval.text = ">"; return EXTENSION;
-\~           yylval.text = "~"; return EXTENSION;
+{range}      seg_yylval.text = yytext; return RANGE;
+{plumin}     seg_yylval.text = yytext; return PLUMIN;
+{float}      seg_yylval.text = yytext; return SEGFLOAT;
+\<           seg_yylval.text = "<"; return EXTENSION;
+\>           seg_yylval.text = ">"; return EXTENSION;
+\~           seg_yylval.text = "~"; return EXTENSION;
 [ \t\n\r\f]+ /* discard spaces */
 .            return yytext[0]; /* alert parser of the garbage */
 
@@ -56,7 +65,7 @@ float        ({integer}|{real})([eE]{integer})?
 /* LCOV_EXCL_STOP */
 
 void
-yyerror(SEG *result, const char *message)
+seg_yyerror(SEG *result, const char *message)
 {
 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 	{
@@ -94,7 +103,6 @@ seg_scanner_init(const char *str)
 	/*
 	 * Make a scan buffer with special termination needed by flex.
 	 */
-	scanbuflen = slen;
 	scanbuf = palloc(slen + 2);
 	memcpy(scanbuf, str, slen);
 	scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index a778067570..203703afa7 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -116,6 +116,7 @@ do
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
 	test "$f" = contrib/cube/cubeparse.h && continue
+	test "$f" = contrib/seg/segparse.h && continue
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-- 
2.36.1

v3-0011-Build-jsonpath_scan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v3-0011-Build-jsonpath_scan.c-standalone.patchDownload
From ecf3e99df1c71a579f307a9a7be06e06a88687b5 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 12:35:55 +0700
Subject: [PATCH v3 11/11] Build jsonpath_scan.c standalone

---
 src/backend/utils/adt/.gitignore          |  1 +
 src/backend/utils/adt/Makefile            | 11 ++++++--
 src/backend/utils/adt/jsonpath_gram.y     | 27 +------------------
 src/backend/utils/adt/jsonpath_internal.h | 32 +++++++++++++++++++++++
 src/backend/utils/adt/jsonpath_scan.l     | 29 +++++++++++++-------
 src/tools/pginclude/headerscheck          |  1 +
 6 files changed, 63 insertions(+), 38 deletions(-)
 create mode 100644 src/backend/utils/adt/jsonpath_internal.h

diff --git a/src/backend/utils/adt/.gitignore b/src/backend/utils/adt/.gitignore
index 48cf941a52..7fab054407 100644
--- a/src/backend/utils/adt/.gitignore
+++ b/src/backend/utils/adt/.gitignore
@@ -1,2 +1,3 @@
+/jsonpath_gram.h
 /jsonpath_gram.c
 /jsonpath_scan.c
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
index 7c722ea2ce..0de0bbb1b8 100644
--- a/src/backend/utils/adt/Makefile
+++ b/src/backend/utils/adt/Makefile
@@ -57,6 +57,7 @@ OBJS = \
 	jsonpath.o \
 	jsonpath_exec.o \
 	jsonpath_gram.o \
+	jsonpath_scan.o \
 	like.o \
 	like_support.o \
 	lockfuncs.o \
@@ -119,11 +120,17 @@ OBJS = \
 	xid8funcs.o \
 	xml.o
 
+# See notes in src/backend/parser/Makefile about the following two rules
+jsonpath_gram.h: jsonpath_gram.c
+	touch $@
+
+jsonpath_gram.c: BISONFLAGS += -d
+
 jsonpath_scan.c: FLEXFLAGS = -CF -p -p
 jsonpath_scan.c: FLEX_NO_BACKUP=yes
 
-# jsonpath_scan is compiled as part of jsonpath_gram
-jsonpath_gram.o: jsonpath_scan.c
+# Force these dependencies to be known even without dependency info built:
+jsonpath_gram.o jsonpath_scan.o: jsonpath_gram.h
 
 # jsonpath_gram.c and jsonpath_scan.c are in the distribution tarball,
 # so they are not cleaned here.
diff --git a/src/backend/utils/adt/jsonpath_gram.y b/src/backend/utils/adt/jsonpath_gram.y
index f903dba3e3..e7027595ac 100644
--- a/src/backend/utils/adt/jsonpath_gram.y
+++ b/src/backend/utils/adt/jsonpath_gram.y
@@ -18,26 +18,11 @@
 
 #include "catalog/pg_collation.h"
 #include "fmgr.h"
+#include "jsonpath_internal.h"
 #include "miscadmin.h"
 #include "nodes/pg_list.h"
 #include "regex/regex.h"
 #include "utils/builtins.h"
-#include "utils/jsonpath.h"
-
-/* struct JsonPathString is shared between scan and gram */
-typedef struct JsonPathString
-{
-	char	   *val;
-	int			len;
-	int			total;
-}			JsonPathString;
-
-union YYSTYPE;
-
-/* flex 2.5.4 doesn't bother with a decl for this */
-int	jsonpath_yylex(union YYSTYPE *yylval_param);
-int	jsonpath_yyparse(JsonPathParseResult **result);
-void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
 
 static JsonPathParseItem *makeItemType(JsonPathItemType type);
 static JsonPathParseItem *makeItemString(JsonPathString *s);
@@ -593,13 +578,3 @@ jspConvertRegexFlags(uint32 xflags)
 
 	return cflags;
 }
-
-/*
- * jsonpath_scan.l is compiled as part of jsonpath_gram.y.  Currently, this is
- * unavoidable because jsonpath_gram does not create a .h file to export its
- * token symbols.  If these files ever grow large enough to be worth compiling
- * separately, that could be fixed; but for now it seems like useless
- * complication.
- */
-
-#include "jsonpath_scan.c"
diff --git a/src/backend/utils/adt/jsonpath_internal.h b/src/backend/utils/adt/jsonpath_internal.h
new file mode 100644
index 0000000000..edfc6191a0
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath_internal.h
@@ -0,0 +1,32 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath_internal.h
+ *     Private definitions for jsonpath scanner & parser
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/backend/utils/adt/jsonpath_internal.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef JSONPATH_INTERNAL_H
+#define JSONPATH_INTERNAL_H
+
+/* struct JsonPathString is shared between scan and gram */
+typedef struct JsonPathString
+{
+	char	   *val;
+	int			len;
+	int			total;
+}			JsonPathString;
+
+#include "utils/jsonpath.h"
+#include "jsonpath_gram.h"
+
+extern int     jsonpath_yylex(YYSTYPE *yylval_param);
+extern int     jsonpath_yyparse(JsonPathParseResult **result);
+extern void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
+
+#endif							/* JSONPATH_INTERNAL_H */
diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l
index 4351f6ec98..ea824bae73 100644
--- a/src/backend/utils/adt/jsonpath_scan.l
+++ b/src/backend/utils/adt/jsonpath_scan.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * jsonpath_scan.l
@@ -17,9 +17,18 @@
 
 #include "postgres.h"
 
+/*
+ * NB: include jsonpath_gram.h only AFTER including jsonpath_internal.h,
+ * because jsonpath_internal.h contains the declaration for JsonPathString.
+ */
+#include "jsonpath_internal.h"
+#include "jsonpath_gram.h"
+
 #include "mb/pg_wchar.h"
 #include "nodes/pg_list.h"
+}
 
+%{
 static JsonPathString scanstring;
 
 /* Handles to the buffer that the lexer uses internally */
@@ -142,9 +151,9 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xnq,xq,xvq>{hex_char}		{ parseHexChar(yytext); }
 
-<xnq,xq,xvq>{unicode}*{unicodefail}	{ yyerror(NULL, "invalid unicode sequence"); }
+<xnq,xq,xvq>{unicode}*{unicodefail}	{ jsonpath_yyerror(NULL, "invalid unicode sequence"); }
 
-<xnq,xq,xvq>{hex_fail}		{ yyerror(NULL, "invalid hex character sequence"); }
+<xnq,xq,xvq>{hex_fail}		{ jsonpath_yyerror(NULL, "invalid hex character sequence"); }
 
 <xnq,xq,xvq>{unicode}+\\	{
 								/* throw back the \\, and treat as unicode */
@@ -154,9 +163,9 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xnq,xq,xvq>\\.				{ addchar(false, yytext[1]); }
 
-<xnq,xq,xvq>\\				{ yyerror(NULL, "unexpected end after backslash"); }
+<xnq,xq,xvq>\\				{ jsonpath_yyerror(NULL, "unexpected end after backslash"); }
 
-<xq,xvq><<EOF>>				{ yyerror(NULL, "unexpected end of quoted string"); }
+<xq,xvq><<EOF>>				{ jsonpath_yyerror(NULL, "unexpected end of quoted string"); }
 
 <xq>\"							{
 									yylval->str = scanstring;
@@ -178,7 +187,7 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xc>\*							{ }
 
-<xc><<EOF>>						{ yyerror(NULL, "unexpected end of comment"); }
+<xc><<EOF>>						{ jsonpath_yyerror(NULL, "unexpected end of comment"); }
 
 \&\&							{ return AND_P; }
 
@@ -244,10 +253,10 @@ hex_fail	\\x{hex_dig}{0,1}
 									return INT_P;
 								}
 
-{realfail}						{ yyerror(NULL, "invalid numeric literal"); }
-{integer_junk}					{ yyerror(NULL, "trailing junk after numeric literal"); }
-{decimal_junk}					{ yyerror(NULL, "trailing junk after numeric literal"); }
-{real_junk}						{ yyerror(NULL, "trailing junk after numeric literal"); }
+{realfail}						{ jsonpath_yyerror(NULL, "invalid numeric literal"); }
+{integer_junk}					{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
+{decimal_junk}					{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
+{real_junk}						{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
 
 \"								{
 									addchar(true, '\0');
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 203703afa7..2e90f52c33 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -122,6 +122,7 @@ do
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
+	test "$f" = src/backend/utils/adt/jsonpath_gram.h && continue
 	test "$f" = src/test/isolation/specparse.h && continue
 	test "$f" = src/bin/pgbench/exprparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
-- 
2.36.1

#236Andres Freund
andres@anarazel.de
In reply to: John Naylor (#235)
Re: build remaining Flex files standalone

Hi,

On 2022-08-16 17:41:43 +0700, John Naylor wrote:

For v3, I addressed some comments and added .h files to the
headerscheck exceptions.

Thanks!

/*
* NB: include bootparse.h only AFTER including bootstrap.h, because bootstrap.h
* includes node definitions needed for YYSTYPE.
*/

Future cleanup: I see this in headerscheck:

# We can't make these Bison output files compilable standalone
# without using "%code require", which old Bison versions lack.
# parser/gram.h will be included by parser/gramparse.h anyway.

That directive has been supported in Bison since 2.4.2.

2.4.2 is from 2010. So I think we could just start relying on it?

+/* functions shared between guc.c and guc-file.l */
[...]

I think I prefer your suggestion of a guc_internal.h upthread.

Started in 0002, but left open the headerscheck failure.

Also, if such a thing is meant to be #include'd only by two generated
files, maybe it should just live in the directory where they live, and
not in the src/include dir?

It's not something we've done for the backend afaics, but I don't see a reason
not to start at some point.

From 7d4ecfcb3e91f3b45e94b9e64c7c40f1bbd22aa8 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 15:45:24 +0700
Subject: [PATCH v201 2/9] Build booscanner.c standalone

-# bootscanner is compiled as part of bootparse
-bootparse.o: bootscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+bootparse.h: bootparse.c
+     touch $@
+
+bootparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+bootparse.o bootscan.o: bootparse.h

Wonder if we could / should wrap this is something common. It's somewhat
annoying to repeat this stuff everywhere.

I haven't looked at the Meson effort recently, but if the build rule
is less annoying there, I'm inclined to leave this as a wart until
autotools are retired.

The only complicating thing in the rules there is the dependencies from one .c
file to another .c file.

diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h
index dbe7d4f742..0b373048b5 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -67,3 +67,7 @@ extern void cube_scanner_finish(void);
/* in cubeparse.y */
extern int   cube_yyparse(NDBOX **result);
+
+/* All grammar constructs return strings */
+#define YYSTYPE char *

Why does this need to be defined in a semi-public header? If we do this in
multiple files we'll end up with the danger of macro redefinition warnings.

I tried to put all the Flex/Bison stuff in another *_internal header,
but that breaks the build. Putting just this one symbol in a header is
silly, but done that way for now. Maybe two copies of the symbol?

The problem is that if it's in a header you can't include another header with
such a define. That's fine if it's a .h that's just intended to be included by
a limited set of files, but for something like a header for a datatype that
might need to be included to e.g. define a PL transform or a new operator or
... This would be solved by the %code requires thing, right?

Greetings,

Andres Freund

#237Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#236)
Re: build remaining Flex files standalone

Andres Freund <andres@anarazel.de> writes:

On 2022-08-16 17:41:43 +0700, John Naylor wrote:

That directive has been supported in Bison since 2.4.2.

2.4.2 is from 2010. So I think we could just start relying on it?

Apple is still shipping 2.3. Is this worth enough to make Mac
users install a non-default Bison? I seriously doubt it.

I don't say that there won't be a reason that justifies that
at some point, but letting headerscheck test autogenerated
files seems of only microscopic benefit :-(

regards, tom lane

#238John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#236)
Re: build remaining Flex files standalone

On Wed, Aug 17, 2022 at 8:14 AM Andres Freund <andres@anarazel.de> wrote:

+/* functions shared between guc.c and guc-file.l */
[...]

I think I prefer your suggestion of a guc_internal.h upthread.

Started in 0002, but left open the headerscheck failure.

Also, if such a thing is meant to be #include'd only by two generated
files, maybe it should just live in the directory where they live, and
not in the src/include dir?

It's not something we've done for the backend afaics, but I don't see a reason
not to start at some point.

BTW, I forgot to mention I did this for the json path parser, which
makes the makefile code simpler than what was there before
550b9d26f80fa30. AFAICS, we could also do the same for gramparse.h,
which is internal to parser.c. If I'm not mistaken, the only reason we
symlink gram.h to src/include/* is so that gramparse.h can include it.
So keeping gramparse.h in the backend could allow removing some gram.h
makefile incantations.

Why does this need to be defined in a semi-public header? If we do this in
multiple files we'll end up with the danger of macro redefinition warnings.

I tried to put all the Flex/Bison stuff in another *_internal header,
but that breaks the build. Putting just this one symbol in a header is
silly, but done that way for now. Maybe two copies of the symbol?

The problem is that if it's in a header you can't include another header with
such a define. That's fine if it's a .h that's just intended to be included by
a limited set of files, but for something like a header for a datatype that
might need to be included to e.g. define a PL transform or a new operator or
... This would be solved by the %code requires thing, right?

I believe it would.

--
John Naylor
EDB: http://www.enterprisedb.com

#239Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#225)
7 attachment(s)
Re: [RFC] building postgres with meson - v11

On 11.08.22 02:20, Andres Freund wrote:

Attached is a new version of the meson patchset. Plenty changes:

I have various bits of comments on this.

- There are various references to "pch" (pre-compiled headers). Is
there more discussion anywhere about this? I don't know what this
would entail or whether there are any drawbacks to be aware of. The
new *_pch.h files don't have any comments. Maybe this should be a
separate patch later.

- About relativize_shared_library_references: We have had several
patches over the years for working around SIP stuff, and some of
them did essentially this, but we decided not to go ahead with them.
We could revisit that, but it should be a separate patch, not mixed
in with this.

- postgresql-extension.pc: Similarly, this ought to be a separate
patch. If we want people to use this, we'll need it in the makefile
build system anyway.

- -DFRONTEND is used somewhat differently from the makefiles. For
example, meson sets -DFRONTEND for pg_controldata, but the
makefiles don't. Conversely, the makefiles set -DFRONTEND for
ecpglib, but meson does not. This should be checked again to make
sure it all matches up.

- Option name spelling should be make consistent about underscores
versus hyphens. Built-in meson options use underscores, so we
should make the user-defined ones like that as well (some already
do). (wal-blocksize krb-srvnam system-tzdata tap-tests bsd-auth)

- I have found the variable name "cdata" for configuration_data() to
be less than clear. I see some GNOME projects to it that way, is
that where it's from? systemd uses "conf", maybe that's better.

- In the top-level meson.build, the "renaming" of the Windows system
name

host_system = host_machine.system() == 'windows' ? 'win32' :
host_machine.system()
build_system = build_machine.system() == 'windows' ? 'win32' :
build_machine.system()

seems unnecessary to me. Why not stick with the provided names?

- The c99_test ought to be not needed if the c_std project option is
used. Was there a problem with that?

- Is there a way to split up the top-level meson.build somehow? Maybe
just throw some stuff into included files? This might get out of
hand at some point.

- The PG_SYSROOT detection gives different results. On my system,
configure produces

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk,
meson produces

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk.
src/template/darwin goes out of its way to get a version-specific
result, so we need to carry that over somehow. (The difference does
result in differences in the built binaries.)

Then, some patches from me:

0001-Change-shared-library-installation-naming-on-macOS.patch

This changes the makefiles to make the shared library file naming on
macOS match what meson produces. I don't know what the situation is
on other platforms.

0002-meson-Fix-installation-name-of-libpgfeutils.patch

This was presumably an accidental mistake.

0003-meson-Libraries-need-to-be-built-with-DSO_MAJOR_VERS.patch

This is needed to make NLS work for the libraries.

0004-meson-Add-darwin_versions-argument-for-libraries.patch

This is to make the output match what Makefile.shlib produces.

0005-meson-Fix-link-order-of-support-libraries.patch
0006-meson-Make-link-order-of-external-libraries-match-ma.patch
0007-WIP-meson-Make-link-order-of-object-files-match-make.patch

I have analyzed the produced binaries between both build systems to
make sure they match. If we link the files and libraries in different
orders, that becomes difficult. So this fixes this up a bit. 0005 is
needed for correctness in general, I think. 0006 is mostly cosmetic.
You probably wanted to make the library order alphabetical in the
meson files, which I'd support, but then we should change the
makefiles to match. Similarly, 0007, which is clearly a bit messy at
the moment, but we should try to sort that out either in the old or
the new build files.

And finally some comments on your patches:

meson: prereq: Don't add HAVE_LDAP_H HAVE_WINLDAP_H to pg_config.h.

This can go ahead.

meson: prereq: fix warning compat_informix/rnull.pgc with msvc

-   $float f = 3.71;
+   $float f = (float) 3.71;

This could use float literals like

+ $float f = 3.71f;

Attachments:

0001-Change-shared-library-installation-naming-on-macOS.patchtext/plain; charset=UTF-8; name=0001-Change-shared-library-installation-naming-on-macOS.patchDownload
From 054b24e9ae5fc859f13c05d8150ef1168a477ce4 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:18:52 +0200
Subject: [PATCH 1/7] Change shared library installation naming on macOS

It is not customary to install a shared library with a minor version
number (libpq.5.16.dylib) on macOS.  We just need the file with the
major version number (libpq.5.dylib) and the one without version
number (libpq.dylib).  This also matches the installation layout used
by Meson.
---
 src/Makefile.shlib | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 2af6192f0f..e4658320f8 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -122,7 +122,7 @@ ifeq ($(PORTNAME), darwin)
       version_link	= -compatibility_version $(SO_MAJOR_VERSION) -current_version $(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
     endif
     LINK.shared		= $(COMPILER) -dynamiclib -install_name '$(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)' $(version_link) $(exported_symbols_list) -multiply_defined suppress
-    shlib		= lib$(NAME).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)$(DLSUFFIX)
+    shlib		= lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)
     shlib_major		= lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)
   else
     # loadable module
-- 
2.37.1

0002-meson-Fix-installation-name-of-libpgfeutils.patchtext/plain; charset=UTF-8; name=0002-meson-Fix-installation-name-of-libpgfeutils.patchDownload
From 4344679b986d991527c59003d34528377ece8813 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:20:24 +0200
Subject: [PATCH 2/7] meson: Fix installation name of libpgfeutils

---
 src/fe_utils/meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index bed3ed78b5..aaf48d2e05 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -21,7 +21,7 @@ psqlscan = custom_target('psqlscan',
 generated_sources += psqlscan
 fe_utils_sources += psqlscan
 
-fe_utils = static_library('pgfeutils',
+fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
   c_pch: pch_c_h,
   include_directories :  [postgres_inc, libpq_inc],
-- 
2.37.1

0003-meson-Libraries-need-to-be-built-with-DSO_MAJOR_VERS.patchtext/plain; charset=UTF-8; name=0003-meson-Libraries-need-to-be-built-with-DSO_MAJOR_VERS.patchDownload
From e4d1c1dda523ac52cefaff53b8a968b508dbfa9e Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:21:41 +0200
Subject: [PATCH 3/7] meson: Libraries need to be built with
 -DSO_MAJOR_VERSION=N

This is used by NLS to locate the right catalog file.
---
 src/interfaces/ecpg/compatlib/meson.build  | 1 +
 src/interfaces/ecpg/ecpglib/meson.build    | 1 +
 src/interfaces/ecpg/pgtypeslib/meson.build | 1 +
 src/interfaces/libpq/meson.build           | 2 +-
 4 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 328f33e5de..2022dec571 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -3,6 +3,7 @@ export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
 ecpg_compat = both_libraries('libecpg_compat',
   'informix.c',
   include_directories : ['.', ecpg_inc, postgres_inc, libpq_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
   dependencies: [frontend_shlib_code, thread_dep],
   link_with: [ecpglib, ecpg_pgtypes],
   soversion: host_system != 'win32' ? '3' : '',
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 9914aa936d..18300f3ef0 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -16,6 +16,7 @@ export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
 ecpglib = both_libraries('libecpg',
   ecpglib_sources,
   include_directories : ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=6'],
   dependencies: [frontend_shlib_code, libpq, thread_dep],
   link_with: [ecpg_pgtypes],
   soversion: host_system != 'win32' ? '6' : '',
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 28c4e7314b..a33db144e6 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -12,6 +12,7 @@ export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
 ecpg_pgtypes = both_libraries('libpgtypes',
   ecpg_pgtypes_sources,
   include_directories : ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
   dependencies: [frontend_shlib_code],
   version: '3.'+pg_version_major.to_string(),
   soversion: host_system != 'win32' ? '3' : '',
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bb6a47c5a2..9f29136034 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -48,7 +48,7 @@ endif
 libpq_both = both_libraries('libpq',
   libpq_sources,
   include_directories : [libpq_inc, postgres_inc],
-  c_args: ['-DFRONTEND'],
+  c_args: ['-DFRONTEND', '-DSO_MAJOR_VERSION=5'],
   dependencies: libpq_deps,
   version: '5.'+pg_version_major.to_string(),
   soversion: host_system != 'win32' ? '5' : '' ,
-- 
2.37.1

0004-meson-Add-darwin_versions-argument-for-libraries.patchtext/plain; charset=UTF-8; name=0004-meson-Add-darwin_versions-argument-for-libraries.patchDownload
From e2e7794707aa017193ba66dc6615c98848b6e06c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:22:24 +0200
Subject: [PATCH 4/7] meson: Add darwin_versions argument for libraries

---
 src/interfaces/ecpg/compatlib/meson.build  | 1 +
 src/interfaces/ecpg/ecpglib/meson.build    | 1 +
 src/interfaces/ecpg/pgtypeslib/meson.build | 1 +
 src/interfaces/libpq/meson.build           | 1 +
 4 files changed, 4 insertions(+)

diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 2022dec571..b249459e1f 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -7,6 +7,7 @@ ecpg_compat = both_libraries('libecpg_compat',
   dependencies: [frontend_shlib_code, thread_dep],
   link_with: [ecpglib, ecpg_pgtypes],
   soversion: host_system != 'win32' ? '3' : '',
+  darwin_versions: ['3', '3.'+pg_version_major.to_string()],
   version: '3.'+pg_version_major.to_string(),
   link_args: export_fmt.format(export_file.full_path()),
   link_depends: export_file,
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 18300f3ef0..b9f036a826 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -20,6 +20,7 @@ ecpglib = both_libraries('libecpg',
   dependencies: [frontend_shlib_code, libpq, thread_dep],
   link_with: [ecpg_pgtypes],
   soversion: host_system != 'win32' ? '6' : '',
+  darwin_versions: ['6', '6.'+pg_version_major.to_string()],
   version: '6.'+pg_version_major.to_string(),
   link_args: export_fmt.format(export_file.full_path()),
   link_depends: export_file,
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index a33db144e6..02ae2bcaf9 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -16,6 +16,7 @@ ecpg_pgtypes = both_libraries('libpgtypes',
   dependencies: [frontend_shlib_code],
   version: '3.'+pg_version_major.to_string(),
   soversion: host_system != 'win32' ? '3' : '',
+  darwin_versions: ['3', '3.'+pg_version_major.to_string()],
   link_args: export_fmt.format(export_file.full_path()),
   link_depends: export_file,
   kwargs: default_lib_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 9f29136034..2cc4f5f8c8 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -52,6 +52,7 @@ libpq_both = both_libraries('libpq',
   dependencies: libpq_deps,
   version: '5.'+pg_version_major.to_string(),
   soversion: host_system != 'win32' ? '5' : '' ,
+  darwin_versions: ['5', '5.'+pg_version_major.to_string()],
   link_depends: export_file,
   link_args: export_fmt.format(export_file.full_path()),
   kwargs: default_lib_args,
-- 
2.37.1

0005-meson-Fix-link-order-of-support-libraries.patchtext/plain; charset=UTF-8; name=0005-meson-Fix-link-order-of-support-libraries.patchDownload
From 3f43b456985a59f17053fd33675ab51b66ae6d36 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:27:42 +0200
Subject: [PATCH 5/7] meson: Fix link order of support libraries

---
 meson.build                    | 2 +-
 src/common/unicode/meson.build | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/meson.build b/meson.build
index 2e78583c6c..8833a16a3b 100644
--- a/meson.build
+++ b/meson.build
@@ -2505,7 +2505,7 @@ subdir('src/fe_utils')
 frontend_code = declare_dependency(
   compile_args: ['-DFRONTEND'],
   include_directories: [postgres_inc],
-  link_with: [pgport_static, common_static, fe_utils],
+  link_with: [fe_utils, common_static, pgport_static],
   sources: generated_headers,
   dependencies: [os_deps, libintl],
 )
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
index f37f9077d0..44a6cf77c3 100644
--- a/src/common/unicode/meson.build
+++ b/src/common/unicode/meson.build
@@ -73,7 +73,7 @@ norm_test = executable('norm_test',
   ['norm_test.c', norm_test_table],
   dependencies: [frontend_port_code],
   include_directories: inc,
-  link_with: [pgport_static, common_static],
+  link_with: [common_static, pgport_static],
   build_by_default: false,
   kwargs: default_bin_args + {
     'install': false,
-- 
2.37.1

0006-meson-Make-link-order-of-external-libraries-match-ma.patchtext/plain; charset=UTF-8; name=0006-meson-Make-link-order-of-external-libraries-match-ma.patchDownload
From 3fb7b198bc32f372e0288c89a015de4f3587db7c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:29:01 +0200
Subject: [PATCH 6/7] meson: Make link order of external libraries match
 makefile order

---
 meson.build                       | 2 +-
 src/bin/pg_basebackup/meson.build | 2 +-
 src/bin/pg_rewind/meson.build     | 2 +-
 src/bin/pg_waldump/meson.build    | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/meson.build b/meson.build
index 8833a16a3b..938c87d485 100644
--- a/meson.build
+++ b/meson.build
@@ -2492,10 +2492,10 @@ libpq_deps = [
   frontend_shlib_code,
   thread_dep,
 
+  ssl,
   gssapi,
   ldap,
   libintl,
-  ssl,
 ]
 
 subdir('src/interfaces/libpq')
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index 857e2b77d2..dcaae84b9a 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -10,7 +10,7 @@ common_sources = files(
   'walmethods.c',
 )
 
-pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_deps = [frontend_code, libpq, zstd, lz4, zlib]
 pg_basebackup_common = static_library('libpg_basebackup_common',
   common_sources,
   dependencies: pg_basebackup_deps,
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index 40ae593e7c..bef4bafb4f 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -12,7 +12,7 @@ pg_rewind_sources = files(
 
 pg_rewind = executable('pg_rewind',
   pg_rewind_sources,
-  dependencies: [frontend_code, libpq, lz4, zstd],
+  dependencies: [frontend_code, libpq, zstd, lz4],
   kwargs: default_bin_args,
 )
 
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index e482006264..afa1a269c3 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -10,7 +10,7 @@ pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
 
 pg_waldump = executable('pg_waldump',
   pg_waldump_sources,
-  dependencies: [frontend_code, lz4, zstd],
+  dependencies: [frontend_code, zstd, lz4],
   kwargs: default_bin_args,
 )
 
-- 
2.37.1

0007-WIP-meson-Make-link-order-of-object-files-match-make.patchtext/plain; charset=UTF-8; name=0007-WIP-meson-Make-link-order-of-object-files-match-make.patchDownload
From 2e35b207d2accd69baa2557dd908066cb436bebf Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:31:09 +0200
Subject: [PATCH 7/7] WIP: meson: Make link order of object files match
 makefile order

---
 src/bin/pg_basebackup/meson.build |  2 +-
 src/bin/pg_waldump/Makefile       |  2 +-
 src/common/Makefile               | 17 ++++++++++-------
 src/fe_utils/Makefile             |  2 +-
 src/interfaces/libpq/meson.build  |  4 ++--
 src/port/Makefile                 |  6 +++---
 6 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index dcaae84b9a..dd388d8a1e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -3,8 +3,8 @@ common_sources = files(
   'bbstreamer_gzip.c',
   'bbstreamer_inject.c',
   'bbstreamer_lz4.c',
-  'bbstreamer_tar.c',
   'bbstreamer_zstd.c',
+  'bbstreamer_tar.c',
   'receivelog.c',
   'streamutil.c',
   'walmethods.c',
diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile
index d6459e17c7..53c602c3ca 100644
--- a/src/bin/pg_waldump/Makefile
+++ b/src/bin/pg_waldump/Makefile
@@ -8,11 +8,11 @@ top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
 OBJS = \
-	$(RMGRDESCOBJS) \
 	$(WIN32RES) \
 	compat.o \
 	pg_waldump.o \
 	rmgrdesc.o \
+	$(RMGRDESCOBJS) \
 	xlogreader.o \
 	xlogstats.o
 
diff --git a/src/common/Makefile b/src/common/Makefile
index e9af7346c9..05ea957861 100644
--- a/src/common/Makefile
+++ b/src/common/Makefile
@@ -50,12 +50,9 @@ OBJS_COMMON = \
 	base64.o \
 	checksum_helper.o \
 	compression.o \
-	config_info.o \
 	controldata_utils.o \
-	d2s.o \
 	encnames.o \
 	exec.o \
-	f2s.o \
 	file_perm.o \
 	file_utils.o \
 	hashfn.o \
@@ -83,9 +80,9 @@ OBJS_COMMON = \
 
 ifeq ($(with_ssl),openssl)
 OBJS_COMMON += \
-	protocol_openssl.o \
 	cryptohash_openssl.o \
-	hmac_openssl.o
+	hmac_openssl.o \
+	protocol_openssl.o
 else
 OBJS_COMMON += \
 	cryptohash.o \
@@ -95,6 +92,11 @@ OBJS_COMMON += \
 	sha2.o
 endif
 
+OBJS_EXTRA = \
+	d2s.o \
+	f2s.o \
+	config_info.o
+
 # A few files are currently only built for frontend, not server
 # (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
 # from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
@@ -104,14 +106,15 @@ OBJS_FRONTEND_SHLIB = \
 	$(OBJS_COMMON) \
 	fe_memutils.o \
 	restricted_token.o \
-	sprompt.o
+	sprompt.o \
+	$(OBJS_EXTRA)
 OBJS_FRONTEND = \
 	$(OBJS_FRONTEND_SHLIB) \
 	logging.o
 
 # foo.o, foo_shlib.o, and foo_srv.o are all built from foo.c
 OBJS_SHLIB = $(OBJS_FRONTEND_SHLIB:%.o=%_shlib.o)
-OBJS_SRV = $(OBJS_COMMON:%.o=%_srv.o)
+OBJS_SRV = $(OBJS_COMMON:%.o=%_srv.o) $(OBJS_EXTRA:%.o=%_srv.o)
 
 # where to find gen_keywordlist.pl and subsidiary files
 TOOLSDIR = $(top_srcdir)/src/tools
diff --git a/src/fe_utils/Makefile b/src/fe_utils/Makefile
index 44bc7a1215..ab750d336a 100644
--- a/src/fe_utils/Makefile
+++ b/src/fe_utils/Makefile
@@ -20,6 +20,7 @@ include $(top_builddir)/src/Makefile.global
 override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS)
 
 OBJS = \
+	psqlscan.o \
 	archive.o \
 	cancel.o \
 	conditional.o \
@@ -28,7 +29,6 @@ OBJS = \
 	option_utils.o \
 	parallel_slot.o \
 	print.o \
-	psqlscan.o \
 	query_utils.o \
 	recovery_gen.o \
 	simple_list.o \
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 2cc4f5f8c8..0a78a498c7 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -28,8 +28,8 @@ endif
 
 if gssapi.found()
   libpq_sources += files(
-    'fe-secure-gssapi.c',
-    'fe-gssapi-common.c'
+    'fe-gssapi-common.c',
+    'fe-secure-gssapi.c'
   )
 endif
 
diff --git a/src/port/Makefile b/src/port/Makefile
index b3754d8940..d8da9d77b6 100644
--- a/src/port/Makefile
+++ b/src/port/Makefile
@@ -38,8 +38,6 @@ LIBS += $(PTHREAD_LIBS)
 # If you add objects here, see also src/tools/msvc/Mkvcbuild.pm
 
 OBJS = \
-	$(LIBOBJS) \
-	$(PG_CRC32C_OBJS) \
 	bsearch_arg.o \
 	chklocale.o \
 	inet_net_ntop.o \
@@ -59,7 +57,9 @@ OBJS = \
 	snprintf.o \
 	strerror.o \
 	tar.o \
-	thread.o
+	thread.o \
+	$(LIBOBJS) \
+	$(PG_CRC32C_OBJS)
 
 # libpgport.a, libpgport_shlib.a, and libpgport_srv.a contain the same files
 # foo.o, foo_shlib.o, and foo_srv.o are all built from foo.c
-- 
2.37.1

#240Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#239)
Re: [RFC] building postgres with meson - v11

Hi,

On 2022-08-17 15:50:23 +0200, Peter Eisentraut wrote:

- There are various references to "pch" (pre-compiled headers). Is
there more discussion anywhere about this? I don't know what this
would entail or whether there are any drawbacks to be aware of. The
new *_pch.h files don't have any comments. Maybe this should be a
separate patch later.

It's mainly to make windows builds a bit slower. I've no objection to
separating this out.

- About relativize_shared_library_references: We have had several
patches over the years for working around SIP stuff, and some of
them did essentially this, but we decided not to go ahead with them.
We could revisit that, but it should be a separate patch, not mixed
in with this.

The prior approaches all had issues because they didn't support relative
references IIRC (and thus broke being able to relocate the installation),
which this does.

I just found it very annoying to work on macs without this. And there were at
least two "bug" reports of testers of the meson branch that were just due to
SIP.

I'm ok with splitting it out, but I also think it's a lower risk opportunity
to test that this works.

- postgresql-extension.pc: Similarly, this ought to be a separate
patch. If we want people to use this, we'll need it in the makefile
build system anyway.

Makes sense. I'd like to keep it in the same patch for a short while longer,
to deduplicate some of the code, but then will split it out.

- -DFRONTEND is used somewhat differently from the makefiles. For
example, meson sets -DFRONTEND for pg_controldata, but the
makefiles don't. Conversely, the makefiles set -DFRONTEND for
ecpglib, but meson does not. This should be checked again to make
sure it all matches up.

Yes, should sync that up.

FWIW, meson does add -DFRONTEND for ecpglib. There were a few places that did
add it twice, I'll push a cleanup of that in a bit.

- Option name spelling should be make consistent about underscores
versus hyphens. Built-in meson options use underscores, so we
should make the user-defined ones like that as well (some already
do). (wal-blocksize krb-srvnam system-tzdata tap-tests bsd-auth)

No objection.

- I have found the variable name "cdata" for configuration_data() to
be less than clear. I see some GNOME projects to it that way, is
that where it's from? systemd uses "conf", maybe that's better.

I don't know where it's from - I don't think I ever looked at gnome
buildsystem stuff. It seems to be the obvious abbreviation for
configuration_data()... I don't object to conf, but it's not a clear
improvement to me.

- In the top-level meson.build, the "renaming" of the Windows system
name

host_system = host_machine.system() == 'windows' ? 'win32' :
host_machine.system()
build_system = build_machine.system() == 'windows' ? 'win32' :
build_machine.system()

seems unnecessary to me. Why not stick with the provided names?

Because right now we also use it for things like choosing the "source" for
pg_config_os.h (i.e. include/port/{darwin,linux,win32,..}.h). And it seemed
easier to just have one variable name for all of it.

- The c99_test ought to be not needed if the c_std project option is
used. Was there a problem with that?

We don't want to force -std=c99 when not necessary, I think. We sometimes use
features from newer (and from gnu) language versions after testing
availability, and if we hardcode the version those will either fail or elicit
warnings.

- Is there a way to split up the top-level meson.build somehow? Maybe
just throw some stuff into included files? This might get out of
hand at some point.

We can put stuff into config/meson.build or such. But I don't think it's
clearly warranted at this point.

- The PG_SYSROOT detection gives different results. On my system,
configure produces

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk,
meson produces

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk.
src/template/darwin goes out of its way to get a version-specific
result, so we need to carry that over somehow. (The difference does
result in differences in the built binaries.)

TBH, I don't really understand the SYSROOT stuff all that well, never having
used a mac in anger (well, only in anger, but ...).

What do you think about extracting the relevant portion of src/template/darwin
into a dedicated shell script that gets called by both?

Then, some patches from me:

0001-Change-shared-library-installation-naming-on-macOS.patch

This changes the makefiles to make the shared library file naming on
macOS match what meson produces. I don't know what the situation is
on other platforms.

No opinion on the matter. Seems best to apply separately if we want to?

0002-meson-Fix-installation-name-of-libpgfeutils.patch

This was presumably an accidental mistake.

Yes, merged.

0003-meson-Libraries-need-to-be-built-with-DSO_MAJOR_VERS.patch

This is needed to make NLS work for the libraries.

Oh, huh. Yes, merged.

0004-meson-Add-darwin_versions-argument-for-libraries.patch

This is to make the output match what Makefile.shlib produces.

:/, merged. Would be good to clean up at some point.

0005-meson-Fix-link-order-of-support-libraries.patch
0006-meson-Make-link-order-of-external-libraries-match-ma.patch
0007-WIP-meson-Make-link-order-of-object-files-match-make.patch

I have analyzed the produced binaries between both build systems to
make sure they match. If we link the files and libraries in different
orders, that becomes difficult. So this fixes this up a bit. 0005 is
needed for correctness in general, I think.

Makes sense.

0006 is mostly cosmetic. You probably wanted to make the library order
alphabetical in the meson files, which I'd support, but then we should
change the makefiles to match.

Trying to match makefile order doesn't seem like a good plan, given that it's
effectively random, and might change depending on dependencies of linked to
libraries etc.

Isn't the use of AC_CHECK_LIB for at least lz4, zstd completely bogus? We get
whether they're available via pkg-config, but then completely ignore the
linker flag for the library name. The comment says:
# We only care about -I, -D, and -L switches;
# note that -llz4 will be added by AC_CHECK_LIB below.
but without any further explanation. This seems to be from 4d399a6fbeb.

The repetition of lz4, zstd in pg_rewind, pg_waldump and backend makes me
wonder if we should put them in a xlogreader_deps or such. It's otherwise not
obvious why pg_rewind, pg_waldump need lz4/zstd.

Similarly, 0007, which is clearly a bit
messy at the moment, but we should try to sort that out either in the old or
the new build files.

I am against trying to maintain bug-for-bug compatibility on filename
ordering. But obviously ok with fixing the ordering to make sense on both
sides.

What was your decision point about when to adjust makefile ordering and when
meson ordering?

And finally some comments on your patches:

Any comment on the pg_regress_ecpg commit? I'd like to get that out of the
way, and it seems considerably cleaner than the hackery we do right now to
make VPATH builds work.

meson: prereq: Don't add HAVE_LDAP_H HAVE_WINLDAP_H to pg_config.h.

This can go ahead.

meson: prereq: fix warning compat_informix/rnull.pgc with msvc

-   $float f = 3.71;
+   $float f = (float) 3.71;

This could use float literals like

+ $float f = 3.71f;

I tried that first, but it fails:
../src/interfaces/ecpg/test/compat_informix/rnull.pgc:19: ERROR: trailing junk after numeric literal

Should have noted that. I don't feel like fixing ecpg's parser etc...

Greetings,

Andres Freund

#241John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#236)
Re: build remaining Flex files standalone

On Wed, Aug 17, 2022 at 8:14 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-08-16 17:41:43 +0700, John Naylor wrote:

For v3, I addressed some comments and added .h files to the
headerscheck exceptions.

Thanks!

/*
* NB: include bootparse.h only AFTER including bootstrap.h, because bootstrap.h
* includes node definitions needed for YYSTYPE.
*/

Future cleanup: I see this in headerscheck:

# We can't make these Bison output files compilable standalone
# without using "%code require", which old Bison versions lack.
# parser/gram.h will be included by parser/gramparse.h anyway.

That directive has been supported in Bison since 2.4.2.

2.4.2 is from 2010. So I think we could just start relying on it?

+/* functions shared between guc.c and guc-file.l */
[...]

I think I prefer your suggestion of a guc_internal.h upthread.

Started in 0002, but left open the headerscheck failure.

Also, if such a thing is meant to be #include'd only by two generated
files, maybe it should just live in the directory where they live, and
not in the src/include dir?

It's not something we've done for the backend afaics, but I don't see a reason
not to start at some point.

From 7d4ecfcb3e91f3b45e94b9e64c7c40f1bbd22aa8 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 15:45:24 +0700
Subject: [PATCH v201 2/9] Build booscanner.c standalone

-# bootscanner is compiled as part of bootparse
-bootparse.o: bootscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+bootparse.h: bootparse.c
+     touch $@
+
+bootparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+bootparse.o bootscan.o: bootparse.h

Wonder if we could / should wrap this is something common. It's somewhat
annoying to repeat this stuff everywhere.

I haven't looked at the Meson effort recently, but if the build rule
is less annoying there, I'm inclined to leave this as a wart until
autotools are retired.

The only complicating thing in the rules there is the dependencies from one .c
file to another .c file.

diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h
index dbe7d4f742..0b373048b5 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -67,3 +67,7 @@ extern void cube_scanner_finish(void);
/* in cubeparse.y */
extern int   cube_yyparse(NDBOX **result);
+
+/* All grammar constructs return strings */
+#define YYSTYPE char *

Why does this need to be defined in a semi-public header? If we do this in
multiple files we'll end up with the danger of macro redefinition warnings.

For v4, I #defined YYSTYPE

--
John Naylor
EDB: http://www.enterprisedb.com

#242John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#241)
11 attachment(s)
Re: build remaining Flex files standalone
index dbe7d4f742..0b373048b5 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -67,3 +67,7 @@ extern void cube_scanner_finish(void);
/* in cubeparse.y */
extern int   cube_yyparse(NDBOX **result);
+
+/* All grammar constructs return strings */
+#define YYSTYPE char *

Why does this need to be defined in a semi-public header? If we do this in
multiple files we'll end up with the danger of macro redefinition warnings.

For v4, I #defined YYSTYPE

Sorry for the misfire. Continuing on, I #defined YYSTYPE in cubescan.l
before #including cubeparse.h.

I also added scanbuflen to the %parse-param to prevent resorting to a
global variable. The rest of the patches are unchanged.

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v4-0003-Build-guc-file.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0003-Build-guc-file.c-standalone.patchDownload
From 65c0203bac3abf127a5900f1a0025b7a62a52d70 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Thu, 11 Aug 2022 19:38:37 +0700
Subject: [PATCH v4 03/11] Build guc-file.c standalone

The proposed Meson build system will need a way to ignore certain
generated files in order to coexist with the autoconf build system,
and #include'd C files generated by Flex make this more difficult.
Build guc-file.c separately from guc.c, as was done in 72b1e3a21.

Reviewed by Andres Freund
Discussion: https://www.postgresql.org/message-id/20220810171935.7k5zgnjwqzalzmtm%40awork3.anarazel.de
---
 src/backend/utils/misc/Makefile   | 5 +----
 src/backend/utils/misc/guc-file.l | 9 +++++----
 src/backend/utils/misc/guc.c      | 2 --
 3 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 1d5327cf64..cf7ce9bc83 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	guc.o \
+	guc-file.o \
 	help_config.o \
 	pg_config.o \
 	pg_controldata.o \
@@ -37,10 +38,6 @@ endif
 
 include $(top_srcdir)/src/backend/common.mk
 
-# guc-file is compiled as part of guc
-guc.o: guc-file.c
-
 # Note: guc-file.c is not deleted by 'make clean',
 # since we want to ship it in distribution tarballs.
 clean:
-	@rm -f lex.yy.c
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index 843838b1df..9aa3abe1ba 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -1,4 +1,4 @@
-/* -*-pgsql-c-*- */
+%top{
 /*
  * Scanner for the configuration file
  *
@@ -7,8 +7,6 @@
  * src/backend/utils/misc/guc-file.l
  */
 
-%{
-
 #include "postgres.h"
 
 #include <ctype.h>
@@ -17,10 +15,13 @@
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 #include "storage/fd.h"
+#include <sys/stat.h>
 #include "utils/guc.h"
 #include "utils/guc_internal.h"
+#include "utils/memutils.h"
+}
 
-
+%{
 /*
  * flex emits a yy_fatal_error() function that it calls in response to
  * critical errors like malloc failure, file I/O errors, and detection of
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 293834fc13..92b5b18c8f 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -13333,5 +13333,3 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
 
 	return true;
 }
-
-#include "guc-file.c"
-- 
2.36.1

v4-0005-Build-repl_scanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0005-Build-repl_scanner.c-standalone.patchDownload
From 67d63a9e186e6e393e344627c5b70f2dd7b8609e Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 17:09:45 +0700
Subject: [PATCH v4 05/11] Build repl_scanner.c standalone

---
 src/backend/Makefile                   |  3 ++-
 src/backend/replication/.gitignore     |  1 +
 src/backend/replication/Makefile       | 11 +++++++--
 src/backend/replication/repl_gram.y    |  2 --
 src/backend/replication/repl_scanner.l | 31 +++++++++++++++++---------
 src/tools/pginclude/headerscheck       |  1 +
 6 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/backend/Makefile b/src/backend/Makefile
index 5a12666918..f527659a7b 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -183,7 +183,7 @@ distprep:
 	$(MAKE) -C bootstrap	bootparse.c bootparse.h bootscanner.c
 	$(MAKE) -C catalog	distprep
 	$(MAKE) -C nodes	distprep
-	$(MAKE) -C replication	repl_gram.c repl_scanner.c syncrep_gram.c syncrep_scanner.c
+	$(MAKE) -C replication	repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_scanner.c
 	$(MAKE) -C storage/lmgr	lwlocknames.h lwlocknames.c
 	$(MAKE) -C utils	distprep
 	$(MAKE) -C utils/adt	jsonpath_gram.c jsonpath_scan.c
@@ -304,6 +304,7 @@ maintainer-clean: distclean
 	      parser/gram.h \
 	      parser/scan.c \
 	      replication/repl_gram.c \
+	      replication/repl_gram.h \
 	      replication/repl_scanner.c \
 	      replication/syncrep_gram.c \
 	      replication/syncrep_scanner.c \
diff --git a/src/backend/replication/.gitignore b/src/backend/replication/.gitignore
index d1df6147bd..a5f600232f 100644
--- a/src/backend/replication/.gitignore
+++ b/src/backend/replication/.gitignore
@@ -1,3 +1,4 @@
+/repl_gram.h
 /repl_gram.c
 /repl_scanner.c
 /syncrep_gram.c
diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile
index 2bffac58c0..bc8170418f 100644
--- a/src/backend/replication/Makefile
+++ b/src/backend/replication/Makefile
@@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	repl_gram.o \
+	repl_scanner.o \
 	slot.o \
 	slotfuncs.o \
 	syncrep.o \
@@ -28,8 +29,14 @@ SUBDIRS = logical
 
 include $(top_srcdir)/src/backend/common.mk
 
-# repl_scanner is compiled as part of repl_gram
-repl_gram.o: repl_scanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+repl_gram.h: repl_gram.c
+	touch $@
+
+repl_gram.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+repl_gram.o repl_scanner.o: repl_gram.h
 
 # syncrep_scanner is compiled as part of syncrep_gram
 syncrep_gram.o: syncrep_scanner.c
diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y
index 4cf087e602..b343f108d3 100644
--- a/src/backend/replication/repl_gram.y
+++ b/src/backend/replication/repl_gram.y
@@ -416,5 +416,3 @@ ident_or_keyword:
 		;
 
 %%
-
-#include "repl_scanner.c"
diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l
index 586f0d3a5c..23fcb2a11d 100644
--- a/src/backend/replication/repl_scanner.l
+++ b/src/backend/replication/repl_scanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * repl_scanner.l
@@ -18,6 +18,15 @@
 #include "utils/builtins.h"
 #include "parser/scansup.h"
 
+/*
+ * NB: include repl_gram.h only AFTER including walsender_private.h, because
+ * walsender_private includes headers that define XLogRecPtr.
+ */
+#include "replication/walsender_private.h"
+#include "repl_gram.h"
+}
+
+%{
 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
 #undef fprintf
 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
@@ -130,7 +139,7 @@ WAIT				{ return K_WAIT; }
 {space}+		{ /* do nothing */ }
 
 {digit}+		{
-					yylval.uintval = strtoul(yytext, NULL, 10);
+					replication_yylval.uintval = strtoul(yytext, NULL, 10);
 					return UCONST;
 				}
 
@@ -138,8 +147,8 @@ WAIT				{ return K_WAIT; }
 					uint32	hi,
 							lo;
 					if (sscanf(yytext, "%X/%X", &hi, &lo) != 2)
-						yyerror("invalid streaming start location");
-					yylval.recptr = ((uint64) hi) << 32 | lo;
+						replication_yyerror("invalid streaming start location");
+					replication_yylval.recptr = ((uint64) hi) << 32 | lo;
 					return RECPTR;
 				}
 
@@ -151,7 +160,7 @@ WAIT				{ return K_WAIT; }
 <xq>{quotestop}	{
 					yyless(1);
 					BEGIN(INITIAL);
-					yylval.str = litbufdup();
+					replication_yylval.str = litbufdup();
 					return SCONST;
 				}
 
@@ -173,9 +182,9 @@ WAIT				{ return K_WAIT; }
 
 					yyless(1);
 					BEGIN(INITIAL);
-					yylval.str = litbufdup();
-					len = strlen(yylval.str);
-					truncate_identifier(yylval.str, len, true);
+					replication_yylval.str = litbufdup();
+					len = strlen(replication_yylval.str);
+					truncate_identifier(replication_yylval.str, len, true);
 					return IDENT;
 				}
 
@@ -186,7 +195,7 @@ WAIT				{ return K_WAIT; }
 {identifier}	{
 					int			len = strlen(yytext);
 
-					yylval.str = downcase_truncate_identifier(yytext, len, true);
+					replication_yylval.str = downcase_truncate_identifier(yytext, len, true);
 					return IDENT;
 				}
 
@@ -195,7 +204,7 @@ WAIT				{ return K_WAIT; }
 					return yytext[0];
 				}
 
-<xq,xd><<EOF>>	{ yyerror("unterminated quoted string"); }
+<xq,xd><<EOF>>	{ replication_yyerror("unterminated quoted string"); }
 
 
 <<EOF>>			{
@@ -231,7 +240,7 @@ addlitchar(unsigned char ychar)
 }
 
 void
-yyerror(const char *message)
+replication_yyerror(const char *message)
 {
 	ereport(ERROR,
 			(errcode(ERRCODE_SYNTAX_ERROR),
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index ce33ec1f68..917ef29c15 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -120,6 +120,7 @@ do
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
+	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v4-0004-Build-bootscanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0004-Build-bootscanner.c-standalone.patchDownload
From e85b6441ca47566f8edd933e4145bfb2c8f553fa Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 12 Aug 2022 15:45:24 +0700
Subject: [PATCH v4 04/11] Build bootscanner.c standalone

---
 src/backend/Makefile                |  3 +-
 src/backend/bootstrap/.gitignore    |  1 +
 src/backend/bootstrap/Makefile      | 11 +++++-
 src/backend/bootstrap/bootparse.y   |  2 -
 src/backend/bootstrap/bootscanner.l | 60 ++++++++++++++++-------------
 src/tools/pginclude/headerscheck    |  1 +
 6 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/src/backend/Makefile b/src/backend/Makefile
index 3f01c65592..5a12666918 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -180,7 +180,7 @@ utils/probes.o: utils/probes.d $(SUBDIROBJS)
 # Be sure that these files get removed by the maintainer-clean target
 distprep:
 	$(MAKE) -C parser	gram.c gram.h scan.c
-	$(MAKE) -C bootstrap	bootparse.c bootscanner.c
+	$(MAKE) -C bootstrap	bootparse.c bootparse.h bootscanner.c
 	$(MAKE) -C catalog	distprep
 	$(MAKE) -C nodes	distprep
 	$(MAKE) -C replication	repl_gram.c repl_scanner.c syncrep_gram.c syncrep_scanner.c
@@ -298,6 +298,7 @@ maintainer-clean: distclean
 	$(MAKE) -C nodes $@
 	$(MAKE) -C utils $@
 	rm -f bootstrap/bootparse.c \
+	      bootstrap/bootparse.h \
 	      bootstrap/bootscanner.c \
 	      parser/gram.c \
 	      parser/gram.h \
diff --git a/src/backend/bootstrap/.gitignore b/src/backend/bootstrap/.gitignore
index 1ffe8ca39e..6351b920fd 100644
--- a/src/backend/bootstrap/.gitignore
+++ b/src/backend/bootstrap/.gitignore
@@ -1,2 +1,3 @@
+/bootparse.h
 /bootparse.c
 /bootscanner.c
diff --git a/src/backend/bootstrap/Makefile b/src/backend/bootstrap/Makefile
index 6421efb227..606c8021e7 100644
--- a/src/backend/bootstrap/Makefile
+++ b/src/backend/bootstrap/Makefile
@@ -14,12 +14,19 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
 OBJS = \
 	bootparse.o \
+	bootscanner.o \
 	bootstrap.o
 
 include $(top_srcdir)/src/backend/common.mk
 
-# bootscanner is compiled as part of bootparse
-bootparse.o: bootscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+bootparse.h: bootparse.c
+	touch $@
+
+bootparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+bootparse.o bootscanner.o: bootparse.h
 
 # bootparse.c and bootscanner.c are in the distribution tarball, so
 # they are not cleaned here.
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index 7d7655d295..c45ddde67f 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -488,5 +488,3 @@ boot_ident:
 		| XNULL			{ $$ = pstrdup($1); }
 		;
 %%
-
-#include "bootscanner.c"
diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l
index 3094ccb93f..d6eae84816 100644
--- a/src/backend/bootstrap/bootscanner.l
+++ b/src/backend/bootstrap/bootscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * bootscanner.l
@@ -15,11 +15,17 @@
  */
 #include "postgres.h"
 
+/*
+ * NB: include bootparse.h only AFTER including bootstrap.h, because bootstrap.h
+ * includes node definitions needed for YYSTYPE.
+ */
 #include "bootstrap/bootstrap.h"
+#include "bootparse.h"
 #include "utils/guc.h"
 
-/* Not needed now that this file is compiled as part of bootparse. */
-/* #include "bootparse.h" */
+}
+
+%{
 
 /* LCOV_EXCL_START */
 
@@ -52,7 +58,7 @@ id		[-A-Za-z0-9_]+
 sid		\'([^']|\'\')*\'
 
 /*
- * Keyword tokens return the keyword text (as a constant string) in yylval.kw,
+ * Keyword tokens return the keyword text (as a constant string) in boot_yylval.kw,
  * just in case that's needed because we want to treat the keyword as an
  * unreserved identifier.  Note that _null_ is not treated as a keyword
  * for this purpose; it's the one "reserved word" in the bootstrap syntax.
@@ -60,23 +66,23 @@ sid		\'([^']|\'\')*\'
  * Notice that all the keywords are case-sensitive, and for historical
  * reasons some must be upper case.
  *
- * String tokens return a palloc'd string in yylval.str.
+ * String tokens return a palloc'd string in boot_yylval.str.
  */
 
 %%
 
-open			{ yylval.kw = "open"; return OPEN; }
+open			{ boot_yylval.kw = "open"; return OPEN; }
 
-close			{ yylval.kw = "close"; return XCLOSE; }
+close			{ boot_yylval.kw = "close"; return XCLOSE; }
 
-create			{ yylval.kw = "create"; return XCREATE; }
+create			{ boot_yylval.kw = "create"; return XCREATE; }
 
-OID				{ yylval.kw = "OID"; return OBJ_ID; }
-bootstrap		{ yylval.kw = "bootstrap"; return XBOOTSTRAP; }
-shared_relation	{ yylval.kw = "shared_relation"; return XSHARED_RELATION; }
-rowtype_oid		{ yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
+OID				{ boot_yylval.kw = "OID"; return OBJ_ID; }
+bootstrap		{ boot_yylval.kw = "bootstrap"; return XBOOTSTRAP; }
+shared_relation	{ boot_yylval.kw = "shared_relation"; return XSHARED_RELATION; }
+rowtype_oid		{ boot_yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
 
-insert			{ yylval.kw = "insert"; return INSERT_TUPLE; }
+insert			{ boot_yylval.kw = "insert"; return INSERT_TUPLE; }
 
 _null_			{ return NULLVAL; }
 
@@ -90,25 +96,25 @@ _null_			{ return NULLVAL; }
 
 ^\#[^\n]*		;		/* drop everything after "#" for comments */
 
-declare			{ yylval.kw = "declare"; return XDECLARE; }
-build			{ yylval.kw = "build"; return XBUILD; }
-indices			{ yylval.kw = "indices"; return INDICES; }
-unique			{ yylval.kw = "unique"; return UNIQUE; }
-index			{ yylval.kw = "index"; return INDEX; }
-on				{ yylval.kw = "on"; return ON; }
-using			{ yylval.kw = "using"; return USING; }
-toast			{ yylval.kw = "toast"; return XTOAST; }
-FORCE			{ yylval.kw = "FORCE"; return XFORCE; }
-NOT				{ yylval.kw = "NOT"; return XNOT; }
-NULL			{ yylval.kw = "NULL"; return XNULL; }
+declare			{ boot_yylval.kw = "declare"; return XDECLARE; }
+build			{ boot_yylval.kw = "build"; return XBUILD; }
+indices			{ boot_yylval.kw = "indices"; return INDICES; }
+unique			{ boot_yylval.kw = "unique"; return UNIQUE; }
+index			{ boot_yylval.kw = "index"; return INDEX; }
+on				{ boot_yylval.kw = "on"; return ON; }
+using			{ boot_yylval.kw = "using"; return USING; }
+toast			{ boot_yylval.kw = "toast"; return XTOAST; }
+FORCE			{ boot_yylval.kw = "FORCE"; return XFORCE; }
+NOT				{ boot_yylval.kw = "NOT"; return XNOT; }
+NULL			{ boot_yylval.kw = "NULL"; return XNULL; }
 
 {id}			{
-					yylval.str = pstrdup(yytext);
+					boot_yylval.str = pstrdup(yytext);
 					return ID;
 				}
 {sid}			{
 					/* strip quotes and escapes */
-					yylval.str = DeescapeQuotedString(yytext);
+					boot_yylval.str = DeescapeQuotedString(yytext);
 					return ID;
 				}
 
@@ -121,7 +127,7 @@ NULL			{ yylval.kw = "NULL"; return XNULL; }
 /* LCOV_EXCL_STOP */
 
 void
-yyerror(const char *message)
+boot_yyerror(const char *message)
 {
 	elog(ERROR, "%s at line %d", message, yyline);
 }
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index b8419e46a4..ce33ec1f68 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -119,6 +119,7 @@ do
 	# parser/gram.h will be included by parser/gramparse.h anyway.
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
+	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v4-0008-Build-exprscan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0008-Build-exprscan.c-standalone.patchDownload
From 8a39bfb75a69847dd6d1839091f71f36fc9579ba Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 13:35:14 +0700
Subject: [PATCH v4 08/11] Build exprscan.c standalone

---
 src/bin/pgbench/.gitignore       |  1 +
 src/bin/pgbench/Makefile         | 13 ++++++++++---
 src/bin/pgbench/exprparse.y      | 15 ---------------
 src/bin/pgbench/exprscan.l       | 12 +++++++++++-
 src/tools/pginclude/headerscheck |  1 +
 5 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/src/bin/pgbench/.gitignore b/src/bin/pgbench/.gitignore
index 983a3cd7a6..07492a993c 100644
--- a/src/bin/pgbench/.gitignore
+++ b/src/bin/pgbench/.gitignore
@@ -1,3 +1,4 @@
+/exprparse.h
 /exprparse.c
 /exprscan.c
 /pgbench
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
index f402fe7b91..6647c9fe97 100644
--- a/src/bin/pgbench/Makefile
+++ b/src/bin/pgbench/Makefile
@@ -10,6 +10,7 @@ include $(top_builddir)/src/Makefile.global
 OBJS = \
 	$(WIN32RES) \
 	exprparse.o \
+	exprscan.o \
 	pgbench.o
 
 override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
@@ -26,8 +27,14 @@ all: pgbench
 pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
 	$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
-# exprscan is compiled as part of exprparse
-exprparse.o: exprscan.c
+# See notes in src/backend/parser/Makefile about the following two rules
+exprparse.h: exprparse.c
+	touch $@
+
+exprparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+exprparse.o exprscan.o: exprparse.h
 
 distprep: exprparse.c exprscan.c
 
@@ -45,7 +52,7 @@ clean distclean:
 	rm -rf tmp_check
 
 maintainer-clean: distclean
-	rm -f exprparse.c exprscan.c
+	rm -f exprparse.h exprparse.c exprscan.c
 
 check:
 	$(prove_check)
diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y
index b5592d4b97..ade2ecdaab 100644
--- a/src/bin/pgbench/exprparse.y
+++ b/src/bin/pgbench/exprparse.y
@@ -526,18 +526,3 @@ make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else
 					 find_func(yyscanner, "!case_end"),
 					 make_elist(else_part, when_then_list));
 }
-
-/*
- * exprscan.l is compiled as part of exprparse.y.  Currently, this is
- * unavoidable because exprparse does not create a .h file to export
- * its token symbols.  If these files ever grow large enough to be
- * worth compiling separately, that could be fixed; but for now it
- * seems like useless complication.
- */
-
-/* First, get rid of "#define yyscan_t" from pgbench.h */
-#undef yyscan_t
-/* ... and the yylval macro, which flex will have its own definition for */
-#undef yylval
-
-#include "exprscan.c"
diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l
index 4f63818606..fe8e32838a 100644
--- a/src/bin/pgbench/exprscan.l
+++ b/src/bin/pgbench/exprscan.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * exprscan.l
@@ -22,9 +22,19 @@
  *
  *-------------------------------------------------------------------------
  */
+#include "postgres_fe.h"
 
+/*
+ * NB: include exprparse.h only AFTER including pgbench.h, because pgbench.h
+ * contains definitions needed for YYSTYPE. Likewise, pgbench.h must come after
+ * psqlscan_int.h for yyscan_t.
+ */
 #include "fe_utils/psqlscan_int.h"
+#include "pgbench.h"
+#include "exprparse.h"
+}
 
+%{
 /* context information for reporting errors in expressions */
 static const char *expr_source = NULL;
 static int	expr_lineno = 0;
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index c1b1f3bd2a..1a56a74cda 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -123,6 +123,7 @@ do
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
 	test "$f" = src/test/isolation/specparse.h && continue
+	test "$f" = src/bin/pgbench/exprparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v4-0006-Build-syncrep_scanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0006-Build-syncrep_scanner.c-standalone.patchDownload
From b8f2e6a055af9f2bffd2078364077fe6d2942e53 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 15:02:30 +0700
Subject: [PATCH v4 06/11] Build syncrep_scanner.c standalone

---
 src/backend/Makefile                      |  3 ++-
 src/backend/replication/.gitignore        |  1 +
 src/backend/replication/Makefile          | 11 +++++++++--
 src/backend/replication/syncrep_gram.y    |  2 --
 src/backend/replication/syncrep_scanner.l | 21 +++++++++++++++------
 src/tools/pginclude/headerscheck          |  1 +
 6 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/src/backend/Makefile b/src/backend/Makefile
index f527659a7b..86cbe03677 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -183,7 +183,7 @@ distprep:
 	$(MAKE) -C bootstrap	bootparse.c bootparse.h bootscanner.c
 	$(MAKE) -C catalog	distprep
 	$(MAKE) -C nodes	distprep
-	$(MAKE) -C replication	repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_scanner.c
+	$(MAKE) -C replication	repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_gram.h syncrep_scanner.c
 	$(MAKE) -C storage/lmgr	lwlocknames.h lwlocknames.c
 	$(MAKE) -C utils	distprep
 	$(MAKE) -C utils/adt	jsonpath_gram.c jsonpath_scan.c
@@ -307,6 +307,7 @@ maintainer-clean: distclean
 	      replication/repl_gram.h \
 	      replication/repl_scanner.c \
 	      replication/syncrep_gram.c \
+	      replication/syncrep_gram.h \
 	      replication/syncrep_scanner.c \
 	      storage/lmgr/lwlocknames.c \
 	      storage/lmgr/lwlocknames.h \
diff --git a/src/backend/replication/.gitignore b/src/backend/replication/.gitignore
index a5f600232f..77d5a51068 100644
--- a/src/backend/replication/.gitignore
+++ b/src/backend/replication/.gitignore
@@ -1,5 +1,6 @@
 /repl_gram.h
 /repl_gram.c
 /repl_scanner.c
+/syncrep_gram.h
 /syncrep_gram.c
 /syncrep_scanner.c
diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile
index bc8170418f..23f29ba545 100644
--- a/src/backend/replication/Makefile
+++ b/src/backend/replication/Makefile
@@ -21,6 +21,7 @@ OBJS = \
 	slotfuncs.o \
 	syncrep.o \
 	syncrep_gram.o \
+	syncrep_scanner.o \
 	walreceiver.o \
 	walreceiverfuncs.o \
 	walsender.o
@@ -38,8 +39,14 @@ repl_gram.c: BISONFLAGS += -d
 # Force these dependencies to be known even without dependency info built:
 repl_gram.o repl_scanner.o: repl_gram.h
 
-# syncrep_scanner is compiled as part of syncrep_gram
-syncrep_gram.o: syncrep_scanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+syncrep_gram.h: syncrep_gram.c
+	touch $@
+
+syncrep_gram.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+syncrep_gram.o syncrep_scanner.o: syncrep_gram.h
 
 # repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c
 # are in the distribution tarball, so they are not cleaned here.
diff --git a/src/backend/replication/syncrep_gram.y b/src/backend/replication/syncrep_gram.y
index d932f2cda3..4fc3647da1 100644
--- a/src/backend/replication/syncrep_gram.y
+++ b/src/backend/replication/syncrep_gram.y
@@ -112,5 +112,3 @@ create_syncrep_config(const char *num_sync, List *members, uint8 syncrep_method)
 
 	return config;
 }
-
-#include "syncrep_scanner.c"
diff --git a/src/backend/replication/syncrep_scanner.l b/src/backend/replication/syncrep_scanner.l
index 1952c8c6e0..bdb1a3391c 100644
--- a/src/backend/replication/syncrep_scanner.l
+++ b/src/backend/replication/syncrep_scanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * syncrep_scanner.l
@@ -17,6 +17,15 @@
 
 #include "lib/stringinfo.h"
 
+/*
+ * NB: include syncrep_gram.h only AFTER including syncrep.h, because syncrep.h
+ * includes node definitions needed for YYSTYPE.
+ */
+#include "replication/syncrep.h"
+#include "syncrep_gram.h"
+}
+
+%{
 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
 #undef fprintf
 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
@@ -82,28 +91,28 @@ xdinside		[^"]+
 				appendStringInfoString(&xdbuf, yytext);
 		}
 <xd>{xdstop} {
-				yylval.str = xdbuf.data;
+				syncrep_yylval.str = xdbuf.data;
 				xdbuf.data = NULL;
 				BEGIN(INITIAL);
 				return NAME;
 		}
 <xd><<EOF>> {
-				yyerror("unterminated quoted identifier");
+				syncrep_yyerror("unterminated quoted identifier");
 				return JUNK;
 		}
 
 {identifier} {
-				yylval.str = pstrdup(yytext);
+				syncrep_yylval.str = pstrdup(yytext);
 				return NAME;
 		}
 
 {digit}+	{
-				yylval.str = pstrdup(yytext);
+				syncrep_yylval.str = pstrdup(yytext);
 				return NUM;
 		}
 
 "*"		{
-				yylval.str = "*";
+				syncrep_yylval.str = "*";
 				return NAME;
 		}
 
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 917ef29c15..1e953d503f 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -121,6 +121,7 @@ do
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
+	test "$f" = src/backend/replication/syncrep_gram.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v4-0009-Build-cubescan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0009-Build-cubescan.c-standalone.patchDownload
From 4ec5efdae1b02b4e0a34d5deffa5dcbb119445be Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 11:18:06 +0700
Subject: [PATCH v4 09/11] Build cubescan.c standalone

Pass scanbuflen as a parameter to yyparse rather than
resorting to a global variable.
---
 contrib/cube/.gitignore          |  1 +
 contrib/cube/Makefile            | 16 +++++++-----
 contrib/cube/cube.c              |  6 ++---
 contrib/cube/cubedata.h          |  6 ++---
 contrib/cube/cubeparse.y         |  8 ++----
 contrib/cube/cubescan.l          | 44 ++++++++++++++++++++------------
 src/tools/pginclude/headerscheck |  1 +
 7 files changed, 47 insertions(+), 35 deletions(-)

diff --git a/contrib/cube/.gitignore b/contrib/cube/.gitignore
index cb4c989fff..f788440c79 100644
--- a/contrib/cube/.gitignore
+++ b/contrib/cube/.gitignore
@@ -1,3 +1,4 @@
+/cubeparse.h
 /cubeparse.c
 /cubescan.c
 # Generated subdirectories
diff --git a/contrib/cube/Makefile b/contrib/cube/Makefile
index cf195506c7..4fd19aac35 100644
--- a/contrib/cube/Makefile
+++ b/contrib/cube/Makefile
@@ -4,7 +4,8 @@ MODULE_big = cube
 OBJS = \
 	$(WIN32RES) \
 	cube.o \
-	cubeparse.o
+	cubeparse.o \
+	cubescan.o
 
 EXTENSION = cube
 DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql cube--1.4--1.5.sql \
@@ -15,8 +16,6 @@ HEADERS = cubedata.h
 
 REGRESS = cube cube_sci
 
-EXTRA_CLEAN = y.tab.c y.tab.h
-
 SHLIB_LINK += $(filter -lm, $(LIBS))
 
 ifdef USE_PGXS
@@ -30,11 +29,16 @@ include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
+# See notes in src/backend/parser/Makefile about the following two rules
+cubeparse.h: cubeparse.c
+	touch $@
+
+cubeparse.c: BISONFLAGS += -d
 
-# cubescan is compiled as part of cubeparse
-cubeparse.o: cubescan.c
+# Force these dependencies to be known even without dependency info built:
+cubeparse.o cubescan.o: cubeparse.h
 
 distprep: cubeparse.c cubescan.c
 
 maintainer-clean:
-	rm -f cubeparse.c cubescan.c
+	rm -f cubeparse.h cubeparse.c cubescan.c
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index a5d1ba6733..6e01800a4a 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -119,11 +119,11 @@ cube_in(PG_FUNCTION_ARGS)
 {
 	char	   *str = PG_GETARG_CSTRING(0);
 	NDBOX	   *result;
+	Size		scanbuflen;
 
-	cube_scanner_init(str);
+	cube_scanner_init(str, &scanbuflen);
 
-	if (cube_yyparse(&result) != 0)
-		cube_yyerror(&result, "cube parser failed");
+	cube_yyparse(&result, scanbuflen);
 
 	cube_scanner_finish();
 
diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h
index dbe7d4f742..640a7ca580 100644
--- a/contrib/cube/cubedata.h
+++ b/contrib/cube/cubedata.h
@@ -61,9 +61,9 @@ typedef struct NDBOX
 
 /* in cubescan.l */
 extern int	cube_yylex(void);
-extern void cube_yyerror(NDBOX **result, const char *message) pg_attribute_noreturn();
-extern void cube_scanner_init(const char *str);
+extern void cube_yyerror(NDBOX **result, Size scanbuflen, const char *message) pg_attribute_noreturn();
+extern void cube_scanner_init(const char *str, Size *scanbuflen);
 extern void cube_scanner_finish(void);
 
 /* in cubeparse.y */
-extern int	cube_yyparse(NDBOX **result);
+extern int	cube_yyparse(NDBOX **result, Size scanbuflen);
diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y
index 7577c4515c..e3b750b695 100644
--- a/contrib/cube/cubeparse.y
+++ b/contrib/cube/cubeparse.y
@@ -7,6 +7,7 @@
 #include "postgres.h"
 
 #include "cubedata.h"
+#include "cube_internal.h"
 #include "utils/float.h"
 
 /* All grammar constructs return strings */
@@ -23,9 +24,6 @@
 #define YYMALLOC palloc
 #define YYFREE   pfree
 
-static char *scanbuf;
-static int	scanbuflen;
-
 static int item_count(const char *s, char delim);
 static NDBOX *write_box(int dim, char *str1, char *str2);
 static NDBOX *write_point_as_box(int dim, char *str);
@@ -33,7 +31,7 @@ static NDBOX *write_point_as_box(int dim, char *str);
 %}
 
 /* BISON Declarations */
-%parse-param {NDBOX **result}
+%parse-param {NDBOX **result} {Size scanbuflen}
 %expect 0
 %name-prefix="cube_yy"
 
@@ -265,5 +263,3 @@ write_point_as_box(int dim, char *str)
 
 	return bp;
 }
-
-#include "cubescan.c"
diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l
index bd400e3684..6b316f2d54 100644
--- a/contrib/cube/cubescan.l
+++ b/contrib/cube/cubescan.l
@@ -1,9 +1,21 @@
-%{
+%top{
 /*
  * A scanner for EMP-style numeric ranges
  * contrib/cube/cubescan.l
  */
 
+#include "postgres.h"
+
+/*
+ * NB: include cubeparse.h only AFTER defining YYSTYPE (to match cubeparse.y)
+ * and cubedata.h for NDBOX.
+ */
+#include "cubedata.h"
+#define YYSTYPE char *
+#include "cubeparse.h"
+}
+
+%{
 /* LCOV_EXCL_START */
 
 /* No reason to constrain amount of data slurped */
@@ -21,9 +33,7 @@ fprintf_to_ereport(const char *fmt, const char *msg)
 
 /* Handles to the buffer that the lexer uses internally */
 static YY_BUFFER_STATE scanbufhandle;
-/* this is now declared in cubeparse.y: */
-/* static char *scanbuf; */
-/* static int	scanbuflen; */
+static char *scanbuf;
 %}
 
 %option 8bit
@@ -45,14 +55,14 @@ NaN          [nN][aA][nN]
 
 %%
 
-{float}      yylval = yytext; return CUBEFLOAT;
-{infinity}   yylval = yytext; return CUBEFLOAT;
-{NaN}        yylval = yytext; return CUBEFLOAT;
-\[           yylval = "("; return O_BRACKET;
-\]           yylval = ")"; return C_BRACKET;
-\(           yylval = "("; return O_PAREN;
-\)           yylval = ")"; return C_PAREN;
-\,           yylval = ","; return COMMA;
+{float}      cube_yylval = yytext; return CUBEFLOAT;
+{infinity}   cube_yylval = yytext; return CUBEFLOAT;
+{NaN}        cube_yylval = yytext; return CUBEFLOAT;
+\[           cube_yylval = "("; return O_BRACKET;
+\]           cube_yylval = ")"; return C_BRACKET;
+\(           cube_yylval = "("; return O_PAREN;
+\)           cube_yylval = ")"; return C_PAREN;
+\,           cube_yylval = ","; return COMMA;
 [ \t\n\r\f]+ /* discard spaces */
 .            return yytext[0]; /* alert parser of the garbage */
 
@@ -60,9 +70,9 @@ NaN          [nN][aA][nN]
 
 /* LCOV_EXCL_STOP */
 
-/* result is not used, but Bison expects this signature */
+/* result and scanbuflen are not used, but Bison expects this signature */
 void
-yyerror(NDBOX **result, const char *message)
+cube_yyerror(NDBOX **result, Size scanbuflen, const char *message)
 {
 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 	{
@@ -87,9 +97,9 @@ yyerror(NDBOX **result, const char *message)
  * Called before any actual parsing is done
  */
 void
-cube_scanner_init(const char *str)
+cube_scanner_init(const char *str, Size *scanbuflen)
 {
-	Size	slen = strlen(str);
+	Size		slen = strlen(str);
 
 	/*
 	 * Might be left over after ereport()
@@ -100,7 +110,7 @@ cube_scanner_init(const char *str)
 	/*
 	 * Make a scan buffer with special termination needed by flex.
 	 */
-	scanbuflen = slen;
+	*scanbuflen = slen;
 	scanbuf = palloc(slen + 2);
 	memcpy(scanbuf, str, slen);
 	scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 1a56a74cda..c3f3a0acee 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -117,6 +117,7 @@ do
 	# We can't make these Bison output files compilable standalone
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
+	test "$f" = contrib/cube/cubeparse.h && continue
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-- 
2.36.1

v4-0010-Build-segscan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0010-Build-segscan.c-standalone.patchDownload
From dac7ffb5dd095c83570b87b47fb0c60869bf7064 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 12:00:33 +0700
Subject: [PATCH v4 10/11] Build segscan.c standalone

---
 contrib/seg/.gitignore           |  1 +
 contrib/seg/Makefile             | 15 +++++++++++----
 contrib/seg/segparse.y           |  3 ---
 contrib/seg/segscan.l            | 28 ++++++++++++++++++----------
 src/tools/pginclude/headerscheck |  1 +
 5 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/contrib/seg/.gitignore b/contrib/seg/.gitignore
index 69e73d2096..fa247a4e67 100644
--- a/contrib/seg/.gitignore
+++ b/contrib/seg/.gitignore
@@ -1,3 +1,4 @@
+/segparse.h
 /segparse.c
 /segscan.c
 # Generated subdirectories
diff --git a/contrib/seg/Makefile b/contrib/seg/Makefile
index bb63e83506..c6c134b8f1 100644
--- a/contrib/seg/Makefile
+++ b/contrib/seg/Makefile
@@ -4,7 +4,8 @@ MODULE_big = seg
 OBJS = \
 	$(WIN32RES) \
 	seg.o \
-	segparse.o
+	segparse.o \
+	segscan.o
 
 EXTENSION = seg
 DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql seg--1.3--1.4.sql \
@@ -29,10 +30,16 @@ include $(top_srcdir)/contrib/contrib-global.mk
 endif
 
 
-# segscan is compiled as part of segparse
-segparse.o: segscan.c
+# See notes in src/backend/parser/Makefile about the following two rules
+segparse.h: segparse.c
+	touch $@
+
+segparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+segparse.o segscan.o: segparse.h
 
 distprep: segparse.c segscan.c
 
 maintainer-clean:
-	rm -f segparse.c segscan.c
+	rm -f segparse.h segparse.c segscan.c
diff --git a/contrib/seg/segparse.y b/contrib/seg/segparse.y
index 33e3a9f35f..637eacd1a6 100644
--- a/contrib/seg/segparse.y
+++ b/contrib/seg/segparse.y
@@ -160,6 +160,3 @@ seg_atof(const char *value)
 	datum = DirectFunctionCall1(float4in, CStringGetDatum(value));
 	return DatumGetFloat4(datum);
 }
-
-
-#include "segscan.c"
diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l
index 5f6595e9eb..4744fd5e9e 100644
--- a/contrib/seg/segscan.l
+++ b/contrib/seg/segscan.l
@@ -1,8 +1,18 @@
-%{
+%top{
 /*
  * A scanner for EMP-style numeric ranges
  */
+#include "postgres.h"
+
+/*
+ * NB: include segparse.h only AFTER including segdata.h, because segdata.h
+ * contains the definition for SEG.
+ */
+#include "segdata.h"
+#include "segparse.h"
+}
 
+%{
 /* LCOV_EXCL_START */
 
 /* No reason to constrain amount of data slurped */
@@ -21,7 +31,6 @@ fprintf_to_ereport(const char *fmt, const char *msg)
 /* Handles to the buffer that the lexer uses internally */
 static YY_BUFFER_STATE scanbufhandle;
 static char *scanbuf;
-static int	scanbuflen;
 %}
 
 %option 8bit
@@ -42,12 +51,12 @@ float        ({integer}|{real})([eE]{integer})?
 
 %%
 
-{range}      yylval.text = yytext; return RANGE;
-{plumin}     yylval.text = yytext; return PLUMIN;
-{float}      yylval.text = yytext; return SEGFLOAT;
-\<           yylval.text = "<"; return EXTENSION;
-\>           yylval.text = ">"; return EXTENSION;
-\~           yylval.text = "~"; return EXTENSION;
+{range}      seg_yylval.text = yytext; return RANGE;
+{plumin}     seg_yylval.text = yytext; return PLUMIN;
+{float}      seg_yylval.text = yytext; return SEGFLOAT;
+\<           seg_yylval.text = "<"; return EXTENSION;
+\>           seg_yylval.text = ">"; return EXTENSION;
+\~           seg_yylval.text = "~"; return EXTENSION;
 [ \t\n\r\f]+ /* discard spaces */
 .            return yytext[0]; /* alert parser of the garbage */
 
@@ -56,7 +65,7 @@ float        ({integer}|{real})([eE]{integer})?
 /* LCOV_EXCL_STOP */
 
 void
-yyerror(SEG *result, const char *message)
+seg_yyerror(SEG *result, const char *message)
 {
 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 	{
@@ -94,7 +103,6 @@ seg_scanner_init(const char *str)
 	/*
 	 * Make a scan buffer with special termination needed by flex.
 	 */
-	scanbuflen = slen;
 	scanbuf = palloc(slen + 2);
 	memcpy(scanbuf, str, slen);
 	scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index c3f3a0acee..7022ac6c39 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -118,6 +118,7 @@ do
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
 	test "$f" = contrib/cube/cubeparse.h && continue
+	test "$f" = contrib/seg/segparse.h && continue
 	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-- 
2.36.1

v4-0007-Build-specscanner.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0007-Build-specscanner.c-standalone.patchDownload
From 9ac807e74024d6c2e989763bb1dda15f1ad5f41a Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 09:34:17 +0700
Subject: [PATCH v4 07/11] Build specscanner.c standalone

---
 src/test/isolation/.gitignore    |  1 +
 src/test/isolation/Makefile      | 15 +++++++++++----
 src/test/isolation/specparse.y   |  2 --
 src/test/isolation/specscanner.l | 28 +++++++++++++++++++---------
 src/tools/pginclude/headerscheck |  1 +
 5 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/src/test/isolation/.gitignore b/src/test/isolation/.gitignore
index 870dac4d28..2c13b4bf98 100644
--- a/src/test/isolation/.gitignore
+++ b/src/test/isolation/.gitignore
@@ -3,6 +3,7 @@
 /pg_isolation_regress
 
 # Local generated source files
+/specparse.h
 /specparse.c
 /specscanner.c
 
diff --git a/src/test/isolation/Makefile b/src/test/isolation/Makefile
index 0d452c89d4..b8738b7c1b 100644
--- a/src/test/isolation/Makefile
+++ b/src/test/isolation/Makefile
@@ -15,7 +15,8 @@ override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) \
 OBJS = \
 	$(WIN32RES) \
 	isolationtester.o \
-	specparse.o
+	specparse.o \
+	specscanner.o
 
 all: isolationtester$(X) pg_isolation_regress$(X)
 
@@ -44,8 +45,14 @@ isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport
 
 distprep: specparse.c specscanner.c
 
-# specscanner is compiled as part of specparse
-specparse.o: specscanner.c
+# See notes in src/backend/parser/Makefile about the following two rules
+specparse.h: specparse.c
+	touch $@
+
+specparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+specparse.o specscanner.o: specparse.h
 
 # specparse.c and specscanner.c are in the distribution tarball,
 # so do not clean them here
@@ -55,7 +62,7 @@ clean distclean:
 	rm -rf $(pg_regress_clean_files)
 
 maintainer-clean: distclean
-	rm -f specparse.c specscanner.c
+	rm -f specparse.h specparse.c specscanner.c
 
 installcheck: all
 	$(pg_isolation_regress_installcheck) --schedule=$(srcdir)/isolation_schedule
diff --git a/src/test/isolation/specparse.y b/src/test/isolation/specparse.y
index eb368184b8..657285cc23 100644
--- a/src/test/isolation/specparse.y
+++ b/src/test/isolation/specparse.y
@@ -276,5 +276,3 @@ blocker:
 		;
 
 %%
-
-#include "specscanner.c"
diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l
index aa6e89268e..b04696f52d 100644
--- a/src/test/isolation/specscanner.l
+++ b/src/test/isolation/specscanner.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * specscanner.l
@@ -9,7 +9,17 @@
  *
  *-------------------------------------------------------------------------
  */
+#include "postgres_fe.h"
 
+/*
+ * NB: include specparse.h only AFTER including isolationtester.h, because
+ * isolationtester.h includes node definitions needed for YYSTYPE.
+ */
+#include "isolationtester.h"
+#include "specparse.h"
+}
+
+%{
 static int	yyline = 1;			/* line number for error reporting */
 
 #define LITBUF_INIT	1024		/* initial size of litbuf */
@@ -75,7 +85,7 @@ teardown		{ return TEARDOWN; }
 
  /* Plain identifiers */
 {identifier}	{
-					yylval.str = pg_strdup(yytext);
+					spec_yylval.str = pg_strdup(yytext);
 					return(identifier);
 				}
 
@@ -87,13 +97,13 @@ teardown		{ return TEARDOWN; }
 <qident>\"\"	{ addlitchar(yytext[0]); }
 <qident>\"		{
 					litbuf[litbufpos] = '\0';
-					yylval.str = pg_strdup(litbuf);
+					spec_yylval.str = pg_strdup(litbuf);
 					BEGIN(INITIAL);
 					return(identifier);
 				}
 <qident>.		{ addlitchar(yytext[0]); }
-<qident>\n		{ yyerror("unexpected newline in quoted identifier"); }
-<qident><<EOF>>	{ yyerror("unterminated quoted identifier"); }
+<qident>\n		{ spec_yyerror("unexpected newline in quoted identifier"); }
+<qident><<EOF>>	{ spec_yyerror("unterminated quoted identifier"); }
 
  /* SQL blocks: { UPDATE ... } */
  /* We trim leading/trailing whitespace, otherwise they're unprocessed */
@@ -104,7 +114,7 @@ teardown		{ return TEARDOWN; }
 				}
 <sql>{space}*"}" {
 					litbuf[litbufpos] = '\0';
-					yylval.str = pg_strdup(litbuf);
+					spec_yylval.str = pg_strdup(litbuf);
 					BEGIN(INITIAL);
 					return(sqlblock);
 				}
@@ -116,12 +126,12 @@ teardown		{ return TEARDOWN; }
 					addlitchar(yytext[0]);
 				}
 <sql><<EOF>>	{
-					yyerror("unterminated sql block");
+					spec_yyerror("unterminated sql block");
 				}
 
  /* Numbers and punctuation */
 {digit}+		{
-					yylval.integer = atoi(yytext);
+					spec_yylval.integer = atoi(yytext);
 					return INTEGER;
 				}
 
@@ -150,7 +160,7 @@ addlitchar(char c)
 }
 
 void
-yyerror(const char *message)
+spec_yyerror(const char *message)
 {
 	fprintf(stderr, "%s at line %d\n", message, yyline);
 	exit(1);
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 1e953d503f..c1b1f3bd2a 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -122,6 +122,7 @@ do
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
+	test "$f" = src/test/isolation/specparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
 	test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
 
-- 
2.36.1

v4-0011-Build-jsonpath_scan.c-standalone.patchtext/x-patch; charset=US-ASCII; name=v4-0011-Build-jsonpath_scan.c-standalone.patchDownload
From 697b7d18f59b51ebc40672e18791b8deccc3733c Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Sat, 13 Aug 2022 12:35:55 +0700
Subject: [PATCH v4 11/11] Build jsonpath_scan.c standalone

---
 src/backend/utils/adt/.gitignore          |  1 +
 src/backend/utils/adt/Makefile            | 11 ++++++--
 src/backend/utils/adt/jsonpath_gram.y     | 27 +------------------
 src/backend/utils/adt/jsonpath_internal.h | 32 +++++++++++++++++++++++
 src/backend/utils/adt/jsonpath_scan.l     | 29 +++++++++++++-------
 src/tools/pginclude/headerscheck          |  1 +
 6 files changed, 63 insertions(+), 38 deletions(-)
 create mode 100644 src/backend/utils/adt/jsonpath_internal.h

diff --git a/src/backend/utils/adt/.gitignore b/src/backend/utils/adt/.gitignore
index 48cf941a52..7fab054407 100644
--- a/src/backend/utils/adt/.gitignore
+++ b/src/backend/utils/adt/.gitignore
@@ -1,2 +1,3 @@
+/jsonpath_gram.h
 /jsonpath_gram.c
 /jsonpath_scan.c
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
index 7c722ea2ce..0de0bbb1b8 100644
--- a/src/backend/utils/adt/Makefile
+++ b/src/backend/utils/adt/Makefile
@@ -57,6 +57,7 @@ OBJS = \
 	jsonpath.o \
 	jsonpath_exec.o \
 	jsonpath_gram.o \
+	jsonpath_scan.o \
 	like.o \
 	like_support.o \
 	lockfuncs.o \
@@ -119,11 +120,17 @@ OBJS = \
 	xid8funcs.o \
 	xml.o
 
+# See notes in src/backend/parser/Makefile about the following two rules
+jsonpath_gram.h: jsonpath_gram.c
+	touch $@
+
+jsonpath_gram.c: BISONFLAGS += -d
+
 jsonpath_scan.c: FLEXFLAGS = -CF -p -p
 jsonpath_scan.c: FLEX_NO_BACKUP=yes
 
-# jsonpath_scan is compiled as part of jsonpath_gram
-jsonpath_gram.o: jsonpath_scan.c
+# Force these dependencies to be known even without dependency info built:
+jsonpath_gram.o jsonpath_scan.o: jsonpath_gram.h
 
 # jsonpath_gram.c and jsonpath_scan.c are in the distribution tarball,
 # so they are not cleaned here.
diff --git a/src/backend/utils/adt/jsonpath_gram.y b/src/backend/utils/adt/jsonpath_gram.y
index ce5d5af891..35a79ca965 100644
--- a/src/backend/utils/adt/jsonpath_gram.y
+++ b/src/backend/utils/adt/jsonpath_gram.y
@@ -18,26 +18,11 @@
 
 #include "catalog/pg_collation.h"
 #include "fmgr.h"
+#include "jsonpath_internal.h"
 #include "miscadmin.h"
 #include "nodes/pg_list.h"
 #include "regex/regex.h"
 #include "utils/builtins.h"
-#include "utils/jsonpath.h"
-
-/* struct JsonPathString is shared between scan and gram */
-typedef struct JsonPathString
-{
-	char	   *val;
-	int			len;
-	int			total;
-}			JsonPathString;
-
-union YYSTYPE;
-
-/* flex 2.5.4 doesn't bother with a decl for this */
-int	jsonpath_yylex(union YYSTYPE *yylval_param);
-int	jsonpath_yyparse(JsonPathParseResult **result);
-void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
 
 static JsonPathParseItem *makeItemType(JsonPathItemType type);
 static JsonPathParseItem *makeItemString(JsonPathString *s);
@@ -593,13 +578,3 @@ jspConvertRegexFlags(uint32 xflags)
 
 	return cflags;
 }
-
-/*
- * jsonpath_scan.l is compiled as part of jsonpath_gram.y.  Currently, this is
- * unavoidable because jsonpath_gram does not create a .h file to export its
- * token symbols.  If these files ever grow large enough to be worth compiling
- * separately, that could be fixed; but for now it seems like useless
- * complication.
- */
-
-#include "jsonpath_scan.c"
diff --git a/src/backend/utils/adt/jsonpath_internal.h b/src/backend/utils/adt/jsonpath_internal.h
new file mode 100644
index 0000000000..edfc6191a0
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath_internal.h
@@ -0,0 +1,32 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath_internal.h
+ *     Private definitions for jsonpath scanner & parser
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/backend/utils/adt/jsonpath_internal.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef JSONPATH_INTERNAL_H
+#define JSONPATH_INTERNAL_H
+
+/* struct JsonPathString is shared between scan and gram */
+typedef struct JsonPathString
+{
+	char	   *val;
+	int			len;
+	int			total;
+}			JsonPathString;
+
+#include "utils/jsonpath.h"
+#include "jsonpath_gram.h"
+
+extern int     jsonpath_yylex(YYSTYPE *yylval_param);
+extern int     jsonpath_yyparse(JsonPathParseResult **result);
+extern void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
+
+#endif							/* JSONPATH_INTERNAL_H */
diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l
index 4351f6ec98..ea824bae73 100644
--- a/src/backend/utils/adt/jsonpath_scan.l
+++ b/src/backend/utils/adt/jsonpath_scan.l
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * jsonpath_scan.l
@@ -17,9 +17,18 @@
 
 #include "postgres.h"
 
+/*
+ * NB: include jsonpath_gram.h only AFTER including jsonpath_internal.h,
+ * because jsonpath_internal.h contains the declaration for JsonPathString.
+ */
+#include "jsonpath_internal.h"
+#include "jsonpath_gram.h"
+
 #include "mb/pg_wchar.h"
 #include "nodes/pg_list.h"
+}
 
+%{
 static JsonPathString scanstring;
 
 /* Handles to the buffer that the lexer uses internally */
@@ -142,9 +151,9 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xnq,xq,xvq>{hex_char}		{ parseHexChar(yytext); }
 
-<xnq,xq,xvq>{unicode}*{unicodefail}	{ yyerror(NULL, "invalid unicode sequence"); }
+<xnq,xq,xvq>{unicode}*{unicodefail}	{ jsonpath_yyerror(NULL, "invalid unicode sequence"); }
 
-<xnq,xq,xvq>{hex_fail}		{ yyerror(NULL, "invalid hex character sequence"); }
+<xnq,xq,xvq>{hex_fail}		{ jsonpath_yyerror(NULL, "invalid hex character sequence"); }
 
 <xnq,xq,xvq>{unicode}+\\	{
 								/* throw back the \\, and treat as unicode */
@@ -154,9 +163,9 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xnq,xq,xvq>\\.				{ addchar(false, yytext[1]); }
 
-<xnq,xq,xvq>\\				{ yyerror(NULL, "unexpected end after backslash"); }
+<xnq,xq,xvq>\\				{ jsonpath_yyerror(NULL, "unexpected end after backslash"); }
 
-<xq,xvq><<EOF>>				{ yyerror(NULL, "unexpected end of quoted string"); }
+<xq,xvq><<EOF>>				{ jsonpath_yyerror(NULL, "unexpected end of quoted string"); }
 
 <xq>\"							{
 									yylval->str = scanstring;
@@ -178,7 +187,7 @@ hex_fail	\\x{hex_dig}{0,1}
 
 <xc>\*							{ }
 
-<xc><<EOF>>						{ yyerror(NULL, "unexpected end of comment"); }
+<xc><<EOF>>						{ jsonpath_yyerror(NULL, "unexpected end of comment"); }
 
 \&\&							{ return AND_P; }
 
@@ -244,10 +253,10 @@ hex_fail	\\x{hex_dig}{0,1}
 									return INT_P;
 								}
 
-{realfail}						{ yyerror(NULL, "invalid numeric literal"); }
-{integer_junk}					{ yyerror(NULL, "trailing junk after numeric literal"); }
-{decimal_junk}					{ yyerror(NULL, "trailing junk after numeric literal"); }
-{real_junk}						{ yyerror(NULL, "trailing junk after numeric literal"); }
+{realfail}						{ jsonpath_yyerror(NULL, "invalid numeric literal"); }
+{integer_junk}					{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
+{decimal_junk}					{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
+{real_junk}						{ jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
 
 \"								{
 									addchar(true, '\0');
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 7022ac6c39..1db0096758 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -124,6 +124,7 @@ do
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
+	test "$f" = src/backend/utils/adt/jsonpath_gram.h && continue
 	test "$f" = src/test/isolation/specparse.h && continue
 	test "$f" = src/bin/pgbench/exprparse.h && continue
 	test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
-- 
2.36.1

v4-0002-Move-private-declarations-shared-between-guc.c-an.patchtext/x-patch; charset=US-ASCII; name=v4-0002-Move-private-declarations-shared-between-guc.c-an.patchDownload
From 2b95401d925bed67b2cb1eb9e8cdb1f1dd3bcc8e Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Tue, 16 Aug 2022 12:01:41 +0700
Subject: [PATCH v4 02/11] Move private declarations shared between guc.c and
 guc-file.l to new header

FIXME: fails headerscheck
---
 src/backend/utils/misc/guc-file.l |  1 +
 src/backend/utils/misc/guc.c      |  1 +
 src/include/utils/guc.h           | 10 ----------
 src/include/utils/guc_internal.h  | 24 ++++++++++++++++++++++++
 4 files changed, 26 insertions(+), 10 deletions(-)
 create mode 100644 src/include/utils/guc_internal.h

diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index b4fa09749b..843838b1df 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -18,6 +18,7 @@
 #include "miscadmin.h"
 #include "storage/fd.h"
 #include "utils/guc.h"
+#include "utils/guc_internal.h"
 
 
 /*
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 66ab3912a0..293834fc13 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -100,6 +100,7 @@
 #include "utils/builtins.h"
 #include "utils/bytea.h"
 #include "utils/float.h"
+#include "utils/guc_internal.h"
 #include "utils/guc_tables.h"
 #include "utils/memutils.h"
 #include "utils/pg_locale.h"
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index aae071cd82..45ae1b537f 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -442,16 +442,6 @@ extern void GUC_check_errcode(int sqlerrcode);
 	pre_format_elog_string(errno, TEXTDOMAIN), \
 	GUC_check_errhint_string = format_elog_string
 
-/* functions shared between guc.c and guc-file.l */
-extern int	guc_name_compare(const char *namea, const char *nameb);
-extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
-												 bool applySettings, int elevel);
-extern void record_config_file_error(const char *errmsg,
-									 const char *config_file,
-									 int lineno,
-									 ConfigVariable **head_p,
-									 ConfigVariable **tail_p);
-
 /*
  * The following functions are not in guc.c, but are declared here to avoid
  * having to include guc.h in some widely used headers that it really doesn't
diff --git a/src/include/utils/guc_internal.h b/src/include/utils/guc_internal.h
new file mode 100644
index 0000000000..5d5db6bdce
--- /dev/null
+++ b/src/include/utils/guc_internal.h
@@ -0,0 +1,24 @@
+/*--------------------------------------------------------------------
+ * guc_internals.h
+ *
+ * Declarations shared between backend/utils/misc/guc.c and
+ * backend/utils/misc/guc-file.l
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/include/utils/guc_internals.h
+ *--------------------------------------------------------------------
+ */
+#ifndef GUC_INTERNALS_H
+#define GUC_INTERNALS_H
+
+extern int	guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+												 bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+									 const char *config_file,
+									 int lineno,
+									 ConfigVariable **head_p,
+									 ConfigVariable **tail_p);
+
+#endif							/* GUC_INTERNALS_H */
-- 
2.36.1

v4-0001-Preparatory-refactoring-for-compiling-guc-file.c-.patchtext/x-patch; charset=US-ASCII; name=v4-0001-Preparatory-refactoring-for-compiling-guc-file.c-.patchDownload
From c066efea2193be8e7b21bb44c067383f34f37ec8 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Tue, 16 Aug 2022 10:42:19 +0700
Subject: [PATCH v4 01/11] Preparatory refactoring for compiling guc-file.c
 standalone

Mostly this involves moving ProcessConfigFileInternal() to guc.c
and fixing the shared API to match.
---
 src/backend/utils/misc/guc-file.l | 360 +-----------------------------
 src/backend/utils/misc/guc.c      | 360 +++++++++++++++++++++++++++++-
 src/include/utils/guc.h           |   9 +
 3 files changed, 364 insertions(+), 365 deletions(-)

diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index ce5633844c..b4fa09749b 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -48,12 +48,6 @@ static sigjmp_buf *GUC_flex_fatal_jmp;
 
 static void FreeConfigVariable(ConfigVariable *item);
 
-static void record_config_file_error(const char *errmsg,
-									 const char *config_file,
-									 int lineno,
-									 ConfigVariable **head_p,
-									 ConfigVariable **tail_p);
-
 static int	GUC_flex_fatal(const char *msg);
 
 /* LCOV_EXCL_START */
@@ -159,358 +153,6 @@ ProcessConfigFile(GucContext context)
 	MemoryContextDelete(config_cxt);
 }
 
-/*
- * This function handles both actual config file (re)loads and execution of
- * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
- * case we don't apply any of the settings, but we make all the usual validity
- * checks, and we return the ConfigVariable list so that it can be printed out
- * by show_all_file_settings().
- */
-static ConfigVariable *
-ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
-{
-	bool		error = false;
-	bool		applying = false;
-	const char *ConfFileWithError;
-	ConfigVariable *item,
-			   *head,
-			   *tail;
-	int			i;
-
-	/* Parse the main config file into a list of option names and values */
-	ConfFileWithError = ConfigFileName;
-	head = tail = NULL;
-
-	if (!ParseConfigFile(ConfigFileName, true,
-						 NULL, 0, 0, elevel,
-						 &head, &tail))
-	{
-		/* Syntax error(s) detected in the file, so bail out */
-		error = true;
-		goto bail_out;
-	}
-
-	/*
-	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
-	 * replace any parameters set by ALTER SYSTEM command.  Because this file
-	 * is in the data directory, we can't read it until the DataDir has been
-	 * set.
-	 */
-	if (DataDir)
-	{
-		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
-							 NULL, 0, 0, elevel,
-							 &head, &tail))
-		{
-			/* Syntax error(s) detected in the file, so bail out */
-			error = true;
-			ConfFileWithError = PG_AUTOCONF_FILENAME;
-			goto bail_out;
-		}
-	}
-	else
-	{
-		/*
-		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
-		 * read.  In this case, we don't want to accept any settings but
-		 * data_directory from postgresql.conf, because they might be
-		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
-		 * will be read later. OTOH, since data_directory isn't allowed in the
-		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
-		 */
-		ConfigVariable *newlist = NULL;
-
-		/*
-		 * Prune all items except the last "data_directory" from the list.
-		 */
-		for (item = head; item; item = item->next)
-		{
-			if (!item->ignore &&
-				strcmp(item->name, "data_directory") == 0)
-				newlist = item;
-		}
-
-		if (newlist)
-			newlist->next = NULL;
-		head = tail = newlist;
-
-		/*
-		 * Quick exit if data_directory is not present in file.
-		 *
-		 * We need not do any further processing, in particular we don't set
-		 * PgReloadTime; that will be set soon by subsequent full loading of
-		 * the config file.
-		 */
-		if (head == NULL)
-			goto bail_out;
-	}
-
-	/*
-	 * Mark all extant GUC variables as not present in the config file. We
-	 * need this so that we can tell below which ones have been removed from
-	 * the file since we last processed it.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-
-		gconf->status &= ~GUC_IS_IN_FILE;
-	}
-
-	/*
-	 * Check if all the supplied option names are valid, as an additional
-	 * quasi-syntactic check on the validity of the config file.  It is
-	 * important that the postmaster and all backends agree on the results of
-	 * this phase, else we will have strange inconsistencies about which
-	 * processes accept a config file update and which don't.  Hence, unknown
-	 * custom variable names have to be accepted without complaint.  For the
-	 * same reason, we don't attempt to validate the options' values here.
-	 *
-	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
-	 * variable mentioned in the file; and we detect duplicate entries in the
-	 * file and mark the earlier occurrences as ignorable.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		struct config_generic *record;
-
-		/* Ignore anything already marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/*
-		 * Try to find the variable; but do not create a custom placeholder if
-		 * it's not there already.
-		 */
-		record = find_option(item->name, false, true, elevel);
-
-		if (record)
-		{
-			/* If it's already marked, then this is a duplicate entry */
-			if (record->status & GUC_IS_IN_FILE)
-			{
-				/*
-				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
-				 * avoid the O(N^2) behavior here with some additional state,
-				 * but it seems unlikely to be worth the trouble.
-				 */
-				ConfigVariable *pitem;
-
-				for (pitem = head; pitem != item; pitem = pitem->next)
-				{
-					if (!pitem->ignore &&
-						strcmp(pitem->name, item->name) == 0)
-						pitem->ignore = true;
-				}
-			}
-			/* Now mark it as present in file */
-			record->status |= GUC_IS_IN_FILE;
-		}
-		else if (!valid_custom_variable_name(item->name))
-		{
-			/* Invalid non-custom variable, so complain */
-			ereport(elevel,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
-							item->name,
-							item->filename, item->sourceline)));
-			item->errmsg = pstrdup("unrecognized configuration parameter");
-			error = true;
-			ConfFileWithError = item->filename;
-		}
-	}
-
-	/*
-	 * If we've detected any errors so far, we don't want to risk applying any
-	 * changes.
-	 */
-	if (error)
-		goto bail_out;
-
-	/* Otherwise, set flag that we're beginning to apply changes */
-	applying = true;
-
-	/*
-	 * Check for variables having been removed from the config file, and
-	 * revert their reset values (and perhaps also effective values) to the
-	 * boot-time defaults.  If such a variable can't be changed after startup,
-	 * report that and continue.
-	 */
-	for (i = 0; i < num_guc_variables; i++)
-	{
-		struct config_generic *gconf = guc_variables[i];
-		GucStack   *stack;
-
-		if (gconf->reset_source != PGC_S_FILE ||
-			(gconf->status & GUC_IS_IN_FILE))
-			continue;
-		if (gconf->context < PGC_SIGHUP)
-		{
-			/* The removal can't be effective without a restart */
-			gconf->status |= GUC_PENDING_RESTART;
-			ereport(elevel,
-					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
-					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
-							gconf->name)));
-			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
-											  gconf->name),
-									 NULL, 0,
-									 &head, &tail);
-			error = true;
-			continue;
-		}
-
-		/* No more to do if we're just doing show_all_file_settings() */
-		if (!applySettings)
-			continue;
-
-		/*
-		 * Reset any "file" sources to "default", else set_config_option will
-		 * not override those settings.
-		 */
-		if (gconf->reset_source == PGC_S_FILE)
-			gconf->reset_source = PGC_S_DEFAULT;
-		if (gconf->source == PGC_S_FILE)
-			gconf->source = PGC_S_DEFAULT;
-		for (stack = gconf->stack; stack; stack = stack->prev)
-		{
-			if (stack->source == PGC_S_FILE)
-				stack->source = PGC_S_DEFAULT;
-		}
-
-		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
-		if (set_config_option(gconf->name, NULL,
-							  context, PGC_S_DEFAULT,
-							  GUC_ACTION_SET, true, 0, false) > 0)
-		{
-			/* Log the change if appropriate */
-			if (context == PGC_SIGHUP)
-				ereport(elevel,
-						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
-								gconf->name)));
-		}
-	}
-
-	/*
-	 * Restore any variables determined by environment variables or
-	 * dynamically-computed defaults.  This is a no-op except in the case
-	 * where one of these had been in the config file and is now removed.
-	 *
-	 * In particular, we *must not* do this during the postmaster's initial
-	 * loading of the file, since the timezone functions in particular should
-	 * be run only after initialization is complete.
-	 *
-	 * XXX this is an unmaintainable crock, because we have to know how to set
-	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
-	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
-	 */
-	if (context == PGC_SIGHUP && applySettings)
-	{
-		InitializeGUCOptionsFromEnvironment();
-		pg_timezone_abbrev_initialize();
-		/* this selects SQL_ASCII in processes not connected to a database */
-		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
-						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
-	}
-
-	/*
-	 * Now apply the values from the config file.
-	 */
-	for (item = head; item; item = item->next)
-	{
-		char	   *pre_value = NULL;
-		int			scres;
-
-		/* Ignore anything marked as ignorable */
-		if (item->ignore)
-			continue;
-
-		/* In SIGHUP cases in the postmaster, we want to report changes */
-		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
-		{
-			const char *preval = GetConfigOption(item->name, true, false);
-
-			/* If option doesn't exist yet or is NULL, treat as empty string */
-			if (!preval)
-				preval = "";
-			/* must dup, else might have dangling pointer below */
-			pre_value = pstrdup(preval);
-		}
-
-		scres = set_config_option(item->name, item->value,
-								  context, PGC_S_FILE,
-								  GUC_ACTION_SET, applySettings, 0, false);
-		if (scres > 0)
-		{
-			/* variable was updated, so log the change if appropriate */
-			if (pre_value)
-			{
-				const char *post_value = GetConfigOption(item->name, true, false);
-
-				if (!post_value)
-					post_value = "";
-				if (strcmp(pre_value, post_value) != 0)
-					ereport(elevel,
-							(errmsg("parameter \"%s\" changed to \"%s\"",
-									item->name, item->value)));
-			}
-			item->applied = true;
-		}
-		else if (scres == 0)
-		{
-			error = true;
-			item->errmsg = pstrdup("setting could not be applied");
-			ConfFileWithError = item->filename;
-		}
-		else
-		{
-			/* no error, but variable's active value was not changed */
-			item->applied = true;
-		}
-
-		/*
-		 * We should update source location unless there was an error, since
-		 * even if the active value didn't change, the reset value might have.
-		 * (In the postmaster, there won't be a difference, but it does matter
-		 * in backends.)
-		 */
-		if (scres != 0 && applySettings)
-			set_config_sourcefile(item->name, item->filename,
-								  item->sourceline);
-
-		if (pre_value)
-			pfree(pre_value);
-	}
-
-	/* Remember when we last successfully loaded the config file. */
-	if (applySettings)
-		PgReloadTime = GetCurrentTimestamp();
-
-bail_out:
-	if (error && applySettings)
-	{
-		/* During postmaster startup, any error is fatal */
-		if (context == PGC_POSTMASTER)
-			ereport(ERROR,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors",
-							ConfFileWithError)));
-		else if (applying)
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
-							ConfFileWithError)));
-		else
-			ereport(elevel,
-					(errcode(ERRCODE_CONFIG_FILE_ERROR),
-					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
-							ConfFileWithError)));
-	}
-
-	/* Successful or otherwise, return the collected data list */
-	return head;
-}
-
 /*
  * Given a configuration file or directory location that may be a relative
  * path, return an absolute one.  We consider the location to be relative to
@@ -659,7 +301,7 @@ cleanup:
  * Capture an error message in the ConfigVariable list returned by
  * config file parsing.
  */
-static void
+void
 record_config_file_error(const char *errmsg,
 						 const char *config_file,
 						 int lineno,
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 9fbbfb1be5..66ab3912a0 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -243,10 +243,6 @@ static void assign_recovery_target_lsn(const char *newval, void *extra);
 static bool check_primary_slot_name(char **newval, void **extra, GucSource source);
 static bool check_default_with_oids(bool *newval, void **extra, GucSource source);
 
-/* Private functions in guc-file.l that need to be called from guc.c */
-static ConfigVariable *ProcessConfigFileInternal(GucContext context,
-												 bool applySettings, int elevel);
-
 /*
  * Track whether there were any deferred checks for custom resource managers
  * specified in wal_consistency_checking.
@@ -5160,8 +5156,8 @@ static bool report_needed;		/* true if any GUC_REPORT reports are needed */
 static int	GUCNestLevel = 0;	/* 1 when in main transaction */
 
 
+static struct config_generic *find_option(const char *name, bool create_placeholders, bool skip_errors, int elevel);
 static int	guc_var_compare(const void *a, const void *b);
-static int	guc_name_compare(const char *namea, const char *nameb);
 static void InitializeGUCOptionsFromEnvironment(void);
 static void InitializeOneGUCOption(struct config_generic *gconf);
 static void push_old_value(struct config_generic *gconf, GucAction action);
@@ -5180,7 +5176,359 @@ static bool validate_option_array_item(const char *name, const char *value,
 static void write_auto_conf_file(int fd, const char *filename, ConfigVariable *head_p);
 static void replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
 									  const char *name, const char *value);
+static bool valid_custom_variable_name(const char *name);
+
+/*
+ * This function handles both actual config file (re)loads and execution of
+ * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
+ * case we don't apply any of the settings, but we make all the usual validity
+ * checks, and we return the ConfigVariable list so that it can be printed out
+ * by show_all_file_settings().
+ */
+ConfigVariable *
+ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
+{
+	bool		error = false;
+	bool		applying = false;
+	const char *ConfFileWithError;
+	ConfigVariable *item,
+			   *head,
+			   *tail;
+	int			i;
+
+	/* Parse the main config file into a list of option names and values */
+	ConfFileWithError = ConfigFileName;
+	head = tail = NULL;
+
+	if (!ParseConfigFile(ConfigFileName, true,
+						 NULL, 0, 0, elevel,
+						 &head, &tail))
+	{
+		/* Syntax error(s) detected in the file, so bail out */
+		error = true;
+		goto bail_out;
+	}
+
+	/*
+	 * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
+	 * replace any parameters set by ALTER SYSTEM command.  Because this file
+	 * is in the data directory, we can't read it until the DataDir has been
+	 * set.
+	 */
+	if (DataDir)
+	{
+		if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
+							 NULL, 0, 0, elevel,
+							 &head, &tail))
+		{
+			/* Syntax error(s) detected in the file, so bail out */
+			error = true;
+			ConfFileWithError = PG_AUTOCONF_FILENAME;
+			goto bail_out;
+		}
+	}
+	else
+	{
+		/*
+		 * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
+		 * read.  In this case, we don't want to accept any settings but
+		 * data_directory from postgresql.conf, because they might be
+		 * overwritten with settings in the PG_AUTOCONF_FILENAME file which
+		 * will be read later. OTOH, since data_directory isn't allowed in the
+		 * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
+		 */
+		ConfigVariable *newlist = NULL;
+
+		/*
+		 * Prune all items except the last "data_directory" from the list.
+		 */
+		for (item = head; item; item = item->next)
+		{
+			if (!item->ignore &&
+				strcmp(item->name, "data_directory") == 0)
+				newlist = item;
+		}
 
+		if (newlist)
+			newlist->next = NULL;
+		head = tail = newlist;
+
+		/*
+		 * Quick exit if data_directory is not present in file.
+		 *
+		 * We need not do any further processing, in particular we don't set
+		 * PgReloadTime; that will be set soon by subsequent full loading of
+		 * the config file.
+		 */
+		if (head == NULL)
+			goto bail_out;
+	}
+
+	/*
+	 * Mark all extant GUC variables as not present in the config file. We
+	 * need this so that we can tell below which ones have been removed from
+	 * the file since we last processed it.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+
+		gconf->status &= ~GUC_IS_IN_FILE;
+	}
+
+	/*
+	 * Check if all the supplied option names are valid, as an additional
+	 * quasi-syntactic check on the validity of the config file.  It is
+	 * important that the postmaster and all backends agree on the results of
+	 * this phase, else we will have strange inconsistencies about which
+	 * processes accept a config file update and which don't.  Hence, unknown
+	 * custom variable names have to be accepted without complaint.  For the
+	 * same reason, we don't attempt to validate the options' values here.
+	 *
+	 * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
+	 * variable mentioned in the file; and we detect duplicate entries in the
+	 * file and mark the earlier occurrences as ignorable.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		struct config_generic *record;
+
+		/* Ignore anything already marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/*
+		 * Try to find the variable; but do not create a custom placeholder if
+		 * it's not there already.
+		 */
+		record = find_option(item->name, false, true, elevel);
+
+		if (record)
+		{
+			/* If it's already marked, then this is a duplicate entry */
+			if (record->status & GUC_IS_IN_FILE)
+			{
+				/*
+				 * Mark the earlier occurrence(s) as dead/ignorable.  We could
+				 * avoid the O(N^2) behavior here with some additional state,
+				 * but it seems unlikely to be worth the trouble.
+				 */
+				ConfigVariable *pitem;
+
+				for (pitem = head; pitem != item; pitem = pitem->next)
+				{
+					if (!pitem->ignore &&
+						strcmp(pitem->name, item->name) == 0)
+						pitem->ignore = true;
+				}
+			}
+			/* Now mark it as present in file */
+			record->status |= GUC_IS_IN_FILE;
+		}
+		else if (!valid_custom_variable_name(item->name))
+		{
+			/* Invalid non-custom variable, so complain */
+			ereport(elevel,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
+							item->name,
+							item->filename, item->sourceline)));
+			item->errmsg = pstrdup("unrecognized configuration parameter");
+			error = true;
+			ConfFileWithError = item->filename;
+		}
+	}
+
+	/*
+	 * If we've detected any errors so far, we don't want to risk applying any
+	 * changes.
+	 */
+	if (error)
+		goto bail_out;
+
+	/* Otherwise, set flag that we're beginning to apply changes */
+	applying = true;
+
+	/*
+	 * Check for variables having been removed from the config file, and
+	 * revert their reset values (and perhaps also effective values) to the
+	 * boot-time defaults.  If such a variable can't be changed after startup,
+	 * report that and continue.
+	 */
+	for (i = 0; i < num_guc_variables; i++)
+	{
+		struct config_generic *gconf = guc_variables[i];
+		GucStack   *stack;
+
+		if (gconf->reset_source != PGC_S_FILE ||
+			(gconf->status & GUC_IS_IN_FILE))
+			continue;
+		if (gconf->context < PGC_SIGHUP)
+		{
+			/* The removal can't be effective without a restart */
+			gconf->status |= GUC_PENDING_RESTART;
+			ereport(elevel,
+					(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+					 errmsg("parameter \"%s\" cannot be changed without restarting the server",
+							gconf->name)));
+			record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
+											  gconf->name),
+									 NULL, 0,
+									 &head, &tail);
+			error = true;
+			continue;
+		}
+
+		/* No more to do if we're just doing show_all_file_settings() */
+		if (!applySettings)
+			continue;
+
+		/*
+		 * Reset any "file" sources to "default", else set_config_option will
+		 * not override those settings.
+		 */
+		if (gconf->reset_source == PGC_S_FILE)
+			gconf->reset_source = PGC_S_DEFAULT;
+		if (gconf->source == PGC_S_FILE)
+			gconf->source = PGC_S_DEFAULT;
+		for (stack = gconf->stack; stack; stack = stack->prev)
+		{
+			if (stack->source == PGC_S_FILE)
+				stack->source = PGC_S_DEFAULT;
+		}
+
+		/* Now we can re-apply the wired-in default (i.e., the boot_val) */
+		if (set_config_option(gconf->name, NULL,
+							  context, PGC_S_DEFAULT,
+							  GUC_ACTION_SET, true, 0, false) > 0)
+		{
+			/* Log the change if appropriate */
+			if (context == PGC_SIGHUP)
+				ereport(elevel,
+						(errmsg("parameter \"%s\" removed from configuration file, reset to default",
+								gconf->name)));
+		}
+	}
+
+	/*
+	 * Restore any variables determined by environment variables or
+	 * dynamically-computed defaults.  This is a no-op except in the case
+	 * where one of these had been in the config file and is now removed.
+	 *
+	 * In particular, we *must not* do this during the postmaster's initial
+	 * loading of the file, since the timezone functions in particular should
+	 * be run only after initialization is complete.
+	 *
+	 * XXX this is an unmaintainable crock, because we have to know how to set
+	 * (or at least what to call to set) every non-PGC_INTERNAL variable that
+	 * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
+	 */
+	if (context == PGC_SIGHUP && applySettings)
+	{
+		InitializeGUCOptionsFromEnvironment();
+		pg_timezone_abbrev_initialize();
+		/* this selects SQL_ASCII in processes not connected to a database */
+		SetConfigOption("client_encoding", GetDatabaseEncodingName(),
+						PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
+	}
+
+	/*
+	 * Now apply the values from the config file.
+	 */
+	for (item = head; item; item = item->next)
+	{
+		char	   *pre_value = NULL;
+		int			scres;
+
+		/* Ignore anything marked as ignorable */
+		if (item->ignore)
+			continue;
+
+		/* In SIGHUP cases in the postmaster, we want to report changes */
+		if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
+		{
+			const char *preval = GetConfigOption(item->name, true, false);
+
+			/* If option doesn't exist yet or is NULL, treat as empty string */
+			if (!preval)
+				preval = "";
+			/* must dup, else might have dangling pointer below */
+			pre_value = pstrdup(preval);
+		}
+
+		scres = set_config_option(item->name, item->value,
+								  context, PGC_S_FILE,
+								  GUC_ACTION_SET, applySettings, 0, false);
+		if (scres > 0)
+		{
+			/* variable was updated, so log the change if appropriate */
+			if (pre_value)
+			{
+				const char *post_value = GetConfigOption(item->name, true, false);
+
+				if (!post_value)
+					post_value = "";
+				if (strcmp(pre_value, post_value) != 0)
+					ereport(elevel,
+							(errmsg("parameter \"%s\" changed to \"%s\"",
+									item->name, item->value)));
+			}
+			item->applied = true;
+		}
+		else if (scres == 0)
+		{
+			error = true;
+			item->errmsg = pstrdup("setting could not be applied");
+			ConfFileWithError = item->filename;
+		}
+		else
+		{
+			/* no error, but variable's active value was not changed */
+			item->applied = true;
+		}
+
+		/*
+		 * We should update source location unless there was an error, since
+		 * even if the active value didn't change, the reset value might have.
+		 * (In the postmaster, there won't be a difference, but it does matter
+		 * in backends.)
+		 */
+		if (scres != 0 && applySettings)
+			set_config_sourcefile(item->name, item->filename,
+								  item->sourceline);
+
+		if (pre_value)
+			pfree(pre_value);
+	}
+
+	/* Remember when we last successfully loaded the config file. */
+	if (applySettings)
+		PgReloadTime = GetCurrentTimestamp();
+
+bail_out:
+	if (error && applySettings)
+	{
+		/* During postmaster startup, any error is fatal */
+		if (context == PGC_POSTMASTER)
+			ereport(ERROR,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors",
+							ConfFileWithError)));
+		else if (applying)
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
+							ConfFileWithError)));
+		else
+			ereport(elevel,
+					(errcode(ERRCODE_CONFIG_FILE_ERROR),
+					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
+							ConfFileWithError)));
+	}
+
+	/* Successful or otherwise, return the collected data list */
+	return head;
+}
 
 /*
  * Some infrastructure for checking malloc/strdup/realloc calls
@@ -5737,7 +6085,7 @@ guc_var_compare(const void *a, const void *b)
 /*
  * the bare comparison function for GUC names
  */
-static int
+int
 guc_name_compare(const char *namea, const char *nameb)
 {
 	/*
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index e734493a48..aae071cd82 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -442,6 +442,15 @@ extern void GUC_check_errcode(int sqlerrcode);
 	pre_format_elog_string(errno, TEXTDOMAIN), \
 	GUC_check_errhint_string = format_elog_string
 
+/* functions shared between guc.c and guc-file.l */
+extern int	guc_name_compare(const char *namea, const char *nameb);
+extern ConfigVariable *ProcessConfigFileInternal(GucContext context,
+												 bool applySettings, int elevel);
+extern void record_config_file_error(const char *errmsg,
+									 const char *config_file,
+									 int lineno,
+									 ConfigVariable **head_p,
+									 ConfigVariable **tail_p);
 
 /*
  * The following functions are not in guc.c, but are declared here to avoid
-- 
2.36.1

#243John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#242)
Re: build remaining Flex files standalone

I wrote

[v4]

This piece is a leftover from the last version, and forgot to remove
it, will fix:

diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y
index 7577c4515c..e3b750b695 100644
--- a/contrib/cube/cubeparse.y
+++ b/contrib/cube/cubeparse.y
@@ -7,6 +7,7 @@
 #include "postgres.h"

#include "cubedata.h"
+#include "cube_internal.h"
#include "utils/float.h"

--
John Naylor
EDB: http://www.enterprisedb.com

#244Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#240)
Re: [RFC] building postgres with meson - v11

On 17.08.22 23:53, Andres Freund wrote:

Any comment on the pg_regress_ecpg commit? I'd like to get that out of the
way, and it seems considerably cleaner than the hackery we do right now to
make VPATH builds work.

That one looks like a very good improvement.

#245Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#244)
Re: [RFC] building postgres with meson - v11

Hi,

On 2022-08-20 09:38:48 +0200, Peter Eisentraut wrote:

On 17.08.22 23:53, Andres Freund wrote:

Any comment on the pg_regress_ecpg commit? I'd like to get that out of the
way, and it seems considerably cleaner than the hackery we do right now to
make VPATH builds work.

That one looks like a very good improvement.

Thanks for checking! Pushed.

Greetings,

Andres Freund

#246Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#222)
Re: [RFC] building postgres with meson

Hi,

On 2022-08-09 08:37:16 -0400, Andrew Dunstan wrote:

On 2022-08-09 Tu 03:10, Andres Freund wrote:

Hi,

I was looking at re-unifying gendef2.pl that the meson patchset had introduced
for temporary ease during hacking with gendef.pl. Testing that I noticed that
either I and my machine is very confused, or gendef.pl's check whether it can
skip work is bogus.

I noticed that, despite having code to avoid rerunning when the input files
are older than the .def file, it always runs.

# if the def file exists and is newer than all input object files, skip
# its creation
if (-f $deffile
&& (-M $deffile > max(map { -M } <$ARGV[0]/*.obj>)))
{
print "Not re-generating $defname.DEF, file already exists.\n";
exit(0);
}

My understanding of -M is that it returns the time delta between the file
modification and the start of the script. Which makes the use of max() bogus,
since it'll return the oldest time any input has been modified, not the
newest. And the condition needs to be inverted, because we want to skip the
work if $deffile is *newer*, right?

Am I missing something here?

No, you're right, this is bogus. Reversing the test and using min
instead of max is the obvious fix.

I'm tempted to just remove the not-regenerating logic - gendef.pl shouldn't
run if there's nothing to do, and it'll e.g. not notice if there's an
additional input that wasn't there during the last invocation of gendef.pl.

Maybe, need to think about that more.

Any thoughts?

I'd like to commit 0003 in
/messages/by-id/20220811002012.ju3rrz47i2e5tdha@awork3.anarazel.de
fairly soon.

I did fix the bogus "die" message I added during some debugging since posting
that...

Greetings,

Andres Freund

#247Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#245)
3 attachment(s)
Re: [RFC] building postgres with meson - v11

I have looked at your branch at 0545eec895:

258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR

I think these patches are split up a bit incorrectly. If you apply
the first patch by itself, then the output appears in tab_comp_dir/
directly under the source directory. And then the second patch moves
it to tmp_check/tap_comp_dir/. If there is an intent to apply these
patches separately somehow, this should be cleaned up.

I haven't checked the second patch in detail yet, but it looks like
the thought was that the first patch is about ready to go.

834a40e609 meson: prereq: Extend gendef.pl in preparation for meson

I'm not qualified to check that in detail, but it looks reasonable
enough to me.

See attached patch (0001) for a perlcritic fix.

97a0b096e8 meson: prereq: Add src/tools/gen_export.pl

This produces leading whitespace in the output files that at least on
darwin wasn't there before. See attached patch (0002). This should
be checked again on other platforms as well.

Other than that this looks good. Attached is a small cosmetic patch (0003).

40e363b263 meson: prereq: Refactor PG_TEST_EXTRA logic in autoconf build

Since I last looked, this has been turned into a meson option. Which
is probably the best solution. But then we should probably make this
a configure option as well. Otherwise, it could get a bit confusing.
For example, I just unset PG_TEST_EXTRA in my environment to test
something with the meson build, but I was unaware that meson captures
the value at setup time, so my unsetting had no effect.

In any case, maybe adjust the regular expressions to check for word
boundaries, to maintain the original "whitespace-separated"
specification. For example,

elsif ($ENV{PG_TEST_EXTRA} !~ /\bssl\b/)

e0a8387660 solaris: Use versioning scripts instead of -Bsymbolic

This looks like a good idea. The documentation clearly states that
-Bsymbolic shouldn't be used, at least not in the way we have been
doing. Might as well go ahead with this and give it a whirl on the
build farm.

0545eec895 meson: Add docs

We should think more about how to arrange the documentation. We
probably don't want to copy-and-paste all the introductory and
requirements information. I think we can make this initially much
briefer, like the Windows installation chapter. For example, instead
of documenting each setup option again, just mention which ones exist
and then point (link) to the configure chapter for details.

I spent a bit of time with the test suites. I think there is a
problem in that selecting a test suite directly, like

meson test -C _build --suite recovery

doesn't update the tmp_install. So if this is the first thing you run
after a build, everything will fail. Also, if you run this later, the
tmp_install doesn't get updated, so you're not testing up-to-date
code.

Attachments:

0001-Fix-for-perlcritic.patchtext/plain; charset=UTF-8; name=0001-Fix-for-perlcritic.patchDownload
From 2f25b48271bceb7aa1551e015b03fc20b9aff162 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 24 Aug 2022 11:23:52 +0200
Subject: [PATCH 1/3] Fix for perlcritic

---
 src/tools/msvc/gendef.pl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index f08268e781..cfbdef9007 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -174,7 +174,7 @@ sub usage
 {
 	if (-d $in)
 	{
-		push @files, <$in/*.obj>;
+		push @files, glob "$in/*.obj";
 	}
 	else
 	{
-- 
2.37.1

0002-Fix-whitespace-in-output-of-gen_export.pl.patchtext/plain; charset=UTF-8; name=0002-Fix-whitespace-in-output-of-gen_export.pl.patchDownload
From a64c90e756d6996b7d8d9d63d42e30c72d4ce098 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 24 Aug 2022 11:24:22 +0200
Subject: [PATCH 2/3] Fix whitespace in output of gen_export.pl

---
 src/tools/gen_export.pl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
index 6a8b196ad8..1265564473 100644
--- a/src/tools/gen_export.pl
+++ b/src/tools/gen_export.pl
@@ -56,7 +56,7 @@
 		}
 		elsif ($format eq 'darwin')
 		{
-			print $output_handle "    _$1\n";
+			print $output_handle "_$1\n";
 		}
 		elsif ($format eq 'gnu')
 		{
-- 
2.37.1

0003-Some-Perl-code-simplification-in-gen_export.pl.patchtext/plain; charset=UTF-8; name=0003-Some-Perl-code-simplification-in-gen_export.pl.patchDownload
From 5b79baf6bbf4fa62f153a5e96e97f8d5a6345821 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 24 Aug 2022 11:24:36 +0200
Subject: [PATCH 3/3] Some Perl code simplification in gen_export.pl

---
 src/tools/gen_export.pl | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
index 1265564473..727105ba08 100644
--- a/src/tools/gen_export.pl
+++ b/src/tools/gen_export.pl
@@ -48,7 +48,7 @@
 	{
 		# don't do anything with a comment
 	}
-	elsif (/^([^\s]+)\s+([^\s]+)/)
+	elsif (/^(\S+)\s+(\S+)/)
 	{
 		if ($format eq 'aix')
 		{
@@ -79,5 +79,3 @@
 };
 ";
 }
-
-exit(0);
-- 
2.37.1

#248Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#247)
Re: [RFC] building postgres with meson - v11

Hi,

On 2022-08-24 11:39:06 +0200, Peter Eisentraut wrote:

I have looked at your branch at 0545eec895:

258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR

I think these patches are split up a bit incorrectly. If you apply
the first patch by itself, then the output appears in tab_comp_dir/
directly under the source directory. And then the second patch moves
it to tmp_check/tap_comp_dir/. If there is an intent to apply these
patches separately somehow, this should be cleaned up.

How is that happening with that version of the patch? The test puts
tap_comp_dir under TESTDIR, and TESTDIR is $(CURDIR)/tmp_check. There was an
earlier version of the patch that was split one more time that did have that
problem, but I don't quite see how that version has it?

I haven't checked the second patch in detail yet, but it looks like
the thought was that the first patch is about ready to go.

834a40e609 meson: prereq: Extend gendef.pl in preparation for meson

I'm not qualified to check that in detail, but it looks reasonable
enough to me.

See attached patch (0001) for a perlcritic fix.

Thanks.

97a0b096e8 meson: prereq: Add src/tools/gen_export.pl

This produces leading whitespace in the output files that at least on
darwin wasn't there before. See attached patch (0002). This should
be checked again on other platforms as well.

Hm, to me the indentation as is makes more sense, but ...

Other than that this looks good. Attached is a small cosmetic patch (0003).

I wonder if we should rewrite this in python - I chose perl because I thought
we could share it, but as you pointed out, that's not possible, because we
don't want to depend on perl during the autoconf build from a tarball.

e0a8387660 solaris: Use versioning scripts instead of -Bsymbolic

This looks like a good idea. The documentation clearly states that
-Bsymbolic shouldn't be used, at least not in the way we have been
doing. Might as well go ahead with this and give it a whirl on the
build farm.

Cool. I looked at this because I was confused about getting warnings with
autoconf that I wasn't getting with meson.

0545eec895 meson: Add docs

We should think more about how to arrange the documentation. We
probably don't want to copy-and-paste all the introductory and
requirements information. I think we can make this initially much
briefer, like the Windows installation chapter. For example, instead
of documenting each setup option again, just mention which ones exist
and then point (link) to the configure chapter for details.

The current docs, including the windows ones, are already hard to follow. I
think we should take some care to not make the meson bits even more
confusing. Cross referencing left and right seems problematic from that angle.

I spent a bit of time with the test suites. I think there is a
problem in that selecting a test suite directly, like

meson test -C _build --suite recovery

doesn't update the tmp_install. So if this is the first thing you run
after a build, everything will fail. Also, if you run this later, the
tmp_install doesn't get updated, so you're not testing up-to-date
code.

At the moment creation of the tmp_install is its own test suite. I don't know
if that's the best way, or what the best way is, but that explains that
fact. You can do the above without the issue by specifying
--suite setup --suite recovery.

Greetings,

Andres Freund

#249Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#240)
Re: [RFC] building postgres with meson - v11

Hi,

On 2022-08-17 14:53:17 -0700, Andres Freund wrote:

- In the top-level meson.build, the "renaming" of the Windows system
name

host_system = host_machine.system() == 'windows' ? 'win32' :
host_machine.system()
build_system = build_machine.system() == 'windows' ? 'win32' :
build_machine.system()

seems unnecessary to me. Why not stick with the provided names?

Because right now we also use it for things like choosing the "source" for
pg_config_os.h (i.e. include/port/{darwin,linux,win32,..}.h). And it seemed
easier to just have one variable name for all of it.

I am now changing this so that there's an additional 'portname' variable for
this purpose. Otherwise the meson names are used.

Greetings,

Andres Freund

#250samay sharma
smilingsamay@gmail.com
In reply to: Andres Freund (#248)
Re: [RFC] building postgres with meson - v11

Hi,

On Wed, Aug 24, 2022 at 8:30 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-08-24 11:39:06 +0200, Peter Eisentraut wrote:

I have looked at your branch at 0545eec895:

258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR

I think these patches are split up a bit incorrectly. If you apply
the first patch by itself, then the output appears in tab_comp_dir/
directly under the source directory. And then the second patch moves
it to tmp_check/tap_comp_dir/. If there is an intent to apply these
patches separately somehow, this should be cleaned up.

How is that happening with that version of the patch? The test puts
tap_comp_dir under TESTDIR, and TESTDIR is $(CURDIR)/tmp_check. There was
an
earlier version of the patch that was split one more time that did have
that
problem, but I don't quite see how that version has it?

I haven't checked the second patch in detail yet, but it looks like
the thought was that the first patch is about ready to go.

834a40e609 meson: prereq: Extend gendef.pl in preparation for meson

I'm not qualified to check that in detail, but it looks reasonable
enough to me.

See attached patch (0001) for a perlcritic fix.

Thanks.

97a0b096e8 meson: prereq: Add src/tools/gen_export.pl

This produces leading whitespace in the output files that at least on
darwin wasn't there before. See attached patch (0002). This should
be checked again on other platforms as well.

Hm, to me the indentation as is makes more sense, but ...

Other than that this looks good. Attached is a small cosmetic patch

(0003).

I wonder if we should rewrite this in python - I chose perl because I
thought
we could share it, but as you pointed out, that's not possible, because we
don't want to depend on perl during the autoconf build from a tarball.

e0a8387660 solaris: Use versioning scripts instead of -Bsymbolic

This looks like a good idea. The documentation clearly states that
-Bsymbolic shouldn't be used, at least not in the way we have been
doing. Might as well go ahead with this and give it a whirl on the
build farm.

Cool. I looked at this because I was confused about getting warnings with
autoconf that I wasn't getting with meson.

0545eec895 meson: Add docs

We should think more about how to arrange the documentation. We
probably don't want to copy-and-paste all the introductory and
requirements information. I think we can make this initially much
briefer, like the Windows installation chapter. For example, instead
of documenting each setup option again, just mention which ones exist
and then point (link) to the configure chapter for details.

The current docs, including the windows ones, are already hard to follow. I
think we should take some care to not make the meson bits even more
confusing. Cross referencing left and right seems problematic from that
angle.

On Configure options:

To add to the above, very few sections are an exact copy paste. The
arguments and default behaviors of quite a few configure options are
different. The change in default behavior and arguments is primarily due to
"auto" features which get enabled if the dependencies are found. Whereas
with make, we have explicit --enable or --disable options which don't take
any arguments.

Also, a few instructions / commands which worked with make will need to be
done a bit differently due to environment variables etc. which also had to
be communicated.

Communicating these differences and nuances with cross referencing would
make it confusing as most of this information is in the explanation
paragraph.

On requirements:

They are also a bit different eg. readline is not a "required" thing
anymore, perl, flex, bison are required etc. Also, these are bullet points
with information inlined and not separate sections, so cross-referencing
here also would be hard.

Regards,
Samay

Show quoted text

I spent a bit of time with the test suites. I think there is a
problem in that selecting a test suite directly, like

meson test -C _build --suite recovery

doesn't update the tmp_install. So if this is the first thing you run
after a build, everything will fail. Also, if you run this later, the
tmp_install doesn't get updated, so you're not testing up-to-date
code.

At the moment creation of the tmp_install is its own test suite. I don't
know
if that's the best way, or what the best way is, but that explains that
fact. You can do the above without the issue by specifying
--suite setup --suite recovery.

Greetings,

Andres Freund

#251Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#248)
Re: [RFC] building postgres with meson - v11

On 24.08.22 17:30, Andres Freund wrote:

258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR

I think these patches are split up a bit incorrectly. If you apply
the first patch by itself, then the output appears in tab_comp_dir/
directly under the source directory. And then the second patch moves
it to tmp_check/tap_comp_dir/. If there is an intent to apply these
patches separately somehow, this should be cleaned up.

How is that happening with that version of the patch? The test puts
tap_comp_dir under TESTDIR, and TESTDIR is $(CURDIR)/tmp_check. There was an
earlier version of the patch that was split one more time that did have that
problem, but I don't quite see how that version has it?

Ok, I see now how this works. It's a bit weird since the meaning of
TESTDIR is changed. I'm not sure if this could create cross-branch
confusion.

97a0b096e8 meson: prereq: Add src/tools/gen_export.pl

This produces leading whitespace in the output files that at least on
darwin wasn't there before. See attached patch (0002). This should
be checked again on other platforms as well.

Hm, to me the indentation as is makes more sense, but ...

Maybe for the 'gnu' format, but on darwin (and others) it's just a flat
list, so indenting it is pointless.

I wonder if we should rewrite this in python - I chose perl because I thought
we could share it, but as you pointed out, that's not possible, because we
don't want to depend on perl during the autoconf build from a tarball.

Given that the code is already written, I wouldn't do it. Introducing
Python into the toolchain would require considerations of minimum
versions, finding the right binaries, formatting, style checking, etc.,
which would probably be a distraction right now. I also think that this
script, whose purpose is to read an input file line by line and print it
back out slightly differently, is not going to be done better in Python.

#252Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
15 attachment(s)
Re: [RFC] building postgres with meson - v12

Hi,

Attached is v12 of the meson patchset. Lots of improvements:

- initial set of docs for building with meson, contributed by Samay

- PGXS, .pc generation for extensions, making macos tests work when SIP is
enabled, precompiled headers support are all now separate commits

as suggested by Peter Eisentraut

- aix, solaris builds work now (both on gcc only)

- most of the operating system specific considerations are now collected in
one place

There's still the odd check around, but it's mostly for stuff where it seems
to make sense to leave decentralized (e.g. do we need to invoke the dtrace
binary on darwin, using wldap32 on windows, ...)

- split out the existing PG_SYSROOT selection logic from darwin's template
into src/tools/darwin_sysroot

Peter E. rightfully complained that the logic I had so far wasn't
equivalent, and it's finnicky enough that it doesn't seem like a good idea
to have two copies. Not sure about the location, perhaps it should be in
config/ instead?

- loads of cleanups, rebasing, etc

The known things that I think need to be fixed before we could consider test
driving this on a larger scale are:

- the various global variables assembled in the toplevel meson.build need
comments explaining them (e.g. cflags, cflags_sl, ...)

- choice of semaphore API needs to be cleaned up, that should be easy now, but
I thought that I needed to get a new version out first

- there's a few configure tests denoted with FIXMEs, most importantly I
haven't caught up to the PGAC_LDAP_SAFE

Greetings,

Andres Freund

Attachments:

v12-0001-Don-t-hardcode-tmp_check-as-test-directory-for-t.patchtext/x-diff; charset=us-asciiDownload
From 4e15ee0e24fad1e6bf7e9456c92f62bdd4bfe164 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 11 Aug 2022 08:57:58 -0700
Subject: [PATCH v12 01/15] Don't hardcode tmp_check/ as test directory for tap
 tests

This is motivated by the meson patchset, which wants to put the log / data for
tests in a different place than the autoconf build. Right now log files for
tap tests have to be inside $TESTDIR/tmp_check, whereas log files for
pg_regress/isolationtester are outside of tmp_check. This change doesn't fix
the latter, but is a prerequisite.

The only test that needs adjustment is 010_tab_completion.pl, as it hardcoded
the tmp_check/ directory. Instead create a dedicated directory for the test
files.  It's also a bit cleaner independently, because it doesn't intermingle
the test files with more important things like the log/ directory.

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/1131990.1660661896@sss.pgh.pa.us
---
 src/bin/psql/t/010_tab_completion.pl   | 33 +++++++++++++-------------
 src/test/perl/PostgreSQL/Test/Utils.pm |  2 +-
 src/Makefile.global.in                 |  6 ++---
 src/tools/msvc/vcregress.pl            |  2 +-
 4 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 2eea515e871..cb36e8e4811 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -68,7 +68,7 @@ delete $ENV{LS_COLORS};
 
 # In a VPATH build, we'll be started in the source directory, but we want
 # to run in the build directory so that we can use relative paths to
-# access the tmp_check subdirectory; otherwise the output from filename
+# access the tab_comp_dir subdirectory; otherwise the output from filename
 # completion tests is too variable.
 if ($ENV{TESTDIR})
 {
@@ -76,17 +76,18 @@ if ($ENV{TESTDIR})
 }
 
 # Create some junk files for filename completion testing.
+mkdir "tab_comp_dir";
 my $FH;
-open $FH, ">", "tmp_check/somefile"
-  or die("could not create file \"tmp_check/somefile\": $!");
+open $FH, ">", "tab_comp_dir/somefile"
+  or die("could not create file \"tab_comp_dir/somefile\": $!");
 print $FH "some stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile123"
-  or die("could not create file \"tmp_check/afile123\": $!");
+open $FH, ">", "tab_comp_dir/afile123"
+  or die("could not create file \"tab_comp_dir/afile123\": $!");
 print $FH "more stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile456"
-  or die("could not create file \"tmp_check/afile456\": $!");
+open $FH, ">", "tab_comp_dir/afile456"
+  or die("could not create file \"tab_comp_dir/afile456\": $!");
 print $FH "other stuff\n";
 close $FH;
 
@@ -272,16 +273,16 @@ clear_query();
 
 # check filename completion
 check_completion(
-	"\\lo_import tmp_check/some\t",
-	qr|tmp_check/somefile |,
+	"\\lo_import tab_comp_dir/some\t",
+	qr|tab_comp_dir/somefile |,
 	"filename completion with one possibility");
 
 clear_query();
 
 # note: readline might print a bell before the completion
 check_completion(
-	"\\lo_import tmp_check/af\t",
-	qr|tmp_check/af\a?ile|,
+	"\\lo_import tab_comp_dir/af\t",
+	qr|tab_comp_dir/af\a?ile|,
 	"filename completion with multiple possibilities");
 
 # broken versions of libedit require clear_line not clear_query here
@@ -291,15 +292,15 @@ clear_line();
 # note: broken versions of libedit want to backslash the closing quote;
 # not much we can do about that
 check_completion(
-	"COPY foo FROM tmp_check/some\t",
-	qr|'tmp_check/somefile\\?' |,
+	"COPY foo FROM tab_comp_dir/some\t",
+	qr|'tab_comp_dir/somefile\\?' |,
 	"quoted filename completion with one possibility");
 
 clear_line();
 
 check_completion(
-	"COPY foo FROM tmp_check/af\t",
-	qr|'tmp_check/afile|,
+	"COPY foo FROM tab_comp_dir/af\t",
+	qr|'tab_comp_dir/afile|,
 	"quoted filename completion with multiple possibilities");
 
 # some versions of readline/libedit require two tabs here, some only need one
@@ -307,7 +308,7 @@ check_completion(
 # the quotes might appear, too
 check_completion(
 	"\t\t",
-	qr|afile123'? +'?(tmp_check/)?afile456|,
+	qr|afile123'? +'?(tab_comp_dir/)?afile456|,
 	"offer multiple file choices");
 
 clear_line();
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 1ca2cc59170..88a472f2442 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -192,7 +192,7 @@ INIT
 	# Determine output directories, and create them.  The base path is the
 	# TESTDIR environment variable, which is normally set by the invoking
 	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check";
+	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}" : "tmp_check";
 	$log_path = "$tmp_check/log";
 
 	mkdir $tmp_check;
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 5664c645f82..ac686f5fae3 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -453,7 +453,7 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -464,7 +464,7 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -476,7 +476,7 @@ echo "+++ tap check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
+   TESTDIR='$(CURDIR)/tmp_check' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
 endef
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index c3729f6be5e..da152da8e5f 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -291,7 +291,7 @@ sub tap_check
 	$ENV{PG_REGRESS}    = "$topdir/$Config/pg_regress/pg_regress";
 	$ENV{REGRESS_SHLIB} = "$topdir/src/test/regress/regress.dll";
 
-	$ENV{TESTDIR} = "$dir";
+	$ENV{TESTDIR} = "$dir/tmp_check";
 	my $module = basename $dir;
 	# add the module build dir as the second element in the PATH
 	$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
-- 
2.37.0.3.g30cc8d0f14

v12-0002-Split-TESTDIR-into-TESTLOGDIR-and-TESTDATADIR.patchtext/x-diff; charset=us-asciiDownload
From 1a3169bc3fe25f254e5f7b0547236b00fa55c5b3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 15 Aug 2022 19:49:44 -0700
Subject: [PATCH v12 02/15] Split TESTDIR into TESTLOGDIR and TESTDATADIR

The motivation for this is twofold. For one the meson patchset would like to
have more control over the logfiles. For another, the log file location for
tap tests (tmp_check/log) is not symmetric to the log location for
pg_regress/isolation tests (log/).

This commit does not change the default location for log files for tap tests,
as that'd break the buildfarm log collection, it just provides the
infrastructure for doing so.
---
 src/bin/psql/t/010_tab_completion.pl   |  4 ++--
 src/test/perl/PostgreSQL/Test/Utils.pm | 10 +++++-----
 src/Makefile.global.in                 | 12 +++++++++---
 src/tools/msvc/vcregress.pl            |  4 +++-
 4 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index cb36e8e4811..4aa6dd5fe13 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -70,9 +70,9 @@ delete $ENV{LS_COLORS};
 # to run in the build directory so that we can use relative paths to
 # access the tab_comp_dir subdirectory; otherwise the output from filename
 # completion tests is too variable.
-if ($ENV{TESTDIR})
+if ($ENV{TESTDATADIR})
 {
-	chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+	chdir $ENV{TESTDATADIR} or die "could not chdir to \"$ENV{TESTDATADIR}\": $!";
 }
 
 # Create some junk files for filename completion testing.
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 88a472f2442..99d33451064 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -189,11 +189,11 @@ INIT
 	# test may still fail, but it's more likely to report useful facts.
 	$SIG{PIPE} = 'IGNORE';
 
-	# Determine output directories, and create them.  The base path is the
-	# TESTDIR environment variable, which is normally set by the invoking
-	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}" : "tmp_check";
-	$log_path = "$tmp_check/log";
+	# Determine output directories, and create them.  The base paths are the
+	# TESTDATADIR / TESTLOGDIR environment variables, which are normally set
+	# by the invoking Makefile.
+	$tmp_check = $ENV{TESTDATADIR} ? "$ENV{TESTDATADIR}" : "tmp_check";
+	$log_path = $ENV{TESTLOGDIR} ? "$ENV{TESTLOGDIR}" : "log";
 
 	mkdir $tmp_check;
 	mkdir $log_path;
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index ac686f5fae3..407cf047708 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -453,7 +453,9 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' \
+   TESTDATADIR='$(CURDIR)/tmp_check' \
+   PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -464,7 +466,9 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' \
+   TESTDATADIR='$(CURDIR)/tmp_check' \
+   PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -476,7 +480,9 @@ echo "+++ tap check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)/tmp_check' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' $(with_temp_install) \
+   TESTDATADIR='$(CURDIR)/tmp_check' $(with_temp_install) \
+   PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
 endef
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index da152da8e5f..5182721eb79 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -291,7 +291,9 @@ sub tap_check
 	$ENV{PG_REGRESS}    = "$topdir/$Config/pg_regress/pg_regress";
 	$ENV{REGRESS_SHLIB} = "$topdir/src/test/regress/regress.dll";
 
-	$ENV{TESTDIR} = "$dir/tmp_check";
+	$ENV{TESTDATADIR} = "$dir/tmp_check";
+	$ENV{TESTLOGDIR} = "$dir/tmp_check/log";
+
 	my $module = basename $dir;
 	# add the module build dir as the second element in the PATH
 	$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
-- 
2.37.0.3.g30cc8d0f14

v12-0003-meson-prereq-Extend-gendef.pl-in-preparation-for.patchtext/x-diff; charset=us-asciiDownload
From 96d1d0a0cfe8d1113d48be08de7b48a5fb4fafed Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 9 Aug 2022 00:29:57 -0700
Subject: [PATCH v12 03/15] meson: prereq: Extend gendef.pl in preparation for
 meson

The main issue with using gendef.pl as is for meson is that with meson the
filenames are a bit longer, exceeding the max commandline length when calling
dumpbin with all objects. It's easier to pass a library in anyway.

The .def file location, input and temporary file location need to be tunable
as well.

This also fixes a bug in gendef.pl: The logic when to regenerate was broken
and never avoid regenerating.

Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Discussion: https://postgr.es/m/20220809071055.rgikv3qn74ypnnbb@awork3.anarazel.de
Discussion: https://postgr.es/m/7dae5979-c6c0-cec5-7a36-76a85aa8053d@enterprisedb.com
---
 src/tools/msvc/MSBuildProject.pm |  4 +-
 src/tools/msvc/gendef.pl         | 72 ++++++++++++++++++++++----------
 2 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 62acdda3a19..3581fa4a123 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -312,6 +312,8 @@ sub WriteItemDefinitionGroup
 
 	my $targetmachine =
 	  $self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64';
+	my $arch =
+	  $self->{platform} eq 'Win32' ? 'x86' : 'x86_64';
 
 	my $includes = join ';', @{ $self->{includes} }, "";
 
@@ -381,7 +383,7 @@ EOF
 		print $f <<EOF;
     <PreLinkEvent>
       <Message>Generate DEF file</Message>
-      <Command>perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name} $self->{platform}</Command>
+      <Command>perl src\\tools\\msvc\\gendef.pl --arch $arch --deffile $cfgname\\$self->{name}\\$self->{name}.def $cfgname\\$self->{name}</Command>
     </PreLinkEvent>
 EOF
 	}
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index b8c514a8311..cfbdef9007d 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -4,7 +4,8 @@
 use strict;
 use warnings;
 use 5.8.0;
-use List::Util qw(max);
+use List::Util qw(min);
+use Getopt::Long;
 
 my @def;
 
@@ -113,7 +114,7 @@ sub extract_syms
 
 sub writedef
 {
-	my ($deffile, $platform, $def) = @_;
+	my ($deffile, $arch, $def) = @_;
 	open(my $fh, '>', $deffile) || die "Could not write to $deffile\n";
 	print $fh "EXPORTS\n";
 	foreach my $f (sort keys %{$def})
@@ -122,7 +123,7 @@ sub writedef
 
 		# Strip the leading underscore for win32, but not x64
 		$f =~ s/^_//
-		  unless ($platform eq "x64");
+		  unless ($arch eq "x86_64");
 
 		# Emit just the name if it's a function symbol, or emit the name
 		# decorated with the DATA option for variables.
@@ -142,40 +143,69 @@ sub writedef
 
 sub usage
 {
-	die(    "Usage: gendef.pl <modulepath> <platform>\n"
-		  . "    modulepath: path to dir with obj files, no trailing slash"
-		  . "    platform: Win32 | x64");
+	my $add = shift;
+
+	die(    "Usage: gendef.pl --arch <arch> --deffile <deffile> --tempdir <tempdir> files or directories\n"
+		  . "    arch: x86 | x86_64\n"
+		  . "    outfile: \n"
+		  . "    tempdir: directory for temporary objects\n"
+		  . "    $add\n"
+	  );
 }
 
-usage()
-  unless scalar(@ARGV) == 2
-  && ( ($ARGV[0] =~ /\\([^\\]+$)/)
-	&& ($ARGV[1] eq 'Win32' || $ARGV[1] eq 'x64'));
-my $defname  = uc $1;
-my $deffile  = "$ARGV[0]/$defname.def";
-my $platform = $ARGV[1];
+my $arch;
+my $deffile;
+my $tempdir = '.';
+
+GetOptions(
+	'arch:s'   => \$arch,
+	'deffile:s'    => \$deffile,
+	'tempdir:s' => \$tempdir,
+  ) or usage();
+
+usage("arch: $arch") unless
+  ($arch eq 'x86' || $arch eq 'x86_64');
+
+print join(' ', @ARGV)."\n";
+
+my @files;
+
+foreach my $in (@ARGV)
+{
+	if (-d $in)
+	{
+		push @files, glob "$in/*.obj";
+	}
+	else
+	{
+		push @files, $in;
+	}
+}
 
 # if the def file exists and is newer than all input object files, skip
 # its creation
 if (-f $deffile
-	&& (-M $deffile > max(map { -M } <$ARGV[0]/*.obj>)))
+	&& (-M $deffile < min(map { -M } @files)))
 {
-	print "Not re-generating $defname.DEF, file already exists.\n";
+	print "Not re-generating $deffile, file already exists.\n";
 	exit(0);
 }
 
-print "Generating $defname.DEF from directory $ARGV[0], platform $platform\n";
+print STDERR "Generating $deffile in tempdir $tempdir\n";
 
 my %def = ();
 
-my $symfile = "$ARGV[0]/all.sym";
-my $tmpfile = "$ARGV[0]/tmp.sym";
-system("dumpbin /symbols /out:$tmpfile $ARGV[0]/*.obj >NUL")
-  && die "Could not call dumpbin";
+my $symfile = "$tempdir/all.sym";
+my $tmpfile = "$tempdir/tmp.sym";
+mkdir($tempdir) unless -d $tempdir;
+
+my $cmd = "dumpbin /symbols /out:$tmpfile ".join(' ', @files);
+
+system($cmd) && die "Could not call dumpbin";
 rename($tmpfile, $symfile);
 extract_syms($symfile, \%def);
 print "\n";
 
-writedef($deffile, $platform, \%def);
+writedef($deffile, $arch, \%def);
 
 print "Generated " . scalar(keys(%def)) . " symbols\n";
-- 
2.37.0.3.g30cc8d0f14

v12-0004-meson-prereq-Add-src-tools-gen_export.pl.patchtext/x-diff; charset=us-asciiDownload
From 581721fa995d929b3df0a1da0d4cf51edb4e58f4 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v12 04/15] meson: prereq: Add src/tools/gen_export.pl

Currently the logic is all in src/Makefile.shlib. This adds a sketch of a
generation script that can be used from meson.

Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Discussion: https://postgr.es/m/7dae5979-c6c0-cec5-7a36-76a85aa8053d@enterprisedb.com
---
 src/tools/gen_export.pl | 81 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)
 create mode 100644 src/tools/gen_export.pl

diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
new file mode 100644
index 00000000000..3a368c85381
--- /dev/null
+++ b/src/tools/gen_export.pl
@@ -0,0 +1,81 @@
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $format;
+my $libname;
+my $input;
+my $output;
+
+GetOptions(
+	'format:s'   => \$format,
+	'libname:s'    => \$libname,
+	'input:s' => \$input,
+	'output:s'  => \$output) or die "wrong arguments";
+
+if (not ($format eq 'aix' or $format eq 'darwin' or $format eq 'gnu' or $format eq 'win'))
+{
+	die "$0: $format is not yet handled (only aix, darwin, gnu, win are)\n";
+}
+
+open(my $input_handle, '<', $input)
+  or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+  or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+	print $output_handle "{
+  global:
+";
+}
+elsif ($format eq 'win')
+{
+	# XXX: Looks like specifying LIBRARY $libname is optional, which makes it
+	# easier to build a generic command for generating export files...
+	if ($libname)
+	{
+		print $output_handle "LIBRARY $libname\n";
+	}
+	print $output_handle "EXPORTS\n";
+}
+
+while (<$input_handle>)
+{
+	if (/^#/)
+	{
+		# don't do anything with a comment
+	}
+	elsif (/^(\S+)\s+(\S+)/)
+	{
+		if ($format eq 'aix')
+		{
+			print $output_handle "    $1\n";
+		}
+		elsif ($format eq 'darwin')
+		{
+			print $output_handle "    _$1\n";
+		}
+		elsif ($format eq 'gnu')
+		{
+			print $output_handle "    $1;\n";
+		}
+		elsif ($format eq 'win')
+		{
+			print $output_handle "    $1 @ $2\n";
+		}
+	}
+	else
+	{
+		die "$0: unexpected line $_\n";
+	}
+}
+
+if ($format eq 'gnu')
+{
+	print $output_handle "  local: *;
+};
+";
+}
-- 
2.37.0.3.g30cc8d0f14

v12-0005-meson-prereq-Refactor-PG_TEST_EXTRA-logic-in-aut.patchtext/x-diff; charset=us-asciiDownload
From 4245cc888e6dfd1bdb5f234968e041a5751c43d4 Mon Sep 17 00:00:00 2001
From: nbyavuz <byavuz81@gmail.com>
Date: Fri, 25 Mar 2022 10:55:08 +0300
Subject: [PATCH v12 05/15] meson: prereq: Refactor PG_TEST_EXTRA logic in
 autoconf build

---
 src/test/Makefile               | 15 +++++----------
 src/test/kerberos/t/001_auth.pl |  4 ++++
 src/test/ldap/t/001_auth.pl     |  4 ++++
 src/test/ssl/t/001_ssltests.pl  |  4 ++++
 src/test/ssl/t/002_scram.pl     |  4 ++++
 src/test/ssl/t/003_sslinfo.pl   |  4 ++++
 6 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/test/Makefile b/src/test/Makefile
index 69ef074d75e..dbd3192874d 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -17,25 +17,20 @@ SUBDIRS = perl regress isolation modules authentication recovery subscription
 ifeq ($(with_icu),yes)
 SUBDIRS += icu
 endif
-
-# Test suites that are not safe by default but can be run if selected
-# by the user via the whitespace-separated list in variable
-# PG_TEST_EXTRA:
 ifeq ($(with_gssapi),yes)
-ifneq (,$(filter kerberos,$(PG_TEST_EXTRA)))
 SUBDIRS += kerberos
 endif
-endif
 ifeq ($(with_ldap),yes)
-ifneq (,$(filter ldap,$(PG_TEST_EXTRA)))
 SUBDIRS += ldap
 endif
-endif
 ifeq ($(with_ssl),openssl)
-ifneq (,$(filter ssl,$(PG_TEST_EXTRA)))
 SUBDIRS += ssl
 endif
-endif
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA to check it in individual tap tests.
+export PG_TEST_EXTRA
 
 # We don't build or execute these by default, but we do want "make
 # clean" etc to recurse into them.  (We must filter out those that we
diff --git a/src/test/kerberos/t/001_auth.pl b/src/test/kerberos/t/001_auth.pl
index 62e05426393..e403d24c0c2 100644
--- a/src/test/kerberos/t/001_auth.pl
+++ b/src/test/kerberos/t/001_auth.pl
@@ -25,6 +25,10 @@ if ($ENV{with_gssapi} ne 'yes')
 {
 	plan skip_all => 'GSSAPI/Kerberos not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /kerberos/)
+{
+	plan skip_all => 'Potentially unsafe test GSSAPI/Kerberos not enabled in PG_TEST_EXTRA';
+}
 
 my ($krb5_bin_dir, $krb5_sbin_dir);
 
diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index 86dff8bd1f3..a5afddc5272 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -16,6 +16,10 @@ if ($ENV{with_ldap} ne 'yes')
 {
 	plan skip_all => 'LDAP not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ldap/)
+{
+	plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA';
+}
 elsif ($^O eq 'darwin' && -d '/usr/local/opt/openldap')
 {
 	# typical paths for Homebrew
diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl
index fa26212de9a..f58ff8d578b 100644
--- a/src/test/ssl/t/001_ssltests.pl
+++ b/src/test/ssl/t/001_ssltests.pl
@@ -17,6 +17,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl
index 588f47a39b9..15d45c88e50 100644
--- a/src/test/ssl/t/002_scram.pl
+++ b/src/test/ssl/t/002_scram.pl
@@ -20,6 +20,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl
index 87fb18a31e0..acd0ba8e828 100644
--- a/src/test/ssl/t/003_sslinfo.pl
+++ b/src/test/ssl/t/003_sslinfo.pl
@@ -18,6 +18,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 #### Some configuration
 my $ssl_server = SSL::Server->new();
-- 
2.37.0.3.g30cc8d0f14

v12-0006-meson-prereq-Fix-warning-compat_informix-rnull.p.patchtext/x-diff; charset=us-asciiDownload
From 3afe803e0f611e11882832b408407605993015ef Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 8 Aug 2022 21:01:39 -0700
Subject: [PATCH v12 06/15] meson: prereq: Fix warning
 compat_informix/rnull.pgc with msvc

src/interfaces/ecpg/test/compat_informix/rnull.pgc(19,1): warning C4305: 'initializing': truncation from 'double' to 'float'

The more obvious fix would be an 'f' suffix, but ecpg can't parse that.
---
 src/interfaces/ecpg/test/compat_informix/rnull.pgc        | 2 +-
 src/interfaces/ecpg/test/expected/compat_informix-rnull.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/interfaces/ecpg/test/compat_informix/rnull.pgc b/src/interfaces/ecpg/test/compat_informix/rnull.pgc
index a6ad35e3bc9..232629fcd4a 100644
--- a/src/interfaces/ecpg/test/compat_informix/rnull.pgc
+++ b/src/interfaces/ecpg/test/compat_informix/rnull.pgc
@@ -16,7 +16,7 @@ int main(void)
 	$short s = 17;
 	$int i = -74874;
 	$bool b = 1;
-	$float f = 3.71;
+	$float f = (float) 3.71;
 	$long l = 487444;
 	$double dbl = 404.404;
 	$decimal dec;
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-rnull.c b/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
index d7ba69c1fbf..3efb2be117b 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
@@ -58,7 +58,7 @@ int main(void)
 
 	
 #line 19 "rnull.pgc"
- float f = 3.71 ;
+ float f = ( float ) 3.71 ;
 
 #line 19 "rnull.pgc"
 
-- 
2.37.0.3.g30cc8d0f14

v12-0007-meson-prereq-Move-darwin-sysroot-determination-i.patchtext/x-diff; charset=us-asciiDownload
From ae7733f46c500f57ca24dad8ab303e9349a61db1 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 26 Aug 2022 09:49:40 -0700
Subject: [PATCH v12 07/15] meson: prereq: Move darwin sysroot determination
 into separate file

---
 src/template/darwin                           | 41 +++----------------
 src/{template/darwin => tools/darwin_sysroot} | 34 ++++-----------
 2 files changed, 14 insertions(+), 61 deletions(-)
 copy src/{template/darwin => tools/darwin_sysroot} (61%)
 mode change 100644 => 100755

diff --git a/src/template/darwin b/src/template/darwin
index fd30e19b6a7..e8eb9390687 100644
--- a/src/template/darwin
+++ b/src/template/darwin
@@ -3,41 +3,12 @@
 # Note: Darwin is the original code name for macOS, also known as OS X.
 # We still use "darwin" as the port name, partly because config.guess does.
 
-# Select where system include files should be sought, if user didn't say.
-if test x"$PG_SYSROOT" = x"" ; then
-  # This is far more complicated than it ought to be.  We first ask
-  # "xcrun --show-sdk-path", which seems to match the default -isysroot
-  # setting of Apple's compilers.
-  PG_SYSROOT=`xcrun --show-sdk-path 2>/dev/null`
-  # That may fail, or produce a result that is not version-specific (i.e.,
-  # just ".../SDKs/MacOSX.sdk").  Using a version-specific sysroot seems
-  # desirable, so if the path is a non-version-specific symlink, expand it.
-  if test -L "$PG_SYSROOT"; then
-    if expr x"$PG_SYSROOT" : '.*[0-9]\.[0-9][^/]*$' >/dev/null ; then : okay
-    else
-      PG_SYSROOT=`expr "$PG_SYSROOT" : '\(.*\)/'`/`readlink "$PG_SYSROOT"`
-    fi
-  fi
-  # If there are still not digits in the directory name, try
-  # "xcrun --sdk macosx --show-sdk-path"; and if that still doesn't work,
-  # fall back to asking xcodebuild, which is often a good deal slower.
-  if expr x"$PG_SYSROOT" : '.*[0-9]\.[0-9][^/]*$' >/dev/null ; then : okay
-  else
-    PG_SYSROOT=`xcrun --sdk macosx --show-sdk-path 2>/dev/null`
-    if expr x"$PG_SYSROOT" : '.*[0-9]\.[0-9][^/]*$' >/dev/null ; then : okay
-    else
-      PG_SYSROOT=`xcodebuild -version -sdk macosx Path 2>/dev/null`
-    fi
-  fi
-fi
-# Validate the result: if it doesn't point at a directory, ignore it.
-if test x"$PG_SYSROOT" != x"" ; then
-  if test -d "$PG_SYSROOT" ; then
-    CPPFLAGS="-isysroot $PG_SYSROOT $CPPFLAGS"
-    LDFLAGS="-isysroot $PG_SYSROOT $LDFLAGS"
-  else
-    PG_SYSROOT=""
-  fi
+# Select where system include files should be sought
+PG_SYSROOT=`${srcdir}/src/tools/darwin_sysroot $PG_SYSROOT`
+
+if test -d "$PG_SYSROOT" ; then
+  CPPFLAGS="-isysroot $PG_SYSROOT $CPPFLAGS"
+  LDFLAGS="-isysroot $PG_SYSROOT $LDFLAGS"
 fi
 
 # Extra CFLAGS for code that will go into a shared library
diff --git a/src/template/darwin b/src/tools/darwin_sysroot
old mode 100644
new mode 100755
similarity index 61%
copy from src/template/darwin
copy to src/tools/darwin_sysroot
index fd30e19b6a7..1cdf81221a7
--- a/src/template/darwin
+++ b/src/tools/darwin_sysroot
@@ -1,9 +1,12 @@
-# src/template/darwin
+#!/bin/sh
+#
+# Select where system include files should be sought. If the user specified a
+# sysroot, validate it.
+#
+# A separate script so it can be shared between autoconf and meson.
 
-# Note: Darwin is the original code name for macOS, also known as OS X.
-# We still use "darwin" as the port name, partly because config.guess does.
+PG_SYSROOT=$1
 
-# Select where system include files should be sought, if user didn't say.
 if test x"$PG_SYSROOT" = x"" ; then
   # This is far more complicated than it ought to be.  We first ask
   # "xcrun --show-sdk-path", which seems to match the default -isysroot
@@ -33,27 +36,6 @@ fi
 # Validate the result: if it doesn't point at a directory, ignore it.
 if test x"$PG_SYSROOT" != x"" ; then
   if test -d "$PG_SYSROOT" ; then
-    CPPFLAGS="-isysroot $PG_SYSROOT $CPPFLAGS"
-    LDFLAGS="-isysroot $PG_SYSROOT $LDFLAGS"
-  else
-    PG_SYSROOT=""
+    echo $PG_SYSROOT
   fi
 fi
-
-# Extra CFLAGS for code that will go into a shared library
-CFLAGS_SL=""
-
-# Select appropriate semaphore support.  Darwin 6.0 (macOS 10.2) and up
-# support System V semaphores; before that we have to use named POSIX
-# semaphores, which are less good for our purposes because they eat a
-# file descriptor per backend per max_connection slot.
-case $host_os in
-  darwin[015].*)
-    USE_NAMED_POSIX_SEMAPHORES=1
-    ;;
-  *)
-    USE_SYSV_SEMAPHORES=1
-    ;;
-esac
-
-DLSUFFIX=".dylib"
-- 
2.37.0.3.g30cc8d0f14

v12-0008-meson-Add-meson-based-buildsystem.patchtext/x-diff; charset=utf-8Download
From a1fb97a81bdb4670f510383abfc1d1bb4816ad17 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v12 08/15] meson: Add meson based buildsystem

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Peter Eisentraut <peter@eisentraut.org>
Author: Thomas Munro <thomas.munro@gmail.com>
Author: John Naylor <john.naylor@enterprisedb.com>
Author: Stone Tickle <lattis@mochiro.moe>
---
 src/include/catalog/meson.build               |  142 +
 src/include/meson.build                       |  174 +
 src/include/nodes/meson.build                 |   58 +
 src/include/parser/meson.build                |   14 +
 src/include/pg_config_ext.h.meson             |    7 +
 src/include/storage/meson.build               |   19 +
 src/include/utils/meson.build                 |   57 +
 src/common/meson.build                        |  174 +
 src/common/unicode/meson.build                |  107 +
 src/port/meson.build                          |  184 +
 src/port/win32ver.rc.in                       |   41 +
 config/meson.build                            |    4 +
 src/backend/access/brin/meson.build           |   12 +
 src/backend/access/common/meson.build         |   18 +
 src/backend/access/gin/meson.build            |   17 +
 src/backend/access/gist/meson.build           |   13 +
 src/backend/access/hash/meson.build           |   12 +
 src/backend/access/heap/meson.build           |   11 +
 src/backend/access/index/meson.build          |    6 +
 src/backend/access/meson.build                |   13 +
 src/backend/access/nbtree/meson.build         |   13 +
 src/backend/access/rmgrdesc/meson.build       |   26 +
 src/backend/access/spgist/meson.build         |   13 +
 src/backend/access/table/meson.build          |    6 +
 src/backend/access/tablesample/meson.build    |    5 +
 src/backend/access/transam/meson.build        |   31 +
 src/backend/backup/meson.build                |   13 +
 src/backend/bootstrap/meson.build             |   15 +
 src/backend/catalog/meson.build               |   44 +
 src/backend/commands/meson.build              |   51 +
 src/backend/executor/meson.build              |   67 +
 src/backend/foreign/meson.build               |    3 +
 src/backend/jit/llvm/meson.build              |   73 +
 src/backend/jit/meson.build                   |    3 +
 src/backend/lib/meson.build                   |   12 +
 src/backend/libpq/meson.build                 |   32 +
 src/backend/main/meson.build                  |    2 +
 src/backend/meson.build                       |  187 +
 src/backend/nodes/meson.build                 |   29 +
 src/backend/optimizer/geqo/meson.build        |   17 +
 src/backend/optimizer/meson.build             |    5 +
 src/backend/optimizer/path/meson.build        |   11 +
 src/backend/optimizer/plan/meson.build        |   10 +
 src/backend/optimizer/prep/meson.build        |    7 +
 src/backend/optimizer/util/meson.build        |   16 +
 src/backend/parser/meson.build                |   49 +
 src/backend/partitioning/meson.build          |    5 +
 src/backend/po/meson.build                    |    1 +
 src/backend/port/meson.build                  |   31 +
 src/backend/port/win32/meson.build            |    6 +
 src/backend/postmaster/meson.build            |   15 +
 src/backend/regex/meson.build                 |    8 +
 .../replication/libpqwalreceiver/meson.build  |   13 +
 src/backend/replication/logical/meson.build   |   14 +
 src/backend/replication/meson.build           |   45 +
 src/backend/replication/pgoutput/meson.build  |   11 +
 src/backend/rewrite/meson.build               |    9 +
 src/backend/snowball/meson.build              |   88 +
 src/backend/statistics/meson.build            |    6 +
 src/backend/storage/buffer/meson.build        |    7 +
 src/backend/storage/file/meson.build          |    8 +
 src/backend/storage/freespace/meson.build     |    5 +
 src/backend/storage/ipc/meson.build           |   20 +
 src/backend/storage/large_object/meson.build  |    3 +
 src/backend/storage/lmgr/meson.build          |   13 +
 src/backend/storage/meson.build               |    9 +
 src/backend/storage/page/meson.build          |    5 +
 src/backend/storage/smgr/meson.build          |    4 +
 src/backend/storage/sync/meson.build          |    4 +
 src/backend/tcop/meson.build                  |    8 +
 src/backend/tsearch/meson.build               |   21 +
 src/backend/utils/activity/meson.build        |   18 +
 src/backend/utils/adt/meson.build             |  122 +
 src/backend/utils/cache/meson.build           |   16 +
 src/backend/utils/error/meson.build           |    6 +
 src/backend/utils/fmgr/meson.build            |    8 +
 src/backend/utils/hash/meson.build            |    4 +
 src/backend/utils/init/meson.build            |    4 +
 .../utils/mb/conversion_procs/meson.build     |   36 +
 src/backend/utils/mb/meson.build              |    9 +
 src/backend/utils/meson.build                 |   17 +
 src/backend/utils/misc/meson.build            |   33 +
 src/backend/utils/mmgr/meson.build            |   10 +
 src/backend/utils/resowner/meson.build        |    3 +
 src/backend/utils/sort/meson.build            |    9 +
 src/backend/utils/time/meson.build            |    4 +
 src/fe_utils/meson.build                      |   29 +
 src/bin/initdb/meson.build                    |   39 +
 src/bin/initdb/po/meson.build                 |    1 +
 src/bin/meson.build                           |   20 +
 src/bin/pg_amcheck/meson.build                |   26 +
 src/bin/pg_amcheck/po/meson.build             |    1 +
 src/bin/pg_archivecleanup/meson.build         |   18 +
 src/bin/pg_archivecleanup/po/meson.build      |    1 +
 src/bin/pg_basebackup/meson.build             |   58 +
 src/bin/pg_basebackup/po/meson.build          |    1 +
 src/bin/pg_checksums/meson.build              |   20 +
 src/bin/pg_checksums/po/meson.build           |    1 +
 src/bin/pg_config/meson.build                 |   18 +
 src/bin/pg_config/po/meson.build              |    1 +
 src/bin/pg_controldata/meson.build            |   18 +
 src/bin/pg_controldata/po/meson.build         |    1 +
 src/bin/pg_ctl/meson.build                    |   21 +
 src/bin/pg_ctl/po/meson.build                 |    1 +
 src/bin/pg_dump/meson.build                   |   83 +
 src/bin/pg_dump/po/meson.build                |    1 +
 src/bin/pg_resetwal/meson.build               |   19 +
 src/bin/pg_resetwal/po/meson.build            |    1 +
 src/bin/pg_rewind/meson.build                 |   41 +
 src/bin/pg_rewind/po/meson.build              |    1 +
 src/bin/pg_test_fsync/meson.build             |   18 +
 src/bin/pg_test_fsync/po/meson.build          |    1 +
 src/bin/pg_test_timing/meson.build            |   18 +
 src/bin/pg_test_timing/po/meson.build         |    1 +
 src/bin/pg_upgrade/meson.build                |   39 +
 src/bin/pg_upgrade/po/meson.build             |    1 +
 src/bin/pg_verifybackup/meson.build           |   32 +
 src/bin/pg_verifybackup/po/meson.build        |    1 +
 src/bin/pg_waldump/meson.build                |   29 +
 src/bin/pg_waldump/po/meson.build             |    1 +
 src/bin/pgbench/meson.build                   |   42 +
 src/bin/pgevent/meson.build                   |   38 +
 src/bin/psql/meson.build                      |   74 +
 src/bin/psql/po/meson.build                   |    1 +
 src/bin/scripts/meson.build                   |   50 +
 src/bin/scripts/po/meson.build                |    1 +
 src/interfaces/libpq/meson.build              |  104 +
 src/interfaces/libpq/po/meson.build           |    1 +
 src/interfaces/libpq/test/meson.build         |   15 +
 src/pl/meson.build                            |    5 +
 src/pl/plperl/meson.build                     |   92 +
 src/pl/plperl/po/meson.build                  |    1 +
 src/pl/plpgsql/meson.build                    |    1 +
 src/pl/plpgsql/src/meson.build                |   83 +
 src/pl/plpgsql/src/po/meson.build             |    1 +
 src/pl/plpython/meson.build                   |   98 +
 src/pl/plpython/po/meson.build                |    1 +
 src/pl/tcl/meson.build                        |   54 +
 src/pl/tcl/po/meson.build                     |    1 +
 contrib/adminpack/meson.build                 |   22 +
 contrib/amcheck/meson.build                   |   36 +
 contrib/auth_delay/meson.build                |    4 +
 contrib/auto_explain/meson.build              |   15 +
 contrib/basebackup_to_shell/meson.build       |   22 +
 contrib/basic_archive/meson.build             |   23 +
 contrib/bloom/meson.build                     |   35 +
 contrib/bool_plperl/meson.build               |   41 +
 contrib/btree_gin/meson.build                 |   53 +
 contrib/btree_gist/meson.build                |   83 +
 contrib/citext/meson.build                    |   33 +
 contrib/cube/meson.build                      |   52 +
 contrib/dblink/meson.build                    |   30 +
 contrib/dict_int/meson.build                  |   21 +
 contrib/dict_xsyn/meson.build                 |   28 +
 contrib/earthdistance/meson.build             |   22 +
 contrib/file_fdw/meson.build                  |   21 +
 contrib/fuzzystrmatch/meson.build             |   25 +
 contrib/hstore/meson.build                    |   43 +
 contrib/hstore_plperl/meson.build             |   42 +
 contrib/hstore_plpython/meson.build           |   36 +
 contrib/intagg/meson.build                    |    6 +
 contrib/intarray/meson.build                  |   36 +
 contrib/isn/meson.build                       |   32 +
 contrib/jsonb_plperl/meson.build              |   42 +
 contrib/jsonb_plpython/meson.build            |   35 +
 contrib/lo/meson.build                        |   26 +
 contrib/ltree/meson.build                     |   43 +
 contrib/ltree_plpython/meson.build            |   36 +
 contrib/meson.build                           |   66 +
 contrib/oid2name/meson.build                  |   16 +
 contrib/old_snapshot/meson.build              |   14 +
 contrib/pageinspect/meson.build               |   59 +
 contrib/passwordcheck/meson.build             |   29 +
 contrib/pg_buffercache/meson.build            |   26 +
 contrib/pg_freespacemap/meson.build           |   28 +
 contrib/pg_prewarm/meson.build                |   26 +
 contrib/pg_stat_statements/meson.build        |   34 +
 contrib/pg_surgery/meson.build                |   24 +
 contrib/pg_trgm/meson.build                   |   34 +
 contrib/pg_visibility/meson.build             |   26 +
 contrib/pg_walinspect/meson.build             |   37 +
 contrib/pgcrypto/meson.build                  |   99 +
 contrib/pgrowlocks/meson.build                |   14 +
 contrib/pgstattuple/meson.build               |   31 +
 contrib/postgres_fdw/meson.build              |   33 +
 contrib/seg/meson.build                       |   50 +
 contrib/sepgsql/meson.build                   |   33 +
 contrib/spi/meson.build                       |   46 +
 contrib/sslinfo/meson.build                   |   20 +
 contrib/tablefunc/meson.build                 |   24 +
 contrib/tcn/meson.build                       |   23 +
 contrib/test_decoding/meson.build             |   62 +
 contrib/tsm_system_rows/meson.build           |   23 +
 contrib/tsm_system_time/meson.build           |   23 +
 contrib/unaccent/meson.build                  |   31 +
 contrib/uuid-ossp/meson.build                 |   32 +
 contrib/vacuumlo/meson.build                  |   16 +
 contrib/xml2/meson.build                      |   31 +
 src/interfaces/ecpg/compatlib/meson.build     |   21 +
 src/interfaces/ecpg/ecpglib/meson.build       |   36 +
 src/interfaces/ecpg/ecpglib/po/meson.build    |    1 +
 src/interfaces/ecpg/include/meson.build       |   51 +
 src/interfaces/ecpg/meson.build               |    5 +
 src/interfaces/ecpg/pgtypeslib/meson.build    |   29 +
 src/interfaces/ecpg/preproc/meson.build       |  104 +
 src/interfaces/ecpg/preproc/po/meson.build    |    1 +
 .../ecpg/test/compat_informix/meson.build     |   31 +
 .../ecpg/test/compat_oracle/meson.build       |   20 +
 src/interfaces/ecpg/test/connect/meson.build  |   20 +
 src/interfaces/ecpg/test/meson.build          |   77 +
 .../ecpg/test/pgtypeslib/meson.build          |   21 +
 src/interfaces/ecpg/test/preproc/meson.build  |   37 +
 src/interfaces/ecpg/test/sql/meson.build      |   46 +
 src/interfaces/ecpg/test/thread/meson.build   |   21 +
 src/interfaces/meson.build                    |    2 +
 doc/src/sgml/meson.build                      |  262 ++
 doc/src/sgml/resolv.xsl                       |    7 +
 doc/src/sgml/version.sgml.in                  |    2 +
 src/test/authentication/meson.build           |   11 +
 src/test/icu/meson.build                      |   11 +
 src/test/isolation/meson.build                |   55 +
 src/test/kerberos/meson.build                 |   15 +
 src/test/ldap/meson.build                     |   11 +
 src/test/meson.build                          |   23 +
 src/test/modules/brin/meson.build             |   16 +
 src/test/modules/commit_ts/meson.build        |   18 +
 src/test/modules/delay_execution/meson.build  |   17 +
 src/test/modules/dummy_index_am/meson.build   |   22 +
 src/test/modules/dummy_seclabel/meson.build   |   22 +
 src/test/modules/libpq_pipeline/meson.build   |   20 +
 src/test/modules/meson.build                  |   27 +
 src/test/modules/plsample/meson.build         |   22 +
 src/test/modules/snapshot_too_old/meson.build |   14 +
 src/test/modules/spgist_name_ops/meson.build  |   22 +
 .../ssl_passphrase_callback/meson.build       |   47 +
 src/test/modules/test_bloomfilter/meson.build |   22 +
 src/test/modules/test_ddl_deparse/meson.build |   42 +
 src/test/modules/test_extensions/meson.build  |   45 +
 .../modules/test_ginpostinglist/meson.build   |   22 +
 src/test/modules/test_integerset/meson.build  |   22 +
 src/test/modules/test_lfind/meson.build       |   22 +
 src/test/modules/test_misc/meson.build        |   12 +
 src/test/modules/test_oat_hooks/meson.build   |   17 +
 src/test/modules/test_parser/meson.build      |   22 +
 src/test/modules/test_pg_dump/meson.build     |   22 +
 src/test/modules/test_predtest/meson.build    |   22 +
 src/test/modules/test_rbtree/meson.build      |   22 +
 src/test/modules/test_regex/meson.build       |   23 +
 src/test/modules/test_rls_hooks/meson.build   |   16 +
 src/test/modules/test_shm_mq/meson.build      |   26 +
 src/test/modules/unsafe_tests/meson.build     |   11 +
 src/test/modules/worker_spi/meson.build       |   25 +
 src/test/recovery/meson.build                 |   43 +
 src/test/regress/meson.build                  |   58 +
 src/test/ssl/meson.build                      |   13 +
 src/test/subscription/meson.build             |   42 +
 configure                                     |    6 +
 configure.ac                                  |    6 +
 conversion_helpers.txt                        |   16 +
 meson.build                                   | 3009 +++++++++++++++++
 meson_options.txt                             |  176 +
 src/meson.build                               |   12 +
 src/timezone/meson.build                      |   53 +
 src/timezone/tznames/meson.build              |   21 +
 src/tools/find_meson                          |   27 +
 src/tools/pgflex                              |   63 +
 src/tools/rcgen                               |   34 +
 src/tools/testwrap                            |   46 +
 268 files changed, 10844 insertions(+)
 create mode 100644 src/include/catalog/meson.build
 create mode 100644 src/include/meson.build
 create mode 100644 src/include/nodes/meson.build
 create mode 100644 src/include/parser/meson.build
 create mode 100644 src/include/pg_config_ext.h.meson
 create mode 100644 src/include/storage/meson.build
 create mode 100644 src/include/utils/meson.build
 create mode 100644 src/common/meson.build
 create mode 100644 src/common/unicode/meson.build
 create mode 100644 src/port/meson.build
 create mode 100644 src/port/win32ver.rc.in
 create mode 100644 config/meson.build
 create mode 100644 src/backend/access/brin/meson.build
 create mode 100644 src/backend/access/common/meson.build
 create mode 100644 src/backend/access/gin/meson.build
 create mode 100644 src/backend/access/gist/meson.build
 create mode 100644 src/backend/access/hash/meson.build
 create mode 100644 src/backend/access/heap/meson.build
 create mode 100644 src/backend/access/index/meson.build
 create mode 100644 src/backend/access/meson.build
 create mode 100644 src/backend/access/nbtree/meson.build
 create mode 100644 src/backend/access/rmgrdesc/meson.build
 create mode 100644 src/backend/access/spgist/meson.build
 create mode 100644 src/backend/access/table/meson.build
 create mode 100644 src/backend/access/tablesample/meson.build
 create mode 100644 src/backend/access/transam/meson.build
 create mode 100644 src/backend/backup/meson.build
 create mode 100644 src/backend/bootstrap/meson.build
 create mode 100644 src/backend/catalog/meson.build
 create mode 100644 src/backend/commands/meson.build
 create mode 100644 src/backend/executor/meson.build
 create mode 100644 src/backend/foreign/meson.build
 create mode 100644 src/backend/jit/llvm/meson.build
 create mode 100644 src/backend/jit/meson.build
 create mode 100644 src/backend/lib/meson.build
 create mode 100644 src/backend/libpq/meson.build
 create mode 100644 src/backend/main/meson.build
 create mode 100644 src/backend/meson.build
 create mode 100644 src/backend/nodes/meson.build
 create mode 100644 src/backend/optimizer/geqo/meson.build
 create mode 100644 src/backend/optimizer/meson.build
 create mode 100644 src/backend/optimizer/path/meson.build
 create mode 100644 src/backend/optimizer/plan/meson.build
 create mode 100644 src/backend/optimizer/prep/meson.build
 create mode 100644 src/backend/optimizer/util/meson.build
 create mode 100644 src/backend/parser/meson.build
 create mode 100644 src/backend/partitioning/meson.build
 create mode 100644 src/backend/po/meson.build
 create mode 100644 src/backend/port/meson.build
 create mode 100644 src/backend/port/win32/meson.build
 create mode 100644 src/backend/postmaster/meson.build
 create mode 100644 src/backend/regex/meson.build
 create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
 create mode 100644 src/backend/replication/logical/meson.build
 create mode 100644 src/backend/replication/meson.build
 create mode 100644 src/backend/replication/pgoutput/meson.build
 create mode 100644 src/backend/rewrite/meson.build
 create mode 100644 src/backend/snowball/meson.build
 create mode 100644 src/backend/statistics/meson.build
 create mode 100644 src/backend/storage/buffer/meson.build
 create mode 100644 src/backend/storage/file/meson.build
 create mode 100644 src/backend/storage/freespace/meson.build
 create mode 100644 src/backend/storage/ipc/meson.build
 create mode 100644 src/backend/storage/large_object/meson.build
 create mode 100644 src/backend/storage/lmgr/meson.build
 create mode 100644 src/backend/storage/meson.build
 create mode 100644 src/backend/storage/page/meson.build
 create mode 100644 src/backend/storage/smgr/meson.build
 create mode 100644 src/backend/storage/sync/meson.build
 create mode 100644 src/backend/tcop/meson.build
 create mode 100644 src/backend/tsearch/meson.build
 create mode 100644 src/backend/utils/activity/meson.build
 create mode 100644 src/backend/utils/adt/meson.build
 create mode 100644 src/backend/utils/cache/meson.build
 create mode 100644 src/backend/utils/error/meson.build
 create mode 100644 src/backend/utils/fmgr/meson.build
 create mode 100644 src/backend/utils/hash/meson.build
 create mode 100644 src/backend/utils/init/meson.build
 create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
 create mode 100644 src/backend/utils/mb/meson.build
 create mode 100644 src/backend/utils/meson.build
 create mode 100644 src/backend/utils/misc/meson.build
 create mode 100644 src/backend/utils/mmgr/meson.build
 create mode 100644 src/backend/utils/resowner/meson.build
 create mode 100644 src/backend/utils/sort/meson.build
 create mode 100644 src/backend/utils/time/meson.build
 create mode 100644 src/fe_utils/meson.build
 create mode 100644 src/bin/initdb/meson.build
 create mode 100644 src/bin/initdb/po/meson.build
 create mode 100644 src/bin/meson.build
 create mode 100644 src/bin/pg_amcheck/meson.build
 create mode 100644 src/bin/pg_amcheck/po/meson.build
 create mode 100644 src/bin/pg_archivecleanup/meson.build
 create mode 100644 src/bin/pg_archivecleanup/po/meson.build
 create mode 100644 src/bin/pg_basebackup/meson.build
 create mode 100644 src/bin/pg_basebackup/po/meson.build
 create mode 100644 src/bin/pg_checksums/meson.build
 create mode 100644 src/bin/pg_checksums/po/meson.build
 create mode 100644 src/bin/pg_config/meson.build
 create mode 100644 src/bin/pg_config/po/meson.build
 create mode 100644 src/bin/pg_controldata/meson.build
 create mode 100644 src/bin/pg_controldata/po/meson.build
 create mode 100644 src/bin/pg_ctl/meson.build
 create mode 100644 src/bin/pg_ctl/po/meson.build
 create mode 100644 src/bin/pg_dump/meson.build
 create mode 100644 src/bin/pg_dump/po/meson.build
 create mode 100644 src/bin/pg_resetwal/meson.build
 create mode 100644 src/bin/pg_resetwal/po/meson.build
 create mode 100644 src/bin/pg_rewind/meson.build
 create mode 100644 src/bin/pg_rewind/po/meson.build
 create mode 100644 src/bin/pg_test_fsync/meson.build
 create mode 100644 src/bin/pg_test_fsync/po/meson.build
 create mode 100644 src/bin/pg_test_timing/meson.build
 create mode 100644 src/bin/pg_test_timing/po/meson.build
 create mode 100644 src/bin/pg_upgrade/meson.build
 create mode 100644 src/bin/pg_upgrade/po/meson.build
 create mode 100644 src/bin/pg_verifybackup/meson.build
 create mode 100644 src/bin/pg_verifybackup/po/meson.build
 create mode 100644 src/bin/pg_waldump/meson.build
 create mode 100644 src/bin/pg_waldump/po/meson.build
 create mode 100644 src/bin/pgbench/meson.build
 create mode 100644 src/bin/pgevent/meson.build
 create mode 100644 src/bin/psql/meson.build
 create mode 100644 src/bin/psql/po/meson.build
 create mode 100644 src/bin/scripts/meson.build
 create mode 100644 src/bin/scripts/po/meson.build
 create mode 100644 src/interfaces/libpq/meson.build
 create mode 100644 src/interfaces/libpq/po/meson.build
 create mode 100644 src/interfaces/libpq/test/meson.build
 create mode 100644 src/pl/meson.build
 create mode 100644 src/pl/plperl/meson.build
 create mode 100644 src/pl/plperl/po/meson.build
 create mode 100644 src/pl/plpgsql/meson.build
 create mode 100644 src/pl/plpgsql/src/meson.build
 create mode 100644 src/pl/plpgsql/src/po/meson.build
 create mode 100644 src/pl/plpython/meson.build
 create mode 100644 src/pl/plpython/po/meson.build
 create mode 100644 src/pl/tcl/meson.build
 create mode 100644 src/pl/tcl/po/meson.build
 create mode 100644 contrib/adminpack/meson.build
 create mode 100644 contrib/amcheck/meson.build
 create mode 100644 contrib/auth_delay/meson.build
 create mode 100644 contrib/auto_explain/meson.build
 create mode 100644 contrib/basebackup_to_shell/meson.build
 create mode 100644 contrib/basic_archive/meson.build
 create mode 100644 contrib/bloom/meson.build
 create mode 100644 contrib/bool_plperl/meson.build
 create mode 100644 contrib/btree_gin/meson.build
 create mode 100644 contrib/btree_gist/meson.build
 create mode 100644 contrib/citext/meson.build
 create mode 100644 contrib/cube/meson.build
 create mode 100644 contrib/dblink/meson.build
 create mode 100644 contrib/dict_int/meson.build
 create mode 100644 contrib/dict_xsyn/meson.build
 create mode 100644 contrib/earthdistance/meson.build
 create mode 100644 contrib/file_fdw/meson.build
 create mode 100644 contrib/fuzzystrmatch/meson.build
 create mode 100644 contrib/hstore/meson.build
 create mode 100644 contrib/hstore_plperl/meson.build
 create mode 100644 contrib/hstore_plpython/meson.build
 create mode 100644 contrib/intagg/meson.build
 create mode 100644 contrib/intarray/meson.build
 create mode 100644 contrib/isn/meson.build
 create mode 100644 contrib/jsonb_plperl/meson.build
 create mode 100644 contrib/jsonb_plpython/meson.build
 create mode 100644 contrib/lo/meson.build
 create mode 100644 contrib/ltree/meson.build
 create mode 100644 contrib/ltree_plpython/meson.build
 create mode 100644 contrib/meson.build
 create mode 100644 contrib/oid2name/meson.build
 create mode 100644 contrib/old_snapshot/meson.build
 create mode 100644 contrib/pageinspect/meson.build
 create mode 100644 contrib/passwordcheck/meson.build
 create mode 100644 contrib/pg_buffercache/meson.build
 create mode 100644 contrib/pg_freespacemap/meson.build
 create mode 100644 contrib/pg_prewarm/meson.build
 create mode 100644 contrib/pg_stat_statements/meson.build
 create mode 100644 contrib/pg_surgery/meson.build
 create mode 100644 contrib/pg_trgm/meson.build
 create mode 100644 contrib/pg_visibility/meson.build
 create mode 100644 contrib/pg_walinspect/meson.build
 create mode 100644 contrib/pgcrypto/meson.build
 create mode 100644 contrib/pgrowlocks/meson.build
 create mode 100644 contrib/pgstattuple/meson.build
 create mode 100644 contrib/postgres_fdw/meson.build
 create mode 100644 contrib/seg/meson.build
 create mode 100644 contrib/sepgsql/meson.build
 create mode 100644 contrib/spi/meson.build
 create mode 100644 contrib/sslinfo/meson.build
 create mode 100644 contrib/tablefunc/meson.build
 create mode 100644 contrib/tcn/meson.build
 create mode 100644 contrib/test_decoding/meson.build
 create mode 100644 contrib/tsm_system_rows/meson.build
 create mode 100644 contrib/tsm_system_time/meson.build
 create mode 100644 contrib/unaccent/meson.build
 create mode 100644 contrib/uuid-ossp/meson.build
 create mode 100644 contrib/vacuumlo/meson.build
 create mode 100644 contrib/xml2/meson.build
 create mode 100644 src/interfaces/ecpg/compatlib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/po/meson.build
 create mode 100644 src/interfaces/ecpg/include/meson.build
 create mode 100644 src/interfaces/ecpg/meson.build
 create mode 100644 src/interfaces/ecpg/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/po/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_informix/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_oracle/meson.build
 create mode 100644 src/interfaces/ecpg/test/connect/meson.build
 create mode 100644 src/interfaces/ecpg/test/meson.build
 create mode 100644 src/interfaces/ecpg/test/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/test/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/test/sql/meson.build
 create mode 100644 src/interfaces/ecpg/test/thread/meson.build
 create mode 100644 src/interfaces/meson.build
 create mode 100644 doc/src/sgml/meson.build
 create mode 100644 doc/src/sgml/resolv.xsl
 create mode 100644 doc/src/sgml/version.sgml.in
 create mode 100644 src/test/authentication/meson.build
 create mode 100644 src/test/icu/meson.build
 create mode 100644 src/test/isolation/meson.build
 create mode 100644 src/test/kerberos/meson.build
 create mode 100644 src/test/ldap/meson.build
 create mode 100644 src/test/meson.build
 create mode 100644 src/test/modules/brin/meson.build
 create mode 100644 src/test/modules/commit_ts/meson.build
 create mode 100644 src/test/modules/delay_execution/meson.build
 create mode 100644 src/test/modules/dummy_index_am/meson.build
 create mode 100644 src/test/modules/dummy_seclabel/meson.build
 create mode 100644 src/test/modules/libpq_pipeline/meson.build
 create mode 100644 src/test/modules/meson.build
 create mode 100644 src/test/modules/plsample/meson.build
 create mode 100644 src/test/modules/snapshot_too_old/meson.build
 create mode 100644 src/test/modules/spgist_name_ops/meson.build
 create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
 create mode 100644 src/test/modules/test_bloomfilter/meson.build
 create mode 100644 src/test/modules/test_ddl_deparse/meson.build
 create mode 100644 src/test/modules/test_extensions/meson.build
 create mode 100644 src/test/modules/test_ginpostinglist/meson.build
 create mode 100644 src/test/modules/test_integerset/meson.build
 create mode 100644 src/test/modules/test_lfind/meson.build
 create mode 100644 src/test/modules/test_misc/meson.build
 create mode 100644 src/test/modules/test_oat_hooks/meson.build
 create mode 100644 src/test/modules/test_parser/meson.build
 create mode 100644 src/test/modules/test_pg_dump/meson.build
 create mode 100644 src/test/modules/test_predtest/meson.build
 create mode 100644 src/test/modules/test_rbtree/meson.build
 create mode 100644 src/test/modules/test_regex/meson.build
 create mode 100644 src/test/modules/test_rls_hooks/meson.build
 create mode 100644 src/test/modules/test_shm_mq/meson.build
 create mode 100644 src/test/modules/unsafe_tests/meson.build
 create mode 100644 src/test/modules/worker_spi/meson.build
 create mode 100644 src/test/recovery/meson.build
 create mode 100644 src/test/regress/meson.build
 create mode 100644 src/test/ssl/meson.build
 create mode 100644 src/test/subscription/meson.build
 create mode 100644 conversion_helpers.txt
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 src/meson.build
 create mode 100644 src/timezone/meson.build
 create mode 100644 src/timezone/tznames/meson.build
 create mode 100755 src/tools/find_meson
 create mode 100755 src/tools/pgflex
 create mode 100755 src/tools/rcgen
 create mode 100755 src/tools/testwrap

diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..45ffa99692e
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,142 @@
+catalog_headers = [
+  'pg_proc.h',
+  'pg_type.h',
+  'pg_attribute.h',
+  'pg_class.h',
+  'pg_attrdef.h',
+  'pg_constraint.h',
+  'pg_inherits.h',
+  'pg_index.h',
+  'pg_operator.h',
+  'pg_opfamily.h',
+  'pg_opclass.h',
+  'pg_am.h',
+  'pg_amop.h',
+  'pg_amproc.h',
+  'pg_language.h',
+  'pg_largeobject_metadata.h',
+  'pg_largeobject.h',
+  'pg_aggregate.h',
+  'pg_statistic.h',
+  'pg_statistic_ext.h',
+  'pg_statistic_ext_data.h',
+  'pg_rewrite.h',
+  'pg_trigger.h',
+  'pg_event_trigger.h',
+  'pg_description.h',
+  'pg_cast.h',
+  'pg_enum.h',
+  'pg_namespace.h',
+  'pg_conversion.h',
+  'pg_depend.h',
+  'pg_database.h',
+  'pg_db_role_setting.h',
+  'pg_tablespace.h',
+  'pg_authid.h',
+  'pg_auth_members.h',
+  'pg_shdepend.h',
+  'pg_shdescription.h',
+  'pg_ts_config.h',
+  'pg_ts_config_map.h',
+  'pg_ts_dict.h',
+  'pg_ts_parser.h',
+  'pg_ts_template.h',
+  'pg_extension.h',
+  'pg_foreign_data_wrapper.h',
+  'pg_foreign_server.h',
+  'pg_user_mapping.h',
+  'pg_foreign_table.h',
+  'pg_policy.h',
+  'pg_replication_origin.h',
+  'pg_default_acl.h',
+  'pg_init_privs.h',
+  'pg_seclabel.h',
+  'pg_shseclabel.h',
+  'pg_collation.h',
+  'pg_parameter_acl.h',
+  'pg_partitioned_table.h',
+  'pg_range.h',
+  'pg_transform.h',
+  'pg_sequence.h',
+  'pg_publication.h',
+  'pg_publication_namespace.h',
+  'pg_publication_rel.h',
+  'pg_subscription.h',
+  'pg_subscription_rel.h',
+]
+
+bki_data = [
+  'pg_aggregate.dat',
+  'pg_am.dat',
+  'pg_amop.dat',
+  'pg_amproc.dat',
+  'pg_authid.dat',
+  'pg_cast.dat',
+  'pg_class.dat',
+  'pg_collation.dat',
+  'pg_conversion.dat',
+  'pg_database.dat',
+  'pg_language.dat',
+  'pg_namespace.dat',
+  'pg_opclass.dat',
+  'pg_operator.dat',
+  'pg_opfamily.dat',
+  'pg_proc.dat',
+  'pg_range.dat',
+  'pg_tablespace.dat',
+  'pg_ts_config.dat',
+  'pg_ts_config_map.dat',
+  'pg_ts_dict.dat',
+  'pg_ts_parser.dat',
+  'pg_ts_template.dat',
+  'pg_type.dat',
+]
+bki_data_f = files(bki_data)
+
+
+input = []
+output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
+output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+
+foreach h : catalog_headers
+  fname = h.split('.h')[0] + '_d.h'
+  input += files(h)
+  output_files += fname
+  output_install += dir_include_server / 'catalog'
+endforeach
+
+generated_catalog_headers = custom_target('generated_catalog_headers',
+  output: output_files,
+  install_dir: output_install,
+  input: input,
+  depend_files: bki_data_f,
+  build_by_default: true,
+  install: true,
+  command: [
+    perl,
+    files('../../backend/catalog/genbki.pl'),
+    '--include-path=@SOURCE_ROOT@/src/include',
+    '--set-version=' + pg_version_major.to_string(),
+    '--output=@OUTDIR@', '@INPUT@'
+  ],
+)
+
+generated_headers += generated_catalog_headers.to_list()
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/catalog': output_files + ['bki-stamp']}
+generated_sources_ac += {'src/include/catalog': ['header-stamp']}
+
+# 'reformat-dat-files' is a convenience target for rewriting the
+# catalog data files in our standard format.  This includes collapsing
+# out any entries that are redundant with a BKI_DEFAULT annotation.
+run_target('reformat-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f],
+)
+
+# 'expand-dat-files' is a convenience target for expanding out all
+# default values in the catalog data files.  This should be run before
+# altering or removing any BKI_DEFAULT annotation.
+run_target('expand-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f, '--full-tuples'],
+)
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..66991c43d35
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,174 @@
+pg_config_ext = configure_file(
+  input: 'pg_config_ext.h.meson',
+  output: 'pg_config_ext.h',
+  configuration: cdata,
+  install: true,
+  install_dir: dir_include,
+)
+configure_files += pg_config_ext
+
+pg_config_os = configure_file(
+  output: 'pg_config_os.h',
+  input: files('port/@0@.h'.format(portname)),
+  install: true,
+  install_dir: dir_include,
+  copy: true,
+)
+configure_files += pg_config_os
+
+pg_config = configure_file(
+  output: 'pg_config.h',
+  install: true,
+  install_dir: dir_include,
+  configuration: cdata,
+)
+configure_files += pg_config
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', dir_prefix / dir_bin)
+config_paths_data.set_quoted('PGSHAREDIR', dir_prefix / dir_data)
+config_paths_data.set_quoted('SYSCONFDIR', dir_prefix / dir_sysconf)
+config_paths_data.set_quoted('INCLUDEDIR', dir_prefix / dir_include)
+config_paths_data.set_quoted('PKGINCLUDEDIR', dir_prefix / dir_include_pkg)
+config_paths_data.set_quoted('INCLUDEDIRSERVER', dir_prefix / dir_include_server)
+config_paths_data.set_quoted('LIBDIR', dir_prefix / dir_lib)
+config_paths_data.set_quoted('PKGLIBDIR', dir_prefix / dir_lib_pkg)
+config_paths_data.set_quoted('LOCALEDIR', dir_prefix / dir_locale)
+config_paths_data.set_quoted('DOCDIR', dir_prefix / dir_doc)
+config_paths_data.set_quoted('HTMLDIR', dir_prefix / dir_doc_html)
+config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
+
+
+var_cc = ' '.join(cc.cmd_array())
+var_cpp = ' '.join(cc.cmd_array() + ['-E'])
+var_cflags = ' '.join(cflags + cflags_warn)
+var_cxxflags = ' '.join(cxxflags + cxxflags_warn)
+var_cppflags = ' '.join(cppflags)
+var_cflags_sl = '-fPIC' #FIXME
+var_ldflags = ' '.join(ldflags)
+var_ldflags_sl = ''.join(ldflags_sl)
+var_ldflags_ex = '' # FIXME
+# FIXME - some extensions might directly use symbols from one of libs. If
+# that symbol isn't used by postgres, and statically linked, it'll cause an
+# undefined symbol at runtime. And obviously it'll cause problems for
+# executables, although those are probably less common.
+var_libs = ''
+
+
+pg_config_paths = configure_file(
+  output: 'pg_config_paths.h',
+  configuration: config_paths_data,
+  install: false,
+)
+configure_files += pg_config_paths
+
+install_headers(
+  'pg_config_manual.h',
+  'postgres_ext.h',
+)
+
+install_headers(
+  'libpq/libpq-fs.h',
+  install_dir: dir_include / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'port.h',
+  'postgres_fe.h',
+  install_dir: dir_include_internal
+)
+
+install_headers(
+  'libpq/pqcomm.h',
+  install_dir: dir_include_internal / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'fmgr.h',
+  'funcapi.h',
+  'getopt_long.h',
+  'miscadmin.h',
+  'pg_config_manual.h',
+  'pg_getopt.h',
+  'pg_trace.h',
+  'pgstat.h',
+  'pgtar.h',
+  'pgtime.h',
+  'port.h',
+  'postgres.h',
+  'postgres_ext.h',
+  'postgres_fe.h',
+  'windowapi.h',
+  pg_config_ext,
+  pg_config_os,
+  pg_config,
+  install_dir: dir_include_server,
+)
+
+subdir('catalog')
+subdir('nodes')
+subdir('parser')
+subdir('storage')
+subdir('utils')
+
+header_subdirs = [
+  'access',
+  'catalog',
+  'bootstrap',
+  'commands',
+  'common',
+  'datatype',
+  'executor',
+  'fe_utils',
+  'foreign',
+  'jit',
+  'lib',
+  'libpq',
+  'mb',
+  'nodes',
+  'optimizer',
+  'parser',
+  'partitioning',
+  'postmaster',
+  'regex',
+  'replication',
+  'rewrite',
+  'statistics',
+  'storage',
+  'tcop',
+  'snowball',
+  'tsearch',
+  'utils',
+  'port',
+  'portability',
+]
+
+# XXX: installing headers this way has the danger of installing editor files
+# etc, unfortunately install_subdir() doesn't allow including / excluding by
+# pattern currently.
+foreach d : header_subdirs
+  if d == 'catalog'
+    continue
+  endif
+  install_subdir(d, install_dir: dir_include_server,
+                 exclude_files: ['.gitignore', 'meson.build'])
+endforeach
+
+install_subdir('catalog',
+  install_dir: dir_include_server,
+  exclude_files: [
+    '.gitignore',
+    'Makefile',
+    'duplicate_oids',
+    'meson.build',
+    'reformat_dat_file.pl',
+    'renumber_oids.pl',
+    'unused_oids',
+  ] + bki_data,
+)
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/include': ['stamp-h', 'stamp-ext-h']}
diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build
new file mode 100644
index 00000000000..b7df232081f
--- /dev/null
+++ b/src/include/nodes/meson.build
@@ -0,0 +1,58 @@
+node_support_input_i = [
+  'nodes/nodes.h',
+  'nodes/primnodes.h',
+  'nodes/parsenodes.h',
+  'nodes/pathnodes.h',
+  'nodes/plannodes.h',
+  'nodes/execnodes.h',
+  'access/amapi.h',
+  'access/sdir.h',
+  'access/tableam.h',
+  'access/tsmapi.h',
+  'commands/event_trigger.h',
+  'commands/trigger.h',
+  'executor/tuptable.h',
+  'foreign/fdwapi.h',
+  'nodes/extensible.h',
+  'nodes/lockoptions.h',
+  'nodes/replnodes.h',
+  'nodes/supportnodes.h',
+  'nodes/value.h',
+  'utils/rel.h',
+]
+
+node_support_input = []
+foreach i : node_support_input_i
+  node_support_input += meson.source_root() / 'src' / 'include' / i
+endforeach
+
+node_support_output = [
+  'nodetags.h',
+  'outfuncs.funcs.c', 'outfuncs.switch.c',
+  'readfuncs.funcs.c', 'readfuncs.switch.c',
+  'copyfuncs.funcs.c', 'copyfuncs.switch.c',
+  'equalfuncs.funcs.c', 'equalfuncs.switch.c',
+]
+node_support_install = [
+  dir_include_server / 'nodes',
+  false, false,
+  false, false,
+  false, false,
+  false, false,
+]
+
+generated_nodes = custom_target('nodetags.h',
+  input: node_support_input,
+  output: node_support_output,
+  command: [
+    perl, files('../../backend/nodes/gen_node_support.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'],
+  install: true,
+  install_dir: node_support_install,
+)
+generated_headers += generated_nodes[0]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/nodes': node_support_output + ['node-support-stamp']}
+generated_sources_ac += {'src/include/nodes': ['header-stamp']}
diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build
new file mode 100644
index 00000000000..942d9acd733
--- /dev/null
+++ b/src/include/parser/meson.build
@@ -0,0 +1,14 @@
+backend_parser = custom_target('gram',
+  input: [files('../../backend/parser/gram.y')],
+  output: ['gram.c', 'gram.h'],
+  command: [bison_cmd, '-d', '@INPUT@'],
+  install: true,
+  # Only install gram.h, not gram.c
+  install_dir: [false, dir_include_server / 'parser'],
+)
+
+backend_parser_code = backend_parser[0]
+backend_parser_header = backend_parser[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/parser': ['gram.c', 'gram.h']}
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in.  This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..eae9f98920e
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,19 @@
+lwlocknames = custom_target('lwlocknames',
+  input: files('../../backend/storage/lmgr/lwlocknames.txt'),
+  output: ['lwlocknames.h', 'lwlocknames.c'],
+  command: [
+    perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'
+  ],
+  build_by_default: true,
+  install: true,
+  install_dir: [dir_include_server / 'storage', false],
+)
+
+lwlocknames_h = lwlocknames[0]
+
+generated_backend_headers += lwlocknames_h
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.c', 'lwlocknames.h']}
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..bded105f7ea
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,57 @@
+errcodes = custom_target('errcodes',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: ['errcodes.h'],
+  command: [
+    perl, files('../../backend/utils/generate-errcodes.pl'),
+    '--outfile', '@OUTPUT@',
+    '@INPUT@',
+  ],
+  install: true,
+  install_dir: dir_include_server / 'utils',
+)
+generated_headers += errcodes
+
+if dtrace.found()
+  probes_tmp = custom_target('probes.h.tmp',
+    input: files('../../backend/utils/probes.d'),
+    output: 'probes.h.tmp',
+    command: [dtrace, '-C', '-h', '-s', '@INPUT@', '-o', '@OUTPUT@'],
+  )
+  probes = custom_target('probes.h',
+    input: probes_tmp,
+    output: 'probes.h',
+    capture: true,
+    command: [sed, '-f', files('../../backend/utils/postprocess_dtrace.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server / 'utils',
+  )
+else
+  probes = custom_target('probes.h',
+    input: files('../../backend/utils/probes.d'),
+    output: 'probes.h',
+    capture: true,
+    command: [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server / 'utils',
+  )
+endif
+
+generated_backend_headers += probes
+
+fmgrtab_output = ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c']
+fmgrtab_target = custom_target('fmgrtab',
+  input: '../catalog/pg_proc.dat',
+  output : fmgrtab_output,
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'],
+  install: true,
+  install_dir: [dir_include_server / 'utils', dir_include_server / 'utils', false],
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {
+  'src/backend/utils': fmgrtab_output + ['errcodes.h', 'probes.h', 'fmgr-stamp'],
+  'src/include/utils': ['header-stamp'],
+}
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..23842e1ffef
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,174 @@
+common_sources = files(
+  'archive.c',
+  'base64.c',
+  'checksum_helper.c',
+  'compression.c',
+  'controldata_utils.c',
+  'encnames.c',
+  'exec.c',
+  'file_perm.c',
+  'file_utils.c',
+  'hashfn.c',
+  'ip.c',
+  'jsonapi.c',
+  'keywords.c',
+  'kwlookup.c',
+  'link-canary.c',
+  'md5_common.c',
+  'pg_get_line.c',
+  'pg_lzcompress.c',
+  'pg_prng.c',
+  'pgfnames.c',
+  'psprintf.c',
+  'relpath.c',
+  'rmtree.c',
+  'saslprep.c',
+  'scram-common.c',
+  'string.c',
+  'stringinfo.c',
+  'unicode_norm.c',
+  'username.c',
+  'wait_error.c',
+  'wchar.c',
+)
+
+if ssl.found()
+  common_sources += files(
+    'cryptohash_openssl.c',
+    'hmac_openssl.c',
+    'protocol_openssl.c',
+  )
+else
+  common_sources += files(
+    'cryptohash.c',
+    'hmac.c',
+    'md5.c',
+    'sha1.c',
+    'sha2.c',
+  )
+endif
+
+common_kwlist = custom_target('kwlist',
+  input: files('../include/parser/kwlist.h'),
+  output: 'kwlist_d.h',
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+      '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+generated_sources += common_kwlist
+common_sources += common_kwlist
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+  'd2s.c',
+  'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+  ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+config_info_sources = files('config_info.c',)
+config_info_cflags = [
+  '-DVAL_CC="@0@"'.format(var_cc),
+  '-DVAL_CPPFLAGS="@0@"'.format(var_cppflags),
+  '-DVAL_CFLAGS="@0@"'.format(var_cflags),
+  '-DVAL_CFLAGS_SL="@0@"'.format(var_cflags_sl),
+  '-DVAL_LDFLAGS="@0@"'.format(var_ldflags),
+  '-DVAL_LDFLAGS_EX="@0@"'.format(var_ldflags_ex),
+  '-DVAL_LDFLAGS_SL="@0@"'.format(var_ldflags_sl),
+  '-DVAL_LIBS="@0@"'.format(var_libs),
+]
+
+# Some files need to be built with different cflags. The different sets are
+# defined here.
+common_cflags = {
+  'ryu': ryu_cflags,
+  'config_info': config_info_cflags,
+}
+common_sources_cflags = {
+  'ryu': ryu_sources,
+  'config_info': config_info_sources
+}
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+  'fe_memutils.c',
+  'restricted_token.c',
+  'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+  'logging.c',
+)
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+#
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+#
+# For the server build of pgcommon, depend on lwlocknames_h, because at least
+# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a
+# layering violation, but ...
+pgcommon = {}
+pgcommon_variants = {
+  '_srv': internal_lib_args + {
+    'sources': common_sources + [lwlocknames_h],
+    'dependencies': [backend_common_code],
+  },
+  '': default_lib_args + {
+    'sources': common_sources_frontend_static,
+    'dependencies': [frontend_common_code],
+  },
+  '_shlib': default_lib_args + {
+    'pic': true,
+    'sources': common_sources_frontend_shlib,
+    'dependencies': [frontend_common_code],
+  },
+}
+
+foreach name, opts : pgcommon_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources : common_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + common_cflags[cflagname]
+    cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'sources': sources,
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgcommon@0@'.format(name),
+      link_with: cflag_libs,
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgcommon += {name: lib}
+endforeach
+
+common_srv = pgcommon['_srv']
+common_shlib = pgcommon['_shlib']
+common_static = pgcommon['']
+
+subdir('unicode')
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
new file mode 100644
index 00000000000..44a6cf77c3d
--- /dev/null
+++ b/src/common/unicode/meson.build
@@ -0,0 +1,107 @@
+# These files are part of the Unicode Character Database. Download
+# them on demand.
+
+UNICODE_VERSION = '14.0.0'
+
+unicode_data = {}
+unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
+
+if not wget.found()
+  subdir_done()
+endif
+
+foreach f : ['UnicodeData.txt', 'EastAsianWidth.txt', 'DerivedNormalizationProps.txt', 'CompositionExclusions.txt', 'NormalizationTest.txt']
+  url = unicode_baseurl.format(UNICODE_VERSION, f)
+  target = custom_target(f,
+    output: f,
+    command: [wget, wget_flags, url],
+    build_by_default: false,
+  )
+  unicode_data += {f: target}
+endforeach
+
+
+update_unicode_targets = []
+
+update_unicode_targets += \
+  custom_target('unicode_norm_table.h',
+    input: [unicode_data['UnicodeData.txt'], unicode_data['CompositionExclusions.txt']],
+    output: ['unicode_norm_table.h', 'unicode_norm_hashfunc.h'],
+    command: [
+      perl, files('generate-unicode_norm_table.pl'),
+      '--outdir', '@OUTDIR@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_combining_table.h',
+    input: [unicode_data['UnicodeData.txt']],
+    output: ['unicode_combining_table.h'],
+    command: [perl, files('generate-unicode_combining_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_east_asian_fw_table.h',
+    input: [unicode_data['EastAsianWidth.txt']],
+    output: ['unicode_east_asian_fw_table.h'],
+    command: [perl, files('generate-unicode_east_asian_fw_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_normprops_table.h',
+    input: [unicode_data['DerivedNormalizationProps.txt']],
+    output: ['unicode_normprops_table.h'],
+    command: [perl, files('generate-unicode_normprops_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+norm_test_table = custom_target('norm_test_table.h',
+    input: [unicode_data['NormalizationTest.txt']],
+    output: ['norm_test_table.h'],
+    command: [perl, files('generate-norm_test_table.pl'), '@INPUT@', '@OUTPUT@'],
+    build_by_default: false,
+  )
+
+inc = include_directories('.')
+
+norm_test = executable('norm_test',
+  ['norm_test.c', norm_test_table],
+  dependencies: [frontend_port_code],
+  include_directories: inc,
+  link_with: [common_static, pgport_static],
+  build_by_default: false,
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+update_unicode_dep = []
+
+if not meson.is_cross_build()
+  update_unicode_dep += custom_target('norm_test.run',
+    output: 'norm_test.run',
+    input: update_unicode_targets,
+    command: [norm_test],
+    build_by_default: false,
+    build_always_stale: true,
+  )
+endif
+
+
+# Use a custom target, as run targets serialize the output, making this harder
+# to debug, and don't deal well with targets with multiple outputs.
+update_unicode = custom_target('update-unicode',
+  depends: update_unicode_dep,
+  output: ['dont-exist'],
+  input: update_unicode_targets,
+  command: ['cp', '@INPUT@', '@SOURCE_ROOT@/src/include/common/'],
+  build_by_default: false,
+  build_always_stale: true,
+)
+
+alias_target('update-unicode', update_unicode)
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..ced2e014db8
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,184 @@
+pgport_sources = [
+  'bsearch_arg.c',
+  'chklocale.c',
+  'inet_net_ntop.c',
+  'noblock.c',
+  'path.c',
+  'pg_bitutils.c',
+  'pg_strong_random.c',
+  'pgcheckdir.c',
+  'pgmkdirp.c',
+  'pgsleep.c',
+  'pgstrcasecmp.c',
+  'pgstrsignal.c',
+  'pqsignal.c',
+  'qsort.c',
+  'qsort_arg.c',
+  'quotes.c',
+  'snprintf.c',
+  'strerror.c',
+  'tar.c',
+  'thread.c',
+]
+
+if host_system == 'windows'
+  pgport_sources += files(
+    'dirmod.c',
+    'kill.c',
+    'open.c',
+    'system.c',
+    'win32dlopen.c',
+    'win32env.c',
+    'win32error.c',
+    'win32fdatasync.c',
+    'win32getrusage.c',
+    'win32link.c',
+    'win32ntdll.c',
+    'win32pread.c',
+    'win32pwrite.c',
+    'win32security.c',
+    'win32setlocale.c',
+    'win32stat.c',
+  )
+endif
+
+if cc.get_id() == 'msvc'
+  pgport_sources += files(
+    'dirent.c',
+    'win32gettimeofday.c',
+  )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+  ['explicit_bzero'],
+  ['getopt'],
+  ['getopt_long'],
+  ['getpeereid'],
+  ['inet_aton'],
+  ['mkdtemp'],
+  ['preadv', 'HAVE_DECL_PREADV'],
+  ['pwritev', 'HAVE_DECL_PWRITEV'],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+]
+
+if host_system != 'windows'
+  replace_funcs_neg += [['pthread_barrier_wait']]
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+  # x86/x64
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # arm / aarch64
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # generic fallback
+  ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
+]
+
+pgport_cflags = {'crc': cflags_crc}
+pgport_sources_cflags = {'crc': []}
+
+foreach f : replace_funcs_neg
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'false' or val == '0'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+foreach f : replace_funcs_pos
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'true' or val == '1'
+    src = files(filename)
+    if f.length() > 2
+      pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
+    else
+      pgport_sources += src
+    endif
+  endif
+endforeach
+
+
+if (host_system == 'windows' or host_system == 'cygwin') and \
+  (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+  # Cygwin and (apparently, based on test results) Mingw both
+  # have a broken strtof(), so substitute its implementation.
+  # That's not a perfect fix, since it doesn't avoid double-rounding,
+  # but we have no better options.
+  pgport_sources += files('strtof.c')
+  message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+    host_system, cc.get_id(), cc.version()))
+endif
+
+
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+pgport = {}
+pgport_variants = {
+  '_srv': internal_lib_args + {
+    'dependencies': [backend_port_code],
+  },
+  '': default_lib_args + {
+    'dependencies': [frontend_port_code],
+  },
+  '_shlib': default_lib_args + {
+    'pic': true,
+    'dependencies': [frontend_port_code],
+  },
+}
+
+foreach name, opts : pgport_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources : pgport_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
+    cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
+      sources,
+      kwargs: opts + {
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgport@0@'.format(name),
+      pgport_sources,
+      link_with: cflag_libs,
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgport += {name: lib}
+endforeach
+
+pgport_srv = pgport['_srv']
+pgport_static = pgport['']
+pgport_shlib = pgport['_shlib']
diff --git a/src/port/win32ver.rc.in b/src/port/win32ver.rc.in
new file mode 100644
index 00000000000..eb0d45dccf1
--- /dev/null
+++ b/src/port/win32ver.rc.in
@@ -0,0 +1,41 @@
+#include <winver.h>
+#include "pg_config.h"
+
+// https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION    PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ PRODUCTVERSION PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ FILEFLAGSMASK  VS_FFI_FILEFLAGSMASK
+ FILEFLAGS      0x0L
+ FILEOS         VOS_NT_WINDOWS32
+ FILETYPE	@VFT_TYPE@
+ FILESUBTYPE    0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+  BLOCK "040904B0"			// U.S. English, Unicode
+  BEGIN
+   VALUE "CompanyName",      "PostgreSQL Global Development Group"
+   VALUE "FileDescription",  "@FILEDESC@"
+   /*
+    * XXX: In the autoconf / src/tools/msvc build this was set differently than
+    * ProductVersion below, using the current date. But that doesn't seem like a
+    * good idea, because it makes the build not reproducible and causes
+    * unnecessary rebuilds?
+    */
+   VALUE "FileVersion",      PG_VERSION
+   VALUE "InternalName",     "@NAME@"
+   VALUE "LegalCopyright", "Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California."
+   VALUE "OriginalFileName", "@NAME@.@FILEENDING@"
+   VALUE "ProductName",      "PostgreSQL"
+   VALUE "ProductVersion",   PG_VERSION
+  END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+  VALUE "Translation", 0x0409, 1200	// U.S. English, Unicode
+ END
+END
+
+IDI_ICON ICON "@ICO@"
diff --git a/config/meson.build b/config/meson.build
new file mode 100644
index 00000000000..ab19c380bd2
--- /dev/null
+++ b/config/meson.build
@@ -0,0 +1,4 @@
+install_data(
+  'install-sh', 'missing',
+  install_dir: dir_pgxs / 'config'
+)
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'brin.c',
+  'brin_bloom.c',
+  'brin_inclusion.c',
+  'brin_minmax.c',
+  'brin_minmax_multi.c',
+  'brin_pageops.c',
+  'brin_revmap.c',
+  'brin_tuple.c',
+  'brin_validate.c',
+  'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'attmap.c',
+  'bufmask.c',
+  'detoast.c',
+  'heaptuple.c',
+  'indextuple.c',
+  'printsimple.c',
+  'printtup.c',
+  'relation.c',
+  'reloptions.c',
+  'scankey.c',
+  'session.c',
+  'syncscan.c',
+  'toast_compression.c',
+  'toast_internals.c',
+  'tupconvert.c',
+  'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'ginarrayproc.c',
+  'ginbtree.c',
+  'ginbulk.c',
+  'gindatapage.c',
+  'ginentrypage.c',
+  'ginfast.c',
+  'ginget.c',
+  'gininsert.c',
+  'ginlogic.c',
+  'ginpostinglist.c',
+  'ginscan.c',
+  'ginutil.c',
+  'ginvacuum.c',
+  'ginvalidate.c',
+  'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'gist.c',
+  'gistbuild.c',
+  'gistbuildbuffers.c',
+  'gistget.c',
+  'gistproc.c',
+  'gistscan.c',
+  'gistsplit.c',
+  'gistutil.c',
+  'gistvacuum.c',
+  'gistvalidate.c',
+  'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'hash.c',
+  'hash_xlog.c',
+  'hashfunc.c',
+  'hashinsert.c',
+  'hashovfl.c',
+  'hashpage.c',
+  'hashsearch.c',
+  'hashsort.c',
+  'hashutil.c',
+  'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'heapam.c',
+  'heapam_handler.c',
+  'heapam_visibility.c',
+  'heaptoast.c',
+  'hio.c',
+  'pruneheap.c',
+  'rewriteheap.c',
+  'vacuumlazy.c',
+  'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'amapi.c',
+  'amvalidate.c',
+  'genam.c',
+  'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'nbtcompare.c',
+  'nbtdedup.c',
+  'nbtinsert.c',
+  'nbtpage.c',
+  'nbtree.c',
+  'nbtsearch.c',
+  'nbtsort.c',
+  'nbtsplitloc.c',
+  'nbtutils.c',
+  'nbtvalidate.c',
+  'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+  'brindesc.c',
+  'clogdesc.c',
+  'committsdesc.c',
+  'dbasedesc.c',
+  'genericdesc.c',
+  'gindesc.c',
+  'gistdesc.c',
+  'hashdesc.c',
+  'heapdesc.c',
+  'logicalmsgdesc.c',
+  'mxactdesc.c',
+  'nbtdesc.c',
+  'relmapdesc.c',
+  'replorigindesc.c',
+  'seqdesc.c',
+  'smgrdesc.c',
+  'spgdesc.c',
+  'standbydesc.c',
+  'tblspcdesc.c',
+  'xactdesc.c',
+  'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'spgdoinsert.c',
+  'spginsert.c',
+  'spgkdtreeproc.c',
+  'spgproc.c',
+  'spgquadtreeproc.c',
+  'spgscan.c',
+  'spgtextproc.c',
+  'spgutils.c',
+  'spgvacuum.c',
+  'spgvalidate.c',
+  'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'table.c',
+  'tableam.c',
+  'tableamapi.c',
+  'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bernoulli.c',
+  'system.c',
+  'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..c32169bd2c6
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'clog.c',
+  'commit_ts.c',
+  'generic_xlog.c',
+  'multixact.c',
+  'parallel.c',
+  'rmgr.c',
+  'slru.c',
+  'subtrans.c',
+  'timeline.c',
+  'transam.c',
+  'twophase.c',
+  'twophase_rmgr.c',
+  'varsup.c',
+  'xact.c',
+  'xlog.c',
+  'xlogarchive.c',
+  'xlogfuncs.c',
+  'xloginsert.c',
+  'xlogprefetcher.c',
+  'xlogrecovery.c',
+  'xlogstats.c',
+  'xlogutils.c',
+)
+
+# used by frontend programs to build a frontend xlogreader
+xlogreader_sources = files(
+  'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/backup/meson.build b/src/backend/backup/meson.build
new file mode 100644
index 00000000000..a09305cadfa
--- /dev/null
+++ b/src/backend/backup/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'backup_manifest.c',
+  'basebackup.c',
+  'basebackup_copy.c',
+  'basebackup_gzip.c',
+  'basebackup_lz4.c',
+  'basebackup_progress.c',
+  'basebackup_server.c',
+  'basebackup_sink.c',
+  'basebackup_target.c',
+  'basebackup_throttle.c',
+  'basebackup_zstd.c',
+)
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..2377de121af
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+bootscanner = custom_target('bootscanner',
+  input: ['bootscanner.l'],
+  output: ['bootscanner.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += bootscanner
+
+generated_backend_sources += custom_target('bootparse',
+  input: ['bootparse.y', bootscanner[0]],
+  output: ['bootparse.c'],
+  command: [bison_cmd, '@INPUT0@'],
+)
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..08747914516
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,44 @@
+backend_sources += files(
+  'aclchk.c',
+  'catalog.c',
+  'dependency.c',
+  'heap.c',
+  'index.c',
+  'indexing.c',
+  'namespace.c',
+  'objectaccess.c',
+  'objectaddress.c',
+  'partition.c',
+  'pg_aggregate.c',
+  'pg_attrdef.c',
+  'pg_cast.c',
+  'pg_class.c',
+  'pg_collation.c',
+  'pg_constraint.c',
+  'pg_conversion.c',
+  'pg_db_role_setting.c',
+  'pg_depend.c',
+  'pg_enum.c',
+  'pg_inherits.c',
+  'pg_largeobject.c',
+  'pg_namespace.c',
+  'pg_operator.c',
+  'pg_parameter_acl.c',
+  'pg_proc.c',
+  'pg_publication.c',
+  'pg_range.c',
+  'pg_shdepend.c',
+  'pg_subscription.c',
+  'pg_type.c',
+  'storage.c',
+  'toasting.c',
+)
+
+
+install_data(
+  'information_schema.sql',
+  'sql_features.txt',
+  'system_functions.sql',
+  'system_views.sql',
+  install_dir: dir_data,
+)
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..9b350d025ff
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'aggregatecmds.c',
+  'alter.c',
+  'amcmds.c',
+  'analyze.c',
+  'async.c',
+  'cluster.c',
+  'collationcmds.c',
+  'comment.c',
+  'constraint.c',
+  'conversioncmds.c',
+  'copy.c',
+  'copyfrom.c',
+  'copyfromparse.c',
+  'copyto.c',
+  'createas.c',
+  'dbcommands.c',
+  'define.c',
+  'discard.c',
+  'dropcmds.c',
+  'event_trigger.c',
+  'explain.c',
+  'extension.c',
+  'foreigncmds.c',
+  'functioncmds.c',
+  'indexcmds.c',
+  'lockcmds.c',
+  'matview.c',
+  'opclasscmds.c',
+  'operatorcmds.c',
+  'policy.c',
+  'portalcmds.c',
+  'prepare.c',
+  'proclang.c',
+  'publicationcmds.c',
+  'schemacmds.c',
+  'seclabel.c',
+  'sequence.c',
+  'statscmds.c',
+  'subscriptioncmds.c',
+  'tablecmds.c',
+  'tablespace.c',
+  'trigger.c',
+  'tsearchcmds.c',
+  'typecmds.c',
+  'user.c',
+  'vacuum.c',
+  'vacuumparallel.c',
+  'variable.c',
+  'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+  'execAmi.c',
+  'execAsync.c',
+  'execCurrent.c',
+  'execExpr.c',
+  'execExprInterp.c',
+  'execGrouping.c',
+  'execIndexing.c',
+  'execJunk.c',
+  'execMain.c',
+  'execParallel.c',
+  'execPartition.c',
+  'execProcnode.c',
+  'execReplication.c',
+  'execSRF.c',
+  'execScan.c',
+  'execTuples.c',
+  'execUtils.c',
+  'functions.c',
+  'instrument.c',
+  'nodeAgg.c',
+  'nodeAppend.c',
+  'nodeBitmapAnd.c',
+  'nodeBitmapHeapscan.c',
+  'nodeBitmapIndexscan.c',
+  'nodeBitmapOr.c',
+  'nodeCtescan.c',
+  'nodeCustom.c',
+  'nodeForeignscan.c',
+  'nodeFunctionscan.c',
+  'nodeGather.c',
+  'nodeGatherMerge.c',
+  'nodeGroup.c',
+  'nodeHash.c',
+  'nodeHashjoin.c',
+  'nodeIncrementalSort.c',
+  'nodeIndexonlyscan.c',
+  'nodeIndexscan.c',
+  'nodeLimit.c',
+  'nodeLockRows.c',
+  'nodeMaterial.c',
+  'nodeMemoize.c',
+  'nodeMergeAppend.c',
+  'nodeMergejoin.c',
+  'nodeModifyTable.c',
+  'nodeNamedtuplestorescan.c',
+  'nodeNestloop.c',
+  'nodeProjectSet.c',
+  'nodeRecursiveunion.c',
+  'nodeResult.c',
+  'nodeSamplescan.c',
+  'nodeSeqscan.c',
+  'nodeSetOp.c',
+  'nodeSort.c',
+  'nodeSubplan.c',
+  'nodeSubqueryscan.c',
+  'nodeTableFuncscan.c',
+  'nodeTidrangescan.c',
+  'nodeTidscan.c',
+  'nodeUnique.c',
+  'nodeValuesscan.c',
+  'nodeWindowAgg.c',
+  'nodeWorktablescan.c',
+  'spi.c',
+  'tqueue.c',
+  'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..de2e624ab58
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,73 @@
+if not llvm.found()
+  subdir_done()
+endif
+
+# Build LLVM JIT backend module
+
+llvmjit_sources = []
+
+# Infrastructure
+llvmjit_sources += files(
+  'llvmjit.c',
+  'llvmjit_error.cpp',
+  'llvmjit_inline.cpp',
+  'llvmjit_wrap.cpp',
+)
+
+# Code generation
+llvmjit_sources += files(
+  'llvmjit_deform.c',
+  'llvmjit_expr.c',
+)
+
+llvmjit = shared_module('llvmjit',
+  llvmjit_sources,
+  kwargs: pg_mod_args + {
+    'dependencies': pg_mod_args['dependencies'] + [llvm],
+  }
+)
+
+backend_targets += llvmjit
+
+
+# Define a few bits and pieces used here and elsewhere to generate bitcode
+
+llvm_irgen_args = [
+  '-c', '-o', '@OUTPUT@', '@INPUT@',
+  '-flto=thin', '-emit-llvm',
+  '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+  '-O2',
+  '-Wno-ignored-attributes',
+  '-Wno-empty-body',
+]
+
+if ccache.found()
+  llvm_irgen_command = ccache
+  llvm_irgen_args = [clang.path()] + llvm_irgen_args
+else
+  llvm_irgen_command = clang
+endif
+
+
+# XXX: Need to determine proper version of the function cflags for clang
+bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
+bitcode_cflags += cppflags
+
+# XXX: Worth improving on the logic to find directories here
+bitcode_cflags += '-I@BUILD_ROOT@/src/include'
+bitcode_cflags += '-I@BUILD_ROOT@/src/backend/utils/misc'
+bitcode_cflags += '-I@SOURCE_ROOT@/src/include'
+
+
+# Note this is intentionally not installed to bitcodedir, as it's not for
+# inlining
+llvmjit_types = custom_target('llvmjit_types.bc',
+  command: [llvm_irgen_command] + llvm_irgen_args + bitcode_cflags,
+  input: 'llvmjit_types.c',
+  output: 'llvmjit_types.bc',
+  depends: [postgres],
+  install: true,
+  install_dir: dir_lib_pkg,
+  depfile: '@BASENAME@.c.bc.d',
+)
+backend_targets += llvmjit_types
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..48da1bddce7
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'binaryheap.c',
+  'bipartite_match.c',
+  'bloomfilter.c',
+  'dshash.c',
+  'hyperloglog.c',
+  'ilist.c',
+  'integerset.c',
+  'knapsack.c',
+  'pairingheap.c',
+  'rbtree.c',
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..6061269ef13
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,32 @@
+backend_sources += files(
+  'auth-sasl.c',
+  'auth-scram.c',
+  'auth.c',
+  'be-fsstubs.c',
+  'be-secure-common.c',
+  'be-secure.c',
+  'crypt.c',
+  'hba.c',
+  'ifaddr.c',
+  'pqcomm.c',
+  'pqformat.c',
+  'pqmq.c',
+  'pqsignal.c',
+)
+
+if ssl.found()
+  backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+  backend_sources += files(
+    'be-secure-gssapi.c',
+    'be-gssapi-common.c'
+  )
+endif
+
+install_data(
+  'pg_hba.conf.sample',
+  'pg_ident.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..02eba01cdc6
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,187 @@
+backend_build_deps = [backend_code]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('backup')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+subdir('po', if_found: libintl)
+
+
+backend_link_args = []
+backend_link_depends = []
+
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+# For dtrace probes we need to invoke dtrace on all input files, before
+# linking the final executable (see more below).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+# We could do that only if either dtrace or msvc is in use, but it seems
+# easier to just always do so.
+
+postgres_lib = static_library('postgres',
+  backend_sources + timezone_sources + generated_backend_sources,
+  link_whole: backend_link_with,
+  dependencies: backend_build_deps,
+  kwargs: internal_lib_args,
+)
+
+if cc.get_id() == 'msvc'
+  postgres_def = custom_target('postgres.def',
+    command: [perl, files('../tools/msvc/gendef.pl'),
+              '--arch', host_cpu,
+              '--tempdir', '@PRIVATE_DIR@',
+              '--deffile', '@OUTPUT@',
+              '@INPUT@'],
+    input: [postgres_lib, common_srv, pgport_srv],
+    output: 'postgres.def',
+    depends: [postgres_lib, common_srv, pgport_srv],
+    install: false,
+    build_by_default: false,
+  )
+
+  backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+  backend_link_depends += postgres_def
+
+elif host_system == 'aix'
+  # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
+  # main executable, allowing extension libraries to resolve their undefined
+  # symbols to symbols in the postgres binary.
+  postgres_imp = custom_target('postgres.imp',
+    command: [files('port/aix/mkldexport.sh'), '@INPUT@', '.'],
+    input: postgres_lib,
+    output: 'postgres.imp',
+    capture: true,
+    install: true,
+    install_dir: dir_lib,
+    build_by_default: false,
+  )
+  backend_link_args += '-Wl,-bE:@0@'.format(postgres_imp.full_path())
+  backend_link_depends += postgres_imp
+endif
+
+backend_input = []
+backend_objs = [postgres_lib.extract_all_objects(recursive: false)]
+
+# As of 1/2010:
+# The probes.o file is necessary for dtrace support on Solaris, and on recent
+# versions of systemtap.  (Older systemtap releases just produce an empty
+# file, but that's okay.)  However, macOS's dtrace doesn't use it and doesn't
+# even recognize the -G option.  So, build probes.o except on macOS.
+# This might need adjustment as other platforms add dtrace support.
+#
+# On at least linux we don't actually need to pass in all the objects, but
+# at least on FreeBSD and Solaris we have to.
+#
+# XXX: The reason we don't use the objects for generated sources is that
+# hits a meson bug. Luckily we don't don't have probes in generated
+# sources...
+if dtrace.found() and host_system != 'darwin'
+  backend_input += custom_target(
+    'probes.o',
+    input: ['utils/probes.d', postgres_lib.extract_objects(backend_sources, timezone_sources)],
+    output: 'probes.o',
+    command: [dtrace, '-C', '-G', '-o', '@OUTPUT@', '-s', '@INPUT@'],
+    install: false,
+  )
+endif
+
+postgres = executable('postgres',
+  backend_input,
+  objects: backend_objs,
+  link_args: backend_link_args,
+  link_with: backend_link_with,
+  link_depends: backend_link_depends,
+  export_dynamic: true,
+  implib: true,
+  dependencies: backend_build_deps,
+  kwargs: default_bin_args,
+)
+
+backend_targets += postgres
+
+pg_mod_c_args = cflags_mod
+pg_mod_cpp_args = cxxflags_mod
+pg_mod_link_args = ldflags_sl + ldflags_mod
+pg_mod_link_depend = []
+
+# A few platforms like MacOS and Windows link shared modules against postgres,
+# or a [import] library derived from it. Set up the link flags for that.
+if mod_link_args_fmt.length() > 0
+  # To avoid unnecessary build-time dependencies on other operating systems,
+  # only the dependency when it when necessary.
+  pg_mod_link_depend += postgres
+
+  name = mod_link_with_name.format('postgres')
+  link_with_uninst = meson.current_build_dir() / name
+  link_with_inst = '${@0@}/@1@'.format(mod_link_with_dir, name)
+
+  foreach el : mod_link_args_fmt
+    pg_mod_link_args += el.format(link_with_uninst)
+  endforeach
+endif
+
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+  compile_args: pg_mod_c_args,
+  include_directories: postgres_inc,
+  link_args: pg_mod_link_args,
+  sources: generated_headers + generated_backend_headers,
+  dependencies: backend_mod_deps,
+)
+
+pg_mod_args = default_mod_args + {
+  'dependencies': [backend_mod_code],
+  'cpp_args': pg_mod_cpp_args,
+  'link_depends': pg_mod_link_depend,
+}
+
+
+
+# Shared modules that, on some system, link against the server binary. Only
+# enter these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..8e0d4039f24
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,29 @@
+backend_sources += files(
+  'bitmapset.c',
+  'extensible.c',
+  'list.c',
+  'makefuncs.c',
+  'nodeFuncs.c',
+  'nodes.c',
+  'params.c',
+  'print.c',
+  'read.c',
+  'tidbitmap.c',
+  'value.c',
+)
+
+# these include .c files generated in ../../include/nodes, seems nicer to not
+# add that as an include path for the whole backend
+nodefunc_sources = files(
+  'copyfuncs.c',
+  'equalfuncs.c',
+  'outfuncs.c',
+  'readfuncs.c',
+)
+nodefuncs = static_library('nodefuncs',
+  nodefunc_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('../../include/nodes'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += nodefuncs
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'geqo_copy.c',
+  'geqo_cx.c',
+  'geqo_erx.c',
+  'geqo_eval.c',
+  'geqo_main.c',
+  'geqo_misc.c',
+  'geqo_mutation.c',
+  'geqo_ox1.c',
+  'geqo_ox2.c',
+  'geqo_pmx.c',
+  'geqo_pool.c',
+  'geqo_px.c',
+  'geqo_random.c',
+  'geqo_recombination.c',
+  'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'allpaths.c',
+  'clausesel.c',
+  'costsize.c',
+  'equivclass.c',
+  'indxpath.c',
+  'joinpath.c',
+  'joinrels.c',
+  'pathkeys.c',
+  'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'analyzejoins.c',
+  'createplan.c',
+  'initsplan.c',
+  'planagg.c',
+  'planmain.c',
+  'planner.c',
+  'setrefs.c',
+  'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'prepagg.c',
+  'prepjointree.c',
+  'prepqual.c',
+  'preptlist.c',
+  'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'appendinfo.c',
+  'clauses.c',
+  'inherit.c',
+  'joininfo.c',
+  'orclauses.c',
+  'paramassign.c',
+  'pathnode.c',
+  'placeholder.c',
+  'plancat.c',
+  'predtest.c',
+  'relnode.c',
+  'restrictinfo.c',
+  'tlist.c',
+  'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..62621fd42a0
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,49 @@
+backend_sources += files(
+  'analyze.c',
+  'parse_agg.c',
+  'parse_clause.c',
+  'parse_coerce.c',
+  'parse_collate.c',
+  'parse_cte.c',
+  'parse_enr.c',
+  'parse_expr.c',
+  'parse_func.c',
+  'parse_jsontable.c',
+  'parse_merge.c',
+  'parse_node.c',
+  'parse_oper.c',
+  'parse_param.c',
+  'parse_relation.c',
+  'parse_target.c',
+  'parse_type.c',
+  'parse_utilcmd.c',
+  'scansup.c',
+)
+
+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...
+
+parser_sources = [files('parser.c')]
+
+backend_scanner = custom_target('scan',
+  input: ['scan.l'],
+  output: ['scan.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-CF', '-p', '-p', '@INPUT@'],
+)
+generated_sources += backend_scanner
+parser_sources += backend_scanner
+
+parser_sources += backend_parser_code
+parser_sources += backend_parser_header
+
+generated_sources += backend_parser_code
+generated_sources += backend_parser_header
+
+parser = static_library('parser',
+  parser_sources + generated_headers,
+  dependencies: [backend_code],
+  kwargs: internal_lib_args,
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'partbounds.c',
+  'partdesc.c',
+  'partprune.c',
+)
diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build
new file mode 100644
index 00000000000..4ace0554680
--- /dev/null
+++ b/src/backend/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('postgres-' + pg_version_major.to_string())
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..a22c25dd952
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+  backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+  backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+  backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+  backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+  backend_sources += files('win32_shmem.c')
+endif
+
+if host_system == 'windows'
+  subdir('win32')
+endif
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/port': ['pg_sema.c', 'pg_shmem.c', 'tas.s']}
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..68fe4cc3cd0
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'crashdump.c',
+  'signal.c',
+  'socket.c',
+  'timer.c',
+)
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..293a44ca295
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'autovacuum.c',
+  'auxprocess.c',
+  'bgworker.c',
+  'bgwriter.c',
+  'checkpointer.c',
+  'fork_process.c',
+  'interrupt.c',
+  'pgarch.c',
+  'postmaster.c',
+  'shell_archive.c',
+  'startup.c',
+  'syslogger.c',
+  'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..c84e57fdba5
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'regcomp.c',
+  'regerror.c',
+  'regexec.c',
+  'regexport.c',
+  'regfree.c',
+  'regprefix.c',
+)
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+  'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+  libpqwalreceiver_sources,
+  kwargs: pg_mod_args + {
+    'name_prefix': 'lib',
+    'dependencies': pg_mod_args['dependencies'] + [libpq],
+  }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+  'decode.c',
+  'launcher.c',
+  'logical.c',
+  'logicalfuncs.c',
+  'message.c',
+  'origin.c',
+  'proto.c',
+  'relation.c',
+  'reorderbuffer.c',
+  'snapbuild.c',
+  'tablesync.c',
+  'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..01d6adda2ea
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,45 @@
+backend_sources += files(
+  'slot.c',
+  'slotfuncs.c',
+  'syncrep.c',
+  'walreceiver.c',
+  'walreceiverfuncs.c',
+  'walsender.c',
+)
+
+# [sync]repl_scanner is compiled as part of [sync]repl_gram. The
+# ordering is enforced by making the generation of grammar depend on
+# the scanner generation. That's unnecessarily strict, but overall
+# harmless.
+
+repl_scanner = custom_target('repl_scanner',
+  input: files('repl_scanner.l'),
+  output: ['repl_scanner.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += repl_scanner
+
+generated_backend_sources += custom_target('repl_gram',
+  input: 'repl_gram.y',
+  output: 'repl_gram.c',
+  depends: repl_scanner,
+  command: [bison_cmd, '@INPUT@'],
+)
+
+
+syncrep_scanner = custom_target('syncrep_scanner',
+  input: 'syncrep_scanner.l',
+  output: 'syncrep_scanner.c',
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += syncrep_scanner
+
+generated_backend_sources += custom_target('syncrep_gram',
+  input: 'syncrep_gram.y',
+  output: 'syncrep_gram.c',
+  depends: syncrep_scanner,
+  command: [bison_cmd, '@INPUT@'],
+)
+
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..8ff0a0c6133
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,11 @@
+pgoutput_sources = files(
+  'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+  pgoutput_sources,
+  kwargs: pg_mod_args + {
+  }
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..21fa0e230b0
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'rewriteDefine.c',
+  'rewriteHandler.c',
+  'rewriteManip.c',
+  'rewriteRemove.c',
+  'rewriteSearchCycle.c',
+  'rewriteSupport.c',
+  'rowsecurity.c',
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..8c6f685cb32
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,88 @@
+dict_snowball_sources = files(
+  'libstemmer/api.c',
+  'libstemmer/utilities.c',
+  'dict_snowball.c',
+)
+
+dict_snowball_sources += files(
+  'libstemmer/stem_ISO_8859_1_basque.c',
+  'libstemmer/stem_ISO_8859_1_catalan.c',
+  'libstemmer/stem_ISO_8859_1_danish.c',
+  'libstemmer/stem_ISO_8859_1_dutch.c',
+  'libstemmer/stem_ISO_8859_1_english.c',
+  'libstemmer/stem_ISO_8859_1_finnish.c',
+  'libstemmer/stem_ISO_8859_1_french.c',
+  'libstemmer/stem_ISO_8859_1_german.c',
+  'libstemmer/stem_ISO_8859_1_indonesian.c',
+  'libstemmer/stem_ISO_8859_1_irish.c',
+  'libstemmer/stem_ISO_8859_1_italian.c',
+  'libstemmer/stem_ISO_8859_1_norwegian.c',
+  'libstemmer/stem_ISO_8859_1_porter.c',
+  'libstemmer/stem_ISO_8859_1_portuguese.c',
+  'libstemmer/stem_ISO_8859_1_spanish.c',
+  'libstemmer/stem_ISO_8859_1_swedish.c',
+  'libstemmer/stem_ISO_8859_2_hungarian.c',
+  'libstemmer/stem_ISO_8859_2_romanian.c',
+  'libstemmer/stem_KOI8_R_russian.c',
+  'libstemmer/stem_UTF_8_arabic.c',
+  'libstemmer/stem_UTF_8_armenian.c',
+  'libstemmer/stem_UTF_8_basque.c',
+  'libstemmer/stem_UTF_8_catalan.c',
+  'libstemmer/stem_UTF_8_danish.c',
+  'libstemmer/stem_UTF_8_dutch.c',
+  'libstemmer/stem_UTF_8_english.c',
+  'libstemmer/stem_UTF_8_finnish.c',
+  'libstemmer/stem_UTF_8_french.c',
+  'libstemmer/stem_UTF_8_german.c',
+  'libstemmer/stem_UTF_8_greek.c',
+  'libstemmer/stem_UTF_8_hindi.c',
+  'libstemmer/stem_UTF_8_hungarian.c',
+  'libstemmer/stem_UTF_8_indonesian.c',
+  'libstemmer/stem_UTF_8_irish.c',
+  'libstemmer/stem_UTF_8_italian.c',
+  'libstemmer/stem_UTF_8_lithuanian.c',
+  'libstemmer/stem_UTF_8_nepali.c',
+  'libstemmer/stem_UTF_8_norwegian.c',
+  'libstemmer/stem_UTF_8_porter.c',
+  'libstemmer/stem_UTF_8_portuguese.c',
+  'libstemmer/stem_UTF_8_romanian.c',
+  'libstemmer/stem_UTF_8_russian.c',
+  'libstemmer/stem_UTF_8_serbian.c',
+  'libstemmer/stem_UTF_8_spanish.c',
+  'libstemmer/stem_UTF_8_swedish.c',
+  'libstemmer/stem_UTF_8_tamil.c',
+  'libstemmer/stem_UTF_8_turkish.c',
+  'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+  dict_snowball_sources,
+  kwargs: pg_mod_args + {
+    'include_directories': [stemmer_inc],
+  }
+)
+
+snowball_create = custom_target('snowball_create',
+  output: ['snowball_create.sql'],
+  depfile: 'snowball_create.dep',
+  command: [
+    perl, files('snowball_create.pl'),
+    '--depfile',
+    '--input', '@CURRENT_SOURCE_DIR@',
+    '--outdir', '@OUTDIR@',
+  ],
+  install: true,
+  install_dir: dir_data,
+)
+generated_sources += snowball_create
+
+install_subdir('stopwords',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true,
+)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'dependencies.c',
+  'extended_stats.c',
+  'mcv.c',
+  'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'buf_init.c',
+  'buf_table.c',
+  'bufmgr.c',
+  'freelist.c',
+  'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'buffile.c',
+  'copydir.c',
+  'fd.c',
+  'fileset.c',
+  'reinit.c',
+  'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'freespace.c',
+  'fsmpage.c',
+  'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+  'barrier.c',
+  'dsm.c',
+  'dsm_impl.c',
+  'ipc.c',
+  'ipci.c',
+  'latch.c',
+  'pmsignal.c',
+  'procarray.c',
+  'procsignal.c',
+  'shm_mq.c',
+  'shm_toc.c',
+  'shmem.c',
+  'shmqueue.c',
+  'signalfuncs.c',
+  'sinval.c',
+  'sinvaladt.c',
+  'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..68237c8a2e8
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'condition_variable.c',
+  'deadlock.c',
+  'lmgr.c',
+  'lock.c',
+  'lwlock.c',
+  'predicate.c',
+  'proc.c',
+  's_lock.c',
+  'spin.c',
+)
+
+generated_backend_sources += lwlocknames[1]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bufpage.c',
+  'checksum.c',
+  'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'md.c',
+  'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'cmdtag.c',
+  'dest.c',
+  'fastpath.c',
+  'postgres.c',
+  'pquery.c',
+  'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..4144e9befc5
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+  'dict.c',
+  'dict_ispell.c',
+  'dict_simple.c',
+  'dict_synonym.c',
+  'dict_thesaurus.c',
+  'regis.c',
+  'spell.c',
+  'to_tsany.c',
+  'ts_locale.c',
+  'ts_parse.c',
+  'ts_selfuncs.c',
+  'ts_typanalyze.c',
+  'ts_utils.c',
+  'wparser.c',
+  'wparser_def.c',
+)
+
+install_subdir('dicts',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..5b3b558a67d
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'backend_progress.c',
+  'backend_status.c',
+  'pgstat.c',
+  'pgstat_archiver.c',
+  'pgstat_bgwriter.c',
+  'pgstat_checkpointer.c',
+  'pgstat_database.c',
+  'pgstat_function.c',
+  'pgstat_relation.c',
+  'pgstat_replslot.c',
+  'pgstat_shmem.c',
+  'pgstat_slru.c',
+  'pgstat_subscription.c',
+  'pgstat_wal.c',
+  'pgstat_xact.c',
+  'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..22cdb2c20ec
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,122 @@
+backend_sources += files(
+  'acl.c',
+  'amutils.c',
+  'array_expanded.c',
+  'array_selfuncs.c',
+  'array_typanalyze.c',
+  'array_userfuncs.c',
+  'arrayfuncs.c',
+  'arraysubs.c',
+  'arrayutils.c',
+  'ascii.c',
+  'bool.c',
+  'cash.c',
+  'char.c',
+  'cryptohashfuncs.c',
+  'date.c',
+  'datetime.c',
+  'datum.c',
+  'dbsize.c',
+  'domains.c',
+  'encode.c',
+  'enum.c',
+  'expandeddatum.c',
+  'expandedrecord.c',
+  'float.c',
+  'format_type.c',
+  'formatting.c',
+  'genfile.c',
+  'geo_ops.c',
+  'geo_selfuncs.c',
+  'geo_spgist.c',
+  'hbafuncs.c',
+  'inet_cidr_ntop.c',
+  'inet_net_pton.c',
+  'int.c',
+  'int8.c',
+  'json.c',
+  'jsonb.c',
+  'jsonb_gin.c',
+  'jsonb_op.c',
+  'jsonb_util.c',
+  'jsonbsubs.c',
+  'jsonfuncs.c',
+  'jsonpath.c',
+  'jsonpath_exec.c',
+  'like.c',
+  'like_support.c',
+  'lockfuncs.c',
+  'mac.c',
+  'mac8.c',
+  'mcxtfuncs.c',
+  'misc.c',
+  'multirangetypes.c',
+  'multirangetypes_selfuncs.c',
+  'name.c',
+  'network.c',
+  'network_gist.c',
+  'network_selfuncs.c',
+  'network_spgist.c',
+  'numeric.c',
+  'numutils.c',
+  'oid.c',
+  'oracle_compat.c',
+  'orderedsetaggs.c',
+  'partitionfuncs.c',
+  'pg_locale.c',
+  'pg_lsn.c',
+  'pg_upgrade_support.c',
+  'pgstatfuncs.c',
+  'pseudotypes.c',
+  'quote.c',
+  'rangetypes.c',
+  'rangetypes_gist.c',
+  'rangetypes_selfuncs.c',
+  'rangetypes_spgist.c',
+  'rangetypes_typanalyze.c',
+  'regexp.c',
+  'regproc.c',
+  'ri_triggers.c',
+  'rowtypes.c',
+  'ruleutils.c',
+  'selfuncs.c',
+  'tid.c',
+  'timestamp.c',
+  'trigfuncs.c',
+  'tsginidx.c',
+  'tsgistidx.c',
+  'tsquery.c',
+  'tsquery_cleanup.c',
+  'tsquery_gist.c',
+  'tsquery_op.c',
+  'tsquery_rewrite.c',
+  'tsquery_util.c',
+  'tsrank.c',
+  'tsvector.c',
+  'tsvector_op.c',
+  'tsvector_parser.c',
+  'uuid.c',
+  'varbit.c',
+  'varchar.c',
+  'varlena.c',
+  'version.c',
+  'windowfuncs.c',
+  'xid.c',
+  'xid8funcs.c',
+  'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+  input: ['jsonpath_scan.l'],
+  output: ['jsonpath_scan.c'],
+  command: [flex_cmd, flex_backup, '-CF', '-p', '-p', '@INPUT@'],
+)
+generated_sources += jsonpath_scan
+
+# jsonpath_scan is compiled as part of jsonpath_gram
+generated_backend_sources += custom_target('jsonpath_parse',
+  input: ['jsonpath_gram.y', jsonpath_scan[0]],
+  output: ['jsonpath_gram.c'],
+  command: [bison_cmd, '@INPUT0@'],
+)
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..4fe6db6bda6
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'attoptcache.c',
+  'catcache.c',
+  'evtcache.c',
+  'inval.c',
+  'lsyscache.c',
+  'partcache.c',
+  'plancache.c',
+  'relcache.c',
+  'relfilenumbermap.c',
+  'relmapper.c',
+  'spccache.c',
+  'syscache.c',
+  'ts_cache.c',
+  'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..325446c8f93
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'assert.c',
+  'csvlog.c',
+  'elog.c',
+  'jsonlog.c',
+)
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'dfmgr.c',
+  'fmgr.c',
+  'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'dynahash.c',
+  'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'globals.c',
+  'miscinit.c',
+  'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..1bc971d1945
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,36 @@
+encodings = {
+  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+  'euc_tw_and_big5': [
+    'euc_tw_and_big5/euc_tw_and_big5.c',
+    'euc_tw_and_big5/big5.c',
+  ],
+  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+  backend_targets += shared_module(encoding,
+    sources,
+    kwargs: pg_mod_args,
+  )
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'conv.c',
+  'mbutils.c',
+  'stringinfo_mb.c',
+  'wstrcmp.c',
+  'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..3a916320bb3
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,17 @@
+install_data('errcodes.txt',
+  install_dir: dir_data,
+)
+
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..8fbb128235b
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,33 @@
+backend_sources += files(
+  'guc.c',
+  'help_config.c',
+  'pg_config.c',
+  'pg_controldata.c',
+  'pg_rusage.c',
+  'ps_status.c',
+  'queryenvironment.c',
+  'queryjumble.c',
+  'rls.c',
+  'sampling.c',
+  'superuser.c',
+  'timeout.c',
+  'tzparser.c',
+)
+
+# guc-file.c is compiled as part of guc.c, generate guc-file.c.h so it can be
+# added as a dependency for the executable. Not pretty, but there's no
+# obviously better solution right now
+guc_scan = custom_target('guc_scan',
+  input: ['guc-file.l'],
+  output: ['guc-file.c', 'guc-file.c.h'],
+  command: [flex_cmd, '@INPUT@', '--stamp_header', '@OUTPUT1@'])
+
+backend_build_deps += declare_dependency(
+  sources: guc_scan[1],
+  include_directories: include_directories('.'))
+generated_backend_headers += guc_scan[1]
+generated_sources += guc_scan[0]
+
+install_data('postgresql.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'aset.c',
+  'dsa.c',
+  'freepage.c',
+  'generation.c',
+  'mcxt.c',
+  'memdebug.c',
+  'portalmem.c',
+  'slab.c',
+)
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..1862ceae8c1
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'logtape.c',
+  'qsort_interruptible.c',
+  'sharedtuplestore.c',
+  'sortsupport.c',
+  'tuplesort.c',
+  'tuplesortvariants.c',
+  'tuplestore.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'combocid.c',
+  'snapmgr.c',
+)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..29c24257328
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,29 @@
+fe_utils_sources = files(
+  'archive.c',
+  'cancel.c',
+  'conditional.c',
+  'connect_utils.c',
+  'mbprint.c',
+  'option_utils.c',
+  'parallel_slot.c',
+  'print.c',
+  'query_utils.c',
+  'recovery_gen.c',
+  'simple_list.c',
+  'string_utils.c',
+)
+
+psqlscan = custom_target('psqlscan',
+  input: ['psqlscan.l'],
+  output: ['psqlscan.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'],
+)
+generated_sources += psqlscan
+fe_utils_sources += psqlscan
+
+fe_utils = static_library('libpgfeutils',
+  fe_utils_sources + generated_headers,
+  include_directories: [postgres_inc, libpq_inc],
+  dependencies: frontend_common_code,
+  kwargs: default_lib_args,
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..72c255dbcfc
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,39 @@
+initdb_sources = files(
+  'findtimezone.c',
+  'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+if host_system == 'windows'
+  initdb_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'initdb - initialize a new database cluster',
+        '--NAME', 'initdb',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+executable('initdb',
+  initdb_sources,
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code, libpq, icu, icu_i18n],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'initdb',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_initdb.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 00000000000..8b8a9fd2ce1
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('initdb-' + pg_version_major.to_string())
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..5fd5a9d2f98
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..3d130097615
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,26 @@
+pg_amcheck_sources = files(
+  'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+  pg_amcheck_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_nonesuch.pl',
+      't/003_check.pl',
+      't/004_verify_heapam.pl',
+      't/005_opclass_damage.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 00000000000..b255f552c94
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_amcheck-' + pg_version_major.to_string())
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..b5d393b3b32
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,18 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+  ['pg_archivecleanup.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_archivecleanup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_pg_archivecleanup.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 00000000000..37935fcabc4
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..7819275715e
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,58 @@
+common_sources = files(
+  'bbstreamer_file.c',
+  'bbstreamer_gzip.c',
+  'bbstreamer_inject.c',
+  'bbstreamer_lz4.c',
+  'bbstreamer_tar.c',
+  'bbstreamer_zstd.c',
+  'receivelog.c',
+  'streamutil.c',
+  'walmethods.c',
+)
+
+pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_common = static_library('libpg_basebackup_common',
+  common_sources,
+  dependencies: pg_basebackup_deps,
+  kwargs: internal_lib_args,
+)
+
+executable('pg_basebackup',
+  'pg_basebackup.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+executable('pg_receivewal',
+  'pg_receivewal.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+executable('pg_recvlogical',
+  'pg_recvlogical.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_basebackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path(),
+            'LZ4': program_lz4.found() ? program_lz4.path() : '',
+            'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+    'tests': [
+      't/010_pg_basebackup.pl',
+      't/020_pg_receivewal.pl',
+      't/030_pg_recvlogical.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 00000000000..cab021153fe
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_basebackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..c58bcca2f97
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,20 @@
+executable('pg_checksums',
+  ['pg_checksums.c'],
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_checksums',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_actions.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 00000000000..2c47c2338f6
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_checksums-' + pg_version_major.to_string())
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..90664bb3bc3
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,18 @@
+executable('pg_config',
+  ['pg_config.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_config',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_config.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 00000000000..b6fb6db9213
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_config-' + pg_version_major.to_string())
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..969eed2888e
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,18 @@
+executable('pg_controldata',
+  ['pg_controldata.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_controldata',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_controldata.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 00000000000..31b486d002c
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_controldata-' + pg_version_major.to_string())
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..bbb30198d96
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,21 @@
+executable('pg_ctl',
+  ['pg_ctl.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_ctl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_start_stop.pl',
+      't/002_status.pl',
+      't/003_promote.pl',
+      't/004_logrotate.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 00000000000..947b5108423
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_ctl-' + pg_version_major.to_string())
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..ee8daa7d06a
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,83 @@
+pg_dump_common_sources = files(
+  'compress_io.c',
+  'dumputils.c',
+  'parallel.c',
+  'pg_backup_archiver.c',
+  'pg_backup_custom.c',
+  'pg_backup_db.c',
+  'pg_backup_directory.c',
+  'pg_backup_null.c',
+  'pg_backup_tar.c',
+  'pg_backup_utils.c',
+)
+
+if host_system == 'windows'
+  pg_dump_common_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'pg_dump/pg_restore/pg_dumpall - backup and restore PostgreSQL databases',
+        '--NAME', 'pg_dump',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pg_dump_common = static_library('libpgdump_common',
+  pg_dump_common_sources,
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+
+pg_dump_sources = files(
+  'common.c',
+  'pg_dump.c',
+  'pg_dump_sort.c',
+)
+
+executable('pg_dump',
+  pg_dump_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_dumpall_sources = files(
+  'pg_dumpall.c',
+)
+
+executable('pg_dumpall',
+  pg_dumpall_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+pg_restore_sources = files(
+  'pg_restore.c',
+)
+
+executable('pg_restore',
+  pg_restore_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_dump.pl',
+      't/003_pg_dump_with_server.pl',
+      't/010_dump_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 00000000000..82e5e537ff4
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_dump-' + pg_version_major.to_string())
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..dd889188b6d
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,19 @@
+executable('pg_resetwal',
+  files('pg_resetwal.c'),
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_resetwal',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_corrupted.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 00000000000..d130d3b775f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_resetwal-' + pg_version_major.to_string())
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..f31b582546b
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,41 @@
+pg_rewind_sources = files(
+  'datapagemap.c',
+  'file_ops.c',
+  'filemap.c',
+  'libpq_source.c',
+  'local_source.c',
+  'parsexlog.c',
+  'pg_rewind.c',
+  'timeline.c',
+)
+
+pg_rewind_sources += xlogreader_sources
+
+pg_rewind = executable('pg_rewind',
+  pg_rewind_sources,
+  dependencies: [frontend_code, libpq, lz4, zstd],
+  c_args: ['-DFRONTEND'], # needed for xlogreader et al
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_rewind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_databases.pl',
+      't/003_extrafiles.pl',
+      't/004_pg_xlog_symlink.pl',
+      't/005_same_timeline.pl',
+      't/006_options.pl',
+      't/007_standby_source.pl',
+      't/008_min_recovery_point.pl',
+      't/009_growing_files.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 00000000000..a105600b348
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_rewind-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..b2229e9453e
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,18 @@
+executable('pg_test_fsync',
+  ['pg_test_fsync.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_test_fsync',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 00000000000..2ee1125282d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..409fe242353
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,18 @@
+pg_test_timing = executable('pg_test_timing',
+  ['pg_test_timing.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_test_timing',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 00000000000..cda8615165b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_timing-' + pg_version_major.to_string())
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..52324601181
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,39 @@
+pg_upgrade_sources = files(
+  'check.c',
+  'controldata.c',
+  'dump.c',
+  'exec.c',
+  'file.c',
+  'function.c',
+  'info.c',
+  'option.c',
+  'parallel.c',
+  'pg_upgrade.c',
+  'relfilenumber.c',
+  'server.c',
+  'tablespace.c',
+  'util.c',
+  'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+  pg_upgrade_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pg_upgrade',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_upgrade.pl',
+    ],
+    'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 00000000000..39301cbede8
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_upgrade-' + pg_version_major.to_string())
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..307ca23ee73
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,32 @@
+pg_verifybackup_sources = files(
+  'parse_manifest.c',
+  'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+  pg_verifybackup_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_verifybackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_algorithm.pl',
+      't/003_corruption.pl',
+      't/004_options.pl',
+      't/005_bad_manifest.pl',
+      't/006_encoding.pl',
+      't/007_wal.pl',
+      't/008_untar.pl',
+      't/009_extract.pl',
+      't/010_client_untar.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 00000000000..b583f1958ba
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..1fe981b861d
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,29 @@
+pg_waldump_sources = files(
+  'compat.c',
+  'pg_waldump.c',
+  'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
+
+pg_waldump = executable('pg_waldump',
+  pg_waldump_sources,
+  dependencies: [frontend_code, lz4, zstd],
+  c_args: ['-DFRONTEND'], # needed for xlogreader et al
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'pg_waldump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 00000000000..f335aa4b360
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_waldump-' + pg_version_major.to_string())
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..2613ceb4139
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,42 @@
+pgbench_sources = files(
+  'pgbench.c',
+)
+
+# exprscan is compiled as part ofexprparse. The ordering is enforced by making
+# the generation of grammar depend on the scanner generation. That's
+# unnecessarily strict, but overall harmless.
+
+exprscan = custom_target('exprscan',
+  input: files('exprscan.l'),
+  output: ['exprscan.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += exprscan
+
+exprparse = custom_target('exprparse',
+  input: 'exprparse.y',
+  output: 'exprparse.c',
+  depends: exprscan,
+  command: [bison_cmd, '@INPUT@'],)
+generated_sources += exprparse
+pgbench_sources += exprparse
+
+executable('pgbench',
+  pgbench_sources,
+  dependencies: [frontend_code, libpq, thread_dep],
+  include_directories: include_directories('.'),
+  kwargs: default_bin_args,
+)
+
+
+tests += {
+  'name': 'pgbench',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pgbench_with_server.pl',
+      't/002_pgbench_no_server.pl',
+    ],
+  },
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..30995eb0484
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,38 @@
+if host_system != 'windows'
+  subdir_done()
+endif
+
+pgevent_sources = files(
+  'pgevent.c',
+)
+
+# built as part of pgmsgevent.rc, via #include
+win32ver_rc = custom_target(
+  'win32ver.rc',
+  kwargs: rcgen_kw,
+  command: rcgen_lib_cmd + [
+    '--FILEDESC', 'Eventlog message formatter',
+    '--NAME', 'pgevent',],
+)
+
+pgevent_sources += windows.compile_resources(
+  'pgmsgevent.rc',
+  depends: win32ver_rc, # included in file
+  kwargs: rccompile_kw,
+)
+
+# FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
+pgevent_link_args = []
+if cc.get_id() == 'msvc'
+  pgevent_link_args += '/ignore:4104'
+endif
+
+shared_library('pgevent',
+  pgevent_sources,
+  dependencies: [frontend_code],
+  link_args: pgevent_link_args,
+  vs_module_defs: 'pgevent.def',
+  kwargs: default_lib_args + {
+    'name_prefix': '',
+  },
+)
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..626ac8cd105
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,74 @@
+psql_sources = files(
+  'command.c',
+  'common.c',
+  'copy.c',
+  'crosstabview.c',
+  'describe.c',
+  'help.c',
+  'input.c',
+  'large_obj.c',
+  'mainloop.c',
+  'prompt.c',
+  'startup.c',
+  'stringutils.c',
+  'tab-complete.c',
+  'variables.c',
+)
+
+psqlscanslash = custom_target('psqlscanslash',
+  input: ['psqlscanslash.l'],
+  output: ['psqlscanslash.c'],
+  command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'])
+generated_sources += psqlscanslash
+psql_sources += psqlscanslash
+
+sql_help = custom_target('psql_help',
+  output: ['sql_help.c', 'sql_help.h'],
+  depfile: 'sql_help.dep',
+  command: [
+    perl, files('create_help.pl'),
+    '--docdir', '@SOURCE_ROOT@/doc/src/sgml/ref',
+    '--depfile', '@DEPFILE@',
+    '--outdir', '@OUTDIR@',
+    '--basename', 'sql_help',
+  ],
+)
+generated_sources += sql_help.to_list()
+psql_sources += sql_help
+
+if host_system == 'windows'
+  psql_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'psql - the PostgreSQL interactive terminal',
+        '--NAME', 'psql',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+executable('psql',
+  psql_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq, readline],
+  kwargs: default_bin_args,
+)
+
+install_data('psqlrc.sample',
+  install_dir: dir_data,
+)
+
+tests += {
+  'name': 'psql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_basic.pl',
+      't/010_tab_completion.pl',
+      't/020_cancel.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 00000000000..45fe425298d
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('psql-' + pg_version_major.to_string())
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..d6826817f3d
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,50 @@
+scripts_common = static_library('libscripts_common',
+  files('common.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: internal_lib_args,
+)
+
+binaries = [
+  'createdb',
+  'dropdb',
+  'createuser',
+  'dropuser',
+  'clusterdb',
+  'vacuumdb',
+  'reindexdb',
+  'pg_isready',
+]
+
+foreach binary : binaries
+  executable(binary,
+    files(binary + '.c'),
+    link_with: [scripts_common],
+    dependencies: [frontend_code, libpq],
+    kwargs: default_bin_args,
+  )
+endforeach
+
+tests += {
+  'name': 'scripts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_clusterdb.pl',
+      't/011_clusterdb_all.pl',
+      't/020_createdb.pl',
+      't/040_createuser.pl',
+      't/050_dropdb.pl',
+      't/070_dropuser.pl',
+      't/080_pg_isready.pl',
+      't/090_reindexdb.pl',
+      't/091_reindexdb_all.pl',
+      't/100_vacuumdb.pl',
+      't/101_vacuumdb_all.pl',
+      't/102_vacuumdb_stages.pl',
+      't/200_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 00000000000..3c531459c2d
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pgscripts-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..3d44030e72b
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,104 @@
+# test/ is entered via top-level meson.build, that way it can use the default
+# args for executables (which depend on libpq).
+
+libpq_sources = files(
+  'fe-auth-scram.c',
+  'fe-auth.c',
+  'fe-connect.c',
+  'fe-exec.c',
+  'fe-lobj.c',
+  'fe-misc.c',
+  'fe-print.c',
+  'fe-protocol3.c',
+  'fe-secure.c',
+  'fe-trace.c',
+  'legacy-pqsignal.c',
+  'libpq-events.c',
+  'pqexpbuffer.c',
+)
+
+if host_system == 'windows'
+  libpq_sources += files('pthread-win32.c', 'win32.c')
+endif
+
+if ssl.found()
+  libpq_sources += files('fe-secure-common.c')
+  libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+  libpq_sources += files(
+    'fe-gssapi-common.c',
+    'fe-secure-gssapi.c',
+  )
+endif
+
+export_file = custom_target('libpq.exports',
+  kwargs: gen_export_kwargs,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+libpq_link_depends = []
+
+if host_system == 'windows'
+  libpq_deps += cc.find_library('secur32', required: true)
+endif
+
+libpq_both = both_libraries('libpq',
+  libpq_sources,
+  include_directories: [libpq_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=5'],
+  dependencies: libpq_deps,
+  version: '5.' + pg_version_major.to_string(),
+  soversion: host_system != 'windows' ? '5' : '',
+  darwin_versions: ['5', '5.' + pg_version_major.to_string()],
+  link_depends: export_file,
+  link_args: export_fmt.format(export_file.full_path()),
+  kwargs: default_lib_args,
+)
+
+libpq_so = libpq_both.get_shared_lib()
+
+libpq = declare_dependency(
+  link_with: [libpq_so],
+  include_directories: [include_directories('.')]
+)
+
+pkgconfig.generate(
+  libpq_so,
+  name: 'libpq',
+  description: 'PostgreSQL libpq library',
+  url: pg_url,
+)
+
+install_headers(
+  'libpq-fe.h',
+  'libpq-events.h',
+)
+
+install_headers(
+  'libpq-int.h',
+  'pqexpbuffer.h',
+  'fe-auth-sasl.h',
+  install_dir: dir_include_internal,
+)
+install_data('pg_service.conf.sample',
+  install_dir: dir_data,
+)
+
+
+tests += {
+  'name': 'libpq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_uri.pl',
+      't/002_api.pl',
+    ],
+    'env': {'with_ssl': get_option('ssl')},
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build
new file mode 100644
index 00000000000..eed91110fd6
--- /dev/null
+++ b/src/interfaces/libpq/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
new file mode 100644
index 00000000000..16f94c1ed8b
--- /dev/null
+++ b/src/interfaces/libpq/test/meson.build
@@ -0,0 +1,15 @@
+executable('libpq_uri_regress',
+  files('libpq_uri_regress.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+executable('libpq_testclient',
+  files('libpq_testclient.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..d9a57465441
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,5 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
+subdir('tcl')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..6831011edac
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,92 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+plperl_sources = files(
+  'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+  check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(privlibexp)
+
+plperl_sources += custom_target('perlchunks.h',
+  input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+  output: 'perlchunks.h',
+  capture: true,
+  command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+  input: files('plperl_opmask.pl'),
+  output: 'plperl_opmask.h',
+  command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+  xs = files(n + '.xs')
+  xs_c_name = n + '.c'
+
+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?
+  xs_c = custom_target(xs_c_name,
+    input: xs,
+    output: xs_c_name,
+    command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+  )
+  plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+shared_module('plperl',
+  plperl_sources,
+  include_directories: [plperl_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, pg_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+
+install_data(
+  'plperl.control',
+  'plperl--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_data(
+  'plperlu.control',
+  'plperlu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plperl.h',
+  'ppport.h',
+  install_dir: dir_include_server,
+)
+
+tests += {
+  'name': 'plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plperl_setup',
+      'plperl',
+      'plperl_lc',
+      'plperl_trigger',
+      'plperl_shared',
+      'plperl_elog',
+      'plperl_util',
+      'plperl_init',
+      'plperlu',
+      'plperl_array',
+      'plperl_call',
+      'plperl_transaction',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build
new file mode 100644
index 00000000000..fe0a715bdf0
--- /dev/null
+++ b/src/pl/plperl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plperl-' + pg_version_major.to_string())
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..c4c94a312e1
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,83 @@
+plpgsql_sources = files(
+  'pl_comp.c',
+  'pl_exec.c',
+  'pl_funcs.c',
+  'pl_handler.c',
+  'pl_scanner.c',
+)
+
+pl_gram = custom_target('gram',
+  input: ['pl_gram.y'],
+  output: ['pl_gram.c', 'pl_gram.h'],
+  command: [bison_cmd, '-d', '@INPUT@'])
+generated_sources += pl_gram.to_list()
+plpgsql_sources += pl_gram
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+pl_errcodes = custom_target('plerrcodes',
+  input: ['../../../../src/backend/utils/errcodes.txt'],
+  output: ['plerrcodes.h'],
+  command: [perl, gen_plerrcodes, '@INPUT0@'],
+  capture: true,
+)
+generated_sources += pl_errcodes
+plpgsql_sources += pl_errcodes
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+pl_reserved = custom_target('pl_reserved_kwlist',
+  input: ['pl_reserved_kwlist.h'],
+  output: ['pl_reserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_reserved
+plpgsql_sources += pl_reserved
+
+pl_unreserved = custom_target('pl_unreserved_kwlist',
+  input: ['pl_unreserved_kwlist.h'],
+  output: ['pl_unreserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_unreserved
+plpgsql_sources += pl_unreserved
+
+shared_module('plpgsql',
+  plpgsql_sources,
+  include_directories: include_directories('.'),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plpgsql.control',
+  'plpgsql--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpgsql.h',
+  install_dir: dir_include_server
+)
+
+
+tests += {
+  'name': 'plpgsql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plpgsql_array',
+      'plpgsql_call',
+      'plpgsql_control',
+      'plpgsql_copy',
+      'plpgsql_domain',
+      'plpgsql_record',
+      'plpgsql_cache',
+      'plpgsql_simple',
+      'plpgsql_transaction',
+      'plpgsql_trap',
+      'plpgsql_trigger',
+      'plpgsql_varprops',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build
new file mode 100644
index 00000000000..29e0b74488f
--- /dev/null
+++ b/src/pl/plpgsql/src/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpgsql-' + pg_version_major.to_string())
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..e9e77ae3691
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,98 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+plpython_sources = files(
+  'plpy_cursorobject.c',
+  'plpy_elog.c',
+  'plpy_exec.c',
+  'plpy_main.c',
+  'plpy_planobject.c',
+  'plpy_plpymodule.c',
+  'plpy_procedure.c',
+  'plpy_resultobject.c',
+  'plpy_spi.c',
+  'plpy_subxactobject.c',
+  'plpy_typeio.c',
+  'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'spiexceptions.h',
+  command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+  capture: true,
+)
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+shared_module('plpython3',
+  plpython_sources,
+  include_directories: [plpython_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [python3_dep, pg_mod_args['dependencies']],
+  },
+)
+
+# FIXME: Only install the relevant versions
+install_data(
+  'plpython3u.control',
+  'plpython3u--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpy_cursorobject.h',
+  'plpy_elog.h',
+  'plpy_exec.h',
+  'plpy_main.h',
+  'plpy_planobject.h',
+  'plpy_plpymodule.h',
+  'plpy_procedure.h',
+  'plpy_resultobject.h',
+  'plpy_spi.h',
+  'plpy_subxactobject.h',
+  'plpy_typeio.h',
+  'plpy_util.h',
+  'plpython.h',
+  install_dir: dir_include_server,
+)
+
+plpython_regress = [
+  'plpython_schema',
+  'plpython_populate',
+  'plpython_test',
+  'plpython_do',
+  'plpython_global',
+  'plpython_import',
+  'plpython_spi',
+  'plpython_newline',
+  'plpython_void',
+  'plpython_call',
+  'plpython_params',
+  'plpython_setof',
+  'plpython_record',
+  'plpython_trigger',
+  'plpython_types',
+  'plpython_error',
+  'plpython_ereport',
+  'plpython_unicode',
+  'plpython_quote',
+  'plpython_composite',
+  'plpython_subtransaction',
+  'plpython_transaction',
+  'plpython_drop',
+]
+
+tests += {
+  'name': 'plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': plpython_regress,
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build
new file mode 100644
index 00000000000..542e27fbe1f
--- /dev/null
+++ b/src/pl/plpython/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpython-' + pg_version_major.to_string())
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
new file mode 100644
index 00000000000..1acb49f1637
--- /dev/null
+++ b/src/pl/tcl/meson.build
@@ -0,0 +1,54 @@
+if not tcl_dep.found()
+  subdir_done()
+endif
+
+pltcl_sources = files(
+  'pltcl.c',
+)
+
+gen_pltclerrcodes = files('generate-pltclerrcodes.pl')
+pltcl_sources += custom_target('pltclerrcodes.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'pltclerrcodes.h',
+  capture: true,
+  command: [perl, gen_pltclerrcodes, '@INPUT@']
+)
+
+shared_module('pltcl',
+  pltcl_sources,
+  include_directories: [include_directories('.'), postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [tcl_dep, pg_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'pltcl.control',
+  'pltcl--1.0.sql',
+  'pltclu.control',
+  'pltclu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+pltcl_regress = [
+  'pltcl_setup',
+  'pltcl_queries',
+  'pltcl_trigger',
+  'pltcl_call',
+  'pltcl_start_proc',
+  'pltcl_subxact',
+  'pltcl_unicode',
+  'pltcl_transaction',
+]
+
+tests += {
+  'name': 'pltcl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': pltcl_regress,
+    'regress_args': ['--load-extension=pltcl'],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build
new file mode 100644
index 00000000000..cc23ef1eb3b
--- /dev/null
+++ b/src/pl/tcl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pltcl-' + pg_version_major.to_string())
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..b69f34346ce
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,22 @@
+adminpack = shared_module('adminpack',
+  ['adminpack.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'adminpack.control',
+  'adminpack--1.0.sql',
+  'adminpack--1.0--1.1.sql',
+  'adminpack--1.1--2.0.sql',
+  'adminpack--2.0--2.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'adminpack',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ['adminpack'],
+  },
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..d75d8c91c4b
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,36 @@
+amcheck = shared_module('amcheck', [
+    'verify_heapam.c',
+    'verify_nbtree.c',
+  ],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'amcheck.control',
+  'amcheck--1.0.sql',
+  'amcheck--1.0--1.1.sql',
+  'amcheck--1.1--1.2.sql',
+  'amcheck--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'check',
+      'check_btree',
+      'check_heap',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_verify_heapam.pl',
+      't/002_cic.pl',
+      't/003_cic_2pc.pl',
+    ],
+  },
+}
+
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..941bb6f39a4
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,4 @@
+autoinc = shared_module('auth_delay',
+  ['auth_delay.c'],
+  kwargs: contrib_mod_args,
+)
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..9456d569fc2
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,15 @@
+auto_explain = shared_module('auto_explain',
+  files('auto_explain.c'),
+  kwargs: contrib_mod_args,
+)
+
+tests += {
+  'name': 'auto_explain',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auto_explain.pl',
+    ],
+  },
+}
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
new file mode 100644
index 00000000000..c9fb0f7cf68
--- /dev/null
+++ b/contrib/basebackup_to_shell/meson.build
@@ -0,0 +1,22 @@
+basebackup_to_shell_sources = files(
+  'basebackup_to_shell.c',
+)
+
+basebackup_to_shell = shared_module('basebackup_to_shell',
+  basebackup_to_shell_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+tests += {
+  'name': 'basebackup_to_shell',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path()},
+  },
+}
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
new file mode 100644
index 00000000000..b81582c7c0f
--- /dev/null
+++ b/contrib/basic_archive/meson.build
@@ -0,0 +1,23 @@
+basic_archive_sources = files(
+  'basic_archive.c',
+)
+
+basic_archive = shared_module('basic_archive',
+  basic_archive_sources,
+  kwargs: contrib_mod_args,
+)
+
+
+tests += {
+  'name': 'basic_archive',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'basic_archive',
+    ],
+    'regress_args': [
+      '--temp-config', files('basic_archive.conf'),
+    ],
+  },
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..311cc10c557
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,35 @@
+bloom_sources = files(
+  'blcost.c',
+  'blinsert.c',
+  'blscan.c',
+  'blutils.c',
+  'blvacuum.c',
+  'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+  bloom_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'bloom.control',
+  'bloom--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bloom',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_wal.pl',
+    ],
+  },
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..c978f54402e
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,41 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+bool_plperl_sources = files(
+  'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+  bool_plperl_sources,
+  include_directories: [plperl_inc, include_directories('.')],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+
+install_data(
+  'bool_plperl.control',
+  'bool_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'bool_plperlu.control',
+  'bool_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bool_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bool_plperl',
+      'bool_plperlu',
+    ],
+  },
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..356dbe84f10
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,53 @@
+btree_gin = shared_module('btree_gin',
+  files('btree_gin.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gin.control',
+  'btree_gin--1.0.sql',
+  'btree_gin--1.0--1.1.sql',
+  'btree_gin--1.1--1.2.sql',
+  'btree_gin--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'install_btree_gin',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'money',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'enum',
+      'uuid',
+      'name',
+      'bool',
+      'bpchar',
+    ],
+  },
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..6bd91b88fc3
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,83 @@
+btree_gist_sources = files(
+  'btree_bit.c',
+  'btree_bool.c',
+  'btree_bytea.c',
+  'btree_cash.c',
+  'btree_date.c',
+  'btree_enum.c',
+  'btree_float4.c',
+  'btree_float8.c',
+  'btree_gist.c',
+  'btree_inet.c',
+  'btree_int2.c',
+  'btree_int4.c',
+  'btree_int8.c',
+  'btree_interval.c',
+  'btree_macaddr.c',
+  'btree_macaddr8.c',
+  'btree_numeric.c',
+  'btree_oid.c',
+  'btree_text.c',
+  'btree_time.c',
+  'btree_ts.c',
+  'btree_utils_num.c',
+  'btree_utils_var.c',
+  'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+  btree_gist_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'btree_gist.control',
+  'btree_gist--1.0--1.1.sql',
+  'btree_gist--1.1--1.2.sql',
+  'btree_gist--1.2.sql',
+  'btree_gist--1.2--1.3.sql',
+  'btree_gist--1.3--1.4.sql',
+  'btree_gist--1.4--1.5.sql',
+  'btree_gist--1.5--1.6.sql',
+  'btree_gist--1.6--1.7.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'init',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'cash',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'uuid',
+      'not_equal',
+      'enum',
+      'bool',
+    ],
+  },
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..507745ba747
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,33 @@
+citext_sources = files(
+  'citext.c',
+)
+
+citext = shared_module('citext',
+  citext_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'citext.control',
+  'citext--1.0--1.1.sql',
+  'citext--1.1--1.2.sql',
+  'citext--1.2--1.3.sql',
+  'citext--1.3--1.4.sql',
+  'citext--1.4.sql',
+  'citext--1.4--1.5.sql',
+  'citext--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'citext',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'create_index_acl',
+      'citext',
+      'citext_utf8',
+    ],
+  },
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..425c258d124
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,52 @@
+cube_sources = files(
+  'cube.c',
+)
+
+# cubescan is compiled as part of cubeparse
+cube_scan = custom_target('cubescan',
+  input: ['cubescan.l'],
+  output: ['cubescan.c'],
+  command: [flex_cmd, '@INPUT@'],)
+generated_sources += cube_scan
+
+cube_parse = custom_target('cubeparse',
+  input: 'cubeparse.y',
+  output: 'cubeparse.c',
+  depends: cube_scan,
+  command: [bison_cmd, '@INPUT@'],)
+generated_sources += cube_parse
+cube_sources += cube_parse
+
+cube = shared_module('cube',
+  cube_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'cube.control',
+  'cube--1.0--1.1.sql',
+  'cube--1.1--1.2.sql',
+  'cube--1.2.sql',
+  'cube--1.2--1.3.sql',
+  'cube--1.3--1.4.sql',
+  'cube--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'cubedata.h',
+  install_dir: dir_include_extension / 'cube',
+)
+
+tests += {
+  'name': 'cube',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'cube',
+      'cube_sci',
+    ],
+  },
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..1ebaa4ca00d
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,30 @@
+dblink_sources = files(
+  'dblink.c',
+)
+
+dblink = shared_module('dblink',
+  dblink_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'dblink.control',
+  'dblink--1.0--1.1.sql',
+  'dblink--1.1--1.2.sql',
+  'dblink--1.2.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dblink',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dblink',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..2c937a3df5e
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,21 @@
+dict_int = shared_module('dict_int',
+  files('dict_int.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_int.control',
+  'dict_int--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dict_int',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_int',
+    ],
+  },
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..ec6e175733d
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,28 @@
+dict_xsyn = shared_module('dict_xsyn',
+  files('dict_xsyn.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'dict_xsyn.control',
+  'dict_xsyn--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'xsyn_sample.rules',
+  kwargs: contrib_data_args + {
+    'install_dir': dir_data / 'tsearch_data'
+  }
+)
+
+tests += {
+  'name': 'dict_xsyn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_xsyn',
+    ],
+  },
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..35b448870b8
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,22 @@
+earthdistance = shared_module('earthdistance',
+  files('earthdistance.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'earthdistance.control',
+  'earthdistance--1.0--1.1.sql',
+  'earthdistance--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'earthdistance',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'earthdistance',
+    ],
+  },
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..26d26d1e0c4
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,21 @@
+file_fdw = shared_module('file_fdw',
+  files('file_fdw.c'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'file_fdw.control',
+  'file_fdw--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'file_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'file_fdw',
+    ],
+  },
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..73d88e92cfe
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,25 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+  files(
+    'fuzzystrmatch.c',
+    'dmetaphone.c'
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'fuzzystrmatch.control',
+  'fuzzystrmatch--1.0--1.1.sql',
+  'fuzzystrmatch--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'fuzzystrmatch',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'fuzzystrmatch',
+    ],
+  },
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..369c60d7f40
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,43 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+  files(
+    'hstore_compat.c',
+    'hstore_gin.c',
+    'hstore_gist.c',
+    'hstore_io.c',
+    'hstore_op.c',
+    'hstore_subs.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'hstore.control',
+  'hstore--1.1--1.2.sql',
+  'hstore--1.2--1.3.sql',
+  'hstore--1.3--1.4.sql',
+  'hstore--1.4.sql',
+  'hstore--1.4--1.5.sql',
+  'hstore--1.5--1.6.sql',
+  'hstore--1.6--1.7.sql',
+  'hstore--1.7--1.8.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'hstore.h',
+  install_dir: dir_include_extension / 'hstore',
+)
+
+tests += {
+  'name': 'hstore',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore',
+    ],
+  },
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..a450eab1aa3
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,42 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+hstore_plperl_sources = files(
+  'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+  hstore_plperl_sources,
+  include_directories: [plperl_inc, hstore_inc],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+
+install_data(
+  'hstore_plperl.control',
+  'hstore_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'hstore_plperlu.control',
+  'hstore_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'hstore_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore_plperl',
+      'hstore_plperlu',
+      'create_transform',
+    ],
+  },
+}
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..218de2587e6
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+hstore_plpython_sources = files(
+  'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+  hstore_plpython_sources,
+  include_directories: [plpython_inc, hstore_inc, ],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'hstore_plpython3u--1.0.sql',
+  'hstore_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = [
+  'hstore_plpython'
+]
+
+tests += {
+  'name': 'hstore_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': hstore_plpython_regress,
+    'regress_args': ['--load-extension=hstore'],
+  },
+}
diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build
new file mode 100644
index 00000000000..a0f39366f47
--- /dev/null
+++ b/contrib/intagg/meson.build
@@ -0,0 +1,6 @@
+install_data(
+  'intagg.control',
+  'intagg--1.0--1.1.sql',
+  'intagg--1.1.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
new file mode 100644
index 00000000000..dfbfbc9fa6a
--- /dev/null
+++ b/contrib/intarray/meson.build
@@ -0,0 +1,36 @@
+intarray_sources = files(
+  '_int_bool.c',
+  '_int_gin.c',
+  '_int_gist.c',
+  '_int_op.c',
+  '_int_selfuncs.c',
+  '_int_tool.c',
+  '_intbig_gist.c',
+)
+
+intarray = shared_module('_int',
+  intarray_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'intarray.control',
+  'intarray--1.0--1.1.sql',
+  'intarray--1.1--1.2.sql',
+  'intarray--1.2.sql',
+  'intarray--1.2--1.3.sql',
+  'intarray--1.3--1.4.sql',
+  'intarray--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'intarray',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      '_int',
+    ],
+  },
+}
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
new file mode 100644
index 00000000000..508e2dfa080
--- /dev/null
+++ b/contrib/isn/meson.build
@@ -0,0 +1,32 @@
+isn_sources = files(
+  'isn.c',
+)
+
+isn = shared_module('isn',
+  isn_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'isn.control',
+  'isn--1.0--1.1.sql',
+  'isn--1.1--1.2.sql',
+  'isn--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'isn.h',
+  install_dir: dir_include_extension / 'isn',
+)
+
+tests += {
+  'name': 'isn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'isn',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..0c9f120c9b6
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,42 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+  'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+  jsonb_plperl_sources,
+  include_directories: [plperl_inc],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+
+install_data(
+  'jsonb_plperl.control',
+  'jsonb_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'jsonb_plperlu.control',
+  'jsonb_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'jsonb_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'jsonb_plperl',
+      'jsonb_plperlu',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..763dc4916e6
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,35 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+  'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+  jsonb_plpython_sources,
+  include_directories: [plpython_inc],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'jsonb_plpython3u.control',
+  'jsonb_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = [
+  'jsonb_plpython'
+]
+
+tests += {
+  'name': 'jsonb_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': jsonb_plpython_regress,
+  },
+}
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
new file mode 100644
index 00000000000..224a2562017
--- /dev/null
+++ b/contrib/lo/meson.build
@@ -0,0 +1,26 @@
+lo_sources = files(
+  'lo.c',
+)
+
+lo = shared_module('lo',
+  lo_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'lo.control',
+  'lo--1.0--1.1.sql',
+  'lo--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'lo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'lo',
+    ],
+  },
+}
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
new file mode 100644
index 00000000000..222c64bb35d
--- /dev/null
+++ b/contrib/ltree/meson.build
@@ -0,0 +1,43 @@
+ltree_sources = files(
+  '_ltree_gist.c',
+  '_ltree_op.c',
+  'crc32.c',
+  'lquery_op.c',
+  'ltree_gist.c',
+  'ltree_io.c',
+  'ltree_op.c',
+  'ltxtquery_io.c',
+  'ltxtquery_op.c',
+)
+
+# .. so that includes of ltree/ltree.h work
+ltree_inc = include_directories('.', '../')
+
+ltree = shared_module('ltree',
+  ltree_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'ltree.control',
+  'ltree--1.0--1.1.sql',
+  'ltree--1.1--1.2.sql',
+  'ltree--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'ltree.h',
+  install_dir: dir_include_extension / 'ltree',
+)
+
+tests += {
+  'name': 'ltree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ltree',
+    ],
+  },
+}
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
new file mode 100644
index 00000000000..8bc09831dc8
--- /dev/null
+++ b/contrib/ltree_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+ltree_plpython_sources = files(
+  'ltree_plpython.c',
+)
+
+ltree_plpython = shared_module('ltree_plpython3',
+  ltree_plpython_sources,
+  include_directories: [plpython_inc, ltree_inc],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'ltree_plpython3u--1.0.sql',
+  'ltree_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+ltree_plpython_regress = [
+  'ltree_plpython'
+]
+
+tests += {
+  'name': 'ltree_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ltree_plpython_regress,
+    'regress_args': ['--load-extension=ltree'],
+  },
+}
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..84752d4bd0f
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,66 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = dir_data_extension
+contrib_data_args = {
+  'install_dir': contrib_data_dir,
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('basic_archive')
+subdir('bloom')
+subdir('basebackup_to_shell')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+subdir('intagg')
+subdir('intarray')
+subdir('isn')
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+subdir('lo')
+subdir('ltree')
+subdir('ltree_plpython')
+subdir('oid2name')
+subdir('old_snapshot')
+subdir('pageinspect')
+subdir('passwordcheck')
+subdir('pg_buffercache')
+subdir('pgcrypto')
+subdir('pg_freespacemap')
+subdir('pg_prewarm')
+subdir('pgrowlocks')
+subdir('pg_stat_statements')
+subdir('pgstattuple')
+subdir('pg_surgery')
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('pg_walinspect')
+subdir('postgres_fdw')
+subdir('seg')
+subdir('sepgsql')
+subdir('spi')
+subdir('sslinfo')
+# start-scripts doesn't contain build products
+subdir('tablefunc')
+subdir('tcn')
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+subdir('uuid-ossp')
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..633ce305a05
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,16 @@
+executable('oid2name',
+  ['oid2name.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'oid2name',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
new file mode 100644
index 00000000000..5785c29e9f8
--- /dev/null
+++ b/contrib/old_snapshot/meson.build
@@ -0,0 +1,14 @@
+old_snapshot_sources = files(
+  'time_mapping.c',
+)
+
+old_snapshot = shared_module('old_snapshot',
+  old_snapshot_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'old_snapshot.control',
+  'old_snapshot--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..efae36c0909
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,59 @@
+pageinspect_sources = files(
+  'brinfuncs.c',
+  'btreefuncs.c',
+  'fsmfuncs.c',
+  'ginfuncs.c',
+  'gistfuncs.c',
+  'hashfuncs.c',
+  'heapfuncs.c',
+  'rawpage.c',
+)
+
+if host_system == 'windows'
+  pageinspect_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_lib_cmd + [
+        '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',
+        '--NAME', 'pageinspect',]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pageinspect = shared_module('pageinspect',
+  pageinspect_sources,
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pageinspect--1.0--1.1.sql',
+  'pageinspect--1.1--1.2.sql',
+  'pageinspect--1.2--1.3.sql',
+  'pageinspect--1.3--1.4.sql',
+  'pageinspect--1.4--1.5.sql',
+  'pageinspect--1.5--1.6.sql',
+  'pageinspect--1.5.sql',
+  'pageinspect--1.6--1.7.sql',
+  'pageinspect--1.7--1.8.sql',
+  'pageinspect--1.8--1.9.sql',
+  'pageinspect--1.9--1.10.sql',
+  'pageinspect.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pageinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'page',
+      'btree',
+      'brin',
+      'gin',
+      'gist',
+      'hash',
+      'checksum',
+      'oldextversions',
+    ],
+  },
+}
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
new file mode 100644
index 00000000000..58128269d06
--- /dev/null
+++ b/contrib/passwordcheck/meson.build
@@ -0,0 +1,29 @@
+passwordcheck_sources = files(
+  'passwordcheck.c',
+)
+
+passwordcheck_c_args = []
+passwordcheck_deps = []
+
+# uncomment the following two lines to enable cracklib support
+# passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
+# passwordcheck_deps += [cc.find_library('crack')]
+
+passwordcheck = shared_module('passwordcheck',
+  passwordcheck_sources,
+  c_args: passwordcheck_c_args,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args.get('dependencies') + passwordcheck_deps,
+  }
+)
+
+tests += {
+  'name': 'passwordcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'passwordcheck',
+    ],
+  },
+}
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
new file mode 100644
index 00000000000..9650ec1ccc5
--- /dev/null
+++ b/contrib/pg_buffercache/meson.build
@@ -0,0 +1,26 @@
+pg_buffercache = shared_module('pg_buffercache',
+  files(
+    'pg_buffercache_pages.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_buffercache--1.0--1.1.sql',
+  'pg_buffercache--1.1--1.2.sql',
+  'pg_buffercache--1.2--1.3.sql',
+  'pg_buffercache--1.2.sql',
+  'pg_buffercache.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_buffercache',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_buffercache',
+    ],
+  },
+}
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
new file mode 100644
index 00000000000..07295081278
--- /dev/null
+++ b/contrib/pg_freespacemap/meson.build
@@ -0,0 +1,28 @@
+pg_freespacemap = shared_module('pg_freespacemap',
+  files(
+    'pg_freespacemap.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_freespacemap--1.0--1.1.sql',
+  'pg_freespacemap--1.1--1.2.sql',
+  'pg_freespacemap--1.1.sql',
+  'pg_freespacemap.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_freespacemap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_freespacemap',
+    ],
+    'regress_args': [
+      '--temp-config', files('pg_freespacemap.conf')
+    ],
+  },
+}
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..08d0831e9da
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,26 @@
+pg_prewarm = shared_module('pg_prewarm',
+  files(
+    'autoprewarm.c',
+    'pg_prewarm.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_prewarm--1.0--1.1.sql',
+  'pg_prewarm--1.1--1.2.sql',
+  'pg_prewarm--1.1.sql',
+  'pg_prewarm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_prewarm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..1b977f06b13
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,34 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+  files('pg_stat_statements.c'),
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_stat_statements.control',
+  'pg_stat_statements--1.4.sql',
+  'pg_stat_statements--1.9--1.10.sql',
+  'pg_stat_statements--1.8--1.9.sql',
+  'pg_stat_statements--1.7--1.8.sql',
+  'pg_stat_statements--1.6--1.7.sql',
+  'pg_stat_statements--1.5--1.6.sql',
+  'pg_stat_statements--1.4--1.5.sql',
+  'pg_stat_statements--1.3--1.4.sql',
+  'pg_stat_statements--1.2--1.3.sql',
+  'pg_stat_statements--1.1--1.2.sql',
+  'pg_stat_statements--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_stat_statements',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_stat_statements',
+    ],
+    'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+  },
+}
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
new file mode 100644
index 00000000000..8ce84ba728d
--- /dev/null
+++ b/contrib/pg_surgery/meson.build
@@ -0,0 +1,24 @@
+pg_surgery = shared_module('pg_surgery',
+  files(
+    'heap_surgery.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_surgery--1.0.sql',
+  'pg_surgery.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_surgery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'heap_surgery',
+    ],
+  },
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..37931279f65
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,34 @@
+pg_trgm = shared_module('pg_trgm',
+  files(
+    'trgm_gin.c',
+    'trgm_gist.c',
+    'trgm_op.c',
+    'trgm_regexp.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_trgm--1.0--1.1.sql',
+  'pg_trgm--1.1--1.2.sql',
+  'pg_trgm--1.2--1.3.sql',
+  'pg_trgm--1.3--1.4.sql',
+  'pg_trgm--1.3.sql',
+  'pg_trgm--1.4--1.5.sql',
+  'pg_trgm--1.5--1.6.sql',
+  'pg_trgm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_trgm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_trgm',
+      'pg_word_trgm',
+      'pg_strict_word_trgm',
+    ],
+  },
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..958a73a69ff
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,26 @@
+pg_visibility = shared_module('pg_visibility',
+  files(
+    'pg_visibility.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pg_visibility--1.0--1.1.sql',
+  'pg_visibility--1.1--1.2.sql',
+  'pg_visibility--1.1.sql',
+  'pg_visibility.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_visibility',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_visibility',
+    ],
+  },
+}
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
new file mode 100644
index 00000000000..64d08bcfb45
--- /dev/null
+++ b/contrib/pg_walinspect/meson.build
@@ -0,0 +1,37 @@
+pg_walinspect_sources = files('pg_walinspect.c')
+
+if host_system == 'windows'
+  pg_walinspect_sources += windows.compile_resources(
+    custom_target('win32ver.rc', kwargs: rcgen_kw,
+      command: rcgen_bin_cmd + [
+        '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',
+        '--NAME', 'pg_walinspect',
+      ]),
+    kwargs: rccompile_kw,
+  )
+endif
+
+pg_walinspect = shared_module('pg_walinspect',
+  pg_walinspect_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+
+install_data(
+  'pg_walinspect.control',
+  'pg_walinspect--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_walinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_walinspect',
+    ],
+    'regress_args': ['--temp-config', files('walinspect.conf')],
+  },
+}
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
new file mode 100644
index 00000000000..647bea8559e
--- /dev/null
+++ b/contrib/pgcrypto/meson.build
@@ -0,0 +1,99 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+pgcrypto_sources = files(
+  'crypt-blowfish.c',
+  'crypt-des.c',
+  'crypt-gensalt.c',
+  'crypt-md5.c',
+  'mbuf.c',
+  'pgcrypto.c',
+  'pgp-armor.c',
+  'pgp-cfb.c',
+  'pgp-compress.c',
+  'pgp-decrypt.c',
+  'pgp-encrypt.c',
+  'pgp-info.c',
+  'pgp-mpi.c',
+  'pgp-pgsql.c',
+  'pgp-pubdec.c',
+  'pgp-pubenc.c',
+  'pgp-pubkey.c',
+  'pgp-s2k.c',
+  'pgp.c',
+  'px-crypt.c',
+  'px-hmac.c',
+  'px.c',
+)
+
+pgcrypto_regress = [
+  'init',
+  'md5',
+  'sha1',
+  'hmac-md5',
+  'hmac-sha1',
+  'blowfish',
+  'rijndael',
+  'sha2',
+  'des',
+  '3des',
+  'cast5',
+  'crypt-des',
+  'crypt-md5',
+  'crypt-blowfish',
+  'crypt-xdes',
+  'pgp-armor',
+  'pgp-decrypt',
+  'pgp-encrypt',
+  'pgp-pubkey-decrypt',
+  'pgp-pubkey-encrypt',
+  'pgp-info',
+]
+
+pgcrypto_openssl_sources = files(
+  'openssl.c',
+  'pgp-mpi-openssl.c',
+)
+
+pgcrypto_deps = []
+pgcrypto_link_with = []
+
+pgcrypto_deps += ssl
+pgcrypto_sources += pgcrypto_openssl_sources
+
+if zlib.found()
+  pgcrypto_deps += zlib
+  pgcrypto_regress += 'pgp-compression'
+else
+  pgcrypto_regress += 'pgp-zlib-DISABLED'
+endif
+
+pgcrypto = shared_module('pgcrypto',
+  pgcrypto_sources,
+  link_with: pgcrypto_link_with,
+  kwargs: contrib_mod_args + {
+    'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
+  },
+)
+
+install_data(
+  'pgcrypto--1.0--1.1.sql',
+  'pgcrypto--1.1--1.2.sql',
+  'pgcrypto--1.2--1.3.sql',
+  'pgcrypto--1.3.sql',
+  'pgcrypto.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgcrypto',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      pgcrypto_regress,
+    ],
+  },
+}
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
new file mode 100644
index 00000000000..5b1f8d520a6
--- /dev/null
+++ b/contrib/pgrowlocks/meson.build
@@ -0,0 +1,14 @@
+pgrowlocks = shared_module('pgrowlocks',
+  files(
+    'pgrowlocks.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgrowlocks--1.0--1.1.sql',
+  'pgrowlocks--1.1--1.2.sql',
+  'pgrowlocks--1.2.sql',
+  'pgrowlocks.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
new file mode 100644
index 00000000000..190f8b5d92b
--- /dev/null
+++ b/contrib/pgstattuple/meson.build
@@ -0,0 +1,31 @@
+pgstattuple = shared_module('pgstattuple',
+  files(
+    'pgstatapprox.c',
+    'pgstatindex.c',
+    'pgstattuple.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'pgstattuple--1.0--1.1.sql',
+  'pgstattuple--1.1--1.2.sql',
+  'pgstattuple--1.2--1.3.sql',
+  'pgstattuple--1.3--1.4.sql',
+  'pgstattuple--1.4--1.5.sql',
+  'pgstattuple--1.4.sql',
+  'pgstattuple.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgstattuple',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pgstattuple',
+    ],
+  },
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..f08bb024707
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,33 @@
+postgres_fdw_sources = files(
+  'connection.c',
+  'deparse.c',
+  'option.c',
+  'postgres_fdw.c',
+  'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'] + [libpq],
+  },
+)
+
+install_data(
+  'postgres_fdw.control',
+  'postgres_fdw--1.0.sql',
+  'postgres_fdw--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'postgres_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'postgres_fdw',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
new file mode 100644
index 00000000000..b1f9db50e42
--- /dev/null
+++ b/contrib/seg/meson.build
@@ -0,0 +1,50 @@
+seg_sources = files(
+  'seg.c',
+)
+
+# segscan is compiled as part of segparse
+seg_scan = custom_target('segscan',
+  input: ['segscan.l'],
+  output: ['segscan.c'],
+  command: [flex_cmd, '@INPUT@'],)
+generated_sources += seg_scan
+
+seg_parse = custom_target('segparse',
+  input: 'segparse.y',
+  output: 'segparse.c',
+  depends: seg_scan,
+  command: [bison_cmd, '@INPUT@'],)
+generated_sources += seg_parse
+seg_sources += seg_parse
+
+seg = shared_module('seg',
+  seg_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'seg.control',
+  'seg--1.0--1.1.sql',
+  'seg--1.1--1.2.sql',
+  'seg--1.1.sql',
+  'seg--1.2--1.3.sql',
+  'seg--1.3--1.4.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'segdata.h',
+  install_dir: dir_include_extension / 'seg',
+)
+
+tests += {
+  'name': 'seg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'seg',
+    ],
+  },
+}
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
new file mode 100644
index 00000000000..83e74f035b1
--- /dev/null
+++ b/contrib/sepgsql/meson.build
@@ -0,0 +1,33 @@
+if not selinux.found()
+  subdir_done()
+endif
+
+sepgsql_sources = files(
+  'database.c',
+  'dml.c',
+  'hooks.c',
+  'label.c',
+  'proc.c',
+  'relation.c',
+  'schema.c',
+  'selinux.c',
+  'uavc.c',
+)
+
+sepgsql = shared_module('sepgsql',
+  sepgsql_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': [selinux, contrib_mod_args['dependencies']],
+  }
+)
+
+custom_target('sepgsql.sql',
+  input: 'sepgsql.sql.in',
+  output: 'sepgsql.sql',
+  command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'],
+  capture: true,
+  install: true,
+  install_dir: contrib_data_args['install_dir'],
+)
+
+# TODO: implement sepgsql tests
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..49e55026018
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,46 @@
+autoinc = shared_module('autoinc',
+  ['autoinc.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+  ['insert_username.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'insert_username.control',
+  'insert_username--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+moddatetime = shared_module('moddatetime',
+  ['moddatetime.c'],
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'moddatetime.control',
+  'moddatetime--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+  ['refint.c'],
+  c_args: refint_cflags,
+  kwargs: contrib_mod_args,
+)
+
+install_data('refint.control', 'refint--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
new file mode 100644
index 00000000000..80b2c56ede2
--- /dev/null
+++ b/contrib/sslinfo/meson.build
@@ -0,0 +1,20 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+sslinfo = shared_module('sslinfo',
+  files(
+    'sslinfo.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [ssl, contrib_mod_args['dependencies']],
+  }
+)
+
+install_data(
+  'sslinfo--1.0--1.1.sql',
+  'sslinfo--1.1--1.2.sql',
+  'sslinfo--1.2.sql',
+  'sslinfo.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
new file mode 100644
index 00000000000..651f59726a7
--- /dev/null
+++ b/contrib/tablefunc/meson.build
@@ -0,0 +1,24 @@
+tablefunc = shared_module('tablefunc',
+  files(
+    'tablefunc.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tablefunc--1.0.sql',
+  'tablefunc.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'tablefunc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tablefunc',
+    ],
+  },
+}
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
new file mode 100644
index 00000000000..89d6656403d
--- /dev/null
+++ b/contrib/tcn/meson.build
@@ -0,0 +1,23 @@
+tcn = shared_module('tcn',
+  files(
+    'tcn.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tcn--1.0.sql',
+  'tcn.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tcn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'tcn',
+    ],
+  },
+}
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..0719350a0dd
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,62 @@
+test_decoding_sources = files(
+  'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+  test_decoding_sources,
+  kwargs: contrib_mod_args,
+)
+
+tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ddl',
+      'xact',
+      'rewrite',
+      'toast',
+      'permissions',
+      'decoding_in_xact',
+      'decoding_into_rel',
+      'binary',
+      'prepared',
+      'replorigin',
+      'time',
+      'messages',
+      'spill',
+      'slot',
+      'truncate',
+      'stream',
+      'stats',
+      'twophase',
+      'twophase_stream',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'isolation': {
+    'specs': [
+      'mxact',
+      'delayed_startup',
+      'ondisk_startup',
+      'concurrent_ddl_dml',
+      'oldest_xmin',
+      'snapshot_transfer',
+      'subxact_without_top',
+      'concurrent_stream',
+      'twophase_snapshot',
+      'slot_creation_error',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_repl_stats.pl',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..af8903e6db7
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,23 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+  files(
+    'tsm_system_rows.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_rows--1.0.sql',
+  'tsm_system_rows.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_rows',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_rows',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..99e265a2e13
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,23 @@
+tsm_system_time = shared_module('tsm_system_time',
+  files(
+    'tsm_system_time.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'tsm_system_time--1.0.sql',
+  'tsm_system_time.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_time',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_time',
+    ],
+  },
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..a6a03d68784
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,31 @@
+unaccent = shared_module('unaccent',
+  files(
+    'unaccent.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+
+install_data(
+  'unaccent--1.0--1.1.sql',
+  'unaccent--1.1.sql',
+  'unaccent.control',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'unaccent.rules',
+  install_dir: dir_data / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+tests += {
+  'name': 'unaccent',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'unaccent',
+    ],
+    'regress_args': ['--encoding=UTF8'],
+  },
+}
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
new file mode 100644
index 00000000000..abc52797dce
--- /dev/null
+++ b/contrib/uuid-ossp/meson.build
@@ -0,0 +1,32 @@
+if not uuid.found()
+  subdir_done()
+endif
+
+uuid_ossp = shared_module('uuid-ossp',
+  files(
+    'uuid-ossp.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [uuid, contrib_mod_args['dependencies']],
+  },
+
+)
+
+install_data(
+  'uuid-ossp--1.0--1.1.sql',
+  'uuid-ossp--1.1.sql',
+  'uuid-ossp.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'uuid-ossp',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'uuid_ossp',
+    ],
+  },
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..af8faf22e34
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,16 @@
+executable('vacuumlo',
+  ['vacuumlo.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+
+tests += {
+  'name': 'vacuumlo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..dcc7bf5bf69
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,31 @@
+if not libxml.found()
+  subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+  files(
+    'xpath.c',
+    'xslt_proc.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+  },
+)
+
+install_data(
+  'xml2--1.0--1.1.sql',
+  'xml2--1.1.sql',
+  'xml2.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'xml2',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'xml2',
+    ],
+  },
+}
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
new file mode 100644
index 00000000000..e1db85c48d8
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -0,0 +1,21 @@
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_compat = both_libraries('libecpg_compat',
+  'informix.c',
+  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
+  dependencies: [frontend_shlib_code, thread_dep],
+  link_with: [ecpglib, ecpg_pgtypes],
+  soversion: host_system != 'windows' ? '3' : '',
+  darwin_versions: ['3', '3.' + pg_version_major.to_string()],
+  version: '3.' + pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpg_compat.get_shared_lib(),
+  description: 'PostgreSQL libecpg_compat library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
new file mode 100644
index 00000000000..6de0b9ac6f7
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -0,0 +1,36 @@
+ecpglib_sources = files(
+  'connect.c',
+  'data.c',
+  'descriptor.c',
+  'error.c',
+  'execute.c',
+  'memory.c',
+  'misc.c',
+  'prepare.c',
+  'sqlda.c',
+  'typename.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpglib = both_libraries('libecpg',
+  ecpglib_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=6'],
+  dependencies: [frontend_shlib_code, libpq, thread_dep],
+  link_with: [ecpg_pgtypes],
+  soversion: host_system != 'windows' ? '6' : '',
+  darwin_versions: ['6', '6.' + pg_version_major.to_string()],
+  version: '6.' + pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpglib.get_shared_lib(),
+  description: 'PostgreSQL libecpg library',
+  url: pg_url,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build
new file mode 100644
index 00000000000..246e399ebd3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build
new file mode 100644
index 00000000000..c95d0455b9a
--- /dev/null
+++ b/src/interfaces/ecpg/include/meson.build
@@ -0,0 +1,51 @@
+ecpg_inc = include_directories('.')
+
+ecpg_conf_keys = [
+  'ENABLE_THREAD_SAFETY',
+  'HAVE_INT64',
+  'HAVE_LONG_INT_64',
+  'HAVE_LONG_LONG_INT_64',
+  'PG_USE_STDBOOL',
+]
+
+ecpg_conf_data = configuration_data()
+
+foreach key : ecpg_conf_keys
+  if cdata.has(key)
+    ecpg_conf_data.set(key, cdata.get(key))
+  endif
+endforeach
+
+ecpg_config_h = configure_file(
+  output: 'ecpg_config.h',
+  configuration: ecpg_conf_data,
+  install_dir: dir_include,
+)
+configure_files += ecpg_config_h
+
+generated_sources_ac += {'src/interfaces/ecpg/include': ['stamp-h']}
+
+install_headers(
+  'ecpg_informix.h',
+  'ecpgerrno.h',
+  'ecpglib.h',
+  'ecpgtype.h',
+  'pgtypes.h',
+  'pgtypes_date.h',
+  'pgtypes_error.h',
+  'pgtypes_interval.h',
+  'pgtypes_numeric.h',
+  'pgtypes_timestamp.h',
+  'sql3types.h',
+  'sqlca.h',
+  'sqlda.h',
+  'sqlda-compat.h',
+  'sqlda-native.h',
+)
+
+install_headers(
+  'datetime.h',
+  'decimal.h',
+  'sqltypes.h',
+  install_dir: dir_include_pkg / 'informix' / 'esql',
+)
diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build
new file mode 100644
index 00000000000..ffbe84c0e88
--- /dev/null
+++ b/src/interfaces/ecpg/meson.build
@@ -0,0 +1,5 @@
+subdir('include')
+subdir('pgtypeslib')
+subdir('ecpglib')
+subdir('compatlib')
+subdir('preproc')
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
new file mode 100644
index 00000000000..40724420921
--- /dev/null
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -0,0 +1,29 @@
+ecpg_pgtypes_sources = files(
+  'common.c',
+  'datetime.c',
+  'dt_common.c',
+  'interval.c',
+  'numeric.c',
+  'timestamp.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_pgtypes = both_libraries('libpgtypes',
+  ecpg_pgtypes_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
+  dependencies: [frontend_shlib_code],
+  version: '3.' + pg_version_major.to_string(),
+  soversion: host_system != 'windows' ? '3' : '',
+  darwin_versions: ['3', '3.' + pg_version_major.to_string()],
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+  ecpg_pgtypes.get_shared_lib(),
+  description: 'PostgreSQL libpgtypes library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
new file mode 100644
index 00000000000..cb62adace30
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -0,0 +1,104 @@
+ecpg_sources = files(
+  '../ecpglib/typename.c',
+  'c_keywords.c',
+  'descriptor.c',
+  'ecpg.c',
+  'ecpg_keywords.c',
+  'keywords.c',
+  'output.c',
+  'parser.c',
+  'type.c',
+  'variable.c',
+)
+
+pgc = custom_target('pgc.c',
+  input: ['pgc.l'],
+  output: ['pgc.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += pgc
+ecpg_sources += pgc
+
+ecpg_files = [
+  'ecpg.addons',
+  'ecpg.header',
+  'ecpg.tokens',
+  'ecpg.trailer',
+  'ecpg.type',
+]
+
+preproc_y = custom_target('preproc.y',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: ['preproc.y'],
+  command: [
+    perl, files('parse.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--output', '@OUTPUT0@',
+  ],
+)
+generated_sources += preproc_y
+
+check_rules = custom_target('preproc.y.check_rules',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: 'preproc.y.check_rules',
+  command: [
+    perl, files('check_rules.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--stamp', '@OUTPUT0@',
+  ],
+)
+
+preproc = custom_target('preproc.c',
+  input: [preproc_y],
+  output: ['preproc.c', 'preproc.h'],
+  depends: check_rules,
+  command: [bison_cmd, '-d', '@INPUT@'],
+)
+generated_sources += preproc.to_list()
+ecpg_sources += preproc
+
+c_kwlist = custom_target('c_kwlist_d.h',
+  input: ['c_kwlist.h'],
+  output: ['c_kwlist_d.h'],
+  command: [
+    perl,
+    '-I', '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanCKeywords',
+    '--no-case-fold', '@INPUT0@',
+  ],
+)
+generated_sources += c_kwlist
+ecpg_sources += c_kwlist
+
+ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
+  input: ['ecpg_kwlist.h'],
+  output: ['ecpg_kwlist_d.h'],
+  command: [
+    perl, '-I',
+    '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanECPGKeywords', '@INPUT0@',
+  ]
+)
+generated_sources += ecpg_kwlist
+ecpg_sources += ecpg_kwlist
+
+ecpg_exe = executable('ecpg',
+  ecpg_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
+  dependencies: [frontend_shlib_code],
+  kwargs: default_bin_args,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build
new file mode 100644
index 00000000000..d73b05afd5e
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpg-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/test/compat_informix/meson.build b/src/interfaces/ecpg/test/compat_informix/meson.build
new file mode 100644
index 00000000000..6bb0d980761
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_informix/meson.build
@@ -0,0 +1,31 @@
+pgc_files = [
+  'charfuncs',
+  'dec_test',
+  'describe',
+  'rfmtdate',
+  'rfmtlong',
+  'rnull',
+  'sqlda',
+  'test_informix',
+  'test_informix2',
+]
+
+pgc_extra_flags = {
+  'rnull': ['-r', 'no_indicator',],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'INFORMIX',] +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/compat_oracle/meson.build b/src/interfaces/ecpg/test/compat_oracle/meson.build
new file mode 100644
index 00000000000..2e8794ba386
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_oracle/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+  'char_array',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'ORACLE',] +
+      ecpg_preproc_test_command_end,
+    install: false,
+    build_by_default: false,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/connect/meson.build b/src/interfaces/ecpg/test/connect/meson.build
new file mode 100644
index 00000000000..0b1c3593146
--- /dev/null
+++ b/src/interfaces/ecpg/test/connect/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+  'test1',
+  'test2',
+  'test3',
+  'test4',
+  'test5',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start + ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
new file mode 100644
index 00000000000..fd286938723
--- /dev/null
+++ b/src/interfaces/ecpg/test/meson.build
@@ -0,0 +1,77 @@
+pg_regress_ecpg_sources = pg_regress_c + files(
+  'pg_regress_ecpg.c',
+)
+
+pg_regress_ecpg = executable('pg_regress_ecpg',
+  pg_regress_ecpg_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc, include_directories('.')],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+
+# create .c files and executables from .pgc files
+ecpg_test_exec_kw = {
+  'dependencies': [frontend_code, libpq],
+  'include_directories': [ecpg_inc],
+  'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+  'build_by_default': false,
+  'install': false,
+}
+
+ecpg_preproc_kw = {
+  'output': '@BASENAME@.c',
+  'install': false,
+  'build_by_default': false,
+}
+
+ecpg_preproc_test_command_start = [
+  ecpg_exe,
+  '--regression',
+  '-I@CURRENT_SOURCE_DIR@',
+  '-I@SOURCE_ROOT@' + '/src/interfaces/ecpg/include/',
+]
+ecpg_preproc_test_command_end = [
+  '-o', '@OUTPUT@', '@INPUT@'
+]
+
+ecpg_test_dependencies = []
+
+subdir('compat_informix')
+subdir('compat_oracle')
+subdir('connect')
+subdir('pgtypeslib')
+subdir('preproc')
+subdir('sql')
+subdir('thread')
+
+ecpg_test_files = files(
+  'ecpg_schedule',
+)
+
+ecpg_regress_args = [
+  '--dbname=ecpg1_regression,ecpg2_regression',
+  '--create-role=regress_ecpg_user1,regress_ecpg_user2',
+  '--encoding=SQL_ASCII',
+]
+
+tests += {
+  'name': 'ecpg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'test_runner': pg_regress_ecpg,
+    'expecteddir': meson.current_source_dir(),
+    'inputdir': meson.current_build_dir(),
+    'schedule': ecpg_test_files,
+    'sql': [
+      'sql/twophase',
+    ],
+    'test_kwargs': {
+      'depends': meson.is_cross_build() ? [] : ecpg_test_dependencies,
+    },
+    'regress_args': ecpg_regress_args,
+  },
+}
diff --git a/src/interfaces/ecpg/test/pgtypeslib/meson.build b/src/interfaces/ecpg/test/pgtypeslib/meson.build
new file mode 100644
index 00000000000..2957f12abfc
--- /dev/null
+++ b/src/interfaces/ecpg/test/pgtypeslib/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'dt_test',
+  'dt_test2',
+  'num_test',
+  'num_test2',
+  'nan_test',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/preproc/meson.build b/src/interfaces/ecpg/test/preproc/meson.build
new file mode 100644
index 00000000000..0608df2f2a2
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/meson.build
@@ -0,0 +1,37 @@
+pgc_files = [
+  'array_of_struct',
+  'autoprep',
+  'comment',
+  'cursor',
+  'define',
+  'init',
+  'outofscope',
+  'pointer_to_struct',
+  'strings',
+  'type',
+  'variable',
+  'whenever',
+  'whenever_do_continue',
+]
+
+pgc_extra_flags = {
+  'array_of_struct': ['-c'],
+  'pointer_to_struct': ['-c'],
+  'autoprep': ['-r', 'prepare'],
+  'strings': ['-i'],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/sql/meson.build b/src/interfaces/ecpg/test/sql/meson.build
new file mode 100644
index 00000000000..bec7d4ed8f6
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/meson.build
@@ -0,0 +1,46 @@
+pgc_files = [
+  'array',
+  'binary',
+  'bytea',
+  'code100',
+  'copystdout',
+  'createtableas',
+  'declare',
+  'define',
+  'desc',
+  'describe',
+  'dynalloc',
+  'dynalloc2',
+  'dyntest',
+  'execute',
+  'fetch',
+  'func',
+  'indicators',
+  'insupd',
+  'oldexec',
+  'parser',
+  'prepareas',
+  'quote',
+  'show',
+  'sqlda',
+  'twophase',
+]
+
+pgc_extra_flags = {
+  'oldexec': ['-r', 'questionmarks'],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/thread/meson.build b/src/interfaces/ecpg/test/thread/meson.build
new file mode 100644
index 00000000000..2f1629e266b
--- /dev/null
+++ b/src/interfaces/ecpg/test/thread/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'thread_implicit',
+  'thread',
+  'prep',
+  'descriptor',
+  'alloc',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw + {'dependencies': [frontend_code, libpq, thread_dep,]},
+  )
+endforeach
diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build
new file mode 100644
index 00000000000..73fffbee394
--- /dev/null
+++ b/src/interfaces/meson.build
@@ -0,0 +1,2 @@
+# NB: libpq is entered directly from the toplevel meson file
+subdir('ecpg')
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
new file mode 100644
index 00000000000..77fce3e995c
--- /dev/null
+++ b/doc/src/sgml/meson.build
@@ -0,0 +1,262 @@
+docs = []
+alldocs = []
+doc_generated = []
+
+xmllint = find_program('xmllint', native: true, required: false)
+pandoc = find_program('pandoc', native: true, required: false)
+xsltproc = find_program('xsltproc', native: true, required: false)
+fop = find_program('fop', native: true, required: false)
+
+
+version_sgml = configure_file(
+  input: 'version.sgml.in',
+  output: 'version.sgml',
+  configuration: cdata,
+)
+configure_files += version_sgml
+
+doc_generated += custom_target('features-supported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt',
+  ),
+  output: 'features-supported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'YES', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+doc_generated += custom_target('features-unsupported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt',
+  ),
+  output: 'features-unsupported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'NO', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+doc_generated += custom_target('errcodes-table.sgml',
+  input: files(
+    '../../../src/backend/utils/errcodes.txt'),
+  output: 'errcodes-table.sgml',
+  command: [perl, files('generate-errcodes-table.pl'), '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+# FIXME: this actually has further inputs, adding depfile support to
+# generate-keywords-table.pl is probably the best way to address that
+# robustly.
+doc_generated += custom_target('keywords-table.sgml',
+  input: files(
+    '../../../src/include/parser/kwlist.h'),
+  output: 'keywords-table.sgml',
+  command: [perl, files('generate-keywords-table.pl'), '@CURRENT_SOURCE_DIR@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+# For everything else we need at least xmllint
+if not xmllint.found()
+  subdir_done()
+endif
+
+# Compute validity just once
+postgres_sgml_valid = custom_target('postgres.sgml.valid',
+  input: 'postgres.sgml',
+  output: 'postgres.sgml.valid',
+  command: [xmllint, '--noout', '--valid', '--path', '@OUTDIR@', '@INPUT@'],
+  depends: doc_generated,
+  build_by_default: true,
+  capture: true,
+)
+
+#
+# Full documentation as html, text
+#
+if xsltproc.found()
+  xsltproc_flags = [
+    '--stringparam', 'pg.version', pg_version,
+    '--param', 'website.stylesheet', '1'
+  ]
+
+
+  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
+  # depfile
+  html = custom_target('html',
+    input: ['stylesheet.xsl', 'postgres.sgml'],
+    output: 'html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html
+
+  # build multi-page html docs as part of docs target
+  docs += html
+
+  html_help = custom_target('html_help',
+    input: ['stylesheet-hh.xsl', 'postgres.sgml'],
+    output: 'htmlhelp',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html_help
+
+
+  # single-page HTML
+  postgres_html = custom_target('postgres.html',
+    input: ['stylesheet-html-nochunk.xsl', 'postgres.sgml'],
+    output: 'postgres.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_html
+
+  # single-page text
+  if pandoc.found()
+    postgres_txt = custom_target('postgres.txt',
+      input: [postgres_html],
+      output: 'postgres.txt',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+endif
+
+
+#
+# INSTALL in html, text
+#
+if xsltproc.found()
+  install_xml = custom_target('INSTALL.xml',
+    input: ['standalone-profile.xsl', 'standalone-install.xml'],
+    output: 'INSTALL.xml',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+    build_by_default: false,
+  )
+  install_html = custom_target('INSTALL.html',
+    input: ['stylesheet-text.xsl', install_xml],
+    output: 'INSTALL.html',
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += install_html
+
+  if pandoc.found()
+    # XXX: Makefile does an iconv translit here, but unclear why?
+    install = custom_target('INSTALL',
+      input: [install_html],
+      output: 'INSTALL',
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += install
+  endif
+
+endif
+
+
+#
+# Man pages
+#
+if xsltproc.found()
+  # FIXME: implement / consider sqlmansectnum logic
+  man = custom_target('man',
+    input: ['stylesheet-man.xsl', 'postgres.sgml'],
+    output: ['man1', 'man3', 'man7'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+
+  # build by default as part of docs target
+  docs += man
+endif
+
+
+#
+# Full documentation as PDF
+#
+if fop.found() and xsltproc.found()
+  xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
+
+  foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
+    postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+    postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
+
+    postgres_x_fo = custom_target(postgres_x_fo_f,
+      input: ['stylesheet-fo.xsl', 'postgres.sgml'],
+      output: [postgres_x_fo_f],
+      depends: doc_generated + [postgres_sgml_valid],
+      command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
+                '--stringparam', 'paper.type', detail,
+                '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+
+    postgres_x_pdf = custom_target(postgres_x_pdf_f,
+      input: [postgres_x_fo],
+      output: [postgres_x_pdf_f],
+      command: [fop, '-fo', '@INPUT@', '-pdf', '@OUTPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_x_pdf
+  endforeach
+endif
+
+
+#
+# epub
+#
+
+# This was previously implemented using dbtoepub - but that doesn't seem to
+# support running in build != source directory (i.e. VPATH builds already
+# weren't supported).
+if pandoc.found() and xsltproc.found()
+  # XXX: Wasn't able to make pandoc successfully resolve entities
+  # XXX: Perhaps we should just make all targets use this, to avoid repeatedly
+  # building whole thing? It's comparatively fast though.
+  postgres_full_xml = custom_target('postgres-full.xml',
+    input: ['resolv.xsl', 'postgres.sgml'],
+    output: ['postgres-full.xml'],
+    depends: doc_generated + [postgres_sgml_valid],
+    command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_flags,
+              '-o', '@OUTPUT@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+  postgres_epub = custom_target('postgres.epub',
+    input: [postgres_full_xml],
+    output: 'postgres.epub',
+    command: [pandoc, '-f', 'docbook', '-t', 'epub', '-o', '@OUTPUT@', '--resource-path=@CURRENT_SOURCE_DIR@',
+              '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_epub
+endif
+
+if docs.length() == 0
+  run_target('docs', command: [missing, 'xsltproc'])
+else
+  alias_target('docs', docs)
+endif
+
+if alldocs.length() == 0
+  run_target('alldocs', command: [missing, 'xsltproc'])
+else
+  alias_target('alldocs', alldocs)
+endif
diff --git a/doc/src/sgml/resolv.xsl b/doc/src/sgml/resolv.xsl
new file mode 100644
index 00000000000..c69ba714dab
--- /dev/null
+++ b/doc/src/sgml/resolv.xsl
@@ -0,0 +1,7 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/doc/src/sgml/version.sgml.in b/doc/src/sgml/version.sgml.in
new file mode 100644
index 00000000000..fa5ff343f40
--- /dev/null
+++ b/doc/src/sgml/version.sgml.in
@@ -0,0 +1,2 @@
+<!ENTITY version @PG_VERSION@>
+<!ENTITY majorversion @PG_MAJORVERSION@>
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..2374028cbda
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'authentication',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_password.pl',
+      't/002_saslprep.pl',
+    ],
+  },
+}
diff --git a/src/test/icu/meson.build b/src/test/icu/meson.build
new file mode 100644
index 00000000000..5a4f53f37ff
--- /dev/null
+++ b/src/test/icu/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'icu',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_database.pl',
+    ],
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..0aefb5a112c
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,55 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+  'isolation_main.c',
+)
+
+# see src/backend/replication/meson.build for depend logic
+spec_scanner = custom_target('specscanner',
+  input: files('specscanner.l'),
+  output: ['specscanner.c'],
+  command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += spec_scanner
+
+isolationtester_sources = files('isolationtester.c')
+spec_parser = custom_target('specparse',
+  input: 'specparse.y',
+  output: 'specparse.c',
+  depends: spec_scanner,
+  command: [bison_cmd, '@INPUT@'],
+)
+isolationtester_sources += spec_parser
+generated_sources += spec_parser
+
+pg_isolation_regress = executable('pg_isolation_regress',
+  isolation_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+
+isolationtester = executable('isolationtester',
+  isolationtester_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'schedule': files('isolation_schedule'),
+    'test_kwargs': {
+      'priority': 40,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..7e2b6733fcc
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,15 @@
+tests += {
+  'name': 'kerberos',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # kerberos tests are slow, start early
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env': {
+      'with_gssapi': gssapi.found() ? 'yes' : 'no',
+      'with_krb_srvnam': 'postgres',
+    },
+  },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..2211bd5e3ec
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'ldap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env': {'with_ldap': ldap.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..b86a0f3889b
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,23 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+  subdir('ssl')
+endif
+
+if ldap.found()
+  subdir('ldap')
+endif
+
+if gssapi.found()
+  subdir('kerberos')
+endif
+
+if icu.found()
+  subdir('icu')
+endif
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..58254d093a4
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,16 @@
+tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'summarization-and-inprogress-insertion',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/01_workitems.pl',
+      't/02_wal_consistency.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..60cb12164d2
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,18 @@
+tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'commit_timestamp',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+      't/002_standby.pl',
+      't/003_standby_2.pl',
+      't/004_restart.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..3ce0ee2e2f6
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+  ['delay_execution.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'delay_execution',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'partition-addition',
+      'partition-removal-1',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..77a4377dc21
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+  ['dummy_index_am.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_index_am.control',
+  'dummy_index_am--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_index_am',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'reloptions',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..7d320eb7935
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+  ['dummy_seclabel.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'dummy_seclabel.control',
+  'dummy_seclabel--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_seclabel',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dummy_seclabel',
+    ],
+  },
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..fc07f77faf2
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,20 @@
+libpq_pipeline = executable('libpq_pipeline',
+  files(
+    'libpq_pipeline.c',
+  ),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  },
+)
+
+tests += {
+  'name': 'libpq_pipeline',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_libpq_pipeline.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..a80e6e2ce29
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,27 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_lfind')
+subdir('test_misc')
+subdir('test_oat_hooks')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..323427858f0
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+  ['plsample.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'plsample.control',
+  'plsample--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'plsample',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plsample',
+    ],
+  },
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..efd3f1f113b
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,14 @@
+tests += {
+  'name': 'snapshot_too_old',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'test_kwargs': {'priority': 40}, # sto tests are slow, start early
+    'specs': [
+      'sto_using_cursor',
+      'sto_using_select',
+      'sto_using_hash_index',
+    ],
+    'regress_args': ['--temp-config', files('sto.conf')],
+  },
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..676f2a258cb
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+  ['spgist_name_ops.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'spgist_name_ops.control',
+  'spgist_name_ops--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'spgist_name_ops',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'spgist_name_ops',
+    ],
+  },
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..5913c530cd6
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,47 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+  ['ssl_passphrase_func.c'],
+  kwargs: pg_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  },
+)
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+  cert = custom_target('server.crt',
+    output: ['server.crt', 'server.ckey'],
+    command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+      '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+    build_by_default: false,
+    install: false,
+  )
+
+  # needs to agree with what's in the test script
+  pass = 'FooBaR1'
+
+  enccert = custom_target('server.key',
+    input: [cert[1]],
+    output: ['server.key'],
+    command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+  )
+endif
+
+tests += {
+  'name': 'ssl_passphrase_callback',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_testfunc.pl',
+    ],
+    'env': {'with_ssl': 'openssl'},
+  },
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..6861ae38116
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+  ['test_bloomfilter.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_bloomfilter.control',
+  'test_bloomfilter--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_bloomfilter',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_bloomfilter',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..367730e95db
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,42 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+  ['test_ddl_deparse.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ddl_deparse.control',
+  'test_ddl_deparse--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ddl_deparse',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ddl_deparse',
+      'create_extension',
+      'create_schema',
+      'create_type',
+      'create_conversion',
+      'create_domain',
+      'create_sequence_1',
+      'create_table',
+      'create_transform',
+      'alter_table',
+      'create_view',
+      'create_trigger',
+      'create_rule',
+      'comment_on',
+      'alter_function',
+      'alter_sequence',
+      'alter_ts_config',
+      'alter_type_enum',
+      'opfamily',
+      'defprivs',
+      'matviews',
+    ],
+  },
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..e95a9f2e7eb
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,45 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_ext1--1.0.sql',
+  'test_ext1.control',
+  'test_ext2--1.0.sql',
+  'test_ext2.control',
+  'test_ext3--1.0.sql',
+  'test_ext3.control',
+  'test_ext4--1.0.sql',
+  'test_ext4.control',
+  'test_ext5--1.0.sql',
+  'test_ext5.control',
+  'test_ext6--1.0.sql',
+  'test_ext6.control',
+  'test_ext7--1.0--2.0.sql',
+  'test_ext7--1.0.sql',
+  'test_ext7.control',
+  'test_ext8--1.0.sql',
+  'test_ext8.control',
+  'test_ext_cine--1.0.sql',
+  'test_ext_cine--1.0--1.1.sql',
+  'test_ext_cine.control',
+  'test_ext_cor--1.0.sql',
+  'test_ext_cor.control',
+  'test_ext_cyclic1--1.0.sql',
+  'test_ext_cyclic1.control',
+  'test_ext_cyclic2--1.0.sql',
+  'test_ext_cyclic2.control',
+  'test_ext_evttrig--1.0--2.0.sql',
+  'test_ext_evttrig--1.0.sql',
+  'test_ext_evttrig.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_extensions',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_extensions',
+      'test_extdepend',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..193c28a3da9
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+  ['test_ginpostinglist.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_ginpostinglist.control',
+  'test_ginpostinglist--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ginpostinglist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ginpostinglist',
+    ],
+  },
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..b599dfc09e2
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+  ['test_integerset.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_integerset.control',
+  'test_integerset--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_integerset',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_integerset',
+    ],
+  },
+}
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
new file mode 100644
index 00000000000..9ccedc0aae3
--- /dev/null
+++ b/src/test/modules/test_lfind/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_lfind = shared_module('test_lfind',
+  ['test_lfind.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_lfind.control',
+  'test_lfind--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_lfind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_lfind',
+    ],
+  },
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..cfc830ff399
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,12 @@
+tests += {
+  'name': 'test_misc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_constraint_validation.pl',
+      't/002_tablespace.pl',
+      't/003_check_guc.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
new file mode 100644
index 00000000000..9b20e7c56d4
--- /dev/null
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+test_oat_hooks = shared_module('test_oat_hooks',
+  ['test_oat_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'test_oat_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_oat_hooks',
+    ],
+    'regress_args': ['--no-locale', '--encoding=UTF8'],
+  },
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..35ee6ce324b
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+  ['test_parser.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_parser.control',
+  'test_parser--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_parser',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_parser',
+    ],
+  },
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..41021829f3a
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_pg_dump.control',
+  'test_pg_dump--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_pg_dump',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..001c2d848bb
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+  ['test_predtest.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_predtest.control',
+  'test_predtest--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_predtest',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_predtest',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..963a6220a2a
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+  ['test_rbtree.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_rbtree.control',
+  'test_rbtree--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_rbtree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rbtree',
+    ],
+  },
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..61217dd2ca4
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+  ['test_regex.c'],
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_regex.control',
+  'test_regex--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_regex',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_regex',
+      'test_regex_utf8',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..3f49b8ff540
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,16 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+  ['test_rls_hooks.c'],
+  kwargs: pg_mod_args,
+)
+
+tests += {
+  'name': 'test_rls_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rls_hooks',
+    ],
+  },
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..9a0f83917a5
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,26 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+  files(
+    'setup.c',
+    'test.c',
+    'worker.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'test_shm_mq.control',
+  'test_shm_mq--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_shm_mq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_shm_mq',
+    ],
+  },
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..d69b0e7ce44
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'unsafe_tests',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'rolenames',
+      'alter_system_table',
+    ],
+  },
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..b729c354827
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,25 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+  files(
+    'worker_spi.c',
+  ),
+  kwargs: pg_mod_args,
+)
+
+install_data(
+  'worker_spi.control',
+  'worker_spi--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'worker_spi',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'worker_spi',
+    ],
+    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+  },
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..b0e398363f7
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,43 @@
+tests += {
+  'name': 'recovery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # recovery tests are slow, start early
+    'tests': [
+      't/001_stream_rep.pl',
+      't/002_archiving.pl',
+      't/003_recovery_targets.pl',
+      't/004_timeline_switch.pl',
+      't/005_replay_delay.pl',
+      't/006_logical_decoding.pl',
+      't/007_sync_rep.pl',
+      't/008_fsm_truncation.pl',
+      't/009_twophase.pl',
+      't/010_logical_decoding_timelines.pl',
+      't/011_crash_recovery.pl',
+      't/012_subtransactions.pl',
+      't/013_crash_restart.pl',
+      't/014_unlogged_reinit.pl',
+      't/015_promotion_pages.pl',
+      't/016_min_consistency.pl',
+      't/017_shm.pl',
+      't/018_wal_optimize.pl',
+      't/019_replslot_limit.pl',
+      't/020_archive_status.pl',
+      't/021_row_visibility.pl',
+      't/022_crash_temp_files.pl',
+      't/023_pitr_prepared_xact.pl',
+      't/024_archive_recovery.pl',
+      't/025_stuck_on_old_timeline.pl',
+      't/026_overwrite_contrecord.pl',
+      't/027_stream_regress.pl',
+      't/028_pitr_timelines.pl',
+      't/029_stats_restart.pl',
+      't/030_stats_cleanup_replica.pl',
+      't/031_recovery_conflict.pl',
+      't/032_relfilenode_reuse.pl',
+      't/033_replay_tsp_drops.pl',
+    ],
+  },
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..db139c0a820
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,58 @@
+# also used by isolationtester and ecpg tests
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+  'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+  regress_sources,
+  c_args: pg_regress_cflags,
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/regress',
+  },
+)
+
+regress_module = shared_module('regress',
+  ['regress.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+shared_module('autoinc',
+  ['../../../contrib/spi/autoinc.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+shared_module('refint',
+  ['../../../contrib/spi/refint.c'],
+  c_args: refint_cflags,
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'schedule': files('parallel_schedule'),
+    'test_kwargs': {
+      'priority': 50,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..e2f021d884a
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,13 @@
+tests += {
+  'name': 'ssl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_ssl': get_option('ssl')},
+    'tests': [
+      't/001_ssltests.pl',
+      't/002_scram.pl',
+      't/003_sslinfo.pl',
+    ],
+  },
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..85d1dd92951
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,42 @@
+tests += {
+  'name': 'subscription',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_rep_changes.pl',
+      't/002_types.pl',
+      't/003_constraints.pl',
+      't/004_sync.pl',
+      't/005_encoding.pl',
+      't/006_rewrite.pl',
+      't/007_ddl.pl',
+      't/008_diff_schema.pl',
+      't/009_matviews.pl',
+      't/010_truncate.pl',
+      't/011_generated.pl',
+      't/012_collation.pl',
+      't/013_partition.pl',
+      't/014_binary.pl',
+      't/015_stream.pl',
+      't/016_stream_subxact.pl',
+      't/017_stream_ddl.pl',
+      't/018_stream_subxact_abort.pl',
+      't/019_stream_subxact_ddl_abort.pl',
+      't/020_messages.pl',
+      't/021_twophase.pl',
+      't/022_twophase_cascade.pl',
+      't/023_twophase_stream.pl',
+      't/024_add_drop_pub.pl',
+      't/025_rep_changes_for_schema.pl',
+      't/026_stats.pl',
+      't/027_nosuperuser.pl',
+      't/028_row_filter.pl',
+      't/029_on_error.pl',
+      't/030_origin.pl',
+      't/031_column_list.pl',
+      't/100_bugs.pl',
+    ],
+  },
+}
diff --git a/configure b/configure
index a268780c5db..d7130819fbe 100755
--- a/configure
+++ b/configure
@@ -20733,3 +20733,9 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/configure.ac b/configure.ac
index 993b5d5cb0a..30a7f238e7c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2452,3 +2452,9 @@ AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
                   [echo >src/interfaces/ecpg/include/stamp-h])
 
 AC_OUTPUT
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/conversion_helpers.txt b/conversion_helpers.txt
new file mode 100644
index 00000000000..7d963b19b3d
--- /dev/null
+++ b/conversion_helpers.txt
@@ -0,0 +1,16 @@
+convert list of files to quoted-one-per-line:
+
+	?\b\(\(?:\w\|\d\|_\|-\)+\)\.o ?\(?:\\
+\)? →   '\1.c',
+
+
+# prep
+m test --list > /tmp/tests.txt
+
+# check if all tap tests are known to meson
+for f in $(git ls-files|grep -E '(t|test)/.*.pl$'|sort);do t=$(echo $f|sed -E -e 's/^.*\/([^/]*)\/(t|test)\/(.*)\.pl$/\1\/\3/');grep -q -L $t /tmp/tests.txt || echo $f;done
+
+
+# expected to find plpgsql due to extra 'src' directory level, src/test/mb
+# because it's not run anywhere and sepgsql, because that's not tested yet
+for d in $(find ~/src/postgresql -type d -name sql);do t=$(basename $(dirname $d)); grep -q -L $t /tmp/tests.txt || echo $d; done
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..f1ecf685f14
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,3009 @@
+project('postgresql',
+  ['c'],
+  version: '16devel',
+  license: 'PostgreSQL',
+
+  # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for
+  # RHEL 7 has 0.55. < 0.54 would require replacing some uses of the fs
+  # module, < 0.53 all uses of fs. So far there's no need to go to >=0.56.
+  meson_version: '>=0.54',
+  default_options: [
+    'warning_level=2',
+    'buildtype=release',
+  ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+fs = import('fs')
+pkgconfig = import('pkgconfig')
+
+host_system = host_machine.system()
+host_cpu = host_machine.cpu_family()
+
+cc = meson.get_compiler('c')
+
+not_found_dep = dependency('', required: false)
+thread_dep = dependency('threads')
+
+
+
+###############################################################
+# Safety first
+###############################################################
+
+# It's very easy to get into confusing states when the source directory
+# contains an in-place build. E.g. the wrong pg_config.h will be used. So just
+# refuse to build in that case.
+#
+# There's a more elaborate check later, that checks for conflicts around all
+# generated files. But we can only do that much further down the line, so this
+# quick check seems worth it. Adhering to this advice should clean up the
+# conflict, but won't protect against somebody doing make distclean or just
+# removing pg_config.h
+errmsg_nonclean_base = '''
+****
+Non-clean source code directory detected.
+
+To build with meson the source tree may not have an in-place, ./configure
+style, build configured. You can have both meson and ./configure style builds
+for the same source tree by building out-of-source / VPATH with
+configure. Alternatively use a separate check out for meson based builds.
+
+@0@
+****'''
+if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h')
+  errmsg_cleanup = 'To clean up, run make maintainer-clean in the source tree.'
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Variables to be determined
+###############################################################
+
+cdata = configuration_data()
+
+postgres_inc_d = ['src/include']
+postgres_inc_d += get_option('extra_include_dirs')
+
+postgres_lib_d = get_option('extra_lib_dirs')
+
+cppflags = []
+
+cflags = []
+cxxflags = []
+cflags_warn = []
+cxxflags_warn = []
+cflags_mod = []
+cxxflags_mod = []
+
+ldflags = []
+ldflags_be = []
+ldflags_sl = []
+ldflags_mod = []
+
+test_c_args = []
+
+os_deps = []
+backend_both_deps = []
+backend_deps = []
+libpq_deps = []
+
+pg_sysroot = ''
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+  pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+  pg_version_arr = [pg_version.split('beta')[0], '0']
+elif pg_version.contains('rc')
+  pg_version_arr = [pg_version.split('rc')[0], '0']
+else
+  pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+pg_version_num = (pg_version_major * 10000) + pg_version_minor
+
+pg_url = 'https://www.postgresql.org/'
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', pg_url)
+cdata.set_quoted('PACKAGE_VERSION', pg_version)
+cdata.set_quoted('PACKAGE_STRING', 'PostgreSQL @0@'.format(pg_version))
+cdata.set_quoted('PACKAGE_TARNAME', 'postgresql')
+
+pg_version += get_option('extra_version')
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+  pg_version, build_machine.cpu_family(), cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
+cdata.set('PG_VERSION_NUM', pg_version_num)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Basic platform specific configuration
+###############################################################
+
+# meson's system names don't quite map to our "traditional" names. In some
+# places we need the "traditional" name, e.g., for mapping
+# src/include/port/$os.h to src/include/pg_config_os.h. Define portname for
+# that purpose.
+portname = host_system
+
+exesuffix = '' # overridden below where necessary
+dlsuffix = '.so' # overridden below where necessary
+library_path_var = 'LD_LIBRARY_PATH'
+
+export_file_format = 'gnu'
+export_file_suffix = 'list'
+export_fmt = '-Wl,--version-script=@0@'
+# flags to add when linking a postgres extension, @0@ is path to
+# the relevant object on the platform
+mod_link_args_fmt = []
+
+memset_loop_limit = 1024
+
+# We implement support for some operating systems by pretending they're
+# another. Map here, before determining system properties below
+if host_system == 'dragonfly'
+  # apparently the most similar
+  host_system = 'netbsd'
+endif
+
+if host_system == 'aix'
+  ld_library_path_var = 'LIBPATH'
+
+  export_file_format = 'aix'
+  export_fmt = '-Wl,-bE:@0@'
+  mod_link_args_fmt = ['-Wl,-bI:@0@']
+  mod_link_with_dir = 'libdir'
+  mod_link_with_name = '@0@.imp'
+
+  # M:SRE sets a flag indicating that an object is a shared library. Seems to
+  # work in some circumstances without, but required in others.
+  ldflags_sl += '-Wl,-bM:SRE'
+  ldflags_be += '-Wl,-brtllib'
+
+  # Native memset() is faster, tested on:
+  # - AIX 5.1 and 5.2, XLC 6.0 (IBM's cc)
+  # - AIX 5.3 ML3, gcc 4.0.1
+  memset_loop_limit = 0
+
+elif host_system == 'darwin'
+  dlsuffix = '.dylib'
+  ld_library_path_var = 'DYLD_LIBRARY_PATH'
+
+  export_file_format = 'darwin'
+  export_fmt = '-exported_symbols_list=@0@'
+
+  mod_link_args_fmt = ['-bundle_loader', '@0@']
+  mod_link_with_dir = 'bindir'
+  mod_link_with_name = '@0@'
+
+  sysroot_args = [files('src/tools/darwin_sysroot'), get_option('darwin_sysroot')]
+  pg_sysroot = run_command(sysroot_args, check:true).stdout().strip()
+  message('darwin sysroot: @0@'.format(pg_sysroot))
+  cflags += ['-isysroot', pg_sysroot]
+  ldflags += ['-isysroot', pg_sysroot]
+
+elif host_system == 'windows'
+  portname = 'win32'
+  exesuffix = '.exe'
+  dlsuffix = '.dll'
+  ld_library_path_var = ''
+
+  export_file_format = 'win'
+  export_file_suffix = 'def'
+  if cc.get_id() == 'msvc'
+    export_fmt = '/DEF:@0@'
+    mod_link_with_name = '@0@.exe.lib'
+  else
+    export_fmt = '@0@'
+    mod_link_with_name = 'lib@0@.exe.a'
+  endif
+  mod_link_args_fmt = ['@0@']
+  mod_link_with_dir = 'libdir'
+
+  cdata.set('WIN32_STACK_RLIMIT', 4194304)
+  if cc.get_id() == 'msvc'
+    # From MSBuildProject.pm:
+    # XXX used wrong value for a while, without problem
+    # RandomizedBaseAddress=false -> /dynamicbase:false
+    ldflags += '/DYNAMICBASE:NO'
+    ldflags += '/INCREMENTAL:NO'
+    ldflags += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+    # ldflags += '/fixed:no' # Used to have that just in meson, not sure why
+    # ldflags += '/nxcompat' # generated by msbuild, should have it for ninja?
+  else
+    ldflags += '-Wl,--stack,@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  endif
+
+  os_deps += cc.find_library('ws2_32', required: true)
+  secur32_dep = cc.find_library('secur32', required: true)
+  backend_deps += secur32_dep
+  libpq_deps += secur32_dep
+
+  postgres_inc_d += 'src/include/port/win32'
+  if cc.get_id() == 'msvc'
+    postgres_inc_d += 'src/include/port/win32_msvc'
+  endif
+
+  windows = import('windows')
+
+elif host_system == 'sunos'
+  portname = 'solaris'
+  export_fmt = '-Wl,-M@0@'
+  cppflags += '-D_POSIX_PTHREAD_SEMANTICS'
+
+elif host_system == 'linux'
+  cppflags += '-D_GNU_SOURCE'
+
+elif host_system == 'cygwin'
+  cppflags += '-D_GNU_SOURCE'
+
+elif host_system in ['freebsd', 'netbsd', 'openbsd']
+  # you're ok
+else
+  # XXX: Should we add an option to override the host_system as an escape
+  # hatch?
+  error('unknown host system: @0@'.format(host_system))
+endif
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true, native: true)
+python = find_program(get_option('PYTHON'), required: true, native: true)
+flex = find_program(get_option('FLEX'), native: true)
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'), native: true)
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
+touch = find_program('touch', native: true)
+program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
+dtrace = find_program(get_option('DTRACE'), native: true, required: get_option('dtrace'))
+missing = find_program('config/missing', native: true)
+
+# Internal programs
+testwrap = find_program('src/tools/testwrap', native: true)
+
+# used by PGXS
+install_sh = find_program('config/install-sh', native: true)
+
+bison_flags = []
+if bison.found()
+  bison_version_c = run_command(bison, '--version', check: true)
+  # bison version string helpfully is something like
+  # >>bison (GNU bison) 3.8.1<<
+  bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+  if bison_version.version_compare('>=3.0')
+    bison_flags += ['-Wno-deprecated']
+  endif
+endif
+bison_cmd = [bison, bison_flags, '-o', '@OUTPUT0@']
+
+flex_flags = []
+flex_wrapper = files('src/tools/pgflex')
+flex_cmd = [python, flex_wrapper, '--builddir', meson.build_root(),
+ '--privatedir', '@PRIVATE_DIR@', '--flex', flex, '-o', '@OUTPUT0@']
+
+flex_backup = ['-b']
+flex_fix_warning_script = files('src/tools/fix-old-flex-code.pl')
+flex_fix_warning = ['--perl', perl, '--fix_warning_script', flex_fix_warning_script]
+
+wget = find_program('wget', required: false, native: true)
+wget_flags = ['-O', '@OUTPUT0@', '--no-use-server-timestamps']
+
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# NB: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(python, 'src/tools/find_meson', check: true)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+  error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+    meson_binpath_r.returncode(),
+    meson_binpath_r.stdout(),
+    meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+  error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_impl = ''
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+  if i == 0
+    meson_impl = e
+  elif i == 1
+    meson_binpath = e
+  else
+    meson_args += e
+  endif
+  i += 1
+endforeach
+
+if meson_impl not in ['muon', 'meson']
+  error('unknown meson implementation "@0@"'.format(meson_impl))
+endif
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
+
+cdata.set('BLCKSZ', get_option('blocksize').to_int() * 1024, description:
+'''Size of a disk block --- this also limits the size of a tuple. You can set
+   it bigger if you need bigger tuples (although TOAST should reduce the need
+   to have large tuples, since fields can be spread across multiple tuples).
+   BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is
+   currently 2^15 (32768). This is determined by the 15-bit widths of the
+   lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).
+   Changing BLCKSZ requires an initdb.''')
+
+cdata.set('XLOG_BLCKSZ', get_option('wal_blocksize') * 1024)
+cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
+cdata.set('DEF_PGPORT', get_option('pgport'))
+cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
+cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb_srvnam'))
+if get_option('system_tzdata') != ''
+  cdata.set_quoted('SYSTEMTZDIR', get_option('system_tzdata'))
+endif
+
+
+
+###############################################################
+# Search paths, preparation for compiler tests
+#
+# NB: Arguments added globally (via the below) are not taken into account for
+# configuration-time checks (so they are more isolated). Flags that have to be
+# taken into account for configure checks have to be explicitly specified in
+# configure tests.
+###############################################################
+
+postgres_inc = include_directories(postgres_inc_d)
+test_lib_d = postgres_lib_d
+test_c_args = cppflags + cflags
+
+
+
+###############################################################
+# Directories
+###############################################################
+
+# These are set by the equivalent --xxxdir configure options.  We
+# append "postgresql" to some of them, if the string does not already
+# contain "pgsql" or "postgres", in order to avoid directory clutter.
+
+pkg = 'postgresql'
+
+dir_prefix = get_option('prefix')
+
+dir_bin = get_option('bindir')
+
+dir_data = get_option('datadir')
+if not (dir_data.contains('pgsql') or dir_data.contains('postgres'))
+  dir_data = dir_data / pkg
+endif
+
+dir_sysconf = get_option('sysconfdir')
+if not (dir_sysconf.contains('pgsql') or dir_sysconf.contains('postgres'))
+  dir_sysconf = dir_sysconf / pkg
+endif
+
+dir_lib = get_option('libdir')
+
+dir_lib_pkg = dir_lib
+if not (dir_lib_pkg.contains('pgsql') or dir_lib_pkg.contains('postgres'))
+  dir_lib_pkg = dir_lib_pkg / pkg
+endif
+
+dir_pgxs = dir_lib_pkg / 'pgxs'
+
+dir_include = get_option('includedir')
+
+dir_include_pkg = dir_include
+dir_include_pkg_rel = ''
+if not (dir_include_pkg.contains('pgsql') or dir_include_pkg.contains('postgres'))
+  dir_include_pkg = dir_include_pkg / pkg
+  dir_include_pkg_rel = pkg
+endif
+
+dir_man = get_option('mandir')
+
+# FIXME: These used to be separately configurable - worth adding?
+dir_doc = get_option('datadir') / 'doc' / 'postgresql'
+dir_doc_html = dir_doc
+
+dir_locale = get_option('localedir')
+
+
+# Derived values
+dir_bitcode = dir_lib_pkg / 'bitcode'
+dir_include_internal = dir_include_pkg / 'internal'
+dir_include_server = dir_include_pkg / 'server'
+dir_include_extension = dir_include_server / 'extension'
+dir_data_extension = dir_data / 'extension'
+
+
+
+###############################################################
+# Library: bsd-auth
+###############################################################
+
+bsd_authopt = get_option('bsd_auth')
+bsd_auth = not_found_dep
+if cc.check_header('bsd_auth.h', required: bsd_authopt,
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('USE_BSD_AUTH', 1)
+  bsd_auth = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: bonjour
+#
+# For now don't search for DNSServiceRegister in a library - only Apple's
+# Bonjour implementation, which is always linked, works.
+###############################################################
+
+bonjouropt = get_option('bonjour')
+bonjour = dependency('', required : false)
+if cc.check_header('dns_sd.h', required: bonjouropt,
+    args: test_c_args, include_directories: postgres_inc) and \
+   cc.has_function('DNSServiceRegister',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('USE_BONJOUR', 1)
+  bonjour = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+krb_srvtab = ''
+have_gssapi = false
+if not gssapiopt.disabled()
+  gssapi = dependency('krb5-gssapi', required: gssapiopt)
+  have_gssapi = gssapi.found()
+
+  if not have_gssapi
+  elif cc.check_header('gssapi/gssapi.h', dependencies: gssapi, required: false,
+      args: test_c_args, include_directories: postgres_inc)
+    cdata.set('HAVE_GSSAPI_GSSAPI_H', 1)
+  elif cc.check_header('gssapi.h', args: test_c_args, dependencies: gssapi, required: gssapiopt)
+    cdata.set('HAVE_GSSAPI_H', 1)
+  else
+    have_gssapi = false
+  endif
+
+  if not have_gssapi
+  elif cc.has_function('gss_init_sec_context', dependencies: gssapi,
+      args: test_c_args, include_directories: postgres_inc)
+    cdata.set('ENABLE_GSS', 1)
+
+    krb_srvtab = 'FILE:/@0@/krb5.keytab)'.format(get_option('sysconfdir'))
+    cdata.set_quoted('PG_KRB_SRVTAB', krb_srvtab)
+  elif gssapiopt.enabled()
+    error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+  else
+    have_gssapi = false
+  endif
+endif
+if not have_gssapi
+  gssapi = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if not ldapopt.disabled()
+
+  if host_system == 'windows'
+    ldap = cc.find_library('wldap32')
+    ldap_r = ldap
+  else
+    # macos framework dependency is buggy for ldap (one can argue
+    # whether it's Apple's or meson's fault), leading to an endless
+    # recursion with ldap.h including itself. See
+    # https://github.com/mesonbuild/meson/issues/10002
+    # Luckily we only need pkg-config support, so the workaround isn't
+    # too complicated
+    ldap = dependency('ldap', method: 'pkg-config', required: false)
+
+    # Before 2.5 openldap didn't have a pkg-config file..
+    if ldap.found()
+      ldap_r = ldap
+    else
+      ldap = cc.find_library('ldap', required: ldapopt, dirs: test_lib_d)
+      ldap_r = cc.find_library('ldap_r', required: ldapopt, dirs: test_lib_d)
+
+      # Use ldap_r for FE if available, else assume ldap is thread-safe.
+      # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+      if ldap.found() and not ldap_r.found()
+        ldap_r = ldap
+      endif
+    endif
+
+    if ldap.found() and cc.has_function('ldap_initialize',
+        dependencies: [ldap, thread_dep],
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_LDAP_INITIALIZE', 1)
+    endif
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if ldap.found() and ldap.type_name() == 'library'
+      # declare dependency so that the additional include dir it might reside in
+      # is added automatically where necessary
+      ldap = declare_dependency(dependencies: ldap,
+        include_directories: postgres_inc)
+      ldap_r = declare_dependency(dependencies: ldap_r,
+        include_directories: postgres_inc)
+    endif
+  endif
+
+  # FIXME: port autoconf openldap 2.5+ changes, as well as PGAC_LDAP_SAFE
+
+  if ldap.found()
+    cdata.set('USE_LDAP', 1)
+  endif
+
+else
+  ldap = not_found_dep
+  ldap_r = ldap
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+  add_languages('cpp', required: true, native: false)
+  llvm = dependency('llvm', version: '>=3.9', method: 'config-tool', required: llvmopt)
+
+  if llvm.found()
+
+    cdata.set('USE_LLVM', 1)
+
+    cpp = meson.get_compiler('cpp')
+
+    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+    ccache = find_program('ccache', native: true, required: false)
+    clang = find_program(llvm_binpath / 'clang', required: true)
+  endif
+else
+  llvm = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+icuopt = get_option('icu')
+if not icuopt.disabled()
+  icu = dependency('icu-uc', required: icuopt.enabled())
+  icu_i18n = dependency('icu-i18n', required: icuopt.enabled())
+
+  if icu.found()
+    cdata.set('USE_ICU', 1)
+  endif
+
+else
+  icu = not_found_dep
+  icu_i18n = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+  libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+  if libxml.found()
+    cdata.set('USE_LIBXML', 1)
+  endif
+else
+  libxml = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+  libxslt = dependency('libxslt', required: libxsltopt)
+
+  if libxslt.found()
+    cdata.set('USE_LIBXSLT', 1)
+  endif
+else
+  libxslt = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+  lz4 = dependency('liblz4', required: lz4opt)
+
+  if lz4.found()
+    cdata.set('USE_LZ4', 1)
+    cdata.set('HAVE_LIBLZ4', 1)
+  endif
+
+else
+  lz4 = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Tcl (for pltcl)
+# tclConfig.sh
+#
+# NB: tclConfig.sh is used in autoconf build for getting
+# TCL_SHARED_BUILD, TCL_INCLUDE_SPEC, TCL_LIBS and TCL_LIB_SPEC
+# variables. For now we have not seen a need to copy
+# that behaviour to the meson build.
+###############################################################
+
+tclopt = get_option('pltcl')
+tcl_version = get_option('tcl_version')
+tcl_dep = not_found_dep
+if not tclopt.disabled()
+
+  # via pkg-config
+  tcl_dep = dependency(tcl_version, required: false)
+
+  if not tcl_dep.found()
+    tcl_dep = cc.find_library(tcl_version,
+      required: tclopt,
+      dirs: test_lib_d)
+  endif
+
+  if not cc.has_header('tcl.h', dependencies: tcl_dep, required: tclopt)
+    tcl_dep = not_found_dep
+  endif
+endif
+
+
+
+###############################################################
+# Library: pam
+###############################################################
+
+pamopt = get_option('pam')
+if not pamopt.disabled()
+  pam = dependency('pam', required: false)
+
+  if not pam.found()
+    pam = cc.find_library('pam', required: pamopt, dirs: test_lib_d)
+  endif
+
+  if pam.found()
+    pam_header_found = false
+
+    # header file <security/pam_appl.h> or <pam/pam_appl.h> is required for PAM.
+    if cc.check_header('security/pam_appl.h', dependencies: pam, required: false,
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_SECURITY_PAM_APPL_H', 1)
+      pam_header_found = true
+    elif cc.check_header('pam/pam_appl.h', dependencies: pam, required: pamopt,
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_PAM_PAM_APPL_H', 1)
+      pam_header_found = true
+    endif
+
+    if pam_header_found
+      cdata.set('USE_PAM', 1)
+    else
+      pam = not_found_dep
+    endif
+  endif
+else
+  pam = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('plperl')
+perl_dep = not_found_dep
+if perlopt.disabled()
+  perl_may_work = false
+else
+  perl_may_work = true
+
+  # First verify that perl has the necessary dependencies installed
+  perl_mods = run_command(
+    [perl,
+     '-MConfig', '-MOpcode', '-MExtUtils::Embed', '-MExtUtils::ParseXS',
+     '-e', ''],
+    check: false)
+  if perl_mods.returncode() != 0
+    perl_may_work = false
+    perl_msg = 'perl installation does not have the required modules'
+  endif
+
+  # Then inquire perl about its configuration
+  if perl_may_work
+    # FIXME: include copy-edited comments from perl.m4
+    perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+    perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+    archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+    privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+    useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+    libperl = run_command(perl_conf_cmd, 'libperl', check: true).stdout()
+
+    perl_inc_dir = '@0@/CORE'.format(archlibexp)
+
+    if useshrplib != 'true'
+      perl_may_work = false
+      perl_msg = 'need a shared perl'
+    endif
+  endif
+
+  # XXX: should we only add directories that exist? Seems a bit annoying with
+  # macos' sysroot stuff...
+  #
+  # NB: For unknown reasons msys' python doesn't see these paths, despite gcc
+  # et al seeing them. So we can't use include_directories(), as that checks
+  # file existence.
+  if perl_may_work
+    # On most platforms, archlibexp is also where the Perl include files live ...
+    perl_ccflags = ['-I@0@'.format(perl_inc_dir)]
+    # ... but on newer macOS versions, we must use -iwithsysroot to look
+    # under sysroot
+    if not fs.is_file('@0@/perl.h'.format(perl_inc_dir)) and \
+       fs.is_file('@0@@1@/perl.h'.format(pg_sysroot, perl_inc_dir))
+      perl_ccflags = ['-iwithsysroot', perl_inc_dir]
+    endif
+
+    # check required headers are present
+    if not cc.has_header('perl.h', required: false,
+        args: test_c_args + perl_ccflags, include_directories: postgres_inc)
+      perl_may_work = false
+      perl_msg = 'missing perl.h'
+    endif
+  endif
+
+  if perl_may_work
+    perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+    message('CCFLAGS recommended by Perl: @0@'.format(perl_ccflags_r))
+
+    # See comments for PGAC_CHECK_PERL_EMBED_CCFLAGS in perl.m4
+    foreach flag : perl_ccflags_r.split(' ')
+      if flag.startswith('-D') and \
+        (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+        perl_ccflags += flag
+      endif
+    endforeach
+
+    if host_system == 'windows'
+      perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+    endif
+
+    message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+    # We are after Embed's ldopts, but without the subset mentioned in
+    # Config's ccdlflags and ldflags.  (Those are the choices of those who
+    # built the Perl installation, which are not necessarily appropriate
+    # for building PostgreSQL.)
+    ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+    undesired = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().split()
+    undesired += run_command(perl_conf_cmd, 'ldflags', check: true).stdout().split()
+
+    perl_ldopts = []
+    foreach ldopt : ldopts.split(' ')
+      if ldopt == '' or ldopt in undesired
+        continue
+      endif
+
+      perl_ldopts += ldopt.strip('"')
+    endforeach
+
+    # FIXME: check if windows handling is necessary
+
+    message('LDFLAGS for embedding perl: "@0@" (ldopts: "@1@")'.format(
+      ' '.join(perl_ldopts), ldopts))
+
+    perl_dep_int = declare_dependency(
+      compile_args: perl_ccflags,
+      link_args: perl_ldopts,
+      version: perlversion,
+    )
+
+    # While we're at it, check that we can link to libperl.
+    # On most platforms, if perl.h is there then libperl.so will be too, but at
+    # this writing Debian packages them separately.
+    # This doesn't work on old meson versions, but that's ok, it's just nicer
+    # to test here.
+    perl_link_test = '''
+/* see plperl.h */
+#ifdef _MSC_VER
+#define __inline__ inline
+#endif
+#include <EXTERN.h>
+#include <perl.h>
+int main(void)
+{
+perl_alloc();
+}'''
+    if meson.version().version_compare('>=0.57') and not \
+        cc.links(perl_link_test, name: 'libperl',
+          args: test_c_args + perl_ccflags + perl_ldopts,
+          include_directories: postgres_inc)
+      perl_may_work = false
+      perl_msg = 'missing libperl'
+    endif
+
+  endif # perl_may_work
+
+  if perl_may_work
+    perl_dep = perl_dep_int
+  else
+    if perlopt.enabled()
+      error('dependency plperl failed: @0@'.format(perl_msg))
+    else
+      message('disabling optional dependency plperl: @0@'.format(perl_msg))
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('plpython')
+if not pyopt.disabled()
+  pm = import('python')
+  python3_inst = pm.find_installation(required: pyopt.enabled())
+  python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled())
+  if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt.enabled())
+    python3_dep = not_found_dep
+  endif
+else
+  python3_dep = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Readline
+###############################################################
+
+if not get_option('readline').disabled()
+  libedit_preferred = get_option('libedit_preferred')
+  # Set the order of readline dependencies
+  check_readline_deps = libedit_preferred ? \
+    ['libedit', 'readline'] : ['readline', 'libedit']
+
+  foreach readline_dep : check_readline_deps
+    readline = dependency(readline_dep, required: false)
+    if not readline.found()
+      readline = cc.find_library(readline_dep,
+        required: get_option('readline').enabled(),
+        dirs: test_lib_d)
+    endif
+    if readline.found()
+      break
+    endif
+  endforeach
+
+  if readline.found()
+    cdata.set('HAVE_LIBREADLINE', 1)
+
+    editline_prefix = {
+      'header_prefix': 'editline/',
+      'flag_prefix': 'EDITLINE_',
+    }
+    readline_prefix = {
+      'header_prefix': 'readline/',
+      'flag_prefix': 'READLINE_',
+    }
+    default_prefix = {
+      'header_prefix': '',
+      'flag_prefix': '',
+    }
+
+    # Set the order of prefixes
+    prefixes = libedit_preferred ? \
+      [editline_prefix, default_prefix, readline_prefix] : \
+      [readline_prefix, default_prefix, editline_prefix]
+
+    at_least_one_header_found = false
+    foreach header : ['history', 'readline']
+      is_found = false
+      foreach prefix : prefixes
+        header_file = '@0@@1@.h'.format(prefix['header_prefix'], header)
+        # Check history.h and readline.h
+        if not is_found and cc.has_header(header_file,
+            args: test_c_args, include_directories: postgres_inc,
+            dependencies: [readline], required: false)
+          if header == 'history'
+            history_h = header_file
+          else
+            readline_h = header_file
+          endif
+          cdata.set('HAVE_@0@@1@_H'.format(prefix['flag_prefix'], header).to_upper(), 1)
+          is_found = true
+          at_least_one_header_found = true
+        endif
+      endforeach
+    endforeach
+
+    if not at_least_one_header_found
+      error('''readline header not found
+If you have @0@ already installed, see see meson-log/meson-log.txt for details on the
+failure. It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.'''.format(readline_dep))
+    endif
+
+    check_funcs = [
+      'append_history',
+      'history_truncate_file',
+      'rl_completion_matches',
+      'rl_filename_completion_function',
+      'rl_reset_screen_size',
+      'rl_variable_bind',
+    ]
+
+    foreach func : check_funcs
+      found = cc.has_function(func, dependencies: [readline],
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_'+func.to_upper(), found ? 1 : false)
+    endforeach
+
+    check_vars = [
+      'rl_completion_suppress_quote',
+      'rl_filename_quote_characters',
+      'rl_filename_quoting_function',
+    ]
+
+    foreach var : check_vars
+      cdata.set('HAVE_'+var.to_upper(),
+        cc.has_header_symbol(readline_h, var,
+          args: test_c_args, include_directories: postgres_inc,
+          prefix: '#include <stdio.h>',
+          dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if readline.type_name() == 'library'
+      readline = declare_dependency(dependencies: readline,
+        include_directories: postgres_inc)
+    endif
+  endif
+
+  # XXX: Figure out whether to implement mingw warning equivalent
+else
+  readline = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: selinux
+###############################################################
+
+selinux = not_found_dep
+selinuxopt = get_option('selinux')
+if meson.version().version_compare('>=0.59')
+  selinuxopt = selinuxopt.disable_auto_if(host_system != 'linux')
+endif
+selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
+cdata.set('HAVE_LIBSELINUX',
+  selinux.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: systemd
+###############################################################
+
+systemd = not_found_dep
+systemdopt = get_option('systemd')
+if meson.version().version_compare('>=0.59')
+  systemdopt = systemdopt.disable_auto_if(host_system != 'linux')
+endif
+systemd = dependency('libsystemd', required: systemdopt)
+cdata.set('USE_SYSTEMD', systemd.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+  # Try to find openssl via pkg-config et al, if that doesn't work
+  # (e.g. because it's provided as part of the OS, like on FreeBSD), look for
+  # the library names that we know about.
+
+  # via pkg-config et al
+  ssl = dependency('openssl', required: false)
+
+  # via library + headers
+  if not ssl.found()
+    ssl_lib = cc.find_library('ssl',
+      dirs: test_lib_d,
+      header_include_directories: postgres_inc,
+      has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+    crypto_lib = cc.find_library('crypto',
+      dirs: test_lib_d,
+      header_include_directories: postgres_inc)
+    ssl_int = [ssl_lib, crypto_lib]
+
+    ssl = declare_dependency(dependencies: ssl_int,
+                             include_directories: postgres_inc)
+  else
+    cc.has_header('openssl/ssl.h', args: test_c_args, dependencies: ssl, required: true)
+    cc.has_header('openssl/err.h', args: test_c_args, dependencies: ssl, required: true)
+
+    ssl_int = [ssl]
+  endif
+
+  check_funcs = [
+    ['CRYPTO_new_ex_data', {'required': true}],
+    ['SSL_new', {'required': true}],
+
+    # Function introduced in OpenSSL 1.0.2.
+    ['X509_get_signature_nid'],
+
+    # Functions introduced in OpenSSL 1.1.0. We used to check for
+    # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+    # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+    # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+    # functions.
+    ['OPENSSL_init_ssl'],
+    ['BIO_get_data'],
+    ['BIO_meth_new'],
+    ['ASN1_STRING_get0_data'],
+    ['HMAC_CTX_new'],
+    ['HMAC_CTX_free'],
+
+    # OpenSSL versions before 1.1.0 required setting callback functions, for
+    # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+    # function was removed.
+    ['CRYPTO_lock'],
+  ]
+
+  foreach c : check_funcs
+    func = c.get(0)
+    val = cc.has_function(func, args: test_c_args, dependencies: ssl_int)
+    required = c.get(1, {}).get('required', false)
+    if required and not val
+      error('openssl function @0@ is required'.format(func))
+    elif not required
+      cdata.set('HAVE_' + func.to_upper(), val ? 1 : false)
+    endif
+  endforeach
+
+  cdata.set('USE_OPENSSL', 1,
+            description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+
+  cdata.set('OPENSSL_API_COMPAT', '0x10001000L',
+            description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings
+   from newer OpenSSL versions.''')
+else
+  ssl = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: uuid
+###############################################################
+
+uuidopt = get_option('uuid')
+if uuidopt != 'none'
+  uuidname = uuidopt.to_upper()
+  if uuidopt == 'e2fs'
+    uuid = dependency('uuid', required: true)
+    uuidfunc = 'uuid_generate'
+    uuidheader = 'uuid/uuid.h'
+  elif uuidopt == 'bsd'
+    # libc should have uuid function
+    uuid = declare_dependency()
+    uuidfunc = 'uuid_to_string'
+    uuidheader = 'uuid.h'
+  elif uuidopt == 'ossp'
+    uuid = dependency('ossp-uuid', required: true)
+    uuidfunc = 'uuid_export'
+    uuidheader = 'ossp/uuid.h'
+  else
+    error('huh')
+  endif
+
+  if not cc.has_header_symbol(uuidheader, uuidfunc, args: test_c_args, dependencies: uuid)
+    error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc))
+  endif
+  cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1)
+
+  cdata.set('HAVE_UUID_@0@'.format(uuidname), 1,
+           description: 'Define to 1 if you have @0@ UUID support.'.format(uuidname))
+else
+  uuid = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = not_found_dep
+if not zlibopt.disabled()
+  zlib_t = dependency('zlib', required: zlibopt)
+
+  if zlib_t.type_name() == 'internal'
+    # if fallback was used, we don't need to test if headers are present (they
+    # aren't built yet, so we can't test)
+    zlib = zlib_t
+  elif not zlib_t.found()
+    warning('did not find zlib')
+  elif not cc.has_header('zlib.h',
+      args: test_c_args, include_directories: postgres_inc,
+      dependencies: [zlib_t], required: zlibopt.enabled())
+    warning('zlib header not found')
+  elif not cc.has_type('z_streamp',
+      dependencies: [zlib_t], prefix: '#include <zlib.h>',
+      args: test_c_args, include_directories: postgres_inc)
+    if zlibopt.enabled()
+      error('zlib version is too old')
+    else
+      warning('zlib version is too old')
+    endif
+  else
+    zlib = zlib_t
+  endif
+
+  if zlib.found()
+    cdata.set('HAVE_LIBZ', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Library: tap test dependencies
+###############################################################
+
+# Check whether tap tests are enabled or not
+tap_tests_enabled = false
+tapopt = get_option('tap_tests')
+if not tapopt.disabled()
+  # Checking for perl modules for tap tests
+  perl_ipc_run_check = run_command(perl, 'config/check_modules.pl', check: false)
+  if perl_ipc_run_check.returncode() != 0
+    message(perl_ipc_run_check.stderr().strip())
+    if tapopt.enabled()
+      error('Additional Perl modules are required to run TAP tests.')
+    else
+      warning('Additional Perl modules are required to run TAP tests.')
+    endif
+  else
+    tap_tests_enabled = true
+  endif
+endif
+
+
+
+###############################################################
+# Library: zstd
+###############################################################
+
+zstdopt = get_option('zstd')
+if not zstdopt.disabled()
+  zstd = dependency('libzstd', required: zstdopt, version: '>=1.4.0')
+
+  if zstd.found()
+    cdata.set('USE_ZSTD', 1)
+    cdata.set('HAVE_LIBZSTD', 1)
+  endif
+
+else
+  zstd = not_found_dep
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+# Do we need -std=c99 to compile C99 code?
+c99_test = '''
+#include <stdbool.h>
+#include <complex.h>
+#include <tgmath.h>
+#include <inttypes.h>
+
+struct named_init_test {
+  int a;
+  int b;
+};
+
+extern void structfunc(struct named_init_test);
+
+int main(int argc, char **argv)
+{
+  struct named_init_test nit = {
+    .a = 3,
+    .b = 5,
+  };
+
+  for (int loop_var = 0; loop_var < 3; loop_var++)
+  {
+    nit.a += nit.b;
+  }
+
+  structfunc((struct named_init_test){1, 0});
+
+  return nit.a != 0;
+}
+'''
+
+if not cc.compiles(c99_test, name: 'c99', args: test_c_args)
+  if cc.compiles(c99_test, name: 'c99 with -std=c99',
+        args: test_c_args + ['-std=c99'])
+    test_c_args += '-std=c99'
+    cflags += '-std=c99'
+  else
+    error('C compiler does not support C99')
+  endif
+endif
+
+sizeof_long = cc.sizeof('long', args: test_c_args)
+cdata.set('SIZEOF_LONG', sizeof_long)
+if sizeof_long == 8
+  cdata.set('HAVE_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long int')
+  cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: test_c_args) == 8
+  cdata.set('HAVE_LONG_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long long int')
+  cdata.set_quoted('INT64_MODIFIER', 'll')
+else
+  error('do not know how to get a 64bit int')
+endif
+
+if host_machine.endian() == 'big'
+  cdata.set('WORDS_BIGENDIAN', 1)
+endif
+
+alignof_types = ['short', 'int', 'long', 'double']
+maxalign = 0
+foreach t : alignof_types
+  align = cc.alignment(t, args: test_c_args)
+  if maxalign < align
+    maxalign = align
+  endif
+  cdata.set('ALIGNOF_@0@'.format(t.to_upper()), align)
+endforeach
+cdata.set('MAXIMUM_ALIGNOF', maxalign)
+
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: test_c_args))
+cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: test_c_args))
+
+
+# Check if __int128 is a working 128 bit integer type, and if so
+# define PG_INT128_TYPE to that typename.
+#
+# This currently only detects a GCC/clang extension, but support for other
+# environments may be added in the future.
+#
+# For the moment we only test for support for 128bit math; support for
+# 128bit literals and snprintf is not required.
+if cc.links('''
+  /*
+   * We don't actually run this test, just link it to verify that any support
+   * functions needed for __int128 are present.
+   *
+   * These are globals to discourage the compiler from folding all the
+   * arithmetic tests down to compile-time constants.  We do not have
+   * convenient support for 128bit literals at this point...
+   */
+  __int128 a = 48828125;
+  __int128 b = 97656250;
+
+  int main(void)
+  {
+      __int128 c,d;
+      a = (a << 12) + 1; /* 200000000001 */
+      b = (b << 12) + 5; /* 400000000005 */
+      /* try the most relevant arithmetic ops */
+      c = a * b;
+      d = (c + b) / b;
+      /* must use the results, else compiler may optimize arithmetic away */
+      return d != a+1;
+  }''',
+  name: '__int128',
+  args: test_c_args)
+
+  buggy_int128 = false
+
+  # Use of non-default alignment with __int128 tickles bugs in some compilers.
+  # If not cross-compiling, we can test for bugs and disable use of __int128
+  # with buggy compilers.  If cross-compiling, hope for the best.
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83925
+  if not meson.is_cross_build()
+    r = cc.run('''
+    /* This must match the corresponding code in c.h: */
+    #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
+    #define pg_attribute_aligned(a) __attribute__((aligned(a)))
+    #endif
+    typedef __int128 int128a
+    #if defined(pg_attribute_aligned)
+    pg_attribute_aligned(8)
+    #endif
+    ;
+
+    int128a holder;
+    void pass_by_val(void *buffer, int128a par) { holder = par; }
+
+    int main(void)
+    {
+        long int i64 = 97656225L << 12;
+        int128a q;
+        pass_by_val(main, (int128a) i64);
+        q = (int128a) i64;
+        return q != holder;
+    }''',
+    name: '__int128 alignment bug',
+    args: test_c_args)
+    assert(r.compiled())
+    if r.returncode() != 0
+      buggy_int128 = true
+    endif
+  endif
+
+  if not buggy_int128
+    cdata.set('PG_INT128_TYPE', '__int128')
+    cdata.set('ALIGNOF_PG_INT128_TYPE', cc.
+      alignment('__int128', args: test_c_args))
+  endif
+endif
+
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang).  If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+    static inline int foo(void)
+    {
+      void *labeladdrs[] = {&&my_label};
+      goto *labeladdrs[0];
+      my_label:
+      return 1;
+    }''',
+    args: test_c_args)
+  cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+    int main(int arg, char **argv)
+    {
+        ({ _Static_assert(1, "foo"); });
+    }
+    ''',
+    args: test_c_args)
+  cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: test_c_args) \
+  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: test_c_args) \
+  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: test_c_args) == 1
+  cdata.set('HAVE__BOOL', 1)
+  cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+# Need to check a call with %m because netbsd supports gnu_printf but emits a
+# warning for each use of %m.
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = '''
+extern void emit_log(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));
+static void call_log(void)
+{
+    emit_log(0, "error: %s: %m", "foo");
+}
+'''
+attrib_error_args = cc.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
+foreach a : printf_attributes
+  if cc.compiles(testsrc.format(a),
+      args: test_c_args + attrib_error_args, name: 'format ' + a)
+    cdata.set('PG_PRINTF_ATTRIBUTE', a)
+    break
+  endif
+endforeach
+
+if cc.has_function_attribute('visibility:default') and \
+  cc.has_function_attribute('visibility:hidden')
+  cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+endif
+
+# Only newer versions of meson know not to apply gnu_symbol_visibility =
+# inlineshidden to C code as well... Any either way, we want to put these
+# flags into exported files (pgxs, .pc files).
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+  cflags_mod += '-fvisibility=hidden'
+  cxxflags_mod += ['-fvisibility=hidden', '-fvisibility-inlines-hidden']
+  ldflags_mod += '-fvisibility=hidden'
+endif
+
+# Check if various builtins exist. Some builtins are tested separately,
+# because we want to test something more complicated than the generic case.
+builtins = [
+  'bswap16',
+  'bswap32',
+  'bswap64',
+  'clz',
+  'ctz',
+  'constant_p',
+  'frame_address',
+  'popcount',
+  'unreachable',
+]
+
+foreach builtin : builtins
+  fname = '__builtin_@0@'.format(builtin)
+  if cc.has_function(fname, args: test_c_args)
+    cdata.set('HAVE@0@'.format(fname.to_upper()), 1)
+  endif
+endforeach
+
+# Check if the C compiler understands __builtin_types_compatible_p,
+# and define HAVE__BUILTIN_TYPES_COMPATIBLE_P if so.
+#
+# We check usage with __typeof__, though it's unlikely any compiler would
+# have the former and not the latter.
+if cc.compiles('''
+    static int x;
+    static int y[__builtin_types_compatible_p(__typeof__(x), int)];
+    ''',
+    name: '__builtin_types_compatible_p',
+    args: test_c_args)
+  cdata.set('HAVE__BUILTIN_TYPES_COMPATIBLE_P', 1)
+endif
+
+# Check if the C compiler understands __builtin_$op_overflow(),
+# and define HAVE__BUILTIN_OP_OVERFLOW if so.
+#
+# Check for the most complicated case, 64 bit multiplication, as a
+# proxy for all of the operations.  To detect the case where the compiler
+# knows the function but library support is missing, we must link not just
+# compile, and store the results in global variables so the compiler doesn't
+# optimize away the call.
+if cc.links('''
+    INT64 a = 1;
+    INT64 b = 1;
+    INT64 result;
+
+    int main(void)
+    {
+        return __builtin_mul_overflow(a, b, &result);
+    }''',
+    name: '__builtin_mul_overflow',
+    args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))],
+    )
+  cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1)
+endif
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+    #include <cpuid.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+    }
+    ''', name: '__get_cpuid',
+    args: test_c_args)
+  cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+    #include <intrin.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __cpuid(exx, 1);
+    }
+    ''', name: '__cpuid',
+    args: test_c_args)
+  cdata.set('HAVE__CPUID', 1)
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+  # Disable strict-aliasing rules; needed for gcc 3.3+
+  '-fno-strict-aliasing',
+  # Disable optimizations that assume no overflow; needed for gcc 4.3+
+  '-fwrapv',
+  '-fexcess-precision=standard',
+]
+
+cflags += cc.get_supported_arguments(common_functional_flags)
+if llvm.found()
+  cxxflags += cpp.get_supported_arguments(common_functional_flags)
+endif
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+common_warning_flags = [
+  '-Wmissing-prototypes',
+  '-Wpointer-arith',
+  # Really don't want VLAs to be used in our dialect of C
+  '-Werror=vla',
+  # On macOS, complain about usage of symbols newer than the deployment target
+  '-Werror=unguarded-availability-new',
+  '-Wendif-labels',
+  '-Wmissing-format-attribute',
+  '-Wimplicit-fallthrough=3',
+  '-Wcast-function-type',
+  # This was included in -Wall/-Wformat in older GCC versions
+  '-Wformat-security',
+]
+
+cflags_warn += cc.get_supported_arguments(common_warning_flags)
+if llvm.found()
+  cxxflags_warn += cpp.get_supported_arguments(common_warning_flags)
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+  cflags_warn += '-Wdeclaration-after-statement'
+  using_declaration_after_statement_warning = true
+else
+  using_declaration_after_statement_warning = false
+endif
+
+
+# The following tests want to suppress various unhelpful warnings by adding
+# -Wno-foo switches.  But gcc won't complain about unrecognized -Wno-foo
+# switches, so we have to test for the positive form and if that works,
+# add the negative form.
+
+negative_warning_flags = [
+  # Suppress clang's unhelpful unused-command-line-argument warnings.
+  'unused-command-line-argument',
+
+  # Remove clang 12+'s compound-token-split-by-macro, as this causes a lot
+  # of warnings when building plperl because of usages in the Perl headers.
+  'compound-token-split-by-macro',
+
+  # Similarly disable useless truncation warnings from gcc 8+
+  'format-truncation',
+  'stringop-truncation',
+
+  # FIXME: from andres's local config
+  'clobbered',
+  'missing-field-initializers',
+  'sign-compare',
+  'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+  if cc.has_argument('-W' + w)
+    cflags_warn += '-Wno-' + w
+  endif
+  if llvm.found() and cpp.has_argument('-W' + w)
+    cxxflags_warn += '-Wno-' + w
+  endif
+endforeach
+
+# FIXME: copy "Defend against clang being used on x86-32 without SSE2 enabled"
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+  cflags_warn += [
+    '/wd4018',
+    '/wd4244',
+    '/wd4273',
+    '/wd4101',
+    '/wd4102',
+    '/wd4090',
+    '/wd4267',
+  ]
+
+  cppflags += [
+    '/DWIN32',
+    '/DWINDOWS',
+    '/D__WINDOWS__',
+    '/D__WIN32__',
+    '/D_CRT_SECURE_NO_DEPRECATE',
+    '/D_CRT_NONSTDC_NO_DEPRECATE',
+  ]
+
+  # We never need export libraries. As link.exe reports their creation, they
+  # are unnecessarily noisy. Similarly, we don't need import library for
+  # modules, we only import them dynamically, and they're also noisy.
+  ldflags += '/NOEXP'
+  ldflags_mod += '/NOIMPLIB'
+endif
+
+
+###############################################################
+# Atomics
+###############################################################
+
+if not get_option('spinlocks')
+  warning('Not using spinlocks will cause poor performance')
+else
+  cdata.set('HAVE_SPINLOCKS', 1)
+endif
+
+if not get_option('atomics')
+  warning('Not using atomics will cause poor performance')
+else
+  # XXX: perhaps we should require some atomics support in this case these
+  # days?
+  cdata.set('HAVE_ATOMICS', 1)
+
+  atomic_checks = [
+    {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+     'desc': '__sync_lock_test_and_set(char)',
+     'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+     'desc': '__sync_lock_test_and_set(int32)',
+     'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+     'desc': '__sync_val_compare_and_swap(int32)',
+     'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+     'desc': '__sync_val_compare_and_swap(int64)',
+     'test': '''
+INT64 val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+     'desc': ' __atomic_compare_exchange_n(int32)',
+     'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+     'desc': ' __atomic_compare_exchange_n(int64)',
+     'test': '''
+INT64 val = 0;
+INT64 expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+  ]
+
+  foreach check : atomic_checks
+    test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+    cdata.set(check['name'],
+      cc.links(test,
+        name: check['desc'],
+        args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false
+    )
+  endforeach
+
+endif
+
+
+
+###############################################################
+# Select CRC-32C implementation.
+#
+# If we are targeting a processor that has Intel SSE 4.2 instructions, we can
+# use the special CRC instructions for calculating CRC-32C. If we're not
+# targeting such a processor, but we can nevertheless produce code that uses
+# the SSE intrinsics, perhaps with some extra CFLAGS, compile both
+# implementations and select which one to use at runtime, depending on whether
+# SSE 4.2 is supported by the processor we're running on.
+#
+# Similarly, if we are targeting an ARM processor that has the CRC
+# instructions that are part of the ARMv8 CRC Extension, use them. And if
+# we're not targeting such a processor, but can nevertheless produce code that
+# uses the CRC instructions, compile both, and select at runtime.
+###############################################################
+
+have_optimized_crc = false
+cflags_crc = []
+if host_cpu == 'x86' or host_cpu == 'x86_64'
+
+  if cc.get_id() == 'msvc'
+    cdata.set('USE_SSE42_CRC32C', false)
+    cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  else
+
+    prog = '''
+#include <nmmintrin.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = _mm_crc32_u8(crc, 0);
+    crc = _mm_crc32_u32(crc, 0);
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+    if cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 without -msse4.2',
+          args: test_c_args)
+      # Use Intel SSE 4.2 unconditionally.
+      cdata.set('USE_SSE42_CRC32C', 1)
+      have_optimized_crc = true
+    elif cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 with -msse4.2',
+          args: test_c_args + ['-msse4.2'])
+      # Use Intel SSE 4.2, with runtime check. The CPUID instruction is needed for
+      # the runtime check.
+      cflags_crc += '-msse4.2'
+      cdata.set('USE_SSE42_CRC32C', false)
+      cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+      have_optimized_crc = true
+    endif
+
+  endif
+
+elif host_cpu == 'arm' or host_cpu == 'aarch64'
+
+  prog = '''
+#include <arm_acle.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = __crc32cb(crc, 0);
+    crc = __crc32ch(crc, 0);
+    crc = __crc32cw(crc, 0);
+    crc = __crc32cd(crc, 0);
+
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+  if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc',
+      args: test_c_args)
+    # Use ARM CRC Extension unconditionally
+    cdata.set('USE_ARMV8_CRC32C', true)
+    have_optimized_crc = true
+  elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc',
+      args: test_c_args + ['-march=armv8-a+crc'])
+    # Use ARM CRC Extension, with runtime check
+    cflags_crc += '-march=armv8-a+crc'
+    cdata.set('USE_ARMV8_CRC32C', false)
+    cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  endif
+endif
+
+if not have_optimized_crc
+  # fall back to slicing-by-8 algorithm, which doesn't require any special CPU
+  # support.
+  cdata.set('USE_SLICING_BY_8_CRC32C', 1)
+endif
+
+
+
+###############################################################
+# Other CPU specific stuff
+###############################################################
+
+if host_cpu == 'x86_64'
+
+  if cc.compiles('''
+      void main(void)
+      {
+          long long x = 1; long long r;
+          __asm__ __volatile__ (" popcntq %1,%0\n" : "=q"(r) : "rm"(x));
+      }''',
+      name: '@0@: popcntq instruction'.format(host_cpu),
+      args: test_c_args)
+    cdata.set('HAVE_X86_64_POPCNTQ', 1)
+  endif
+
+elif host_cpu == 'ppc' or host_cpu == 'ppc64'
+  # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+  if cdata.has('HAVE__BUILTIN_CONSTANT_P')
+    if cc.compiles('''
+      static inline int
+      addi(int ra, int si)
+      {
+          int res = 0;
+          if (__builtin_constant_p(si))
+              __asm__ __volatile__(
+                  " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+          return res;
+      }
+      int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+      ''',
+      args: test_c_args)
+      cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+# XXX: Might be worth conditioning some checks on the OS, to avoid doing
+# unnecessary checks over and over, particularly on windows.
+header_checks = [
+  'atomic.h',
+  'copyfile.h',
+  'crtdefs.h',
+  'execinfo.h',
+  'getopt.h',
+  'ifaddrs.h',
+  'langinfo.h',
+  'mbarrier.h',
+  'stdbool.h',
+  'strings.h',
+  'sys/epoll.h',
+  'sys/event.h',
+  'sys/personality.h',
+  'sys/prctl.h',
+  'sys/procctl.h',
+  'sys/signalfd.h',
+  'sys/ucred.h',
+  'termios.h',
+  'ucred.h',
+]
+
+foreach header : header_checks
+  varname = 'HAVE_' + header.underscorify().to_upper()
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  found = cc.has_header(header,
+    include_directories: postgres_inc, args: test_c_args)
+  cdata.set(varname, found ? 1 : false,
+            description: 'Define to 1 if you have the <@0@> header file.'.format(header))
+endforeach
+
+
+decl_checks = [
+  ['F_FULLFSYNC', 'fcntl.h'],
+  ['fdatasync', 'unistd.h'],
+  ['posix_fadvise', 'fcntl.h'],
+  ['strlcat', 'string.h'],
+  ['strlcpy', 'string.h'],
+  ['strnlen', 'string.h'],
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+  ['preadv', 'sys/uio.h'],
+  ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+  func = c.get(0)
+  header = c.get(1)
+  args = c.get(2, {})
+  varname = 'HAVE_DECL_' + func.underscorify().to_upper()
+
+  found = cc.has_header_symbol(header, func,
+    args: test_c_args, include_directories: postgres_inc,
+    kwargs: args)
+  cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@', and to 0 if you
+   don't.'''.format(func))
+endforeach
+
+
+
+if cc.has_type('struct cmsgcred',
+    args: test_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '' : '-DHAVE_SYS_UCRED_H'],
+    include_directories: postgres_inc,
+    prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+  cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+  cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_type('struct option',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '@0@'.format(cdata.get('HAVE_GETOPT_H')) == '1' ? '#include <getopt.h>' : '')
+  cdata.set('HAVE_STRUCT_OPTION', 1)
+endif
+
+
+foreach c : ['opterr', 'optreset']
+  varname = 'HAVE_INT_' + c.underscorify().to_upper()
+
+  if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+    extern int @0@;
+    @0@ = 1;
+}
+'''.format(c), name: c, args: test_c_args)
+    cdata.set(varname, 1)
+  else
+    cdata.set(varname, false)
+  endif
+endforeach
+
+if cc.has_type('socklen_t',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/socket.h>''')
+  cdata.set('HAVE_SOCKLEN_T', 1)
+endif
+
+if cc.has_member('struct sockaddr', 'sa_len',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
+endif
+
+if cc.has_member('struct tm', 'tm_zone',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+  cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+    return timezone / 60;
+}
+''',
+    name: 'Check if the global variable `timezone\' exists',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+  cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+if cc.has_type('union semun',
+    args: test_c_args,
+    include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+''')
+  cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+  char buf[100];
+  switch (strerror_r(1, buf, sizeof(buf)))
+  { case 0: break; default: break; }
+}''',
+    name: 'strerror_r',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('STRERROR_R_INT', 1)
+else
+  cdata.set('STRERROR_R_INT', false)
+endif
+
+# Check for the locale_t type and find the right header file.  macOS
+# needs xlocale.h; standard is locale.h, but glibc also has an
+# xlocale.h file that we should not use.
+if cc.has_type('locale_t', prefix: '#include <locale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+elif cc.has_type('locale_t', prefix: '#include <xlocale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+  cdata.set('LOCALE_T_IN_XLOCALE', 1)
+endif
+
+# Check if the C compiler understands typeof or a variant.  Define
+# HAVE_TYPEOF if so, and define 'typeof' to the actual key word.
+foreach kw : ['typeof', '__typeof__', 'decltype']
+  if cc.compiles('''
+int main(void)
+{
+    int x = 0;
+    @0@(x) y;
+    y = x;
+    return y;
+}
+'''.format(kw),
+    name: 'typeof()',
+    args: test_c_args, include_directories: postgres_inc)
+
+    cdata.set('HAVE_TYPEOF', 1)
+    if kw != 'typeof'
+      cdata.set('typeof', kw)
+    endif
+
+    break
+  endif
+endforeach
+
+
+# MSVC doesn't cope well with defining restrict to __restrict, the
+# spelling it understands, because it conflicts with
+# __declspec(restrict). Therefore we define pg_restrict to the
+# appropriate definition, which presumably won't conflict.
+#
+# FIXME: We used to check if restrict is available, but it really should these
+# days?
+#
+# FIXME: Historically we allowed platforms to disable restrict in template
+# files. Is that really still necessary?
+cdata.set('pg_restrict', '__restrict')
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+    PS_STRINGS->ps_nargvstr = 1;
+    PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+  name: 'PS_STRINGS', args: test_c_args)
+  cdata.set('HAVE_PS_STRINGS', 1)
+else
+  cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps += cc.find_library('m', required: false)
+
+rt_dep = cc.find_library('rt', required: false)
+
+dl_dep = cc.find_library('dl', required: false)
+
+util_dep = cc.find_library('util', required: false)
+posix4_dep = cc.find_library('posix4', required: false)
+
+getopt_dep = cc.find_library('getopt', required: false)
+gnugetopt_dep = cc.find_library('gnugetopt', required: false)
+
+execinfo_dep = cc.find_library('execinfo', required: false)
+
+if host_system == 'cygwin'
+  cygipc_dep = cc.find_library('cygipc', required: false)
+else
+  cygipc_dep = not_found_dep
+endif
+
+if host_system == 'sunos'
+  socket_dep = cc.find_library('socket', required: false)
+else
+  socket_dep = not_found_dep
+endif
+
+# XXX: Might be worth conditioning some checks on the OS, to avoid doing
+# unnecessary checks over and over, particularly on windows.
+func_checks = [
+  ['_configthreadlocale', {'skip': host_system != 'windows'}],
+  ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+  ['clock_gettime', {'dependencies': [rt_dep, posix4_dep], 'define': false}],
+  ['copyfile'],
+  ['dlsym', {'dependencies': [dl_dep], 'define': false}],
+  ['explicit_bzero'],
+  ['fdatasync', {'dependencies': [rt_dep, posix4_dep], 'define': false}], # Solaris
+  ['getifaddrs'],
+  ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getopt_long', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getpeereid'],
+  ['getpeerucred'],
+  ['inet_aton'],
+  ['inet_pton'],
+  ['kqueue'],
+  ['mbstowcs_l'],
+  ['memset_s'],
+  ['mkdtemp'],
+  ['posix_fadvise'],
+  ['posix_fallocate'],
+  ['ppoll'],
+  ['pstat'],
+  ['pthread_barrier_wait', {'dependencies': [thread_dep]}],
+  ['pthread_is_threaded_np', {'dependencies': [thread_dep]}],
+  ['setproctitle', {'dependencies': [util_dep]}],
+  ['setproctitle_fast'],
+  ['shm_open', {'dependencies': [rt_dep], 'define': false}],
+  ['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
+  ['shmget', {'dependencies': [cygipc_dep], 'define': false}],
+  ['socket', {'dependencies': [socket_dep], 'define': false}],
+  ['strchrnul'],
+  ['strerror_r', {'dependencies': [thread_dep]}],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+  ['strsignal'],
+  ['sync_file_range'],
+  ['syncfs'],
+  ['uselocale'],
+  ['wcstombs_l'],
+]
+
+foreach c : func_checks
+  func = c.get(0)
+  kwargs = c.get(1, {})
+  deps = kwargs.get('dependencies', [])
+
+  if kwargs.get('skip', false)
+    continue
+  endif
+
+  varname = 'HAVE_' + func.underscorify().to_upper()
+
+  found = cc.has_function(func, args: test_c_args)
+
+  if not found
+    foreach dep : deps
+      if not dep.found()
+        continue
+      endif
+      found = cc.has_function(func, args: test_c_args,
+                              dependencies: [dep])
+      if found
+        os_deps += dep
+        break
+      endif
+    endforeach
+  endif
+
+  if kwargs.get('define', true)
+    # Emulate autoconf behaviour of not-found->undef, found->1
+    cdata.set(varname, found  ? 1 : false,
+              description: 'Define to 1 if you have the `@0@\' function.'.format(func))
+  endif
+endforeach
+
+
+if cc.has_function('syslog', args: test_c_args) and \
+    cc.check_header('syslog.h', args: test_c_args)
+  cdata.set('HAVE_SYSLOG', 1)
+endif
+
+
+gen_export_kwargs = {
+  'input': 'exports.txt',
+  'output': '@BASENAME@.'+export_file_suffix,
+  'command': [perl, files('src/tools/gen_export.pl'),
+   '--format', export_file_format,
+   '--input', '@INPUT0@', '--output', '@OUTPUT0@'],
+  'build_by_default': false,
+  'install': false,
+}
+
+
+# FIXME: needs some autoconfiguration
+if host_system == 'darwin'
+  cdata.set('USE_SYSV_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'openbsd' or host_system == 'netbsd'
+  cdata.set('USE_SYSV_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'windows'
+  cdata.set('USE_WIN32_SEMAPHORES', 1)
+  cdata.set('USE_WIN32_SHARED_MEMORY', 1)
+else
+  cdata.set('USE_UNNAMED_POSIX_SEMAPHORES', 1)
+  cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+endif
+
+cdata.set('MEMSET_LOOP_LIMIT', memset_loop_limit)
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+add_project_arguments(cflags, language: ['c'])
+add_project_arguments(cppflags, language: ['c'])
+add_project_arguments(cflags_warn, language: ['c'])
+add_project_arguments(cxxflags, language: ['cpp'])
+add_project_arguments(cppflags, language: ['cpp'])
+add_project_arguments(cxxflags_warn, language: ['cpp'])
+add_project_link_arguments(ldflags, language: ['c', 'cpp'])
+
+
+###############################################################
+# Threading
+###############################################################
+
+# XXX: About to rely on thread safety in the autoconf build, so not worth
+# implementing a fallback.
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+
+
+###############################################################
+# NLS / Gettext
+###############################################################
+
+i18n = import('i18n')
+nlsopt = get_option('nls')
+libintl = not_found_dep
+
+if not nlsopt.disabled()
+  # otherwise there'd be lots of
+  # "Gettext not found, all translation (po) targets will be ignored."
+  # warnings if not found.
+  msgfmt = find_program('msgfmt', required: nlsopt.enabled(), native: true)
+
+  # meson 0.59 has this wrapped in dependency('int')
+  if msgfmt.found() and \
+    cc.check_header('libintl.h', args: test_c_args, required: nlsopt)
+
+    # in libc
+    if cc.has_function('ngettext')
+      libintl = declare_dependency()
+    else
+      libintl = cc.find_library('intl',
+        has_headers: ['libintl.h'], required: nlsopt,
+        header_include_directories: postgres_inc,
+        dirs: test_lib_d)
+    endif
+  endif
+
+  if libintl.found()
+    cdata.set('ENABLE_NLS', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Build
+###############################################################
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+test_deps = []
+backend_targets = []
+
+
+# Define the tests to distribute them to the correct test styles later
+tests = []
+
+
+# Default options for targets
+
+# First identify rpaths
+bin_install_rpaths = []
+lib_install_rpaths = []
+mod_install_rpaths = []
+
+# add extra_lib_dirs to rpath
+bin_install_rpaths += postgres_lib_d
+lib_install_rpaths += postgres_lib_d
+mod_install_rpaths += postgres_lib_d
+
+
+# Define arguments for default targets
+
+default_target_args = {
+  'implicit_include_directories': false,
+  'install': true,
+}
+
+default_lib_args = default_target_args + {
+  'name_prefix': '',
+  'install_rpath': ':'.join(lib_install_rpaths),
+}
+
+internal_lib_args = default_lib_args + {
+  'build_by_default': false,
+  'install': false,
+}
+
+default_mod_args = default_lib_args + {
+  'name_prefix': '',
+  'install_dir': dir_lib_pkg,
+  'install_rpath': ':'.join(mod_install_rpaths),
+}
+
+default_bin_args = default_target_args + {
+  'install_dir': dir_bin,
+  'install_rpath': ':'.join(bin_install_rpaths),
+}
+
+
+
+###
+### windows resources related stuff
+###
+
+pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+win32ver_rc_in = files('src/port/win32ver.rc.in')
+rcgen = find_program('src/tools/rcgen', native: true)
+
+rcgen_cmd = [rcgen, '@INPUT@', '-o', '@OUTPUT@', '--depfile', '@DEPFILE@']
+rcgen_bin_cmd = rcgen_cmd + [
+  '--VFT_TYPE', 'VFT_APP',
+  '--FILEENDING', 'exe',
+  '--ICO', pg_ico,
+]
+
+rcgen_lib_cmd = rcgen_cmd + [
+  '--VFT_TYPE', 'VFT_DLL',
+  '--FILEENDING', 'dll',
+]
+
+rcgen_inc = [postgres_inc]
+
+rcgen_kw = {
+  'input': win32ver_rc_in,
+  'output': 'win32ver.rc',
+  'depfile': '@PLAINNAME@.d',
+}
+
+rccompile_kw = {
+  'include_directories': rcgen_inc,
+}
+
+
+# headers that the whole build tree depends on
+generated_headers = []
+# headers that the backend build depends on
+generated_backend_headers = []
+# configure_files() output, needs a way of converting to file names
+configure_files = []
+
+# generated files that might conflict with a partial in-tree autoconf build
+generated_sources = []
+# same, for paths that differ between autoconf / meson builds
+# elements are [dir, [files]]
+generated_sources_ac = {}
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+subdir('src/include')
+
+subdir('config')
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: [errcodes],
+  dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: os_deps,
+)
+
+backend_common_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_args: ldflags_sl,
+  link_with: [pgport_shlib, common_shlib],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+libpq_deps = [
+  frontend_shlib_code,
+  thread_dep,
+
+  gssapi,
+  ldap,
+  libintl,
+  ssl,
+]
+
+subdir('src/interfaces/libpq')
+# fe_utils depends on libpq
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+  include_directories: [postgres_inc],
+  link_with: [fe_utils, common_static, pgport_static],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+backend_both_deps += [
+  thread_dep,
+  bsd_auth,
+  gssapi,
+  icu,
+  icu_i18n,
+  ldap,
+  libintl,
+  libxml,
+  lz4,
+  pam,
+  ssl,
+  systemd,
+  zlib,
+  zstd,
+]
+
+backend_mod_deps = backend_both_deps + os_deps
+
+backend_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  link_args: ldflags_be,
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: os_deps + backend_both_deps + backend_deps,
+)
+
+# src/backend/meson.build defines backend_mod_code used for extension
+# libraries.
+
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+subdir('src/interfaces/libpq/test')
+subdir('src/interfaces/ecpg/test')
+
+subdir('doc/src/sgml')
+
+generated_sources_ac += {'': ['GNUmakefile']}
+
+
+# If there are any files in the source directory that we also generate in the
+# build directory, they might get preferred over the newly generated files,
+# e.g. because of a #include "file", which always will search in the current
+# directory first.
+message('checking for file conflicts between source and build directory')
+conflicting_files = []
+potentially_conflicting_files_t = []
+potentially_conflicting_files_t += generated_headers
+potentially_conflicting_files_t += generated_backend_headers
+potentially_conflicting_files_t += generated_backend_sources
+potentially_conflicting_files_t += generated_sources
+
+potentially_conflicting_files = []
+
+# convert all sources of potentially conflicting files into uniform shape
+foreach t : potentially_conflicting_files_t
+  potentially_conflicting_files += t.full_path()
+endforeach
+foreach t : configure_files
+  t = '@0@'.format(t)
+  potentially_conflicting_files += meson.current_build_dir() / t
+endforeach
+foreach sub, fnames : generated_sources_ac
+  sub = meson.build_root() / sub
+  foreach fname : fnames
+    potentially_conflicting_files += sub / fname
+  endforeach
+endforeach
+
+# find and report conflicting files
+foreach build_path : potentially_conflicting_files
+  build_path = host_system == 'windows' ? fs.as_posix(build_path) : build_path
+  # str.replace is in 0.56
+  src_path = meson.current_source_dir() / build_path.split(meson.current_build_dir() / '')[1]
+  if fs.exists(src_path) or fs.is_symlink(src_path)
+    conflicting_files += src_path
+  endif
+endforeach
+# XXX: Perhaps we should generate a file that would clean these up? The list
+# can be long.
+if conflicting_files.length() > 0
+  errmsg_cleanup = '''
+Conflicting files in source directory:
+  @0@
+
+The conflicting files need to be removed, either by removing the files listed
+above, or by running configure and then make maintainer clean.
+'''
+  errmsg_cleanup = errmsg_cleanup.format(' '.join(conflicting_files))
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+  if host_system == 'windows'
+    if prefix.split(':\\').length() == 1
+      # just a drive
+      test_prefix = ''
+    else
+      test_prefix = prefix.split(':\\')[1]
+    endif
+  else
+    assert(prefix.startswith('/'))
+    test_prefix = './@0@'.format(prefix)
+  endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+meson_install_args = meson_args + ['install'] + {
+    'meson': ['--quiet', '--only-changed', '--no-rebuild'],
+    'muon': []
+}[meson_impl]
+
+test('tmp_install',
+    meson_bin, args: meson_install_args ,
+    env: {'DESTDIR':test_install_destdir},
+    priority: 100,
+    timeout: 300,
+    is_parallel: false,
+    suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport = 40000
+
+test_env = environment()
+
+temp_install_bindir = test_install_location / get_option('bindir')
+test_env.set('PG_REGRESS', pg_regress.full_path())
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA so it can be checked in individual tap tests.
+test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
+
+# Add the temporary installation to the library search path on platforms where
+# that works (everything but windows, basically). On windows everything
+# library-like gets installed into bindir, solving that issue.
+if library_path_var != ''
+  test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
+endif
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+foreach test : tests
+  test_default = {
+    'name': test['name'],
+    'sd': test['sd'],
+    'bd': test['bd'],
+  }
+  # Define all 'pg_regress' style tests
+  if 'regress' in test
+    t = test_default + test['regress']
+    test_command = [
+      t.get('test_runner', pg_regress).full_path(),
+      '--temp-instance', test_result_dir / t['name'] / 'regress' / 'tmp_check',
+      '--inputdir', t.get('inputdir', t['sd']),
+      '--expecteddir', t.get('expecteddir', t['sd']),
+      '--outputdir', test_result_dir / t['name'] / 'regress',
+      '--bindir', '',
+      '--dlpath', t['bd'],
+      '--max-concurrent-tests=20',
+      '--port=@0@'.format(testport),
+    ]
+
+    if t.has_key('regress_args')
+      test_command += t['regress_args']
+    endif
+
+    if t.has_key('schedule')
+      test_command += ['--schedule', t['schedule'],]
+    endif
+    if t.has_key('sql')
+      test_command += t['sql']
+    endif
+
+    env = test_env
+    env.prepend('PATH', temp_install_bindir, t['bd'])
+
+    test_kwargs = {
+      'suite': [t['name']],
+      'priority': 10,
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+      'args': [
+        testwrap.path(),
+        '--srcdir', t['sd'],
+        '--basedir', meson.build_root(),
+        '--testgroup', t['name'],
+        '--testname', 'regress',
+        '--', test_command,
+      ]
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    test(t['name'] / 'regress',
+      python,
+      kwargs: test_kwargs,
+    )
+
+    testport = testport + 1
+  endif
+
+  # Define all 'isolationtester' style tests
+  if 'isolation' in test
+    t = test_default + test['isolation']
+    test_command = [
+      pg_isolation_regress.full_path(),
+      '--temp-instance', test_result_dir / t['name'] / 'isolation' / 'tmp_check',
+      '--inputdir', t['sd'],
+      '--outputdir', test_result_dir / t['name'] / 'isolation',
+      '--bindir', '',
+      '--dlpath', t['bd'],
+      '--max-concurrent-tests=20',
+      '--port=@0@'.format(testport),
+    ]
+
+    if t.has_key('regress_args')
+      test_command += t['regress_args']
+    endif
+
+    if t.has_key('schedule')
+      test_command += ['--schedule', t['schedule'],]
+    else
+      test_command += t['specs']
+    endif
+
+    env = test_env
+    env.prepend('PATH', temp_install_bindir, t['bd'])
+
+    test_kwargs = {
+      'suite': [t['name']],
+      'priority': 20,
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+      'args': [
+        testwrap.path(),
+        '--srcdir', t['sd'],
+        '--basedir', meson.build_root(),
+        '--testgroup', t['name'],
+        '--testname', 'isolation',
+        '--', test_command,
+      ]
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    test(t['name'] / 'isolation',
+      python,
+      kwargs: test_kwargs,
+    )
+
+    testport = testport + 1
+  endif
+
+  # Define all 'tap' style tests
+  # FIXME: dependencies for each test
+  if tap_tests_enabled and 'tap' in test
+    t = test_default + test['tap']
+    test_command = [
+      perl.path(),
+      '-I', meson.source_root() / 'src/test/perl',
+      '-I', t['sd'],
+    ]
+
+    env = test_env
+
+    # Add temporary install, the build directory for non-installed binaries and
+    # also test/ for non-installed test binaries built separately.
+    env.prepend('PATH', temp_install_bindir, t['bd'], t['bd'] / 'test')
+
+    foreach name, value : t.get('env', {})
+      env.set(name, value)
+    endforeach
+
+    test_kwargs = {
+      'protocol': 'tap',
+      'suite': [t['name']],
+      'timeout': 1000,
+      'depends': test_deps + t.get('deps', []),
+      'env': env,
+    }
+
+    if t.has_key('test_kwargs')
+      test_kwargs += t['test_kwargs']
+    endif
+
+    foreach onetap : t['tests']
+      # Make tap test names prettier, remove t/ and .pl
+      onetap_p = onetap
+      if onetap_p.startswith('t/')
+        onetap_p = onetap.split('t/')[1]
+      endif
+      if onetap_p.endswith('.pl')
+        onetap_p = fs.stem(onetap_p)
+      endif
+
+      test(t['name'] / onetap_p,
+        python,
+        kwargs: test_kwargs,
+        args: [
+          testwrap.path(),
+          '--srcdir', t['sd'],
+          '--basedir', meson.build_root(),
+          '--testgroup', t['name'],
+          '--testname', onetap_p,
+          '--', test_command,
+          t['sd'] / onetap,
+        ]
+      )
+    endforeach
+  endif
+endforeach
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+  summary(
+    {
+      'data block size': cdata.get('BLCKSZ'),
+      'WAL block size': cdata.get('XLOG_BLCKSZ'),
+      'segment size': cdata.get('RELSEG_SIZE'),
+    },
+    section: 'Data layout',
+  )
+
+  summary(
+    {
+      'host system': '@0@ @1@'.format(host_system, host_cpu),
+      'build system': '@0@ @1@'.format(build_machine.system(),
+                                       build_machine.cpu_family()),
+    },
+    section: 'System',
+  )
+
+  summary(
+    {
+      'linker': '@0@'.format(cc.get_linker_id()),
+      'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+    },
+    section: 'Compiler',
+  )
+
+  summary(
+    {
+      'CPP FLAGS': ' '.join(cppflags),
+      'C FLAGS, functional': ' '.join(cflags),
+      'C FLAGS, warnings': ' '.join(cflags_warn),
+    },
+    section: 'Compiler Flags',
+  )
+
+  if llvm.found()
+    summary(
+      {
+        'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version()),
+      },
+      section: 'Compiler',
+    )
+
+    summary(
+      {
+        'C++ FLAGS, functional': ' '.join(cxxflags),
+        'C++ FLAGS, warnings': ' '.join(cxxflags_warn),
+      },
+      section: 'Compiler Flags',
+    )
+  endif
+
+  summary(
+    {
+      'bison': '@0@ @1@'.format(bison.full_path(), bison_version),
+      'dtrace': dtrace,
+    },
+    section: 'Programs',
+  )
+
+  summary(
+    {
+      'bonjour': bonjour,
+      'bsd_auth': bsd_auth,
+      'gss': gssapi,
+      'icu': icu,
+      'ldap': ldap,
+      'libxml': libxml,
+      'libxslt': libxslt,
+      'llvm': llvm,
+      'lz4': lz4,
+      'nls': libintl,
+      'pam': pam,
+      'plperl': perl_dep,
+      'plpython': python3_dep,
+      'pltcl': tcl_dep,
+      'readline': readline,
+      'selinux': selinux,
+      'ssl': ssl,
+      'systemd': systemd,
+      'uuid': uuid,
+      'zlib': zlib,
+      'zstd': zstd,
+    },
+    section: 'External libraries',
+  )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..f59b045a029
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,176 @@
+# Data layout influencing options
+
+option('blocksize', type : 'combo', choices : ['1', '2', '4', '8', '16', '32'], value : '8',
+  description: 'set relation block size in kB')
+
+option('wal_blocksize', type : 'integer', value : 8,
+  description : '''WAL block size, in kilobytes.
+This is the unit of storage and I/O within the WAL log. The default, 8 kilobytes, is suitable for most situations; but other values may be useful in special cases. The value must be a power of 2 between 1 and 64 (kilobytes). Note that changing this value requires an initdb.''')
+
+option('segsize', type : 'integer', value : 1,
+  description : '''Segment size, in gigabytes.
+Large tables are divided into multiple operating-system files, each of size equal to the segment size. This avoids problems with file size limits that exist on many platforms. The default segment size, 1 gigabyte, is safe on all supported platforms. If your operating system has "largefile" support (which most do, nowadays), you can use a larger segment size. This can be helpful to reduce the number of file descriptors consumed when working with very large tables. But be careful not to select a value larger than is supported by your platform and the file systems you intend to use. Other tools you might wish to use, such as tar, could also set limits on the usable file size. It is recommended, though not absolutely required, that this value be a power of 2. Note that changing this value requires an initdb.''')
+
+
+# Miscellaneous options
+
+option('krb_srvnam', type : 'string', value : 'postgres',
+  description : '''The default name of the Kerberos service principal used by GSSAPI.
+postgres is the default. There's usually no reason to change this unless you are building for a Windows environment, in which case it must be set to upper case POSTGRES''')
+
+option('system_tzdata', type: 'string', value: '',
+  description: 'use system time zone data in specified directory')
+
+
+# Defaults
+
+option('pgport', type : 'string', value : '5432',
+  description : '''Default port number for server and clients.
+The default is 5432. The port can always be changed later on, but if you specify it here then both server and clients will have the same default compiled in, which can be very convenient. Usually the only good reason to select a non-default value is if you intend to run multiple PostgreSQL servers on the same machine.''')
+
+
+# Developer options
+
+option('cassert', type : 'boolean', value: false,
+  description: 'enable assertion checks (for debugging)')
+
+option('tap_tests', type : 'feature', value : 'auto',
+  description : 'Whether to enable tap tests')
+
+option('PG_TEST_EXTRA', type : 'string', value: 'kerberos ldap ssl',
+  description: 'Enable selected extra tests')
+
+option('atomics', type : 'boolean', value: true,
+  description: 'whether to use atomic operations')
+
+option('spinlocks', type : 'boolean', value: true,
+  description: 'whether to use spinlocks')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for headers')
+
+option('extra_lib_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for libs')
+
+option('extra_version', type : 'string', value: '',
+  description: 'append STRING to the PostgreSQL version number')
+
+option('darwin_sysroot', type : 'string', value: '',
+  description: 'select a non-default sysroot path')
+
+
+# External dependencies
+
+option('bonjour', type : 'feature', value: 'auto',
+  description: 'build with Bonjour support')
+
+option('bsd_auth', type : 'feature', value: 'auto',
+  description: 'build with BSD Authentication support')
+
+option('dtrace', type : 'feature', value: 'disabled',
+  description: 'DTrace support')
+
+option('gssapi', type : 'feature', value: 'auto',
+  description: 'GSSAPI support')
+
+option('icu', type : 'feature', value: 'auto',
+  description: 'ICU support')
+
+option('ldap', type : 'feature', value: 'auto',
+  description: 'LDAP support')
+
+option('libedit_preferred', type : 'boolean', value: false,
+  description: 'Prefer BSD Libedit over GNU Readline')
+
+option('libxml', type : 'feature', value: 'auto',
+  description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+  description: 'XSLT support in contrib/xml2')
+
+option('llvm', type : 'feature', value: 'disabled',
+  description: 'whether to use llvm')
+
+option('lz4', type : 'feature', value: 'auto',
+  description: 'LZ4 support')
+
+option('nls', type: 'feature', value: 'auto',
+  description: 'native language support')
+
+option('pam', type : 'feature', value: 'auto',
+  description: 'build with PAM support')
+
+option('plperl', type : 'feature', value: 'auto',
+  description: 'build Perl modules (PL/Perl)')
+
+option('plpython', type : 'feature', value: 'auto',
+  description: 'build Python modules (PL/Python)')
+
+option('pltcl', type : 'feature', value: 'auto',
+  description: 'build with TCL support')
+
+option('tcl_version', type : 'string', value : 'tcl',
+  description: 'specify TCL version')
+
+option('readline', type : 'feature', value : 'auto',
+  description: 'use GNU Readline or BSD Libedit for editing')
+
+option('selinux', type : 'feature', value : 'disabled',
+  description: 'build with SELinux support')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'], value : 'none',
+  description: 'use LIB for SSL/TLS support (openssl)')
+
+option('systemd', type : 'feature', value: 'auto',
+  description: 'build with systemd support')
+
+option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'], value : 'none',
+  description: 'build contrib/uuid-ossp using LIB')
+
+option('zlib', type : 'feature', value: 'auto',
+  description: 'whether to use zlib')
+
+option('zstd', type : 'feature', value: 'auto',
+  description: 'whether to use zstd')
+
+
+# Programs
+
+option('BISON', type : 'string', value: 'bison',
+  description: 'path to bison binary')
+
+option('DTRACE', type : 'string', value: 'dtrace',
+  description: 'path to dtrace binary')
+
+option('FLEX', type : 'string', value: 'flex',
+  description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+  description: 'path to gzip binary')
+
+option('LZ4', type : 'string', value: 'lz4',
+  description: 'path to lz4 binary')
+
+option('PERL', type : 'string', value: 'perl',
+  description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+  description: 'path to prove binary')
+
+option('PYTHON', type : 'array', value: ['python3', 'python'],
+  description: 'path to python binary')
+
+option('SED', type : 'string', value: 'gsed',
+  description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+  description: 'path to tar binary')
+
+option('ZSTD', type : 'string', value: 'zstd',
+  description: 'path to zstd binary')
+
+option('ZIC', type : 'string', value: 'zic',
+  description: 'path to zic binary, when cross-compiling')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..a7fdd5a13ed
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,12 @@
+# libraries that other subsystems might depend uppon first, in their
+# respective dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
+
+subdir('interfaces')
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..e00b8e15b4b
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,53 @@
+# files to build into backend
+timezone_sources = files(
+  'localtime.c',
+  'pgtz.c',
+  'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+   'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+  'data/tzdata.zi'
+)
+
+
+if get_option('system_tzdata') == ''
+  # FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+  # build our zic. But for that we'd need to run a good chunk of the configure
+  # tests both natively and cross. Unclear if it's worth it.
+  if meson.is_cross_build()
+    zic = find_program(get_option('ZIC'), native: true, required: true)
+  else
+    zic = executable('zic', zic_sources,
+                     dependencies: [frontend_code],
+                     kwargs: default_bin_args + {'install': false}
+                    )
+  endif
+
+  tzdata = custom_target('tzdata',
+    input: tzdata,
+    output: ['timezone'],
+    command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+    install: true,
+    install_dir: dir_data,
+  )
+
+# FIXME: make sorts this - but the file isn't actually used, so ...
+abbrevs_txt = custom_target('abbrevs.txt',
+  input: tzdata,
+  output: ['abbrevs.txt'],
+  command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+  capture: true)
+endif
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..7e0a682bd9e
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,21 @@
+tznames = files(
+  'Africa.txt',
+  'America.txt',
+  'Antarctica.txt',
+  'Asia.txt',
+  'Atlantic.txt',
+  'Australia.txt',
+  'Etc.txt',
+  'Europe.txt',
+  'Indian.txt',
+  'Pacific.txt',
+)
+
+tznames_sets = files(
+  'Default',
+  'Australia',
+  'India')
+
+install_data(tznames, tznames_sets,
+  install_dir: dir_data / 'timezonesets',
+)
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..583ec7e6f68
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+
+import os
+import shlex
+import sys
+
+to_print = []
+
+if 'MUON_PATH' in os.environ:
+    to_print += ['muon', os.environ['MUON_PATH']]
+else:
+    mesonintrospect = os.environ['MESONINTROSPECT']
+    components = shlex.split(mesonintrospect)
+
+    if len(components) < 2:
+        print('expected more than two components, got: %s' % components)
+        sys.exit(1)
+
+    if components[-1] != 'introspect':
+        print('expected introspection at the end')
+        sys.exit(1)
+
+    to_print += ['meson'] + components[:-1]
+
+print('\n'.join(to_print), end='')
+
+sys.exit(0)
diff --git a/src/tools/pgflex b/src/tools/pgflex
new file mode 100755
index 00000000000..13d73d50cb4
--- /dev/null
+++ b/src/tools/pgflex
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--flex', dest='flex_command', help='flex executable to run', type=str)
+parser.add_argument('--perl', dest='perl_command', help='perl executable to run', type=str)
+parser.add_argument('--builddir', dest='builddir', help='build directory of meson build', type=str)
+parser.add_argument('--privatedir', dest='privatedir', help='temporary directory to avoid conflicts', type=str)
+parser.add_argument('--fix_warning_script', dest='fix_warning_script', help='script for fixing warnings', default='')
+parser.add_argument('-b', dest='no_backup', action='store_true', help='whether no_backup is enabled or not')
+parser.add_argument('-o', dest='output_file', help='output file')
+parser.add_argument('--stamp_header', dest='stamp_header', help='', default=None)
+
+args, rest = parser.parse_known_args()
+rest, input_file = rest[:-1], rest[-1]
+
+# since 'lex.backup' is always named that,
+# change working directory to temporary directory
+# to avoid conflicts
+os.chdir(os.path.dirname(args.privatedir))
+
+# make paths absolute if it is not absolute,
+# msbuild uses absolute paths as default
+args.output_file = args.output_file if os.path.isabs(args.output_file) else os.path.join(args.builddir, args.output_file)
+input_file = input_file if os.path.isabs(input_file) else os.path.join(args.builddir, input_file)
+
+# set flex flags
+if args.no_backup:
+  flex_flags = ['-o', args.output_file, '-b'] + rest + [input_file]
+else:
+  flex_flags = ['-o', args.output_file] + rest + [input_file]
+
+# create .c file from .l file
+command = [args.flex_command] + flex_flags
+subprocess.run(command, check=True)
+
+ # check lex.backup
+if args.no_backup:
+  with open('lex.backup') as lex:
+    if sum(1 for _ in lex) != 1:
+      sys.exit('Scanner requires backup; see lex.backup.')
+  os.remove('lex.backup')
+
+# fix warnings
+if args.fix_warning_script:
+  # make paths absolute if it is not absolute
+  args.fix_warning_script = args.fix_warning_script if os.path.isabs(args.fix_warning_script) else os.path.join(args.builddir, args.fix_warning_script)
+
+  command = [args.perl_command, args.fix_warning_script, args.output_file]
+  subprocess.run(command, check=True)
+
+#
+stamp_header = args.stamp_header
+if stamp_header != None:
+    if not os.path.isabs(stamp_header):
+        stamp_header = os.path.join(args.builddir, stamp_header)
+    with open(stamp_header, mode='w') as fh:
+        pass
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..ab35e952959
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('INPUT', type=argparse.FileType('r'))
+parser.add_argument('-o', '--output', type=argparse.FileType('w'), required=True)
+parser.add_argument('--depfile', type=argparse.FileType('w'), required=False)
+
+parser.add_argument('--FILEDESC', type=str, required=True)
+parser.add_argument('--NAME', type=str, required=True)
+parser.add_argument('--VFT_TYPE', type=str, required=True)
+parser.add_argument('--FILEENDING', type=str, required=True)
+parser.add_argument('--ICO', type=str)
+
+
+args = parser.parse_args()
+
+data = args.INPUT.read()
+
+data = data.replace('@FILEDESC@', args.FILEDESC)
+data = data.replace('@NAME@', args.NAME)
+data = data.replace('@VFT_TYPE@', args.VFT_TYPE)
+data = data.replace('@FILEENDING@', args.FILEENDING)
+
+if args.ICO:
+   data = data.replace('@ICO@', args.ICO)
+   if args.depfile:
+       args.depfile.write("{0} : {1}\n".format(args.INPUT.name, args.ICO))
+else:
+   data = data.replace("IDI_ICON ICON \"@ICO@\"\n", '')
+
+args.output.write(data)
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..8e0a96db7d1
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+
+import argparse
+import shutil
+import subprocess
+import os
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--srcdir', help='source directory of test', type=str)
+parser.add_argument('--basedir', help='base directory of test', type=str)
+parser.add_argument('--testgroup', help='test group', type=str)
+parser.add_argument('--testname', help='test name', type=str)
+parser.add_argument('test_command', nargs='*')
+
+args = parser.parse_args()
+
+testdir = '{}/testrun/{}/{}'.format(args.basedir, args.testgroup, args.testname)
+
+print('# executing test in {} group {} test {}'
+  .format(testdir, args.testgroup, args.testname))
+sys.stdout.flush()
+
+if os.path.exists(testdir) and os.path.isdir(testdir):
+  shutil.rmtree(testdir)
+os.makedirs(testdir)
+
+os.chdir(args.srcdir)
+
+# mark test as having started
+open(os.path.join(testdir, 'test.start'), 'x')
+
+env_dict = {**os.environ,
+            'TESTDATADIR': os.path.join(testdir, 'data'),
+            'TESTLOGDIR': os.path.join(testdir, 'log'),}
+
+sp = subprocess.run(args.test_command, env=env_dict)
+
+if (sp.returncode == 0):
+    print('# test succeeded')
+    open(os.path.join(testdir, 'test.success'), 'x')
+else:
+    print('# test failed')
+    open(os.path.join(testdir, 'test.fail'), 'x')
+sys.exit(sp.returncode)
-- 
2.37.0.3.g30cc8d0f14

v12-0009-meson-ci-Build-both-with-meson-and-as-before.patchtext/x-diff; charset=us-asciiDownload
From cd193eb3e8e2677bddb6dec13517c60cf9c3ee5c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Apr 2022 12:08:09 -0700
Subject: [PATCH v12 09/15] meson: ci: Build both with meson and as before

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Justin Pryzby <pryzby@telsasoft.com>
---
 .cirrus.yml                                   | 837 +++++++++++++++++-
 src/tools/ci/docker/linux_centos7             |  57 ++
 src/tools/ci/docker/linux_centos8             |  54 ++
 src/tools/ci/docker/linux_fedora_rawhide      |  49 +
 src/tools/ci/docker/linux_opensuse_tumbleweed |  56 ++
 5 files changed, 1007 insertions(+), 46 deletions(-)
 create mode 100644 src/tools/ci/docker/linux_centos7
 create mode 100644 src/tools/ci/docker/linux_centos8
 create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
 create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed

diff --git a/.cirrus.yml b/.cirrus.yml
index 81eb8a9996d..37fc5b551ec 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -22,13 +22,14 @@ env:
   CHECK: check-world PROVE_FLAGS=$PROVE_FLAGS
   CHECKFLAGS: -Otarget
   PROVE_FLAGS: --timer
+  MTEST_ARGS: --print-errorlogs --no-rebuild -C build
   PGCTLTIMEOUT: 120 # avoids spurious failures during parallel tests
   TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/src/tools/ci/pg_ci_base.conf
   PG_TEST_EXTRA: kerberos ldap ssl
 
 
 # What files to preserve in case tests fail
-on_failure: &on_failure
+on_failure_ac: &on_failure_ac
   log_artifacts:
     paths:
       - "**/*.log"
@@ -36,9 +37,41 @@ on_failure: &on_failure
       - "**/regress_log_*"
     type: text/plain
 
-task:
-  name: FreeBSD - 13
+on_failure_meson: &on_failure_meson
+  testrun_artifacts:
+    paths:
+      - "build/testrun/**/*.log"
+      - "build/testrun/**/*.diffs"
+      - "build/testrun/**/regress_log_*"
+    type: text/plain
 
+  # In theory it'd be nice to upload the junit files meson generates, so that
+  # cirrus will nicely annotate the commit. Unfortunately the files don't
+  # contain identifyable file + line numbers right now, so the annotations
+  # don't end up useful. We could probably improve on that with a some custom
+  # conversion script, but ...
+  meson_log_artifacts:
+    path: "build/meson-logs/*.txt"
+    type: text/plain
+
+
+# configure feature flags, shared between the task running the BSD tests
+# these feature flags don't include --with-gssapi and --with-uuid=bsd
+# since these are not working on openBSD and netBSD
+BSD_CONFIGURE_FEATURES: &BSD_CONFIGURE_FEATURES >-
+  --with-icu
+  --with-ldap
+  --with-libxml
+  --with-libxslt
+  --with-lz4
+  --with-pam
+  --with-perl
+  --with-python
+  --with-ssl=openssl
+  --with-tcl --with-tclconfig=${TCL_CONFIG_PATH}
+
+
+freebsd_template: &freebsd_template
   env:
     # FreeBSD on GCP is slow when running with larger number of CPUS /
     # jobs. Using one more job than cpus seems to work best.
@@ -48,6 +81,12 @@ task:
 
     CCACHE_DIR: /tmp/ccache_dir
 
+    TCL_CONFIG_PATH: /usr/local/lib/tcl8.6/
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
 
   compute_engine_instance:
@@ -80,6 +119,13 @@ task:
   setup_additional_packages_script: |
     #pkg install -y ...
 
+
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Autoconf
+  trigger_type: manual
+
   # NB: Intentionally build without --with-llvm. The freebsd image size is
   # already large enough to make VM startup slow, and even without llvm
   # freebsd already takes longer than other platforms except for windows.
@@ -90,16 +136,7 @@ task:
         --enable-nls \
         \
         --with-gssapi \
-        --with-icu \
-        --with-ldap \
-        --with-libxml \
-        --with-libxslt \
-        --with-lz4 \
-        --with-pam \
-        --with-perl \
-        --with-python \
-        --with-ssl=openssl \
-        --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+        ${BSD_CONFIGURE_FEATURES} \
         --with-uuid=bsd \
         --with-zstd \
         \
@@ -107,8 +144,7 @@ task:
         --with-libs=/usr/local/lib \
         \
         CC="ccache cc" \
-        CXX="ccache c++" \
-        CFLAGS="-Og -ggdb"
+        CXX="ccache c++"
     EOF
   build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
   upload_caches: ccache
@@ -117,14 +153,274 @@ task:
   # platforms without support for locking pipes. See also
   # https://savannah.gnu.org/bugs/?60774
   # script uses pseudo-ttys, which do support locking.
-  test_world_script:
-    - su postgres -c "time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}"
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
+    EOF
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
 
 
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=bsd -Dtcl_version=tcl86 -Ddtrace=auto build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+    cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
+
+
+netbsd_template: &netbsd_template
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+    TCL_CONFIG_PATH: /usr/pkg/lib
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/pg-ci-netbsd-9-postgres
+    platform: netbsd
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:users /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:users ${CCACHE_DIR}
+
+
+task:
+  <<: *netbsd_template
+
+  name: NetBSD - 9 - Autoconf
+  trigger_type: manual
+
+  # --with-uuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+        --enable-cassert --enable-debug --enable-tap-tests \
+        --enable-nls \
+        \
+        ${BSD_CONFIGURE_FEATURES} \
+        \
+        --with-includes=/usr/pkg/include --with-libs=/usr/pgk/lib \
+        CC="ccache cc" \
+        CXX="ccache c++" \
+        LDFLAGS="-Wl,-R/usr/pkg/lib" \
+        \
+        PYTHON=python3.9
+    EOF
+  build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *netbsd_template
+
+  name: NetBSD - 9 - Meson
+
+  # -Duuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres  <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl \
+        -Dextra_lib_dirs=/usr/pkg/lib -Dextra_include_dirs=/usr/pkg/include \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+openbsd_template: &openbsd_template
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+    TCL_CONFIG_PATH: /usr/local/lib/tcl/tcl8.6/
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/pg-ci-openbsd-7-postgres
+    platform: openbsd
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:postgres /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+
+
+task:
+  <<: *openbsd_template
+
+  name: OpenBSD - 7 - Autoconf
+  trigger_type: manual
+
+  # --with-uuid option is set to 'e2fs' since 'bsd' uuid option
+  # is not working on openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # (same error applies for openBSD)
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+        --enable-cassert --enable-debug --enable-tap-tests \
+        --enable-nls \
+        \
+        ${BSD_CONFIGURE_FEATURES} \
+        --with-uuid=e2fs \
+        \
+        --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+        CC="ccache cc" \
+        CXX="ccache c++" \
+        LDFLAGS="-Wl,-R/usr/local/lib"
+    EOF
+  build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *openbsd_template
+
+  name: OpenBSD - 7 - Meson
+
+  # -Duuid option is set to 'e2fs' since 'bsd' uuid option
+  # is not working on openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # (same error applies for openBSD)
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl -Duuid=e2fs \
+        -Dextra_include_dirs=/usr/local/include -Dextra_lib_dirs=/usr/local/lib \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 # configure feature flags, shared between the task running the linux tests and
 # the CompilerWarnings task
 LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -141,14 +437,28 @@ LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
   --with-selinux
   --with-ssl=openssl
   --with-systemd
-  --with-tcl --with-tclconfig=/usr/lib/tcl8.6/
-  --with-uuid=ossp
+  --with-tcl --with-tclconfig=${TCL_DIR:/usr/lib/tcl8.6/}
+  --with-uuid=${UUID:ossp}
   --with-zstd
 
 
-task:
-  name: Linux - Debian Bullseye
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+  sysinfo_script: |
+    id
+    uname -a
+    cat /proc/cmdline
+    ulimit -a -H && ulimit -a -S
+    export
+  create_user_script: |
+    useradd -m -U postgres
+    chown -R postgres:postgres .
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+    su postgres -c "ulimit -l -H && ulimit -l -S"
 
+
+linux_debian_template: &linux_debian_template
   env:
     CPUS: 4
     BUILD_JOBS: 4
@@ -157,6 +467,9 @@ task:
     CCACHE_DIR: /tmp/ccache_dir
     DEBUGINFOD_URLS: "https://debuginfod.debian.net"
 
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
     LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
 
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
@@ -171,19 +484,9 @@ task:
   ccache_cache:
     folder: ${CCACHE_DIR}
 
-  sysinfo_script: |
-    id
-    uname -a
-    cat /proc/cmdline
-    ulimit -a -H && ulimit -a -S
-    export
-  create_user_script: |
-    useradd -m postgres
-    chown -R postgres:postgres .
-    mkdir -p ${CCACHE_DIR}
-    chown -R postgres:postgres ${CCACHE_DIR}
+  set_limits_script: |
     echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
-    su postgres -c "ulimit -l -H && ulimit -l -S"
+  <<: *linux_preparation_scripts_template
   setup_core_files_script: |
     mkdir -m 770 /tmp/cores
     chown root:postgres /tmp/cores
@@ -192,6 +495,12 @@ task:
     #apt-get update
     #DEBIAN_FRONTEND=noninteractive apt-get -y install ...
 
+
+task:
+  <<: *linux_debian_template
+
+  name: Linux - Debian Bullseye - Autoconf
+
   configure_script: |
     su postgres <<-EOF
       ./configure \
@@ -202,9 +511,7 @@ task:
         \
         CC="ccache gcc" \
         CXX="ccache g++" \
-        CLANG="ccache clang" \
-        CFLAGS="-Og -ggdb" \
-        CXXFLAGS="-Og -ggdb"
+        CLANG="ccache clang"
     EOF
   build_script: su postgres -c "make -s -j${BUILD_JOBS} world-bin"
   upload_caches: ccache
@@ -216,13 +523,353 @@ task:
     EOF
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
+    cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
+
+
+task: &linux_debian_bullseye_meson
+  <<: *linux_debian_template
+
+  name: Linux - Debian Bullseye - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Ddtrace=enabled build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
     cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
 
 
 task:
-  name: macOS - Monterey
+  <<: *linux_debian_bullseye_meson
 
+  name: Linux - Debian Sid - Meson
+  trigger_type: manual
+
+  compute_engine_instance:
+    image: family/pg-ci-sid
+
+
+linux_opensuse_template: &linux_opensuse_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: "https://debuginfod.opensuse.org/"
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: src/tools/ci/docker/linux_opensuse_tumbleweed
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" && \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Dllvm=enabled build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+linux_rhel_template: &linux_rhel_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: ${DEBUGINFO}
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: ${DOCKERFILE_PATH}
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      PYTHON=python3 \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-gssapi \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-selinux \
+      --with-ssl=openssl \
+      --with-systemd \
+      --with-tcl --with-tclconfig=/usr/lib64/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+macos_template: &macos_template
   env:
     CPUS: 12 # always get that much for cirrusci macOS instances
     BUILD_JOBS: $CPUS
@@ -233,6 +880,9 @@ task:
     HOMEBREW_CACHE: ${HOME}/homebrew-cache
     PERL5LIB: ${HOME}/perl5/lib/perl5
 
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
 
   osx_instance:
@@ -269,6 +919,7 @@ task:
       llvm \
       lz4 \
       make \
+      meson \
       openldap \
       openssl \
       python \
@@ -280,6 +931,14 @@ task:
 
   ccache_cache:
     folder: $CCACHE_DIR
+
+
+task:
+  <<: *macos_template
+
+  name: macOS - Monterey - Autoconf
+  trigger_type: manual
+
   configure_script: |
     brewpath="/usr/local"
     INCLUDES="${brewpath}/include:${INCLUDES}"
@@ -319,8 +978,6 @@ task:
       CC="ccache cc" \
       CXX="ccache c++" \
       CLANG="ccache ${brewpath}/llvm/bin/ccache" \
-      CFLAGS="-Og -ggdb" \
-      CXXFLAGS="-Og -ggdb" \
       \
       LLVM_CONFIG=${brewpath}/llvm/bin/llvm-config \
       PYTHON=python3
@@ -334,13 +991,42 @@ task:
     script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
     cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
 
 
 task:
-  name: Windows - Server 2019, VS 2019
+  <<: *macos_template
 
+  name: macOS - Monterey - Meson
+
+  configure_script: |
+    brewpath="/usr/local"
+    PKG_CONFIG_PATH="${brewpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+
+    for pkg in icu4c krb5 openldap openssl ; do
+      pkgpath="${brewpath}/opt/${pkg}"
+      PKG_CONFIG_PATH="${pkgpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+    done
+
+    export PKG_CONFIG_PATH
+
+    meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs  -Ddtrace=auto build
+
+  build_script: ninja -C build -j${BUILD_JOBS}
+  upload_caches: ccache
+
+  tests_world_script:
+    - ulimit -c unlimited
+    - ulimit -n 1024
+    - meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+
+  on_failure:
+    <<: *on_failure_meson
+    cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
+
+
+windows_template: &windows_template
   env:
     # Half the allowed per-user CPU cores
     CPUS: 4
@@ -402,6 +1088,11 @@ task:
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
 
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Homegrown
+
   configure_script:
     # copy errors out when using forward slashes
     - copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl
@@ -451,10 +1142,63 @@ task:
     %T_C% perl vcregress.pl ecpgcheck
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+  meson_install_wraps_script:
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+
+  configure_script:
+    - vcvarsall x64
+    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - ninja -C build
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test %MTEST_ARGS% --num-processes 10
+
+  on_failure:
+    <<: *on_failure_meson
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+  meson_install_wraps_script:
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+
+  configure_script:
+    - vcvarsall x64
+    - meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - msbuild %MSBFLAGS% build\postgresql.sln
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test %MTEST_ARGS% --num-processes 10
+
+  on_failure:
+    <<: *on_failure_meson
     crashlog_artifacts:
       path: "crashlog-*.txt"
-      type: text/plain
 
 
 task:
@@ -462,7 +1206,8 @@ task:
 
   # To limit unnecessary work only run this once the normal linux test succeeds
   depends_on:
-    - Linux - Debian Bullseye
+    - Linux - Debian Bullseye - Meson
+  trigger_type: manual
 
   env:
     CPUS: 4
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+  yum -y install dnf-plugins-core \
+  epel-release \
+  centos-release-scl-rh && \
+  \
+  yum -y update && \
+  yum -y install \
+  \
+  git \
+  perl \
+  perl-ExtUtils-Embed \
+  perl-IPC-Run \
+  perl-Test-Harness \
+  perl-Test-Simple \
+  \
+  bison \
+  ccache \
+  clang \
+  devtoolset-7-make \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  && \
+  pip3 install meson && \
+  pip3 install ninja && \
+  yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+  dnf -y install dnf-plugins-core && \
+  dnf config-manager --set-enabled powertools && \
+  dnf -y install epel-release && \
+  dnf -y update && \
+  dnf -y install \
+  \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  diffutils \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  glibc-langpack-en \
+  \
+  && \
+  pip3 install ninja && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+  dnf -y update && \
+  dnf -y install \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gettext \
+  ninja-build \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  langpacks-en \
+  glibc-langpack-en \
+  \
+  && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+  zypper -n clean -a && \
+  zypper -n ref && \
+  zypper -n dup && \
+  zypper -n update && \
+  zypper -n install \
+  diffutils \
+  git \
+  icu \
+  make \
+  meson \
+  perl-IPC-Run \
+  shadow \
+  systemd-devel \
+  util-linux \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gcc-c++ \
+  gettext-runtime \
+  ninja \
+  \
+  krb5-devel \
+  libicu-devel \
+  libldapcpp-devel \
+  liblz4-devel \
+  libopenssl-devel \
+  libselinux-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  pam-devel \
+  python38-devel \
+  readline-devel \
+  tcl-devel \
+  \
+  openldap2 \
+  openldap2-client \
+  \
+  krb5-client \
+  krb5-plugin-kdb-ldap \
+  krb5-server \
+  lz4 \
+  zstd \
+  \
+  && \
+  zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
-- 
2.37.0.3.g30cc8d0f14

v12-0010-meson-Add-support-for-relative-rpaths-fixing-tes.patchtext/x-diff; charset=us-asciiDownload
From c72b9be118c6b5ac2c1c768389da4936d05fe504 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 10:23:01 -0700
Subject: [PATCH v12 10/15] meson: Add support for relative rpaths, fixing
 tests on MacOS w/ SIP

---
 meson.build                                   | 50 +++++++++--
 .../relativize_shared_library_references      | 84 +++++++++++++++++++
 src/tools/relpath.py                          |  6 ++
 3 files changed, 135 insertions(+), 5 deletions(-)
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py

diff --git a/meson.build b/meson.build
index f1ecf685f14..e64054b1c56 100644
--- a/meson.build
+++ b/meson.build
@@ -152,6 +152,7 @@ portname = host_system
 
 exesuffix = '' # overridden below where necessary
 dlsuffix = '.so' # overridden below where necessary
+rpath_origin = '$ORIGIN'
 library_path_var = 'LD_LIBRARY_PATH'
 
 export_file_format = 'gnu'
@@ -192,6 +193,7 @@ if host_system == 'aix'
 elif host_system == 'darwin'
   dlsuffix = '.dylib'
   ld_library_path_var = 'DYLD_LIBRARY_PATH'
+  rpath_origin = '@loader_path'
 
   export_file_format = 'darwin'
   export_fmt = '-exported_symbols_list=@0@'
@@ -211,6 +213,7 @@ elif host_system == 'windows'
   exesuffix = '.exe'
   dlsuffix = '.dll'
   ld_library_path_var = ''
+  rpath_origin = ''
 
   export_file_format = 'win'
   export_file_suffix = 'def'
@@ -261,7 +264,17 @@ elif host_system == 'linux'
 elif host_system == 'cygwin'
   cppflags += '-D_GNU_SOURCE'
 
-elif host_system in ['freebsd', 'netbsd', 'openbsd']
+elif host_system == 'openbsd'
+  # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+  # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+  # when invoked via PATH search).
+  rpath_origin = ''
+elif host_system == 'netbsd'
+  # netbsd patched their meson in a broken way:
+  # https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=56959
+  # until there's a way out of that, disable rpath_origin
+  rpath_origin = ''
+elif host_system == 'freebsd'
   # you're ok
 else
   # XXX: Should we add an option to override the host_system as an escape
@@ -2394,6 +2407,26 @@ bin_install_rpaths = []
 lib_install_rpaths = []
 mod_install_rpaths = []
 
+
+# If the host can form relative rpaths, use that to make the installation
+# properly relocatable
+if rpath_origin != ''
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_bin, dir_lib, check: true).stdout().strip()
+  bin_install_rpaths += rpath_origin / bin_to_lib
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_lib_pkg, dir_lib, check: true).stdout().strip()
+  mod_install_rpaths += rpath_origin / mod_to_lib
+
+  test_use_library_path_var = false
+else
+  test_use_library_path_var = true
+endif
+
 # add extra_lib_dirs to rpath
 bin_install_rpaths += postgres_lib_d
 lib_install_rpaths += postgres_lib_d
@@ -2650,6 +2683,14 @@ above, or by running configure and then make maintainer clean.
 endif
 
 
+# To make MacOS installation work without a prior make install, even with SIP
+# enabled, make rpaths relative after installation. This also makes the
+# installation relocatable.
+if host_system == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
 
 ###############################################################
 # Test prep
@@ -2715,10 +2756,9 @@ test_env.set('REGRESS_SHLIB', regress_module.full_path())
 # Export PG_TEST_EXTRA so it can be checked in individual tap tests.
 test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
 
-# Add the temporary installation to the library search path on platforms where
-# that works (everything but windows, basically). On windows everything
-# library-like gets installed into bindir, solving that issue.
-if library_path_var != ''
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if test_use_library_path_var and library_path_var != ''
   test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
 endif
 
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..db6431639f1
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import shlex
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    targets = json.load(open(os.path.join(build_root, 'meson-info', 'intro-targets.json')))
+    installed = json.load(open(os.path.join(build_root, 'meson-info', 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            #print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            subprocess.check_call(install_name_tool + ['-change', lib, newref, patchpath])
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}', file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
-- 
2.37.0.3.g30cc8d0f14

v12-0011-meson-Add-docs-for-building-with-meson.patchtext/x-diff; charset=us-asciiDownload
From c5314e0b53df6c044bb1d79a0c542bbcf37afa22 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:55:20 -0700
Subject: [PATCH v12 11/15] meson: Add docs for building with meson

Author: Samay Sharma <smilingsamay@gmail.com>
---
 doc/src/sgml/filelist.sgml           |    1 +
 doc/src/sgml/installation-meson.sgml | 1692 ++++++++++++++++++++++++++
 doc/src/sgml/postgres.sgml           |    1 +
 3 files changed, 1694 insertions(+)
 create mode 100644 doc/src/sgml/installation-meson.sgml

diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index de450cd6619..0535c92c16d 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -38,6 +38,7 @@
 <!ENTITY high-availability      SYSTEM "high-availability.sgml">
 <!ENTITY installbin    SYSTEM "install-binaries.sgml">
 <!ENTITY installation  SYSTEM "installation.sgml">
+<!ENTITY installation-meson     SYSTEM "installation-meson.sgml">
 <!ENTITY installw      SYSTEM "install-windows.sgml">
 <!ENTITY maintenance   SYSTEM "maintenance.sgml">
 <!ENTITY manage-ag     SYSTEM "manage-ag.sgml">
diff --git a/doc/src/sgml/installation-meson.sgml b/doc/src/sgml/installation-meson.sgml
new file mode 100644
index 00000000000..b18a69309f5
--- /dev/null
+++ b/doc/src/sgml/installation-meson.sgml
@@ -0,0 +1,1692 @@
+<!-- doc/src/sgml/installation-meson.sgml -->
+<!--
+
+The standalone version has some portions that are different from the version
+that is integrated into the full documentation set, in particular as regards
+links, so that INSTALL.html can be created without links to the main
+documentation.  See standalone-profile.xsl for details.
+
+-->
+
+<chapter id="installation-meson">
+ <title>Installation from Source Code with Meson</title>
+
+ <indexterm zone="installation">
+  <primary>installation</primary>
+ </indexterm>
+
+ <para>
+  This chapter describes the building and installation of
+  <productname>PostgreSQL</productname> from the source code
+  using meson.  If you are installing a pre-packaged distribution,
+  such as an RPM or Debian package, ignore this chapter
+  and see <xref linkend="install-binaries" />. If you want to use
+  <acronym>GNU</acronym> <application>make</application> to build
+  <productname>PostgreSQL</productname> from source, you can refer to
+  <xref linkend="installation" /> instead.
+ </para>
+
+ <sect1 id="install-short-meson">
+  <title>Short Version</title>
+
+  <para>
+<synopsis>
+
+# create working directory
+mkdir postgres
+cd postgres
+
+# fetch source code
+# git clone https://git.postgresql.org/git/postgresql.git src
+
+# current instructions for testing (to be removed when merging)
+git clone -b meson https://github.com/anarazel/postgres.git src
+
+# setup and enter build directory (done only first time)
+meson setup build src --prefix=$PWD/install
+cd build
+
+# Compile source
+ninja
+
+# Install to the prefix directory specified above
+ninja install
+
+# Run all tests (optional, takes time)
+meson test
+
+# Initialize a new database
+../install/bin/initdb -D ../data
+
+# Start database
+../install/bin/pg_ctl -D ../data/ -l logfile start
+
+# Connect to the database
+../install/bin/psql -d postgres
+
+</synopsis>
+   The long version is the rest of this
+   <phrase>chapter</phrase>.
+  </para>
+ </sect1>
+
+
+ <sect1 id="install-requirements-meson">
+  <title>Requirements</title>
+
+  <para>
+   In general, a modern Unix-compatible platform or Windows should be able
+   to build <productname>PostgreSQL</productname> with meson and run it.
+   The platforms which have received specific testing at the time of release are:
+
+  <itemizedlist spacing="compact">
+   <listitem><simpara>Linux</simpara></listitem>
+   <listitem><simpara>Windows</simpara></listitem>
+   <listitem><simpara>OpenBSD</simpara></listitem>
+   <listitem><simpara>NetBSD</simpara></listitem>
+   <listitem><simpara>FreeBSD</simpara></listitem>
+   <listitem><simpara>MacOS</simpara></listitem>
+  </itemizedlist>
+  </para>
+
+  <sect2 id="required-packages">
+   <title>Required packages</title>
+
+   <para>
+    The following software packages are required for building
+    <productname>PostgreSQL</productname>:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You can download the source code in two ways - via git or by downloading
+      the source code tarballs. For the former, you will need an installed version of
+      <productname>Git</productname>, which you can get from
+      <ulink url="https://git-scm.com"></ulink>. Many systems already
+      have a recent version of <productname>Git</productname>
+      installed by default, or available in their package distribution system.
+      If you download the source code tarballs, you will need
+      <application>tar</application> in addition to
+      <application>gzip</application> or <application>bzip2</application>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>meson</primary>
+      </indexterm>
+      You need to install <application>
+      <ulink url="https://mesonbuild.com/">meson</ulink></application> version
+      0.54 or later to be able to build <productname>PostgreSQL</productname>
+      with it. If your operating system provides a package manager, you can install
+      <application>meson</application> with that. If not, you
+      can download a <ulink url="https://github.com/mesonbuild/meson">meson release</ulink>
+      from github and run <literal>./meson.py</literal> from the git repository
+      itself. Lastly, Meson is also available in the python package index and can
+      be installed with <literal>pip</literal>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least
+      C99-compliant). Recent
+      versions of <productname>GCC</productname> are recommended, but
+      <productname>PostgreSQL</productname> is known to build using a wide variety
+      of compilers from different vendors.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>flex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>lex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>bison</primary>
+      </indexterm>
+      <indexterm>
+       <primary>yacc</primary>
+      </indexterm>
+
+      <application>Flex</application> and <application>Bison</application>
+      are needed to build <productname>PostgreSQL</productname> using
+      <application>meson</application>. Be sure to get
+      <application>Flex</application> 2.5.31 or later and
+      <application>Bison</application> 1.875 or later from your package manager.
+      Other <application>lex</application> and <application>yacc</application>
+      programs cannot be used.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>perl</primary>
+      </indexterm>
+      <application>Perl</application> 5.8.3 or later is needed to build PostgreSQL
+      using <application>meson</application> and to run some test suites.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect2>
+
+  <sect2 id="recommended-packages">
+   <title>Recommended packages</title>
+
+   <para>
+   The following packages are not required to build
+   <application>PostgreSQL</application> but are strongly recommended:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>readline</primary>
+      </indexterm>
+      <indexterm>
+       <primary>libedit</primary>
+      </indexterm>
+
+      The <acronym>GNU</acronym> <productname>Readline</productname> library
+      allows <application>psql</application> (the PostgreSQL command line
+      SQL interpreter) to remember each command you type, and allows you to
+      use arrow keys to recall and edit previous commands.  This is very
+      helpful and is strongly recommended. As an alternative, you can often
+      use the BSD-licensed <filename>libedit</filename> library, originally
+      developed on <productname>NetBSD</productname>. The
+      <filename>libedit</filename> library is GNU
+      <productname>Readline</productname>-compatible and is used if
+      <filename>libreadline</filename> is not found, or if
+      <option>libedit_preferred</option> is enabled as an
+      option to <filename>meson configure</filename>. If you are using a
+      package-based Linux distribution, be aware that you need both the
+      <literal>readline</literal> and <literal>readline-devel</literal> packages, if
+      those are separate in your distribution.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>zlib</primary>
+      </indexterm>
+
+      The <productname>zlib</productname> compression library is
+      used to provide support for compressed archives in
+      <application>pg_dump</application> and
+      <application>pg_restore</application> and is recommended.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Various tests, particularly the client program tests under
+      <filename>src/bin</filename>, use the Perl TAP tools. Running
+      these tests is recommended for development. These TAP tests
+      require the Perl module <literal>IPC::Run</literal> which is
+      available from CPAN or an operating system package.
+     </para>
+    </listitem>
+   </itemizedlist>
+  </para>
+  </sect2>
+
+  <sect2 id="optional-packages">
+   <title>Optional packages</title>
+
+   <para>
+   The following packages are optional.  They are not required in the
+   default configuration, but they are needed when certain build
+   options are enabled, as explained below:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You need <productname>OpenSSL</productname>, if you want to support
+      encrypted client connections.  <productname>OpenSSL</productname> is
+      also required for random number generation on platforms that do not
+      have <filename>/dev/urandom</filename> (except Windows).  The minimum
+      required version is 1.0.1.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>LZ4</productname>, if you want to support
+      compression of data with that method; see
+      <xref linkend="guc-default-toast-compression"/> and
+      <xref linkend="guc-wal-compression"/>.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>Zstandard</productname>, if you want to support
+      compression of data or backups with that method; see
+      <xref linkend="guc-wal-compression"/>.
+      The minimum required version is 1.4.0.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <application>Kerberos</application>, <productname>OpenLDAP</productname>,
+      and/or <application>PAM</application>, if you want to support authentication
+      using those services.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the server programming language
+      <application>PL/Perl</application> you need a full
+      <productname>Perl</productname> installation, including the
+      <filename>libperl</filename> library and the header files.
+      The minimum required version is <productname>Perl</productname> 5.8.3.
+      Since <application>PL/Perl</application> will be a shared
+      library, the <indexterm><primary>libperl</primary></indexterm>
+      <filename>libperl</filename> library must be a shared library
+      also on most platforms.  This appears to be the default in
+      recent <productname>Perl</productname> versions, but it was not
+      in earlier versions, and in any case it is the choice of whomever
+      installed Perl at your site.  <filename>configure</filename> will fail
+      if building <application>PL/Perl</application> is selected but it cannot
+      find a shared <filename>libperl</filename>.  In that case, you will have
+      to rebuild and install <productname>Perl</productname> manually to be
+      able to build <application>PL/Perl</application>.  During the
+      configuration process for <productname>Perl</productname>, request a
+      shared library.
+     </para>
+
+     <para>
+      If you intend to make more than incidental use of
+      <application>PL/Perl</application>, you should ensure that the
+      <productname>Perl</productname> installation was built with the
+      <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal>
+      will show whether this is the case).
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Python</application> server programming
+      language, you need a <productname>Python</productname>
+      installation with the header files and
+      the <application>sysconfig</application> module.  The minimum
+      required version is <productname>Python</productname> 3.2.
+     </para>
+
+     <para>
+      Since <application>PL/Python</application> will be a shared
+      library, the <indexterm><primary>libpython</primary></indexterm>
+      <filename>libpython</filename> library must be a shared library
+      also on most platforms.  This is not the case in a default
+      <productname>Python</productname> installation built from source, but a
+      shared library is available in many operating system
+      distributions.  <filename>configure</filename> will fail if
+      building <application>PL/Python</application> is selected but it cannot
+      find a shared <filename>libpython</filename>.  That might mean that you
+      either have to install additional packages or rebuild (part of) your
+      <productname>Python</productname> installation to provide this shared
+      library.  When building from source, run <productname>Python</productname>'s
+      configure with the <literal>--enable-shared</literal> flag.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Tcl</application>
+      procedural language, you of course need a <productname>Tcl</productname>
+      installation.  The minimum required version is
+      <productname>Tcl</productname> 8.4.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To enable Native Language Support (<acronym>NLS</acronym>), that
+      is, the ability to display a program's messages in a language
+      other than English, you need an implementation of the
+      <application>Gettext</application> <acronym>API</acronym>.  Some operating
+      systems have this built-in (e.g., <systemitem
+      class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>,
+      <systemitem class="osname">Solaris</systemitem>), for other systems you
+      can download an add-on package from <ulink
+      url="https://www.gnu.org/software/gettext/"></ulink>.
+      If you are using the <application>Gettext</application> implementation in
+      the <acronym>GNU</acronym> C library then you will additionally
+      need the <productname>GNU Gettext</productname> package for some
+      utility programs.  For any of the other implementations you will
+      not need it.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <productname>PostgreSQL</productname> documentation,
+      there is a separate set of requirements; see
+      <xref linkend="docguide-toolsets"/>.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect2>
+
+ </sect1>
+
+ <sect1 id="get-source-meson">
+  <title>Getting the Source</title>
+
+   <para>
+   You can download the source code in two ways - via git or the source code
+   tarballs.
+   </para>
+
+  <sect2 id="get-source-git">
+   <title>Getting the Source via <productname>Git</productname></title>
+  <para>
+   With <productname>Git</productname>, you can make a copy of the entire code repository
+   on your local machine, so you will have access to all history and branches
+   offline. This is the fastest and most flexible way to develop or test
+   patches.
+  </para>
+
+  <procedure>
+   <step>
+    <para>
+     To begin using the Git repository, make a clone of the official mirror:
+
+<programlisting>
+git clone https://git.postgresql.org/git/postgresql.git
+</programlisting>
+
+     This will copy the full repository to your local machine, so it may take
+     a while to complete, especially if you have a slow Internet connection.
+     The files will be placed in a new subdirectory <filename>postgresql</filename> of
+     your current directory.
+    </para>
+
+   </step>
+
+   <step>
+    <para>
+     Whenever you want to get the latest updates in the system, <command>cd</command>
+     into the repository, and run:
+
+<programlisting>
+git pull
+</programlisting>
+    </para>
+   </step>
+  </procedure>
+
+  <para>
+   <productname>Git</productname> can do a lot more things than just fetch the source.
+   Our wiki, <ulink
+   url="https://wiki.postgresql.org/wiki/Working_with_Git"></ulink>,
+   has some discussion on working with Git. For more information, consult the
+   <productname>Git</productname> man pages, or see the website at
+   <ulink url="https://git-scm.com"></ulink>.
+  </para>
+  </sect2>
+  <sect2 id="get-source-tarball">
+   <title>Getting the Source via Tarballs</title>
+
+  <para>
+   The <productname>PostgreSQL</productname> source code for released versions
+   can also be obtained from the download section of our website:
+   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
+   Download the
+   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
+   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
+   file you're interested in, then unpack it:
+<screen>
+<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
+</screen>
+   This will create a directory
+   <filename>postgresql-<replaceable>version</replaceable></filename> under
+   the current directory with the <productname>PostgreSQL</productname> sources.
+   Change into that directory for the rest of the installation procedure.
+  </para>
+  </sect2>
+ </sect1>
+
+ <sect1 id="configure-meson">
+  <title>Configuring the build</title>
+
+   <para>
+    The first step of the installation procedure is to configure the
+    source tree for your system and choose the options you would like. To
+    create and configure the build directory, you can start with the
+    <literal>meson setup</literal> command.
+   </para>
+
+<screen>
+<userinput>meson setup build</userinput>
+</screen>
+
+   <para>
+    The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal>
+    argument. If no <literal>srcdir</literal> is given Meson will deduce the
+    <literal>srcdir</literal> based on the current directory and the location
+    of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory.
+   </para>
+
+   <para>
+    Meson then loads the build configuration file and sets up the build directory.
+    Additionally, the invocation can pass options to Meson. The list of commonly
+    used options is in subsequent sections. A few examples of specifying different
+    build options are:
+
+<screen>
+#Setup build directory with a different installation prefix
+meson setup build --prefix=/home/user/pg-install
+
+#Setup build directory to generate a debug build
+meson setup build --buildtype=debug
+
+#Setup build directory with ssl (Use -D for project specific options)
+meson setup build -Dssl=openssl
+</screen>
+
+    Setting up the build directory is a one-time step. To reconfigure before a
+    new build, you can simply use the <literal>meson configure</literal> command
+   </para>
+
+<para>
+<screen>
+meson configure -Dcassert=true
+</screen>
+</para>
+
+<para>
+    <command>meson configure</command>'s commonly used command line options
+    are explained below. This list is not exhaustive (use
+    <literal>meson configure --help</literal> to get one that is).
+    The options not covered here are meant for advanced use-cases, and are
+    documented in the standard meson
+    <ulink url="https://mesonbuild.com/Commands.html#configure">documentation</ulink>.
+    These arguments can be used with <command>meson setup</command> as well.
+</para>
+
+   <sect2 id="configure-install-locations">
+    <title>Installation Locations</title>
+
+     <para>
+      These options control where <literal>ninja install (or meson install)</literal> will put
+      the files.  The <option>--prefix</option> option is sufficient for
+      most cases.  If you have special needs, you can customize the
+      installation subdirectories with the other options described in this
+      section.  Beware however that changing the relative locations of the
+      different subdirectories may render the installation non-relocatable,
+      meaning you won't be able to move it after installation.
+      (The <literal>man</literal> and <literal>doc</literal> locations are
+      not affected by this restriction.)
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term>
+       <listitem>
+        <para>
+         Install all files under the directory <replaceable>PREFIX</replaceable>
+         instead of <filename>/usr/local/pgsql</filename>. The actual
+         files will be installed into various subdirectories; no files
+         will ever be installed directly into the
+         <replaceable>PREFIX</replaceable> directory.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the directory for executable programs. The default
+         is <filename><replaceable>PREFIX</replaceable>/bin</filename>, which
+         normally means <filename>/usr/local/pgsql/bin</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for various configuration files,
+         <filename><replaceable>PREFIX</replaceable>/etc</filename> by default.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the location to install libraries and dynamically loadable
+         modules. The default is
+         <filename><replaceable>PREFIX</replaceable>/lib</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing C and C++ header files. The
+         default is <filename><replaceable>PREFIX</replaceable>/include</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for read-only data files used by the
+         installed programs. The default is
+         <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has
+         nothing to do with where your database files will be placed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing locale data, in particular
+         message translation catalog files.  The default is
+         <filename><replaceable>DATADIR</replaceable>/locale</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         The man pages that come with <productname>PostgreSQL</productname> will be installed under
+         this directory, in their respective
+         <filename>man<replaceable>x</replaceable></filename> subdirectories.
+         The default is <filename><replaceable>DATADIR</replaceable>/man</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+
+  <note>
+      <para>
+       Care has been taken to make it possible to install
+       <productname>PostgreSQL</productname> into shared installation locations
+       (such as <filename>/usr/local/include</filename>) without
+       interfering with the namespace of the rest of the system. First,
+       the string <quote><literal>/postgresql</literal></quote> is
+       automatically appended to <varname>datadir</varname>,
+       <varname>sysconfdir</varname>, and <varname>docdir</varname>,
+       unless the fully expanded directory name already contains the
+       string <quote><literal>postgres</literal></quote> or
+       <quote><literal>pgsql</literal></quote>. For example, if you choose
+       <filename>/usr/local</filename> as prefix, the documentation will
+       be installed in <filename>/usr/local/doc/postgresql</filename>,
+       but if the prefix is <filename>/opt/postgres</filename>, then it
+       will be in <filename>/opt/postgres/doc</filename>. The public C
+       header files of the client interfaces are installed into
+       <varname>includedir</varname> and are namespace-clean. The
+       internal header files and the server header files are installed
+       into private directories under <varname>includedir</varname>. See
+       the documentation of each interface for information about how to
+       access its header files. Finally, a private subdirectory will
+       also be created, if appropriate, under <varname>libdir</varname>
+       for dynamically loadable modules.
+      </para>
+     </note>
+    </sect2>
+
+    <sect2 id="configure-pg-features">
+    <title><productname>PostgreSQL</productname> Features</title>
+
+    <para>
+     The options described in this section enable building of
+     various <productname>PostgreSQL</productname> features that are not
+     built by default.  Most of these are non-default only because they
+     require additional software, as described in
+     <xref linkend="install-requirements-meson"/>. To specify PostgreSQL
+     specific options, the name of the option should be prefixed by -D.
+    </para>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>-Dnls=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Enables or Disables Native Language Support (<acronym>NLS</acronym>),
+         that is, the ability to display a program's messages in a
+         language other than English. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To use this option, you will need an implementation of the
+         <application>Gettext</application> API.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplperl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Perl</application> server-side language. It
+         defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplpython=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Python</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpltcl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Tcl</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the TCL version to use when building PL/Tcl.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dicu=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for
+         the <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm>
+         library, enabling use of ICU collation
+         features<phrase condition="standalone-ignore"> (see
+         <xref linkend="collation"/>)</phrase>.
+         This requires the <productname>ICU4C</productname> package
+         to be installed.  The minimum required version
+         of <productname>ICU4C</productname> is currently 4.2.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+
+        <para>
+         By default,
+         <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm>
+         will be used to find the required compilation options.  This is
+         supported for <productname>ICU4C</productname> version 4.6 and later.
+         <!-- Add description for older ICU4C versions and when pkg-config isn't available-->
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="configure-with-llvm-meson">
+       <term><option>-Dllvm=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for <productname>LLVM</productname> based
+         <acronym>JIT</acronym> compilation<phrase
+         condition="standalone-ignore"> (see <xref
+         linkend="jit"/>)</phrase>.  This
+         requires the <productname>LLVM</productname> library to be installed.
+         The minimum required version of <productname>LLVM</productname> is
+         currently 3.9. It is set to disabled by default.
+        </para>
+        <para>
+         <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
+         will be used to find the required compilation options.
+         <command>llvm-config</command>, and then
+         <command>llvm-config-$major-$minor</command> for all supported
+         versions, will be searched for in your <envar>PATH</envar>.
+         <!--Add substitute fo LLVM_CONFIG when llvm-config is not in PATH-->
+        </para>
+
+        <para>
+         <productname>LLVM</productname> support requires a compatible
+         <command>clang</command> compiler (specified, if necessary, using the
+         <envar>CLANG</envar> environment variable), and a working C++
+         compiler (specified, if necessary, using the <envar>CXX</envar>
+         environment variable).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlz4=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>LZ4</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzstd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>Zstandard</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dssl=<replaceable>LIBRARY</replaceable></option>
+       <indexterm>
+        <primary>OpenSSL</primary>
+        <seealso>SSL</seealso>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Build with support for <acronym>SSL</acronym> (encrypted)
+         connections. The only <replaceable>LIBRARY</replaceable>
+         supported is <option>openssl</option>. This requires the
+         <productname>OpenSSL</productname> package to be installed.
+         <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenSSL</productname> installation is sufficient
+         before proceeding. The default for this option is none.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dgssapi=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for GSSAPI authentication. On many systems, the
+         GSSAPI system (usually a part of the Kerberos installation) is not
+         installed in a location
+         that is searched by default (e.g., <filename>/usr/include</filename>,
+         <filename>/usr/lib</filename>), so you must use the options
+         <option>-Dextra_include_dirs</option> and <option>-Dextra_lib_dirs</option> in
+         addition to this option.  <filename>meson configure</filename> will check
+         for the required header files and libraries to make sure that
+         your GSSAPI installation is sufficient before proceeding.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dldap=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm>
+         support for authentication and connection parameter lookup (see
+         <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and
+         <xref linkend="auth-ldap"/></phrase> for more information). On Unix,
+         this requires the <productname>OpenLDAP</productname> package to be
+         installed. On Windows, the default <productname>WinLDAP</productname>
+         library is used.  <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenLDAP</productname> installation is sufficient before
+         proceeding. It defaults to auto, meaning that it will be enabled automatically
+         if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpam=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm>
+         (Pluggable Authentication Modules) support. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbsd_auth=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with BSD Authentication support. (The BSD Authentication framework is
+         currently only available on OpenBSD.) It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystemd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support
+         for <application>systemd</application><indexterm><primary>systemd</primary></indexterm>
+         service notifications.  This improves integration if the server
+         is started under <application>systemd</application> but has no impact
+         otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more
+         information</phrase>.  <application>libsystemd</application> and the
+         associated header files need to be installed to use this option.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbonjour=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for Bonjour automatic service discovery.
+         This requires Bonjour support in your operating system.
+         Recommended on macOS. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <xref linkend="uuid-ossp"/> module
+         (which provides functions to generate UUIDs), using the specified
+         UUID library.<indexterm><primary>UUID</primary></indexterm>
+         <replaceable>LIBRARY</replaceable> must be one of:
+        </para>
+        <itemizedlist>
+         <listitem>
+          <para>
+           <option>none</option> to not build the ussp module. This is the default.
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>bsd</option> to use the UUID functions found in FreeBSD, NetBSD,
+           and some other BSD-derived systems
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>e2fs</option> to use the UUID library created by
+           the <literal>e2fsprogs</literal> project; this library is present in most
+           Linux systems and in macOS, and can be obtained for other
+           platforms as well
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>ossp</option> to use the <ulink
+           url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
+          </para>
+         </listitem>
+        </itemizedlist>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxml=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxml2, enabling SQL/XML support.  Libxml2 version 2.6.23 or
+         later is required for this feature. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To detect the required compiler and linker options, PostgreSQL will
+         query <command>pkg-config</command>, if that is installed and knows
+         about libxml2.  Otherwise the program <command>xml2-config</command>,
+         which is installed by libxml2, will be used if it is found.  Use
+         of <command>pkg-config</command> is preferred, because it can deal
+         with multi-architecture installations better.
+        </para>
+
+        <para>
+         To use a libxml2 installation that is in an unusual location, you
+         can set <command>pkg-config</command>-related environment
+         variables (see its documentation).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxslt=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxslt, enabling the
+         <xref linkend="xml2"/>
+         module to perform XSL transformations of XML.
+         <option>-Dlibxml</option> must be specified as well.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dreadline=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Allows use of the <application>Readline</application> library
+         (and <application>libedit</application> as well).  This option enables
+         command-line editing and history in
+         <application>psql</application> and is strongly recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibedit_preferred=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this to true favors the use of the BSD-licensed <application>libedit</application> library
+         rather than GPL-licensed <application>Readline</application>.  This option
+         is significant only if you have both libraries installed; the
+         default is false that is to use <application>Readline</application>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzlib=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>zlib</primary>
+         </indexterm>
+         Enabls use of the <application>Zlib</application> library.
+         This enables
+         support for compressed archives in <application>pg_dump</application>
+         and <application>pg_restore</application> and is recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dspinlocks=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true by default and
+         setting it to false will allow the build to succeed even if <productname>PostgreSQL</productname>
+         has no CPU spinlock support for the platform.  The lack of
+         spinlock support will result in very poor performance; therefore,
+         this option should only be changed if the build aborts and
+         informs you that the platform lacks spinlock support. If setting this
+         option to false is required to build <productname>PostgreSQL</productname> on
+         your platform, please report the problem to the
+         <productname>PostgreSQL</productname> developers.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Datomics=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true and setting it to false will
+         disable use of CPU atomic operations.  The option does nothing on
+         platforms that lack such operations.  On platforms that do have
+         them, disabling atomics will result in poor performance.  Changing
+         this option is only useful for debugging or making performance comparisons.
+        </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+   </sect2>
+
+   <sect2 id="configure-build-process">
+    <title>Build Process Details</title>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>--auto_features=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this option allows you to override value of all 'auto' features.
+         This can be useful when you want to disable or enable all the "optional"
+         features at once without having to set each of them manually. The default
+         value for this parameter is auto.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--backend=<replaceable>BACKEND</replaceable></option></term>
+       <listitem>
+        <para>
+         The default backend meson uses is ninja and that should suffice for most use cases.
+         However, if you'd like to fully integrate with visual studio, you can set the
+         BACKEND to <command>vs</command>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C compiler.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C linker.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories that will be added to the list the compiler
+         searches for header files. If you have optional packages
+         (such as GNU <application>Readline</application>) installed in a non-standard
+         location,
+         you have to use this option and probably also the corresponding
+         <option>-Dextra_lib_dirs</option> option.
+        </para>
+        <para>
+         Example: <literal>-Dextra_include_dirs=/opt/gnu/include:/usr/sup/include</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories to search for libraries. You will probably have
+         to use this option (and the corresponding
+         <option>-Dextra_include_dirs</option> option) if you have packages
+         installed in non-standard locations.
+        </para>
+        <para>
+         Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib:/usr/sup/lib</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option>
+       <indexterm>
+        <primary>time zone data</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <productname>PostgreSQL</productname> includes its own time zone database,
+         which it requires for date and time operations.  This time zone
+         database is in fact compatible with the IANA time zone
+         database provided by many operating systems such as FreeBSD,
+         Linux, and Solaris, so it would be redundant to install it again.
+         When this option is used, the system-supplied time zone database
+         in <replaceable>DIRECTORY</replaceable> is used instead of the one
+         included in the PostgreSQL source distribution.
+         <replaceable>DIRECTORY</replaceable> must be specified as an
+         absolute path.  <filename>/usr/share/zoneinfo</filename> is a
+         likely directory on some operating systems.  Note that the
+         installation routine will not detect mismatching or erroneous time
+         zone data.  If you use this option, you are advised to run the
+         regression tests to verify that the time zone data you have
+         pointed to works correctly with <productname>PostgreSQL</productname>.
+        </para>
+
+        <indexterm><primary>cross compilation</primary></indexterm>
+
+        <para>
+         This option is mainly aimed at binary package distributors
+         who know their target operating system well.  The main
+         advantage of using this option is that the PostgreSQL package
+         won't need to be upgraded whenever any of the many local
+         daylight-saving time rules change.  Another advantage is that
+         PostgreSQL can be cross-compiled more straightforwardly if the
+         time zone database files do not need to be built during the
+         installation.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term>
+       <listitem>
+        <para>
+         Append <replaceable>STRING</replaceable> to the PostgreSQL version number.  You
+         can use this, for example, to mark binaries built from unreleased Git
+         snapshots or containing custom patches with an extra version string,
+         such as a <command>git describe</command> identifier or a
+         distribution package release number.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term>
+       <listitem>
+        <para>
+         If you have the binaries for certain by programs required to build
+         Postgres (with or without optional flags) stored at non-standard
+         paths, you could specify them manually to meson configure. The complete
+         list of programs for whom this is supported can be found by running
+         <literal>meson configure</literal>. An example is included below.
+<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting>
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect2>
+
+   <sect2 id="configure-layout">
+    <title>Data layout</title>
+
+    <para>
+     These options affect how PostgreSQL lays out data on disk.
+     Note that changing these breaks on-disk database compatibility,
+     meaning you cannot use <command>pg_upgrade</command> to upgrade to
+     a build with a different value of these options.
+    </para>
+
+    <variablelist>
+
+      <varlistentry>
+       <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>segment size</firstterm>, in gigabytes.  Large tables are
+         divided into multiple operating-system files, each of size equal
+         to the segment size.  This avoids problems with file size limits
+         that exist on many platforms.  The default segment size, 1 gigabyte,
+         is safe on all supported platforms.  If your operating system has
+         <quote>largefile</quote> support (which most do, nowadays), you can use
+         a larger segment size.  This can be helpful to reduce the number of
+         file descriptors consumed when working with very large tables.
+         But be careful not to select a value larger than is supported
+         by your platform and the file systems you intend to use.  Other
+         tools you might wish to use, such as <application>tar</application>, could
+         also set limits on the usable file size.
+         It is recommended, though not absolutely required, that this value
+         be a power of 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within tables.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 32 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>WAL block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within the WAL log.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 64 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+   </sect2>
+
+   <sect2 id="configure-devel">
+    <title>Developer Options</title>
+
+    <para>
+     Most of the options in this section are only of interest for
+     developing or debugging <productname>PostgreSQL</productname>.
+     They are not recommended for production builds, except
+     for <option>--debug</option>, which can be useful to enable
+     detailed bug reports in the unlucky event that you encounter a bug.
+     On platforms supporting DTrace, <option>-Ddtrace</option>
+     may also be reasonable to use in production.
+    </para>
+
+    <para>
+     When building an installation that will be used to develop code inside
+     the server, it is recommended to use atleast the <option>--buildtype=debug</option>
+     and <option>-Dcassert</option> options.
+    </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term>
+       <listitem>
+        <para>
+         This option can be used to specify the buildtype to use; defaults
+         to release. If you'd like finer control on the debug symbols
+         and optimization levels than what this option provides, you can
+         refer to the --debug and --optimization flags.
+
+         The following build types are generally used:
+         <variablelist>
+          <varlistentry>
+           <term><literal>plain</literal></term>
+           <listitem>
+            <para>
+            No extra build flags are used, even for compiler warnings,
+            useful for distro packagers and other cases where you need to
+            specify all arguments by yourself.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debug</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated but the result is not optimized.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debugoptimized</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated and the code is optimized (on most compilers
+            this means <literal>-g -O2</literal>)
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>release</literal></term>
+           <listitem>
+            <para>
+            This enables full optimization and no debug info is generated. This is
+            the default.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--debug</option></term>
+       <listitem>
+        <para>
+         Compiles all programs and libraries with debugging symbols.
+         This means that you can run the programs in a debugger
+         to analyze problems. This enlarges the size of the installed
+         executables considerably, and on non-GCC compilers it usually
+         also disables compiler optimization, causing slowdowns. However,
+         having the symbols available is extremely helpful for dealing
+         with any problems that might arise.  Currently, this option is
+         recommended for production installations only if you use GCC.
+         But you should always have it on if you are doing development work
+         or running a beta version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term>
+       <listitem>
+        <para>
+         Specify the optimization level. LEVEL can be set to any of {0,g,1,2,3,s}.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--werror</option></term>
+       <listitem>
+        <para>
+         Setting this option asks the compiler to treat warnings as errors. This can
+         be useful for code development purposes.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dcassert</option></term>
+       <listitem>
+        <para>
+         Enables <firstterm>assertion</firstterm> checks in the server, which test for
+         many <quote>cannot happen</quote> conditions.  This is invaluable for
+         code development purposes, but the tests can slow down the
+         server significantly.
+         Also, having the tests turned on won't necessarily enhance the
+         stability of your server!  The assertion checks are not categorized
+         for severity, and so what might be a relatively harmless bug will
+         still lead to server restarts if it triggers an assertion
+         failure.  This option is not recommended for production use, but
+         you should have it on for development work or when running a beta
+         version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtap-tests</option></term>
+       <listitem>
+        <para>
+         Enable tests using the Perl TAP tools.  This requires a Perl
+         installation and the Perl module <literal>IPC::Run</literal>.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term>
+       <listitem>
+        <para>
+         Enable test suites which require special software to run. This option
+         accepts arguments via a whitespace-separated list. The following values
+         are currently supported:
+         <variablelist>
+          <varlistentry>
+           <term><literal>kerberos</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/kerberos</filename>.  This
+            requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ldap</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ldap</filename>.  This
+            requires an <productname>OpenLDAP</productname> installation and opens
+            TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ssl</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ssl</filename>.  This opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>wal_consistency_checking</literal></term>
+           <listitem>
+            <para>
+            Uses <literal>wal_consistency_checking=all</literal> while running
+            certain tests under <filename>src/test/recovery</filename>.  Not
+            enabled by default because it is resource intensive.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+         Tests for features that are not supported by the current build
+         configuration are not run even if they are mentioned in
+         <varname>PG_TEST_EXTRA</varname>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--errorlogs</option></term>
+       <listitem>
+        <para>
+        This option can be used to print the logs from the failing tests
+        making debugging easier.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Db_coverage</option></term>
+       <listitem>
+        <para>
+         If using GCC, all programs and libraries are compiled with
+         code coverage testing instrumentation.  When run, they
+         generate files in the build directory with code coverage
+         metrics.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/>
+         for more information.</phrase> This option is for use only with GCC
+         and when doing development work.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Ddtrace=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>DTrace</primary>
+         </indexterm>
+         Enabling this compiles <productname>PostgreSQL</productname> with support for the
+         dynamic tracing tool DTrace.
+         <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/>
+         for more information.</phrase>
+        </para>
+
+        <para>
+         To point to the <command>dtrace</command> program, the
+         environment variable <envar>DTRACE</envar> can be set.  This
+         will often be necessary because <command>dtrace</command> is
+         typically installed under <filename>/usr/sbin</filename>,
+         which might not be in your <envar>PATH</envar>.
+        </para>
+
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect2>
+
+   <sect2 id="configure-misc">
+    <title>Miscellaneous</title>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term>
+       <listitem>
+        <para>
+         Set <replaceable>NUMBER</replaceable> as the default port number for
+         server and clients. The default is 5432. The port can always
+         be changed later on, but if you specify it here then both
+         server and clients will have the same default compiled in,
+         which can be very convenient.  Usually the only good reason
+         to select a non-default value is if you intend to run multiple
+         <productname>PostgreSQL</productname> servers on the same machine.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term>
+       <listitem>
+        <para>
+         The default name of the Kerberos service principal used
+         by GSSAPI.
+         <literal>postgres</literal> is the default. There's usually no
+         reason to change this unless you are building for a Windows
+         environment, in which case it must be set to upper case
+         <literal>POSTGRES</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect2>
+
+ </sect1>
+
+ <sect1 id="build-meson">
+  <title>Building the source</title>
+   <para>
+    By default, <productname>Meson</productname> uses the
+    <ulink url="https://ninja-build.org/"> Ninja build system</ulink>.
+    To build <productname>PostgreSQL</productname> from source using meson, you can
+    simply use the <literal>ninja</literal> command in the build directory.
+<screen>
+ninja
+</screen>
+     Ninja will automatically detect the number of CPUs in your computer and
+     parallelize itself accordingly. You can override the amount of parallel
+     processes used with the command line argument <literal>-j</literal>.
+   </para>
+
+   <para>
+     It should be noted that after the initial configure step
+     <command>ninja</command> is the only command you ever need to type to
+     compile. No matter how you alter your source tree (short of moving it to
+     a completely new location), Meson will detect the changes and regenerate
+     itself accordingly. This is especially handy if you have multiple build
+     directories. Often one of them is used for development (the "debug" build)
+     and others only every now and then (such as a "static analysis" build).
+     Any configuration can be built just by cd'ing to the corresponding directory
+     and running Ninja.
+   </para>
+
+   <para>
+     If you'd like to build with a backend other that ninja, you can use configure
+     with the <option>--backend</option> option to select the one you want to use and then
+     build using <literal>meson compile</literal>. To learn more about these
+     backends and other arguments you can provide to ninja, you can refer to the
+     meson <ulink url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
+     documentation</ulink>.
+   </para>
+ </sect1>
+
+ <sect1 id="install-meson">
+  <title>Installing the files</title>
+   <para>
+    Once Postgres is built, you can install it by simply running the
+    <literal>ninja install</literal> command.
+
+<screen>
+ninja install
+</screen>
+   </para>
+
+   <para>
+    This will install files into the directories that were specified
+    in <xref linkend="configure-meson"/>. Make sure that you have appropriate
+    permissions to write into that area. You might need to do this
+    step as root. Alternatively, you can create the target directories
+    in advance and arrange for appropriate permissions to be granted.
+    The standard installation provides all the header files needed for client
+    application development as well as for server-side program
+    development, such as custom functions or data types written in C.
+   </para>
+
+   <para>
+    <literal>ninja install</literal> should work for most cases
+    but if you'd like to use more options, you could also use
+    <literal>meson install</literal> instead. You can learn more about
+    <ulink url="https://mesonbuild.com/Commands.html#install">meson install</ulink>
+    and it's options in the meson documentation.
+   </para>
+
+   <para>
+    Depending on your platform and setup, you might have to perform a
+    few steps after installation. Those are outlined in
+    <xref linkend="install-post"/>.
+   </para>
+
+  <formalpara>
+   <title>Uninstallation:</title>
+   <para>
+    To undo the installation, you can use the <command>ninja
+    uninstall</command> command.
+   </para>
+  </formalpara>
+
+  <formalpara>
+   <title>Cleaning:</title>
+   <para>
+    After the installation you can free disk space by removing the built
+    files from the source tree with the <command>ninja clean</command>
+    command.
+   </para>
+  </formalpara>
+
+ </sect1>
+
+ <sect1 id="running-tests">
+  <title>Running tests</title>
+   <para>
+    If you want to test the newly built server, you can run the regression
+    tests. The regression tests are a collection of test suites to verify
+    that <productname>PostgreSQL</productname> runs on your machine in
+    the way the developers expected it to. To run them, simply type:
+<screen>
+<userinput>meson test</userinput>
+</screen>
+    You can repeat this at any later time by issuing the same command.
+   </para>
+
+   <para>Meson also allows you to list tests and run specific tests or suites.
+<screen>
+# List all tests
+<userinput>meson test --list</userinput>
+
+# Run a specific test
+<userinput>meson test recovery/001_stream_rep</userinput>
+
+# Run the main pg_regress and isolation tests
+<userinput>meson test --suite main</userinput>
+</screen>
+   </para>
+
+   <para>
+    To learn more about running the tests and how to interpret the results
+    you can refer to the documentation for interpreting test results.
+     <literal>meson test</literal> also provides a number of additional
+    options you can use which can be found in the
+    <ulink url="https://mesonbuild.com/Unit-tests.html#testing-tool">meson test documentation</ulink>.
+   </para>
+
+ </sect1>
+
+</chapter>
diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml
index 73439c049e9..a5b9c180a00 100644
--- a/doc/src/sgml/postgres.sgml
+++ b/doc/src/sgml/postgres.sgml
@@ -156,6 +156,7 @@ break is not needed in a wider output rendering.
 
   &installbin;
   &installation;
+  &installation-meson;
   &installw;
   &runtime;
   &config;
-- 
2.37.0.3.g30cc8d0f14

v12-0012-meson-Add-PGXS-compatibility.patchtext/x-diff; charset=us-asciiDownload
From 564ebe874fe3dee2720497c3e2eeba51370bb124 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 20:27:17 -0700
Subject: [PATCH v12 12/15] meson: Add PGXS compatibility

This works for some extensions on some operating systems, but could use plenty
of cleanups.
---
 src/meson.build | 261 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 261 insertions(+)

diff --git a/src/meson.build b/src/meson.build
index a7fdd5a13ed..8824f57d1da 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,3 +10,264 @@ subdir('bin')
 subdir('pl')
 
 subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to only use a single
+# buildsystem across all the supported postgres versions. Once all supported
+# PG versions support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+  'PACKAGE_URL': pg_url,
+  'PACKAGE_VERSION': pg_version,
+  'PG_MAJORVERSION': pg_version_major,
+  'PG_VERSION_NUM': pg_version_num,
+  'configure_input': 'meson',
+
+  'vpath_build': 'yes',
+  'autodepend': 'no', # XXX: Should we just set this to true when possible?
+
+  'host_cpu': host_cpu,
+  'host': '@0@-@1@'.format(host_cpu, host_system),
+  'host_os': host_system,
+  'build_os': build_machine.system(),
+  'PORTNAME': portname,
+  'PG_SYSROOT': pg_sysroot,
+
+  'abs_top_builddir': meson.build_root(),
+  'abs_top_srcdir': meson.source_root(),
+
+  'enable_thread_safety': 'yes',
+  'enable_rpath': 'yes',
+  'enable_nls': libintl.found() ? 'yes' : 'no',
+  'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no',
+  'enable_debug': get_option('debug') ? 'yes' : 'no',
+  'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+  'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+  'DLSUFFIX': dlsuffix,
+  'EXEEXT': exesuffix,
+
+  'SUN_STUDIO_CC': 'no', # not supported so far
+
+  'default_port': get_option('pgport'),
+  'with_system_tzdata': get_option('system_tzdata'),
+
+  'with_krb_srvnam': get_option('krb_srvnam'),
+  'krb_srvtab': krb_srvtab,
+
+  # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+  'STRIP': 'strip',
+  'STRIP_STATIC_LIB': 'strip -x',
+  'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+  # Just always use the install_sh fallback that autoconf uses. Unlikely to
+  # matter performance-wise for extensions. If it turns out to do, we can
+  # improve that later.
+  'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+  'CC': var_cc,
+  'CPP': var_cpp,
+  'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld'] ? 'yes' : 'no'),
+
+  'CFLAGS': var_cflags,
+  'CPPFLAGS': var_cppflags,
+  'CXXFLAGS': var_cxxflags,
+  'CFLAGS_SL': var_cflags_sl,
+  'CFLAGS_SL_MODULE': ' '.join(cflags_mod),
+  'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod),
+  'CFLAGS_SSE42': ' '.join(cflags_crc),
+  'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+  'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+  # FIXME:
+  'CFLAGS_ARMV8_CRC32C': '',
+  'BITCODE_CFLAGS': '',
+  'BITCODE_CXXFLAGS': '',
+
+  'LDFLAGS': var_ldflags,
+  'LDFLAGS_EX': var_ldflags_ex,
+  'LDFLAGS_SL': var_ldflags_sl,
+
+  'BISONFLAGS': ' '.join(bison_flags),
+  'FLEXFLAGS': ' '.join(flex_flags),
+
+  'LIBS': var_libs,
+}
+
+if llvm.found()
+  pgxs_kv += {
+    'CLANG': clang.path(),
+    'CXX': ' '.join(cpp.cmd_array()),
+    'LLVM_BINPATH': llvm_binpath,
+  }
+else
+  pgxs_kv += {
+    'CLANG': '',
+    'CXX': '',
+    'LLVM_BINPATH': '',
+  }
+endif
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+  'BISON': bison,
+  'FLEX': flex,
+  'GZIP': gzip,
+  'LZ4': program_lz4,
+  'PERL': perl,
+  'PROVE': prove,
+  'PYTHON': python,
+  'TAR': tar,
+  'ZSTD': program_zstd,
+  'DTRACE': dtrace,
+  'LD': ld_program,
+  'install_bin': install_sh,
+}
+foreach b, p : pgxs_bins
+  pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+pgxs_empty = [
+  'PERMIT_DECLARATION_AFTER_STATEMENT',
+  'ICU_CFLAGS', # needs to be added, included by public server headers
+
+  # probably need most of these?
+  'RANLIB',
+  'WINDRES',
+  'DLLTOOL',
+  'DLLWRAP',
+  'LN_S',
+  'AR',
+  'AWK',
+
+  # hard to see why we'd need either?
+  'ZIC',
+  'TCLSH',
+
+  # docs don't seem to be supported by pgxs
+  'XMLLINT',
+  'XSLTPROC',
+  'DBTOEPUB',
+  'FOP',
+
+  # supporting coverage for pgxs-in-meson build doesn't seem worth it
+  'GENHTML',
+  'LCOV',
+  'GCOV',
+  'MSGFMT_FLAGS',
+
+  # translation doesn't appear to be supported by pgxs
+  'MSGFMT',
+  'XGETTEXT',
+  'MSGMERGE',
+  'WANTED_LANGUAGES',
+
+  # Not needed because we don't build the server / PLs with the generated makefile
+  'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+  'DTRACEFLAGS', # only server has dtrace probes
+
+  'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+  'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+  # possible that some of these are referenced explicitly in pgxs makefiles?
+  # For now not worth it.
+  'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD',
+
+  'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+  'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+  'UUID_LIBS',
+
+  'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+  'ICU_LIBS',
+]
+
+foreach pe : pgxs_empty
+  pgxs_cdata.set(pe, '')
+endforeach
+
+pgxs_dirs = {
+  'prefix': get_option('prefix'),
+
+  'bindir': '${exec_prefix}' / get_option('bindir'),
+  'datarootdir': '${prefix}' / get_option('datadir'),
+  'datadir': '${datarootdir}',
+  'docdir': '${prefix}' / dir_doc,
+  'exec_prefix': '${prefix}',
+  'htmldir': '${prefix}' / dir_doc_html, #?
+  'includedir': '${prefix}' / get_option('includedir'),
+  'libdir': '${exec_prefix}' / get_option('libdir'),
+  'localedir': '${prefix}' / get_option('localedir'),
+  'mandir': '${prefix}' / get_option('mandir'),
+  'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+foreach d, p : pgxs_dirs
+  pgxs_cdata.set(d, p)
+endforeach
+
+pgxs_deps = {
+  'bonjour': bonjour,
+  'bsd_auth': bsd_auth,
+  'gssapi': gssapi,
+  'icu': icu,
+  'ldap': ldap,
+  'libxml': libxml,
+  'libxslt': libxslt,
+  'llvm': llvm,
+  'lz4': lz4,
+  'nls': libintl,
+  'pam': pam,
+  'perl': perl_dep,
+  'python': python3_dep,
+  'readline': readline,
+  'selinux': selinux,
+  'systemd': systemd,
+  'tcl': tcl_dep,
+  'zlib': zlib,
+  'zstd': zstd,
+}
+foreach d, v : pgxs_deps
+  pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+pgxs_cdata.set('with_ssl', get_option('ssl'))
+pgxs_cdata.set('with_uuid', uuidopt)
+
+makefile_global = configure_file(
+  input: 'Makefile.global.in',
+  output: 'Makefile.global',
+  configuration: pgxs_cdata,
+  install: true,
+  install_dir: dir_pgxs / 'src',
+)
+configure_files += makefile_global
+
+# FIXME: check if exists
+makefile_port = configure_file(
+  input: 'makefiles' / 'Makefile.@0@'.format(portname),
+  output: 'Makefile.port',
+  copy: true,
+  install_dir: dir_pgxs / 'src')
+configure_files += makefile_port
+
+install_data(
+  'Makefile.shlib', 'nls-global.mk',
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'makefiles/pgxs.mk',
+  install_dir: dir_pgxs / 'src' / 'makefiles')
-- 
2.37.0.3.g30cc8d0f14

v12-0013-meson-Add-postgresql-extension.pc-for-building-e.patchtext/x-diff; charset=us-asciiDownload
From c5e3636b5f9e6a12db7ed7eef5834398937313dc Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:52:03 -0700
Subject: [PATCH v12 13/15] meson: Add postgresql-extension.pc for building
 extension libraries

This should work with several other buildsystems.

TODO: Docs and example
---
 src/backend/meson.build | 96 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/src/backend/meson.build b/src/backend/meson.build
index 02eba01cdc6..537afe413c9 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -177,6 +177,102 @@ pg_mod_args = default_mod_args + {
 
 
 
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = pg_mod_c_args
+pg_ext_libs = [backend_mod_code, thread_dep, ldflags, ldflags_mod]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+  if incdir.startswith('src/include')
+    subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+  else
+    subincdir = ''
+  endif
+  pg_ext_subdirs += subincdir
+
+  # Add directories in source / build dir containing headers to cflags for the
+  # -uninstalled.pc
+  pg_ext_vars_uninst += [
+    'build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+    'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir),
+  ]
+  pg_ext_cflags += [
+    '${build_inc@0@}'.format(i),
+    '${src_inc@0@}'.format(i)
+  ]
+
+  i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags += cflags
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'pkglibdir=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_mod=${pkglibdir}'
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+# referenced on some platforms, via mod_link_with_dir
+pg_ext_vars += 'bindir=${prefix}/@0@'.format(dir_bin)
+
+# XXX: Define variables making it easy to define tests, too
+
+# Some platforms need linker flags to link with binary, they are the same
+# between building with meson and .pc file, except that we have have to
+# reference a variable to make it work for both normal and -uninstalled .pc
+# files.
+if mod_link_args_fmt.length() != 0
+  assert(link_with_inst != '')
+  assert(link_with_uninst != '')
+
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format(link_with_inst)
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(link_with_uninst)
+
+  foreach el : mod_link_args_fmt
+    pg_ext_libs += el.format('${mod_link_with}')
+  endforeach
+endif
+
+# main .pc to build extensions
+pg_ext = pkgconfig.generate(
+  name: 'postgresql-extension',
+  description: 'PostgreSQL Extension Support',
+  url: pg_url,
+
+  subdirs: pg_ext_subdirs,
+  libraries: pg_ext_libs,
+  extra_cflags: pg_ext_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+  name: 'postgresql-extension-warnings',
+  description: 'PostgreSQL Extension Support - Compiler Warnings',
+  requires: 'postgresql-extension',
+  url: pg_url,
+  extra_cflags: cflags_warn,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+
 # Shared modules that, on some system, link against the server binary. Only
 # enter these after we defined the server build.
 
-- 
2.37.0.3.g30cc8d0f14

v12-0014-meson-Add-LLVM-bitcode-emission.patchtext/x-diff; charset=us-asciiDownload
From cb02d0d1d7fa63f19a4cd6464a6af48b59ebfb95 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 19:58:45 -0700
Subject: [PATCH v12 14/15] meson: Add LLVM bitcode emission

This needs a bit more love before being ready...
---
 src/backend/jit/llvm/meson.build | 21 +++++++++++++++
 src/backend/meson.build          | 46 ++++++++++++++++++++++++++++++++
 meson.build                      |  2 ++
 src/tools/irlink                 | 39 +++++++++++++++++++++++++++
 4 files changed, 108 insertions(+)
 create mode 100644 src/tools/irlink

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..ede51503377 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -48,6 +48,19 @@ else
   llvm_irgen_command = clang
 endif
 
+llvm_irlink_kw = {
+  'command': [
+    irlink,
+    '--name', 'postgres',
+    '--lto', llvm_lto,
+    '--outdir', '@OUTPUT0@',
+    '--privdir', '@PRIVATE_DIR@',
+    '@INPUT@',
+  ],
+  'install': true,
+  'install_dir': dir_lib_pkg,
+}
+
 
 # XXX: Need to determine proper version of the function cflags for clang
 bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
@@ -71,3 +84,11 @@ llvmjit_types = custom_target('llvmjit_types.bc',
   depfile: '@BASENAME@.c.bc.d',
 )
 backend_targets += llvmjit_types
+
+# Figure out -I's needed to build all postgres code, including all its
+# dependencies
+pkg_config = find_program(['pkg-config', 'pkgconf'], required: true)
+r = run_command(pkg_config,
+  ['--cflags-only-I', meson.build_root() / 'meson-uninstalled/postgresql-extension-uninstalled.pc'],
+  check: true)
+bitcode_cflags += r.stdout().split()
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 537afe413c9..3a2fc51bda3 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -281,3 +281,49 @@ subdir('replication/libpqwalreceiver')
 subdir('replication/pgoutput')
 subdir('snowball')
 subdir('utils/mb/conversion_procs')
+
+
+
+###############################################################
+# emit LLVM bitcode of backend code for JIT inlining
+###############################################################
+
+if llvm.found()
+
+  # custom_target() insists on targetting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generators don't accept CustomTargetIndex as input or 'depends', nor do
+  # they like targets with more than one output. However, a custom target
+  # accepts them as input without a problem. So we have the below transitive
+  # target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args + bitcode_cflags,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: '@PLAINNAME@.bc',
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('bitcode',
+    output: ['bitcode'],
+    input: bc_backend_sources,
+    kwargs: llvm_irlink_kw,
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/meson.build b/meson.build
index e64054b1c56..b9eaad73628 100644
--- a/meson.build
+++ b/meson.build
@@ -638,6 +638,8 @@ if not llvmopt.disabled()
 
     ccache = find_program('ccache', native: true, required: false)
     clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+    irlink = find_program('src/tools/irlink', native: true)
   endif
 else
   llvm = not_found_dep
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..7d3f49da427
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+#index = os.path.realpath(args.index)
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+  shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = [args.name + input.replace(args.privdir, '') for input in args.INPUT]
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink', '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
-- 
2.37.0.3.g30cc8d0f14

v12-0015-meson-Add-support-for-building-with-precompiled-.patchtext/x-diff; charset=us-asciiDownload
From 641af4be44511dfde8df858faf952030821e8536 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:49:53 -0700
Subject: [PATCH v12 15/15] meson: Add support for building with precompiled
 headers

This substantially speeds up building for windows. A cross build with mingw
goes from

real	0m29.884s
user	15m41.900s
sys	1m58.257s

to

real	0m13.196s
user	6m52.330s
sys	1m15.140s

The wins on windows are similar-ish (but I don't have a system at hand just
now for actual numbers).
---
 src/include/meson.build           | 1 +
 src/include/pch/c_pch.h           | 1 +
 src/include/pch/meson.build       | 4 ++++
 src/include/pch/postgres_fe_pch.h | 1 +
 src/include/pch/postgres_pch.h    | 1 +
 src/common/meson.build            | 2 ++
 src/port/meson.build              | 2 ++
 src/backend/meson.build           | 5 +++++
 src/backend/snowball/meson.build  | 1 +
 src/fe_utils/meson.build          | 1 +
 src/bin/pg_dump/meson.build       | 1 +
 src/bin/pg_upgrade/meson.build    | 1 +
 src/bin/psql/meson.build          | 1 +
 src/pl/plperl/meson.build         | 1 +
 src/pl/plpgsql/src/meson.build    | 1 +
 src/pl/plpython/meson.build       | 1 +
 src/pl/tcl/meson.build            | 1 +
 contrib/bloom/meson.build         | 1 +
 contrib/btree_gist/meson.build    | 1 +
 contrib/hstore/meson.build        | 1 +
 contrib/pg_trgm/meson.build       | 1 +
 contrib/pgcrypto/meson.build      | 1 +
 contrib/pgstattuple/meson.build   | 1 +
 contrib/sepgsql/meson.build       | 1 +
 contrib/xml2/meson.build          | 1 +
 .cirrus.yml                       | 4 ++--
 meson.build                       | 8 ++++++++
 27 files changed, 44 insertions(+), 2 deletions(-)
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/meson.build
 create mode 100644 src/include/pch/postgres_fe_pch.h
 create mode 100644 src/include/pch/postgres_pch.h

diff --git a/src/include/meson.build b/src/include/meson.build
index 66991c43d35..d1b58f14842 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -111,6 +111,7 @@ install_headers(
 subdir('catalog')
 subdir('nodes')
 subdir('parser')
+subdir('pch')
 subdir('storage')
 subdir('utils')
 
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..2bcec49c3a2
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,4 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
+pch_postgres_fe_h = meson.source_root() / meson.current_source_dir() / 'postgres_fe_pch.h'
diff --git a/src/include/pch/postgres_fe_pch.h b/src/include/pch/postgres_fe_pch.h
new file mode 100644
index 00000000000..f3ea20912d3
--- /dev/null
+++ b/src/include/pch/postgres_fe_pch.h
@@ -0,0 +1 @@
+#include "postgres_fe.h"
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/common/meson.build b/src/common/meson.build
index 23842e1ffef..1c9b8a3a018 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -147,6 +147,7 @@ foreach name, opts : pgcommon_variants
     endif
     c_args = opts.get('c_args', []) + common_cflags[cflagname]
     cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'sources': sources,
@@ -159,6 +160,7 @@ foreach name, opts : pgcommon_variants
 
   lib = static_library('libpgcommon@0@'.format(name),
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
diff --git a/src/port/meson.build b/src/port/meson.build
index ced2e014db8..c2222696f1b 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -161,6 +161,7 @@ foreach name, opts : pgport_variants
     c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
     cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
       sources,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'c_args': c_args,
         'build_by_default': false,
@@ -172,6 +173,7 @@ foreach name, opts : pgport_variants
   lib = static_library('libpgport@0@'.format(name),
       pgport_sources,
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
       }
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 3a2fc51bda3..784a8ba7072 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -59,6 +59,7 @@ postgres_lib = static_library('postgres',
   backend_sources + timezone_sources + generated_backend_sources,
   link_whole: backend_link_with,
   dependencies: backend_build_deps,
+  c_pch: pch_postgres_h,
   kwargs: internal_lib_args,
 )
 
@@ -78,6 +79,10 @@ if cc.get_id() == 'msvc'
 
   backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
   backend_link_depends += postgres_def
+  # Due to the way msvc and meson's precompiled headers implementation
+  # interact, we need to have symbols from the full library available. Could
+  # be restricted to b_pch=true.
+  backend_link_with += postgres_lib
 
 elif host_system == 'aix'
   # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 8c6f685cb32..2747026c729 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -60,6 +60,7 @@ stemmer_inc = include_directories('../../include/snowball')
 
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
+  c_pch: pch_postgres_h,
   kwargs: pg_mod_args + {
     'include_directories': [stemmer_inc],
   }
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index 29c24257328..6e1cce9bd0d 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -23,6 +23,7 @@ fe_utils_sources += psqlscan
 
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
+  c_pch: pch_postgres_fe_h,
   include_directories: [postgres_inc, libpq_inc],
   dependencies: frontend_common_code,
   kwargs: default_lib_args,
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index ee8daa7d06a..9be697daef4 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -23,6 +23,7 @@ endif
 
 pg_dump_common = static_library('libpgdump_common',
   pg_dump_common_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq, zlib],
   kwargs: internal_lib_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 52324601181..59e06b761fd 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -18,6 +18,7 @@ pg_upgrade_sources = files(
 
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 626ac8cd105..20939b0740c 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -48,6 +48,7 @@ endif
 
 executable('psql',
   psql_sources,
+  c_pch: pch_postgres_fe_h,
   include_directories: include_directories('.'),
   dependencies: [frontend_code, libpq, readline],
   kwargs: default_bin_args,
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 6831011edac..5be58ceaa19 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -41,6 +41,7 @@ endforeach
 plperl_inc = include_directories('.')
 shared_module('plperl',
   plperl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plperl_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [perl_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index c4c94a312e1..39302f8d032 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -42,6 +42,7 @@ plpgsql_sources += pl_unreserved
 
 shared_module('plpgsql',
   plpgsql_sources,
+  c_pch: pch_postgres_h,
   include_directories: include_directories('.'),
   kwargs: pg_mod_args,
 )
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index e9e77ae3691..d41f30c8022 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -30,6 +30,7 @@ plpython_inc = include_directories('.')
 
 shared_module('plpython3',
   plpython_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plpython_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [python3_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index 1acb49f1637..16bfd7806b4 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -16,6 +16,7 @@ pltcl_sources += custom_target('pltclerrcodes.h',
 
 shared_module('pltcl',
   pltcl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [include_directories('.'), postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [tcl_dep, pg_mod_args['dependencies']],
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 311cc10c557..f2a73b06667 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -9,6 +9,7 @@ bloom_sources = files(
 
 bloom = shared_module('bloom',
   bloom_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index 6bd91b88fc3..f33bae7f8fe 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -27,6 +27,7 @@ btree_gist_sources = files(
 
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 369c60d7f40..cac6d179351 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -10,6 +10,7 @@ hstore = shared_module('hstore',
     'hstore_op.c',
     'hstore_subs.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index 37931279f65..6818cddc63f 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -5,6 +5,7 @@ pg_trgm = shared_module('pg_trgm',
     'trgm_op.c',
     'trgm_regexp.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index 647bea8559e..ec022096c31 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -72,6 +72,7 @@ endif
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
   },
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 190f8b5d92b..8e765fc997a 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -4,6 +4,7 @@ pgstattuple = shared_module('pgstattuple',
     'pgstatindex.c',
     'pgstattuple.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 83e74f035b1..019c31750f2 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -16,6 +16,7 @@ sepgsql_sources = files(
 
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [selinux, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index dcc7bf5bf69..d25549a1fb3 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -7,6 +7,7 @@ xml2 = shared_module('pgxml',
     'xpath.c',
     'xslt_proc.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/.cirrus.yml b/.cirrus.yml
index 37fc5b551ec..88975bb017d 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -1158,7 +1158,7 @@ task:
 
   configure_script:
     - vcvarsall x64
-    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
 
   build_script:
     - vcvarsall x64
@@ -1185,7 +1185,7 @@ task:
 
   configure_script:
     - vcvarsall x64
-    - meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+    - meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
 
   build_script:
     - vcvarsall x64
diff --git a/meson.build b/meson.build
index b9eaad73628..bf4e561be89 100644
--- a/meson.build
+++ b/meson.build
@@ -9,6 +9,7 @@ project('postgresql',
   meson_version: '>=0.54',
   default_options: [
     'warning_level=2',
+    'b_pch=false',
     'buildtype=release',
   ]
 )
@@ -1716,6 +1717,13 @@ if cc.get_id() == 'msvc'
     '/wd4267',
   ]
 
+  # Dirty hack to disable warnings due to some files defining
+  # UMDF_USING_NTSTATUS before including postgres.h. We need a better fix, but
+  # for now this allows us to see "real" warnings.
+  if get_option('b_pch')
+    cflags_warn += '/wd4005'
+  endif
+
   cppflags += [
     '/DWIN32',
     '/DWINDOWS',
-- 
2.37.0.3.g30cc8d0f14

#253Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#252)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-08-27 11:04:47 -0700, Andres Freund wrote:

- choice of semaphore API needs to be cleaned up, that should be easy now, but
I thought that I needed to get a new version out first

Everytime I look at the existing selection code I get confused, which is part
of why I haven't tackled this yet.

If I understand the current logic right, we check for sem_open, sem_init if
and only if PREFERRED_SEMAPHORES is set to UNNAMED_POSIX or NAMED_POSIX (no
template defaults to named). Which also means that we don't link in rt or
pthread if USE_*_POSIX_SEMAPHORES is set directly in the template, as darwin
does.

I read the configure.ac code combined with the templates as resulting in the
following precedence order:

1) windows uses windows semaphores

2) freebsd, linux use unnamed posix semaphores if available

3) macOS < 10.2 uses named semaphores, without linking in rt/pthread
4) macos >= 10.2 uses sysv semaphores

5) sysv semaphores are used

Correct?

Given that Mac OS 10.2 was released in 2002, I think we can safely consider
that unsupported - even prairiedog was a few years younger... :). Given the
downsides of named semaphores and that we apparently haven't used that code in
years, I wonder if we should remove it?

However, there has been a thread about defaulting to named semas on openbsd,
but then Tom benchmarked out that that's not going to fly for performance
reasons ([1]/messages/by-id/3010886.1634950831@sss.pgh.pa.us).

FWIW, I did notice that netbsd does have working unnamed semaphores. I don't
know how long ago they were added, but they apparently didn't work quite right
in 2018 [1]/messages/by-id/3010886.1634950831@sss.pgh.pa.us. No meaningful performance chance in the main regression tests,
I'll run a concurrent check world comparison in the background...

Should the choice be configurable with meson? I'm inclined to say not for now.

Regards,

Andres

[1]: /messages/by-id/3010886.1634950831@sss.pgh.pa.us
[2]: http://www.polarhome.com/service/man/?qf=sem_init&amp;tf=2&amp;of=NetBSD&amp;sf=3

#254Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#253)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-08-27 18:02:40 -0700, Andres Freund wrote:

FWIW, I did notice that netbsd does have working unnamed semaphores. I don't
know how long ago they were added, but they apparently didn't work quite right
in 2018 [1]. No meaningful performance chance in the main regression tests,
I'll run a concurrent check world comparison in the background...

Unnamed ones are substantially worse unfortunately. On an 8 core netbsd 9.3
VM:

sysv:
real 4m39.777s
user 7m35.534s
sys 7m33.831s

unnamed posix
real 5m44.035s
user 7m23.326s
sys 11m58.946s

The difference in system time is even more substantial than the wall clock
time. And repeated runs were even worse.

I also had the ecpg tests hang in one run with unnamed posix semas, until I
killed 'alloc'. Didn't reproduce since though.

So clearly we shouldn't go and start auto-detecting unnamed posix sema
support.

Greetings,

Andres Freund

#255Thomas Munro
thomas.munro@gmail.com
In reply to: Andres Freund (#254)
Re: [RFC] building postgres with meson - v12

On Sun, Aug 28, 2022 at 1:39 PM Andres Freund <andres@anarazel.de> wrote:

On 2022-08-27 18:02:40 -0700, Andres Freund wrote:

FWIW, I did notice that netbsd does have working unnamed semaphores. I don't
know how long ago they were added, but they apparently didn't work quite right
in 2018 [1]. No meaningful performance chance in the main regression tests,
I'll run a concurrent check world comparison in the background...

Unnamed ones are substantially worse unfortunately. On an 8 core netbsd 9.3
VM:

I could update my experimental patch to add home made semaphores using
atomics and futexes. It needs NetBSD 10, though. Also works on
OpenBSD and macOS.

#256Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#252)
Re: [RFC] building postgres with meson - v12

with_temp_install is repeated twice in prove_check:

Subject: [PATCH v12 02/15] Split TESTDIR into TESTLOGDIR and TESTDATADIR

-   TESTDIR='$(CURDIR)/tmp_check' $(with_temp_install)
PGPORT='6$(DEF_PGPORT)' \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' $(with_temp_install) \
+   TESTDATADIR='$(CURDIR)/tmp_check' $(with_temp_install) \
+   PGPORT='6$(DEF_PGPORT)' \

Before running an individual test like "meson test recovery/017_shm",
it's currently necessary to first manually run "meson test tmp_install".
Is it possible to make that happen automatically ?

You're running tap tests via a python script. There's no problem with
that, but it's different from what's done by the existing makefiles.
I was able to remove the python indirection - maybe that's better to
talk about on the CI thread? That moves some setup for TAP tests
(TESTDIR, PATH, cd) from Makefile into the existing perl, which means
less duplication.

#257Andres Freund
andres@anarazel.de
In reply to: Justin Pryzby (#256)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-08-28 12:08:07 -0500, Justin Pryzby wrote:

with_temp_install is repeated twice in prove_check:

Subject: [PATCH v12 02/15] Split TESTDIR into TESTLOGDIR and TESTDATADIR

-   TESTDIR='$(CURDIR)/tmp_check' $(with_temp_install)
PGPORT='6$(DEF_PGPORT)' \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' $(with_temp_install) \
+   TESTDATADIR='$(CURDIR)/tmp_check' $(with_temp_install) \
+   PGPORT='6$(DEF_PGPORT)' \

Oops, must have screwed up resolving a conflict...

Before running an individual test like "meson test recovery/017_shm",
it's currently necessary to first manually run "meson test tmp_install".
Is it possible to make that happen automatically ?

Not in a trivial way that I found. We don't want to reinstall all the time -
it's *quite* expensive on older machines. We could have a lock file in the
test setup so that the first test run installs it, with the others getting
stalled, but that has pretty obvious disadvantages too (like the test timing
being distorted).

Medium term I think we should consider simply not needing the temp install.

FWIW, if you can do the above as 'meson test tmp_install recovery/017_shm'.

You're running tap tests via a python script. There's no problem with
that, but it's different from what's done by the existing makefiles.
I was able to remove the python indirection - maybe that's better to
talk about on the CI thread? That moves some setup for TAP tests
(TESTDIR, PATH, cd) from Makefile into the existing perl, which means
less duplication.

I'm doubtful it's worth removing. You'd need to move removing the files from
the last run into both pg_regress and the tap test infrastructure. And I do
think it's nice to afterwards have markers which tests failed, so we can only
collect their logs.

Greetings,

Andres Freund

#258Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#252)
1 attachment(s)
Re: [RFC] building postgres with meson - v12

I found that the perl test modules are not installed. See attached
patch to correct this.

To the patches:

4e15ee0e24 Don't hardcode tmp_check/ as test directory for tap tests
1a3169bc3f Split TESTDIR into TESTLOGDIR and TESTDATADIR

It's a bit weird that the first patch changes the meaning of TESTDIR
and the second patch removes it. Maybe these patches should be
squashed together?

96d1d0a0cf meson: prereq: Extend gendef.pl in preparation for meson

ok

581721fa99 meson: prereq: Add src/tools/gen_export.pl

Still wondering about the whitespace changes I reported recently, but
that can also be fine-tuned later.

4245cc888e meson: prereq: Refactor PG_TEST_EXTRA logic in autoconf build

ok

3afe803e0f meson: prereq: Fix warning compat_informix/rnull.pgc with msvc

ok

ae7733f46c meson: prereq: Move darwin sysroot determination into
separate file

ok

a1fb97a81b meson: Add meson based buildsystem

I'm not a fan of all this business to protect the two build systems
from each other. I don't like the build process touching a file under
version control every time. How necessary is this? What happens
otherwise?

conversion_helpers.txt: should probably be removed now.

doc/src/sgml/resolv.xsl: I don't understand what this is doing. Maybe
at least add a comment in the file.

src/common/unicode/meson.build: The comment at the top of the file
should be moved next to the files it is describing (similar to how it
is in the makefile). I don't see CLDR_VERSION set anywhere. Is that
part implemented?

src/port/win32ver.rc.in: This is redundant with src/port/win32ver.rc.
(Note that the latter is also used as an input file for text
substitution. So having another file named *.in next to it would be
super confusing.)

src/tools/find_meson: Could use a brief comment what it does.

src/tools/pgflex: Could use a not-brief comment about what it does,
why it's needed. Also a comment where it's used. Also run this
through pycodestyle.

src/tools/rcgen: This is connected with the comment on win32ver.rc.in
above. We already have this equivalent code in
src/makefiles/Makefile.win32. Let's figure out a way to share this
code. (It could be a Perl script, which is already required on
Windows.) Also pycodestyle.

src/tools/testwrap: also documentation/comments/pycodestyle

cd193eb3e8 meson: ci: Build both with meson and as before

I haven't reviewed this one in detail. Maybe add a summary in the
commit message, like these are the new jobs, these are the changes to
existing jobs. It looks like there is more in there than just adding
a few meson jobs.

If the above are addressed, I think this will be just about at the
point where the above patches can be committed.

Everything past these patches I'm mentally postponing right now.

Attachments:

0001-meson-Install-test-perl-modules.patchtext/plain; charset=UTF-8; name=0001-meson-Install-test-perl-modules.patchDownload
From 80d6f4f9a574ddb6250e06490c610969aacdb824 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 31 Aug 2022 09:16:04 +0200
Subject: [PATCH] meson: Install test perl modules

---
 src/test/meson.build      |  2 ++
 src/test/perl/meson.build | 12 ++++++++++++
 2 files changed, 14 insertions(+)
 create mode 100644 src/test/perl/meson.build

diff --git a/src/test/meson.build b/src/test/meson.build
index b86a0f3889..241d9d48aa 100644
--- a/src/test/meson.build
+++ b/src/test/meson.build
@@ -21,3 +21,5 @@ endif
 if icu.found()
   subdir('icu')
 endif
+
+subdir('perl')
diff --git a/src/test/perl/meson.build b/src/test/perl/meson.build
new file mode 100644
index 0000000000..901bae7a56
--- /dev/null
+++ b/src/test/perl/meson.build
@@ -0,0 +1,12 @@
+# could use install_data's preserve_path option in >=0.64.0
+
+install_data(
+  'PostgreSQL/Version.pm',
+  install_dir: dir_pgxs / 'src/test/perl/PostgreSQL')
+
+install_data(
+  'PostgreSQL/Test/Utils.pm',
+  'PostgreSQL/Test/SimpleTee.pm',
+  'PostgreSQL/Test/RecursiveCopy.pm',
+  'PostgreSQL/Test/Cluster.pm',
+  install_dir: dir_pgxs / 'src/test/perl/PostgreSQL/Test')
-- 
2.37.1

#259Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#248)
Re: [RFC] building postgres with meson - v11

On 24.08.22 17:30, Andres Freund wrote:

0545eec895 meson: Add docs

We should think more about how to arrange the documentation. We
probably don't want to copy-and-paste all the introductory and
requirements information. I think we can make this initially much
briefer, like the Windows installation chapter. For example, instead
of documenting each setup option again, just mention which ones exist
and then point (link) to the configure chapter for details.

The current docs, including the windows ones, are already hard to follow. I
think we should take some care to not make the meson bits even more
confusing. Cross referencing left and right seems problematic from that angle.

If you look at the current structure of the installation chapter

17.1. Short Version
17.2. Requirements
17.3. Getting the Source
17.4. Installation Procedure
17.5. Post-Installation Setup
17.6. Supported Platforms
17.7. Platform-Specific Notes

only 17.1, small parts of 12.2, and 17.4 should differ between make and
meson. There is no conceivable reason why the meson installation
chapter should have a different "Getting the Source" section. And some
of the post-installation and platform-specific information doesn't
appear at all on the meson chapter.

I think we can try to be a bit more ingenious in how we weave this
together in the best way. What I really wouldn't want is two separate
chapters that duplicate the entire process. I think we could do one
chapter, like

- Short Version
- Requirements
- Getting the Source
- Installation Procedure
- Installation Procedure using Meson
- Post-Installation Setup
- Supported Platforms
- Platform-Specific Notes

Alternatively, if people prefer two separate chapters, let's think about
some source-code level techniques to share the common contents.

#260Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#258)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-08-31 10:28:05 +0200, Peter Eisentraut wrote:

I found that the perl test modules are not installed. See attached patch to
correct this.

To the patches:

4e15ee0e24 Don't hardcode tmp_check/ as test directory for tap tests
1a3169bc3f Split TESTDIR into TESTLOGDIR and TESTDATADIR

It's a bit weird that the first patch changes the meaning of TESTDIR
and the second patch removes it. Maybe these patches should be
squashed together?

Hm, to me they seem topically separate enough, but I don't have a strong
opinion on it.

581721fa99 meson: prereq: Add src/tools/gen_export.pl

Still wondering about the whitespace changes I reported recently, but
that can also be fine-tuned later.

I'll look into it in a bit.

a1fb97a81b meson: Add meson based buildsystem

I'm not a fan of all this business to protect the two build systems
from each other. I don't like the build process touching a file under
version control every time. How necessary is this? What happens
otherwise?

I added it after just about everyone trying meson hit problems due to
conflicts between (past) in-tree configure builds and meson, due to files left
in tree (picking up the wrong .h files, cannot entirely be fixed with -I
arguments, due to the "" includes). By adding the relevant check to the meson
configure phase, and by triggering meson re-configure whenever an in-tree
configure build is done, these issues can be detected.

It'd of course be nicer to avoid the potential for such conflicts, but that
appears to be a huge chunk of work, see the bison/flex subthread.

So I don't really see an alternative.

conversion_helpers.txt: should probably be removed now.

Done.

doc/src/sgml/resolv.xsl: I don't understand what this is doing. Maybe
at least add a comment in the file.

It's only used for building epubs. Perhaps I should extract that into a
separate patch as well? The relevant section is:

#
# epub
#

# This was previously implemented using dbtoepub - but that doesn't seem to
# support running in build != source directory (i.e. VPATH builds already
# weren't supported).
if pandoc.found() and xsltproc.found()
# XXX: Wasn't able to make pandoc successfully resolve entities
# XXX: Perhaps we should just make all targets use this, to avoid repeatedly
# building whole thing? It's comparatively fast though.
postgres_full_xml = custom_target('postgres-full.xml',
input: ['resolv.xsl', 'postgres.sgml'],
output: ['postgres-full.xml'],
depends: doc_generated + [postgres_sgml_valid],
command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_flags,
'-o', '@OUTPUT@', '@INPUT@'],
build_by_default: false,
)

A noted, I couldn't make pandoc resolve our entities, so I used resolv.xsl
them, before calling pandoc.

I'll rename it to resolve-entities.xsl and add a comment.

src/common/unicode/meson.build: The comment at the top of the file
should be moved next to the files it is describing (similar to how it
is in the makefile).

Done.

I don't see CLDR_VERSION set anywhere. Is that part implemented?

No, I didn't implement the generation parts of contrib/unaccent. I started
tackling the src/common/unicode bits after John Naylor asked whether that
could be done, but considered that good enough...

src/port/win32ver.rc.in: This is redundant with src/port/win32ver.rc.
(Note that the latter is also used as an input file for text
substitution. So having another file named *.in next to it would be
super confusing.)

Yea, this stuff isn't great. I think the better solution, both for meson and
for configure, would be to move to do all the substitution to the C
preprocessor.

src/tools/find_meson: Could use a brief comment what it does.

Added.

src/tools/pgflex: Could use a not-brief comment about what it does,
why it's needed. Also a comment where it's used. Also run this
through pycodestyle.

Working on that.

cd193eb3e8 meson: ci: Build both with meson and as before

I haven't reviewed this one in detail. Maybe add a summary in the
commit message, like these are the new jobs, these are the changes to
existing jobs. It looks like there is more in there than just adding
a few meson jobs.

I don't think we want to commit this as-is. It contains CI for a lot of
platforms - that's very useful for working on meson, but too much for
in-tree. I guess I'll split it into two, one patch for converting a reasonable
subset of the current CI tasks to meson and another to add (back) the current
array of tested platforms.

If the above are addressed, I think this will be just about at the
point where the above patches can be committed.

Woo!

Everything past these patches I'm mentally postponing right now.

Makes sense.

Greetings,

Andres Freund

#261samay sharma
smilingsamay@gmail.com
In reply to: Peter Eisentraut (#259)
Re: [RFC] building postgres with meson - v11

Hi,

On Wed, Aug 31, 2022 at 1:42 AM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:

On 24.08.22 17:30, Andres Freund wrote:

0545eec895 meson: Add docs

We should think more about how to arrange the documentation. We
probably don't want to copy-and-paste all the introductory and
requirements information. I think we can make this initially much
briefer, like the Windows installation chapter. For example, instead
of documenting each setup option again, just mention which ones exist
and then point (link) to the configure chapter for details.

The current docs, including the windows ones, are already hard to

follow. I

think we should take some care to not make the meson bits even more
confusing. Cross referencing left and right seems problematic from that

angle.

If you look at the current structure of the installation chapter

17.1. Short Version
17.2. Requirements
17.3. Getting the Source
17.4. Installation Procedure
17.5. Post-Installation Setup
17.6. Supported Platforms
17.7. Platform-Specific Notes

only 17.1, small parts of 12.2, and 17.4 should differ between make and
meson. There is no conceivable reason why the meson installation
chapter should have a different "Getting the Source" section. And some
of the post-installation and platform-specific information doesn't
appear at all on the meson chapter.

I think we can try to be a bit more ingenious in how we weave this
together in the best way. What I really wouldn't want is two separate
chapters that duplicate the entire process. I think we could do one
chapter, like

- Short Version
- Requirements
- Getting the Source
- Installation Procedure
- Installation Procedure using Meson
- Post-Installation Setup
- Supported Platforms
- Platform-Specific Notes

I spent some more time thinking about the structure of the docs. The
getting the source, supported platforms, post installation setup and
platform specific notes sections are going to be mostly common. We do
expect some differences in supported platforms and platform specific notes
but I think they should be manageable without confusing readers.

The others; short version, requirements, and installation procedure are
pretty different and I feel combining them will end up confusing readers or
require creating autoconf / make and meson versions of many things at many
different places. Also, if we keep it separate, it'll be easier to remove
make / autoconf specific sections if (when?) we want to do that.

So, I was thinking of the following structure:
- Supported Platforms
- Getting the Source
- Building with make and autoconf
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Building with Meson
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Post-installation Setup
- Platform specific notes

It has the disadvantage of short version moving to a bit later in the
chapter but I think it's a good structure to reduce duplication and also
keep sections which are different separate. Thoughts on this approach? If
this looks good, I can submit a patch rearranging things this way.

As a follow up patch, we could also try to fit the Windows part into this
model. We could add a Building with visual C++ or Microsoft windows SDK
section. It doesn't have a short version but follows the remaining template
of requirements and installation procedure subsections (Building, Cleaning
and Installing and Running Regression tests) well.

Regards,
Samay

Show quoted text

Alternatively, if people prefer two separate chapters, let's think about
some source-code level techniques to share the common contents.

#262John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#260)
Re: [RFC] building postgres with meson - v12

On Thu, Sep 1, 2022 at 1:12 AM Andres Freund <andres@anarazel.de> wrote:

[v12]

+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...

It's not obvious whether this is intended to be a Meson-only
optimization or a workaround for something awkward to specify.

+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?

Since we've retired some buildfarm animals recently, it seems the
oldest perl there is 5.14? ... which came out in 2011, so it seems
later on we could just set that as the minimum.

--
John Naylor
EDB: http://www.enterprisedb.com

#263Andres Freund
andres@anarazel.de
In reply to: John Naylor (#262)
2 attachment(s)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-09-02 14:17:26 +0700, John Naylor wrote:

On Thu, Sep 1, 2022 at 1:12 AM Andres Freund <andres@anarazel.de> wrote:

[v12]

+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...

It's not obvious whether this is intended to be a Meson-only
optimization or a workaround for something awkward to specify.

It is an optimization. The parser generation is by far the slowest part of a
build. If other files can only be compiled once gram.h is generated, there's a
long initial period where little can happen. So instead of having all .c files
have a dependency on gram.h having been generated, the above makes only
scan.c, gram.c compilation depend on gram.h. It only matters for the first
compilation, because such dependencies are added as order-only dependencies,
supplanted by more precise compiler generated dependencies after.

See the attached dep and nodep.png. That's ui.perfetto.dev displaying the
.ninja_log file, showing the time for building the backend on my
workstation. The difference is probably apparent.

It's still pretty annoying that so much of the build is initially idle,
waiting for genbki.pl to finish.

Part of that is due to some ugly dependencies of src/common on backend headers
that IMO probably shouldn't exist (e.g. src/common/relpath.c includes
catalog/pg_tablespace_d.h). Looks like it'd not be hard to get at least the
_shlib version of src/common and libpq build without waiting for that. But for
all the backend code I don't really see a way, so it'd be nice to make genbki
faster at some point.

+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?

Since we've retired some buildfarm animals recently, it seems the
oldest perl there is 5.14? ... which came out in 2011, so it seems
later on we could just set that as the minimum.

At the moment we document 5.8.3 as our minimum, supposedly based on some
buildfarm animal - but that's probably outdated. Perhaps time to start that
discussion? Or maybe it's fine to just have the meson stuff have that
dependency for now. Seems exceedingly unlikely anybody would care.

Greetings,

Andres Freund

Attachments:

dep.pngimage/pngDownload
�PNG


IHDR/P�� IDATx^��	�]Uy��B!a�$�a�I��C��V��{k{�_;h�����j����j���k[;����E��QA@��@BHr���ON�y�y���>{��{�D��=��k}������{�Y+W���q���i���O�{������v����	�1�k��6~��a���������~������l���n
{��GX�hQ��[n�%,\�0���.���������{��l�����>�h�g�}�m=���a"��<0��C=�����l��d[���?����a��lk��
����GuT���{,���?�rHr�_�~}�������>�n����������<��u�=�Tch����������v�m�<������}��%I���<P��0K��'���=)�/|���{�����{��7<��#a�}�M�Ea��h�6�l�d�za?��3'��[;��s��R>�/������c[�g��m�V�
�W�;��CX�`AJ��5k�>F��R>��~��z1~~����]w�5�^�#�����+�^�!��~�5kV
��������OG?��O+?��R�u�m�U}_����h�m����j���aj���0�����S?9��b�?�G�sW�X���[���1�y��H�I����9d���O1U�L�G�<Oz���l�����i�.]���]w�:��$[���8 9��F�~�o�|��7�+u��-b"yEj.�-�vR���(��}�o)rr1l���N)��u7�f��9+}��7G�`����k#�\����9�xH��Q�	R>����>�j����>��!N3��;�����]���c�z���8b��j��
3�������zk[Sy1}�����dR���{��^e+�^�b���(5�c+��&k�c��Mb�a��vK�U��{��i���|�z���dn��z�����
o���,{��#l-_�<yo�z�|��UN�:��/bX�s.�$q:5G���=���[�t����^�"����I���a~d�@����IK9�6���^������O���^0�5u������uy�����s=���hcj�`���dJ��y8���F���~G����&�����h!��p�Y������$�"W]uU8��c����X`���`�E�1�|�V���`�'u��A�`�#)gBc���N�U-�i'�o����@������nx����Z��&)},�p���>�����T7�7�����8�2�R�rl���MG�"�C������}#5)��X4��o�/���+�C~������������	>��~L]����}�	~\x�d���h����1�b�
��|�XJ"�%}����	~s��K��8b�aX�M��WD[�����XH|M](�A�$�"�^,���9�E�k�wj�;����665�!��W�S�~r�;��\x�0�����P��!���}���
�(�`3?U��-6!K9��C�a���=s$��9n���7�RE��_���[�����6�G���9[���grl�>���9
��d�������=k���97G��5����S�\�!~d-����x�F�@|��>�z3�����Cpo��>5V0�Y;�/�j��M���?��O�]R�pGp��Lj����W�C3�}[�\sM5���k�\{���1S�db��}�n���d_��25��^9�6����GqD��V�%7D\|�q�%�b]w�u��#�L�w�%���:��'��>]�Z�}"�6�����E<do'5���H���q/������(� �I]�������9�6��b,���$V`�z��W`�6�>u>���S���{���r�m���[�	�\��C���'S�'2~�]�Sm1��o��!>�T������/�?��O�-4 �������?����l�&&�"�bJML��M���(�x>��66��#"�H��L���!8`�L;I~S?L��sH��������=-�Z�
WG}tr����|���Ofss��ps���}��$u�[$$^�t�D��?.HRO0�O�'$s$���[���7?H2So20p�������E>�����(�������,FS�$}�������1$�9n2��R�I�G��7�S,����hM������Ry��"�J��gS'.<R��~��jAD�H��7r���9Ni�1&��He��|��J�JN�����Ps��=��o�����-�>�L*c���9$�d�x�c)U�Oq`c'���g����t�-<���d�x���$��>�D���_�9JB0����"Oas.����	�t�����I�B.��S	������~J�����9bE��C���"G^���#7�s��(�!z����9n2�W��9�h�$k����o��.M���d������(��A�T!}��+���Im#�~2����������5n��Mb�Ro����$�a�M�w�W��M�6}?�P�5��W_�����LEUY���=����M���#�+��#l�����g�f�����(��[�vRE@qo��6u����s�m����"�1Q��co�y�9)��f\�8e
[!`�:��`�k��#�wR�
����{�����9�3�(�S�:���?�������!d�-�}�J�0��z�����<Oj�����oV7�S�e1�g,51��i6�R��7�7J��f>��l�s���F���f�Lb�#)g�@M�	'$��&6�O>��d[l8��P:��}V�~L}2�j<���[�1�P�f���c��A�pOM��#�$���h+�M��x���Iy���X���g�*������8&E��y��!��!���������c���I~S�$�6P��#����1u�"�~o���xt~L�Sl���X����yE��z�y�X��q���Q�W=�A��_����(��I�E�b!��oj�C�'��!����������D���}n��8��y��������|n|��J��b,��������N�)k���78�~`��-�)k��8�SOK��E�W"��x
Sj.�-6�����f����(��9
�>�Ro�����3S��S���r��(>L���!�������F�H�f>�1�f#u�@���C���&.�;���clsc�����al�/��>��f�a��X����S����)����/����^Z�J�#�.���j^K����6Y���K�a1V�Ro����$N3���;�+��&s'_�x0�����/'�tRj�S�/l=�)OI���y1�S��$���K]���<I�N�Q��>)��f��3���#x1��[��mF!yO��u)yX���r��8��xJK�~��)��}^���9$�G������2��&kr��Ro��\��C����������r��4�~�����-���|:O\��Ni�e%�v]tQ�0���m;�?���PFTa��Y����e�*������t���]x��M�xL[�jom%0}���gg��@$��������Gk>u�,b�������_������*�]���N ��s=�8�XB�!�Mjn|���{����W�:���y6�6bb�~�B4��Sl��#p����SO=5��y����q%�x5=	~��r\���$�r�7qM������7�Haa�i��f
s���i��I��6yj<�+�$+�6��x�<�x�M����kr���T��o��\rI8����l���k2NNB�|�!����LSu�J�0q\JO��R�P�k�V	|��_
��v�IN�c����-��0�/�X�
%����:���Z��Y�*^(�X�
%`��P�X��/�t�MY�]���@fK�k�x�����p5�h\pA���x��n�r�	 ^�����)����~f��k6^��x�W��`V�}e�~N��5����|�x�����B8�������,�;��"�x�[��V8�����3��6�w"^8���M��3�1��-���^0�(6v�0��q.��x�u|7����K�$�_}%^����f��m�������������D��������g<���69��&�����;�0�6�ij�N[	6l��)V@�B���Zm ��/~1<�9�1�i���c6�x'��L��TC-!���/x�ZKf5��8����+^�FTCm!`��OY������J����/�$�������W����Mw���J�+_�J������X5�p�8u���|���
����K��[o���~����h�V#�����7V��5��R�!��/|!<����"�y����u�]W�����
;���O)���Vt��o|�[����k��	+W��nrq����	\8���R���a����/�;u������������w����H�.���]���j7�|s��}�UW��~�Zp�c8�����M�q�3���"�s��P����W\qEx��G��y�:iOu�����|����W�r�]w������9j�1A>�h��:��5$����~�����<e��"_'��I������v����=�6�[4X�2���x�����~��'=i�qq�E�=��3x���}j���(C��_�r�O�)^ �����W�{�}������A�����sA��iU����O?��-��o���*b���#����D~F��
�c�=6��;�\��,��/p��G�E�~��wN�%��5.�������e�g��v3�/�MO��f�����m	���{n8��3�HrxO"��|�:����7�xc���{�$��X3��k+Y��^��N;��:���I�Qq��\v�eU��8���<�?l�3f�����e��m^��i�"����.	�e�.]���qen��A�
�����1&.�����6��}������^?�&�������O�7�:��a6|���L�g���������������/�A�����r}��\�dI��C_�F-��<f����6��]�������9PX��G��y�������i64��c�����?��[=������f�kbE�3�/�����k(t�6��|������~��E/����e�@�������f^})pt~�x���?#w��L�8�7�7���y��~���������A�f%��o����!����}�kv�q�j��3�a�GAO�{������}�n��������.��rc.D�gM��������BN_�5�}�i-�5q����h�W�Oc|���g�y�7p��d���M�y~N���\6�
��q��"n<��I�������*��	��W_])�O>��j���w t�����^[�{X�E1�$R��<���������nM��~}��{��@\��w��6c��O���OrQ�q�b�>�����]���%P�B�p������6(�;�E��9}g��U�g�����r�f����c��Q�O�Z�jU%�!���u�#�!��l��P!��<U���>u�'���k�����F���1w������9L�����;�l�_y��U\g�����i���~7����~�5~�`�>"{b>7~�w��HC�|�K_�N�/��ps�9������<'p�QsA/��Y�9�-F�����g?��[������	��������g=�r�wX���|�9���b.�p&��@@����^xa5'D!"�O<�Z��o����N&ghf���Ft��m��S�64Q`�����T"�4�>�`�y��I'�T���#�6�L��2�,���A�f���K���-^�{���k��6�(C��<��b��g������1����� 0U�}��L|�g!���I,l�'�<n��y����O�������C�f3���<��1��t��L��e�"�O�@�����i�Y�8Ob���fP\p3��N�?h2�^�b=?'Og�{=��`#���:E�u�v6G���Mf`�f&�^����~{X�zu�����e����s�����y��y]"�T���3�?������o�61�u������7�z���l���+��X�r��:B�NA7v��)<�����:	�V/��s�)�l%^@��k���������=�6p���'�x��>�	���ds>A��%��F&Od����ft����'^`C��|6h�;nV��In:�NG���-�\�reu�����K����g��	Nx�O<m��%��
�aN^`@��b��~>��`��T
�8,�M��^M'�K�@�����7q����#TC����a�����(b<x
U��n� �+��tnf����K������_�y�x�������N�J������+����� �|�����;l�_z�������+�:��mr����%�K�i�������~e]J~��t��
�O^`@�O��;���gn�jK�{�X�"��/#����ur�c�O^p��-����@?���"@#�A�F��
C<q��Hb{w��i��6�>�t������#8fo���9���C+�� �mv�;���^��)^O���L�=����f$�H�����
[)	d"0���.�	4��d��hd���20��R3�"�O���FXY	L��d��i���ZC��x�5����&�~��i���ZC��x�5
��x�����&!����c&P�0�n�!�x�~0S	(^����������H@��L��m�����L%�xa�z~f�[�����Ln�������j���������$ 	H@��$ 	H@��$ 	H@��$ 	��������
K@��$ 	H@��$ 	H@��$ 	H@�������������$ 	H@��$ 	H@��$ 	H@��$ 	��������
K@��$ 	H@��$ 	H@��$ 	H@������������@������sNX�~��>��O�K.�$�[�.�U�L<��g�w������J3�D�9��	�g�������F�<������x��?��4C���$ 	H@��$ 	H@��$ 	H@�I��@x��^�:+W���������,uZ�hQx�+^>���f�W��uP��"�x�U���*^K��(	H@��$ 	H@��$ 	H@��D@�B���DU/4�'�h�/��^>(^�H@��$ 	H@��$ 	H@��$ ��/��;���C�2cM@��X���S��
7YI	H@��$ 	H@��$ 	H@��ZL@�B���x�y>�F#&�xa�����`��$ 	H@��$ 	H@��$ 	H@�	(^(x�/L�E�������oZ��m��u��$ 	H@��$ 	H@��$ 	H��/4�{���k4b�F�/���	H@��$ 	H@��$ 	H@��$P�������a^��4�Yd�	(^o���u���/YG	H@��$ 	H@��$ 	H@���L@�B���x�y>�F#&�xa�����`��$ 	H@��$ 	H@��$ 	H@�	(^(x�/L�E�������oZ��m��u��$ 	H@��$ 	H@��$ 	H��/4�{���k4b�F�/���	H@��$ 	H@��$ 	H@��$P�������a^��4�Yd�	(^o���u���/YG	H@��$ 	H@��$ 	H@���L@�B���x�y>�F#&�xa�����`��$ 	H@��$ 	H@��$ 	H@�	(^(x�/L�E�������oZ��m��u��$ 	H@��$ 	H@��$ 	H��/4�{���k4b�F�/���	H@��$ 	H@��$ 	H@��$P�������a^��4�Yd�	(^o���u���/YG	H@��$ 	H@��$ 	H@���L@�B���x�y>�F#&�xa�����`��$ 	H@��$ 	H@��$ 	H@�	(^(x�/L�E����
���|�?����7�!�]�6�Z�*�[�.l��i����3�;���p��e���m������mg��bO#i<y!���% 	H@��$ 	H@��$ 5��j IDAT	H@�� ������g�[D����|x�+^V�^��Z+^h�;�WF�Bv���$ 	H@��$ 	H@��$ 	H@[P����x�y>�F
"�x�A��AUQ�0��mS% 	H@��$ 	H@��$ 	H@	�#�>�E/4�'��A/4�3�*�f��m�$ 	H@��$ 	H@��$ 	H@#!�xa$�/4�5j�m��x�S��x���H@��$ 	H@��$ 	H@��$�<���O^h�O�Q�(^h�3fPU/� g�T	H@��$ 	H@��$ 	H@��FB@��H�OzQ����5j�
r������l�*	H@��$ 	H@��$ 	H@��H(^	v���n��B@�B[<5^�T�0^��5��$ 	H@��$ 	H@��$ 	4����������k� ���T�3��6U��$ 	H@��$ 	H@��$ ��P�0��^T�B�|b�D@�B��1���xa9��J@��$ 	H@��$ 	H@��$0�F�]�B��[��P��O�W=/��?m�$ 	H@��$ 	H@��$ 	H@�#�x�y>������5����9cUE��r�M��$ 	H@��$ 	H@��$ 	H`$/���U��<�X�P�� g���(^�A�����$ 	H@��$ 	H@��$ 	������`W��<���-/��S�UO���O[#	H@��$ 	H@��$ 	H@�@�(^h�O<y�y>�F
"�x�A��AUQ�0��mS% 	H@��$ 	H@��$ 	H@	�#�>�E/4�'��A/4�3�*�f��m�$ 	H@��$ 	H@��$ 	H@#!�xa$�/4�5j�m��x�S��x���H@��$ 	H@��$ 	H@��$�<���O^h�O�Q�(^h�3fPU/� g�T	H@��$ 	H@��$ 	H@��FB@��H�OzQ����5j�
r������l�*	H@��$ 	H@��$ 	H@��H(^	v���n��B@�B[<5^�T�0^��5��$ 	H@��$ 	H@��$ 	4����������k� ���T�3��6U��$ 	H@��$ 	H@��$ ��P�0��^T�B�|b�D@�B��1���xa9��J@��$ 	H@��$ 	H@��$0�F�]�B��[��P��O�W=/��?m�$ 	H@��$ 	H@��$ 	H@�#�x�y>������5����9cUE��r�M��$ 	H@��$ 	H@��$ 	H`$/���U��<�X�P�� g���(^�A�����$ 	H@��$ 	H@��$ 	������`W��<���-/��S�UO���O[#	H@��$ 	H@��$ 	H@�@�(^h�O<y�y>�F
"�x�A��AUQ�0��mS% 	H@��$ 	H@��$ 	H@	�#�>�E/4�'��A/4�3�*�f��m�$ 	H@��$ 	H@��$ 	H@#!�xa$�/4�5j�m��x�S��x���H@��$ 	H@��$ 	H@��$�<���O^h�O�Q�(^h�3fPU/� g�T	H@��$ 	H@��$ 	H@��FB@��H�OzQ����5j�
r������l�*	H@��$ 	H@��$ 	H@��H(^	v���n��B@�B[<5^�T�0^��5��$ 	H@��$ 	H@��$ 	4����������k� ���T�3��6U��$ 	H@��$ 	H@��$ ��P�0��^T�B�|b�D@�B��1���xa9��J@��$ 	H@��$ 	H@��$0�F�]�B��[��P��O�W=/��?m�$ 	H@��$ 	H@��$ 	H@�#�x�y>������5����9cUE��r�M��$ 	H@��$ 	H@��$ 	H`$/���U��<�X�P�� g���(^�A�����$ 	H@��$ 	H@��$ 	������`W��<���-/��S�UO���O[#	H@��$ 	H@��$ 	H@�@�(^h�O<y�y>�F
"�x�A��AUQ�0��mS% 	H@��$ 	H@��$ 	H@	�#�>�E/4�'��A/4�3�*�f��m�$ 	H@��$ 	H@��$ 	H@#!�xa$�/4�5j�m��x�S��x���H@��$ 	H@��$ 	H@��$�<���O^h�O�Q�(^h�3fPU/� g�T	H@��$ 	H@��$ 	H@��FB@��H�Oz�Y��r���U�I�.���p����gO�B�=�X�v�m��
��Y��6�l3��Y!l;g�Ve&~fO��3��	����&�����of#@�y��G�eo���U�L��i���<�v:���������x��v��)���Q�kOg����t�R.�<���t|�F�S���|v0����>����S����T�)�S�<cn�x�w&��q�6^u~����3�(K�����w17����������d�13Y�4L���0N(Y��O�=���I����P���a���t_������_��kO���O��Z��^�<�H�~���A��;�cp*�yj���z�W|�j_��E�~�?�~��?�������}�>=,�^�Rr��l��Yl�O��_cYr��u�T�������s�v������s��uA�7���������'��������S�g������t�E��bn=���
����T�4�5���}�������)�!6s��N����F��������,5����~�c������t��q���fn����u��>9�����A�{���1����>���Gt��a�j7�~��0}z����E�}|xj{hS���%�qm4�=H�����I��n�X�����=����n�*
�N���d����O��a����S�y��t�����R���w�e��������g�9���i����\����9��T�>����1r�����\ql���J9O^�
-�;�|�[�
�����+_��l�I�>�`������e�����s����o�9�Y�&u�Q#�G��?��������~z.�#��	$�z������G^�������%K��������mL��������'��.9*@<8����_���a��.�w\�q�Q��J\{��U,8���R�4��w�Q����zjc��Z��~����/}i������������������:�T��'�^=e�{�<��i�@���pW��~Pm����>I����V�[w�uW���.\X������;��N8��C�N;�T�j��'��}���{���������~T	���o�0o����hT�?����14{	�%O8�����]�?��X�N���=��S�Sw�y�*.��C���O~R��<�4�����|���FM����=�=��s,����6��@����k!�����C�~xX�`A��V�^~���V�m���n}{�y�b���v��*O�s�
7�06�W�v���\q���K[��X�y����{T�/����R/�"��]7����r�)���U�P�q�/�,W^�B9��,+^�E���qm*^(�_R�*^H%X������S��x!�^����3N����z��U�P��^E��t��SN�B=�S��x!�^����3�)^ Xq�
5)�r�������w���J����?=���.S>�(��(��8"�G(�P}���M|C��P����x!aq��#N����$|�V�P�i]D�����ZH�B���|1�SFVkO^���/��SFV{O^���/��SFV[O^�
��/���FWKAO^���/���FWKAO^�s�E<y!	_���=ya����1>���c����/U����~�:'��1.���p�!��v�A1D�.73/p���V�l=��O
��sNx���?��m/p�5��r$����_]��9r!�}�����]�P����#������z�z�����E�Uq��?�quL
GAr�������W���iGJq�#k����O�D�-��w.�����n�UGvr����s����(�����z�i��6�w�O����/p��	��+��������9����_����yd��U��
��<�)#���^�z���3�0�8��1C[y�>��g.����Q���K��/h��r$,c���n���(��=�A"��i���k#�,b}�1�Qi���W�'����Uc���On�q����A�P��p���x6}����f�s�G���=�{�6�v��
G{n���*.���^U���x���+���\r��^���$f\�o���������q�����5h�kAz�6��
����[��h�����'U>"f������j�3����r�:��K��� �1��b��������f�'�"mm������;�U�!b��N>�����������i��^y����y�q����+�1��e�?�9�'Gx���=��T�����G�&F���.���c��6�[W^ye�_�_n�������~DN�|�8a������J������2��������.�31��_ �����O*�+r�&��O�@L _=����1�u�����K.�������SNi���w�����8a^�����s����|�v���(?���.>�/|���W�=>�B��1�z�	���;y�8M]�<�����'r>�m���[�HMX��~�O���8���6w��~��U.@<�����x�k�~�L���;y�X�^k6>��C�T���g|�#iB�'^ N3W�8��/�����YN�$��F��~'/PG�U�A�����u������X�/�rd~?�q�x@|�����������?�+h��������4����x|b9�<�� Mxe]?��$q����\��F�����~^W<�u�~'/���}{��l|A�"�&?`���5�Idm1�O?������E_#'�&6�#r!�~�m�c��a���w����O^�������g�G�h'�,m���x���Ne��.r#� |����7|��B���nS��Xk��.s{��������6�+0��.�W�^��/t��"&�r7�����U�����x8���~'/����������k3�b����E~�Xk�k'��h'uemJ\g�zC�=��*eN"�%^0/�=�����'/��K/�&(2_�����M� P1��x��_�b�]?p�(n��k������d#H���x�$�����K�D�d@}�k_�&�x�����4�p�]�m/�N���1J������D��&$7X�{�'7c��*b"6#:@�:|H�x!�M�a}0��zm��0!�1��p����F���	�����&���hL�f2		���L�$�L���{�k�N�f����~�
/8r#�>G?�{�OX6�I>X�#�H��
L�������:�m,�q�K��xC5�t�#������I�y��1�W����:�`>a"�����g���>�^��G=/���Q'6(�D�9�D�7�c���������D����*�c3F9?��0��1F��\���8�%�/��������X|�G�&f�:Of��x������v�c���a��_���xc�E.�/5F��%^ &0��#1��O�q�J�#V�0����s�����1��A����^���%���K"K]�7�h��}�v3�X���unL�/P� ���c�'����w�q|B<�����@�/6`��T�%^�31�M|b}�y���L�-�n�z����M�OL'�x���o��/P�9y����96�f|���.�:��x��Cr"�t�7�z�=��D��b����~G��g�����G�7�h#�f�Z+����F?�c�z1���h�bl�q�]�"c?�c�=�%}��H_�!��
�^��&������1N����:7��G�1���16o�Aum�/����+q�0��CY���:���D���>�{��:7����O��p�?����J��o��w|����G������������^?���}��I����1��y�P��2
��E]T���W���~����%0���*y]��}��9�/h;��������	���r>�
��� ��n#��}�%��w���7�(�o��u�'��x��S'�3��<.2���)�G|�{���g������ob�/0>�8���O�p���(��/���x� �>��o���_W�u�	�����Z���q����;�8�'���������:������������&�M�>"b����:�]�Y�{���X���'G�39C�
��7�z�}7��1��"�5�-���/0�0����s
>�k��>��s��g��X@{���/���������9�8"�1~��^����!���P~V���O�@C<f�JnD�X_���~S��c������u}��:��NL&�!��:?�C5�s��(c��{�w26���r�s+�"�_13�p���Qo�s
�s�N�7by�"�~���������2b�@D.NA[bn������:�\?�~#�!g�?����c�2����s�o�y9���w>�SG{�F?�c��'�-�t��#�9q-�����}�(����3��'^���E���0�?�y{���(�e��O��8`|1�iK�/�| ���o��;�|1����x�q�=�A�O|K�>r!�
���v���{��������x�C\�^��T�x��J?�y��&���r���V��!�2�Y@���H @�����
@  �4��	�$�����A�
$6u������C��\��I��r��LPc�d�D5&o�3����$��q�dT�������	�L||����L�s"���'9�-Q��"�����C"J0��������7(���g,h	���I[$�����{��{?>��b�kS�x��6������d�{,�QO�2��yb-I.��E>~�61;%6�����
�&^�D��x������u"��=,v�}q[�K������tI��0���	������>B���#���1}�������Gq��o��=|G?������\�x�>��I������^�7��[���8��[h{��%8v�`ORDrG�Mb������)^�<m'y}�_�9V1fHpK��AsV�x��PO�*���W�e�&>�?�����4����'�U��<�-���j�qJ=�M�1q<t���w���n�[T�3��	G)^�b3����I��~dD�Y��C�O�w���Sg{�[�x��C����x�����~��)���o!^`%��o��B����+��/�'�8�>D~qc(�p������7������|��D]7%�\A����D�����k� �"�E�7��qI\ �e�O/`~��u����'
^�qq���[�C6H;s�G�l���|� e��O���Aq�[�@]���/yc�u2���������K��=l�'��s�2����P�x��1���@?��������b�3F�x�����(���?�������9sc�������
�E|��N?�O7��b�Z���-^��<��?����(e]�y�����_�Bu�_0���!?b��y����-^���3�?�"�����M� c���r������wu��n�c�<.�M�i�<J������y���XN�x#F��u�(�_�c�[��8��:�k���2���xc����E/�Kl#aA{�&��X������Xn��������17}���~�M%b9����;�������-|��o�6�&��{[�����'�3��|?��ST�-^ f������b�L��:O�!��^�`���k�KiO���d��[��y����\�X��(8��1��Gg��C IDAT�y��}n:;hO�k�n�B���G�[�u�E�55�|��l��)^��s����P�x�W�C��Q`B,�M����8����J{��q�������@�"w#�1^_����0������HY�V��[��+��"g��>������<��5�+~�11��<���x�����8!���3�5�������8��)��~���_h_���^��o�/�����_3O���1�a�D|�/ic|H�����x���\��M��+�1��%>pG���������L|?���0(7�%^`o��O��~�{�]��/b\<�����E_$v0����>Wg��K�@lf�{\���r��L���g,�n�{��{z���`�x!O�?��m��=q_��?�[%>�2��%^`\�.e\��y'kW�G��@_�1�S������yOO�)&"��YF����S����'/�>aQF%��8�����$�����%�J������8X��������M�u���q#��y&,� �A1�>@{�����$�,�I:H,�������
�T�:y!�7V��2>UE��*id������tm `�'*B���������������6����l���
�N�}�L��2�JR�kQr�9y!n������)|@����d��v>m������2I3A�o��s?U>����a��=
w�����!���_�&Q�xE�O�+�Il��Fr�i������`��g�<�iO�U���:y�d�1�K���`S�O|F|UA�12�a�N^���n��&6���Q�������P�z}���I�^������S1X@�sn(1nF�t��������~�K��q���D��,'�%�3����t�����$��������/��x�������#��|����6��>��K�
?g��
)Yl����?���9c?�$�7�"6��c������r�\r����r�~��lr�x3���d�~���������<��Auo�:y��?���=���|����$&�3ru~��J]�A'/�qEb���
���X�����0�K���'�
���N^�'c��c&�HOc�����_YB?�M��u?�Kn��S���"����6����,��
@�B��~L<5�6�{��}����/�1>�C�P��i#��s�A��=�q�
1��yu��|�e� >��\�s���A��7���7`����:y�5&�sP|��s��-^�g�'�v�1��M������@{b�F��B���g�N���Q�N���D�d^�+Ot�9�>�'���Q���k���x�s1{�������
:y����G����`�!.�;_5�ob���~��>�/����b2��	���~�)������s>�w�O���F��aN^ V�xX�y���p�x�q��������=�������O���!���������~(�:�I���{���^�)mb��^?'�c`7�����6�9y�1��K~����cL��V�u���H��~�����ci�����|�y��>c��F�L��!��:�aN^�'�2F���U�Z�[�@���qm[�k��9y!�������qN��\C�`�e����������J��h��X0�������"7���=9���p%��:Z����w����K���}/����Q�=����<E|f/��G���I����m�y��'/DA>k��z��I�6��)^�&�����
������@���d�:��J�x2�;�u���{=��<�����D�
nu6��DI`	��wm/t{8��1�Gq��I�1Ob����L�W��B�
�^���m!q�(�#�C��y�?�B����x��1	X�le1���k��>�[�u����@����a|M��'^`c�P�	 .�s���x��~����w��4=6M�?$G�9��O��|�DN��{�r���x���a�b����G��\/3$�$��~�_�9������/t�'������2v�?�'/���]�R��x/�Bw{:���@���G�Q�<�]b������e��Q����/	,9W|�%}����~D���e��<�-�������D����:���������xB�P�1�����^����[|I|E	1�qB���lR����� �9�K��i����C�C������n���>�<_�U�����x��=�/�Mv�4�v��z��O8bS(�������w|�ONLfkP���'��k�+�F+>��|���'70�X�����0(�a����K6��C�0:7��{T���p���'t�f/�B�O�;�=�4%n��A���'6��9q���+����.P?�Bl�	7�'�QO�����������NqI?�BlO�o��xt<����
.�o���;I�����:bB����I��)V�5q�����������a������c]�St>�~��X�6��,�[�RO�V|�/�_������hu��~����(�b���(m��1��ca�����9�&��l(w�7�����~��n����3�@;����N^`s�������y�z��������{�����������Kx���5q�~Z����x��?����,����Jl&���������?�~����O��]�qD���b�m"6���B)���&r�x�eP]r���x��v����q��9�}�!�?����n�27�<.G]���O��Y��3>�1�)�@�����'�aE�c��y:F?�Bg{��{�;���K������M��=�T���U���������5���*�����y<���Q:s)�P�"�~�����k2��/��0��M��;Ow�G�f��/X����'^��>q�x�����o�So|@��-�Zi;��v�y�D?�Bg{�s(}�����|�x!Nt��@~��h/�i�"�~�����W����q�����}�(r"G N0O�~8mP��'^�,G#N�E�h����8����s���:O��'^�l1�z��
K�;�}�>����{��:�����{"�s�����x�d�yO?�Bg{��!2�910�y��3��������=}_�Fa<���� &a�B$+L�q�e2�*�'�'
�T-��~f p������$�B������u��m���M���#�s�&~��C}�/��]�����a�mj�0��6���#^hK��/��=�����9H����P�A��������$^h~~^�A��6���/��=�����A����g�x�m�V���v�;y�Mm�uV����
+^hK{�/��=�s�B��3�x�M�F����#^hS{�/��=�����a�mjuF���6
#^hS{�/��=��J���x��E�/�6@�j�p]J�a��`"AB�T��u��m:��-$�u?�1��S&�.������W�w���)�:���R�Ae��F�\�������{��$H�O���uY�#6��|�t�y���C�f��xZ`>(��;���=�����<B�47�����.}�:����A9��=��:!����f-�S7�<��������Sh�0�"�'/e]W���%�\��y"j�9~�����|��E<���$u�`Q�=��)j��:��^�=��P��:O"+�b6}��V��J�'�^���qY�'����8�l�v�����!�������W����u�e>e-D_�|]V�.q�x�;O��C��f?9�m�K�o�bw���(�������_�U�M�v���[�!�����(���]1��n�=���������z\���pN��'/��+_���3N��'/�,W�����e��r�,cg\O�:��3�b�����\V=y!�rv<y��\�=y!��v<y!?��=y!7���<y!/���<y!7���<y!/��<y��|6=y!K-I ;����4�x��)WQ��B�|Y���^A�B*�r�/�c�����\$��Q�P�k.��r�,cG�B�9�*^�I��-�e����x!��6/���j]�B*���/���j]�B*���/�g�r�)�,+��/��y��pN����z��*^(�8�
�R	�+�x��\�/�"Y����2\sYU���d;��p�iU�BN�el)^(�5�U�9(���x�,�T��R	�-�x�,�T��R	�/�x�<��+(^H�gY	&�x�0�'�+^��s�U/��+_V�By��WP��J�\y������x!�2v/�������\$��Q�P�kN��r�,cK�B�9�*^�A��
�e��ZW��J�ly�e��ZW��J�|y���\A�B
=�J�0��?a^�B=�S��x!�^����3N����T���+^(�6�e��H���x��\V/�"Y����2\sZU���f[��p�aU�B�em(^(�7����T�e�+^(�7����T���+^(�8�
�R�YV�	(^(�	�����r�)���U�P�q�/�,W^�B9��,+^�E���e����x!�2v/��������4��R�P�k��rP,kC�BY���/�,[^�BY���/�,_^�By�)WP��B��(L@�Ba�O�W�P���(^H�W������S��x!�`������eY�B.�e�(^(�5�U��H���x���V/��Y����2\sXU���bY���M��x!�`�����M��x!�`����3N����z��@a��~{������������_mx�lr� ���Na����l�7i����������N�Z���w�uW�o���V���f�n����n�m�k9|��������E��/��o>��Ca��5a��wop-������K�_������[+��C�fr��9a�wl8������L{���pZ���n�),[��5��+V�;��s�7o�p�-���;h�z�=p@�f�m�_�5d-3k��*��<�|g���a�v�9u��
���u�����g/X�`,�9~����Z�vmX�jUX�xq�~��[�h�m��V�	����������o��C������	m��|�������6m�T�C�����cO��61��_��.\��!T�����k���������,Y21������q�/�������K��[U�U��>��3��{\��b�f �n�g����4�{�&��Mmi�%P��'/����MO^��s�U<y!�^����P�q�<y!�`����P�m.�����d;��P�k.�����d;��P�kN�����f[��P�k�����bY��P�o�uO^H%X��'/���j��R	�/����\��R�YV�	(^(�	�����r�)���U�P�q�/�,W^�B9��,+^�E���e����x!�2v/��������4��R�P�k��rP,kC�BY���/�,[^�BY���/�,_^�By�)WP��B��(L@�Ba�O�W�P���(^H�W������S��x!�`������eY�B.�e�(^(�5�U��H���x���V/��Y����2\sXU���bY���M��x!�`�����M��x!�`����3N�B�����������m��'?.������|�z��	�3��xW�B=�S��x!�^����3N����T���+^(�6�e��H���x��\V/�"Y����2\sZU���f[��p�aU�B�em(^(�7����T�e�+^(�7����T���+^(�8�
�/l��)��U�
������_����w�; \�����p�a�nd-^�8����@�	(^��E����r�)���U�P�q�/�,W^�B9��,+^�E���e����x!�2v/��������4��R�P�k��rP,kC�BY���/�,[^�BY���/�,_^�By�)Wh�x�FQ9���sNx�3�����W����>;����)���ZA@�B=nR�P���(^H�W������S��x!�`������eY�B.�e�(^(�5�U��H���x���V/��Y����2\sXU���bY���M��x!�`�����M��x!�`����3N�B��4�S�p���+\H��e[G@�B=.S�P���(^H�W������S��x!�`������eY�B.�e�(^(�5�U��H���x���V/��Y����2\sXU���bY���M��x!�`�����M��x!�`����3N�B��4n��
�k#~�w�R�m��P�P��/��9�*�R��/�x�<��+(^H%X����rlsYV���d;��p�eU�B.�e�(^(�5�U�9i���x��V/��X�����|S�+^H%X�����|S�+^H%X������S��
�BJ-+�6P�P��/��9�*�R��/�x�<��+(^H%X����rlsYV���d;��p�eU�B.�e�(^(�5�U�9i���x��V/��X�����|S�+^H%X�����|S�+^H%X������S��x!��e%P�������0�x��)WQ��B�|Y���^A�B*�r�/�c�����\$��Q�P�k.��r�,cG�B�9�*^�I��-�e����x!��6/���j]�B*���/���j]�B*���/�g�r�)�,+��/��y��pN����z��*^(�8�
�R	�+�x��\�/�"Y����2\sYU���d;��p�iU�BN�el)^(�5�U�9(���x�,�T��R	�-�x�,�T��R	�/�x�<��+�B�p����W�����xGX�|yJ{-+�VP�P��/��9�*�R��/�x�<��+(^H%X����rlsYV���d;��p�eU�B.�e�(^(�5�U�9i���x��V/��X�����|S�+^H%X�����|S�+^H%X������S��x������%�������K8��s0�x���"�x�w)^��s�U/��+_V�By��WP��J�\y������x!�2v/�������\$��Q�P�kN��r�,cK�B�9�*^�A��
�e��ZW��J�ly�e��ZW��J�|y���\��������.\�����}m������v�)`H��e[E@�B=�R�P���(^H�W������S��x!�`������eY�B.�e�(^(�5�U��H���x���V/��Y����2\sXU���bY���M��x!�`�����M��x!�`����3N�Bc��6m
�}�s�w�����}(����Z���+��^��J�p���V'1���8P�P�w/��9�*�R��/�x�<��+(^H%X����rlsYV���d;��p�eU�B.�e�(^(�5�U�9i���x��V/��X�����|S�+^H%X�����|S�+^H%X������S��X����W�8}��/��6"`���+�k^���v[V� p���Wc`���a�����3�\$H;��S�;wnc�5��������]w�u�&Un��u����
���_���R6����������iLY�3���h����)�"=�PX�fM�}��S�4�,����K�6�N����[+��C�fr��9a�wL����?�p`����{7�>9*q�M7�e���0�+V�;��s�7o^#��Z	��T�����p�a�m�)��W`-3k��*��<�|g���a�v�9u��
���u�����g/X�`,�9~����Z�vmX�jUX�xq�~��G�z��v�mU������k!��v�?�l�}������G���Z�<����!�am���mb���=�#,\���C��OY���sm��^��d�������'G����~)���@�����W�����O��OU�q����-�kr��6n�X�A���0k"I��v��_%x�B	�[����z8�\��R��/����^��R	�+���������H����e������H����e�����9i����e�����9(����e��Z���T�e�{�BY���=y!�`����P�q�}�BJ�,+�q �x�/*^��s�U/��+_V�By��WP��J�\y������x!�2v/�������\$��Q�P�kN��r�,cK�B�9�*^�A��
�e��ZW��J�ly�e��ZW��J�|y���\A�B
=�J�0��?a^�B=�S��x!�^����3N����T���+^(�6�e��H���x��\V/�"Y����2\sZU���f[��p�aU�B�em(^(�7����T�e�+^(�7����T���+^(�8�
�R�YV��$ 	H@��$
W IDAT 	H@��$ 	H@��$ �� 0k��O�4k�)�&���,��D��_����g����H@��$ 	H@��$ 	H@��$ 	H@��$ �a	l���;@���;�	��/����M�k�K���0��'	H@��$ 	H@��$ 	H@��$ 	H@��~.\��P��P�&�T@��/�0T�0���Ob�0���-�e��xm�$ 	H@��$ 	H@��$ 	H@��$ 	H@����
�Ux\���=.K��x���U��8y!�~�u��C	Q�������$ 	H@��$ 	H@��$ 	H@��$ 	LF�����~.X�\���y��/��0<���u�����&{�����$ 	H@��$ 	H@��$ 	H@��$ 	H`��D��?�����z��Y�q�1DC�r�d?��$ 	H@��$ 	H@��$ 	H@��$ 	H`H�f=�K�)g����/t�b��
�_81����$ 	H@��$ 	H@��$ 	H@��$ 	H@��@���f4�����
??Q�S������$ 	H@��$ 	H@��$ 	H@��$ 	H@)�~������q����:^������x\������)���$ 	H@��$ 	H@��$ 	H@��$ 	H@�&�������	I���&N^�b�'����V�z*����K@��$ 	H@��$ 	H@��$ 	H@��$P�.�~��x������*�%$ 	H@��$ 	H@��$ 	H@��$ 	H@k���!^�����0���I@��$ 	H@��$ 	H@��$ 	H@��������jS/�p��G������?wJ�}�i'�_}�/�����;7|��������6��]w������_xn����/[|��o����w��-~��S�~�W_��-�<�jJu����$ 	H@��$ 	H@��$ 	H@��$ 	�����O>������a��y���z_��g>7t����S��~��oT�}����xBh0�g����-^8�O����W��.?tY�s���q�>���������% 	H@��$ 	H@��$ 	H@��$ 	H@-�Y}�����Z \��G���Y����p��C�Y����!��������goo:�]�/���������������7�v����[W�;��;���g����'�Yo~C����{�~������lU�X^��@w�	H@��$ 	H@��$ 	H@��$ 	H@�@cT��A��'. \�����p��+�?����#_��x}��?��A&����������}D���P��5�J�p�W�e>����]�������>t/t�_��$ 	H@��$ 	H@��$ 	H@��$ 	����Y�z^{�x����?����������#?t(C���n;;��;���g�o�
<y��~��[�w�����_����[���F����$ 	H@��$ 	H@��$ 	H@��$ 	H #�����=��J,����f�B���E�?������=/��'?3i�:�|���{M���dx���������$ 	H@��$ 	H@��$ 	H@��$ 	H�m�h'%<����m�={v�����:t�����W'/��M��~���G}4��]gM�N����SO���"�y���E�?#\z����eK��?���������������lU_���g}% 	H@��$ 	H@��$ 	H@��$ 	H@!%^�
�����E�g+n��\�����/
GqXx�o�<�q�]a�O
����J��w�Dx���a�f�����/���n���|�V�R���S���$ 	H@��$ 	H@��$ 	H@��$ 	�K�6�B���j��$ 	H@��$ 	H@��$ 	H@��$ 	������x�zJ@��$ 	H@��$ 	H@��$ 	H@�������1u����$ 	H@��$ 	H@��$ 	H@��$ 	������x�zJ@��$ 	H@��$ 	H@��$ 	H@�������1u����$ 	H@��$ 	H@��$ 	H@��$ 	������x�zJ@��$ 	H@��$ 	H@��$ 	H@�������1u����$ 	H@��$ 	H@��$ 	H@��$ 	������x�zJ@��$ 	H@��$ 	H@��$ 	H@�������1u����$ 	H@��$ 	H@��$ 	H@��$ 	������x�zJ@��$ 	H@��$ 	H@��$ 	H@�������1u����$ 	H@��$ 	H@��$ 	H@��$ 	����=nS[*k=% 	H@��$ 	H@��$ 	H@��$ 	H@?�6M|��Y�H��}���iG�n(���k����W�%K�d�:S6lw�}w�s�=GS��W�=��f6�2�lN�d��������c���6�d�<s�g4�������h��F�}���{��a���a���������i��������8��U�VU�v�a�:���)�6�a��c1#���d�������%��?E�&�?��m@����Yp�	(^(�aoV���j]��,[^����j}������Q���)�7���I%X��8�g�n��u�S���Z�?����?e��X�fe
��e�Oy�)W�?)���'�x��|I���I�W���)�8�
m����O[v�	(^(��q��g{���T��'�`����,�T��ts�'�G�-���M��R	�+���rlsX�?9(������ay��3N7����������?�����rP,c�M7��!`{��4���������gJe��x�W������+<v���5���~���Zv����?{�P�����y��a��[�:N��������?�`��E�����Rp���������?>�WN��u�ma���r�a�_�>��3g��o������^�����.��=-�-�o�sJ_>�����_��p��We�N]������T�3l{^�`����[�j~��
����?2�{�|����^�3�W��;z��f�C�Ts����=CW�����Z���w�m[{~����3����l3oC���5�n����nx����h���S�� �lP����D{�^���v���Wj�%Y'��={�4-4����=wb�
a\���������M<��&|����.\���&Tu�:�k��wK<u(9�t��s��G���=�?9�Z��aG���o�g�9������a+o*U��v7n�����?_/���a��vX��_���&�s�:
j��Gn�W?<������]��6n�
jO�
�}���������g+��������=Kw�7������w����8���=�r�b������=<v����E'o>�j8����no����fr��_v[<��m
.�?n7�l� �����g��]]�"4��+^x���>�@���5eg�����%�c��JX������*}�l��[�Ox����������p�����^w��`������0�������]X���
��,dp��Ml`�_�z;�nv
~�-����|�)��3����������/iGe������ZyO+�p����%�J4���SX=�B�����q?���h�����{�k����a��/j�_,�4|�����A����=w\�/zvn�}���v��G���U����|���{��A���<`��p��)f:����q�t�Z�f'�:!^�����:�r������
��eG.
w>R�l��?
���:��=����w��o���8���=�6�Ns(^(�oV���j]��,[^����j}���x���x!ud��W�����i/L�O�B���X���J�������/qu���*^(���T�0�Q�o(^�MT{9	(^�Isk[���-m}��W]sC���{���sj��5����w�9l�����	��5�� ��/�1)��~|K����_z���z���n	�=�k���N<��-����|���1>�����Q�Sh�}/�������=e�K�u��J�ly�S�o�u��l�x��/�������$��<y�+����n.�smx��q��v�.�n�
�/l��)<|����g�4����a�K����.�oZ��U�����p������>u�9��;~8%_���?~�����t~���xwx���~�����+����Y�����m/�K�������8=|��O�S<)�����C��i!�-^8���M<�`8|����7�V�?�~��3�w��yS��
��S�>s�_�Uk���|J���;��rE�����W���a���;{,�.��o���?�R���'/|��O�W=����_�h�_���)�������9��3~kJ���s��|����y��K|gx����e�M�������#/|m*��'/����
��������;g��T�2���/�}��p�
��;��?�P���_�r}(P���������}����_������)����������T.~��}�
�x�1�]g���/>��p��5�����[���s��g._���7~g���wO�U'��(,�av8�s�{��^�c��c���?~�����O�~���X���/l���0����������XV}xz�T��'/��{a����z���=3��?|n�����OXv\8/��WO�_n�x��o�m8���.8�m�y/���������U��X8���?��Kg�n��m�x��/9+\���_{�G��?��)1�_.y��3�dI�������N����R��b:�b�vY�]8�Y�e���KO_���n�2����;�Pn���n�?��.}Q��}.���'���7�6������-���]�����j����05�Kc%^X�����O|:����f����_������c�<4|�������X~���H/����y|3��������y�	[\���X����v�=�~��|���|e�;7��ic{�+F@�B1��aoV���j]��,[^����j}���x������{������+�-���/��������9����o�x��?	���q�s���!4Y���_:+����o��?�x��}��wd��o}r�}5UL1�wl�x��~���S��g��/{[���v�Y�S�~wx����������
g����[?����yh���>�>���O�7=�7��}���/������sL����k�xa����������/����W�J�p�w�3�8��y`E��G��O8vb�+�����{^������\X���+r�^�K;��]|`����N��W�v�����s�iD.���_X���a����/}�����{�/_��S�96<�����N{c���@��`����.����"���7O�>�8���C��-�n�d��D����a�p��V���|�����s����C��S�9��n\>x���?>��D�(^x���
s_tT���6CyD��P����/@�]��-�u���k��5k�mw�~�W^��w�~��_�����o�qnX0^X����[�xq��9_���/l��)�q�I�O^x�G>^:q�����~��0k�U�{��{uz���������.��w����'���}��p��e�w��c�~�7~)���}c;�k�A���O\���M�j�yZ8�)���q���1��c�n����zX8������_/�x���IA���������;m
.�<=n7�l� �����g���{g����7���%!
w���)R\�K���^�xpw� ��`	qw����K�D6�n���<}H����9g���w~���Z�S��J��/d�??x�C/=T����r�$|�C���;$,�3�r�C�v�Z1q!8ve	&
:@����5hT�4�uABp�0���4tl6	��FTl�����yqgK~�����x����RS�C�q�Cj�P�X��b�?Y�`���j�N��^�L����/"�������6REw[-�	L�URfHL������P��*�kM%��-V��S^�"�9��d&�A^S�N��{�[�yW$?��������� ���R[P�����C���``��ht����+����Sk�5��� _$���qP��
��z������s4��U�GQ�����v����G�i��X�'\������7��u��i���j:�bW>X�i4T�iw�&��}����m�f���j�"�>���A9L���X��'������s�
\���w~Mm=�@q�yp��|��ov]]5m��7���7AQ���hb��{&q���m�b��q���������k��������`q���nHl(��u�1�� ����[P�l�k�+���_����!��(�o��g`l��0�1��3�Ng���'�}��U�K4u�E�����8���X���P^����>��Yy�S��.���>z������8�{�X���)#%%������}�������b�fh�d �<����h�~�^9< �����h�nN]�}AUUjjZ�|swo��C��`�*��g!2��Cz�
�}�1v�36���������%�nA��F�hUe0��(���@���{�+�!^����������u�lN��A�:������&<��]�#p�h��6������� 2���9h��{e�,��6[���ho�����1v�>����B>��i���e�m�9����	��`�k��O���{���7+�j)!$2Kv|SU(C�'n�C]����uh�a�?����YMm��y�H8�U��'��L�����3cz�������0c���T��^e�X�_��oW^X{�FYc���]�"�������U�!:1�:���7��B0�>�P�>S�������
��\��?�D}���6F]�
F���
�JUMm���y|��������>"{_���������+/���+o:cq�)�w�e>�Oy����x���6�������t?2F��F�����+��������B�yab���������T��6BG[��������i�i~)�r������z�`��z5���1�I�5��~���M/�n�:�jK���.W�TL4�q��������<]�rX��:�c�������q����m0<��`�k�����"�#j��B=#dP��]?u�1�q�����p�t�'V�s
�����'����	��C�B�C/�����9*���[��	��P��@���KKQ�i6��n ��������J���O)/�k�cI���"��/^����8<a�;����4�=*������8 0�Ck8���6��w!�`vf8�������;@G]
������mT23��6���uu�����Bbb��By�?vS�����2���C'0�k^�}v��c�{����I��HHNAD|W^��v��n������y���=�R�=H}lU�"z�������
��}�� xA[G�&�P\�����,3�4C�*V/��Q���V{���:��@6q�)�-���"��/?�Th�*`��`�&g��q�����w^I8~0�v�k�v}
��{�����*W^�O�����>����X���ea��`cD���00V���1�w+����4�����\y�f=�����f��������9B��A���IH}�
�iz�JG��(h��y-�#v),�?���p�y}hO�E�:���-t>%�C�!�!����H<��"���w�d&�@,2B��V�S^0�R������ ��=q��K�=�Q�Xy�64w���~���E~
L��n>���-c��m`�������5�`@k�Dx�1���GeKc����n��,{�}�+s��w� IDAT����84�b�y�.�}M���P�Rm��yr�f<b�30��}�����m��;$(,�f�n�sT�PFr2���~|xw-��b���u�SU���yv�!-5�|��{^��#�:0����nc��O���ayDG}�c��02����� *�r4�&-f!-=	�;�C[���~��P��0�����.@��c||w��d2P��X������7��4��LP������'{x"���}�l��_+/�g�E�B�~��E`��ph�
����{Q��-��A�����N��3@AGY5M8=�����=���F��	!�-SU��5��GG�YW���c�|v9)�|B�J��3��g�0b�Q�����-n^ZG�_�C,���7��U��%�g���Ht\m�Rvq�7:jB������eM6 Ps�<�����T�y���M����Y�t�g���A��a^�x��r���?{�z_�G��T=��rC�����(��jC�H����]�����$���y]���[��/��U����d���k��f��v��P�{M��dx���e�Z��������v��}~ Mg@^Q��kQG3�7%�d"-1�����B#������p���E?Y��jd���Y��x��]?�,�'?]�[�/>��P���4B�#��L#��a��s����Yc�7��a�������u9����D�;4���n�-��dx�������G���7���p�������3r$��=V�m���N�V��92|�ow���������H{��r�P�k����xQy#
(7+�����z�U
m/���������&[)����M���mN��&��5�O���Q
���8���i<rt1~�m���X��_�����)�����X�Vl��i�~%���<S<8p�����g/=�������#Gy!��H-�M��vu�1������\�a����3cC�o�f~�B�EC��o���c��(�Z��O������7�������;�vl�;������c���(k�����G�#H�~��#,���1�#��8=P���/d�������X��9�0��c��i	H�b�/��jaX����<�+��s�+�0p/6]K�����?Q�Jg�z�^��/�?;��v��_V<?xa�������t��N;&�R�����X�$�V����"v{Fcde]������"j�8���L
U�U0�N655����hk���~�?b�x��Z[j`��hnO��
;��2	2�?���&!��
*�j"v�Jh��LZ`Iv��v���
F������F�_�.�V�q�|VZ*��+ #:���9�=d&���Q�����F��sP����H�^�(����Ia��=_x���0��Z��DPL(�[T���[n���^����rV\��^5;!0:��?��[����~���[��_�n8��Xj	v<�M0D�?�7�Uo��w��#�g����s/�r`������) ��^��]gq@a^��8��
�W<��8��v�������~���S��Smc�!%�q������a�t������N`Q�����X|��
���`�e��������Dz�{����6�p��5^�A�w���(��z65���8Un�3����+�y�����vup���;���78�^�#�F�=���M>�=;�����^`���:���q��f����D\l�v����W�n���b;�^�8����|x�?�u+{�A��x��]y�|}^p���y�U�;�<y����{����8�)^��8����7�;Z�3���k���W�1��B�A�gp�6��6�n�����w�c/<����/0�i'�^�v����9������v#������C
��N����>�"����*�������"s$~i�G.C�z����D��6�� 9-���|
=\"5xAK]�g�����h�@WDa�\�	7�x�����D��j�������������\ZC�����2��)���|����\	��1��y*��4�z��G�aA������^S����'�h�������{aVu�����y9Glr9��v5P�L9�;��O��pj7"m*���[�1��
F[��]�#<!�\/��\�x�.Ua����_�5�>��au;B� ���/�s��tZ��,u�����e�����j�"J5E��Bpl"�)���0�A�T��O���2�}����ZVFJhio��f�$���~M�^�C�2\���m������>���koP����)g�����G~����*V���������"�����-q�=]�A~��e F��{c�����W�I ��[��`W�Au��5�[�&Xt�:W��o�a~����j��"81�����������>A!?x����6�u}k�&D@���n�C��K���,�D0��
��M�!H"p3��`���B2���������;t������,^h^�ul����5�q��?u���#1p�.X�����Xp�,�R�/Z��
���z`���$_��=:����y��}��,�t	�z�!�>��cE�d�:����jo�Q��;#��s&����	A'	bhMu��]�*���>Rj�?zt����86�7�Z�5�Z�U��=	L���xj��'�x�����	#��iiaVg'�^Q����u�Q����
G�F�x�����kZL���B9���c
RNh�\G��b7���c��~^UU�ad��O�x�%�N��E�,0��mU`i��A.�r���
V�=����>WO�O��'	��T���8��K�p�!��@��:��6]���vP*�FL0���H����y���*P������P���4Z������#�`���������Oi�"8A�N�sx��
1+#�y99�R�yV��)�]h��?����>�F@�Z��J�&���������W��N��SM{�q}��s~����aI�r6������[������B�rXGL�q�z�X4�
F�?���T�p��:���#� z.��U�;b��;�I���
�Ev*�`gf�q�O�w����������O@*B��C�JDt:�u���^Qh\S
��=�E��-5	n�#�E,�!?x!%%7/�������m��M���?�_cSRV��.kxG�w��-��`�u�����pr�tZ�$�>#���1���D@k'�mV�J�>|N��"^��u�Wh��e�j�m�
y��d8u^�O�h���=&�����}Km����-F�:�daD�V� ��E����s0d�\����<����e�e�l��Sq`�2�3���m`gh�3/o����U�6�I��g�������h�����E�~x�_���M�abV��;���FGR]�z~�k�1|��������&�����:�^`�-����X7V����_i���C�UF�6F���4Dt������;+"x���c�pmA?�D������4QD�[2� �M	F�i�x�'�Qp�
>������;i!����.08 �-)�/.	�!��7���Z��>9��U`�H�vm4O�K�����W��65���kLpaZ0���M=����f��V��+������������_�����+�tK�@\�����Y�0��
��:��!0T���O����t���W;1���T����Y/�k=�cD�P������k��N9L|��k�{���_�Ml�P��]n��]E< ��u�?�,������+���9��B
>���N�r;�=�!EJ����1������A��P�6Y�����������i��9=C����G�w���.�i�R/�<
�������7�?��{C�w����0�`���wb�n`��7��A<�V�U�2��0����'�������~���l���#"����O���:B��;	�`��=�< 
/d�kO�q�����ah���5�P�\�[9�7,�\~�T�}X�!���`��(m���x�w��5!>E�X��/m�������`S���dGv�!��>?
�X�j��Q�jg�{�"������>���������:.�l�5gcQeZpyz(��E������)p�����"�"�KFRN�M�D7MLu	�_���L�A���I�����:Xi�N�r�S���
�2<������&"D$g�A_5I��(G~������W�P�4*���oh���oxz��s�J�����@�j5��SP��6�=�����m�x�v��"
+�3��XM���V/v�R���T��!_���E�*���J>�K~���h[�9th7�>RQ�7t#���L
��2�z. U�?i�,�C����� o���+$��������B�.)5��/�ei6������}�TU���S��v^���X���I;�U�'-��t�����l�h����\]�~t����~q�+=s���
������:MHI��^&*�/]?>�u�6��@�9�� �I-F�vV_�J/?Bs���-F����6������'��'w��L��7�!����;�����O?�,�t��l^������b8L-���|G/j�w���{���V~����h�f�I����
���D;�t�r���	��}���S�?%��Ws����AI�!��
F����[���\m����v������d�e	��|�����:UR���yB�(�Q��A�LPVT����Qu�9�MqG1��&l�1�����
�/�9���������6r�V��u[��������am����;r�<��>�GHQ�����r=S�<���8�x5:���w��"�Zx|{�:x�����M��qR~�%�B�C��y1�|�����sS}\s���[\y���0|$�`�;���;�)Uey������?�I�RIl�i�T�����Dx�G�%f1���H��� Ru8��|��1|�RR����P�X�[-\�z�&���T�.W^�@
	:FlXI`C��L��
.�0�y�QN���1�|6q��6���3(��������(~�`G�:�<���8��<��[�T����!�8��-���sU�;���JbwGL>z����>���?��0��#������`GyS���_]���?���C

�mL���j��i���a�n��G��m�� ��������G��Uq���y����<��7:+�zb����U1�ak,�}�7��6B�RI�n���B��5a�o��<�I�%���B<���E=��R�����^bS	HLf�T�N�
s��=�1s��E�n>v�<v��uh�rx!-9�����^��V��e
��V��TP�7o��f�y�� (??}7lG���p����+�r��ec��&�\����:����GQ���C;����-�J �":������`��}�n({�|G��Rx��#�9�$��,�wlK�V�H����+�Tq���EFa�/�1i�a��0t�T1/�.K0x�o#���3���xd�w�P<����a��8�7�w����l�{��z����3G#�����X�W��P�}E���m���%��@/��uTC��"�&���
)$TrP��q�����geCB�h�L�r����DRs�EM~�6�R�N����D��:�+����I�Mi!��*�84���-���h�m����9�LA�P��%%$������RA(WQ�Rye*�j�5�J���Hm���~�\�A��*�����S�T���TI�s��3U�e+���^`��H���jm���]��} ������a%k��-�
g��6U����
���f�l�I���AE+��s�.�bb�Fd�ko�v�wa��>��X�5��NE���)x�b������G~����<:6%����Y��R7�bv��F��)|x����W��XY��wH��,���
�"0�����m��W��,�d:��~to34�~v�I�N
e7.�'�f9<_�&���\�a���K���8��,����F�;>�+(0h�=��>�+M*��
==[hj���})t!Pa
�]�+���U��B�|W����X_�Vh�.-p��N�_�����o�t������s1��|qC�|��B%R[�V�+<^^!0�$W^ps=J��l��}�~�mGII�`��t/��?�I�����H�e��}^`��h���,
��k	��������*O��`Ln��UT�k��U
>O�`Z]�/��<�������A'G��R#\�#9���^�
��
H��Y� _A�����_WM���
�u�H�!���f�&-I���lR	�S��e�)��"=2sx������e�<�����:������f�9i#�/����/�`�S���,&4�����	�^Z�
L�s���1���/X��6��}/���m:����� �����	P��~�L�kh��!L�8����i#�?]�?��������_�
tSR�*���'H�0������'�r^�B))�����|������@��Ju���^P��'P� �~��gP�Z����K�*~/0 iD�����w�~��A��Xa�y�R/x������8"�(-��;�HJJh������q����8:�9�p��y�������(-��5��T����h/�sA!�����T2���@��@a�B���,�J�����g6�����������+c������6�I���������7�J�b�0�{
��S���lo�/t���3�L;��_'��W��:���2���^�1��N�>5�v_������f?��U��D���_�'n>�C��ay�%IQq����#oc��N[_E���
-*f�����B%�� ���	hVF����0��.o6/����������%r���&�\�mH�����V�K�v����%���;�]�#��V/���#��6��@��3zl��.P����J��W���U��2I�\�f3��Y���wj'��v!y^Mz�|�^2W���v\�A�I����{�(���
�a�=g�h;��$(+(��kHy�-�3�����r����z�Ky���]�M��)uS?p#U�_(5SShS�)��~����6`�SOXC��EB�^��������I9Z�������+9���;\��^��a
O�����^�0�?�����$O]q�vM���M�{���@�	5������z�;��/�r�h�
}������RH$���Jo�}�*���
����`aS�`�d��oz��S�'I
^hJ�?n���N]g�J�a��/0��gWs������J-,����������0y�I�_��IeA���GReh�t�:�AUZ���a��@�@������1s�Y�����CY�]-g\�"���L![y!������5���N�����&���d�Gp�yEZ�sGcJCq��/Zhl�a������Rc4\�/(�G| �Tx�����2:�pp#�a�Vp%i���J�f�������{L]��H���>I�G����KaJ��2��a,Wf��~��0��6	�w��\ya���j�
���z�2��G�\y���h��`���"M������(�	�AcL9�����`gh����1�v�t�J*���lF

��By��y��;]��l.�z��B��-p��*)/t �i-�'��F�S^hX�*c#0��)�X~���'���T[��F%]��bo����'��"�A�|��<)Z��������R^u�66�i�+o������nmIy�� ��5m1�Tf�u�m���.Ow#���`D�	U��8���S��z
�k6���wD()/�B��`�g
-�.Q����/�����Hya���`���v�+/p��&�����UV����K"����q��1A�����=r�wJ	D)!�����~����<e;�Q^ �A
��FH&��@R/�2lWJ���S�������:���C���^M�{��9c��Q^`i;��wjL���+�N�
=�m��=����Hy�O�ZtJ ~
��:��W��������p�B�Q��/���/�_��,������xA*&g.qW�:��<�+����k�6^g���<�;?A�����J;���	�� IDATi�.��,	�,�2�]���N
���^
x�v|��@��-U��K�Yb��O�s��M��J�FJ�"���"WBc�
�Q��;�%e9bR�h���x�)C�l���C���.WP��y��"~
���\^�������3HB^�w=���T�$(����
)/���J-Uz�M�z�lX��(/�Nl�� G�&]M��"R^����SrP0P@���p���FH��7�1�6�WJ����1�E
�����O��i5����1��(/�Q:fK����|�������X��N�E8)/�iR
�q�0�V���>OU���=���:���m2l(�Cy+e� 8%^`�)W?z��V��q�aSY��^H��ha���W	h�j������A9RD ���kh~��T�!��-k�&��/��F���������r��J=�yI0�W^x���l��V�DiSq����W�gn0����^p���+>���)5H�6�D��T��q����)�����k6��qp�r��3��.��6��wO
�u~����	�	��xuC~��#�&�Y��^� �gR^�G��I���f~x��*l�+/�h7	�L+���8��:]�T�{?�/��\� #/0H�b'M����/D�����&^��ERd�����!��w%��y���T�N"���x�7���o���b��(-
Si`�DN;
t����O��/0�����6���~8U{j�����OV���l��L���f�2�UJ/��?���xMTyj�3q��
4���r���������4��dj����d��|�Q�p��
zZ�����PA�,�Gy��K_�����Z�@���f`��MI���V^�afI�Y��u��`����i���`g�L�(d|����N.��J�#���Bus����BUS�?���Er������]���4~o9��������Q^(��eV����D����C�uE�Z��Wc�����(�������l%>u	5H���F|/���F����~�~��:
����y�IOu�J�=4�����0���(m�< =/�Q���F����l5Th�;�������`mH/�����=4�bAr��hL/1�~�QN����Fn}^�^�����\\���v��|�����������#��~�^�1��iW��l^H����6,^P�E������)$��|a�����vto5����s.G..B�v�)e�����?t�����IQ�D/����������w��/����"h0���I9!Gy�+*{=c�%:��@XR�4iQ� [E����/�>g*]I�a�{��I�q�H�������#��N9me�RA+�E�?��l_��Md
OS�����������x�9eht��}+9����+�)�c,�$ Y^�~H�����;l8�pf��Gfb�<3>���P U���0JG1aH�{�6����Mx�	����u��l�Z��H~t�$~��p��7�A���f��~^�d0�QJ�su�s����(0���<o�J���w�
�`��"-��jq�����x�����XZ���r��@C�r�c��%80��OlA��GP���P�	�.Cu����uO�o������LSj��V����i��f�[�����m�J�
�$�uCJ%��r����O����Xzq���� J�P��.���>�������`���T
������d0e
8��������S�bSx`�_]gc3)2,��;���G�<�8G^��6��u��<o��w����r.�P��$���6����jH�8�{�7M������hz�]�~;(���9����/X�ZF�v������h����~K)q�^P����k�7/o���>t�9�r(��{bWd�u}'���OJ��R;
�����	p�	����z >��DMJ3A*
�4��x_�(_���G�
,�r��f?){�������0�����qZH3Fp�G����^`>�Q3�kz���u��y0�����X����At�=��e��C-�m��.
���D�$l@�[�{8��#%�W$�~�x!$�-@�����!���6T1o���hT*�w<�$�0�{'oy����H�w�(kZ��G"��0��Y�������>����)������L���M�;v������`c.�����K4	k~�����g��`��B�o=������2��S�4����y�V���/���d0�P��N�zy
��������v�Xq����J��BJ	����\x���+�}|�U`�6��gW1�Q^�O����	��
��zQ���/�����I,}[p���.�-���6�e���i�k3�v���Q�����M�bb����%^��``�6y�'?xa������V,�������'������/,u�V��U$�������������B��e���K�o�4i��6������������D�c����M����)g����x�������
o�-���#?xA����M���hW7}.�u���B����*�X��wk�_�`��Xu�Y��:������!��G��6"��tG-�+R��/\���0�l�D�9x��`��\�a��hgGi�R��*$n����~�B��#���>����r|���i������/h�����}R��~�
/��w��#
��R��4�:G2����}��H�<>������[�`N)�vkO�"�R��`�����k{N��t�����q�4�����2�Lya�	|�����sV��y�	J;����\�aL�f�t����dT(��O�~p_��S;��4;�\A��c�4�By����AuR�`�NBJ*�)����1)����	�N�P_n��4��������7]�/JY����Xu�*:��F���x��WR���(Hy��D��0����H?.^`���6��Azz�����Vu�<�����	3Li8�v�+`������SI������$���P�����O(�pW%x�'pa��2X2��+1h�(�q�l#H�r��������h��l@���1p�����P�yv��q1���NG��=�^��}���^��]���������&���s�VGc�=����~B$\��J5U$���'��=��[�i�0fs4�{�C�RId�d�3�����+��By�����bxz	�F"^&36*�E�����/W����
�1�_+~~��	��>��X���m�A�4Z/`������;�g_���zx'D�@��q��<-u�J�74��:��01�S~
������".l�C��}�r�!�o��j�������^�DiE���s�ly�A�"�s�5Z��^�`Z�/8
�HR@GmR��G�vZ�r?��w�p��������3���khn'C���4l6��6��������R���J���>8��
F� �Cb�tt��	�u��`�[W�-U���(���@�&�|����-��1x�q����0�RG� oJ�������	a����n��,�D8�&l�u-��^�������FT����U���__+/(������w�_z�sn��X�/tsh���p�z���PW�S�f�D����f�&���	��������s�^�	J"H�~?�><�IY!^�^��+����O/EcRu�xz	L��T����0J�ghdK��5��s�
�.����3����?����w�f�����
'��v����xZ��+���Qw�.}�) ���6D�!�P��2[��)(4�f��T��wge8Dt�c�$b��9�pyNA���O�T6��<�D�z�O��d�������|�����
5`D�MGR2��0�/�R����	Jjr�B����:�.�Zi���LA"��K��]7�&������,��Qj�L$Eg�s��|�������ll�P�{�Ms�h��1�(�D��_��uA����������Ta �}.��^�>������B'�������������^H�JGxr�8��Es�����VN�����Vm�&��[�
�~��`����-��{���/�y{��=j ����-G���0�^L;{��y���B�w��3�TnhK�7(������H�AgI���)�hAN]�����Z����E�J#��N�A�\�**��B�����^I�\b����nNi�5����?>�1��b��l�^��^Z��:x�9q��?�b��P'�v?����(�����s��mmM��GN_�^���5n�<BBbl����::��LE�
��]���%�	|qUv4�W���J%w��R��������5�PT��BQ=V�������AA=�#��8=P���/d�������Vai#
�/�����jOR�����vq�/
�P���e[�����5zI�H/�����B$Q\G^��4��^�����Q�P��(��
KQ�}���K�=6K�N~�BI���m�6�����|~�Bq����
�J�_�n�����]� �v~6[y�������w9���/�j���U�?����FH�����f;E�%�P{?z���F|o_�zAb`)3���/e����^A��8�eU�kxA�v��$�)N���q������xKveK%� ;w	��������-�	���|���I=(��B|d�_I��B�xA��$Y}^��%Y[���H�b���z�%�b���-�{R�hw,tq��iM��#�%�o: ����/H�O^��� �����������z�����YjJ^(��J#�D�+����R�RV��Yy6��/�����.����`_�@1x@�d�da�R�����I=(��B|d�_I�����B���I�����d�jK�^(�� ��]a��-(/���� (/���e��/��U^��l+��/�#i��i{T�'M��4���-^��em]�d�a����b��/����mqO�l������H�A���#[�Jj]��=(���$����d�jK�^(�� ��]a��-���qA-�B��_��B�^�Y���m
�B�>�v	^��G{���/H�������W��xA��(0x�j�2�2yk�vJpIO��R7G]������9BS��M����R������<T�������k]�Oa*���->��=�<��p�z�s4���A����&ebb"D"��������6j%+�Nq�o<���8�]�8� �6��B�;B"�J���4����8�X���O]%�'D��Xe�)�@ZF�Xe+���%%%(((VT���l����"U�%9���D�z�1��?�xZ(��F�1���� ��O����INkz�h��S���Ly���W!Y��;�>R��s�-��RSSyqe�o���NI������J�xr�)�x:��B��U���m�����~���Q?L�H~�QWU��Z���K����"���\X|��a�*��/~aY����gZ��@�\<����`�����V0L���H=��`�����"u���X�gB+#�H6���6mo��D_�_��'����(")K�����CjHR��o7����cp���4�C�)M�q��?�x�����f���?��P�Z��7����n.�9��-�	�),�%{^�O����������=/�%���Z�S��J�����a�������CCC�������G>/��G� �G�Oqz�4����X�:--��t����#3�J����QfF�����.M��K�z�0����
���],Q?S|xA�P�K�xA��+e�_I�������/�G����zi�OiZ�c��#��m}!>�������H�A��/M�{�K�xd7W�aY��4�(;B|d�[I-���zP��������Z�#�e[�4��gZ�'��x��R���Sr��e!>�xI6e�������V�*x@�`�;L�KMMM���� }������fq7-�������R3*�Gj���!!>2q���������EMK �H��0);T����H��R6'�G���9����+**J�j���Sr��e!>�x����)9��rJJ�����JaE���x~�0	��S�(M��4�gs@Oq^	EoK�O�}V�5�����lKP^(9�-���d���3Y�l������H�A���#[�Jj]�i-�e[_��l�+�u!>�zP��KS|�����+�Z�#�e[_��l�+������3��U���[��������Z�#�eW_�i-;�J��ixQv6��������3�G��q�F���/�6��b�l�+�u!>�zP��������Z/m�)M�{,��x$����/�G�����I=(���iq�yI����4,���egC���|+�ea�RR�����WR�B|$��l�����L�{�DU�8^*�2B|J����,�G/���/�����R�^�mK���0��I�������/�G������X)�e[_��l�+�u!>�zP��KS|��J��I�������/�G����zi�OiZ�cq�#���m}!>�������H�A��+e�[iX�#
/�����V�����4".�(�`����p$��/��%x@��������2u�B�K������o����a�d�nQ�4]�uG:!:�y��+���j"������vt�>������u|[\&�?���z�x���G�������u:"��)���lVYC~�f�})�N�*����s%�������������tN9a��$1�C���6_�})��h��)�"^������F��2���)�c(�vJ�C9%��*�n��pE���k������p�/�u����.?�J�!�Q,.7}!���r�{��Ul���������^NCI�w����e�W��AXj�XM87�99��J�����/������8��Oz@��'�.Z�����|�^������TR�� �xA2������cFR�J>.�P�1�Yz �E��/�_�[Z���s����l�	�B��H�$��J��/��x��}.�(x@����T0(x@�����~J����&�����xA2
��d�+-�x����/�|\x��c���@��)^(�����/|��$�'��������/Hv��dm^(~��*x������C�&����-��%�����w>x�����-��o?����7ztj�]����(��S���C�@_O'�����W!���@zv��6�J����/s�g����jx?���T��2�X�(\.�|\y�<G�[d�CU��
�f�]�&�29m���;�Aztb����V3+��7,��K5.������7C�����3b�d3�Z���L�bc	;��D�X���
(��K����	�6p�w�t�4�������]��	/����o��S��8|rZ���P�=�D�x���H�d�6����x���O��W�� �M���{��#=Oi�������b��+����\�q�h�`j���v�`��T�8�=�iX����QW��[����E�����+��}�������n������3���X�~����5i�C,��S+���4��s�~E�Q�v�������9����E
cfL��]�z�^E��S8=0��/�������SS�R9;��I^0�2D�*��6�:�p~qU�>VH�i#�uIF�Z*8�$�+(���h)�8���]�
�����	/�	�Me-$�% .-NV]��+�����hk�rE��
�*m��!����r���>LZ��H�2�7��~��t�oE��S�|�jh��6���?j��b�"������'i%i�z:f�S�>=��-�����='V�����E|Nd>��F$=q���:�������F
����'!�WJffE�'Nai��X��>�_��}��}��P�n$�G��j3x�E���8��-�i�!�]��Hu>/�u�f����]S����+�^X5�7V���i�0e��"u����������E��Sxp�����EK?�#�1oA�s=Dn<��E{����C��{���]~����
/����+o�hXK,?H3mD���~~
:N���E�n�tle5m��W�w(y
R��
�T�*x!1)[���Q�����7�` IDAT<g9F���U+�������@��?�K/<����PO����[9����m�1~����a����+45��P����x�3�?����hC�A!}��}i���v�:�Ya�����%��
�3��
i��S�G��U�a�{�L�f� x�{�.RG?+l2�,��F"�M���(��/�����"x�	^��;\��DY#��^0/S�������O
/((+���&�2�&� �_��
������:��������Z5�����4,qxAYQ����=E{��yd%�)�p/��4������EEe�:h���1�4����������+���Q��B���P��	rt/��&�0�F;��{�R�����d�y7����A�
^���#�L��`�R/(��>q�
��:k�+qx��Q��v�T����A7z/��3Wv�sy~SF��B�������'D����q>�^=����T����Q��;�.��Y�M/���y��kV����0�q��{��-�Q�5E��\���]���$mx����V�����/H���t���!����/|�/��D5sT06����=���������xA��L��b?�x���(lPK�l���#������$��`P��X�e/�
����0�?z�j"hkir�������DVf��h����z�t'���4nCN035��
o������K��[~����:�9S^`�0x"�c��]?bTUT
�p^�@���B]$����XvnU(�(!5,���Piw}��&�o�4��B��1 |Z���DX��G�Q_�'���z�����E��x��i�����o������{�a�;�~����Ne|�#���rU���'0�m	��F�HLGzd*W^`��*�"��S}� O/�r�f6�-wD����q��)������J���w�[�V1!����T�]�������J�BYR��S�G�g�v�b��i0a�����[��R�j��������r����kA��&�����<�~k� ���IuR��|D�����	��[pW��Em�G��N�����Q�#.��EAM����41�<�R`n\��U��H��1��':���yL
����(��B��X?r��A�����H��5{-��z�LxA�����<������2"
�x�h�������tRj(3�P���Fo$}�/0.)�a��:��~^h\��xD��@����Xqa�V�T���j��dq�	6�����e����k%~g8����E�O��0�������1H�����o��y������Y}����s���	#%{<p���|�rU1�Mo(�+��3�i��5��;n�}������
��u�w�o:��]�.���{���ONDrZ*��[[csL�4"u��q7_?���A_S�_��_���tq����4�����B��"^���'1j�����7��^�~PW���r��<dd����Ip}r�����^�����������NNs�F��^���V�1���G����g�IMN�+/�����\#���H����PmpX5���.O�����V
�:����8��@�+��y��
_������2��������T�T�s�/��B�I�``����L\�|��m�gcn?�m\7��)/�w�����%���E9�S^x�0��g��M7|����Q*,�)�.-��s��o��o�VM�#G,���j��������T��:�����N��ZT�L_srXq�<��"��|E������<b^����n^��O>��5��M�������Q������kR���+$�+/��v;��x��hlg�U�/��N#(&Z����)��B;�vjA�]+O]Dxlv���!a���(���#������g��^7l&�<�����^M�>���L����`cb�i]�����]����+O����z�.���3��.uj��?�����=�����~���
�6��M{3S��{���|Po��(s`���+W^h�P	��*8��������w���������	e�E\&�`���P!�a�QT���'/��������Qa���X1�/T�!RV���nP$�l�w�x��SwL�������y����=il�����_*�L���eL�NmO&��QFW��}a����4�(z���X��<
�/�i9U+g�Yn�1�������u��#����d>?����58Vk
��:������H�A�[����m\���X��Oy!���t�,_����g���s;��� j�
��~H����zD��@AOi�^�JI�rU���Sz�#%�P��D�����f��z��	A�����r��P���)/�Z�B��3���i��"�A��)*dP��/���uu!j�)�!��7��z����Ly!3��g���Z�lq���}5-,h5���.�u��O����T�Da��]��b7�>2[)�X�nf\��v����b#$�&!%=s�lCYZ����7��E���"��d���s��p�e*^dp3������T��e��}��O����a)��V��o:�S���N��I�@<�6s0W�SUe<��o*C@����t����������<��TS^��I����0�~�;���S��_�*J�VQ���<"�q��adfe�O��I�e�3�fXm�:s�v�kX�G��M�����q��X��	�� RT���2�8LC@�y�BRz"�[wG
����fbSc���������+/�
�+-41k%�P
S^`mL�
��ztmc���`�
���t� ���t��5[,@P���hC��������*i��Cw�� ���ba����vw����[������b����"��
�;� � ���|g�����wf�9��93�y�kw�c����~�����ud)^z{`H���Z��������	���=g�����o?xr��m�~��Q+���a�W���z�z��\[�z��^��LR����=����������4�����]� ��
�!2:���
X�e:*W���?����wO�6wk�����>��g��\yy,�4�aD�mN���6���){����"|��cD�
���{��@�6s��J�Dv�~�'��������!���!����N��T�'vg�D��>��'���
��-i�!�3W����}�'�7�����Y_
R^�����(Z����{	H}��Y�J�gk�az�
��H<!�����F���E��k�/b�wl���p$�����T�8!�TX�70�Z�����G��eh����G����d�{^FAZ�!����g����fM�dc���.���Q������\Ns����� _���j"��qZ�I���1��[!r�z^gZP4������H�Ha�4������Cm
%%��7bk�6��7�?E/;K��(������C�cB�Z8��
��EW�^�i1�6Mxn�����`�| <����58t���[���O�V"������]����@�%����<��E��4�m�
J����'����x���~t�/�[��pv��������?s�Fs
�^�����o�j�j�G@��s]?z�6��u*b�Y�G��SK��r�����M:IM�rC�U��BC�7�����4�+=S���cKahY����u=pY���z���oG=���	��f��y2c>���4����/����~=�w����q��!M�:����5n����y��������������{�w���OH(}��c�R����E=��������5twt���5�.=u~`�!�(���=���w�6}?fa���X����(�y�!w�y�������T��]����e�d�d�Y��V������$��w^��a�{�!#.	r:���LU!#"��Wl�I���'o�u���	�+j#��;d%�B����83�EB�[C(ZT�g�]�Dd*������?s��Pmj�����fO'D������y�I����	��!��)��R�����"�����)�]��������O*��NF�����|� ��Mk�"��������������m�S�[T�
GSc�sqEe-,������M������M�@�_��]���-E�(^PR�C�~�������x�q�S�!��7��`�x���3������5�N��s�t�e��� &��������S�Q��(�i!��sx^��*�]al����OO�
?0�����h��G���T��T"���8H����ykQ)��B��M����%��!K�LN:��}}��~���i�_�|O�	^�{������I
�����D�,0{�H���V��=��=��u���t�4��E#�(/��d���N�jc-�$0���U�vs �����*dO���S���je�X����{�h���C[g/�	I����q=(�/��4P}e]�w�m�y96�(<������	k�����.��V�PG��@�/��?eO@s6�m)���W�Mp��
�A�*x��K�Y��G�
�lw;���;���C��F>��#-8�`B!b���I����F��k��y��& � �A$X8�����^�t
�eY[}�>�2A��I��K}4�;�567 ��>l(ON�+t3AJPb="8\�����3���#Wc`���,��0=��~�G�N_���@��{���������U��YO��P����?�>H�H��K����Z����������r6f?���kZH�^���d�v����?c�RU�Px��������_�[�7�S>�c�B���.��~Q7�=��P��
�Qf����f�}a@J��h$��������W���#z�����W���y�^�v:�	�����!����&��Jr	e�������*�oS �/Y�#g�������o���������0=�m
������N����T�2����},�Fa���n#���+�
xCm}��
���An��62q��5��|������-���s{9�`�[\�O�*v�PQ���!���/��0�ig,8��t�
|����!B*^�a�U�����5�Y�
��;K��e�p�����c��_ZX�������Oz�G4���B�>4��HG���BG���E�8�i� ��.]_CPt8��M�v*���z��N�E[�(
^�s��Nr�N5�����Z�>��� �_���HKD���p��Z�����w����1>F�c=p��l����}�h��%�oz�F����W.o�dnC�Yq�vG��@�y�S]�"���Y
��n�G����
��o-�|�@lt�5����������][���=�an�.���)������1d�FXV�EEC�~��:S��K��N��Q1l�fT�M��-�b�1��S���o��`�����k�\Dx|&�h�����v����r�sx��#�a8�iba�T�����������H�����{���#����u�0�f�)l���#���	+n`!#�t��W/T�������u���O
D�B7��v-���
���p�q�$�����I���p��_�Do�z
9����3��k����	�rZ���J����/7w��=G8l��������"��cs'���u�B���;��Fj�����}?%�5�9�������i��A9�l1m����Gs�`��	�y��+�kH�K�a������'���U���n-�� �1�5��}7��lX?l�x
o	�`�-"/����������-�N���X�^@�����s�a��q022Gdd :����O���=��G�/C4-2��6�����C������b��=\���~����!�D~�����:��C���������jC�8�H�
��>|$2���E�Z����s��R�
�-P:�qqH&h��1�>y%�zH<uJNM8���Y

$��
��Ht�'��m�{��vn���b`�2"#���9��o�����}+�G�B���yyrx!�1����P��u���]a�B���gb�5w��E=<
���V#0�e9���"�0g_���&�(��hVD�����	/T�������y$QAM����M��z]���Q������1�Y���L�����
�`m$��W���Q:�{"b@eR]H�����������P�	�{���g�Y����l0-�)����"�K����NB
#YT��~'�{#�k)B���
�R0����]��
����
Kk���!*%��M
F������T����_oE_��+\������px!,)�������9���?g���C�T�\�NcT�)����
Uq��<t�t��!�����u�~��s���f
����S7x	m����+w���f��fv�bR�6���������m�f-�N�C�3���h�b m�����������}:v��Cl8}y'�
Y��-��g�X����� 8����$��F�����*Rw8K���v�LY��6��Y��^`u����79��MaRN\�3F���s����d>�>zg�eq7���8~[3�6��	$D
�:RQ^��hs�'^�y�'����a��	0�`�Fu�S[�p���R���@a.������b����sE���]�'z�<q"���<q�����{(*��6T������4����*^PtP���2GA���b������C��L�/�2�r'j�u�p���E��)^�;s�U����!2I��������Z�VH��E%�8��
�sP��I���
��tX����(�K�A���;4�6��9�p�W�C�yS$������? X�I�)+K�3��9����Y���>"7l������?)�^#3*�-����Ra���E,���]����W}���gkL8q&Z�^Xv�=���
��h���~�,z��6Q��N3����i�2����`T��,*>���G������H�u:O���+Q��7�	��g�|�E��Ct�C� ��G�����~
�r����PZr|=N�^�Y�<s�h~I�@o�C�!����6$Q=-~X�}?�	=�.�E�?�����IeWR�A`m>����|���e]��
H#4�3W��
�FA��/n���_����j�E(Az��P�6@=;r���Bz
m��=��7su	I�-mj��yU�:����5q��S�:�7l��.=$x��c.@xM�c_0�l@��F4���W7�������7�����[��p���M�?i��6�ZhD�������w������nA��11��j������?���!������'0��9��#��*�W���2���Yc���^4�S������
g�3���o��`I��-��buc�/=�9���!�4OkT1;h�r�,A���������PN��B����<����;/C�=�g=�N`����N��Z{���& P';
F�-;
�Y��BC�8�;�+����ya�B���~�����thh��Yhk���f����������@�V7~X$C
��|��4 ��q��;�b�U7,��o�=��SO�tn��o`N�8J�r���#����F6�Q����_�6���,ZO=�k����)����� ��<7:�5�������!��Z�[�&���i
%��]��� ��� ���V�v�����6�-CK&d�l�;��CE�6��ph���4*{a�D�W~x!r�Zh�p����z��Y��\Zd�r/�8{��Z���I�b��C1�;��}S6X�f�N��;�9���!I�D8����l�����\Ua���|cg��!DDFs;[���<���h!f����:vp�����k�c��~D
g�.��q< ��xO(+�t�
Q��1"�#�6zs��(�����x=�^?%
:�D
�G�O4��|��6���T�mh��h�Z:|�9'��'���������i�{��l�8�y-�����>r
9�G�@zn�^�<�|�?�j
j�����N�W���4���y�[^`J�����vU^
��� E������Nj

��C�������R5�4r�r@��H2X,s�j^��m��
W�`u0�2 ����C~�G�o�3���a%�,I��$ IDAT��jl���S +5��^��\r��D>�?.����7���<�b\��kcJ@"W��&x!��q)Hy����j�}�>v]x�b�9��F���,�k��w_��s��q���^S������J���I����+�,�
��@0����h�9�o�"�`���E��W�P�Q�e2h�M�q��u���:����
�d��hs��+z6����d��8�d4t�6A��@1C���,�j����~���[���,$/��kaF�!t�Y���F���� �w�p{�$�����p���v`����v�<�i����K|�����i�O��9r���`��}����:���i$L�lq��Z����`��!07"�6��tN2�\-I� ��;����a^�!�Tv��;;��|"-P+s(����1r�V�:8�T��iO���ZN�[?;�P�~/T��G�q�~�U����
���.py�N5|�l��?7���tJ�R��=�t�������j���e�%,;T� ����>�AgzCQC	.?�C�O�T�������t<��m]Y�'�_��JN�B-�5}
^`6����[�:���'�<��L!�-Z�#�a����U)�	�����S���r�F0��
�c���X�	V��P��-1�`���v ��2�!-�;~��`�g��"�?��*8�oJ^`'��uieE:��r�C�zu�*L9������������{q���T���n���-��#�(c	Z`��
��c��Q���|Rm`�b�@K;kRr����I[��eUD�%����T����9�������xA'�jW�����MI� W�{��~�9����9�x���a�0l�r���S�������3�}v�>��BA2u�x���.->����#��;��F�/d�;?���w�C{e\xL'����m�5���-��)N�k�����f�V`m�z��}��.,_a�B�<�B'�CB���������P�g���%x*������~��]s������7�V�N�2E�V���&���=�M4k(�r�
��J�}�`CN�JKC��sP��
M���`��?�C�!���C�	x�Z��H�x���}:�m��m�Y�LP4��X����r&�PC�\dI�ANWY��T��
��J��Gs���H��2x!��q��ODM��rDN�p�[�h���B����&�1��zLh�^�����jF�p��x��sxA�N�3ha|�xL�7\����e���/|��*��_���e���T@�T��������t"�t�
Q:��R
���vK��
,�
���D�j�B8������,��"���,XW�CM��j
��& ��fS~]9�y6����A����fF��'�������{��,��#���J������*�En(���{k];��;�V���R���I>���B\Z,�W��#o��J�	\8����M�?�!Q�5�������Z"Ssx��������������;�u��p��7q������?������f�rfI���	�~��-�2�9a#��x�^�����I�-,���r�L?�7��l m�g?3*�����/Q����C�D&AB�W���
����KR�}��X��E+�`��m�~u�`m�����_�TG}_�
�0�62��ip���`�R�p�6��1�Z��2�����J4��I*�SCh�����lq�}b�BrCAX�<�
�/��'�t�W>7���^��j&��	iH��N6�6��'V�y����YK �����M���-��=��CqRA�S�T���j��P�N�J]���j/m���2[E�T��IJ
�\�3V�}[��}�
"��E(V�F������?������L�G������P�jF*��H h!���4oRv����~Po�&�F,�9�z��jkg��C��%��{Y:��I��5D�����2)�^�0�6�"u�0x�ni^	N���#g��/�c�_F}�U���/>�)��\O�^|�c��Q���6�o7�+<>�fm�L��=��C�i;qq�RQ��N�|�2��5�o2x�)2D~�B��;�B��e]���
=���J0Q��|�����$I��u�XRY�E����������q���@�#�=o�N�)��f2�a�
���G�W����^���m���Vr0�3������@�kK����zpj5�
���)lD����Cm���H�����%/������`W�����c�88y,�����p03�z���yG�W'�`?)/0xav�����Y��.�[���)��in����^��c��!����Ug{�����[Rs8F���0���%UrMR$�w�.ZTq��}���jH����Z�����2��B����5)��7Gv�[�	K���]M�[*���X�z=/,^`��ZH��Ju���d�������6�	l�%�!'e�BE�����}�����LMG��������������������T�X���C�o!G*�6)��/�K�
�&8�&���\_��<���v6k�N�y���TTd��^"�������}'r5��������*$���DEz�m����;��}��x��
������
�*�_�!��ZU���j�	���xum"�H!o�\Y;�A��6^�~���W�m|����}����w6=oB��^f�f������".���&#����������B��Ws�hQ��Nl�;Rd�������R~x!-�#�_�A��������^�Dp�Y����h!%�99jp/\�y�$�����������iq �>�/0�@��C�v�����@��O C�O�������)c��y���/P��&����������Mu�I�"x����
)((C�N�`�Xo������NP���\u���3�����!X*^���7����:-
x	�.���?Yq>��
T��&������6�CO|��f�<�$g����k���6�����Jz�"$-j�0,Dlw����;_����h��=At���(�*!#)�Z�6��DN;��`4�j.hP�)/��}w�U^``�Q�B+0��)/D!*���>n�S�)���!�s�4.L�!��?.�G�\����X�3.����|c�Njl\���D�C0��voc�?���+R$P�j��r�vV�6+y������l�J� �9(��?y��0���C��0X������-'d��k���
���9����� �PO���x� xA��&���C��
m����S9����Ly!�^���e�q������j�E��]o^�='��+�6�0x��!\����l���=�����' aH�NH�S��=��	�^�Xs����!#X����� �-���i��N���4_:�a��b��5hW����?��M�
y;P��`���d:}H���RB�� �F�xX+g����;@o�����;�
P^�1![J��p��G������;S^X���;�A|"�[�q�jxN�L�A�T�P�{<��M�5D��PTv�M�������wVf+/��o��`&����V����pq�U8���s�/q��������i�i�:����k���g�{�;.������p�/'/<r#�������c9��D�CM-�7����6|4f�G���9�� ����0��,Iu������K���`^��)��a��K���-f���v���QMZ`�UW����n}\~��+/\{Ma�t�t���\�a��M<	!Ri��8���l���u���"����>�y#$���{1�Ms�na��<dK��v����VM��$���d����PR3X������CA�<��?���0e�^�s�CbJv=
H��9 B�p��)64���y[��[g���S8���B�������'��SK`�3v�����>�E;f��Cl�8����/�������h��a����y��U��������%�NuUT�>y�}��b��{Nk,�6�����Ly�)P�������v��P0`��������yAy�:����[0���:��s��	�����e��	CK:�I!�6�m��$i����

�
5���gm����I�|�/Gy!3,�N�EgoT��6����S^Pn���@�W�l�����|��[R�
������)/(T�"�QP�2��a#���6�X�����A	�w�v��SH������)R�����}���0x���m��"0.k����s�r�����H$��3^t��Ha .����x���+/$�aPm����Y�1
���p�i
:�R�~
�c^Q������+I�[O	Z*v�U)0�1�)3�T����	X�U�+/0��~�L�M�+���t�W�/.�K���'�"�*��E/(Q��������P�>��<�2�),��r����,���:�& ��a��#�'������m��j����v�0�8��]������]s*<B�`�fJyN����1��|h�
���(x��n%��
G����l�1�H0��L/������Oc��]`V�T�(���<���=p��o��������N���k�p����6��)���"I��c�!�.�����"�*�b���\a&�"��^`h\������{ru�i�t��E]*pY��]&b��lYz�;]:M�f�#������>?rf������'1��^��n�S�L�$h��N������>N^���_����U?��h�8�������i��D��XX[6O�ER�b!#X������,��"�'>8�I#��1��!�cW]��2����<���RH3�� j*^P�R���,:Q����]K������@k )���II�c	(�������D�Z���H����i�\ ���`�xT@H�vJ�k!��m�|��+���Bc'$��g/�-C�e��+Pm��NWg+/�<A��I��
��84�5x��f�G�YH�08���D�Y/Qx�"�	j�qpa}�VXp�
uh��)��������yU�����|����5�),vq�(�BM��xqe'��~�\��W��Z�\N��Iy!��q����rC=���u��Y>:��.0��4R�����6?��:���[�D�^s��aWOxt��E|����������
����H���g��*�{����;8`����}P��I�j����b�
�$}E��0R�&5)���a`^F�����-5�=W�N�5��H��Jo�OHMy�����H
��r����lp�F<�C��6���}����JJ^��T��d�TU�/����������F�4�m���`�)<��J�Sh��~-�����d���QRh>��g�/���g]��Q=�z�~h��j".�`PS��-�����?W���k�_K��$H{L�R[y�c��R�}/(�V@�������@RZ����pWT!e��P^pq�F���;������Z���?������T�g�KzN�s��ZU�yKed+<���y�����U=<Ua��]mR��NFeSET������\x�{����Tq��h���/<��|Jg������K'�\x����N<����Mp��=LI�f����
��.^`0���&?��J	9����%��:�tFl�/�5���7v!��E���;1��Y��7n�z�~\�g)/�!��!\uA��
�*T�iP
�O."9�6���=��BZE]���������������"�P���kB����h��;x!==�����\k-����_Wb���4����������X�N^@{k6"/����7Z�"�ZDX8s��g��e�J�:�)^����������F��e�`�X��&G��G��Sk��@H����/��A�|I< C�@U��j�I\5�����>����<,��J/������c�/�Pl�\A�M"��"���I��L�Y"%�&(�
^`����+-���)���T�:�[�����u3x���HxE
����	��(4BM�|$��B0�Z"g����W��Ed�,��������	%d���:s����)�.,�KL�|�=�ch�i���S��*/$��s��j7��D�"��}�����5�V����)MT��
2Dp���M�����K�9�U$���^�[��}������e+t7����.��3�G�B��&������*R�H�B��a �N+��$�1P�B�/�f�@��h�TS�!2�c��������0�_��#�~��
��43@��ly����LgYC�D
��t���^���EAy�$O��$=P��D/��=��SG��5������P]	�C���gI��h:�����y���$��I��I$����Y^xa@���Q�N��"���K���9b��H��1Nz���c(��l�����6���N�R7_>�
�:�����?���|��������!)��:�n�c#'�0k�JRb@���	���
L��'~�=��M�zs��F��mC'N�a�
9������ xAG�����#��������/0����:�bd�O�]��Q����6S^``BtL��:���j�J�'DD�CW�����Dm��M��X��"[��2~N��z����cyn�mA��|�};W|`�������w�am������?�N.�P��L�K���3
a��N�-vC:�w,1xA�/
#������G^��F�J����-O��B�%���\�g8<�=B��=p��	4�����x�7)2f�+�������^!�0x���dS�������'����)���D8�Q����P��3C9T���tDNU_S^`���v�RI����.G�c�n��B����bEs���y��n����D�,�>�a!�V�"���xX�w�\����wn���q��y������;43�t�l6�������mj�"h*�w'�'���A����f-�r�8�I(x����Bs:�?�e�i�/)���l����E���� .�&�s-[���z�)$Rx�9�su��N���}�y��6�+��a���#����t�������������}�bm,-��P����T'M�T")]�r��,>�B��������xJ!0,h�x��y��0��j���6F��E��Zk�=
E��`��
���#�n��!��5
�K}��=� �������D��1�>D}���3���/���B��
����������!Os�-/T���g�����xA �!�����/�5�y�������yfB�T����$�Ws���m���[����BU3{��2��K��|}�a����B��,1xA�6-tiS�����tuF
[�S��>�>;C�����x���/�Yh�z�&�>E��4���F*q�����OH����L��!��6T�u�yYby��~cr�P�74"������(5��-Z�O�Ij24�Ju���!�.�B�go$�G!(�r5��W^��"������y��"��d�	,�q���pr*@��oSzH}ND���D1qS_��j�.�.������c:�:����{?�����������BH�qyE��W}�E�:�J�>Xb�B
5�I/S��h���:���$�[�-�a��i�~i��9�[��gP��sl���)/�|��PzG���QM��B*-k(�L_oI������@�0<|��!N�a�	.`�=��	RYhk���w��N!(��dP�l4#ha��$�!3=Y� ub����8r?�,|�,�=L�]��Lu-������s�;��{���@�y����0x�q�.~�����K�>�I����Rc���>/0�4���L�MI����f����[|��Vo?������)T&;q���;=7P8�(��0��t�~�������k�`����P����;A70�v*�5�s�/��	���VBY�6hH�}��i���G.���Y?
o�����,� �FR<H�
I���t~��ajl�����	�H��}��=��t�
�9��e�����^M��t���9�)t�bRS��
�)I8}i�3P�(��)��`�^��<��G�>(�9��C�^7o����D\|4W{Y��4���� IDAT:0fI��OT&w������,T��w��Y4��a&�n�@!h�A�+�9�0��,�'�*,/��<�k��y�[�'>��/0[]i���T6O��AJ��������S���y��S�)�>���<O��j��0-y�����R��<����Z�m	������F����;8����+3�O���)\���������r�u���`��s�����h��C�)�{�.��B�NY'�������R@`��K�es�'GM!��5�G��g�<I��h&o`E�j�4���=�'�i�Z�!��#$���x�����w���n��3�Aq��@�2	d6{��\���=�!j��/�%kn[��>�'?y�m��s��T���}?�oY���������������,MoRz���b���b���6�/gC(b\��6�?E;Rn�%p�%��~�n*o^��~,��s�����0���/��r�C�	��qj��$��K����^��r��1�����x���U�����P�������"������\��tO�#��i�/� �����^��{��,�SU8�r�
��BFd�>^h3a#">���M\�Pls������H�M�{G���mS�����g����t����������"���cd�U'L�[!��Ll������4����Zzg5��	�. ���������"E�w�y�-^`�t�L�_�<���GO���=0�BF���������.]���,��J�CD*�����vt"�����)�8y����E�)�f� ������z4�fs��N�����_������>4�v2����G���%6�0+�^D�:�C!�����):��+/����8Z�������xy"������X4�@��GcP�Z��;'/d�$!f����)<����R��\x!��R��%�5�}�"����A�5���1(T�EzP��7�"Q� E�B*����+.����$=sT)��)+�u���v�L8
�^���B�
_nW���++R(��������2���&��V�S�V���
����Y�!)E�z�]���9���`TIM[�������}��~Ctp�55k�P��L
9��w�U�,^$u�����-�I����(/�����Ns�D��7�fj����������1M(�����R��aE�1����
��t�����D�F(�j���;^`�������\��{���^Ca�B�A�@�����2�D���'�G�CM��+.�:t��mK��zrr)tM�HaA�O/���U���X�w�%Z�aJ2ON-���3R��`h�on��m�q��;[e*o�/�_�����w
��}(���}^^���J��r/0/L����&��/�#&���k�������������[�bm��
�].�^���
��\J-:��,�a��5�dU��a}
�|h���7r[,1�a����)��wt�Ku�3�E��%4��������< ������x9s��P�=�a.( ���W:)��	�RZ��)M/H����Bq�/�Fi�-^(�6�S_Q��8���la��$�ST�I�Q�6�/�u{%Y� �M5Z`�����y���^���+�l��7��`a����������(���e���e���u
^���Y��/��^Y�+
^(�vI���a#�a�0�����I�U`�I�g�0xA
U������(���/�F;J���a#��O�No�x�Bf\�0�+17}
^(���9~x�$}�Z�������/H�����+�������W�u���V�/Hf$�%� �V|?���g�����J^����Fsl���E"�=���/{O|{-(MxA�oo��I�� ?��"�����xA<
���������}��"�:/6���K���Jx���R~��B���/����P\�}�_���_��� Y~��$�%5-4������I��O/l.Qx!�m����G�Jt{}�x���A�J��B��$�^��K��< x����/H~�xA�>��/����gxA<��������9��P��"�e?�K�������P<�4����BI}$�r���U^���%����J��/�����"���s�F���/H���A��<�]z@�$?l� y��kQ����/����RZ�������^(�1�^Z ��)^(��J�[�J�9��	�B��x����/�w��ei^(}��B��\�Q���=���1�H�I����LKKC
��U�$�ZR;�B���L���AKK�[h��m�#��j@��Wl�����B������j��SZ�K�eu���K��w��AR�U����!b������&������$�S,�I(�B���i�{���R?��W�T���&�!$���FK�����y$%��{C||<������P�u�=d�^����������L�#��D#G�w��G���!	�
��-���b*}/J��-�'��eS#3]�D��-��e�M��F���Prr2/���\b�RAi�GGK�2����+I��8�������b���o���I�?�n����52$����*��PJ�h����H���b��4%��]c���{��*PJ*���O�Z<bm������|*�TBVJ��k�hDCS&Vbn�z�N	C|B�����!Q����P������9��F��w���~Q��{��L%Q:%�<���/4�e�Mu�{z����c
##���~�����Ia|J���z���!deeK��R�K���\+���H��R3"���\+����p8��
1�?b_R5 ��T�+�qa|�v����fovhjjJ���4,��4�]����)��J��0>�����U���Y���o�K;�0>�����'�O��%��� Io
���xA��Y�6���H�z��0>�zP��������.lV��A���G����0>�zP���������V��.����nya|��_q����6+���[^��W\�����A��/O�#lVJ�Z��0>�zP���������=�������� �������zjjj�8Q�D_�D���J)yO�������.����nya|��_q���myyV3_����nya|��_q��#��W�����J���]+��,��$�(=��H���ZfR�,��?B��"�[^��W\�����A��/O���KB�w�H��0>����l�#=�eYP^(�C������;��Ik��W\�����A���G���zy��t2����q�p���G����0>�zPz����d�%�?��V$aYIxQz6����o��\�N&3_����nya|��_q��#��W�{:�,��������#�O��^�����K��#����`�x@��;��msO��t�q��#��[^��W\��f���nya|��_q��#��[�<���Y)�kE\�����A���G���zya�R��A��������.����n��4>�f�t�q��#��[^��W\��������-�/�`������2xe��������%C�t�Jd�{z��Aa��(����������]��<T�����)O�{���dbc2%s���@>8�D�������W"��H�,�BB}(f�ee2�.��R��'�1Y9��e��^���+�#^IU���gM),
2)����&Q�����d�dQ��Y>Q�S��d� )�tB�EGGCUU���(�{�O�E(����S��~���]o�2I��H,�{�����W����k��]V"}�Qc�������.�������#�1!!��jj%[*N]y��(�!QV���-'��hg�C��/Yi�G���d03��,��(��U�DB������!�]Q�#������j�����Zq�be��q�����f,]g_�!�������nR[[���R�<##�I�y���#IG��?Y�r�1�d3D�������%����WPW������%��<�_1����eQ"#�P"�	��<������7$�w�M��,��S����>
K�����,o�{BJtI�Z!a|J��%�H����
Ir������$��t�����=G7�dfAo���f�]�`Sy\~V�r�(���{�!	S���R���R�CZ�#�W�m�j�2����:���AR�#m�
^�t�����hx�4�}����,��X�V�KP�;-��y(����-v����>��Vd���8HoCm��=$~:�Qd�R�0��)��nH��|^W_���:�;"}c���}�HH_�@��X�'���p�{��n	>&��2^~��,.o����,��,o�.��D�����v���T����M���z��3e���O���S��F�����T�/O�W�qBJ����2^(;�5�����Y)]��k]q=(����H���Z/o�#��~q�*�����/�7"��u�	��x���RZ�����n;xA����u^�I]K��^�GM�6��h~%�/�%^�
�l^��?xA����5a���|]����������P���� �a.o�{B�{��k]q=(����H���Z��f����TyI��[����������):�$��������x(�P}��BI����F[5�������]E�kI2	���^c���3��������Y,��>HFJBl��,�C�_|<R��O�T�J^0RWDG+}��J�&��;�U<5���Lq�u|"�������l+""1
��E�_1{� .�����$�v�oz�����%w�aa������Pz�j�X�r��,I�-cE�������h>�g��+NS��W�������Zy�3:����xJO~�[R^����.6�8���`�����Y���9s.��*���4t�T<�d�W�t�.u��V���4������</��3**2�VU<��5��B��"m�V�~�9s�N�P�\UR������^>q���|��a_��,����[&a��u�*�7s���z=���YXb{9�%x�7]����RU���v\>]���9t"�^?����\N�-������a�\L��Td[���9�!*>-jW������-r{X��[�����*�7s��&����9V}Vl{����p�y��+"&9�����Wl���t���(�����U�J��������T����4��]��
]�f�}	���u-���O�
)V���m�����?����b��Rxm�[b{�)(Ix!��~hv�
9���
%����M#,��.r���]Uh��i�_��~O�)^x�����������������)��^��������[�����[?<{��^]����/�d��������H/)>�*V���{�q��=,�9��u�^��u!lVJ���Z�G\J��0>��������Hj�_\�J�����-�2����cM��E�)I�Oi�7�CZz�HC�=�^����?M
��B�,��a���.f�x!����4���8�h*�9�� +���`���"=
�$.LQ���((Ix�7�|�=�������8������]������{<��b���6���pD%�~S�BPP&�2P�B����]HA�6J�+���+�����AEY1�N��J
^�JKC��-�<����]�����v]g����e/~�B��K86�-��~K��?�gb�����I�����ha�-�'E��4���F7���1�C��#�[�>�/�e��I��=�B-|�J-� Ix!��aW�0�}���0����&,+*������`5�wx���}��9��afM�Z��W"�*�����=u`t�/�J��$�[=��?��y�T7�$�"������f�(����S$�������c���`?O_��G�Cm�8u��U����_��8����/�?�]��������.�2z���S�
;"11��� �	y�Q�e�il9Z��F1���iWY^G�4,2_A���KQ,o�{B����\���Q��S����sIm��m/>�.��/��8��x�=����J�'�e��[����d��?�A^[�a)���%lv6Bjh2������tZ���a�+�|L�v���S�G���
���T��^���.�{����w���O����k,[����?k?���&�������%/XX5@���h^%��KK'2&��������c���
x�s.E�F�R���6'2%+_\@zf&�Z�Ce{L����e�.~������j��W���������'QEM��g�}G(�)`��e��%�J�C,������A&��W�%��tDq
��_y!��y�e%������>�v��[�V#.:�������^n���D����g\d]���"�u��i:��d��4�V]�r=
��h7�o�^�]��k�����GR\&�����O��G������f��	��{�� 
�����MU�������6���Yh>T�tH��H)+dB��<:�!�C�O�m�rRFZJW^P��E�g*���S	����,���V���	�/�����D��������H����5d���`o��A�����n}���t������Xq���Ly�������G��������\Mm-t�@1�S����Z�U�T�p�E(�}���&��w�d0�Ae����\������y����D��5����$T�Q�����=�?�I(+�0!�3�����Se-�(����H^�34f:��Cm}I?��S	��M��Xy����M� G���$��)�*��g}�G�)��+����'�����u<����Q���1;�2c1���M�	#%��?|q�w0��� ����v�-�[R�0x���;=�A\jt��0�f2�O������H���(�����V�a�f�U�M�@_��R��Z���GO����S������wt��a\�y���O���{����`�Q���c5�_��T�_�,�>�]k�`�	x�	���dCT1�z|�\Q�����<��bY:x��b�����zD�O���o�r�	Tu����E������K����w�0TD����M�<�8��=��f�M��%��	p��.��h�
���?"�?E��My���������zH�;���@�X~����S:�3I~�|����Y]	]pxAA]
Z*�����n��]-��l@'���d�~��%���~�~��^s^�v������8�����M��**
��o�]%�oU��wY\�	�}�p,�����x,��S��B������+��F���m�b��CP���Xo#���,����Y�E5�^��B=�/^JC�W��<�j�c��$��s�Y<~��������n�JE�Z���.�S��'���,tl��&/_ME2��74��SCE�x��t�e����C2�Muu���D����y�6�b���D�v
�r-
it���f���<�,���k*�d;��Ly!11w���u+E0���)t���Nm����s���M+B��z�J��������tue�����ix�>j��t�pnI�+f*^��S�)��rk�C&���A�G�q(ANG����g����#��?@fr��5��B���e���l��O�!��&2S��7pdUTyp+��`d��o�My����x��=���c����c���jQ�,���=���Ha���i�t��n��4���Fj
; ���m���7���%����fAIY��Wq�����b(�r���p|��h����}u;=[3P�AO��W���_��m�����B��P���yYH������]w�����z��e�L����gCU�x�����h<E���rH���
EoR��=��~��sE5�����}�����;Q���;w��IQ��6�����U.������q��
[�wcg�%%"%-S��@�������U0k�j������c������o[���o�����<?����nX6|
���x���ug�e�
x���?fl[���X�&h"2.���0p�O\yaA���y�"BE�[����D��F�����hf_	�-��"��bb�������u�{bbw[���
�uR�P�-������k�����J��> IDAT����{ >)
?s��}b���%W^��Ul��x�?�����������4�Y=�1�x}�V����.����_H�Mu�w�%^n�x'��xGd��X����e�!H�	VKR2p�����PYW��pU���1�����3A����p�3����P�y�����o�#���}u���.���-���w�Q[����	�$@�`�����"�hqi�i�S�@[�������w��3�&H#���r�����93sf���w����Z�;<�CF�
x��	�
��r$��
&��H�����
�}zv'�Q��/F ����i9�^G�+/�
H�uu�����0W���,o��Zj�z'o�M��sz{chP[WQ]���n���vN�Xw-
�������������":��uq�_��S�>�;��g"�X5ck���8�{�yq6]�:E�1��Q����4���q\����yP�����6b=�"��>�m����������w9���X���ufl���Qp���W���z}�����>��{{����l(����?&B��q�z)��{��#^����zOE����^X��5Hz5�V���9Yp��������#��i�����(^H�~���^�����H<}9�1�h�����t<������j�A�s��C���H�/����m\��@�)�Xu�1����(����p65DK;K�����S�KL��&up������sEI� ��J�S���XO����
/����/��6n����B�"0b@���&����(�9|���������{�������E�l0��@ya��]�C
��Y8s�&��[��p�����������f����p����������.5q��^���(X����M,�Q�L?B+[#\	,��X��,lVV���0>������V���.im��_�lJH�?���vN���L�����l^jG�������>���A��b�����&����ha���������P���������&��� '��EH������3�hx�����:L�ai���G_bH�jH�����^c���X��z�������MNQSQ�B�? (�^�����g���`���m�#=-������q��
Z,.��%��#���Q�Z�v�/�Y��D�V�BXZ<�O0���h�����8��tCdZ"����_�����d���
/�jT�C����{�{�!�O����t��)�{�/d���=��m�*��{���w���js�:8��d����H�u;�ZWq�����H�F�O�M��������V�62�/d����?�y���d���
���G�):H����B�AZ�sK���"�,pkwZ�M`A�LF��:��l���B��e
eA�����Q��:����\
�-�	�A|X6���Bj|<.���0-��L�e��d���2tMq�P2��������>SYx�,S�������R �p0�����L	�1��?z8!���+�`���`���v����4��&B��3��q�(��
�*f�#�	�8�2�h�-�t`�tu4����AI��`t�f���st
XK����~D�v��,uxO��8D����!d74)�������(����Ig�aNp�3��au���� %�i�N��
.Gm}�-m�8�P���6K{W7�����`�w�Z����Y*|�X��'�������|�����'��"Xb �W�8��9D����M�]L)������$�{�3f5X��[p5k�_�f`n��8����a^�5x���w�o���-�z����|�\:�u]���-�v����.��u7l}�
]��d�>���5A�8����������c`�iEuN����<�o�X0Cdj(zV���`A��9�%j*^��J�
�p{�;8��C���.���	�0���A����-�����F����qos�:����I��{%�l~�F���*x}7C�8a�0o����_���I���<S��\A�J���
�I��Y�ia��:�-��y�������kx�:���D8M�
�+N��.�Zv�I�^xw�1b��������C���������������pG��=��<��X�O��)��ba�N���1��J�(
^hfk�z����m������kc�7T��B�ZvXy�9�8Z�?&�tp���%�=����,�;������8���H��4x�A�!�h�L	�~9�Q����_�<}�Ep�
���1�������E�����[��`k^��p`��!j�w ���Ad.=�1@������{tSFRr�f�@�v�
������=���
����"<�����2�eB�9/<�mmy��(����I

&r��?�����4@)T�����8~2�����'���v����?���.4��C��B���05
���P�5@��3P���Uk z�z
1��z�?wz=���7t�O%��N�*�N�X=�3A����h�)���y99�SQ��kK������)���(-�/��6=,Dlt0�t�FJ	��h�r(�c����"��w��D�c���,A&��o���Zmai]{��P���i8��OX�! AYY
5�t��Kq{��O��mm�VEu*��J�6�a���~E�n�p��j��W�mD����~� Z�����}��px��d����n��!�6��]��^��'�i�,.
?^�.�O����h����m
����R�Q��6��x�+8�z�0#�����O���]i�=��_�|����.�o�!
�~�����6X9�{l�|

������	`�_��C0D7����	j��z���Cm]Al��6�����E����	'��B�es��vCX�fy�$���=}1#"��a�,L�sEi�������=?���?���L�1)�co
���iO���	�}�h�='���5�=��e�'�{�������o	(�ejc�c�����	H`�Y�����uxx�����!=�x���9���e�+���B4=��"�'RuX2�!�������*;����@A���	^�5�B��6�xB�
��/��O���4|��7}�Q�H���N<��`���r+c(4C(�8����Q�w/�'fs�`%}(|D���h����O�=���*�8�
~��f 
������$ t����c�=�@~`�A)�L�����Gv?����2V_��w-
�I!���}�MT�;j���1���=n�X���<Iy��
�:��D(����u�/66\��������8����:�����4x�m�'�@�;_����&P5�����i�24d&F������0m����0�{?��B��y$�?A��{�t�0�����{'a��o*��`�}Kj����F�|#9�Q�.�a�"_��,��i�r��]L����>D><m���NOF���p������x��F���s�B����g����0i��t(�'��[�Pm�j�qW|��?��V/D�Y	���"'"�zzH�z��m
�R��;�Qx��P��A�������T�^��/�EGX�����_��������5��cK���p�`
���I���8���@|^���M���CF07
���������6�E��������wp���N`h�n���&��r�v��D)����U�G��������/��������@y!�Vy�-����6����UPX�����t���3�|� �r�o�� ��.���)H��I8H��w_��vl�Qf��G$�/�:��������+Z�(-	�B������f���^�����j��4}��+��Hk��������������0_����zt�oK?W��5Y��)��Y �Z8�O�C�/��O���pX[>�;&�*�Y5�����.^�������@�Nk��������K����b���p����@��S�b��������(x�-2w�=�/�:���+��g�<l�4����:"j*	^�����Ad/!���Y������M��QT1��
�s�Q������������.=�8�5^��``�F��w����?���'���u����(������7���2��l�z���B�]�C'�.���I��������*Jx��
��������l���AO���N�����X�W$0�	�LD��Fa]a~��#)�-�8��~"mFi��w&�
jwP���)�����Y�3O����
J����Ii!f��r�6B}2	ZH��	��!E�����Si�2���Ih3R��<t����7Y��!sxA�6���kN��N`�w
-�
Sx��'$< ���4/h���q�(|My_F$���A�L�)1%Z���
g�v�����0X�1)&����|c0�@��&��O�������X���@/T3P�/-�W��zM��iL�C��M�dRM`@K�9�2j��E��I�!5���8���nq�P�����\��^�!_8S;>���}\A URF6_�V!����	��E���M��b>���	��'�*���7"�I+�6�a�-����&����ca(���t�{�3f7\V��������mz���<�����pN�>Y�9
����� ��1�f`��fL��J
�����H�t"L�-0��	��������[�`�LX�2���9&�TOO�J0��)��ZQSq�U���0�����H��*a�X�.������K�1����(�4/��n�3����Z����h6���V
4�{�z������������/�������H~�
��<�Oa(�f{&����������l���sE�>���>�
���-|hr�U#m!u��Lm�^�����g�a�m���C���/�xQ����WN���������� Z�������&Q����� �&6������!j�p�A�T��z>�Fxx.�W$��%�`� UR �FXX�6�ws�*&8-��7�j�������b��79����J�{��&��>D�Oel�^���;���`m%O��
���!h!_� �T��������#��g3Q�������(���,hj�q���y$(��h���B8p(=�+���/�nQ�~��f��W~�g�
����q���g�x��-Ux!#8��OB�����wlWa(����a<��)��:/3�GvpE�>�a1�����/�<����D�9�GNb!T����$x!<�nw�CO���"�z�&�5�����3�o�o=��=�+���1!��P�L��� �e
	!o^���U��`��)I1���
�������[R�HA_�����5:���W���p�.���*n]����p������CII�+7�v#�_{ *"�����e����7�Q�I����iN��vxs7�WRJ5U�`������C��>����CA��=|^����B����i��{M�t5�H��4f���~��*J�&m��^�x���hXsbo���FLD�:�\�a�����s\j"&1�
����MY�K�S>z~������~����'������9)3�r�qRi�B
=|��:)$c������
:u�����s�`����~�>������������"���x����+$�w0B�&��\���S="5�����>��4I���57@*�f�F|J&A0y�]���O0k��o����j��C8���L0�
R����
��\�w�j���/�K
��/�>�{��H)�XK�	T������&h@�I�� 1p��)T���~7�-Ta��������%�Q�z����,����u;u����5������U�Gtr�:�b��0lb���):���X�a�8�8��hJ�XO�	h`i��`^&53�<S~xEvY��4\�N��6��N��%R�hYM�`m�.����TR�y����Y(/0E��!�L����KJ�:����n����|���`�]���q���EJ�7���+$�T���_AIK�+7��A�*.xsvs����?L�AZ�R�Q��?	�L���t�8�U�����Y��0���B�F���sh���5\�A���.v��
���l-gR�RF�o~�v��+|��L�~����2��A��P42��W��0�,4���5"����R�(�f"���
�:]R��6�V���7Cp�;�0����Z���?u���.f�.C�����t[���V�����~Q��%�G$x���+��X�o���1C�y�A���s��pX�~�|�����/�C#�L'L
���%���=�U
�:|7c���ebb����{���	�������2c[v������A[�D��B�= 
�P�D�$�rA�(~m��	g�%�JJ�������'�����y����������)�C��{im��^��]Z�)^�{�-b��+�b�jVoUj����I�R��.b�SX�-������sx����s����bJr�t���N��*��Aq�Bo:�|�q(��I������6����Iy�65O�f�����)0��Y����CQ�B�f����*��5�C���z��Bx�e��HO����h�e�R������J���B�&j:���(WJ(�#q��SL#��;�����B���mV�S����L6"��zRX�I�`S�����
!��hD�%��q���>����BrB$"�=aW�No������8�`h^
'������G,-�'�B��S�R�]q��QO����v=kh��!��;��)q9���'���8�!�@��N��B���|�
���#�T�s/�mUyX�O�X8E���[�*=g����LyA��r����$��FZ��9\�A�N�z���';�l(�qE������qfMoWD`�^`jF`��.tB��C(�z���p��:��0����*?dKE)/0���W$��ePS`�,dCs]
�O
\#��a1�
-H!��X=����I�� B�����~���-�.����[�����������V��:�\-a��+]3d`���h����EA��j�DRj�����5�-�������!������0*���`�F�.�a
)F,"�!��U,Y�5��g,����Ey���Q<4D}�fX�h&����.�@KK�Hy�u
B�_s��+��m��,}��p�wzW��~�0�eW^�Dy���_CGY7���u1����M(|F8/�~t]���`xL�*d/X����WC3�gCU��X$VSC��F���-�Q���@���7�!#X�����)��B�d�������N�3���!��>\uA�\��������m���"�B���0l�P/���x�>M����������z���M���Z���[����o#���|����?D������t"��Wi}�^8��0���?����Qu��B�~JIE�u���zF8��X���S�� ��h�#���7��}SQx�1�N<dK�T^`��I�k�5���|��x!2*�<�yX~���_d���C.|���I����.����?���*/0�V&��wRf���A��B�@����E�Pf�((�ZPVw�v�x����`I�!���O�|���q�A��tz�+/�r����T\���Z+#4,������/�q�-�C�tdjp���B�����Pq'�@��*�}_��;�A����|���t�T���k���(Jy!|�0���:��.0�myU����B"��j���D��J���B�f���=o3��x������5
��x��,k��CR@h�yB��������<z=)/\����\y��#�9�M��J�dt!���-x`�	����.��ee��P����O�U���"�}���*�/l���(�����/���3���(/h*�����{�b�	�������5��L
���;`��zm<�-�&���M?B�b|��8���u������}����V����Kg�BC;RP���+�l��w�GR�`�'�t��m��3������ IDAT
]4C����*)#�BP�Z��#x!1-�6��q�T v����Q��P��� N*
^���#v^����u�C��
��U���wR^���WIQ��$���za��������^F��v\u����r��_�z�k����q�f�0n�-�����HJ]*�K���O���m�b��g� Ps�</\�(d�ai����TN���8��������}���6	�P_K����,}�����6h�&���B��!��z0q06�����j'3�)9<�DM��g�
P~=�n����&N����&�-���`"]��Xb���Bp\&W\`�{��0�+S,D��Ck��*4��S���2���H��)B���� �\dyKS^`j1/nA�����Hz��^`��Om���0k����`�q$���z(Jy����x�r8WY`
9���h�z0WS0ti���8}��uX@��L<0 ���M�5���^`�Bvj"�0�E������e��ry���������0m��a��#�:���|��P7��Q���Rl��+����#�����2||
����[���'���z��u)�M�z��]DI�������g���?z����w��Ks/�T2�������[���3D�*�8IP^�[E���6�E������o� %$$%c����r��)��
����������BB����?������`!L�
�
�RN
��k:�����a�����b�M��w������]��]sQ�I�#x�D�/�i���FUy��g�	8���(��_�����Ne��k���'[x!���fe��
�#�Oyz@�o��m����f��5�����S�p��^�����=�N���v�SY����a/:���d���sE�r�!k7��* ��q.z�6�_x����Z�����^������'�����Z����5�3Zu����[���N~� �x�"��	O���xA�N-�����E����F�CRc`�:m|��M�7�I�MLG7�A���
����a*
^�Q�5�tE��p��D�F|���I���7������Z���V����8�\>��b���wA*	^K��^Wy�:��\}�^`�m���8:]�H�������=/S���<?�~�8c2S1�>gyY(	su=0����0/���'��\�wj��K\	}�������0oL��Z��O���BNvn_E'���D�����;g��>O.���=J��Wi=
~��@��������:Z����^���t[T����|����;P�����Kz!����_�![oC��U��$JR^��M�;���R���Z��
� ��NFZR.?��t�A)h�u�b"�n�J�����s�j����m#$E���$��f���T:Y8�PE��e
\`j
�'�p��t*�N�7�����R?�:M��'�QA�$_JR���F}4p�B^4����t(����V�BW���>w����`L\-�	&0���($�;�}�Z��0��
_`�#����t��Z�C,1x�AL� �6#W������!A
��VU����	�SS�'�V�J��FV8K����?A��-3($���L'�X(�O��=T'M��b�E�4���F����������M��m���T$���H$�tTh���Ztbp2)?�w)R�8L�Fj+1�Be����G��?��c�(/0����Z��<��Y
s1��3��4Z�^q�5�R���pI��vU�/�P$	^��U������u���(t�;1#���x����~��|P��Bvn��\K�F:T�0��X�x���Kxy�o�
r�S���]���,��6��M	F�j��Z��.!XJ���`����
N��E.����)+����V����<Y��:"(�����<T���xa��zt�2�=��Wv��Dw��Ev�8��^�k�7�����{9�^`�������"�1�����k�������]����5=E���5�UB{
%L ��
���S}Tm�K'��p}E0�jt��yR����Y��AF������	��bK�y<�q?&v*�t����]��#����a��^,:�������iK�\�W_"h�-�Z�6��(��D���.K�\�<�_��w��,�M�P���m��zU����������{������������+~W`�cA�\���-�������(x�\[�Z8�M�'����V/������U��k.)=���1v=�W�`������
]�����i����I����L��j���.�a*My!>!�hS�v`e�����P/0;W�gr���':�c*�2"�:�@�|��6�Rh���)<Cj��(�C<m����o
�����GmZQ���\8�r������
WbH��,�Dk���z����(��������IyR�}V��v����$H��7��L��A/^f�9��BO��3�C�u�L"�I���� <I�����d����
�v�`�=v"-[(Q�l��af���c���~���N�x����I\��c�x�x!���&	��9I�EG�������2S�j���C*����3�H�!+*���P�����g�&�
Y��:���o�;(tx;�i�:#�:����m%��o���"��v��I��y!����n��7�\�@Rb�l(�C��1!x��&�j���+ �0q�����E�U����N���3&�i����	w���a ���{7vA����[�@URl�^`Jn?���qU���~�������������c�������N�yrR4^y\��L����ut�>�������=����eO���;����d�8&��}�8���*���8x�M���'&�t��u�
�]
-,�f2����I,)m0���O���6l�Cd�d�c��5X<t)"�h��Wo���cX2l�(,I�'3���EC�b���\���4,"b��)H#�������)�������E��ZM�\�?����o��6�3m~=�}�����pw�<������^P���K��;�����^p�����5����k�0��{��N�X,1x�
f�u����^��alH�))��,���o�k��Hm>��P9a2�)���R�xL���*�@�������	�c�DHT2j���]�hS��������Lk����)?0[���������P�_������Z;h�	�~��2���j�|�����)�X�W���z��_�����(\���_$�F_���8�2��%s%�I����N�r��C���Sa��@aM(t�
�`���5"�!�#���
xh
v��$�3��^��������)�����T�� �1��=������,�>��1���b�d!1��jSd�L�0VR����]Rz��\t�Ca�(<9��T��2�5�;�
mz�/.�/��l�6C�;[��P& �@yA��&l�~G�) ��A�|Pj���t}b�3���8$��	�J�A��]�'�@Y����C��L��g+����RC��>�b<��#�������jC"��w:���r�dT�5�;~�]gmp��Io<��&J���0�'�7`0������C��x�w�"� �������"]Z��x��	������aH�x�^�|���H���{-Z!��t��� �x)%��	yMMd�z��m�t�,��W'*H��L��6��(Ph�l�r�
[z�+/����-�,�z#�uw�bT�������.+���W���v?�B-3CzF����x�����_|I���t�K��H�B6-~L��#�B�u�9��`�������R^�6~=d+����W�:�!����/��j���������
X0s/�T45��>y���h��L"vQ�
��PT�F�2=�<�z@xAT[���|o��e�=�WF���uYj��,^+�2�m|���_~#PrM��Oq�BY�Y\�����Lq��86���(x����+W� ���m������8xA��6Bu|	6����>����A��E�c����0S�`!3�\rEL%�������M�����u���Y�-��O����+
^(�i�)
^�F���a#���RR!�.0(�BfP����Cf�j�8xA���#_I���h�,��0lDY�6B\;������K�*C�����������
�$i[
��Pl%�������'����Q�T�|���e[��dY'�]R�Y������^��6�E��������	��`���� ��FN�����p�u0�G�P&u
���������/�����<$�9
��V8D��.)*�������
��m�1$$��"cG
�
C�"�A�D��BQ= ��z�l�*���������*%�Oyy�l��S6��W)im��W{K�GZ����<]���P�xA��UQJ���DC1��%�����[~�5?iW�/T�Q�o�x��N��n��FR���4M�68�+3�m�D������I� ���/�/���E�I����/�2���Y-��8��(�*�)���xA\���_������}I���xE��(^�M���T/X<Pq= ��a�R�����0>�zP������%�^��GZ����UZ���^�lDx�d�	��d������*��G;x�<�,y� ����/��/|�cWZ����<$���P������g�ls������{��P^���ii�+��b�_�2�I���[�i^�|�j����Pe���#��"�ua|$��l��#[�Jj]Z����CZ���^�lDx�d�	��d�������2�m�/�����.�� ���%���/q�Dk�/��'Qr	�B�^�Qf�t���t�)���gI������uYj���G��2�B����l�Y����%�.����mya|d�_I�W����f��~�Vyi�G�$^(�� ���(�x����l�!��������/Hk.}�vx�K5��,���I�\�P��xA�$�<� ]
��t�Y��/is\���K��#����`�x��ffH�7.$�S%�� q���P=�2��L����'��LS��
	�Sn�.SE����m�VHZ�����R*�fr��-z6PO.����(@^^�8��JyH��� f���r�)��R���Sc�r
0Q4�e��^��d+)"YE]�����JT�2(��I���i� ]/]��'���)k�2r����V��b�������:����*WQ3I�1�Q�rv�����S��HI�BLt�7���� ��Zd�*��hC^A�������Jw�����\��QH�2RD��������LF�%
���	�S��y3��*�Y�����ets!W�SV������5����~���'Q))y��e�Q���Q��GQ^���_k%����u$m����i�������S�o222�����niYe�}NN2���>U�#MG��?y�
����f3D����Qb���G���4����"jv���L�W�!B�2-�dD���6�������N�
���t�6++���Oc����<= ������uIs�_���_B���}*M���H����%���}*-������������L~V;B>��K�\�R]�Y3��Y�_b����HI[[��6R��	��Y�!�0>���bT)���*���i���N�O9O 1��GL��sva|���T'����B��� �6+e�_I��#�e[^��WR��m|��JIg�l��#[�Jj]I=(���i|��J��I��#�e[^��WR��i|��JIg�l��#[�Jj]I=(���i|��J��I��#�e[^��WR�_������������(<�~'���L�Zrss��������ybe�#����t������X�+Cf�?epZ9���]����)����Hjj*���,I�O�Ia|��)OT�����Y�����)O��Z��Q=�y�	��y�.j�����������cFQQ��+�A�Bd�T)��G����)a|d�T)��L���%B�41ddF9VJf����#�`FP^(���"��d;���d����I��#�e[^��WR���d2���Ig�l��#[�Jj]I=(����d2�����iX�G^��
a|d�[I-W����B$��-/��l�+�ua|$����I'�E���Q�������|/J�����%�����U�Z	< ��Da�R�����0>�zP������%�^��G���tF���0>�����������-_��G����\���0>�zP������%�^��G���t6���0>�����������-_��G����\���0>�zP������%��%��/H:�B�J�/��".%������������f�iSY�$w������SV�������-�����m�U�O�O!�*�G,w�{������W���z!5���|�f�
9�J���Rj�����^*''Wj���!TA��2���?�������Z:�oL��Q��qlc�����]�|��OA��r��*q{K2����C�)))�UO�F6B4c�*S�?������3��j��Q���Ic�`���G��'b"$�����2�#�9�9��n��8����'�'�T�\���dIU���u����\��_~d�K�OQ~��?��u�ti���v�q0=#�L��M]s������(�d�E�,^���[n�r�������O�u���*S�s�==[q�e%����;�R��<�Sjc���2��T�5�s��7*C>Vq��eh&�?I3��1S�nR1�%m����/�?� ��
y�/=���5�g�7�����B�+�vN��z��a3��].V������r�\���,����t1*,K����#[��E���CO#9=	{=Kf�)}]Kq��nkZ�A)Q�)����>[�Z���rm���������01K�Ov�Z�8���|*�����a"��he�@��D����"�f�f���gN�wn�d�/r,�����Vx�9�<��YV*���_-3��p����������CL�M����m?��T��=Y�i���yO�J��������`_��G�Qm������l'����Le�B��}�/"&���mD��Y��^���9y����T�~I���t�K��/�2�B��K�����W�N��t���m&��������6>e����o�a�,��ix�x��_���l�\y[��=.����2Z���3��P�X�B�����D�D��l�	��l�+X�����?�����u^(��W�������F�-�'��Z�u��ee%�����+���D/����W����C�G���c����fM���I����m����l`���jg]�z���
<�9�����Q��X������BJ'��8�C
+g�q~]��xt�)�]���<���5��#^�pZ�Z���|�a�X�j��M��m�Xed��\�s����[�V��ao�j���;dZ�/H���m3Y��t����T��)�f��|+
�e�Oe�z�Z�K���n�
tGXX�Cb(((�w�E�����e�'J^��������]u�W��-��Y�c��g��X�
2o�?�^���H����k1��4�l�^8�	��Jx{#&��i*/V�<����(��\KSy��U��yPR����<n���e�6���"!$?��$I����U�8��5��e�}����-����z5����4��m���<���;�4����(���z��6P�/�]���e*W�����P�]�:�`�){Csx�8M�|�����W�I�����6��0_�����-����M�M~����&�����:��8����9�L���?M�\Afi�����C30{���k�Xm��1C������t��d��pFc��8x��Q#�{Jj^��*�=VH�����zT�C`l"�U�q���X����Nz�/Z����V^�[�'RS��T�5><��P/��1~�l�$���i�j���k�$�D(�(���q���Uy�x��w%�b�>�����/Q3WvxA�IW�&�C�N��:��������[�r����	�V"7>_�Mo�/��k���S��1�$�����U
�����UU�=��q�!f�6L�� IDAT�r�SE�~�X���bb3G,�(��R3�G)����e����6:;���[��;�������o�/�K�.b!Y��Z.����c��8|s��-��V��#�Tt����X�
2�TG�.8�p�X�xA,wI%s��R�����C�6n����[��#���N]��*6Vp�^�D�I^8�6n��	�/���?�-���2x�������o����3����M�$
xAYQ�]�Y���R%J��/��b[u�`���E���L��e1,�e�Z�*S�6���T���ik*���e��"�PY�S����3����J&8���lm����z����evi�c���[�C��~vx����Z��������r���6=�� ��x��p<������^���-��Sa������]1oP�/^H���\�v�e� i��o���:����|mM\w�SZ����
�e���Fcp]i�,�#mx�E���Cc�/^���C���=����l-k���.���U!��o�.���#�����]���`<}k]�/^�?`�]�n����S�~)������(�6��
^�SL��"|U<�~7��2��tG/B����4�L�4��*�P�������������ud��K� ���������I}Sh���-�����4x�O�0����.nDTxa~�ZX~�%�r��4M$�)�Ti	��
/X���q-x��.���B��bg_��X/Y��M����6NCHXF��5�������=��@C]
:�Z9������X���S�f��k6�BR`�����K7!'X��p����������m����3�}�1�N���~/�=y���,4oT�1��}��U,H^���(����wn���h]�-����=o���+���t��a���������������1�����LtM���7r���~����O���P�����E�bb��N���n30s���������c6^G�<��u�W����d�:0�����vGh�j����p���Q���Se����G�S������E:q�`f�O�~�P��\/H��@ya�mG������}s���h�(�@MY�����1��<���������x�������x���QQT����
�8�����4��Tl'����� �X���O�bf���E���
w�o��a+��i���p,���!��[�o�_���0c��h���+/���������e2������m&��������6>e����o�a�,�)^�rn�c��H!��B��&�� ��]D������%io�����7z��I��9��2M�C5��<�������T��}��`��E��!G�1���:�Wo�W?{v�:O���m��������9��"��m=z-@=7��7���#��y98L�C��
��Ee
mp��J�����2�/���bB�q�ye����N�����"(:?��%=��	�H�����}��������Q�;������ddde`��Y�7���gBKE��n�u�X�u>���N��>:���)/����^�^���~��J���*�6��������d��9G�"��V�[�8:��dV�����t���n{Jc!N*
^u�B|`.7Y��)\�Fz|.L�)AY����cJ
�����Avf�k)rx!�B8g��B�^��������9��<������O�XR7��uK%0��Z_��s:�:��5�7T/�f��P7�������#+55�@A�^��H�)/VU�cG
��W���i��*-���	��)�;0��|Rx6��'CYC������DX5P����������G��e�������&�k)���}���E�z��=	��|���jHx��w�7H�
r������{V������-�E9x����c�0x�#2q~M�1����#px�/o{����?��q�����O�sp�/2�s�kAU��*"�y�n�}%)/4t���.��� ���n��XC����WA��<��7��!9)��i��g��x��<��W(CGC�_��kO���z�2���2#z|_q��b�v���g.��������	���1��� ��l$?������)�z���i���7��2����	%Gc��������|�?��y}u����L���>�n!���8
:����tZ��DTZ�A�X����y)���y��H���PBnh4�6����_A�����(Z�!7.�T7�� ��_k��Q�z�����9��H��j�r]�x9VGT
4G���r��������4�F�!���es�4�)�K����c���,(X�B��������m��T!%�p�r*�-����/���yP�Q
F�"���2�/�UuE��� O����V#�������� �?���?"��q�|��c���q`�T�i���]9==�t�8�{�L��S��P�
�;������Y��;��Ig����h�O���@�p�r���#-:�W�G�?O"-*[��P-:�z�m\��woP{�\�����w���)�z?��MU��J����p=:U�h\�I��{��;��H:�@u����/���|�oT�
��;9�i"�Oq��dX�%��u����'e�9te?N��*VuQ�F;�.��rD��E��3p�m?bB1w�a�y��F�8uu�<A���an�@?���`i���m�y��r��0B��������1��Rl�3����Z��y8��6��J�	yy��������u��pvh���$%�p�Mu=tm;�,����y��i���#j��|���j*��mC(P�����jVwm���I���#�nU��A�,l����C#,���������)������%W�aC@��������~��&��iig��Xw��8r��������y�7"�sI��>�::�D�&C��w�?~�<�N��}v��R0`VEUjj:����{����s�����O�q��|�[������ld�]�^������f�=�����4���ww7"�1t����{V������DLE)/��7D�1���g��������!�u2^��5�CZ�I����$����f?��WV��n��d��d����G"��(��oZ��U
^����h������'��;W�]����R��<t�1�J�-ydG�"rc���=/%\H���4���=&E�����h4V����t=
��
���ekE��JB��L���=��a����
��5��J8��7���(������N����!���f#�������Z!53
w�Z��P�7��
�%9'+a'2�4.EeRv����qOs0��F(�XC�md�z�t�����-�������.��)0A^��u�����>R��j��Po�r�j���9���<�Zz�&n��B�A�qd�!��5��'�EEd��F����91aT�b�M�<���F��R|P�r�jLyA��d�\�S�d[o�rd����9��G�BnWA��"�xp-����;�����4��|�P��$���F��������,hu
S��>���7��CJ?d/��dx�A����7]���=��i��Th��������tzk�wD����J-!����o8�����@�vs(Y;BA�*N��@}`mf�1s�����XL;�<1J)���]��,M����m��Kg;Y`w��U����1��3��^���^��W���JN��
}k[C������k�g��Mp�=��|��k]�$CO]K.�@zvf�5�)+xF$`�{WIhY����r�p�5Lt�����6�Xq���T����m.���Z:A]I&��8�2�}����5����8�i\yA���r���������-%<��6�z�����M��# :	s���}b�o{�E�jS�������oS\Z&�C����k��^�������mjr_�F%b�� �#��Zr�,����$W�+	^�P�G�f������x��v����HRV�W'�Q��cs�.]r����DRM8J-���6�M5=��Y����xWVx�
7=��L��]F�k�c���G���guT�h�����}����4�����;��U�PVT��L���8^]�m�f��Y��+5�]�z�m9�__.o���5,
@��}]���/{��t����;����'0�_7L$ha����5i�����W�E��G���^-<}�
=mth��Y����4C��.���^L�6_N~���������L�>r�?O�c���r����K�����s�(+��������F�[�< -x�������X��",..v�`ih�M��c���Xub�#1��L�8�+4�w1!��}�#x���i������;�����'j4�`�Da���,���o
`�����<�A����s[T����M�2t9�]�$z��m�����5�)��9�m|��0��p�w,�K�F`���#?cb�)��}z����C�����G��=31��d��z�sO�`��
<K��O#[�(�a��
��DOM���u���C��O���@��/�]�L����Q`*�����v����a��/,�F�1�C#�����H��	G���?� =+]&?^��[+�f����YY�l�S��~Y�Vv������of ��i�}�l`%�_��a����W��������a9rB��tdO�.�/|7n���
#
5�@�]z�{�qAA�8h%.^\K6�h�a.�_�^���@�Z�^x����������3�/$3�!33m���J
���@��v(���JC88�����~�������,��i#�D�!���@���Fch�!H�H��g'1��l���V�VZXwu=��B��������G�c-c��78������bx�a���P��}0��@���?������q��!��_�p����P�q��c�>(�L>=��(�\1�������5${=��������w����2�c�V�C��l�T���|�e��
AZr<D�m{eR]��m;%(��qx���������3Za��aRG�,��h����"^_��uE���*�N�&���w*M����B��J�;�	�a���	#%�,�MQ���S��3	"�����O�0��^LA������E�{:X�W��`�H
��9�������>�%���`m�R�F��)19|c���&|	`�o���9������HO�!�A�C6��8<��^ZN���?bA�.R*
^��Z��tpa�k8w4��3Q�t�k���wpU%_�����UDQ�N�������u��V�]�;�k�lED���fXXD�����������9s�����������y����ob����T�����e���s��c�K�����yD@�Lon�sb]/��]���tm��_��Cm�d��N��"l8{��������������
��W��1Q����N���o�pxF?t_��U���^`�%X9t��X�c�

/�������4�-*i��H��r3;����0���^C��=�~���
���@y+D�����|�b
s$=��c�/��a���< /g,B���T� � 0��j

%��%U���A�� �8�;8�"�S%�T��7��`���"��=�Z?g,����k ��/
X�a�E=���bMs$?��n�����P^H�qBQ��>���V/�8�ZpB�ME�6�9t�QR�b(E@�V�C�������4Ve�GcT!��( j5o��G��H�DC��\�c ��y��:N���O���z�f������k!vn�Z�� ��O�
V��������Z�rv5�WK�7.nD����qc74D�������9]�N����qyO������v��?!�|��5D��d����rM�����h��(�������������������q���w����7�|��v���!���{�&��]/������.����Qy�8<��']G�8����nT;�
XG�|��=V17xA���������\�5=?�)C�a��~�0=���sK������������b��)���#Q�����C���E�`=�np��,��-h�:'.�@���k:��=�����U�_�@'u�v�`F�a���=���0���K7����G�dCw�������� 4��}<8�p��1�)�s��M=��Qn�B=c8�`�=/�Z���?�;a��[�\�q�Y��_��S�>��H
-	Z���%��4T���7�7v�aJ��J���8F��Xx�6uq��c�`��k]*�"46��P�X~��)1K^�B��Q�r���s���M9�������
�Q��sz>=��a�hJ��jQ����cp�g����~�>9�Vm&���>�
�Ii���7���E�n��~c�'!���/?6]�.��mC�����|r�?���	^���"���&�t��%s��p�m��a���d|=�&8p�A�L�C�6���������p���O��!�mT���	^hu���[�im������n	us]x�=�����Yu�����B��P���0!B��x�{���rRV�
%y(����+��8J�5�@�o^�<9�to�;@��1�Z�"�t�&k!�`t��#dg4R��L��B�G�;VV!'x!���Y���6Sp�R�5���uw��9T��1��B�n?oC?�#g-l���WQ��O��:���
���������Q��!52��q�A�AG$�����,����)�f�z������+�n��j�6|��6�!"�,�
A
)~����3R	<�#��A��������'�7u�	z��;�
���G}(���7��w�t~Y�����hY��-���	zMD�����������~��3h\'y��]h.����$�GyA�I��tf^��Ios�!��n�F�B�RU�m&�|�r��9*5�#��e"����� �o����;�73�3�����
���ux5�3�x!���L���!^�43�q�u�RVxAQ�
Wz>}��2�o��O�"��r+���(X�d���o�J�	���6F�O��U90����@`��w��J1��3�+crc{L9���� ���Ca���{�!�v�.6t���d�N_V:H%��V�^�j`��'�';jX��C�m#\}��X��f�}��5��]T5����!�����e��/���2��Bcy��LJ��"_y�?�:a��hbk�kl4��2�X��l�}0xa
�O=B�J��8��k;��������f����jI%�k��pgnk��`gV��N��h�-����k�������]q��RJ������]���7�8n�v�����$���<�6�m
��r�C[����p���`
�jC�#];�@k���CS�
���[bEm=P��^|����O����aX��|z�:��|���-�!��1��TI�����m��7��w�	�B�~*s���3�a_������!}�a�A���6�>�q��z��c����
>
DLl\�U��f^��v��*L�^o��yd3]14,�����X���
���7������~��#��'�-�*j9WE��y���j��{@R��F�C����
�������}}��r���CRJ��6VX��	�!xV���6>��6����������6"'��	&c�jz@C�,��\�����C�`�/�^`��M������J��)+�`�4aJ	����������+5��j�rE��0xa��-�n��U���j�j\����+p�������P�������+6��mW6�`g����r4�u����:CF;6��}0x!����������++(s�]j���'gp��P��dM�\h������y<����`y�rn	�BA��{��L�#��BZV���&�/-�J�na��� O;"M������	����5�t�
&}� ��CDy�-��/������P��2��+�����L��!Cwb��aH��>C��w�;��;�X�
/0P!,�3��Y���f�*���M��\�������]nbi�:j:���~�^Fp�T� IDAT{�0��tRV�_�����p��N��G5����q���Z��|���o:���_��7F;)(���8SZ�U��60C�;��kEW���=<���cP�����@a�U6�����sx��.l|w���m��X�g-����'e�
�swo���������w;�:2\�����T^�P����������'��B�n��i#��$p��(�T?OEr,����GRt!���2��xS<������1<��@�����a�Jt��U	�$qU�����qBn����,���s%��i�)1(����=�m����`2J�"��� /d��DuC�n,=8���v���I���O���k��U2J��0vP��}��G�V����7*"9���_�Sr�X������A7�����h������=a[W��k���wq[�h��V�+/0x��K���
�:Z�t����~h1�<W���!�������thg�������'n�����Q�RQ�=�'��:B�c�}����������I��SdxE��wM��ak�����kV"�Y�<}���S���*^�J
�I� 9
��* ��&�v���
Q�oCchm������FpA/He"k���
w�BB��P$=�BJ�P�7���*R?��<��%�
�Rs;(��A�F���yG��e����^B�'��y	y%�_C�F�C1;@�s�YI����[���I"���`P ���I��Y�.��u�r�[��6"������h��f��6N�.H��)�#���
��n.�F������>!M�W13��*�������4����>4F�b��J^��)6#U>v��xz9����������x|���>���~4n1�/�!�`/�����}���O>������Q@\>=(��W�	��(�l�T^ �f����u7|�q��L!���6\����}��\U��4�xWFt���.������m�����-�����$T��'���?*;�&h��,�?����9$Q����l8Un���;�	)y<9��
B��E�������2��)�SRU�P5�:����������+	 l\�/�I�h��=������!%5}.�"c�}Ato�b;���O����Y��d�I��3���p��&��u{Fbx���~yS�&�%/�L�J����6�p��>�������j� ��(�����k�;U@%�=y���x��[�/������?��2��	LM�)&0xA�n��0��=���z�������C�����t��1����7�J�^�$f�^�~?�����!�o�~?����k)c�_��*<tWH��gH������L�ACC�����!�!�����|���"5�A��Q�c���k;�O��m(���"���>P�[����������S���5/��{�IU�t�}���G��`������T��8���E�">�����J�����mn��	^��L)�G�D�� x��B����DA5�����^���J��24�� �v�.�@���b��9��
~3�2m�(��`�&W�+(e����K��|�;=ZT�dEp�;1��`�&��"�f���r�9���������;h`�L*"
��B[RX1a�%6\���SD��4��/�u|=�H��������
����,���,��7�IH��SdH�%�����B��mu��n��<o!5�3m}rs�Z�v��(}jW4`��v��YR�<�m�	�]� ��������C���r�A��
�6\y!kZ%�:P�$�T^I��6j�����'7��z}n�A�$�g���F��b<��/d�q�Z�/#x��W�V1ee���4�	��r�"��(*����K+UpF������4��{!�3����^v����y�6�|O�BV�Ny�l�k��nu�{�1|�{���yq�v���lI�M�Q��9�:l�V���C
��ka;�dG�I���0xat�
�s�.T����}�Cj�@������`�A���	�����K�� �G~a��`'�7�~|"PACIG��r��/�80��#f�{�U��x��4VK0xaN�*z`@�X��X0�`�[W�mX�H�A�b�F�J&�Ni/���������RRY���2�8��5��#H���s�{��%��=K��R�H�&.���fy�L��~��`�[	�����`/i�[���IM�������2�/oX
��x@�^h�2�o���q
�#����^�VJ�R��0r���1��Z��4��6�R���9�������3��@e%
�uv���JCx�to����D�&`�ER���:Z����@�:V��F�T�}.�SbP��
���s�/���2/x������������"&�$I��u�������+����Y��}G����
��hOi!�H�a��BN�;}�>�rU��43#����Ez�TX�@�$�Xa�|��v�eI9!��,�<��$/��.o��.����-(��[��+i����$�H���
�����1��h�V�Jn�B���pp�qt����o�k���Y��C����,?���\�o�����B$�2�z����c�\���g,�+����XJ]��~�F;�������k��{�H	�+)�4����LyaO���cR1��}���D��S��ri#A������%,���XR�`��������R������� 2�����?��^`��O.�4�<���uT�1\xzn�Z�p.M�Jv�����H�Q
	c[���)eH���d�Z����|$s\H�JY[�����[I�-�|r�t�vD�}zhcO�Uk"��W&�`���3���'a�u�����)��7�[7w�5=����	k����BO�uv��J.�]�fODF�T7]��{]���^��q6><J��)`R������J\n7�Cfi�L
������Uml��=^�G���$�|��	k0����K�������?���w����1%lr�D��1��,��oA� �b`��8�y
�O�X�$ZVnA��q�e���@��GI�:+����
��<��\�ub�6�-���T
Z���<�aV���KI\� �cZ&�����@����W���}������nM@��J\y������"=�v����d����i#l;�@}2����$����D�t)���/05��	��R���"�?�4�?��)&�������5U���x���c�;��+/0����|(��.���)/4"���Q0q$��?����(��i����:*����~(nIm�_���#$'�!�k"���J	����*��5����P��.�|�P���w|ATP��J����'����W�����x`@^�K�p��{8���v�rx�������Ly���R^���gxcX�����5���������K���.����*���Xz�R��n�rZ��B��G\U�)"$��z�&H�N�;:�������������r��H��j=)
I1SJ�������Xp_��3�O��
r�j<pO_X?�R�!	^�n����9r A���>�'��T���o7�g������mj`�w�U���	/$�zO�i�lu���B�E�8S	Z�!	_Y
bm����W �\���fp��F�'BNce���Y���cJ���4R]H%%��F��H9��^`)�P��Vv�y��x�v��|7SJhH0��k��s�2�2���b��x)0����	hB���H��Hy�W]`��X����cR�q����p]}wf�D��[8��J�
�ped*��}������HI�-�Uy���)���U�M����\y�5���4���BX0�;����y�����E������$�]����M�DK�jx��&���t]�gX�2l?����T��KJF�j�����1���Uy�c�_p���:������p���"(�����&
H=���K\y���U�������\��/RLb��Q���w���m�:���F��8wcZ�����t�r/x��@�����-����In� ���"�`�����Bk�'���})��~�7��YM�2����b�Q����d�g{�v�6���0R^��q��:.\z��a�0������/d����^�B��Q�gg�����T9)/�s6��3��`�,�H"��=y�76���2`��}8r�W���9={.�E���@#yz��F�����8��]M�5	���6^(����R���/,�����p\\���`�����_�	^��/����_� ���g���"���*WT����R]|]N)48�������0!��R*	���5��9eU^�#���=������t��#����RR^H!�T�F
'�K�������������9��e���9�`K��2�>��J ���S�R.�Q�
/05��g�0�F��H��2^���6��B�u�4��j�_HW��IyA�n/��L� ��S�7�����(��+R���Z��\�A��H���RM|K$�z�K����=�/(���=Q$WJ��{�@�e?��?K��Q��[;�+;���L������Sp�RW�y������D��3nWD�T^p�N�%|���^�J��!_��I)4��P��k���a����0��:"��!�����?e�fNcei#��^��8���0�� G�#DLYb���T�L�"�q�q�JVxA�X�NV�=�-N������B������S/XJ�S�����F��,����tt0��'�����*���)s��@�BJ	CH)!�"{,5K_�C������.aq�<��G�`�$2@�xa�d���H�f@�~H)��,)�|�����&e��H����fmF����T�X:�U7�Q����	�Q��'�x{��v��)/d��h�	�vq��W(�8i��������0�Ri�4�(j�^`0S����G����RB�`H�B���yZ�J���.:���}��@`qv�J�H���{ k���~F���p��&���b�	�	��fBzZ�x��2OQ�Rz?�$��Q�z"+������q��;p����)r:(�A����������[��^h��/��Ko_����r=��YI����#�C�1m�r��2�&^�0�':	(����p�Z����
/<{�����-{1{��^��'��m�J���j�@C�%�Iya���h��!(�K+������"x�������,0����6�l�d�UH1��D`���wS`�o������]�y��kuE3��tQ��Cs(-�5�X����7�r���@�R��8o1
��w�������0���
���v���Z����x�A�J��1@`A�%<�Ka�eO�����T��)"�"������+/\�;L�%�ey�f��A)"��2h1������Vi������s��5��_/��
�������y���o�pH��!��c5�\d�c�����*/���o7���'���-7,����P��L���~K��������!e�����);0����0|+~&�uC7�����S�.\������x}�H��/�}���Z0Y��d�iY)k�S�`��|+	���On����;��G��n���n&� G������c���T[`��|��z��)�m$b�=�,�t�Rx���p���J���q��l����(�}S34m:��	����*�:���������$�[�z{�����L���7�;�4�nF9�3��
/0��XR'�����f}��M������6��]#���m"i�O�3�--,�<�r��__�+�Vj��$�
�Z;��9c�0��4tt���B����c����vs8���EM?:��������h�T������N0�!*!��*d��?8��Y �BR�����o{"���(K(����z����"N�o;c�������f��P������]��(���<�)�C�W
�����t�b�B��_�����Xa�B_��9����k��4�ai�g9�YZ�X�	fC��f�^p��O��(�,��
�{O)�@�[A�x!��Z�s���Q?r�|3��+�z8���`h�����7�c��)�	/(���z/O������o�
HA����^0������$~�����=�z���z�j�Np����2�<r�D�.��p��}R}0wQ!"
��ExH"P���p�#�t1`*
o����,�E����R<t�i�a��"qs��Lx������")����\��gK)#�p�Ly����5j�
80�
�U�T6�M����:���IN:��0�����h:�{����,%/x���%~j�����^�O��Z&�P��F��K���]J�c4�wL(����3xA�����=���kO0�WS�7������@��b���<�D�Z��;"O}����'2�ZP�����H�t	�a��������R/��H@��E�B�%�z+^`;w��}E{JT���y`�2��~�T��q����yJcBC<�w`ji����4(��D�GE���`�����_�JBN�,�:���H8�
��N|,��v�����}��R1��K}�����U��\�4���C����mH#�A�T'���Y����x�/��<�B�4���))J��j��]9=2Bb�>�R`��g,��}��g^��2�������H~A �g*i'')8$R*fO�@��'���|)K��)y�v��P� ~v�p��!�;6^P������k�W��x��*Ui����^p�����L������P��)�PZ����������~�W����1�:���!��jv��q��.4%��m[zZ��%/x��n�1m)��!8�@�{�'����^�h�������xX3�R@�����+�k!��[hZ������x��mB
Ix�@���M�%�v��(�D��+8��	������]�\�v=�����p���n�[�����Jn�S��O�G%�1���L)���B����|x���u�G��1=i�|� ���5O
�G��{�!U�8������?k'##G�$���R@u�k���1���8v�O�3�L
-h�\���3dU^`�B=����D�#��^��v��%�'V��L�������
n���A��7���\u�w���`B���.i:��|	�U�LxA�6qM�rt�	������oi�]������jmJm�A4A,E{�ce+
>EQ�pE�����-����Cc+(MDo!�~���JhaW��:�������ZV(O�:Ix�G4��%/x!���%��g���GY��@���/��R�����uxx��4��`O�kXZ�B�s�y��,��^��#GQ����(5�XJ���������z(	_z_�bCvx�@�Z�{������|R����;� �7&^P U���)�,��W�������%=�����r��1��k�#�w�DRx��)2�����Wm�	^�2���[��Z���Z�^x��Mw���%'`��&�h�p����H�`%G���6��YJ/�F�8�I)aT���4[�@��2W�
��A��
��������.�>�=U9y����mL�hS��h�a��X���A��:��"N�"�A"L� d[4������_�����JZ�vN�B2����N���@U��F�����Lx�<��|zB�B)�Q���;�2�4�j�Z�:�������������R��PoJ`����wSZ�LxA����"0 ��0���P��$ZO�~��M�giX��)�|~���( K���;� <S3���?Si�<�Zgqp�[\4b���^`�jQZ��� (�VC����*C���|,l:��!��7�������5`&�K}��9=S��R��gJ$U���n|i�
��Q{�|I��X���8d��?(}�[��b)��,]+��9u��y�?�(!C���:R�L"��5����t��s@$�XY���}������������.��!H���NH����K�\���3b1�E�q�������M�@�h��d��a�� �-Y�r�`� IDATY����t�Ui���L���K~��0gQkQ<_���oV��L4U�K�J|�O���@|$�����"��O
��Ap�4W{�����`�s)�D@t<�T���B�$�"���R�xR\hngD�J�B�����`o���4\��
����UFR�_GE�+(�&�`PM������
)�i����R'���,�O)E+^P%0BD��|���`���p��w���Mh��]SI�����0��O�Q��k�������T!�Q[{��}�
�W�O��`��?���~hY��n��~*s�b�c��\����_�^�V7A�Z��}���-���		0��kN��S:yg1:���c7K�.!x��	1PS��T�A]Y��LEX4�k�b������������hc�T�D��2z�.����TFJ������h\m��B
JaaNJl,Ito��1������j���NQ�~��rtIn���m]������tk7�y��A��+���Uk�dJ�E)��I���"(/�z�9x��t���s�d����OT~;�W��=:i?~�
�#����J7���#�}�x�k���v�>b��ama�C:h���2I���P�BdT6�<HRaD�������> ���P����2�����0H`�
�����W7��n��BQ|�_E�]\mxA2�.k�da>�9.�e���Oa�����$�f>���ON6
/Hk�i7/x�8�Q���^(Mc��Xr�$�GI��	^(�q��g^�Bi#GA���4���%k*�"�IH���<��S��53a�����VRc-����
b�$���6�$�T�>�JQ���m��Wn�BA��d���������	^�V_y��	^(�8rKQ��l�[�i�YTxAc*	�YS1����T t����	�0AQlfo+���6&Y
�d��'�2$5��i#
bW\x� 6K{��i#
;V�GPC�rz6�z�]aM�]^�B����/y*����$�P�F0 x�?�^�����1��z\�q
��d�����_���d���d�X����|$s\H�JY[�����[I�-�|xA����/��^��1W��x����B;�)N�{����DPnF

R(�P0�
�B��Uj�B��[V��X� ����|;��|]$�
�d�D��K*:����L��%1V�;��x�`��������Pj9�t�K[Q�E��=.��}������B�G�%�^(�5F��d���L�#��BZV���&�/-�J�na�#���|�6x�G���t����.�E���+�Pt��m��B�Y�����x[P^(��J��/�����*��c�QH�� =��f����:�P�G���P�>z< q���]*,�x�N��IY&���q!-+em}
���o%a�0��Ix>w���oxA��\q[���{\�����hA�J��
�B�k!���Xw$� ���[O���_�z�{@�J~
Jb���u^(��O����B��$�^��K����/�i94)k�da>�9.�e���Oa�����$�f>� 	��nC�~��/H��+n��Pt��B�}X-�B�YU^�{-x�����D����t�	��t�+X/y�B��AI�@���.���	�B��\�Q���=�����6�[���/���Y��{�|�[���\X���~�����J����Kv�y�.��4� ���>����t����@]]�����B��%�Gj���aa}$�F��Gj�-����(nCSS���J�a>�ar��>������V����c@�Oq�	�KX����8[�S����/�oTJ�{�g���� ������oQ��STJ���>��oQ����)K�=���|�z�K���>��oQ��STJ�����o%aYXIxQz6����o%a�,�OY
����#�#\z6����o%aYXIxQ:6�`�t�*)���H����#��t�*)�����y���/Hj�;e�O�?�Z���jN			�����.U�*�`���
}}��4/um����%�n@���S�(k�[PP��� ++[�n�Z_�|��Z��G"n��a}���"���*����l�4�SV!�1�#�Oqz�,o111�uL)�,a>�{����8=P��������|��L(x_���g��BX�����}	�%�{��R������������2�C���0�X$��#A��	��O%UKX����x�
�#��J�Vdd$�����)�!H�_a>u���	�#q�J���>u�D���\PPP����2&���</^��������%�OIy>�~�pV�J�a>��yI���$����������Q���3
�)�#I�~���O%UKX���< �%�{��R���/��d]�[��&�.�'�/����)Y�����>�y�d?d�K����.�O~*����)Y���{YZ��$���M�O~Go�~.�O��?������C%�� _r��ga}��R�����|/N�ei}���w�v�|�9�K���>%�{qz�G/I��/H����2�^��"
�J�������)���^X�����������[[a>E=���^X�������)���^VJ����,��$�(=��H����\���,���
���.=��H����,��$�(B�R:~��Ua}$�I���G:~���������V]�S�<���3�����������'	�A��,�K.'nY�	�)5�I��GX���@Y;��`e�����"�'�PR3��h��3��A�'��j�2��CZ�	���/b����$+Ik>�#�U��#�e��5[���������_�
��F1�`����H��?�6��k?V��Oq�[c��,e���\��%\CG�I�}~C(���7��|�_��r�B}���e>�N��
����	�I��6+����������J|*�)t����q�����������^IV(�|B�[#5M�$��o������MD�F�k�0������Oa�YRm�=�u%��_�����n���SJ�����}>J���R|��w�� ����VjU��H��1,��D�X`#Z�� ���w�)�/��K��qVT���/$�5@T�����oY(�fK�MY�	�)�CI�����M%VIX�s�X�B���MvARrz����Z����EA��vt8�^U�6B��=���
�z �)ti�:q�R�����x�yPj��
���V����@)�=w��M�~@d��/N�6���M��B�R�3Y/�����Rz�[�)Q���@�\,��{<�&���XW�N4 ������tW��0)��{���n��&|M�����}� �3���:�f�i���2!�������8&�:�M�?3!a���)����A����R�_��/�G��YQ����xA��.+����Z����n{a}����Z/k�#��G�/��(������x!w��B���/����J
^�������8x�t��/��.�����YC�$�]^��?k�H���'Y�J�Z���#��
A��
y�#����E3H�L��}�������e�C{����x����j
��N;��e�L��s������~�{��~M�vq,TB#��= Mx���5hXm��\A9��0���w���C`��U��o]q*��xI�:e-X)�G��/�������������/��}Y��tM�V���l�V�	�8���y5���@����~GZDp�lem�Z�
�b"���N�lJ^�5h%�_�6]�c��q�c�PU�����j�Q��|8���S���������p�~q�P�X#^��u��*��/�*�ZIRy���"(�LC;}���I�"Mxa|]}l�A��8�:
�B�mwM{3�=�'���W���XCm*����tv�z�l(Ix�LG�k����h��b�������q��=����@�2*h�AQQ8��)v��P^�:f����Z����^b��UT�5F�>S��fb��eT��r�I�������eR�#������P�Jk#I���}C���P����m��6�}�����Kx��I+/��,|���-���'�q�?]T�1_�FTR
:[t*��$���/.B]E/���������c0�������_T^P�q�Ac�D�Z]�y��iA�_{���S�vY+k.��������F�����'������WED|<Z����Gx\�0�T^0[��+=`8�.��]��Kx!w��
�D��(��F����i���B��:�7Fj�-��^Wa�bx{5z���x���:"�D��d��HGc�l�;P�����Y
������h)��Y���p�P�����<b�'B�A�#�u�P�< �e^��O��]�0a�O`�'��#��jU*���k�*o�J6y�E�������������|���`�p�
����RR�p��j��7�@������+��`�0�b?�
���>rW�W.k�#���PY����E���H��*�sDN��.��-�@���e�8����������R�%�h$	/�S��rVNx��B���������"�H�r�TH^�4s��\U|��O�k�$��E������1�U���� +�	�
��=b(ix�{-x���MH����6P���ZzXp����V�$�0�aC�������:���B��:>��U*��*#��������p�X�����.��E�i��.Ix!��)~�P�����^�G�EX4������g��_�I8|u�/�w:)P�rh7��?��A~�2>�4�����_�G��gq��]=I�'��%	/�o�	.��d�V�^P�b������^�
u��"���u)�T�zC��I D����ZJ�U�E�����t���Hx����?N&�q�>�xA��bn�#��`�,�8r�WdTdx��/�x�����1s�0�{��q����O=:`���3�7������i���@����{w���/ 84����e�z��D�B
II�8}�ddScC���t�v���@[7�<�����=
]-�~��@E��.�8T�&�~������W'��?=/h�zS��t'"c�h��������2�~C5�����~�@br�������4q��'wR����Wh���M� ��7�w��[��CX�W^�T3���I�f�{�OD�BV6��<?\X-P��z�-}Y�	�)�CI�����M%VIX�s�X�B��2��y���P�EXD��������:��c����FF#l�
�B�fU�7����������*���U����v�����C���H|u��W"%�a��A�}"�C7�M��)��3xA	3!���!���:C� 5��>��nWdP����#+�Q�Q��b�@J���>b��V��H|y�+8h�yS��SS�}�C��t>�d���>�*NM�R�dde	z������C���4-h��H���%7xA]C]�/�i����<�s��EdD ��X�:��C��8�{*Zu����{�;��~}uM=�9	�I���k)+h�����zv-�jw��cs��#�3G���W^��G���q|�L��8���H�������C��PTR������N��Tph���X�D�p�Uum4m;���~�S2PQ�����{c��n�/����#���xR���
<jc��_a�m�������
n���z��)�~nG������k��gT�����k�xTvtE�����;�?����&@��w��>�w��TS��e�bY�\;������=#�i>o��q���|��/(���R�9t�#����
�����w���V(�q������;�-����CH�?x�����3�Z[���8v

l��������o�ad������<����[}����%�l��JJ�TQ��w����#4�d��������>�/���&������Ep1S��_�`]�+���H���''ZqpH��7u��AUAW|�9���(
E9<������h`����P�������MJ�/;��1<	{���)'L8���-L��n�lp
]���r�E|#�0��1��M%9����zJ\��/26�J}2=�2����As����i(�O�+D�rFv�k����1W5RAGm����AZ�i���*�#oIAbZCCD$��L�����b^3���`�e�6��}�����HN���
�p���{��n;s������:�<�>>�tn����:~������Jw�������!8��o]�r���K����}�b���U��N���IH@bJ
�8+Ll���;��q����i��@s���S��3�Ly������q����u�]�^|���W�b�����
�����!���SUQ�����h���,���6��j�|����~s`�l����)��y�������5	���#!�+j/8���^P7��[��G�~�nc�nnG��x�n4�+���h����F��7W^`�+]�'�FA�Z#0����j�Bh�9��^{�!>�3�w��r-�R��H�����P�����
�.�y���Nk$F����<^l�	��`����.v���F�'o�k�zU��[^�����AV^^�CY�6��!��#�L���~*��nB��<]9�='BE�������q8���0��\�(���Jn����4$��g,����T�J����J�jPj����AHy�	t��R����q��!����-T�Di!Pru����yPN�D���A�Qu�|
A��'��@������Pn���S����dH�V����BXB���A
����.��7�(�g�WV�P��8�!���}�N�n:>6�����F��:��kXh� <13�l�D���g�E�����Ss\�
���0r�7��l�����G}���$��D��37����=i�O�=G�C�7����e
znVg���C}���jS�q��n�j6�/�DBRb��y�&�]���;����Dz�_���������O���T,�?{���c3���H���_O�)�)/${|��|��W�.�H���o	�w6����8��o�������TGZX$b�SU���F��{�QQ������e��o��B��2?��c�����L
w�<R�?@�GK��3���4���K��JP#���Tw����qng�>���n�b�JP��D�� v�q�W�����:�R�q;O@��T{�F�0�-M�k�o����j/�W�R��H����b7��R����K����Y�u}(8V�������m�P���w���VH�Lm)��:��O����H�O���[r�zU��:�7g�=�z���Y�<>��������������Z*�F�-�z3����"�s)+���w8��>��VB;{G�n+b����%�n����uU`�[���A�ED�x�=]���U��Y�:*|m���J���`8���w.}Q�[�	>a����+���_BNK�v�"x�Ch��
WK���A���H�,�������e���4d����=�0���_���A
�NJ�; �@�>O�v75D]����i0�M�.���q���o���I
f�t~C0�3(��z������,0�9�+/0��5�:*U������	u������(�5N	�������D��)�yC�i����U�����b����!�*��7������� �N8�/���hFv*+�������O�����l����W3H	H�s
��_�����u�`Azy=�a�Q�mQP�q����q��A�������7�B�(� ����j�O�i��#�b�"S�`c�q�{��Z����q����?�3���S���?�b$ �f�_��E�JZ]���X^���n?
z����*2�~�:�se@*�\�A��8���3q|�����)���>V���p���{/�����"���1�Dtz�����M���{`��E�P�?��M��N�l^(#���kwp���N�o�v��v�	Z`����%������A������TO���-�D����'mD2�P-gf��5�a�7����+6��j�m���S7y��075F<����gG��g�9S�-��>]P����C�w���f�>#C�� IDAT������@���L�\�����/���E#�3���7�Pz��PW����{��<�~��Bc�!PVT�^�X�t5������:������V�������!������D��o��JX���t����p~+�V����xA����l��e=Q��=<�FJ;�s����D��{���D�C/z�@������U@�����J��Hz�Z}E����7�&���������"��-�%%pp �����mB��#�a�\@Zdp���#�/���>,$����>��u��F���@,j�:"��(�����8��������y,��^�	�|8�+�%�C;>��s�p�u;4��D��E>�s�*Vi+�����_�R��$0z�qlZ����	���gs����_^����8�cD�&��g>v��?WTT�;�;��3�����X��+FL>�����ye��!�7&�����M���\[��pD�N�z����m���,�|���|�7�����?:���U�Zsx��nD�}�~osx���a|��������/���	��Q^�
a�!0�4�����Kp��$TT��bs���}k
�g��t(���������v���6��K��pj-�X�SG�"*"��-&���%bL%gx�u���y��W�$_�t���o���'���W���\TX��M��j���G[�BE����O��j��1�oP���8<K���[%7xa����|�,�t��f&0�a�M,�����#$:�\`�����T�Q���#��y��c_?���m���.���/�#���c����^X���������A��AJ�(�, �66�t!�K�g
��bB=l��Xz�����x&`ms�!��}E�S��0H ���To��=��'��!X��5��>Gx|*f���V&�{������}0���
+���eF��	v=���H�;����y���P���D0�*�s�i?g�
J���$�Q����L���r���.����-M8|���	~�vI����`�EM�=�	dx�Gcl#�4�T�pDFq1U�ce���W�(l�
^p�T	�ll���9��R?|�|�n���u� 61'?���mysJ����5/rx�D[��>`�#�54�%<����b���D��n�MMakd�j��!(:zN,8q]j��������g����F�B����bE�hi��������To����R���Dp��
�Q���w��������������>������-��>�����0�/O��p~(i���xxm�3�n�|�F,���[`�y$�'T`�m>_����g��wJ�����5��q;�'h��H��T�����Lu�����������a��^0m�� �/}���E�.W��<l>�������o}��X�OW�E�9{�t�/'X"!����8f*/T�o����Q��znx�tT�����-�������wl�O2�@���������]��B|"I�_�j�VH~������q*ZC����m�)kP[��"5(
U��p�*]�>b	tP@�����x�1�VH#5[3A����c��H`���*}S ����@Mt�k�=����;x�Fap�rp�E33}�$xaE��������0�JD�#4��O�b��	�XI�������	�8���cP�P�C�V���^X]�o#c������w��Ct<~���p.H�
^8v}m��'���6�� ��P��Z������C�A4|��Ntn4�<�@WdH��\8��R�	l��`��L���6�B����2��4�D���yv���x~f���K�hsQU���F�7��3������������$@��s���B���,D���u��d�T�1m0��m�b]G$yxBm`'$�~�R3�\@����@�`ys#$�?� B��i�l �}<"�������c��R�ZH�x��z!��U�;�P�*I7s� �������9�44��A�Q �A�����P�y�(��%h.�3WC})8Sj���p���A��U�5���C��^�i ��;�F�D���P���'�H�>�9k���(D/�9��R�����4�`�0��}0@���v���������z�����BG��Qp06��������6]������`x��Xs�
:9T�T$������yo/<���]�c��m�V�'_<A[X9��X���/h4��Z
���ft�}+�n�0�8�E��U�op!�M(��E����e(��xf#��=�?�U���{~P4�D�_A���;����c0%H�F�_�5��xAVM���4j5�y��������b��Wz�{803 !�#zC)��9a��+�EA
���FCD��7X��3��j<��������7��
;H@�y����7�X�7�C�)
~����j��C���%/00!%4	/isS
�Ip����0�����/�E�*�����������7����tm#%��D�EJX*��3h ���VP}
�k���-8X�
�*�H|��$��G"AE�1��V<Xa BF�i���:��/0PA���
�_Y�Ye:����ob�fSY��]�uakN�)2�������2�@�-r���#b8t1���e0��=�s'!3mH��/�l���x�P�P0��FSU�Q�w$��3"L�8D��K���u��0���;�(�.����	�Q�����X�c�
�u]u�]uu�^��n�;@��;�����H� ��}|Vgn�s��w����#��T��
/���k�Z�v�fL�-{�b��~���fl���]X4�[��\_{�?(	�I���Gi%�8����)���xvv����Q���ndT�g�����s�_o?��V1�PfAK��*z;�`/<x��D�i���r�Y��Z@\x!$��~���	���p��6��`�[��.�����=~6�����kO6�G�����X-uc��������1����9i#�������k��K����)MT��&���'w����{��� <r��[tR�����NT�_�M���-�kW������t�F�1P��F�5(uCN�����X��@��14��E��}�z~/����;�`<D&5r^���7�����d�TB��5�����
��0������%�8&RYH�|N�$?&(�]e�I�R���8J�� �a�gkH�y	�q� ��e��?S��pA�;����d�Y����x����N`��P�nkXPz��>��V�	��ZrU/���w�B-�V� ����m��k.j�i��W������k�'u�M��z�x�?���'z\B���&h����`P��{G��6����������)��Q��^2n-N���b"^`m�^c��C|��L�$+����1t���aD�q\El/
�-���3�E��t�N���`fQ]zMCx�.��vM�s��;�{1s�lY�
2h|�K����������c����b���{�����t$�Z�1�4���{���%�'������[���h���Ech[4�z�Zx\�5#��
��H������>*�n�G'kKh����'�3�� ����������{9���:��mHv������yU���]5U�v���g����$.�����A`\:�0���(��=L���t�=���|%�la�?����N�GwS��`C�(�&������U��+�
�A�dk��7������ �������`5c���r�@����$�%��E�9D��f��

�h"�N���LV�hH�
�?���T�?�c�����n�H�,R4�R���+Sq��0���$�op5���@mxq�E���~6$�����b�����:�`V��EIKA�S\�H����v��E�L,����`f�.xF�!zy��e���7o�N�	^`*Z`u�|����O��U������q�0n��������A�q���i�:��zu�	���co;�6n���^����&��i���8��l�FM���m?�>���;�D�@e��l4��/����=WU����6���#x��a��@ul�����B4-��u�����{8�>	Y���z�h��$�B�41�+4�Y{1���"�H!9�_0�����������Y�>L�����
�n�:�>r��E E��sT�9���s��0��9�Q��D>������.��������E#[��
s�J����A��,G.Db���4y��87�4QYQ�����J��*���H#h!���V��]mQ*�,
t&�NA�n�id�SP�=M��k���A�[R� u�����xg1�g����:
~��])�����M@��3���	��A��������W �I
aHM���gl��
�E4�W�	C�	9�ED,|����)�����;,%�AnQqV�{����Vw�?>y�?	��)�)���7�a���E
k��Q�����p�^�=G��������8�o������A��:��L��=V�A���d�Bk���jT��iV��O�\�J65[�@�>A�H)�S:�_�NDrj"�\	�j�ZKA�BfP�����2,�H��y{R�1_��(x�MT��-�3M���%2O��B��#R�����[���zh���������k���JBs�����ZC����#$l>L�7� D��'o��4h�>�"���(��a	�����L?R������:�����7Cs�T������#g\��Y;���Kp6�������|<��]�
}P��c	
:�A50GT�R��K� n����(Ij��/XV�����>:
;�&�kR\R�Q�'�6��<y��{�_�������\^8I���!�:��:u��������j\����gb��������x#:	oH�����"��l��I:�oU;c:�	SmdL�=IA������D���PkFu�>�5Eeey
���{�1Xl�	��g��c�J�x��W�������PB*�S��#,P�.������'e
�:
�Y���WW��
����#�0#���	B�@����\� ��	Z��ozH!��J
�( ��r��]C~��sQ�F�d(x��R�L	!w���C��@��6|��@���|������r�2Z����b��
�C��XQ����U'e��;�4�~Li��+!�$�X�S�I���z`���i��)y�B�������i\"��BQ�S����J��t�	P��~�������ZCV/0��pR��/^P���\G��Y�`�
��JD.�����0�O�����L�"�����)?0�~(V��>A ��I���^� ��[O_%����	����#$$$����wl�9���A!���s��N\�*IU����B��Z��/@��^c��e�~,���`������+RH2JHQ��,��<q����N�Y�A����~�X�]��^8sg�55�x^���>��| B<["� xah���O��Hy!<����`�RX�]M3�Nty��8c{�-��(�=Q�0-X)��l�B� �G�OiZ@����/����?����;�5[� 6�`I����w��ZN�~����*?��������������������X��
���t���P�s@��diX�Vr���^���`�
:��#��#���� s�l��{�O� ���>���0��$I�KMB���P�<	��`�v����%LA����l
�[�#�����NO i)^`0B:�.&2c���J	9��Z����u�g���^h�z�:�D|l�����!�T-������>�����~����r&�K���@IE�f���,UE<�������+Q�>U"��{6����zC4h�7/o!�b.�X�����G�"���Si���n���j��&�
n�.�c7H/\t=���[u�)�#��`��V�������&����7���2����~��N����B8Z��[Ww������Fm�����fi���-���"x�������`4��m#���j���P�=������&r8���p1���JA��7-�`������=^A�$�s������7n��B"WT����Z5�W����S^8<iF��O�$ya��-xaP}mJk�IM��"A#��)/�v��������I���������,?���}�b�9t���U�<:S3��O�:<����UyZ(�@�g��A6#�\��}Ha)>��=S^�I�����V,uFOK��e�>*/�t�H5a>�&t���G�����
��P�1�L�y�r#}��}�\��)/��l�
M�&��K��<-	�H����5VP
6����$NS
����z2�4���� RK�:~<f��/�F0���4�qr����a����c�p�2�����i�<�}2(��C�p�����BR]`J
H8���9]�b�
]H�!��8Jt�H��Gf��^`���������|.A112��I�E����^C��!E��h8oX�	�3`AE��������Fg9�)/��S3�����?S^`uk����'%���"��b*aN7�bh�7f+<�B���}�@�&�?���:��3�y����	��t�����>,��%m��������{~'OK��U ��z�RJ�0=��*�^�!(!��D
+ ���~��X/J��.��r�f�.��z�R>G8��������m�z7����X���*/d�j@f@��Z i�%�j�
,��J���PG��g�A&���)�	�����V^�������������'�E�������>5:�����b������!)o�[/0��)Q:����J	9��7���_O�p�T,��ZK
�	r`)�*/$S3%����_�*�v�%��k���Hy�U}RZH�m���(J3������g���"��W���lj4�w���]P���^�u�WJ%1j����[:������R�Q�Oy���S���
x��*��DM�z<
����)��]�Y����x��om�t*|�,�&,^H�O'�[�!��/*�i ��NK^���
��H{�
��M�����f�~�����t@��.`_�i�^��}��@�@�1R:�	��e+/��E) j�l��6(�q u��P������2�yf�	9��>��Plf���>k$�P�J��������1e��H99��m�O��3t]����n��B4�M�
�=��:��z!��=�yG
(}����(�W^�y:Ww��0�qpz�9m;�58��By����6��A�	h�W���������n�������q������wH/0!+%���2�J	�%��Hy!h�-JP�N�Spu�5"������/�Tx_���QG\��������cN�o:](����;�^G��_�H��$9���B
�o�`�L
6S ����?;���%����D{fLv�>��B��D��C���l�����@'�c>*/��A�S*WAHz�
vR���8�f7��`�r�,x��h^,H����@��jv�*�O����+/�J�+�_�C���,��fWU�
��z0��0�w$�����@�%r+/���
4;���l�p`�A��T�>B�.)�
���>00��s�^�3���l-,�/O�������"��(���3����n�>p
#N��B��T��E�1��g9�����{�\���l���AN��-�M�ZGN�Eyd�~@"�+��(GUC�)�����aB������k���Y�"����I`�?�iA\���G)>�������'XD���WYE�*��A7����q����}�GFc���X�`*�U5�@����@�~@=}�l��������<��]RN8���O�O���O�M�m�J�:���^H�w�<���������D���mK{��n����+��3��V�����.^x��0�"���|���!��"x!8��^��&��O���d*�{�7F�0x���U�����@G]��# IDAT�)���^`

�����2=�����>����~x+i�'�)[��u�zCa�
��M��O�K�)B�U��n��kOi�&�G��n�?���?r�y9L���N����=������G���.^��A���0���^��D����+J�D��-j�)����L�=�d��~#�N_&;;~h
��N,P.vJo�x�N�P���{�p��i��`0g����5{��OR_H�uC��;��L%Aw�j��O��+����L�@{�z�!G'!�Iub���E).��	���������`�tj�F�
������1MsO�y=' j�"�?��:$��g�������c���K	��{Y
uMz�������+plO��S^6~�)m���.���Gi"����;I)��@���� G{���_P��������Q�6c��cH�a!�5(�6����_���������RX�8����4:-F)%��=����V��J�j���n7�:��Q�p� �������m�������[^x���1.����m�FCa�E'2?*/��i�-7���5jaH���x�Ol<�o���F��D�k
�g�d%?x�K���\��8�g1j3E����yu[t�;��p�{c?����)�����Uh��?�c����7r�%x���Zu���`�}~+4��E�����y��~�V�����V���$
R^P�1�e��F1�����A��&U��(��5���>���~��?e��������RN�Mi%z �>Wq�/M��-�����"�C�eg/lb.���T��v��{G�:�
�R�������7��P��<�����O���{'��� 69���p����#���H�!�$�_����/�(��S/�kHR�����B1�NW/��W�7
u)}v%�}����H� ��Ya�8�T�P���y`�q���MiX
	�j���Ej\�D�	L����1����(\�^� �#%�`J��TXj��j8��� ���W<H���Xu��n���D�����%���������6�*��F�ep2��i�c�����^������j:�X|%P�����B�0�VS��?�:IL���B��|��4��d0���|0e	M��XNp�|���x,�E���p`�
R^0�4?���?�O(5���/E���*������p��
��������X�	�6��K,9v���!���;������	�����������k��?�������sX>x0�i��Ty��-4&KM�E`�	�8��|����RX����$�����?�8�8�#oY���I��R7�����
2)5SJh��!�`��?wDeR�xC�@�����y���&?�Gb��`�	OJ
��
���to������IA������;��" ����p?��)PJ�&]�I���W��3(�kqu������C�M��J��A����H��j`�S�HO��`����I'���������5�N�V-[���j�O�W�@}J3�Ra(�����9\���G��5[4W�h�1?@���������A�:�&�:�_�}����c`��<������m��=������[�R`�z��|�Er	���X*}� q���/��x"���qt�\��=��I)#(����H)&*Sz�,�P`}�\x@'�5y���"+4
)w\����HJ_�d��Be��]�Rg:1��nm�z�!�m��R�l����0x!�R<lt������0���^`}���K�A�Z?��_�s����������F�J�!�����T������Gk��KO�����U�[Ry�#�9���O���Y]�����h8�4(�]WG�����/�y?�������E\b�^�v������E)Y�PJ�p:4dA)������+:>��,84��c�7",:���iP:�Z�n�:�M�F$��Q]�#E�yX8j#������!,�X��+G�w���&�����]��A�/�/��GV��!U�>��~��t^`h]��0R���3\���,@����@����!���(o=���|����������"	��=�����A�eE���!�33B���� �A�����u���T����z��H�@c	)�8�f,��v)W�su������9��	�Z�H�q���#��#�����:���Ki-r��<U����v����Li.q�q������iT�wGfH�I="��O��R���H�-��r�.�J]����B/#)/�'�J����_;��f�D����	&�h�����Si����p8d������44q�T��<����PU[�)���!�GX�6�uD������$����������@)����.����B/��U����*�Sd!� ���C�������H����2��5������i'���V���h_�e*Sz��|�j���u2c����6�E)u>���/� >H,��J������p��#���*
�x�?� �>������2�H��,SM0����bmb/�����Ix�~)��
�j!�XW`
Y�g�,p�^`i�����>�|�
i��T
^`�X*�dR0`�,�����6��8�$X�����a����U��e��`�y���)?0��0�r����;B�+)0�����P�ykt�	}~�.`���������e�/�?�q��%�p"�.�w�)�����{>;�Ae�J0��E{���i�?F�~��S��gi#2	Z�Ii�h�)��_�L�D�?y���2��tJ��T]��a)�6��%7��^g�2��X��x��r����@���,DL��S�`�q�{�R�(���S��I�!�������S�za��1)���=���������qq�������U�"�^`�t����c�wP#�V����7,�����p��y���Nm�W5fX_;C�ur��`�����q��$&%�4�t�&�R�n�&��/�����xo=|�qztn��V��
6��H������=*�gJX[)Z@\x��$��xA���?��������t;.��������V����*�j�?����r��(���^(�}q�����
�*�mr��(�����m_T��������������y��FH������l^*���Je2�0H����Bi+�	NXC)3X�PC�>%m[� i�_K���_����g�������8H�SV%c�(�DI���]ai#$����/��\�1^A��4�.�>
��1�"�iRN���6��SR��z�D�"���i0$)���)�������R��?/H�fe�]�T%��3Es��NS!�"��6/��z���q���|I���fB�_Z@�*� lp��5��l=^��{�zd�_$�]����m{�?������B�xA��T��x�p��B�����?��P����� ��Y-
�4&S�HK�����/���P|������j��Z��\�����xq��,�ef�B����"�E�(w
������������]���<�xA"�}�X��kOY�&
 @��T!�/0�d�l�ii�U�s���, �����Za��>Z@�d��`�l�+i��$��l����}%����G��w�/H��(���xA�B�����w�
^(�"_o
^�o�_�����P>=*�E���/m���!����/H��Bo�H�� ���QBo�J�� [cW������I{�#�e�^��l�+i���mA^�t'�m{^(���P�}x����/m����/����W��/�O/
�B�~���m$�� ]�
��t�)�&X@��t- �� �%�&X�-���c$�d��������G^^^�9��*�^s��)iB����+�v�J��%E�OI-W:�*�x!{���k4�TM)�&��j�P���jg��n�G�j����O��jT�+�j=����U�+��z������C/�n���t=.�����j��KV��3����g=UM�Q�����
��xS��jFF*W����v13k�������9��z��[I��Z�������\����"��B�z������Xq���z�?�^�^t�J��=�w+rrrENPrX��Sd���P���������*�}�Y�	��K�*N�b���2���>g=bO�T��z��5��0��VZ���5����R�_q��5[d��sq��I}i>�������b����)e��`�&�t��/INNFbb"����_K~M�����8����Y����*W���..E��������}_�O������e��}_����E�.��(�������E�^��uuu(++����}a=��M����*�~�����455K��2KX��L+���H��2�D���L+q���;3�����L;�#S�J����MX�x���Vt��l=,+ek_I{�#�e�^��l�+i��?)��|+�G�.���dk_I{�#�e��"������n�H�g�?������#;�J�������m/�G����w�?�ZP��+��`�l���������m/�G�������?�<<<�I=.���py�vV�jm)))�����)W�*�d�$Rdd$J�����S�\�����)MT��������-M[�d,a=%�Z���Sz�.�H�Jb��i
UUU())���2EX��
,a��$4�������%�>!!��fJ9��)�^�#��4-P��[Ez��������$,�?��Yi��S���|,Ay��l/�\�- (/��A�d����I{�#�e�^��l�+i��IkI-(���dk_I{�#�e��"�G8i-��"i��$��l����}%��"��"�Lf~�#���m{�?����������k�5�L�
�z��R���Sv�gd�?�XI6uxA6vz���:QV�����.�GR������W��+�*Rp��VX��;\��������.�GR��}E
�1+	���^�F���aE��!�Gv���g!X)�e�^��l�+i��$��l�W$��J��I{�#�e�^��l�+i�_�xARo�+�xA���h�=a=��/��.�GR������W���`���m{�?����������m_��#+e�W$�]����m{�?�����W$�T�����Iw�l����}%�]����]��)�'����c���#���l/������l���l�*�Z,���c���7��X����	����ncc9���b��HK!X)�������23�X��LeV����"����d=��/!#<Q�{+�J	����'==


b�-�J�O���Q�d��*&�������]A���)x�7$@��*q����K��y�FH��������'�I���.N���@��������AU�|�Y�T���e�����S��}W�T�z_V��P�<�����4+I���)�Q)P^�S*V_��r�� L��$������+�W��C*U��7q|���G�sc}�+�a��}��a�X���+v������73K<I,�{������[���	�M�tJ=���H1jJ�Ji}~�
��#����[i�GV�Z��u�����,�G^������Na=�����b�IS7DpR��;��Gu�[�2�"�������l���/i"���^Xui>����GuCF����7X-��b�Q�.�-�'�G�-\f������X��Xf*�J���l��,�z|�Dzp����L
+[���8�9���#2���d5���f�ml/Yu/�~
U]��#���2[@9���k[�d}(G3*|*�o����e��:\�z�@��-w!&�m�^����=+�s�gv��6 �#;(]%�XK�I4t+�T�'��i6����'���R�}�j��N{��)tV�-���1nD~=�[��H���o�����&�ERbh�ODF3�V���e�{����uk�6P@l�k�Y������z5�Y�TI��i����y��*R��-VXO�.�Y^��i���v��l=(+ek_I{�#�e�^��l�+i��?��%��,�K�^(�Gx�d�����-�V� =[J�'^�����/�^��-����xuxA<;	�J��Pz�.��x��-^>���������x��zZ���7E�N/^#$,=;�������_���
p����W���k�+��y���<0�w��Z�����I�`���Dc�o����F�����E���������� [�T������I{�#�e�^��l�+i���%[�%YOE��k<�]/`�mo��tY��������4�#����l(�_�S��J[yaqo-�v.�F�a�A���J^�coI�R��^5���"��!�xh� �X�XmrW�k\w���������1���Z����PZ�BFT������>$%@�e�~�5wi+/�j�`P������
=y\�>{����p����HG�TV�B�
���;������b�Q��1��z�d����������V���i���t��/�<dUY����aUXv�h(�k���}������O��N���!?`�����c>�H^`����b���)/�����}�
Ee-x�{-9�	/l����8h��AG]{/{>y�����W�1�vK��tZ+��������.~��Y�v9��cCp-�
fXg�K\|
ME43�^��*B#i�z�����
��&�oku��,�%Y(/,m�[�_cj�zXv�x*9����R�I������;�z��Z�*6<�>���bS��(�S����3i��Z��o���P�k�����Z���������s
[��&��;�`������b�OK�].�����.����
���KG~�/5h�I	��t�U��r�%�P��/���	��������e
���D��.������Z��{Zr,"}k�����	Ll�����B�W���u�5[MF��#D��R�/���='^(;�	/$%�`�?�0w�7`�����:n(�l�p��M�����uk�I��M���!}���V�8v��1C8X!��Z@�$�`���`�l�+i��$��l����}%����G�`����E{I����
����~~}R�D �x?�gL��\ Mx�_�o���^�KzJ^�4V���N=K����U#:a��X��M���F��V�n���dCJ^H�{	��-��U�cZ���w��������Z}-��� �FH��j,�������^�t%��y?/�����!o�@��z�����C�������W/����C~b_���P�n���CC�j����8�lFO�_
������^Xh��)sx����1�~g(T�{_��x#�-������a����F���7T�W`���*x���������r/|��!V?|��/i�6����(8CG��B����j�Fxt}O�����g�}O�^�%�
e/hV�m�y�,� mx�^��x}u>d���U��@������90����G �@���7_�k�q_�A|����Z��
��� ��`Dv�5��Hx��i����a�$<vz���d�r�`��}���p������PSU����
��cg� <2�.t��C+������`)0��������T	056��
�����W1�C������c�	��(#-=F
���-�V�>t
�i>B, 
/|��[8�o����c&b�b?n��n�H�������&
�g��FM?������Fm���5]\�ZPE�	�)��e������Q��)�Be��$����y��K����������	*�UF�����L����H��F�/�0�!��6�'
��;��L
+[e��-���M�X�*�<�����PEU�|AUA	mMmP�Relp9����6��_���	[:����1��@��+R;]�&`!,)��_\(�>�S�Oc5]������+5/h��c��� G`�����>�N���0_l<�=�
\���>�G�����`�z�q`vQ�������)������R	�	Y�x-����gb��x�5QD��JdG`��x�db|;
�����,����tT������x�����Q�@��,���1):�6 IDAT�N�R�~�T��Ix��*��S^�����y_�\C���������+?L�����b
���:j���'���A����M%�{���Dg������t*n����OI��9���B����S��0f�Il������������W���oh4������8h��`��sP�q4M�������,W^���%�'���#E���Ba���;"5=?iO�VBhl"���	&v��<����C��/�I����4��H�u�~�fA�� �ih!���������wf/_���)�;���9����!��!R��G%%eTRP���I�B��������]�de��s�����PI^^,���`oQ
Z��v_����0�IS��������S��|��0l�}�����C���c�ac�>�vH�9�fd���'Q]_�;v����=|�;�X��;tU�������)�o��������������W(���Mpv��+��r*�� ���Km��5�Z0"��zo�����;�[@AG�w���%���D��l���6F�w<t�����J�D���HYA	n����Ut���t�Y��?0����h�2��
7���%c�#4��/a��r*r�����y9�C�����I��J����
0�X�����e�E9M�;G!��{��7�AR� �!p��<�Q�G�.-<��<Qk���J|\����ji���4d&f���c����*u����T��������t^�q�����{���}�	������a�Y�qk�l�h����Gzr�N����eR��-�"��������,@yACS�(8��+�����{����3����C��@CC�����|���t��wn���M���ATG��I���d�+��u�����m@����aWT����#�.�G�����~}��+��qZH��v�/�����&PI	�	I����"�j��
��O��9
�Tt���d9�{]G������1����J4rX���E����]����,���?��vT�����D�I�\�>%+N)Hy��e=��5�_�~;q���1�c�vs�n��m���G�?��9
]uM��7?��~��`P��HHNBJz����Z��X<h�UT���Y\�$��P��,��YG BLZ��1�^G0U�PRG�^�I����M�X0��-L�t����Ds�hZ�����%Da\����c���K�vrt��}������~�G�����55
����:����~i�O"|� �L������b�p=�
]�*�z�0����s�c�S��5mEU��������0��o3�zJj��~���B������P���)��p���M�l������m�""%{=�*���i]�!�Ak�W������
!t������l��	Z�$����
V�UD>zO�wy�C��A���a
�{����	��!������U�^�P���5���s���O��>�����c1��:��������n����t�+cB/-Gf����j,�2�!PU��wty�i�Z)����R7��& "�.�Q
S^�QV���v��/���p��=�vo��$:�H�
�-�C�����z������q�T����)|c��K�x+�;#%#s��BSIo"���K����j�c%lrr���B8�����G/0�a]TQW�~Zy�9f7���%��B��g=��������'�g :%�+/h�8cm-�����%�@��~I���������U
�L��I�q�x��Fhk������{RT��q	�,*������s%.]��V�P��'}�$"��������n5�j=�^���� �|����wP��p��W//C�������u�.����
t����
{�gO�k��*/���^	5
]�E��������_��k'W�j�F�����/[�����<`!��:��� L���\a`\7��C��k��*���u��al^���B%8�=����\y�����U8�i��8��iT";_<�3Zw�E%Uh������p}rM��F��HKID]����*}�;����G������[*t=��|��4�����P�)��h#5!o���&#v���HYa3�����6�����r@�V��p�������H�k�"����e��{+dWP�Bl�+�>�

CK�h�-�m���	��z���	�]���3P��8(k��8�/�BjY�!��
e�*��B�^�s����������h��o�k��l%MD>�s4��&�����������l��v���r��T����h�jt�����D�{vv��")�=^�[����iTo�
�^���	:0��@�=h*W�DJ\�������Y���v�'�&QYN��g`?t+��o#��C}O1�����i"�v�+h��S��[��B���`Q�9�����P�z+�5���.��������$���)���5bt�Z����:)~��(�G�� Y[���?6���{����A����I	��q7�q������+��������
������&:;�@��B:=173F�&v��TfN�g�n�>�����m�5#=��\�x�����y�t������>�K@�����0#Y�"T $3����d����3�Oc��I�Y�&��F�]��y��W����@���x��
�F���Q��+�����������*�~�$�_�vw,I���`8��]C��Cu�������~:�m(����oa8�5��&�E����".�����IE�t0���;�%�[;�����QG�5��q��)����g�HAr�7���]\����������B
=c��+5�4����9=�(I)^hB�mk6�>J���^�<��A�b�����b$�Sp����\Di"��H�*�5���W�k���p��:X|$
m��������#��5#u1�`j�s ���,����g��^Xp(zr���������������=�p�Q����N�31��U��@���0xa�����2�� � �ZT���&�_{�����/
�G�'az��Xw�!6�FPt<z�sx����|�qx� ������SO����`E����)�;�c~�����3��w O7q��'����7�#��a) ~>v��v��mg���.�l^	B����N������y%���]���Uk�c�����7�y��=���������8��
�+^��{p$�����;HL+fW�^��t��5)DUd�GCN�q��Bg�|$=������O���DfT8�_<�F�^�� ��Co���
���
�h��@u��Pm�
I�����A�JU(�X�5��������e�?<BCa��	C�c���w�`�}$���y��G���p���z����M/�hiq����}	vx

���yKP�?�c��/�C�v4N���Gx|<��������k����:;a�������1Z[�R�����������UB�}-�z�#(WU�����W@H��G�Gj.'��_@��2�
��1��2�qO"�d����<x�z�C���o�%��R*�����!��55����F�0_��f3,�m8t;#�`��w��������������n'c�5Cjp2���H|+���|leX��������1�Ny�=�c0t;V��`���s�!��E�
��G,D�������n�����_q�����<��	���a��Ep:���W���}���z/��������f%^_�����0��{h?�����[�?���Q��%�
���}<}t<�u�����u�����B E)x2�$����M�"������+Q0���{�70�k����cE_��`��UQ��,&��x�����.^`�J^�Z�"_�����*��4)��v@'L9r�������E�/Wk
C�Fp}�f5; "�������Y2((���
l[L�:[�Fr�u�����^P������`�~	<_��$�)�����=����:z���s#l8w�t�F`B2N>�����'bp�����W/8�`�o������q����RJ���p~���s ��� ���/��}�RJ���� �qG;cKlys�[]3�&e�����������9b�e�t:��a�i:�)	��������
������c���%�`��C���6�����I����.�<:�����I�/���9���Q��c&���Rr�xt��[t�8������0R�Dc}/DS�k ��^��?�����B]��������q��" 1��

��49�+\.R:�0�>�R��-Gp@��1�����'v�D���uu�Q������YNyJ���������/t5��:�F|}lIJ~�B�j��m������|b�A[���XOm�����@���{���T����^�^�(
{_�`5w�4�kH��!:X{,s����0��Pc�e��l*^hif��F����
�Y�$�m=�b��{0�P�����/9��Gb�c�FX~���'``����}y�Bh?�Z�� �&	��r�.6@5��=�����">�����:��������6u�x��1<�������_ ��%��?R��4�����::�\����9B����_�G���.���Z����`WDDxB]����$)���w��� g�}s	�����{��=SX���!G	^��4��A��?���#���f,���E�I��pzv�"o8�$���
��o���P%��������������4
��S���rib/�0xA��#�o���#Q��'^=��o��?�s(�����k� ������1p�Z��k.������pR�1B�~sq�`@���zu�C;�{u���p�����
G�>�	*8�nC~����_��P�_x{h��tX�JUkhh���ED�x�A	G�L%P�4����Z��n����ZALd |����������U4��F������zg��8�#��u��&������tdF��@JO���Y�?�����p��?0�N�rj�� �2��=K}�R0���o��2�OK�D��9TP���#
��M�a�Y��|,��	��F��\:!��:����/�.B��{���xh0`T����B�>��B��y�Z�36���#�IuKu�D�����i/R^�n7A4��:/����d��_�S�`��`7$Dx��\5!����"��yT!�� �������*)�0��;����������Ba�(��*N�����Cw���E|J�Ac�5�[�_	���$��[N�����qQE�������B��%��b��.8�����z�F`���7���"�,�
~���f�E�����B���{�z�V�������
�gg��<�Y��=2*�����I��9�|���d"+����/�+�!@�x�i�F��?n�������c&|�F_{v-�����1/��E���JF�Z�S�y��B9E�x�<~�*Z�UXOy�e��$��|�G�`y\�$��^��Q�����$���'��+������6G�s �����L]��T��WW0�a����61��f��Jt���,�zz���^`m����c1��V��A'�f���*���z��CJR
��)���'�6�<<ys"����^����,��:�|��=��)�;N���7���X�(,mDkz���r��H�5�dQ*E: ����%��8��7S %�{��_Z7RsFB�T��
����Q��H5�sM#3L�HiODQ��XS������Acic���S��&u���{Z?L�~��S?
�������#�3t������ �]S�q����l��Q:���[��(����G���N.��R�����cJR!KE��L[E���i����`n�\���eU<�
���_�����;0��B=������6�II����9<��fL;;]8�aF�f|��R0E������,���HJ:��F@;����OG���<=�R�z�an�����^������y�u �k���,���	�F�����T�g��na���m�����7�	�I�A[E��<�t����}}DcN$ �6�)0��9u�9���������VmH��2��������j�-�?����g/��mIJ7q��3��u@#D%&�PCNCdb���,
^���0Sj�t*u�^��z}�=�f3=h4�}�?�T
u@���^�:�
�K\����T��0�\����u�6�>��k�iOEsfi��4��\�A�����H�K U�{U���Gj`j�������C*o�=�se��jH��D0x��Ir����f<8����xV�w7�����C��A/SDQ���s��Iv�����Clc�X��������@^Q�����v�Q�qk�,�:K���:l�o*��o"�`/(�k���}h8h6=�F�`�{2�p�Ge
L�����/���.���oi[8^�o'|G�=�\��N��A�Z�q��_�!j�iJ�)/�����!?`���T�5j�n�k���W�yt�U�-���_za��]��&��MqK���Q^�����3���Ft���^�j���;�s�,������}]��x������m��xt�G�k:���x&��n�1��O���I:���8��@��:q��3W��
���z�]���]����D3KkQ*�������k�{M���e��9���o:9���u�/b~�ax���a���?��)����m]��b��������5R9hcT��Y`�����i���g���@��)$}���-����_�I�J�$~t:�?���w�9��EX�~����O�#��>a��0��A���&�TA~{w/�6� -+55`B�s��Bp�/����w���k�o8����%&��w��r��&����U�*�*�P��v>G�8h�`6�h�#��z��}��8V�\Y������y�{l��sR��OKA�jv\u���H�y�%@�PECd����q��%��
���m\K������ZPIK~�S���X�t�w�)	1����`����`YU�)���'��W:����_�d`����
�Aj_�N���L���)E�t_9��66��)��������`���#�<�����`����76������]4�-�5u4����6��ew��1��5��!7/����2��54������}3�s������))-X�9$�����>�5�����\5���Z�U�9�f�
��m����3�h���=��jsX���XEJ
�`�k�E���.t���>��K�T�����-�@�@��6�)1(�u��.4��)=�����sV�4_��B`���n��tA\\���!%y�����9�4 `n�����z�����r;���'���!��������K�D'��-�*/P'�������v����RA�+(c�������P�jH�_�����'���A�>#g�$��(��}�V�l�M���1�����\��-�^�Bbd���E�#20�����D��I��
��\�!:��'m���30|�V��n4L,l��E/�v-N�Y��`�k���~w��;����i�l,��`\�O���;���D�Z4��!|f���mju��@���A��	��==��(��/t�6�����h�F����&��k6zW3`���q}�n7I*�+iP��0 �O�
�M�_I��4 ��3�iT���P����.'��L/���L��`�{%o�����xvx���I�vv���l/0��v�S����yM��������m��9�����H�k>���d�w��'f��~$"|�sH$��BQ�BB�o��w?�^A��)m0���h��R��W�ue���8srV�`&6/^(�wx�x��fm������J��O�i�<BI�)))�{�6����B�>����'�����B��Z��/@��^c�����s[�����F���n�{���`iY� xar���vu����:�������/�y��M[%h�����XL����>^�i�Yi�#��iM��%�G�6�f��?���iWi���� IDAT�%�z���z�E�]_���@��"�?�:Cl�E����@oLcDp��������0Kq���
��I�����gL �u�����B
��d)!��l����_�� ����N-Xj�����tz��v��/���z��p:<:?}����)�z�d�I��t
&�����?bm�SF�9/�kT��!����0]�8�����@+kIya)/T�������q�i"�(�+����4��{	�F+��p�������j��d~�Hy�GU���������1v����[��_(��q���T6\xD'�1�E}���m�F��tv��������N�_+���������g���!�������J���okL%���'l���&BIA��@;/�� �X�!>����������0���s�9O���%��������Ef�����nXL�L����.nT���1��2�o�"�-�����e���D��J��M/p�
�2����X��?z�(����{���K���������'�������{W,���X��.K��9��RvYV����>��S�svfv�{�/��RQ����e;>R^h��T<�KU�%|���k��+80���C�U�"�+��\���������-V����@�
��,��3O�l��l n����e;>R^ �ah���KEq�#(�Re��O�@�5�~"C7����1�m;�:x�k��z�x=Z$��,(�9��������d�T$��R��������/��ND��6�E���r�#�]5^�{`B����0��`�Z�t����m&���su���T��
�GESY�L)� �|'?��K����+���U�ve6d��Ne+/������1���5a7�����}%5��s(����Ga����P��B��}9�`�T�j7�Y=H��� JF�����c?�����2�+/���#f�I;�S��wr��F��"�vWN��WJ��V�5������u�:#��!�����7".6,�=��nR��p��v������E�G�/��UL��I~���S� x��w���+h>�X5�e����,h���U\���_v����M������s+WZpJErB�w[�;��J������ ��p�7~�{���Bn����r�A�� x��>\z�
k�i�:�|�/��B�H����b|��8v�:�u���{�%�?R^ �at��f�S1��@���d��K��X
��|R$�E^`�S����0�f%�����L+����9�����pZ��J���zd�D�����
#�R��`�3���9ALy�)�(�P��I��)<0U�l$�g�[9�/,#e��������"�f1���>������^`���%��a`�t�!�[�lY�$���9���4�������`�}I��W��!4�*`�x!�����u��:��`
8x����`m��~��do!9��C/R�`�.S��/0'�J\y�o%(/8X���)�$d`lcl%hU$X�JB�'�-�F��{&$��y��X`ei���OS0�,����Sr0%�/?�r/0!�@�0f+��WJ������K�-�����%�\�����E��y�t��O��IV#j8�2�+8�%�����0�������.�>5%+
;#nUCe��a�����N1��H@	�0��]i�j��D�������	�����s.�)/�`]�l�y���������h�����B���.u��$>��Q��0n���/�2�)/��Zo��D���I�aY}�K~��+m����� ��<���&�����k����uu-�W��0x��TMl�]���#f���
���1j�AlY2��T���=6��B��rN��v������<8�����[o��
����)/4h�%|�.�����E��p����
������4��\��.RO������b�n�Y�f���<�Y����w@�����Gy�����������p���'�rH������7>~��I�@^��7�>��TR��Hy��L�R����"��H)a$W^ ��T�|������B��\��A�z�UB&�tH�%���$Pk/��mG������p����p�����JC�A�IEb)+�J�,V}�_%0�����Wl��� �r�C�N�H����.n���/�����`	�0�'/�������h������h4t�c�63HY�$)��~d�M�)�C�9%O�����C���y�����~�kH�A���������B$)���������k�/�32�m�|�*��2���cg��E9�77��z ��p%���*6V^�>a���On.5�mDN��g^~h��	Vo���3�c��5�?���(Si������$��b��f�# "��s����&R����
*���(�0	��#P�0�����q�|���$��+<y����;{�v!��A
R_���^�x�,~��������8��m�0>e{|Y�/�=S�?��z��`:�<t�Ep��G����jF��4�-I8�@�2�������������A�?$�j����w!�
/������n:��Q
/t�����?��W�xr�H�a��#�_b�0x��]��3�������/�n��O����y'��eM$%���:q��������7����X��������Rx��v�M����}��w����|�^�V��jU��z�Wp����-�u�$�K��GA���cZg#���qV����x�C4q���/�cY@,=�m��e�LD��l�5��x����M�K;�����~��c��N���������	���mk� A����ixJ�y��������,X�~$������Bm�����!��G��L�-�Z`��:5��P���=���l�"SR`�G�{�eC^�����x�=S�c���H������HnKOy�������a��i`�����6���M0g��]/�=�;����YH����|�����Y_0��EM;m���k�\~L}���cz`����NV��0��&��<�w�/�|�"�l��R��YH��LRU�;���er��ZnH�y�6=y�^�x�e|����g��r�*�P`����A����NB�v���)�n@U����t���+�a<${S��0x�y5G!��&[o�����^0"��{����/_�����`�:��E]������G����xM��?�T����[D������]p��C0��~��sX���U�a��X��7�s
�����[7H��FZo��/0����NYE!t�)$��b���~&-�\P��:x=?�b���"W>08 `�Sh�ir+����	��lH����%LZY�����r��q��(��������\�T��V���X�\�^�8��.&�J�DfJR9P��8{W$���`e�����0�A��4LA"�u��s������A�N���
�FM*��f$�T!�mq��>��!��.������1HxX�N����][�V���Rz��������SUh:����:��o\�m�vxz,�:���*�:sO�t�n������K�~xm����f:|K/��.�C����=�^�?���w?����`F���������K���+d�k����4���=_L��x�Lya$����zOr�f��yO;�<�#h��9�N�^>
��K�����=?��a=���N�&1!�i�d�������=� xA��-y���F�P�<f�#��q^xA����h�PGC��miXx�&�����N6����yaL�z����Q��G���Z�������x���^�$����p���H?|x}VU[���6^,����3v-�%���Ep����XT�%�Y����pn�����y/�qq�������3GQ��X
/�5���������IL���w��������n
��g��Tfl^�>MZbH���~����~%�O����@�&��D�?dSq��y������`��/�3XI�kp����/K����8;<�?kM����B��YZvL�{Uh��B��(0�a!)h�yv�H �Tw����N��@��d��C�������_\n��-f��uA�#�T^XN�
��=�7��4�:�W�����X50x�������A�GL�!���MT����&�W��=�����2�O�DHJc�|���$����6*�s���H��d�^`���T$���o�S<X�����}h���w~�T,��h�K�q�`
;=3����_�N��a_�n�D;���C��U�����2�P��������?���I~�f�������&��2����"�������R���5���$������l����:!��}U����i�1Ddl�	���X�W�����;��
���Dd\��d����]N �77 ]�`������<�OB�p�'@
	��Mi�SZ$�����S�nR��2�^���>��]�1�G��Y�d����Y+���RSZhF��:=G�!����y%�~i�N
	w0���Sh`����/0�n�\�^�C*2�I	��%�d���`@���l����QR[�~���6q��;���g��:���+�/�Ui�a�?z��4�$��������g�Z
xu�-��;�P�z;~��w��O�Y8��}4-\k�q8�U����r�=���/h�ztG�C������hO�ZHMM�V�;���0�����z�������0x���z[M������9�6B/���R���IM�TD,B�Spd�i#g�ED�?�-�����t}OBw�_G����WJ� ��U��4�U�eD�_t��n���$z�����&�i��Wv���#x�a���qp#�.��5"$������|��-�w��������� �nC���
<��3����UI����V��h#���u~~���|N���&)�0E��Q����:�?��&��m�&���3?A����H�}]�$a����P����������p����#����M�������&�s)/0x�YX�Ast�M������/��A��)0u]X����_�Cbd�G��3�C�N?p+�*�(OK��%�8)9�����N��5`�F��|�`7�d�S�3���!��YMX�g���O��>��Y���m�}�	s�xso�-�)�����6�+8�.)XX�aY����6BU�T�r�#���
S�<Vk��z�C�JI��gq�����R��N���E���/�U���FM���>U<{zoo�W�?p��#j��
�*$���i�/�7J���|�*��2����������G�	�9y�YM?b����w��}��uuaL��/{������zt�������*68@��1��ZZ7|@����)=<��B���UX���D)���;=�& BJ*�E��^(*�/�BQs�4����u���G�X�F��6>�,��F���S���/U_q��
/����S����S�m��jCq�)^(Nye1ON�e�/?xA��)Zva���e���E�e��%�����-S��G$g�`}f���h��u/�MJ�W����J���l#J�����6B�z��-���/�T���#��h]e)N����+��h&��~"�fS��Cb��`��8��J�\e�Q���:K�������0x��e��|E�F���*�����)�$����[V���b(n�4t�A��Y��0"�����Q�[f~�J������n_n�!9XBGIv�%Z�����*����$S�/�d�BYB>���rG��-�	�Q�|Q�ta|��r�����*Z�"���������G��?"�P��	�B���_.^(�X�DI� _+���a}S����J�7R?��W���C&s^�9T2'��C�I���,4�E*�2�i��U�q��cn
Q�^(z�x�����;N%Tv�E�n����++�,�`���$�*g�%�\�J<�%V�/�X(�.H������^P�H���������h��_��W�����(���h,��_���B�GD�����P����K����2s���e�Q��xA�h��V����,�xA�(	i>e��O�O[����i�]Vk���:2��v	�B�g^(�������Ps��/(w��������EK�G�*7�0>�����+���h����Hx��#"����//n������eI�$�%E�����%Oj^�'Z�����$��t��O�O]�/|�����x�l���U�PvGZ�Jolx��b/�\�#���G!�	���}�����*s{��������<],��J��H�$��T�.s�����RIX��G���R�"*U�?��##V~�ny�k���u�e��������������AVVf��+�?F������K:����Py�����nV��S�?���2V������e�?�$�d���D"hhh@MM����"jd�������>���������d���V�LL�YT�%~^������1Z%�.Y��X�Xi����FG���e�R���3�q����S��(��F����$w5bqv�455��[3������
�i��������Er�H�o2���&���2�,�$�����������m|>�}��(�#�QQ_
)�������������>i�B>i�����O��U����>tt���x���)O�W,HB�6U�,X������/4�[�Lu�<],������2�U��1����)#P���"���2���%�G�H�N:a|J'���*�������"##���_n^�
���sH����'Z�>�0>�>�����~>����M���#_:���)���Z�0>�F���+O��Y���|�9$O�����O�V�OsI��Pz�j.���Py[������h���(A���G��U�ta�R�*7�0>�������h���<���X����h���(A���G��U���4>�b���A����Qn|-]E#����i|��J��EK�G�*7�0>�����N�������h���B�|�0!&�����i*Tb-YYYHLL����k�tE��t�.NM��'j�.�0>�.���)!!���-����M����*�t���N�e�UY#���1&C�����+WB�B��,R����G	A-�"SS�-F��J�f������S��,����)���d����d4K������EF�O����.M���h��'�O��S���y�%��OE@P^P�p;��_EK�G�*7�0>��������)O;���
�Qt�+7�0>�������h���<�LfQ����R%�SQT^��(/���\�v&�X�QtF(7�0>�������h���s��,K�����K#�O��^�����%J�I#����Pj9��/(w�������EK�G�*7�0>��������FP����Qn|-]E#����i|��J��EK�G�*7�0>��������+�
��/��r��h���(A��/O�#,V*w�(Z�0>�FP����Qn|-�s^Pt����6����+�_EK�G�*7�0>��������)O�{ll��(:���_��W����Q4���_��X���(o��D����D�W�0>����%���=�?�����G��U�ta|����N�{�DA��,Q*�4���^�e�YY���4����
���0x���R���.Vo���3a�2��66���]�L[�.��mqO�O���T�S��/�ra|�Q�&+�����srq��b��T����9��� d����^HX�"����gn��^����L5,�Pr-�O�*���
'�q���i����\��`���J�w��V��	Wj����wj@���OYe��+�e*���+Sm*������T��.V(O��{�sX�����{��"C��f������h�OOm&g��v

"P�"�uG�+��/g�t�1���,�@���ZN���
2�-�DQ
�h�M/�D����u���x- IDAT�������"�\i	xAi�
��# ��Aa�R��U�ta|��r�����*Zzy^�����7���_��[�]PoxA��CxA�Q�^��9d��/��O�N�>M��Z�|���l���q���MYN�9��P�g���R��/(7��mqO��r������h��_��W��x!;����L�o�����x�[^���^��xA���5BY# ��F�����Og�!�:� [�x!w�xA�yS�S�+x��So��G�[��<�f��?����}�O�|1�W�B���u�y��_�r����O���K�����X��\���?--��a���r�!d"�_xA��BX�Tn|-]E#�����(7���^��G��gDy�.�]���!�
����E[Y�=9��/gN�9�~�r�_�j
��
�B��X��'�O���o��">=��z�>I��M���?�L���c2�����4q��_�����O_�����&
�'�\��Vz���P��"`����~������p"��1ar��$���)	���%������5��E2�WZ���c�A��qn���=�o��*I���g6���r������I�z�������w]���J������S�}�*����E��/dee!��/4;V��#�k�5M��E +9
����'I\��B���f������j���Q��I*��c�
�\����U�m�7#~��CK������Sw���V0��1�������������`�6��ru��s[a���r�7��5d&'@��|��^�o���)t�����N��A�!P�5���N�x���5��x8��������)	����	n��+�$�2l#~i�������`���j���J^�k����L��j!�Z
�o�emF����mD����1�85	�)��Q_�5�{��X�+L-�+.W�-�{�I�50���8�Z�,��-V�������hQ|:">x#&�5��l��'����Y>J��~p�bi�*5Z+�g�������[/XU-Y���:����G/��}���
x<�K��QI�&�:#n�Kd����^�6B�0)=����/K0>������"���0}�0z�%���`��/��\'�]���
��,�����3�!a�|�>���&�x��-�>a454�~�~����Me'!��B# ��� �mqO��r������h��_��W��x!;��^X����ACU���r%��L�@fV&�xN�_��Rt���/�c����U}f>���5��E?Y�VP�d����Q�p�n*���A_O�?/|Y���oac`Z���-2����=%�t(
x!#]�GV�����"���%
/<�~��.�`-�����%�Y�^T:y�RX�x��h~>�}2��C���g/��X���Q��!�xAC]SG-��
S��O��-� ~�K��/�S�i��Yt��;��������]��4���]F~K^`��WW�n�Y�}h�g/��h	g���������
�-���%�p��4�<o}o�:����_�a�b?����.CW;Ied����Y������p<��-{��V�����*X������[�r^��=�
�Z��2�����^P������x��{�-��y��0���?{�<�� s����sZ��%�S��X�]�?L�{��!)9�C�0l`O�\�������:x
z�:024��L
!"*Y�Y����Tya����K
bqNy\�
=�V����
K����W�h�^]>�Po�{�;�"��D:m���3���
;���>04��e��4B
�@^xA����
���;��w����Sk��eJ���jc~��PSU�E� �x�Jz���;����s��5�����"T����)��U�0>EE�t���������^0�7��/~�{�:n<=���:�V�M���xi]�
�5U�>z	�������BFX�v�>�{����##+#��DpJ0W(h`�=�zb��^�����A�8�����j�p/���b{,�Y�J������gb��
d��f:���?�D\&:L�w�����p��!���������������1�n(��y}Y��.����Yc���Da�Y��	^�^���d���Qw������J���o���ID��p1�"t�t�����N��T�����D�1���~��1<�}��kc���\�/�+GQ�BBb&��NA�Vr���jU��}��Q��~z�;)�~we�����C�j*�w4��-��eb��dT�����L��
u�<���������6?��7��ti�������
�^g�OW��"BLl�^����"��F;Cc3��Mu�h����\+��+Z�QSQ���W-J��V�6!
K������y]�q����&����������`W��:#)-��t,"����������������LukcmR��>�v�4��3��NUj�UL8�����
�@����bB������
o�#�`\�)�n�n�V�����<���*W�uy��
XTp�233	DX���X�U@����T��5v��}�x�u��8M�M���5��o���:��_�94����P��3xlEt�k�����yH�2nP��0�h����B��cp��rt��^��+�K���@�^S��O.�oyU�Z�i��}�=��<�!2�}�Y������<��_���W������V�����Gu��.�y���:��y����e~�1`������[aln����'�q�(6�����������o�Q��\��
��a�Q�hSS:d���;�	i��`[����1��X��cV�i�\}a�q���h\T��������w�����KA�~����c<�������aW�:�'R���x�o?x!.��G1	|�Q?��k���Oyax�VhQ�/v��mh]�6�j�7�}p��L������{�����Z��g�o��1����qF&���C�~%�l����4;TA��`d%���4{;BE���������SA�^�T�����:�����kRVH�je}h��E���]}G��,�7��3�����&2�c��K�]�*/P~�

S]������Sp�7��;h�Xv�s��������J������{�_�k���W��0��������~~wh�"��{�_wz�,a3�
�{���H�
��C)7T��7|&�������l�����?t��������!"O?C���`��:2�R��Xb��;1m�
tI����}��`A��sW�@GGM�w���
�BH�4v�m}\�}�>K������������>��7U���A�������=��L��;sy^����[�/���+����h��m��������G�/j��:_��BFB����FF��4�^��X7jF�0�8Iw��JB'��Sh�j ��6�5b�D��
�t_�L��q��P��B����"����a��K$?���=���0��5���s�U����?�q�I����tRb����ME������PFl��;C��%b����&�Vmh��+/�^�G�(������d�$A������AD���G������nQ�`��y{��~Vn��
P�qe
�wN"�������B�j��}�c!���������vm~q��S���g�:�'��ArBlkuA�8���y�j6=����?���7L�q��H�y�������|�mGB�~O���{d���9��00��u��\y�F�Qxvyt�	�t���(Ly�TG?�b�%���'}�cK���HJ������z0�4�����Y��}xR�V8���?K/���c������i���0�E�Z�Wx�y|]��F�*�P�y���+x+c�����`�^�@�����M�4�4a�N)����4�����RXH!�0U}�.�g��a��T�U�����'\L�n}-��2���
�pH���}jQ
V��B��gx~w/M��k�5={�����|G<ST�w>[����u�}�������F&#��2�.@CSjg5�6A4�����)h�e&=�U���CDsY�����,<���+/x]�iE�Vo��TOFF�,a_������k�o����g�AS����h7�7�����&8����7���s�H�%�b�_M^.�K���x�$F�������F+~�|v{7j6����dp��2�z�m����w� 1>�.]``R�7���-�JvnT�*��c�b|��S�C��{���'�����Nr0!o[uH����;�y�������<d��Ct�+jwB�z�~�l��k������vH��;.z��}v9�����3��vC��g�:����qQo���>���I���t�z>�F����n�uv�~�Tk
��������_P�^/<��	Z��a���� x�\�������:N?��C�����%%�e�6`h�>0�qa��9�#�~��r���c����Ii�:����&H������T���r� �����a;������%H	{��m�s=��<���"!�9t+; p���{�UN��mu~��^M�fz��>�G^w���9$�2]��t�2�[���A���>SUP����A�h��V���
���E��d����
}�|��,��i�����#�K��
�<!�W�j��!
�@�?�������e�~�H��O���mv{������E�6��������L�����r��m����Aw���&����0��������y--Mz�v
�n�x��%L���uH����akM/7�b����<f�U�wp5�E+6��,*�}4���������r��	��`9LMIB��{v,�Dh������Q�ID�{!-�� ����O
�H^x���5��Y��kO�������x�������-V
�)�sRa|>ex!;�9�������1v����.�q�q�r�y�
ghT�E���������@�"�����Q��&��U���Q��B'5��8r
:�:hg��7c��\�m���������9��u���b���H�f<���.�� ��`�m)��A�>�+���������iCLy2������K�����)v�D�J����>-l	���&
q?�~�>0k����1��(Z<��^K
��6_����eO�=�N�������S����\b��j<�{�;�w8�p6����%��*
^��KC I�vl��/�P�F���`��zd����S���.*UT���]_�������s��=~��?0�����mM��VX�=���!84�������#21����p�V*A������>�I�s
uT0W�:D�_>k����	u��+�b�Q�^���f];����!�vUy���D�67\�-�t���-/npx����
����!��0��P�T{);�V���~��c��s:��z"���Q)�0!�a���F
���������L�����\��&V��3�z!���
����WT���/������
YE���}~�<t����gWh��
��������K�
����5������TuM�[��1�$�� �����3�������#�~�����2��F��w=2�Ed���	h���u��s�����������Q��0��DfMqq7I�5���_�g�Bl�;-4�0��MI�����-���I���QUp|=�1~5Nm�N�����|��55u��!t��ht����Oh�A��n���;�`a[�����(3���D��+q@�����^`�ye'�����?^�>��}g���yz�n���><���������,�r���V�^���1������)��+N�����3���M[`oa����V�k33�=w�F����'�i��a���EV[���2
�o�����^���[���#��#B��h����'�U�����G����	��4�|��j��JPs0B&�Sw4����sE�!_h�����&�.���d�$"3<Z_����|�`A����j��[a����^�y�h��j�m�p���'�MC�_(�^��qI�{LA�������W��D��h[� ��+A<�r#����?.B��o�"d�}T��T5��f�y,X�k�Ws��nF��������x!%0z����p98���a};�u�]b��>-h,��s~����{���?�\�{�	�Y��	�X���#��������Rl��v	^�E��I%0��OEg�V�����:����=�,F4�O�p��6���g�4�i�B�p���S9}bh{�:�{<���(
^H����7�a��-_����F���6��3�5�t
R�T��V�d�L��X�a?��Yt_���S�i�tc�T������%��5���8����F�)�AsHv:�v���	���C��D�oL���k��C��@$ h�g2����%�b	D0$�
Um=/���A�^��Y����3a:�w���F��-`LF��_a:��0�!`#��f��Ko6v�A�y���B,);�
�^,��(^H%�����{	B��Y���o��%�5��B�
����*�G�BBt�k���+x0�8=�:8��,#�,
~w�����{���s<����@�{O�������6����Y�����7���;(^hn���V�X{�:�Vu��W����+�?��F�/�a�
 ����T8~j�?^>}�i�3���u�y�!V����.�C�����^C0��n8�W��I����d-^���	"����V�9�	-{u�w���T2�[C�ND=������}k��2�I��B�]Z�OC�L�kZ� �f
��x]6�.�V�[��`U�����"���s���}r�?;9�n�!�z-F"��=�X��J}/$��Q�Apr�M�j^p�������T6�!�t�����,d��g��O���A�zv��Eh8�g_���/��;�_�����`
�4��9w���s���h����@��q<���{���c ��p��w����2 3��Sj�}
H�X;�5�s����*5[����w�����@h������hN�^9��X�7���v�=�e+��E�������;N��������_[Y�R�Z����/8�� UE�
x�E���C?������,;�h|`���hhB�J�(/||}����>�6��� �������]S�q�rx���.C�����H�u��#qA�B�M��6p.?���[�=����7L�-�41xa�����	�t���������y���\8�vA��sp�=�n�E��������~�Z��qD���",D��e�HND�����_A���q_L������]{�C������&�qGza7h���"��Ul���^P5���2w�O��{+$_
���:H���'Q���������4�
�|�=L�sA�o��z����w�D��D�%���i�����X�y���N���m�.6��P��h)^�u��n�r/=}��������f�`z!�#����0�`f�0g�(>"����.8�v%��km������?��rU���f�7s!�����������|��}��E/����U�\����}�p5�?7���~�`�C���N�ee=y�U�n�i,��&b~==���sD����{Q:�q��d������C�4�P�gC�����Qi���4�_t�����L!����	/���hw���3�\���A����[E������]�������+/���b��g�1�v8^���B�sg#g�3�'�o�����vV�T^`p���s�*�D� >=]+u��G�P��6��^�V�V�:r��D�"0E�M�7q�aQ�E\!��1����^��p���P��z�>h`��u��8����F�T^`m�e���W��6nE������a����Wc~{���,�O��G^��B������(x!�����KZ4���I�ZA��K���3��@�q��N��ai����s�E\���}Ci[6���k��G�B��1�k=R�K!U��]o�xJ;��_��3u,�I��K�\�!YD;�h���tZ��$U;U��0b���ej�� IDAT�Oa��1��M&Z�r}#�	��xR��Xp�F��O���!-�K05�W�8��C�Ex�vu��Cii1��Cj5�J����Vw����_�����nJP���p�v����u+� �v���.����E?������M,�K�N����&:5D$-����
��w�@�<����+��UZ�@�:-��8[Xg�F�>������&��E\�U���3�mA:-���6����E�#���F�B��s�|Z�!��r��<�i8�z,WP`����_>�j##�,`dfE���I���t����:j)�������`�h`nU���<��oAe�zxti�~�������+K0����^��2)��)�p���2rq�:$}dJ�0����b��
�N\� �����'�I]Cr0��k�8����~����$��V�8�a��������}y���`/j�iy�3�N�^���l�i�i\����=1p����i�G1��w�G��g���6?x���5�w��7�����Yt��
c==��z
��M�����6��z/���������VP�3B����[��b��.��'H��7q�
�������@h�����$4ZXC|�-h�2Aq�������9��T���,�o�Z��}I�A��@�*��	>`6�G��y�<�	FM`X����"����t-Hy�>������0jBi����������:0lX�=�������Y����,����H	������2�3�_G@�H!�����Wi�����/�;�^��������_�f�����~}j��}q�
�Z��h�b n=8
��0���Wv�-p,���/(��E����U�f��$��t]�y�.|�xz�����6������S1��E��t0���<O�^���>X�-A�� ����\���@�9{���k����������F�=Z������
�a>���� ��KR�$�35�AA\������r��+O��o@��x�h{1XZsbv�
3�$G
�;�����3LX��p~W?��{�^��H�}��5S��_�?���a��H�u�TL�MpW���h`GN����sa<�;��_
�����D�)F���M*J�n������lX���I��a����r�e���Q��9WE`�6�����5��	�z�.�2�vO{�X����Kb������1Ao�G|d�"��D���0�r��M��rJB8n���U�{�{V�;Ss��0x�=
sm�Z,���=<���C0��n�[W���6?"%������fZ�Hy�������'���\+Y�2�6h�����l0��,���O�w���4m�a�M��u�8I�#�U}U$\J��lc��"���	�1d����HP����� &��b�1��$����L�EsT�+5$\I������j�������������ZAx����-��I����v�
U�.��v��Et���Q��W2`�3�k��
�-	<�&��a�2�y���.M�p`�����^m]c$'F�A�q|�>�H`���
Dp�CR:p����c��#ER���D
�^|]b����}D���52����<���C�3��f�"���P_�n8��Y/��V���9�`�k#[l��We`�%L��M��x��W�����C���g1a�f�K��Ez.���v�*L�y����I�,~9���"2�%��p��aR@0+^�������'�B�[�Q�x��O~�~py=�L+��j@��
��~[�m5.���:Y2�}���b���hV���^���6�����*/P�
�;�R��������G��B���H~M`�:<��������p�z|�g?�Kl#T�~���zJ;�;��]
Z;����1�����|�������f��+!H:��+/$BzP"��7B���R�V���:����\�dA�����B�Va��!&E�^�$�Y����_x$�<x��������^4�+��D�l�)w��K�@%�%$b��~�x�.�P��@�v-r�>�x�:�^�s�4t�V���=h��9�5l�T��3�P�X��,*su���D��}v��lb��j��A��!B�>���t�w%��[��R������pr?/�P��"D��O��~m1r�Yix����6RX|-�c(��0>�2�m�	�B���	/��o�TZ�����Gm����{�����Y��������zY�lW�)�����M�������`������'������q��A���G���E|v/00�O�>��9�++0�Sq���n�/�=���$0��5������s�M�
=WcWn91�q*R�����W���#0i��Z�v�/�T^�a�gB���EnW1�sW^�(00��������B����N/����
)��b��$�K;��$��K��������l\p�F*���Wy!��4�,��q}M����I_`)/�%��0RZ`yRS�����������>�`��0����,����,x��!��g�
�fa��$Y-���AJ��H�p�F�G�~l�������� �N
8��J/�����96��g���:�����.���X�V�`��h���E/�Y�
���n��~/RlX��<o�$2��3��Wh1J�CQx!���p�C�B�����i���la�8)/�$����@�3#�@����;r*/<8�YG�:P9l��K��`���)/��|{�au��:��jF�V�e*�&0����T.Xo�n|/\��+�n`j	L�����R��/$�G�:�����-�$ `���N����cW������@�s���;������p��X���3	 ���p��f���T80UO0��`��h����1��ZMH���_������,��e��s�%�v�y�a�3H��1�m\=��h
M��rNx��Y0����S�)9���^
/�v���eR^��Oy���i��F�k�-�.�������^f�K��?���Or��A-�c�����P�T��A�X�]^\)A/d�&!�)/��C�wT*� �Q�	rP%[���hA���
u��1b�+D}����5�N�U�4��(FfD2�j�C�������� xA��!�� ��7�l������_�8��[��C!��L��DJ@,����[�����Bfj�{`��RJ���
@����@�����B�����1A�yoX��GEKY���_�=��=�`��Cv0��\b�BS+�p�O��,��0���}frx!����~<��{��P
n%�Av<��r��)����a��eA�1�����Y�/{N!���MJ���������w���-vY�f���_� �C5���(x���A��"�#���V�x!-4��F0[f��F�)tO�k��[.�U^��gJ���Ir�zd[��&������%\u!��Y��������vn�-������I�ceH@	�`H��$R$2�5�7�@�����Aq��2���&� ����@m0C�I���~-R�!�T�cFm�����+�I��=4I���E0p#���2���DR����}3�;�-�u������Q�j�}����������=[�es��1�2�����mpj4��[�y\y�j�~�~N�]����A-��l#,�6��X�M���,���0x�����$�aE�~\)A/0Ha@7,�~���!��!z����O �v�U^�%+��Kr]_<����0�������9*����Y�-MS�`�I�?�IMD�d��N
�����"�������|?�]t�/[�<?���&�-���:�$�K^`j��" ���`� �%��i0��������������&�)/�%���+�y�|A�-rW�\�Ly��t���I��-^>:��b-{��[�[�a�Hl$ �^��$�-��p��|4�8�	���Y�t�����B���!�v`���Z��k��������I=��!�cI�(�	�p��b����I;�"�m����o�e>W�������F�,N��;Iya�Z�\�����F�;������N�V���Uz�
��a@���V��&��se���!����I���1�<O�q��|lY<������_�:���b��������������{�o8�RV���U\��&h�4�w�[;^
/8U��WM�b����X��	<$�4Y���-�J0ttE�����v�X9UL��B�R^�K���G6������y�E�=�������4X
{���j:W^xwj+�j�'+�d��`�s}��@��+/�U����	�����)"�>��h�$"x!�/��#l�Mh8@��$T4�;G?S.��*i����>)%f�o~qL���V����?z�/�;c������Z9V-�}�Pd��|�r/�����9�0rPo4nPQ1��p%��@?8�8�0}�0�A��������&���	/<����	�7�����1���5��a*
�z��
l���-��0u�����=k��R��#gP�nm�<�+��Dh`��@^xA��	���C�n�	Ww�m�c"�W"���D�w�~�b�1���w./�`e��������oC����>O�P��CQ-,o��B���=/�O���������B����,Lm0�������9qs�������5��&����<u���/��Aw`{��8��-D����%�"��\`0[�`=1�)X���h/*�i���lum�l�Q�����_�9Ns�"�W6�V�Fw���L��^L
��Wk`�c�m';����7��v7=e����am�Z��ci�������>\������9x������7h'�*�U�1�i�79=��90�����Q�#h�j�\��u*������0T7�����zb��=�_s~Q_�|�/D�d���(��Um�&�������S�7�����f���d�����x]D8p<�>$%gb`O�B'(��N����������?A2Y��A�3H�;��4��/����p�����,n)��\"H"'�0�]����Nm�����:*����*���y�����~��
�"���xO~�x��v��nH��t�����.������;{�!�Z�B����r�7��f�=��rH��208aZ�0%	�tz���L!��0��(��'����i��YI�����5K���-t
���;�������/���{W�6��������������KN�������L��-�1E
�C��sHYa�^�}xA���by����bA������`�&�S�N������|��n�/�yf5�d����S�N\�����8��;n������|���.>Z0����l<��������,�(F��f��g���#��G/�hGh�i`�bj	l�bUz����@�]����0� 8@�|wO�:��U������.�hr��fM�<�Y<X��h`���6����I�`)��\����$�l���n�<�9�� %���`E�r�ERW2�afk��.X?������%�`���W%����U\M��G0����g����1��P�k��3��a���:�%i��Nf�Q�����;w�k�*�?U���������-�t��+�y������-'`��c��N;�����u ���I�S��-���kJK�"RB�lf-�X��4��1�j0����e;��,!T��H�7������P5�&HP�u�IJ
iWH������������4��1�h-�'5������TN�������F+�|CZ��B�D5�<`J	�b���(��`�;���f��J���������2�^���?R���a��9��Ii��JB�6�l'L�R�A���x0��$�0�bC�
_!h�yEH�y��Y�|��#x�� w�DVZ�5�������f�*����8�=}��{��]J�Q���:}���^	m��I���JR/�8�7)�����M�w���u;�sa����a��yG���t���7���`�~��9Dp����C��J�
�h��k������5���C���]��	����IR>I&�v���}����B+����y6�=N~GQ�B:����zC���cJx��wj#
TH*����_�����sp�	���g���A����m6�g�<#P�,�@�x����3���;%pp!f�b������#��{t!�a�QH��7������{�d��F��e�	���`H0����J�fR|Y�Z�1u]$=��wR���d!{t
��P�|�}�R����kd
��d��mU�qW��^N��O�eA���K��I���,
:
S^`0����h��jtO��n&���-���x ,�N6D�|<��Q��ZX��/�92�l���NMF������l"��}�j��0���j�=�Vp ��|^��i.�5�C��c�������YN�����Q���|�T�`e`��������!o���C)��
���L���=��F�����2�4���?�����8S��������x��d�����T�&Z�9B����n_�-�uq��w���MIF��H�o�U��T�h!�y�Gm�y��!�4���������M� ���T�Mc���K
!j�����/3�u�J��gZ����-�~�� ;���L��k!j{�S���9����\��!�%���$�������t�`ln������ �������f������;���/���G�����������]k���������5��X;��NL�$D����aAT�=�{�s���7sf�����{�;�J;�YZ��J�M�(����`��:�'�1-�3 ��>0v�F��j���2A���)��H�����a5�'�*
�	Rxv{��������k�f��������n:_hg����
t��d`�&f�ly���D���;���`�D���h��H����^�J�����~6���Wr�����G��/�&E�~�����Kkx:����Rn\�>d���}u�Ei��N��}mI�����U�V/R~�B�FOe|r���N-$����7Ri����A^�w�+��e�0�k�X�o��^_�tg��8��B��B2`�Zy!� �����Nm������i#�Q�+����W��b�^\���,Q��^��b���q<zH��v�9�/���v�
�4ob�Yb����fG%}�5������al������az��
�7��j��G�SJ�:;^0o��v��R�������/�������Y�������)Z
n����C���O�k�����yYJ5��J�{��������%�vD,]GC��!�5}�~w���@���U�~��Y�X���I�^�m_�
)=���~��e�������l���S*!d��V.����^��M
�����'���"�YT
�`�[��"P��>>]�T=V������������������>���p��+��������0�y=H�*	xA�ga���w�s��)�|�d��z;���k��O��|������K4}����^�]�^���������Hz�U�	t0��A���{�/�{�O?Q��G9?WwO�����2��,C�v����V����d���BF�� �ws_���X)����X�����d�����������!mD&��d�[~-�������1u�e�?3xAY���������[N�/��BN�YYm�N��6biW�����Y�	�CG���������iU�!|��L����L(�H^P��d;��n+;�e�6";���62K���SD����h#��H�6"�}J�'UZ@�"E�X'4��US����������C]�������(��2�%w9���^@��Qhh��))4�� &����u�����@�$���MQt�f�����hJ�����o7M��^&=xA�
�g0���jSv�K�����!mDf2��{x!+������:�^�].�P���\��W��W^�">�zP��E|��_y����x!iFxA�3#{�x!{�����������C�K����a����|`��8r^��q&�N���"/D�`�A���jxA�`�?����<�SuP/`.��T�3R^����(��;_���X:k�~ IDAT@S�xH�
����Y�+$�^}U�lSL1���~|.�6�BE+*���V� ������� ���������#�&< �� ���X,�-���dq"dS5�lrt����������-��l�p�����O)�0� �E�l���dw��� ��5������T�����g���@v{@��y\���I�����\J��9:�o�Rz@�R:*���be�M�D|���YlF�'����j�->^H�8^��(�4#��|H9�!�9(�g�� ��� ��g��!�� ��������������������������7����rstD������h|DBD��5�-��S^�:R����Dc�b���K������x2�x�~.������u��<���x!�������C��QU�
z1���,��8M�����**�Uo�?��x��P�6��x�gVf�I�L���-��D�l<�D��Q��
�B��5�i���0hiiACC�kM�Vs��O��>2&.>�25(k|t�4�b���@�A�*,�xJ�H`�!��GV�F�]�S�jY./k|��P������*��Y������%�,�rmYe����G�����1�8�p|�����i��t��=�F��O����sM?���2���m+�\~Oll,�������We������!�����qCU5T��DJ����D�4BL�����7��B^��L?@qr�E�T�L����+6X1�LC��*�t(��0,<��=�������&=�],�be�>9D|D|��b�e��eoK���,;k��d��eoK�Gv�eg���/_����eAL�';������g�YC�';�-[[!!!�����lsii1�\���%�#����O�M,Vf����-�}��5D|��������#���+j�$��r-+��_y�����A���Q���������Xl�x�����/��\��k]�G^*��X�T�oaY�G^T�
��V��S|������"f��l��(����,��/*�F^Z���b<�x)��������iY�G/)������P^P�o�U��{ !!111�bG}a�b���
�SN��	�K���������">9�u��d7���Z�F-�#}�s���ONx]�6E|��Uv�d�����PU��mE�W�G�U�=��S��D|�Q��c����/)~�x77�aI�G^U�M��R�����w�1E����Q�?mM�G����P^��W��O����������b<��/�Z������/��\��k]�������/��\��k]�G^*�~~�O~����.����/�uy=���">���<��Nky����">���<-����=���O�;��?_�iA�G�)�����},Oy)>^�'��n�����^�X�\��k]�G^*����r�+��������b+�#�Wn}��W^�">�zPy��b��|��">����l��(����������Xl�x1��gC�Gy�U�eExQ96����4���K9WF�'�|/M�">�xI9e���
���^�2U�4
��f4���\����Hi}�(Vj�J��l8�-���(}������\�Sze��X��be��b�}HoQ�lkq�x�K"��re��:��l������$�I��$� *���Qyu<<0������M���x����i<����)��\��"���W�j9�-((:::<uD~8�5v��f���5������8�1;�#�H$���9�T*ye<i�B-^������+��S�@"�3
qN�G5QZ��~$<<��WWW����UKJ#�W�����cH�oi�SX�j�jY�oB(���l����i^��O�"C����
���F�EeOX�&���vV��@��%��*�x������������$6*����N�K�Vf�	�Q�t��}�G������Y�q$��l<���
e����$j�����������	���_l������w����a	x!�B"�����h9�{��N�G���������5�`lZD�F��&+��b����}J�,��t��@~������g��H��������5.�5��+W+��|�b+7IP���9�����A���^��0{�P���?+�.�q7�u]������t(e��g_�IW8���}U.���=yt�?t�N�����;���\�<��Z����H2�q�g�HZ^�J�F�UfJq���h��\�����l6��f)�"d{&H��*��8�yG�=�h=���nW'����caJfN:�p��E�z���������eN��!T������j={�����W�w����nW7f���I+�,Q\-$����V#l}+�2�ct�����(�����r����\�/(7@�mqO�G��E^�">�zP��E|��_y�x!��^�w&}[_�����hM�?c������a^� ���-/x!w���{'���&�/�6cr_i/(>&^���^��g��!�EyRv;^��g��O�e�&D��m�/�/�p���w)��?}�����0C�m�����)K��Yr��k���]�D|���YkG�'k~��Z^H�t~���|��e�b��7�P��T����g*^0iWqA�0jP~'��$����u�8��<��u���Pa�B8�_����u�B�����u�����]d���p���E��X��p^�,��YQQ�B�z=}]����2uS�����y�j��I��2�-��IhV�	u��2�K.vttZu�����'"��A�u��%[���2����&c��-XU�].�P�t�0��X�~0G�zV��B�z
��U�c��+x��^�~������N����[,�>��a��R�S4���������"�\�n�R���y����YK�zV�����z��(s�b�� ��3-C�����u'|	|m�!�(��yYyaP��8zu
�7��������L>����������.��~A��hR�}������R1?���,L�j���igw���vE��*w@dD\]oK�/E+/�2cw,��mV(;���_�����<D�RmP�����c7\�����T'u�}w��c��0�6����/F��3�l/7VT��?�<���A��B7�vm��U*z���Ji-t�u�����������/<�2X&�h��L��xuh�L�����E�vp>�����~�������,�K�������F`Hu	f^
����
�kjcByAi�����cd
/<y���_��EC��QS�c���KSN�����zvj���\�<���3�uh�%�n�uQt��A�t�%�D%>�~���TTTP�fU4����E�4hQ)�=�Lx�i��p}}�������vU���9�v����U9RP�'G�.u�^HrU~�b����S�T�pN��s����z�dVP������p_���l�������s���I`CN�%������Ef�M�s	-���4��(F:XQ�����b��IhZ�}������eI$|�qx!��'��=!����@��
0<:K�GQ�
/h�$����0��Blk�%��
�);6a^�A9/�h��:���;��������txA��M��4���
���F(�u6�S��]�>��u��A1/�����!�a��`CN�m��������J��7uAC�n9��L�R}EV�����z��������+�������?i��ti;	/T��g��*`���RO���?X��5'���M9/x����G�/�Uj}_P^�"�
gPQ�����>�K ��/( `*�}W��L8�v�w�8�`�m��\�D)�S��@��BL|"V����F:{*T��!/-�K3���x2�""��y�a�>r����Z�Q�{�J�r8u�:��C��S}����|p����������&�������������0g�HhjhH'QFx CH/��P-�����:N��B��0r�>|�y�OF��Ky;��p��*������k�HT��E�*��������kP�����5Z���������A��������fvJ��>�?~-�BP��
�3���<���k6;\��D|dtX6��f�������� �+�a-�����5g������������<������6�����gI�j�����^�e��@�c�T[�IE��*|�]�m--����|W�H���=�=����hQL�{+������Ic���(�h�9�le���F

��Sh�jk�%�����jPx�������X��P��~�A�?�����A�FLa���n�A+���(>��t�������~�t��M�`������F�C�O$A��a��}�6��o��7��z�
_�����k��
|z �����Ly�x�A0����z>c<��6������!D�x���	P�������7��P��P������^P�xi���Mx��f�[�H�nP����?�"�vGW��?n?��3\7�SNx0�'������I;���BcS';����+7��5���x�`�T�����p�A�����#�We�z<�:B��j�_8��1��;	�Q�`v�>����(P�������q����z�@�:xK�~�
��B)�/���#�O6������e�`p�q4'�������yI�h6^����;0}`�}�����\#����$,�;��tA;Ra�Ctl����4a���q���w��T�q+���#��.���B�]W��J;���v�f������7��~���O���z�����_>#��E��wh�)����iWw~������p����P3��F�
�<�^��C���]�	Bvm��i!���N�nP�9q�v,k� ��G����"���V��P�y����D�A�~h+��� �.h���5$��1j+�4��D��J;�����q�ci�!.���q�D=��R���Q7.Q�h����q�hlj���a��xd/��o��ti�/�3�=]��M���~���T2��FEBUE
k���w�4��
\�������M���/���7������0�6,���x�y��\�*����n��%��+/��bf�����SQ��.ZY��vT��a]o}emz�CZ�A�J���o����mUj�7i~]y��w���A�o\�������w�7p�$:0���������y������AW"�����%��'�}����Q0��n����	�0��n����}haU�/�����<v"���`L�
\��JXaj�_������~^�N�
�'`���d�EF�BBX"����A����VC���P50�v���~l���p�������E\�-��?r��y���p������	��t~5l��������r"�[�D��W^P�6���B��"�v	A�p@��N�����HOy���1��a(Q�x6�	SU(����o"�����%�h�����7$5�kB[C7]����\��P�X
�E��o,����xu�����!��(�����O"d�:�S^��.�V�g�K���~����*{�����y�i�� w�wH�do�d�\��rV-Q�L���#.>�o�G��h`7�6a����p��'u?�S^�45D�%�����Og����+T�>���|�t��~��i#Z���J��������g�	05,�O��K��4��[����#pp���e�@[K�^���������xA;�/=���-��Jghi�`���������?�����)',���l��K�g=����r��^�|q���Q���c���G�Da�h:��(nQl���������'�N���]�
�C�@����'g���~i9��&���y��r�k�C���}���V���%k�~x�8bx�%
��I	�up&���Tb>�����4/�����k�����(�:/��_�������ZS��?������@�WC�4Cy���^��g<�|S�D���u���7Wq����B����Fxze������)<��r�f��W��n�U���5���K�R�������T����vq�=��PK��Vk=����@WC�������CC��`����e���7L��==�K���W�O����qK������\�o�a�Q|</����9���H\��8S$H^`�^�w2L������SS7�#����T'H��m=����6���3:��[���*���w�O���I��Vk*�}���)X[���EM\}��?�1��"u������|�Qq�����Yw�+�;x��
��"�����h�R���~!�.6���+/o��o�E�*#�g�^��9��d��~1������A
���~�:��
v��F�����g�P�L~-�wo!,M�" ����
Z`>Am3��l��#���n�9H��	hUy0��
����uW�Z6�{��!��~��sq����4~f���u����N0��G���)�-��Uk��If3�T4�?�,}�� ������4�*�~���'
�}4�S�}p�N'��M�N����N�	�7���Ne4��-c����='h �-��=�U����M��@a�A���+/$D�=t��q�N���L!��#l;�w���,Gz��[��Aen����Qfr/H���������R�u��$��8p
~��n2��*(�y64�]It�g8�^���������Xe�iL�.U��_��o��k5�~���<j������-X��nD��3�l:z����"������d�_�������u�����|�9x�o"L���ye�Ct}r>�������
6��@*+P�VO�X�G<�o��p�
#jo8��,��7��1�}��!����W�V��Iq���2���Gz�BBB"V��S]UL�����)4m�i!"&w=b���M���Q�P
�����D4/��Q'CQ��<�0��*��c��H���{��Mt��vH�������$�v�+/��*�M[�wH����K����ft���v�ocz^Z��&0yi<��l��Vo������� ���	zv���{0vho|���}G�p������{w��/��?���D�jZ/Eya����J
11�8s�&�N���WoXF/�X}�B&���)��� ����������J����+f8p�������&�)MpE�������{���y�#���/��c��>��z �������i������2�z��8p�7�B�1+����n����h�~(�P����h�{
.]�.�������k���O��D/d�T����p����a�\\�'�.cs^HrXZ�B��; ��b�}�nfHo��M^��6@�>kql�0XWl���� �/
��9�ay���A$����"���	~#��5���58�����X1�~A�k��C�DS��,,P���0�F
$+/x�b�?��\�a��#j*�*��2�*z����s�?�+6�,�^!�%��$���
��g�;�Zh�����"��������"�c$B��9���a���
�P�b�;��m���m3�!�/~����P��z!O���KQrn%|����)��
�{,��2�j�:
����K���>��E��N#��C�.YC��M��eFO��_KPa���Dyqa%��s�_>}�:�N�~��(��/>�{��'�nRUWG-���=������j�:���t��J���m�&j�U�����3P���x4�?�O�>�N�~9lI������v���E��p�����������(��'_Lg{�yx(�O�9�A�����B�������`��@�G����������LS�0��l�z��^�(hl�B�iQ�;O�A������a\�9�pd1��������}��&E���:����l';���J/�����V��t�����zF���-�	-Z���r��-i1�RF���v#zv���9l~�-��E"�C#�u�&$�����]h��	�b����>��������\��eZUk d�����=���o8b�9!!�-��+g-mh�VG����%�A�
���9I><d���4�^� ��UH��"����sY���
���MZ!��K[U$+/��A�#�+���s���px!!(�V` IDAT�!�O��N��vO"��vx��#[/���_f��^0������0��84/�W��aK�Myc4A\���d3~�>e��aE@�y���^m��\���p� xa��Q(�]#*�|��h����������^��M/7�K�?��p��q�n;�h���:x�z&�y}4�X���Q�|�K���/�5#��Bi�����G��e`I������n�oXJ�>�"���=���~�n���~���%�N��{��85�RA����MZ���`�%��A�RXT$����Y��a��`m�wr�k��8��������)��\[?j<������G���E��o0NPLaa�������a�LX�[�K�XI�Y����g'�S�$M�!��#-TF��-��?�4��s��jff�����E��\	�����}�����zI+:'�A~e���_i�b;�
A<�	h0@�����z�kA���Z��z���2���e�H^��R��V��}&�Ki��;Z����������X����
���:�����.�����]��Ew"�f�
�	��[C]���r�w�����8�,�
k���7���Z��g��'���`U�>,-������.I���Z���c�~�m���������hXc�<�C�"(_�%�9l�����9�_��:3���0-��"8�#_P�i;nI/���P�iU����a�������x:X��J��s����C`aZ��h[��������Fu[�#WWS
�/�]7��WaH�y8pi9-d��-��_�����I@���
�)-�r8���I�"	"��	8�A�#��������-A���[�3w��/�`L��q�����C�63q����;�`�U����C�Q[�8`�`����sx�P���������
~�v?��b���`[_� 8���sx~r&��~A�)�-j�E-�~v��m������h�1*��~/$���LC7/G6�P�DMA��@���y�������`c^%M
$
�"��i�MJ�#p�V��D�X��g�#�����1�H�-��^���FT�G�@��������BO{_:aN};lup�?mRb[�	nhW�8|�#������{��gll����@G��8���v�!5fi������&�����L1��/}3��;[���4��\k�h4�]�U�tA0�+ww�g��H^0���;F-B��&�C��8���O^��& *6���u�8T,Ve��q��X3h&~�)t��=Y��MW'R��Y�X�
C���
x��������K��� Z�/�������P��;c]3�1�����_�`E$�i�\���dK��.%$�AS]�J4�������m�6	%V����o���+��\O�i���%��8�CC/����LSRW�{{Z,f�w����F�i �a~�3A��q��&��7��.".!Y)#�K�}��5T�^y�����07,A�?�
UNIc��
M5	���������m��;F4[	'{=���0Dk� ^z�F�I �"���M��(g�A-���~�F��"h�s�o���B�^ �y�!�+���!t�[���^�gX������X�@�� �U � �9�pF/�{K=z��e���g��������D�'1��
 pR��/��5����k�kUQ�QbX;����@����z\VB�_JM��e�vwz��:�+���
Ow�������
�~��'�~E]���O���EY�������(�q&\.�E<}����t�0h��U��p<�
�u������'���E��0���7�Ci�5��G`�vq
�p��"�xP;Im�X����5�������������x�q�l(T�9�
W��� _�{��M����As�yw�7����������a�l/����B�1�RV���
�4����"�����P�8RVX�A.��x���e4	v������#u���X�N�	��8��1�w�AG-,����Zx�G������G�t���C��{xar�x����>034�#����� �G�/������wr��]O�o�����8���|�L;K�l��k������V	/����-�A��B,��`)�`�n�~���/���M{8��p�f�7����"���������rm�^8
:�_���)c�r���x���l~|*X������z&h�g*�o����%���<h.v��������k>������W8��Zy!�N��3���:Z��D
}h3Rw}���+/hhI��������i�pt�,/d������p����a�\\�'�.cs^HrXZ����
�mC/4��,�?}�� m���M�T�W�+pt�W��H/0C7	Z���M��-����#����[��
���|D�n���^a2�'�#5������`��'XB0D2��@�/�Iy���Kt&%�Z0�z�/��"B���D��
�0�fuCM��PncM8�L;R�n%�Z`�?)���0x�)2D8���*;�1����uaRZ�B����b/�l��a�kJ�+�C;�hw�����k .�^���!Uz��2��T��^0(WVCG#�r��n^��S����������);T%��0c-�O���NQs�?\!��zMn�	Z�����h��
��@�|�;r�k�1)����������E7��D�����X���/��Pf�D<���B9�I��~�.(E

�o]KR�0�]�Fm�R\�?z�wP��0>>����hW��:�J���i#�����g*��3[���&�u*�$�`��%�Z�vJ*��]��n�x����|���)��x�K���������e2�9�s�!�CZx�-�G�$%z&���^�D\=��}q�-	�(�U��-�k�.u�7�"# !h��P'�?0h!��U(�>�Sj���S�Aj��oI�)$��y�*�8}UR�H
��aG��T�.oGPSC�(nE��� ��>����xRT`��}v$C	��Ne�H���M��#H%�5A��!����ZV0u��z1�����G=���8���C�o�>��Q	������� �Aj ����Y���E��]�������?��
BKM+�-��[_9$�R}R����q�.������R��
���=JwG�2�6��J-1��L�=����7�1�������17�q���m��?Ad�%�;���i���L�`l��p'u����F-Z����+ph�������U�{���0q�����������5]�N��jY�G�:�aJ�0L�� �4��������^Z���+��^��2�5��=S ������0�W����{��M�&w��>��J,Wn��`�u�Bm<�/�|������{w��f��4G-	6�F;(���Js�����)�����3�59�y�t������G��$u��b�5:���y=�"��Rl��z������n�.�uw�����J
,L�A�f-?�r�/0u����Z��cp�)�+/\|�Aq���s�~�o�"��z�X3�7��6������s��]mZ�U#�A�RK���E ���I�?����N�f�0�E�G/����hTs)+�F�j���O��`a-����p~�^�&��#�[u>|z����������;���$�i�����UbDV���R��
���>x��:i��2���-l�"�'R48qc�����
b��]� 4�+M�CSC�mg���l�{�����
	e�W�@���	���H� �����~J��:	�V����
���� �K������R����'rU�nM��=t�"Sn�G�D�#�;�����c����{��pt{�.���+�3����uz��%��q���W������Ftk2.����Z�=��z�-���b�E8{>���&<}	�����U�J8K��������
fjx!�gv>�F�[��jJ��
3�Z���?�N����
�?p�������IJ6�i�F��~HhX���#l�L`@���NnX��>�^�G�E_��g������N���igw��{�UTv��{�\��K��D��>�_�\�#=x�))4��k�Kp��:X�������G���6�g4	�$�ivt���O��;��=2J��j#t��
������pr����|�hq�����)��,]��Xa��$�,iY��.�Dp&���*[�� %�������TR8 %6R0H>>X�5'�y����P��4�^����^���5�G�|�Z��@���USl�ua$��p!-$�����S.a0P�j�t�����w��CuR�x�R��phb���Tf4>�b�������u�>>��?��t�cU������)9"h��{KqnYq ��`
�p��n�y�6���X��8V����Z�C�E)4)�n�=�g4,�� �
��)�r�� �$�6�0�����*��p&��{F�N���N�e�����[r�)/0�@��B7���F��f�����]�UI��A������Y�5m�V�BI��� ,0x����H�N�By����2W����J�����x��u�Qvvx�gBG�����C��3#m���H_y�TA*4�E�����>:�NI����~����k
:U��(�n
�iH���F������8����{���5Xj	������7b��/Z���5f?A��`��u~?�`�g�9�1>:s�
���~p��m�����r�e��~XTi���
��6�
/$�a E�;{���l�X1bP��rR�X�U�92J������hPB��5��B���(f����#8��|D����{�������HNM�y1+�����h�������F��I�+Q���j�������Vm�Z������S'^�f&�_&��'�^�M���|�����;ap�����(~#�`������P������"I�0�5�����E9��c�	��0}|R�����R�g�� ng���)�'����3A	71b`x����o����5���w�6(`l�)� �X�*.������5������aU�&�T����nN����hz�yt��u�?@2K,e;2�����a��P�U<�z���5���Z��05/���D��b�q�:so�&��l��b�5�.cs">2:,����d��elN�IK^��X�iQ�$�k�����x7-xA�vY�%p�*�
��s�&!"�?��H/|���7�����9&?x�9��a���J�����TXJ���m�lD���^p	�IwwL$����`/D�r�/05�U1�Au�;��Ly�{�3b�D�PWK��`1�$<W�4&i)/T�S�C���}�vVE(�2��"��E�`���na��W��G����rp&��������"1Z:�����~��=[Qv�LQ��Z�R��%k�?SD���H����|/�K�gLCy���StE�����[��#5�E]r����
����9�Qn�,<�.���YA2�^f���q��KZH|���������q�����/^���'O�P�[o���-<����'�?x�=��x0�bJ��{6&���/O��)G(Ry�]�����2���I������v+�$to6���i���o;�v}���QX�O�"���bp!��i����R;���k��;J�� ^`�	,%�VeR^�O*
��Iq��v���`W�v���^u��E��k����d�I��RP�������2lIp�^����5m�'�j��2:I
���*�0������������2�#Ey��Yh�ZB��d�5:��-UZ�;�C���G�#���+/�/��<H��-�F��=Q�`�$��m�.,�FV����B��xj.lh�7f���e��`�����M����p�"�ss0%�k������#+����[����`6W^��|�
��W��O���:����\y���-�-B�6����������cm���yY�������c��3�M��SHX��dx�� ,�Oy�o����p��u���R=���p�����`6��o�U�3�Iy���[��#�R['���u������#�a����$�	���>�{xa@�VXxh/|I���lR� �����`��^`0;�=��J	I�B1�q����o�|2%%����������4O��D���H�6l�6<Ey!���RC�r,]E]�Y�
U�8��d#K����tpY3
�����^�/�u9��N/�����4R^(^@
��h�+��RV�%��N������y���+!\y����qN�R^`�
]l����H.K,���P��
-fE#����-V����)�B��Ly!��$]�/S�v������^y���T����,}@�*C/�(����>��j�&�������D�A���+)T���/�&�#��Li���B@�/W��w��Bt���0o�������`�L�;:&��C��JCy[La�����j*V��������5��TS���O����dx�y�������m���\�!9e?'	^0�������]��6RA��w����Wk�����k�����`S�������g`��	h^��M���p"Ey!^`m$�7�k���A1������w#W���H
/\|�����!������d�38����� ���)jl���v��x�)$����J�A��9�)���/��_������F�2%p��7�P���������6�m�1n��UqZ,W�^�\�#����b���8)c���J����
��B�j=����%����&"���`a\�(���g�qh�j���'��\��v���]����E��n�j�r�-�e��������%����~a+���5������s�=�1����r������_Hz������K�0��b��Lu���R���7��7���l7�~G�Z�p��p����R�R�����C~�������
v��]��Q_�Q����^8����A��xZC�k�n��o��!�(W�&<���;�:(�T#F7_�{���@�����hl�2#����K��
p��%#�BwQ
��-��c(��^`0(�C<)�1��+%�/��MR^����L	���[D^��{�OCy!16�+0D]�!�jZ����Aj&�B��!�t��u���/�c��,���"5(��]S�&=x������~��=s�I�
)�B����u�a��Q�7)r�� ������(5D%�����xup*A+�xK�����w�	��T$F.`@���I�"�(/����P���W��s�R?(A���l�����������������P��6�����0i3�Q���7����#H9a��/�����
�t�`��7��6��q�����=�����xJv�U^����q\�t.s��`�C����V���;�.|��1���.\�������K�����.W^�QI/}���
Wm8�<���}Hs|/t�^� -GR�)�Z�.>��������e�����_1(!84��u��[�"��4��Y�o��7.�"�>O
/�s�,���F��(-�)�5l�TH�o��������@�����LhX8��������{C�t��n9$�y< -�`S�)�x ��f_=�~>�)����1��XJ7Sj�v���R�V�b
�ZF�B��k�k"�p��.�s|�/4�4��4�;���>���{y�� � ._��CEj',���h�g��
�������1}
�d6-�Y1�?��r�P�D|��^������B��o��B�tI^��_�}I.�^���J;���A�#-xAUM�;�I��:������s���xtk+�����;`aY�����^`0����)'ath1{
�vXG�
���E//����;�F�����wS����7�L��XK���&���j4�QT��4�E{Re�Lr������.��,=x��nA��R�/~��
�xA�������>?����6�B�&�V`��
�j�Kx�3>�����������J
�}�(>�4i�C"��D����8�>���C��H^����\}!�e>�,_� IDATB����k�L�����}��.����^`X�*IR��%�p/���x����1���
�C�`�������=#�*'0����y�]�����
��(�}�*R�Z�@�z	�em�rS:`�*BI�����K��A/��3��OVCHV^H��c5d$"�=aH�
���Y�x�u=��C�u���
3s<�1	�`Y���M/&Y����� -h�C/�(��;7�*�=jn?�z�����T ��_��F
D���C���4���;Qz�x��"�#f�T�8�����Vn�^-�������L�b�1x)�[����
A�����3�1$�2e�B3����*��o���M��?-�4��K�(g�DL[������B) �P���"!�@��$^H �(�<���sX���I���L���v0x��^��-��u�A���j)$���^����x�F)�-D�00����K��i�{����m��g��(H��B����(/hQ�pJg�F�����C���v��	�G����k�I��).��B��K���d�i������(D^:E�U�]�x�nHc<��Xh7h�SC$��I�k�V5�m�Jy!�v�G��B[��y;�s�.�rO�]����;���nc�����4_�����'#xA�vd���m5mDP>���aK�M)�B����p��q��j,?+����(��������%��RC0��%u�59��2����^Fc������p
v���c1�����
�^�Gy�rhR�1-fE���c$��6�[�+������RZ,~���I;��?���zAU����/������lR����0�Sw�v���(Li?�?x�]3���V�0)0��]����<���0LI�)2�uKS�z�+J������I]z�'��Tnb��7O\�q�l}/���	OR9�B�tJ-���Oo����g����[���'�.������^�'�/�bR�a�� !��d������H�A��v����4�����0x!��1R@1�2������,�K��b)�F��n�n���<$���A���GQ*�<]���oV&��[��ZE�I��1�o���0�������0��>A"*0Xs##�%)/0x�YY	I��w,}�n���Uu��.���o��:�+0E����>�������I��l�x�?�@�_������C��J���ah\F&e��)/}�VfH^0�]�MkO��G�>>����xA�E
�����������q�,���]<6^�.��/����s��BJ)�
��v�?[p���I��U��x�|7���L)&��0��'�H=��S^�.V���#����
>��/��1�(���.RN��x>����,�L����VSQ��Ss����x�d���^0��+j�B����7�^R#`��`��n0��3��l���y0+P�+)x�:�mJ!1�RM�R0=>����S���K��um2����pp��������G�T��V��S��B8uk3��0�l0@e���������`u�����O�r�hU�?��`j	N�c���rp�zN �Rn�h����0<Ey������i����?����D�b���`\����m��+Q��f�G��<����/�i�%5����3N������j�x����cx������=fc^��YqKi�E�
cv�������S��?�/�R�3"���t�}t������~�UZ��
��[�R|a��k��J���aP��4gTp��
�j�}p(���m3xA�>c����T���QD_!�1���#o�ai�:���5ZX��=������R�)/�*U5	Da1�O0���i
�`aQ
��s���C000��xR�vT���(]���G�#q�������A��e��@��A�c��,��"���uZ�e�z�r���G���v1>U�Vw���X��xl�t��*���~h_Vx�-��TL]�k�	���"^����+���y���H?�@�R(����b/W�6����!RD���'E�R8�x
����f�~�t`�S��nE����=X���M��?��]���H���^sH���]���4�/��=���2���^�w�:�>���`��[J�p���&������q�i�v���`}���U'R���.qe
MR��C�()=/{9�|� �����#c���q&z���eH��7(���t lF�������I9��=��!����^`���S
���>����N�H))e;��?� TI0t����,�D��HJ;!A���pV���M�sn�?���f@���������
^���K��L�0��;hU7%��XJ�U���>Pz����>���Prt'V��o��w��
Vc:����`�[��'�}���|�����e�AXt�G�y�vpA���M^P�w%�;����6�	�s<>/)����E�(X��q>���N�o��w��n�)t�����jBeR8���U�{���^�~�d�_�}�7���uA���	p����J�#��GAR�H��{J+!!�"������J�BeJ������z������ ����"�N��(���>����	����x�P��t�'����2���#=��X�����^�SI)a��$�/\p��=�XR)I����8�<c�PJ*��	�Cy�0��x���4���J8�#"0���$P�}�RM0��4)p��"��K����6���@��^�B����2���B�����>��k��W)���wh^�!�J�C�����1f�B����l���i�Va��Q<MS^�}�N�:y�����H
/�x�����`��}�3i$�,^�9�G�:L��i�/	�p��F��MM7H�7��z`Q�����G1�$N�!<�H/(���dC�Y�F~[����<��Z">��������#���y����I/mDf���\x!+vs�Nz�BN�G�f/(���`#u�y��F�s���Ws�A<�4�����6������r���l3�m%�5�����(��A`Dr�
y�I[7���������rs������e���v3J��}�����Y�(�|z��"��^PD{��F����G� `�1�Rf��?*�����uS���I.�� �����/(��"l�/(�vf62J�Y]E|.+���6s���i#��O4hZ:�r}*�B�#PA[sY��a��,[�]�������F(�����:m�"��(m�"�+����BF�xAYQ��n����FOY���&C���1x�l�X��S2��|����[�#C}���{�x�[��~����J�a�� ��,DZ�kk+������<w����=JX~�+|����J�&����) Z���r�����x�;_��.�#��[_�G�������<(�yg�����Xf�5E�$�n3sT	d�������C��xK�e/�_<M;����RR`�"�qx!;��{��B��EZ=�B4��v��,�"�=mClGj����G�U�����d�������|PZ�KWq��z����q4�IJ�����u/��S/��3E��K����9/�G���d�H'��E����/(7�b�R��������Tn}��W^��->^H�^�������������~���?f/����dA��;Z^�����=#������Sr)/�|��l3$�����c�3������Q�����~iF���#�i"*�����r�����x�;_��.�#��[_�G�������<(�yg�����X�����3F]�1xA~�%^������r�M�w^�-j^��l3&�����c"��}*��}��yi�_�1���xA���2?�������J��W^�">�zP��E|��_y����x!iFxA�3���^P�?Fk^��.��� ���/��h	xA��{���;/�5/xA���JxA�1���>���>ST����/����x� MDE���^�2UALLd�tt4����Hi}�(Vj�J��l8�-���(}������\�Sze��X�����gP�M�|'�G�$B�:���H��(��c???���@UUU!�d��DD�j������F#.��7c���Io���$6����rMYE�G]��~��ru,�������MM�,��}U�5v��f���5������8�1;�#�H$���9����2��|���D�NM}�����x ���8'����
�O�{?������P�X���f:��\ �xrs?���4�)�e�D5iM~S�7!���y6HmXC�4�k�4���@d�TP[Q��2�H����	K�DT|�B�����R�D�UeOV���u��xR���FC%^����wi��l=!:*�����HR��!�>7K3��2��G[���4�QUS�D����������z<t����^�����.#�\7����/����x� MDE���^�m[:W�=/]\2s�X���C9���O��?��E|2�P�~���#����O��.����r�s���f����|��zzz�H~��2�Cn�\�'7F�k�D|D|���i����p�d������\��">
q�����(��r�O���3�x��J5 ��T��m\�Gnf�����:Q1�{@���p~[��Q�|�������?{gW������(���]X��5�=c�:��9���t��9��5�fw**
� �(�]��b�r�����g����s�����=�G���k_YK�H�{��?�����Q�}e-]�GV*.E��cV�Q�X�G��?������Q�me-YlV�jA���Q�}e-]�GV*6E����T�X��t�Y-����?������'�(����o�Y�%�`�{�Aps�+S����Bzz:444�T������l���@K��ev�����������+C�Gq��G��?�����HJJ�R���)����)IT�����,dDy!S��EJ�N��.��mV�9�J��������EUUU��e4��Ou����)IT��V�����)�;A�����YI��)Ik�[�P^(=��������b$NZ+����.�#��_�G�������q�Z�����?�������jA���H�'�;Vd-]�GV*6���b�+k��?�d2������[���k_YK������_�N&Kb�I�Tzi�J����,�#���F����(�X@��ubE���Q�x��t�Y-����?�����W��=f�YG�b��(����.�#���"m�1+��(n���d�yXQqe�(����,6+e��b��(����.�#���"�GlV*v��Z����Tl~���W����� ��E�
k/��"=%������HMM���n�ik������K�&�Y)��J<��O��\�
��2W�'�h���9C(���)|��WZz��_�l*z�TK�����AFU������JJJ�[7�F�/u������	��
������?��&6;����&WH:y�G!
�B�3�`!Y���?��HHH������$�R�����L��K)�}�����Sn:�_C�������x@�h�WH����+�$_��VP�+���re�"�W���Bz�KSS��~����q|x��(��3��Y������t;�U_I�'�$aZ1�jv����?�����U��������H��S�
n�8 2�m�y�G�v�+���?/&�>��N��(z��*�2��Kn����(�)\Q���2F��qIw��g�=�jZ�}���
�m-���������qI�!�#���F����(�X��*�K�Xz��.Y��N�RUR�6�D�r�'�)q�KU���T�*��^�1y�����8��\���}h7�b���q�/���I�i�T�N��z��w'���K#���-K��2]�+�Hl}��L��,4n��9l�$����6(��G(�8^)�Q�4��S�(?�?i��5�o�K�� k1:����(�D�����S��_�h#K��-Y�X�}�j���cw3��T~@1�zWz����j���k��5������d)s�\r'}
,S�]r������~��������:�W�z+[�+��r�|��W,|�7��N�j��U��$m�SX��v4�ve-���[���W��e��<�G�2�Zd��������gef",,VVV����)����	������cm/�������� ���dv*���P�<(�������F������� �
�S	^���� _{*�4/����5�d+W���/7wy�����?�XI1i�����MX����-?m>��8��j�{��>~���C��{��>����]�z����
��*�?
-���j)$�r���{��y�L���M���w ;;�d3U1a��B�t��(���[@����ih�H
����WKu(+-�x��:���Z��%~���p�/�[��G���y2
�:h���^��rL
*Hl�+��r*V�GN�TP1^�1��r�`3�!+�~Y�?��Q'x����������ps�c�����$��L�<��;?�N���)G9xi!zz���<E��o��`j�Z����T��\����q��T�r���[C[�����~�IH��Go�U^n����+i��we<���S�����>HzU�d55�|!i�w���Crx*BN����,<��)�c�KS���L���{������WW��D�[����&
0��y���&v13E�����u�Q''{�������b�W��	/���	-\{��.5�����\� o����&�Y+
�����#t�jc\l.�NA�>�R���x����zc����nZ�y7����^��I;. ;����V^��������k3��zs;�����o#.%�kOj��9������T��^���)�����v\��G���{#o��������O_B�@	��Ke'�oG#a�i��>�*_nb��S�����	�e�x"�~W�FP&y�}�,�����]�i�����6��|�T^���?~?q�G����������������j�����UUao�,�v�[ya��&���v~���?����V���6�
_��*U���5��G�*�q���+^0��Fk��}]
���Q<��^��{vA���fy']����/�{/V��S�U������=�7&��_6]��n��g[�I�/7��pw$�& �X�=��k��� -���@�*�s&y�~��D���B��!$����$V*�4^(y���X$����������q��~�2��1n��q��9T��AM���d���Cp��M�wI&���s��)�b������	�9��F��/^���������`nj��n��geQs���"�����!��~0(�`��^�f���L4�#��Z^�BY����x����O����r�#�@I]���#���p���\�G./F�&�q���R�B�}�*���-��/ox�V#��j���^�	x����1o��[[����0�
"nG!5*���e�/������%1�G�0�!ho0b���|�"�Ws3��4���>e^����������eh�X
��Pqag�	/,<�_���.�+��{�?�o
:v�B~�@��P�����i�L�,�e�c,xAM��uB�r��y���;���0��������6bn�Ae
^����C��U�����Q�:��H����>����C�Hz�����P��6l�������^PWU��>1c�V����2	/�efc�W:�j�1�Ux�v5�u0�������Bg��xvVz6^�'���z������R���U�>�n��R��@e�C����y.�s�8�	/de���������M����*��^(Qs�SY��K���5�=e,nx�GbR2�_�bX���m�f|>j^��c��#������Fh�����BvV6:�i������M�M
ii�8r�)"��,�z��?���-�M��S���g.���%\�s����#Ha��y��<xa�������t��u�]��O�u+=+����$��h�3!!)�J�I*
�N���2-��!�Md +[	]����P�3������U�j_
�����K�HM�FL|6����I�/�!!9��'}�h�����&#X�� IDAThH�r�������h�+AW[�+/0�!:.��<���������qMU:�������<]Q��9Q�^(�7��/��)���B�r��,�<Zr�1bR�`����Mj��h���}(��ioD����^C�
������x���~8�
����4�9��<�;����&:��]���J�������$�c�m}�i =,/���
�V:��U���(!x�7��`�a
e�<��T���$���YU�+1$����8Wh9 ��g]�2�`;+��ar@��y$�`/,l������`'������D�����!T���J
q��6d�La���	�c�g�M��"-=	���<}}���������dtj:���8us�Rb�z[��S������W�>7m�}��q��FjC&�;����
�_=$����m>����_�������o�#W^8��������Bb{����&z�~H=�*+�����-��n���dRVx�A�`Di�,�v�&���]����i����`���Y[n�<5������:<�����p�1��N.4��W�����B�������.&uw����%s�����u���J�ic7����K�����%S�������q�]�p�7��e������F`����$-��a�N��jB���+R2�������<	����Z���1�d���=@����R���C�R���E��hP�;s #9uf��SKj�~�5�`��V���Ds��K|aT��+/������)���5�t�����Pk�3T�U�m���{���k���&T�Tx��0���fP��2���\��������;Q���.�[E����[�	p��

#u$�����7�=����\A�� [�73E���x��y�=�|�n��BYM��������MM���f�Gz�����������t{�}�S^��������9�4������a}�����+�����G[�����M���������6��$$��>�hQ<U����x�	��uaol�L�sI]���������������A���_T�,�{���hjW���^Bm�Mk ��L������
�����%�ZIa���U�.����Z4��$}
u�}������U�����
O�>Vw�Z5�����t-�|�[6���2����f��&����`
��m���.��"&3O�-�{
��C�b��)deebT�nx�.�������[��3�+),4�Z1I��t�8&y�����6� >5���C'�/>���~�����+}��\��{�?u4��>�����Z&$����#-5OI���?�l�#c<��@jjj�R������RFdD��C%[U\9��RDT���]zi!<4��������:�-T��B���8q8=h#�i|�������B�3iC2����N�����W/3y�F���u�!�r��KF��ZxL������K0��C7��/�
�3��������'�T���z�J��Po��H�tYo��V�JZd�K��w
rTa�BTb����U[9�E=���yd5l���}�Q���^�$'����6Ch������m������c�agl���L���PU����Gc����6���7p9�>��5�Y/��q�3C�|�S[��k��&.�����v�7�� ��)<�u��Eg�#%#��&��kS�*/|��.9��l\�i=����	v]��WQ�����n��8�������s��g~8�����Z=������.LyA��������
b����X���������*�����,q+���s���4�Nwd%$#���Q���jUkN%]-�o:J����p�p���U��"�����)/�tk�4� $��	�������G��[w�[@��`�U�E��������O�E?��� |��\y���!H�q��#x�4o��WF���H���/r�4g���� ^5��0��7��Vg������|Tj�c���.�������x��[{1��]�,
�g�4l:���dER��5���tz^M���;�g�/G���t��`���HOKF��s��m������u���s���t�/����)r��0�YK4���};m�f|��������U�hh��fmz�P�����"2mj����{{��_����~?~^��e��p��&�ga������+Ly���t��C\���@
�}2h����`F�����N�1H�Q%U����;��T9��L�V�iY�g����j����A��y6&5���N�*�������3��
�\=4:	�7{a��v��%�x�`�����\��o�K���u�����&�����A`$��
�l�}�y�/z��SeC�e6�����4������T������"�+/���l�	�.�emktmb��Y����f�F�f������i�i��:V4������*/8��Ew�Oi��`��JR�����K�:>�n.���pS��
�������7]��W����=�W�L~I���T��>��v�_g�Tup�o��\�P�)��4����X�O��Ly�Y��x������n�S�\;��m�w�k[C���?�����]u�}�_!�����c(�*�{�B����^4g���/���V��A
N�|�=�8��d�{I��rZVzh���h,h����7��n���_5���:�7z���@���kO�����k[r���7	��Qw�=��S�C���������.���Q���E;���_�_�*Zj���0��6�������}�j�@D�{
}n�u�wC�:����/h���K�:	����=�I��7�r���E|@$W�h�KG(�{�*�t�����O�z�9���x%PBYM�����Z:E��{� x!���{�w�%�BS��[}���
k�N�HKBx�UWYpl>���x�nY�mAS�>/^��6������cKc�����2$�H���V;�@��tsC�
~/���/��J.Oy��D���������0�oW��m&��x�����H��5�%z��#h�^�ThQ�@�Z5A��BzFl+[�)����v�3�{e���\�a����3���{�8wVt���+�������5%g���/,Y����P�	e-�6M9��F���BX@Rx!)%��M����4������ro
���@-f�Ff��Y���q�ASC�x���
�ha���4�V���t��/�X�(S����P�z�0�������L4��J��\�����N�CZT��L��K-�xA~CUl�����(I�GV�_��?���"J�B�Us����t�9sK:�����h]��o
t/X9���]}<8�*;���c�s��:�X�� Z���\q��#�3����c����:��6������=���z��_�!��K$�	���6�qZ����7@�� ����W�h�?!�7{��Y��k�zB-���������o�7C��92�2�o�'�F���,��ea����6s��a�<#����P��"�gx�
'����mA�z�p��1���@Ukw/���
��k������������' G��������L��g�`nT���1�M�&��F��%,Ac�����/���'�|k)z.���k�6�����R���������Mc��� �R����-kZ���9�8���*�(A;�����/��L[���]w��B3������X,�36�����PW]��k���u�0T���+�C91��s���T�"h�rB��gZu����u�aa����1g�mL�^�)�CZh=y�C�1g�&��N�j�����{5S��[����T���$^/�\�������1������L���Oh���6������^�����m�M��@���GfJ&X��U�8�Pgv
Z@$���g`A��HZ��F����tq�u�����������7�s���]hYh���jZ�1��'#P��%�	���Hu�@2�6����FUC��$/�!����9����^!�Q���N��9TP��,^|�F��qe�-T���x��h�*/xl�i�I]#X����B�=l{T�pD��`4_�W'x��������C�)H
N��RRU�]�����k��@����.I�=Z�X���:���Ui�9�{u���"�6D���c����		�8���(d�w2�]�	^`i�t�1��;~8{	�]������"��;�1��V��BdR�
�|����h���k�����T��	�GR��u�Jtpc��7�L1z�l��F���h�P[����� �ZL����'x��Q����3j�)�or���A����1��9Zd7@�fy�,��|u0xa�
S����5�L���eT5�&��@�7���I��XpjF5�
m}l�uc�t��GWa�G��6�^h���ZV����7��;�^FG�F8��������*^H��v%��'��D�H*������6��oH���:���kmu���A��������6��,HERcxx/n��0��d�p���K�6�CGOW/�����L1���&�*��1����N�Cb�2��C��N�!"�M��!�
�������H�Zh�R��L�M�z�48Q��:L�%Wcx^P�����~���
��j ��c���D����x���!n�f�T����R/<��.$m9���T�\S�p5�m6=�h'\�mm��.��/]�# 2�@�����@ T3�M�N?�����9X�����]������P���{�hD�����be���������d<�����PxJ�F���F!"1[�N��	����@��O����l�h��`6��\�������	T24�+���W31q�
T�����(������o��S�>|,����XL����A��-8�p������[��`������G�����0x�m��y?A�T,���*�@�1���#+1IG.����,�	Us0h!�������)�
��}�����bf��`�������x��: ����-�F����DfX4TLx��^�s���ga�q�L��<a#�A��.�#����I$8��35w2#b`���������:x�cK� ��e0�7�^�k^_z�kh6p����v�FH:z�T^pri�*
q��R�h3����r76���&vh�t0�������~x���-����``h�.��a�����������Ll���!�u������_�aY��-q��Ch�c� xa����r���ff��1���-�z������9q
�E}�TN�V8�u�T`���HHI!xa*��Xs}L���I��_�&�q�2~@���S�h�/L;�����L������>��<lTP�L�o����Z�,'�k=��{��O5��z.�ZRZWSeL=��������xVQ�9�����Dmd�
�,�����Yt����[/�}�'>��r�����4j���6�]{�Ec�`��k��t���i.>�Om���v����y�)�n��Ga<����A����jq�a����=v��{|C�'��b(��A��-A/,���b�!RwhG�)Na����D=:4��+�0��D<��������c���,�0mz ��+��c������3�J-t���k9�`�c�a�Q
g��F��T�klt��)���vN}���_��@�TOk���E����M^K�Q�+=R�q��!�i�?��s=���3��f���Y�Q��9����?�;���x��u5�5����.����T�^���py�>�;��~���Os!�/�j�w��L�4�8����'�����W!� �E,��A���6��*8?p'k��2�3����������.��5�ik~�o.��su'�D���W\��`7x�>Ii"!(��>��]�w�4��=g�o���!��M���\���_���.Xh��>4[�����?zj��@��I]x�y[�X��U7P��+��(#p�����F�EVZ�k$�q��S�q��w����>���xri�iX�����Q��R��?EbT��=	vX�����!yh���5}���{k����&��������z7]y�������?����H��x��U|>z0Vn���{b��=��`�_�X��_��lx��/CB�@'X��jtr��o��UrC;|6�{*�����������/��\C��Gb��c�4���������Y_~������{�b�����N�����������~��I�A=�V�0��&������d����>�sBF�W^hXC��J�~2��:�Px�lx��{�*$���0��:��H#�B�t����QU�T�	�P���hJ�o5�S�����xA��]l�����.M�G��oy�?����K�B�E���8�'^���rN�t/(��������|�oFd�������e�F5�����|�=��G�Q�*���2L�VA��`Dz��"� �y<�o���s6���������������s�F�P����q`6�ZN��&���w�`D�3"�f����0x!)%�T6�
U�
��e���P�����!��PUy����_�
:�� ��`a��'�s���a�(�,WZp���z�<�C�:C�����8��%���	;�<5�6�����t:i��p<A�k��c6����@�z�����&���O`�R�
!��4_�.�M
�Th�~d;'��a�ixFa��V��<�8����C�<�V2���)��S5`�����0m�M4�n���&�p��� ��"����SX�ELXI1KiQ����6��P7����CC'3^�I�a��g� �b��@G$b��F�����b��?/��v�Z/,$0�)5��a^`y|�c��$�]~�|-���%-��N9��
CW}<���N�����0klc7C���{1p���p20x�uJu�X`���6�
�dc �'8@�����8?��������;�b�SZ���,0x��W$]M�lq*p�XT����W�h���m�q-�@��+��N�~/��B���?���l
��kN������p�/�4l�[���P�8�����m5����/����X{���p�����fpI0��a*Yt:1�b��Au=�_���qO��e�^`��T�����q��%��=��A�w����O�U�F����W5`��^]1f��S�%��������@�N���4o�7�sC�X��`s�\���C��B���}p�M/�?"��-��r`�������my�.f��D�e�����V�>���QX���;��:��y���V�6���z��hM�guz��_��Cn^`*sHAB�� x!&9n0P$#v�������������?���:m8�^?���O�������G���zp9~�2�C��mN���M��D���%nvA�+��Q�����jRxE��P����p��d�����s:���=���j�6�}�g���]RL#��0
�����!z��*A=�b�[�&���2�
��P��������LRl2�P�!)<��D]�.g�$����>���F�j��^���jt���R���y.���
m��U�<\���F�7v�F�ZH����s���B��{������S��]�����+�V����������L�;v�=�����6��BA�"U�7�1�����hl�
3^`���#p��/������p��#I9�{���M�������U��6�]?�J�X����aj�������=��c�)�'����� M��>G�[r�\ml1�}<����}����6iF�q����i���S�^�q���V:�>�6�S3�(��Wa����>>��8b��I�E�S?A����`b�x=F�uW���JC2�)��b��
t���8�'�C�_d��?�T$TU�D�W6P�[q+���7�v4�<�KJ���B�@�z.�s#DP�fL��4)��K(��r����t�T=0HA���+/�+BP�����S���zGZ�������u�G������Wg�'�������G�s���_��Aw1���X�| �96���..��+���U�������7\N IDAT�sx�]�i���+J��U����uh��K��i���!�,��A#Vb���z�m���&�m�A����q����n\E ��U#�b�����TS��=�a�������Jb��q�v9>i�g�Jx`�%��������O�3���Y�"��jX���
b&)�|�B��6�<�S������I��+��Y�����������%U�����b/;������=�U�����90/������#���E}�s;�`�������zXpt�|������x:���\x���f
q��%���Vtb���y��?��j'~��U�����������O�uV[�'(������kV5Fj��[�H�#�HI9uZ�*0���!��K�M��^�7������A�ZcH�|Bs�Ev1p��)0���Z�]s���qp�k
:��D���=�b �Uk��.�����A]������C��:���h��
��0��"�;5��vFNx�Ks����X} �Y�+^`�(���"G-����$LjO��*���������,�b��kRS��
��B^���0�W�����4��I�A���h��'�9�8�����Z)�]A��	�5��rZ"�Y)�i���{�&W�	/c����x���I��A����j��s\��
�j�k�
���,��
^0q��cT��C�?�G���[�����6B������;u0x��D�6�LlL�]���M]R�8��������F�>��7~�an�V.���S]�6�L`�<~�+*3=�W���W�,aaa#��������|/He����i�_����H/�>	�PBl|F��/^GI.jh��S����� 8�
������)�����(,�)�5�
��k��}��c���]�> (��������%����K���8O��L1B\��X@Rx!&�����k5e�=�������8� ���\����l�5�{�d��L��]�L�����&�����p�&�,�%K�6����{R1��:V��3�u&�I��Wi��O�	�-����nj�'Y�8:�q�b:�v��JL��Z%�Oe���!�FHso�FZ�9^V��N��mU)��c�\x!,1��c���_����Z��1��(�*
^0��K�H�}�������~8��/X�����2��y�s����?��-�4���5-��2A��WpZ�
�\��g�^H���S^��0�V�`1+�I�����}�+/�^��i�z�5�����uM�E�L��|Xu�m����SC`�!��}��&���y����)��p�hq�;\��
��x�?��������o4�:Mw�l�
/?��0~/���BB��+:7������_��z'��h�E��S�>���������b���H���|���h}x�i���#����R/X>�)WJ���0�N_��m�X������6��Gxl��,�+���q���������O����~��"��=Y��j��8q'�B@����N�br�r���+����-zv�g�u'}1��:��wX�C7Iy!(Gya��sR�JZx�m�35���)|����{y��,�A5��ga����U@X(2�](/h��cJ-�����������&:��
���E�!�(�W�W��WO����T~���L@rA�\x�I�V�k����*������B�X���C������Ea,�����X`�
9
��x}6��6���>�A��K� �Z��w�r��*�l�Ia1^	!�Vj'���j�g[��fN<LFn[tl�Q�sG�����O7?/x�\G5-�hA:�o��"e�_:zr �]��,�%���W�
��=D�(�+���g�����]|��m����,�0��X��H���:��)/\z��zzXw�.��)$0�1��U5�w��	�qu�������BJl���O�ja���[/����+/0����~�r
�4�5}�B?����>�����0N�HK�<x���C�����v��m&?|���	�la�/�p�)/t����\q���I���������8:-�N�����7f�/��e�
�t����h���T/��L��
�8\�T��ER��>O0I�9�[��.��B��`?������������ykM�p���p���������2�jSx��?!��X������������L�a�H����-^H�u��T���>5�MyA�D�N�8��?o����v��9��O��H��Iy�TX(	%�dc����9��$Wa�����f�:��F<\���#���g�x��R�7m(Yb)x���z_y!)-�T���&�x{�`U�iy�Li��a�J�����$���_��0�ACU=����PH�#>W0����s��r�F���ugN`f������V��$,�~�OyaP�V8�u����{	&�K��L
��h4t������@R^H���������;��t0mo��;�C�����@�dRRy8����;�#����V��<�����\���t�������EapX=R`!(r��\x!+>	Y�	<����p%���H��0�.�����P���A�k�S^��'��7���	�|(����	���:h�\�#d��WLt�\��r�s�6�G����������-�q�����}������t*K]]7�n�
k��%����0��mN��b�'��Kr�� xa�Gkl�x�P������:���)/0�J�A
l3����:����N]�������������^����������i)��7=�Y�{R�Yt=�j�Q�&%����&����N���Y�����d
����AK�r�,ic����S^��4�
&-�BJ�9���s<Iu�4��0�5)�5���(������Iy����~NYq�+/l��oc����������q� 	��p��+z���������N�S��hG������?����]��](��<���p��8��A
w���/x:����$\~~]\>���cB��.`����b�@`����B���8�x���a����_�����\:�~����+������u
���y���/0`�
)6l����%� �/r�$��^F�q���^f��Ip_RH����k_����)����h�	�/����z_yA��=]��F?+�eB��A����UXRB�Tz���)8��GYC����y@A.��p�%TPw��!���Hz�CA���W����0�V�n#�,q�����
�8��M�����9����xl�����v>������v�Ww�/TT��'�I��������
�R�	\�f��pw�7p�8�om�������L�{��H�|���PR�J�sEG��Q��T��c�� �y���<m�K����������8}F����� <2���
s��Gk/L?��<5�:p��]x�����}x�l�?�n��S����������<L�A�d�r�� �;VE
����W������0<�i}=u�����X��4�_�^`J�{������}�jp !^`!�$����k35\���n��h�����#�����O�-T�$F��t�V:��i���d*-�+��B6�����x�M�{6I+��:��@�i�
�	�8v-��=����`�gi:4�	cq�IL
�I�)JdR�
�c�Y�6����P��bs�l{H��l�G�9�������W|�dN&�h�~z��8�L�Pj��*��m��~�o���/�P<����������m�s��jtJ����ic��iu���X8��:p	?��L��WP����;����DR�s�CYK�A�n�fz�����W�aK��'����{�����wi�8G~�q]k�P��������cP��f�}���;�`;��&(_�
�P��Z ���0�l���4$>�D���
S^x|����|A��k?�Ct��:���o��&�:u�yT8LI)���6o7���N*���B��)2�S�}������k7�B��i�i)>l��4�F�l���.*Q���L����e����%�i���H����-,�������(
�uZT���3������Ba�B%���������M'�6�}�	��f��}M��e�ps�c&��`S^��S:�Cqu�t40s�-��kP���<�meZ�b��G��N�<v�.Rl��x���p�n0��n���_��59���0���;�^���T3!�#����)�go���4����:���L�l�����M��~���I���1���������+i����q;�o��n��
jMw����#�tk,�����^7��-����d��sH@�����������;Z���9?��`�c�4��Kj<dC���pu�m
�Da4����_}Q}���Q����������PytZ������F�S�����%�Dr �V����p��&q����;Z��� *w������le��P�T�_y��B����LZ�L������)Q�";v�Xz�#-&����S���:�����I�g�
�����|��+������6�+\�����}�CI�X��Y�����*���c���y�+�Ku��\��o��~�FQ�yg.�}~�����hT12���^x�Rhw�)�l#x!�����to�pO#����vi�?���3�)0�o��`��������Zd{Z�HJ��X�1$]������0xA�b�hj�J�K�����:;����������S�P*����+�Y�[7��0�T��M�HQ�������jTGIy7��!���lQ���\)/\��~��g!��Em
�*/��i������[B��U�-Q���W���zN���TqE�Z���^�l�m�1E�>��0��
9�
��n��Z��*�)<��WA��t��4<h�O�+*�=�������tJ�m~�����k�&h�A��e��M�01SF��lNZ,��������C�>Lq���n�:��IYA���������LFKZCxCq�������2��P�
������(��U��5T�kJ�����zc:
�./���&�#�N=��M�Z$�Hj�u)��uZ#���bd��@y����;�����������n�/h��
�dk:�����z5E��t����t�wA��+������B�ze���wj.^��������:����ny�+��K{8h�N����
�Ha��p`��CKJ��
��O�$v���X��v���O��
��`cmb��t�7������{|w��5�!����,
�$�+/,�6�����������6��|LV20�{V����n����|���@��~;w�o�	��nU{2�2fn���;u��j�V��������&�m?y����`�T�D?����{�|�`�!#����0�N��z��������0���n����)d�x�/0U#
!�d������[�j]qk��*��B/0�AQsV��XX)(�!����#�lj�4 ��=M�	�OC�T���M0�~��T���9M�)�"�M$4����"N�����b�B�=x
5��<,SU0�bT�X�9��uP��������4��!~�0%�"n�>f ��m����a�To���QFz�
�f��)o����
�+�s�9|���Mzfl�����z���3����=��{���o�7�h���{�b����c�?���]z���<|�fR\����B�����*N?�A���#:��P��3������w�\�0�M{�������o���xmr������k-���������.��&�ii����'�i�k8�[b���xX��h�=�����jBj
z�7����	��V��G��_�)/�"e?:L������.Z���������g���IA�zH>�_����0x��i��glh��ntm��4�$d��V%������g����2(*.���z���������P�����
I�M���2�R�vr��^����{%�%�]'yBW|��z�	��l���alO��K���c
�����<�����/?���y�
'��2���+�Lm��:�������9M���V��3�/0����� �,$R�?o�KjX���)\l")�<��������P��	:8��Uj���[�y�2^�U��H
!�B:<���W��Wj���6r;0x��Md~� �57~�!%�8���Se`p��zS��Lan�}p����}
�=;@�2����]��v�AIi�<�����A�
<4�WM�-I��^��@�*�(��K��������\H���
��,$S/`s��/��~����������4�)X����v1x����|P7�&X�_��P� :�S�������+���s%�{?��qmK�f��>0��K#�p%
Sm���%�G�/������X�/h��a����b�E�*���=(`W��C}�
A&�p�wC�:���;��yt������=A����qtk�	��`�������S{���,,H�!?��f@�d�-�h����,f�������[\�"�>}0��������R:t�U5-�xN���������O"<���T�Z�C��.8y��
�e��3����@��_�z�K D����/^P�=����<(l��I���_%�H��`,,���>�]��K(/���?/O�����<�G"x�uz�������C�	��������|�2��P,2mm����=����}�����7�H'���1�����a���>�W �p��7.\�Wgt����>�/�M���w��;�$M5��S\��X@RxA�2+jZ/x���m�9^�=$�S��#����!����$)����FH�'���FH[NI�/^(�v���
��R;emK���)KZx�8u��<��F��L5��MM9P��"G���]��e����'�����M;�I�K�� ����XCJ��
��Q���(,l���(�r���(N[>6�8�H��0xA�r�{������[a�Bi�K�u7�Cq��1x��e�D������[�:
�$�_Ri
�J�����(x���W��K/�d{]Wn�Y�Q�Q#�!�C�z9H��>����r��#6B�x�xV,O�����<�GbxA���4��^���^�����tR��������
�Hj��I'���x�d���>���$�^F�_�2��Y��we�60&<����_�=�(��J���q':�h�~�|!T���aE�����6,��PZ���W���_���^�B����c�r^���w`���H����H)��
1D���� ����qIz,�#���F����(�X@��;Q�^�|��NJ�9^:v��V�I-U:���cw/���������di������+O������/�e�H�6�� ����R���h�.O(/��?ByA��TTiBy��e���E�)y�+��XTl�����*�<�G����ro/H�B/xA��R:)��x��]�Z�$�T���B���P��O��[���A/Hf���J�e��^([�(nk�P\���O����<� ��zK�����J��[�
xAQ�L�r� ��rs���qIz,�#���F����(�X@��;Q�^�|��NJ�9^:v��V�I-U:���cw/���������dcP�������B������?��/�r�����6,O%xA����|��������^P�(��\/�f���b�_>vTT)��?^P�(��{0x�q�2����p)�pb��(����?�k��j�)�B��}E���Jw<U��OQ*���J��E�^��]]]hjj��r���O�v����OIZ�"����8n:}}��4����Q�i�R���\���B�fZ��H����?2	� ��P��\����&,v^(��D��n/(��msO�G��E���d��b��(����^�6��-Dd��/��X��Z����T\������$����"����aE��!��8��Z��^P IDAT��������/��X��Z����Tl����Y���"k��?�ZP���k_YK/O�Q�������"��@E��=� �9�������pZ����L��8����Bdd$���������)s.y�A�?�?%i��6����`jj
ee��4����Q�i�R���\���B�fZ�������6444d.�, �S�Pp��J�i�%$$p�1���p���m/
����*�x�H��l����� }]�?���$s������K(/���E�e�eQy!==����E7;;��500(�#A����Hf��J%�SZ���^���TZ�bcc�����Ri5A�������r/L�G�&�k��?r5�\c�\PSS�k��U��OiY^�z�$�Si��)-�]/[gWE	�#�S��K3��OiZ������Qi��H�����?�5�$�W�G2;�V*����< ��������[�,��I��(�
���,T��������]��(����?B&�t�SQ��e���^��t�_T��?B&�(o����?�k��j�)�B��}E�OE�Ug�B��t���j�)�B����O�����+��;���O�k�?e�7�?��/���E�e�^P�s*�����b������jA���Q�}e-�"m�1[���:"�_�G����t�Y-���is�YI�GqcE%�����+C�Gq���d�Y)��_�G����t�Y-����?b�_�cE���d��b��(����^��#�Y�-�WX0x�-�Y����Q	{�V��*Ff�2�8���]`�o�N���p)��b��(����?�k��j�)�B��}E�����O�^!=;K�����1dg�JUGRR����UX-S8�4Efp�}UD�J�Af�b}W��$����6LM��{i%��?E��EV0R��E�Y�������mh��*z�mV��1�a2BEE�X������Qvb���$",2�XvPT����D�6�����^nQ��{�
.�$�mX��2Q�fp,�J%�����+R���x�������i��I2���ht��Le���a(+������UNY�^������:��$�� A����4��-AOr����H���V��ddd��_C��U�Ctf�;�+N����#�0(����On��5Z <��D��~%�m�����A��������)���F���"�_1����0��
x��l/j.�`���%d��,�����_�.v�
������������;�U��eE���)��Q"�J����D����+��^�1������`x���O�HK,��f%��vh�>�J�=����Y:��$t02�e��$I+D��*�x�T!�RP'�M�Q[rh�,C�����)�^U�b���YQ������� )�E�j�h�|-�4gc��[���C��
)[�xTv^���&2UTK5}�.����2;N���%��&�}��@��o�XvT
-I3��;�MK�fQ���[�:���P�M�I;n�\NY+ �r:|��J�y�A7�d��2S�Cw����������"�#��!]Y^��^"�����Xg��J��W���d��b��(����^��#���!�Y�������-� ��UVJ�B�zB��kQ��- �12
�������))x�"�r�/�B/(~���~��X��������MX����6?m>��8�$�����9�}���G�B��$ �}���[�b���Y�9
�&�h��./����8q�
�����.N���f'�������g���a��C}��b5Hd����������'����"k��?�ZP���k_YK�B��3���o
�~~	F&x�H�V��Q�V?�8�3�?�P��+�����nX~���o��K��U���7���	��'d�fm\����!�$j��e��~z#Y�b�������.�{:`�	�����\��5�ZT���:��+�cy���6��zh��������k�T��4���2c� ��i���";9Z��H��.��jh�iU����� Ox�sM[�$�������X����*]I(/4���[�W�S��q`�����g���&����R��MlfYN�]p��b��c�.HI����+�*�<f*��B�F}����<q��v��NF��o��E=���YcWc������9I����X���b�W�2
x�C�����\�c�������j�R�m��IX�Q|%���C_�t�1�1R�6���lN���'|U���'ox�r�.H��N-��qo��js�Qpe�t��WP��"<<�������&��������p������"�����X�C����|a�C[����8h�)v�,[!��@�K�[{uXRH���LX�����w�6����+����I%�6���+����T��8M��Y��u<��C�|K,Ox�f$�}p/E�v	���T����~I�W��S$����������q��~�2��1n��q��9T��AM��'����T����ald�,Z7o�}�?��<���_����,@pw/^�H)��m�hqmqww��"@�H��]�3�&���&���<<�����s�����;��m���3y���k�������y�a�BXD$&}���Z$�Q�Q*��oz@�dwa�R�����I=(��B|d�_I�����B������AtGT��B����	�8O��+��=�wZ�'.")�dr��*���(�����}O�wz��^����>��5��Cw[�z�""6�\��~����u�o
^Hv=
�
v������_�4��KO1���7
/(((�Y�����_�s��2�ZuZ��W� +S<�*���mG������p��Y_K�o^�6|5����1�~-sx���l������KZIa�7\HE^�����4l�\��ug�Ae
/�~{v���g]���'�a��_����{�5 F%��W��z�nU��QK����{.���%��q�/��~cp|G$�
�/sx�-�W������E�y�E$�)J������:����M� 
5^(��UZ
C��'HM�,W�B��p��Hd��
B��uf���oi�_�|K�)^`^��/��:��>CbR2�C1�_w���~���p�;z�j�r��{������BvV6:�n����j�n�&���t��rrr���	WoX�~�ojl��Z��5k��^H������0y����7k��	�-�c@��^�=>�#J0�2�]/��6F�^���������G����^.��r
�A������B������|�w
��J�>��..������'�������B|�����.��8�������/����8D�?���L���[kDl�
%c�
���9*Jff���Q� ��Z����"�����a�y��S��������]V!>�)!,C��y��(?�x��b�I���wu�Hq��a
�y_D����n���zM&�����[K�B��h������ y�����ch�r.�?>��;9;h�=
��R����Md����:U���{�`���Q6�p��s����0�vk(Q�D9z��!=3+_Q�������TAhL2��SU0�W�������V��� /��'��cD"Z�����?���3[��4��j���}#�S���n�M�p������-�Q��B�6Z��������^H���>�(������Lt����q�N^x&CCS���c���{}���A]]�^����x8�U���&�]vE"%)���s��A��t&�+/�]���q�p4�����}�Z<B��1r��"3x{[��##]��2[)/�������� ����q�3����_`&�t����`��
��1{�z���iM1e�]��c����fg���HN���1
HYA�>��p�9z���v
+@�b�l�S8T7��!�IhQ��7?���aa�A�|6f�{��G����,�4p���uy/JHQ��BVB,/��g�L(����c����Zz���)On#+)������u(��9#��T���v��p|)��2�����H�r���D(�YA�Y�>{�4OP#Pk���E�sQ����:��q�J3��y
]�[}hv�		���6
+@�I���3B��t����T�[�SV��W��ddF �6�!-	�
�C�j}$\���d�KMZ�' ������u��VP��J�q�B�)/��W
�*�p;?�u�sUS��[�Bq�m0F7���;������2�l�U�n_��%h�|x���O��U
t�U	j��Xz�	R�1�CN]��8l�W80��`�S^�C�����G�,�p���`�
Z�fxE����5`U�%]�����*��JU�C�>��"z}��!/I��2Wb	�@�&?B��m���s���Qu�s�����	D������������i�X�	��t���@�
�aj�������,j3�o��:��\S��o[rRW^PU����]_��W�i���:7q��"��WF����l�{}���V���j��v���hN ���n^���C�h��G�D�C���94��&�0�_�Z���cN��L���+��u���vu��}�{��[���(�h������+��KQ��0xAOU�;A����q��/�tl���$lu�D@|B�s_O.
��[��U�!�u�@�S��S�aN�W����F����k�e*�]r9�����O�M��?
\J�DMh������8{s'��tB�F}�F>c�Ch�G9�hP��f�t�>�(���?���mG�~�9�~cp��N����1[x]�����v�
[�*[�����p��������=4=�1w�x���������4�G�0�wn7��_�[���V![�L����p� +f��b��q,�2:O�1]�.�;���t��}������b�������s�z_:�������"����A�yF����w/�+�����J��z��y}�o�������P�0F���H	C������]@���������!3����b+�S�������7��lx�aI�hk�	F��8�C��v�����1�<@R:�6Wh�����$$����q}t����v�C���Z.R2�9���
����z�r������?cx���;�n&]�T�	�����b�� .-�-�o�[*�����}�����z��,�Jwn�^�-����=^&������������3��-x��"����C����#p��<���p��PST�!����%�>`I�U�}{"��1��x��������^W	�<V��;[4'��S���?`���?�	F�g�0���������7:V�NQ������0��gQCYd���+�0��s
w?������A?��{�0�hA�7��OO ������?{qq����"]_�T�������mkX:t�� ux�Y��� �u�A����lx�^�����1p�^�W��m�������CH�x�z}�#����\L�v4�������V��}�Dy���
Zu��������T�������_{$�M����[	xE������1������}���<|�����x�����M4�L�����L����M7�t����sM����b��s��;|�s��J<����#D�g@����*�?g�mH@{&�**c��0�����.�s;X���R�g��c�NzZ6z�������R���r��V�:?���A"��1����J�K���;<��@���#���9����I�e��?sM��;����U��������4\?�7���vC
z���k������;�z��q�	�,
E.�����*6*|�������7����H}��Wc8�;J*��(F
R^�_�W�Q3[p�4�S�W
���
G����P�2�����9%������i�&$�����P��l�h���x�_@�K�Qg�
���U=S����o�Bv<���i)��o��:���7�����;L�[��/O��n%{���
c��x~x��M��>����������(Ga�lU����==:��������uKF�>:�'������<`�]��s��r/\�:	��������������4jY��}��8�����F3�.p��X���f��j�?�C�TIJ����s�0)M��	^X�a'W^�u��;���x�Vn���F������**������SZ�����F�����������fpn��������y�Wo�������fbd���|D�����+=�;^�A����J�z�P�!T��@q��������>���}3�~��H�}	/h�j`c�i�w:�l������O��/|[�QX|���%�G�Oiz���7^��=_����#��[�t��$w�T����a8a�����
46@���������_h^��j
���x���Z#,�N-������n��^�'���ez�3��@S�V�����m�� �<7��N��7W(�CD��B�V���}=�E���^�����E���q��bTI�����~��
��
���650���?�@0-j2xa�}K\	x�*������H�/h�+a�g�Z�Z��[ f���Knx�6{����U�ac������Hu�V�z�����
������&t���{��w��8r�K����W��*�n����)sL�cs8��e]tT&�t����{�����
p�D�b3���.��A�f�*�~��������M*���TKC���&�M@��9/2hZ��d���D���g���9�x�����i�V�0��������pzyxhO$3���a�3PO�
�4�b�
/��o�F�L��~tl\�_�a��
�����QQ�w�����r��?��	��U����8��x�F-���WWU��g!`i%������3�2/k��������P��.23�s�M����Su��]-�Z�3	b���.M*����%�b����i���i>����j-z ��Tj5D������TdEG ��-hv�cK�c������c$-E!��h�����NO���
2c"h���C:�� v�Jh��������}�bAqGQ�B���P2���Q%d'DA^��:} ���	�P�k��[{�D}
E��;�h:��Y��P'���K��V�3��!�m�_�'=:�=��vZ�!�&E�JH��
9��31��>�,7�}a����[b����d����d�2����v>x�������D$�`l���p�z��Bp\\��qx����������0r�M�v������3�P��Ii���[�s{�BL��*�����*�;�#-���;�kpn5��� 8�
=���#ahlM�Z5�yy��.<���6�$px���Q��o��~��_`S�'^zC�N����.�m<��7�oC$�mc���(�[O���xpk
r��1p;*TnBm��kQ �u-��`�;�"u���=d/N�
3KGT�n�����A��#/������h��g<{��
G��u7Z�4��4�Q�6`+���M`�����}��B�����D@^(z�����������E�B�Fr�	��)M�}T���?'5�7|`>�=,�S�����c��������gs�15�_����b\{�����c���H%@R�Cx�-������`�k���xt����{N�@t\w��]�~G�&F�����^���4�����Y�1}Et"����#`�%�������m}G�+^���C����'g0y�J����	����a�L��
|`P�u�:HJ���G�����`��>b-��1	Fz���,�k,�9�#�M��/''�w�b��e�p���}��r�X?�Sq����6�������q�	��O���^��uc}4�k�-W��p��;��p����->�����G����%��E������zGV���EP�R����8�/B��B��3����w+w 5<
U����+Y�^��2���GPb��p���X���amJa����@���{0�n�x������P���BS�V�5���.��������-�w�z���U�?^�������A,�;5I-�J�*�Y��F�?��Z_���a
�9�a
6{�����a��M���7��=��0T7�|�iX�b=�?Lpl�rx!65��0{�o)�>T��6�%MWa����o�JZ��I��i��!������h\@EQ�s��m���r��J�
�"��1=r�pD������ IDATFj9���7��RE�QP_-	�X��S��%8*���5��xYqSK�����Gl�����i`�d���Y�CM�o]v�N�%x}}#��]��X��zT�C��!��}��������M~�E� ��R�>��~�����/8���2��+�B��z������zq����{x;u�,��sKQ��|<�7����/Q�j!=5g�4h)?,.x�-��������S�����+��?���������KGb���&�ff��W
_�g���Y���)��4l���>�!��&h�V'wE��A��Q=����<%�;Rr�}!	�Y@) N����	v��n���6*VU�PYd;#��xz.�?���Dr��� =�[��$������8���7�~d�>�	W����7���4��i)���Om0x���]X���`+�L����)]F[U\>�Z
���Iys�A �Q0�c�/����S�/h���"��].�!�����0#_�n���r��\x�-p�b���P)D��/�IWH����m��a��c��3DH|,��O�V�`l�����:�h������-?A��:*5�Gs!.����d����77sx���<�:��@ps��C�Z"��=4���V
���=��f(�-m�M&��W���S��a�j��ph�������(Rv�(^h9HA��FsH��9�G����Sq�6�whH���Y_]�:��t^�Ed�=�'Q�������bl���
�����_�3I�8���~C�z#�C��g���O�R
���Q)��/�#Y�	^8y�jZW��[�1a� l�y#��_{�a���m��I?�>>���A�HHLB}G;J+a����OrU�9�s�����lV������v��;����.^�id��K��^����o�-^��6�w�f��U=�;����t���+����^�5����i�O�����m����X)����B|����x!��_�Lq!��u���f��P�g�'N�`���=����j#���(�{)_��P��b�>����7M0�;B>=���FD��6���"�),x�Z����U����(�6�d�K&zY�:_J	Y���k���;�c����#j:��	�s��'���D���q���f����7��k�8���+/��G�A��m�1>��UUR�����@�"Wn��Jb��&���W���Pj�7A��:-
^���G�:k#<,�Tb���Tfc��0�w0�a�"Wrx���x�^�v*U�����4�E;E�R���!|^}z�2�W3��N*V>�^��4��vEgq5eey?�����sK���%U�d�REKA��]:��jW����^"�������ES��1��������7����/���m�z��x�S8�N`4$(�����������<��YqH���P���������]@��U���`P���o������M1r�M��Y��^��<���`�6l�
U	6X�a�������Po�5���>��Z��^H&�^����� ��Pk�Iw��H"���#� ��h�,R??/T���D�.�c������j�H���=f���*����C�����\�)�T��Bvr<��uA�]*ki�N�N,��������H�{$\���wO���j�bT��0x��D�Y�CtWEhmmRW8��6
l��G��SiYD@����s�T^8����l�S��E�
��`W���H��4T��1�����./+���W��5ju���
x�8��^=;������k5��)��� ���L�����=7mK%���Z�;2����J
<�{��3p��$�|r�$M-S���vI~�Y�&�\0�WmP E��0��������m�t|*��\����D
�.^h�e1)&��m|���A������2\8:�����J�\���j������r��ymu��%���c����b}R��J��~T^/�s����~���NA��=�u+��i�4������y/^��U��v��6������"<�:��O���<����"��n��B{N����z8{k�M9�_6%u�O@��V�zBfV�.�=_RcY:� WH�U�	-�$%Rj�������R���������A��e�0|~����!>1��>����������}�a����s6�Hq�N��x�}�C���+?�@eea����[��S�+9@���s��N�6�N@$�>/Sd����^o\����6F� o���^�{e�+�^8ri#�#���u����i_*/����Z������
�3���7
�������Hz�u�Pc�8<����Pg�
x��G
8��n))������L�}����[�RA�|o&�7Z
e��#53��m"U�i��������,��p��"-�����|��~�!�Q�(G���n�E"��-!5+,�O�4�ZnI�H�H�����}/���T����T�r�o������hP� $�JCgRn��r'��q�{��,w]�1�'�pyz�,��@�a|�qn����.��Fn[��;y��������tj�
zW��o�]�zT���1'���*CFv�r�����T�H��s�^�v*���mSkTk:�Q����0�I
jj����0
�����v��u�N���8��;� ��'�Me7s���u`a�	*t�bJ
��~���+��<��\LBB�~����9�7t����l�M������0���`X�O84Q��
R~XY&�SRhG`�����P�v��k��)���m�����g�GI����3x��f<����e
	�k�pu
my����J�Lp��'�����H�I�l��E�f���3Em%��?�?*o��#-��<OF�ZjxG���~�!W~00Q���)/$px!7�B
{UT��B���N�:��i�A�~�3	BH�7^���/���C�:9�s�`�ch`:f�����(*����:�]�aIm�9����Q�?���!u%y���j����^��q{�M��@p������%�p�L�	���T���8�QZGA����)��s���(l{�B���������P��H�T�����\
���t���	C���9����y���nB�� >�����6�^�:���5:�'�A�C.+�����x��)����:�0�>��<���9���t$��%5m������."��0xA��&(�<�s8L�AMSO	h8�T�~��0���f:��we^�
��#����C0�6G�:C���.)���M�����L&�L�~'E$�Q=U|9^(�G�*!�����bI�n��}p���LH"�%tj�,?���
�BO�/8v�$K�0�_7JaHj
��*�Y��?�222�a�L;�-������o�-^h��������j�5���EK�}	/�j����:����RDL=����(���ok�	��_w����)M���&�9��Kx!�T���I6]���`��<x!��K��B#'�_��6$y���s�/�9�Cs*IgS*�?�r�y`A�Z�I*3����u�����v!O��?K�%�O;f�5�L�M��:��[iwk��W�
I|��gvd/<��
��4��Z����&����q8��SIy�.�2T����(GA��	)&8T��u� l����?���l9��: {����U������:�	^`{�������&v����/1��f�x��v���
����*o�Tkz����
�i'Q.�0�Tr�������D�������z(Hya�|S�&IX�:�OIT*)/<��Sm:jS[q�J���wF����0!���'cI;K����&�P�6����1RHM!0<�k�SE�	���0��5O����>����j����RyACM��b��^����k�%��=�����XMR�`i&�pr�RU���`h��vT(����<��4��))�r���l�G)!^�
@�����<i���70C��]�:�������BVZ*��VI���k�����3b.�����R^ ����H(W�-�iB�����`X`Y���\��_$�������ns�@`@�.���2�_*/��.���`�+� ��Q�7����@)(Riw���%�P���m3$�t��R�|gm/nP����V�xE/����%�Iy��=����ce\}���j`��g|)/��?���.�V\u�+I�g����������Y�R��/h���	)���D��L�`_�g�Bd�7��$��<
�&��`p���O��_ya<���B��?���9\y����
�����9�t���b�����xz�?
lsJ6]O��^8{h,��F
#x���p�X:v���5)E�>��������x��d���;))�=<���4�ZL&��\��)6�p;������J�������A���q��R�GD���Jj1.<��y����?��=S�"�!�~g��Di������BhB"~o�?^�*Sx��!0��&�k�m���y�������)/�ZJ�f��A���(��"����V�9�+{�m��<���w�Iya8WSh���}0}���3?����<0���gV"4�#���R�	��R�'�v�n�`�v��������O������TH��-3����w�q��tM�H;6?��G��]ZE*��\�!^`����'0��><��]���RS����/�wb���"]_�+�%�P��R����U#k`��O�M
�U�PqT|�v���F��k�;��������;�F�������u%�N��B�j�a��_��g���y���'���SD���>������K��>W^�TwO�0��|���������%R^hY�N�9����J������p	WD�&fH�H��"r�s���~gI�a4T
1��T��|]^��D�D���s[�������#���H��;
�WR���g�����*K����V�tZ��1�R�`�L�!^`m�/m��K��g��M�7�����[,{����=��C'J����>��/|��.����
/Ti<��sX �T�����:�����&�$D�R������M���?�
R^h:z)0�DGR�#�,��*;��3RS0�i��p_�����G�����r���76S��@j��o|�^�2�F�C�0\D�����oe/05��[`�T�R���
�����~F
h-�����cGA�~5���!���s���v�;�����Q����0���5�D���x`@�����R�s����\!^0���e��\�`(��"%�f���r1���`�B7��Y�'Rc�������fO]�~?��������%Oy��&�Fe�Sw���1��X*f��(�����2��������*��"�)/l�5������=��T����I�"w,��^���))���������CD^*�\��Q��
�\MJz�7��f��i�����@A��`���������yh n�{]����}z&`����2���;��	Z��a�l O�`Z�
�C��F��x�v�KyAE��R����t���c )/�%��!\uA�64(R*)�fB��
OU�	��9���}n�g�eq+^��\�(�%�m�h��`R(����s���D���4'_��s#J�r��q���������}_u���HY���\x�/J
���U���smImS�C�D��hexA4?���H����^�{�Q}�GFc��U�y�8XU0����qC��C	�O]B���<m����3/�m���&*u��X��z,��#��T45�r�9��>[��o��2��`i+�M�Dc���d1e�;6��[�C'�����sg6����1g/�_�����C;�����=��/�%z�_�u��a=�~��������/|[s��-V
�����!>��^�����BFDb�Px:Tj�Cu]�<x!� b���+XB�sGD�;��{�I���������}�P�/h�_�-
���@7����(�h����|WYt8�����e�f�z���S���r�n����.�d���hw7�/D��@ ����`���M���c^����w"�6"8)��	98P���U����
^.�NM"ihL�����C�Q�#>�'���GR�������� x�-Z�:�.�U�D�L)an��/� E�V��E	�[~���[�w�;9-gk�����.$UL����xS���Q:�L�#�]�}P�L�	ihV�^X�~�;�bA_E)/���C��.%��y�r�v���/T�RF�����@=��dJ	LI�^`9;�������x����^�%�N�@��}H/���/�B�e��4��bbY�����*X�N�o���=��a���L���.>v������]�7��� �����Q����#�P\�T
����?���Azfv�y��u,���>N/������������U�"J%��bT�TCIq�[S+�u��"�e,���
i��2��qVs_t���C��<����O1��}>xa4��`p������2�IO��w�����2)5D�U�6�W�D�
R_�U^`���
q<��z��H�t��Gp�^8���YI�����8�JBA���N�Ck�d��|�4O�h���/�2�"��+��P�uzL�kPj
y5�|}.
^H%���"��W�3���HU!��f��(���
��N{���D��xd�B�������)�|
��fi!��M���=f"��6�NB�&M�o��*).d�u��Po���S����ha��aY�	y���Ga����6��T,���OQ��Q�`k��QMl�w����D[�q\I�^`����T�R��m`�G���i\���3��X
tBy��`��W���OK���~�����_������b���O��KIYaV�`]�*Uk�����uH�������`�,%��Ae����U��\Ii��yO��t����|A���I��ZN&�a.�5����k`dbK�Bn���Jhj��S^`�L,j�t� �I��-(���j`��	R����L�AW�2��D?s�{s��^\�1����Z<���+Kh#�&���7�����pj6�T!>r�������l�Lu��YtN0h�����������J����]g<�t�l;����?J
�R��w���M����tJ1�v��	���<WO����(Ly�LS������a8��;^�^��YRS����_�`Xm;�|'�����8�L��{��|q���j���+���.Sx��S�0������P`��>��s�R�A�FV4���'����=J
�����{g��iGhwlO��A��L�`P��H U���np}v�_��Rh�0�7D����m��=����9�2�?�������vr��c2&~���?�T�t��x=���q��n�%�b
W��dN������=Xz���`j�/?�_�c�N^�������k	��A+����Ox�)����H�kXq������
f���������;!���2v^���V�}3�����s����J?
�N����V��Z�5Py����<����0����AH���I���NF�'����L��M�k�0�q
��������R/`�	K�(�>~�U�����*�L������b�p]D��[M�35�
����c-H#
UH!��;�IM���@�����R*
M(l������E����&�f
������!�]
�8�/��p���P�W������k��)��Y���i�+.����=)U�-�����,�W-emx���B�T�7�/0��a�������;�9�=��S��:�k�^X�hW{���:�P\��VE���s�c��*?�N|����a��JL�7���sx���Sc�~�����/��\��������5�S2����.���3����cN�<-F������A���|���v��(��oSYx��O���_i0E��`�i&	�������x�VFP*��B�*bC|`�r��'����%�����m��%uG�����9��a�c� IDATT��Bu���#_��t~����8n+��umU8����S�/�4(�/XVV�g6~[�R/���?S `)������k�H�u�|���y`���t/�!�/�w��4I�-3#��=Db���p`J1t�L����Y��^�l}	/�vY*���X����5�``���9�n�0l�1=K�����Fp�����!�SL0P���2�6�����R��%������H����`�k�6tBi���}�B�����IeBU�lJU��'�?�-�tS�����.��`��H'���D_R��O��Z\m�=�0��:���;#O�WR���o�>#
H�Ai����ge��I

l�L1��a�� ��#�5A-S�G�������ruD''�I�j8����N�1���|M/�X�V��\�$����=�����]�94`�~�7���f���7����:CG2�(���w.�5D�~��D@#K���u��}+~_�ub9t�Y_YCAn�Q���p�46��@��a
-/O����%!��k���Q���x�#G����0x���*����G
]�<x����&����-�+	�6T@D@:>��9����!8�JU<����=��������=H�*��-�d
|B(U�?����q�c/�'hi�
�,`����S��
R�B����u��S�$=�>����R\K"���O3c�B�9 �v��8;�-�?6�?a��st��]-�GN_����[;���J7���jE9�t�������+��Ap���.t����]������� �t�����q�UP���l���.���br�����������^�O�����x!�C_����$��/����V�0xAV�,,m����nQ���������B���ca��86J�lQ�Bi�E��
�$�+������Gi��<mDI�V$�#�v�+)��C�?x����(^�F_������`�����G�v{28a��C�
1��}|	/��������)�NI�i����}����}H�H���
R2�y���MV��T����Wq;V� ��o�����ou�_������)=��W�s@���i#�m���$����>�z=M���I�h
�%i�0x�$���:�������Y�-����/H���Z^��P^����^�m��J��WR�B|$��l����%�^��#�93B�$=3>������������/�m$x�l�/N�����j�v�!P���/����}q�PjexA��������q��b��~|�#7H��"Z�U����D���7�(UL
�|��z�N2�4�*n�x����F����<z�J��pi(4�e
/�{>IR^����/H2�D�+,�����*�-�G��j��~������-�	���|���I=(��B|d�_I��B�xA�����/���/Hon}-�x�l#!�e����= ���(�� ����^���0���x��(
���g���8.�7����%�����U�Z< ��
��X)[�Jj]����m}!>������[|x!gF���g�������� ����X�����/�������/3�0��07��xA���<.c����(�����b��},I�R|xA�Hu���`�FYiy�\2��cV3��g�:"�_�u��M����..�
��-�	�).�e�����q��)�Ce��/����K�ee�4m�v"3M������PRR�i��m\S��J���&�_�e1���Z;��F�/���\C��f��+�2����N��{�����)^P��1����U���������L��322 //����P�S@VF����~J2#�x�����$~�V����S���B�����7�w@�
��x�,��-Y[�=�1�)��,�my�Kc<2H!F��x�s;�F�[a<�"M$r��\":�:(���*[�����O9�Y���S����{a<%�N��~�D=-�j~��IU�_�S�|��!$�����d�s?���H�*��#��%G��uI����	;�;_��K2���di���2����
xV�d<�
DM_����d��i��9PO�L#��/������r0x��C������b),V~US�_��#��4= ������m	���>+�B|J����%�G|��f�����hjjBUU�4](�������R1,�G*n��!>2s�������
mm��,wPL�x�tX)�S��9!>b:�������m�xJq���)!>%pZ)V�S����)^(;�-���HX���%�.�GR�����WR��->�iq��V��3\��������Z�#�eW_X���o�aY��4�(;B|d�[iX.O�+�1#dgC���|+
�B|��E��(O�+e7O�aY��4�(;B|d�[iX���#���S6����`C��=����6�d����SRR8-���_�O|Ke_�I"EFF�����;#����ehB���+�B|��D����a���e����S"��Z%!>���5$��Dn+�J���PWW���J��'�F��������#��d][���=\r�			�2S�)�0��;�B|������|+O����S�g��m	��g�YC�Oiz;[��B��^h�+���� ������xd;_$�.�GR�����WR��NkI=(��B|d�_I�������_��S�v&���������I=(��B|d�_I�������x$�
��+�G�>��!>�xO�u�����xB�(^*�2B|�����,�G/���/�����r�^�m��J��WR�B|$��l����%�^��S��Xl��H:�e[_��l�+�u!>�zPv���J��V���H����!�Gv�����a�R3Bv6�������,�G^����a�Rv�D���H����!�Gv����o)>� ��6��xA�a-o�{�xd;_$�.�GR�����WR��b���m}!>�������H�A��/O�)O�{,��xd;�%�.�GR�����W��iq��A�$�A�u������� �G�������'�'������+#���|/J�B|D��l���l�*X-`��_�	�c3Ke4�Jr�M������RX�,�iU�F����u�RQ�O�����������=���'��c��9/��Pq��R%��!]�o�[1==JJJ��+�Y��+�Y"7���G���SP��h��@Hv���KT^�7�<��.���x~5\�4��+������1� G�e��*���~H"�����J�h!����fH����T����a<��iHP�#��}
���@��O���e��f3��y���<�����V
�`P��c���S��PE����o������W�#/����%	�Du���[�5����>����V����T�V�l�����1��b��k-,�����n��~/����UB������������(�>�FE�G^��J�"���d"�c�,�_��HN�����9��S��&����gr����.Y�j�R���t����z���4^(�y ��x���� 8���e9�:��H�~K���Hy[��S\���{!>e���Z�S������.��m�o���I<q1+��=,���P��.v�5sxF����V!��o)IwQ�k���1l����������P�r�"RYQ
��8��dQJ~�e�3����/6�5*�HTX+-s�n��-�&��z�B��y �<
qJ����.��d����e�'�GH;y_���e�;A^��,� �-x@Bd��o��6J^�V��8�f/��>����"V��TaeU�8����3�~Gd�\���k��*Wh>}-�nM�D�������PR��7A���.z_�������?�ZG^�TA�?��������hp����7�zN�00���b�-�/
���z���xA�.+e�_I�������/�G����zy�OI�%�����t<�P���B�~���}T�%x���BY�P������[J���WQ�xAz�,��x��</�vxAf���a^��E�!����[)%��P�\-W��S��	�@�v�����\��K�BYY	�o�����zt(�'o|����}��L����?N���������o+"2g.����F�O�e�����8Nu~�1:����_{�"9%�	�7�?�u������� �����=a<��/�Z�#�e[_��l�+���.�K�����t<�^8�d=���E���UI�K�J�2n����PE|J�TR��W���O���^zXx��;9&u���x�$�l�V��I4]x!�}U{i��r*u�D��d$�[�	z��P���o^h�f?��Fq��|��hq�e/\�}	5�=������v,�+��_�z]��Bu}c������9L�����$]��%w/bA��%��5T�����xl��e�c��=���R4����i}�N�X���;���
���5�n�!V?
*�-��{���+h��p���I,_�������x:��X��*\�Bx|0��\��^e$����mO�����:����J�����q����rK�.����ph�j�����pI��.�%>F���u�"����*m<
2�G���������;��$�=dY+/hj��F���:���'��U��+*Wo�~qT<��S�f�$#�����O5�	w��H�s�����v����xT+�9.m����3��j o�v�Ib�(��=d''@�^�k=�M~�����n8/�B��W��rU����Ux��I
�5�������l4l�&����H@���0�(Y���������uD��&����U��i#��#Tw�}�SF�Bya���8�	~�36�+VL�������\�!V�����:�Y����3�����O�����i�k�����bN���th�X]����������S#
�b�Z���
^HJN���G0���`��:o9���G{T�T�l��I/$S��n����.�5���k������i�����""901��.�������	�FPH8�]��1C)7�p(�� ��!,V����Z�#�e[_��l�+�����.�K�GY�/�x������O��_�E��NU;�\O��
_�6�0��6�����M��^�j����J��L��	������}��s8�C� �����&�x�w���~�����o�^x�� |g[����p�06t�_���V�����
/L����!Q�*mx���$����j���1�V�yeE�^�����������%���6�����2����k��5�t������I
S���/*�d,K�O��.����2�#ExAQ	���#���"����;�A	r���2�����b���0�����$�t$���a;���
/��EF�����
x!��fhv9��8��
/�<�n}5��Y�^�{~9w��'�75�B�juQ��>A���
x�����m�tdd��ZT�sHZ��C�Z�[��_\��d�X��CCCQB���)W�����a��1x��������c��=���@��c��s�PW#�-��GN_Fxd�'�F��M��Vm��������N�mRN,�L�z���;x}Sc���:_�Y�����������/�V���0������A!�����f������y�(x���l**��{���kcM�k�����*����
�dN�$ �v��r�RN�_�Y�[��7����'�������B|�����.��8���%]�/�^�zI�S��9���8�#��Gv\b���ZZC���L������H^vn�Z�V����=2�����H7��9�7!Oy�~
g���]�NER���p��B�10�������:Vm���4�i�g�6!5#��kT�t��p�m#��+`��<\���������i��J
E����`_!g��I����2��R���ip��^
4�2��|�w�4h���Z���M��fZP�{'
9<��W�'�>�5#e�c�CRZ6F4���i7��'�`�KOGcZg]�����4�}�����u�I�#������&�S�Q�@+��p����4p�E������HK���eE=
��	����Y�)P�S���F�\v�r��C�O=��C��Px���>MD����*�\��u�H����

8��
�����{�����/��(��kq���M��k�[��q��Q*z�uMA*��b;�M�
y���Wi����e�{*�(��jr��NC��d�����*(o��!��[�ONl�B3��j"�������9B~gsb[��&�(�Aw����!:�}Euy���,��T^`�I�xY�	P���z���s5��t���R���n�D>��
��E��rP�D����xZM[����.�ux��Jt����F/�6���;����2�rk	��h�p<^��_��m������2z�}s!2�S�L;���0/x�������S���^�>���wE����(���8�����Q�M�S��h`^�+*�&�vX��ch�F�II����0�A+\�{�+~����EE�q��������D/�f4j3Mlx|1�������������5�[U�M+T��G�������0��&P`�k�w�����tU�����&��7:���������G
��b����"$13��2����� Q�q��#*9<��j�e�	`���M����m0U���h,j�
�^�"4!������.vx���z�8��I�r�N>I�}����]���*^��w7[�' .)��m0��`����R��������v�0�W�c�T$�f���*fo�FU3EDdr%[��J�?�{
�r��K��8���m���+E���}Ml��vN��M�����������q�y
���&z
I�,�?����D��+�/$�������D������y�@OS�b����D�F~�������(<;���se���*:v�����e������i�%��s���f��X���i'�F���>P��@Jh,��r
LUA�B�G\����vv`?b^��!�C$L�����x���	�y���\�!��{XOnmkSdef�m�A^���5���a�x�	W^x��"�}���aL�2�����T��FrP������Ty�;��=?Hs"}���{}��6�:��<�v��\?�u+�����-�����������
5%u()(ct�����cO�#���:�����+p�pY�dy@�q���Ly���k��_�*5!a-22�I��:�����'�6����&�a�k������L����+/�|���$4�����jd� �C���P����u8$6�+
i4��H�����z��V-`�m�����L�"���+� ���T8Wm��|��i���O�l�n;�gLm��Y]��j���@O��
���>��1~t~)`l����@��UdB6�Z�*F6�H!?��6��|>��y�7W�u�jY���8�z�G����8>D��>������B���O����|X��3ZYw��S1��8��a���l�����������#wLh��XsR����4v��t�k� +6�����*��� ��@���}��<�OoBVD��!G��?�&r7
�b��@��'����s����:��g2i.~y������<~O���:�\���*��|���s��d*����
�x�F�}E�v�q��hh��U������
u=�\��
j�)!����s�<��@U���h����x|o-M��}�w���n�N���AS��~�DX�����l��.���"6vw�c��:���9:::vww'"�(�"�H��t7��7�������>�{v���������E'��B��S
Mc�q?
/��(*�����t?����5���:�y]���/f-|
zF�l�#f�^H���{c�N�s��(C�����C���J�TG�S<R�iN{�a�������5S�������Rc"se;h"�lUj5�#|�\(h�A�Y?�?u@S� hv��R[P�%�k�,��j(�!��+���J��u����(��z��Hxq�^��h��B�Go�� ���$���l7��� 5"���F���u��4R�J��j�VP���O���r�������Rc��T�
��3���/(�T��7`| IDATh0��~��m=3C��h�d��nCcz^6��#�v_��S4(r�1��w2��8����E�����xZ�*�k��'cx9CcE4k-BlL*����Cw
�x�@�B"��7�����5����.� �~�4��re\>CN�4�w��WW��r��'	06U�U
e\�����NjJh�R���4gH��O�R���&���8s4��I9|J���ZRQ^x��4�|2�54�8|���Y�Z�A�
vp�������uG�Wj����������a��bi�1<��_���59y)/�����VASKaa�g�L,\z	�aA8rh)Z�-�}�N����w�8����}�<m7��mml�0��[�1l�2z�����N�\�r5���T��s�~�~Cip���� ���;�MG��``h�Zo�8C�/��j���6���>��v�������~��{�)/h������k6~���mE�:x���q7���������8~t��^����g�	^0������(���/�����89f?��HYa�=�B������O{�d��v<<���y�jx}����>��C��x,�2���p
x�
7���T'�����[�i��
6�5��BP�'�5��3K�Kv�_���s���l>f�����v=!lD~�����r$'�����vs��=G�``�N�u����r�.L?�����U����P��������Z7k�L�����13A��6X�� &�:����-�8H�d�V�Y)�o����O��+7Q��U-+�7�����y��z�b��H��$�6�-lEx�������.�����"L��#�o,�dV^����|���O�a~��%m���_�6�����'7x�h�"�LY
%S��"���/���0���7�F@T9�TQZK�E9q� 0� $�=���9	�2�(od�M��cL����"�`k��T����H�*�/�0oC��<��!��#SyA�^:��J
,���I�;�7�/����u�0�Q@XL*�K��?�4c(���1�I�����R���e$sx��m�%cA],8�U�p�M<Xh	���,���^	�W_��7���J��&�M���4q�5�����Z�u+#�iq@ap#
^�B)%^��7	��Q;nD��������FI	b��H4�>*R�N\��r��b��	:S� ��/T��C����;��U���f�G�R����@��5_��k6EC��Xvr=:��5B/�/�=����#!91�!�/X������* 1"
��]��D��4�Z���$�C�m��K�D�!�)���Jy}�9��BA�W����0���[99���4�^���?����.	1�"/�5�zk���8$S;���'�Q��^��@��J$ �_<z�x!>1�wBc�$�v�rUD�]����N���w����\�`dJ/����e^����&��Z�����_>�N��u+.�C/&�^���wV�"9��B����`�bn9��N�FMl�<�_W�{:0�1��3E`�A�?=��/���tX ���c�d��������	�k�#��!q1����@�y�A�N��._�(�p������44Q��,�>Q^�" ��eM��m���F�Xb0����b�������.�}	}5u�� �������������w���D��n�?��sl4������vT�L��F��9���
����y?6?��M;��RR3@u�R�Kek�&��=�
�5��s F�Xh���
2���JF�
���`�Bs�j�2�J�k�[�6t����]��F�0��9���'n�yrB�^�K���bH�x9�~�?H�	�oXM�)�K#��ZY%���K!8�`�`�2�U��b4��P'�k&���� ��/05'����Q��sQ��PD�B�
"������X��k��Ky`p+u�(b��p,�KC"|	v`��?���wSu���BD�`�IZ;-4`�-����=�����D��W��B$9:����|:�����d�>s�>z:#��9,�
G���Uo�������U����u���F�Qyh��`������z[�����0�h���P}Ng|���.>htt��������l��g��zq��}	)1	hrr<�
�U#-XMi�g���L���;�6+������_)��x����~��	^�y%�Zv�>�ht���zJ�[B��)�6e�F�����A����

c�d0��_p�8OH�����Qk�c�����n��rx!$��
X8����g��z)�x���WD`P��k�G���p_x��9y��1��������4,�<S�,����do��]JNY�R5q��y#����C��7�����k������k=��tXGN�8�|?:�����QM��}%����������x�{�C���q����%2�`�b�A'�!v���k����.��^��]{}9!V���A�(d���M�b`":���	��p��f0(����mN���e����0���K�����b��I_��7j?Sy�y��,x���Z.���Q���l�4��k3y���9b��)���Z��6|1��
~�Z������^���p�R�l�%�fHv�	������R��Cc�z������ ob���P�=��������s^}�	^x�n���CRpu��in�E��f��������Q�|r���#u&/N��:V�{���@�}��S���;���~�?p��T~��A������c'.����������gP�TgQ��7�����T��kSXRO��?�����i���H�bX���}��/���h|���3��yw�2x���B�~�l[�9�^��}d�g
���Eh����^�r�������(=X�����"�_�wF��W�A����D�'H	 x�i_$�y�j�	^��s���.`��Q(�A��M��<�Q!��J�D{�����<*��N��g�m8�;t1������H�������K��S�	|��;�I�>��,4	Z��y���D��Rv����)bvS����~�Y�dr'Q_���� _C(�3X��� �)��o� o�M����J��������Htx��.7\ �!#�_^)/x��������D���� �%<<
M	 xD�2��5	��v1-���I��Y*TV��B�e�����Q4�M�M07s�3(���\������l)@�>L G����xF�7��1�a�&�}��6v��������D�KMY:>��UWvD�)?H#l�������D�����!B�<�5����`�dD�������F���%�k��i��^(W�9��������0x}~S�u=/xA��Sf��_{�~�.x�|������Q��vm��&�}������c&l��u��T�F�����UX~I��Q��ps��!���;`���8vx"">�g���wG�r5`nn�5��C��}����u�$�fSY'�5��������?��x�������`W�������X�^�u�0��{�����.c��.��,�ACa�?���[f����VMQ�|]�su=�������8=��oA@�9�s�b���@�����A�X�g)&�Smc,�:#�M����E�_ys������!���������u��Z�2�I%����%�{���H �R��^pp�
s��0�}utt����}�/�o�/���H����v�>������b��n���&l�����1q��wOR9����8��|Y3/�:x��*����o���Y�@hX�g��SY��6������p:q�F
�&�?������6�����U�Xt����������I�Hv�Z�~��V����x���(��0?Ei��:������U���/(U����nH�B�:�C�`�Sn��gh��AiM5�S$�_9�����p��Q�S�V�����<������Y����/G�D����B�zSx��+/�2z�&8����������q��i���A4V�
+��n���������\KDp�"<�E]RN�P��5�S��E+/F�����4���9��{z������9�0�39�H!��D���B'��R�������W������� �M�P�L�a��b�41��9��Rc�O�Z�E���Uj�)���C�SX�w'�(��9A�Ly���e�II�<��8�$N\!����}����N4�%u��]v	�v@Zb
�l�4}
/0����P�\5l����>�����y��a�rk'7xA����7!�N(�;��|�����>J�vF �?n@�|(�i��B�ZB�����
	Z�0��%�5SjP&��("��nkM���
,?Sc����	2a^eyR�xw6�����(�kOmRu�$�B��5���$����1�,��R������/������}����8U�<y+/�9*������zs��m��3����JQx�gt�83�2��9^��a�d�GN��s`Z�.���	��P��h��`lj�S���}�
�JN�4rN$�/0%�����D^�a5�9����S]���>���P�$�i�s��AJ��F���w�Q��6��}=�A��0%��W!AJ�
�i
�9<����v�H�����~��S��P�!a��<����6�M���
�&�Xp���i�U"|"B�������w1�I���#�#Wr`�+s��S�3��yq�7����Jm��Lx����Q�/�`��**�"�t�S�xT{��H�-�2����D�J�(H�^`u2h�I�����5U��Bk������cQl�L����y%c��f)3lD}���H,��K.q@`�����]����:P�S�,������������&n����)$Sf0����^�@'�������#0w�C�vf�'��i�����p>^�,s�Fj�SF
z�H�r���/o���z��v��G����LD�_���1"���rS����}�Sy�2����=j#���|����� �]0�lp�#kX
�J�>�+��y��6�Aov���y�vXnH�	��q��k ��B���e�Lt���D���������NC����jI�:^%��\Xx���y�����a����=��1���)X[�*=�2s��4�#��
^`*Z`u0�?\zq�+��S�����i���?31X���Ct�9�g]�������CEF7�M�x8�L�|Y��x���	z���I��>=����2�	����i!������+�����(\~y>!o��Zo��Lx!�l��Ts������1�su)Gi���l�7���G>�p��5Reh����c�@�0o���z$�na���6v����/�{1qLi���g�:�91�&�����������FU�Z|�2m�^��`���&���cPo\V%���7��J5��\�-��n#��
W^Hr����P�����kSR�Z���?�R�n�/$x"��a(�CN����|���
^`k�F�!�7����p5�:
&��q�+��������W0p���=2�}Ef^��}���4�o_AP�����e��p8���j��%��c�����k�z��B���'`N�&�� M�^�[/������b�DU�~\}*��a�x
Xb�+��v]7�6�����^H�!WH��7�mU�N�-������_%!�N�u!��R�)	�h!Y�V</x!��s��'5�wP���f���?:��*����zBfJ��T�Y�j���B,�0hu�Hy_p�@T�3b�'r)	��W{�D�\�~���Hp��8RZP,SZ	��}�����@�t�;��nK
O�Z�)�!��:hRQ���N��H�F��;^�>�\"o��n���9
�Fv u%�m�H�P�i�2����h����yJto�/�\�j,< ��Yh��tZ�jp��r����}w�P4�'h�0������Q�B��Z�q\E��5������fsg���bhM'�i+5�g�p�!�������HC���8�7#'��|SH�<
�F4qto�wS�
�JN���@S�5
���]$�G��v78��������e����a���:����J5;@��G��E�%���"���/�
�������X���������L�!N_���e��(S�
W5`�B�A��a�(T�����z�pv#z��N �U�6�S�b��X�l�{��a��Rx��.Ws�Z�����#����.R�kM����g?L�}+����������	���&M{sxa���T�$Z)^`e�����V��ISw�2,�_|�@��b�,{�����d���������)��'F�E�-Ci_P���X�DP��n9[�[U$���f����Gf�)n�)W���=��j�Z���|t�0�����]����R�=��&���#�� I�/�������������H5�(��x!K�8x����C	��19�'o?@LLm0���e�/���^xO!��zvx�"
+1�Og
a@j
;�r�,�����D�
-&�6����`��,����^��x��t"��c2*��j/��L����m������/	�B~����da~���z+JkK�VI���:�%�\��(�xr�4�v���3u���B���_$7x��K_��^[�A:9b_���r���=N�I�^�����V�����S��Y��"}yH��|e�k�e��v��6P�6�4T"����Q�wr"%��m�^8dH^�B��"Rt�S����t�8^���S8h^M��$t����y����2����hbI���s��%u��T��5��F���j`��H��p���$�2��I�����9I���p�+��kc7�3t��.�bS�`�����Xs%�����NEVy!5,���R�U��I^�7{Dl��/�F��Ly!0��1��\��kx���-IY'�=�`�����
�P������*B�2t�����+�T�
�9<���1��K�$�T��r�������DR`��CG0�6������$U��C ���9N^�\e���]�����NB�H"@BI]^j�BZ�5��V��������}(bN���B��H|������
����h@'|�Hy���Ft"�:�7���&8]��V�b�;�X��I�n/�A�F(<�e�nxI��8r�}��@��S��L���<�.=v���ah��)/l�2�������'I^`j�K[�%���`EJ	�@�YR"PSRB��Uq��c�(k�O1��=����]I�`)�k����`�����S4�J!$��EY��=�����`���
 �X;	�&Z��2��Lx��.h���R����x�$��b�C60xa��[(����?W�Ih�og�]����C��R���u�,6���My���)���^Xz�2
aJaHX?��N`F
{1��$'�HQB����
��)��R&8 SH�8��^`@@��S]�H%IY�%/r���(����B?R@`
S{RHR^�\_�Sh�z	��O��T��B]z���N2�����:���L��C
U�5���t5��%OJ
X>\7+d��������\6
]HGy!��
��H'����6d�Q����dx�;L��7��/M��9��W^����6tm����+4<�O8��Zqx!����}6q�Qi:�Jp3\�����������L<���w��>)���&q��
�6E����g'|t|us}�Yw-C���.�@�I�
/��F`N��tJ�-���t~_�8G��Ul��vm���<�K_+/���J����JW
C�B�ru�0��F�r�����h���vc��<��*}�v��
���ZQ���x��"�f���b@�^�(fv�k��<c��;�%�����v��%��B����QN�2������`��`�&�H}��=�|���^`j=j�BJV&���IQ\E��Lc��:
c��B[����BU����m6�+/0P";�p�e#����4�I�g��;�}�>�S���T(���/7�q�6�,�S�`���1`#�I�c������c��U	f$g���gT�������
�Y;��.�Pr��G�h��[�K� IDATu#'x!��1�6����[�R�
�6k,3�/0���b)$G���9:+H`�
��yX�2�f�����2�����~"s_��N=w���0:1�
�Hy�)-�0J�:�FJ&:�V|Ha$>.U�kG����R�L!^xJ��iO�T ����~�!&�d�A>,�2o�\��z�����R�^`0g�D�u��E��l�,x!> aLya�&��RX:�q'�mT�Djr����#����m���+�RB&��BN������B��#$>�AjmxX�o�h���J�Um� b)/�����mR^H
	@*�>IO�GZL$���
���'84S�!������]_�Z�g �)8T���D���
��/@�eF(ISN��J�zto��P,P������Y��j��W����GP����^�p�L
��v�M�/����������@`@Bue8�I@�.|��(/4T��{	�K�*+�,KaQ2�����^E.wx]NW��{}���m
���a�+�c}���
��,d�5����$�(/�r9�j�z�	�0���i����n���HyAM�~��BY+{�r9��-����Jy��T�T�\.a����A�9�`N�B�v�yX~!���������,������H���{��z0��v7q�YNp�g^>�@ �075�����!��K����Q�=a2�f������dA+�F�F�q��:t�:�f8�Y�;7����+Rx�y�����x^Wzn��pkVe�$�/0!���A�>dWJ��,�+a)/��m�����7����w��JT�7�"=�B�:)0�s>��m�������_`I����	����F�**Y�")��#�qSvx���U�����>��h�v\���B�V.q�B
y7c	�����uj���X����A9sS/L3��w%=s��Ux������+O��o�u�`�����l=�N��0�
uQ�@C���/�>t
���e�r�������@^�B�:"��8����h�!9�Lx��^Z����,v���1<�rz�B�J��me^����x��^r%�Y)���^����S�(���(�(I[On������l]��t"|�6:e�Ewr�����!�"@/U�6�C��Of^pzua<�n����8�=���>�Tk4Wh�b;�^�g�y�O}����U�=��:��^�w�5
/���:��}��+18���F�r�����.v��d _4v`e��/X��U�:�|�����( 0,�B>d�g���b3*P_�Z��bh���xPK{M��$s5��/,$�����,_�;��0���o�7�kw���bS���jRy�Ka(6_����0��|��y|�����UW@#
_�T%��P��
v��&�o#�����N��"��G:9���$��/�x��Lx!��[zA@�x��I��I)t2��$c��%�
�)����P�X�����B:��d�L�2�����zu�0�Y/���������0&w�
�n�vz�*�My���Z������	��%Y�LxA��u��&�+��Gg���*�&U���x_/�r�
'��� z���<�����t��	#B���`N�
��H��!&����Dr�2P����D��&V���j���L��z���p7��/�}����o�F�������OJ�9��;�G���^`)��)�Q9RTu��$�G�#gs���P��	w��sXV;y��D^4��E/�T��X<��Z��F0x�����p�������19�n�	X����9�bHN\�N����$pC:]���5�J���	��P�H���2~��������$�"�ZB<�4$)��H$�KNIx�) �&�����[��U����(�,�����<�M�e����K^`���	���
�b���$�DSEu
���,�'p ��e!�����;05�HRg`*
ck���H��"4h�&�������P^�T���!�'���������Y��%/��q�	J	�������j����`a*t�!:����6l�L	���`�%X
Mr��E�bY�n�/0������X����P�<��A5r���
oo@��X����=��Bp�������|4��L'IX9����W2��p�B��H�T����u�^�oK�&�ei�������\��Yq<�$�)���ti ���o�r����i�IYa�c&����#QB���tO?�H�
��oG/�C������=����='���>��&{&�g��L^�I�UW#�}�L ��'�����������O�4�79csI9)/��/6���>�R�P�����X5/�n@bl8?uh�q*��]���6�2<B�:��u������Y^���n�����'��a?�q5HY!^0�Y����CT/��^�1��r�9���wZ��(D���
Fx��
�lLu���A���u�����I���zBa#:���C��9�BP\�Nu3���N�&���}f���-b�B�D��i'Ru�}
�Q9�L*,���t5{~0gy)��YN���(:�}���g�-��v
p�PK^x�{�C>`��$=��,�s�3����W���>�9�_o��rS\`J���������L�40�n|F��l�L����`�*F�q�6x��	�K��2�_��EyC+|��,�SU8�t7>��V��4�4�H{�$����d;S<`!%��]�TR:`�!X���X�#�����T^`
	L%����`X��a��UH$������k�^��N����.L��]�>�@�+�V����M�� E8�p�6���Ow~16������P,tGN�c��j��.
���B����Kya
��pEu:���J�|e��y�\��&�L63��l<.��p2��`)���E���|�ob����
���r�vP����<�?�*�"�����%5*�x� �5LB"�((XT��>�Ms��"���,��a_
[A E����A�mvM��{������pT�j
�|=R6��W�r;3��)����M[���@U5�q$X��
(�C4�a���z~���7�hJ�E���������Ma���r8\���.��C�'����M��_(/�0
��������Ys;^_
�g���D4k�:��W�9����&:�����G!��K:����i�^H"H/�0���UV�a[Q��*b��	����4�A�:��k��6����qOR�rN��8��/O�q�	�S�^H%�i��^^L��D���	/��b����f$__�mG ��Nhv�p�1x�)(h -.��F'�Y(	]c�R�	���HI�>�(<SyPo1�T�	�w�.D�����I��y�E����w�xA��L8��It���1���CQ���]��'��#��5I�Bg��E�}R��p������U�^!H��%��u������r�Qcz_����J��V�F�'Z�m�Q�Fr"�)�1[�Ky��u"�u���@�fj��e�q�����KO�#%3��$mH{�����_�w-����t��E�Q�������3X����p��Wa���')
�T^��`�s�cH����3U��"��jSX���{K��D�vo�p-x�'S��xh	�F�����Csk���	^�3n����5V�o�;>���BH����~�w�l�q���1(�R���/��&���Y��������W�F��x�����E�w�������"b���Pet
�����S�/�4d�h�"H
��wn�������3�	��0���A� �M��C���,�����0��L��A=zN�}��{���&44t���B�>u'�/��~g���!#�z������X���� �X_I)%�s<^;��0xA����p}���!ta��/�Mq��*�b���8rp)���I��H}��	�_�����	^`!�w���}c'�G3�V��N��O`r
f�Z��=�b���)/���/>��t1��l��BI������MJU���j3(�s���1�A
T�\�4p���
VH��l�YF��gn��z��X���^���4_k���HM�_8����tP^/_�@��S��,	�B�K#�B�����N_���e)�0��-�/�|>��	��D"�hkbh��8v��7�B��$�r��q��P��t�����
F
�-Sx���?������&��/5!	��y��0�/���EW��L.:[�%a~
b��+#�O��� -��_����LA����_�s��+'��_����������C���/���+�2_�����zn�B~�~��9�����!��dQ�8��,�-�:���(L�qtzQDo��:����\yB�)?xA��e���F��������W���F��������BQ�W��e�5���$�n'8���]t���K�)Lu9��6B���1>I�����q����L�6�A>L"(��r!�&��('x!�vs��+�#]�6B�~�/H\W!
�/���hN��,�� ����:s�������(�~I���a#�YwN��4�/������'��[�D��[�!X�dY@�d;���R��-l������-/��l�[��K����_X;��|A�#��^��n�����;�/�=� �
eJk]n �N?U"���$�=��� �%xA2{��[��oi8��*Ct����d#M�����~4xAz�5��xA�6��^��f?J	^(������u��x!w���l��/���B����� [3�4��0�����.�Oa-(���������������+���/lF~x�`��)^(�e_^�����/�~�����	^��xAV��C��gK�����/��e���� 3�J�b^����C������KP^Q��A)��#9����49��m�UqF)�,P�- ���`�Y)[��va~
kA���G��-l�%m~
��/�eU��������/�o7^��F��C���^(�*^�� ��2s	��d��+�/H��BM�e^(.���]^��i�Q�/H����!����G�%����Z���,$\,�X�������I+��*)��s�<���.���9����7��{]����~�������zA������[/�x���A�g���XFJe%.�����	��0��������SA����K}�������G��Q���V]���a��,XY*��x�j��|�tO6�s((���j4�p� �-�W�H!f�N�e�%WBB�����P��QM �T��S�8�#��d��=�']3��/�2��a<R���4�TM<N�!�fr����
no����6?��,�dX��c���S��P��������ra��n��,���0?:����������YI���~����a��f5�/y��}�����nH��Ds��f�����[�����;��������4%%��������%�W����Bh��D��2s��Z$%����O5?�C)=$�&KXJ��;?=�M��~���2�5��:����c����#(/Hu)��$0x�~�����~��K~����Y�x��S����ua~��P�^/i�SPg��B����^g&�_���S�(I�-$$%�%�0���$oK��mV�%��)JkK�VTT/���%Y��4�0��tb���0?���J�z+I����S�w��m	�#�����0?Ei�/��������wn^���4��0�����.�Oa-(����������$9��-��vE���0?��oak����]y�Y);�J�fa~�aE��!���l+��K���$��[a<�X���C���V5�#
+���Y)�J�Va~�eI��#��l�*�Z������L����z�������D�m�jOOOGLL455��5�7!�G�6.L���z�/+���m\�����i��5,��c�#���6�0?EkoI[�GR�]~���+*J���z)~K�x��Uq���8�.~����o��������TQQ)��e��0��Uj�
�#5S��"a~dbV�TZ���3������Y%�����R�X����@��2�P�g���� �YNZ�����]���ZP������}[{I���uaW�l��#[��va~
kA��/I�S�N&�Y�#��_����)�e[^����0�'�c=���G�6.L���z�/[���G:�,��
��J��G�����8-�#��d�G�dcW��`^��$�4��0�����.�Oa-(����������$9��-��vE���0?��oak����]y�Y);�J�fa~�aE��!���l+��K���$��[a<�X���C���V5�#
+���Y)�J�Va~�eI��#��l�*�Z���i��PO���/�vJg�l�[����)�e[^������������]�-/��l�[����)�e[�$�OIr��Y�#��_����)�e[^����0����XO�e�������0?�����������{���0q�T|y��)>����0?�XI6yxA6vj-`�B�x9<�_��I������^��Ni�
�b�[��{�x�]}��O�������
�#���'_Ir�1t<�V/@bJ�L&A^N���eRwa*���'~.����em5;���V��o�7��X���[b��l�����D-,��L�v��L�Z�".!D�]��0Z�IR�W�*T6@Zh�4����:���-n��~��R?~�c�~�>���>�:��g��4Xl-�����<�96�X�*I�C�#����$E~���}��q�Oma��[���Lol�@!rN�:�����A(*X����M�r���}}���qQ�o�o�I�w�}�#(F:�)� �{5�H�W�W��\��m������B����Vf^��%%�G�$��P�'��/�v�g�l�[����)�e[^���������)����v�U���G�d5#9�+�Ek��Z�^�~Vc��D��go^��-xA:v�f-� �5xA2{���x�g_���i^��5%�K����/H�~���G�1xA��/�Wb, ��������#��R����)�e[^��������_�veU����Y�H��
�B��;��xA����X�=���[��cK^���Y�/HfM^��^?{n^��W�0~iZ@��iM����/�%���i�.Q�������9[7�v3}�.���Jx���_�A��m����;?���D���dkOo?�����
l��^-^����ps�DbR:�j
�VYu������+NR�y��@[Kii��y�$b����_�w���Q��#�9,���q�A�~	V�F�=1B��M%vF��*���%�0?�bv��GlSK��:����b4Z���h���&�X|�M���E�a#:U�CD|����O��L�T������-R��{���Gf������`x~���\ffi����v��������H��
�'q}����1���C��w �nZ'�p$��#��P�������T �������c�B�a#�����*~�C�*��m�_��>��)�k�C�2�3����sC=�oQo>AWC�=�%��a�p����>HT.3���a��s��?Z?�?&l8\��$-$mx��n���i���)�WJ�-���l��IEt��K������qQ���D�~$�4����T���'������F����nc����Cz�Ae/4��O��������D���E�.P����+�$*��Y�B
����G����7����p>�Y���*Jx��P=8���/S��i�G������}uqhS�F3e�6R��a�����x�� Q?���z���k���d[Y��
^X4�V���������I���icf�v���h�����QY����o�:�������w,C[4���:����W^xH&e�gn�4�V	C�7��g�)"c&�$Mx�D]�+��OD�T�p���@��f��6�/��]����80��D��2*�f�������7��
/0j������1���=���C����BZl<DM�HTN�$2��3�(x!.>[����C���<�o�������@����^�b�F,�Om^q�=]���q=$$&b����:�%,�w+�N������CB901�WG�hi����?�m�F��$z�{ IDAT���#g1���R�|���c�^x��8��XC��Rl�����;��|�T��Q��b1���
�#���%cA����Y1-�x~$x���6����k?1,�{i�����k���*V��
/lj����Q�P�������g�X�h	v���S��*TD���p���O/�m����l[����~~Sj4�f�{?-��k�&x��c�b�l*��v���y��X���f�&�`mZ6fV��q�@����e���K���RX3�[^�����5��V4R��m�g���e���s�\�����{x��RMV��������h�J8o����d�K��
^PT������;�����>�����P�1a�@���;��&�5�����>��O�Y4?�����%����='!���k�J^��1w���,�J�?j8�By��K=z��.���JN��F��BNmd6�u� ,<r�"�5�\��&������a���]�
J�h;u.-��6��1WS2�����P����<l�#9����i<b��X��6���>qCl\<�}��>Dn���#�#�s0�u��hbX�n8v�*�C��Np2�Vo��������� '�6)��V������k�_�����	/��D��f<���vb��oO�o�s�zt��B����;�bp�(,q&_�Sr,��`1�!�T��}6�(������.�����C������k-�o������#==���CU].GgC]����������AYTn2�����R�v�-��xA"s��Yp��e�b�$�O��^�����L������b�p>
t<��9�aa�>���st$_:��z�D['�=���
ZZ��<mtW8�E@xh�������y����*�����(/��q�m 6w����l{��nVe���S���^�"�l+��|�M���V�\wnr���4C��Uy5���F�r����=���q��F��H���w���i`4}����'����41�Oy(�M����W�����,=�C���������2N(/X�z�m-}t�m���T$��f��w(g���������C��p�#���������y0��)/����WP.=�{N��qn��N������.��?c���T�E�8�s"E�K7������k�>6MLC�$�U�n���_��������!n���H:�^���}8������FPK��wgq7���K���Zy��3<��8��g��p�
�iW?�+g���+�Y��D-,����<Z��g�o��p������s��cX�;����@_K�A��[����Y}�c��k��I]o�T�y����m�G������9�Woo�9{
�5A��u!Okf����,��FN���zh�d6���p�:�!�v":�3n>�����|��#a���}��X�jmIi��w�
F�P���d�������Mx��A�H��r�P�XqG�A�nE��UFzB��S���K�@�����p�
�/���[f���N���IH�8gX��nO|��F{RT0R������3�#�w�R�H����`B�&X��6bS����:���^�w>z�Z�'��16�uz����TVC�+�SNXU�+�>��QU�k����4t�:���`���t�h!2)K�t�WT0�P3��6*�{�,c^�vV��9=������# aH����{���_�3N.y~��S���&��������
z6�E4��HLJ��-�P��3�����
v\�'W�����:������3����k��/W����=�D�����q���89���*eL0}�	�F�b�������
�{W^���=�;:#0$��y���Ja�i'<�����mP����w���PVR���zAQA���p��c�l������:���H��C����e%�{��}P������O���8 0��P�u�����g�m�?�i�g��	����n4tD�p�5���QT5��qM��=�?s��O>zX���;M��cK0�q��.�����5���7��Ua�m��O�����P�#�+�FlR<Bc#������6���W�a�+G���t<���O.��e}���*������T���P�qv5���m����j&J�UK�������~�N�WS���$\x�1M2�������8h���_mul�#v�����J���

�rxy�3�9�c�������o�yA�{��ocqk��P��A�����}�-����l���p��!�L�{�&l�K��Ue�GXy�:�9�,+��L_���oC�20�

��3����1*!����s��)&�A}�OyAU�
�,���"��/���q���$��>qe����J�Gv����l��7Wp�5��^���6LEJb<�F.���.B������YT�u��|�y9�����B\XJ�j�[g�����0,M�R�3��������������{����m3$��"!2�+/�h����ZH���������.Y}{Q�����q��zP�T@Tx*��
SU`��n�@EU�j�@�i\<���)�RK�>���s�/0��v#S%8����g"Zw����2?w��L�(�e7m�Wr�� R$a������}�[��j�i����qv�UV��M�'���<�,4h�	���H�OGLT*W^P���u��N�E��SGtD*��=�3�����}t����a,�s����\C�����}���`-]������d>��}�����K��c��T��|l,YRYi�Y��@���_@�&�h�[*jr�{%��������^M$�7	p�����?������AKMx�L���Q���H��@�$�� ��9��9�h��t���"-���#H���V����
T[�=��o���/c���u0��3�2
�����z���4��C��TL�tp��ch����M�y��r�~��������s.�q��1�`l��9��[?���%,K���zi�����x`�U��q��)W^Xq�����o��Y
Kt�W����7���X��������a����]�&wm
�O!�jn����:����I;�R~kt�c���h�(`��S�_3z��k�����CI=�I����Sv��nmP����2bio>�K+�P�l�U;pr�hn����w��(����c�����������9�7��d�����Nuk��b��=�x�&��1�����n>�b,L�ab���I0@���0���b��kR�CL
����1����7��'/p���
K_�KM�/�9r�~���oV!�_c�-�����p��-_#�N����]��]kno'?O<�����!�w�~x
����D�72�_f�tA�Xp�Z��D��UG����T,u�*�0rT^�9l?��i�#&$k�SU�*e�K��,�@�F�����M������;��������+��V��]+����C�*H�>�_2�������|��^8�`ow��pk�R���
�f���v-Q�Uw�Opm�,�U�G����F|���
s����"��l=��V���5�xu���EL�g������fK�o�{5�|�vjTb���85
*6VP��/r�1�=��_z ������f�N�#`��-�������v��B)�Gk�Li�C��t�+��A�m�?rC"��a_|]Z"% �+/�kk"���}:�e���bb�p�z2���Q��"jU#
1[�l=���~ig�������G�X���
�����#g0�W'�:x
�ZX�a����kw��**�8x���������B�f
����^4�13A��6X�� &��|���}\�a�����R����9;�����������)|���X�k�����.���WH�r�@^�B�#��x�AhX">(F6�����"��Tn�������
���@bL(D��xqy
����O�CQY
f5Z���vX�C\D_9���P�&R�$2�X���Xf*�L�����jX���Tl�
��/���pA��^�RU��~#0|�f��f�������.�r%��7��A����qizn�sny;y�������?��}�Rp�	����1��L5E�N����h[�������l
��BFX�h|s�-]7�/��3�.l��^)|��5�-����.W�W�a�p�,Bb�0�A'��{��5���0<���i�/4��C�����rZ���3�h�"`a�N
S��������4:�c�)���vls�����2�8av�r8J�#4���_�mn��G�a��*��5�$�K65�(����d�i(a���/��
^�R����+0���2o����0�f��;�Y�+�7��_o���Ne�' ���e�����/6 69�^}c�1��oX��]�w�)���Ww�z���������$��76��,�<��_��:cA�Z�����*^����x����+x��
��R��A��v8�|,A���P�T)/��g'^�����n�XL�����X6t��^���TUq��KR�0���9�e�\�����,@���`if�����e�������Q���o�e�pwC;���Kc���(V���j�����	��a��!	���&�<�J��&$#��j��Op�J}K��=����y=
$\u�h`S;�k����y9�"l���X�c���&;���Zm���!9jO�<G3����3�2�kV�z*t���FZ5�%w�"grms/4���uM0���Pp��mK[������j�JhE�m�p���a���T�	����J�������.�>Z���W���7��^glt������<6"G���F��?���������x����Z0&�fsC]l8{�Z�G,��<M�����c���tM������^(m��a��0����xON����]���C��u���N����^�PX�y���}���G�����w������dZ�X���Ck2
1I��{���OR�X3���p{�]4��o��M�z��F��n-����j�@[��B��Zy�}�*:�U��{���/h����g6~90��6����pp�r�?eh� e���<L��g_r�������9������c0��b~�����t�q��SA��3+�N�����M�s�`f���H  ��n�k�������Cp��iV_|B�s(a��e8>|������U��/��i���y�,�)Z�/��f�}t�?�w�4����H�����t@�#A5����/%g��O��%��>���W�G)r�GcQ%�B:ny%��;@pCKU�/���Y�U�la���IQL������g���;Q1�����-� 
JIw�[3\���9�sP�{����g����q�������G���9����DM]\_��r����Y8�x�j=M�������������3X�+����M�����`���hQ�,��{��C�b�^�������
m��6,������B��vQ@;B���}4'Z��>�����v�p��,��{���3�D-y���6�Q�Zxqt5,j��g�sh�����-c���������3B���?7���6N���)j[�����������h����]A\�_�����
D����z%�[�W����1l;���-�Q��4�����m���"|>�6n�����piV'�T��}+/�j���>�{s���N �����E�S�q���h=�X�����kZ�������T���9F��$��0.������i`\v$�� �g~m]
�w����A<����Q�6L���h�A��A`PA���xx#m{�J��KGC��������b0-����"E�p�\8F�#u�E�������
���9�P�`���$x���Mm����E8_�@����s1t>��c��K�1|�6�(�Ia��(^J9Cy��,F��#g����e}�)��F�u8����.>��E��j�����|`>K/��q��U��i���������!k��X������0H���T��A�D9����]:%.��r����A�UK�^�
�����9�O�����e�dm��s���	/�����c����=��%������
.P����O��+w�<K�p��K,��+N_!�1�)���FW���)��wc��.�~��)����^q��}6�[+$_v�2A�Ap�6�V�" �4�����Al�D������b;6
���g����a86m��P��Z�@�M�S_K�n<�@~g���F��O���94���c�N�2cwEI��HE � ��4�XC�0����`�����F�n�'�X_X�����t����K�r��	&�����
x����0���Y��^`����V��Bz���D����v8���0�3��0H#�?sS^�7~��8��]�%'x��Y	��}e���hX��IQaZ�&�z�	�+�3D�}y�Q��b��0��x��
��y��#J!q��	��h��G|�T����URs��t?�N�F)�����sh2v�n���W�g�98�k#�
0(a�w�N������c1�	z���&t���1�
����'�R�^xq� Z�\��G6�N�I��{�C�����xq��]H�|%���!_?����82�J�h�R���M��xph=�m��Cc��:Ld��J�Cq�j�{�X7������� ��F����BN�B���H��� ��{(�4G��+��I~�s����EC(�"��yh�����pD��]m�����\����G�A��B��G����t��G����0*���-$���D�Iv���$x������<�ak#�"93:x����(G����`�������zw���'y����o\?��o��cP�ry������g����	i
	#�,$�V��`�A2;����<�����K��P����9)/xz}��;1��x//���*�r�t����H�h����o�����r|�W����/����w��\<�	9}�vs')+���;��O�!J�ex��������Q��$j�Q=%�qB�Ut_��#���^�Ma~D���82���_�WQ���x���h^�:T����^�����p��Cz��[lz8m��(%7x��7��P6�8����aK��s�������.�����LEC=���$����~.J���	^��������w�w�|t	MJU��������]&b��f$d��]J@��k�|#�N����s�A��i��m?�'`B[s���'onF�h"����_���[)&�rxAG]�	Z`��$��/$�r���]�J��Xr�k����������u	��}�g�u1KN�3��X#��h�[>�q��E����"����*���o�kUUL�2	K�.�=HO�,���uWc,��TWX�X��^i,���+O�D����C� U��e�>����O0�U�Jw=����U,��Jv���3�M{T*Y�.^�3��8;w:,�G;�lQ��4�9��b�f�����0�G���������m��9L��
j**��)���fc�������<������9��Y�b����7����
����C��l?'x�+)��9%��{B/�M2RA����Dw?$}�w�����\a���^��P!h�WcH���T�W��t����}7E�cn��{x �Q���v��+U
��d�����,����N/.�F�e�s���I���NQL{t�+$�	��M_w��P������@;�4�EV�;;":)K���V�x|�.��G��1��I��*�|x�jJ0�3�P_�r����E?;07x�)"L�����n��k`Jz������#�����#�=��p��{��8��~��.M���.�l���jT��P'	6�jm����g�X2�#W��J���`|�&�ac���~��vM��N"4�W�-My�\\?��[l���	z� H����v���,�����������3���s��R�b�@��R�KE��H����]�� N�-mD���P�1��p���7pt�J��?�KTFJ��9
�`��yy
H[p!s���8T���y\��PSRAu�
h�c,��Y���})�����^��4Q� �iM�3�WMpxz
��S�d IDAT��*�X�i&�^�U;�E�R�`�#f���n���������K1��_X�u&����+��@���%1�vWxS�[i]��K�/�����5�����'�`JZ*��K�:��D��=`rc-l�IJ���vLN�������0����{�"" ��Y��dW4k	��a�|&zC����>nV�vW��u�8��MF*���wW?���Q����Z5��s�����L�}K�nv�z���2��x�{�"�I]V����v�V�8�V�xwv?>G��'qevW�T���e��������V�^�2\���v�f�y�x����a�jx���{L�"�7*_�&�@���q���H�+%���J�o]���q�Z��o�}<I5A.�*>�JC����?i#���F����E�x_K6��������>A�t�e���������	F/B�x����vu5��i�9Gs�������0`RQ�^�=��J�rh�O���A(�i#��0p2��;j�B�	x`�v}��o����;Su��A-0h�����^�q`v|�	^H�
F�6��u��w\��b%�aWG��=F���`����?4���O�q�������m����3���z�jH�
�0T�����6������������
Z�"5/�D0�����>hF@���I�"��)�Akm���n����/0�z'r a����c���%e������2*�&�	��#[IyBt������F��h�����=���G��7(8@`�V��Y�9�sZ��k��]yt����	�TX`���xR�o��~��~_F���z~���u��[z��~�������*�������"�xP��vf��i87{,��Ru_�&�B������Rk+����vH3���	�*�&@���!�q?��2�e�L��=���x�L ����\�`�?u����U�h�5�	�|���79h�/�4C6����12��Y][r�h�q��70�������e����'p3�X����<�yI�����,���4VS�_���������S�/�V}�Z����������Y�eA�v?��w��������F�G\���cFW�����0����C|���L����>�9���m�1ha�m-����
��l��r�mQ�E7��\��+�\y���
<l8�����g��f�����)����
���u�!8N�Nq��0�*���Z����81����oj�a��k���cM0��������(�r�w�w���Um=R��K`��
]Hq^���Y�9zx�Y}L��������{�>=���qP���	^`���\�H�_�aM(���tH=$��'�>\=!�$���u���~l���H����J}�.�X�I�A�*�t���8��E_�
%Ru��%��}v�����D
�)�UE�M�3S��\"P������������(����>$�z&PB�&�~��������yfx����P��K�`lh@j
{~��[�����9�:5�P����+���Ot�!�O�N\VrkK��,��
^(9�<�:����}�
����/|}}�����!��%�}]3��/O��/��l����#�n���g���2�M�/H�
�W��T�����7�oK���T����f�i+���/k��R1\w{��Fc����9����������w#W]0�������!7x��L�1 *���a��������W�+n�/aQhW���� �vod�����������	=��I�:���g�{5^X�j06�'���t���+�bP��X}�����s�������)�'����Kc�!�x�+S^HH�i�50���?�JK�JV�1��k����Z
�45��#��gL9���UL�TP��v�������@H�x/�s��a�_��[l��\fS���^��N�;Iya8�Hu���`���}���dV^Yav���s��9\y��#�]����ow ��:��G��b�EVx���'zT#�������"��`����������RB:�`c^�Hya���hIi�}��O�&�q�"I������A;r�-�s��k�0	�,�
���q�|=����SW�����s��$]��(?tm�/���\�4�xA��J�M���$p��xR^xD���*!�	)04����i���T�"�`�TJM���Nj�S4�F�;�?�
I������Gy�)"\���$���K�*[��3;��1�Ob}�N�����X<�)/4�����t���	��0����%�J`����	���#���DJ��^`��Hy�����*�������`�je,a_�$^}��$�c���������>O�aL�2������`p�:|���J�F�����=���zy|���s��K��a�
-�W@�?����n:��/DR��0�X��vO���{�0�M=����G���:/��$�<�c#lvb��0q�#Z����L�?�p�>$w�w�@t��EW"'x��@�JLu��n?�'�^��	0x�4A
}V�i+O���R�t���:�{TH6�j��>�����"�^�n{�`U�)�@������_����n~|s=c\%��o��vTh���zJ�����f@vhS�>v�?�!�]����V���M���B�}S��J�98��Kh�tN-����� ��M���hM�Zr��.��^	F(��d��i'u:����(�y��:��q���~�q=]�_N��E5$�1	�8��j����e��{1�Rx8�:�����W
��6���#�U�RC� pa����r�	�{uF�����CC����C\u������K�7�Jf��qM�c�Mg���N���<�*��`�d��H����]\)!^�%H��U����Fs���u��p=����R^P"i�$������Wh))8\��u'����k���U]���{�K) ��Q �'����A�tx���A�2(]��vxsz*t���r��:���B�G��Si��^`j�K����f�)4����X5��p�]RP$�����I�3of�������0��pdKW^`)RZ�g�5i��Wa���cQ�P�+
0����n��D0��B5����������\)�r-
R%G�6:�@�,Xa��)@8_�D���\q�A��F����u�k�*C$���%���(},���-�F���!��F����/0������>2��A,�%��(YV5�/�?L����H$&�p������{�������y)��2"},�@E���H�O��J�n"�+��� oL���*!��u���������yS�@E���{��"�.(��"����"Mx����i�����0�	v�/�����#�m�����`��N]�@ +��&wl���n`
�vG;���S?�V���Jc�
,@����[k\�����jB�*[���U��/���O]���p�6��1���`}a������\Em�� �p
��"�����pl�0R�����kc�q`��K��0���$!?n�1����� ��0���"B:��|��RN�>���� ����p��j)�*SKH
?�0��C��ML$��F?�yCAZ���i���R�������~)�z��[�����7]2����2����������\,I�?���!���lK��md]����B%JO �?)'�h���/f����=]���^e����s������`E�ZEMaZ�*>:_B�u'��`8������o�w�9���@��TR`�>�����������o����Gp��'��Q��x����+/Tn������<�_�����'�,��0�O���(S�����bfU��Bx��tX���H/0ANI	
2�Qj��2��D�hG�,�C<�[,�D��W9���G?)/�'p[��S�nU�n8�"/�n<H����B2)���S(]EAK���B��WQJv����d~�������q�C�S� �gE;���II�3c	���Z�*!��yf,\�y�F������F��<�Jpt���ey������w���=6�:��SFb��M�;u$��T4)_�8���H�c��9�Jfx���7�'��}�F�8@)0���P������Q��[�8���|5��G7��B���5n�.�X;$�� ��7���#�����B��#��p�����
=�x!!6o.������K��t��P���u���8]��RRV����m���D�����\xA��^�J����(��4�)}[��H������`�4� M[�Ofx��q.j��vv*S�<s���V�3������$s�#d��3HQA��Ui�e0Bi'C��U���q�s��W67x�DS
�k����_�����W�����a=��d�kV�0����{������|��J�!��]����S7o�h�yw����	^R�%lM,)��p@U3�x���F�l��t����.�`?<�q�}b@CXl�P~��/nax�6��b�OS��`ZD�r�Zp����"q�uH�����Y]J���|cp�m(�-��t7�������r��K<�^b���hI�X�(�����Nh[�
��"Zs�}����@���^��c���X?���~��O��I�[�(<��dWr������j����F/�b���RL���/��l����h��"��X�e�c
��K���lo���QB�[)5�;�k/Cl���:�?8���x)7���)J'���B*
k���V��hA��#�6��������^8L�sW�p�A��)MmIv<����x��S�g�kn>�G�L�`W� �%�)/���
��]��b��K�����ziJ�����+
��i�S���i�X>!	�	;���:�k����C#�Z�����]U~N�?|��
�k��c����1c�n���y��:��hf?�?�{�=��wG3���e:!6.%�����q��2gn��iI����T�*�*�l9��������5�S���a��_��G��H"5V��\�$�� �"��M�nYz�y����F�B��#(�����H�$i��?�����p���hG:;Y����������Yy<��g�/���(X�u�))����$�^�Es���<��ot84)�V����0����w��R��k]-C9��)�4VZ��h(������,������p`��@�k��B��v����%��5��KQ��lJn�B�Je0�Em��t��;���2�]R`�kp'�����W����]Y�R�/��Q���ASw��)%z5�
��c6����y��Dz3}�)���Go>FR}`6�������o����
/����t�R��	���f�h����r~�X���
�bFX�x��*L!@��	�����:jX4�=���n��{�>�M���.��a��swo���]�	^`���6c�~J�
((;��8�B�X��|�5�(�E�_���m����0&��������(]�.O%��Gi'�I�`� F��A�yRl���OLk2���������RG0���e2������KdV^`�B/�f�D"�%&!�`�o���S�dXa�������6�L�A�*5��S�p���pR]`�[��.mA#��l�zVv��p�����Cv%'x��\�*�K^���y]�Q�/h�����x�{��$Dh�M;���+%h�yCkU��������R�����N�1����WL�f������'ap��/��(�LN��-
w�{���2p���6s�qo�W�W�����wi�/�g��[�����t	(UD:����X�=P+._��z�XN?Y���}�z�S`0J�c��;���u=:��H�y���V��*�r<�+U��ad�:�|<mGt�������9j���������H���>x��.J�<�B�����2"-�5S^`)!��|�B��{�&CM�(O���-z��{q?��P��8��<)68P�o-RX����E4������t���5������R�	?(/0x���`J)�J�kt��O����y��HJ[*$����W����C5�.���T��������1?�S�2X���Y���t�������������:��'������Ov,+`)	��z"��$�����y
��9����g�{�L�t�_����A4����r5�
�d�@����:Cz��)/0x�&�� 7#��������NO����:����������_�h�]���4�����`n���["�����P}�-�Zt�%U�DR�P����6��}�xj
v�f����2
���Cc��JF��4�0S�h�����)���l�� ���
����3�6��U�x�V2�H0��.������\p�v.�m��z{����x���*/PAw�"����sL�f�NK�����#T7�|���kTj�FJhT��G����4
�&��F�	/��
���)ESj�Nc����.����2���k�"��E��/��+GI5��vD�"i���������n�
�gYx���)����z����J{�
��eJ�fF�s�s��n?��Y�*�0'�>O)Q��:�E��6�z/
�`�B�Zv#_'$���>XQj���}����N�R%�f������<<yO/Fq�)����6���9����G��l�V*T(n�����YK<�M�L�bI���Q	=�U����X��=��1�
�9{�b��R��<�3��UQ�X:�`����� ��G=���T��K�1�g[~.=�����G����g�'KR��hFL�"s�/,��	���{����ngU<cr����ANi#L(���j�����p��=^���\S)�Sgp
�3)�-f�����^h@�&��c�����k�P�a���7-�^`)2�qN����X�����@���D�nvi�$RVX�/����RuZ�Z�e�����8�9��[i�Z��������kH5���=��&������8X��d~�d)#=��p�\�[4�V8���Ew�Di��p����C����(/Tj��Rz��fc<=��lN�������*/�h��i�i�o�����s�x��m���������1��5g/�=����B2�k�(��)��Z�&^`�"O_CJd4]�Ij'Q�&B�O{n����q�!��W��:7X*	J5�L����^���=�b�t�B��X��J���t=�.:�v"��hXGp���*�,�x
��%;x!4<W��5P.�f
���1�/�q��qh���xGO[�U�B��X4n�n\����������]��>�g?{�'x�K�f�u�1��K���9���K$�*�:��Mdx��4z
���5�dLE�N�`H�A�K��{N#<�r��S����`��'�Y,:�/H:���I��Z_�D����	�W�}�+���Wx]�6���W�����E_Ei3����6B��D=&7xAT�8.'xAme���P�K����FH�-i��
/Hb?;xA{���� �6s��a[Z6r�����n'7x�w��8�K��#��������z|����cN�����l7'xAVm��6BVm��n^�B~l��u2���o�/�����^��~�� 	���&����EIO���_UrJ!��H^�E�~���R��'5�E�������`��dN!�5K� p�Z�����p�D�"i}Q������I�JR?������f�$�cN��$6�nv�B^}���<$���^}����
�xA��(+e�_I��#�e[_���WR��m~�������������f${��P����5^��d���]*�� =�
��t|)����4���x�����<����V���JJ�r\���45.i^��G�L{��*�(����BMY�R><��s[E����\�&x�@��Cc����x���E��/�Z����xA*n��Ha�	���z���0?�zP������%���`�����~~�#������
�B��;��xA�~��X�=�������P~�����xm����<����uxA>�/���K��t� IDAT-�U��Y{8g����ox���E��/�Z����xA*n������%�.����m}a~d�_I����o�_R?��~~�#������
�B��;��xA�~��X�=���[���K^���iE����/��������__����^��7��%�?�K��[?�>Z���Q����_�/T11�wgw��oUQE����H9�������)v��*�+C^N"W.l�=a</	��G�����0?�P����i�$0���\x�I))��sU999�h���vXXttt�lH�("1�!�6�������#!F�@��Ec��Q.����E2��2�HM��H��>�/�~?�5��&��T��z6�/�HU��]TTT(�����T��k(!%9Y*��cD���O>�$�-::?U��;�G*�����Q���k �O�iw<�jE�+ )Y'��e1%�
h��������E�\7'��H��f�Q����\\\�����t�"w@��;�TeS�'W�r/�gN��H�e�X���c���"�2�#����#��>����r<�YQ�[-L�����_1������#U-���K���>1Qb��O�%$)���R����O�Vl�d����@�Z�HW���S�4�����#����`�(c���#�JE�A	���y���*�����']\�r����C��sa~~���j]���<�k?/l���`�����[����LZ����� =P��[PP�K@LOA�	��%���>+������k+""
�����M6a<��A-�OA{\�����_ytaz���&�� W��m	�#��
��0?�����_�{����� �	*l�=a<�]/�Z�GR���0?�����Sp��B��+B������%�.����]}!X);�J��0?����l�#;�J�ra�!X)�!;�������,��4�(;�i~�`����4,�#
/���0?���4,�I�#���GAyA�.�<PH!�����B�����0I155������#{K��0?�xO�u�����%i�=��k5��0IV���
�#{K��0?�xO�u�s��2�����mCd]O9:����O�P5a~
���h�I)�"�?���T����;�nL���T�����;�j�0�g��#��!uc��H��R5(��T�)�1AyA,w	��< (/�v����������������/��l�+���6?�NkIW�l��#[�Jj]�I=(���i~
��d6��xd��%�.����m}a~d�_I������x$Y
��+���},I��H�=����v&��	a<�x��#�����(-�#��ds�/�����B�^��$���0��I��#�e[_���WR��)��|!�G�!��������Z�GR������o�aY�ixQv6����o�a�0��������
a~d�[iX�G^����4?B�Rv�D�����egC���V�����i��`�Pz�����  �����+)"II�!���CW���F���K^���yy��~.����^�����~���m~�`e�����{@�D�-E>�J������o%�����H����=6Y��<1��ir�U�9�H9�)l���I�������j�eD��x� �� si5[{aaaPWW��#2����.H�si$�������*Jv]����|����������L������x��)	��x��b�#A/s����:
�T
b<���S�B��l�����&������7


Y7U �j<�r
�OQ���
j<2H�79���MA�����Aj�F��|�%��1@����iT�����&uuu�a��l�k� Y��g�?u<99.�xRR�� 3?�������QQS4Cl�t�[8���#[���z3L��Z�x��*�&P���=�)��'�G��Z����%0xA[;���a������D��l�K����tq�kp�-�'�'������k��W������_��/d����Tl^(��(�����+�l����3��
m�}�����r$�	��^�nFf��45���2����C*6V��F��������N��;B��i���Bql��!7
�P��{%��Oz����|�������^h��*3�9~��-���/�v��[H�6���*��A�������05E:�E`�>����-��^�%��|�-��'uB��2�-n�I]�J_������c�����A��1�2������I�����e��{����axC�P{�,VM�1�a���Xu
S<�
�O�/��T���K�������%�.����m}a~d�_I������W�/�|����W����B�~����#��9�U^��3 ~�� �����= ���Z����^(Ho��m	��l�O�d�WI�
�B�<(����PK��o�^��t���0��I��#�e[_���WR����xa^�X�,�]�Y?������IQx|����"�^���nAZ�
����	���
�)}<U����m�B^GQG��5i�K�O��{�o�rtZ3Z����bv�Q�o�X���X���h��'7�?����W��Xy~W���J����O����?I%�T��(~�8i+/���Ftx2><]IA�����n��u��F |�:��K�Hc: r�~���s�4�Z�uBXt(��m�3������8]���'1xkW���z������G�������0��fQ�������;0��<��e>x���������K�Xh����$xAkF}Dm{����%�Ry���5xvz5�u��;�'�5�%�������v�^����@LX�<K�w��5/�m@|��vb�����dU���Z����X��TP��<<�H�z�9X��B������%>|�]M-��~^�n.�?�o_�;����k��a�8�8m)����A�E����;X6���A���� ��i��]#�p:T�]
-�sI�z�W,n��5b��=�O�k4Dhtn���;�e/��i�=��;�(6,��gujAK[W���UO��������"��b���4�I)���8�������o�Xu2l���/�����s�dyg��<�o{9U��p�5���(��E���i�TW��E[eX*H}����]+m��
�[c��3f����.�5����@WK������������B/<{�
��Ah��>��i��a�,����_���t��"WO��<��w��]�|y��'/��p���P�Fn���{x������{5�W�W#4�r��<y�STg��Q����h�}6|���6�L�|Q�r�PI*���1G#B�R�����0?�zP������%�^��G��_��P�@��������V���
/hk��n��0Q�-���m��
�!�,�����e=�b��e83e�/��5��G/���C������������
�~J�m�����qj�?(���E����"4��@�R���T����Wa)�'������p��:h=�!Q�����O��T�J�4)#j~8N��W�Y*�1������o�4���,+���
��_������2j�Y�{f����b���{'��-�6�U����xph.RD����~�V�'�,i_e
/�h�?�AI#�_/�g���a����v��0E�
K^�li
�ep����^X�<f:lEbrR����Ia��&�
/�*����T��^�^0^��/�pz�_/���A�R1�~����[%Y����`P35<qO���X���5mD�R��R�W��Bt4d�
�l��bb����qL���I�W`���lk�sWn���9*�-���%�b��+7����.������
K���d���<"�v�����]�@W[+���7���������=/���D��"Sr6	���P�����y���U_t,)~��?����
[pOO^3�k?����?������C��s^�����m:�@]]�)�r!"��S4��5�W�8=U��]�r�����<���U#��b����T�$t�V�=x�$z.aWN<�q�*�����F������o���+��l��pX�h�� �	������doR��P����j*p���:��U1��C$��`j-;�SB���8ly�:���/��(b�(K(*����P������������`�0n���Xl?��h��������A�����MFBB
fo����3��������s��\�����H����Ik�;s �h���s��I�_5��6@���"�����Y�IQA�{CNS
�."��sh�o�&�yy��<���\y!9 ��� t�N���������^�PDS�v�b��u`�
fE���r*�hQ�5/�����+�Mm�@SE
NO����x����-���n<�|������$��d���6fV��j X[G�����W^XvnV���!;����k�C��P�W����Q���5�5��`?, ���;����������c,�8�����{D0�1�a�H�a�/|�M��gI�}2-j)!8�`�7I(]\���p����1*"�&����O����2^~L���PQ�	��T��F�)/������4x���P�^�]u��Q4���F�!��o���p��k�*���[#��H���������������q��w�����m!G�&j���A�N�Q���k���{
���hi�hRbHz�	�!��`e
$� r�(�2���Vlrw��<|��B��s���3vA��T�W�v���$�*����.^��A�^/�����z��Z��q�s���e��}_<���{�obX�%M>q"�g���{S��m�����q�G��R���;>8�FZ�
)3�)k�0Qq���i1�����76q��;za��]Xq)�lt�)t�(��������}6�/�:�z��(������������8\[���0�i�W��`�
���S�5�b���>R�<��h�����b��5�5��C�`a\~��h_wA�8wo|?�k���s���;�bb`	{�
S^��`_Y�Q�����Gx�z���d�h:�|����un�@���������Y�x`f?��R�}~1�@������E[�N��i�//��M�P���6
y�o>;
�/Oy���g������]���X
���FE��?�Sz��1�&�%e�apy{A���:���xR��<<B�IF�zC	������������:/o9Ey|��n'�������������Wj��i���W����k��z�^O��c�oZ�A����=�dWo_�F�y�B��1T��{ ���#�[��Y�y���+�"�5?����>��_
y��~z~n�t��|���P����J��J���<�^����s�_���0_�i��y�$%�r%
]}~�W����VG���_���\?0���`V�>\����dh��!��%j��
E
��)>�u��'����������\y��b#(�j����.5um�?�>A��Ma]����s����.�1���=�\D��s���$�6�K}����$�E�����`��'PB^A�@W����oZ�.��}����3g�v��gZ��kw�L�cK/��A��K���"m��_@��T��<r\����y*���g������5�B�6��z����B�a��rx^�����H��G����W7���DZGy$�P��-�������'�#0<'/���7L������}������g���Q31j)Q�j��u� 26��m	��k
J��������WO���'�F�����6����.0��)/t�����q��}�CIQo�<���q����|�P��&�Y��_;d�UT���M�/q����k���:����u�}rCi3���>�p��.�ae\��#�q`T��}
�Q�g�s���=��
w���u96�%e������H~��n�}�1��������Z�X�wo����8�rN�Vpu��N���A+�k���TL=��3;��!�+��R�s�L|���3���'�cq���#e��_>b���B*	�+����%����Ly���hT���n���}QL���j���X�m(��U��(�����O���~+��W�g�Xz6
��Eh>&����'v�v�w uMm]q��e��T�������pn4��{��z:|��.�&R�`�?��&4!�
��!82��b2�D�{n����`m�'a���X��8����@�h��?c�e���G�����0~�6�_������������c������8u$%J��k���������&�����P��vm@�A(j�����������PU�{��"�_������������4������wuKA�guD?������Ip��La!��G(���Z�S>0����,�����;��Ml���������<R��`4�
��)!;��)/>��=����`\c�)�#��#$|���nH�
����=
yM0h"94*e��m�W^0��a���B`J��o|�d���y������m�����m��V���K��������%��  ����L���"�VV�RI`�L_j�"���}�~����>\�J����0��:��p�-��'S1��:�����V,]C�Z/C�����8�����+^TUK)a?��D��$5��5T��Xo�k`2S�by�V2�$G�ZMz.������{��"t���(z~pn
��Drm��Y��v&B���O��������y��^x�������sH��������Q��"T������t��|ds�W�������=3;��_F����B_[�]*0}�Uz�A����p��&��Ok����';S6_��r"
nL�
jx���M��s�rhV����rXz�*�2�����hP�f���i���XQm����i[�`��F��Eef��#�_����y�+�������@��#���mk����+�1�a�Q<�0�������������\��u;1{�p<������_�wo���b��^����'�����haP��8~�*�C�A�^5�����v�t&�Z����7>3#���r�^^��PZ5��O�mO0x!s�������>n�Oc���=;���b�����4WbhX���������?^�!I��/��m���w�����
V���&�p���;LLL
�:��{O�0?���
�z���WOVxA�������}!(g�
��qt��}�e�j#���;_�E3�h����:����G/��dq|

�������������O��(WGI!�Kx6�h��W�pxa����on�JFX��%�6��9wr��'oB�hRC.����e���j<h}��'���B`�8�Tr�T�A��Z�x��j����(�#`a�2wto^�vs$��s&�)�������
A��v���&������#,p��w�{��`�d/�6�
�����(���D���(2G.��uqh�j��E�8������}��}��r��E�E����s9u$}
@�O Y�=�#Bfo������w.��� ��<��lc�����i���JN������=7M��#zI|������7�%�+���]��A�b�(C@���W�W�)X���q�87u;��#]Lm;�-CO�68|�,�����;`|�XE)T�����gx0Xrf+<���I���F�j�\�RX�00��+�4e:����v����^�m�4��B	Cs��b��}^0����['���������_�r
�<7x��zYf�@K��bR���H
�UU���I QA��Q���h^S�>$Q0S��
^H?���x��U�u(/R�r�Fn7��l_-����I(^���J��?=��� D'��0}\��������'1"��~PN����:�WC���Pi\��^@c|g��x������m"�G��B�bP,iB��'����[�"5::�� |���@cXD��j�Z�s���}{�:��@��H	��`C��{�
9�@�7;!��;�3��l�r�rP�6C�o0����j��r�v�t��caQ�$���C���a�W�nm�������j
ZbD�	�|e:T������9�p��9
�<% ����B���q��I�����Z��1�yS36 IDATQ���,�Q�{��5�5��{>�������]������
�������9���/��;S(8��x�5
h���
/DT���L�����m�?qs��4��]	��aj����7�j�o�a��
�C��
��L�	�
����7���J{��-j��`�*A5�7�i_��mq����%��0�/N����^�����-�)D������L���aAmC�>2��!_9����@�32&M�u���������Rz�D���P�7`���F)+X]=-Czw�������)F�6�1��D��W�8C�(_��o	�r0�uN��|���^�l\���x��J���������gz:B�B��w�\G����>A�to��d/�i�@wMk��:�f�w�z�;#t���$��>�4�@�Jq�>@kVDmt��\�{S~��b��`R��9���]s
�?�����C��6
{���@`���o�Qo�J8��
=���7����3����ZE����mf8���<�~yUo1/G�Vk��7/K��qk�8�c���Frh�A�n�j�8�� �Z��s��AoR%���#IA�9���S��H����F�������<��V�1D�n�p��7�W�
�e��6jt������g}6��
��-8����R���Ip����h9� �m���1�F%�����|e0��NW��o����Dz��!����9���v|T������WP�=��H���>hM?��IW^`�tx�f�9��m s�������l�n\Y�/������fw�������g�P0�+�G�5s��q�`cp���9t���P�����FX�t��f�6XEu��}�����5(�����;WD`PA��SP���OK
����%���sxz�k���#w������z�f�F��3��bu
��@�kh�S��'���|����
R]X�����C���)�g�Izc�kB���c%:�7��}�E�����~��^�C�����T�J�Fz(0�4�K��/4�@
��+`�9��b��O�������n���900�� ��x��/X?`&�_O�f,�9��-���+�����(n`�;�/8�q�z����o�G��%�����9����~/���V���ml��Gl��}y�6vup��x,�9�w��~�=�tT�*K�t{� 0�'$�����_������Y�k�X��v��[�{�,��8m�i��JOc����z�m�sb�/hh�c�3,�������n$�)������+��{�w�o�
��������i�����E1t�V�����������(���A����q��qlBC����>���%
�-T�f�/����=��u�?z���i4�h�����-C	�X��W�!#7x�|�@�N=	eK}$�G�)(��"d�=/���M7��Q
���;UA�_b~��B����}�M@�J�:��"��K���<�!%:���`RSm�	�f�S/��k��w0Z����#)(&+:#`��o��h��Kox������`��7#��"a�W'��:Ecm��~SN@�ce��I�@����OaHE�����wy����d)�C�E4}�JAPD*��P��W�PU�C�r�8����U�RF�k���N����I���������_2��S��Y�,\I�!�1��:��K�k���!8FC�@�TA8�M��<8���x�v��_��1��^NBmmYUtX������������������
�/����#8��/�E�����B�����o6����O~z����l�k?+����(��B�"��g��������vi�;r+9���J���9V��V�����K�7��egP���ZT���78���;n^�X;�&m�S}-,�CV8���U����C�:���N/���s�����6��-
i��>�KE9��(S�����qM��\�������.����6��q��#<}C�����\^C��<;x��	�o_"��=��������P��U��q�������k[�!ha����6��6�����v��P��/�����j�������/f���+c�.���u�r5�%kv����m���p��%\����SF����Ou����y����/�|��(*���g�����
P��;��/���~b���0��{�	��{��/d??�)/�P��be5�w���y�3�lGO�
�QF_�H=�m`�
F_��j&�<=����JW44���6���Bv�oh^�(�Z�7���>,��rf���1l�f��m���X�,����h~�������5|��K���� <�������;�>9.����1��	�[�c�9
.%bJ�b���������x����9C;���p|��?{gV������FRT1@Q[���������v\�,����%	�.�_3������Q���<����Y3�fv����V<�������'�h�������������z�MW(V.��-�H
!"=�r��P�^Qk��������������@���T�
��-w�
4���H&h�1m=��L@h����0���3$\��� f�^`�[X9�C�f8u�2^?�������l4�W�
�B9�gvt��=�x���J$��u�t[5}��C*�cv-�z����)i/�Ltpr�f�	
����B��i�q��#��	)3���D�v��F�B�
�����W-Q�m�rxaX�8���^\�������V�q��6|�����������}=�v�N�������
��z'�`A�����NB�F
����B\�7����I��Z�C
�����rJh�K��R���Tn�U��s0VSP}T�T�����#���v ����crJ���
��m�x�>O^��L!�A�"j������>��\h�3������\<Qnk���>W[�'���jn�EpS,aE�P�[��k@(�&����o�<|C�����d4��p�2���0|(�(������TB��	�y�UUnF�(�q�g�����������:/����y������k���
	��k���3��%������w���MR-��n�PW�����x��%V�n��_�����2�R ���&S�}X�q��/s�A�".��l�~v��x�z�z�4��+/�Wm	z!��
7D%)9���F�f����(mD��]�>#;/��;���,���%���`�%k�:,M����HA�8�:/�M�r���7��V"'�V��Mh�k�zFuY����_L����)���\���������+��E(�t>;1��Vg�����Dk� 5#��u{q��)A�'�a9�1��������;_l��%��h�7�:q�� ��hM�z�o�/����z�-����[�x'�w�{��(n_�5Lps����e��@���@�ey$��OzO����~�h�$�e-9,�Kbeyh����9�n7?��O�4���U��k3����UL*�E���q�������
tL�qU/��5��C�x��	�[��<9���������������k�"�������t,_�����}�����n�Ui���h�������;P���y�FE��\5!��E�g@+�?0�����h0p�����o1n/N.����MaA����^x���^���8l=?^�de2\8� c�CaP�WeP%��HU��`���������]�
�C�Tt	��J�����s)��I����U�^���p0���U(5Q"}��{f���5<ED�:Y���2�����L/�xAOCc��$eE,<�������+W!��w�?��'��o�����7��`/h�k`�����n�x���a-:���<�6l�m�tY<9��p�f���^>�A�r�(���
=j{>6�M�3���j@W�T�^���%�&4i�w���w�{�m�rl�2^��&l�k*6��C
��:V����N���	���f^�N��"x���f�J?�����>�:0gx������ZIl�>��o��}�|�[:	���`C�����t��9��T
�0�mo�������Wl8{�Zv�9UB����z�Xl<=V�H���4�'H��������S���g�@h�j��K'��o�������v���s���d�*�I;�%��O��z`��^`u������1p���?��a�0��=���
�k5�gq_��@���8����,6S_3�����6��=�DN�<
�%�(�^n���P�Z�+�������,+������Grx�G�bX1��TW�e%=�N=��D�	��������8�O��\j�@��7<�Gj!�TM=�NP@�H����HX�R�9Ri������1���;f����%K#���#�}�"\"��
�v����7Q�������?0sX`*�����L�!��G�H��B��u	h��y]U��r���:�o�C�uz>���<0�J�v��0�����/�t�L�,r?-<�b���a�a��h�UTI"��M��S~P4��RY�������������)|�o��utz�F�R�8+~z��������������5=��O<�W@��7en8WRB`��^���T��+qe������<���V��a@�hhS���RY��&���XP����v5H�2���!-T	����.���:�H}��V&%�\N�l����USX�����^xz�G����y�y�^``d���mGR���~O���!���^��������H��~����3D0��J�\�e/05�A.5Q��6�Ij1�� ���@��&Xq�/�~MKSXt���>�&���+N������6��Q���,����<i7����s��p���8�|p5OL�Y���"hQ��3������=��_�jdK�!�B��� ���GB����7,C���?���"/x�8���-�}���w������[l�q#6X�r3&�p���� �vm�XU���9��e�WU���v��13�f��OxD$��i�{���iv�,���5[1m,��f*����p�<{��B�:x\���
�'.����+=\�@^[�v%�xP�7X^���~j	���=C����+= �Y{;3��I;L�9����.���;���d���R8���aA��|�B:����Y�!��.���p5���������Y8��{R���A������p��L
��4	Pf/~����Sx�*Sd���/���N���$9���(0�����:��BI���>���������`%���� n�
^P�Q����J�"& l��t A�)/tk��:�8�"�U ��u�)#X�Iy�~�+V,��=$yK

Z�; |�J��BS^ %9}�U���P(]���"�RU�S����
(GpE���F�����x�/<|	��k�n�P��P\���v�L'�]��fT^G���[0�u�2�+/l<�������	�Q�f������\��p&\5�)<tX>�K�2��U����+�p���.J����^��`}a�����Km.�9������mRJ�$����TJI�f���@���d
$S�R��$�ZYY\����I�Jf��:��aB���)9��������h1\�'@�� ������pR^H�-��yp��6{��sE�;���Sv����6�+�B���Z5QS�R��fi��Jc������.�T��%x�.�|~P^�
��NBm )0L������<T{:��LyA��.�.?��IWB�Tq�O�)<�s�	BRJ��/t�����A��#R
P�5*��0�R�Mmm����	�����i��R^�>���:�.�v\u��Sq�j�$�{�z�nR)�<�f����8����u�N0)0xA��i���>���'�"p���cx�$^03,�������H����a���JF���W7��]_#?p��������y:���E�G�r�GU��#�����t]�U|p�����������wmA����������/^��
�6;a��$K��7��	�����c����8�0}�	�	X0�4��+�)lt���1��&���D�B���H���R{0X�����J��<����{��h�8�~��d��k�"%!�AQh��-���/�Y���Bu\��
����"��������d
��P���U^C{��&�����i���2��S�]��i@F��md(��+���x��)���S�~��(
~3H�� )�K�������G�[���O�
�g���@h5� <�wH���K�TX�	������'%!&������f{� ��Y�r����w&*9�"6"������9�}����=��Z0e�y����4����aEj�h:j;O���^�F��'i�
dT^��|�.HI���)�g��}���6����7�9���AIT'��K�����g���IR�`�Um>��GTn���j,����,�0Id�4���"zs���u�ZCa�XJ�����f���#E���=���������C>�0�y{J��������dV^`�k3$P������������y�X/��0 ���"����A��6v�����2=w%P

� ��0��AL����%0�Oo�����Wy����S�����U��c�s��a1WY`���yA��	�G�@�Y�0��F������9�����+�#0�z��!S�R�^�$H�����:��,�E7�&��u!���'�RWa�X���7�����CLi��ACY�+QXPJ���#�R@�qh��a`m"�s"A/�^3;�_����lc�5gs�b6��`��9|��M���������M�t����I�������"(b	�'�	�z���VJ�z$�_��2n\#5��fX>7c��px���")/����u��>�-��y(�#H�&����HJL�2����+J`�R^�@����}("��k!*�+�u�aJ�aL]!�s
�9����H�yJ!�:�@j�����U(������N�)�������<�n�����R^(��?��"5pgRW�O��[\�<@��~���������(6�	{�zB��H��o�t(eB&x�A
_�$p��2�$t{�A�v_�>����<���[�����0S^8x��7��	�Ny��!T#����{�sR�	L1A�����N�L@��
8s7	�T���Yy����g0��O'���5�4!�����
n�L�1��;K6�-w�m��?g��X;��KI�RR�i���F0*e�W��n�v�������H/d�[�NWSA����@�s+���3�/�6A��>��.����%���@iI����i|_��$0H�gS+�����^���cU��y�>�����F�N<�b2���np���fwA������i1
�SJR}J�ba�K�*��wAz5KkG����������@��b-������Z�5j��?i��DE�� ����%|��A��q��b�����h�X�Gx����}�^�s��&�SkJ�Oj
���L��2�Q������E)�uv�2���g���{����S����=���`��������|2��3T6�����=����o�����GR�7h9|'xA�
�Y'��	�#�����/d�����R�%��x�������6*��ME�r����z
�qx_d�����1��l�x����0�gj���0�f5��(��T,���qu�1�RF�J�����	��L� R�%���`x�~�n/��7LW���"�X}������k����W�M)&�Q�	Vr�L
1�_	�����hx�}N����0�RH�]O�����H4���=>p�^`�&��d\�WL]����sT
�U��nJ#1��	F/�:��� W�����`D��'���K�X�:���,�6�9��T��!jc�n/�-��>��
F��UP�[�s�AV[�c�C�M�4�!)Py|���U�BVKq�}��b����e���v���O�xb�x��7������.��@ IDAT�E����<�R�c,)%�"e���Vs8U���gZ�A
�'%p��V��f�0*I�������0`I���]���������K���+G(��+Li3�����!�0��:���� ����=�:CF�/t�s�]�l�5�$�a��'���a����/^�`������4ac�n����/<��K��F),��������]
|~������A"5����4�RJ�F)`Xz	���
�����#���p�BX����dn�}H*OA���/4��3Rk���L�BP��J:�P���Qnaj��=��/8�M����R��b��q�:���@$]u�kR�y��d��@/��'v�����'"f�?RV�J-jA�^�s7f�;b���4t����zR�~�|)C���D���8��l%q���=�@`DPBj�2"�U0���p�As�`��9
yK3(5��!���W G�����wF�/��2KG!_�4���Y����4�*fV�9�s�B��V:�P�x�w������6��T^��SR`�������1�<=O��;y���z%O�0�R�8�'���U���7�_M)&Q���4����y�������y��..����B��jN�(��!�$b��������3q�R�&c��%4	0��l<)+�L�|��<����DG
�3��g���t�HJ�R�vg�� f$a�Tx	����2���8)$����+������v
���s:��@�v�;X�P*��������3���KNc��f�������h^�;����!�Z
��)r���'��I%E�
{����5�![,M@���ig�V��������h����������R['�{zi|���A,m������an<��(�s�
GQ�!��^�4�B����� ���|;^`���7���R�����^��P	��(��������83�xz�Y*/P@@����QQ���dD�:O�"�����r+K��)XC���+���=K��y����Au���������~
U���3�������z�7R!���n�I��m��S4�'E�d������������Y��P�u1�:���.��e:�N��������8�O?��I�N5G�J�����BIM��l`�^�:P���h���r��X�����YR!��c(��s������.R���I'((��mm>���!t��=���=�5��s*H�{�5RD0�m������(�����N��&�"��E��f}�J�pR�S���SX3�J�y�/���j#����2WTH�6��yo���(S��@�Eh5��8�q��?��P��!L��-����n,�}M�;J��������RJ6f<9�==mDN�l�Om@-���RY��������(/4�jW
�3�l-)���
"����e`������;�hR�vz
/0(��ylbFQ�������C3
�Q*
V&8����Z���V�v���f����)R���������N��3I����T���������Jm�q��7*�����mVNM_������iIJq���*0@����S�I;���Uu�!����RQ0 �}�F<�DwJ���u$������F}<I�{�����'�c�L�;���mD��h�n��Sq����`�g�����>��z�����!6�]QLC�n3�`~�!�=Mm��+���it�5���J`�$�R
���F\���M���gUX�*��<�\������zO�O�0�c�#[t�Ay��=)�E
�i�����9Pq���'�+�p�������X���V���?���P�����8Rm(C����)�r8T�N���t/��P#����N��u����!u
_�GY�9)/��i%�SI	�#��HS^`���b4HI���+B0���)e+^1��8}�w����>�����$B��aH�#fO
D�R���=����3*����$�0�L5����\�AK[���a��Pt�����4����3��(_Q�"�sN����yJ����5������)/(U2��������zA�HI�B��+^`��������&O�����B��|��S[r	����
���G)&�@ohJU�	t��`|��G��@�\��	^`�Nk���(�T/���P��'���d�����Hx��<�Dj"�������]���Z|�5{D��]K5�U�My�) ��G��������=�����C�g�$��K%����D&zri��3�p�E2���~
h�����9������<�����B�@�ZC?'����SDDS[L���,����9#�
�)UN���Ui��"�����
����L�(T��Y���NyA�c�����gwO�i#�����%��8�K�{��D��u��7
������3+/d��4TLy!"�),������)��0{Fa��R6-88�D�wE%3����<y�g�.�[!".��.�c��%X�`k���PR��ea]�R����X���}r�~�p��E:��*O�C��4HNI�����R�	�W�J�.�����D����
����O%�.$%��s�a0���5�������Y���>�X7�5z�=�	��AOK����l�����Xj���`���hS��mK���K}�\�R^����N��@A�)}��U�x��)��9l��ZP��Bi�����0m����_Lya��^t�R��#�aM//Y����������V����y�:����0�u5�l!�03��q�X�q&���,K[1���O8s����B��7��L^���xA���n~e!8�+���������~e��6?�����*mD^�YFx!�u��9����Y�����c�9�����B{x��y�dN�B^m��9��FnvrJ�[�?�����?q,9�Y\x�(�;c����+��
�Jd��A*5����Jfx����.mDA���^~�i��W���6"���S�!%1�������������'�C~�H��y������)$i_���	����S��K��Hb���9��@�1�1mD~;�T#��P�:jP��e�i)��-������t\N���4����1mDA�)7x���)lvrJQ}�/���62����^��fa����[_x��l������3�B��X������r6'���n���(���*��4���%r:C�/�o��Wo��eJ�����|����A�;�
/���4����PV$����Bn���}N�������#��"�ua~$��t��#]�Jj]����/d��xA��.�����_x!k���t���mU��7o���T,-DR��\�V����/��i@�����w�q�Z\������	����"���4:/�����n�(���M��$����E�����vN�]�2Wp�A*�!y�^������x���J���R�r^W�PD��������������%�.����n}a~��_I������W�/d����W����?��xN����/H��
o��Gx����x=���$%x +����w5����ax�0����AyA:�$(/H���Z������x���B__?~a-�sB��P��^���(j�=a<�]/�Z�GRJ��0?�����x!k
�B�+K�$=���/�9�U����/H�|��Vx�w�@������L�!x@�^(lkA�~����������/Hg�xA:~���/�����?�	�*��t�CVJ���Z�GRJ��0?���������B�+B��?SxA��H��x!g�
�B���������/���{���w�	5�< ��m-����^����������/H���Z���yP���7����B�/XU0FH���%� ������m%�<��..�
������6���{a~~��sk]���<�{��������>�H�36U6�
�Mphh(��� +++���������h9�'����4�c����y��$
r<�J2���k��y�9I��U]�L%o����dfV�C��^dd$TUU������������s��t:�F�On��PN�gy���������;���R�����q~�R u
z<�)	�������#)*N�^�\�]���T~�xD�IP�A��t��_9�M���L/+jjj�n����U��&#����R��������l���W������T
����VA��>������~D���D�w����a����UK�W���5���d����IM�A\B���,���wR�W�7E|\���/�������W�7�o�PI������1��u�����c���#����R���jW�(TC��..�9NV������0?�����.�On����������rk]���<�{�����?��������A]]����
���^O��&a~����(J�-**��NSS�W�Pjm	���k��0?�F��Gj���pQz���!�G�%!U��H���Gb���/��uB���^�����0��I��#��[_���WR�E)��|!�G�!����H���Z�GRJ�~Q
�1/	���Z)�����gC���VR�B�RRJ��0?������������_��GVJw�Hj]�I=(����H���Z���G���?o���zG�/x����g�`eY�P�655���PRR*T��Og���RBBTTT�S����S����	�#����@Q[oqqq\���a<�{&����Wz�(�7�\�RF�2���0I�'����H���� ��$��n�����c���O� ���Y��+���6�����~EMa~~����FQz��< �'��W���Wy:���?�D-Ay� �(�(���;��Nk��WR���H�A���G����zQ�a���+B������%�.����n��4?�Nk��I��#��[_���WR�Ei~���d6��x$]���/��t�+�ua~$�����I;����0q��������^�����K�9F���W�j��/Hw�ZpO�t�����������/��t�+����c��#���n}a~��_I��#��W�(�����Ho��ea~
����!���|+�e!X)��[_���WR���H�A��/J�#+��V$�.����n}a~��_I��I�#����P��z���M�#�'�@��)�g�b`�
��|�d)#����S}M�b0������QIV�����0?���w)������m����is���)�_�_9imQ����lK&%	�!�?�������ddd�l�0V�Sg�{���)���S�)((�N��g���,������I
Aj��<X*�C������/�E}~���BTI���������_eO�N9D+���O���Q`�r3$����������`EYY� �Jl���7�$�=�paO~"��$i*�����?Kk<���ra���_W���'C|J�/t��=�(h�y<��4�'_�g%y��E�-2�an����n\(d�
&N�Ow��ZN��|������4��Q��1����'������%�#����`�x����pg�_���sME�)��l��%�f���h���L/p��2X��{�x��R
��0?�GiY�GZ�-����G��c(pV0����awPL�'H/)7���s=������tT46���pT~��o����hi 0$���-4�g{�q�	}���Q�o��7/��M��p����'��p= �����Y������5��[�����L���}�_�M�`�Q��x����'nC:�zP*US����qf	J���U�[�A5�~����/�*�hz�����K��-������G�
�Zz�= ��u����%�.����n}a~��_I������!���B}�������	5�x�������= ��]!� �xArJ��/H���]��^��O��`�8�����+�p��|���N�������s'AQQ�_��������i�~y��<�G��N����c�_����Y��c�����~��=(if��M����7�����Tg��!��L��_�z��S��M��o�����P���� �y.j�=a<�]/�Z�GRJ��0?�����x!��� �J*�uh�e�g1�Ic�;���N��R�**�s#
Z�L��\�*��:��mM�����/�����k�St4�<~"v=6����6^f|y��w�4B�V
��(���jb���?���w���g�m_��(gh�I�G
����� 
x�~������������T^0*V�v���g�P��1�-b�Qt��>p��.�z����S�6a��)�L�Ff��ZH��=);�4�\�c)hx���B�=:Al��i�-+Z"2>������#<�*�X��[�wB���T'���\Z`��K����k��=����4�M3-T�\�aP�V����4'�g9���{���5R��5b?���	��w}�5$F������ ��)�����	�����>o�,�K���sL�\z1Ou�:�OU^hia���h�+Q�.�y�{�|Q��)����v
&����5���/{��j_
%�TOtp�����V��M��4�0�iK��vn��1��	���lZ�Z������]o�m�w)/t�G�,��);�pR+q�����7E������Ay�':�d�j���#�o�����Gw���^a��oX�������9v���%��a\�M������W*�`�|�{����]�N	��8^���?)�/������
/���
�`��^`5e!����*�8v�J�4C�
9�Ex!��<}�*tu���������m����acU�x�����90��CKhkj�:��n������C����.!X)]�Jj]�I=(����H���Z/j�#�i+B�$=3~�*���2+��O�0���=���k���WxA4��~y���	^X��3��<��_���i,�8E}�����������M���`7���0��r��>)_�K	�+���-��S_��������"�\c��<���������3���=���P� ���~$�`fR%M����]bw�O�f6w��s�������
Q���=����{�%8P��U��ms��/�)��a����?�"	LQP����,�u����n�A���E?��@���cjw/��B��
(�5��O��/����F�B����|!��-oyE���V�a�|��/��;����|�����j:�p2o`n����k89� ��W�:8�~��1Y�rw+������#���tL��kw����2j ��~���x~A�N�X�n��v���w����
�h�o�68p�B�#�-��6�KW^`A;R`HJJ���%���~�r��E����Fzpi���!��<�^X�a���A�D�o��.�Z���OQ7�-�@k��k(�(!1$����#�sME�)��l��%��{�t��wO@Rl*��dQ��
��G��T��z��s��g�k�U��1�R��{�x
���G��_�����x!m�d/t���2����lBTB�XKmF�i���N������,���n���SKS��h������bu�9HOM
�\ZC^N�=���{�3�B�����9t���.���3��1�rr�����oX��^�o=u5�Y	�I���~7����� ��t��0�����n������cT������'���L�� �)G1�E3�**�D[n��������&?>6)���)/�������?��[6���cK��n�(���E<���4^��M����+/^`Z�VP <eP��k�FJve���IR�N ���q��;]�����32 ���/�����>�����~����T!�Q���v����
��q��}�Rh�3�[���+l���P�?��5��Y��?���N4�,Y�������~�C��3����A]Y	;|�p9�:S�hV��bb O��=��e��������S���G����/�J��~�A��?���S^�B>�KN��������z����Ff����PLh���5W��)����>[q�<��]�}���n����9-�l�* IDAT�������j�m��������06(�f
{�������,:�E�dp���o
u]�l$���&v��/T���.�Q���u�<|����v!��+,�4#�.�}x��=���O��WF��m���#��Abr��3��4�*p?�7����������f,�8�{���������'�v�$� /���ob��UX6�����DE,�8
_��1v�JDEG�4}6eaW��P��	T��q����y��6J/�=��'/n�w��(N����2

J=`�h������e���(��Fx����PRP���
�^9H����S_����z��t��?;rf�>�����BKCa�z����g�q07����)X�f(�~MS�,�g
����m���	W��4��	uk4���
�g�sd(����<�>�F���Jv����:�������n����>����p��r���
uU~/;�9���L�#�{{?"���=+x!��������5Q���u;�T��q���Q�~��X��bM;6K���N=qv�K�S���}�W^������>+wRX`��VQ��-"������W�t�e���s���A�J����g�!&1�������>7����}����e�.\��
�W�_�����������9�����s;|�����MH�!e
���CG�����v8p��$0E��>�DK3Oy#1�+�4i��~"��������}k�@����+>(WL���b���8��3[8��k	��5��	����1�=��1�7�P��]x�"����f������?�>������@�i-z.yL}����X���A��&��a=���c��[|qa�h��-"�|��I�p���MG����~��N+[�{�	�u�D�v�����)87�4�����X{(j(����xw�
?���2r2�6��\kp��rm*"�i(^�y�9Y�>��;�n���.�x=�b8?�>��-l
yU(�(���\y��c(�+���g�����[V�V����`�c�!�n�����S�C�M!C������3��t�g��)�%;x��C����C~�����LtU����q��v�����kop��G4�bL��<N�
�����4��kOC���+4�F���J�3�<f�����dL���`��c4��z
������X5�.����2��_{.����Ob
/;�����i=���r�9�qQap�	�?���-����ln?<�nY%V[����Ft���:�U�����c�MG�����K�����������p�J`��}wbb��P�{���|�����J��eY;���s�lFpLX���Iy���|�y��w���%�+�#|�A��B�G30�V�����������������O��2���Q��N�VH��(�KHMH�zc[(W)�8��H����Q����!�����q�A���V��e�|KI!5#h4���E;�@m&~�v��7�G�������L��*�]z�����_#��x�cOak�ntm��*���X�
��:f�=�dz�^�=��?[�����a��I
��N!���8���
}���7����"J[�����%T"��)/|�6��4���V����ZH�F�_�Oc�C#��5�HC������\�Yt����Y�������Ed�G��8�������(]�V���Mn����oQ�f(����ewLZt
�^��Q��8�w!^>���]���d��3���CQ���������.���O�����9�5t����*5a[�d�}q�XX��m����T���#���h��/�	�E�HLyA]S�:��uXp���_>��6�X3���]O���
���}n����7�.<�y��g-z��j�uI���x����iY,����9v������r�X��y��g�#������1���[�*D'(+�a�����>�L���^U]/�����������c���\M�A"W�wc�����x\G�I�g���o���>�D�a�x?n�8�������o6��?7����6N?�/�1������t�p�k���{m�{��� ���'�y�YA�^X�z+W^����wh�-��1����a��~X�b�^��w���u�^|z�wjP"��d�Q�(n��5������k@w>���wp5�9K7�������d�n�{L?�b�����/���f�����x�:����XA�Q�S=������+��z��0nZ���-95W�/$�}�����_
��aZU=�����s�����$���Z�R���J���@�(5#Em~x!m�d/��=�����1�#�Y<Y���������oR>�\����Nx��;����y)v�X'�;�}�lG	]]/��<����!!<�?�=�9�#��2�U��������Q\G�����-X@��<wa��c(�����
FF���s#����&����G��������,��
�O�6�������u�&X�,�&�W/���Bp�j�
�2��;�=7o�4�7m�
���KML'�����>�3�[�8����}za�����w�9p����"B�E�f�c>b��z�,`�����$������n��!�j����`��{�� ������F
����X��-�����=�a����"�"+x!��v���1m�P����(@�yE3�����v������0%	�l'��5��wz����m�W��Gm
a�di;Xy���O�=��)��������q���]�F2�������\s���� ���3�y����,qf_��<�s�i�G�?(����d87x�{�I���.�>�����6����O����+��c"�|B'���������f�@R7�*��/�v����w�:�	�u�~��+���Z9�F\B�_;��S���|������N�%^0�/�a���Kp�k3�R"$4������/:���_�eX@�
�
��@��Z�<�C��]x ����X��;&/�����b����i�
���\|4�.�'�b7���^����a�����3O��BKJ�iN@�h�;�]]��p�0Jhk�#��kT�h�A
{�Vz)/�.Q	�M���Mc�����T`c�{tA�q��L��	3Go��yP��3._?���v�����f
����v�������-iix�0��L�^����A'���a,�=��H���%���z(�����g.���W��s[D��,P�dM����l�D��	��v��u\ujt!�c6��8S:W|y��.�����Gn�g/|Z>����3�z��E���P�������C^��M];`���(��C�J1�bb���[�nbN��XC���8���U�}�R����������q7(�H�C� �W���-����0�1�`�SO�c����k�N@ ����3��q���R@��:���:b8
c�'��9*����9��)V�w�`����>�M����F7���G���rE�.+�z��CLvj��G��2��Eh��q��"�m���\������Gv�f���}�ag^���'6��|����~�
��(�����ozK�&���
^�3�>����g��#�R4 ����;*u����$�y�:��o�UhQ�-�\����0���A�yN�>�.T
�������rE�w��J�+������!����2�<,;T"������fo'�}mt���P��94L4���=�pa��-����������]p�����p�=�*�
�upg�u�VgG�$P�T�T����:f�N�F��e9� 
��m#0v�Jh�cd<z7*��wq�e�����#,*C[T�?���Bu,;�1	)^8u;w^�c	=(DG{s�{�V�%��
L�R@����r���m���/��,(�obf��v������-�����5���`�i<>�����gP��qTX ����K��J��H�{�s����<��RP2
:��d/lj9��F)-�����g��z��;�c��`��}�q�h��o�K��j�����_��^�?������g��eC����Z��#��r�r����@�4��G���t}5C������b/����TkWF��h8�GJX$�o>�f�z^H	��a����x�C��iq�:������ ���HAJp�_CVK
��q���D)(|��
aK�@oD'�-�
��]���5�FDA���.���9�O�@�@�@��z�J�Fq3���
GZ���a{����������\8��a���YMZ`��I�k`b��u������aJ������{`6u������|1���'�15���O���~6�1��F��{���	���������N|�����K
/����I��lZ��9���1��wK�n�����E��af^��K�]<����;f#>.������6��5���m+�(�A7\:�}�Z�������(��K�'��<�NoC�~�x ����`z�fe�F�Ve,������1a�	,��������aQ��������c7D�����^��*�s�)������Y�������|,���`�lw��ADX0J��NW^`���=�� ��Zp@��MG�-:�q���=����y��#^��A��'|x��{���M{���>�v�����������0���vMJs����%?�T`�#R�`}�/0��\e;��<�id,�%,9���RM0��������o�o�tL=�|M��m�B�[�7�%���x!�.�����!��q�,*����E��
���G�nm�q�!� �`����0��w������Q��9�.Y��[v{pU��ni�
3�l��

���v6�rO�>�3��F�l�6N<~�Rlx����)E
�"o%���)0G
���rJa�d
S���x6AG��5���f �A�$s��6D���BI[�]g"'�}^�MR;��+��Hm��aa~
��R3R��G���JV�B�`��">a���H�o�gn�+;x!1�5���B^���;�.���x��g��ew?
jW65�A�{����/zl��:�K��Dq��������������8�0�Ic�;�����a]����a(�c5K����u���'������u`As)�x���Y�},�yM��&���{�&T�T?GbI��M ������.T"�iK0xaA�6�
p��`c���uR���+�\���e��x	��L�������*�$`������z�*7�������%j���q�v�2��W�Z����6F��(m��6.6�J/?����/d�8Vw��;���g5���*AA�~vv<8$O�M��
�������W��N}e~�j~;���G�HM�e������K�_pH"�os�����kM�����?�9��0���|����
�
�wf_���vg����
^���CgU���"T,[��:��r����y+z!9%)��#\W`�V��3h�*�^�����0���d;�d1��4�[=L9��3?
Z_I��_'5!0xA��q�kz��G�78����0�l������b9�r_�ncx��U�1Wr8}q
*��E���8�1�Tf���S9�Z5�ze���O}��S-`�CL\�����2�"��i�������C��(W�������IP�p����k�:���ueT*W����@������M����H
f}���`�?�P�e\�y��!aA�_��
o)X�
�D>�����T������Hc�9f&���n�)H<�o����T����!�;��:_��de���N?7��K�[I}�>�q'��'���!����)���47�AJ�eIya_�.Y�I�����|1Ch5o�H�=P���fi*	9����)��)�����"4� <����}���#M���6,0�T
�u���������uj���}�y�������O��v' 7��a��w7��0��C��k:��RrM����<�Ro`�I�Oa8)20U���J���@M0�����������Du�\P������p��?X��5��ct4��`���Z��@
��W/����)dl��l���Y�HR�!P�s�^l%��7��"�%��q�?�O��v��P�����F$���
^P�U�����WV���Wi�����Tj���7���c����ov�����2A�P��>�
"p!
���,)�*���$/���
��<��=�lX��|���#��U�5MN;�	�����\��~/��+ ��V���������;��f4�@+�w�uH���:g���@	V�������K�dK�6�����:�4����pmR�Cc��T�����
b�_�8H����YJ��4�c5L�s��;c����atl
}��1���Wj��T��W����;`}p�#4H���~Mj���K\W�P�6FmJS���d/��RN�v#!O�Y�C���n��qj��n;A�o ��On��>+x��^I���
Q!�t�FgH�����Y������0����<K��<�]����XK���Z������L��h���{8��|���	^��51^~H~�jN����D���@����p�A�B��68�Dj
�������@�B��+P,S�~#j#��)9�����H�������%�SsHx�
�-�B���(��H~YuU��������=�?�'?�AL�!�m0�&b��$�M�@�w��a�������-<��-������E����������MLa�WIy��n��1��	����}���M�U���������]X��
��~�hZ��C
7�����<�f�����H�����z���A�AQ_0�Y+�8�c�9�I�^`�Y��N�N��{�����P�sf�������D�T�:���4
i�a��L�j��]X>�#)�sD�JB�N��N�s�jN7��� +��������_��VRh���k}��T��N�[��H�!c�~���<~3�_�)(�2����	��C��
.�&���+\�a���HNN����S`P���q��2X�n�������zNw~�hl�?����t||�X�	�����s���b��T���P�����9�!*^�B*oq�������<�}�+SdV^�
^`�M��Y���o��lX_�X��s��g����D>�|���&0fV����5(��B^=^���
��X���o8���v������GJ
h�X�Gx���li4}�^�s�TiWN�N����>�5l�	T��3�H3������cgh��">�
���C�
epL�����*b%#pQ`�)d/(�@��.B��vs}������\�������_	\����X�tW��s����W�E-X)������z"��0?������������`���6���Ao����XS�m��s��������RI�V���=^��#$��?S/X��WJ���T
,���EA��6��F�
B�wCf�������?�^�I�����2�
:3�V�A��f��~1�~���#��i`�(R!�T�2��	~���-hG��W�����3i/�����?����dRUx:�
/t����$�����f|�����gA�Dj�W������1N����_X��M��Y[�����X�Lp��X��@�J��/*05H��y�`'�"(C��^P&)[��Q4L�OE����/p?���20��Sw�<��f�
a�r���PLC�+.�m�B�|��E���)��g�}��'zx�bU��H���o3�L��������q`��62�I�;��c~����K���y),�T����8Q�<���B�^p�C;��Cy��^/��K�����@C$�kh\�;|n�K�!�~`V�\�_x��o�����-��"�����!e�X��z����M����`�'��-h�t����I���f_��Vl;�<�D:����t������>�O�����I��O���XJ��f���U��P��
Wx�r����)/����F���SK��2��
����_�'�������;�6�Ez[,EE���9�QyA/��o?���S�~jQz��5���* IDATx��ESc��|Ya}�C���U��S��/�53��%��ai#2�e���|,��,aH����\����<
S��-^���Rv���S(�H0��X�5����R�[����f�RyG|
}E@JR�������D��
^�:w��9�#�cK�A�����m�c7�Lps��#R$`�0�US���k�j��Ao���!
��JyaG���w`Q]����� ����w�������5�&FM�5���{�]�wA�"EE��w�3��]\V��N�<���33���{��w�3_�9�n�:�nl2S38��#��������]�����u7��
z�7����)$�J+S7X��~�p����ib�#�0�mK�:v�I������u~��+8�!�+}U8\�TVQ��<x���#��(���/0@��{���	Q!?�����=����=u�������Jc��A��d@K�9+	^`)^^	B�z����9n�����1��,<;�N��s���.<e+*/���hg3d��@��b��>�h���};��'��j��x~��f6��i�`�����v���Cu�@�<x����`G\_p��%�M"-���JN�g���Ly�H������)�p�o���g��5�,h�h#�Q8���uSo���~� !]Z��>..m�RZ�q�9f�r���X4�5����j����B�7���l�_x���.Jya�����*zP�v����J�:Nz������y�9v�t��]����S���_GP;���M��'x!#K�J*�����A��+0�k�Y-v�o����"%����u.]����J7-]{E�C�;a��s��` �5�!�`y@��IXG���������1��+V��__�P^���'|uj1��hN�S�^���Jt�*�ZK�?�w>��r�>O	�����C�]�o=�SF�RXyA����+^`*�����	D��hR^0 ����CJ
LMA�A-$�7�O)����K*
����5�����r���v�}Q4�.x���t
OJ�����RB�P�T8:����54�Ao{G��������D$����v��7�
���wcs��sh/W]0�4�<g@i&,I�����IM����a�U���e/05+�z��{3>�
+�a����m~7�9�����t�E;�������J�V"�A|VPy���y�:b)0���U�����������\���sh�a8P[Ly���yU��Jy��w��,�Ba��6������yo�=�'-�O�t���^�!50��0��?q����{�c� ��f-9F
}���X\<�}G,D0�S �,mR�|z�mXG}]���7�x���/0��:����}d�S1x�u��\4���u��.�SlX>�C�[^�s����v�+J���`ca@	�<���w+���Npi�=������23�C*S����]��4*a}wj�a!��X�^��<>8�m�q��I�@��{!m���w�����)����K0zp/4�_���0w�j,�=��L90c������9�8��i#
�>O���UR<���N��_���Yy���I;_��
@Z��Lz�Y�y/fR?YY�f��1��</�\�=P�P���9��E=,�f�g�'~tA��g������C�I�����c�Bn�[x��l�o��Z	��D�9!V^`'!���4P����a���CE$q����P�SJXL.[�Kj]��$���B|����Z������7�B�V|����;(g��94����MM���
�}�H/�
������Gh�K��?x<�(uD�"���Q���������d�l�>oa�5�sG�Lh6��ZD�~��
�������0��d��c%h��	L���v��#�� &��9�������T���9J����Oif��>
9�[�-NOvm���=K�� �,�K*IR�t �9�K#P����^���^��#p��|~����c��SJ�;�AXD�b/�h���3�xJ	�$���?�$yw�_�����lA�����b�*�bK�A��L�b���\����`;i�)S���X����p�#����j�(x���uM;�2}�O���L���4S�
:t%u�~�\H�"���f�)�X��v��=i���e����Or��`|����Q�G�hn0eV�/<�C�}[^��]�LE#�^���N�^k�}/l�~��9�����9���Z������<�����"�mA_�h�p�wE�^�u���{I�������+�����������9�_�ox���W����)^�����;w]�V������+�\��~����'|��O��m���`�����o"����h�R�E���q��,��t�P+^`���F9���
W7��f^�ym����B���1-�g0����Wv��>0�w��cW��Nj
	\U�0���*�t����X�W������>����s<��EU[����*��7f&�t��������W8`y���Zd0%�8J��� Xj

Z`���������u1��,zG��/>�cWS�b�����3�=!1�^���o�%5SV�ff��{F�SV��I+��,}G��th9��2t�u��\@�*"������~����v��Rk;�	�H����(i)^���J��|���������X=:����O�q�I�wYH�:����j���kq���p��F�GhN� ����+
^H8w�/�h�n���F���^`�����"��|M�r���QP����[���H9��RE�{�%n�H%�,^`��H�G�z����	���)Xa���������8���!s]]�{���]��"`��t��=��pR������M��J�l�l�X��wh�RJ`����'1�e3,�����~�@�K)�����q���m��������0��:v��T�H���#&5�����x��
0�T'
��`�!��;Hce�
����{O��e`�Jw����It�)UE��0����bn;WJ���y�]�����6�����H�,ZU��(>.���x:�<�URUp]���t�z���lk
/J��
��;��u�-O/qy�y����:�C��p#8����lgMj����
�����}>P���l�Zz
����PA&-��T��/Xj
��&���;�-����+�N����w|("�C�������*4$@B�R�����"Tu����6��,2XJ	���1$c��7��vv����tDx����w��}^�0�T���{�E{�c\����B=L�\��J�u#m��b���H�/�3x�<U�����������.,5HI� ���8F)$P�	f������vR����b����O��0�K-$R�������������We``�����Tq�B5�Vpj?�_K��l@� �S^P��E�����+�d�=N�E�1����:��\�S�ab��{'��`�/����F�|����[1��G>�P��c�{�k�!��������7<������KU4
p�T�^����`�M��2R������\�)^��C\z:X5�v� )������������"��y�jk�z5�����4�B��t`�jN�H�yNi"���1x!��W����Q��T�'H��JU�*���^H������)1h
h����<EDm*e6t��A��s������C��]��Z]����,�FB��J��y{,����:����J����<]�>�|nJ)f�j�����	�no�|x�<�ekd������}��X�F�����t�E_t����RI���,��kR�1��������ZYYs�d��+�S�
���@i!�w��itSb��������U�o��=x�JM�;�ko�@g�ZH�H���0x�����Uy��n1y5T��&��k���
	���&���!��@����b��\� ����oE�k������_H5�	W8���
����u<�D�3��%K���/��\H��L�a����	X������J���,
��]}��rYzZ
W@`� �R50x�1���fef`��oP���g�\����,��Bg�)X�%Z��u�6FL]��k&C[����'U�`��ln�|x�����"��a�4aa��6]������I�$��Q��8��g:v1��X"����.�����^�
T)����W[x���yt$ C|��E0S:HJ��~�����(��u~?G�Q0mKs1h�RR�������(\�}7���,��{����>
3`����L������|���A�����t�}��������?������jH/��&�^��fA�v��2z����bN�	��C��I?�:Z9�''i�i#���{{\�����4�������P��F��+���|��
����m&��o'{���J����/�K�)���6�Sl�#��zP�����l��wm!>���l�����?y������>������	��$	��?x�`�����
c{@��9���������j#x��=u5
"�4
�����#�9�K�^��%�+������VQ6��di�$��,�����F��/����	���7GN���e1Wju%���P90�<|��/|�>�v[����N����y�U��Jb�K>�8x�KSq}�^�H>)�6�S���*"�!�`
�@��T��L!��:�D�Z
�Mo�c*���c���GE�J����!5�PZ
v|)��FJX���e�.�GV�����WV�->� �� ��!�<P:������fE��G�J^`)t�
�K�U���M;�J������gXi�l70SG`���"(M�����^�^��#Y��Y�'�+���P^xA^�-�vK^�$���=I�� �+g����e�Z���\:-'��Pr�
�B�}VZ5x��<)��p�����-�	���|���Y=(��B|��_Y������ �L�< x��= ���;�f�{@P^(�=��������� ��xAv���/����]���^(�Ox��>+��PZ��T8��|C*,V����Z�#��[_��|�+���^�^����< x��= ���;�f�{@��>B>�^�����+���P^xA^��
(}�B�}*�%�Yi������`��y@������'�G��EV�B|d��|����e�.�b
���3I�/x@����O��/|����e�^(�=��xA�3D�d��/��CyY�yyV�+x��= �%��/��g�UC�J����
�/4�[�\��"],���r5�>��!>���|���.y[�Pr�}�B|>��K������s��H�������&�(�zE(�x�w������H�-11��N[[�s�Pnm	���kK���Rq������ke6\���3g��yJ�����Wf�B|dv�'��Ov�P��{@��aa�R�����Y=(��B|��_Y�W��T��=[a<��p���#_��j]����_������$�G~s�4,�)
/�����VV��b���o}!>���������A���H�+�;Wd�.�GV�����WV�_R|*�����u�B}���^��f�r5���tNK�����~}Jgrss##�O�^���)w!y�CB|��|NT��	CCC(((|N7��-a<rsm��S*n��!>rs������ ����*���`@Oy�B�}�#��sz�"����d�:��S�0��E!>B|>�*�|�H�����9����%���>��5��|No�����Pv�Z.�(��YYY�����o���rutt��L��{�x��SY%���</]�B|��SY�����m+U�TV](�v����;K���Rwi��S��,Uc��1���K�nY�SV���]!>������SV���.{�JEI�#�Gr���!>e�}�m�����:�"�g>�SV3I�v��H���:J�OYy������r9�@y��$YI��h���x$E�l��S�����I*�����������H�P�~/��l�/���A&^R���{!>e�I��������"��"���Y!��l�
I�������^�O���c�W���l��x��\�S�c#��l�#�e���r�^�op��J��WV�B|d��|����e�^��S��Xl���:��[_��|�+�u!>�zP~�+����0�����,��4�(?B|��[Y-���zP��������Z�#��[�"�GX���\���Y=(��B|��_Y�I��Y�-���`��}5��y�&��������(-��%]\$
��-�	�����^�O��_R�B|$y�l�+�����AHX�'CA�R3����u�}h�}�Njj*���?)�G�cG�+���O�}p�a�+��?�"�x�������o�|������}��|r����%��>��GY���.e��9��E�:�+B|�����Y�EEE�8�3[�f<���x�[���gF~s���$}Kv�@zNBI�������+j�W	�����4V����}/����E#2'L.�RUU����\lW��[ff&���J����,B������7���t�Ri���|�p����E�J��0R����m�j�CX����)o�����W�<��m%�=�-�Px��0�R��������f7���]=	i��<>;;��OI�����Y�����<���e�� /0�	�!������zR���e=M[Eh�$���tu�mf�������6R����/����BY�~��r�/�0H���y2���[o���{1�1��W���~��%]\$9MX������^�O��_R�B|$y�l��h���|
��_q��O)"=ED$J2��o{�0DW�|JsR�	��I:R+��"���bv���iWCI�q��z������6�e�d��:���S�%�k��\���\����R�� 7��3���!!�M�	����
h\n�#t�}T��
�����]m
�-�b���h%����>���;�x�b�fe-Ck
""�?�X�����/��`o��t'���O��5���^}���T0F��&e3�N/�"�f���b�"�eg����i�e�3r����g�E�{>�s��wmU�����2nES�m�X�J���1�%�/
��|��`�x@������'�G��EV�B|d��|����e�.�b
���3���� ���U^(Mo
�J�� ��9�*�-^(���������/����n[�J7&�P��,-k�PZ��2������%-�K3����H��>Exd4��o��>i���c�|�8S���x���$�����A/���}������GN]D�&.h�����
\��	m-
���SGC�d2Ya��w�=�a��p�$�hk�����i��Ev�P|�� ��!,V����Z�#��[_��|�+���^�^�|f<
���6��6�|�G�����{�����������fl/��t��B�e�$���&�����-�o<Z�zy;T3A�&�y���Wc�%�����O�W�Ry����DjJ�|�K=>y+/�_��y>h����(Y��*j�3��sJ=������ywS<�M�f���)2�3q3���})�J^h��n~{��u��A%�-2�@��.�1��'����V=�po�=������c��H�����+��"<�W�~�(o������x������%����E�)������_O[k!&>7�Sy�)���T<�� %�/^H��M
�?���yC��W-Q����
�9SJT����gG� ��=h�����>V�K�:�����H��|������9����7�����+���(NC�/��k{���RwL��{w/DB�8���k����%�Cq�^X5�	Vx����0����@���t4U����O���>z6�������=�V�{�\��Oj�O��G*�^���q)�hS��{��������������C];��|�D&�rk�����>�^I*�&�P��3��R�����._��B��uj���g��u���9qIH=uZ�K�W���}C�g�����JA����������/.x��/���F�|��X�SU(�� r�����t~ IDAT���aWs�Z���k�����p+�D�0�Z	w"��S�zy�����%-�K3���H�R���~���8��3��
�F��CM�8wV��a_��G�"��Fm��|�z����Ekzhae���h��L��6�"���C�u���?��-{1b@h��PH��/H��l�W��=a<��y��#o�f_��l��wm^{X�$��S7W�s�o��(��)�/���K(�U���<�����p�2��(���btw|�������Gx���e8�A�����'����}G]�~Y.���x��c�f}���Yg(�(#x_�y�e�S�U���CGC:�o���%��k�2�<��z�/���]u��T���e/(S
�i��z���fs��go'!��/�e9o�Dx!n�~�����'�^H�x*5,�R�\�0[�K��|�<X�v�I�y��;����]T�bY�����3�j����f�}���/8Z����<_�xa��FX����?-
��0EI%xa��Y��������2������Zml��i@uI�Y��B�U�ps�Q��������o���B�����H���/t��3�����n��4�u������a�^�\��K�m	��x��W���%-�K3�/i<�6��k6���������4�����u;0u�`�EFa��S�Q~F����#*&o)w[�6���V��}H�!33�����Y�jR��7,�k�_��=;�y���mO���n;����6�+�����>]8������;A]]
�YYKA�+M��c*������Geq>OO����!yGm���
O�w�����hb����X%���m}�[@Y�H�~II�CX������^�O��_R�B|$y�l��h���|*/x�=�����.��A]����'�SDD��/RB�����_�A��calV�=m�������������>�����
{�`Vj�;!��!�	���9����5���x"]��$�"���=��0���n�� (���N���>WV�����O���Mg��7AJZ<��C���r,
^��G��s��\hv�	E-�m[%����3����~)U6�f�n���{7Aw�X�cfH����/��BOK������s8<���+�\��uU�w���B%�r�"^E�aN�6�u����8��h<zkC�9~
^!���%��#��4c�1��cZ��D����
��\ya����eD7L��\j�G�:���=�z5����=rIe.$*���aX��p��FJz&b�R�����:�ukI?�EC:��V%���p��+�c�v�0��E�edg(�<<s��nI���N��v�z-����9����9���.�� ��-<���hN��9���N�*�w��G�H�����(�N�@UOi�����-w6F:�����������D���)!i�=��^!-,�v7F��hYi�������G�I5�m���9o�:���jN�gj����H�O��O����u���7*77�Y���2_8��3����ix����,�q�)9�����*����X����v����((U��OO�i��:���\!��-����j������>Z���?��SV����n���Sj �E
����1���G�^U!2U�c���1��ta;���S���O�?I���I��� UE��`�����(��.^ �6^�jz�H�H�������3�=����� �������y!�U��u���gH	MA��]�(:�:x��D����������4F���g��)�|^>?�q~q\y��*o4Y�W'_�i����f�����F.���n���$�$���{�j��U)~YH�I/�����������s`S�%4�@�[����U�)���u� �}�@D�����%��{!T�4�����g7�q��s���I������C
�H~���o�t�<��#��ts4&����=�<g�@6�l~�S�H5��8��eXt���;�������
x�"{�%�mC
4q���x$~`����hPG������������v�`R?}��V�1}v�V�z��~��g�����\y���:D������~/4E
x��S7����::4�s������C�0}0�OS��7\�J�d���$z��B��j�O�Ejz._J���*�����Z[	�3q����T��8xA_$��N��D�����=���I����~���%6������G�K�
I��]���"�\����zm;���D�����B�y#�;�F����t�����x�����T����f��H�~�����6#��~P��|�8V����V�v`�	�3' ��m��+�WH<q�+
��A��b7��{}��x�'�Fv�~������F���z���@�d��!��([Z '&����)���9��*��@��������C--,1�������-_l�:����a+�
M-��9��H
,N1��������]��\M��z~<�����"�N���l��5���x�E���A�>��'����K�l��K��PPT��C���ru����������:������8u�w��q�t���6��&M�!-=	Y���i��X�w��t]�������2�	ZZ�o�6����������_x{���Q����x��1���s�?��7�af^�7��w�1=v
��bafQ���������w 6�
�p�Umq��(�=�$x�@[
K�4�����!8|#�����T�"e��mm�O����mv�����b�������[ �M�U1w�]�e�`��z��T�OP�9����aJ/{~�;x5j�\y!"6-M�p�=�������!��7���a.�8S�_	���/y_Z�5�{�l�$�s�=jgJ�:XBg�*P#�*�|�=��������N���G�Y���nH���|�k�>��IM����y����-L�����,l9���3["8<��k�����/c��T�U��|�/�h�-l]���v�
����aM����}\�s���C��0SX���=
m�lW>X�k*4UE�Q��u/��}����K;�T�8��:.�C:|�=�{&������a�"�rz�������V�oG`T������g�q�~��������D�2���-�s��9����;����C��?��U��C�����%}�&��\���jh������V��
��R��w�)^���:�Nv�������mi��#����x���-��-�?������/�������I�/�E���F�=c�����Ix�����O#1&��,E��;�_�^������v���_��5�F��{���K�F��K�r��_��Q�&P2�A���s�z��������Qg���t.����0R����������`�*�be}�6�������|��G�s��t��S^��JVt����m�����z-5I
/�����6{��7),��k*�Eg-�L��)����F�MAO��y-E�XI�����
��uQ����o}<���@VdB��E���D������f_�B��;�� -0	�d'h�}�����<GRVPF��x�n��A73����d��~
{=���I�����b�H�B�FtAD�OPm�=DJP5QG����=����������,z�c�J�*0o�W�S�P1!��K�Le�������G�t��~Sd��]%z�{��C�fi+/�M�+/_C|j*��41�u+���hb��
#%%�����/�T��8�/i<R�+�n�����P�������b�J��������J�Q�N�����AOG�]� Oy!+;f&h��	m��i�������\�a������F����k[SCq�������)/<�������S���`�W���sG��=P������8�=��,����D��F���F!t�!"�
������Hu^�cP�h��-V
���d)�B|J��r4Q��#���R^��y:zX���h�CO�����(x����D��~e+�$F����{6
��	����9�)%��lW0����1�v�j�x�����!�8�i�_��������D�����������~HH�@S��8qcZ:��}�x�������$e�Q����u���������baEpBU<���g�����7z-V���
u��H:{�z '6i�A�}w���/����S`��]�Z�6�x�b���b'�i��9#1p�v���[S#w�U_�����y�������;a�����\1{�	h��=��c������mL����]ETB2T�����BU��D1�7G�f+�j�WFHt<,������8D�)�Qj���}�>�nA}:�������VhL-rsx����x�2�}�&��
T^h�h��5-���ut�g��O%���0t�.��
�-��jui��*�\\���V��i�8������pl��qo�����v -�����F����{|�?��[lk�_y 7#���7Fy@���kh!�t(�-u��w>�����&�f��ZSl8P��^���������x����6X#xf��E0ZZM�z/R��������c�����:�7<@�)�������6�.��`��2����JP@:��c8�����!�����/a��%�#1(-��F{����7����������P�7G��}�?o���{��o���`7��C��� �V4*73B��x$>���>�x�{����dQO��yW����Q��O-E�*������8��u����^���Npv9�(��~~�9������.�O�����5�&�F���6���
u8Mw��y�Q�_
���G�_�����p���k�����S���^��__|,�Bbp":������4�^M}$�N���&�{D��)5�Yt>�g���q=cT�X�T����w��N:������O�t>���}����������T\:��
�!�����w8����i�
������y� �C#-���^�6j�v2��Dx�A�X�.�M��������Bph&��da�,�#������F��X��Y:�(��^���U3V�c����vu��T��F��MT�xSu1���#F���4
-]4N ���lL�6����&~��������il>G���p�����2�����0kM8�u1��>������0���`m�O!@���;~��p��REsg����������N�o�+���#h�Q���w`q�BkK�77��7n��m
��}��b������w�i������G��r"��7]������mZ�%�T������S���Rnz@�@j�h�����u����NE�uZ�iR����.��5Uh4rA��3�^���bcI�L��;�����*����{�3��w���c�p���������3�u��lL�B�9����;px!�6n�O�������5T��*4Z5A�n�N�6�*�
%)��m����
V;��.u	B�R�KF�];Swm��@��
��&O	���/��*��C��3
�]��{?�����J���L��i���P�LFt^=�H%�]\>��:�-��������}�K�z����9��Z�V��#==�w�����nX#c-�<���i``�a���~����neD��:[,����G��vm3�w|�&��qX�E�!<��6�>J����:�q��^��w���9�������
�
����FzZn�<�i3�c��9HL��W�����_sw�_p����>VG���e�7��)�8I�BkZ�oX�k��Cs�����a�\B���B��O�=���4��?���&���Lh�����1a�u�����<���]��sb���bB�9�CX��v�?��UM6f����MT�W���u0�;f��Ku����9�y������t�!�W���P���{/�ki�71)��$��Gn�qpl~��C�^����;��-����Q�]�6,p�^:�7�Oc����B~^X4�����>A�k��kA�1�
�����OP{�/����v/�������da���]�����`��m�J���v�����7����H�
�����W���	Q*�~�
bp��8���^�m��x@0�!��C
���~��y��7,�^���f`��C�N���As���?�K�o8��������EM<R��l����5�_����}�aB���w������_���L�&{���������:\�����U���5<�����H����C��6DUt�e���_E�a��E�F�=@������
6}]��&�7K�r�x�f�����n[�}�nxx�&�qg�Fv����;�������v��L��.�s_����5��M�)+L���7��N���H>D��(��"��#����	)H%h��1dx�A�i$�#����BA9�y��T����A��1=[�I}
*^>�G6����=���*�:tv�|z�����H�
-�j���D�m"BBl^<����S�?C31r������?���-^�o���B�-ALg�����wj�X��/>@H{��T�DX-vA���RE��;��tw��"=�&�GA���;�C�#o���f���Dv:P��@o������g��Jeu�~e�`���Pp;��M{1�/�9@����OG����rx���2�S��h/���"�~jnn?�N���j#�M*,"��:����`��������t|�V���+�hM���J*� �Ce�}����\��.\�mD�������R2��@~�s3�~=�{��S��F ����Nu(�������0) ��.>n�����x�yLl<��i������0���uL��f?�?��7|;��KAx���#�o3��i}~H�>���zP=P��cd�z#���~�i�d�����j�*����b���f���)��q6H�SE[��#9�ey�������+Z|xA���Bx�?�o�%h�*����������gJQ�BZJ<������L4h;����C+/T��7_
����v2%��f���y�����������������x?�l2E������M�����5{b��h��^b������K�oi�������(x!79�N�Y�h����H:s�C���Yz����H�r�vP6�N�Y��wr��>Mq�����O�F������5b�V��sU�<U����t���1b�n'� ����l;�;`��������D_'~����j�i���%��j�
��
��
���y��f������vb?n���	z7q����1=1w�In��L��)��=k�w6��*I)/���;5�Cul<��@zQ&�|^�\�6�G�8_���?�s�@J&:����'m�����9�W�]��{��&W)%a��(-��7mW�=Lv��~"4?���������+���qU ��r-��p��
���X���;mx/|�95qg*����B��\�����T�$h��k�b�s;	���y��om�����JZ\'����a������:p���(����'Dy�r�����x�
W9��/O�f�
���H� �6����j��~~_�����a}���CRp
���L���B��5�H�zJ�Cz���gF�
�zS����YJqi#,:Z���5B�^!�h`~*EUE��k�K_]�o���1tm��������N���+���mpq�����Zz���m���.���?���������0��}���I�
�*����$R[P%����g���#�L��V�r����iU*�B:���G`�K\��j;��'�[�1b�6������g�r�/>����~���1~+�l���"v3i���0��6l,Tq�b"WC�K��8�TCmJ��lB~���@`�^�?�N
u���1��T�<q�Q�����i��[�.W�k}A
����������Km���SM8y-	
�E<�Cxt6�EP��D����]g���WM�x��I��8��J��.X�!��e����<��A�i���S��1Pb�D��6*�`�B��t�A��`��%��5�+4|J)^gD�# IDATP��i#�GmJ����>|B���-��> u3����� �6)�F%mREH���6��P�����!m�b
y%n�>R5�O;
9� ���*�U�������{�8�@��r�bk��6�6"���[Ro5������@�������!5�D��E���\�!�������2%��LA��KP��]���bx��:�O���"���m-�(����.��R�R��vMO����,���)@%�JS|�i;���C=+K�q�\	ZZ��}^�Y�Dx� 
>wS�B�OCs��D��+:�-%�J��_�wKV�(�AI�SD��{&�U�q��r���)�\��
=z����;����7���T<zx�C^�;�{���������e�4S����6�Q�>N_�oc���p����#���]	4��m���?l\7���D B//�W���3���}z���^�����*��1�V��p��Q�����m�DI�$x�����Z�V�B�w@4�-h�A�/�i��p&P��c�\����5���W5`���AN���m4�cT���/�&@A�~�4F���b���|�?o���i���w}#����3��T�	xV�����Si�J���M���������
���=	�`���	��"���������p��?o����yV�����\DG�4l��^����J�wF���`�B�'���z4~��`����� JZ$��M�1�u ^����K{�r�.���};�-�������#�8��V�}{��"���@��+WH�oi�N���@�)7�$�j������]?9�h������
��,���I�.�5eU,>�/�u��{~��N�I���m\�������~���LaG�Wv�9����:-m����*�F�N��3�yo��G��
����Y���	�����8xAM_.3I�<<W��J#K����t���h�p���Th��\�M�oK�/T"p����0�%��?x��I��I��!$��\����`��h=�����w�F���,$m9����{�f�����������6���H�L�&vG����&�!'4Z3<���	���:9�����0
	� ���M�R�����KP���t���N�x��A*
C�6���?��#�����4�7%��f
�f�������^)��������d�8�����oB��4��!t�;eMg}��y�����F�|/:����o@�������z�x2�l�4����z�NU��A�g4���|F�'CQ[��������/9t`�k=������x6�D�u`���n���u�l0�/�:L	��X[$?��
���O���T���lW�\�Q�il\���+W	Z8��-kX�s��UB��K� �YVv�U8x��y0�H���[�H�srr*��)�s����p�:4�$����:
�x`���Z��@��>�cax�-(�G�����f
���C�RXy�]������F��4Z.�(^��<�{Q��T��?Ah�;9���T^�Nr�;��pF;�?������x������W�+����y(�G�����/��]^�w�4��n�aR�&��|\F�(x������k��W��&�������0����2����CM(;�A�_@>����#���#��5�
���$���|�|^pr����e��05�I/������E+�Q�P��������'����O����4�;P�������|������;W	�P��)��CD�%���uR��`�/��i���*������a����M����t����#1�����j���:hR�:6��E$�(�RXy�������p��M�bR�fX�������8���+/\|�sC=�y�:Wx�b;��e Dg������v�:�H�/g�owJ1���-������`��G���4�Hy��/[K���B3�j����l���~�,-�1x�A�Q�wmZw����iqA%^�1l%���)IQpj2��g���X\:�����^`jz�:��fI�`�4Z���VZl'�������	u�5���/�%^�/��P{�
|�	�����\y�kCi��K����.Ep���������������M�P(`��������d�b�e���� ��������x�X�.��|[0lFY�?��II��,a5����Pg�-�&$pYRU�y���Hy���E���fj������r�������`E��(�>�������Sl�N���^U,s*xATEC'#�\x���;���k�����V:�%����X��������[�R����{��8����D��q�+/�c����������6xu!�+/��M3-��}(VxJmR�a���=x��H7����e�d����/4i9
w�oC������C���}����s���B�5�'�=��X�?)>�>���2H�726?M4�/�������(��,��+J���_NDlB��,���N��IJ+�T��x�����)A�^�@<�AeR>HE�y���<���(����Cj��@�mK/������a��!���\� ���b����o���$������8' ���T��ueJ�%��%9�q���������5yZ�K$�O�,�%�\�"Y��L�La!,����;F� x!�T���]\��� ���<x!v�hSYJ��z�Tk�9"�R���/����/���4J�T����������v�RJ�@���7b�y����~j?)2��aCR����S>����6)?(,��H�!/e�������gSn��40,��-#��q�����t0e^����bA:���!��MS�a��m��B���\y�������v���#��IHS���H���%V�0t��n����^`M#�%��UQ���D�H��W4t?o�SF��I����5l���fS�~�$��A�)�{�0:t���@�!��2����xh��+�S��4%�;�Z��]�����B	Fn�~<���W�Y���d8�����T��������A�<x!��SB��{S���]�����x����UXa��-�M�/,�� y(/0!=+��R����RB�`k��a�lyZ�~!��Chm��g�!�T
+/�������'.��~���rb�N�Q��H�������M�q��b���Q%����|!^G�C^���
��I5�?�c�����b/����bHy�T��}�c()/�4��_v{������	p����'X�����b��B�y���65�Q)�o���jE�g� ��sK��U�>�r��,�	T(�@��T����N�\��V���)q�����L��}�>���D� ^/�bx�������P�)���r�,�>b^�q<,��	k�v $6��JM���� ���L���?b���0�E?l�q���`�����0i�������%d�!*)b��i�����eX���?��N0�U],=�^��P�1��5�:#��3T�_
&M���u>�Pk8)/�d"��7&�@��p������m/T�'����|���v��o����z�!D�u�r��,*�R�/(U5D�_��=�'r�c������[��o�-���B�&4:��i'�F���j��F��*\y!���8X��=W��N6!��@j�/4l�	���h�Ko(]M�|x�)/\;��r��\OI��I{J�sX��[y������F���7+%�/0���-yZ���R/(	F}��jA���(�f��{`�Spx:�}{,�����
H���JU�����
���Q��/�Os����������-�Q�������:��s��1���P����C5�{ ,9#� y(/D�:��pR ����#��S��g��"��<T��W8x!�,��]���{�1��E����E��p�$T'�����4�����R3�8��i#
*/�<�G;�Q�s�.�������`�D^��4hj����Y^X����&���N��G,����4~���.���m"y8��B(���@q��m����R�n��}y�X���y�\�	@����sf�{f��c�C��^�Q����O!;2)�x^�2����\��&�G����@E�o� �=���;�w#�$m�n��=f"��]Z �Fp�=�4����w������^Q���g�xr�r9�N�����)
������������hw_��B%mMh|;�^�+ ���4RH��C/�I�Lc�8��9
e{;�b"�|^�������}��N��AH�O>��7}v�X������d�����x����)ZL�A��{�GJ
���>��<
����H1� �j���IG�����H�l��)-��q�<�>�{�3��B;:�iq��^6h"��-D������$x��!�2�+�5WF*-p��v��F�!V��"C������0�{|�_����Y�kC�:z�T����~d+����t�.�0���n-x����2��M$-H����G���A���%���BGR�H���.R[`���0�����HJ<��5 ,�����+�W/h���zWpu�_il���hh'�?G���>��+��3���p0I�R|<����K^bXIi$z4�M/B������wy�c�B�v`j�H���p��XX7������Y��\���-�������x��vj:i�����^7v�c�n�^�P��h���G{(�+";5�|��+����P�5�/���x�/������)�4��IA)��O�z�U�v��h�'`�������W0-�'�'8`�����zxL�#t�hs`!'=�
B�:CA�/T�g}G]���kvj6o7��A��j`��	���C/��I�������-�}K�F���-�z:Zx��	�5������}�F/�jM�����Z�>����0�&��P�j�W�A��6��T�����L��4&���+Nh���I�I|���Y0u�'�C�d%d#�'���;�%���X���K(W0M:��;���q�`���5�����y.���dG��#N�J���k�"�7��r��X��ny���@�����>C��x����3o�����Z��:��`���l����
*/0x�f�-����]��)Y�?L��{�}X��"�e �A4"��?pE��}H("}a�6(�:�O��s��T��|b��f�h�~2��w�d��|����e��|b�;�u	�yz�n�F��Kx��.}����0�N ��p�Vy��x`��y�����!o�����Oz�t��|�so�l��2���0g�!"��)M�"V�����T,����).D���;��z�����H�������'U��=u�K@C.ud��8�������Hj�^�h��������1��'�S�fm�q�T�:�.�7����nRmx��o��io���\�k�u
�6�Rj�&"���8�Y.���T!�S�����u���>��%��^H@mJ7��|��S��U)���������y������B���OKCS�j�w�!�5m�9�?\�Fy��d�J9Twh_dR��<x��$�!��? ���H)A������o	P�������kS��!+2�~��)�TU-�������w�Q[�'��=�'@��	��{�M:�XPDElEQ;�O��{��C�I(!@$��M��LL�d������}����3gf���;{�7�C�`i"��C�r������^�D"���XY��jeX�s���L�{=q�:����;w�D�%�.^��-�����_Q�>����tV�i#�q�Z�M��A�0��F=e�M�����(�*
^�H�������	:���l`>��l}<l\��i
������#��/�w��C���=��^����Wa�;�k��i�f�\e'e�
�U^`�B���Q���&��:����0�����{�#��lxRk8�+	>U������6x��t"������+�\��:y>z��|�{��\8�
v�)%�����M{���N���?��k���HD�������	�G�"��;�N����T�1\[;g4���V|������CJJO%����/>������-0��z�����5�GoA(���^����m�{�[��v��h�j ���u�Wp(�����C)��n��&#%�E;��!fs���4G� ����:�S(���d��b���&�S�g���.%�4aQI��f�I��FEG0����|�
�Z��4
;\�7�
�}S�6�A���,?���{By��#;�������Fr�7I����r���`C������p�������B�7^A���"�	
L!�)?T������c�������{�o�L<$U���6���������&�fk��+�vS���)U�p���K��Z�ahP���v���GT����}��������XzbnD���Z`���^�w�$W@`i�"B�)�~^���^���L:��!�{X��\��I!���E�����">5�{��x^`���&WJh�[���	��xSV�������������J� �Y���>�:d`�.��l��[���Y~?�����q������N��D��>��X�[��|:�@�q-������.^�p�B�/�{A�������(D��m8������H����dT�[G>XO����6
��<*��k��}���c8�nA>����0��F�N8��t�6�������R^H�s�0�������vH�{>^H?�����{��_+��?���	F�UK���*J����xH\����C�o+�"��,��.d�[0���F�������ohnG��R$f��4����F}����1/�{�������e�P�T���<+��MO{�p�p2�i���@T�z�]^`�5���Ki8{(R�;�*/Xx[��TJ+Ok�RB�Zz+`���h�C��m��L��[3r�)/T����R5p������,�D��dJa�*t��c{a�}s6���
��n���O�t,��m��ex�\�	�/�
��m}'�{,�~c��N$�"���`WAx�B��p�4Y�Y�q���p��4	��)*H�!�x44��dH�>k�2�����/"�^/�r�k�'��e����=����	kZ����3��{��6��aD�F�����<aZ����L�it��������Y��/L��?�}��DB��c��-$�g
G�S7�N{����xap���O��HP�H�U:8�lI��+c��/\
��M�p��P0�O_��S�8{�
_�O��I�N\�Ey�(xA�=
/gC��x����f�O����z �#�S��B����t�Aa��6O�����~q�����-_���-����R���r�F�����}�/�cO�:R�}l��:�F��GA�P��/�0
��������6�P����������Tx����D��F�k��G0���D�g�����,�^Q��!��/���`�`�C��(x��m�UT���+hW�P}(�6��9�i���.ku����o6��LPC[4�s������ImS� �NY/W0m��}-
^P��|����h�(x��K�FQ�BI�_���Bi��4�d�*��F����}mxA_��\=��J�}�%����/(�����Z���Ae���(�_���->^��^���(�����k�U/<�����kL���y_�(���a�>�[.c�Z�VK���9�J	xA?'�he��5,I����:D�HH��GS^��i�T��|?
xA7
xA7
i_���`��K����d�H(-�	N����tpV	�B	:[������P�<m�Kny�	���j��Kx@x�	xA�	al�{b<����E|�zP��">��W�u/�zP�rgR�����_
iU(/����!= �/r>�-/���
�������	^(M?���^��'r�
xA����+��|[-����R�6�����4/H��(������
���T��r��������E|���\��/��/��d^_�����V�`Ho
[�����`��d���P��+���� IDAT�����J����-���D������	x�P�,v�P|���f��W��#�)e��`�B-�L\:2O���o���tIv|~�L-[�n.�kl�{b<�"^���������.���C����r�?J��[�������)�R�u
f���a{�T�u233aff�����w;���g�������8��|sr�#�O�jj$&b���R��]�$��w�$VT��!;;W�O��X��.��$��L1��o";�I���G�����h`jj��o������#+S��ji�F�xt�[|����;Z�*-��xL���Jd3��Q�����{am==�
U#q#��"�����euwEl�5����=�R�T�>3��nn=���8����l����g6��+����eeL�:ez��j��xE���LY����bY��>j,9�Y�Px��0�DF|<��.{��
�����C��K�������?�P�u�W�������{}Y�t��T�\�D�U�A�+!O�E���������sKs���w���
Y��"99..ec���1��1_���xA�����^h���L��<�\�9NlVj�P��/�S�������6����/��|�����6���">��m�S|>|[[[XZZjv�x_��l�I�G��$=`L�-!!������$]�X[b<��� �E|�F����(�Z�����;s���)��E�+����l�m@�z�NT4vxA�������E�u�T�������k��6��/�x��e���(�_��E|�zP�������$���\1�eCxQ9">��V�e�Y)�����Q��r���������)>b�R��"����\*[_�GY���^��c��*.���'<p��4�U�Ly%--���NNNe�_�t�I"������U��e��O����)I�|����ro�"E.�S�������g%YC��$��[[�=���5,,,t�XFK�������-����1����$�:��c�O������OIz����1=gs@��$?	��%����J���OIz�����B��^�\�= ��
�8i���Z���Ae���(�_���->�����l}e�+����\*[���#NZ+;W�Z���Ae���(�_���)>�t2��U�G��V�������k]�G���_�N&K���/�^������E|�xI�2^P����x@����6��x��/r��������E|���\�����|!�#wF([_�GY���.�#����7��=�%1���!,�������Q��r-��J�T�������k]�G���oL�������E|�zP��">��W���/����o���������W�u�T�������k���#6+��e���(�_��E|�zP����Y��\�k]�G���/����Z7����������l}e�+����\*W�<m�I���/�^������E|�xI�2^P����x��V|��g��	��n.]t��dm�M�������6��xt��%ZA��D��sc">:��D+��s������^h��t����
L"s�K�������x)Ey���L���I._Z��AE� �����h��Jk<US�*�[j7�������������7"�kmO�Am]�������������a%�������ZY�'��3��h�b<y��/��S�zh��U���>������er\E��DU�!��/�T�MmR�	��9}��wc
Wd�{��R������)&=�Z��
t���?�����V?���'�%����
]���x��x�:>Y�*)��x���p3��A�U�Ox��fa�T%j�������]W����]�}1Dcy�s7�������qfgg��_�VK�b�r��<��%�`6K{<�H�$Kt:���F����a��	
���|o���'��;��:��P��9��(��1�_1_����������5��^�2O�K?O�=�>�G��s��T�5��v����f)6+u�%ZA��D��sc">:��D+[|���/Q������Y�v
����j:7c%����A{TvTK�S'�p������E==P/m2�O{�X���Q~�8s�l{N�z��l;�8��i�)�T-�u�������2�O)���8��K�RT�)'Y�
g�+'�������}x[z�2P����%/��h#�l��ke��zwaa'sl�����a�GT�F��K�~��o�Apx\�tdw
_XDK��K��wk��J���hZ�6��}�r�u�S�
�Z+O�#3;�<u���~���7�m��B��M����e��Q~�l�>�������X�}�.Pq��(�&�R�6�>j�O,��������x���E� �����h��{@����6��x��/r��������E|���\��n��mW����G��""�y���������t�E�S^���w%[��������t�Wi���a# ����)���7}�	xA_�W=/O/H��^��+m%���C���^8x����k;����~�?���f���+A��{�=�uI�rp��z�$������Z6F��F�FNN-�����3�/�<��m�������Tg�������N���W�������|�WD�����l��f����k]�G���/����Z7�����/��J��w<�^��b������7�p��]�\\�]%���kX[� �v�S��U7��?W�����z�a��t�ho;[��d���i��=CV�/�������
i	�NQ^��k.�/����[�����z���[.,��^Q�
��P������G4��'?�S-+x���������V^���>���C�X}�,������+�������N��?����oGtB�����c���z�+
	/�$D���mpw������������^a�Ry!<>�������R1�As��%�����������Q�7%5mh��U������H�u���$�#���W���.��,l�~[$�~�����vSZ#����	��	/L��?�=�7:���3q=2ZvW
������{3���6����.���	/|�b|�j/�����Ry���=,Z�#+�!Ll��~���X2�������~F�q?c�/c�G�O+/d��!��e��+ ;%
�-s��^)�����j���R�V������%z����G)��Pc��p���V?l	���X�R�(���=�R��p�o������4��5�r����:��+lY�
}k#����%�>�����#�z��VI	x!u�^Xth���`���{i����O�s9l_!�h�e
��~D����a���N���0sp������!��R=Uv�	x��b�^HIM���W��W����i_�����-l��U+WD��~��@��Jm��w�N�<�M�6�������_��^�����0�#��
G�����pD��;|
��=q	�/(;7�msO�G��"����\*[_�GY�����f��v����x�;����/����(��H��k�N6����^��_	xa��t��l���2J^����Yh��Lo���)
6l����������9oI��!�������Bv�`�6G��f������F/�13Vm��z�:�P��7�V���NH��O�S���
	/��U���a�}� ��
/�:��*S���r/\O�����T����`hx�nrK$�?	��MJ^P����.H�$��2�`�Raf����~�P�����l�Fe�AU����*|�R���:��4$�`��12C�C��Xf���h9p&������)��B��3P�� ;����C�� 02>���^����u}O$��Q&����!��=����|��������[���0�������g���C���.nAY��w�'C������4^�)�e���J/Z������
��~'�^D2�R������w�[�7��@D�,Y�6�V�r`������;� &9���{�������7�CFF&��:�����7���O^��������WX����~�})lmmC��`Z|W������Vb��^���bC�n��Z�r�Kx�/����z���~�Y�n_���>�G��s�g��>�n���7��>���m*��bB�����RlVj�6�Z@��T���q�.*��}7�K5�4��x��Z����%,�,���S��,v�n5i�y3�q�_��V0����)�>�����B����������@�2���kIM�
����C�.c��@L����_q� ��;����^�����x��`�z����t�����i�f�{����x��������M[�����kR�/��y�6�^m����Y8rFC�r:�4Cl|N_����
~��8tJ��_��j�����$������m�3(az6�Q��
�p���g�o���|��&�q0�~OP�X�Az���i;��7��[�\�`�	� ��.N&X�-N�����~3jg��X�`C����o����@��j��f��x{�".���l��[��9d�����O�7*&�OeR���W�����5���a�-y=]����.�0����L��l{B�b���1�8W|N�(�@��?��.��0>�sO��_�2R�'�tp����~f��*��s[�?���/}{w\��������LLU���'��_�n���{�o/�������[9!&)��7��XFG�����p8���g9�a�h��Th�����
���~�s����������:M���#�#/a��_Q��6F�x���	v^Z+s���01M����{fal��p����d6��1�����"����/}s{'��F��_���*X�x����P[���ig��)�/�
�Qapm�j+D�B�����u	���BJqA����$�V����,\�?*�Q���y_���������B��oQw�l��v"����Le6tQ^M���=H���uhW�:F�i��A7��j0^���,�La�����5m6)���p����7���)t���M����Wm�}z��A�T�e��h�F���8������ s������*��?�O��V�0v���{u�2�ZZ�KzF�(9��!����p��)��`������Hu������������!}����|�i�U�����4{�{z�\�lM$�L?l9w	���6|]+`�_+�*������'�AMu��);SS�6n��a����vR�\KJ�y���9����X[�b�=������XX������X�����5����}�������������C?rs�����i���e�?���t�������5}o�cX���(�O�AcKA���v��8s}��>J>�F�V��nt�l\v��y���M��~��=�W%i�E)/���3��gy|��p�{��������t��l��+��������v���C�'�"v]��������������c{����!�Z��o
�th�RS����2f*��>�����C����H���3&��7�N��Xu�%��R���\m��=���R���wKWI�/X���F��N��t���z���t�>������	�2N����l�5�|`�J3�X��������ic&�-+���L��H��$rR2a�j3n_s7)+/�+/L��i��$�9����0Q� eK��%������N���v��cO�DvB:�U�?k?W^�y�!R���0EM�C���"�'��2�`;1���&��IE�_�mI���F6o�V~����k���.m��`�ut���k[����s��A���f5��}m��k^����--q��m,;y]jWG��uaM
���}�~���sf�0��Z��8����4��F�Zj|�>�6�����/k�����K#�[�=����@[Z��������	�h�5���mZW��[:P��=��#�Av��]2�����a���9�����0��-`�
>.�X��,�wkV���&��d�D��K����������E�j?oXu�Czl�m�{UB
��4�!y�nX�������A�����������6:�_�� '-�6P���x'L��hs�
L,����2/������j�	�����������u�B��u0��A��)~*���5c�����������r<�wnUq���C��A��p��Nk�,Z�>�W�U�����=�:�������
6H\����������fT��`��%�;y�V���FF�5�_��|�������z��]��~X�nB�RU$o�O�v�5�����|�+/d\�
�����!��a�$�1X��MI�(����_���L���m��f`N�z���o������xB�R�8��{F�����5t���n���B���Y��s$���R�*�1Sc��{8q/oT���_�|u4��7S^�Z�7%c��(Ia�����`
�O��=���B��
|�
�s�<
�a
�r������wq@�mrk<Zu�����}�~3jgk�����x~�*GK�^����Nq����@^D}{V�<���&*	6m|��^����^��l�����;����f��x����ix�R���hbS�����
.�6G����vY*;z6p�>���N��u�2��_�#=��$�,�
^H�������eEk�����M�n����{���%_1H���2im���sZ�2x!��t����U��Q�B�q�*/c��},�\��������Zr�RK�}5KZO�+}?�������M�s�L��*'{���q�d����)����m����R�n�5��u���,{���7��}������kisg,���L	�]����|���O���;�*x9�c��K�;�����Mi��wc���n�w��s�tFa�����Xyw%�����/���	3��������~
���Q��2FU%�=�6B��$2��86��4I���?�����@j}���ux�~�����������B��}`�����1��tN�x���%��2������V����&�~���u1Ws�����;�����F��~�z:,���?��Y���L���������x��%<P����
y�n^%����pr�� �mE������#9�,�]a���D��P~���mV�����'�#�S��w��$��K[��'^0w0G���g�nT�Ywv�Av1'.�����h�S'���=|�3��R���<G��-\�������	]\1��0�e|�i-$����nX�����FZ�^���P��-��:
����VO�����u���OE�����.��+�
^`��>�*����ur�r���ffX�3IJ���Nf�Kks���I@�)��������_���N�xJq��
j�p1(�a���)���C�Y�	wS^���)<��z5���'���Jk`��L��d��$c<z�%�����,��a��u�X�1�+?��h��68�����m�W5���{~��p�a��t^����'�[�[�<�������C�:f�m^p��:~�M�����S=��~*�f%i
ia�B�w�`�����^I�"��P{*����Q�6`�'/��b5$>G��Wqm�F�
<�Q?m��I��^�\����]k����8��3�'�J�K���l-�1�?�����5z�H�N���O�J��`8~��:������� Sz~�o�W;�<�<�6L��[�Y��	��|p.�(� �,�w{�����h��!F��������Z�]������b����'1� ��p6�.�;#eX�LQ�������������EOD���Zc>D���xt�4>^�S�F����|�#��F�?����&5���Uh�������K�~�������������w8�	���;lF�����/�G�)����H���q����������t�6!"��m�J>����{��Q�����$������������x�������w�v����l�u���_������0�'k�r�!�q|L�N���o�]�L@?�AeY;�P
�����g���%����t�"�6��Sj�/���1w� L�g+����sL&��A
i�.w���.+���'����t����G���izh���Q��!�Do8������_~� IDAT$/+��|���v���� �@���G��������P�23�c���0���������>�[�����E\�uU<����������+4�������/`��!��-`,�%F�S��`�#Rb�d���z��
%a����8��?����P�_P��=��L��gr��e����Q�R3T������(xa��]��QU*�!��Q���n�|�o46^:
+R��V�X��-:#"��_��;qx!*1����7�6b`��d#	v�[v��6l�
O�!v^���.��������*^H�L�����W
��`�	�wk�w�������o��������P�I��N�m0��/�������8x����H�{*{�(L�M�
��h��5W`�N+$/	D�#�Q�6g/��K5*����H/�E��p�K@�{�`���6moq��_�9���I��������cmf^����GH?rvo4G��k���
{���S�{�9l_"u�C�0���Af�aF����e�v+$~G3.�\	"�����\D�����!�}�����&$F������wWn���"i�e,}�w�3��t��C��<J�01;���c& ���%�=���	b8G���	#1��eB���t������ �\���B5����f��������I},�Oj��mX;�
����)m�`��<O��GI�Xu8������krP��G1��C�=ALh�������`Zn?��~���t���va��#1b�_���[O\���{b���8y-k?y	�?Y������;���/�����v"1��M���*
^�����D"���:����X�����`��>�	�\���6H�����hV�@�^`)$�v��:]H
�Llh���Xu�������/�xu.}���H��D�vc�Q����k�������	H�un3Z������!3-	�^_������
�������
B��Uh=d6.�	����Rv������yMH�)m��H`;v�OR�3X4������^���x��%�vn���,ZK0� y�.XP����8�qP!��0�����]�~�
��]	��;d'���o'����r]�������`7n�!�^E�/7��k	"H���"��0�����\F���&da��h�B�����%�Tu��w8��nk�e����V5���}T�2G$�� A+/���Z^��D�����S�1)p���N��:h�l�4���?�]?$l��������Wt��@��}@H# ,=��>����v@�a�i�pw�F�����O�������p"t�JT^4w���e-WX��| @!��
���V������-00"�h(���@����1�#���U����Q�a��v]�8��8�.2����^�#�"�jt~��K�#��6s�������-�}�WP��Dv��?Sa�B��fukBMk��u�`�����i���7��`��-�MJ����H,��� � �l ������]9$��fNk��=���dZ��h����y�ZH���"��h*��V��l�
[Z��Z�9����:���[Z�&XkG��,J�y�:}O�Q�\O��D��;��v$�I��*�+
^���	���q�[��
ka�� Ri�Hk��8s��I�I���7�&�t��3W���7���N7�p/,����k���11������0��ll��+S+tv����b\�q���~O��A�R�<m�Kuy�$xa=���������
����n6/������|E9������D'���$"���[�n�^�s�z������r�L�E6�����'0;����iG�1���x��\���=vx��'�����3t� �N.ti�KX�Kx�(/T�s�����)|��wDh9��/�G����Z��vTtj��%���3?�fr������OIz�������%�s]��w<�FT�^	UT��]a���f��?��@���V�W�j��s���/^p���;}�� �o6��
����N����Z/�]����������O�y)"V��!F��z7n��,=r>�C?�C`nF*��p�A���������<�b
:�P#,<�t2/���K�HR=`
y���������L8�����t���2��0Rr�L����^
:�G��	<�A{:��w-X�
�O��]��z�neE�'�����hoN�
���{�epU�[aY��Qqhb��t^&���b�y_��W�Fh��2=+�/=|gu�����(0X��x��X��	��<��_�
C���V������t:yF�>#(W8�.h����/^�P�v���wpn�/��hpS����#'����8��;t~}.lY���70������a�qS[X�������)�|�Q\������s��t
u�^����/�����RK�b�����U��	mU���^x����:���@��X{�O�j�:,�V�����������������}�^R�x��W�������[t��[.,���t�O�U���w��vuj�������Fr�-��3_>��M�-Q{�t\�}:o9/m���O�g�x����]�Z��\�|���{�b��u,+x����y���������\��u�I���������>H��u�D���Na�xy�R�>>��`��@F�������_T�)$4�Z��T���L�!�����i�/��0�U~�*��Q���h���2�bcI��/6��T�(|��5x��@��p�F(�&~�k���J��X�(�=����:mk�����*8���3�]D�i�3�sR����(�&Sd��&�q�V�m0x��1�N����M�#P��������K�g���������#f���wL���3�]B�L����,:i{��J�#5�v
�������0��t�<�U)=Du�������������R��LA�A�N�
_�zp����stj����6SU�{�LL�77�����d��5����c+��F�RJz"���Z����(x!�`��N�����H@;�@��=����{WF���%���Bu�������Tj�����~Xq�}?f��x��n�+w1�9����*^`&��'�0����G{L>7?6�iY�����96�]��!4)�|�Kn�8xA]�N��K'���%�0�H.��B*
�v&������X�����~Cp ��"���#*��+$�Q^r�����k�tRj0u���B���'����I�-��v�]R���#m<�����L�UHZH'��5B�7Ga3�W�0o���KQ�`
L�A�aK���H��/�[�)I��W���)2.S�T��_-]d���9�(x�����9��<������c~*����b�?kI�!��gI��?�{���*�L�;)��NUzn��~mR	�����XuZZN����,��^�0�d�A�U=T�~� &��]
nG��g��k��Y��F�zf^�Hk�q��u�^n0���������O ��~4�
?�b�+��*�n�T���G�����v
���U�9x�+/,�{�"�0��X�?���:���x��
��?+X�`bk�>-i��i#�����E�����!��	*p& ��)d����i�~�m�@��p?Xvm�O�3p'y���,^``B��IU!�{�Y��9������i�O�����vTf�h��C[�����6�=��4n>���Z�F���&��������l�:���d�^D��c$�����V\��
��� e�Q�U��}��]�N0Uj�L1x!���[����m{s�!�)$��\��5�C���|�f'e�^�o��nX����84w�aJ��&��fho��,�*
^`�/4����)� �6W^mZ��F�WF`T<�E��73��"WS`�	^��Pc��p�����,F0%��&�����P���������-|*p%�m!�R��^`J#^h
����Yt���]<����M�J�����_+�Y7���S�����n���o�M���"� f��Nl	SK5��������8��^y��f��&�Hi!��]D�$U�'��i�t��P�����`P�����y?�s{���[��}_n���[,�����������9����=@���!�����M���}��q�]%�wy��j�i
iJ�]��NL��j^*����a3r`>4��I��V�����i#�������!��9��P�����K�@�_yW������=A�����!x�2h�6�h��@��}�F�Lu5_�'����bZ[2��G �����^����_��TU\H�1�!HYi5�������(x�U���)O������F��O\$U5��A`��_W�[f���u����*l�\��q�qX�9[i,_;2P�����������.�@�:�����i�_����x$��Cns(!�n\/=���g��(� b�'Q[O�$3s�~'����etZ���J��Sn.����3�Ba��9� �����{�r���hF]log�D|
���e���U"�%<P�����l����hV��k5���s�{����n�X�j-������D�v����0#�m�-;��f�O��[��D�G��$=��fI�Q���O�`�a
�����;]���C�"-&��.<
/XP}������&t��)�Q��xaP�V��"�T�C�t7�V>X�������0�Ml9{
�t���k��=I�H�4���QST����{�f�G���\���NPwo�XQx��!T�U�.����^���/��A��J�����d�NuS#����r���)/,\��q�Y��L��"�2�4}:����,�b��t�>b7�>�k������m6���^�&H����$S�b3���h�����H��/�$�����p�����&�f�M���*8���Q��ec��Nf4����!����t��=D�B��d����/�w�K{!`�T<
����O�/4�
N�^���@��s�m����7.c������~p%��JBE1{`tP�SLE�L��m���/���9[�P*�9���R}��iZ�u�����Q��YD���Q^�"	�t
A0�/��o/��=��?�r�z�A|j,I����sURz��Gtb�o���3�y>� ��V�`����
}z7�M�~��j�^��B��kh��r��dOa��S:��wG��}������pc�<T�����B����M����U|��G����9�=D��+7�\���a�r����@����q��+W$0'��<x�zP�6��3�a-����+x�N���Sb�*Lya�[0��?He�!O��6�Yj������N���|�9�0��ux��W�X��~�v���z��lc��� �x�����c=y�*��MG�>�����tHdH������L�v�f
�I����+�s��U*�9�&|I��y��H:y�J�9�;���XF�NF�r&�Y��_�i$N��P)����X���GOa��	x��.�\E���_$�������MJy�������B��]IEa%O�r��2�]O+/�"�����hU�?���Y�]?�W^`�L�!=#,]K1�RU�Y;���
t�����R������`���' kH���������o��j�����@|�k-O�����`�,�T���A�h���N��o^Ce'Tr����0x�AZ��Ak�fx��lL�3��|��v�)/���BT�C�]����yZ	�W�i#��)���I�2��-�������R��@�URTH?|�6v��I����)/8~�q��C'R?`��{�C���n�j �eS[�s�QZ��4F��\=���L�*��F����� ��DJSE*��C��������
OJ���	M��%���Fp
#!��)/���U����F�TbZX��|�&X|�,�!�������6������*�!����U^��>"��N���{�
S^X��(�Y����������0��&Z��N��RB�p��P��h0��<og�z�	�_��c}3�w�<���Fk1f+�R����mH���,��^Z�2�=��i����WR���OR.h�W;N_���/b��+1yp/\����&`���s�o~�gk�m'�Hi2�LQ��y��FPW#h�FE��;�/X�#���Ld��F*4(
����<e��Q^ ���c#�gH�]��� ` x�N��q��b4���]��_s/��_'��HyaW]�u��)A
�Gw.��.]O(/t������$Z6�+/\9�������`MX8)���J	y�SL0�����O����6�)e��Q^h�������e�i�O����� ����*AK��$]�Y����%[�WI�� �N6}/����\E�L
�����9���#O��/����T�5YZ�au}�{�����`����Iyapo��N�]�������b )/|{<m+�P��d^f/�9����\���LIC����`�l��I���RB�`Q�%Wy��:����b�4�bS���Q^�4�i���U��R������`F�!L	XSS�
���H�ML
�F4��0h-�����y������eU��=k����p!�"����Z\ya�5�]��U^�"��q�y��������V��6x!������J��T�f��/���J����c����2�/��i���������7�+/0X�}���9)��Q�3ZK'�����t�m2�!��]KJSd�D��4�I��x�):X���)hN�kWy�7e�����U��J��[��Q}o����RXiP�{.c��a����R��������X��H�����.x�����k~g`�w�.Wa�����p������
� �A�������RY��;�wWc�� ���=���t�J�e��f��Q���H�4�������PlArb��}�w�9�5������_{���ZI7��D������W�������`�V���O�����Si`�	R��YD�@�B����a���=�������0���R�(���=P�����w}���l_���xj����K��:��Es��c	�������w��g���[$���C/��I(6��v�D|D|J��6����/I��������L��z��-)'��
�t~C�#=6�N7{��?�Qb}5��ix�=��3�TT?�������AtJ-��/����q)O(���=��B�A��_�o���sw/9��N���O'xsX/Tq���1$���ohFj=6����sp/�����Q/���[���1�u�6:���SVwiS^!����Y<�<K��DJy�BxT6�����fSz@M��yz	�N�./��~	���AD���@l|.h�Z66����L��og�����t�@)(X������U���5����\�My�����!��6�����R0x�A
�n*�O6v3��9�C���@��p��
O��J����h0����Nbs�2D0=�'5K��F��*>���)����M���'��Y�q��3�<�w�_w)��;��_-[Q��t����jNH\t����\)Ly�a�W�V�>��V�����sF��~$����XTm��^�������E�-F�	���iKr�;���V�'���=���uwR(Sc�O3�r�$�wI������-�/��������?��^3_��3�)
^P��)�n�x��T���a������z���p��@'�5�y�,���c|K)#�����+'�������A'����P��N���1���\�~)6X[�����	\������e�m�6
������R>�.9<BS�6�|~)��x
_ny���/��
�&����*`��j���/x��&�i�A�k��@�~/����������l�?H�6^���{$������}��L�@��?�D��yq�S�~��
�6b*zM��
A�����pi�a;�!�b".�0����/�B����0j{������/����������CW|�R(�������=���5	T�|�LI�:Sd 0b���t�����lL_��'��pz���"H^������*�$����{<���*l�� IDAT��5�/��'�	�I9���}oY��@/���r^�MH����H�l�R2<���.�*�:m�~�2������#�������`���d{��t�X�������Sm�>��$X����+X�R���i4��#J��)���A���N�����;�FU*��R����J���|��\���������x
	�;��������B�S���\�^�t�����K��p.x/N]�
7��H��������;q��1���B����.�<0�����?;f���s���B$����g���b��?���l8��7������oQ���P:�Gp���7n
oG�|x!�>�����l���s�@���q,4�)M��p�RT��[��]bwP �^9K��+We���P�;����$�hVaj���q�<,�q��
J5�H�aV���5y�.^�����A�q�+�%��zo��8^�y�����0O�:
�������SF|��+
��!bh�~BcD��OL�����h�����9K�`V�-^P�9�z�?�_L��=���������v�W�j�U���4*O;�>K��i{o�nb�������(��#���0��n3��&��L�M�A���4a��N6mx��vC�I��!��u]^p�����$�o�z=']��O��Y�	]���	��h���-A�qJ���j���(x�%���H��4�gm��	�[��u���
�Q������s����mR���./�{���R����}Rn���D��4q���,�D��~���$��IdrU���&dc�1��qJ��T���Vu��J��Cs�C�����c,eS^XL�%g[S�Lf��H -�J���Rf{"�}"hm��l���5��r����5��
����:�-A����������fj�zy}/��<�(���z�z�w>��\�F������Z�
���'oE*A�bu�o8Hj
}��M�����r75^E�fu�$}G�����9����|x��c3�s�����<n�&y5:A}��f��y��|��A����9���h]�r��<��Im��k(u����S�i4�#�	~6�{q��_�K��05%�u���iB>�P�IT����No�
�^���s���]Kt�/�E���[U���#A�8�{d������rh2��Q�Q�����U���d�>�������Ap�=a��)T�J*^���G�B��KEJ���!�:K1�������+��v$	8����!��B�R���Wp�����0�9a=�+m��wR\`�,�M��v��
3I�[��OG�l�M��x]��M�����s�(x!��	�k{SqJ)E�����|x��*���:_���$�HXZW��%��y/��u�?9S�d�WG�xJ	��N\
We�E
����RDh��\*�:����8Z�sk��JE8�G�AG_W;$,S��/�y������()g�#���U^`v��oO��
���B��3:#|Z.|���/{��
j'+�����1�2�>mFi'�R�}����X��L9� ��y@E�<	����]������P;[SJ�����O(/0x�iX}0p!�����B#�`
T�������F0�I�osu]8��4<�����Hy��?�G��G���6����z1)�����Q+�@�Y�#�s+�����X����i��|�����{�%�[��./���C�K��`A��Y��lZ�P���RH�T��B�����R���B�#�i��~<��=	���S�"�
$��Ekk�ZBLJ%�=��,����t
*R� 	D�~�����\����E)��{-�(��%�/�$���]�J����������������a�Ie�)�V��|���B�0�Y=t����/����]��8�.V��='0cpW,�w����i�L1(�*^8{
��7q��!>C�e��/$d&`^�<�N��f[
�*���!�c��0��9C}��j�U��8����P���z�<m�K`y�$x�
z������w��S����I�����8Mz7K�l��mt���,��*:�4�0�N'���i2-����*�a�%�8~���t�n���&�S�D7��w|�z^�H'"X�:5��Q���{�(xA�/h�%�m*;��f�O��[��D�G��$=��fI�Q���O����WX����K�ti����/��~��G��rl�S��&���N���U��K���/�c�(xA[��).m����Z���F���j��.��6[����i#�����g\�6��*D�U96
Q�(x��K�FQ�Bi�I[�E���VO����rm����F�OE���/�Na��\�J�/*m��m��.
^(����Q� �FI�+^(���n�(xA�v
i_�`��J�V�����6x��m�'[O����������|a������'��y�<m�Kuy�dxA��E�c�������|U��r��������E|���\��}7���Q����G��""���K�S��d�	|:��f��$���%��g=&�]gQ����~~w�C&L���J'���"���n������,-���+��|k(�^(��^0�L�gG���W���P���txA����,O������/O������2�IxA��������E�u�T�������k]��~��*U_��xA^D�+��</�������7����_���gY�-�����>x���BJO���/I/#���}%��sI��^P�����P^(<V^�>�� �W�J���~mca����xAJDE�����l��f����k]�G���/����Z7�����/��J��w<^�/������������,*��^(�+������n�����J���/�O/v��kM��z���	x��x
xA�<��t_i+Y�6�����_��#�)e��`����9���^���y��[�:���4A�������E�`�msO�G[�K�}������E|�y�t��w��t{]t����������������J��\oW�p�f&K.���+++���H�S�{���<Bk��e<Z�o���{JKX����M�����r��V�#!<Jk{J�������'L�����f]�3ln����T�6�<_�\�!.#iiiF1��X���S�Be�2�-��R���X%�&=�L�����"+����l�N�v�������32r�����Zk�j��+�u�3P=�����V?���Y���b��K|t�k���M��{@����e<����z�PM+b��'�r"l\�_�F�O�����B��S����^�x�>��-8V���4��h��oi���|I�'���t�PTK{<��]�d5.'�����8��d���e�U����|�����)�*g,����5��+�c1���A*	x� nF��^h���L
��n�b��LM�g:#�#�S���$��{[�n���R���)?�������+�z">%�g}Zy��!lmmK�!�>}.����=jX{">��������������#����h)Z�)E�KhZ�G��J���O):_K�����
U����5�������J����2�/(�Y���Z���Ae���(�_���->b�R��P�������k]�G���oL�������E|�zP��">��W�uc�����;��/����Z���Ae�S|�f��sE�u�T�������k�<��$88�������/<PN=�d�����u9��n��� ))	vvv�~,lb<e;�">">%�c�o����4oYOK 5�b<R=U:�D|J��R[�����/�R`0r�Z]��+���N5�I:SS">
8�@&����%Y,]3b<��m���h�P��/�S��/�ucz���)�Sv���O����O��G(/���E�e�ByA����d1e��\�">r=�l}e�+��1�Lf���;#��/����Z���A����d�%1���!,�������Q��r-��d�1�3B��">��W�u�T�~y:�,�b<R�TzeD|J��RZ���%e�xA�
�F�/(D�Y���Z���Ae���(�_���->b�R��P�������k]�G���oL�������E|�zP��">��W�uc�����;��/����Z���Ae�S|�f��sE�u�T�������k�<�G�r�-����lh�msO�G��"����\*[_�GY���nL�{�b<rg���E|���\�">r=�\}c��c^�Qn�����!���
�|+��1m�1_�������Q��r������r�����/��H�R���)=�KiY�G���)#�e�*����r����<2u���"%��+X�����V����f)6+u�%ZA��D��sc">:��D+[|�fe���x�
�?pH��T��A�z��Z�J�/.�<�Z�T�m�?{gWe�����"�(���������k���������vwww���Jww�g�1�{�����?����33��}�{g��;�@TB��}`��x��U,m��F~�{������b�GVv6z��{����wA���e�R��:5�qqR��K�� �<�*������V"������b�,�$�:v�,M�I�0i����Fr�*����p5c�d����z�����k��#�p��	���yX*|�u0BS���<]����=������.
�/��jW�����V��Zei��
Q�G��C*c^��]���^Pl������b����E|d��b���(���Z�B�� �L"
xAv'~������	&����+�E�<����b��h�^x�a/(z���^(������x����������E//�#E����<+�~���bC(6+�_Y�����A���Q�e�^��#���!�Y?^����� �/(r�	x�`�
xA�3O����X�*����zX���me���Jo,��66^(�y*����yihQ��GA���HQ%
��?�BHX:�m��0a����,������yz�_������K<��A��m�4��8p��5tC�z�����l=�x�������-�$Co�u�~�3o�����Wo����T��'`����)W���J�
xA�q.k�{b<��/�Z������/��X��j]�9�/�=�UEt|
Z����s����O:��Yy!=&qONA��2S�a��]��V���0������'May��<�b�C������+K��?��0�V7�����
��@O|U�����6bf�����,��	#���?����.&�l�YG�IU/�p5K3tv��?�_�/��c�Sp���"����"����p$\�5kkd%&@�M+���et�7�F[���[���@�����������I/E�lm#n�N�v���'`0x�����R�#+)	���&��&)@�{�g9��(�hC��Q�~������U����X��7F�������u����c����p�������HM�y��t^�'���^i�(Ox!49�O��Mgl�]�i���j�WB."!=��K�� �����X��-����y�+
����D�(x�\��H�I���:�5�f��D}�-�8��=C�������������������|{I�>����7/��Gzl���(Ox���62��}'E�~�3m���5���k�����4l<2C�>��S��5
q�����nYg(b����i�R�vsp��r$�=��"�}+�W����P�4�s��R������<����_��4��\�)�>�$m\^���Yy4n>W/lC���~���v!��<�Ft�����4�r��7�(U�i=c�/�����?gxaa�vXz��?h�o��|&%�:�p���&v�����;������VU,<q������IL�5_�"�+�J^(��^(�G�*Q(��D�#k6��������2�wL���;������P.N�^��^H�6O]�cZP���B�&����1���-�:qx��v������>�9���&Wo���~]���L �nL�8BQ~v����� ��J��WV�">�zP��E|�_Y����x!gF�����}��V_��M���
!��>h�TGzt�^H���R�3��F'|ss�^PWQ����a����8�g��?vj��O_FzfV�U�w�-��~�D����bO��fU����8��������a:Z�5E���_#��54\\J��{�z������s�U��(R����hx���<x��
U[N.qxA���V�����"�QV���
PQ���a��p6�u��������2|�<]b����K3x����v%/�W7�a-s���)���/Xw[W�r����UQY]����k�y���y�3��|I4�3$��<��Vu����{�O�,qxAUE����s$sD�/T�5�A�gP�?	/��0���Q*��9�����0����d����\��5�[����R/���5~<|����d�)�u��
���
���J
/��Y�fO��������P��
�	������������a���s�4�#��������)/,^��H�!--��\��`]���7,Z����47A�����`m3x�}x��c/D���M���
zu��Bxd4�9���$������*���n��$�B���_H�y�w�����E�lU�������R���f!�N���j���fm'��e�fY�6��xJ��^�G��8=P����rfO~x�X[�:����2�z���>u���;8,�}���naD�WC�����3�>f���%g/a`=7zO�Jec����7��)\1�O|?TH����,��O]~-\m1�Cu\u����M������s^��Fz��D���pF7���:t4p��56�|�������#t4�0s����=�S�������9��"��mX�����XD-=
�M�bL�j,����Q����������$M����#�m�m�x$Tt�tp��m`�v
��-��������!��e����������6�U5`�a��� ��d�%��v/���G��U�L��W�\���~i5W^��:O���[������t��������y�i�`�n*4L�
�{�)/0|	�1�?3M=|��_��
S�{tU�����0_0����-aM���I�ihm]
_R����O���*M�bd�M>��*!*J���f�����7h�f��MMT�7����4���X���'���.y!��8���t��<�[�l��6��N�q��n�����:���T^`��9��HKa	�Xx�*6���^~�6jXY��CE(S�_������R�h����/����pT41�J��!��*�� �|�=��9��c�������7,�+/0�s���N���-:Ts �)��s�P��������q��,�suA�J�HLKCTb2W^`'��R{����9VFDb�-8u��e�o�7`�/��}���s>��
b�)��R1������/�<�A���4��`��T�x9�������� 0����`���;���0�0	7� ��M(ijBI]fcF"=8Q{ ����~�]�:"��B�(�� ������+/$��

[h�vE������u;[v�����6�!�M LG
���"�m����b�7\y!��#dQ[���K��c�%�2����o?�(5j@�^]D-_�}���#�o� �#��������@���j���9n��XX +�T*��'g�!��ad�����
t��A���H��gM�.��A�	LyA�@���b�A��S������2��	G� �*3�����4]k���>}�c�LJLy!��M:wz=������Bv
���h�F����	R���sP�};�XZ"�����3F�S��_�_?��i��P&�%
Mh7k����bfF����y,UI�C�UK$]��t__����L�bY/i����}ab������|�Vl�Z}�w/������������kL�������@����~����^�;�@9:����E���H�F�S�����y�g���
�vOD�����_���M&@�>���AR��w���V��e�������jM�'�@���O�h{� IDAT���~���d!��������N����T8��I�WA
�$����6��Xoo�����K����������;�%U�h�����P��Hh�["���c�������"+3
������z�G��l/D�Fa���to�@#�f�i��_����
Ays���o���<���6���jX���V����0��h���"6-�������z�D|z<�����\:�;����	?�����p�c
S<���	N����R"
���2�{�BrF2o�)<4�h��^����B����N\y�n�-$e$�y9��h���X����tP����A�V6�!�z )*x�inc>�^�����P3���7R>�	�N�(��	i�J����+��h����@UW��<A��7��]}�nE���G�s���w
���e��H��B�y?8�k%5�~�u�Qgk$���ncxQ���T#h"=&zU��p�i��PyJ]�"���T_�q���i�Gu��>q�t�K	K��w����-hB�Ue��z(��8W��p���*P�RE���0�[�V����$�X>6����i
�f ��7���&R�����y�"mU8�nDp�b=��w�y�iZ�|����T������B�����}�J�x����a��umh����g�##>M�[_A��~uu������-kUXv�E��D�J����������(�v�^��\i� xAO��;-���*>=�g�71��*�F�c��)���;�i����N���H:Fv���-�}gL�e�x=l=6i�)��0:t�����Q��j8�������\Ly!&>��M������|���i�fa�����v4��aL����{p��w�	�Z�[������+���t����:x+^=��i%jw
^����0x���N���L�j�[#%)
M�,F|�k���+�Z|����z�����
���[g�����;"=-�i�s~�+�z�	P�����D��
�j2��7�h����Q��d��P�jR_�E��K��b&�Ut�7�=��V��A\�+�T��?#��
�Z�CZJLp��d�(/���b�@EE�o�3���8u3�B^b��q�3h>��M�"����h��5a6�����0n�:zSSl�g2��"	� ����P�2G�j���hP�z�j���g���Q����#����m@��/����c:����i���6nS���W���:�2�6�������3����B���4�����cQ�1X��o\����B�l\�\~n4��Q0���_�i�,��z_y�}�}��"$&s�,��������[Eg������2~:���V���������0���%�h�1,.���mc���	Xz�&��N����5�<����b��'���tP'�����f�?���|���5�$ k.��S93�o������5����Pj��C,8r	��m+C}���Kvfvn���3���{Op�1���_M�T@bj:�����!��l/<~��4�m����~��}�	Z9�����2+���OH�;�]u�~'	5z~�9p������-�=����M�b��.����\zn�����p���@�0PF����,����~N��^�c�F���i�!�����-��bf|5
�Z�����������[u<�x#����EC�*/��O���Q�ZX�v;�3���%��p���?���,h���� xa����8rOc���^`�m�y�/��%?m�y�Kx� H/<?��
���TFZ\6������{�����cC�N��y����Y)�S������Oqz@�9��/4�Tu���������N������}�Z6�7Fo���.N8��[�������~����c����|B���N%v/�^�_->{+CG&���l�����},��-����c�0�_=,�~�Z9!0<�=8�p���>��_����}���.=K-����%�����������mk�F�}X������ikJ�BSD�D���"�'i�$����qe4�9A���e&FB�=����^����QZD��>�+`�L� 	�`�8��F�8��N�B6=�������!U=s��}g7��~�N&NB�^�0�H�'ia�I10o�%�� 9KZ�'�!��Z��������"Z$���0�������~A�B<-|�������o�q��[;�g��TU������� <��
m���������/�}us+/���M��0��|*�]m]���	 Xc���I�u�����:��{��W4��d�V��������f�K����B�c�_���_�~ukV4�'�pq%�[�������������c%��
���z`���H�����=0j�!T57% ��I���v����-$D����;�LO��%�"z�p�>w/�'E�M�bt��Xy�"	*G��������*Xz�&��b��dC��	�����u7`�#���a�1l�~����m��sx�;)��t�?��lQn�=�Z`��G���o��%A�l\�w�������3���Jm�W/g�0������Y�j6��	U3S	�q8 ��e(��u5@������;��#�x��zv��BFd$�
"6n��#2cb�bb�?W��OA�}[����C���� ��5��G&��d�@��=�Q z4��?XN���_���w����	2h��VXisJ�M!��eh`���Q���!�q��SFI��T//��|	�����M7WD�`0n,���G�0A�\9��%�I�@�����a8j$?����CedR=
���0��+D�\������P>���C�7t��I�x�$�8	��U���14�W���������_F_}�t??��/$��C#��s���uh����beN�T�p�x�G��>����p�h�P�l0[�i,x�/'����;|1
�w��{�V�z�^��_|��u��Oi32i�(@���u#�n�TXx�N��x|�6��m��r���
-������G���F��Fc���*X�t% � ��w9��6�c���u�
b4�k�D��1XRj	v1���Vo<;��C
	����f��#�,��,��f���m�NO���B8����*-� ������
�<N��b<%0"����i>A?@S�� ��4�Y�r�B�9k$xt������cW�Dl�$�����9b�����LO�6N������s�\�k���P��X�������6C��Y�6^��/^`�����1�����jF.\�`�������7G1�� T��Hp�&�R����r�`���T�'�>j����p3����|���-���S�k��x���iCT���&�3j�Adj����������Juo�^FC�f��)��B��8����jS���Nz.Zqxa5�u���Qe �d�������
���X�@�\�o���}�����&!�^����xApC��H	J�M� /��}8�o��Gh�i#9��2�����&^o���p'<���+P;�}9x�@AX�p��!h�jo�D`�)����G��I���]M��,���C������p
�Ip��9���0H������Q	l>++!`�38�m� ��n�	�z��X��V��@���.A�U�����D��8/��z��{!=4�����&�����j-o��_�$��"BO�Bvz�"�v}R�"H� ��;H�a�[P�c}
��M���|1=�s�>�a���]y<*����j���A"�U�P�}$<KC��t���B-��R;�Qe��7���	�a��_Gc�FJh&bJ��� x��Rs8T�����B��m�"�>)����N��C����3?q!(����d���'����B�v��z�D��}��&H���O_]���;����8T�x�P�X8���2}]���DN(gV�N���%�7���5�/����:p8!4��1�CM�`������
����T]"������:�vul<[���*^���KD�>A,�������A������K/~���9
V���j�Pj�
U����:/h�lP��,�>�-mS$��O�"��@���q��"�:Q����w���
-��(���=7�y���Z�XE`�$������(W�o#�6�$���8�+�X!���k�A��8��w������w0h�B��s�l��y�����{�o��o�LKF��q��/�+V-�������[$
MA��������9b���h8��$g��O���C���q����.�����Z�B8���������(�%�i3c�-A:�x��t�����J��$�O��������1�6���t8��!��;���G���p����u�c����L�g�
/��$������~���|
�������J�[�
A����������Z����O�k�^����u�����W��3O�c�������px����y���Hx����}�b����4����-���c�}-�+��"6F����5� ����Q���n!">	Z����8��`n�);��Nv�4����Im�:�h��@k6��*<��6��v����������9W��BO�	�E�2x�����
�k{��>����u0�c�p���mC�r�X��C���k���X���z�:��|%�����z`���H�����sA��:>����GS������Z��8{��=o���� ���}��`�����w�eN�����"�l��r��6^�@�A����I9��M��lV�G�"��n�����w������~��<��:��� Z�=J����E����+�oq	�I����,�:�B'���5�i��g� �sZ0���DG���Kk�~�����9'�fr������Oqz���7/�����;1=�~]T����;��8�-�|�/��m�UE�Z�I����=�u�P]�
��P�N�}��T�� x���)���
��X,�wH9�PW[Ny`��1��c��V�`1
��<���l/�:�	/�l��_�vu����I�hq���g$_@��:)`8�5I��"f�y����j�d
Y
��U�Y�"��>%�/X�O���ayc-����K=���+kiQx6-6o�E������f���t��-�W��B&-1h����v�������ut�z��"%�&
���;O9p_��Q��\�!�6�S���&�!-VG���,:��#����o�I�0&�@�� x����gI�����S���T)t"i���XT�_^S)t�m%)DL�����[6�^�C����)$� ��,�+�+���n��%�a�����6"h�?Wqu=�6X��?������qV����)S,p����p����
��+�����@�.�Uq��%�>��K����%�:b��cy~��S�3�4�O�.��r�F�T���	���?)T!����)O-1�uc|��D���%�(�>�^G�b��#t
8����
��)2���T�u���'��G;n���:;W���O�[a����F��������W{���������
3R`P�������VU**^`A��#���������`>q,���U���N�\1GIQ��4l�sx!+��Z`64iS���'N����Ot�J�I�=	�]�lDn���G0�������>t�����BfLL'�F���Qn�L^.��/d���m�k�TC���0<����"U2��^`���/!= Z�Q�ng�a#��O��A����^i:dt�T
��p�h�>���o�k�h��3gi�,�C�����`iO����=�5�#>G"�9����ALaA� ccRF����-[a8v�I�!��/���EJ
}i��NI3x�������	������aW����J�Y�;�����[q�6����c��s|�L�!�`�A��.^"��:m��&e�RW���4���y��A>xuk=��W���o�����
��B���<������O�l���Sd���[��\!�����#�#Rj��$��`i^��9-���C�r%���H'i]{��t�a`S���������9\���:W���7�94Q��o\�A�6�t�*q�/��aJ������Fu�:��t���J��B� ��� �r�h������"_�����
zLv����noF��>m�|K'��q/d���A�=���A�
}`�i��
�=�>=c��?�'�^�mZ�*qxa��:z~�G��4�=��b�����J!��1=����G�1�ma��+?l'���Xx���X��@�
��w����hc�Z�H��Wz�;|c�94q��MP��>��2�����H5��Wn�6�������e^*�/���}�����yasx��B6}?d����&��'�"�A(�	l�U�+(����RZ���a�
�9�`��<^��C����C7K�G%�
�<f\D����T����1�ot��N0�&j,iE��-h��A�����rx�aZ=^���5A�f4gU}7���0g�N�����0��]Li��+���
I�����!�8s5/0���gQp]���RZ��{8�����	���@G�9?V�^��*��em��`T�7��{�c}������rp�]�}b
5HQ��
5�y�X�-;U�����L��/�1%����.F����	)1��+#�p"A���A�����|g��Q��D�x�����%e[K�����!�h1�++8�5DE�Z8y����8���2�>^�-[�BT�q������f�	dp(_�6����+�bw�3�]uc����,T���-���)�i�����p��7��!"6�����o�]��hYg(b�����e�%�4�k��m�s���0����3N�x/h���zc�J��[k8�Y����uz�N0�� ������p�]�������c/��R�`����P���L
460���U���3Jh��^==�juF����+�Z��)n���&�~���c8�`hV*��'%4�.u�
z���L�l�yl+����i]=8/��sS�;��	r��]���G�9����^fc��/�����r�A�� x�
=[���\��1U��>g@P�>��X��KL����T~ @���;�
���AB ���j�s�]��0"�)5�h���@�{;�^��� �\���!5�P,i>����lj��|�����@�y77c|�.�M�@(��>���t��}�w�I�+�{�$N[��N�&}7X?�7^1U���$�+��6���r�yJq��3l�C��G�J�i���/��k���c�j�������=���
\m����L$@AKM
u*Z����X;�;��Bk �n��4
R��2��9��h�isP��;oyp���<�E��c��S\�a���p�2���H1��9�{����3,\0y�I�9����-4�a4�����6�A	��ty�
/��q\�:`�g�fC|G��LH�8��P���P��UB"��g��8�K�5F��sW��	��h�\J��M�����xz??��c�qh�)����RZSRkX�����r�1x����`��ND�~��/�!�O:�R�������la����$�B��4�8�"�/1/2����I�����DB������������:��c��y�������J1��=E|D|��^��v~x��N����X0�`]J'���������zk�����X?b��9��{qx�����F��������
���.��-�*^��K-�?���C��'���^X:�-��y�N
%b`g��������tz���)/��/�����-�J�����f�J$;����hX���AK���*Vt���~�
��5��"�6�
W�`}������B�B�oq��\x�)&��Ly!���^���y�v���`P��8;�_e5MZ(�N���hQ�-lOF��u���&��<l��I� W�!�6�Y�7;')^����1�hB�)��������,,�7%�$��RR=�K������9���V�B��+/l$�������*�����V�K�:�(�DS���	J������= IDAT 	�����2�I:v8�20��%���Z�p=��x��������I����^� �������+��
��"��=;`$A���H�#Iy���1�ep��?�����_y�������]L���<r�+/l���~��RJ�t�jV�m1����~�&u�5��q��/�&����0xa��#XGX�X��������Y���fJ`S\���f����"��/"��n ��ujW��{�1�E<�S?*t:������/��aai#�K�������a@J	��B��K9���p�TH���
<e��W^�k��g/@�u�X�@���0��q�Hy�RP$���J@��!���f����T^���EiX����/0eem�"���06��_�9�[/���������(%�
)=�l���������`�P�����_`pA
)h5m��.���B*���=��\��������K����ta$�N��v���=(�bn.��/��C���9T���OP�#h�lA���v�I����v#�
�P�)/P��K}��Y�v���������������t��^h7i��"���Uw�/$���S��6p�L'^�8|�J�G�5�K��K/��H)v���W�H��7�s�����:m����u�}v�@�!y�>��Po�R`�r����6Se`�)����m�%�I_��?���G84��L=�����u��z^���p`�5�/�J�u���<}W^h9��|���y���L'i��+B��"����0��A�	�i,K�)/�&���w�r�+����bv�``�KM�L�1j��ww�j��*^`�*��*�����tRB���_�d�Q���V�uRA�����x�v�����I�*H�t	@���$�Qy����D?�'�!)3	1��" �
�'4#�n#�xs�����J�{
���^\y$���8R�8��fZ���@�K_�t�\��L
��v`��l�>�Ix�`���R_������0�:W)�0�z�����O)}�3}���P)����6<��4�f��u��&YmJ?����x�� xL��6��>M���
,�C��}.����cSyj.k��lG����'\����j������7��2�&�@��{�qUV��O���E��m�"B����(?�C��\x�������D<�������n�;�c��E�l1�m5��z;�������>�W��]ag��������������Zw���OR^`�S�x�����
�7��m	��M���)e\M
J���/p�����{��CK�M?=Jm!y�>��p5c�]�dS�������^�����	V���m O�P�JkJ���|��v}����mi���+t��>l'��2S	*XLPSr0�/-� �#�KS{<�T�I��� ��*��2��Y�vs���\^����r���F���J���;����)/,�6f����<��B��u�@anM�eJ��/p�R���>�����{����SF��C����R�?)0���
��VwWe�\�/�_Zk��<���y�s.���06�Z���B��L������x!=5i�qT�4wZ���/T�R������l�����+G�h3;6�D�����=���|�����I���l����.J��`�HJA��/�o0�x�(/t'E�s�`�ck,s�I��1��u�O0��;�o+���~31��S��7��okM�I���|U�f�0����'D�?4�{�!�ky���)5D5�zt���������px�]��B��������{����Gx�B_��I���K��
���	���&H�XZ�~�ex��q�����O�@yA��R��K����cl'��A����/S^��_T�O]g��o������w��/"hOsP��u����r���[��A5�[�Su��r#���'s�RX�#������0h�^l���X����`�,~?q�����h���G}f���ZD��C~x�_]J���c��` >S,�%����&���}���4����g��
��D8IQ~��b��1v��8�0e�0ZU��C��V�����/<&��6�b��m�;m<���s���u�J�.-�H/�����2�@���<�x��nZ"55�RUl-P�AQ�v?/H/D<MG�
"����m
U.<mD���Q�N�1b���K �����>�y��[��\��&�#�S�(k�M�9�'?�`MI3hs�mv��S��h#mi����:9;"����F���9�����h�r~��`?��hSf���Li#�������6&3����O��kuD'%�)I�o�}��7��=9��WA�����y�
�_s�����������M�:<O���(g���(���9i��(X���<�,l%��y#����bR�"�����~V�N)'z4�B����on>�0����T�M`�}o���r�9b�\��XLf��S��<�y��]��QY���j����W`4�=Bi����S�B��;&`�Fu��b�u��I�a�h�6r4HiA��_�IV�tg�h�m�(p`�a���G��P')�LZ�*�e��[I)"����Y�)����+.d$��)�0k1����	f
����Y��t�p�;���c`��
��L��h����d:����[ZA��#��q�������Ni:�������{�O�L`c��0��/�.��`�K'iQl
�Ii���qI)'2(n�h��).l}~�&����=)+�C��]�+f��O)(Z������!-Z�Fe�I�"����(5��7��"�B�6���>���?�RO�#�D�Nr9�?\M+|�����~���,�\J��E��������K<�B.�����f�(��2�GJD`�M�\��ZK)^P��+��&��HR8hO���:[���E�1�:B��K'�Ke&�l�YG�ay�N<u���9������}����_y���jUC
�Y__��o�����/t������5��P���4o��0h���/F�\�������O��3m����f;�v6�IJA#��t{����������l�`��H�c{�Y�����Y�i;?-�NJ��.!�6�
�v��1x!�R!�l��l�H$�����W�fU�ov�9��v!36�N��r����{�K)"2is>�l��Gi'��
y��`<dB~��xA�E3Dl����2�T�'�R{0������]: j�N�wjOp������GRx��xH8r��+j���F|�B��>�A%Z����	P���I/0�>d%$����lO%�bj��G���G4)=W� � ��Q,Mb�����/�p����[���?w��CJ��RX0��nbP"D�`
U�)Sp�}%x!+%�d[����C0���{`v�����������`6X���p���=J���M���W%J�������s�~:�L�Vfi>H�!��ER�xC�Y9�A)�:S;����%�&��7���C�U��s���v������*�l\���(P�����H ���P`��hSC�����I^��A�Nm2����x}�T�N��Y���������1<EJ<)�R9�F�y��!������S��H�uC��p?4��N�����/�o5{������gF�$�X�Buh���et����L��sy�~\E���vRf����J)+����:����
���`�p`cM�S�U[M�y����@��}�W77@US�H��)O��fQ�
�oFj|��+^`)�z=��lT�@��y�3��{��t�VE��`j}*�<������|�K��$�o��SI��!d���p-������H��l_RyHH�����G?Q�_����i1<���*c9$�^���Vy-���y����R_�����m����^K���?�z�$��~�������^0ib�7���K��A�r��4x*�z!�Y$�cR�@�Sc`�X���g�������]��BT��L1`��P���""�R?<�wU�m����?+���H�p�
2��x*����J���Cc��&�J���:��S���|>�	^���-��h��B��+\���C���X;Z����
�c��20E��J��"%�BU����{)
r>�}gS�0��b�!p�7���������=fGUW���Hz��zx0�$���������A_+O��������]��.�b��n%#<_v�+D0�m;�{6�7X��r]*#�
�d���=����}(�U�`TW����M�M���r��[E���>c�|,������:�)�M4��fQj
J����z������Jo������K
0�����~�6���C�:�7^���������m/��;��{�)�l96����4���)}Cy��5�Ii�F����H��-�)�hkR��S����T��;�[z�t����������w��U{�c`�g�wkc n=9����=���]3����A�p��2�����>+q����T=I�[��T|^�� \�)/X�6�C
�/������H�y�/��ZD����PL�_^�U��xzo��6���+�_���{�g�Vi�j��
M}'�6�
M���^���L�K���6������kQ���	xH!@!���x^x�y���H&e
�r5q�8���k����1���u���S��M����[�6���7d���>��w������C~�����t�?��5Z���9�������#*2�z���f2\�t�5�(T�r��nD����v��J)/sjK�"*+�����F-JA����H�n�s{~?@��)���TRLI�]^`�,h�2������46��+���"��W��m�~���>m�:�ZO���Ky*
������/�o���$���z^��O��(iHi��^��j�y����������h��������dL���RE��������5����o9�8�FTB,ZV�����cR��O�C�%	��~���A�C���6��JA�<^`��NMi��%�.���E����S�v1���}�!��6ik������O%��T��pA�kIk ��=w<�����4���v���G0�����Lj����0�e�w�����j���5�L$��L�T���YKa�'�/W���:�.z�9�,w� q��D}0^;SC���5f�=�F�h�X	t�#�����S���{KJ���x�M���U���.�����b��FXr��S��>����
���JH/��'��	�8���|���lX�S��7A���ti���N��{��^���-.^��DZ|�dW{t0�(��C��p�^x�K��bX�n�&?��
��4,�D<�����l��Wa�x@x�S�,Hy�0�x�0�����f�O��g����)Nx!����i������(�|A�Ba�������PP>/(��7���%��b�@a�B1t�����6��-^(�~��v$�Jc�����i#�j���.��R�
t��+��"��^(r#��b���tM�d�3i����J<:4��
�}/w?JC{�������C�T��cj	D`���)e��!\Y�����5����O�/^Pd��������j#7mDQ�+^(���������KA�BI�GQ�~,m�<��^�g{%m+����%��K:W�%P��.|=�vn=/�A/�#E��^PT�]����/(62b�U��������Tl}��WV�e->^��^���A>������ ���X/(6�^(��^(��K�}i�F��nR:�n��c\4C2��B���F't����s���y����������:P�L���K/�nL���D�')Id�Z��//�6B��.I{^���� ?JcE��x�����z���������N)&�"0:����,!���&���}��^P�g����^Pl�����b����E|d��b���(���Z�B�� �L������������Y�/���#�_���|�/�e%vl^x��*�P��sq�E(/���oG(/������?������<�x���	x�p)����Ya�����B�Y�X��j]�GV*����b�+���/��/��������/xA�sL�{W���y��-���W������^P�l+;��Pzc)�����B��S/��KC�^(<
^(�G�*!�EyV���=�>��t/����RVR�Fp���s��U����G����eY����z�k�bu�����H��b� ��w�GE�qPp�|�F�	R�3�T��J111000�z�&���/q[X����:1j�����;%��,�+�*�R'����5I�Q+9
Z$����8�S�q�V�n��}<�� !!PSS����eu
t=M���ZP��������g!5�����i<�����G����@YOn��+���TR�?��$���������45�{?���@|@�,]+R]E��H��C���xTu
��E������Y���z|��� 9����)����O\��D������t��RZ+]]�[U@�r	uDN��OA&�����H9���uUm@�B.�%�\*&#%9{3#T��O\r�U������x�����f�Pr�-�r|^(�.������,�����E|D|��b����oK����8k�����oK�Gz�g�������*�
���G���xJ����+�#��J���OIy��v��r�U���^�3(!�S��$�#�S�(K��,���9 �S�������g�YC��8��n[^(9���K������J��WV�">�zP��E|�_Y�������=[1Yg�b���(���Z������/6+�[yX���gC�Gq����������b+�#��8">���<,�������!6+�WyY���'cG�G1~����)>J>>>$
#.�����YYYHKK+'�����$���J^�Y����gC�Gq���eyxQq6���r�f^�Q�\��eyxQq6D|�[Y-������PV��um�u���3B��E|�_Y�����A��g���RT�������x�����'�#������Oq{\�����;����/��">%�u�����W�.)���Qa��x@(/(6�e�d��b����E|d��b���(���Z'�e��b���(���Z������_��S�N&����(v��j]�GV*����b�+�uq�Z�)�����},K">�xO�u�R|>����DV�G/�\����$-��H�%����b�*��xA�A�������E|d��b���(���Z/k�)K�{,�b<��p���Q�e�.�#�W_lV*����,�#/*�����|+�e)>eis��V�G3\q6D|�[yX���cClV*����*�#/O*����b�*/��S|� ��;e���R�$�X������)Q=���PR�x����R�`����Oa/��E|J����.�S��J�}�Y�����4��K� ������,�j���Dn'<<&&&eF*^�G���P">
u�L�cbb����SG��K��tGQ�G��8=P����6�3����V�B�f��nHL������#u��
	�jH,%�d���F�������G}��fI��,��Y�������-��gB)�L��7�"�����,��Q�K��a��P���e���uSSSy�ICCC������FVBNj��v}l<����R�~�����w�:��PO�`)�R��@���������d����Y*j��4��=uM���
Z������x�6U�6$��]&*�W<�1xa�e/�<�Pj8�3������\2j���]�n�b�R��Pb�D|J��5,�#��J�PY���r�������w�����)�_E�d�U�S�.L<.�lG(������W0S7�+�,��J<����|`��MV�T�����?�}�����E5�����7��}��lD_��F�"����/v+�t���f�
����X��jXIC	��3�r-�T��c���y�����::$�	��}����gj#��a��H����9��:`�C��b]��+��+K�WlPb<r�*R���.�+��b#]�6��x;_d�.iX�/ IDAT�#�[_�G������r<(�Yg��/< < < < < < <�yz@��������bU�%	/���P��.jk^������A^��_�,-�yzS�*S��b�)6+�_Y�����A���Q�e�^��#���!�Y?�~Y��^������N���;����I5L�E������/\n����+2������!����4s��t��4���lq���'a����"#*	�J���a��H����W���Z�N3h�;"j�?�,+��������yP$�P�vW�&� ��d�y+/��|&����,��c������&��Y�~��^naE�iw�����t�h�7����t�:��>��d�"��U�_���'m����*E���U�B��4UA��Z���J����:��J��'��~�\>��{L���]}�%A�6k���G�:+,O�����`��@�}�+�r�M���^N����[�b������d����[y�������yX�����
��=�SO�}p�B(E��./�8V��M0/H�/y�.^���!a���ow�����Y�KS
����������d�|_����zwm[�������c�����s�6�\�Am?Czz&�4p��j��f_o�u�~�3o�������9���H������BKK�H�����b�\�6��x;_d�.�#�[_�G������r<(�Yg��_=`1��������8��Y�:4k!���bqu���Q:s�2'�O�����k�	�z��=���M�xA�xAo�����E����{{�#+S���<�3G�0w���e^H������|������d���f�rE��Y��H>��Y�^(<�6�u������R	/�P���~��
��Ae^H�J�2�5���5&=�U���}��P��F�z��0�a3��	;cS/��HLL�)�M-��J.���I�)X�y�������c����U�GN]�}��pq����/$S��.\���!�����I=������i���?��7~�1!�v������>�a���� \�z#��C�������^K����R�i��������5������������yH�ku�Xa\g7�*+����������%#����Q�������,������o��m���B�����u41�c]�������8��U��u�o����)7�ae4t�����s�)�/\��z&
mO��]A��1��x&tj7�A��Hr�����a<���RB��}��*�F��pR>0?���P��G��k�=��
�@�e7(�����? +)��r�io^ j�j�������������g2d�TTst;�^��w����Z0�������Q�*����&�� ��.�@v�����j�]6Yi�0?*���������Q����E����vk���UM�?����UH�G��)�]II	���H�������iG
���V���*��p
q�B�q;�5�����S��5���O�R��������oA��+y�e���M; 3:��
[>/���}��2��~N}7D��/4��"������A���i��d��P���(G��(�:�����X���5������G�x�*,&R�T����)�������|.h�U�92���A��q�k���������r�B(��"d�ljG���%����7?AIS��=���U^0��%=��&���
5s+���+'��D�A+����X3����`(���gn?l~������Y�:X,�\��w���?�_��}l~�?���|��h��Sa��|��g$�4g%���mjVs�>~��@�,������w>o�����03��'U#S��>���%T���g-+1��<�O�!o���i�mz��?�;VH�p!��Q��^0��
���������kj��� ���_���9�����:��:Fpn;I~�� xA���s�L�����"���
l���{��
Rha��J�X|g
���M�/���Q�$�aK�e���AEC[��`3�C=1�u���;�(�.�������^���U��^�Zw�Z;���;P@�@����;���� 3C�{��G��y��w�y���l�K!)%	sn�@Y�RUm ��������+/lx��M�����+���Fy!��/����5�A�k8���A���+����5��L�Z������74z����'��&#E�e�/jb��������$h�-u%^�%3
�����	Z�+ z�;�������@�$�@���L���
J�jH�J��(;$y�{���"�{4��T����52���fml������K^	1ll�WQW�]K"�Cb�{��D��$��|LAB��G�*���v����d�O�&R�M�sZ����$}W*B|��OJ�Ju#��3I�QrlbN|FJt"��5���Jb��T1+x!\���V�TQ�tS����MW��T�4��C���n��m���������h*"Q�����!8p�/>VM�fhX�=V�������d$��<�Hq���v3���E'Y�@-.����*:��w���X �i,B��Py�b���)������}�nW8R��c��Jjj��4A���P�:�����5e���E|J��sQ��U�Ny�V�!(U�1����)h�mt-���QD�x�Q���v_�C
^��m�Pi���Y/��kA���������^4�2	���>�l|f�d�R�������|�q��0����������qd)�i��P�{�g7�P_�%ZWV��)�X���	0R3���������w+5���0�	���Q���R���O!N��iSLx1��m�5�CJ�C%�����<���k�������r���Ny!$.�]��LB�j�iPs_n���	T���N!,>���i�B��Z��s�B@L(��
MS^gF����y�r�@��C���k\W}��a��T�`t���$EI���j����F��D6X{�lH�W�|t��'��Cw>��@l�{��}U���~�_t�T
���DT\,�1���24����E��{��]�w���345�O7�;{���)/t�\��}��[,���.�Jp�����p��W|�1�L���1>�4%+�M�~w\V
JJ
p�����w[=�|������~QU>D��H������k�����.44����#0t�!�=	��E"$8����o3���(��.W����@��\���L������E��;?�/+�����������
Qgo��RXlX�����@�t0I��d�8����H�	���9�l��k�a��Qx��	��x��cp��X�e����@8v���r�
������~��������7�EwR`��O���w��!,�M�z��v��f&����~�g(llO������I#9����������=GPh����7�����SA��v`��yoQ��bci��}�c��[(e���hx{���^���>^��{�`��k���7I$^(�[H�n�	����(n�M�RwOfx���jZ�`�'����e�/9n����]��c���(i�
�p1�B�s�G�r4�P!`�Q��S)�H�����~(S�?��v$:���
���`
����N�f��~����uy�?�s�����������
2'��y�<��L�����l��g�n�=��]�	�CO����t��d�b��`<r�������f@������'/��|2%��i���U���������D���V�A�2�]����1n!|���������}g^;Z���=K��^�����V�V|M%V������4��4����m��J
K��~@��u������Jz�\u��0��^�>}o��s���7������~t���qd��#�l`@6a��n���2@���?���!��T���?�7�=G�z�0A���(�t7�N����C���M������{ ���N�!'vR��|��B��L�U�]���P�i#2�Q��������]>�C^�qA��Id�����`{��
V��a{9��2���j(�}���nL������^��C�`�H�o�?v��G�6���U`�O��H��?oY������u����>�_'��`2�e�l'�&���=g���� �J'}��K���?fI��*&!�����A]���7���%\olG�����//.�J��xsi=J��q�/��Il���U-�n�c.�D�RMp��]���#/NC\R<v���]�;C[�������X�t��Y��f���k�a�_k��{�k��8��<5��=NG0�Zlz���M��c>L�;���>��/����H/D�
J��=5$����ZY"z�;D���������P�d�8G(�A�N�C	*5��\ZQ,����{��:��F�+����js�Dmp�rm(ZhB�������
���'U���	
���s�*T'��7�;�@Q_����C�{6.&�Ae�H	Bs���A�D�
��52���G��	��B�R��6WGJx)������
�*B��	��q��^P%0A�V��h�*"�5I�b����u�FA���7�b�K�>"V����������������0��|�f������v������:��m�SO��SM
rg/8}x7����x8^��E�
-	^��}� (��_���6S������K����DK�^0��={U|:	�Z"�����]�Y
MKeX������6PG�W��0���3Q^(7���
��+�) ���c%���G�y�x�G�D�c����<�S[����4�
���z\�����t�wN����@�&���U"��[�W".&���O�����9�+��j�>xy� :������>�c�������I����3���c�u�+��~�
<��
�A4�Z]7L�ue/D&Da��r���w��ILy5��.�HI
�HYaM�e��_Hhi����bD�A�T�������i��q��:Y��_�6��u7Xi��q~���o����q/��+*�u=�e5F�3dg<�cR�^@(�eN� U��}���m9����8����������!LD��'���71�R?L|�kkO��HoxD���E���*�^���=^{��?��:�0���%��o�}j�Ct\��y�)-�c�����7 h�:=���s`l��c�K��1��e���"�8��0��N�s��p#��W��������]>�n�jq����'�3dF��}c���4)kOc��~�)Y�e���d]#�\���m,��Y0:�^�F>B�~%)�S"���B��p��$'��:��^�+�w}��
�Ep}��#�g0	b��d����Q��*<=>f�Z���&��M�?�#��eN�e�6"����I�)�AP��E�������%s�O�r4Q��P�����U0��=��K�gG�:x�ZX�q���A����*?�:5*���;����U��HS^H�O�u	s4�]
�������l�����{�����f�^Q�[I��S
;�?H��+����U*��[�f;�L�x(T;I�L�Z@x�|	C�hY_#���K������
2��"���D*���c���Vx�@�����[�RXO��B�4��/f�� ��?���2��@R��
���;8y��0)+x��BM���m7]���Px!'	���,p��s8�����	�z@�$�����z0���'���\z������+�	Bx�%;�B�z��\M@I��N��R��f�B�����Y�=EMm�7�[.���t�0	
t2'p�
9L����H�jTk�aM0��R*P5���oY�z����6LQAT�2BO��a�q��:4*����]RUf�s��v�y���o���YP�k�HhT�����RE��Xp^������	�-��b	(`Jq�(5"�(��A����}��SNU � �dL��N������Y����l���m@�D��CH!�54��U��L�*��� ��{��v�����D'������#X���
����N'���C���	����u�ii��r�u�Zu	�`j�`�SaH����N8�G�]���PX��YI������8���G�i���4{d��� ����g1[����K@V��J�S I�����5:�tA��uD�>/�M4��"�s������������	�L3[�uJO������Ff;���@Js��{~���+i_�L�lE�@^Y@RxA�))�G"3"�6�)1�j����C���W~z��o��u�/����(���S�����-J6FG�������_MO�bkl��������V��
����@�;����IP���Z����g�O��(gP��f�Vw,~�:���Jaft��`��"�1��IHS��=�w��F"���@����R@0G�Fgh�.Oj5�TL�\��4}o�����H�"7�p������g�Q	P�����x
��B��n�"�|���$����1Dnq!$:����'A�{�t� ��W���"�T����(q��I���!I�b���!��X:	����-bo����������Y��_�s�+A���wp��T*�@kT2SG��WP*�
$$C����[Z"����FA��9TJ�����#��'�'��=���&�Z7+x��@�F ����hY���Lp��6�h1���AY�*���!����XW���hU�7����?�������>�8�c�!R��*g/�}a�^�%U�y9q!�RA�WT���*���V�;h"�)���^(�[.���_A�eU��RJv�� ���*���?h#����L�+�~�1
���-��KO�o�$%�~��UEh�o!.�M�ndL�o�~[?��&V�0�~Yj	�Z�8���0}������6��� ��;yb�Iy�T�����oj�?[ZV����������Z����
"6)��.������e�m��S������F�k���K���b�����;����M@)�o'���_v���G<n�-��l��X���
�Y�{��i�Ae��c���5�5��2:�^��~������p��5	Z���p����{c��]XYs����*?����|���P���WP��Tz*�q��sJ�����G6���H��`/�����Ob\�Vx���t�?�A3���H]B	�_?Cu���L�CZ���������O1�IK:,R
!�Q0!�a���X�g�����7��?�nH����R\h0������~�h9�"NN~�����`G�?{lBY)/�W�J5u�s����i�=�s~����Qy�~�������-�8_��^o� 2�-G�d����QW�Pn��q�24���U���x!G��
�^8u�:*������?�?��>��]�m�q�F����;1����	o\������h1jU�Hi%Jpxa��S\Ua���z��.�>������~v8��~f�f���X]�n;fL�/TzX�7�90e��%#�����.a���x���/��sH
I(����4�������3�v�
'Jq����/3�]������5C]J7�����Y�B����-X)��p�C�?�����j���Bu+c���_��{6������JV���F�p��&���7��t��NV�Px!'	���z]���N��
N\� -0l6ue���n�^��w���v��z�Jy!�$4��`;+��b~�Z��O}`�r?�u�GA�i�Y2�+�@AKo�d�"2��6�H�9�+�S�2`��S��
,}W^ z����
OIL 9h
�_8�<���^��v-���nJzF?�������N����g���L2���>������t�~�`����	�����)��'�������%��;����=�:d��wv�/<�O�g_T��wsd��~�Q�'`���������ap
+���������R7�����+^� I�3�����X�PZ�	��sW^���Z�B�����S�A2�K�����?h�%��#���xLz���&*�@��s1����lvn?�W�W��fSi�{V�tV���TN2�/#d����2��.Cc�[� IDAT��O��b�G��
R���Y�g��q���U�AJ�(�lO�������$��;
JH�St��)\������>O��W�"X /- )�`CJ
�.waT�L��A���tx�L�>�� ����`�l(�����C���*����`J Aec{�"p��vb��?�w�EH`ew�5p�0����0�2E-��8���������Hya������P����+/x{U�b3)/����]{>S^���������HS��XP_��1g���,��/D�#�RJP�VA�c��"�����J��d��I*Z�U��#��R^P%����Pkf�4���cj����	L�A�PD������t����Stu���j�"���s�j4w������I��:KA���O
�74���g���C�T*�#�s$�4s�������EU�kf��4@�����q���H(P}�D���w�
L����`�Qk�@{ji\���Y���NPUV����W�ad������\y�^�V���ZT�I)�(C%;x��.�*SZ)R@�tbf
��/x|�i#����n�`nh3C�����g/��S�}A�EH��D}8oM4K(�����Rz�j��I�`K����� R�i#��O�b��O��K�d�e/�i=O��$U�Y���
%���Ly����\y�Z�����-��w�/�9fV^8�c*O�p��	\y�����*[�t�{�x
u����k�0x�Q\�=�����<t���������R�d/�Qj744���bn��X��'�UOM������@�����SL5!�V2*/���/���=�b^�i\y�G��2�N!��B�HL�
0����2$H����&W������Z��?]�)#X���C�">Dz��)�Q�	t�]y &���R^`���!�gL�}	������`���%Q�d���L���1���uz�M���Vt��SF��Yy�A�6�
�		J�I���4���'���O�0��\x�
�5o����e�J��������s�{���qy/X�2D��	�����81�Y:�P�I��u��/�n�G{>����:�
��J������0����kxAD���E%�!o�v��xu~��.�u����j��W�R���?���?GE)�/�G�H���Hy���g%�GFa���~��������v-/�������~Fx���(��:��Di!�H�a��BV��<#���rb(��`e�����#t���5C�/�����:*������-�?�:�QH/�lUUJ����D ���%3����5���Cb���x��-P!�Es�	����7�?����m�	�B���/X�jbz�<�����8��=������.���&�r|�*���o�����0�T*YB����~�&����C#;sz��Q�T�4J+���B~~��;c1y�]e:���M�H���:)�~�_��V�A�1<�w�%R7�k����qN
V3x�)��'SY`Av��A��I0E���d��C����������"$��z���")��<���'���{~���)0��O�{/���y`�6vB;�#I=���������H��S�fV�d���]�����L�����������IAS���`*S��v4O�X*J��B
�1o�r`D�,��v�Th
���"�b�&JW1��5t��	=)������A|�R��d�����A)�����`CF��^�<~b��s40*�%)�������`I����`%R�`��W�A���4_n$�:C )fd���v��aJ,��C���H�b�����%r�����w>c~0��+P��A�Ifx���H�E����v�����:�FdT^`�e�M4�4��SQ)Q��L=�l����jj%������3�Xj�*��Md�K���0x���A�P�����o�����AQ��a�u����S�{������)���U\�Rz�|�����S^�'�f���������4	8bvdP��-t��������+��$����l��<��[�!�6J��C���wi��+IQ�!��#Wc`E��65:"*�+��BaU�-�_��k�X��X����&C�����,�����H�:�m����)��V?�#�
����"+����O�_PJ����[�G�j�1��t����/������f�$�C>ab���}{6��kI�������0f���t���iE���,�#
�C�L9�A}Js��4x!�^��B)+PkdJ�@<WJ`��0x��K��*j��8@��RPh��)2�P
	�Q�Gq)%R+P'u�4��t��/��5(-��JP*��J?��`���8��Z��A��GJ�����Q��A�J�����,�c��Y�]���"������(U���������)����>�d�h�2D��[�2�W��������$�	�@X����iO��Q2������8�9�=R��Hj�P�TF�� n{�>!A�
^���Q�M�u9hj�n�/D�F���H��V�����@��7�T��#7�U�>������$c�^`�!�����e��r��4�����
���2}�
l3����R�����hV�+.><��]���������a_E{����������TuT����0�����S�x�P~����������P��g�������^�
A�A��r>
e���b4�9����q�������e�j�:ti�\4�0.^0+Y�:M��/KQ�zk\;�;����
��~_���n���c���+(����lG����������o�����oyOJE1�RU�����;OD,�/xz	��Q�^WR��q������+&5�%+x��k�o�mu%uL����6"
^��w��O��I��2�p��$����"���W�`�a��b/8��2Z�����<�S7�Y���)p����!/���=~=�g|7���|	����������i�tx�u���I��E��;����),�/�������o�Td���(��<�+0\�zkMSD&Dc^�!�����\�al�.d�x\�yKM#��h���KL"�mU����3x����i����zH
r��!MM����Cw�P���n�wF�rxJ	V���<��t����yg��C��<-��44N8��m��HK	t0y��������x�����y�w�������J"3�p��������`�Rz�v�r "��gU�R^�+��6�S��|y��>�����
�S
	��\�q�:.���[��na<���5�`��w�eV^��.����}TOP��S�Bi#�����2*UUGhH"����VB��#6�$�YyAAQ�Z���?I��|s��o>���K��|[��y!>&fv-�|m����%�R^��t	���oT��u�.��-L�� t�����k����P"���k���n����cH/$&&a��?�@�@�ZU�����Wc���(ie����cC��d����U����'g7�lZ�����c0���6��a*
Z�Y
i^�/��k�����,�{+)/��"#U3���B�[LI��l)T(��� �YY@x!'f�~V_�r�f�|��+���}�6+�?�����j���Bn|����~x!7V��W,�1mD~�9c���/�12�(�9d��Sb�`i,b����M>����9d�J��?2����4(���=��zt�T(�I���$�#Od^�v2�!���3��T1RH!D��9�� i��rL�/��mI�������F���y9�4�B^�[�}eL!�<�����H	Q�Cs�W�(l%+xAs�^��X��l�F�k�\������
M���F�	f/��e7����y���-+xA���k�U�Y��*m�,�e/���/�b��o[��f�_�/�����It
+�a�z"�����������E����6�����g(N��^���n��hq����Q����TS��!�$�����8r@"�h��5��Y��?x:3����5�<|�������Y��a�"e^������|�+k��d��|����}e����G�Rw�/������B��9�Q�G��A|v����NP�������
���#z��EQMa�� ~q_N+�,����Z�rg�������$�H�A��T
a���s�/���x!����x!�r� �*J�~IVV��#���$��(n��z������w�����Y-(����k_Y{��T
���;Ih/X@��`��(������/�����W^(8��B��^�����M�R-'�������deEi=� �G�:�I��|�.+�k_Y{�#���^��|�+k���?���#xA�O��^��`��,P4- ����/�����W^(8O�B��^�����M�R-'�������deEi=� �G�:�I��|�^��{�z��_d�]����o{�?������B�xA��$�, X@��`��M��|�&���ka�U�
���������wnG��T�	��t;�(�%YYQZ�/H�Q���Y�!Q�KmEE$%$I����

YW-J��++s�P��/��`�����r�P��_��#���)<&����d���PDRR���$1������@BQQQ�~C�z
�����������0hhh@UU��NR��	���XPU�O]�!�Ha,	�**h@1I=�v�B2�D���V-::��MSSS��i
�TU]Hn�d]���Z�� ����Gs����^�q�1���eY�wm�]{����	�D I,�o:y�'Q)q��_�dq�<������mX�2E������=�������mA�$G%HV?�ke���HII�����pR����j���*&g��(��!E$��/��h(�)�y6�d%���?CUt���-N�+f$a=y�U��H��6����b�����^{q�X�������t�||�?����m�	�B~����#�����������c'�AKK"�HzC��z
�S2LI������@q�o�t:::�iB��%�Gn�������������V�����wfa=2o	�v �G����s�?2�0��B�M'4,���z������w�����Y-(����k_Y{/N�=fa=�����#_�����Y-(���)���$�G~{%/z��V�_��g[Y{���ZP��������.�GV��}q�����^��w�?�ZP��������^������V4�ad���^�@x�����*;%''#!!j�LZ/7Fb�T���PW�&���~
Ka=��Y�C������@q�ob��K��"��p{R������@q�o�����(.)d����'A���Ho��l!�'?�-�X���7OEYYr9i�F����z�����&�GZ��o}�?�koiF+N������H����+�'�m.�����V������Bo�����|�)����}e�]����o{�?�����7�'�e��m/�G����w�?�ZP���������+��.�GV������W�������d�Wa=��n���#_�����Y-(��E�d�$V�#��
�������$#���J��#�����k1��/����-�'�G��E����jA���#_���{q
�1[��uG������W����jA��/N�=f%a=��+y����������#?���������m/�G����w�?�ZP�����`�|���������m/�G�������^���B�bk����O��x�)��k���BR�Dm��+A��]�u���%����,T���)X��4����,T��7���������	���=,,���PPP(ts�vB�����r=�:�'I�e��O����*"b
|>�N �~�
i��$%Y�-������IIa6Y������TTTd�J����V�S6���$�����d���$�J����z�d�Rt�����KF�z��|���O�DM�D�'m�+�1.�3���3���(B�'��v="�X�&F���y�	K���H����k�R�E�x�<YZV�y^��
E�� ����<�EV���z����(��R���z$1��f9���������'���L�P�)��� ,es\\����B���E�g
�DiF�bx�,r����X����>�+��f=*)J��^3���]?Jl��X��oI�������K�N�]'ny���s�*PUVBq�_1[
��tG�}=^�{�
=d/�������Z��
��#��M	�q��?<����bY��{�z$��VI�O��^���Hd��$����z�w��
����k�>C�3$�������GE�ZZ�u}Wd������v"6"�X����r���-k��E4o0
��9d����b��k:y�����883O�R��B���R�����\��M��~|.��s����	^��MS��T���W��d���v�`�#��������!$Qn����B��p|R�Y������- Zd&.�DmG!%R�0����}g����o�'"����\�$\����<������S��U����h`�s�LA��=�K7�K�i��*��v�B$����'y6�[+'C_KC���E��QQ�/
��|���k1��/���B�R����w�?�ZP��������^��#��;B�d�d��^�r�Qa�!���#�?^���x!{	�B��^^���x!��$���$V*�:�P��/j��B���/��^�l��`�$+*J��^x��~A��*�;�w�[:��*x������w�6?����/prvC�N�$��u�>~������~
4�S�����5n�����
6%,��EF��u�a��*��0i�`(**���+��@,I��q�=�\�Gh����/����-�'�G��E����jA���#_����/�Z0��u}EX�R���hY]�g�-��� N�~I��#91�f�t��}[-�:"_	����u]���Q��D<:5[*�YWlUu]|xvD�vy���eT��z!�����p�uP������C���T������B��pw�7�N�������6S�U��u����/�����Uh0`:�\������w���qxfW��d������*�����u�5�kxa���Z��=���
���|�:����V;S$�%@��!"��"�]:��m��=�e�������:���U��Q���P�BRH�_����1Rbb�V��TS��
��U�ln*U�����O����J��K�?�/���!]
��/t�Y���h^�<�>~W�����K������%�=S^������k0��T��=]*[t����]���!���U�l ��q������s���F��s��(��G7C��@��;���%�-Czf7�fJ�.ce�����M�C���u�����%��o�F�8�.>��s���E����UOO�R��(�����G�R�����7o�����BO^���&&�h��xz����|e�T�1l��<����uh?
!!~p|t����;|t%�7
�jE�r^�_�_��H~_��|;��Je��������X{��4���6I�.3m�\�c��������_Q
�K������qL,��{�	`�<w%�R��Ze{��|�m�AH��_@e�bh��7��@_���h������k�c�����c���X0ml�ov�{
m~i3c\�v&F([��N^�s�����0|���H�Q�:��� _��J��W����jA���#_���{q��/�����J5�@��x�{]�*=t��t�����B���v��b��,*��Dx��Yd�������:�%��`^YU5�v=,WBa��TT�r�
\Y?b(hx�f�Q�r~�N�~���>/����D�u��U~�oO9x�d�=V���D��t��@��p�������M�`8����H�^�B��'P�gO���/�$&"��ht� �m�
���o_�;vs:w.pxAUY+����m�$�w^��m*�F�����z�����X�w��'�-��X�����x�����"��y
/D�<5�JP�.+����W�mE] IDAT�U���)W�/�,R����/1�jU����9����a\\an^�������
��L��gGV�"�K�0����7V�z�Ix�`k��*��AUs[\��,W�/i#$�(�i����d�Ei=9�l�K�l���������1�������	�����Q��@8v�D�����C��8J*��!HIN!��a�����{���b���w��X��������731D�v�|gk66�'���k�b`�N���u;0k����o\�Q�|�M�]��P�;��J�}����+������K�O�����	�>H������,��P��b�7�Cr�8�5�^��W�1�����H��v����8X��~_��KN����������}_�O��?����d��}_�R��3x���
J7���"}�_�B\T2j
�CtP�P�s��WT@>�J=5X��W2PQW��}�
j(QS�P������tI�U5��H�*�w�������_�2VF��xh)!)!oNFB�X	�m�XW�{��q�7J����P�:|^*�o�_4�r>
�Z��J�
�1W����������X8�����q��P�4�l,}�m����E�>��z$i�VyAM��;. �5ex�\���g�b�^�D������
��>RR(����HNJ@�_~#���|J
{�����T���, ���F�Ydc]�x;���v�T�K�f����}}5���b"�af��/.�hy�)/�����t"I�����h���\���uy��t�������p��xs>�dJ������(Y�#J��B�#������cV��M��H��������3"m�O)p�3��=�+/���	�^�����\Ee�|u���m����m'b#��O���,����2��\_�����=RV���*lJ�����_�L���D ���2�Cu�qi�b��r�5�4��{
�|aR^
�P�R��D��p��)7�Yd��?�����g��:8�d�T%�Kk&�����1���k���z}&�Q������Q�v+�'�xw�4��4�����w���n��o�
�z�:W7�@�8-�,��{�����`�	G��B���pg���=;p}�����n�x}@�[�	u�Z2�e*���4R����qhzg��������x�7��r�:C@�(���aP������������)������;���1���*5SU���D;��'����g$��c�7����=��-,�a�����5���P8���J�����#��D��9�Z"�>���OVl�0�l�o}IJN���,�^�>7T�B��t{XB�8��a0�$�),����z*0f���`4�~j*�I}e�P��c��lf�vfPPWB���H�J���r�������\9a�+��YA�?����-�G���E����E]�M{5{-�*����������������B0]Vqo#����GJ\2�g�������t���!�|��-�����5���#��B$1iz����D�����t:�M��������D�N4:����U����D���G;�^]�����o���
z����D��b���u�A��T�����u���ophtm���7��k�lf
���8��B����DM�#r�~(!�?]�����/t"8����������#%6�U+JeV9;x�)����BRJ2�U����_��XX�D�l�����PwP��hdg�_�~����c@������..���~}��\]I%@���%�Oca�n�����:����H4V);������r���-�1�wX���|���'%RN���	|�g���W���N?|*����FtbsU��P����Wp��)��z�aXA�
C���!�Lf�CS�G]cfw��}���}T
v�\�����~&�����X,�5z��������z����U��GI	��Z�j?0��04�������&����������
5
����?�3�/���CCU���� ]��B�J��)���g��7������i��%�O��}�j��-M��E@|����$E������@���
C�O���;g�.Ue�p��]�h�o����������������o��bh�n��&C���?O�� *S� ���.J02��1;l����[C�N����y(�������qy���to��^���Q�n���"�
Ma����Bs;e�S�w���y��{��������/�BI���%I0�/}@6+x�}{�X	MC�������b��g��K�W��lMT����;�?�;����]��p��aA����>9���W��gtuX

m=x~x�����d%��1�_#����/�K�~���:8���i_�`8]g��|��g�21A��%��TX�����r��� ��:4�re����5Ra�����qf����tM0��ti�35���oy;f����a��3W^����2::hdn��NNH��������lY�v�>�SD�(Q��IS2+/�����W#,&F�F��h"�"_�(��kqB4x<��7c�����e��y(������G�.�=����!<,�g��N��mF��a������H���~������Q�nh���F��k-7�K[��;�8���}��Io������"��_?0��&�z����<�H��I_�*���
N���?��1�`cS��N�����5PS����>�]���j�l
u�'���$o���%J�����ps{��}f�� f�m;f@EE
cG����2��a�O���>�f�h��u=��8��s��#h��m��WN���������\��No�b���i>\	b��Y���w��������D���+��� 7%+x!��	n/�e-�: *������u-���?;��cJ���y���� ��D������$���	�Z(SE2U���?D ��7��@��
�6�)���
]3�~,l9��� %�����@����kA���`@����n��e"&5��#Nt�F���8��a@�cs�����8�i>��G����yr�MJbL��4�N����A_9���_�r&�ww���d��@�}��v���&b�"�z�%4=>��	��n �#��>����/���i�g#ek�>#�g:�J������\����F���y,�wN�@U��_�"�y�M����1�c�<�
�����E9��dV^0��"`��')���78v�N�
���<v��?�����������b���������6���{�������I�#ha��]�>~���j������S�2^�y}]�jVi�	t�a]�
jW���1a���5[�qE�?����fjl���3�A!�t������-#�9�Gfi�u�`���p|�:$�W�Z�����������$�bv8A��R�b���
E���#3�������n]
q����L7�/���\��k�����?�i����x!u��^�k��0������"�P��6��
�?P�R��An��( ���nFg�>�m�}�o�
����I/��BG-�~M��Kj���@�1���*�Q�U���Dm=����S�O��9�P������w���N
�zJ�|_�a���$L�^�����/��Ej`Aa2x<�A������tj��`��'��H}8n��s������y��0���7�6��}|u����pk�Hh�[��Vo<������wC�.KT�
3�l7��L��+S����ch���������g~�7����tI�3%9)���O�u�=,�^��}*�>�&��
z���7���/���M�R�>���z�in�2�B)���m������
�����z&��C)z�[��H�^��a�'��a�0��\�����/����$����-�����#(eH�P����D:J���GG�����������G�C�J����|E�Nt�A�������4����Y����}
�~y�j�x�!������R�������c-8��|F	()+��j/�zH���=�3x���8��
��Ad�jvM����f�������	��o
��[A��qw�2��#9����x�<A�?����.��f �oEyXa���a��;�8H�����8WK���{���Uxzj+���������yZ�[������E�A���p�J*����|hFg�[������5�O
]#�8������v���+����������$�������%;x!��/xv	R ���4�SV[�iF��P�n")+���
"���V�vX��F���&=������������+���^��dS	:�D�����x������v�;G8P�	eFSIPr�,�T��\���5<���u(�-B���0YT��1|BRp<�G�L
�w2C�_b��rx!���|M���$�|	�n�<�-Xa�@�8QW`0�4O�`Ic�����t���9v;����x�..���n0�e��N0�l������g��&��R{k��X�C��)Bwxpx��� ��8s AA����	( ���f��y�\a�8��}����$��� �z��h	E�R"����4��5�7��R@�R��U�������P�	A�������a��KP��)�R��dx��GP#�!��sB��z%Sz��:5 K��Z!���P`I�����������yZ����	)�\�!��+�!��C(�sxA|�2�[5��HM���}�����NP��,��i�����	����e��H<Fv���_����Q����a�jcCArl�q���5�.!02Z���/R��|BC����^8���S������q����^81*����2t��'$�����G����;N.������Jd{;+��T��Iua������H���������>A�+��G�j�8pn�!�Z76F�/���#K8������X7h9~�G5}3,�3C����3����#X��m����������F���3/�D������o���0���	mFqha��]��S�6'\�G�����u������]���G�#�����,��3����#�N���s����';xAAC����~TkT�T-t��:�kHf>A�@^N����0r�E�Vo(�!��)h�h�����I� ����l$������=��#)<a��p�dD?��F�t`
t[�D���h-����V��=Mk`�p]�J����L����bH��D���|�����=f��"p�
�Sje}c���	�i��Z����w��~��"����+��]�f]�ja#�x���u�]�L���K��J�Npz|c��?KzQ3��}���� ���/)���u8��7���%g���^��{�6��vb
(u�t�iAg��W���HwZ����I����mCU��G)�0��� 8��u
,����7���2�TC5������`��_�FW�B�S�����8��`�� \��V���+(�q������4Ly�+���$������$ �v�W�2�,5�Nfx!�������_V����hV�69nF�2��DyUL8��w^�������Z�8����������_66$�3 �+W2X��?Z�B�(������#��RF4n�G����cJ=�`��#���+;�O��@��0�+AL�A�vF���aee�r��|��c�]{��y���q� -8�������g����Q���w��1�`�?S���o������\BE$��qs�w��i)��1�N�G�n�~�84&PB��W}}?�b��8th������4�����0�6�����c�
qzAkp��&��o���p a���X��'��������2���B�5�����7vN�� ������qL�C��$b�\FA�������
��;"
�{�����%��L	V���K�f04���''�i��M++xA|�TJjC�\��s�l+����Cp����1��r�)WW	2��{>��+]S�Z���{��|#�y�}�W,k;�/oSP���P�?�7_�����Y	�|q���#����XlxpAt��������d�W�;�P_���*e/���Pok��%�W��%49<w�%pN������r�4������oc�l�={�tO�*=��~#���Pn��d/��'x��*"vD@��:���Cw�Bf�2H+3��K5;��/M����]��8��	��A��;+�}�/�����~Q�1$�N]��
v�\�`�������w��}���U��������s`�@i�^�u�WU�51�T��������`�_���q�d���]�^`�B���ySF��P&Q*�[��zD�B���uS����;xa����=)k��pl#amI��$�V�yA�@���PP&�.C�/h����c�����$���/��s?~qV
���^�����������G�R����UMR-h�%

18���o���X
���%( ��i�A��x�C6���9POv���#U�W����c��S�c������il�
]KE� ���P��.��	�`4�(�����\E��c������bT��C��#�A�,�����Q!�U
'�B�"�<�A9R["��f�8���67i>I��
t�����W��G���D��n�`Z�.�JT���o*FV��gb���qx�J��xtjvj]�jx�p/*5C~Q�vD��kp��_��a]�-*7��/����"�����F��v���|}z-L��NOQ�^�SH~�M+������B`��*=�v�uU:����e4s+������ ���S0���7��.�����������X���W�����?��>��${����
V����p��?��.��k��%�"`����b���bw]�������D�V�n��D��������
��0��g���8�s�}���������`tu����/P�I��t	n�����A&%�8��:��kn�������32XV���6��qSI�
�"vv�]��6��rh�AC)��/������rU��}fHRA����Tz����;�*�������+��F����+$�������e`LJ
�C��OB���T���3�����=���������P~jKU]�7�D�^Spr�P��>o]A�.cpp�W�`�
�&�F������|}���M:�yr;)4�����H@�6-&l��
S��*����6�
�P>��5I���wLy�)�j���������K'��Po�m]�RJ��8:�6��),��G�z�5�x_���ICB8����i�S10�Q�+�l}���P�WC��'ZU�G?��q?�X�6��t���L�A�2f++p��l��(?���R���:b=Cs��B���J�����c��6f��#)<����4����(�7�WD���>�������
���}3�WQbx�{�-�|���#�A�C�0�lAJ���0��(�5T����S��D��b/^E
�A@����
:t?�^W���Z���2p@�d	�G
px!��O-��Zp��A����P�+����Y�������K
��q`!��u$��%
�%S�^�}KD�;���y�DRU��?�sh"��=R���=�!U4d��/���a���E�U��z�WLub'�e+��e��1�n]���k<<��|���]���}�@��"�EJY��&�����2x���
��c���u+�R�������0��3������0��=�\���d�������-uu�"�d��]��{���
�
�S�
�%xcA�qd�+Z/����UQ����$cU.Q����^��z�nGJNp$�j��6�n6�@
|X9���N�:`�� ��U��)��M
�05�j�$3���
���	���ER��C�������"l��,]�K�:.�B��w��0�
�0x�����n�l�c&�xR�Oi#���d�xOR9��I�B?D,��!�K��>�B�yw��8,���f�Us&�sm���P�J�`�7��0�%��� IDAT*����H�!p�l���W�CDSG`�%�]� ���o�T>/A��S�s1��sB��
�)x�f^j&fH���~�*���������l(�kH�
=�Ze�aQ\/|orb'4KU��/#%������b����{�D��YG�vFk��^c`��y]%�+])�|��8�JJ]U
����A#�H���������S�a��t�
VM�O���B����H����7I*�������1TH)�(e�8T	�e�B�H�6��a�Q���t�b�B���YX�������dX?+H����/p!��)�Y;��S�cH�OLup������F
��z����B�)�����7Wp��y�,V�K9s��f��Q��S�����Y�}R���a<�i��?��a��e:W!`�>>����>_�<|��a/������[���X������V-�re���@�	�v���%}0X���Wr�xi��
��UF����}q�:��
S�7'x�A����	JZ9ph�)�1����/)�0����f��m4IMf��-\����M�v���kZ���}�~�0u�xA�������)k�:y"�{sAK��-^��uHY�����|e�O.b D�"e�����}��DI^��	�����O�P��'�?��<�`�������Q����IQ�{���u���s^(B���_?6U������������x����	t��%T���������kH�}-����W�p��5�v���n��T���[��d]�4�����?8Y��=��m#�pH�v&����
��N���1��b��r��v�����!�wh}'���E���U^�����p�
�?������[o\��MZ������b�)[2������#%5-e�'�L��x@S2��#-x�}]��~������������W�C$��L�j`�Z(_�O_��W�qp���#�2�/��er�b������������Wo�@4)-��I��?�����"�������$C���[PZRk�����k)�L
/��q��%�������A��u�1����t���u�;��������"��- +� ����- :�e=��5�ia���HB��V6����tVR_�r������Z�RXO�����d�xAl�?�L� �EO�`\L~7�%�A�*��<cQ�d��BA�������>����P�	R^H�2
/�n�Cy�JC�%����^�x��VK�OxA%��i)/���Lq�|;}��P��v� ��d�����At�g��s��x�� �J�xZs���������m�MyA�j%P_j��xyo?��	���Iya)/����<�&�:��7)�>��Z�,%=x��!��I8Sz�W��
�)8�$���	$��w�(l��sJQ��B�2����b(]�^��a�m���>�	�u]pg�tX��0�����o��]��#p}�(z�!�c�8*����e-��z�`VA��C:m.�cc��T^`��}S����R���
�Mqo�D������B�K��&�x�7.�KcW��h6���Byj�� 	����R(Wi��N��8l��Z��CR)��s
|��|u	��d�*�����`��
�tr�L/o��<����.>N`A����?�d'�D1Q��|��������UcP��T��MF��q!��/�T��w������WyHI����:����F8�X�����R�������^p��S;e��B �����z5�D����0��v����+S��E�Nm���R���;&��XI�����z����w0�N(3������$���Sm����er�?����ei��A���H���%E�O���
�7
�3��Vf�����<��Ki(/�oq��������Hu�����DD�&��n�����@�/��<0 ��F?$����*��"(H���#x�k�a�A����2����&��0�NP�4�P�!hLy�x$)8������"�A�����#LF�����d�H�IK�����x�w��ZY/��}%
:1!�N�kTsD���<e+�)/Tv��T���Jjj��r5�@D�0��x_(SJ���fk��������S��>'�R�*��C�&���UJ?��(����lH'Y�S�-�����]X����so/�����_�3��K5�2x�w�Z�v�*�5k��t*Y�d�S��%Ly������N(����������������I}l:}S����W~�^��6���}�����f�"X[��� �k��]q�YKz��bI��7l��+%��R�Ei#XZ�����7�5�Uo��wpx�7�
��t��@8>f�/����\�fYw��`A'�uI����%�qRO"8�wm�8����q
��/�?�]����9T�>������;�y����q�s�|�������������@{\��%�?���^����]�^�x��r5���������n@�Hy��.0� �������H?)/��I
.=�
�>���~�6�}�M )/�jC��Ah�U���@��		���T��������@Q���^��s1�Z���&h0�D�2�����!|���K�_��Ae������%�~p�L��]+����^`e���X;�
�0$x��l5\=��!_��?)/t��$��N�[������6G���p���hoW��
7�l�i��	^`jN�"���K�&� �)&h���)/�' �n�Bp�����#��������L�A������H1�()8�&�����(L)���Y_�`����hR��K��&�Ni#�^���@�,ZcN��������+�J�XI��B���N�W-RU�me�XJ��X[S:-R$`�x��a/��Z�UJ
�����?��������� ��M�s�A$�A���������1uzJ�P&���p�`��'pH�
�5������ 
��HR���~�!����e�K�Xc�0�}�6)�����8f�&�-�&aj	����s`�Spx��1�[�]��b���@�����R�7����'u���[�>�\������`p����0s�{-��0����d�RV,[1�+/?�.K������@������O�a��Z/�;?�RI�������F�����l������qw�V��~���m�J���>���(@)�*�����cs�I{j������&��Bi#f_��z����>w����O!(*�7�m����6�������D��30�)/�t�������������7I���(���%=xA��>������s�p���������r��*h�tF�)�\15�}J��Hy�
Ly���?"��/��W�TI�H���|s�!dV�\��c�"�%�Sp(6�tA�7�9�o
�K�G���i=2)/$$$b��9���5�*U&�Z����(I�1��Q�{����9��6<mDjx���/�����va��A�6o����0�@WG;M�!����)���{��O|�����7�_@p���.�!`�����>p���������[[Y�)��?������H��sF���"�����_�����W�=0�����@$����/���M&�n�	�����k�M����O��i)u���s*����Q���@MK	,�OGc�O�|H��^_a��)�/�3�e4`���s.3QtR���-M�*��T�j�� �U�����dJ+�@
��i�v
xZ	ue<>��4G�&��%�Ic��0��L1���WP�I��bC�8	s;M�j"�C<��I��DF�t�a�<�K3%�;�%�[�}�q��5���������l
������������
mJ�A�3(�����@^\�=��:��Tm�����b�+T�Z���<��_��{��Z�xr�N��kJ�pz�����/*W�������H�U�$YS���*.�xN�o|���,*��)%Xa�Ba�F��d
�G�����5+z�N'���t;�*u�B2�&��wLE����8j���b�p�=���c6X��J���>�c��xF�i	{�������L*$�3��4��G�L��F0x��z-)��*��87�M/�S����������e��_�1���J"�C��������:���k���D�bP{�9N��C��V�B�#*������`raRo@!*�lH�#�O�S/(X��@x�����K��V��zK����+���qy�z()~��(�Q�n�{�<���y04#�X���{�nh0d�u��7����('�TD��U;�"�&�_<$�����$zP�`��/�Q�d\X7	����X���e���6�� ��+�P*+��"�N.��s��C<�EL�7�X�Nl��;�``�vKOy!�R/����0W�V{_��g���M�Hg9��T�>��0�X����[�Q�4����}H����G�(G�&�����H'���CS�j�����=����R��~t*�����
I"���� 
^`���(XM�+h�h�J���z0�C����~�����~ny���3xA�NY1p �T��	 �@�\I����D����������!��I�X*
#�����M�S�?=�7x�)=��B��h��G�BJAS�xPzV�
.�E�����,$�&����0t�M�)/7�Cw}@����
����X�Q��O�HA�~~��")"m)]i����
Dw���f�*�v�H/$ES�{J����*@���_��4�<�^={���^B�M3�{#��B��������5�O��t$�K�,O�p�"�Iq���y=�v�z�>F�P`KI�` J]I��S+/0������������-^��9�`�
{_��bN���W|�>��.����;����3�~���%�u�$�������t�z���[�Y�/����,+=�������@a�Lww�#S��rt�yh��������-Ji`�Wt:��qnk/��
���H�}7�����������-6^�
.��Z�S^FP�=)k� �DJ�1�Uc	���fU4�X��9����t�W7���O�/�������=;c-�iT,Y������`I����'���p�`�M�vJ�����aJ�:���'��w��;'������|���������	���J�(�����V���E].i=������}�����~���f &�Im�)�z"fZ��M����}�`,�<�����p��Q������C�<V��C@�}�_����!v���g7���zlE�bvXMy�-�*/���[K��X0D�h�#�Mi#HyA�� AB������h���!z�1��~O�!My������j)���!���^����/RR!������
�0++&@� ���3lN��I!p� ��f��>Ajf�~e?)NQ���>�X��^���>[�A����~|���RN$������c�)DPJ����0�41O����X���w/@Y[����\�!��)(��#��C��j����`�7��/i)/���`���N`L�l��3I����:�l�FP����]���������y�������������D�>�!��;JQ������K�>�S���-W�>��^��pz�<8�	���0�������i��	^`
G&`��NVV<�C
��������5��1�{hJ/Q��Xa��URxa�"L������8E��X���*a����F�
jTgL����������>�>�����u�R�aX�r��TfR�N
����_�s��M}�}���z����O��_]B�obH�^�k����$�������O3���P=��070���.����5GC_�~~/���v���q?�QMJk)��^`��-�)��>��{�Q��3�Xa���u� ���Gru���]���K�X���ujw�c��\�a��ih�l<(5S:`}�p��A�$<�n��}�RI�
/<����`�KUq�T�*���S'�
<��|M@0���C).��$��J�v��N��;���������Q�f{>���*����!�2mR�9O�85�P�xt �	6G��(��.��RRz ����f�H4���P���"���C,�����������Ra�:����X���o��__HKy!��]�y��nI��:"D/������9YZ�lsJ)A*t����Py�5������E�H��%]Z������j���HP�OA����� z�5����+�����Z-
�I �)pPZ	�R?�����L�s
����,]��M��a�X�X�;����3�A��������{LA��	���a���_7�6��$>���I~84�+5������(e�/}���Ai�N���Vc���>��;c����\�'�7� ��$���o�J^PVS��������hL<&NA�6`�����v�(�f�2x4�$����KKy����sNZ�z}C�[X����B��"5N%�-��^��qu��(D�E�c�Ii�����xn���b���L=�#����W^�n�M�_Ie��&�EB��Bf���������ft����o?����7$�B����A�mKb��m���.����������\Q!����C���E��J`����b��95���?v���.I:��g�Vp;z�7x�]���t�.��i���p#����^M�O5�g��H�a��S�����������~�n�y�����7�b�-��q�;G)-�.�����aHi,�"X =�
/H���������4k����Z�RXO��klf��d�xAl�?�����2�Yy
I���9Q�
�2�|%��"%���s�(� k���^z�Bn��<s�S�y�����rb>�3u�����Oi#�jE�#
^P��9�g���5�4x!����I^����/dE���#=x!3}e�Mz�BF����S����<��6"�}�U_��c��>R����|�K�����O��������J��s�^��qs���A�9��D`�	>>����y����i�Y�q;I^�`��J��>s����F�;���y���}�i#��WxA�� ��Z0{��Ix!{L'�"X �X@��!��X�����y-����k_y{�k�����������U��
u%.}�d3Rx!#��ux!w�A�Y��K	����&��x!}�	�B��SfZ����&���U������cn�E�����z������gJ
�����"�9��?/��G�d��S�_��M��)m�,���k��z4����(v�����y-����k_y{��xA��$��/H�Qn�!���#�?Ay!�m��G���=$���{��y,)��X/k�
�YkOE�&���j��S�r�ox�w���l��o
�����i=� �G�:�����]V*����.�G^*�����W����xA�#xA�+Cz{^�n��VC�r�G�>���6��#
�B��������g;�B��CYF�Y���ux!g����.���c���oxA���7�eY���^���B��K��b����{�z�_��]���Tl{�?���������� �N��^���(����������/d��s������x!{v�/�����=�P�QxA+�l^�Y��m��B���/��^�m��M�~YV�7�G�d��P���i�9m����"�VB�R��r�}�?9ki���f��}?��G�rv?I]��4����r���F�K����+tuu���)m����zr�����N����M�����&T�X�zf�,�X�O��Qa��Q�i��8/=g��#��Ph�j^�;�#�	3��/d�tB��n^P���ZpOX�b���������m/�G�������c��#��Pl{�?����������k���{�J�z�W��g�?YaE��!�Gq���g!X)��^��b�+o�����b��%��J��y{�#��^��b�+o���|}}��]��^�@^����w�+]$W--66���FFF�j^��LRR���ajj����>?�A IDAT����\���&$�G�OvZ �����@���@YY9;������(��Y����,1��:��0���qHH������!w_��a=����A������@^�o����tL)'/a=�����d���~�K������WB����q�eg�?�i����r�������Qy!>>qqqy��nrr2�k``��w�l��#��r�������l�
���N9U+,,�K�*))���t\a=Yj�,�L�O��4K;��������c.���ei�9�������l�
���N9UK�ONY^���8+y%����>���r�����#�F9U#/=g6��S;I�q��f���%�'�,�B��^9�[ 7����4�
2��,�����Y�K]��4���y�?�L|��'i���f��}_�O��_��y�?�L�4o����r���F�#�B9�~^�O^�Ug�BXO�^�F�#�B9��������F�K���:�����&�'w�F�O��G�r��������X��������y{�#��^��b�+o�y)��l!�G�����k_y{�#��>/�����(n�dE�������C���l+o�B�R^*�����W����kA���K�����+��.�G^*�����W���&�������Y�/<|����(|���5����o��M7iF���,�����Y�K]��4���y�?B�R�������\����� ��{��WP�K
�.�������ui=$��?V��9#E���T*I�+��<����2ZW5<���3����L���/"���Ti�Io^v*�Q.�4�����Lz���PQQ�U���d�D_�;�x�Y���3�*���7hZ>���������>��P%f�4YV�O%���2�_^��H$�6PWW��-r[�����
�x�F��'F5���f�{��?����494����az�IH�F\���U���[���������Gd�~S�_X�			��1�����#�2�����-�{��\���?D�23�t���G��@Rr�����D�q�����)���F~�����Wn� /���=����Bn��9�J�/��^�f��
�����`�e��8��E���ZpOX�4�����r���F�#�B9��/����#��}.��ho9a��n�k������q@��3���� �|�d��5;��@�}?�37���J�>�I�"�i	�J�e�;��Y��-�j��
A�:P�+�<�$"-P��`<���v6�N�Y�MU��q9b�;�q��V��-*X@Vl�X�A�o�u��za:����>��r]��l�`����JFQ�|y���*j@��F�v_:	E����/n�Go������z�Oof���NU��qR��X;���=fQM}�1���-������/(f����b�(+k_y{�#��^��b�+o�y�?� ����+C�2f���-��Y\����,�xA+em^�Z{���x!7zE�Sn��/��
^��~)�x!k��W{�����/H��/H�QN��S���������6<n6V��DZjx��-{�@�V����7�����Z4��_6�<���8DDFap�N0�g�G^>8{�����Y��*.�;"2����2_�	�9������w8t���:�Ze�L�Eh��c^P���ZpOX�b���������m/�G����w^[0���aa8���j������ha+?a�z�e�0��&��%�6V���^/D���pl>���X�ec�v�C������4���l�����r�?-��/$��B��)TL��u���~�9s�v�P)�_����J��.=?}-D�E""6���������r4*��MKf�]J��g�_�a0�5Arr2�������2����/,�2��.��!��a��M�������=3�.�����8���c�K�����p\yq?S�eu����mU��>�������^��P@_�����#^j�R��LMm�h_��/5)g��n����=S���FY	/���uT6��iu9�����BHZ���5�^��g�2&-rhv���I���U)u{��F�\�"���t���������R��N�������PS����1m���/o���V���W�&���DZ�j����b���p����2�YWP�cj�������*x!�["�?�E���m�l������p�'U����MR�p��������M@tl2���\����Z;�G�P��/��������#L����f�6�+�����A`�����~m1j��L���*r-��fum�eG�`��N���2�Y>}LlW#6�P���L�%���k�a�����OQ
�Fx�v�0x�X-�$��B�&����R�L���HU^��Ev�a��QS`p�N��-�cg.�xK�����]��<���S@ �'��p��e����o���(�K2������K��m�a8���BMq��U�7��r��p��u�32DukT���B��c��b�/+k_y{�#��^��b�+o�y�?� �y
^���!*���t��n�/X�f4m���"+��r�B����P��Y/��}
�!�!Y�����vS�|DH���u
�������P)l��o!�7��
��Rwn������o���FK����o��aA{���@�B�Rp(b�m���
xaQ�Q�|p�2e�v�a����Y�S4�P��>l�
����\/LoQ�N=#�g.�P��a�����6�q�6����^X�tF��5e�������dp[L�t�{4�qx�������LJ}26��n���Mk+����JZb�i������K�LV���x� xa\�.����g%�`[�*���.�c-�p�FJUEQs���Y
/\��G�B!k!O��z����'0��s��������]�#�5�V%ya�L�K��X����xA]Us\�b���H
�j����6����������S��^V�'���6x����K����Rm)�i��o
�Ku2U���#^`��l#���;� *:?A��-�t�N�������	�hk�@_�������
�F�T�	$�.Q^X�v���HO �()�f�z��U[y������I=n������!����8�����-�0b������G�/�����6�z��TUQ���7[�0xA����]GVx��N6��q���2�=9
K��hW�6�<�
/���O������-K��xL���7�\��3����H�x��/�'g�/mt�?�,�������i��5�k����6�#��������r����e���eE�BS�������C��C9:2��������$$&�N�R�T�0&��$FF[�>�]���56F�*U���O���&Mp��������3O�DA}}���b^��XK���0�fM8�BCF����}����t�y���|��W^;��)�-Q�J�Xr�(>�cD�fp����!2
�Gx������z�OB��00Ue�^����4*j�����H��u
(i*#�f�f� �M<T�Uu ��"�������������u����}�����	\y!r�i���!����f5zJ�Dl������d'&"��^+E���Gb@T��!d�W�~�aR�����t�DR(
�B�l
��>�+�/<|�����H��[��"�q��&*��B�R�I ��^����Kx��wi�I��S�::��������!b��O�2���U��1�OB�M3�?�A<��ACJ��N�ec$}���K��,A�JE�YG��KH�&_��i�pF���\yA��T
�'�Z!����:aj�� r�^>f")
j5k��&R��*������1��!�>.N��9�N=9���\Qa��e|�����S�t���{;1��?��{L�A[]���`">�������EP���:a���tr<�~S+ax���rm
W^����LJ��x
>NQ���B�J]1�}8,i����1��8
�b��������`z��\ya��
hb������,�*`����F]U�����HuM���`R��5�#!)5���)�d�����e
��/�y��v8�t��%<3�����K@��Eg���K�aY'~O�������Mza����
��aK���%J����s����3�h�
��puG��`mV�����`�������������
�������#��6)=*c����X�Z����,>|���7��j3�)�H�����l�����6`V��|�?����slT�*��!��r��G��YJ�@2��&��f(�TT1��2�7��F.��Dk�@�
�d���+e^���l������8,<�[z9���\|[�.eJ�W����c0��>����Xl�]>��(j��
W^��K�5.�ao�0l��G��C���3�#�>�e`$W^Xs�%�4+���z	c8�+��Y|�zT-
-u�h��9���-P�������hW^0�q��,���\������!t�~$���E�Bd}����;V�D����d�����&6P�{���h���*�%$J�(Q"v�~�e���.8�=��:V|Nl_�:�,
��Z1����.�����W����"�isO>�{Gl�}�^��������A�/o6�lWl{}
_bB���	�5���9���;�j�r%u��0��2�M^x���j����u+��R�����.<z�m���h��������icD�����$���zZ�0���������m4v,��������	� ":s��������.�)'t��[�v�������uj@~W��3���?kGv�� �i�>w�\�B��>�>�lQ3�����[5�#��r����^}Sc��0bE	���%TT��-sh�*6E1�U-��i����P�U����x��3��-<
���1p�^kStRu��|~�������O .>��*���S�]~(��6}�2��j���G��u��V���y�r
����2�o8�����\�����a|���L����)[�Q�W�����PO2������_���>�,=���`�B�������������I�tU�-k������imlYY���w��>*������i���r�D'��f����j	sS�
�{��YE���������?F���%*s/�����H/��v)�-�D�e,���0�zO�r��?ao�%x�
��,���n<��!N]Q��(��pv1J����dA>8��,^|}�����Nc�?�� &!N�u������G"i<�R9u��P�*��[������}'Im**���^m�h�)a�[8t��iLV�O�����x$�fk������~"&F�pi����D��I�����A�	��\�4�@hD\O��?��C�����G��U��A���;����<{�@{@	����c`W^��!���]W]�����Q^�Q�2j�)����0j���KG\�������wd��p��/���7�����`V����5���U���y�.��K�M�
`���;�#�b)��������AXu�*������8�3�;pN<v�z�������ky`|�J�H��������B�&����EA�^��+/�o[�.���5��c�O��6a�1��%P`���Kh�r�"�����%�/��EkV�<n����4Fk|#��b�1x��6�	s���]��iY�~w��n{OC�@��-�=��}o�����9�k�h�9�>��oA}4s,��0�G��`��c�]�Z���iQ����6��m�����^H��,�B�z���*�c�%����~O�������������A!�_�$t����z��������togJ��jD�Z�6�/�����cv�&���W��|�����z4��5n�ckEv.���gP�����G������C	�nU~��P�� �����\��
F��Cj��>���J4�x���S���9��^'�"�W<+�H6��`jk���]qpR/�D�|/�-�������g�~����R����z�f�<���/�b!��N��|�f�M{���f��N�*�TM��e����*�r��o<���������C��zZw�����y:~���)9�3>�z �>[�����8�H"�;��}/Q��9���6B��r���)�(��h�6���}�tk�[w�P����q��`����}
���v?������9����NU�(/���Aa3Ts���M�1�7��e�wr5�9K6��
���Z����b�0+`
�c������(X{-����������PaE�r����F�^R�5����=�d�A~����1v���L��XO@C0���+�����=iE��Y(��/_s�OR�H������@^�o� �=i���X��CN�@��eq�
���������(&�LG�����

������SE�n�y��?�_�j�������R�j��O�@KM��	��_G��U��/^����O��b,j���\A}kkS�9���5���U_p_�F�*���cl�<}�� .!�:
G���P:�9�����C�m��O�������D
GS����)����;1�s1@���?�h�f,�
U5�^���P����t�?��!�~���
t:P*����������h�����i��HJ���H`�b<�����C��=D|N��t��`
�����jH�@z~D�C�u�����S�i4���
��ErxAY_��Q��o��SQH��������B��(fX_c��5:��VV�K+����B�~*�R:���w"	�;����c�R���A�����]�l�x����U��Ia�6�9y���yJz�!l���`��� ���7��"O/(�
-�z<�D����.m�s?�]: ��[$��N?? Jo���,�o]��������}���J�p��]�Z�n�77�[�>+���^�������/6Xsq	��)��
����B�=��V�81��h\�9KA���=�|�;$4:�C�N���$4,�S����0���i����@s <T�����4�@�D�7F����cF7�Bu�P y&4���cp+,�D��Xwi)�m�P
t>%`���/W��m��T^`��
=��e�d�OM��u�����/�wZ7e
G��Eq��%,�4��-��g�������)�?��������i,�0�Rp�cX��Xrv'� ����>����s``��-�7h���u%��XX(�� �m?��,F��cqx�2�]3���2d��^����!A��������L������1������P����0��?>����Q���C��^��(/,�2K����A��#�%#����*u������L\����=1��>�����G%��y��������1�RF����l%�a����50�v	l����p�M0� �n��YT=��F�0�Vq�jX�N�+p���Ecc�J��}L����y�\�}���!��?�v%zo�K��!��XhY���������O�		����7��o����
Ja��'�@cM&���]��(kn Q^`���S�`���&�1j�'����]�(��q��T0��A��`c<z�#�P{s�x���JA��O���2��������T��SMC����:�Q���y�Bo���G����g��Ts��x��{�����s�^80�/�,�On����� �
���U����c������������:�SP�?}����nx���w8<{�L��nG� >K-�
ZER��������������L����-/,��_�A���:`��c���z���=����'@
,�������z�F0�`��%/L�����C���<0�
pvy����P����AA���"Q^���
FEp����w'u�#^8q�)O��>�:���:v%Q��|�<P���	��<S
�[a�(�q��|�)���:\a��}���x�)�����5�(in�a�k��[��}������.{���}|��x��k���85o�.��!�je�c��k^�Ivee`����`��k[}���{P��i��������O�.h�u/�H��wWb��p������hX��?;���& IDAT�%�C�>�e)����X�b*����5q��u����N�{�������6-N@B�x~��Gc��%|�=/�r��:]csr����yT���NcN���r�+w������/C�t�>�S�P�A0�Xr}+��|�e	�NZ����qx��@) ���;%��a��H��a���^����[����XXTe_	q�qZ��-e�O��3��?	�U���:��q�J<z7�@@pny��M
 �+s8��eVV����+"�j����'��B���dXQ���u������V�_��%8�����-���iM���d^�7��opG1
�~&���9��;uK��!�����5�e
�^@��t/
�
R�a����Oq��{�O������K��8x�,����BA�8��E��XJ�����x0���M����y=[b���J`K�0u�	����ujLAf/���B$�s������o=#��#��O��r������2���W�#���=r����p���l�I0���t�4�����8L��X��u���C�~�����4GVo���]l���
�YN�E��������I�Ka������Rp}��=/���p�����oq�#e-�]N������pP��5r��?������=�i��)\�;r���4���	�!�L"�P�?��.F�0n�1��a���X�����I�*����w��~�����5�C}��6��
�����Jv.Av.��65����i���}���%�_��N���}�p����rXy�*��6�K6�������6�%[S0~����Lk�=��O�M�@{JB,����H�ln���hI^����6VNp;�����c�5�0���B�V4�������c[:���>=�i�_��z�0�Z��C�&Ur�9������B�����g�Vj[��#��=l����52���v�4�~�bnB���YD��R���&��
y^8|�e��p��M�����G����q�;�!�`��-��O_nt�g�t~A$=$�dW��JXpxa���\Ua�q��cfQ�b"0�[(�g��C���`Pp����j!����C�t������������n����;^��k��\Vx��~L�/�x�@"�I�A�����UuFb4������OV�����=��Z�RXO��[i�D�������/���^��z����/������S)>�^`������<
Z��%�n���	^`' �>x��_�������I����n��I�!���{�+)X����T�)���7P�H:%j�e��A��hQ�^=�1�{�������jX���Nd���8�L�����,��u������	��Z�����'��B��($|N���|�������z�KT
$i#����Xq]�F�@P����C9����������7�N#��YM���%��j�=�����u�H5 �@��p2�P}:��2�vK]
��r5/|o�@
=�&��N�bz�Bhl$�?9QR<z�6�W�[��i�6��d�?=x��Wo�m�^���4��4G��dG�+"#���Z�*)&0x!�N{�;��>T-��L)�n�#�:�GG�T��A�����%Vm`%����zC����m{��>�C���"#���b��A�W�S�$JU�Q�I�u�/0E�=w�!��]�����^�T�����S�����e���S�����*�"~f

{�l��Y9
b����}H���-�����s���9����C	+���@3R���e�
�����FS1��t������x����$�o����g�_�a\%�}��4����b�k<����/���M<�����<@��t"�����hm���Y��[tc�:����7�D�I*M5u������8+K0IQ�j���!��a�8~���kzP�������q�a�����b�n�I'�����Mq��x���o�B�H�����>�F�FJo�����T"�}6V�L���ZX��C=/0�b���`�SvxF�w����s����
+n����q|^��t ������I�r�?�h�KY�L�9U����Y�����.�����=�o�=��2�0|����vX���+)u�����v��I�B	h��Pj#t�xk�:`$���q]*�5���
�8�C�����j��A��/I�����#���)4s��r�`a�
��!�V�+0xaV��&`}0x��a��\*��c^���
+�A�����-�Q����"�Q�%���c0x��DL=�������$��F�K3���zi��I�!�+RJ�b��L))���q��W���6�����2�#��]@!m�o���G�������_������?@��^�1�lg
n��J�y�v�~H��x�
+�A:��ia��;�3�7z-�I���t9
c����I^�{�>�vO��KAk
�)���L
�p��[�x�F��S��@�B�^������:�'B)��N�kj�a��S����@�y;�Ia���v�&����r� u
���P�N�2���I0��o�j�����0�@M��.���nHI��{�>��Tf�8���F_R���l$�xOSUZ�g�=z�H��,���G�-���Y���dS
������)6f
�6�;�5�\����=��`PFy���s����y������4������m�v�����-�wQ/� �4J��o�n~Z����:�xx��J�'<>?@��p.T�+/�k�B;?f<��I��(����1�l'Y.
^�Oi#ZUGK�z�xuG}.HRAh�
���0��4�8�EI
��#�V\;.Bw7RL��wM���Ou�Thk��<�����1�v9:,�+�L��e9���sh�A����v�={-o	�mT]�:����(����"�����~�
'�D�|)uX�I��S��'x!����(��!��S�!}�>u3]�5H!�������.�q0���
�R������"��W������x�)�:hb��8�k%>4���o���G	set���AKi����������W��g
��h���=�����+��t�\B@�R`A^/0E�g!���+$T�*��UlaL�2L�����T���O2���������CA���>��Q���to�w�
 7��M%�5H��?M�����A���~�� ����U��5���;�t�6�8��[��0�@M����@�Z
�����~�1������s�����������c@��(_�6�����B�R�=�����U(`�x�:�{,��b����r��{����$� �����k�4��?���`l�=��I�FU����I;�G&���d�M�:�����^� ]�������M*��~xOk~��a~;6����]|_]�3��6����+<��u��������-{�gfJ���M����+�J9����)4������>+��6k���=g��>�S��}�����������I��b���e�>���@���������CL���+���u
�,���gWJ��{�WxA�������o#)+�w�R���?�`\��K���C�~�KC��%)/��i������h�T�nz��]B�|-���4���y^x���C	a����Wo#��}4��m��5�(e�GJ�A���x�M��wlAi!LH�a�o�BZ�1W��B$���SS$���[�`��������`�1��u�1���a{]�r����F�^hB��7)Dy�fu��r>��$��,�>4��Z��	7_�l��"��,�������'�g$�G�OvZ ��7^�����$�]���5��In���v�^�	D�'���w��C�i�d�R������An
�0��1�l�Ly������������7�={���`�O�B!��\��Y�_F��i#
�Rj�"���;�xR�X���X�N*���"`� ����ra+��AQ?�����O��r>:IUR���S��2:$M���w	�KUJ#�BR�tB��?��X��W����b�U�b��S��@�W^K�=�ec1�!�A,T�(SM�
�	L`Z���T����/�1$��'��R��`I�6/�*s��Ab���R^8���
��������5J	�����������+J����RB0�$0����y�V~U^P�d��{��^�� 5�]�
����� V^�����`����F�������$
I��P��Q��*^`j,������H���JK��S���)/�-��)�_�d={�N���5������7�xr����Z��t����S^G0���~}
Ft���!J+P���a��4:�~��j�q��cy�� ^�!�ZWC�+%�=9�j��@B+JM��G0xa3����t6);��R�,�����n�����#Ii
UMR2(�9'&����
��L�(Ms��]�	� E�u=�p ����)Jan��N�SP��aR�CJ?)/8w����I��;����+/���	`jLy�s��8�}�+/x<�M�7
b�����y��D�@�F��/t�8�+!�y�T-�j�Z������������C_�4����v�h����e�%f�����C������L����_pc]J�q�����%>�}���������lIy����������T:A^`%%�_�T
R��J��}�=�(���������o<M����H)a6S^��~0�iMj�i,��p���XT[�?�n���Q�������z�v��bwb��
6(Hw������a@�s��dv��g�3���-���2v�Z��)$�-��m-~�&y�J���$(`����G�%�]OI����n��)*
b'	�^����I��k�����^#��)�(P�o��04��B*��l�RN��� 
%s���	6%�8��:66�ad�6����~�'��F�RM����4���>
^X�������:.�<B��68N�#-;r��zI
/��>���mW�4B����������MR�L%���P�ve��pv�tY��U��,�;Ez��+F�k@}�hO�0�O+��Lq�:Q�T��(5��oA��-ja�������a\�!5e��J�pJ�`��:���L��)/��@������jX�q��`>)6�^���J���������IR^��h��'��&<=�7J��{Z�_����*�����g��D�9��\�������������F�=�T���#�ms:����������hn�Hy!���<R��^yAxa�d{R��N'lR��sc����2S^�
���/��o�i��bn��<mJ*�3�����S]��
&4���)4�ze/�}���7>:���2L������@�t���O��F��Q��2�=w����{]z��qu�b�#G���.���X�!5�c�s��B�J�p��b��>�����[]�:�L�<?S�/��u�d)]DF��H��	�������7q0���s���J�����|��^������H|I��-��up��}�b��$���`WF���xR����H��n%9l9��=�����Bq�{DP�	��dT��*D�X������O�� U�H����u����Ly�)*0�a�^~,%�Cf��f������B�#��K������^aX�z�}��f��g0�[K����3��	{%�{X:�����E�ru�mczb�����.v]u��#X|>�4��z=V�o�di��>���v8K�,��-�*�d�T�����B�|�L���
/0@�()/�Z�'m��\�����N`w���E]��?�P���������<���]^(NJp����Ra�����WM����R��1�"�~^|J���6bp���\h=���P����Dp��
z������hr��i�\~�.e�������]��0~�)�����Y�rf��7Zup��[����_z�R�6WM`
�(�H���eUR�/���n�t �<ScHM�b��\����jP{��0��.)|<"�R�L���K����|_~��9=[��)R��ug�p�V��;�5�`Y�>��g�@R��<t'���/�Y�E���}l������T��\�#$��0�{ �����c���R0��o�8��]MD�����������E�+3x!�����"��w����f��SI
��(�.�2E^`���K1������`��Ek0�(�25����Q�i������Q�ry�6"=���������1o�H�[�����u�J���
^����z�����T�W����Y��/MX��9�����`��G0�;��x���Z���u+���W�	|w
�Ji��}�8�b�k���8�x��
GcI�������hJ9�	��S�8I�x�O[-YQ�d�y��d��|
����O�B��3�������O�M2�K���������B2�jzya5��c!���v����Z������Q�nO���`���i';x�',��z`WRYhba�/����l\�Hi�A��xHj}k�����*�=m��Ws�����\�~E�'����@
�f��-{�����8,�z���H�:T��&e+�@�?��`D���s��!Z��������<�	�������([������bJ$����I)a���/(5R�bu:1E��H�b�)D�'p".��Zsu9  k"�S:$P�����^��#�/D�'}���E��RR�AP��R�'�aS(4�������)p����\�� ��o����Pi��U������0(VSB��H>/(��Drd2�����aP�UArx2OGC����>�/)�R^p����?�_2�,������:���9w�bh�R�����e�%���O��R^`�	R�v�����V��Lk4�"��o�C��,�3����Y/$�{�4�	� ��o�x��n�����*]H��
�s�\Y��`Uj��������<�r�&��H�N���b���Z6E��#��
�( t�4�5@��[P^B���K�*�)����/.u����z�T�j
�'K����e���N9��tJ��
�3�~���Y��|�x\�i!J����n8T`����n0MI����Rz�-�m���0���!6�ZM'.(�-��5GA�q�(/�Qj�-4=5}Z�l��������l>/,;?e�[�>@����)���$�L�i*t�#����x*6���� X
�n�*�
��
��w�)��:�(����~Y?���/���fe�:�/�:�������*$H��V��tu����;`���r4EF�]�#V���7���RC�#�����o6�E{3�W�����M����\��(e��_0���	��a�B����HM�) �}���y���^y����[sp!!)�����7�����
^P��:Z*d�'\�e���Z�9_?�`���v'�K>�9�6����P�M�$J������v��5�V�������K{)�HSZ����@����3W�y�+g��@p���O"������B;
�7���'��_���X���u��>R.j=UZKx,����h�P��b���4(�a���>�R,�k{R*���Q�P�+ �&$�8�:�U0�
^�V�-(�y��L�~�LK���EY�������R�*��� U���P�X���f ���������
�N]>���DR9��#�)/�IOii�������y���9���������6��&�Q�l��� �<���/1XJ����3�����,R���Jy���5����%cb��8��zZ`�����l�joZ,�[R����`��o�!��������}���6���S/�bN*=��y����+�1��.M�o�"�RK��./������,�����<�S�LI�)2'9��C:��������OUN`J����L$y�0:Y���7o+U
!5(��BFR�80h`��94�n��[���a�?��P[��Y����Q�� If]4���[��k���`�La�)'���
kGw�c�(Q��N�*/��0 �U�
��K�s��E�r>z�{f�v� IDAT.;c7�s��LE���`�%
������������(��������	��q� ��|����	/cL�H�f����g�q~���ic�Nr�w_���='xa+)F��t��a�,J�� ��sc2�,e�W�`���B{Rn����)8��+3x�)��q?
���,��UG6�;��������H���Qq��M���������U����Q�)��~E�2����)u�����B�!�������/����-����U�V�����{a��5iS��u>{���)�?����X�v���^'���S�u#���}u	��wJ�Ap��q����~U:b�����d$v?;�*FV����o&�Ly! 8	G.�3,=�Y��G�J�i�k�0�N9�m�*����i���f�j��ptm��G/�yO��Pz��e~�;;x!8,g�'P�?)e�,��i�k���x������,�{'�i�%/�F���e��-IeY*	]MQ�C;(���$���D�����*��y��/�a`[8^M@���x��H���R���]��F�n��U�g�9(�7�S�kR���#quM�
�b��[��o���ARk`i�"{��S�,����m�=��/��E����X9�&!,:������^`i��m��%��|���b
��`�v����^��B���`���~��~������Z�o;	p&�6�@z�����@
�W�#�j�zG�����)�����G
��{��{$Sx`�������]���KU�E�,�A��x?���������H������66�u��l*C��<-E��)�Wj/����Y������^U������SJ1�����E�nS?
^�J`Zs~_\r�*X��G�r{��qj?���"��nso�
�tOa�d�Li���HY~���U�����^Xy�*Q�"�jV��9EU##�`CiD�����PR�0��CaKc�J!����n�4� ����e:A��=�5Wj^�9��o�L��!�_0�[�0 xaO�P����N%z-�_T \���)/�����znO��.�|�!
^`���e>4I�&���ud&��F��Q�R�^�����a��1�-������>����<z�K.i��l�`�4�;�D�vQJ��p�����T�:L���G`��>����=���Ka����Q�����j��J����9@���heT� O�aJ��^� ���`�9x��q��%X�hj0h�\�����$���������-�����cg��I��^���n��(���-e�c:h��'K�0b@�L�����h�V���0jPO�q��=����m�����sW���J���:�I��C�&�w^(�7�������4�&����t��������������/�G����u^H�`Vi#r�ofi#r�������iO�u2������S���C~��>mDn��
^�m{����$m���^(lc��x����m������6k��i#r;FeE
��C�`�-������=q�q�-�e�����X�j0�P��&v��D]n��m������'N=I�q�*�e����d�*�XM���D�9���W�����W����.����}d�^vi#�����#3x!����������?���
���c(������d�{����y����$mf��>mD^��S[��9�����>mDn��R~����*�7�����`Hre/H�^vu3���'�������)���Z��)��B��O�I�@���/H�B�R����u�?�ZP���H����^��#�)+B��{g��x���/�c-�����5}�� ��mL-0�Q�ns� �x�	)1/^��b��X��)��*A�IY�'4&�mI��/H������}-5e,��N�����4U�F z)^�V����,(����0��x���_`�����N
[/���xA*f�����lJSj�:�&O�?�����
\�r6�/�l��,!�i}�o�yd^�#Cf�LQ�	���z��u�?�ZP���H����.�)��V�/�g��.-(/Hf��'xA2K������{+�m��Wx!o�X�[����atoAyA2���/�����B�X�h�����P=)�9{E�r�QA��������`�<��/��!�hFVJ����.�GRJ�����W����x!eE��x�^�^�]Z�$��/Hf?Qj��(V��2����,��	�Ba��0��d^��� ��Rk�B�����"��Y^�������
��/������2��y=����y�C��,�7Z�j���6���T��{�|r�x��.��`��S��r�P��.�)�����_9���&�(����2V���rq��P'P�Fyyy�����$�sD���J2��?��LB1���fI�#�q����O9���i>?e�a^q��.�@��BN���;�2�h�G���f!##���+�g{m.2���ce�>a
"-�?a>"M��B�/�Y.���qL�ge_��b�'�\�W���>��K�R>����gJ������w�D)'`���<_���a��������Hm0��$��GD������������8�Q�>��b��^o��)�e�������I�9>�c��^i]|����<�&�o���O}��
���LVs�j>v+�g����(Wu�-
p��E����d$���e���'q[�����c����S�']�ac,P�,��P�c��6��l%+s�P��.��`��S��r�P��^��#���r�]�ON*�����s��(�'00jjjPRR�i����|
�����O���M�����&�Z_�|�f�<iX�O��Qj����i%n�(}���!�G�%!��H��7.�Gb��^�����E�� ]���0��I[�#��[_��t�+i�E)��l!�G�!����k_I[�#��W�(�����Ho��E������kC���l+i�B�RRJ�����W���HjA��/J����]+��.�GRJ�����W���$�����$��P�HZ���WT�*Y���iImm�B5���I"A__?7�]a>��%�H������@Q[o���\���H����w��}	��f�YC�O~Z[��BBB���EEE�*���|
�c����?�i����"##���RNQ���n/
����(J��(}����0��|'�����m��5�����KP^(8�=r��u�p�Z����u�?�ZP���H����^��#���tEH�����W���HjA��/J�NZKw�H���I-(����k_I[/J�)J'��_��H���[_��t�+i��$�����I'�E��0Q�Tpe���E�Y��(V�N^��]�V��xA�N,j�=a>�]/��.�GRJ�����W���Rp��B���+B���H����.�GRJ�~Q
�1+	���Z������������V���`���n}�?�����������_��#+��V$m]����n}�?������I��I�-�/����VVJ����.�GRJ�����W�����`��+B���H����.�GRJ�~Q�����Z��u�?�ZP���H����^��S��{���|$]���/�G����u�?�ZPz�����(V�#��
�������(=��J�)#�����j�@f���g�����������$����fY��{�|�����F���)������5�-J�=f���'��m��:�gv��� ///rs��	g-���w���������~�:�������g��)������������y�t�|�����<i� )��8�*�0(�Y!##�����Z�M�Ra�OV��S��P�,����';�m�R?�
�z�n��2���i���O%�}��,��B�
�=���R�4����U�r9�(F!���]��9�H�X2��)F��W��fx�A�����r�S~���k=$�$�~�9��8�j-4�-� ����p~�'/���D�TCi�O�Of��8�G�3"</��om%''�������>%�(�ji�����i�G_�=m&��sU_���@���c������n��g��( *�m�����WP�����4�\��(�������B���P�����n�����MR�~�n�aQ�S�m�I�KNF��9Y�`_�S����w�?9Y�`_/j��m��`��u���O��8�-��y\a
��z^M��]0������0�}�k����I3�i���0��i���<Dml�nq�u�.2�{�H+L��|�r�����e7�E��'.%�']F���Et�r�Z�7�m�K^B�����^06��[���E"�z,-�C�bPn>a�rl���<l��O�CU���m}h'�H�i��,�f.�u�A�Wv��a	��~6�����
iQ.�/��Wc�rh3�8F�
��;�l�����b��J ��?��ddQu�e��R*�x���4^(�a��� ]����0��I[�#��[_��t�+i��
�K�����v>� -�d��/Hnw^������/�����/^�;[J�%^��emW������w�,�-	�Ba�L��K����B��Z@�
nE�B����[���\���g/��� ��h��<j�b�_6

����/�=���]��x��+^�{�k��r�������(���:Z
����P�$K���K�������QI�I�8�?�gCf��j@B����t�,+�k_I[�#��[_��t�+i�E�?�
�KjGi���|�^0�1��"9��N����B���pY�m:�T��Rq��/t��
�����4�j��}c�X6���
�{��^�U/c�?^���<B"b�^��RW����b�{��f8r�
o�����u�er;,�s�!)r������
�C^��`�WG�������g�i�����d��z��X�R������6:[���@?h*����#��4��=N�z
�_���R8/���f��5�����1�jKQ��V���'�������X�D-�������yz*�l~�����:���%��|�)6����1s���"y��0��*��}�M���S��M��m�����O�&5V^����y�*�!��Ih�&��b\�gtT�5�^j����!����5���O;B�e��H_�*/�����`��e8�c���}�����u�������P8�A,_�kaR���q!w�YL��B
�}�����|u��F��g���x����9���z�1��?��|�X>��
���N�Wo�X�R{��/.[�����.�TTCm���jO��^H

F��'�50����P�_O�aG8��R���71��8����Pf�"xm_���w�(�<��3$X�<�a�����p�����0��^[W��������ZK�#b������9��2���J���v"_^�m� |�S�'�6�����>"����%���������o������a�f����\���m!^���Rh�H��1����&�~�4g%F
��*�V(S����gkFI�W�w�����>?p��m����]�JEq��������G'�5kcC}\�v��t O9�2kG
��,"��:�����Hw�H���I-(����k_I[�m�_�~�U?���^(F��
z�����55���+xAVA�����i�����/db�
C�c���hW��/��:�m�Y;��um�������1�\|.��3/rrI/t�wD��y
/(YC���=�xx�_��x��Jj�ix�m����@C�2E^����� �������(���
n>
/���qeX�T����"	/D����� ��Q������;�f��b�����W����l�*����B	/(��an�n����T���;{,�v	��O�ST���A��&�3�Z6+���G�0�V�������_� <.
�-���~f��^��{��K#��������Pv�R|X2b(hx�����x���n�Z'
F(5n&<�N�U����dxA��.*�#��W� �����E�r��@$�&x���<J�������|��� ��/�'�E���4��F,[�s&
���W����7_?���k����!����������M
u���cg� �(���?	$�����f�>t!�����r`bd�������7,�����q[{�����*���Ly����	v�669�
^p{�����2w��qp���A����T��������k�Z��(FD������D�Q���WD{��m6,je�+�O�\rZ1B�2'���
��9�.�''��E�?�
����=���^�XC��l�Fb�?����� �c�0���QT�Z�&�\ �Sk��
��� Kz	����zbD{���	�^��Z����*���E�Ww�kBNS�wM�j�����t�6�N��j���+���)�@��MW����2�~D���`�
�&xs�
�
(���d����;��R�e!�&��g����>�����xLJ�O����z������d\�x���x�-Z�� <� �����h�X���UT��%���������^�
SS�������/�;��$�������u0��x�����\��d�A����m���+���[���k������t��9�s��vgt���1�M��xz6474�������:�_����n`��b��������=���b����NW��v�����w�����<���a���"�(S�2��}SU�\���>�SZ�	���$Dd�6
M�����Z�K`t���������Q�P��lp��W���K�6�U?|��������	��p������T"b����[����6��7 {)���3�z��4���2h(���
�?S^���<�~
����lXs��,�?�a��'8��'�S�Vf����*��c��;R|��UI}\~�+/������5��\��@����U�%$�ve����e�@OS�l	9��g���v�����
@d/������
�#���
���3e�^�!�����c��LH����9J�	�7�u]�1����s��	0�mYMe���A��P,o��
h_BO���b�����e����H�.�PV��K���Z�/�7�����Hl��_C�(htsl;�&>�c��[�����������2����H��1��I�����-�������YOLk����Zp��6m���V��g��x��Zt���w�>���.���O����!^q���re���5n������F�hmZc�����Z���/n�}��iS+7�@�,v��B��\er���(I��������"�6��C���,�~�j���wx@�;���9�|=x��s�=��<	��$�&p�x����H)�������}D'��/:�KVD3cQ���d����0�� �K(Y����5���
9}#h�����������e��^zd#�z�CRh B��\�H����h� E������|�2P������"�
������}!�g(��3S^�����!&��-��.a8s/����} �++���+���������{��
����S�'����8^f�o�SDvf�������m���B�o/���SX:��#��xs
�j��:�����s�����M'����|/��m�>�����L��:�j������������uG����}J�o����BP�T)�;/-�}�I��4�5��-�f�O�������BRD�O �%���r���w��Z}G���������H��F�H�e����	F����-N��u��c_#g����i)���C�3gZ#��w��m�!��'�� C�	q�����"���h�a�i� �,�G�T�A\�A��&�O��Oz%��jC��\y!��K�7c�\�6��������?���5J�#��i$�2{������v8Hs��}V��M�+3x��m'C�|��e�6�P������>��*)4-S���U���;����Wg����=7����h���G{H���4Me
��x����4��������-e5��{y���`�
��pz����������;g�-,��T����9��>H3s IDAT��(�[�\���g��ks=#$�z�u� ,��1�NK�}�)�G���p����.`A��xf7�.O��j�~������B��|��N}�}�4zV���E���h�a�Z��Am���[[UEK���Z8�'e���Q��)�	
����UOW>f�*
P��%���K����Z�++x����
-
��\��{�L��K��A���h^y�E��H<��Y��`�_�	��/��Wk�:",.z�7L��c��
=-����Ox��%�9t���&�����	�5�!�=�����NI|�=e�u{��2��gG������Rx�R��K|omS�>�)��X���\�p$��s���gl���_�pee#U=���������k��+A[I�+/��FP�1�zO�z��c�4gk=st�h���\q��3.H�3�.�S�����?�F���=;�$�wz�~p������>�'U�Ad��[0;x!)"�'N���$(V��r�����zP��L%�]r���<��T��h������}���E�����;= ����}M�az��"����s���ds�vms�W^`u����P�""O��Oz��31�j�&�����#��b3��@�P�{.cN�F��C�NC>��SPr�(����1����!����A
!�oB��-dUUx�,�dU� ����Gw�{|?L�M�JYz/�=�O�,=��������6r����{�����~9���)�9W�����mm��u������y��W�FJ�����jHW^�b�:x��������-��}�)�+�*��c�s{�����Q�J�	�������
��u�8��>e6|"���}=J���ZT�K�������.�v[F���^^���'1z�Q��������[�T��+�����|	"-oc�rh3�8�����@F[�����	�v�!) ��^@��������K��H������>������1?�AFG	��gl"4�����"�����y+�
%�1�+����p�!����[!S�@�>�v������)��W@1y��R�����*4�z&�����X�� �����'E�A�+#���!������+O�p�A����-W�!�+�RmfA�����|��
LUAA�/�BVA���O�3���#.�;��������������}%�R�~w"i�6n8*�e��I�xf>���R�f��OB|u�+/x����mf���i�,K��T�����^]�x��E�����������H���M{����#���[;�>t
cZX�i7��������+**�����U�/H1A[S-��E��B��J�^�*����
��}�v�~$,]����@_7S���|��MQ��,=+x!}��;bx�nPV�M��+c;��@����/��8�_^"��'T��
�z-����E��/�l�BY��+���e�6(�?����
�����+��I/��h���5��8�Z ��u�:���"��s�M�
�5��X����|��.��@_zG��z1y���>��?�����4k�G��H����
���=t[�p���:�)h|c?J�p����^(	��<�9[sd/(j*����8��8��Y��4���{���7t9����^��������R]h���">"]�z�t��P5 y���qc�e��i
�C/�lU+<��&uL���oQwf#<��>}9��I���
eel�����F+kk\y����]�������v�������YW�Sd/��6�?='��-�$1�6����_X�M�#26
'���ns���_�Q�;�����7�8�PB��
��
�>�@��A��}K1�k3[�l�0��3��@�7���o�>���z�����F���S�O��{
�����3��Q@Zmx�����%��+4&�!|�U�)� UN���~��;�tN�Q���-N���EeD�p��;����y@�B|�7//���s�`���<}DqmU|��'�vd�Z�u��!�������
@/[k0��A��T�`C1���t��e�p���E���ji��S��������;��=�3fn����(���6^���:�h��k�����d��Y0���WX:��o�D���M9���N9���ICyAFC	%6t��PGh��q���������7��������h_	q������;�,�5`0������(+ ��Jh!��'Ax�������������������}}�����K_ +xaB��p����0����B0�@������M-DQ0�"
'4��&�J�����l���&��(�`y�zj��	��,E���S����Y:��C
>FE@���W�<��)�Ek���v���'�b7���9P@����8!D����	*x����q��'��X`��kw�oL8�&\��2����J��fUi�����e5���c	
��k_
��*^�C��w������ng|��d����`��j�@:=���9�������f�������TU��bQ���L���
^�}��$����'�0.��B�����^�ztZ$	�yC3x�y��t���ap�0���3>��L��gQ�[�Ao�n[��������(�����^hTE5��b�q?����%�0XPC��������A��Zx�O��tx	�����5y�`��k����ep��h�\V�B5�&�X��^�:V-q��<�:����@�v�{c��E@���W?����L�}�C[���c���J��p���)(���}A��������}Q��<���Q@8)���'�CG�]������	���������(&�e��b��D�Ejv����+*0%�A�h�|G��mhv��9#��5���-�sx!�4�8����s+$B���6����Y*�9
�>�]��3}����f��HE��K\=!��)^7��&E�����b\�@�+��o]������������?�Q3�
���&�x�Z�� ��#a(�����[�5t���l�ze/h(�cC��zj��5�U
����OR�L�~�|���QN�4����v31��
��c�Mxb2�S0kl�A�����W#<� 1� ��`�WV����2�u��'�R���<_bj�N�A�9����8:�V�M`�k���o0��uw����0��f�&F�k��:W����b�]/��o��\$�-#	l8�����_k��%.�����_�<,	xa�B	��w�\�~�����%�:�GU��hNce�B'��7<.^�9��C���hOZ@���g�1��-�>�I���������`�ig�"��� .d�ze/��d�Wa����k
�W"�X	�w~A��%������ds�>R���K9_���Q�wo;V�r����U�������$(���xJ��v
>�P`7��K��_.�0�� >�1������=���?���%���QEAln9�)�t	����:�7��'�~4��3�(0��\k;��w|�#5=�D�_��{m6��\_�����-�#�}{�����@U�
�sx�U�������a}���k6�1����$7��7�����W����/i���F�������/����->}�����^��B)h�g�	LP�V�/Q����#��K��l�����P��\�.~�GPpX�Q���@�G7"h�A���~�!��2���R�����00�'�	h��ZC#t�vh
�x��C��H�{.�@N�B�mG�1g�	����I���~���[D��)�O@�A	_��B�K�e�J$���������)�w�����`��~�r�����}�6$EE!��xm[�J������E���0����D<�K,�E���P21��=�y�nC��r�F|��������F���Y���]8� O���=)�9�&Ha���MXo?
��8$����A��!b�>����@6>f��>�]gY�V���L�Z�ry-�+����y��������nI�����BT��	�?<��#Z�����b
���1�F��rs3�������q
r%�9���c��!�C(��G����@sf-O��_/�,��'?�QC��/� _��bJ1���~`��W����dJ�D���7<G��p�R�A��b=c���&H��%�^c0D������
�/C�����f^P�P��#Q�,b���^hTY5-5�����tp�q�����Y���u[���)o��w7a�|"��\G�����o����	Hz}	%	D�vk������;4

j�0i4��1���g��P��<�:��:������P����p��L�����{���v�;8� ��P)^����<xA4;�s�"/8]�N��9��~��C{c�����v�?�������S�R���$�?DFE��eJ�����CN\Ua���r#�,J���Cy;��J{=���B�x�&����RN����/Hm�k�8�Nf������C, ��D�b��� G����x�N�i��g�����MU(
��B���A	����(j�-������8}�v>�F�W��F�v�p��p�s\)!������d�Z|�4:mX������4�p\B_�+���^���~��.�n�	$�J k/!�;��������������U�S&w��l�.x�k�P'�"�����JQ�u9Xv��OW���	w�����+�|
A���p����f����pa3��I�n�R�F�*���Cg��{���@�|q�W����tr��|	����Kw!+x�5��bEt�R������84l8���E
l��C���������P�N�vJ����V�)1h�i��"L�8�<]p�����6��	��u"�R�N��������8��M�1�!O��=8������9S����+7��sk�x����OBm
���R��#��B@x��82U^���W1�b�2���x����O+���SZ"\9�:��0�{=()�a5�	L�AK]�����������k��L=��^H-;��>}���#:� {�r��$�-����
��4C�je���v��k�#���V&t�8��~j���O��S90x�B)��������C[Ha�A%
�H�A���d
�3�6�u���
��P������n[
>����Ft���e
���<���
��\�����kD�x��3n0���W��P�S
�UJ h�9b���r� ��s/��>�O���j��=����@y
���K��0�i�oc�Q`0bQo]�� ��W�� ����M�[G�kF�)y��s dR�V���(�;K���SZwCH�GAO����M%q}D��fx��+|�C0�fC�� O����s��a�s�j�f��G�2��A;����P��B�d�>�3�����1���,(�f�]���
^`'7�~z������J��3�`�
���)�"�!@�?�'�^����3AK�C���
�Vm�g��x���e�b�����2�;6�#�u��R+E��]7I���'6:��Nj
/h����3"����5\���
�@����V�l'�4y���v�>��9:��	*
���E��T��_Q��=��O9���:��dY�F%9�~���������/P�������H<�"tG/E����<[���/��@b)�VJ+c��@������`��O�SQ
6�T�����,T`n��c�������1s�7jWTE�r����n�Y�2�d���R���������K8b����.]�%����-iM[�V�Yq��������b��)�.UV��p��=��"������w������+_���Ii��W�����~����d�U�4���#^|�+������s���Vi��T]t�RA�Q��z��5�o-2p@���N�rx!��Ih�Fp�Z#�����tGk��'t��"X`+t�NLo�+Iz���<���"`!��F��NR��T��Z�))*���]R��G��N(����ph"��'Y��i�	?w�
�
�����Rl��u���i�#�N��:���K��F��y������T�*�����>��-(���|K\�pg�^IK�H�����b������nl�rz�q���u���;6
�
��a)����1u�^���&6�t��������X���*�}�������O��SH�B0����1������H�eF��XDi���6�����y(F���^�l`�o����W��N'�s��x��e����}'�+$�Cl�=;hWm`�x�2���@�o��}�>v��	��O���
���������90��`�Bj�1�Z���{��0����?�b��t���P�wh)]K�(o���%my�[rE�l����P���kR]�9�|�����h�T�q�/��w����	
i��+]7-D,2�H�cU��i������>\��]�n��|*�i�����
Ga��������6�0��z�h<��#���Ec���P�T4�`����=���4Sf0&x!5��
7��w����AJ���pxa����V�`�B[Rv0�6���k���0,�}��a16�X�Sp�����"�OpD!\y_����\�C�>D�m�2��L�.���~�r#��H���
�}�y�R��)��R����P���Fc/�����z�R1���LQ-0����7��;�a�����C��wP�m����k7���+��Q%�+����� ����=�A�P�m*��s����	)��=��aJO���
���x3i`���JO^���g���OQq�~��2{@��<T-+����Z��aO�����9���S��\�����H$��'�I��r�n^��-�8~�C�G�A���>a���r����00
!nq���u�B���F�O��X���O��>����k;}f�g�Tx��w��_���T8+x��5n2%JX��x}}�Q��`��^0/W%KV������l,Y*/Pa�ffPn[���s�t�4�
j�g)J���T
U�C�\���?��Dp'�����,� ��y�l�@�Dz��7���w�
�"��Nk�'���@�sI
CA	�!��#�����=�� d�=��<����,Q��Z�<\L�"Ba�6��|�����T���/^�JNNW����U3�Y�A��[t���\� &�+,��p���XFN	f-'���U���,��E��Tv�W�N�9T-9����$"�K�����*����wM����G'��W4( �����4���xA4;�s�"/�{��C	a���+��}���h���������l�F�"����T(�D��)-��58�*d�7�;���7�����)R���)8z�GH+�U;��>����/�t^$lX���K�W7�
�B~.j�=a>���-�G�O~Z�����������������(p�\���/o�t�v�8L��"0� ��)+�!��AP �y:��`vb<��j��Y:&]z�$)8LE������!��5#uT5��B�C=pe�9�_���o���=Nu;J�RI�*����/����EyaJ<^�����q�������0�iB�	\����x��L�SbY���<5�uv��G�`�}o/�� �}�w��`L_@���y�d/05�k����y-�����]����M ���;���V�p��F�����y��v���a-�r�!�NN"(a��M�l0����6�Z�������i��<#����&	z��(X

Q���-����������}����V�L
���O�P������-m�^�p����� ���F?��O	���p��ZW��C,�
d���yB�U0g�u��2�� ���s<0�g=�[w��=:.���� Gu���Tx!"&a��\)a��\�aX��y�)Wq`���AM1���\���{n�@���W<U��|J�L=b��N�2��T�9u(�����]}�3����`����k��j�,(�G��nU�����+/��SQ`*���������{/������wI�<Z����K4I���	i=Rzx��G_DYvie����=
6V��m5 �z� IDATM����i�BR^��/������
�k��t�)#��Qy�������Q�b)'��:M��TzV�������y���w�������o����Y�
���=1��}���^`0�"g���\R�aJ	���'RG8��5O�p�T������r`)2*/���X�����hV	c�Ob��Lp&��:���K��A�t^�!<U���
N����A��
�����B�~'�������M'�S�����v�������`�,"�n��)#������)�5K�
��c�c�Qj����N�{�:J$/����`�����
���I����4x�\	%�l���{}������E��:8p)�ZS^PQ��P�(WV���cH�������R�)0�����es��>��j�w�������H���P��@XF
�������0o���K
���-�`7� �������j�����)R��8Q��V&;x!���2�WY-]��6A���4 !��X���u�uAk�Q7���)k�W�
��X���M��/����`R^�f�tB���`k(9"�d�}I��:�4�D��[��dz����$���ZuB��=�u�
��!uX
�2�{ej�])�����?�3��K�#��C��XH&5%�jA|�b�*���^�R��^��tz��N�� E���1��b�k��	�:@��Hy��.���i�{~Q)�>�+/��;�^OI
_�_��c���?�|��8����P��$n�w����0�	������G�w����@JcN)_��u�����	p��O��0�~kl}x���6�����I�`0��^�J:])E�M�������I]A�z���"��`�-g��0���&u�G6�2T�h/qp�N\SJg�z0xAOU�x�`��=W\X���E��p�1��o��OC|~)������w.��9+x�����
�aU-�������4x�)/$D�,�9_TT/�{��L��#
����/5 �e*�%a���@�R�>SJ�R ���-O1����������h��:�7�J	[[��2��[w�T�����)/�3����0����)$�TC�t�����/��?9L��������Ek��������U���0x�e��<]S^�B}���(�
K����Y,j0�I���Usl���I^=��u!���j���E�>��;����e���?}�)dI-!t�~h���/D?|D�n(U�F@�]� ��1�2�]�)/�����aQz8���o���}�4����Bj
�P�!5����A�D�kw~�e�$���H��l�*Ux��~0|�F��3��
MR�a)"�f�X�_)��R1t��x����x���:����ESyj��������.hP
�$T���q�a�/����a�
�%������E� 0�@�q�����k�����`��TH�!5e���S�0��
���I���!E�h��1�����B�U<h�}D�T!X���p�	����c�;0���\�A�++x�T�H�����[6�L�
-P�^_8��������#DKE�� C �B%=����y$��)�v�D�
(5!e��aP�l���o�L*
�)/P��y�@�����KJ	.Ck	S^x���^����b�xC�D�;_�(/��L������H��t�B��[iP����[�����P�W��(��WFx�Z9u�l���8lk�~+�O����L�F(��jR	!�a�g>8��I�!^���LS^`�
���
(��I)4������rw'J�����r��.�P7�AR|Wm0��'E��v<B<�AQ�>�v���j�')H�����|� �*���E^HLL��K1�����f�|��i�P�����F���h����j�������W��h��.6�<�ySFb����7u$��T�T)Oh&@s�G'��U���~�bV��VR[L�!=��U;��4���$�/�Vh����C��u�|M��^����a��xqm'U����y�M��?iu�>����S�����?�i����s�����������a�y�[T��4�����HYaz��A)�+��#�����?�m9~��'}(dW���Iz�9���D
f1��T%��N�G���pf#4j��������
��)$}f�2�2h�WK�S��v�IJ	LY!^��V������,�-����j��"�������~s]<Zu�������XM�:2p�����dis��e����[]�J���{��T�a��{�������3+x���^�����r��\�S<mD*���jU4�*�O���xu��E}�hhQ��i�&M1���L�Nf�B3�?��N+�����[�O�R���4�������.z�7�^��z�����
��&*vQ+��
�VP� RD��&��)$��{6=�����Mv��K6q���0�3wf��}�3����'�o���	@"����BUF^x��P�g9�nq���+�y4O''��~>����d7�h_%��)����B
_����M���/� $��W�Jb��%��b�J��=+���X*���L����:���>;J�p�0m��<�`���cSIJ6V�|���,
(���T�������	X@���(@fSD^p�U�����}��$���|�@j��<#/�������0��'�P=����	�O�W"a�P�������;l:t�$��1�{S|��(��I)�Y\UA��AM^�x�>��<�OC{?��b�����V�����?��a1������`�X:F``)&���������������� ��2���g����X��	�����%.G�4�+�,&y��>�z&f��p?���tL	��� �+�o����
�R��C"1�~o0�����1�"&�D&�����nFuk��n	'���fn�$�Y�CI�/����)��-x.��mD���0p�)��G��H���u]$��eM��n��0��l��9�)��Zy��$���?��t���#!�����
	.����qs�7����omL�$�C�����0��P�P>�\�y����x��l#�v'����Xr�/��N��D
H�'K%Q���H�FM�\��1��?R23p-��S@�x����R<����0�f��0��y��_�7�{�=�^i�_�<�wZ���ya�JKD��d����?S�on�=w������0�
�)JO����n���<��M�^���K{��Yy���;�}���:��/<B^Xr��9��I���$�	
���&�������X�k�������������L��PRP2�|�pd��H������)p��`���T�$-���X��,��g7���L�������`S��8tP|��e����R��.e�<�,0w�=o�����~_\y���;�����\�����g<1�RF���>y�Q��p�3����nK�����lz��b`'�.5�d�$M����������w���)"/�>��{�h�K�?�Y��Cb���y����K#>G,��N���p����{���I���:
��Vq��})��9VX���`GA�S7���c�����1��J�%k|Fd	J��������z��>K���nP�����b!����w�%��02�ZM��H�������VPv��)�p�$ y�*N$������g������.n���).d^%eJO�r��=>�n2�E�������@��e�����:��v��E��]%�N���������_e�.|,v�����O��O)]O="ID�v�pJ���^;(�wt���y]f���5%�w�'�P����bb0���%)Gp���Xz��E^� �-��:��Sax������0���}��8{�|q�{<�i"���Y��_�,���^��R_�Z�m��[�h���L�aD�A�H�������v<G��_�[���&�K����q�����Yx�&RV]D^��zSJs���#`Z�~��TX������%b@}�ZX~b'<,!����^{�'����w�fz&�E���0"8���Q3�)�4�U�������(�Sg(����cZu!��|�q�\���tm,�+���$������'E�z��e")����"M����C��>|N�ZL�����OwJ����O3����?���>�D^�����O{����_H������`�`�^�����q�Sqi�]��?�|����AVJ��&#�\�����rH�`��
PqII�7;M���t�&/�;����E�Y��a���x��;��U��Ck�>�Dg�V��������C�&"����[oX�����i��'B����b��(�������1�������%�nw���a���+�n�����I���omSH�S�\���z�~�������!`/nS�6�W;�G:����z��y�x�"�����lm���c����V#q���vJ4#u�6���vo���#/��' ���<�j��>�Z��i���m;g�����U�f��u���*���RM��#@�?9���@u�����*#Cd^�H�FJ@��f�P��>	).�SZ�,�aK��n�~��kJ��lGC���� /({�B��5�>�1��2�����7��)L�]�T����������|�.�N}���`��%�>�"�s3J��H��CJ�X��f��]aE*Y	'#f��-�y�ye�"6���
,���"x*���(#
dP���/�<��t�MM~��`��5<'R�F"8�5k�;���G?�����������
������
x��z^%;�����K/�7��
���W�hN�,mE.�>�~�5R��G�~�F���!|��h��_����Y���N�u1|�|ZB�
=��."/0;���[;WZ9��e>���t"&5���S'��_���a}�ZI��Qy����}&�|(������	�������a�B��I5!���p��	I��#y����)���^?	Sgk�J"�A*���"�)%	�v:��9��5����{�-��=�����M]H���������	���'���,�eAF.r�&#74�R*�n)G��4�R�u�D�������o������4y���
o=���q�R���C,���l}���IE�R�\M����"H�"/�s'�!�`F�F0��1|�^D^pm9��{��`)�t�4��o�?������0X��"��wDxF�1�����w��3����}��U���}�(m#84�^e?���yd7�"�����kz$�#7#	�����_����~[/��P�G��_�q����o~�/���&<3g>~^F���C���Hl���t��`�)O����!/�6GNP^��za3�I��
���-��v|���
#;�~�I����[v�������������K)*�k�S�+F�(���`�	��!P�:"�\u�k����6(U]����^���
�kc�*��;��i#�b���SS�C���Fyi#����,�� W_�aWS�)}WD^�b���OQY�*��PYc0d?�����li"/��=M�C�ch{e�����4��mo���#/��u�:m���t��)m�.6��[^����l���F���&��\�i�� W�Ua�x�}�O�����Nr.*7)�7�T!�)����W�TD^�s�f���FhS��:�D�e�BfJ�}�-��(��h"/�bC�������NM�[�����4���������qE���H��Q"-%�A^�\2-����+����T�m/�#/�R��4������\���� /�����
��t�yAyA��-yA:��fA��{D��cX�y����OM.��P��k��nJ��Rc0%���E[W����`��A^�%
�	��HQ[�!�t���.E�tA��uyA���`��f k��`  ��@U" ���_��{b>������"(o{�y��j]�`��~�j��|yA.��oW���.��1�LBy�2�6\_By�pX�eI(/��lI�����@S(/T�U��P^�Z�+�wA^�L���}	�B��]�4`/�U�(��Y���-bP�������V��X����\�u�M�GW�*�~M������E]����� /h��!k
��t4yA:��iA�*m��%���R.K�� �%�
���p��ai��y�X=c�q	���1K" �U�"yA���Pu����y�(�"%�
���Agp��a�iY�a�!�U�������R��kZpO��"�W���?U�E��T�P���o��jG��w}��
���K�nZ�������Vc��o����Z���J����c��nI�:�����_�A���?���?_��im����ej�AlV�c�O��2S�^d���dff���fff:���A����Ss��	+��9��;h��X����w�����,�\o�����	b"r��R������������U���O�A��<�����m�����c��^vv6�jiiYa�|$<�Ua����b]	��e>U1N]����tj$�:J����O�V�pT�ko��jV�9�gSTf�0Y��S6��3��.��J�����i+77�?�B!g7������f�e��c>v&�h���s������������`��Rol>��v��"Oo��P�k�
���dLC�k,5)��N�1)����D#�@
G�,�BUO�:=\*�J++B�j���Z�+�]��"������}��U������g
�%�#�S����[[�ju�Z���|*���{_�?�cV�-�*m��JII�
���ukh���|��1�K�G��2�I��&���5 �S��������l!�S�h��K��{���# ��:����|�]/R��HEP���?��+�zM
�1,�|��y�����T��?R���V���!,�E�l����!,�$��������!V�|6��������<6D�R\
eU��PH�cG�G\
e�:��$((H(/����@@f����R*��"�y�Z�g�/iii������1W�1f����XoF� ��vRSS�m^m��l �c����$�c��a)0������R�����VT���u�R�G�*�jVV������{��;1yp5�U�C!)��yp5���t����1�������|�����!P���P^�7��?��P^��������J�.�#Ay�����T�5�?����!o{�y��j]�G*����I��I7����|�]�R��HEP���?��+���i-=��
��������'�����t3Y���h�R����:���Y�G���#���*��yA^'��������E�u����^�G^|�Z�I�=�����!o{�y��j]�G*����J��5�e�C�(�
���5�������c��1�
�����|�����!P���V�����
�
Iy�������V'�����.��8yA^��`���J�.�#Ay�����T�5�?"X)uE��^�G^|�Z������k�jRp�y]�G��/����T�m/�#/�R��`���o+�#?�Rz�����mk��SpO���h�R����:���Y�G���#���*���"/�]�
�gW�=�m�=q2��N�mlq����MMzX������N���+�T:�:u(��\�^�&�x����K3���]���;|���t������nKk��VN��S�z���X9�]�U���s�`}M�
��#��������Y>��,0�!i���m�L�����9Y�SVX����D�1�M�a���@@  �A ��3V�d��XYd6��m�`$�
��s"r2Rtkd$������:F2���b6�g��8���\[����?��X

���KC+��W�u����^�G^|�Z�i��7�/G���;A^��#���N��� /h�� /���yAw�D��@@  �� /K)�yA
z����p���� /��� /�
�1yA^W��������E�u����^�G^|�Z�7�/�_���;A^��#���N��� /h�� /���yAw�D��@@  �� /K)�yA
z����p���� /��HfE�$ IDAT����Wo�aL���[�~�C|��;���@`�]\
�����sp�=\��a�Z?����,���c��'�����GN��� degch���o�Wd;5-���Dc�D^n^yn2o���H�� ��,L?����h��@@����V���T��?R�������J�^���o�_*�r��w>�$/x��cB�~�l�F��)G����h<��f���A{������&/����|�.|�����v����)���������NQPP��������_���+-tc~bT����*�L^�����\x�t��m�HT����Mp`j�Nm�W64y!0� ���{�,��
��KC��V����F4��D����pT���+:������'#a�N8�>1o��ieUi#$C(�����'�����X)pF��
lH����[��">��^#0~)N�Z���X�����8��-�l[#���+��J6���y6G�6���$��a�!����_�����
� �v������C�������Y�l��xg�8�Y��N#���(U��c�tj��l�����n�TJ�gio��[R��6�E^��;�)����/���
��7����N�/��7�����i#Oe����W���Skos����ru&/8xZ��W�g����7����
v����~���H��A��D�R�w�qbE2������k��3T��;�9m���	��������S�g�mZ 
$L�N+�5����qF��1
���~��}���A��#P���t�o� ��:�����r���0���e���%��}����Jk��UH^�Pe��5��*�����b�~�IN�s����B����H!/\�~c8y"�a,v�?��O��Vm���OE~~>��,x���	���v����	n�}�8�]�acc����nHIM��M;�����IT�o" �������|�]/R��HEP���?��+����~����^����0k�0��}W��h=M9��G����,�gk=��*������M�yVU�������
E�:��P��*������G���
�A^8|����
N���h���|G����W)y�����H?pM�����&��V���`���O�����D-���~j�� ����0I���jhff�#�����
e� vt!/�GL���C������[m�7����=y��x;�_��
��y��k_���yh1s~�%/��J��[DmJ���9�'�����p�&2G�X ��]pW�'"#?\�������������?����!?���Z�5���J��
A^�c5����y��
���_�*'/��ya/��������O����:g/^C:1-���1y�p,�n-^�6Q1�X��.�c�������;�!6>D.`�����o�`4)0dg��LL�:��z�����k��`���|"�����:S^`�LyjW���S��Y�l�ziZ����
F������O_���9�th]�������%L7Lk�D������7�����"'�|f����8������r����a��3�����;���K�k*�
���puu���J�v����Oe" �[e��{_��u��rZ�;M��=�d����O�x�5�}��>����K���S�Bu�����"�~���+x���u�pE��Z-��j���.�I��y���;R�sprY�����K������2���+�-�C��pn`�;����7���Bao��c��������k"/X9���l'��� �T��@�O������_SP�
�����6��@�����P5��.|.Vf��"�Yh=��tS%���[S�P�~c�y�{4sk�����Zm��c�M������Q.�/����
�)/0[����O����%�c�#e�u�:Z��qo��ME�uR� (�G������`����H��f^6��VA1��6Pm
CAz.��m`��r�!s_8�a����T�lX?���Mw`;�	rn%!�b���_���!�B,LLM`�B�?�}���?��R^8x)��9T�?f
�B��W
��#����4~�
u�8��O��G74z�
O� �x2Z������H�����)������oX����1G��dm�E���������8��=�����<on#947~�S^84#=�n��K��������������\��sq��j��F�i����q��+��������~�'���
���?�99��=�W��h�|$B��@)3d�����������PQ���G��h�|Gz^���'�������q������
z}�������@�d�/w����p?4���������7�j5����\����x��{/#u�Yx��*������N�?��>#v����W '��C����Pk�4d�D���}g=�3����X�9� ��=$}�O��	��`�$"P�����N�d3�����8��-������c��Cb�\<Rx{������os����F~vV�r�qd��pt���_����N������u�[��qb��������?N���y=G�G�}s�E�����0b�Z��K����=d�'����Ip��{V?��:
zgCZRo��������}�*:��W�;��f���5���������m������8���O`fa	sk]�	S��y��|
��q�K��Ex�i��
�[zJ4N��I	o���<�k5��My\���e���6�:@L�50��[i~����
+�\�M��o�>���{�@FZ|!F�7���__rK(�\~6d���
�}
��{p���dBE��3NG����[zl��l)a�����~G��=|���{�yR:��'�������O[t6I�a8���������G��Zy���$���\7��kff���pp�.��c#n����)������}a+���������+l�0�"�����v�X<����a����|�ols>&%b��-���/\��
�����'I.���?�_�a�EE��ym�OP�R�GON���
��
���vbt����-�LM���Mh�[�+/DQ�����_uS����`�l���\��+��D��3�q�;�ixmQZ�-���� ���}a�]q��8xT��`[������\�(6>��{�	�6&����S*�c�Z=��p��DdD��)e)/�6�m{���|������s��;�	s��La��mi��&����?D��?�����}��x�;��N�A��;
f�JNp�IOE�>��S�� p�r0��oO@��~��������<���C*�^
��f����?����m[Z vg�����V�I�C�.<&�"r}��-������K?k$_�B��,�g��������X��.����$(�/���b��"�n&�S����=Z��L��!������a�[a`

��9#;=����������,m�pq]B�&�F����l�{��p�nA�g"=�F��^w{�# �Y� �V��z��k�P�*�5Vb��wy��>��%�m���%�+/4������'����F1�
>�������)X*H��>��,�wz��N�\���_	����2�kny����
3���?�mh/|�T
.��~d�m&����}��ya�J�W���u������-:�(��P�X�i���:8��x������a��C��$ta������G<m��!E���7�4�3F���������a_�6n���Px�����gV���b�0e��Jt�1�~;1e��c%������/�m���G�?^����i������gn](�-������-A�(��G�W_-?j�Vy!?-
�]�z��e���l��������������"�!�s��������2���,����O3~�S�)�SlQ9rL�-���o4��E����z9�A|���y�Q\y�����
����y�(����og�O��(�����dX�k�����s
h�R��	���\y!'(YY�l����V��/V���Vo�O?�8~��
/i��?����g����[YYb��]���%.�b���=����;���[];�c�O0�����_��>^����K���s�Q4��E=
����S��`��!e������9�	X[+�a����C���h.�(MhC^�������]�:y��C2�#��,�B�6���>��7���O�*aC����W������Oe"P��������\�����&�B�v�=����7��xg�
���Sgb��O�W�S������z���{t���Q]z`������=����,$�!���i���:���A�!��Q �H:�?���
v�2�~o:L�����^r��1�4�	w��#.P7UM����pmn�������'T���
���f�G�+����^J���A2��n�..K�5�����3������?�#���s%�� ���v/9��J'��I)t@�@�0���qvI�	�&��p����}%�7��_����\���
��)�{9�6�.H[�����N(-���������*X�sE���L*$[3����f���A��P<V����h��I���D���Bb��%m��6����	�(�{�����P��9�������NX��#��Au���A�)X�H�Rya�oi�=T����p�3�;UT*"/�_�'���=�dDg���-lH.�&,u����L�*>�H��<�G� =*�gS9y����^N�:P:0%
�pE����7�pO��r3�p���_��U�������� "��A���<���^����")9���^����{��N+<�:��
��.�C��p��_���/������Ao����w�����!��.4i<�!�����K)�����xx%
����W���m�����Y4�5�f#��[��vO������������9y�����;���������JY�e��Ptl��o�"���H�}�_C�����v%�B�}���; ;(���p_D�o��ym'��7����ojm��@��u���mN����UE�����V0�J`A�����0���HM�����Z�<�u�����4�U�;���u9i��������u8�����y@_I����H:�5��i�vb
�3���S?M;�AFJ,�m]x��&mG�A�)��a�������0|��\�,����}�S@.�H��vpr����y!}�.�����(�zn�?�!�����[�6�g�����K���z8Q�^�<0�V^p��������y�;9�'0���c?���p��j"��c1o~�&.��U���� ��������bJ�������|LcYE��0�#/t2����nJ��[�G"'�����Ac����Z�ND�0�P��Jf����}q;��������!���-+���|��vDfp���Wc���w�"����~'\8��#ck�uB���c�>|>�ox�go���&��o[�'�X;M�U/C��B"�)=F(�^���F0�Eql�����u�i���Pz}���t��u����J�������5��H&���K�������/�<3������Y�mj��Q���#Py�_�����_����m�c��3�1w���3�P��I��o�����p;"�"��)3���������O��DNg�+��p�T��]�p��
N�������<<A{��^�h�Q��j��������
d�>��-������B{���Q��	W���-�{->����Q�"�����������D$^I�4"/X�>����|�w'�8��eD9��
'9������C-��
����#|�_���+�����M8�hl���*6����i�WA��C�7����%�J����/���/�3p,2b"{�$'/D������d���|����[�RK�bBD�\U:���@�g������x#�n�#�-"L��
�����i/;���y0w��!��s���F{�?���(��?��t�c���U����m3KN^p�H$�F]�����p4����|&�����-�B^�O��v�{Y�wB��4��98����	�v'����8Au�Z��g��.���=,9����D�#l) �����;>[�+"�@�F���k��`~-����A�nf��o����c��`��<-�z8���%��OE
��[x����Y��0`�7�}�l"%<��&Q���
]�\���iF�y'M)����;�1rYCl��&�����s�����y���6�}�}*K�q��-h�[z�cl��o������H/<�057A�����9�Qp���9AB]J�u��w�r]�=4#��&/0��,m�!/<I{�����������8zEC�G�H"%<���}�|s���G�y��O��>=.�H	����q5"v�d�#�������S��pliX��DaD��`U��[��s��x��Q��<�����E�^t�s���V��r��( \���P���j����
���5�X�������X`^���I�h��� ��MA�/ka3u�F#?�R����������(��"��)���:t
�#��m�7��.��k,�w�K5�a=l2O����'/�v���_o�(��iE^��� ���Sxq�|��oxf�H��vO�P\���� RK�F�<��7��������\U���f��A	!>!��Y�~[���Jl|"~��/��X�V^~>���GL)��p��U�����*a.�^8;������(�7b�!/8�5F�������s��6���Uy�1n�:����w�w�bHI�� /�")6����1�u'�#�S�����1������D^`��/I��
�{|"��n����+�l�
�5��?~/��a�p��%Nd��TD^P0e���0�������������p��8z��6�Y��`���g��U��P���n�n�#".�xZ	]�&��	]�o4��t��g����c"���[++:��D ���KS"x[p�F^hNs��u�ZZ����;����=��k3+~-��s��Eq��/�R��5�Ksgj�<���R#s�m���������������+q�9�V���DA)",�Y ?;+9�A]rB���E�BEu��U��#����6}��������������&�J��YH��LI���yz�dR?��ztK='���`�J�@�I��'��XF���@���,��="��9�E�S�� ����UD^p���f����NY��S2:q�� :���C#�B8����n���2,���w��"1P�>�7���B���-|s��n_0�kWs�����s����6�M:�9J�StT]����A&��*�������h���vm'����RA��g.���n��K�?tt1)*�3:Te��f~�����yC~���7|�0T�������MuS,���p�F�W���"��SbP8*��p^���s�?u�hz������P����EuI�!�B'5TT�"/��C8>�V-����!d]���� r�������C�C�w�*;(�5�e�:\y���_��7���3��h[I?��C��`	E�����a��yA+�D%�0���^��
�?���v~�����,�q�lQ/,�/�8';O�����RIR$�{<��
LM-H�`�u��duan�&=q���<��X�\������������y��NS�k
=Oc9�U�����A��M����`N
��$����Z���<[������=��[��<@�����6�R4��]'��A,'/X)p���S@�*���L`E
��~�h�v8�rbE����x��G�.@Bt��
#/�1�j������<�=�'e��[��I�����E���DdX��[v���&<t�
�	t{s�R^���HM��
�q����	?N�`J������"[������Q���ya���N�������OQ��+�����������Q[F�(k�h���g�G�G>�e_�L�B]v%'���=J�R�����@ZG��1��x��4�\ ����lO���!h�������l}�]���t�k�v���=�>{:6l�	�����wF���U�(��d IDAT��_3th�?��>>��V�L��a�}���_��e_
px�N�K�
�oq5]�&��w5�d��V����5}�	����t��;���{�����Mj
�!9���N���&��L��S�A��:|���/��+������}i�wIa<H9���a;�����p��i����9���%��)�����"Cr�Mt�d-�,�Ad����k8)��p����o�G��/�Y���$�h_1�B���<������!����l�B�uyi\E!��$��L*�t�_]�W��c�-����z�R��[Bu�8 =��g3��Z���p��]�xf�X�L��#��j7�����B��<�
S'2�}"������-6H�I��,`Ad���lt�Z�cfJ����b�~��o,���I����R��=N4���aFB.'?�"������R$�'��3E�:-m8i��Dw��p����m/0gE�� ��Kp��V�mj7Wr���/��x�#�]t(���i#���g�}���z�e�������H�}2S{(���f�W�`�����B�MKQz�[���O}9���;t%/0�M�`����D��K�s��R����}<W^���#�������Q������3��p�{�T#J�.�%?������;���v���f_���z�X�<��]�}�WC���	�^u9������!U�<J��U�`�J�)c�U�v���I*�1#��������G�S�\N���6�E��f")#�S�o���1��xC9�q���E�L���O�
V�#7(��+�:: c�XvhOc��c�:{&�����!Wh`�]�V����a`����4L�8��AZZ,0�_���J�N�R����F<PRZ	�����+�5�z��P�kl2���9��xi�D��B]~�u;�uj��
|�3#;���O�F�V��=�����d5��x�n�F@�B�6�zy#�u�r�\P�"/tj����E���������/aC���:�d������Oe"P��������\�����&�B�&M�I���q�X�����biy�)����0���n�AtK�u:��5e�_E���lNdw
��i�@���"����B��;���b�=����)#X��##��kFl:�����&/��!M��lyZ�:�VAx.|�����Td�
�G�&��9�J�^����;1\y���d&����$����vu�)U�
Y�yE�P�������)�������`������rJ#���������TD:���X���)&����v����#����I]!��^o�����0�&v�9�ILy����4d�z�Wa?/5���@A��k������t��X{6W�>)f���V���~t@t{}�_�D��t~�&/t����/�t��7�����Sk�T����0p�<C�Qth���'�)/�����C�������6����u9��� ���G^�r}�[�A���������+E��G�)/X[�Z
�
����k��[��x�e)/l�1#_����$��k�K�p�H(j���gg/�\{XDHh1�)/� p�M��lOD�[���'?>������R^�[�����P@�r"�f��fp�5y���������A���P:��]���0�bSU^PZ�����)��
O-�hX�}A^�
&QI"L
��j���"AGJ���(�����t�=�Wv�u��`_������<��@~v�=��FJW��I	L��S3��C�6��o��:!W�B�/���7Q�^��V�~X�>/7��P�&/de��*U
WJ`����Ck
�_��?K�
S^����<M#Y\&����g���;<�n�Xq7y*F�<i)5<]��3��h��iN (��������.��l�
G��jM��C�����AnF��0`�S^`������������C��J��F0�
������a�7X���(���Ha�S:�4�Wv�I�z�nR���c+M^��fv.l�
[�"{h��zv���DHa���P��H���K�V�9y�i�'J`��+k�h"/0������Q����{>/������s��f���!��R���&���?v��&�$>gD��(�����l6!��d����?")L����uDi�)=�������}�INzDy��JA*
������c��������yD���H�����t����6���]��q�]�&��3�$�#���!��t�E�w��>�Iy���L)�>K�G�u�SF������T�#��]�7��4z�W������03��.0�����N+�CY�������?���o)�
�-�����
�H)!��|?E���h4fO��JY������o��w��\u��������b�����q�����3��2������2�6��~'�}=JSH
yj��������M��w��["n�
u���]���p��D�{���:�������D��u�B�������Fhy��)/���."�!��������`����eJ��iw\���Ht�4L�`�ZR^��U�RK�`C�uJ1���I���~��#k����,�D+�k�Tl,l������#�$��05�_�����L$������3�.����C�W��-�%�����|Y:����������L���8�M��/��"e�H�'SzV����}�v���.��.A^(=�c_���j���T
L��)�T)/�q�5��E�SO(�M�7���Z=��KJ�X���LR^ �Zy��3�J��)c0"��I!���������p�����X
���3z�"�XX�9��6�^����y�1<mK��s;��C��*�UXu�T�vv�*/�����=��i?����g����&r���$"��i���Iu(U��-����������
��P���RXd]�����Id6^�e��e�.t)Z�rs���[���#��}k0b�[,�{o����'/�:{2,i����m[5�i#�����.X��z,x�9,X��x��a*
�6J��FR���
�4�-�������C�>2_�"SiP��]���1q�XN�XC)0���(MhC^h�~
k7������Sn�[�N�k��nF���(��;E]�E^�vs�����/���C����� /T�5Z���b>�����*}���9F]��w>���$#���g���.�U+/�q}4�n���l�=���]����vn�Cf7|���>��c��@RzW`:u��\���UD^���r���$�h��SD^��3E��\"������g2�E�������G^p��@fr>��������|�Y"^������(e��F��,���VD^`chIa
JA��[@$�D
�R����r�����%g���7�..O����u:���C9%���(�+54!r�g��t�}jB�OMyZ�������tpN�t,0^@��n�I&��5�����n&�!^�'�p�RL�.��� �@��;\)���K�����P���� �	X�����I)#u�T�j+i���S�9�#��[a�����RC�>:l�q[u�E9	m������(��m�5����iDXH�	����:I��,E^P�]���Pm	�U?��M�\��e~��R^�E�B���00��5������l�"����\`���6�/T]*"/4#�OW���o�}t��������hAr�����cI>��nU�K70Xa��C��A�N�����A�H�3;9��B�(�D:���9yog ���T����hIr�t���E�4�ts@���C�o�j|��G^�xe#bbo�������K��ZM!&6.o�9��7}���D���)%Xa�FPH��}�;�E��8q�[$�D��;��4��G"2��
�BB��W�W��Iu��R���w/_����].�pJ7�"��)0���?ab���:(���xD�+���`pc�b�%�"C�	��JP��7��X}�_��}��,1�����.p�7����<���G�����;�I~��KS���6���q�}�0����OBNT��l)��z����u�������+�f|���4D����"e�q8���W)16A^����D��qw
O��s�M��_D^��v�)
��B\�-��u>~�y
Vy��`�����.���3��I1�\'���F�z����~8��}t�&�[��SC`J=G.���l")0U����p��*���
��|m����n��x����9�	�'�<%SU���ENf`�gv�����+�1G�]��L-@���G���!���T�Q`K	��@�X�<��5����F-�)=0���mx�f'3=���g��B��78�j�Ki��Bl�MR��E�'��sa��9��6���i�~����<��l�@K[�0S�����6J����������;=E����'��iR�(=_�c����q����R���)N�^/�����Sql����uS�|��],�>�Z�W�(����.R��|n���\��v�9�����~f�8����(�������(��l�?������^.�X8�i��[����Xyh_y�����	�h�C�WFb�t��J�Ya�_?3��qp��������T�bc(}�;).|��0�UR�2���r��o=8��r���3_�3��
+�=��;~���]ho���awp:�v���D^��4-^s���xR��:�QD^��7E���/����A9�>��Z�V��p_��u(�k�G��Y���7)�����%��]���CmP�����*���������&"�G?%�-N ����.�GY����f��IkN4���]���XD^pl�M��������k7R��BJ
���y�=���Le!l�z���6>�NM"��[�G)$�_���NJ"���M�C�/'��X��B��g�$�^�7Bw��}������G^���Uh.��s�-�	_5yAE������9�V ��V�'�������l��C�����K_kDmLCVL�l�v>�sm�Z �t&���afk������lG������5�������[��TS9@����=���G����-�p2�v�)Xa�F
`���>SQ`����"����b�7���������v�^ �N
	;����[^�� xfj������
�RS�O�����r���8��])\��C�Ap�o���W���8�Zq5F|`��A}`A{a��`�{w���� 0�X���)^����j��s0"A�q2%
�aJ��x
(
G�Y�N����������y���hF�+X��cuk�D�W�`�n;[>v���)B��1#3\$������Xz���r����`���6��s�������+c�R`�
��`�����9�|��L����@��������2l\���S��!-hM0�����J�/��GU���X���B��)!(H}A���^S��A>�)���b� JI������Ly!c�N���O�-�����(�L��Be/���r�|��+��*����>d��
6O?��CG�-�
��)��u�D	����'��k=�M��X�n�<R{P�3���/��V$R�
R����$l��~~�����o~�/>x�������y=�iwDb��]�U*��`�)O����!/�6GN�C:M���6�����j���e�B����/���Xad�YS�a��78�A]��L7[
��n��'�^�����z�u����6lCrr*�)���Q$��T��Q�o�hC^�u�e�*�!�!d��`�q�A�(��*�����
�W&�����|4�t�[J���Rl��&��!��
[����1��gY�}��������nSy���V����U1�2�FT�@��S���b�5�A��9��,MK��������Oa(�Ua�N��\1A]��)k�"��@y��,GmM����Q�E^0�1��Wy���`,�c�D�X��)vX�	Fj�������B����!�Z��!@�@�%*�w3yJC����1GJ�)���Lb����Fy�c��c��� �@�}���! ��z����|�]/R��HEP���?��+����~����^����v��p��yA��yA�,��c&Z�C�XJ��T��n��Ug]j
y���{��*��`���� �������A�LR���g���\uR�b���1.]m2u�~��hfa��[E����N�y���y�:�^1�JE@���[+��W�u����^�G^|�Z�i��7�/G���;A^��#���N��� /h�� /���yAw�D��@@  �� /K)�yA
z����p���� /��� /�
�1yA^W��������E�u����^�G^|�Z�7�/�_���;A^��#���N��� /h�� /���yAw�D��@@  �� /K)�yA
z����p���� /��� /�
�1�"/���AR�m�����X�m�KQXZbx����J�Bzz:\]]u1a�uE��(�R4(����D@���D[���
���S���w>�N������d��2s�g��#�$%%���&&&U6��[*L	���6�����V�:cl���b&�rr`��^��>�)�W"�f3-z��*����2��-���#WZZZ���`aaQ��@�$�6����� ��ZiZ7�4�
�P1�=I�Z�^�2����to!��;f��B��2������L�@�P���Hk���c���OI�d������h�&�?-��6�������
�2�q�5��eee���������x0�b#��}�?E�|���'�c�����?1�2�m�[�P����yAW�����"/T��y��=��|5^���	��T&5m����L�u�K�G�*���O�c�K��?��U�u����kM	���T����7�]����?���.����������43��b>F�>0����D�&���t�����Oe~t�K�Gw�*���Oe�]�/A^�:�E�F�� /�������w�H�.�#Ay�����T�"X)Ay�����T��?R��}M��V��V�Z���������W�������c~�����m/�#/�R��HEP��"X)���,�c��!�#���\��cT`�I������#;;�F��*((�H�����J�A��@������*���O%�,�����<�b>C%4���%t!�#<�������n���_�X���������J6.�#BY
��
�$�L����)~$���b>U�]�hRV��B�+��&�������Z�1n��T���B��/z7b�����7���W�u����^�G^|�Z�i��I7��o�|��py�����T��?R��}M���P��o�����!P�����|�J�,nZKEP���?��+����T�m_��S�n&k�U1mP��:�?U��6=�h��<uyA\���� /�������w�H�.�#Ay�����T�"X)Ay�����T��?R��}M��V��V�Z���������W�������c~�����m/�#/�R��HEP��"X)���,�c��!�#���\��#�����Q#(��������lI��e���\�ldeeq�kGG�
��X+��3�"������q	��T&b�U&���U��{l���'8�!�)���Eii���\�e�tmZf}K��&&E���������H�W��x&���|]�T�����|�1��HRR�J%OQ��	BmK�����y�b>��*�r-a�e�u����H�l�~Kh=�*j����5
Lt�-S������4��Oi;�
S����k?�Q?==�wcccc��
�U�OO4�-MFL��`baU���������F#'�05�>E����Z���35��XB7�:��atmt��6�����J����l��35&?Z���c���5	��m�ae�������8���K�P���l����/a[��d�Y#�����,����UAl�����`ZcU����GW�h�E�L3
1ci65����P8!��N�����M|���:���:�G�������D�,������J�$<����#.F�
m[4k�VM��Z%uD��J`��S�������?U����4��������F IDATJ���|��)�J��z;�z��������T��N�n=�_a=Q��X���#V~��G�@5G ��?S������7&�Yv��q#8�-����!3[���T�;��Gl�42���u�l����v�m�����W��� ���M��+����e��P�_��
�)Q�2W��� 3+�R�����eG��� �D�m����>sm2�e���Qy{q�3�,.�'�n��n��	�%
1��1l���*�3w6+@��ul%�z����$iF*�uK��P����*����`O����y������_^����f��i>����GE��$�� ��kZpO�G��"����T�m/�#/�R������\���� /����cW�j�/�L*A^�\���	�B�^����y��Sy��5.��?��� ��(������ /YA^0<��Z�]�\_����$�2yA^�E�R^|�Z���������W����}��Rq������/�<�0��?�$�����\��
s���� (^?��EFa����+���Q��Xp�O���oe���;wL_�l����A�ML�}����m'2o�4����C���:�)^�g�G����������z�_�@o{������8�?���n�Aa����:o=���,4�]���$/�����i���6�8��"t������N���3�����"&9������xy�Z��`��6K���������~�;����h0�
"�#�v�^s6����N�HL���� ��bL��A6�K���]���3
�!��s2��������Z{(V���������U<s)�)�1B�v:U���S%�|��
Sd�i��U����#�T���
gg�E;K��1��g9���	�s���h�N��{������!�R��n�I�v��[������4j�_���.<��/�J��y����{�@`xmm���a������������@�v�������$�:wA��r����p�\6j�!;���������4�d	'Os��Q�����h;�JSP��S�f����I����tldl���_q�(�t���w�8�G�����}����)�b�Gc$c�6`h��6��!`���m�r>Y�qZ{�F�������tj��� /Fn�F�.^���t 5t@O>��o~�o>y�riZ 0�.�b��A��z�hC5�$��)?����,���c��'������N�:�����g���?{gVU���?�
�
��(���kww�k�Z����kwww���
6��tw��3,�H\n(��}�Q��|�9��3���[�F�����n��C<�gjJ*���Oq�3b������)�aaf,Nw�2��xA��.n�{�xd;_$�]����my�?��������/i��*/�x~x�w%'<�������*�0����m�L���9�����}������?�;s�f�������P�R!����
Ia
��QPc��/� ���_>�f�=���;�!H^p�*�*������������e�j�H�����OwL�}@�d[L�����<��������AE^X��f�?���T��Y���"hi�~�/���q��p�q����/H1l�jS[$�B	M^���MII����h�Ib(������Q����5~8��Da�V�:���:�|/��X�����[�����11����w�ad�����/�z� �+���z~e��O4����|a%x!������/��H3G��V��+;�4� O��U�����s���^�����aa/�"��X�q�	���&��>a����v8s�&lJY�by�|!	����;|���_@0�]��!}:c��C�}X���+7c��Y}�y�$Z6�3#��z%�Q�J�y������3F�%�E��):�^�SU��z6P 8��G(.~.p+J��,���.�������3�vC�kh`�������������e^���!��W`,��}(W*/R��I���V�M�?���G���#�.z���?�n��n���S��d�����3��4��]���@5Kk$�������dk��-�CQAKO���h1s���������%T�
9y05���X�j�
^aXt�"�����=�C���^�3u��u�4Z���M���MJDbj
��<�R�L2��4�%�����v��:M������Ly����@��<�cz�VP�W����~�[;��'j���/��9��!��,C��q�W^S���~��1+�2��z������3�U�[�����3L��&�q��"��;c�~l�����XO�@|"���^�a�� 	��A v��� � �[�beCz����Q7����A��0RX`�V������_
��&BAS
:����1B��N����
��j8,E��?A��h��hn�L_�������8Xm^�E���M'�>( x�1$�{����T6�����i��%"%"jv��4x2W^0�2!�O���"C��7P�0�v!=1	&Tor`0��G���������y��Q3IU"���s�,��esc�=���G�D����j�'%���A"/�D���Y^b�7�kuuGP~���Y�1��}M%%���$�~c��������H$�?��]������~���������))!�����`H��Z��x9���Z��W���w������[#-)I>~��{-T�X}����O`��`���]��8��� ��AA[�O\�|�-�1[mZ�Do��.�)�w����?L�m�)t/mZ��X,���MYQ������V���K�N��U	#�kT��y�/_c\�V��������|��>c�B�TU���:�P��7��e�J�\�4TT0���0�:�@S���T����::U�[_?������m�
�}�6�i����yY}jo��-��*����pZ���0�������N�a���t��G�OX`��HLN&�[ ]_�������ES[��>'��al���q��>~f���p;���c�������{�O�A_���;7,���������/����2��.���xxa���wO������k8*iZ�"��������+;���~GE}3�L�ik���f��:��y'W��u��������I	,:~����9?x���������~�T���&>��x����L�H���r�F�,�@���{pxAQS	J�*��>��v�0�R^�ak��-�mR+N_����4���t`������m^��{O���hn���6M0����������B��������h�b�o�,_\����I���k������0](�("�\RS�?�~{���<�����������5a0��O�����G��xD��Fuh���m59B��"�8�S^K
�������F
PU�*f��
u�.?�7"29��)��e'����[�v3���o���zID$E`J�)�I����K�Cg����_W��~�}�\4�f��������!��?�e���L��0yL.;�]&��F)|�������i�Y�rQ^���ju+�,��w@�~Eh�j��{�w�%tG�����cw������V�B�����Z������y���Dh������x���R���}�\T1;�B��TjZ"=��K�b�<���&���CNU�7���:���e�������!��]F�RE�p>�c��3����������j�g�E{'QW�Ejs�KH������Dx�g��������#�P�4����6g�u��mc��O���>!v��9�������t��U�c-||��w.I��f���'/RY�����yx��3�(��F�Q��
f��O������������8v	cZ��P";.�t�[uC`t��?�R�F�'3�w�����>�����1��.����Oo�F6U�%���<���~o{}��&����UDE�k����8z	���
M�:`��SH���(zohG�1�����������j�8��4��toR�R@lx*��-8�}�F�G����Zve1���P����GO ���Lw�L�����e�>�a5=���~�p���k;�K����}�z��eJ��`:��Zj��r�*n���_��n@�
,M������:���7�������G>S�K/o�?{'gO�6�Q��������6��,������#U���O)xs#�i@�V�d[y��m#8uU�RI`I�X�g����:�t��<	��IPR�g[%�VO
D���b<����@f���|:�1tA��jvW��3�\y��Y��aQQO��#-5��1Th�
�6#�S�DeT�w���8(���g�h8��E�[��<���V���/cP����4�7U���\/�#*8����Y�����Q[�JW�:M�z}=������G���n1)������^e��^"L�)��A//%��X^��T^��^PQ�G�f3��
��v>o�X��y+
�Z�E���g6dsZ����,)�d��Z��Wk�d��wz����Eg������n������-����A��=_������U���zH����Q~������Q(�j�D���{%�w�� >P�g�<�FP�m-���>��py��s���G����*�VmNm*�����B����|}/�B�0h�)�y�������������i<JX��y�������=1����@���lT�O�.�g�LUA��OB��}����Z�������i��P�w�����~����V�^�����~�(���A:A���L�N���g��������x���^�o
�/��{�����k-;������qt/5�����u	����������_�^v�����V�o��i�_��L�������q��-�9a89�"6.������=Vn���Cz�?(����-��B��^q��e�|zZ:�u��Vn������D?���������\�a����I	th��r��-��t�s����a�DfJHL��-�1���Y�1E��e�����D,L���7�����D��N� �l����/�������9{��������/�/l�{L�`m`�P�55�������Cw�v}5�(haW�����Z
�FGAI�
��t�/n���x�;?�]��i[T��7����/]�J�6q��	/h��aM��vh+Z�U���/�=���0�cO����w�}`����E�^`�i��cX�HV�����o�	���}�%'����K�6>�sm]�$ha��]/�jjs�`�G_9�P]�T[�X�]�-P,��2>���BN0��
,�C�r��&�3�\����w�0����Qg�n��0�6|���sdGW,�}�T�_M~��+lQd��=������u���hoW'�<'��-��z��U�����I����-�~�<���%Ii"s���4I��aK��	���dl%�������(�b6�Wn����#`�f�wk���������l�?��+l�n��n#a����_-��	�v��9+�f{<�c1o"b��pq�:,MG��|������������Y�q��*A*������mK���R����g�{���q��5v6�����R�\+[$
=p
��'\p��I�}�l�=Sy��og���Q���`��#�W��z���Z
kB���X�5jUAA:�!���,7�XYB�����G�=F��:2�����������9�(G�����q�
L��"�l���u��s4�� =���0�T,�o-�`�{�~�#��H��A����?��c��rIsl������9���q�2�$�����`���e��1���
m����>�.��I��sEZ�b��t� ���$��WeE�����\G��������*l�E�U�8���y�q>�]k,=u����gZ��G�l���g<��	��N ��U������N5�������\��t���t�N�zu<�� � ����-W�S;�X3�?�|?����A��&��M�3���h]
1		8��1v�A`�A������c/fu���[v�k��|S�%'��s������
����pP�u���T^`�����������s�Q����7�O�n=}V�G�jUp��6��;�oM��%m��y�'�M@�%����[_�{��.,>~�4��S�@�ekP�6B���B�T:s��K��8��	����&����e,q���6-b��?��<���S0l�VX�b$�}��/0Ra&\~�B����:�64����R+ ��'����������B�a3�W?#��Z���)1�^����gAp����\(L���0���.>4�hnk�=�in�a���X1�������8������N5|��}��&��"��f��H'�@
��r���� `n0���LKz=�}#	.�0�m����H%p�������H& !�9����)�k",6��wT������h0�� QR~�����p�t�@���r�+b�����������Y��Wf�5��*����7��T?/���*.��'�&�T��*j��}sa��	XYy%>�|�W��
�K��������C>�x���QC�WtXRi	��=Apb0�XR>:x�t�M�%+?��R�����zF�� |�)���������k�-7;�/�w�G�g8R>GA^Wi�q�����
�R�
�	)Hz���8� o���/��������|�FoG$��D�P��
m����Z�����L�g��
^���U�����K��J\{r
����Wu��Q)tj8+���5����[|�}-R�������5m����qM9<�����`n�����P�6>5h����m����P�6nUT�8�P�A	f%pt[,����'I(_��]2�
=��
��z�~������_sE��������?����#L$��6��P%8���+�l���U�w1�e����E5K�E��f�2ud6v��G�a]�!��Oz7a��	l����y��#��}O�pha�C8���������J���B���g^=����=�w�����Y���*�W9m�^P��C�q���4�Nj�xB���/�����3�[_����%�����5���!N8y�X��GO�$�w����'�px�����K�Yc'=w�3�o[s��P��W0�Yc���]	t`��n�A0$Pp6={toP���o���NFRn:A�B��-C���|���7m�)�wc�om�I��4�F���RJB�Q�� ���u`p���P��l]M� �x7����"	-�8�N��(SW	��P�:L��f"*p���.��x�]
���(	�	%�P��:>=I��D��*��1��j���4�	?�����]%J������[�b����-9<<�:�3BF\Y�f��K}|u-��U������s"oO�P��R�X|^&���2���B�_*��%�f7
�)�b�h�MU9<Q��
T4���6'��������*���S�&�����W�������fV�`D�r���
vv�N���s�
���������x�(_;P���������C��?���EIy��:�:i=�,�Z������@����Ns���������E��=�E^��*����-�����������?�(���'*	��{v�q�
02/�WN����8�y��9'�oQOh��a��8�u2�����n�2<8�	���?��/(�se��kp��0X���g����)�������htznu��v��
������Yp���O������[�C���
S��������	�H-����x���?���:�������8o
�]��D��'��v��t+���5[Eq9����k~9L^�+35�&�7�����/�m�b/,�g'W^�u��tm��1-,��9e�`,^���B��~��NU����D�7oT���$�T����p������Vm�����Wl����sn���[����=�Ta����v�fO	+Z��-�����u���{�A�	�������_6�(���r0G9z;���H��_�s�"h�v��;H���'��>h���#v<���%���P���B�K���j IDAT���m�R��SB����y%����G��~�
)�
�O����UD{����������i^��>�4���+m�(c9�-�"�(ITxA�b��Q�t:j-��S��q&�j���g���4��r����	����1��
���B?G:qJ��i��n/Q���N:E�_�Z������3�\1�@GS��i-P��K[v��S{y����B�s����xbQ�Nz`��t��)/���c?^�-r,����F�
��R�c����B@S}p�E��coW�R��`�g�(>�+�$����3�c��$s���\�@�B�������:���,�|6�����Td�B(m�'��6��iz���H��9WZ����^���w��u;��_��:��	�aS�����H�Sa������7�6�������\�A�^
�<|��	�Z�y���2�����?��,�U�&�+�A�62c��euS4�!!�x�Ia/^`j�O\�j��l�������u~	9z��'p!h�^������ ����#o��5)>���_bu��Wsd��U�Y��WvT4�G�c� �����>
���&S�`�K	
� ��O��!J�������	��9���*{�����{�q����+�x���~��'|�-�A��Ys����tz�L����SM�k��2e����)Nd�G�	Ci��hnC)�kKTx��L�{�9��6�����Z�:��������6��Gg&0��Z��a���\!��mi��Q� M���E�l������:X���Xw�2W4�=n"c������b��#'1�K{���S:��@=�rx���&6���RFF���MLy��eT�C�R��L�!�>�2��6���W�T���MQ�TIl�r�>yf���OR������7>������;8���.?w�`Efb��@��U�-�-��.��n�v�fS�`6�:z����UfR�6����@e}�!�i���<������O�f����q��z�-�9d�7)9��������jHE�{G��&��Z#+D��-�|�5R=��J��
��Qo�����6����x>��=lC^�S���]S>�W����M��~�=tOJ S��3�r������I9���@��|y��Po^+8������2[��)�$#|7m���
�l�1��"=�av�Y�\D�p4$/D��A��$�������ZIZ�HQH�N?�RC��h��������#�G�BW��0R1�
����Qo��T�Ih�z���Jk�����,�'��?����hR�	���J�n����������2����\���NeL.7/�_`��6X�Y":%�������v\�Ga�����%{�4�/�b.���ryK�i�� �o:�fU�N'�����	�4�Dn'?xANS�����Q@�YR��M�N��)���!�c(��Q(e*
I��J���I�$����P^�P���A�9F��69Ey����9;� r��i�>-F�\��8tm^}r����0zyGT����6����hKT��/����]�H���S#U�K��3CA����}5H�(#�q2���s!M;d��d���	��$[�F�����*��J5TD�f��$>��.��B�*ua���
���G��w��5g����ZVe`kd�������*]w<%U���^�U�>v>����d����M/�:�;����������1�����|��X�M
j�+��O7���}S:E=��:W������8F���[��*�� N�-l�uu5�$g��t">C �����I�|����=��If������1�s{<������fU����/\9���]z��EP��N����|��rAJ��C�G$�N�T�N~9E��T��::p%�C��1��K���Aht4�X�������^�H�/I
�JiMm��|&Mx!!&
//'pE��4o��8�P�����(a��2_��>SS`�	^H�KG��*xy��:���k�-AitX��0���T���+��{���,���`�T����:}�qww,
������T��`\��Bjw���*]�1!��H��3�����x�r����J0�������jx{+a���k���2��(�BP����M���<�2�xsK4��TU���J��?@:��,���C�Dy||���/���
^``j�Z��k��#������da����#)Af��3x!s-�����:bxuZ�����E�<���~�y*/�w�N-a��#_����\y���Q��"�a#�.�r�Y�������}oW�5�v�����z�XV(E%Ut����j��l
�����,
�}�t���
�O��K��z����<�8�m*�}3T�DIy*/Pa���P��>
^G�p��}�MPA�]k�o�/��
�����"&���f������z{��N�(=�'��O&�������w,='�2j�&hv�b>y�AiM��{�O^����=���^��V���&��O���~H��&3	�B�3���'iR�����[�1vhol�y�had���#�`����6n��K��aR�B_��������Z�b�
�i�����eA�D��z��;��}N�������}��x:�l�N�!�'gz��!Tw;�9	�����������Q�x�xQ��J�Z�@����D,lf�1��,��e����Ko_��i����_ot�R#^8��5%e�,���������,(	�BA����m�R�t���k�#m�J����q7��kU��&�x2�c
MP�^�o������0����W�^�\�>n�z�j���vY{,8�O�A�
/�
F�Ll1���'Yl�?�d/~x���x�T���*2��o����Cu3$�B$���*C���(�%4�*��O��<���
0�@�F�e�VF;R`*���B��E�"%+��e�������P�����Nb#x�)$$����m0���^�9v���<����.C$��Ix��!0�@��4IE ��m�fq��s@����`��=W (1�7Q�Rn�e�o������d�i��m���SS��������?y����	`��Vm�!&��<�^P-g���h�n���������~���`������P3I�7��@��d���<tE8����\���-\�Ey�O'�����2�h������pyg0�S��4:��D'���,�J]��?(h�!� f���ey0���(�9�1��gi�D~�2����0�a{�nk=(QheR�����N}3�!;�=Gq�"���O�����Kg~���a:a���������B��K���eH��C��_���������9n/(��`��RRy ������n�|C�Mk��S��R s�{5�L\q����U�W ��i��wn���ODWR�B�2e;gw��0s�a�t��$�<�NG2����!�����I�	+�\��l��9��r)D��������5o���	��G0 `N��<�CO:-��2&��$����CW�~��?�N�~���mc�qE�,����x�������D���L
���.����	c0v�.��fKL����`�I�E+��Mn}ea#�����\x�cS��W��.���p9���(*�B������e&UC�k0�k�f�������H$��ne�K#��W3`?Y)/t�Y��	���.E�5�m�,xa%A_Ly!��zP�����:�����TV
�r�q��B�au�����&tB�l�U�/�v�F��(�"��7�P���$p��m�)�
��4s#z���O8o+7�������V�q� 'x�5���NU�P-�9��p%�L ��l8���B��������,�T^�O���
�����d�4�i��B��V�3����K�W�����IYg���vS��H�_��:������\���.Ht��PJ&�`��)/�F*)/hu���}7
�y~����*�6�P*k�
��	/����K)H|��f��;��x���Q^��	��J�@��S����T��J�NH���a��x�N�\�>^�1�C�F���t���
���(Z(����gt��*mx��
Wcs�z�f��Hy�6�$'Q3�~�L
tC���23�rS^8�9]�hP��dbL��
/�`� 2R*c�"�"%�L ���N�s6��/)��"�`��[<dK9��HM�mD2��NN}t+6�&��c���eWZ`eXh�pz��
��*��'I���������^V������������\Y-���)0��r�,4@	ex>�G��F��!�6��������jX���^��/�'H1��'�{�������CF��Sy�ACf�u�&��gP��s1��-���R+��>��ap�f8Mp���0��-h]��)(|k�=�0���s�/\wqE��
�����/��|#Mx��!��B�@�{2�OP��>�b�"��`��[���;,����v7	e�(�b�W?`JH�����}����@�PIG%M�!H�}���vRNTT��
2�%
S�L�3��;;c(�:��I$@A���`�+/�!e RTa�0��:f���o
��}���-�0q��c���My!���+�:dW^����E��\(d�S�y�SyA�����D�G���o+�������Rn��������r���w{)�\�h���N�SyA��9�����<��<O|	��_���T�M�S�AO��/������px!��-j�u���M��J���od����������t�w�5���q������f$���1����I
�c`�R�����V�Dd��Zya��\�F]&��������K��/����j%|�x
���p����4>�7����fP�wl����W������
�@>9�+/���t���������]���\y���-h���7+6e(<t�p�����H����)7�������\ &�����X\{��l��/�m�b/��.J��E��}������!�L%�nZ�kx��|)�C4}�^`��:-���E,:y�x��o@��>cff�R$�
��CSDQ?�CP�ZX���������d�	�R�H�=�:�{���	W{��MB,��D�L5Uh#���E�% 
���cA[(�DsCD����^�w�)7x���;N�8s���Uk���^�O2h�xl�2F���T���]@�j�)����k�u�g��Q��a������m�R���?�mM�Oa-�}�7�����}�.zk��'^`��s[�igz��������I 'D����MY
��tiSL>��w*/x��}el��K^n�v�>���Q����!tr��
#���J<p�Sl����Bm�l�N������C�����IV���`�Kn${�������xK^hbS�/2��)��
,,�GD(�2�r8aR�f�R���d�&�n��tI�%���yp��N�����H�Tr�'����)�b�����K�x�����?�h1�������$S�!4�)f&#�
�>:�������s�n�?�~�����cgj��T����g�����q����$	����&��g�v�$��y�]��i~�P��9�@�3,�K^��S�J�y���% ��y`�)$���7��*P�z��S(��b��c�Q`J,�S10�}Rh�,��kD���
��@

&��w0Ww�1f�G�{���9n���W�v��,�����{
� ����9^v������`c,�lAQP-c�OC� ;������Hn7t�I��9�I6���`�����q���e�*��>���>
���a��E���:e!�g��ON;�Q�����X�����u���:��qH�3�U�~���H������(1�/�	�g>���j�l���l��Sn���}�����:X�_H�G<o;x�A��kF��P�w\G05��)7x!�=������N&�1���+����3�T(4I
�jX!t��x�@.D�$��B�
�����o�o&%#�E��JY��~K.E�B/���r���P`���d��T��F=�P����L�`�5R�#���-3�H�,0�['��� ���������QT�9)!\w}�
���eaH��:�f�q+�v�
wf@j�[��+R�0&H���`1��G���F0���%IF�%��tRy`���������n��a("��HYZ��n�����y��,������%h�)R��������*P�
��`�${0���u����}e�;�>�7PX�J'D��	N�,8r�9���|QX��E'�`���XB'K;Rx�z�����j~)?��a�v0�<��~��Xw���+�fde�V��s�=J4-���#5>��:��ipU
���������W[]��Z�����%����j�Ky�]���Bml�C7������@�c�4��yDs[��v�@��}�U�|E@IC�c��4c,�������=B�OW�����q	Ht&x��G�i�"��4�sy�/'Zs����@��N�R��e�����/��S�>����D���b	E$y&��,1xt]�D��B��h���p�K�F������L���)��gR9�L�V
�N������H�$1�[�����O��r��S	�
�g�,��
O
��
Et2��g�����b ���K8����vS�����Y*
3�����+x��+1���U�R�8���������CDR)1�f8�������������V�q#�45Q^�<�����K��a���`��j�_��Z�l��\��F�%_�#��m��{
��c��4����-���		�����^P�/��6y��~�$�Y����!�N���D �5�&��������*f�y�������5,�Z�
���SW&x�)�F�B���Pq��9��d�0����57�S�v���y���\��/�~��6��F$f��%���u����	CM�F8~k'��9[��H��_��O�$ �N^3��&����6A3�i?���,��I�z���U�D�,1x!-51tB���"*������ iyF���",���;�,���v[���m������N���#�w=����DtCz��X��3>
�=�k��x����p`������."�c�g�.�w�U�����X��;��/q��S�w�1���NlG%�S��
�s��Q�-����w�gy$�^X���C�8M�9�D�U�*\�a,�k��2���z2�c���T�	{I%b^�/��s�r�t���@=����H���Q��_/�E�N?]�^����2�wf�^h\�"�M����~k=(C���.��_L���t_�����/���������3[�����[w������>A
���g�Q�65�~��tt�3�dR������}R}�Du�#xr)����=��P9���~��i� 2E�O��\�&���gR��Y�C�y){�]�J�s��f}��6��l��'M�u���Bbl��J�N�h����2>��PL`��>�I���K���A`I��H�6�f�M���4�|*���`�c�s
�R�&m�S��P�7�
)���������1_)/����'��8��T�
P�KRLa`Bf��&�%20��B�pU�K�����W������|:����J�o���d�R������H�OCrB:lk�|����B*	�`������E�6B���L���g��T���s���f��h���!��<^�S�x{o,�ZQ_��
��_�nr������������7�x��n���}m�tO�����wz/����1Q���F�����%��CX�=���d��uJ���Kg�V3�~�>�� G�S�a���R��r��(?pV�`��JTkJ�Do���t�0�����H��Pm�z���}����o^����f�b(��#)!�+%��u4^�T�+�V��(:�q��B���;�l����w�!�|�C3[�<���o���MHJ��e�`h^q�?�J����.�cN�3:��./�y���-�E��S�Y������pz���Z6�<��/�,�)��?S	�g�����r�mz7�xjo[I��~�=�6�F*�_�.?� IDAT�0���t�p�o�Pi�<5
���������\�m��su�wB2��d������Dz��l��S�#��9s������LP��&{���-^
�"�%�y�����B�tc���UjU�L��s����e�F��2]�O]BU:���Fd�\i�Y��X�u�0{�:��<��a*
�$������I�q��+������A��qr�������,�0�a	�L���9�����s���^�X����SP^(�B����mV
�����vm��mQ��W��#�f�t�*���O����M^�Ba���WTxA���b�L��(�-{�$����D�_��qQ����)05��k�Ia0������*�~1������'�������!DXY
'GR� ��R ��G1!;LQ�>��_TxA��~�<�C1H�_u:��NT2%����f��������*�>�RW~��(�e�'/xAV���7'� N�����#�2����E{E��\�i�+?xA�mIZ_n���u�U>?xAVm�SoA��8u�2���(����
[���_x�gW^}�� ������*��#�L)L��SNxA��s���Ge�!��X�����U����_�q�+Jer����/�m�b/�������M���>;�.��<}����9h��CWGzv�������P���w����,q�@]:�J����r��Z��ey],1��)&�z�\��5���#�H�L��^��G�aE�:K�%-��U���x�(�z�n_xA��)n�{�xd;_$�]����my�?��������/i��*/�xxAV)�^^(�FE%�4��8a>w���'>hcFLPi'i�U�}��������e��iY2�i�T�<�����^Q|�
�J����&����cT*��H�~�l�q�����x���&�y_�� ��I�
o?���nC�L��fwu(�����/H��� }��F^(���*Q,���G�I���a^�����J��W���HjA���#[�JZ{q�������QV���/��#��^Ay���R��������}��k�&���]���� �_9U�������u/���5xA2k}��� }[���iak���Z,��� =[
5	�a�����m�	���|��v�?�ZP��������.�f���������Yy���+�����H��x����WhM�r��/��/�_9U�������u/���xA2����/H��� }��F^(����/����P�`�f^�����J��W���HjA���#[�JZ{q�������QV���/��#��^^(>�F�}- �����Bk����x��~^����������{^���(���OV�xA�������5
�Ba-�w~^��-���0�/D$� $.I�>��A#-E�:�n0�����SS�������'������~	���=-P����������iK��|@Z:��,dRWVAzJ
b�Y2�����H��388����J�?���y<�a�P _gO?�xr��x~��w�PWW���r��d�=��'M��������@��|�i����D��^���J�YB����1�����!]���2�����JV�����yUy�e{F*l;�#ll,oFCCC*����#-6\*u�U���
��Tr�Z���t ���HNK����G[S�E����G�0R1�&E�`a�#J���_�����L�{jPZ�(�}�G�����L����w��}<�MQ��w	L(���I����U��O��"�s�������T%=a�"����<����K��}
���:����i�X�:�5����S�C����c���J}�~)r���~Q��3�G.��(����,����m�3�\
�Uq���S�����~��j]�OA�������c{�w��x��g2�%�G����@q�o!!!����*N�!	�)�^�#��{Z�8����(n:mm��iB��%�Gf��J���bF�U"�Gf���������!�G�)!�
����W.�Gb�]�/�m:�`q��/����f�l�+i��$��l����}%�����8m�1�
��t�������W���HjA��/N�{�J�xd7W�Q��iXQvu���m%�Y������-/�G����v�?�ZP������J��Ik�#�e[^��l�+i�?������I=.�/�x���v����������L�\ES��0�b�/			PS���Oa��E^a<������#=[��&�?���������R��%	�)���#��{Z�8�7�\�BF�2�x���P����f������i�����_x)EE��,����Q���-�?�����|+N��l���WB���Sx�}������nKP^�q�Z.��d���v2Y�l���������-/�G����v�����my�?����������-_��#����\��v�?�ZP��������^��S�N&3�
��tv������W���HjA����N&�ba<�X������l/J��D��l���l�*�Z, ��u��Y)[�JZ��I-(���dk_Ik/n�)N�{���x$���-/�G����v�?�ZPv������0��i�,�GV�]�dg[Ik6+%��l����}%�]����m���a�R�sE���HjA���#[�JZ���^���B�bk�����Ox��^�1k�)��Gr���W����
~��KA�,n�{�x
����^����A��)�B?�{a�2��OoG�R��yDNY
q�-�v�N|2���D.����\�(g�#]��kZ*�R�T�$*)��F�y��x����4i����_E���AYNI��bbbxh9%%����3T����HOO���6��_��:5TRi���q������UA��������d�4<��-�V?j<���HO�����O���/��f
��D{vc!=XRUU��"����{��������?	q���/���+�x���������@s��2��������h��M9}��G��K	������Z�����Q@O�&�U�-�B6'&&BSSS��^Q�����Q����`�g?DOA�VW��Y:|d���
�����}a���}���T�����x<�R�w3U�n*��\�XC(N�q��?�xxA��E��+Z 7xa��cX{}�����3D���.o?i���S�\
��YY��~���~��j]�OA���7��B�|�3��I��%e]K�69RP�<����nb�

�n���0I���F	1��8#����6n�����na����d���� ��>�:#�B��Z!��R�������B���f��M�Q4 ��-^;�L���w�_'�%������[G��P��q���.�Z�~u�w#4!��wTF=L�j���?��O\3�q���QI��i�^�g�)�6dQy�Z+��+���R�-yWLz�@*u�JZ�F���E�k?�O����x?R+���({����X5��������2Q-�����+G�W�U�H���Q�)�8x��v�����6��*���i����P��i<� �G�<��xA�n/n�{�xd;_$�]����my�?������B�xA��$�����.���-{)^���?C
��}�$������&��Z�x����O^��xA6v�j��yI����/Ho~IRS���]�  (m�7�65e>�,�ee%���	�����C���>y������\,�n�s�	�������=`���N�g���4�o-e��M�Q������#�C^^�����������zw�?B�_�� [?������������-/�G�������^����`��II�(���pD������h�2Zx6��D��,\}q%<���z;�po�T�i��o�0�^�})f�+�Yo�D��Ux��=,��m4����C�R�,+�6� o��z�w�U�nKSy�T[�U4�Gh�Uq�E6�?+����jt�3+N���=��G,cHT ��c��)T��2x�@�u*w����������{u�6b��l�q�~��	��w��G�[���;��Y�~����
/���������R>�_��4�V^P6��am5���EMx�-|�8��&�0�~]l~�+�����g���7e���0��>N��D�v:��/�P��N��4��q�^l��e]��5I���\D�	 xa��s\�	f������j���|�
���^�r��,M�#
34.�����T���������Sq�����S/kU�'���#��"�+Mx��N}���)�o����[?���23=�/.TQ3KKy�LK���=,:*�8����]�3�4�}8������q�)8�g�����i*/�����:b��Sh[��������6����-����1b��B��S�N������;
U.���P^��S�c5zJ���<�>*\8�
�T�*�9F�����N��WJ���i���h:a]84i��&%����=�AM[OO�w��B�S]���~���JX#:!
m+�n�T��r���b/��'`��#�@����K0jP8:������)e���m�5�$������9 ��~�8w������������Q���W���'��I=�����;(a��U*b����8z��*�5, ���sq���#��"i��$��l����}%�]�2,�+�U8���WHK�{��m���~��q��I��W��t�_I�������������\z$�,�Y�x6��7�Z�6�����vHvB���I��zV1������S���79%	;������0���_^hRc>�<E	�RbA��������0K�{���8��wb���J^P�@pTE-D�������1	�1i?
��� ��
�c������}���J*���
^���%������u��u���[	x��]o�
zS-�_^PVT����0��N0�����+W�sZ����.���S�A�v�����^HJI��;{1��`0����Um��z�j8�|���5�j��#	��
bA���6tp�D�aZi�5������[������
/�z~�*�?�W�������/�t���#R�����`���x�����x�����X�q����`�;z��f5�hkaP��8r�2�C����N A�,�t&���dnC�4�M��z��u;xy����I����]��)/�v<�������Nu1dW^x�����y�<p�=��QY�D��B�,�/8YW��F}� ������7��&{9Ct;���mw�IC'���q����	G�ICPfH��*&MASI��,�B?�{�??���.�� �����x!c>e���������1@d�?�n��5��u-���H���}]��������jZ.�	Z;"f��;5�[�6�J�DC�����0�g����"�N0�F��y������J(7�/����2�5#UX�1Ezz:�|��w5�f�G�G,�Ns�Ysc��)��R9G��6��C��p���s~���=o#�e$�oq��of0m\��}��B��8�����6
vx ���S`�GYx�F�BdPw[
�����4���� ��������	a���.���
s�@��!�$eRS����_��1#(RY��Y��c�e�����&������`}W�RB��0x���5�m����$�Z�>�5��Pv�
���f�"^���.k4?��2FPk]��?�����5�!R���14����N��D��W���C� f��B�d�������%=G�a�}O��%ci{:m�%�?br�@��Tv>�P���U9�u�=��3BK��KJEbJ^uCIF�����?����hU���@����������
J�)/��~�����������{7��������ah��K�nE2m>��N�[J�'�"��.??�W^O��#ZM��{;�:B#�6�O����=����w�Q0�3�3���O�C���0��(���_�7���r�8~'|B<H�P�[�BBr<v����������=�
����1���p�x��n 5-��CmQ���VyAK�}����)���Kx����n@`�^��-f�zB�q��&��A��a��)`�S��HH�!�'b���0���o
����&n<����w�T�=*�iB�A'n,����"�P��>��g�94'���Wn��>{�Om��������>�@E�NvS��.G����m#�LO���e<�\`bX��o���hW�w�,��>��C����������g��>�1�k���1T����G�����Uz���=�x���~6�����r��>;������6�������b����Oi�<������������$-�D�m����
>P��	�z���x!�s"G["�D R�Pr{$�����B7�"�5C-�RZ
T���[5��C�<��{"
+?�E-y��������Hy(	�#t��
�����	EMy����(�`5@�����'��Cu�w)�~���7
�0o�	yU9��C���pR���
@����AR����Ky�[�
�e�a�������5`���3��CCI	
���}p�����z�J��R	�?�cG��x+=]l!%��@�^
�
���O��kt��QRn�Zd��=���3�8�sK����������+m�h2�R{�#�����6��K�0|�������=�h-1=:�B�l�����W�Q��:*UP�m?���\y!"2�v�8x,��h�@O�����{(�:�BEE�tZ��z�y����,���{+5���.�����pF�N����"��B5�K��Ooy�F�k	]��x����������agl��`���`V
;����@�|�1�eW�%'a5�,��/A�}�\yaX��X~�4�n��<?���+����m�������X������]�����
J����`ww����k����k����](*�(�� ! �-������+�����G��w���3o�w>�=�����L�v��k�F�qLA�:6�P{ ����O�!>-��.GXb 6������������[��c`��Yp4j����>�����X�OTU3B���@QF�^���P8�1v�M��|���hM�S^hd�
A��q?�:���
2t=�'_��\�MI����)6z.����?�2�P�S��7�JDy�#46���5m�Ln�U5+�������X���.����x��V](�����^P�����q��s�����-:���>�O���;�K?n��}(V_>����_������S9�CX��t���qo"��_�Qx
e������D�;�����n������y>@�,k�Aq����-Lo�s?
����������1��5��Q��j��@��^u���:F������=}��A�)O����Z�{.���|���W��}��D���>�;�e-��|��}��u'�/��]S����.CV#*�Jd������HE�ns����� /x\\K�N0�jN�����-�2[A�G���Ap�����CIM��	�h[�	���;�b�J���w�f��o��\+�px������z��Z�9��<$�;t>�cj��t���&,�������e����%���Oa��}8;��b����BvL����w��m��,�����k��5}���x��t������5���++<��e����cw��iE�'i����T��������|>m�4���wT������L�����(�e�'���N�/H� �M:z��BLT���G�����(���������C���AV���H�Hc����48���=G
�to��� ;���<_�|>U�e9��@�?�5�q�d�Q���4���#�0T��Y�TY������uV�g�
47���A
W^�aN��t���w��~�^0�������$�k[�Frl$z.����78�lZO�Q}�
|������c�:[8�]:���;2R����S�N)L�)/0_-�L���>6�v���]��K��A_+����a3�]%�g��qe
�s��t�|^�U1������'_���S��U�O"8!�H����ai����x�?���h�������>Oq�m���
���=�q�] IDAT��{����~
�ACI�O�=M�q��u�s~��o����K.��������
��^�����7����]w6�y����ao���W#>5����5����E�"����L����6�\;u$Ao3�lY��V�!E�-���~Q��3�G$xa��m\ya��������9�1-�4���?+7��������i8�Z�1)&h����YC�*/�8���p�g�U��`���������@����g�u���'�_�i5�27��'�HHL����|/|��wcD�ntP��9�a��K)(�0�gG�� �y@x��V#�$�|��QE]���������pg�L��!%�=�C��#�e����Ja<e{�	���#= �9��^PR������fVw�4���')UY�����(��,����1>$GCQ�N��+ix��T�?�	T�)#5<
ZVP�S�������^�~�t,F�����0��G�"i����^P��:���dW}����B���7���`���*r�`@*�5�T���s%4������P��A��n�
5��#��x,����_�q��cHy�
��u8��Jn�����w���86����w�l�s6��D���0��a����^�K��+^q@!�������*���&("�d#��;��H�S��
p��]T����K�/�]�>�C��D(TR@4���d)^P�RY���z)
EdG's`!q�
�75��4�/<�B��5��tT �`��S9 ��� xaT#c�O���d���!,!�X�z����p0���H���6�	��-l���VV���!���)�<	EEe9z��������hX��~9�3eT����"u;?xA]Y['MB���F���q��=�=�,�q��������[���	�w`�Hm/�?0��p�
�q�p��A40w��~]RV�9=�C`�k�D�E�Z-���2�r%y���fv_���h����1�??��u;`��EhW����@���r#ha#���qx�Cv���Z����x����CA�o��~�b�(�����IS�0r��+am��7!I�`.���6=�N/���8���&���Jh����g=�rxAK�*�
z��7���������Un
�rE,����k���)��_�&tuL���D��lMa���uzo���#1����7��
�j�xtN�����\�h0�qA^`���/CZz�������B[�����;���q�
��jUe-D���x�����S����^�6r�`/OY��d��U�o�9��&l=>�����a�����u������f.��B@H�(!����)Ui��k��q>Pm����10\_����#�_���/ o�D@��G��\����������/ �#��#�>���u,UfUG��Ph
�C��`|���`C�:��
��k�A��BO'A��<��3a�So����\:NJ>����wY���t-{��K���a:vC<�^���	L���z�^�U�f5�jE,=�@QW1�E_\(^X��=f^�L�"����n\�{��a����=F?3��0����W�ia�1V�����Ll���O����F���j,�q��f;7���OH������Z
03���s����?������������4R�~za��w��x����5�}o,4i��WW
����g`����hI��K�g�����"1y,-������,��%@�#�-��o�
ui�rU��BG�^�L�m]%'����m0�	���C�O-��"��J*m��#[0�R8���-Pz|�5,QW�cm��nC�:2oc"��������"������`D%'r��7�N8��1:Z��?����]c<yEY9�[�C�k�c�������Q�-h�B�o���C8�������ph�_2u�a|!�8� x�W�1���Fp�4uh�'��������]��������z,���B)��Z���M^�V����P�<}���6���|�k
��0��p�n���^��V�K����&v<\�&��q�������|��6s\7b��������*����p��
��-D��>)�D��������Q]�
��b1�i�yz��_aI�aX~�"�1����;J�����#HJK����'�� �5���>��E�z����
��c06^;��&�H�E��;Lk����Cm2�,�k������D%%`Y���}dt���W`V�^�x,�� ?xaL�zx�>���J�|�����6��3�����08����=�����	6���W�|��T���s%�[����C�	h�/��r�a
�8��uZ ��!Z����G@G�������?8��Y��^��n]X��������M#�����$@��|ob�����'���������^-�Y�����������an��t����B��^����V5��K�0��'TTR�vZ<��+����
���B��.t��e������Oz_G+�F�D�����$R�������#�:B����p��Q��u�u�q%c/L�5�/B|�M0��a�1f��i�aQ��oe������M����k�h��-N�8�w���%,�,��,��!k��3�.&���	['b&��*���Rt������oTM���`A`\p`�tP��]����D]6�?M�KU\���2���o���8��N���7�I�@
��@���������
����1�B�:�	��u�*����$���(]!�h�4�X>��{_�����5l�W����������3286QF,=o0x�u5\��H������O����a3���"�S�����`���/���������W��e�,\��4t
a���;�pxA��>n�[�6�������)r�/�+�c��6����3��~��[�[t���9�0w�
tr4���h�E�NA���=;:�����@��o`G��qz%�	v�/l���_:N����	�[�����3�h����;<6��J-U�g��(T"��s���s�N���"�Y�a����[�'�qh�w�A���������K)}D'�\C����9���}�h�g��c��d\��c��t���@.J�^�@��oi�g����=�E�D���S���cg.0`�K�oc��>X������;c<��������ro={����#)9��s�n�����{�qU��&�7r�<!���l�}4���]����`��~�^�v;'�}�
��>x�(���ESn���`�������3u��EX��?�Q�-e
LtYy,����������
K3X������X��^�|y#���?�����#!>B|~���|�����u��������O����+��������8D����$���8��
�gK^`P����H
J��U�W�K}�h�=��}D��v%�-��)�����dI� `P��>S7`j
	o��v�	�Oh�R.��L��B�����
R����
������$�g��#sv��b>��/���d���<WvP���b���P�Ay�I��������|�;�!�xBZQ��Y���-J=���
L#����HRm��'�rv<�/���b�	�q�m^)/}k�s�c�[L;�hL,��^�*_�r�r��|@;o^�~M�y?�@��u�0x���<�:X�����-?��� i��[!�u2}��uK�u-d<���v7�V,^�P������Q������i\
s������K���Om���_���`/�)����0�o��zOC:F��!C�7]y�����c��-X�����m��C7''��o���9s���?�di	�5����b�� x���W8u*k��s��sc-�.��.��Y~r~��$����4��������r�Fd�
����cF�����#_s����0'������a����$}n��v�u�@��J��	�2�1A��E_q�
�5�*��|o_���l
W!`�o(=��@��������x���LA���^�i����
Wz)���i�%�
Fv]��>��g�:4��W��8���qL
l�H/��U*a��i�e%�����&Mt�@��0����	g���K��s���6�����~�yyY%��W��D5�ceu���Q���-�b�L�!^P�]R��l�h���c������ H#�vH1e���v.5!B�-�U����9PR���*�ZPk����1H8��
�]���!d�'�BEk��HC���k��F�Fx�������c5�U�|
�����
*M4�����XH����Y�����hGi�_IA-6�w�������n�j�?��g����H
�����ce�R]��	�������y�`2B~k�w�m� x��	l��-a�cC�x�K�A�n������Y��I'7j��n���������K��qt,Sr0%�s��`��^����v��9���@�ha��!tn����c`A0���p��'�S��iw*�r�5���&��t�l�m��A�E,Z�Q�3o��O���[�cu��K�nRs03��v��D�So�J�*��BTL����k7��b����
�i�kI��"B���-��kqX`���\u��.f���%�>��M���*�����#wyn��K��S{��� }�I��p��0�RK���F=#���c}����s��d����{jW1 5�0������Z,�R�>\���`~\qJA�����Y����
����C�m�a��,t���'�~?�)05� ���"����.���*�	���OJ2|���{aJ�%����<���
A	L����It�=���i��@�T&9��?.
������"��0b���V���Y"�B����������T~o�3/��S0|�J�� �(t2�co�<�����i#�����;8���>�]�Z�U;^������@UA#����0l6�))�����Xxr?�����{6bJ�.\�������
�p��g8l 8���m��Y��0��-O����MY	H�����	�9�����p�.����s����{��(]CA�B�g6p]+x^������T�f���fC����6�����A�^p�0
'vN��YC:�w�n�S����S�!��uE���������A��"Im��9�VT���X{�@^*��'��Z�������Fj
�n��4�����i#��\������cR\y����D44�����D�oa�{�z,�I�x���x@���?�v�G�ZM`oZK������>j���6R^`����1r�(4!���F}���:M����p4wD�?[b����4Gu���m0H���&���������a~�$B��+[q��U���*
^`����2t	��K������;LY���
���@�������������3M�UL
Aq����1�r�
z�������������c��pm��(RZP`��pj�����9�P���pz��#�M84TBbb6^���v��6���/(��d�A��Q 8a=�H����8���8p*��<��q�3+L����2�/8��H����[�d�T?�D��O�����vl+{�=Bp����8����wA����Q-}���b��O�Q�_�����u]QK��H�+"[�O��S9�����s��n���Xly��I
������
�/^`�{=���D����e��0��������A]���~�z��F�Q�@n/$�%���<����%*�}��~�Hy��s�h���������E_��5����6����CN���Jn���x�x��;x��u���abX����~II)�� ������(eC=�$����<P���{��������P!������/�G���)������$�����x��0�o��T��v8���|:�����������W8�����m[����Y��X-<��P�/����W����1$9��wg�aG����+o���x����#��Gz@�r��9���]��v�"pa�����h�����/A���B���:����%
/��7��]��=�����t�R��A�����-�G������C��������p��)�WO e�c��������z�Q��?AM���8����=IuA�U�XYR?�R���M;t��V]Z���i�9��*/��	eC%�
�N>yK�-h��@�C�!)0���c%�r��Y��4�n�>�X�x4%u�}������hC�7|�6���x3Z���W�K6�}a��|�j#����d�+#��o� ��vP�g"��[(����S���)#��XJ�;1$��}
�T��Bg+]��&	ORJ�m���@�i��2��o�b�n]�tBiGg69�j���XG��Iy�zE%��T �!F��g~��.�X�3e�|����j�L�������nE+;;�
���0��*^8�� ����>�
0�b���9�`\��$�������������o���������:��;��\�����;�HzzQ�T����zfM������H�n���� ��0��J�(�I��LBT�R\x�D�������Q]�`���y��S^����i���`\#` � b`+_+/���B3�~��h2	�h�h$W=�LP�2�
X
���H*�J����:Q�
-#�M��K��RP����K?��dS\�������m�������x���������
�s��V
Iy��o\UBSUA�����.�����q��O��������L���~���!	|�
���W9}��4B�&����T��p���/�T����`����Z��U�1�@+Iya��Q�*R��!fo>D�@��+/h�4@��h��G�,���}a�P����"����w�����������Oj
���A��(U���
UeP�IA�^Gi�H��Z���`���lV"u�����&�B�%����Sr�#?�Z
�z���>�g������^�*�^EG��BR^8I��tT����������F:�������u�
W^���K,x��,�C�t���<UD.�P�_���K�P��,���Qe\��H�@�7��,d�/Y�w�dR^��WF`
)/,%����E�!(M��T��������S�s���V��SO|/�8C�4*sWZ b�-)x� -N��m����P�R@<	��B
]�%E�U]�"�-t��!�K^7#eV�P^�s�)u��wn�\y���#-P��S^��~�$����:�hT��	1\��+<�G��z���I�<%/����y��Q]��l�s�����]i�5����E�~��^���O�����%�ZX������N%��3s�Hy��p�����*�3��^@�:���c&���QZ�T����<�M�n���0�b�	����E��g�QOG|Lp���_����������%�J��� 44��/,e��#��z�o�pZ�b
A���H����+�����3A���V����V)��8���5m�����o�A`��v�1b�*,�5+����(�d���Z��B���`�:U*���Y��\x�K���� �T^������<�f<e+_+/z���V�9��N'�{k���������n������y@S^�k��������
�	cy�V�V^�#uf������x;�wC�������\�AM�*�D-��\�s�%)��kE5:�|�����6r�-E5���I�^��hfj���Oya��X��7R2���J^`0B*������;�RB.�PS�&���i��������i?����IM�k�eyR$���^�J
g�j~k�"������T�)5�*I�W�
5���T'���V��#O�	�	�(N)
^00��W�8O�]���8J\.�`������I4V�'��:u�I��7�18�}��'����Wc���8L��Iya�j��Sj���KW��#�����Q��O�{�4����)����S	�/L���og?j}�EWu��w��,��,`T��G6��v"#5�.F���yx#:�X�SFp|��p|��*��uTV� IDATU4U`mR��c��������m��s���G��w^��m5���" �hP� x���	���DxR���`rJ
^�S��z�����`�z����Xj���xN`t�ny���g'����E# ���X~�/�2�����Xu�i�]����U���������>;�_(��77�O�3�I�O��5����L�MRQ� ����()d�^���?���YY0f���	
��r0`��e�3m4�
�rxa��D��������S����^��~��
I�`7fO�������x���BQ������
�M���F~�RXDpSi`�+��}��}�L�de����9iD��+�����(�BSzh�������q)	�h�F���<O<��q�����GaN����q�7���g]D��_*8�B��v�br���!>?��m�	�B���^��/��.��JHOK����xsV�����!��	���i����=>���"��
���������K^`)��������V��QK��P`iQr���R/�����Uq��:t����i�|?������XZ�dR�P��
L�����\	R2Rx��2�3)%�%>�@fb�����:����Bo�g��3��������G�{$W�`���j��U��4�Zr�B��<**7��>�rx����������BV�<&��:������aPS�����is;�i�^�

V�r_U��M���������w�+_���.2�������-�um+^���3��+����L��*P
�B�����Xd<
�\=���y�$M��|}J����I���7D��{�����fA�B#Mt#���}Ch�pZ��T�:��\�����o���zE����������9�tS	r���k�Y�*��2�d�e1�� �����_y���$+�I���h7h(;`��o���Yzs�x�P���G2�!��iO��V��O����� ����7�G�&�!e�:u���EL���_�����{�&��B/���N��{{��w��x��6�����~���������N�^E#�R��������)V����g;g��������Sm����aK1��l,9>�)u�������&A
h^�#-�+���2W�PUP��W�x�T���Kq���-��k����x��b������2�]P!��z}V��8�
�����u�AL]���hT������H��h��>�[�c���_��U����c�����������:�C��K��e����*
����;yj
- �>?�������T��i�#0�A&���?0U�vNcyJ�lzW��%����e�A���xZ���F�o�?�����[O������n�V���'S�`���]��������o��NcK��1W�mG��em'��>����=�f���R|���kQ�~-�<��j�G����hU��!E���z���s�XQk�
'M��+���oQq�����2���5��
9cE�"�u
��]���\� vO��*�����c�z�N���#jm0T[j#;!��IH}�������R0������2K����WW��.1�8�����^K�S�i/T���D����]t�!�mGE������^K
Z��aEy�i�{��$R���SO�Y�X�i+����t�V�� xa �.��\�v�W�?�71��&^hkn�&�F\�f������M�����:�����$��I����5�t��,��g�/��2��r����i]�\M��RnH�������*������~My��K�\x���Ny�U	4�@�O��RJ	�����0��A})�xl�3���cJ��4��^2�eHq�`
%�!ioi��:��Y�oJ1|`E����m���"�SJ9�6-�����n�>����E��w���=�xu�U�m��$;�Q�����Ul�Y��.�������}�>�C���).���{�p��1<�}����1N��B��&�yV&�
cJ�H9��5p�)s��������6�`\��fP��l����w���<}������5�j�/������^G+J/B��R^8��!�?�p/��I�z�{^�O���WA�uu��Y�|q�g7A�y�����P
	v=�
Cn�V����vn��.|,r��9���p1��w�\���	M����~~]��p9Z[���7��T��{��0J;�����D�J�kx���6����w**U�{�iJaE*c��)�D0���������s��:H�
�F������h>Jc�aJ���m�`�o�����Z-��wh���
��G��9��dhLU44q����{`����}:�|�~��5�RMH�_�a��380�7�\�����SU����(-EBj
������o����tK�H��[a���qm�q��f�����P=�j���5"��
���='M�tLQ�UT4�5N����('�.���W��)9,�v-)�D�Z�4'�����|K��������cJ�H�i*��-HyA]Kn]f������������3��J�	��wc;�[8���
�^h����������{~����6�QA���Lq��M[��lN;�ep��_n�m�����J�5m����9HO����(^���]+��b�������L���;�yN�u����`l�^tN���^�"e���Xz����V.������:/�Q�v��\p�R`0eu\���������q/Ly���,���_Ko���
7�����>8h�I���c�\L)#�r�^X;b
���c7�����"����,�D�%=��B+����.��{���6jR���Nb��-���fv�Iu������K��m���4����`r�I������,
^`��-������C @.���X��2�ok�-�����M����p�Qeb��)�����1��
�>b*
J�\t�@�:�df!��[�&�*)(0��.t��������M�
����%�GJ����������5K#��8g�"�x�`�-�c=n$�U{5��T������oNv� ?x����u&%u���k�. ^PT�@kJ!����=����a��%<�����Nm���I����a�nR��a���������$��e���d��q� g��d)uN&fl��}3:sx��Y}C[M��D6~�v
][ 61M������t�����vA�BU������o�(�5�Pj�\x�)��:��Am��,�lZc��-��� ���6
aY�*����9�u���X����K�WS�fR���g�/��������g���;���.���U^`�
��-�c�N���WoD����;��0x���;�?��r������2.z���B���j.�����:?e1�y*�R�<5�m��~����Z�����7��5�P�JM���H:���O�+�O��/��������+�L���������������E�����s�4T��(��*����'���,m���w��[������7$�ACC
�`2r`�|��� �[���b���zx�^8|�"<<�=^�=Tuh�g/���+�CI����`miQ"��O�/w��E����<T�����Ja<�?�
��!>?�������F������������_^�o��>O�_�Mv�S�Q�����_��/m��vK������j�(;�E�+��J!�>/H��i�����������iG^��81�9��_�C���-�9��-,m���p�i#��-����nWT��������+
^���VX����x�WA�By~�BYcA�BY�_A�(^(+�.^(+}�E�������/���
JQ�})^(�v
���]� �mI��^(�=^�\4�%� 9w	��M��d�",�J���Z�#�%[_��d�+���^��� ��Q��x���/���^�JonJ�����6�N)-�����3���FY,��c�"�?����&��z�|'��O^�LxA2~��
�B�EI����/�����/��=����2�^�l ����0��q������/�G����/�xP���IB�������}^���o���_V^�{?�^������oQ[�Q=U�������/H&� ��Vx���$���R�Jn~�cI����PW�@��/H6�b�d�+�u!>�zP����H���Z/o����!���B����/|��x����y-^��?�^��Q���oQ[�Q=U�������/H&� ��Vx���$���R�Jn~�cI����PW�@��/H6�mqO�d��������A���#Y��k]�r<(���$�~ix@������}~���/������/��(	�������	����*_�	�B��S�$^��_��PrQ��o})�%7���$��xO�+x��x ?x����3]\����XY��J�{!>����Z�S��J���^(��TT�B|��P�~/��t�_T��)>QQQPQQ���BQ��)��S��$�G����@y�o			�ujjj?��kK��\["�����%fD���\+������9C��SB���H��b�#���@��T���PQ�@9��/H6��mqO�d��������A���#Y��k�<-�1_�wFH����W\�B|��������=�%a<��+%aY�OIxQr6��H���Z+���d������.�G\J�~y���X)��"�u!>�zP����H���Z���S���W� n�����O|amaT������iIMM�2����Lvv6�������=��\a<e.$_tH������6�"""���
))��F��%�Gb�-�B|J��3"�Gb��pll,��� ///���`@OY�B�}�#��Gz�<����$�:��S�0��E!>B|~���|+O�����#����%���>��5���Ho����Pz�Z.�(�����HOO/?t���r�����L�{�xD�Si%���</Z�B|D�Si��m+T�PZ](�v����;K���wi��S��,Qc��1deeK�ni�SZ��]!>������SZ�/�]������GO�1/�#������n[�O�>*�#���w�Ca<�5�DkW��h~*�������^(=�-�q�Ex�g�u)*��L|Q*��������j]�OQ*���[|����OE�.��(���B|J��E�^��#�����^�O������������<��<���Y!��t���Z�S��J�{!>����Z/O���8�����&��l�F�O��G�J��B�e�� �����=a<��/�Z�#�%[_��d�+������|!�G�!��B|$�_q������_������Hn���e!>%�E���#9��kYX�����/�G����q=(���)>�b�d��������A���#Y��k�g��/�m�~��@~�BL�#D�y�!j5��AQ��V6���~���L��-,V����^�O��������������GX���Oo"��A����\_�^�oR�����EZ�LSYD��Y�RRR�O�rz1;S�x����t���V���
������U��ZE�'��S�+*d����,�xJ�315+c����2��&=�RFHKK�������zR�v3(������c?r<�5]�AJ����x�<��������%9��HT���J���eq<�
��T�IP+r�en<Y�H�)�������?�������T��0Y����-������������,��\�TC�T��4_�u���T�c��x[�6�!����8?��IS�Db��D�U�M���xT�RS��7�T���@jZ�����,���K�a<?�L)^{e5>Uj���S�CG���+6xa<��%VA�J��������������x��C�1��sI�"���z�Xx|y�X���=a<"O�R9P�O��]�F�����R9P�r���w��,��h_�}���qFk�Q�P��*t&��G#|�������v���5�{
��c���l$���v��������K�1R����B�������&!��7\B-�9k�������6M�����cm�T4�P���1�Rv{��n������<�4���f7}J�i����Gu�I
����0�Q�#����-�������'��%rLR
)��R"�����
*Y��G�K��6"���M	m�i=`V�
mz.,v�����0�bO�� �%�J�Py��/H6��b�d�+�u!>�zP����H���Z/o����!���B��< ��[�B����]Z�����|��+�%����&�%�M@�J��EY���<���/��'^m�G	(���(
�B���"���O_ <"
m���^���'V.�AM�x��O�_�G������ ��_�k{������H�'�I�=�'*ji�������j�������!G2��$&�`���\F��G
��T$$&a���`�
�x�(�� ��Q����Hv��k]����l}!>�����x!��%
/sZ��7g���P^�yr����]���������
c��^nC��O�	����ph1���(+xA�H|��y�p37l|u������u5�	���dX�X�r>x�ighK��/Nc������e����9����3l����Kn�$���wCJB,�����={��X>��6Lj_�:��{�&�^;�1���=~[��������B�����2G\jT����������7��8�����>�8���T��`��b_�C^C>{��c�z[����;��L��������H^H=s���H�w	�C�w�d�'!��}(us.�8
;���V�o��n�qv	�t�Wb���PI�!q�c���E�L���w�%��0�yk��r�;�������o����2�R���R��HZ��X}�kl)e����X����T�����2�4���7k\���s��p�c:t^���$���<(/���o���Zc������JN�
�N��=3�k(����][�X��W�m���8��z�^I��:���1!������w�/N����k���X���eEy���#R�caZ���=��w�S��?~?v��������y}u-}X7��g����T�C��8���)�N���>T�+��~M���^�!t���.DRB�Xvr+��lZ"�����B��x�{g�����R����1������0zpOX[Y���k�nd�����Dx��3_����Dhx$N_���c��sh�h��U*}��������1}��3��QI[�l,�f�>����*�Ey@����x�����O����H�����#��$]���G�rfLI���k��N\��'�t���BVVn�X���������u�����:]����o�]~L�{���7������_�xA4/����E\0�*�,ux!�CV������E��gG�$� '#�y��a�fO������]����S�v���/������n�T���V����?�XR�����Xp�*�������� S�������wA�^`�i�=���	���*w�BFV&��o�o.�0����^��]rut�v5���jW�������q��dL
!cn�O��^�����z���(6��(������������@���x������%T������e^��s/���� ,d%	/�m3�>���[�^h���?0�;�(ux���`��\<�8w��i����4��9�$g��Q��������o������r�CS(*����=b����������	���� ��	/�&.����F����SR��C����������NCYI�j��������|��H A�<��ekw�)0ddd�p(��ne�������~�J���]ph8�
4�s����a������G{������kX���?v���22����0����a���[W|�
��D��i~������P������}1|��8�������lzap�SQAM�m�8�_
;�0�.����bY������3_������6�x!g�/T@�s�����K��^��[���w$�>\�f���L IDATi��&Y�����!;]l������IG�z���^��*.����Q��=��9w�
�/o[��i�i)x��������h�W��[���s3kW]7:z���"%���5�����>�����,de���`V�*��e�:]���gr�����{z�����8�y�����A
jZ�h�v,��s���z�
�C�Qk�������l:�
�<�%U-d��Z�.���6��
�n���9������!'���W�CC[�����4�_�����-�#:���~2?=v�K�u>��m�����
��tQo�-��+�c�'4��Q��%o����p�����������"�-����q,{�}z.���Vu[������g��Z���2��o�v�����Hm���].�=6&=��O"�|����*V��G{������=���,�3S���Zv���6�������O��HEq���n����X�s���`������p��xD� ���Qf-�2�W^�&���Q~�T�������8R�����;c��Y�|H���x�7��s+,�>�4z�������S^��)Yih^��H��������x�`h���}l
���LUA��2��CEA�m�����}��g��PV���;�84��D���:)1x���(��l	3}
��|��u�an��1�,���C�����P��/��B��Caj���=�x��]���`�~t/=/��/����s��K�����~SH�`&:���J�PTQ����q���j�6��!���c+� �}0�������G�M���G�yZ���g7���v4�|%�mD�������2��sn�N�)+�L���ka��>\y�����<��lL�!��4����It=KG����9)���0��8�V
���x���ms[�}&���Fx];f$�GC[�:��9����J�xp~/��A]��t�����N�3�y�RH���g7N��������l��bp{H��W��CM
������A8��3��q���;�M��C����pt��W�������@rz���0��e��0����Dj��/\Ah|"��8A���0��;S����BRpxE�g^�i����PQN�mQ�����!��u�Hx��[s�q�
o#�/O�����-���S��A��������9�!����nRm�)���?������!��Rl*���g��������T�;U�������M}������Wh��)��$@�\�f=���x�-d�d �.���JTy!��
LU��#����cz&�^t���p�tEu�� dS���"y�IHU�FvT)1�A��2��=DvD,��RP�J�qF�MV�u4 k]�+/(4�G��[P�����!�|�O��l(�n)
U�b�{Pa�G���A�3~����z��#���3R�z~+�
�#F7�}��|��C$g����F�
���}GJ�a�k�mT�?&��i�rC6����6n�HS����������1�@s#�R ��
������T$�~��f��T`��������X����4��M��f'n.�7J����� �.��h$myY-���8)���~KtE����=�����PPDdr��u
[:�������BScH�uc�w�$�cL�F8�����Dl��>��a���
���ix(��7���6�{�I��<>�sdQ�0��
�*P��&�42n?A��WP�m>�E"i�(
�)z��J���A:J}�"����:u0>�����*�V�s�*C������ �������G�J�<���djr����8���D��CE
����S^`����4�����%O��*TQ��)��P��C��|���sx���U-�$+���^��b|�����K7z]�WT �Y����>����E�5�ha�umz����0�gg�����������n�z�b���7�!>.�M�@VV/}��W��x�Z�q%�Pzk�8
����9����!K6\��(�D������`A�TU����_)e�y@q���x��8�&
!�T���K�M���
��B�FP��u�eMd���c�������@��UP%HA�v3~=
:���!0h3�)Nq��=n'�B^@�R5�\X���O�G1V�b�[��:��n
�����"	`I	{�����B����j�dhX4BE�V4vi_UckRThM�~z��A'���c:�1>�ss�+�� C���<��(������]�v�
t�zX���(���qa���w8
�����{���V��]�����`����;##5	Ytm��~4�VG�� ���s[�����"=��X^��+�����uDt�/^�:&�x$��`�����>���+Lj6�m�>x��������w��W��������-����](�����M<��l�����NU����N�i�}.����)'�]�]��������������������4h�i>��m�*t�i�fb�wxe����"G��#)� �����B�B��������t��1��M�Om-��I=4l>�v��rX9t��i}\�~��m{�C�1��1������6
�ZzxJ
R����m;�����CV:Z�\���}��u�H^,eI��E�9h ,�����.�f��uk$%FA�l�=0����<����W�[������i�� �Z����dc`��6����
h�c>��Wl�������:.�������\A�]�O�����g�m�~�Q��1!y6�4�������p�2^tn��,���=Su������U�`�g�c����f�%]x!���i=�g�H�������������[;l�scZX�z+�_�Vn�����a���p���cRL�TW�[���U^������p�g�U��`���|,_��	�n��U�����w��u�V3@-s����2b�xLY!��r�n���
~o�q��y�1}B�"p��5��[���`�'��(�BJ�G�<��a����uLe #�i�����H�J�[!�;������Ox���0�m�RO���B|���H�B������0�e	�]����x��
~m�	K��D%U}/�������XZ�y�!N�����i�|�}p����/��4��� >�-�U���A�X9�j���C��,���������P���b���_8���M��[��e:|�C��p��"X7��Pd	
0�v� K7qr�DRK����r�F]�8��@�+O�FMS,��s[?�(5����8@��^	��]F�E\d0^���z�qx!5)uu�������������&�o�6����-��/[p�U^` ���m0@�=�QVN��~f�%��a-hU�N>��>��R������(�h�TQ��������G��[�I��=���7��������xE��������<��>�����j�����W���p������Fb�GX����0x�N�/����SW�|�
+M#��4��C@�{���D��P]�2��T���G1�N7Dl���]H����>d������X8��������L���C����I�X%��p��J9E��w���� �z�b�F�7�T�
m��s}�5����R�#��qGUe-/�xq
�k�AY���Y
�����f�-����8?3����g����������2ji���:N�~K��X|�)�R3qp���}�41�k���.�55���~�{X}l:��;Xb9�
Qq���
�=���������#��o���P0%�*���%���������4�7����]�������79�����=1j�i���m�"�~�Pj	V�	&`0��U�9����x�A��7-��@�I��~x���w`Ue]��;QP0P�@�nl���;G�c����;P�DPP@���_{��(���������{v��������o!&<}������F���8��i�2����Ab\4mOa�����qW�Y[qf�h�*��c���Q���/��)���at�������
6&6
�2����l����x}�tf^p�1��F���=��s�C��^��X�� ��t�q��?Y�^���\��
=
��Q�������
=k�S�77.��������Q������}�Lr������I
�2����nL`�-mpa0�J��T����5���**���/�(�z��j�;Th[�!$�=�)����������a:F���m��z���T8l�x�\�yB��b���@p�Q&x4����>���&��h���4����h��d{T�X��3%���'t8��F?A�#�pc�#�kVj����~��x�#j�6A�O�d��l�+$����y%��/CAn�\4��B��Z�O�J��PB�@����2�#����h���M���pM�!��D��?(7+�����U�hK�#�TW�v�����	�}��0
��#;��/L����L�o�?J������hY��=SL��[�-�G�'|��@[����`F7�5
��;���������9������j����D�.x���rJT�	v=;�9�Q�D������,-K#j��[!��'�l��1��+������/������
��CkIcD,|��*��Sa����K(�!�e���!��?� B����RJ1��	�!�P]����%+�����u��`��shm\w=?`w��{�,Ieh�}���0�-�J���������c������/��|�T�0��!��hX��]]��E[rz����Qr���V��f�z��u(��u����z!z����R�&���B�g�~�
�I���1��jAudOD������Nv� [� ��=4WLA�_���l�l�l���3,�a�
e!k����	�������ue�m:�����Q
����S,:�����?ag�Q{g��}p%�/�I����]���-�R�p/����]eu��I�8�����>�������C|���(%7x�W���v�Oh��@������~�sD���q��p��3�@���5�j=��Cc���a�95j�6l<����F7��9�������(G hrR,���@�f����66�Rr���M	8�D��-(��Y�+'�����M��:���
w���A*m�L�
��
^�U�@���~�X��s�3����������e:~?�����	���'��u�]��)����c$4J�\���:����!��YT��_�\0�7�!9:e��A��lf�����MH���)���c�T�M���N9|��R}�A�n
��G�n�`6������R���HE���(��������}g#��B}�CU�����l�r\_;�� 9!O.�A�?az=4(eD�^����u]����G����C���Ap�>[������`�f �_��M���B��}M<>��TA��L<����B���(��A�Z<����6��!�Y��i;��pmj���(��>}x������G0��)'qxs_�n�./�S`���'������g�!�w0�|=_ ��{��:�H�s�}��~��7im����w�D�����@q���	6�@}�c���/��������nsp����AxV�}���'���b��l�����i��w
~��u���i�.//�@�
R�`����
�K�t��B%<J��F�2�aT�� X���W3����!�O=���Q��U��),���xp!����W��"���	^��n�@C����z���;�r(��AxY�I��E^^���]^^��kn�}����=��{�n��5�'?{S*���=����nt0�]#h��pa*�.��na^��J��}�����G��2l�?�������)��
�I�`2�k���?'�����~ ��@�����6I��/�����.pU�9S��3c	�X	
����=z>���C
����0e�@����?�)-�R���3�rx������P���6�G�'$�y#�a�������B���D����?���{*��eQ����Y�v|A)�!oZ��^������"r�L��}'�G�OaZ���7^H_=����S�w��g;<���?;���#`�_�z5q����%XE�6�jW���}���*.�L/�(��A/U�*����Iu�)�����<����������HI��L�YF�����y��o�]�B�W�Z����W��r�u3�9�e��a�J�����!(cdF�-���oLc1��b�v�����
�@��k '������c02�]��^����v*Y���:Y���:�Mm���8�����e�����?��1G6����^���A�R*
+�aP��9��(��	^P�]�
�ZA�v�?��L�AIK	oHu��TK|y������dc�^`�qK��K*�MdaTK�+/��-5
�r�!�A��������\
�W���S��L��TXz��������	�1��jT���?��|B<�6�3�Tl�C�Q�%�C����B�Xk9$�������jiW�����v��v�H��)6����?�c���W��r�3�F���tC*������C�

J�p�4���6���!�5�����p��7W^`
	^���1�)��������X�����e��P����s[k�����-��0�RK�P��h3u��`��MTxA����&!��7��@��N�������c��38�`R��2��5{+�L%��!��q��o1|�i��P��>j���Z:\�!���L�p����6&n�C���qh� �|��'A��4���pm�B���V�E�a������Cx9?��SX��}>t*�tES�_9����:U,[�\��������Oy���G@E/�	B�D���Ck��	/X��Oo����l����1}�5^B���=����-h�{"�U��l��[�*NAJv����2�6�ERv�NpB���� �6�G��x�����e��`1),0�/h*)�AcH�����t�^��G^���Ze���i��deN��hb\�+9\r=un��j��
]sm������xX����3^�b"�B��<8s�}�p�H/0�c^��`�@�.�������|	�
^�����5��\����4s����_�=�J���]��P�S���zK\����zu� ����0L���x��l�Y�+0��:&(����Sw�J&2���$�x�.�;B3�F���N�Bup$�pE*�B�0��7����d��0U��]� C�+S�l�d��s�����.	��������������+(K���u����G��zKj�c�����f^f7	�cs�����b�,#mD"�F���7�w���.��I��?�~��-����=jQ�\��r�CN�����3z�S1G]���}�:�������1{��$XQ����Z\y����� �������C��wP]2J�P�[�}���6k�M���
�-Y�V�U���T�:��?���kf*E
����&]����_�Ttp��X���7F^<
�A7t���W���Y-T�)��<,��a�y37x���W��
r����l�4z��2�1��@�fU�"����>�L	�1�'��'^�<�F�U���{P�C����W7F�����s8�����/M,���������Y��X-
���d�����u��\y���+����Z��=��������������E�YF�
^��|&�@�*�rA�x`�%�h��(%7x��	V��!"���"4k1o�/ ����t���g��kk�Z���;��w�g��`�$�v�L��C-R�*�W��������R�5!|}���e������F��4'���<D��g��O��v�9��by�������rU^���kX�T��{{!��d��(A�U�n���m�^��C@`���p�6�6�)�d�f� ��t�>@`�����(�e&��O��k�}���|�1$�����	�yB���jk'��������|z
������4T����J��uiM1x����F~KN��)�Y��J�5J�����xo�o)+L�e����_�����bA*
LM�A^PR�����a���x����c8�!C���s(S���d��t�RY��J��� IDAT����T�/�.[
�G!�~k�:�g��7� X�g����,�/8�"A�7�w�+$V�3�W���wv����_��)����yJ�����1���	O���`Rd�'������@AF��I��4'��d�
G���������>��^�H�P�ZSp��$ha�||�^�i�I���D �&���zM�s?����J���C<0f�-�y;B��n���xvw7�	}��'������sd�7�1�

���s�w^��q�S���9W$(�_����^xj�&���)^�;��@B�R�j���N���G�������x�y�,]������ �����f��2�A^P"x����r��������n^(�
��H��{o%DF��tw>GLL���`��Gx�R6��M�/0�@�$Y��2z���@���2dL#���w��Z$&�����d������q=���Q�p��eL������`�C�6���3T#�7��Bq��(�BD�7��N4�J2�s)��*@]�_9���BZd,Q�A�3-���7���%���d�P�~��T����|~��(�G�OaZ@�������B;�K����������b\�u^`�BKR^8�lj���7�V��wG����Q$�,b^x��4j5��g7w�_
_�^sxA��
)
L"��x�J��^�0�v�-��~P^����I����+/�l���]Hb��H����I��ERth��l�s'��T�N����������W�)>��H����m�)#�X�G���\��]M�}��S����+RS	�X���~������m�-��1���e:��;d���D��8=]�<��>o�nN���d@Pr�L��
o;�-�r
��	/�`���d�]����j�q�3�.��B|�7�}I#pAO�%��;��?N���V<"��&������(SE�]���F`/�K+ka>��`J@����D/�YZ���n.���=�7�.AY��)�k+��NW�z�h����T^`J�<�ta�1��
F���(��������a�k�Rt�^Q�5������68����W��}��X�������2%UP�X�~84��l}B)�8�����[���;�B�JB� v��"�V�W^�J��\p�s���\y������:6��BpD��4�������
/4�c�����L�@�^Hf��I���jJ��z��e4�5>3�Cv��6���]P�T�����/��f8�)�B�FD�B������i�0j!����^���]�v�e����n0p�A�����X<>����`�B�q�x���x����ej-Ly���p�wzFU����W��U��Z�	/��J��Pw���1z�e��I]W�9 �����(-9��S;d��:��L
�A�	0�$p�]@P&���v
�Q�
��a��n�}�@�s�]z?��������g������X����vhI;`Y��~uj��5�i��|a��T��������T���d�v��3��j}i7{\*</��|x��4��X������p�f��v�)�&��~�N�Hya����������K�*��TFjH�O�GVQ���S��x��L��&���N|,�_�$
/d�^!���d�u�"��0R^�4:`R�,��)?�����=JAj$��J�V\yA��9R}(����'���^��	�11"9�h(�����0�#��f}���7"c�/�v����;a���0�3�k&AM�B�
����"���$���_���y�?*/��0���G
��N���ku���;I�3����&r�ju ���d4sY�9�F���B)��o��2�)��2A�*{��!��#���2A���T~R^P��m���@qg������2�������~�I�����d��H1���`��v��g{k�u�@+��,�Q��e�r8��!q������Z5��W������u��p��Alx���H� -8� ����H�"�/������(��B�H��J��������B	%E�SI���+Iya���H�AF�$J�(R�u��+��T�\�2��^����9�f���V#0��I7k��R�E�c����,���ie�������������.W`X@Aj��p�v�J^�Sw��*����������3�R]`�$���G������X��gOvR�	���:�+/8�:��e-�L���jC]����o�D��/�W$�Z#a�P;�o��d
���F#���C������F��E)��
�'5J����cv���lT��	�d�	XP$�D�T2�ErTz�?(/����;aH
�����X���(��v$�5N�|N}1��
l*x��vW����$Jx0��T"��n���:Al\j���h������b|�l�?����|^�`P��T��Yk����:��4�g=~O�JV�����Q��P��=����6	����y��x��/T�lK�'>�c<�]F�^�a�e2OU!j��`�|(^>8��6��"���w�7P�?�`��
�p��g)X�Nya��3�C
R�`��������.�~��2p����@����3{�r����7�T�W!��� ^�h�vW��i�Sy�H����������Q�A/%�T�,��)/Xwc
W�S���*�!���xaG~�6��O�t�����2�h�tG��";�]Y9EH$S������I)0�WW`�,u��J0��tE6~.��FP������j���K�=h,C)]T�u�m/���|O��e�3��S�([�6�]l��!���#���/,mF|\$W��1|n�]B)5,��!(uG��
�����z����������6��gr{1��0�/�[Y�
c�e��H�B
=�L�s9���������?�l��Y�P������
��y���uj�������>�u���g�Q���`�,�9��a*
j�*�
l��_@#�L*W����-�1s�0�����=���`�XXCpSiP%`��XzPf���>���XRy8�S]E�@N^�S�����<�iM9,����Oi#����G��
�](_�wx��]�B0������?�i����x!}��/���cp��h7�2�e����0��/�����T�`KZ2A+1��<����2����.G����,!f����4:��]�d�����zA��4��	��N���2�w����F���R��������	F`��z�i�����n�XD;<�yhS��j�A�{�
b�Dt�TL����� ��X�I%J9�1��?�A�n~P��A~�i����=�n�����^��"I���DL�!<�3OU���7��+��WYMW���cUR���;���'��������d������w�/�@v�&}Ha�W�`�-<��������D�\/?9������<@�������3�%-E�Z�������������#�}�nU�@�i����{��,nv�l���k���@�]P�)��t�/��IA�G*��e�F�v��t�K
�J��-?W
�u$Yq��]6�����0R/���R�d��S��x�}���:�I~X���TSlr���5z�������$�$�95{ �������@U��G�aM�!�p�����g���<D���k��I�&U�."��a)%��1G<��/��;��.c�"��^�;�zb�I�Oa��%4�U�2�#�<q��!�.��JN��<��^>��)G9��R��A��^���"����5�Ws� ��c���)+G����/Q06�����T'[&5A�X��7�#19����|K���x��O*
����GtiX��Ip���[�O�^h�g2O����7�B�
3���Uj������.���0��S/`���|e��;�,<�B/!)�SD�#� ��B<>�����P�.��Z�o���k�a�4R@�����\�����J&�
�n�����:y-WJ(oVGE���(e�D>6�AK���3Oqz�Dz��n���5�b���{1O���+]���L-���c>�hJY����s�I��7�����=�`��7����^z�����B������)<0�������l&����[aT������d/4�������c=��:��%CMA�z�(S�t��ND|�B���im/XW5�]|�O��7�bf��0��D�[�������e�:�""�.�n����Mp���H���4'e��f��@*
��hK;b�S:���_��/��SA�y�x ��E0>���	/(j*�������	��_a�Rov�w��RM��w���p�J�
a��"�(O�v�_�J7#�2���%�|�3)(hs��_`�O}��c������+��/����SS|#�
U}|����b`L�E��r��J������/={Iz�Y
x��(e-,x���B��g��B����}�N (����'.���#�{�d(�CZH$[���Sk�G��B������K��-S�$�T��#�{�@�q[(��"	�`$�}����4��8��=!SR����zC��1d���Gn��Q��p����bF��8�x)^�I) �|rD
�oLh4'��`b�AP�:�)�r�IE&9���z�2IN/����W�:��S�}_�RM���S+1��;����SJl~t�,:�]����������|_d
��9����I��=�>^`�i��$�
R3"�������W��w"3x��	�����V��I9��2O%��M�t5�N�y� �F��]�b�y 50�*�&�h�J����3��-����c�
/���x^��d$��^~���F���:�P^�������g1�n}Jq+s�;���Wx*j���O���m;����9���1�����N�8�6��^��n�)/����(�i��7R�D��7��kDeXw�h��I����gI��'b���3���9�PBC�>�Tt,K%�B�Z�vB��,	J����)�m2R�t�~`�PD�����w��F��o�Y/��g�������^��{�9��A��q\�$����k?^�H;p�R�yv����Wo���(=V��a���@i�v9���z^������>��1�0�(5��"(�����kH�!��������
G}s�����r��?"^�nf�J���o����B�}�3���X��{�H���NE<y��A���:
H������#�{�j�A��A�xi�T6���-05����(��Z�����C9�2:%	�����/�e�l\�=�@����6A�;������a��O��hMj4G�en�B	�^+�\@�>z�I�#R�fi#�/�Z�@�zs�="�� ��������>L��A| ��&����V��Pe�:��'���p���0�z�VA��"�R�v��csQu��^�Dj
�\"�����"AY�>���I�O�c�'0=�voG{9����u�:I���R/E@�V[x�[����l�wN��a�����p�����3�ERUh6|����O��P�����>�P���};�/��=���0m��C
J��f�e^H)"�����F����$�I���|��6���N�
�q�Nx��/$��_�"
x��������`dL��.��{Cs����r|B���[��7`)Xa�uV��	p�:,���ny
�G�"�{J�p�{-�0A Omwd*'0��h���AJK�����p����B*�ND�����.Fe��XzV�z@H����`�R�:���R�w,A8��D���Q�\-��������W�7���T "�KK��=������L��RH���m���!	J�����F��z���B���8t�E��������'��-�O*�3��������c�3]��:g���e0���q2���"#m{�>��;�$:_����}���0��T!L-��f�w����e�]�[?��N��7�&�&��g��"�g�L�%��������������w�x�
�[_,��$�/�[S�$�����H�kr��eX�df&0l�|���~x���D���^�=�j�:�oW��t�'x��M�=~�A�
�8M�����(���!���>z�`���-V�0nX�~������r(Ok;���rO�_��QY�QE�����W�ppz�d��5�'JS�+�����yY/�������,��~_����|~���F&�G�OaZ@����[������}�/��%���i#
�6��v1�(��/�i0
��/H����FH����i�����[��_y�����3���F��^�c�T���k�R����|a������WR}�/H���������a���17xA��EuL�i#�j@"��]��J��\�FH�g�4�S�����Vs���Z���1m����W�)u��7����<��/�n6�i����gNH&����8�wWb�t�>m���f�[�V���M3�#$ {p-����/�9��M^H��/�g�H�X���v+�&X����/H�GB�U���u�?�ZP���H����^��#��+B��=3�W_�B �;�y|��~0��
�M����]xA������_�9�F����)&�$(J_?�I1AR��IY�h�����n���d}#���g^�	�B^J�^����/��~~��$/(��SG�%5�?�LUI�E��������'�����[��Pt�z��- ��uPq�	���z�u�?�ZP���H����.���qW�P?;��k]����E5[^(*�K�_^��=%��/H���/H��y�&�yY(�{^��N� ���,P, ��^���[��Pt�z��- ��u����}�m]����n}�?�����7��B���q��~v�����������j��PT��l�� Y{J�5^��5xA����5^��F�^��N� ���,P, ��^���[��Pt�z��-���u~�/�<r����4Q^��;����e��x|q�X���0��y�(��H�.r��D6U�(��f��w\O�r����J$�&C^��{��z����K
U��$'�<�+���5��(�yY(#�QIC���b���|2��5%����WaTu>�K`��X|�UR���NJJ
ddd���.-5]��}O�����4�S��g�9��C�5!E����|z=�GJ�t���8��OA�[N����+�'��t�����oX~����6���9���;{�aEVV�@���_#���m]I��[�"9�H|liP�9��\�"
����d7���)P�%����`i�r���Wh�O\�T��;JuZ�XoR`6���":,Pj�����l#DF~�����4�����
kHR�G��T�+v����Wi��m��{~�)~�&/�'�K@bxAb�*n�^(�9����,���{������V���_���f
�?�i���%�'�6+���?!!!PSS���Ra�Pj}	���i%�����Qj����i�n8**�����!v[�B�|~/�<�?�
��i����l
�)�3!�}	����
��������}	�B��^����/H�AB�R���u�?�ZP���H����^��S��{���|�]���/�G���u�?�ZPz��`��l+���H���kC���l+�����Sp��V��$V����#=�J�e�?���t�������Z�#)KJ��?����Z���S��������<#�#X pz�����G
�����iImmm�w&��$Rhh(J�*%��
�ya>�c���"����+�z�
���%((���R�"/����'�G�I�����X���c=��
���
��Q!�.���]�n��p�TM�O!������ZL)�8a>����)L��V����5 ��0����%�'�6+��
��?�%(/����q��uPq��,�G��E����kA���#]������Z\J�����W����kA��/N�)N;�����Hw�����q-(����k_qZvZ�c=���Q@Y IDAT�#}����q�'����?���dQ<+�G+�1������,�G+I�^��]�V��xA�N������������/�G���������c��#�
�n}�?����������/+�g[I�,�GV�^��g[I�\��S��{���|$��������V-���������]%���IYR:����]%����^����v��xA�.-n�=a>�]/��.�G\J�����W���`���n}�?����������_��S��{���|����m]����n}�?���8��Jq�'����ocqz�#���_�8��w
���Ya>�X����St��g�?�XI:���t�*�Z,������\��{v	%.r=��
P�����/NK!X)�r(����E�T����*����Sp�-���g��k$�����Z�A��+������=��I�B��$''C^^^�~��@Go��������#k`����<����:�x`r��_i�y�E���-}�t�u+�'���Wa0�9
o�
<��g~�III����?ky�"����i����m>����&>$��o5�/���M��W�����Ib>�����@|j~��t|Q�G���q�����O�����u>�Odm	=�%&���1����ML����{N`EVV6_�~����4���������|r[����W(�oQ�����?�}M����n"w�F���999��H����� ��q�c��*��%=���Z���D|9Y��������8�!���c������~��GC.�`�iJ��@�XW�id�/N�86��i>� �e,4T�,����tI���=U�8Y�������5�X�S?���%/#���0��<^���)Z�������,T��4�_�������g��G���9�C��]���3u<�U���n`�������V���aE=����+��_���FaW6j��o��8e��l��U�&$Zw�}�=s�h��rcWz~�������:6e�Rp�k �>
���[��Yat�K�a^ylI����jP+'��S|hQu/�~/�B&Nz�b��$�$
�I�N�E�j�p�_tt��$e���&H
��TsB;���&�����j_�_A|�x�`������ zGR���N�7��-Z(9?������ys��� ����3��8v�SJD�C��-*�j@��~~��x|q���I�N���-c���f^��G�`�t�+n�����t����}�m������~q�(����/��^H��/���$U[�$e���^�=���(x�g	�B^�&��x�����k
����A��/�����r�/��i^(��x�`�����M�Z�
^p Y���tj���}�����b.������sG���r����g8���6mD��O��>|�	�������}�SR��}���A�m`PF/�^tLv<IcT@jJ*���������]�1�|�e���G�����/H���-�'�G��E����kA���#]���zA����+���Oq��}t��U(�vB����$i�;��_
^���ME%�$%"*1���������ST)�?9BI���X#<6
�L����p����9�z����`�����f��><��Y��d'ix�t�0|�p�f�E�E���������[�U/?KZya���8p~%���k�N��PPJ��@�2:�R�&Z5��]�D������#c���87{*z�����hkcN�.��7�j~�T^P5*����@��G(hi����|��b�<x=�zT�Re�����m��K^(=�	���D��V�8��D��)���E���/_V��M��E���$�`�^��Y���=����y���k,��kCSI��=�W��.��Jj�W������
�=��n��t������5�@6�<�V\������"����cg�Vq�T�B�*��UEu�_w����	�4�;���	-�5vR�u8�d-"��y���Wb����;�����w@R|$JUj�/���!_����/O��W���i�
���#16�l�i)�^[X��~�����$���cV���5�<�O<�}~�o�b6I)/�F!��(Z�B��I�w���;��$��K�����"���������$��6����D��m�3�=������U�w�R����	T�7C��s�����R��|#�,�F-�2�H���Hf*�A�
^��O��C�1���i���a}P�F5\�i�J�
anZ9WC�/8����� O|������c��^�t�L*WD�*����h��	
�p��!�tK���<�8��`�{�zv*���J�
��t�,+�k_q[�#��[_��t�+n���?
��kGi�/�|�����	_]�U����P����p�t�K"������O�cF��x������z���s�0�f�
^�_�����PS���d�P}�H�����-)���IT3����7
!���B�
�aa\�>����*c#���j���'�����_M��>�P�������w�G�kz�Q�"Ixa@��p��FX|�/���<���^z~B�R:E/�4*z{�Q�S���4
}����u�����F�\������u���z��\�&n��H��C����C��i�������z{LZN-rxA���j��1@����(����"��|����9y��G��1��B<A���&(��Y��B
���x;=;*c�Q��\����Q����K��o���b�B�b��i�B�������;�G��+6��_�F����q������]�a�aL��A�8z�*TU�����a�����[
���o4�T^���� ���d�D	��~i���v�~^����vh�m�K����*��s����a���=��F���E�G���X�\�o\�<P��
���g���CC�s� ���m�����(����Z@Tx!�����	�HHC)UL�������d��������������/�����yk4����v~��K^�����������^�O��?����e��������u��t>Y����h��=�o��P�Y���~����?�����}H;�4��?s��
)Qqy��g�x<T���q)�a�����S�V�94k������S����#��2R�"�n�K����������l ����k+P����=1
:�ynX�����rl���n��P.g��;��\���W%���s�Y�
/�%$`��3R��������lS�r5���t��@����0��%�DG���+�����6�?�u*hicp�:t�����1�^#�����^�"/EYY�i�>����%b������3���O�^��f7l�m��s��;T����VJ������P�b
�m��2�X���``C<���{��1�z��),�s����}6K/o��n���Me5<����O/��yct��*
Jp�������F��yf�SS�.�>��B��$��i�bge������aF#��������7�K�����O����sDV=���M�wnx��a�C������1��M��\�VClR�<\jg��82�Qy�ll�j$�Kj 1 n����H������S��X�y$�G�9�������KOP��2D9{A�rY�����S{B���_+\�n�Z5CO�A�$���=D����kO���Qp��-kC�K#����E��eY�]���!�7�K�<Wv`N�lMM��j:���a������V�s�!�;�f6����>�P���2�^|��N���X`*��1��
��j���	'�o���9�w�����G���������Ak�t�p��8�u����
��cl��P�5��S7�����X,�[�"c"�C$�����j`�T�kaD$�8��NC �}��+�S����An�����98v�����5,�L��g_T.S._�+O/L��}���m*�3T+g������'(h���+W^XK������E<�aQJN���\�%�d�w�6=G��[��	��YgU:���nw���������a�(����1H#��S@�r���yuU|�}w�|/R�l����7K����A\y��G'D�~���wQg����4��
�[������O-z7�j�b��',7,�,�7R��������V_s�6L'�?�JM�9}uD^pC�t����E\x�������<dU�u�#�dT �������8�j�*B�sU���#`���$������D�p��vSN�ue7�G����0��.h?�I�"`��
R�FCVK	~�o@�T�����	%]||���_e
��?�3��&r�J����f=������/���P�}�5|�(���KI%U:���� �������{'P�������nhS;��N#!%	6�����b����X�+��tK`��k0+e����D#
��||��C_]���4,�~��wZ��Uy��������&�����a����#U�#���Bk�*�hD�"y�����"�g�u3n���� ���]#���j���E=:�.=i��6���������g����Z�F)�&&'c������iZCMI>������zD~�y�;us��Ly��n-���m��ZB��<���~���{�p|�H|�	�W������aU����je0j���0�S�x�_�#y'v�*]
;l�5�}J{kT�kI*����(��dE�n����x��_���n�C4V@��>�|W&U���t�����>����-���,]/������'���J�.������Wp�$��T��(�n2e�'?/H��G���S��w����%����~�X�L	Y�y�e4
am�o�����Ii��h�5�vC]I�����
+�G����:K�]��m���U��M$�����Q��ch4�%����_����W�H�����aX��dg9|
y��N0��|�>�t��:L�aT�%��"���Xw}"W^�]2��;��^�3���p�q�g��}����<�h�d0��"�P_/<o��e���H��q�����P�S������5�/���'�M�lu��	����������M�����2��(�L��K�������G�� ���E/�Th�����b�Vl�r�{"��=B��R����),��+k����A5�Y�UP���:����@�J�W�YyeV"!�U[L������������N�G������f�y�&�P����xqa�P���F�S�p�0r���N�Dr|�KU��stF���N���9j����J�p��i)�0m3��/��� x<�Z�,P��`����;�FmUj0>'��6��/ U��h������`�4����e^�L�v�'��]���$To��<��.�����N6f6�H����������MZ��C��s���~<c.	�S����r��w�j-���7N����(�WOm�#<�����3��A
o_����-�������^PRQ���&�����>�j��Z����*�o����h����������6����S^H��@����\��j�!_�Qg�C�d�w��������Z�Qt�&��K���BjT(��o��nY��FB�����i<�)/�x��[	���M���VLU!<*
V5���
�<R�#:�R���,��sdbj�)`��X�+#���4��P�\���l�9)/lSM���|f�z�f5
���
������WL�f��������"}f��G�pp]�)�h��Gt�Q[��[�W���<�����d,b�����m��Ux���9)/�+�:��A�~+��{���Xt�����5���'��]���J�O��FG"��zG�
��P�b���[!�[Z� ��)���*D��z��C�����7�a�8��z�N���{J�}��HYA�����w��A�N��T�SO$�}��2ZH���D��H
��	�^�]D-�+/8�u���#��gxkT��7�]{*�j@�F�Z�D)N�8f��i>"�����O^$�����BZXG��&���{����
8v�*�����������6-"Cy!9%F�����6�&�T +w�@�����g���9�r��}T�h��&�8v���EJ
�r�,�3{�����=zPO(++�&������qE�@n^����v�X�Fv�����<�����w%+�����VC���=#Q�f;|r�M7z�������6�����3�?�
��m�4�_�6�O_�OVx!���^�l��..P�c��0���N-�����Z�	����	�s�y�1���������!��4L��{l��^�d
@F�P��D���b��P�����kQ���&��/�:��"��K0����2�������4h����3a@����B�c���������	
��j�����������	^��`���J��	!�������Q�	bP���m.����k��-O
�����/��������dvu�u��g���7``0��M��T�.�k��QVF8
���/��0N>��>�e(\ZS���`I{n�;�oDpt8���u7��jG/�����k/\q���O�pv�F��>
��w�9���fa�������/l�P�;�#j����B��8�U����,�E~�\��_4�/L����1,� `U|%�dN�V�v�2��^q��$[O�����g(���v�M��|��}5urr��f�p����JB��� ��
��3�j�
Ri@��=��Y��}�!-!���E�%P7�@�H9�_xL�#�a�q�D����et�R(��F����v�N���~���|�Xx���J����SH
��`��Q[�,D���WC��?�N�>�B�Em:��s`A��4��^(��CN����&������Y]<r��u�������_�<���=�����3�m���'������mC��6pr{�2�����>� ����������k�Eft����Q�QpD��-���}:L�F��v���6�L�_�'&�|�(l�{�V�������$x����?6nC�����gfMA��[�@F��^�6�����p��+l6������}��C��&�w������O�8��	�
�����`b�v���5GEaj�8J�����i��Xu��(�(j�	^�'��R���v����!/Qw�<8�H�2��j���������-P��F-��������6��n!<���4c}���&������D��u(���A�Ze���IPO0uu�45*����oR�l~v/���A���'ULe�#��K�
��KPm��|���`�����c�����du����h�`J���B���������m��n~D���TC.B�guD^v�F�t0��--.Q�=PjJ}������s�J/h)@}�Y�a�� %4+����,h�	��7�%��X���R}���kB�}e��ru)d�����u
*a��[������O���;����1���2k���/p�#,��	�)��n�;^�������^�~�_|����V�����0
�����Wv�D�� �2<������m{zn�KZ�H�S����%���Sn��BR2��@�0�]����jQ
�PN��}~��-FS�?��_x���|����UZS~������E��V�%����3fvj��7���6Ku������8�`���a������c{���/�;�F�j�������sW��@+�j`I��h�����?�aeA��8k�����a���86a�8����7�����4��X.�|����/��C4����Y�YP859]A�HG��4��K`���NM�O
�CBQ�Tf�\��4�U�[���"�X���1�M��0/�%�`���X�������)U��c��mx�yj��&����"G�V�zuq��K]���x�
��ti�)�O��3h������,����00�P���U/�+���U���{G��u��?��
MLl��w_�9�����a�a���Z*��v�-��������6�M��J:��z���'�@��A45�����/`��&`~�}Xue4j5�}����G��1���{�?,�\ IDAT�q!�j9v�K��u?���@��nuF���t���oD�("}`j`��bU��>�@���"Z����2tF�rx!�#z�����SU�v�����W���q[�!l	\N�Y���Re�����k���������,�������Z�	�A��7���O�a�q	�'Q��R�Q��h;�mH@��K�g��/o`�o/����5����U����0��\�xg-�b�?�Z�Y�{�� 
���z�����Q�'���xo��m�r@�j�ip����B@���k=l��,�o�q1A���^� ��4��00������@�7����\%��%�o��jz��qd(/0h#�������}0x!��?���.�.�q���4m�:�$�UiE�����?(��a�^'����
*%�Z��g���
��9I-�����+/a��Q�+gL��WXw������3��W��B=su�7��@�qkq��2%0x���xR���k�a��Nh�n0����U�^|��d�R4z���Y�+�^��yv�B��#R��N�Y/Jw��+*��o�)��l��pj��!����hs��'�>�J�?8�K���f���%'B��E)��q	�p�\F�Q��{2jT����	�i*���r�y4c��]`CRQ�\�`�x�o�D�
%��H,F�UATLl'����(C�^8:�S�=AE}
�����.��R��+�X7�!6�s&@;����3o��Y%|���������>p������2[�mi������V��U,W�}�������3]w�{�	^h�')�9�#�}�J�!�/-V���a��j2������7H���v����\Q!��1h����/�{v���Q
7���r8!��%���px!�";t����T�M$����hb��m��3a.Bw�E������{o��@��0iQ����f����q��U�TU��}/�q�
S-CT��Thb4j�L�INE�r7s��.\�C�@e����#�c��S��v>����g������B����@������2�����.	QD�������{�uu��kU��V��QlP@���;����H��{��G��y�;o����a+�/Ci%l8��i�!��0etz���gq������������&��]�'0zpO0b���C�?+��}������'��w"��f*�r��/"��mX���?������:��h�^2jSCS�_����@ml]���v�=��k�#�Y�~�c��+��������?�ii���9���%�z2�_��p���D�B�vm
��}7���������x�� ��r�����h��;������ `���(�F�n���C��S�TK�gf%��#RW��a�����6on!1�5������7vP��'P��E)1�Q��T������/� ������v�wvp@Y����^`J
�� �^��su�����T��E9K��C������I�k��v/D�K�vNe���(K���MW�H!h�	���!���&�c��k���z�T�������^0� ��F�����%g������r[��������f���aW��.�H=a1�1��L�������-3Q���._���rC��p�-��^;%���bfx!�^0%�$�z���\*��&���`���A��@�^���s�qF$2��4V����NP��{��p-���^0���~��@w��1����m*��l��;�f�	���Ogh���e1,����
������A�Y�?��wJ�nAQ�e
5T�8>=��h���#A��O&�����q����_��U����M|MIEM�%��������{�	j��x��,u�;��$i�^`�k�5�������uc?M:�	��B�Z(]�"v�X*��ce�Y;q!c���N5��X	��E�V����
��U1tV��3W��g�tu�n��S
y�iK����~�0�?��)�_���.
q��.|}�)�`��!\�a��n(a[��v���������V����y��8�&AO����5��Wrt����+&�A���h��*6�����w]���5��Zc��]*�G�U����~��22����O���`���%;xA�z�����k��w�(�Zn�X���<a(����
��
>��B$��a��:_o����!>���D0JR�Q��1������u���
������OI���!�&�N��nH$�MM
&���o\
���Q��1�!��S�FM���?��T^�N�6��<W4��q����SA]��#O����`���*,&���
�dLQt-�%�-7K�kq�SmB����nOG��U���H��fM�F&�hJ�Yt�c�"x�LGV���C+!p�	>�����a����+H|���Pn�Fv��2����!���	.�)NQ��]m�A����-_��{���FWi�iv���#�[��Z�%voM
��[G/��4���'7��hB����Mq��EL����FWm��P��3��:���SIKfx�[�Iy���+��c}
���B	�����y
�@�~�������qd��t�V�2)���5�ec�#e�p��{�x�
�`A���{N�G/0Xj��[��|�����W����Q@��T�+���*WT�h�uK��Rr�$(������B���Yl��}X��;�P���E��n�z���T�&����e��Hy���M��V���-����RJ0����]l����������}��3��U'�7GX�>����Y^�q�����?�+n�����M�9�Qg?�`E��@D��O#U��:�/�l\��I����R����^`��+
��K�wV���tH-��w/�UB>�GJ��e���3�T���q]����u�y��<�����+/����+�6�+�����T�j�0�\�;L�I]����	�0�j�)�d	O�����:��=����������A
6�������+�����&���������fe�|��\�4��f�8A Sg�+cS%i��~������!Z��k��U�U5���J��5	�`��uRnhO�csq�r��}eu�w�����K�����I`#��i����p��
��n�Y�f���l����L�!:��:��
	�6�I���	�~s
q�<����s��k;WRxpp<b��E����@;����d��KQ��H<>1�+20���
���ph�\�y\�A�������Dm���~g��M�H���6���t��C���^���uH$E�������������oP��~D?�~iG6����V����-J#�������5*���?5M8���M�����5�xw�=Ek��A��`S��:�D(�uL�}���� F������#�`jV�4��i��\Q���i#F�������sUT��z�\�A���@��x��J�����l�@jG)�kVnF��M�� ��>F
)-i�l'+��%�\�F�}/��T��>A
A�j��d/�v���p�7eJ���E�+/TrU�����'�AG�}R�W�J@�f��������V� t�V7�9e���lk��-����5G��qER�����^/�er=Z|����=?-\S=nq��L����l�TC�^�{I3��f=
x?���&�>�����%0^v��&�cV[���pk�UR% ��)�qv�		zM�������Kg�����F�f,N���6��{����Q��x�$���
��rx!��vH��OII�5t�4A�9:�o!������m��x�q�H����J�����W~�9u*fE�FLt�����%#�A���W�H�^_��0'���/�l�B/��|���H�f����7C���LiF7�����!��h�>#���m��{unEi!LI�a��BV�1S���	�5�'OM�vg05�I#���n�����K�!�
�������|���k�P���\%B(�r����BHl����V1U�;����a���]���m�s�;��h<p#.�$����"����)�n�	����(l�������y^��v=���$R]`��
������#G|7������#`�I.��BN{���r���^8��[ ��(�}�^H}��F�7C��H
�(���"��O+�����B#�]Z�V��J$��O@CZr���h���^xFA
 �z������V�wN%;x��!T�.�'��x���L$���K���T��:���	�UL��������3���������}t-S�+/��ZW������N}��������$�)������n���U���Q I��^X�u2B���k��8AA��u:a���|
Y)/$�����G{�������^�[a��h\�:^�����oP@Nv�/$�N���R�� ��@������������E,�FJ���"x�W^H����A��.J��W�&<e+?*/<�P�$%;xA�����9sw��J)�����3y��=�����4���P&�l\|:��[�Nya|g�^�	G����\y��	�m�W�	8
��M��|,��z�ZE��z��t�����`0oRI!����%���p��i��W	0x�A
-�����SP�|S����j���s��%��ed���D�Mz���S�a�����%�%���P��ALy���s�0-�k�N�U�~|5:�%�.0�z"#����^b���u*���`I��
�v8��v����`���8�����1���2�����J�������dT^���;��H�-\ya�9om�������V�:A"��s�(�,?�~<KR��L��!�T`�?����1x�^(NJ)���)d��/I�����.`����}	�X������P��V�p�mJ�a��&�:�2���&�eMi?S(X��Q!�T���wt�w��G������������+/x��g9��x3���Nek1�`I*a�I� ,���L/����h��@sV����!���*�UX���p�%�{����G(��->�y�c�r��rN}��!���h�T��@�x��S�,����X�D��� m�6����
E�IM!�T��	2��)���GRI��\��u�Ki����A�
y�n�L����d}i�=�>�����p�9�
[�oG��J�z���{����@��7��9.]�z��Q'@-I�����Bfxa��:�q�:
�;�o���Obxa����Iq��*��������L
��n��h�O� 
�w#����$�y�������ca��<e+��vL����f`�P/<�IA�?<��a��<�D�ZUq��,��X�8�43lM%&������HR�bJ	l�EJ�H�b3
,}+Ly���
�6!���\-a�a)/0��A���&���d��o=�e��x,����m�:dT^��t����/�:E8����	�8��)����>��
���f��c�L�"#�0�ms������s`� �����+(Q�<W$x�+�7p�����<����	9M�����b����S���I)	J8�`��6_�C���x*�xu��tX�5������x>K��RP���G�Qc��RS;`Jl.�n��#Xa
��#��b\9���M����]��!cJK���-��#�5[�Dc5.��.���CF��0���8pg
���y��..xcJ�uXun��S��T�&5����~;�<�S�K��u����w��	�)�?��7`Q`�)/��F~R8�.����t�)N����B��H�a,�4�)�*KM��������[�i6O)}D�:#9����8���^P'x<3��k���n��f!Wr(V�;�����Gp��z���(]�]�pix��O`[��C<u�G���0a��
C�r��Z�eP^�@�	��;��+T��w�0���U	``�KMO�1��[���SP!���}O0����O�Gw����wQ��?�g;W��Eb��R1;x�^���>��ThlJ�W�\-1��g��9�+/�h��a��)�����Jya��SX:�5*���U���cq��~4h7�����IR���4T���2�Q�P��H1��B�w	&�6���w�LjH����`V~P^HJ��������J�>8��Ul��n��p�z"��,THy!���Iu!��hS[6�.N�1���g�$R���)Y�����MJa������_���D���!����B#��N�z��Kc��t�.+���3���sh[���.0���������9��dQ^(���oP���U���&���(��bh����`�c�HH����@i|�\`����y�~�dR^HK��?�K/�]�.���z6�B�FLy�TXj��T/�TSB>@�]��w����F�;n�R2�g��
)��F�����9���dWx!gK:x!��.�'�A�nmQ��+&�Z�?&�]Q+/���D��=|n�J����G�/���
������I���	Cx���T��6��`��P�r/����k~�!����?hG��0�a�L�������H��s�������������$��D� ������3���z�?I�I��5����;]������w~��[�RX��w�e����?�ii���9���%�z2���0��Q�/Z��8�����4������AyGy:m���a���>!�K4��g��D}�����RC�z��`z1�eC/�*���A6���)��_��6���$q�,=h��`T�3�<'�����.��sKi�P���Y�ah]
��]��U4fgRxx�*�v�d�Ifx�Cl,V�Re��J�����9�0�tix���=#8��
ff����n��!��/�hNd�HM!�������gGc�S���K��+^���^(*����k����W8A;�����Y�V���/���F�&T��5woR��")�w��kt(]^����>�io����L��g,��uJUD��$�N~�����#\/�����=(�2v�<N;�h�;���5�0x���d�_xv;n������^XE�G�.�7�x���@�����N��K���1�P���4���G�#v�����^H~J;..�$��FM(�(#�N"����:JH��-�U��E%;x�ZQ[t.�����xp���#�����Z��D���P\��Z���r?]2����;r�2�a�E/�s.Kk��|�v����H��1�������DA�2�ig�6_c�RB��,�^��X�
�y^P���P�@�Y��J�"V*���@� �8Z��?{�jB��c��HmT��q��O$���v<��{J'���M�F����Ix1o�h)���h�J�m?MK�������#(�W?JGq�n%����U�Ny��n�k!O���G����^`ep�Y0�7C
.W\0��|,�<��������<������7��!�<a�$>���L)�A�Z���#e���������t,�0�Fl����i��0�#��^�z����Kd�Z��MJ���3����c�_�s�l>4����w
��{{��_��Z�fx�,e,L�|~��������L)�����UFCW���F�h�q�w���3~$^��
G
��s�8�a���(�I��a�L��vl�,���th�Q�b����w��7��5����n�x�	7{���%;xA�v#��3�v*�Qj��<qN/0U�3�u'���N{��q]��H�1��J5��v�1���X���5G��E�X�I����I���V���)1<�c!J�
���N���Q������N��B2HY*�����r�����h���}GM����oAJA��H��E[7������d�X�:%	�����S/�r1'}fe|�}	&������L�r��~_�������k|���$J�uC
{}y���H#%�J�RH�F���H���7�+'��H/ncH��3OK�E���!�!����$����I�)
�e�yj	�:��~��w�S�I���������@C"��~B�����d/X�orb�����+O�����^`�L���R,	;a IDAT�r������z���L���=^�S�+>P�"C��=�{/z��J�$i��
��vb��qE[g~�YL��2f��QS�^?��F=1��FJ������KnG=�2�H�Eu�R��{�`2����d�v>��3JO�����4
;i�Hy�9}�������C���/z� �]���I:��U���.*y�j9�@��U�u�)�T	"x���;�����K<���O��-
`��,��^��0m�!����) ��TX)����,PoJ���_f�;L)�a?�I0��,����y�	v^��O��$Dj"xa������5I�G�JC1���(�D�s�`<zRIYv���*�&U	;3S��0��qJ����f9�o���@S��L��V�K
�G���J(���P��t��$������s:��?��q���|LQ�m|c��`��M�n���}��}��t�:�T,��)N�&��w�z��i^�,>�����*/�+Z��v��?�`+)L�����Wk��F�L"8|��Xa�BE���>9l��'}��5�#8�-t�=�z��D)"LxJ��6�����x�o,AJ;�����h���^�~z�RSL�{�R�(�e���1��	��g����	�����LU�,�S��ze�M�h>L=���Wg`J���Ib=Xjm
=h�����Qy�������(^�<��g�����h|Z��3�:t��l�RO���`���h�&u�{�98���
����G�;������^�����d`�d���
�+���S���_�z�1�
�0xA�M=s�����y�&E��,@_��uR�c��������0���H�&%k�W�����t{M��L�l���� �R[Z�����p�5����sassm������gF�$�$����FS�3#K}���r��UCQ���y���NRf����H)+@Y+�<t(���c�^`@S�`�[kbL(J���u��� �������M\Y���`�����9�h�'X_l�4R�b)0�	b���������r�
V�x*�������G���
v���&�����bt�k�e��Up��������$�=3+^P�vFfV\e�����0`6�,�M�R7�y~/�[@fWA ������>b	��'�|�<xX{�J8�����d/�F� ���MUJ��TY/�b�mG����Y�	R�yQ��Xa�B�{R�����(���b]��z�bd%�^'��$K;�L�X��R(r�T<�s���J�@�
�������8�^%�e	j�@�o&�%=;�S]V��"!ez�HC��(f�B
�V���9$�e�g�9��}7�����-�Q����GJ�}�T.e.���cX�2�<���^���6^E�))���(Xk���`�<��z���\�I�{�SH��[�eG�����bN�������W���g�P�����X�S^(V�����)����;��>E���7���[��W�[{�nV���Kv�)_B}t/������0�HM��ut
�3�v�\aA�^:����=��0���hv����(J%��&f��-F�����)=�Wr�^��to�����S��������F#�4����==M�%�:�}e��L|��@�z��p�=�)�e\_Fx�SG����=_����)���V�r�� ���`�s+R�J`x!��c���r�M��fM��F�������?�
�$�^�n�
����p�w���B�V��}�6b�������`h�O/K40�O�,��Wo�a�?���Xa���~]��n���j�#�_�
*����x;�k�����Y���������Sx	(��],|�_�����$��*mDN�xA��\u�`�������#�'?-P��7i���i���%�z2������[����
^����h�^�f����UPm��
j>���^��M�:����%�69���G�?[9��������d/(b,E�����1��s�~�y��\���s�+3� �q�
/�{���O<�2�H�@�
q��?��x-KwY���6B���^�����x�eL-��z`������t�����
�L>w�1m�,C�t�J�n�V����T�w��6B�}g�/;xA�c��wV���}J�>����'K���Y�Td���y��� ������B^�"�9[�P�y=H���~u��b=X��{�z{�����Y-����k_Y{�6�/���j/�zxA6��B��xA��H^�xA^��5���_�O��R�~��/�v�d��/xHo<j9�
�j�"S��JJ)��"�"���(�j
�����R�0����8��P�Ul~�"�#���7����GMS��&��i5D�<������	�B�����m#���"�Y#���X�$�B	�����:GV*����.�GV*�����W����
��jGE��v=� �Gx!�~� �q$��� /K��������f)�?ZH�r;j����/Ho�������P8<(�*����d�o��d���� ����l'(/Hg7IZ	��$V���- ��uPa�	�Q��"k��d��b��Q�}e�]�`���*������<"������#y��yY���G�~
?�6K^��B���Q���� ��~�����{P����dv�����<-���O����/Hg7IZ	��$V���-���x)o��y�~	�HJ�����ui8������tr�m�B�27���
����.�'7����?�����.�z6�z��4�%q����[/e6Ch�*xmZ4�~������%%%��Rd�~@������zTM�F����y=I*������`R�+��H{��0����?������V�g����,$�D���:�2�.���3N;�9����.DYU�)%��L������1�0������L�����tAr��H�� �#�5������=�����6�U�)��#E�gMT
R�������~������*l�_q=%��#15�s�������_^���!Tbv�������a����9N�>H�$%%�MMM����bD��H��,�ne]O%�'�����\d�$*��|�
�?���HY	./#r�.��wp@����H��d4R���PK�.-�zk�XH��\��x[���%�Q����\�.T,�s[ +x��g�+�\r�Ua�	����������n����B�������u����Y=�>/�?�����x���n��d����������K���m*�������+**�w���/���7a=dx	��#��
����2�����l��z$pzV�S���`h�?IAUxAA����- �����T�}e�]���Tl{�?�����6������Y�p����X�����Y-���B�Rq��G���aE��!�Gq��G���?B�RG�����8���g�?�����(L����;N����yXQq}�Q�m������/^������`�|���a�b����0�b�`�/111���S�@�����|2������p��L�O>Z�a����n��=-����#��
���������
���R�_���`2�����?�F�����K�?r4����������D������z,�n����s]�On*�����s�0�g����k�~n��)X��ka������b�S�v&�Q��"k��d��b��Q�}e�]�i-��^��b�+k��d��b�&�������z{�����Y-����k_Yz/L;�����r4(�����X���b=����v&Kb	a=�X����)8�K2��I���:���
���b�(+k_Y{�#��^��b�+k���?�)��|+�G�#\���(����.�GV*���T�m����yXQq}�Q�m��sa�������>�(����Y��<���>
��`���y�,�GVT\�g[y��+�G���q��Bi^P�[[pOX�b�Y{�#��^��b�+k�B�RV*�����W����jA��/L�)L�=�ua=�=�e�]���Tl{�?���,������Y�����x�2��Y�����RpOK���JWG�O��^���Hb%�����U��X +x������o���+�6��sl�����dY�0�,�`���Q�4��/f�z�?R�._6���;�]�O?<XpCn�����,u�U���P���j���7q?h�O7��"�q���O7/��,u��Y!���t	��������(VQ�K�\h'X��,������
l|a��m�
�8�tA!�������UH�B�y�@�u`q�C��B�o7u��������g�:�C)�m���QR��F��"yl���������|P�������@�:Z,�K[ �| |�k��k���o
Z����cq�F88xB��)L�8��_i=���a�_���X������/��.�GV*�����W���
��:���K�^P�G���/��^��� ���V�������o�'��
�����W)�2�]�d0��T��`����/Hfu^��N� ��#�,�S[@��!X�X�����Y-����k_Y{/l��6�/��^�����<��~x!o�����&�,�������k<^�o�[��~��J^���� ������xA2����v*T��������j������=��jx��}��s�&9-/����th�H��*S����#>!�1���b��p��7�����a��S`���[F��a��=4Gu���b���PVV���!!1Q�1���-��XJ5�����X?�����/��.�GV*�����W���
��:���K����p��m���f�/�[W���M��0��,�4.Om�ZY�����5��w��O���m���v�uJ��<�F������x�uv�����,(D�9el�+��������i:V�.��*m�{�v��	���>�uq���<��]��p��>�S;Q��W���Y��L?fz�_����H���������%������&���7��}��l�����`L�$���T�a�)<��(�
&/��kZD5���f����z�R4�Y����fz��S���z�K�1X�5%O^���:���.�T���
��7���}jN���5�M���<�����u3�v�����b���g���b�C�����v�UVD��Y�[b������x�i������	F{��S;Qe[+��Z�=�?jK�������S��n�O���2�����i�iYU�g��W�^�����ne����Q��AN����_qoc4������X���}nY�P��F|�L���IhTV��%`\S�<����$�$|E3W�<�U>� �:J�^"=����xt��=Me����]�K�u(��N-�i%�|���	XW�����t�B14i��O)�������~��v/>�  ,��)��	i���v��"#>���I���#!!
���iI��W��Ks��KwN��s:�&(Y�.��W�z_�\-K���W��������c	`;}�����.N8z��m��l��JY�����1���Cq��E��Iluvc���m7�������I���*b��.���f���>����|����������r��b,+k_Y{�#��^��b�+k���?��e����K������w;����_���n�� ��.�Llxa^�f�c�YLm[�?/8�W@	7��w�������wNC�
�
^(f�
��n�ra����<�jQG�������::t����&���<�chd����`��Qyn���	/��)��hslY�	!I�+ox�QGC�x����N��z���Tg�H���k���U��f�z������8�����~��S�k��nb�����x����}��P���E�����M�"�^PWU���m0i�A��<���������G������C^���h�l��{��?��������m�I`��/��MF��XVP�	�����l�f
^`���/�h�7�"�R����:��T$�����<�!�����#���<�
/L����t���x������k�r�*px�������QS���x��J�����^����-�G<���zwn�%
���>��b��������������A��/����@�b��%k��=)0$%%�p	Jt������
Wn������M������?BOW��*0�6�'D����������?{��%\J����L����*������-S�`�EF�?~����$�*5������$GV�FBlT��,�6��s������dY�W:��vP������<^���)X��6����,T��K�/�Yg?����^�{��s�@�Hq�b�3�
�k���p�-������{��U��f�#���7V�j������g�m�C�.����~r����������&�Q��;���W��),T3sADR4�l�S'������D'�����������p�)���
:�ZX�����V���7S^X�>
<X��%�I���O �k���b:���h,�L����A��y)9)/X���R�����k^+�6=� <�^G�D�����������k���uZ�S�'��(]��c��������eZ�*/Tt���U���'�����kT�������5�7��������HG��T�����
���}m
\����+���\	��X���}�}�l�gv�m�a@��4?e,���������v�|��}���n�%|&g.J���[���3Ax�Gl�9N;�p����s>��}�����#%%]:L��7S+��1�7 (�9��M�v�R��|7�<��;VF�&C����SG��������gWp��6t�6�/����8wr%�1B�����A����T����=�&��|����S�9�;�]=c�\��>	�;����*��� ?<~p��
z�
z��g�b��}4�+XZ���SH���yM�����MilX��+/4o;	�/��}��
o���(��8����_�����8v`.���{���T���=�+�a��?l��;���6�������F���
���Ch�[4k=�~{�d�-x�w
����-2���C|x�kh�}�Yw��?�WN};�1@ �\����Khh��<��`����|�^�=��6���<�Ftt�v�Q�J�����{�8���w�~���C�)?8������6�����{yi��^��Xs�� ",�V���*�����H���Q��.���7k��!�����o_����E	H@�b�8JJ�|���1��5����}�
��e/:^�\=����\y���0�g��3��RY������=�C�XF������ ����o(�h�M|
JFQ
����9`Zl�����XW�_RA�(�-	��j��	�w�R�s�6(SQ��i�G��G��\��](�������"E��xB ��(�mspcj4������}��>�������J8�)��"E����)��V^���v������������^\<�~N�E�v<�cA�a���D\8�1���lJ����~RSW�sW��/��S�8tj�}���EIQT>GYv�B���t����KOz��6�t�Q��U����E�������_[s*�Z�Pg&?_�~}�A�0��
|���s����:l����"%-�����Sa�[�/F`�^g���HL�G�ZS�K�P�C���=�(��vu����]7���,W^�
A�b5���t�<�z�H�{���Uc4���gL�����P�Oh�����}v�+/T��
MR����W`�������p�w:TK[���+#��w����v���Y��kNFp�?W�hT�+�������X���
�t���8��>7sf�}N������P�>��
D_{G�IHx�3<PlV�g�� |Xu���~�H���-���m-����kb�'��fq+X��]-�l9���t��:�
+BIE��v��Ly��MM�� ����5Jj*�{������i�9)Sm'S IDAT/�s���ma���O��x���`�
����w�:t_��|i��;w�i����J����~��S�q@��c�Q/��z�������R��0v�~������������w�,�#W^���Y����W�D]��h]������8�m����F����p�&���u��z��4�9*�+/�j����s"O6a���^R0���8:�mi#����n�����V����1|KsU���M��Sq��v������	�E�eM
%�����>�����R5��5���$�}|v����w>|�M�����	�4���9.��N�1_	Rh�R�����HL�C�R
8��H�/v��`[U\����+x�������x����Y(/$D�����V��(VCW��C�H�����R<��x\�|o=(�*�;�q�>��6
z�*T�+*��{�y�'��i0�SE�:�H�����b55Q��d;�V��Z���������|��y�bae��	�u��r<����Gk�T_z:cIm!�l����X�t
I���t��)+8Z��y[�%��8�~KLG�>����u�p? ��w^O@H�C��|8���r����1��C��jtM�GB�W���>0����{��z�K�sv���&���f��������������:�>_]e�(����2R�
'&���9��E���nb{'@b=��R���\�+j����_�G6b��o�{n����!�n�M��o@�t�JQ�kc:T����*"��H!(�+ �%��,�N��t�'{��:�y���?��FG����C*�M�6�VM%,�&&Ca����S�q�?�l�-%��P��;	hQ�������e\y���I�����v�������>��y��[D�C4��3Q���4TvP�>��2W^�q@��_G����8�(	�mUQ����h���aV��q��Qa~��;�>�r
�U����S������wo�&���Z����1�Qz�ahl�����wmL8�T���~���h�b:�?��g�����3�7��/_�����tn�C���/^�|����kt�NC�:Cp�����������X�����Lj%P�J7��=���
�'�;x�]D��	H��B�r-�����7�XN��s�Xt��o���g�W�\��d�����/T�u���
�w��eN�Ip�3�����m��)��+�G����s�g�f���e�a����v�p��Y�	G�������m��qTvs�}RL02�G��� R^HNI���W*��;1r`���t�6�Y��fa��P��=}��E�\�A���u�1�_W��"��|����$F4�y�a�|�����X:g2��3������g���C`b����`D|z��Ax��y�`�����#�'?- o�i���%m�?�#�Oi��^P7�@�5Mq��1k����^����8��Rs�)�^�W�����0��d4��
������s�"7xa��e����q!0�0�_T>������1��V�sh	cz����)(�����\��&N^�g����HXQy<�^Ec�*8O+)�������������o��r�:�����q��������h}��l���]����s�5��:�
����������c�c�}zA�XsDE�~�?pd�0�T����X�=:�����:�
�F6p*�7�������%��Cy��3)}�.�Gr����F�oY>�yp(,Hj��@�^�`��M,���h����&5���et��B/��p�E�N��7A�3��.��.�]q�����x�|,�����6j�G�Ax��,����V-0t���3��t(�;n�&�]�U*����������{A'�������OC�j�>��Q��!��_�Q0��x��s�hE_����0 i������(�� �"�cS�?��j�@"�,�w�Z���SG�b�����^02����_�����{����t����C?��w���q����ht	�`D%Z��\�}}������a��b���p*[,��FQM������m�FFDG��[�%��e,����tl���SQInf�����	��s���&<8�@
�
M9( R^�^��=�4�A�^xH>}��6:�p��z7�)U���c�o�z�[��n-���I���Ss{�D���e��x+�� vkVs�yu7�	sp��Zg4������z2�b��]X��3���A��h�l�A��c��0�(N;�>�*�>����2������cA�cR�z�����|�_VX2)k����ht����1x�8���`��@u����:nzE��.�C<��f�}�70Q�`��lj�K�#�w�N���=�����6\:���*\�\�A��Kl���)[I��	X0�T��]_0yyQ,��f��M��%��/��5-�����G���#�0��h��g��#�]&�����E6X7����� �vL��X0x�����mh,#Jw���1W�hG@���8��6��% �MMU��D��]�R%�`T�.��D����Dq�f��k�N�{9�`6��S��^K.Ut���h�g�����E����>���;W��j#=>�����d/�o���U�xA��u����Ya���+)�P�����*b��U�d���?�����I�GG������s9����K$L��>�Y���>��a��Q�{M|�n�L���_��v�0�Po
�l��#�(x�#
���������
rY�u���zBg�Q�*�q����0(�A
h./��V��S�{/������a1����G(H����A��w���k��+��bL���|0���s�)/�v����P�xC/��}���%�}��9��*@�J-��&Us��f��W��[C�R��/G��zb7-�
Ja��>�<��ukS�3���@�����Pq��S�����x�u����U���K )$j&�x?{+L:��pY�~o��1/����$�	����T�nxw�\�-*����'���N�y��/��w�tY��E-Q����7`v��Xp�b�q`�`t_���;��!&n9��5����,$E���/cD��X|����l�q�6ftnF�X��<�����g�t_�u��@i��L����%xN������!h?o-*�����:�pC0�������������=X���� z8t?S��Y]m\�M
�V�����c����7�%���)����/T�)��q(�`-�����f'�3E�!�A���������9�j��=Q�D]�Z���3�(=D?�Q����mhXc�{/C��	����B��P��,6���W���c(����{�i1e�J��G
�~~��6��p/6U49�Pm��(������=�����6���V��-�p���x�N>��*#��)5sR���iW>���#���R���I�����pn'�.��^�CP���t#0���d:��� ���:\��4�t0A2@`�mu��_�t�-<��4���g`�KQU��S��}���Y,P?��N���F����~O��	���9�+�3����y�����:�
k:�=.&P�_g�$ch-`��c���h���5	vS��B��j��`*�9��6���,��;k`��X�A0�u
�W'xa������}1�����C
n�J����(U��J����u�>���`�����9��c2E�Y�&�_��v�t/Gkf��u��l�y;��P��D�X�ZL�x��
"�d�v�1[�Ry3Q&��+������~%�_����Z+�S�VMd�����.�#��Fs;��
hcC&xa#�+SZ��u8�,UQ��*��7���/����ZG���! X�M�F�T=�Q:�q�1�Y�|w��c�Rf�u����(A���JN������,M�\����L���)�i?���������Z��������i����(��lp���>����g�7]��������2|�L ��g���G��#��	m��wFe�=��}�h��8@ B�N�����CH��O� �z�b`h��6���;���������L��!��_kx�g;���G"x��	/q��u���n��~��b�6O�"�`����<�7����/H-�bbi�V�2�V����v��
SF��<~�B��%���a�A���M�9�<O`�����X��;�!��mn�}�0��e�:�r"��\��>�H�c�$���"X ;H/�/������\�\�T���S��o���?�oO�������p�����>�������?-�]OVi#�6)�v�x�
�|��{����!��^`
��BK���p
�^��K87x�e�{��?+m3�$U��!E;���D������+��\0��T)�������g�I>��B�������C

1�jV_(����#��K��;��|�R�aN�������{��G���gbj�����:0�b���\���(]-M�����m�j��CUM����/�k�����Q��0��=��R���}q��^��`��[���P�{����tZ�*/�N��Mk�nNU,?I�Ea����W�c����q�3�`��=Z`��S|w���|�gA!�Du�R]��6h��c=-\�}�=�H4���#mm��_�v6�b�on����e������������{s�������rm?fN=�Y����s-�p��CG���(U�2��8q�/t�4��
G��5Q�D%�P7�y�^��5F��ch��&N]����c�k���1}���m�z~]<�n}���i����n��x��.�SB�J�������
��u8wr�����t�z����XhH���c%�F���9�,�����TNT�����������=p5�L�laiU�+/d��r������.��/o�6�����}0|�C���aS��<���^`�}���wc0x��Dt2p���F��b�Sf`�3�	�x|�4+D�}���X���U�hv�wY����
h�i&�2X)�T�;;��}�5�����W����
-h�C���B�������L�"c�/�����������8n��H������(��p�d>�O�`��/*��b��p3l'UVDi#�
���VX:9�+�����VR'�<�+���H����a����D�D��6{�^�jKI��^����G"9����m�bZ�)�#��<��@
�3xA��M_���#�q�!0��Z0�!$8'v����^���f7�h�R�Z�H��'�A�G#��<�+5�����Sh3+54�l�!
U���o����l�NX6%�;~[K��pt�BLD*�W�+K�F�b�6{�q ���y��3z�5��%Ropp��qZ��Kv�����nZ�^��a���D������y��53��H
/05������3N<����T�U��T����8�N<\� �K/��ZW��Jy�G��C�B���;�8��v�.��C�}0��)-<
���J[U� ��~�C ��'{��
B��h��|�}��+60h��Kw�g(�����J��S[y���m|]���Y]0�%�$����f��@��k������`�S���MW�����6���l�����8�?~����x;f%,GuD��g���+���6��p�~�8��B f�����1>��D����DJ�t/�O�
�k��e�y�>���u+ ��>{^���v������QP�0�RuH	�LI�u����oJ @�j�q��S�q�+/��ro>���}�m�M�6���B�^���Di#�}������tz����6E8�0i�!���9~[�M|�fIP�����O*���H�k���c���gU����#x�����{�"��7Z���t����Z�]��^X��#&S�
�G^KV�B4��?�E���lE��W�<6�+�U��Q�����T���EA�c���.����2����8���*���d����>���U�=06�B���p��Zq*���&�G������3����hM�
�dL���Dtk5�������:%����K+�����T�^��'u�84����:�.�@�I��@r8�KQ`UT�^$!:8�u�8�������J��/<w������k�0
���i��K#8��B�����^H�������<�J �:����x��T&hw|gD����BaG�^��xHu��n[
�����D�$��`Ag��9, *,���e(�>���t]�~-�����I$P�|�S8$ 
�7wU�K�#�&�?H����#]5�
�dL����V�\�&4��y�)WI9�)\�D[2�ij;�+6����Z�#�M��!RxH���h��	2���E�T
���t,��C>�HU��}u���S������`�
�$��9�`
]�8G�EZ���Yy!7x!��U��L@=�v��A@��)0�>0�_�������������j���<�#� �S�` K9���uV{�"U'R�``����l&�S/0Ugk5�.saJ�}�6�	Fb��1R�1%��Z��d^~����������rW"	}�4�^^�f-g���-���Em���c���}RHp��BBB�XV�e9��sg/�ej����#�]���>����?�k�D�L��������6�"�1���	R���m�XE���?�qh���R24!U������
��Sy�H[#�6���+.�����{^P��*[��~/�r(!2:zv����t�����f
j}/P��@J�M�g�x�Ml���(-�)�5l�T��3�<��n!����)D�)1��Z�SDd4���=�q�����z_���p-���5��d3���0Y@x�J���u���^���>�n������<B�������������v���6����������/h��Iy�{��[[��������T����\���M���f1��|I��� ������>����oGJ	)bxa�cR^plA��8I�u,*`�y)�������������Jq��.0�6-U�����}�^�`[c�,�x ��`X��}Z�R�	/D%�(^(]�5������]e���M/���������w'�%A�www�R�R�����o)P�B[��]���C �C���f�	!$d7�&�����;zfv��{���G��tbE�O�l8O.G�^?��"����ZB
����D��#7��[1�)[������u�@C �������ncx�:���S6�����a��U�V��Mr/t����w��z�<��e�N��`k��2�k���=��������d(/H�u�!X��S��)�g�w���@���Bf ��������$����������p�b�P$x��j�P�}�����3����H\>�
MZ�`��e_Q^ ��{�OT�-U�Z�c

�
��U_0�A���G��Cp��m;O&�0A�H�����/�S�R�6A��J	C��[*94m5G,��#���+�Q��n��R�@�����9}l�]q�
�F���J��ac�KE�4��&��szu�����!��g��x�T���!4\�����}=i%���H�nI�?��'i�	o��i*%
�2�kTT����zi��#����8�~.D��1�������P^���f�c���q��Bt���_aHi����m�/-6��!,�/�����T?WN��&P��1.\�<�8������7��X�x6�&yK�[�K��v��$��+/t#0�mY080�G?���C�����%*����p�m	����"a���TM
BA�{
�zC�W��.����2K���fA�E����C(�Lq�^*.x@��<��G3���)�h���aB�sd<�+���W�c����ui0B�� �E�TxA��y7k�� �( 
�pp��s!��u����2�'U&����S�#f"�RY���/��i'+*�$K�������KY~���e;�?e_i� �D���/��wU��ZC3�z��"U-�"e/t�U�����^U�W:�i
^(�\C�)E�J����?NJ��E��}eX�������!� B	��� IDATF�����<�������k�u���f� L����T^JES���AdG)�R2TEXL�� �1��{�QR��Txa�����bO,�
D���eE(��{�:�-����-*/t[��_�s��<���l�e�2�U.x�����v�1��V:�nK������4��x� ���#<�0'
^�@��h���r�#:��.��+CF����!����?SX�������?���
����B	-Bp���8���z�!!	������h�cCYV��:x����J���K7�b�0��g-�04�����~X��H��e�T](F����������6^R^��
s��CKL��N*/,�c�5��[U������7������Q�Js�{J��~���P�m�W|	^8s�Tg�=m>����kW���G1�mc��P��4M�����P��-��$�+R��#t���G�$��C���X���:��Qy�)O�{��(�MR~�'C��^8yq=����'��:�;y_N�6��ZPy��p���`i^D���T���_f������^�q��~��r/A�{�	�Gg��J	��B�w�!�|��4gx�'��P��1�	����@g��J������OE��lpaa8��`D��:�K1��:���7J�z�'�(�E|��,�Y/�B�_�u8CU�������!#D���C��K(0��b(�����O����L�Pe��>�@�7��1��,]����x*2	 ���@�+���Q�M��B���PW�W�� �(��'�KS��s��c��0����#S��6�=�$�2����J5a�1�f��TE������'����O�b��]jc#���T��H�P����!=� ��������c,!;��Q)H��D����
`C��A�G�~:q�fT^!j*��s�H#}*����>���(*(����99���a.,��%U-A�4#� �
�s�yK d!�TFx�����!������%"�P�����T�`�"�vCg��=�v���"���|}n���e�!^�zy���+Tl-�qm���%\ RF��j]q��f�?���s�W�m���~
�����##�� ���oN�a1��R���E;�7�����^�D��kT�l�j��������*��e���z/��=���{�\����QG����7�q-�i{U��/h{���~���D��������
|����j���(*����C��n��d������w��i}���S?|S�
S?��/�*
�$��
���u��|��F��������!	�a����
;\#T��2x]�5Gc���ky�*97�R�m��:�B��P�lu/v�_��l�V���������h�{6��f^x�Bge���(���O~Z@Yo�im�����_����DN��^���:?4���>�p���h����������"��!�y,\:����G����lz��}������f��o������#46
J���[0�� B
��);xa������X������	����;�O���nw�s�F����<�� ����/���-R	]K4�a�ERI�T*2�sn��g���o�� BL��=K�d
������9OC������Qy�i�?,
�q>��lg%����J�-��:����P���X�p|1B�1Uy����!$�J�m %
��D)w>�Q*Q$/����?����s����R�7��C�Z�1.�Gz�f�a�����++x���5�!_�/�<�Hfi�B�N���|����eJ�Z�dN�?��mxA_�����o>�*�5|��e��)U��:TdXv�����_wA����������8���SV������zud��8	������o�t��c'�e��Xx���(�e�Y)/��`���������g����a#� �;���2��'�����?c�����������)Qi��'��'����/���Q��(.�����W���B��M	�+ms��?��}� N��d�� �Q�!���'C(�$�zA@q��-����PD��B�3�������K�
����{})����Pi0D����PA��
U������k��2���,��b��Z�{�D����}���$D}"���^xX�l������Z�Y�2��	%�H��8yt%�P�����s9,�c(��B��
&b�������X�P?I @��X���������CU|�`*O�q�B�;�E�!�s*��}���cl]���'D�hGT����g�����JB"�l4����-��AI"����_����K�}������.����V�0�c��� �n����"��DG���%�����z<T6x�#$t36Kg��?�R���m���o&����v�m���t��$T|����!C:����P8��uQ���_(	�X�"����qiJ�,*���F��������T4��7x^p#d!`���Z�J4s����^"�"�D�)�@��R�ipb�z0���=~�D$���Pku������PAI�LU��HJ�wj�:R�zDzxA���*�<A,�[�W J��-4�W�{Y����@1�JuZX�q+i3�"]��_�5��`d���+z~�&��E(;���#�A�8QI�N�_1�T!��-��(���B}A@������$:^�Q��/�/�+�1���P	Q���������e�N�������8O�Kxa����k� ��������DS����G�4����=C"���p���t���)�J��A���:V��d��
^x�������3$`ejG��2���eq��#j�4��U+NN�

a&��AU��y�w�� N
u��5G���0c�8:l�rOL"4�,���O��<���� �	sck��p��:���>��]d����~�p���_�1e���hZ�~��t���h�e�����L��PEz���,���"��)O/�����x���!�@��:D��gn!t��4xA�*�|;4�oz!��yX�������
x��]�s9x}��)Q�os������&��]�&�nY�j�x��28������ok��
���
��0RBI�Q2����#��vJ~=~����z��v3.���"t��w�)�E��O���u��i�B������;����=��������
Z��0��
Dig{���7���'��Y<�-�w���������J�������l����6�Ee�kK`A����u���^���6���t�%��q����3&�[�$����
���x�N�������3K����*s�'��S�5����i�B$e�Wm��5����LE��X�Rf��%:��s�Q�"�g.����N���0:��\�nm�p�R,-��0�T)H��R^8vn��oI��N-&����i��3�;8zv�jQA���h��})w.���)���@���B���Ce���>|�0��}��!CH�R����
���������,�R�Dy!���k	�q�vP���S�Q�:��R�_�W+�7���Q�>TU��..��)��8����q�+BI����|��V����]�X�;.M�a���7O��H40���$97�Sa�D(���Rqr�>A�Tg�������3��P?��4I���$@� B��9F@�Y  '�uuO������&NI��o��NI�i]�s4��yV�	���;�.��'$�^yA8��1��j����I�|�'��`�vcF��Te
��]�!$!��#��a�������"�	E�!���
� ?Gh��tU�W^}��}�3��t1�m8B(B����<�b��*j0��P60�W3����	/�<��72�'k#x�~�u'Bvx'���^Z���\g���������}!�)������'��FW�E���I��8/	4�������Dk�	��"�>	eT^�I��\����e/x��#��(��-��`�cFxA|�a
"�Q�A�Y���Y�P�Y]��s���
`��^*���[��^
W.�{7�o�>��.�/����� ���|P�tC*!�b��r4^����p BD��u7��$�"U:t���7&��I��MB�fcp��F�� ~/�e������_y�4�
wM����Cz��:Ti�)D[�P�
�R-�I��%`!�������E����"j����[�D�F#�����Cd�(Y=��X��7D�����q��:M�}m�IO�y�
�����iZ-xA�����1����`����������?���
;`�7���n��X�u�+�B����y�,pbP���t���8c##�!3x���'�v�<Y�Hv3�/c�����s���+C��}N������5���	-4�|���&"��0�W����wz�����4��/������t��o~e~������������o�������VW����'�����j��a#4�+;xA�������
rY����mg/�E�^6"/��Iy/����X&}�������P8=q��i0An��X6���}��x �J�J�j��������SxA���������i���s�@�B�c�v�a0������F�y]gV�B^��.��m�:����i��K��
!
'l:?/�U��{m��\�^�d6��{X0=�^(����jV�Ba�2�
M�2�Ha�
��4�[����M�Mp��`�%�|B�~��R�Fh�nQ��N RQ*fd��k7������z�u���&��;=���]x�������;�g��c^��]Sk}��{�x��^r[�2?���v�+��]�����:�s�����t<
�����^^��^��x!gv{J� T���F*<{z�����E_���|�T�T�f�p����C������b�����P�����T�m^xa"^�v�d���{wT(V[*8U�"�I�rk�7��/�b�x!�{;��� �\����0��'�V/+h����
/�U?�z��
���=x�U;�P�3����)��0�/�����xA���8+�k�����On-�����h�����m���:�skGm���xxA[3�Y�
����Rs+�B����R,��P������=Ey��1�
�������T��\��/��xJQ��
�
����x�U;)��zkG��X�P[@��;=o�sO�v�KnkW�'��nye~�k����Sgn��V���G��5#������+5�/��nJ)��m^�o����S����|+��c�3�R�r1�
���)E(((��zVW��W�����%�b�Bm�����'w���j��m�P)�F�-oU����y�6����8+��P�^W��`��]���dg������ON��;Y����D<
E�%�<��J����q}��\P<����������N��*L�O��/��.��D�;�;���~e7�����.ur�\f�)����x�H�����F��I���xa��l;�F���H���@���?�u<::f�kP�'��:?�~b��`V��l���NK<�������+mdl�����n�0+�x��sa~�'����3�-C����x��KS�XL�_�mQX���T�qv�����d�P#��_�tN�������ssmp
+��x4l&_�'$$ ..�������Q��m�����O��+B��r���J�d<Z�
nG�@Br�k�734B�
Y�y��qb�o�x����f(����^(�A�I�Kv�z��{�x�������O��?������B{=�����u��+�)�3���2?�������$_�j�!��s��'?��y[��hn��,��O~Z[�����eKKK�
���x
����-e~���O�M��mz�.��2���&h��2?��,?K(����~�-^(8�+-r(��v'HqVj����]���ZP������}s[��6?o�sO��2���p��W�G���m�������+�8+�g���Y�������P�G{�������y��{bn����
�^��h��yQ�2?yaE���8+�c���U�����v�Q�G;v��Z�����{�nJ^
\�G��b�Z 99���o�����I1�-�jW��O��a3����p�TL��|2t��o�^-L��'�!��)��O��a3����p�PL<WBWW;R��0���P�����=e~4�W~�V�'�-�~{BJY��%��2��� r*�SVW�Me~��U~�|����)����Y{��hf�����O~[�E{��B��^i��[@Q^���m'���hw���ve~rkA��W�G���m��I��ZP������}s[�2?���v��M��6�L���G�k?��+��[j��2?��onjWNZ��z�/����m��������_�m��7�d�:3��G+\e~
�������:V�N^��]�Z�(��v'QqVj����]���ZP������}s[��6?o�sO��2���p��W�G���m�������+�8+�g���Y�������P�G{�������y��{bn����
�^��h��yQ�2?yaE���8+�c���U�����v�Q�G;v��Z���Q����u��������
I�x�f�:�HJ��\�qqqR����:�����0Fd(nb�l��w������'�W�f�)�����;�2?�mq��S��*{=�������t�t��o���
��C':0�|3���#��x@���������V�H.��6�M�:�y���'��%�5^Z(���h�K��R��#�:���YY��������T���v��KF�^�V������@��#19���o�x�M���g���y
r<:H��y1miu�x�t �V�&�G_��I��5��4���3**Jf133�.�q=�������:����.�0�y��a�����3���02��{�x�3dmaL���0�A�I�������21��dS<V�ko�������P���k��t���q������];��6\���zq�X7��y��!��II,��8:L�0��=�{��=��t<�
#���b�p|�U����[_Y����L�|���.4��$g�:F{���������?i�����"�{k���hY�5Fk\.7�2�6�X�R����w������U��9�Z��Q�'�l������������6?
��Z;��E\��/���(�C���&��]�#f�-����WBx���}��b��w~��LO>�����l?��Ar�*�����N	�MZ�^��H.��xt��[5Z���p�J�B7&g�<��R���t(g�0��� ��VJ�5���O�����Ttq��`�<��x�>�����NnU����Sx�����v�7o�D�s��|oW�
�t���]��D��mm���������Y"�������]q�&��v3m���F����h3���i��c���u��2�r�p$�an���li�w��zkTFFp<zD�2��Mr��c�7i<
����*y��P��N����S������������[^���7��+����
�����w�x!�l��(����@�^��/h��rZB�rj��YN�
���w�xA��{�d{
�P����m^x��x�e�(��/d���
�P��C��b�Y�0�F
-����+�S���B��=���k�M�/���3��e~rl�|)��*3����VCf�����m
,���:+S��M�p��J��i�9/����0����zU��,���IWw�6��c`���F����-��k�����1���=��{!�vI������������5�B��U�7�S)���r3z���}p��w'��hHE:z@��~+�hT.5������@��i�R_u��9�����y
/�;�@��q{�
���8V���j�F6��u�F�R3W�1���xtd�����pq��E��]_^������K�a���1Rg�� 2Z�C��S���iT.��y����<1gO��^CD����������6��I�j��s�����/f�Q?��������I�9}�������������yX0?���+��oj���($����N7�F�d�\����e4*�����oQ��XZA
�
<��?���E��*l��m�6"����W�B��U�f�b��K���?7���laV^([��Q)��Luq�D���R5O IDAT��Q��B��1�n��Q�(���L�S4�]������������>D�>�U���.�N�����$��������r$>G�2�"��������9����T��Fhd��}l��dzk���&�s����[V����0~��l�i���<��^Cl��>�5�:
��B�Z��[���5�zvS�1*��,�o��?��0��4�l�.\�	�� tl�D�}���0���K�w�?��w��k�����C/\�q=;�V�~���g�z���!"2
c�����5�y�d������F�j�I��i�""����52�gRb&�7�qsu�|�v��L&�~&&�or9�R���@a�,F9 b_.���������k��[������b��_�������)���b�x����n�������s�J����^0����uZ���{  ������������<gGS���_�P9�5My	/�{�E�����C=���+��IS�d�?�����F�����8��k`���~���fk���
^�c�]&���3&a���o�}���mi��[Zx!����`����������7�_��A�����`���}^aL�/<�2
%;MF��c/Dy�B��M8�������p�����yU091Ov��k��s]e^�?�����v��n����B�~V8�>�<���|�r������
^��q��e�������i+�F�Q�����C��F�q<gBa�z�����q(�������j�eP���\>�V���)�<�����nU�[	/�0��~����*�B�vW�z����X�MO��BtL,�^����i3�/�Uq��=�(�R�+��>�
�p��m<�����_ v�;�Q�{�����G���v�<|=eL��,^�m[4BQ'{��El�`o�cg1�7\�vw�=F�9���YJ�7���M[Z���
�Y6�'J�_�����j>|�x6p7�ig�� �>z�0ie��k���
�n���C��h�X����E.R��
�����,��|�3Sj�"e~�b�<�T��<3�V*R��YS����I���21@PTfz>x�����`h��'��V���(�m��#���*R=�5�;���{�
����X������g<y������WBx��W����������
�B�ql�w���Z��3[g��U�X�y���<W|������!n]��R�v�����<v8��$���q��`lf���Wqa��(R�"j��)i�u��z�I��H�Q�R]��v��bHNI�������

��`n[7O�����9��R^H
��3�~�$%��Z9�-���[�oo�w;#r�'R��	t��m}=D���A������<f���hX�g�wC}Dm:���X:��`��b��@�u�9mf��	���K�]+s$���y�V��uI������v�"j+��K@2�0������VGy�W�����*�����0�jc8�Yb��k��
��*
�#%����>��Xi��b��-	/��Yjah�3�����%g����HJN�7'w�����n%����OI��q�`Z�����aym�Gc��p�"�����F]����M0��&��u�JO#BP��#���9�m�	_����.�h���c��O��tf/\,m�~�&\��!�;�������Ju������C�R�Q��~�x�9MSV����9�����DA��#`�ETY3
�����u?������<E{���NO���o��<P����;3��d#O�&���N0�6E�Uox�;���`��t�t���=��P^���M��x��6���5��Y#%9�>��R_t��a��V�[{A;�������=I�����T^�i^zfF�qU*0�����	��=f���U8��!�����������^/�A��sL�T2�������%�~�C����c������c�M���	h���T[3��h��|�>�Q��i��#��-mx�.���2�{�d���;v���a�^M*/D��x�f89�3��	���nI8����7�[�?�;���+���V4�h:?3����s�T^(Q�L�y}������v�25���6�2��|
+����U<k�����a������c���F~~�sF������/Y�J�����h��G�*p�N�����y;M�Y��u������������o��\���h������?>GX�3���:������p�M��Gu�-����@�����!|�&���r�Y�����>�V-�jI�![�����##`�w��M�(/��������f�"f�e��Q0�[:�f��U~����`X��ox#%6F5KIxA����0(���M5�$_*rp�3�X^�f>��a��B9���6<t������M�����7r������@��G2�#,�7G��s�}���@��XMT���\~��Ac��<�;����4��8��
���(�	:��aU�����9H��&�!��$���i���12���s�D"�Z�m��9�x�2�i�H�	�����f���{d��S�=����f�)) �;/��7������N?���^W�l5�-	E[C�s��
�2�`OE�';U'NM�]���$D����r��0���s�0��B�J��>Al�<;�Iq�
z��\]<������u��������W���4���vR��:��Sc*�,���?d��D`
����gb������I����a_��������Y1w����$����Y��}K�-��=$D>���_�Y"l*��$�T�r��u{��_�����`W�"�|��"�����|-�s�P�,�j6��D����%;Nx1�����q�0-VEi���J_
�,v�Y�����_�,�e/jT����e>^�M�Kc@�Z8q�!<o���6��|�#!�o3~�?l���z��9cj[�����Xq�ZW)�n�<`jd�/���3>�}N�����VM��kv �{Zv)3��Z.%1�q#>�b��C���?���

��6dW%���6���!��0�=8�;VE�P��)������(4�i%�
�O����|>�A��8�%e��lM>O���P_
��zV#����yq�n�m�����r�q�
0�\����ge��`�QI�3����z��X���0b~��Ms�2�����']�[+�7pv�e�v�	�L@���J���m��[��5�����/������`7f�z#|�N�;8��;|�C7o�y��������a�����������B�����l�a��;���G�^�#	�];#�����'�aR���}9KV��#�V���!�wX=�����D�+���.�8xN�dKAm*,Tt�G$�=<���M! ��x�o��Q��z����;T�MH�������GdL����������D8�E�Rz����WA�84�i���^��P�������X�-!I�n���0g�s���R8z���U�Uk���E��� 4�e��u��,�1sy0�;�cHg�8��P������6����������Jy�Em3<z���g�����QyA����
H6|����/{�`��M����yU����\Qypv��k�}}[Nf��~o[����������B�c��E�<���iTV��-�Y�=k����g%������>�<����p��)�XXa��?������9.?���voB�n��At:Xs� ^W��P7eT^��R�����w8�����jk��5/}&���~>Cq-����y+C�	��OF�*��O�����75���������s��]']<NF�F(Z�s�F�Ly�dC4hk��d�[{}�l���bq|w��Y��h��]x��>������Z��4��w����C��f�|8tj
.��f6��v�l��z~cs�Q����c�{l��Se�Jy���?v��������Al��k���D f����z���Fu?��?�-�TKJ#����w�A���������������#j���3�I�~ul�&�'[xA��Y���F�������9o_����[�q���7 +����V�J@`�����_�di��a����.E*0��'D8"o����z�/�-������}i��>~����5?��O�����l�H���1���������{�R�����S<M%~(�G�D1'TrW���y�|:q�:�����Z@xa���X4�7c'�<OBp�����f}��"!�O���B�6�|Ya��m!��(����$���E��`7��aP�P�NR�u��wy�k��R5)��
��]�����-�Q�/���
/X����1q�5�([��������RFx!h�G|q�9������vEe���B���������[��u��[�_;�Y�F�������5����=�6y��DiqTn<G�~�r|��s��n���_�$�sg4��
v�5Z^702�7_R[���S�\��}����8�}���P��8�sE�W�-_��]0��N���=��I����c��\��P��o��k��?N����w�x��}C�]��bt>����H�
B���.���=�������%���W\?$�����B������}
>}��,�~��y���$��|p'��E�qt��v	-�<�����r������t��bH�����g�~���v:�m�O�C��8�u���u�2�����Sj����� ��/�'p5���X�N����|Q�V�<��%������ ��W�C�y�j	�Bq��m|V�-V�:��l�k�����'u�`����T�9����W-	�G���V�1��B	:���T���'%�`C���;d}kn����u��}xLhb^��s`5F�������������6�l���U]7x���6�$��n4����%��Dx����%�}�Qt�����>�Cg+���3n��B^�35D��0.n����%q��?��r�
\�
�0-�(_�����;V���
�G7��	.�[#��=i_A{n �Q J�O	A8���S����&�}�\������3�")2N�����������l{>��t���lO��:x�D��p���M�k���~V*���]���G�.�����%����m��*������B�	?b��C�u}�>�����$��?�N�m���]�q�F���ve*����t����$�?��h��;���qR=���O�}�0��u"��aO��py�\T�<����"��K�
&����D�g�/+��++xa��-X��(�^����=���#[�u�4F��
&w�s��p���rp:O��|�8~�G���Eu�����O�i�D�l��v,�<���7�:.:
WmD��_���e������������*�)[��JU"T�������������>��uD��+t��F��u�6�{��O�e�>��p��mQ:�{�
��Kx!|�:�-�����i�F�.?h/���f�#9 �V8r��\aP��+�3<DU���#��S
Dm8
:�uM%�`X��n���c�0��}7(��5'a���@UR�Z���s&��!���T�p�^1UwC�Z�m^�
?��b����I(�ra�-�d���7T�}��&�# w�1�QUUPAd�D}���C7d�	M��.����/����N��	��HU^ �1��g������Z���m��o=� �^Qk�S�9�����%������/���<��T���)� ���|�0vp�c���|��'>������H'�3�sn1���>Z9��tM	/�����v:BkwC"�0�u1��k�X�7�m�K�I�
��c)]�s[�!��37	4�]2e����?@�wg ��Y��S-SG�{�����������dY�P�p���	E�����/%�I�GJ����EEQV��^W$��g(
�*/D�=@��-��=�
��B�`S�,\<6��c�>��C������v��
e��!7���RS*�dl�S�����l�^0�#~1�����Vg��P��H�q��M��+�
�����w�~���Z���Y��'0}`W��uA���	~���^u�I ���G^�y�.<z�5����%�W�6���.-!�U�g��f�nB
Up�7@�0���n����p���|���;w����[3��t�@��x�m`���u	����(T�oJ'^2�_�E���"P��	"C���^���m�p�P����#D=�%u�����aK��$���Hx�%������������	zV���0:�� ��I��������Lk��a��� >������^]D�='�(��t��2�[a
D}�����L�/���>/_�]��!���z@_��\���#t�F�2OA+�zt��>;~���yB�a;�]H�
�a7j8�N�&���F�M!d����!����~P�(����gg����'�Q�I��:��NAXd
�) X�?m���T��%�}}C���t+[BO�U����Y�6���^��'��;��]�S�Q�0D�73���p�#z3��:h��[�a	H��9�:A__��_�^/�j����$DP�Z~�����S���j#�	tH{�����t{(����y-3��&�[}���	�m��H��}�g>����C8:5���k�t ����
,�<<	�����!�u����Kc�����U���Bq����h4z�Q�%&���\~���oo�]�������V�f�?z
���j��>v>�}g}{G���
�\�=�6��gO�gya��c1i��(jc�����y��uSC#�^�Q�����"!������!�0}���bR���e�z�T��2�|�_���`�	4w)O/$�{��2�b	V������p���ly}��G��z(�����
��!0 �A)�PI����a�`��X��c�H��9}"�:�5�����Z��q<�>-�>��V[rr�z��������CQ�R�E�j\������;h����P���N������n�<���'$�p��6�yx�M�����������LC�q��Y��B���qc�]�A��������o�LG�*�]p����e���KK������sd;��{A)��)��Z��V��^�N8@(/,Y�{u����0�����a��a��HX���ujT���m��A�u��HU^H�C@���hP�~���G�s0��e* �j
�3G{q���m�a�q+���KC(2�EE/|���/��i�9����wz���pv��G�r2��f�������z�\h//i��,ySM�R���w�2�tH����1������	O��!f?OA|Za3xB��tj�x��PN�eQ�,
������k��[������b��_�������)���b��F4+S�+�%�� �����I��x���<�NB��d��,�^0��C�^����w������S�Y�,�X�_|��i��|��ft�p
6�����
����y�059�����p�/��P��X<����3_�_���yJO��*���k�����`��Q<���>Leju������R��(O0���p(O"����#+����7O�G_��6;����<+xA���=|�`����tY�������^�TO��6��g`P�
�$���,�����|�����Z���S����@(���B�b�i���A���t��w	XX�����Q�H�E2O��4���[yb�
�H<m�b',G�P�k�� T�����Baa��PsZ��G������?��?����a#�4�-:��@*/�zEh��%��J�7��?I���v�a�bSo���`�j���<EGg�!s.J
���Pu^�!&{n@<�"@���W���� �D��%!��T

��0��Ej���0����������?)t�q��@i�����������UV�����a��4,����?<�lbY�EB�@��S����u����5�|_p%���
	���p��<��97�/I��HG	)���M>�,�	�)��0P�&��<
[B���#�i���>�O��jq<�����#> !����

hI��L�<�	< IDAT-?T^:������~�1L�v�U���j�����t�G�1(R����-�j����
cQ�Fc8T�^�|vZ[xz�B��������X�6���5��L'�	�<�a�����������]�_���>����86�#8W�����$�p��V��u)Tqg�jD�=A�/�����`_���&*���`<9}��~+�MSV���O8����G�}w%�����.�����5% ������T'CS�F���6���X�i��� T���%*5�D���c���}1��s�{������$L\t��
��w���
Y��������D>��'0m�z�6i� ��2����0oE�S��}0r����$���{)U���������M����TE�s]��LZ{�����P����bDK���z)���&L`�Gu�H6"���R!!��}�����ft��_����A9������������'��������Pkm�v�����Mx�r��!*7XMh�h��4�P�<�)���8�� �2NT����-d��%�y���lC�+�0|�3�lM*���*j���a��A��^��+jC0�2by�4�)R4�H �!m�IA������*���O2�����p��x.�jK��A���i� |<���N{�R5��N��]�@��?/$����P����0/QF6N��
T
O��um[�5����s��iu<�9a�����UX����hW��	Ap������A��}*!������&������*1��~W���������C!R0X�T�e�O��r�*����.�
�����������@�f����FR)K�����ep��Y�|�"i)�S���xNh!��~XWh,���$�K�R�A��_�v-��:5�-*8�)3x�"��l�^�����chC`+�+�<~K��Q� ��55�2�+>[�]*G	xA(2�z���������Y����yj�T*5<	
Au���c�j�T7e/���b\�f����C��4��mZa
C$��2���tQ��9�
tpnO�����j�1���x<��z��y+^&�	/����j�.�/�?y��}��nf�tL��/��B���`?�=�`���.�yg�Tt��Pd0,Q�s~�
	q� ����PA�Je$0*[��������g���(��h�K�8�*L����L��w�4� l�6��c��C��P*78L��X�($<��E�&*x���17n"����m��8x���-�]� �.����SG��`��F�`���e���>�&Sq 
��0K,�vz$XKgn���3k�����]:s����{��z�]��� �
R������n{%�E-}��h@u�x�K�*[�1��5���K����u�NGk�~:X�#T�b���He�A����wb�����gypO�^�0����2�
����^�,��qsI�fz����_�Q��>��S�D*9�=E%(
RFxAm�^���'����`��&��(������>��>�v��D%���EO�{.����G�����s�Wh�^��X9���1��:e�Q�hI,?�O��u�����a�*�]�<a�m����	�%���H5���r������?��2TFxA�iZ�(�����'>���ex#3xA��G���7�P��M���Ry���>UtT`C�����q�PZ�U�;I
����mf��>����^0��l��������p%���G�S��
^p-V	][�������7��h��l������1+0m�0��^��c���V�{X���^�g7�w9~�?	|�Q'e/����A���Xxj.=��5���~KG��[mT/^[�N/��Ty�9����I��|^�����xAc;�e��^�����2��$���y��b��n�g�L l0m�B|2a�����w���O�)��UbX��^X��/_H�~:Q�o4�1!��<T��`����'$08�6������|�Os������L���Ts����W��;�i
��`���G
���7�e�A������\J]o�4�������t�m���q���!"2��YP�1�/:L����c�����A��`��q�#y�R���!f@��w*�������)�����7�2?�koM[S���R�sCTr���A���Sw�BHt��z���8���z"|�/O�Q��`zx�v�^�y� ���F����y�������3�8�U�#J$w���(i,��  ��M��n<���x:�
����B�U�S$������S���G��qz/�2�������
�"����|ynCY��w#&"8�=}#Bq2��6��x����
Oz1\��R��D�@���"�������-b���!#D�LyA8x�$v��t������<����[��@�B��'GD���s�j���/���W�!%!Q:�"���Mx��{M�\�*BS��AMG�4x��1����(t!����Bb���]9�������������Rya�����P1Ti���&T�-�"|�?�
��7���WTx��|�� 	k:aS��Tx�{�j���Q��F`���2B�E�vTR�Y�=V�:�����sW�?Z���C��w��S��
��5K���$�1�}�I�*l����!�'��RJ�^0-���T;`X~!�A ������Ly!�kI�{����p��_i���D=��6(b���2TEBP$������KJ\b��
/x����kK���!���������s�I*/l�L��g�����>K��T}��1��,�L|Y��u�|��X���c���~X����	6n���������B��:�2B�W�L�d]&��I�����}lgt��	;'��J�\���5�a���e�zBA*t"�������8z"=�p~�4��8��~���G#����_|?���R�
^h�c4Nn�mFL�����Ix���u��E�������%�o@7���1U(������s���~-�Nl��0X]�S�D�64�5�����_�����qva��*���J)eB$������T]��3H��!K�a���i@B��3���}w�*������'� �����	7m����4�b��	���/@�d$R)��!"���z�1<#��O���'��C$��Qy�|@C��yoi"���V�o�����1t�E�p� �1��hSQ��� �,�`����"R��Tx!��]��� �"D�����/^����"� ���Q�AOTk�x�
��g@�!�q�T�����g�������i{*MXQy�O��C*� ��B]Bz��9K|Bu!C�i���<����I�?4,���<|q-_���`Y��t�G<�,�.�	�������Z	6��#�N��mUaf_U^��@����	t�������:��[�aT��T7u�z.�a��['��1Zs��>c�(�^jz�R)����(�q"No`��^2$����CAv�����t,�?���lYV��}3�v���_JE���R��G7��0"�*��Dp#����F���#�e�T�I�?$3<�}��Ry��(U(3�2��>���D�-��"e/iZK����N-q��3��4�������0{�a��G�o���u�&F4�������Lya������R:B���yc��Z��R��_��qv)3x�KUe��%K���+��:�kxA�}xB�r'WC�3-�iB� ���q�B,<�����Tmb�S�U'���� 
,Z�@��-0tu���P����"�KG>["���5�#r�AX�R���)/L��"NB���(�kK*/��CH��[6G��Y�%!��PO����~�"Hf��d��H
R����������*+RyA�<�n���-�g^ `b7z�����BUM|�$D(8��EE!�����E�eZ ������r��zVa#���������;I*%������-����p��*etq�R":5R9s3S^�}},��a�K!��B�}��GsC�x�{:�O^M��
�����?b� }��;����:�u��PC�*�2�G9cl�RB*����9b�� �:�li������]U��2*/��k3���C\B2���������s��AU~o|d���0��5~Z��j�d��G>'T�s���#����������DZ@��T^�����L�I���Z�������S1v�l���P���D���W�G���q�������;������1b���\vt/�Ry��/_`�����}�T^���%{�Vg���d���"���O|1�M|u�<Bb_<kf/DPQ��'���.6��C��T9�(�{]�_M��~FRuA�����L�� Rz��S��DB�G���P��)�_�Eqb.��,��'�B������B��)�{]��	A���qT^X��W����~?���]Z����?�ahCy�V������0?��3}��L��9��������ihU�)>���/.������NN|7������������_xA����<o�p��[J�C��A=q��iDF26��o��ex�!��!����<0eX�w�tfX���,|T��31K�������"4�v2������Ek0�w'XR**5�<��n���U?�E���D���7��Gk�@�����&�B���p�C����z)~	�O�������u|9�3�/�b�_�}�������b����>Ow�#���D5&���aFf��
3�
����#^��5�8_�����������������5mM�TK�x���Vea���1�I���]t������w���+>Z������^�8��1Wo��b�]&PR����^�P�9��&���%�F��x	���	��@td(���{7O��Y��zh6�����@i��TBa#� R�^�g�,��:�0��7�
	���w(nE��B���[��Z
�������$!�=���m��]�MB�;}�{G��;{��;��
�@O�I�C+>E�~�c�"��c/��QaT `|�����y�2�CD�#�8yb��a���~,�j�
�2V��/�EX��#f2�p4�:����c��E��o�/4c?���+����zv+]�v��t�f������x�v3.S��I���Q��&@O��I-�A�V�e^�^�]�)�q����yce(	#';$���TlO��7��|�j���=e��8nvU@����C�l;"�� ��]�!v��g��a�}%����u��U	w���za��(/��*N�
0�w�vaH�N�{�!Q��C�z�P�!���������"������1��b������o�tE�x��E(�A��
���WO�+'�P�"��B%!���W��q�u=/�����?�0��CK��O�2X|M/^��KU�
	��9���0d�
Q����$@���^/_[���
1�
�	;8s���
�Kc��sx�c��H�1e����`���^ � F�������Q���0q��)e�6�e?�&CF�$����{�	>���O�2oi��aT^�R���J-+�����������3G��
3����E(1�uz;���q-�Q^�6r1�|�U�I3���?�����f+�?4`���,9��,�*�P���Kw�N��P��a���s���]p�\�q����*�_����Vn�����xr�A�����\��l`n�u�s���?�Y�9..���x����|��u��o�����<|�H���(���G�]���s�*'~��k��!H���V���������s�q�O���O|^���`4��S���h���5(V�)��IjM�>�I������~�+*@��+U#����Q��������\w6������/�j�������|�&}����4$�5 ���!����W9��L��	}?Y��1\�Lpd�=�)CM�~}B ������i������2�b���5P��������H��F�V=��a5�u��_����f������Mk����yB�z�txA�!���b�>��hs�-[����r�Tk�M�}!%2�1��P��	<I��x^��<��|�^�����}l�z��^I����4�2�e���<�3>��^W�"	xA�W)��0���������O	�] 1d�5!�##nlXP�!]9a��A���vT�\��`Z��x��/� �<������0M#o/���3w���OyZ�kL�v~�m9K���AEX�����?����K� �������_R�"�I�$2�j��H�iRC�?�5&��
�D!� M���{�����
�g�I
#[~�K�#f5�������g!��������� �Nm�6!�����$�%��3�����<�r)!C(�$���k������
%�ri/B�m���1���_��4��e���������?��Ab,c��C<b�	��e��������_�Q^p����~&���h�4�&��d�_2t�H0��{y$P��d�%� ��u���A�#B9�A<�UW*%+{�7$CC$��	z�@��Qy!��&�P%B���+�1<��!|6,��=��3�����;m�,?CO�6�
��a3vJ
@�����]@5��7x<����������f�/}I\��<�M�����P���yd������������	��`���p������{��/�r�����;Xv�>��%����m7�"�����06�O�&���[�I�v�����s����D,.�TdL��>�0�������)����y�N��(>���EMOO���3uf���Y�U}����6L��������|
�OD<O��=M��I�����Z������������~'�p�H������3$m�"����p������;T�^Hx��[���-z!9,&�nR�@$/��9/��5`E�!)(����Td�`��TD��-���"6oe
{B��e;��]T����/�g~?;9����<i<�/c����������������� 	��3\����/tw�*bh6�E�
�2e<s6����������:	S��='CXHU�,RV����I��������CG�������Z�Rg�:^���F=H������RI#xW3���	�H�9e�=�
���	6�3Q�1���-L�����"":.E�4tll�u D�T,���1m�,��	!�q����-��������VV�+C!���fO$����k�����A�l"������_�+wF����S�B��H�a�����@���x@�����W0F�n{#nr���e!����E����E�_�����.�{cZ���
Rd(���^:��L�=;�C-��(�������2TD�����M��$���/�~)g�3	�f�������">$�����L������8�%����9�g��^��^o������>Z1�����4��By��	~��p����������$�S��)�G�b����R���=�~b��]2���1���
+�������o��-
�|z^�~��&��{&�j�;/���2��}��/#	0�Z�5��}�/\c���w5�M��&8{*	M9_M�^-���j80�IXh
�}L��p)��'�Q�9$AE!7w#x��2��T6C��Vr==�;V6�^8{8}�8b��HT�o5��Ul>7g�R^�����b�@�C�WOE�2
������������}��ep����4\���'^0�\p�s��k������3�!'������o.���-CP<��R^(�6>nC�����������txA�1�����'�0��[�A������e����?�3��S���^��T������T�E�T��J���p=t0��U?|�6�����4��Y��w�I|�{���0��@��5$<���3��{cP��C��&�g�Uv�v�J2lDFx���[x��7f�_�i�Gc��Y���hYF�4XYZd
4�.��|=���B���y�b�� ��?�A��Q��5���#!T��|J��B���%)����9Y03x!�2�����<
G IDAT���n���W���������ukO��n����
���x�����yx!���]�y��k]�B����W����QxA�:k��a#���Y���}��1lD^�������ud/��cI�sv�BA�Kx� ���mg���
%!���f��J
�!�
/�>�E2�b�M}I���	'����
C��u���f������G^������3�r[����^x��c��a#��Y�����n+;x!���w}�����6s
��m�����Fd�NVa#������^��LN���r*���Y��j/�������r�V�9xA�z�{_����M����1���������?���B�"��ZcH��X�q��B�����c��r-S��	:���Uq���+Sx���G���9�.��0fh�9x\)�������;g��]8z�<Jz����*�.������8x�4�T,��m�k�L%���xA��W6+�k�����'��oy�?��onk/j�Q���P����yW^������&^��7xA�M�Y��o��x��l��0q�2f{2C>��i��/WQ�R���seQ���K���-��]�H��I����/��+��x!�l����R���U^�T����(��yoS}�X$�}M�_�@a��/��#EmsO�~�KnkW��[������7��+����
�����w�x!�l���?(/�����-��y=�����^�?��K���B�[�p��(/�F������k�o��m��������v�*���IQ^x�>���5~Y������KQ^��^y�[����Ju�
�
��_�+����onkW��[������7��5�(��fF(�Bn���+��ygK�&^x�9��/ZM�^f&�\^x9��R
�PX=���R�^��W��)�B��?��x!{)����Q�^�iM)l�x��yD��b����/���t(R�6������������C��t0VdU���x�&_M*�B��EQ������x�E�)�����eK(���Z�p�S��������/(�B~���lO�
��9�����H����/(�B��J������Jo��2���R��s}���NN�������!;;����"�:W��&�X���YY�<�l�(��O(�-?��{[
������X����l@C#Ch�4>�A:��bn�0��d�, ����C��Gi���B�l��E�Ov�Op�����Y�O������������������aaaSSS]�����(j�0���R ?��K�����5+)%�����x�8�U���u�t�9��?u^�-���O����^���`�l��^�����������2������O\\8���
|�������P���	���a�������'c���
�1	)��g�:}�!/�?c��QT�#l��b������o���I
�����s� I	�:�M]�rj��������0)y���e������xn��aJ0z��D�{.}��d6�T�{�����T�1�K=�W��x�Of\�BNU����f�6F{��c������<���,��P�6x���l�lV�d������`��S��r�P�^/j�Q����O9���''�u�?k��Z/J�	���T*UN�~%�+�)�nR���'?-P��[d�f����&?M��������yR���<1��*Q��7�������]CO���^+P��W���r�?�6�KW��/m:�`Q��/���EmsO�~�KnkW��[������7����=ae<���-��G���m��rkA��/J�{�J�x�7W��f�?yaE����G��m��fen-�����k�����'��o���e�R�s%��+����[^��~����_%���uKQ^�����E�n<D��%
��R(��H�`33�B�����}Q��07gl�"���n'*�Q���(j�-66VJ�����p{R������@Q�o��Z���.�J~�6�m)����[^��~���������+��ohccc�5��5+��Gc�DS�^�h�XD�O>[�����w1te<:N�|���'�
�cs�t4XfW����JUE����~������}s[����ZP�����������G9i�������k�����'��o������~�JnkW��[������7��%�������xr;��[^��~���������+�*�L��
�x��R��Q�Sp���e�?�XI?yxA?vUj-P��:��m�)���|�m��rkA��W��_�������'l��'�3B��������]�On-���EisOXI���J^���'/���:������Y�����[^��~���������-_���lV�w���v�?���~�+���}s[���^�����E������������S-p#:I�2U<J��K��*^��%�+��9Y�`�+�)X�������,T������J�|

����vr=����'��F������A����v&<<�����"�{��gZ.��c};���y�G]*���dl��jS�����>���]�"ott�-gbb�����R�]���^���O���z���q�y1����>�$��;14<O��>��]���<`��'zQ��wf�9Y�I(�
�)�P'�j�����h'��J��?�Q��I�R�t��`Q��]n\�W���If�d�����^���Y9	F)zu���k<�>�|���2HF��k��K�l������UA�3����H��]7
�x��C/'�0�tV�����K�d��_C��?���	4O�x�>u��c���<���������W�����^��(�B���J�����a7�!��"��}LU����U�1M{a�w�,��J�KN.j�{�xr�x�^W�S����u�?9Y�`�+���������������gJ��%�����������yR��*��*���U}��{���Mz����"��gf*���}�G���3�k�;��h>w���%�B�����m��UGFj6��_���;B�\8�X/?\z�J����7��_I�N7hl��f��R�^,PVm����w�<���	�_�	zq�+Viq�z2���:dg'�^	)����n����aqyY�^�j<��I�C�/�kr���7^�x��{}}1�7j�n�[��E�z��DO���~�0��4^���V�}�-������Y�_���v�?���~�+���}s[{Q��/hf�/���(��x�`}��k��[W�������^(L���/
��������yc��Z�/��3
��_�*��f^��^��[�2��/��,���Wi�_�J��^8{����uS9�1�}�_��SS�����D��m����{q��-���Z���g����GTt����v8~�"�9���D�%�{������W����II�0j L���������u��v6�/�����xA�~.j�{�x�;_r[����ZP��������]�4�kx���/pp��c^^�O�?���a
b��M��O�����(�q�0>��A�r3�]�*�]��l�zo6j����R0/����`ja��I(Q�vF�t%��y��`���r������=j*��N},��+Lm�qs�B��e�Y��B*eG#V.�u����v�����qN1\G,���\Z�D��;w6]�����
-�`V��K����^0+��^>���c;K.���J|�A�#��n'�����n�70����d2F��\���Z8b\�~�vb�N�2f�����v=,���t�qy�K��k���f��o7,�G��`�_?��{��*'�k������I��?r������y�"����u��W�Bbpb���U����7��~�kW���	�.���I����vM����'m�^��7B�:�
L���!����$g�N68&O��i~~�=��a��HDGi�������"�5�+�O����	Z������8��N���7����vlz����!,$	�E�v��s��E��>��3�����B��\�kn0���~S�g��C����K�:�x����0vs���Q�	��#t*�1s�?�`��=�m ��c���e��_���P0����$�C]l;����(���!�2�7�����uX��Ceg�k�����F_v���zM��L�F�
^(�h���J���H�Z�b����tC�����B����Za���q������H����S(_3)x!6N���Vc����8�;����j�i�~�.�����fk���.�����'���e������'�BtL,f�Y�O���������w]x�9�����<�+���u�e�E=����=�ub(��ZP���K����}s[����ZP�����������G�43"/�#cS�����~��[^�	�~g�����AF�@�N�5����9�(V]��	�qly	/�[��=�qy�����{���O��Up���G���PU�](������� ���[�B�6�^p���nAU����L��A�a���<d��������B���q>�n��_x���j�,���*`��/!&x�rH�,=�^��<��o=��V���m��b7n�y��P�����
[���888��Q��=Mp��nE����7�p�n0����>��^����.�""<���c����
xi�	�a��<��sy	/��t���|���==��q=,:uF���/$��"��1T
�u�aZ���/�p�Kx!�a�VN����Ca����:�|�%;T-������p�N0J�X)�B�{'51�K��v�B�oS����Wi�_�%�UO��b�_�<S'������'O1�wB�1nx?<	�������T3��VS� ($�)�h��q�������b��]a`sw��
���K�wsqD��-������R�$��N�N�a��c���������	������E���P�'H��Y����w3��������������1)�so������)�W1}�b�T5����^&�+Q#}z���?�]���w���i�C��di�Wiq�i���=e<9y�`�+�)X�������,T��xAc��������T�&2��?'�Y�wa�����W#2�>��C<�^8�w.�C��`�������V�����xv�BJJ
~$�gkkLl�BU�id$:V�����{)<y3�iS����{���[W���+W���������j���q��3�!��k���D��6D*���v�+K���>>�a�|��3N>x�=7o"�����9�<y�=7n���������Y�_�]��w1���t�������e�}����
I����uk��?�J�E����k/\��G�d�)0lT*mM)�e/�K����]Tjk����;����p���[{y��{���{e�G��&?���7�!I����T�0��f����������zZ��A�S9Y)/�x��{?���l���G�r�BD>�����F��>��)G�2��{)I�h2m6������������\f=G���������`Fe����qi�L�n��>ma@����K8U�)�b���X��81c
j��Vn�i�d�v��S����BrT"�.�u����E���m:����{�R���=g��	Dn_�����_2FsJO��
SDm\�*+{��u�NH�}���[����� 5�>�uC;���
��c=��B�=lz
A��UH��Grx,4�y���/��ah�����T^Hf�D�6]�"r�ry�-5.&%�������w��4�U�.<�W���rL�0����k���O���l7��e�'#�o�v,��A���0vr���Q����|Y�����}T{�5C������H��7��O�`���l��+��?�6J��{���C��p���6���q���P�vC�I��s��/����0v�J"���S��}���c�������'�WN�\A>�;�f�����B�*�Y:a���0V�i�:020����/:>���9v=:��}����Q��s��p)�FT��2����������'�W�.�����q'��T^���*La�����k�M�F0d;3�-Bu���wc�������KP��FV���Q(o_��|�Y'��ON��6^�x��!B��w�7��������z�9���I��^����k5Y���s����df������?���=0m�<lx�;��o7,��f�����{��%���������;�=0o��������0q����=�e��������0s�?��Y:�������q����������s��r������W�I������������UA�5_$^~��u�OR�!�m`�����:
��>007��Z3$^}��W`R�����i"���(	9X�K��,>�I]9c����u���y�����z�������HfYC���v�Q�����Ly!)2�+f"������j"p��0q)��!t�\�������A����#)4A��������4h2��?mRv���� �����y�N��)Tb2�U66�?|T�M(,��/��<�����}�m���:�kj����Y��H�~	�� ��-:s�23��D2tv����6]N�����WIS4jj	~M`��h�D'�� �'a����,�	 �*�hN�w�m����Q��
�j�#���I���.�Z�����!N���[�h���V��9d���[��P�eq�Z<:t������q�p��p@PP\\M�eCb�N�K[�����*+��S�-�XS�!�)���o"���q�}�}��f���'c���M066@�n�r������^��V8��
�3�0aS\�'���o�{wp��-^��g8u"��YG�eA�������Q^(LXX��}�����`kg�����-?�K�c������73�z�!��acK�-�d���������O�H����?L�-6f�@��`�8WX[���8�]���������x^�VPI�����u-1�S��g�/����1C��@�2���1�l���Q=�U~f���n��uZJ(���(�� |die��W��ks8�q�G1S����q�#'��1�R��(�
{�~�tV�>�
^��1���o$���!T�8Osn�Y�JS+>s[
B�_"*�X��/���r�|����{n��<�����UyA}���{�
����t��O��I�20.[���]����|�N�pk����j�+�:U��
�p����r����E>��n�"�7rv�:���bV���uyM}���8��5������������U�����M`�2G2cY� �b���Y�z��8F�!,���]��k$��$0��k��-�>������E+��T���AC�V��i��m���U�>�v��v8�j���z
�\���� ��c�l���&���<iI<G���&mc����wZJ`	W��;�J��B�5�);x���D���(�h.���u���	����g�x��JH�ZIc\y�uB*����7�u��������	.�O��[����~���h-�f�K�)/�5(�c����g���R��<�!��������k���o����`�`��Z����Q�k
��
CB4��qh���qF������W�<���o��'a�h%�{���h�����k"�z������,ob��+����AtZ;
a��P�
��[+��%e���hm����1������@�>�1<��g+�bZ�Z���T��~]�����������������NB7��.9�R����
��M�x�m��.������
���Kx�U�3S^H��B��5|�J�y��0�T!�����3F
B���H�b�����
j�,l���"��`]j�[�f@CU���h���G*'����p:[��cW>K]|���D�7,�����w���DP���������y$���A�v#�rmJ�u�d�����khe����������0�3���N"�rPz=�l	�%��7�3��8a�Wi<Z�?���Wn���;��e����f����
����nff�ek��~�j8O�{[�n��4�����;���Y����75/6~�c�TD�����3Wg�b����� IDAT��i��-�	'G{l�sC�j�o�����g�?<�����`jb"��}�O���
ukV��L~O|���mm��s�q�7	��p�N"W�^��� \���[O����^K7�/�9�]������;�?���Em�)��f�d/�`��G�����A��vz�:�.o����~DtD�t��k@�A_a�����um�kv�B�Z���7cF��OyR��?��!���B�����1�W/�
�����T	?D��1��b��_^��0`�Pc��]�W���v���8��s>k�aYt�Zs�g@�&�P�����L�s��}�%��N`��/�7h�1"DD���l�6��v]	Y���	/<
�^C�B�a|	��V-|�{7z���g��� �	��,���������c���[���N���pu[��a�fud*�OAlh*��4�������*C���F���xp*��p)�U���0�cI#�=M����	������D�==h����{��k�F8��w(��/�B�I����!����
�����I!��
���E�V�pq��^h������Py��������� �������v3�b���p(Wv%+Hx��l��������;�
G8b2j��!�O���v��b����k�H���m7�/��y�|4�#'��i�l�@���|�R����!���'XJ``��x[^/uM�V��DA8�5�p�X��
#���z�#��1����v�H�D�#f�v��zQ�����Kg`V�/�����g9l�F(�s�!����s^�=u�/�`V�����6�q���[�v�o��~������������D��
U��P���0"�������B�z�q���N�L�e/��/�C�M?����<~�/�������_����$���C�
*O���\��6Kx���O��@�/�)�G�8�"���r���}d;��.������H�A����	�a�d�G_��z\9�������$�}���j�}�OaB����?�T3��������� �������:�0��
�$�Ixa����lnO��u|yr.:�n��w����#���f���!�!T.��uw���aL�`��x��������C9���bV�����o������~[��x�9->�~�i�������N��f�Xu{>��&V�����:c��-���?Z}�����o��b���(a����P��-]Sf�����5�f~�N�c��cX;����c��=1�i{L]9=4't�P����	�PP���(����na������E�����������w���e��1�c,9���>&�E�z�B���z(����� z�nq~�PV���	��w�������x��gO��A��S0k$��($����B��;H���
��
0kR��or����_��@	C��8SB
"��e�&HdX���3wa9��vq#+2��[!v�aXl��Y�4��� ��n��^��|�w.���`�\8
U�*]�\�|���:��}�!��^�+I�������0@�!��������5l�t��������g7B���q�p��U*���e�7��ySn�YA}�0�[�@��0���I�RJ0�ZF��	�,���!H8{&5�4�*�&6b��:����e}F��v�^��b�7�i��|K"H`��K�P��u���E�����Q��9�����-7�l���
���f���<�/R#n��8#7��o�����j�� x�,7�E���������q8�+�b�G,�+e������)<�O����8���J�A�]_���5��o���7��$�p�P7����� 8�M���d�(eJP#
��p��i��n������F�:�B�����?���p��<R�����w{,�;������{�2�>[	�!�_ZM<-2�/�n`�*5,���`4�����B�`�4?xr��mg;�9+P���#�p�O��4D�#�v�w����*�.~pq��"���~����<�?y����Q���J���R%���%�����p`==�:J����.���w3k�	Q�'D1�0���!h��sy�n}��I������K(A��wF���x���-z�u�������v�8�+�V_|��M�q�m������C~(����z+k\������"�����c�yb������u�]�m�D�\�}v0C����^�;�1lh�6��+?�MYBWx!j�_\�z!��u*��)�aP�4E�1����:������N��:u�����2^0�o&cOn��P��D��30�Q��%�,����Y����[���o{��������f��a`i��
�t;t�P���ATw��6�Q]��*3�]����
0�a�b�a�����v��e�>��p���n����b�n�en\�I��0tqA*��()a
�B@��A����!�S��2�B�m<�wn#��S����!�Hh��Z��;39$���a0)[���f�{=^H���jb��'�]r������&�_�L�J���/'�V#�u7�Fw<:���
?��]�b���is�U^��������
���]����P�����,dz�6e/���-��z#�n���la]�;�� �`��
PoJ;��a����hnJ��+��bv6h<��a�b�h_nZ����2��C��e{���B�~��Q0w��D�^u�=j�[+�����1�otZ3
����g�
�������_tH������^9��|�k������om��s�}J#��[O?���U��*�vXJha����Ow�v����jc��;p�5�H��x���������I�0x�AB'v(�a���4#rJ��q�%��G`�-C^&P
���q�p$�=A4f���P\gx����XN� 3x!%&������6�yo��}�������B����#�Q(�R�.C��8�z��!Ci�|��������`3�1�G���yD�}���!�f�*cY6j�YXu�E�"�����k������|�u�D���B�(�B����E^X�u*W(+�����9�����0o��'l�Q����[TKx*�9P�t��^�k�z������������2��!����?��K���7�B��|�VL5P����0O���H��PK��6Sn�����d���2S��-�i����W�����\��M�����X��=�}y^y���o��Oy��o9O@�'���������Em�RO�������xAc���W�*�n?a�pd�,���c�����5�����wA<~�d�M�6�>��ES������os
q���N�4-[��� �:�E�'�������������k�����F�>��i�� �Q���� `��oK����,#�F��|�Tq��B����Q��	|	W�'�<x-��iz����	*���'&:��{w��$NZ�KOq��T)��i#/�����1������'�}�n���-[��D0O5	��71��0�Q�?+xA()0!���B$#!6�����h4f�x���@C�^��D���`�������
K������D������1J54���Y����o+T��Us�B�QS�����4�s�:�����v��~'�d�.�������j=\Y�j2���9����:�Z|�{����"�j�U*-�?�c������3�cD<b�q����a�N��zl����9��/d��Ik�R� ����8�*\C��{T'���n��[H
���^���v����6_(=��fm��'����N�>C��r�_�2I�i����I�
�#�����`�M��&����_�y}98���|��������A"�w���"V���K�	/����B����2��b�,#R���%�w�,��O0�E-��i$�#��6dlC�ic����d�
^0v 4�_����g���}��~O��8owF����<~#�F��~�2!_	/�Y"����{�P���T�06���1���U�2���9q(R�O���y5*9lA����2�/�jZ��%}p��4�>8,�6��/��|&a����3��L1��`L?C������&���d�����	 xx(��N�%�0����������Wx@hb:Ui�����R������Q��)lL����n�
�����1���s�{$�$��;�R���L5/��Y�u�
��aT|�xHSfz�	���B8��I��q�S�um}z��4���U����	�������~��<=~���5P�tE��mUz3��VF��KxA((���'�p
�[����@@�/7���\U��j<���o���#�(����p��B����4��{V���`����5y���:����)n��QE�*���������!f�:��B���B����TH0.��S�e���PjH���+�����d3�u�� �N	���yrV-�40�)���`��!b�����S��-�tf��������aun��e��N�� ���C���k�?���;3�J=�/-�����y���q���I�A�����$������*BA���U��\�d9A����N������y��������}_����<�{�kf,}QV����0.UR����Gx���M[Zq_�@�	�ty��6RYA|��A��o��M}���$�qB���X4ma���?$��	�9x"�_�6(�e�����P$([��'��q�\�
�JP����m��g/C9x���X��!CU�����}�$�`�`$�������AB���~v8Ip����-����Pa��(4b���O���i�J�1�'�*����@�/����{��R%�D���DuB7�� ����Ws3n��|��;+��|�Y�������P��
��	�jG8K�j�-P��9�,�������}�%������g����� G*��ruL��^_M�M�^����?�	W.�0xJx����c,���sS8T!B9<}��w>r��
a(W�\B��!��	g��1t��D������c��h���������Ah@H�Yk�$\rpw�3�t5|va#������W8G�r
��ST(	�R����ML~t�����h��6�����������j�G]���'�\��p�r�����k�Y��Z�V�>�N�lX'��:%����	��3�"�����!������\y� &6�MJ�N�~��9<A�f������e�aH�X,,��g��=����%���}{�=S�����d)	M�����]{�� TT��k���� ��'d�,�>�����4!@!%b����l���8�?������h����9�aT�S�������]2��L���GZ�j��IR��f�[����#l��f\���������8({.$q��m��`����P�7�1���I������=�HE
��1l�l�����$���d��OE�����7�����'�c�	���n
J����=�N=�����Co�Koz�jI)^P�YHh��;�������6����!�7���������Q[���]%T����pk���n�K"� �%O�������=��I�
p������������7�uyT����{n�ix&w�����0�Ce�A8y����#�T�!�)������-7�W��1*�����rM|���G*W|��f�������b`���+���	}������-"�$1j��&p���Sk���� *����'"�V	�7.+U���#�k+��
��YBo����F����)�<|�^8Ln��}���8T�o����> �J����<��rP���z0R��������/�d�\e.r�����!����h��{�@t4��){��U�g������PQ��^���J���a!�����P!���'�����0~�@�B$Dl��_�4�!M�A\;}�
���*�=yD���%P��q=��Q����r�h�p������u����G�I�7�����8������h�����WE4(Y
�w���[�^�9�l&n�)�Q���(j�M�4�';x�~��8�kZ�����/�d�F���P^8�~�T^���/��H���g������3{j=]��	\@��N\�N*," ��r<5��� TJ"�?� ���"eT^X@��� ���C����/�.��qc��������@�r�0�/��.�'�S������8� ��U�<����E���0N(/���2B�E�!����l�/�\y�����RT^�f
~&,���y��g����dtIY�����tL(�@��&���(^8�"��$T0�|��S���n����Q���7Kf�gG�g��T^/��^p�^��jD?�C��������	v�4�H�����"�B�7&��"=��`bn��j����
~��mc:���u��v��`�Z�<���w�m��U�q�A���
��7���oO������9��#l�l�Z���B�_���:��FT�P�>,!#�|x^y!��u	�Z����q!|�y�v�4�
�3<	��S�"����<�bMy�c�e;)�05$��"��v�| ����w��x���!��n���%�-����qq��@c����O�En\	������>���D���%�p��|�m��J�E8�a��;�^j��j��u�
x�pO:�����y�G�up��V��a2d�H/*/����\�)����O�����x��R���	��'��qn9���t��w�#)�?�������sTu,�~g�H����aU�Kx�v�C����H*/�0nN.�����!SF��Q�0��Z�����gK���A����Z��-��p��,�\�j�Px�B�W����}^���X�F��B�ji!#D_������[�1��(��0�b',���"}�Z�[T��S���#BW\
�����e��y3��y?�����j++&|����PHx�"!�!�:`��9h[�n?y��>m0�F<�{Qy������%e�n�������{T^��7/GC��;.����/�����3pDN��^P������$1�k��,���Wy����� T���L��������#O�Re������OU�.?��%��$VC��Z�*����o��Tx�tZ���u�E�z��T]0 Til�"�E8�0HH�����By�m�^<��6ODl_!CF�����
�4�������'������}�2�@����@B���<���_\�H���I�JT���6�23���a9d�T^	B�_��P
�c'�����6�/5�;��r�^l��Pi�B*&����<�o)a�8 ��^P^ �P���"�C"e��p��B�`��Hn��!�r������8�t��uU��b~M;��a���4x!��iqq)R)�W;������Tv
"	��E��1U���O3+��  <���`�""��{	*5���B��7���Qy!
^*�FK@C�S��(F8B�B1b�**&I�I��Qr�j�F;��?����cV�r�*Ve(J��P2��k�t ��>n��^�u���
����k��!���SD]*�)����G�����6��Trpv�In�����8����P�h�E���I)U�"��B�U{[,����3X�x���Z@"�2F�{[�p�^���'��s�l*/`�����(��:u4�|�)����#�S������d�uV����1��R��!@����>��k�%��O�'My���%! ]��KF���������.]���c\��r������Q��1��HU���x��!�8C��i'����B��y��Q^H_���@����\��	,�e����M@���PO�F�R.�7���� �9u��U+����D}"|����`��/���1��T����X^3�Z��A�*�!�1a0��h�.^PSy����u�4xA�������$�� �(�W.F]A�?U4�����F�L�>^���Y�F����h}*/�����T��H��.���q5� IDAT�/BF�4�!1<`�zT^07`��d�ZJ�Q�A$d����z5&t1�i*/$��y/5���n0(w�����$TD����Yw�@B����jo6��/��~>��p}�qT��0����\@	��B�!
qt��h[Y�y�n��:�[KP�D�*H���#6�������y/�)�DP5��A,f�n��N��}��f��$���F��X��6��'CF������4/��"�u�jW.:�%��c��Ru��!��M�^�����
c*���7���/$�>!��Q^��>����p���Tf�B2!��{A�����`;�b�\�����#B��`/���e(	vL�W��%e{�(/l8��TQ�pv��K����v�k	����
?�,C������u/�G����<z����P�")�BN����E^H��~���0�_74�[B���g���������&�,C4������`b���������Z3o����&�����0������
�,-2�[�^����B����*c�s��]����`IK��#�
�bn8IY���8�b����E������G0|������JME��������`���Y��:�y6����B���0�AG�q����(_N7�/�����mV*�)�sQ�������/h�����a����w=F��x*w|+^p#����'��"���e(_�
v���/5'���I��j�nTqx��hJ���(�T���Y�� `���A�8�����n�_H��_�����* ���6��o7k&�@�$�7��y:gD�F(G�O�n�r�	�&Kp@����P)��+�����>!(�!�D���=t��;,��!'y��yxA@~��)���?�eKc����4���v���*�p�0���_"T��y���m*V�Pku���:"x:i�'��-�����V�`��g���n$��1����My��/����:������R
M��Bk#8�����B*�~�(9��^���pyS�CR`J����]�}���0�����|���0�sY�/2�����=Q��/d<�n>:�5^����9�yJ9��
�����7��e�e�^��:1O}af��#���yL�Q�v�����w�K��F�a�#��g�J��ic���7�����0��^����<e~��/�����l�n���O���Fgjm��$BQ�x��/AMK��e������8r�J	������#j=C8��@�^�`H#{Gn�S��7UQ�#%D`���:A���Tj���U��5o��q>�R����B���p6Q;�I�@�&��g�3����#��C�qDV�Y7vqg�Q������lW)�n��
��;�9�U�N�����K��\C�a��$ r�b�k8�H�B}�"�Q��/�3��c��=�X��5&�*E�������R^�mZ��Z��=�s'���F|{+BH����k���"�ZV��?4����j�������E2���B��}"U�N����������.����Z}����������K�q5�����H��~���`bh�)uG����I��95�jI�:�l�&�
��?_X������K�N�l���b��P���� ����' .)^�YFx!>9A��XgUKp`������=�f����,�����2�����BU�2F��	Be�����_����E���$����oTBA�D�>�CIk���W�;hb����urN~wf���z��T{��B+������gm�����"t�w����A��{Kfa��o$� �g�����N�rb�N��w�U�

L����@`H|�L�H��x��^��
f}F������>K��
��HSlX8�c|�~1�����v���}Fb����S�����)[x�]-���d���Yv�6���Q	g�w`|n�!��UR�D�i*^��8W�� ��0�.�HeH����s	�3��9�R�� l&vF���.%���,��u����0���/��%��~9�P�!%:�M|���c�g�@���Bbp�����PQ����O:� l�f.��0�z��+�7���MiN//��.\G#�4�]$G�P}��`��%�s�0�����)[x��1$�1������,���I�O�'"��kZ��wDRs�!%D��P�I��Be��C{����PJ`�����&|���C�aD�rU�����
���dL5D���|4'�O��e��q�^���T"���4x�����BB���
��7�Q��	"��H^�XY%�/������3B@
��^G8�
O�[Y�>�"(��no��A TD��;"����� T�����c8D���*
����Pi!#D$���;N�d>��BU�Y+������k��	��#�n�Y(
�<�!������!�xb^E��s�cF�w�F! 
?�}�l,:2�PWH����:p��s����w���'�>b��P��m�X�K��/C_���p���	e	mRN��7��z�~�^����ij
��7�8K� �'���C���X�2T6-����#� �
C�H����$��'R�_RqA(-����O/�#�J*��q����i��#_�� �:�����p|Fya��~9�UB�N ��@����>1D���G�X�9�C���P��Q�P'7W�~*�^�z�a
����XUI��t� �b(*vwwww�k��������vwwww�*� *���3��������y��Y?��;3�;��s����FQlXj�Z4�Z
�����vo���#sc���(Y�,y����k�c;~����g��wh;^��������J4������z}��c�?������b���������$�I�����(��
������xF�S�+�����}�T
�Q�-[s��$x�m�G�;�$�m@����+^�����TxHe��@���}*/���;D
T�>�fu��R:`�����a��L���D�/�}���~��<��_�wO7D�>�v��/�m�g���|<��w�6�o}�t�M��o�&0-m��������)��l�	9X�2DJx�	L��Cc���=�����|����	L�g]6o{zN'X������g���s��1���E��<����9�j��q���>���P�d��p�V^���kmc'�$x���!����j���}�t�A�3�~�
�X��<���]�;��d �c�	��GDI�?�����aA?Mo=��~���_ng�6"�(��:?(po�9�9Z%�&�f�9�.�����O���U>N/n�N��������v�(��$��zJ���yz�fT����@���'�D��-�x3�% �����q����-�"&$���H/0��X;���� �l/��,.L����W�S^����i:{����������SU���<W&zD�����^��X~�	7���j��e���
7)��:�,���B	@1��UW��jA�/K���Yn��������bP��6�0���4���/�~ ��}H�eaR�(���I�X���{�s{�����A[���Y}��X5�K��`��~s�(����o���^%u���D�����B�ER����?sZu����nt-��tV>�L*a��#�m0,����C�����b��X4�0�y���\���=,���*
,�D$)>���IGRf��j�i���u\P�O�;���;��L���/({��^O�����/�&$+�=
�����}^�a����/[+������^�����$	B0A�B.�F���-���/��};�/08���` +v��+�����;Q*�����>������K����8
�f3|@7�w��c�]dd4F�[Jc!����<�,�������Bf�����f�����L�G�';=�k�M��������+e_��������o���������9�T����U�hc}e�m{V��2mDVm$DE��*3D?y������T��/��x6�^��adK7)�F�����F���:�g/��m������e/hjL���
�����P/	x�2Vc:-�@=��T/�*H�S���������)�Fd�83J�]cH�U�M�U�}�L!�.S0c�m�������
�.)�F��vF����P����u��F���8��1�/�1������/u�L/ddS����r6t^Pn������x@���R�6��|�]/R���H����E|���T�^PxP�RWR��x������u��-�/D\;��H0e+J1ah����
xA-n�6#^P��^P�_��-�u{T~{��7���D����w'�1���� ��}���^����k�x!��eD�4��d@�����2`/�/=�,R�Q/��P/�y�)i.'m�+3��4=��R�E�"< <��^�wA��Jy�+����T��^�G^�J��k���bExA��������fc�_T^���3�]����M(/h��Y�](/d�s���W���=���_�4
/h�����y@(/h���B����f�lN��W�C9i>^P&����^�7����'�#�z�j]�G��m/�#��Z����^�������4#/h��i{��v�C�F#�m���c����������Gm�"�y##�y�+���/�����-����-���\����I���x('�G��DT��Oz@���]lV��_��E|�zP��">��W�u]���+B�R��o/���H�������]����xA����X����2�)���Q[�xA��xA^�
��y@���+;kx!}ox!;W���r�f�2�I���2u��H^��#r��%3_�����Of���">��f���d�!�~.���?��E|2��f?����3�]��KKK���f6�����v�I�G�';=�K�-$$�����:;]([_b>��V-�E|��F������Z��u��;s����%!�Y�+����df�����:�P�= �y#,6+���T�">R=(o{y�+����G�6�Xl�|��py�����_��E|�zP�������$�#�ZQ�euxQ>">��V�e�Y)��������R���H����u)>b�R��"����T��^�G^�J���������(u�����.z�����p-�US���������V�++�IHH��������Z�F�G�B�j@">">��][oppp���~v�Q���|ds�Z�����������
��	���011�lK��hC�>����.����0�:���E�G��(�#�������K������+A��D|T�Yv���No��K(/h���g-��6*/���"::Z'~�&&&�Q�666Z�����r~�T-My^�~E|����jsi[===M
A�������j7&��v������Z��Vc��1����jWS��|4�y���Q�O��%��)�g�/{�������<���!��I�g���O�>�T
]z��|(�����\�">��IS�D|4�y@�����Y�=���BN�u�,��&�.��Y�5����f��Y�">�yH���x��?��E|2��f?����3�]��#d�3��f?����3�]�'3i�s]��.���U!���k#��E|2��f?����3�]����y��h�Z������h6>^���E�Z�/��Y)��Z���Ay�����_��u->����b+�#u���^�G^�J�.�#�������=�%1���:,�����������R-��J���������j]�G��m�K�������E|�zP��">��W���/H��h��H^�y��1*�9F/������@.t�^0U��ts�l����'��Y�5����f��Y�">�yH����J����E\����s�������iY!��������Y�K�anl�F6~�yt9��r�|8TFt��1���I���^`�}X�:�\~��S�:���B����Q	K\�S�~kSa��,e����Z��?�-"�����2����2}�Q''����=���R��	�I;�DC\,R;��i�|j9�������
����Qz"���S�`���T��fVM��d�)o�x�dll�e�j�gh���HI�T����E�>V{S��:I�����2c����]������U!\x�W��H�SN��G�1���2���h	�w��V[qqq`���?b>�,�M/>O���3�Lm}���E�|����z���g+�L�k[]��c��I����]
b<Z�����k�Q8w[�w�f�8��X���/d�E}*�j��n.�MVlVf�!�~.��Y�g���Of����/(�������zPd���U����g��6�Q��M�0��!n�\������,������	���?�g��em-��E�Gm�����m\��R5(9'O����x�y:'OA�]I4�)���w�����%�[cU��9o�4����1}��9vu���F��Q�7��N�1���:��qz�&Hx�)[�1�n�R������d���q���$k)��v�����q���l�St�������k�U�����Zm0h��f�BY8�7*���69.��������#��w��g�� ��umsO�G��"����T��^�G^�J�.��� u%�n/���SNk^H�]/����mMz@���~�}xA�r�N/��Ua3=xA��$xA���< �����r�f�2��I��^�y�!��e�:|��'��?M!�3#<y����O��m�����%�yz�c����/U���D���a$��~���9On���GO]D|B:�l�E�����a��m0!�X��3�Q���z���@��P�Jy��"��< �y�-6+���T�">R=(o{y�+����G����BwE�����^�; X�r�]�8�9Zc���*��^h�s6���]�Y�u�:�4&k{g4�<{�~�R����T^�gk�N+R|`K)A6]������l�7o���w*��Zem�,7E������+B�WM�C���� l��}�nx!��
��/����aT�(���4���a>H����v�]��:�����c����H�����]�L���Y�~�=����:�rA�j]������I'��^�����
����&T�=���������O��S�����le��n�xF�6lLM����Z���u��z���]��]���pv<_y�4�}�����a*�IYY���T^hS�#>�}D=�F�~i��7u+/�;X��VQ��C��Q��T��E�J�:���UWP�Ux�iY+G��fq��o�R�.���V������t��EG�#0L�'kf'����QlJ�q�/��uFg���&e*3l��C��2��l����U��&u��rW�����G�����?�.CpT�J��Tem��k�EL�'8���S����J��:k����R���=�������O��eG��{���=mj��\l���U������Bnx�g��)l��|��wW�(e����x�j�(�a:#W7�0�U�}�F5���7�����J�+m%���%�iU#��""��t�6����c�.���]�Q����F��.pw+�a�������;4mPJX�e/���-��1�(�p"�����<�-��P� G���^�&���;���{;[$�P�V�Z4b0��/�]����w�H�.�#��������R�xA�A]�f�����o#6��r������;>���l`������>��&'�nx��������U��g��
/��^7^�@�\^��
���C�#�����7���q��>p����A�Ux����>]�`��I� e���
/4�?�j\�����M�c<��]���
/�j=��!*��N�=���m��p���Q����~�7���1������b&�k&w�A+������
������tC��67~>�o�8j^(����M��j��a�0���*��.���v��W�Q��E�����f5�S��r|���v�
�B�a��`�t����qx��hY��(���U�S�]*L�j�V?�������=&��_���;x�U+��}��>�:s�?#K�V�o�bG�����f�i�i���A^P-"9i�_�����d���&���e�:v������H��Y IDAT����m���u5�;�����`ank+��������bJ��A������ER`�����cg�Go>��u��
?������;�6o���}^���+���Cs��rWT`���4z@���}�$�rA�R%��l���2K��]Gx���=x�8uX��$�Z�r^�Y(x>N�7{Kc��X��z8v�-��x��������O�T�I7��V�����C��\�G����w��<���u->^P����B��hZ������ax��:��"+�@-+��WC�����g_���Q.���5�, <�:]*A��N����7P����/��/p��;��
�&��[3c��_����z�p�y-M����_PN>z��/�|��=���5���z`���]���+����h0��u������/����E��0��G(��8�q���u.g�=����,Q�|c��>Nl�	A�_�X��01����}�7m7����\�Eqn�B�>���m��c����${��En�����NS_w�m����\y�������<��kbc"�����*,D~��'�#0<�����1s�^Lo�����}��=���K�.��sZ�)�6e=�hR���g
;8`L���41!�_�9o/�)���n�gq:z}k������R_8��!f�j#zi���V\8���X���rW��������@|T�R6=jD���I�bXK�[�!�c(��SU��|��'�B���U��=3��=��w�`T�8�hM��������{���\�!��/����a����-����a��r������F������4,��D���_��+3�Hy!���?W(^�����S��cRT�7��9K'|	�7�XF%�#��$�?�����M����j%��5��� �~;����}E�+�?&������5@��s0i�Pd���aT���D������@"]�f=�@��P�x�J�*/����v�+K{|
���3�Tr�:��+�`jb��e���=?�}�+�so3\�������@^���sh!����w�"��t!K����sI�i�N���a�-x���+/���3�u��?WA�R�P�b
�6����T��?�����+l��#����-����
�/�9�w�~��:�1U�~��-��X�y2W���Q�D\�}���a��pw���._?ZM�k�j�J���G;�G��v�_����N���4�ZU;#�}>�VWn������p��v�>��%�*O�"��j"��x��*�{�5x�k��^0�q@����G~xy� ����SV ����6��M���=s.�;		q��M'�/g���A����.�����HT4&�v|z�v��"u;��rc����I'�{p����o��NG^Y:�����#������'�tj.#���y��O��������12��h�WA��{�<��]����� ��y����F
0��)4)V�KG8]�1t��}�,
��`x�*�02��{�q��k��Q���My�9T'�b�l�Hya@�N�"�8�3z�l���|N�|�|?������:��FRX8~��x����9v_9��K3s�XX���kXubZT��N5����V/@hd�����{��`���`�	����1������g�;
�wXy|;��}��#g�u�;�[����I([�$&u����p/P-���i,����Y�?j�)Tb'�5[�t}t�����s8���7�����&���oga��-��\�/M��,�,aM'�/>:K�Y��x2R^0,����i
�!b�]$�D�jT]���w��k��Y��O*��[�����{� L�Fb$}G��#l��!��v�����'� ���c��_�����~`�&U!�����(5V)#�����P	]t��*���Q4��������
}/+��lM�[/��_�L���==GKO}����W��������u���.SX��s}��C���b|sG�����T��E`��`�u�@3Rf03������@k��?����������u�����>R��A���U`,f�����X������5���mr#82���1~�W^�0v� p����9�F!���R?1����*7�w��������-�d�~��~��a�����J�'?L��}k����������e,���BR~��K���d��}�a(��'3#=�k�H�&x�&
k�V�h�n����1,����_q:\J������Bxx������V����ACS������X���F�Ma��@�a�v�����q�M�b�R����,����X��W������cf����g�>���*�������=3��tc�-C -}�G�Ec��9(�� ��F��Xsu�>�������-�D|`.�4��Z�7���8��,f��#}#<|��.���>K�4�J�.�����{n��i�����
�������csz�|������9��k�������O��?�����r
��
q��I�||��M��9�o�i~�i014���)��?���=*v����p��i��PZX};.���T,�VR7�P�i/8��g|*���G�:pi��_��[�Q��Hv����o�����uI�s�6�
�{���������
p�����`@�����!������5=�P�/�U����{����x�a>��x����Z/��G��sx�Y����n�2��Sf�<��`U�7��%�����������.����������G>����O6,��kei;���k�BX�wk��#8�����c>bB?�"O!�^8E�
��C>���Nm��F+�����
�!?�g�w�������201G)����-�������&�l����A����������D����
�6�b�@��.7�KUU������B��#��w)��G��Wcx�z�k+����Kq2�=+���
;�*�}���{��dE��s*��'�������S).0�qD���0��&��qg�70�wJ�.e:�,]4�^�Q�5�����<�o����5v�z@�uB0�>�����7������W��:x�1���kS\$U�MW��4�������3�6h���C���ehk~��(M�asZ���8���4���_�^���l����Za��]I��/���Q0���s�6�8�*�@��vt�4�W�^8(�F���E���k�F�&V.Y���������1W�5��-Z�/^X��$��w��(�$D����E�T��n�>��E���T���n��*�����P��T������6����P�57*����>A�2yp��_�6^�\�����mV��ded_���uVz���xA�
��mX��M�����O_���M	/,n8S/nAAk���/<ci_e��e�jc��kt:�
�!p�����X}���T�����i��v�?g<i�� �G����T�B>;��������ug�Ryay�:��j�Fj��6�C8<��btI�Z�A����k*#x����F/��_{��rK<�q��N������zO�������@iJ����h�{N�X���P����K['�i7��&�\���}f#Z
��-A���qv��~O`��:���M�
J#��>�=W����0�Q��}MJ�p���o�'�$�`����Z�2��cp��]��z�:��vvhI���gNsx��N�2����m���8�L��� �$(b
�B�U+��'/��vB9���<�,,Ii� �y�����[7���]�1���d�/��ZB/���K��		��Wo��Wz��A4V�uF�a\�b.=�E�F���q_�zN�L[�u8"��X��B��S|3�f~?O�}{K�w��������������V��}f�j!b�	�`������>(�����# ���R�g�2�"V��i��H�B0�9b.?�Q�0(��;is�AY�[����=��:L���^0t��4G$Xn��Oa�Qq�|���j��!��F��;�^����/�H�\v0*SQ{����1A��+0iM�����QQ�oR�Bz������U�����f�2��OOT���������v��q��)c�a�]��@i:�P�������-@$A0�����?����	�[����Q�R8���z��C'��u��<��
�6��6�[�i0��w��y���9�����)U��"`�5i�8�7�~Z�����������7[���s�a��?8�`m��iS���8zz%Z4��'����7���?�b��MX�z�8![o)�e\rB�:�>����`���m��0�+Ntl=h���[]<y�v6y���Ji$>|T\kl��:KF�B��
�T�no��5C���6dN�[��-I�W�O�����OpB��mpw�^�:x6N��?7����]������C��;q���h6g�L����a�R��	v�K���}��0���e:��%��(�s"�n�#e���d/�$����yJpr[����������CG����ccq��)FV��%7���y��E���-/������w1�nml��	���l�M�>�=���=tt/���]@��y?^>(�����S�����X����a��c�������J�Q;�!��/&���;�`A�����_��9����q\�����������]�-��?�N5�a
ic",*�.��.���]���+�������WO������&����������_�OB���cv�1����Q�7�1�{��h��P���5xa��;1n�0�]�6��P�Py���/���M�� H�Q#[���}���z7�����O.px�����E����{i�m�OF��y�r�{�qo�# �C8B�:�������>0����}�L�������<������6��'�0kV�
��!��0p��a>q���H��1E���xe/��mE���}�����7��q��`3�5������2,`��3O����*��6����3J��H������fk�u>aF{',#��A	bXB�n�aM�����"������kR�CW��mEk�M|�Z�f���z���g����6�^FR��h���d6]�����������{L"�`�&?�i���(���	8t7�t������5������
1� �i;��E9+J���3��s3$8HB]7�T���*
I�*� 2&�S�������`�������A�b�P��)��B!s}�s���CRa�3AW	�H�M�g^`0S�`s�z%/���z#�������[����=�E��FX�:���������������G`@��3Vj�)/��?w�<��NV������&a����V�=Ai���(&4Ap�R�P��V�����+9��l����[|�
�>"��=�����������&�����_��@�'�Og��xH����s�wt(K/=�����z��A��bc����a�����<t��-�����P�-^~����/�����~��m������c��uV�/&���A�\P�$X�J�
�h�Z�CI��Y�#��������������=V^���_���}���nx�mD���[X8F{����� G�!^v�/|�?�6��v�-�#_�N�
|�.sx�������&��\v�M�]0pM%�6��p�j}�����G�(��c��?���X�7�����+g���qs� ���o/K�G0�����0i)����{��3A�7U^�$&�����g%=RIR�#������8Un��gwi^0�s������^�IO�E�S{��`�X�*37P��V]i�O`_�
�e!��6��L*�?�S�/uT��WftM����6�80�����j��y�<V1-��w~o�*B��/�:�����?�C�j����$����K���Ra�I��C���*/���.�����������v(J`��4M��������!�6�kv���P�������G��8r�7_x��9�<y�����:�����c��^������P�7�0�;z-'xF��^��y�p�\�w���(z~�����Tp��Uu^�}�J�,��g(/����|+��h�e�v��\I?�r���E?���J�)�D~/�����*L��7t�,�I'P�|������+������.��g��S�&_�#t�S�����{�B^JQ��
V� ���1���A���uk+,����R/0���%=x�Q���E��6X{�9��J��!�����tm�R�G������Ovz@�
o��,�dW��tR�N.�?������R�%���7��
��UN�i��7���J:��o�x�)�6�I5��3��2�����O���v��T�!f����o��Zb*x!�
�!�m��	M������`�����������7�WR}9��o���Q�F<�u�/���L!�A�	l��{������M�����S����F���7+��������-�",�D�n������S����w������N��q��c���/��[`T�0!��/������b��mY����!�����`�����?��&x�����]����� ��5IU�^r����������0x���!Mk�
u��$%���u�����
�K�p����} eKz���S	����N����J�TO�����*/P]�j��"P�6u����=��E���~`=����)^�������_|P����&`�}�����tB���BN��	T����fe����2�o?rh��'*����x� b.<��L!����TkN��W]z�85���C�`�Vqb:e����T��_����/9�aX�����y��<����iC,f=��� ��u��iZ�k�H�5��J��������waP,���EUx���T�9jT���w�����\y���-����~�/�o�~�~��t_��3����������������!+������v������J�:�$t'b��������4����+(��O/��0o�)x� X�~��z���-X�����u���V��wL��B��C���2������K��������G�����7t��?o3b��\Y��&�����V�������S��4GWR���v
��?'Kk�<��T'��)M�_v��J��v(��
��#m&3�j�����Q�z����{���U�<�.'5�w�� ���G��po�������7t���^�@/��/�y��Dn�Jx�g)<���!��w*]�k���-��?�����p��w������WCE�x~������z��}F���J����R�"�85��k7����jU1��W���o������
��p���B`��
�����*U�]R*e�B���88fD�;��e�8a%�Y)��K`T�^xA�LaV�o�SAl��z�>�nq�{���	~�9�'ES���:qWH�Z��Wk�\��8AJ
�i����\x�yc������S��N�7�1l��;��B��^S�����OL�:����NCI��*&�D��8����
m�S�_����cP:qJ��������9�����sk�r��������|�����#/l��	�}=��f��{;=�Y�^��4�y�2���)'0u�����"�Z�A�wb�'wa���=RS��
���>AgZ0k������@�R���w�>��]���:Y�Yu��G%���y�A����L`0F��Dl�������a�}��<�����\Ux���
���kS�O�GA3R� eRQ���3&lzK_�
�3V��s����c�Sd�&�aQ/g��P���[����N������N���1��B�R�1q�|He�����������D���h F4�����1�A.T)b�[>���C��H� Er�p�/$��Z�n�&`�M�k���-�����2*�|�"C�����R���6GlU�	�0&��XO�G��vp��6]
�R}H*&��e�35��G!3�^�*�3/$�x0��&���MJ�(m���1�/%]�P��kX�7���l�D��*w�,�`O�����&� IDAT���)�]J�,���H�B0�� �x}�}H���m��yz�C^�!��-��=7���M�[���+�w��{�P>�s^���
����/�����1�VTt)���~p�}��i>�����<��I���Ksh�o���{�3�1��84����2����u��5���\>w��L^7]�|�/_o�qv�����:C�`G����l�>��4���"� ��Dz�$���xnS��^�*T
E�F���x��_�tnB'�m���FT���!5���ex�t
�v���Sd}���_��\+ruc�\\�!��l��'��$O���=04�����"�6�+N^��� z�H�>�.}�nn�F}���8�@�?	�d�SXxD
S�N`I������%EZ���aC�[`�D�kS�y_�3��p�:���xo[�h���w�y�>��������E��-�#���^�]�����H�Q�};y��~�N����OH����V��1�$��X�1��y��IsaU���Y�a�:���<��\e�I�j���g;����&e����7��)&���(�r���	bI�;�b��U�2�����77���W����Ll^79��~�0b����
��yJ�����8�2e���};a$���P*CeKJx�8���A��oH$��}A��>�gO��zY�z:/<�~�����0��'�]AXX)-�������G��C�B������aNi%zwiMi!H�a��Bz{��5��l`gk����L����o���K�6���t������=A����������_���/x��������r�9�"_Q�lhRI^�@i!����[����[}������r�j���/������7/(VOZx�jY3<��Bc�(h���SK�������-O.bd������3��<�����J1��~���K���d�	0H~d�����(��S���R��XtR!��2mDZxa|�2���S^����5����i�4;�+�=�����������dO������{�v��������T�QB������EzJ��������E��~<�,���]��-�QJ�����G�n���^�IV�������m�k�K�p���@�B�����dx�k�*���!�A��(
�E������`���zU�����(��JP��];�a�`�Z���1��t�
��(�C��ct����}��Q?���1�RP�R����t��K����(����K����/��z�a�|\���'B�M�����?�"�����@�,U�����C�EJ���[��C=���[����*�:� ���\y��qy�b���V'[J����HF���aR������Oi\�(e�A^;D��D�e�ga��[��Gi2����XIOy!|�Q�h������3��Ly��)���D�JR{h[������������,)�DI�Gg+�`g�Ey���cl��5�x�/�z�S���y�:��BIJ���!v�����~S+/��^��l�r<������A���H��w��P�F7�S^�s��+�p��$U�&��Q���i��!����|����g�I)#�X�`k����������9�o�y�;�e
����4+��RW0���>wh<Si��1��"���#����6HYI��A�:}�n�T>FD������`�#��e��<�L�������3��Od'����2�c�F/�L^�s��N���k�><��m�>E�.cx�V�*/�s�2�T?���C�y�qhr;R^�N����kclnS[��+��t22280�v��'�cUJF�SC`0B�<yP�9/O��/t(��H��{y�g����Y
�����U^`C�2�f`��+pU����0���.D�'>�������!M����VRE���=Q���
�"���7�:v��B�G���oI���?�8��NOy����h��pt��Lu�Aw������QJ�����w�b�]93�����_C���]����[/�"����B������O�����\�A��5x�o��X{j9����{>��Y�(^���U�$���t��\�'�������8r�r(/��1�����#�r�������>�R���M��g�����|��p�N�6(�a���,����Iy�`������I������k/a��,B	�H�T�����6�����}� �����:+��>+/���AnK��I��Q���L
�2Ae\�P�6��E%o��d�4|$��6#����Y��1E���������}���5m0�<��g�LM����!��f`�#F6v���o�z'X�	/0�!-�P47m���
�u����[u;l�����`���f�~�;�.o��C��s{Iy���8F
��S���%	^`�2�cS�;$��`�#�P:*��h����������[^�<�T���9)0d������g^�ei�-��0�-S��Oy!$8o���`�������9vl���+I��Iu!��/�8��YQ^`jF`��UI��m�'��+t����}p���i ~&��2����o�D��]8�E���k������b'�8��J��4q/���|x�R:���3���I������ATI B�p����|[�:�+�h����Y:V��B��CQ��CIqa���������BSRY�c��o���Q��]~A�5�1��8��w���x[�T�)��_���g��:����83�Cz��^(����_�;S�}�V�6����U��O��\t�[RI`��I��S^���v\��;��F:K����-h�W�@��� �J���G��9�L=����"��T`cJ}X���R$�V)��#S7(O*W������9������}����Q�������bL���[x�
���a��(Ag`K�h.J��x�����D���R�;$���2s)/�
:=��w5$��S`)0R�+0��:�A �'W�)��Ya���#|Hq���xq`)ZtL����R���9)m�! ��������TI�L)��R�\?���������bT��6.Tpi�E��V���'���}�]{,m��3;)U��Ti#�/0&UL)�Yfc����Q����>5����-�kR�T��j�dxa~�����%����R�	�J`�z���������S��a���!~9G�}FE��^%Y��s�B�7#��CR��P�R9:��	���3&G!g/����h���*�u�i#R�,mD������
�>~����'�m�J�%���/\�u�d��G}D���L�a�����c=�%��S�~���l�vU������>""�k)N�x!k����Jx��������������0#���%=x!��&�B��o������Ex!g�:]������'�#�������i��REMP�������px�|=mD�RuP�6�X.�����rH6��=����@��e��������2�B?R]p�G�w������Q�m��_y�-�-�r�9ow�~A2�f��4�_+^d/4-��J�`��K���Wt����;H���6[��XJ���.�����4.���)�N��d�6��6Z��#�SI_\����!^(S�#Jx4�>�<>�y6j���K/�X�9i3������Pj<t�1�kvb������M@�hz����I�>A���	p�]������Q�q\:��Tf�����_�.���3���/�*V=	8`���/] �����
�*��,N�������)eI,?��f�Bc�R�|��!�i{w���*V"e���GN*
,-D���\�a��C�[���������#���-A���(�JbV�v��YLk�+/����Kr�ic����z_X�)x=��sx>�>���{3��D�F����	��%]�R"����NH��Q(%j�/��/��%)V�Y�_u�o�bM�T�_R*N#��?�&u"5�z������o�����nA�QR y@i l�XM�Jj�`H9;)�Q�b�:t��
j!��]_,���s�t*��3��0m]1��3	^`g)/8�P����	�"���0x�M�10��*%x�������|�#��"\�~�>��0���SL�j��S�H����1�J�h�B��%�}/$R\����FU�S}O�uU�N[TU^`��u�c�~�I�x���(����B�*Q�L#���6[�f"�/��g�m���y�����	x9p1�R\�Gh�2��_�y�d�OS:	_�'�J�]��{��`wT,��r�G�m�3u���B��F`)%
(Ki'����!W\�^`0A8�i����4�u*�N���'�o4q���)������k	D�{;Su8rj��B�V�I��%��p���;$���fp��i�@�B.�4��G�xB��L���=�tu��=�����#%�o�?�W�BI����8qn-)D����Y�g�KF��$\�d��d�;��xu�p2��z�<`�(gp��<��{�(��}:�
j}���b��^�_���f��������VNq�rG��.�1����)����6�<�//D�	��*C_T�5	�6���
��\�N�E�|D�
u���Z��S�gK���)�N����;��:88^�&�������j��8�����
b�-E�`/�/R��3� �a���hJ)%�8�C��5�2L;~�jV���n��:{��~D�d��6�0���t��0���.R��LZ�3����/�+���m��ke��=hV�flZD���
n/��g��8q�V����<r�GJ
�<-K!����"���7�_����RQ���O�WO	 ���PJ���I�!-���=�E��Q������d�u`����)�be�'����k���&�P�RE��?l�����&����N*&�$�V���{�3��n<U�a�������yp����M��2J-�>[A���E*�)KF�F��p@�W�V"�>B���dxA���������8R�������y�!7���
.tz��&��-|-������������p���a��_����&��"��3�������F�E�.�"���>D���.����Dn�����N�TG��L�}��XT����g}�E��V�&1��T���H��S��M>�L��-
����&�W���{n#7>`)Xa�-o��WY�E�,�C>J���w�IL�����i��)8��t���a80���8<�z���
S/��ER�i�X�[:,���0y��6t��{J^�O�����������`K?��^��@���e�l��H�!�HY"� �����:����Bs��Z��^����8�mF�ez�`
,��d�o����YJ���������?�����)���FHT<Au��d��mE��zQl������R`([���O>?�?��al��Vm��n�By���wb��V�qS���C���g��T��G�c�/���j����:�����7�tI����5O�������q�����S(����z�}/��3��~��]����@RO�!8a:�6K���i}�0����;{�9���_p�OJ;1�C�Qa<�DZxa	�,5X	��P�HU�tl!�NS���W���Cu(�E����*��3�(ek7����}d�i4����`�FJ)��J�2����2����%��&u���y]��D0=��}�[o�������S���������u�,e�M1��I��s�t��/XqG��#������K��
���{��`�,��9=��S��>���k��0�g���=�MC���puf7������A���8��6����TZx�)4�8Q�\eW�"n�6%H��>)K�������0�w��$,(=��;�c)&t�P�6
6����f_��S=`�`��l�e�/@lX0,�#e�!H	/0e�v"����c�h,�p�7��wx��<�R�CRWb�1��Kq����~�gv%*p��O=�����%����A%Lm��f�/�/G��k����G��u!7	���y�S���O�$C��a��^\�o�}S����g����`�)K^R�r����+/DR\S�����/����bB?RL������rbO�����0�v�W����f�;��u�$����0�^5��h���h�V���{���3���c+�}����w�w�v<�D�rn���|��(O��T^�I�n�����(]�
toL)G�B#�7�I�������C/�kuH��s�s���?��YH�����=
�����������e�9I&Z�o���k���B���)�5��I�1\��@[RT`�����.���Z�q���G�������NU<����G~:�l��������&i��0���0=|@7�C�/H[��������%=x!�6^��C����L��x�����Ovz@�����'-����J���Y���+/�jS��g/h�X����e�j{�������ki#�jO�2�41��T^�{<�i?e����kllF�m�S
�0Xm-��:fU�����M��^��x������=�_F��&�#����)v3j�*� �8��n��R�6�t�=���Q�(���K�����Q�u�������}k�f� �cs1"Hbn����/�I1�n[u�j���L!e��[����u8WbPwI�6B���=������%��'H����]Im�tG2W�^������T��T��<�u^��U�����z@���F�6��|�]/R���H����E|���T�^PxP�RWR��^P�?��&��������M�l�^(R���D'J����Gg�k�)F#��

�@2����"@^�/(��R���1���Hj��� �]��3���B�.��
���o<��������?!�T��]���G�/0�	�~�&AiC^<���K�>nOnxA�A�@�^������~e����C���$���������BlV��_��E|�zP��">��W�u]���+B�R������^�iM���+�9W���IxA����o/xA��)����������XI��X��y@���);j���~e����#�e"*��'= �y��k�{b>����E|�zP��">��W�u/(<(��+)u{/���rZ�Bj�
xA��&lk�^���3�[�^�cu
xA�
��y@�b]$y@�b-(�/(������6���GN����������@z�����|��?�
�q���J����`|�R�����Kf����yH����h����.����4����G������O��S^����^�'&di1:D��?(F�����022R��6U�41BO��xxu�a����wn����/\�S��r"S�o"��kY�|�_�b�����fV�s���kj�_�7..�����,�^���[�4��-���T�2T�	��lZq�/��}N�O��$�Z`o�v��O�����3��_�TlX%m����EC=}��Q��M�q��5m*����Yi����	�d����!�?T�9U����^�?��9�l��|���L��e>�Fqh]`��Y*;{�����G����������s����|:���S/uv+������R
](b>����s��.�j�Y!��l��g�����o��@;�L�k[]��c��I����]
b<Z����M.'�\2���m���dq�~.��Y�g���Of���^���3�]�'3i�s��?��u)>���������if�����hw�D|D|�����BBB����������%�#�k�bX�G-n�����l��lX���3g��H^���������Hva�
x!��
u�^�7�b�R^�J�.�#��������R��Z|tis��V�G�
��������j]�G��k�K�{�Kb>��uX�Q���!�#�o�Z��R=(o{y�+����T��^��#6+�]+R���H����E|���T�9)>z^^^���J��h/<��<p��Kx���GEEqZ���N�����0	�>���1+��������$��D|D�%� IDAT|���������R������:�(�
�|��">���<6>}�sss�����A6[��f����������">��p����R�.1������Ovz@���.�gk@�';����Q�g��B�';���/���9�����ByA����d1y��T�">R=(o{y�+��8i-��������R���H����u)>����kE�u���������j]���K'�Y\�|��ny�����_��E|�zP��9�d�2^�Q�K��#��9�+����2^������������A����W�u���������j]���K�{,�b>RW���E|���T�">R=(_{]��c^��o������:�(�
�|+������Ay�����_��E|�zP����Y)�Z�j]�G��m/�#��Z�I����h��:�/�Z]����w�H�.�#��������R���J���������j]�G��m�K�������E|�zP��">��W�u]��.m�����H]�������R���H��|�s���2^�Q�K��#��9�+����2^������������9j�B��4�Hg3�����m�0�z�/����RlVf�4ZA�G����s�L]��
�]��c#���5���UZ[�9�l9C��|w=zQ	J�?�/G�###��hS�����~���d�O|.��m�m��k>f��(\I?�����\������%����T]ee>Ej��~��Q�Z����>���������E�G�(�������*�@
5u)>�ZT�����~��_" 4@r�2�Oq��(����>T5P��)�W��������b�"�L�,���FO�<����������A�=��c_�!�����+�� _�Ka%�����&}L2��&����s��-+���e�����J��&�|'fk���,!!������W�*{�Db��Z�j�|�2����|#q!a�:�!���Q�x�����Zo����H��?�73�y�T����+611�K=���e�����������B\p����b��[-$S�5(^3�6���.�,umsO�'�e��
">u����d�"�V��f�F�A�Y�����U������o$�s�6C��v�6�k�K����7O�\��e�/W���i�i��m�ZG76>�k�6���$w���'��O��/H��0�c=`�^�g���kz��7���`M���?�7^||-�X*��@�w]d�#=����G����_��IB]|��9x���kx|_#s�������w_B�9c��GY��=��g�V�hR[+��{�{�mV%{��*�c���h��MS��,5
����R���IH4����NZ������F��ii�50R_�z�F�P)�A]��b�Q�zQ���T���������
������R���H����E|���T����n�K��\��:/�7"^��O/��?/��3�"gx@���$�i�S������Z�/����2Z�^�/�/�7�^P�S���+/��3u��^�y�!��e�:���g�������O�����ti��	���~��<���uc�������v","�(�h����y���Y�Guta��o��+$�B w���R���C�hii�@�����n!@$!!������O����&$��O`w���9�w���SDDF����PRR��A=?����[�AC]i$�9i������m��,NA|B"���c#��#t��x@���������"�u!>�zP����(���Z/n�_�q����)�����6z�r��'�0�em�p��T��P��"
�{�#U?y�YYYXy#�-5�'(g��j������Q{�t����T>Y���A���R�~������=����6����i�"�|B�R���;��Kr ��&\�;nP�����u5�bZ��[Y��_���>���������M���U��,����8j�B������1�k.z�b��],[_Z'��6����'��������-�d�8�/X�l�����iA�@��I55vo|�����P��������V��E��.�'����c��>���m������M0c��"�����)/t�����������	/hX�B����F"�[y���vx1��Dc�F%�����+�c���mM\y�K�9��������%U���c�/����"6!�?4���x����.�����c�W"Q��y�m����WW�a�I�p\��k�j�!����{��.��������H�_���_uE��+���
��I<���[y���;R�u�F��\����JF����'	#����?P��B�#*�����tX���������_��z����f�����Uz�����1\j�^Q/T���7��:�Vg����0P�Sgx�*ZQ� �u�1�Wd�Lq������NA�v���w�����c��u�k��b�M^�F,���S����
������}&�E�I�b�����
���������R����lP��c���^x���C��u0(a����8z0���3�>�)��}2������Q]�Lp��Cz.z::	�FPH8N���1�������r�^PlP�d�b�+�u!>�zP����(���Z/o�)n�_V?*�q�S^������Q@���e^x�	�p��^M���r���UQ}�������/��BjF&��0��#>�$}
�^��&���P�����2�}�Ot����/�x!5�%tz�@�XE���
c�I�E!m���B���0�5U"��A �
^���8<��/�:�/uxA����+��i��$m#y�.�f�ec�/��'��u�����$K��^0�?q����R�p�^��i�Zfx��C��Y���Ft^��g�[�v�/�[����l��Oy���R����������a��9�2��y��5`fY�>��s����T+Y!���/�u��'�"3#M��$/x!==�O&�kw-l��P������Q��>'SJ^�
�@���6U�8��6�7���
��^��������7�`�L�����.�dj'Ox��/�1�����{J^PSU��QK���I�G�$r�'�xAz���G��h����q��}����d���~��t�6L5�a������4�����{`�����B)'0� Gya����E
��i\%������7��r�onj���Z�F?�@\��C�u��1�l����q���.���z�����g�l��.�y@xA�XU����2��x#���B���_~ ���F�����S���]����~����Iy�Y������/�^"�G�OIz�����&�K����U���/�5���.PRQ�������T�F��h����23�k2�U10���OkN��@�A����������3�AW��I�t�}Wh�'�i�0�s�(+���w��.�i	��x�<rS�����a��/�� �����5����`F�k���o#ba�-�O'nA������A_S�A��x��5*���5T�C��K��L�Ly!,>	�+Y����$
G~�Lqm��4���h�J�@�>%���1�M� �L<HGf���Q�9�z��0����D����@!����0nV�w6e�������]�*���]]��2��@��P��q���&���D�#G���Wb�y�
���@��
�22���UP!�|��'�D���\y��{P}�h<�2HiN�� ����4���TT����5+��*0����)�(�7C���Y�l+��-�wRz�Z�`�5
�S<GV��A�����e���:NxC������������������,�_w�bp�}82h��\*�9���#�`A~�@��3*�l����:6��g�~�C��S�����������xG�ZOc���-)6l��^����G���7qi�$�&}����`lq������M�{���t�13��F #2	w�C�T�+*��>]�jj�V�����+����$?���'���%5u�������g5q�(�Q���=���T��bf�s
�N������y%��7�qV��L'5G������S�Fc���R��\�!��R(k�"=�F�r�����]�W@���j6U���iN�.�^���uC��(�YN��CT�9���z�	~�ti�=��G�h�<��n���A�N�[!��VnO�Q7�W���g�OT�+@�����g�$#��*d%�C��2��w9W��;W���p�i�j����!~y����i4Tt�>��Q��N��j��D��m�?@Y�}g"���\��8�sz�{(��X��w`�D�u2���*Jy��^�����_������9l��C)��o=��}���CP3����^\���[cX�j���d�U*<�����%������wO!��T�;�t�`7��P����,z4E<�����a/%5�?����c���'$�
�.�k<g�G�4�J���G#~��N3 `���"x������d�7+#��+8N����,��q#�5I*��/������J1<��w�`��.�����=g0�SSQ���w�"?��}#���I.����:�MX��5���T�<Y�9�U^P���/�����>B�#������q,�Mp��yh�k�M�������6"�^�E]u
�R���?X��������L�9���o��'�����*�4��w��#:*NU4�q%<�5$� xA��6,���
�_Y���(8�[
q�?�N�
��3y��_����^���=:W�qY���5cMT]���?���^�mwo��&������u#�,x�����LT�����!%8A���/8��E�_C��r��r�����@�������0�}���#�������4�{���{�W���
��A��@j�)�r�G�UD���H�A�o���k��z&t���J��������;w��0o<�����*�j}�3w�������V&����$$Gc8AL����
V���z������ *.��y��8uk�}�]����0���Z���K���^S�{��~`�30CM����&�x�}s����<z���c�����m��3�ILBv�_�+
5-R�������h>ks�3�5�����c}����th	��6��8��Z�=�x�� xA����#��*��:��E��[�H��{m%�k����!��W���	��'���}�~���_��x1;�O�CZZ2���
M}�?���P��*�4C�S����ks����P�Vj�k��~�	����q2���h�f:�����^<=��/����V"���D$'E�������!��{W�C'o?���!��I@���5�
���3q;�m�y[�G�\{L�eAglOdGB��$l=�,�!h�o%�/��C|��D�+Ly���
������W����-*�����w��:�6�?��{|��[��]�f������l����������o���z9�1�puSGJJ�����T�v"���;�r)Y����M�&���"o�J�����L�o@�^Z�`J
��`��f�E��5*Jy��V*�^ep{�}5����;�0vRE�**x{���[�W�	A��	�����D�:*�����	����m��0�4?N���P����������Y���=�pC2�����m���9[����T��
�4V�6��cW2�����D�{~ t�ABH&j�����N�a�P����%���2��i�^PV���1���Vv�P!0�w���k������{���A"RG�/�
�?�8g�o�:����T���}��zG����
)1$"�/
�iC�\�������m�����C3�0�+/�>��j���t[�J���/h�����=}Gg���%�g��	��SC����>�K����V�1P�4����j���I�w���xh��;�NvB�s�s���K����K��g�A=@G��3�B���/`�
FV��`?��uP�Zz](�������������'0c�~�|s���o�=��u���B���P�fKn���0��l�U���������u:�����3���HC�������C��^���>K�C�8�0�n,p��y��CC4����^���E*(_�������b�#��RH#���%�l��[���>]�i�!|K���6a����x���y

u�<p��\�������e#�(/���h\�+7��w����ek�q�`�_��cf&�~�g��^��/,[0������:l�w�>��a���?q��3W�X���O6S!��~q�^0jY	�m���
��wB�����������aohH?F��}l��^���C�*o�Ja=E��T�)U�9xy�Oq��E:��w=��N����x�h�������OV�^�LLB����0i�>�V���J��\y����Wb��0�O
����Zr��/4s�BJ&������x�>?t��I����D}����s�9�������tt�n��7�qxaV���|�
^SM��B`E������<�Fn?����;����!*PR9UL�����#����\��	����WR�c[
���,
�T��Y1��'yNU%�;#�����D@l���`5��5��?/��;O',�6Ab����kw�����{^<av��|�R�_��5���D�(�,���z
/���@���8�/O�Y�o��;/���q�]{�
�#�X�Gn�i�@z�"*�0������������)^�OM�������
%�X���Z��L��;JV�hZ���_{S,}�c�������5qF�8�,�I��iR��F���)a8����>Tb��l!��;=�������X�cK?O��7�����v� h���J0���=�OS��C��L	��t���	�ZA����)i�C��%O^�O%��D�JZ��1<���PaD�W~�B�?����0�v@BD�����$+������W1�G&%�3c#(YJ�$�;%JFj��A��m;���v2�����,��`��#s���*f�H�����^H$���D��g�B���P�d<���J�UZu;"b�_�����+J�<@Fl���e�6���!r�\���l��z��d=bO����9�^Vz�	�,7�]A}����A��5�I9��9��wH�Y]mj�3�D5h�� ��2�4�C����������a4�7�=�A�����+idD�@T�.��N�������o������:���d�F�X�%p(#���[$?:���CA�Y?�G�����	���}�`Z�9�YgI�,�K`Q<�H"�Gi�A����Ga=��'������B2�CQ7=9��I�T��k�o;
SC$���,�u���'aC0��9�x_6�����@��� ,���	������{
_�z�~���Q��+X�,z�H�{@��kp�4�gm@Jx\�~�g�W�x68��R�-z��4�_C�o{��-z4!�B��\��-���^E+�8m���]�uk�o������w���W���
^�D�;$��i����\_s����'���Tru�=O���^���W��#v�A��Mq��M�n�5N��������8x�,T������=�\�8��"M%�d���P�E���b��D�3�O�T��[������f�x�D�N��p�l<O�Ir/X��	��H{
u]S���0>�&��v/dR"4��Y�v���������#������/���A=K�]~��*!��+��������>�|~�J��*H��D�w�-n��3/H<6kXx�%�Y�%�
t�`�c�
�P?}g���'0!���'��������#2.^��px�X���C:��a}mz>��+����(���������:�q�����]mcA4v����7=b���L�6h+���
5*5�%�3L�$���L�����������6����4s�.��c0L�po<��?�p��'{9�q����P��>5�����@���"Z��gB�����A����g3�#����tb&�����P�jG<�>Ky���(SC;�X�9A l^���K/�%�c���|����� IDAT��t?����W�!$�Z6���$CA� x���,	d�w}*VnC��i��
���&������Je� 2�"�|��}.��ZO�v�q��$��*e_����?��� �N�r������d,��N��aG�;:����v��p������;���b���b�����,�;2
��n����`a��JU��/��8@��-�
��^�
R�������[�*&�h�����������8����2AxZ�#a�A�������A�������D���������A��{��4�-�<|nmB��	hX���HTm>/.�;*w��p?�`��	/l�������	==%���ug5��w����0l�6BB2A@�K-u�����"�6oL��a�H���U�����&�>IE��8~4	��h��_:�
W�KMu\� &�A*{Ir/<X�D%DH"=
}e���K�WlE���d8�S���7R��Q����<1��/��T�}d� �����[�Q��Lp;��4D�&t���_
**C�B������v��A�<���Z
�8$��WZ|0wUC�:TE�d[
��$� ���{����_b�E�D��4��4����H0����d�W��i����:��lg,�LT�B��m����b�����xC<\M�5T�M@B�#1^x�A�~k�G����*,`j�T�!�N2������D:@N��!��$x'	N������S������WQ�c1`A�H~��r�j���3�����^���B���9��Nn��F]�_O�]Km���������k�Qg���ecIs/h�5v�*��8n.��������C��x�wS������`mQ�fN���(v���g���_����e������v���&������{W����B���q��Q<����?������������������w�R���h���B|j�^��%�������u���G����eZt�T�$r���,���O^�D�#�_��	_���{1rP��v��p�}�F��8����"�~�ee*�Ysxa���\Ua���vc����"�b��w�}>���}�����a}���(/9E�?��h@@��#����IL[��c_��&��$���lG��n
sl���'����^�jj��
�?:n�F*�������!�[�RX������)I7�_�s�f���'?xA�P\�T�*^�|���OO{���<�ZH�w����$q�O��^x�{}/rhaH��PW�P!?x���N	�����~���I�� P����	6��s�h���o���C^���6~ ��v�p�����/0��D���CI��[�`i��v��\(�<��+��Ss���^`}���d�}3P�V-T1�N�,�$"("l�p��%�����U%,�(^``K�%��v�!T��}r8���������r��L��j?��5v���P�Gko���C~������f=�;�l���/u+[��%�����`�"d0 �U���_���yJ,6�0FG[S���lH���
��s��g���a���+�lD
=��]/�Em����%r����X����>S�D$�����kOaM'�4�T9�_~g��8�N�8��������I�������U�i������=����^�����?jSt;=��av��h-�HY�)3Hr�/;8���7����]���Vtd�@w�d��4�N�aH���-�N�����C��%ES���'(���/d�SZ`6����jh����J"i��E�u�m���.K���:-A�����;���9WW����a�Y���X)���Yi)P�H��&�v/���xRGB�0�0h��X01���t��~����>	7�:�Iv2��~��@�Ioh��s��^u�������f���-?@E�N|Q����)3${^G��d�)+r��T1�.�_�]
����>��\ui.���r(#��Fa<��k<?{��`�E*��R��)|�sxA������k3�����q�+e�]gI�jFzp��*�Zy��>0%5����
1����,��Y&`�Bn�I�	����^��c��A��?��������j��$(�6��2��J���!�)J��������p]7���a���t��u��&j���CR��jC��?�����f2�T0���>=�X����B�d����}ld378[�b����K�-������X{�~�s���A
{	R`���M0c�Y4t�Fm[K��,Y�*/���P�1��l�����a��\ya���xKj%�����]�$���)Hy���5]5��B���\y���$DF���C�����2�q:�����JF���T���U�1��4NX��������9���	��� w���#�j�3�A�����{��(7�=���h�'!p����a#k*Wb����_��FcR^�F��_q�����:�����W����y����6���? P�n�F�S���?�������]�|�a�H�B:4����W������X��j��\����Cs���7�Bg
���O���	����t�����r�Q�9l��������841��2���+���������!0��l��	���O����:��W����������I��In�j���Em������j
^�Y�����(���j4�uG��DC:�\�`E�������\���M=���=�9/�n5����b��.����mgs(#��0�CWA��G\��yu<��
����Gv���]�Y���[��,�k�����O�sx�a�I�p|6���9��xJ�J����J~����}���K��8}p"����u$Ha��p`���.����H_Rd������A/=#>&m�����f�C��pb�x>����2�L�K��Tm- �p�o��7m0���	���P#�8���UGR��4��^���
��Q[;���8��]hviJ����l�`�D�+^P'��j��B�����jT %5J��>��&�����I������N�xt�g:�.]�� x!88�o���([��91W]06R�~
�������,�#��+I��S6�=�oO"���{)%�!��cu����/R	�PC�J�'����3�w5Z�J���T�<�II!�����$��I��P�s���H����^��G��I9��e
	1~yB���`RU���dp�9���H��=k�c��G���F�CL� �)�tQr?��
M�>�B��
"_������	����FI�0�F�^����NjL\
�Ux�w7��W����W�?��������d��b"*w�E��d�
�Qk��K*l����B�n�xy0;��S6��PkDv[�l�C�"��`S�c��C��l����h0����<���%M#U�wi<V�Ai^P#����H���
���6�O6���)�����B�W*h3x!�)����bm<����e�>���s����fIYm�����;P���<?�;�s�����#4�-�
]��������&B�.s��pv)�����4~�Z��4R�{k�����������XJ`�/8}y�_c��m����,
�����6L�x���F\%h�<}�jF**�������hh]�]^(�E_\�r/x���PB,I�~=�7.\����$R@PC�6�>�^����*��)���-*+�J>��V �����
�=��7F��0�����MA������W�oN��m�O?����?��8f/q!\�
��$��~+"�I2�$.W����uj^xaH�:���!�o����p��+�_������_v����)I���V�dI�\��������n�\���'���1��~�fs�/d����Q���X��F���^�g\v���]A��X�sU�m���Vn������)�B����[b����@�#�P��V��uhI��TbL���d��*/hQB���RW�>���2�#�o;��C�c�Jx�����������"%��S�������^���^���ztRf��L��0]I���r�b��������{u5^bB��x�nTg~b��r������`g�B<�)��g��C���JI(��������	�O���#��$e������d�a�*H'���`?�BO�E�#��Ch��o�^�aTv�I�7���So?�<*����^p���w�����
|	la�A*}?br�L��]+/0`����H���[�+/�u��.R?`�F���ahJc1����gp���&0����|����������P�	*;2���U����`sa�B$)/�#�������%���?�P����)��W#g��\z�t��
h���z�$;\�%+���4*�G��J�?��U�\ �)&p���my�_D����w�N��U^�j�I�Dg��+�������&A��&�N�S�tZG���0PA������8,q�L�9@A����H��)%D��������K�s5J�3� �����f%H����������TZ�TI="r�O\!g���2[�G�����.�F|�Yn�xq "r�,N��2�s�H�����&_DP�W��+s#��\Y�
vi�h��� �cR^`��}fR�g�b���j�#��F~��L�"^`%9���B��`�SV��u�$����	(2�SF�zd�x�fH�O�K���hw�O�~��pv#;�����Jz�w�1*C���l0�P�JA�����>~�+�x|��?�A�v�c���}��it_J'H���u�T��`Gsy��$/�����p�����EER\�]u$[ya�j��CD���ME��?~��/0!����b��r�;��=�$8�c`�r�
ZW����Q�S�[o>Ax|�g�Z�~��I��������=��[�,���~���px�%�D����A[gr�VJ���I����^������:�|e�C{c����BC�1|4)/l�����*��$�t��z.Y�6�����K0��`�kW��v���n��JMF��i�7�z�R��R��`c/0!�~���e�;
<�/h�`=��?_A�6��&}�#`���KW��8�SCxF�X���m=�{�&�[0���$�}~����}R)h[o�_���=?���u�����H�	J��w7��;����SG�ks��)tk�6������� {V�����r��d:u�$��J	�{�������r�����.�V�d�P���)'�
x���kT�����K}���9d�m�U\!g,V��u�� �Xy!^���b#�#"6��a�GE������IIa*������(�/f
����
�}�0x��
kOB����:D��`�eXi����h�#������~�^s��x���5j��e��Z!:�-�����v �|�WyA��
f��{`B���H)a(�tYD���D��k����Tf���y�
��P�-{��� ��Tz�cx����r�ef����%/��H�'�<?�<�`�,_3�b�;�7WJ�������v��Z-'d���i-$_�����|����H:W`H����!��m���Q�`�����7`Dj���"^`�/�����H�IE&��98|�ya�D�~�� x��m16��y:�o�BJ	^07W�U^'����L�}�"@�������W.��BK����hs��
5�O�Ly�Tn����%T<+
^xw=v�4x�_�� UJ�����$������A��4J�p=��/d'�Oy���D�����H�@��J�I#���SyRK8��l@�u�&WOph�AJ�^`�����J�5-H����$Rg�\�h�j<����)�5�T�Q	
r3�gdQ�C�j�
�6$W �U�`�L��8R)�X�49�sx!!(=WyA����J@1���+�Yv��O�:h���D88��+�+/���H��z'�0����LL1�E�����T���"���0��D��j��kRjSY��Lyautn�6/h����T�Gc���]��nc
���m�O��)Y���/��gJ�����������$tn�-���$8a7�Z7�T*S)	K�D�B����
���������M�8����:��!*����y�z����8����'��t��w�=)��R�=�A��I�O�+/������c��i�Wcn���N�/|�hYJ�K���z$R^H�.���#�@����z���K1o�xz�Xrxa��a�D��#g�V�/�����s�m�+6�����0����;m��Tt����=z���t���[�tS`WA���m�9Tace���?)�d�����]���>}�w��$�B���$�D��p��~��O'���~�c���o���Y�jH�#��b�9v���"�^�z��sO���(�eo���d���/{
��S�(n��$�(�X�]O~��qS+���]�t�'��~���/dQ)���)!�B�
�k��\y��]o��+���f��z_^:"��^�����vuY�o<��o�\x�������t<�����K4�K�)��./,����82��?��E��E�����xX�	�o�\D:��~LT�S/]xgR����')�?z6��}���G3�s�1:9WDl2�H��h>_��i�����tj�NQ��t���4:!�/\}��$)J��`7U����N��#i�5T��^�9��'<=��r)^`5���L�6���<!�/X�iS�+���`*������A�����������;�)�����)Y��O'�m8�Dz���������t�%�	d��3���.�iK��Q�0iY������?�����xA�B%��$yx�h��3H)a)%��g6��K<|KJ�	���=o���I������t�(�
���}oh��A:��G�����`���=I�����;�N^�&�V:�;&�	X�]VV"���Wy�%��C>��}�E���Z�p;$�	�a���|��
Wy�I���Qrs=��J���������;���i�h~/�96>v\~�����i��t���(�gCS���{".���(84��k+fQ���\S��b����X=�f}�tDt.�����c�t'_3�em=���q5v1x��^��
�{OE��KT�TMl(����'�P9�h�_��@�w`jT� ��
�c���rz^�(���B$���XyA�^'^V��'��J�!A
����<�X�?r��_P� .��sH!��d��T��VN!�@�
��Q��@��)A�r�>�'�Cz�?��.���RI�!��N(H��8h�X�������)b���N���JI�vU�-���#H���y0HA���gsek���1x�]�����f�.���vf��>PX��F�D�S����l|����r �#�{�~�	P�_���S�u��-�~�d�I����nq.-R�2����Z����|>~�N@���x����})�����r9�b�����W�I���{X
��t�`��U���T"B�'���Z��\�N�����p�m4���H'���*��v_��xR�����	&�<�?r�GR	���q"��?�"��&HhU������MT�����H"E v?5��������M~W~����f�7������������1�s3�h��L&~9r�z��T2�������>j����0���{���$\4����#���x��?����|Y�>�J9��6��O,��cs���5��5�P�$���6@��s�-I�(�t?a�&~:�
q�����/�-�=h_P�nV���XRV�V^`�B��tJ�j�\��Sqh�\�N����e�{�j:v��mJxX�����c�6�����.�"�{D���H���T���}��<����R�pj��[[����N�P�#����N?�Uo���i�}*�\� ����0�������Os�f�ivS��Z�L����+��[������ _�$�����0�Zi����4�~���~��8��s��hE	{� 9G%���CN�^[�O������^<������Ly��_1�Ao;=���SB��{K�}}'�o3��| IDAT��M����3��d��xz:t��^5wC�0�CI)���D^x�:����'RC��4�94=�O����%#�5{�*��p��
��&�?���Rb���J@�o���$�I����m`J���[k�JCh��4��.��+/��;�)L$�������Ae.�v�O��&Rh�[O���1;"u^�"<��"l����h����_�3'����0�R	��E�����b��%����>�p��24�N%h�4�F!�U���.��I��<��_�;s!f�=�@���4\;��;�H%#�������B$�������������	��#N���pk4���I���������.���'��-��q��)�}y)�4������� j��s:AO���KK�����{��C�;#%9��\�!����Le��������_�C|�A.���k�����)O%��=���8�M3���]9��L��VJ���R��8�L�#�W��v�vH>{��l��T+YA|�S%���S��p�K�����
"�\x��$��4���s�G��g��������h_�7Ri��:6���{��h�?��+�U�p����`�N�w���[7()�x���x��Nk�������T��@%F`+9ab���[�QY ��D���BEh��OQ�	��g@Dc*��wwZS��g�R�I�'��U`_�sU�����)���ul�0�!��x�������e@
��&��f�./0u��2*��S@`e�"��Ab�v��K�������4�pC2������Y	
]e'��BP�	R�3�����m��K?��L���P^�KC�~� ��lK��#b�{\�|��0A��6
*���V���)Rr��MC5�^N��&
����z�>������x�����,��`R���2��	�'����g���V������D��Ps(�������kIHK��&Xr�=L��p�5R�	z�jX��~����Wy�����We���{�#_S)������`�F�Q$g��B^�������`PK��^�"�z���a^[�dR�H��
f�4����/gU��B���{.$P��3����C?�_�9��BC���Y�
�nT������b��X�������)w��k�{��ex������]I�19�O����ZRN���t����b���{�4*Q�}.���y4���>��b���`m�l�C�+�}9y�R�9����^�^�\�v��?���it����^$��E0�����!/�gH��J��T_���cL���r�\��B�/�/��r/0/3}�����X0��9��b���a���W��>�;�=����k;\�q�8��`��� �����}����w"J�n>�������`l�_��L_���No���A?t��j|����%k�������#��H����I�ig�^(��/H���o/$�K?��@�����@y�o�M���������^(j���F�'/�PX�������%=_P����xA�c�q���F�q�R5�q�yL$?x�8ve��3�����R����%(��i&����b3o_y�U�9)r�E����K��<�s^����/����FH�_�������,m
�d�)i��FHj@�v��d����<�2)
R` B�f���/�>�����}?.Q�My�%?���Z��n'?x�K�sa�BI�� x���/�8E����%���l���W� ��J���e#9���F(r��l�/(z.����eL^��{���\���JaT���^P���[rOX�b��������A����X��j���~Y�UT���G��^���� ��xAz��C@W��R�����#t[|����l�1WY���u
��,�xA6�I�[��I��r�N	V^B�N�3m�����
����%��/H�$5���+�
�xr0+��;Q��.�%��?X���Y������,�G���,Zh#x��y@�Q!Y�X��j]���Tl!>������[|��������_����|#"�����/����{���=*��R<�_��s^P�W?�)��]x�dvX�EP^�	3��r_�%(//"����yG�^����!{+Ay!��� �^*K�~IVW��#��DTh����/(6��-�'�G��EV�B|d��b��Q�e�^�d���*�q�#����/��O^��� ���e�� [�xA6�I�[�xA���_l'��P�����w@��w^���������d�ei=� ID�6�I/�-�����b�$�@������)�8;6FY��� !YY��J�y!>����F�S��J�����&�K7
�^�����!2�2�ZVLm}<��&q�/����%Q��������$hjjBI��<�T�b�u�a����
_O��n�J�cy4R�z���aQU��%��0�Z���W����T��{��8�����L�#1]�����(����EU"���H�f5*����Q�;��ey��s��x��e�~4����'s�
����-��<��L���8����x{Y��J�
�=��5�<:�6x���n*55�����.��nCX�|B`�m���X���JY���re�k���XO�~�+y9��4�t=�#�8C�h����NM���%:A)KOO�_$I�K�M��CV��\�~	���B�o�X�QM�G�yNC����ZI������)�}���
Q�O|Q��Wla�z����iB���8�[��@A�Bi��<�,�[rOXOi�2�[�O�>*�B|J��E�]�d��K���������
���S��N�O��]�Q#""���S�?�J2OI����S��N�O��]�Q��H���o�
�������
QX��*G�B|��L������dy����DX��6����Q�c�dV���Y3�P�	]����YHV*���Z�#��_��b�+���!Y)��Pl!>���������A��/O�����+�Z�#��_��b�+���!Y)�nPl!>���������A��/O�����+�Z�#��_��b�+���%����#k�������������*C���YYYHHH���n�_[���/;�B|������~�����y�ZY��b.��$_
��%�Gz��d!>%�m��b%0���j��E�n����#��J������t�	���_%�:%%����Q��*l,a=
s�\���fD���\+�����;s�����B
�Q�{e6.�Gf����Pl�	����F���L����"�u!>�zP����(���Z/O'��/����#�_��b�+�u!>�zPq����d�%a=��+��,�G^T�
!>��������d�a=������X��j]���T\��t2Y/���K��F�O��^����H�%�����U�Z< ��
���T�e�.�GV*����WV��->B�R����B|�_Y�������_��#$+�Wd�.�GV*����WV��)>B�R�����B|�_Y�������_��#$+�Wd�.�GV*����WV�e)>� k����������������Y�������/�G����zyJ�1_��uG(����WV�B|d������������yX�#/*����VV��)��|!�G����B|�_Y�������_��{�xAX�$^*�6B|J����,�G/)��/(����r��������!.%]���!<1I�>=�W��
����<�,�d�D���	�)5�K4���Tj��[|�de�V������V�}2�O�������V���H���7�������e:�)�? �����1d����*��OK��4��%2VI�SE�%9d��5�����*��5��rN�+��`�<P-lB��(�-[�U�s�����=�=/���/{��\���
�t�A��~��eG���C��o�>F�K�(��9i��#�e�����>+!w����<��;{B�������&�*����\mf���	��Jl�����)�����}������6'~������$�P��ql�ei=� ���'= ��
{yK�	�Q�~���Y=���B|�_Y��B�xA��Tp^P�o�eY�d��/��CEY�Ey��]^(�����=X&F��/2L��e�E�^P��%�^(?+r^P�w�m���},� x@����XHV*���Z�#��_��b�+���^��� �+�����8����/��I^����� ������P��xA�{�L� �_d�x���/(6��X�
�K��P2~V�(��H�f�.W����/�v����O�������_���so����P��z��}��k;�������;"!)��������.��������ms��|����O��-�������tL;*�*���zBB���xA��.o�=a=��/�Z�#��_��b�+�u^��`y���������#nKt�ZCIE���$#<������5��eG���a��`��b�q������*�`��V�O�[^e#�lmPq����.sf�����Z�u�nP70���[��WV��:]������{� b��Zw���qu�P���X��B��}�]-=�b��MR���a�q��x��^�D�e#<;m-}�xu
]�ae�$��Vl�������k�(xaB;=l��_za��H��e����[���c1R�������������c-Ml��Pl{�t�'�`bj�Vm�}�th��;#����b\�������;��AtT��>�]����;�������z,��K+Q��$<:<[��Z9w���>����_Nc}���vq��sK�C���t{s�X���Nr[���n�U�����9����}z�*h5�G�O����:j4���-���������O���uY���u��a5�
����v^������M���KxJ�>�������Dx\����am0}�E�� k\����(1��@��R��B�O�ry���JJ�ZCK��&iy��zVhX�'B�^CK�����{���|6n�8��oI��I��(�����D������B�{k���q���b��u�������4q�����e^xvf��uM�~S�g��NN5+NBS;Gy�>����o�����v�l!^��5R����d1�m�������}���c���8v�2*���F5�B"����
���C�&`P��=G1fX���S�7,Z�s����������Q]�Lp��Cz<�
?�3q�`��a�2�^Pl��d�b�+�u!>�zP����(���Z/o����Q^����IH{���&�n��E�`�c�����aP1T���a�_:���T�0}D��o8���,W�����q�.R""xA�Wg�"<��3j��Q�����W`���h[�K��v_�������Ue^PS&v��_�b�1D ���M�
/���
��TJ^�I:�O��:y��������aaQ���U5u���VO*�_s:��``Y��5�u���\����S��Q�=)+L!S��t�u-��/X:�������"��o�qf}$2����M������g��g@�^e^��&�����~��5�L�jo�mW�I��
/���������3�B+��x����^h�W/\�u��u*ux���fn6��t[����m���;��w����K�TV����T<;�7\���������r�oW�`r�6��O�R�_�
T���D����Z��e����1����I�x�a��a��m�0j ����c�	:%�	}=]�����Exd�.`�A�����[��RS�p��U(�A/+3�����M����1�wj�����q��#���� *�Y�6�����G�����.���.�+�>�cgh��E-]x�?�i��^�,Q���{k�u/$�~�-LW%����1�j[�c��+T�����}��}�G����A�|=_�n.Em�����ST�K�y!>����F�S��J�y^�������^���*���{��~�!d��x������L��<���DJ��A`�O�l����3E�}�N���� `*
Q|����X"�M"R�2�:�-�j&B�~RIhU*���k�p@����b)Bz@2tG� ������lgQs#$l{���,��iB��,wM �CY[:#l����
��w��#+@_W��k[���D8�}��(�p�@37m(+���D`X:��jAKS�o'`�OV��M����=
�Wb��i�J��� ��_u��a�����7��\y�����	f-A��Zh�H���l{$B#���=?�
�
p��w(�������~��mB����;���?����=�<�ii��f���M+K4����>`vL��t������ ��x-[	���`��=�k�����0�]�+/$��uK<���D!�Oy��u�n����97K����fM`���c^��VSC���P&�.�u�qq�5-������� �Vi��k6��6�C�����WQ��x�91��oumCTk?O���?BUC��T�uon���K[���J�k�i����g.��^���)/\_��Z	������;O������a>�$ZkT��B�*�0��w���~��YEh3�<�pE�9��c�	����K	V0��S�x�����'�6�������1g�D�����G?k��MS���H/{/���=�7S^po���/p��)���T����3l<�R�u��p��!��>�vv����q��Tq��j
p��v>���\�1cp��6��0��M
�t��T�T������5<�<���yD��g�q�f&�h�t���7C�a�����xX�T�hE)/�}5��>�5��������*�����G�����I��:��r<�c2��A�J��B��C�94`c��m���<0
C����D��C�{��T��n�C�!%�~���ai\ya��x|Oc�?�z�4������V_�Eu+u���I~�c���b<=����t�35L���fu5���1hYM�UE�N��=��egbi^*�B�����������*j��Kh~#�����:�_����J{/T���z�������~Ell8������7�w�4�����{������&��?���q��h��/)t& -U���&�����MM]�>�O���������G���"(����{�%5��k4�&�[����;��R�&]z����,�eYDr'O��93s����w���%4j������[���G�Nc��B�F=��g0b�oPTPB��g8ql5~^t!!>���������G��*��bjW.����\[CUMwn�m|}���G�A?���8ErxAN�@E]i�Qxvn��n��#���Tr����������7�H�	���^���
}x������v]#u��9|om��I5�6���y��\y!-!��3�3KP����T�������f:���FzL'f_�C%���P�!���������ta�x�������PR�FL�c<:�f�p�L#�����5���������-��*���|T�qG��
H�!���xso'��Y��� ��pj?���������m�T����}�y|.2�>l���5��S����Z����M������"��/�u��h}��}QbL6.����M��,\�3�l���s
��3qYh�_�/$"!:C�� �?�t��q �h=\�`y��e���x[+����xr9	�T�)/\��vcp��(T����
5x?����N����{�K�cQ���SEFZ.��������0��g�/��R���_���`[[
NM5���M_d`&\�j��I�����X��O�9�Z�Uk����*Rr�����	�5�b�2q��h4��������u���$-��O��c�������p���W����`�i�\'�/�u�++mK��'V����a�����u�R�Z��"�~�����T���q���~����������0�|HL�~\��sm[$�e�=C6~�}�t1�ch�*c������Y�@_K��~����fuo��:���u�{\fm IDATz���4�k�<^�Dc�%/��������������4,��>k�`gf����p��:���[/+�
PA��;U������t����!b�8]
ht����H�?��B�.u�hD�Z�b�����/�������~`�
������v����T��#��?r����V�j9Ey�x
��v��KG�����@�M��J��P�G��7���y3�Wmf�L�d���o�r[k��K��r����7*]�"�brb��=(���"�,:��P�M�����?�\Q�ULk�U��t�U��{k����;�Bd\ �_[�^MD�'�c�������!��b���j���:"-#����}y
�����*k���]���n��������{��Gw��)/���G�{<x}Z��}�"�����z0o,:�{u�!X4�E��u������F�I��9���A�_CU����o�;�O����P�T���*B�����{���:�2���2n�:���t4\,�������U��r���������X���mzK�����m����k� 1$�z�8?bM�6������CE�����3�5�w����-��E�'),Z������J�B�_:��Ay��'���s0�S	.���Py<��"l{�D�z�ig��E�,��U%t�
pq�^����f�x���S���=y��)d�g���]�-����s�q~ i��?�����
���k��U���*�������yL�T�0x!&=�8�,z&�����ka���0�{��6�p<�>�3S�w�i�]�m�(�X|\lpYN��qy��(�����.�g���V�����K;�OIA�kR��$��c��o���t/�s�b��*/�vtE]s�w��WN��e�r��{!oq+�#]��<��z��UU�����1��54�U����{�op��#4��E{[G�����Y�%�s�AO�>�i�-�v�;���{��m��{��=�Nc���l����-)/(����B��u�|��G�����)����������86�oi>b��������;�=;���G�A����'���6��UT����)��U��^AOG���G��K�`i^
j�`�������?��������fld��b�V��o	^�s��O^		�/�����6P�q������I#�kE��h�
���^X����y�B[Q)�M�T��sx��	�##�G�O
ux�}����osy	��e;nB|������z����^�����p��r������KG��>�r�S�~�'A��Psu�[� �/�����U��^i�P�����B��y�����"+(����B�����=��5^`��M��Dd�dB����Ro����j�
K������/��d�-���,��aA>*
^�����I&��k(�����IX7�~	�����)�/	���2�i#���$���nm��`#����PW�H�}��Ht�M�cW��H#�:M�r����RL��
G6����$��NN��� �td��>��P�6�v�&�$� x��U5��K�Y�v��x���.�����]������9@��~���TXt���+Vrx�����3x8]A��A	���D���hz�(�u��&��z���qt����c��d��G�Cv�x���Z**��mkL8y-�T��7���>.���{��];a����%���>�������������vz�Y�R���g�
3���	n����*����}��xqz%��vCJL�|�qx!�1=�{�M���k���~/>8KW<$Gi�T�4;N��������M�x�C�>�su������M����T�0��<��`oT��H������O�����p0������{.�
K���7������^054����a��������������V����x�L5�~z4���9��Q_�@�����2��-��:$N)^X�sw����`�jW@P�K�P�Z6�����m����4�������h��:
}c�Z�qx�f��������IC�����psj��0��M����V�N]��vdo����L���BU�t��a����%xASU���a]��?���\�_��������cP��".�H������`���\/L�C�i�q��&WchC���^)��^�%��,�Clr66��)�d�m��7�6]K@mR�����{c�F��A����n2�H)"v��O�u�N""I�}y?L������;A�n'qxA���G�`
AG$�w=
��� ��V�7�T�o��zy<��F'�lee�J���0x���9��}�`���+"**�+���?Z���HZ��oF�sq`�R��
���}�2x���?�
F$x������`z(+�N]'rE,����k������".6::����l4nF�_N������G�lI_�[xK���K�004����h�f6����#"<���G����!5%����9`lb�n=~��5�y�:��l��v�?pw�X�Vo�����p���9
z��|Kyj��H?���A�.�h�~��MP��,x���_g�A�[����������m(�_�W��"=�=���Hv�M��eTM';��i8��b������\D��@%<<4
������@���[rx���=����zAON >�;�o�a�q{��j���,��|M���Oc����:4�/�h�<�}�!9zx�u�n���Qo�:<:<��y����w������ON�oD�Y��R�X?���/����*�{L7��E����W��1p�	v/� @$�~6���#`\IFJx~+��3��5"�����]����Cq�����'i��s��i�n��C]c��-��q`���X�0p�1�S�E��R���.Sw~����
���v�gA`�]=u/85�$�"��8���Z��d�������p>���q��(������AE%$�����r��3������2��e��3QD�n:8M�C�~���"A/%��
�6=�
{�j�������hc�����}>N�����ZZ5�7�a]����%x�m�?
� � �:�%b~�F��,�4���t:(��S;��J�,�9����#����&�
|���s�3Lf�]3G�t���O�����.:0X�W{D���g�O����mH����W�6����>���w��5'���%*RY������c����v���:}������1c�hcK�R��C�_6_���vH�|���=e�)�LhyJw��$t'uDV)}\�Z���rl\E�Y��#' J-���"
V:�8��A���
��aP�\��&����>(7���B^]�:2����!E}�n����nz��N�	KFn$��{���$���*}�!7!�7�����P��C��h(:@�H������^"/t��=��D@�35	JE������D4t�I��R���:����s-�{�����U�oE��s)}�>h�"&��arhYk�z�D��q��/t`�4�N���(E�>��M������������C��!���Q���6�u��������_BJT"\'7���v�k!�]<�������'�!�A ����7�~@m�>�6�\����|fr��=A�Y��`�%t�?a���e8��|��'o!5*	������O���.8;d���~���iTC�Rh<���w#X�v����W'�

�������8� ���2O�{���p'���������yucm$b�������{�m��M�
���9�=���H�����W���i=kx�~���O��+~����PG���6��/�jp�6�g�� ��iJa����Wx��U[�f��0u�w�6`��0���rxa�Cg\x���Z���]Q�a/��1� �9H�	�����?D�HMa@�Sno���W"!���t����.Tk6�@N
��e�
�6t��.���"��P��Z:��y�w��7M���]a�A4��HH��w^8���'�!��u0F��n�]p��3�����EO�!~�y�C
~�bbF�6�
�t���s����'�����-�`�Y�=
���8��.��E��[9#�������K���GO_Bu���x�&����[�cX�����X�����y� 84�NN������#0x���G����I"��1S��*���1q���]G�_/��oCp��=����da��_[(}��O����;s)}D]*���v��P���I�"����@HB*v<	D&����|/���btmW��F������jyE���UV�6+����u(�G�Oiz@�D��^`��kw�ypf�T�p����|/�:���#�>=��Y��k~�L\x�5J{��;�Pq����~>t�C' V�0Mt��J��$zx�
���8���,ED��:ht2���|"��)��M���Lh��B��������8���y;:�|�a2��J�O��$�e�M0����9�(�a
m�-�G��9/m�2��m�	&��-�Q��l�Txj�I*L[A�$u	V�i����f����ea\�a��x��N��r�
J�v	��/05���B��	>�7�Bx~*�
������W��?7���~�*�/9�Pc���7F�v`X�6|�m���)P$5<���p�m'�������a��3����w����-��m���hog��op�T ���q-���{�6���q���W��cV
v-F �67_]����5t���^����;��#��
w��K�h�:������� �����w0��
�Z��BJa����e�h:!���$G���!����
Go���������
�o�"��
���0��:}��5����]��T��M����p��f~?��Y���&������.�g

��N�����C������!n<���������6f^�F�-����{0���e[�FG��������}�e��&Y���+w��P��H�������w�nX�{*F�YJJ%�9��t��O�3x�)2�����=S1��/x��_\&%�8T����P�l�D��k��Vl�T:u=��/0!5q���f��N��p�'
��r���L�����Q.wV��&����JR5`%/m�2=?^�S?\���
*�����@���b�T��K���@�w-��O%tZx�(#Rm��2m ��2��Ie���,'�a�
��j�lR�� ;y��!8��?o��6�ym�4����f�s�������`@'�������,�!(LW]^&��)���=����[�O��8kV�A������=�x�a�3p��)0�/0���A�^�������|���")�l�{*������z��g��e�Y�%Wr�ve
���"�����5+�b���"t�������7OQ���&�v���px>��!��p�����O�6L�a��-�� q����[�6���:"��@�<=��C����a0��}sg����A�oQ��0U/�����G��u������m2�X����^����6�'�&�X�)D>���������$z�������I�����������M*�v��N���`�)����`m"^s����ip��+o�J�!�������o^�����'}0x!o�6�#�oY��qI0��
�[��P�T�����sd�1��9�%U=D��B��C�a�|���|G�?��E�xZOx�������5��#��'���P�{��6�[�a����
�,���+��`��p��#�#�-�(�����
6OC�9��^ZmRg��6�Z��8����1+�B �"�� u�8�g�K��`�C�E��4���0��G/��`&H��/Rs��D�y�8��C�X�i�"�^m��g���8>����I�9��>��T"��
K4�����
�>X��7^�A���0x!.=�_�FzN�V�%����������d��ZD���/��t�{B��P�
��N? �P�:�������nx��{>`����p�E �����B��|�����spaD���D������1���W��rG�����,�kS��i=$�����#����c^�77����
�]��a�8�`I�����BqJA��������T	�um��t'wF)>'n���IKQ�S���I�w�IPj`
9:m�q�-T{WC�_,r��zB^��[�*j�����������eA�P���=/�:T�Q�
�����5}�#`!�M2���Fj�I��r���zE7c���r���M�(xA�TE��G�m*8}-����`2�_��v���?�1|B�=��0���79���uU���m�1x����5������W'a]���y�W�Q����6��K�O�K
/0�q�C��JB���zj��p�w��a;hM}PRlJ����GH�0����>�{�p��5�+$������\�A���h�?����9v?3�Z�d{'����n�����gcU	[x&(�=���)�9������N��D*
V��3��N�O�?�7�
#'s�v/���# 94���@�������@
����`}�{��L���K0x��1�'��MF�� ��H�E������F���n������sTTS�cf�V$��P��n^��1S�xw�
���B��^��������w�e��z����&��;
�����U���d�0x!>�~w�Pj
�F��}�oR]hO��9��z�?9������Z8w�*Q���v���R������6�Y�AGE
_<����0�@���k�
��&�/{�EB$�t����KE���@J�\�!$�@Dcsl~t+�;{�&���@������}�@�$�MU��y���s+^�t�����%��^F�W���	���..��+��`PB|bF��K7�!)�h?%�k��Sx��/BB��H�/�9t�� ��j0�@'<:��\[����C_Oz���\����(���*��cy���s��)����"��.��Y��C+��/y@x�Wus��X����J��@����9��������dbW��XIR�yE���U&l&���	��S�(o�M�D��cx���6��KfB�;t��	{�(r�}/d��#�
Q�.�x�r�F�"�S�|���1��O�r-����q��y�Lu!;�N��J��*��w^H�
9z���@���K|K
^����*���(�fU��5�X:�c�d���1����<
�	I�+�Ct&�z�N���������C��Er��}��8��.W^�������p�N$3��[��aj����r���Hy�Iq2�!�T$)���������wh�}���.H����*����$�j����<e+�+/(jh�2m"�����hv�8����&'�z�\�A���Z�P52��MUJUq��5�S
�*P���p�m�u���.\��Z^�y���:���	R]����n��Y1Ja�B�&��w}�"�@��OIRU9^�M�/��������*	�����	Q�����N������������r� 0A�N���P����&w15:�t�����o�'%���3�?�Y���nd�bS�����| �w��H!5�Swbh��8s����{���\yaA�������B�"�����Z��m���RJ���Z���{G�]����nZ���~Rx?*J����o�����k��i��8ye,M�!�v����]�s�-G���K���z?��mV���r�8L��RG\��L�T�N���h�����q�^X�c" N^��,M�8�K��!�����M���"�@���O��� ��Hy���"m�(\���n��++/0``'AX,��/A1����
h`��$���B{gu��4eB�
L5�)<L�~���������/���[H�!:1�����RF��0x��6��5r��z�%�C ����f��DWWu�k���Zx��W$�>��X�1����R:x>&�b�:�����z��Z��4Z��nD���q��������`�s���1�i?
����Tt�9�V}G�'Iy�,,�q��h�� IDATg��:�^}gb��c�V�=�i��~D�A)(�@�<x��[���3�X��B(��'=����a��������$�*/�����Y
���J��An�VpxA� k�><�K���V5����.RQ�������:mR�s��H)a;)%F������z�%E��,%K3�ihMJ��%)��~��#O ���6�������T���
6^S �n��*����|Q�&��)��)/l����1�����v&�_\���2x�����}�Wl���B�`U�'O���4�S�����u�)��p�{�� y��6�,aA`����^�x�L�d.�yo|�FxA�@3JS����sE���V�@+y�LuA��IV���8��$J�����o��BYU��?�T��G�����?�t_��B>�S^�}�
]Ri�u(^��0�N����vu(]][�/�YA�"P�)%�w���^'���/<'��������Tv���%��G� ��Zxp:��"�7��H)(m��s�"��������r���>�l	���bS�p!�2�Vt���/��=m����������B+�����0�m�~�|	^`j��Q��umL)���|x��{u������������uPs�2���������&5��`�4J7������Hy��)EK�X��AT��#?Ll_��
-���J`�G� ��b�����I���'U�S�n��6\�a�i��'<}DqJA�B6���
$U�V�_wZC����%/�G�:���VW��TP��T^ ���)����t*}������dd1�J����rd]%�J�����}�N��w,E�6>��X�mz
��5��k�^�M�@NT
	*WF�=Q?��9���2���7��&.�1s�T���w�^\y��uh�2��6��b�2�����8��0CFV����e�m����RP,��u3������������g"1��%(��5F6�'����Q�H �������T�?S^��W����yL#�b���������~@���0+���x�i�;�m����Fqug����;�z����U�__�_����:�Xv������Q\�����6�_H��BRi`���%���4#���z`����#�����j���>0q%����xF���m���>Q}Pd�f�����y�F�C#q��f����]#g3^�)Q��2�u���D�������X��w~����g�o��
J��-�)/<�	�
�3���9�wcM�������pR^��R^������/�Ja������B�I�/o�}������I�|�����J��?����M$X��+/�w��=O`b�fxJ��|xaa����p�I�+)*\�{�A:��+��(Hyak�!u|'�,� !y<%U�^��b��shZ��`�h�k���G�����s�a>� e�x��"]��O�Y���Z���(34&kG!��(u��E��_>�.mDVV6�����uE=7gD����`��q�da���)��
������=O�1����Z6��U�va�����t5�N��0�Mz�V����dw"���-����RW0����������-�q�AUX���>�O���NdG��
5�k�^@��F�\:m�]D�
���sx���9z� ���!v{=��w�(
�������f�0������)M�����:Ft��g~�:��}x^�F�p?�I�vE�n����Dp���B.�D��y���R�RJ��;�+?m�W��rI) qk0r�������[p5���J����H�,��M�z*
��><�+
^H�y%��0@��z�&yuh0C�/��Xy��E�C$�z�vF�P�h���ZT�zn����(��<R�r������/�'	v�Z�I+��vGsa���HK�k~���t����6��f��,�h�_����{�@z�=��.�#��I���x������SM(u�{T���M�4x�#�V"�����&B��sm������F#)��d����p^<�(� ��}�;}&^`cwZ�3
r23��q��5��Uk���P{�J>�����)�����H���%n�sL�������w�B��t�����<�����)*�lX���
����I�	1�=�2��� xA���OM�i
E��_����
���v�h\��?����������8:���RM,�~���7/��	=+'���������/�Z8���z)����P������\I�/�M(��pRYxs{���d��%WR��
�����s.���%�;lD��w���A<KU����!�b������?��Gi*,(�D&�b���p�,�����N����(���3�Hj�(^����s�����*�9�h�����1�����V�;���
�d��<3,�Ek��������q�o����!�����2��/��k��K�L�a������N���m"�����?������K���8S:
����0x����<U�����RNx�/�����;�5�~��tH"
��V�b���3x�
q	�\e���+�]\�h�F���`f\������?8��~o�>����~����z4_�uum����n]q��.�N������E�VL�jtL%Y�?��1�\���V�j�O��
���o�>0��o��7���K��RJ�7t����rd���,�$�}#����1��to��H��,���OAac�wX���V��q>W^�F��^u4N��mIb}������}$-�
��x���ds�����N���0h��w�)�Q{6����{��m����A�����*��8�el��	�(�/8S�6�h��y�XG����LUa�(��x�G���k?*Z�^�S��?�#9l\7���h�r ���BSK����h��\��B��U;��E�Ncq��.0�fc���9v9i���NRS*�����GV��L)��������)vl��t��XY����<afn�{�������}����q:?�G<��ER�9z��aWJ��H����P����8���Uer�a���K��a6����_c�L`i��u���0��$RbC��g�Ua�h$O�������iB�/�2�o��g�5���������Xy���\{A�����������1A"�*/(@�L�#�nqu]X8w��o� ���_��4��s�y�<6FU����	��N�P���,�����l�������N���p��{_(����c;����n�����t�g�6�<�_�|�l|�E����e~d��i���~fZb������k�n4���t6i�8C*,mD�P��l��	���{����`�����C2a`����"�Rl�A�],��")%D�R�(�v���)6D��S�{V\������%�,�/zDi%�:���B���0�%���5t�a
��w��S708AYM��Q�t�T��mm5�h��a��IDd�~Wm��u�����R��G��8�:���|��tMJ�����l�-��A��2�qyG,l��S��T���Gg�<��������U�p?�!�����N�m��L�4^HHO�J�u��TU�2����G����V{��>�=��
��}P�a�~	^hdo�����D9�C�APtB>��C�?S
	
���h\~�f�V�x��O����+��r9�0{�5t����o�7q��P��.�������F�d9���:fv���w^B_S�����],��i�Y��L�����9�p��7��h���d��l��6�Ky1s�PhQ�&|lsH�a��`�yc-�
S��K���H��>�����V���6�RE�^H�����At-��F����	��Aj�"oT�������s�/���!�;=������6�����w<�n�X�9~qPjb���@��C�	|PAnr&Tz�q(�����`���B��(d���zZ������.	�)�Pt4D��WP���E0r�9���I|���2�:�wyC�U%d>����"�-��XY���QQ���
���/O/r�s;�����uJ!�O��
��^��u\|������*-�=��\�Ok���������Ltw�A�$����}W�[����}L����-�?�7����$�R����Mk;��u��")��2�1*�4���7<��u�������}3���H���m�G�
�0xA�n���������<����>WR`�>��}	����a�\}=_9�)�4��,-Ez|*"=�H�
yjy�9��t����X
��
M����)"� /��<��B�a����w4������$]�7����z�Z��RU0U��0�~��A�?z�q��T���;���\�a��:����>)��@����@�	i��+��*�H-���H��6��8=p.��_3v��m�S�` K���L��%��{�5�)O�!n)Ly!,%k_�`g�J�U�a>�������f$��VL���C=���������v����]��k���������|��h7~w����O�����\�F�V��O

��C� RV��^A�)����j$� ��7������S^R�>)U�,Xz�,j�Z���F&Q�!��xcMmx���2�����3��CT��-a��GJ
�\�a�SLm��j�~����g��S�<������_J1���to���L����za��k�~������(���
��`�S�J�FJ;�;���� ���T`)i2�����+����m��
����/��x�X6q�Y�������}�4)��.���?�/x�G�V�z���SQ����K�
��/u��^���-�� >>�rfecx����E�������J�n�P���������6��I�+�����}��s;�z_��B���$��4����������Y6_6��f\�F%�G�Oiz���7^����I�SAi#��!.� �8�j�����:fI�U� ���Y����Sa��,�*M����9Y�U� ��de�K�����v?NQ��/��d�W�P�~$���GYm�q*������)0�\���x}������,�]I�����/��|�����Fw,���8�`N�����t=%Y
�J��<[_�d���b����Q��,�+6�����$�������j}/���QQ]�+Et�3���`�BI���F�������������Y���������[�}�6B�xA'��J�����PS�@���/�6��msO��l������H�A���#[�Jk]�D�iWR��xAv�-)�� �'xAz���/����
�B�>����r������*���E
���,m�,�/��WK^pn�	+UJ}!���cO�|J��BI{�x�x�x~��/����]�$�]5RG�ID����2��/H�V^��� �z��}%�<Pf= ��
��Y)[�Jk]����m{!>������[|xA�"xA�wF��xAv�-)�� �'xAz���	^���d��/|�E��_���[�k�S^�V�'�e#R� �8��l�+X/���gY�"(/���"�� {=��xA�..o�{�|d�^��.�GZ�����WZ�� ��/H��
o/���mIY��=)���PVxAV��`W����/�~
~=�B��/�����l� ����`�t< ���gY�"������/���B�d�����+o����#Q�r����O��ZO�+h�[��|�A�f��<�u_��u������|�C_���^����7��,��J�vB����m���$�������999�����J	&H	6��*����y��������z���X�"���4�c���8��&M���O��^�� %3C���6))	***PRR�Y��w���]��Y������K�����.��H:����t>j�7��^v�����8>+����
��b���R"���|Jd)O�IKK�3SUU�����+#1�RI�O�����L;�������"+%dG��LO���E^��Hc����)>�f
H�N.��SbN#CJ��H�,��qQ�*K�1��k����ei>z>����;33������,����l�W������uJ��	�>BT����8�	O�{�I�Jh�8����>6���{%I�F���S�������|�-�G.��$A�+x��������9�o���%?���=a>_���}]������z��%}��x����K��������B|�����{y�Ott4�Z�����P_�S��aLB|������zKHH�����.M��/a>2sm��S"n��!>2s������w�a>R/	��#S�Jm\���.,�^(������� ����������H�A���#[�Jk����<m���
��v������WZ�B|��������=�%a>�[+%aY�OIxQv6������Z6+���l������.�GZ��}y���Y)��"�u!>�zP��������Z���#���#(/Hq����R�@I�fdd��UL��I����/�]Jn.V7�|���Rk$���\]�����m�������k5s�0�R[:��H�O��Vj������%���W+++C^^^��e��0���c�#��4=P���Rf��S��*^�|d����+��d�(++B|d�Y��������|�_�� �G������}X\��Bq='�+��d��v2Y��l������H�A���#[�Jk]8i-�e�^��l�+�u!>�zP���S|����]+�Z�#�e�^��l�+�����t2��U����[��������Z�#�e��[:�,�������WG�����8=��K��#����`�x@�dDa�R�����i=(��B|d�_i�������=[a>��p���#[�Jk]����]������$�Gvk�$,�)	/�����VZ��f���m{!>�������H�A��/O�6+e�V��.�GZ�����WZ��R|xA�h���
�����M��FIOO�ac %
c((k}�a�H��msO�O�,��#3���a!>%�F�6+E�}R"���9&%���(X[�=��\���Z��|JE�>);�	2������������J;�:�3�*t�n�]d�ea>Y���)�D�qqqPWW��#�C�|>�:1����f�V��#���\��[-���,�j9��^�W�DTn���oi�i(GC.W�J���-���9�*�"CE'������g


��.���PJ���Na��4�*_���$�#��a�Z����|�k�'Z+�t(����S�<�����[��YQ>(��PR�zI���D��|Jr�����e�!7M�u����
>]]��tQ��T4uS��U��)��d�W�J9]P)���o�	��%0��M�������J~�G��'��Kq'��-9U��K|K����_��8^�M^��_�����]7B|A_������r�`^g
t,�~�QH���Y)�eiA��,�+�m!>��P��[|xA�Z\'NF���K�~�&���y�m;��CF���iT�����#�x~Q��_��mn�*H��������Zzh�/��
��E�5BbXJ�����;����!�_��M["5��}G.����O�V)i����P%���)���RG�l�A<mh���g���N2�^����8 ��h�s?\I-�
u�
��wiE�������&����J ##��*;Mz96�^�w��0�/z@+�*�x~������|(Rt�!�����p:�����L�����=T���j����]����F-� &�3��jP�.�+l��xK���^(�����xA��,o�{�|d�^��.�GZ�����WZ�� ��/H���^{^({1)�	�BIz��������F ���G�x�8+H����O����>���/H�-�nIy@�J���kG�J��� �/���~qf�-�G����P�?�����t4���ko<�������*����k��[����H��Rm ��T�-qg� r�	^8zcZ���P��=���J�n���u_%Q��+��}Bx�A�z#�m���%
/�1h0~?y3;w���Kd��P^���+V_�����b��8� IDATu�s����j������t����6��|^�q|�AI������p�<w{.�R�b�^����VAjl��Y��~D��{,�b��q����|\�������>�#S��������(������:�����X4���=��U�d'*w�;�A�{{���_��/��7����F���:��G\j�T�����}^�%��O����xU<��oYy��.�Xw�5����� ��,=��q
0t����qeI���������wCx��Uup��~��������}��_K�������������{]�w5�c��c���Uuh����������AI�j�����yM��&i����� ���T^X��>�]����[b��K���3�T��.�{�����:,Ixa��e�w�W�8c'f��(�<

�0h�<��������V^��+^n�	���o�$���	*������K�.������u���e��P�2����f����F%	/�ZX��__���������&��4e��`7@��`�Q�vIv/`TS����-����h�+���*�O�M����9�}%��BI��
hXW'���Ay�C���dR��rP�����7�#���Uc�q���%?R.M%�������K�"���&O_��G�V�7��Hm�uI))�k(C�u��I��|�^�"''����~m�|�	�I�{��P����,L3J����\����a>~�>����Gh���@i�k;�qp8����v�/���R�(l����%�L���.+�B|J��w&�"��W����������W}ux���AX�:�����k�K
J^p��B�J�p���2
/(+(b^�n�s� �!�]^<>n?�~#<|��!_
����$� ������t��?4�L��~s���w�xv��/;�b�
��&PP�e	/,������~ux����-kb����y��D�?���{�/V��6*ixaQ�Xxq;Z��
��AQV���n5���'`�^h�2~�����/H�v
�Z�i#�������_�;xAw�.���A���W��
�H���S��%Ee��;����%O�xA�R
hWq������`7t	|v�Gnv���T���:��W���t�K^05
q��#3:�L�Z����R��g�e^���
��	����eI�-�h��?A!��g^�/^����%W���)�i����������b��>p�Q
'�]Ee+8�}Kx����!�h��!��m�q|7�/���G
��X�����-���Y4����]F����Y9{�&n����'�%����%I�}uU�k�
�r���-<B��g+�$`��+���.��+��Dfv~��?��&��xA"w�Zea���\]�����m��H�O���X	���m�����X>r8p�����DJ����C����������H���
��w1���|1n�z�!#�2Pn==
�`�	�>-f���V�&F����p��N�S�E]��n]�w����Z�-8�������$�Z��������c��H�LE��S���A���������m�r��.+���\tl �Gg�2���SW�������m���xk���|��6z��N;�ab�5����K���lx�\�����0@vNz5����@���	r��S��|�����999,����������qp�D��c�����}M-�����{�lL��	{n�"PX7||��`����w!5#?��]u
<
����|Iy��hX��O{������
Lutq��h���y5��|~?����������3/�5�C�
+`���
�wM[����|����BCYs;v����"����z�m�����n�
�P�������q������{9#$6������&6o�����71E��k���{��t��=�o�����D(�+`��C|\SZ�����O��%)����������"��b�>0U5S}�
EMU�r�����CH	�F�5���*BO<@��3�,�UL���I�>�������3EnV���������<�������i7a��N�!�V(�^
F�����La!�jT�T����A������e���/Q��%�u�
%uE\!�!!$	�rP7P�~�4�6z�n����������_��Z�W��6b���~uS���wr�e�O�_����jz8>�"W^h0��v������ms-���b%�1..������i������n�}�������
����=~�c/�����z��IXvr>fwYH�Mh�����
���-��S��P�k��#�����9]��~�pe�r���}�j�&,?���6��4�^��m�����kB��c���n��	�~@`t��V��u�����3��]��g+���`/���c����J��nK����,?���u0��x��U�GW���]����XD`Flr�+a����|*����������3o�����+~����W3[���
r�Xu�0,u����9���^�K��B�����Pl����0�^g,������S�HJOE:m��=�-��BG�U,��
�	��������L����VLo��+/t����`�zyW��$�W�����������}X�a�S���sa�n��6���w5oo�a����U����F�mP���71g�'&��F�S�����M��t�������W�hloLkXg�B9����H�Y��s��	@st�eN�S��#Oi=g����"�G$a�_0��Q�b���XqZ�~�s��w�" 2	�
p���B�Y�o{3�oe���d��jc����L��)Jy��i-��5�>_p��$���������W������78�p#�yH���~�G���Em��tO�L����}y
��To��h���]���n���������+���~g�n����O�\A�&s�@�_H�+\z,XT��Bv|�w����l��U���5��9Ec�#�|�|�6B���Zv]@�R�������.�!��3�N�Gs�X�����k�<��h�af���UUGTJ"V<<�������?�����V	��?���l�sn�#��{���z�m|4�����'�F���nm���wt(���
;:E>��;[�8��u%e�:��^�*���Y�un
������{����$� �e'eh�����	P���]4��0�G��3Y�w����������`-$���Z�	�Z9t���['�p
R^`�����H��)XN���{�B����8����9][���mO�KH����8���I)���5^F����6x<���h��TUt����wP�P#��@����_tW^`���g���V�hmk��'��18U4����LhB2���X�9�J)/�����W@KK11����,0U##s\��j��P��-���N�psm
5UM��}K��������p%�W�=���tXZ��w�,��z<,-���	X_������,��1���� =������V^��l������"��w	j��M?G���?�]�����������F�U��&#��~�������H|
��x{b
�=a�i<4Lm�K��W���an��x��nFr�k�����J��������c#�{��}K�S�&*�g2Ajt��g�������i��H|�����:�������o6�N�N�k#���������Lt���N��}�6�}��f�����9:��}6������wH����5^��#'�C*��{���:	�8��w�W���8]`�v$���c��/�[
�������A��F�<��[���m+R�����q���<(����i����	�5��r�D����a�F$��@����������Y�JzzH��B�*���R^P"E��Z�9D?IC��48O����9x{&	�
�(^t����_Tj���;"���:H	��u|��#���v��x�!1(��R�i����w`U&]��]�(��`v��X������Z������������b��� ���>X���d���Q�3gf���������1k���R�{"��e���C�Z�������H���������d��#���y%���R��"��3i-ep�y5n���,QK~����_OZ�2x�$>��1z�.>��a��t��u��������Z�g,����H��@oo�skC�T�yA,�������8,?s��&p������O^��p�>:���c|���/��7'�z���9��/8�b�>��y;8�4*������L�����F�������r�m��/�H�P�@x���p�&��4������O�����wa���
���g���-M
���C'/",<�.h�<�V^X�n'��CJJ*�\�I~@ycC�����m����.:�k��t�}�m�G���)����d�������{���
KsS�V�BbR2��=F}��y��� �U�L�/4�0Em3cJ�-�����'�h���\�/:��X
���5,�:,��ih[���K�8E���V��6_�����I�Oa�V|m������/dy�[x���
�U��CG��Nm��.�{s��.2��??��������U������$�l�/�?>	}[�BXm�����j�FeR3����7��v��.�o0�n��v����VQ��dl�����V���i��nC0A�m:=<SRP���3����6uc�Izel���������f�nPW���+�k��8zc9�uZ�Sw��:7Ia���`@���k�^~�(��@/�%F�I�n�^�n��u�zqhb������o��Z���TT�~�0X���h���O@?zXeF��6jB�Z��v���OP����){v���������0���J���W�0�_�}|8�����;����{a�����(j��=�j���B�m�9,`i`����0�@�����F`���!hhb\���Ij����w,p���wn���������^���V^����wo��)���]�� ����U���������[���@����bY�������x�>/T������W8��K��n�;���;������������Es�m=l
�^P�RE�M#��w%�;8"��#T���g ��5��{n��Y�V&<�A�����8�b����/p��������	O���i�����6���7."��'�c���m;�w:�5�#{=���`�7Z/k�{�!!,�����_4�U��w�9����[=E���
��9������~`�%Xa0�]���>���|��D���������;��?���gH���6�����{pZ��
Mg�����0�����T�<�.[�qu�?��q���	.M�
uc5R���sco�Z7z�� �g^��#VQTxa�����w,��+#$:L��<m�o���\������0�r����D��n�i���px����x��>X*������#�����(O�����8��&���U�����[����3��m	v����YB) �����.����0���{r
����S�~��rkQ�����$��0��,L�;�	����Yzz�c/p��a8���7~�>0�2D`D@���6h3����X;h�X�9��������}�C��6������������	���i�[����m���������,z�5GBJ���c"�[}�\�5Bm�x|x��cM]l�s��p5�-�����>
~�^�-���nt"��m�t�mJ|Q���A�[������j��`�f���p)a��UX`�g��@EVN�N����*��E����uD���zV���I���2)����������M�g+Z�>��j���_�5>�����]v�j����A�zf8� ��a��fV�=�8�V�J7��|�6�(����nv�y�
�gQ/G,<���]�0f�'�����	��ZC��D%R���:5��!O	"���D����Ll<3�jt'�2^��K�	n�������7�u4�9l���lJq��z��e�������hb��C7q�����zWD���{����D��.��R�/�c��fl8=il�G��������>B��)�B��)��^��87-�������y���
�5Z!��C��4'���m7������,����d�=\~%?xA���%M�c��}hY����z��C���=���������l�&*�#?aN��w
����R�
��<�_W�S�B��D]�~f��K;����}��Bf�m��*:������w�A����5a!Ab`m�B�K���1\�/R��6rzr����Fr��UUd&d"�J"X���1Pi���O�Hy���9C��� ���vH{�V`Ls�4��g�&G���,�p��Gl�T��_%�+��#(-�=o�����w���~��km%�a����WS��zv�����8��5f�����^`0�<�i,��[{�G�b�v����6_�b���F��f&�B���s���c3������/�Bn����6�M������!����)0w�����=�Y������V����1|����w>����c�\W�#��W�iX�n�Z��%R�3j%N�\�n]'a?m�G�b`��K;0h�<���k�\�y��l����U�^1��� ��%��=��e�������x�����������6����8L���*j��e,�`��+�o����@0_��#��~
A|�Gs���m��xst�����e�	Nh�
U�D����|8�	���������~<Z���G��j���F]��(�|f�B���#��^K�������Y�O_l���Sv�0���H��f%���jC�$c5�!4&Vo2���l�h�����p>�J���o��S������&
[���99A�a�/����!��>�������5L����0��
q>/�A���x��o/TY�������r�A���7o���	xuvy�����T���q��U����xx��$�C��U�>�S3������5��/�|'^l����)� �/����M�������C)&�>*�V�6�L����]�g9�9�qh��,��^Me|�NBbh:����h�O���U��4W�����*�zH�~EW<`��^���+%J
;�~������nK8f�G�F�r�h��VE`P*RR3Q�A�.��V1/xASE��v�4[���*.<��������7I��q}�w�>�;
P�X���DS��^�������L|����>��>����5�N��|/x����'�o;wn�y�����/���$\I$xa���\ya�����#���t�6L;�Wn��+����#gP��^O}����V� [y��p0�`��u��z����vq5��6�����Ea�����/������������{�=y$����|e:�:t
�

�>a�������EC�F�$����9q�F;�/��Ci��S���cB�:���
�#����6��v\�w�|��8�byO��rW�U6_�����H�O��Vl�������/d��[x�=���=jV��������k����P��"��i�sp*.�B�!�p��@���/0E����}��p����TON���(�Z��uJj�	�����2m��SS�B��S0��j�#�NA2�J����88��t�a!���|�N�h�V��HK�K�1:l�P�y��\���.0�AA^��c��������b=� ,8����F�����
���j����6�.��.M���QK~i#���I�A]\�~�c�IYc�D�\�7YY��b�����njW���?c�%�/Lsq��];����NEW��kWiS�=T(�]]KK�_���C,^``�P����U~i�Gz��sWF�i������{���\�����w������>�0l�0%kCcT56��%ZW�� ��������	��^��m���p�?�T�C������C��V�>��T�c��	��l������S�����WA0x!�
Sh�x���;a��m��
�~Xp���E?��_��v���>B.x!��;W^�x���dF IDAT:��i<�{RJNY�������~�N!K'�ko
���Pq@3hV����Z"�W���������[D�����'�hS��J����.������tz�_���L� #-��L������l�Lj��S%���Sj�zcG}x�~��Nz�r���N�t���y{+$G'##=������������7�`�#�:ru��M0����UQ�V:\y���m����������OQ���UMj`h���6�a���p��}mUm�������
�!H�b�q��r�&U��������C���{�B�#m��w��U�\�AOC�o�{��7���g����1;��m�kl��	�t�NT+����9@��6S	h�E��'a���\M!�`}U1����L����)l*���m���s���!|`c�<�����2~22;m�h4���/�����5��_z��S����P�k�o��z��MaJ~�����v�k���=���E'i�0�Ag<
x��/s�]��'����+�0x!��������Oa��J�p�{��	>�f���%6��Wv�������&���Q'�2����^�J���w��@u
�
�'N�0���{[-[8�8��������b0��%��xl����d���8�>�@�B���(+���N5��+_���0�WHp4/����i=+r�=
%!���&<g��7��������GjBui=���J��_��cb�j����F�i=D���y�z���
�����(��)/�+��]�Q�s���Z��4������]��x��<s�`*
�����T��Z8��uF�m�c.89�����<}NlY����G�_Q�bcRr�L��	���*;p�RKM��K'E-y����K�H}�Vu!_N1G�C������^`�E�&C`X������O*L���SQ��h���@+QKAi#Z��k�J�����h�qc�qy���V��=���UM}SXh����#/�qh�9��@m��d���M�a)�u��62�����-{c��C\���V�sH����\����"����1�`0��WqO�Mhf37xA�6�4�)g:QCp�RM��T�����<�W=H{����s=&�d4	
:��T��%���������CR��p���y����P"����`<=o�.���� ������6�0���N�����ut���*��`��C���
����M�����*v�ib-����=��#Wm`v�H��)<h���RxXO`���DV��
^`������������<���\�����6�����B=��*:x!�o���9;m���~����@�6C`^�`Sj������6�Yz<V�t�����L�������h�8k+*���ql#R
���Oc������Y�����^9<'~Z���F�@`��������D
	�	@�������TxJ�������f���`

u)�F������{q>���0����q�A���:���~'/0�����������k��
�6L@��Ym�X�������2m;�6�?�����wp���n��k4�)|n/7O�*/�L��u]�������L��{sRj����?()�^Q��g�z��	
����q#���sRA�4i�Z�����s�53��{���^�<s^�mR����7l���� �������Y�����L���*�^7H�"5�t�&�UH��@���s��Y��cy�����J���'��*P�������F���+
x�WlFh���(ZKYf��HiAQ�S�w(����I��
�*2�'�������tT�����|`��m����sX��VR�1E�t>���z�V-4P�T���!*:]:ja)+T�RBes��@�6Nx�"	���E��_��65����������gt��/z��K�J������������!�T*_$�����/ �S������-����9�H_t�����Y*\�^�����4^	^8~�
�[[����;��o?��}\�i��'�`����6~(����1��H���}
J+Q������
�'d�1y.��:���l�s,���&��}��t�O����H�,����9SH&)�r��5S�sS��r��B�9|Z������Mq��
�HNK�eqX����F?^��/=Iya���hQ�"IbFaD#�SF0�B�\h��k��K�����)N���&�Y��[x��5�zQ:�������D����/��/4#Y��'��i`9�'��*tz@R��-R4hj�g�n��aU�	|�/���(Ky�<_���z�x��e3>���V�Q]��#_�4�/�l��)/��n�^I�;����S������W��u�A��4��D|R�w�SthO���z\E��<d��`ca���fsa����������
F� 91	�]�������6�+���So�=v����C9�`M���7�������CB��aCl�~
�11�)/�
I$1�����#F��
Z&9���0�A�"������;��U������ZA?R^�B���J��L����������[�����yj�)G�q���wo��R@$�:g�
�I�a��;�=tf�<�)�:`����0H��B8W��^X��)>��>b��Cv�~K��>��`�]�����F����M����G`���Q^P6���}%|����������2��b^���)�GR�,
K%!�D'�����,����~v�����zr'x������^���0�:���@#��J���l��T��)"��iE*	�Pk�
n/�J�������8��<�u�����z���@j
,�D�_Z/� O��S00 �}�O!�,G�"���t�I9:���������pCm���O���f��������V���JKy����}g+&���S.�
�lxaq����6��"B�z�q��j6�R,,�>�Mya�����.��e����P�^>�u�����[�T�a��ar��c(WOXsi9I=FI^:j����������y��#q��)�gb����
���4:1=i�Ht���K]3�n&�}�c~!����O���%��\�kV-�.b��-\�a����Y�?]q��������#c����w�8HQ�����n�{s��ml<���l ����s��uX�-��	�tB��[�P�U^`��o�a �X�t,��c���Ei(�_����R����C&�}<0�aL;��N��5������.�n��x�O���k��9�����P�S���3<����\�hj@y��W��LlW��s$�Z����z:P"Z���V�")3$r����>���v�i��t�ER����*S^8��M+c�ml'���#O0���;�c)<�#E��H�������=�W$�Z�I�6�!Wy��/05�#T2�G���)���x��M��p��,Z����w^�SF����B3�>f` %��z� �����b�*�@H�[�:�.�}���yq�*�����9%��B������d O��,]KQTx�<]R��K`���9GJB���]��H��`/I]�V�Axt���)������
��$��e_���8O��)t�R��uhJ���(=DgK����gRQ�VyA�6U������W��
�w���.�������bi����SV�9)�\}Oi�H���UV?�t}N!M�����ZI��P�Q���"R}Ss��>"3���/'B�'m�1�u�7f]�5F����rpam���y�,n��	�d�	��`��F`������t:��/�F�A���O���E��Lya�c��V�t=�����5,p��b��������c
#�O����+�J^��TV�f���~�}�hC��x`��;��^0�4f��Di �B��)��Dw�3|�_+/L���KI�a:V��N�Y�.����6�����SxR_Ly�>�;1$X����D^:��J��Q�&>3��I[��@�Qsx���
����k�7�H-"%:�����B������Z���l��)/��xGj)�3n��	�`@C8�nQ�+��4w����@�O�R����0x����\	��K�rM��i������`���/|"���l�����j�+OJ+U�u��P�y��B��?#�>�eHBQC������%����+2�O����
/0���
�����`H�G8�b�#�o��S�}[1/xA�n]J������l���F�	jU����@���+�����~L`)#X�Ny��0[r�&0h�N8�:�G�\Ds~��2H9��T�����U�X���A�F		���QA��R���^y��,f�)0����R^x!Ky���
R)�
K3�j(�SU���4"�������E�����[�r��QQ��J�x-������z����,��G
��� ����SEd�&��f������F���m4�N����`�����R���W�1�'&�<�5��px��}�����}\u�DG7_�i-�/\�;�VU����R���H���Po��S���!����e�
�xA�DZ��$���������8��
Wn�#��g)���vNM��^�! (�������#g�Ji%X�#=Rk��������$�'-�hk���:�����gX[���.�`����u����Oa]��:}�����U|i>L���C�]	�U0W< .�P^KSI���Hx�!WI�-^`���T�N8���`:�>x���L��=��Sm����VS��v�J"�R�<
���m�������f�0�����G%�G�Oqz@����-�`���y�����{/}���E,:�)_�������9��b�����e���g�84�r�S���08����B���m�3�e�V3z@��w�Ix����A�)/0����H���:t�t
����>��r��!V�F'������0+^H���L>��,4����>GQZ	u���D��mx��L�oB?;�����p��tH�������
eJEQ��:��7�^`� �P�6.�Z���{hY���^�~)?'I��t��"����f����M��<u� �I�W��x]q���o�[�o��������('��S����}�?n�X���+�V��{�4�QNy7����_c�����\�4w�7���ih`nw7�m3J�0h�:t��e�q����m~����m0�r�~[
��z�mS.����c��e��j_-��������ik����HY�1hO�PY��R:\����n���lSk��[�z(O5����Y*�l��1�[�TitZ���
�m�`��{��������`���myS�;s��I���u>/t���h���QY��Z����W}�����j�Cd|<W��^����	�e�����������=\�|���x2m7j��3^���>������w������V�$��C��>��\�������+���/#���w����aH������t�^��dm(|Y�S^�=��RE���_\�u�������;�&��>_h �����Y'���ucU�������y����A��F<GS�
T�T�AfO��uO[v;�z�O�#"Po�=�cR��k���BC��
�������Sj�����^���	����n����oA�H�.�����$Xu0�sd��VDU^����)U���;>��O���5��b�����FZ�x���Xa���i�����8po7O�`�[��f4O�RH����l�Q���\� [9�)�TL�`���$����n�����r�n:`cZC6��k�R�8�u����n���g0�4��$�iSr��`�
�`�Ec�f��p�*v��Hs��-�0��V�tIY"&!
�VMi+������c7�v"1%��=�'����+>��52>m�:b���%����������Pnl���������lxA�6"g9
����}@ml2��!�D���g��b�S	$�=��6�B'OMI�:� ������"�5�����s/o��f�p�6=tH���4���L'��i�P�#mh#d�����#�y^��g�'N���G�
=`�l�/���`�I��u�5#@�ozV���o����^��@o����3/xaHsKZ���.e0��Ska�/T/������g	�=��Eu#,%U����
i/�S;Cm\>����<������T�����������	�����s�FR*
D����1����H�z��;x!���jjA�9���6o�Kk��n��t���oP�L[��oK~�B5�FhjG�������?>���JZ�Bb/�����
�h����.�P�����0�a����w���FW����+��4
]�B�$t)�s*\��.�&���c�>��ZVmq���<�D*�)�<�D�s��m��t:��������v~y�iaQ�9H��(Y�A�V�x!��d�U����-w�.��-�����)����s|�~�/���*Z�Bb6���77���\���-:�����`lf��.�)/(���u�s��D:����,�����V&��<
��=���<��m�y�N��������hh+�����S��E@\$�����k�91���������hSSSI�\XD�����1��o��ZV=��f�����u}c!b�M#��s<�KXn��R]%�uU��b��X�Q��l5
h���r� ���3hs0�]Wc`���M�>������3
��T�Ay��H:=�X4h ���XsS^P�{�_[��
��$���k��!KM��U+��Ly~��������W�Mc���%�#H��T=6�{�jB$�h����em���`�v������Z�mh��8,����r��~94��@0����L��[��i��`�����6��x	[�����{�����i
��S����H" e������(^h��'��nK���������m�,$���=��� ���Z���"�c��[�D��6�h?���w��@9�2������o#0����M�����������N�Zk�:8vb�wkGTxA���X��r���i,L)���cd���<�W���M��y�����_�R�6���@��2��XI�	�����l�Fm>^���OT�0���	"�/���
��]����C��:)@8#�R����2�3��iqu�lx���.d����&�"E��d�j`��<���)�G}�2u=�\7lHJ1��� �8Re0m;���`��W{��	}uX�����
C�R@U�<��Y�F�/H9#{�l��0��)=0PA��]�E~����v�L��!)t�������5�G}�%� /xA�����R��vwG��s9��������L�?n�����aMV�-/T]���P�-��y�*�"��;(W��>}Qe�|����~=�j�������^P.'����k��F*o%�@�F����;Y��w$U�k����{7��`�GI����&K�������IiAH!��G<�I�!�a�J-���9eR���M�
������."�����T,�W�^0&��������L�n�����J��
+Q��"��$����������]�.�u���G4�7���N�����Z����g��v+�P�������T�p�l���R����s�W���������=�����g���SEd�]�����%}��������"}�OD�j��~���b����M;/x���~�G�pU��)M�~/�hV��{��j3��BUA��UEU��U��U^��&���l�_.V]9�0��0\w���4`�[
5
��#����U��	^H���1�p����k",<��.������S^�4������hW����^�~�
��`��=<���?Vc����
Si`pAn�����	���-8��RW���6������X������M�(g.A����A��:m��n�+�)��2b^\x���-���i��6���Wq��S��?!>����k�B����
�������n��PT�����i#$5���FH����)^(��������S~i#$��$��/H�~i��e����GTx���K[�/�Fel���P�N[oFi;w�M������n�� p.� IDAT	��m#/xAZ��^�V��n~�Biga���PX{_��^���/m�6B���������G^i#Jb,��3����S��E�$�oI��2mDa�!K�>2�d0G�����(�=q���6B#R��o�)�]Z��/���K!�1�/��o�����^(��)j��������t���z+�����U�9��c�9uUUhki``��8t��w�B�N�p��'�	&�07�!�IQA�dTG��+��������c���!.���p;����E�f
ao[5��tj}���PQV�������.�P�e��h/�����Y)]�����zP����H��E�^��#�Y+B����(Z{^(��J{k^H(�!*��xA|�I^�R����sI�^�+8l��N����B�DtT�x�{���y��������F"��^(^K�7I���T��@JW@)
H�!��I
�@;�P��Je^�\Xx�h�L$u�xR���4�e��H�^(q� x@,��X��rY���#�(�B|���bw&�Gl�k^�r�/��+����bqs�u"(/������MyA*N��Q^(�sxA�
�����x��6�Pt�cA����PWR�Iy�x�����-�E�����/�L����(��'= ��
��Y)]�����zP����H��E�^��#�Y+B����(}�x���D�#�Iz��m	�B�� ��B��#��P�$�����mx��>��/��-���< ���d�����[����i�_���H��Q"*��Oz@������'�G����������m/�G��-�u^���/u%����P�b"�	��$�Y��x��c��x�h��^(�
���x��6�Pt�cA����PWR�Iy�x�����-�E�����/�L����(��'=����s�32J�'���@r,���BA��r�i��8$���Y)	/J����V���H����Q��#�Yk��c�D>��3�$�����P����H�nIc�����������������S����P\eKOl�:�:��Jt����o��a>i����,�g������
EE��+��O�VReRJ��
7��Yy
d���|��i�P�(��R�\*�2%�������2���.�i>�N$S^)JZ9�f9�YQSS+��E95
	�E����d5$���>��|�6�|W������>�+��|�HA,]$]Jj>y�C1>���������05�J���&Z�#�5WZ�#�"��$��{��6����%���m)��&R����#����W�����-�k>�[xLf�f�������@_F�{=��<A6_�:99MY�(��\�G�e��|D��t���t�*X-�^(�����eY���S������S��J�����~�}�B�>*�B|J���-��`�d�����?C]]���%�R��-�Gb���!!>Rq���
���+%n(&&��������0(��$�.z�B|D�UI��S^�������X��hq/�ZB|J����+�G4?I��/H����2�^�n��J����������m/�G��-��������b+���+\����H��E�.����^{a�Rz���e!>����l���o%a�,�G�������
!>���$,����g�,�G����:��e!>����l���o%a�G����W�~\m?IDK�!x <�y��K�2(]Ejj*���J��
3�L�+JJJ���Ja���6�|J]H��!>�������yY)�|Jw$���)N������Y���H�R1�S^.|B|
���h)��8�\�>���xCyy��(e������|3!>B|��ei�����l
�)�w��}	��g��B�Oqz���������s)���� ������|��^�j]�OQ=(��B|����ZNZ���m/�G��-�u!>E��t��������,��|����j]�OQ=(��B|����X/K'����e5H�����(=�)�����G:�,�'�������#���|/J�B|D��t���t�*X-��Q�����j]�OQ=(��B|����Z/k�)K�{,��|�����^��t�[T�B|��A��6+��[IX�#	/J����V��R|��JI����#=�J��IxQz6�R|��J��IX�#	/J����V�����$".�(��^H�OAfZ���<���P�����z��)��U���R�$����0��"^���)Y�����<T����Y�O���>����{y9DA�v�u��T����RTT��� ###��Jca>�1*���0���S�JBj��Xa�S*'B�������J��Wa�#�����d��)������c�/��4���r��Hb>�N$=�:��E�^�z�5CY9�n.�l��&�d=�(��8�\*��� �"��cDn^��#�$�_���`EY��g=���������%s�)�X�56��zj0�y��d����3���Js>���6$9��LU��)�{��������"�����A9*H�6�U�d|$6�"*�|�U�^�Fz�NS��999���9��� C������an�����l4OL�LF��P���=�pCM�+f�c*�"�!��w�$�]A�IK�EJj�D���V	�1j��SC��W���s�0�,�B��B�Mh�_�@^�B��Hd&��wu5w�O� �������������Y)�2(�JB|J��"u,�G$7�X��^�ZJ��&�A�/�����ut�D���z�����-���������>�?|.���~���s���wO��[4Bh��2;��&���n��y7VQFzR��%���*��)pK~cU������8��mAS^��F�
��E�����<Z��DBL@��`��JvX�4���TVV�uIu|���#���T����4��Q�?���T�%W|0�����S8A�R�6��3U�q���*�T-�=Y�X�T���w�%������IP�J�1����,�RY��b��#�ERH�PH�	���xA�1.k�{�|��^�j]�OQ=(��B|����Z��,
�BQW�����^��F���-������Q�D��/����ZK��jdK��x���G^��OK�E^�L4xA2~,�^(�����@x���	������FM������|_�����p��&����}�����S+�G�A�2[�E\BQ.���3L�����l����&���y����8l�qJ��HMK���� /��k���J��9C}��E��
�;���Z�����j]�OQ=(��B|����Z/k�����_�����n����Uu���C���������A�wB�q�����o�3�_f����H��k�&n���s�-QJ��/�S��9u*T��c�n��o����W@����/o��$�]iUvl�
�q�}|]Z]|e�4���.���������z&23
/�*K1m2�D����������)����'���i�Z\����;kf����89���][N_�k�����#8�KO4�������xy~?����*��K������]�	E5M(�k���]b����yxq�����]^�������t���u������+�X]{m����j#neI��S
pi�gZV�~����<�����Y�;��#)/�;�"-&��)#�\<��H&�������#*!�
�RQ���~b-�i�k���7x*��Fv'K�4�����9.+-���u��Xc(JeI��v���K�X9���+�����1�}5L��%V��*K[y!":�_����H���x)N�LA���0���-�(w��BSMv���5����T�Kg*8I�����n�
	���:���V~��GV^h>d�����Sq}��b��r��PV���{�j�]Y��
,�u�����W��Iq�x~�P��m$
x!��9(7o����1x��C�������]�j�f��~�c�=��5;�.��/���G"��	��5{�5�Q����X$���F��-(/|�"Ay��eS�*�H0F��BBb6�<�I#����%5�'�m������\�6�,�
@Q�����c@��l%�8p������-����}�������i��9�����T3���|�N�<Z��R�����xA��.k�{�|��^�j]�OQ=(��B|����Z��,����&�����zF�J^��WD�a�qh�x�X�������[��M~��YG0X����b��fe��+pt�/HO��FTAc-ixANA��7�M�w���a���C�,v�~B����9�p~�����-��X���z-<=�5^��7�!�yG������e*�mW&�99zo8������A�xA^A]������l*��\��L��W+"Qy��/���^����J^�1)[=��J������('��]l���'�1�a��n?NE%9|��(qx!--�o����b��LQa��:�$�0�ikx������^�7��Ae���T*��������H/��	��2�k���Pu�����J=��I�l����#
!�]�{����7= _�
��]Dz�G��/=���!��
��/|�"^(p���
e
^`�]�bfN����OHD@�'ps����0vho��a��3PSU����v���A�Z29x������������3�nB������\�����x{#]tn�������������m��=h��6��T^����sWain
��V�P��&�0��O�����AJ��������u�[]��?��I��i��Nm��nYU������u����H��",lV���}]�O����������}���G���Sn��L95h����!��s$��>������?:"gQ��h�aMC�����r
�����oo���I����x�3��d�X�R�zh�y,de�p���E�a�/;�G7��.Cq{��~�r�o��>��`����o���#91�)�L������e
R��������P��%\8�7N�?3�:���%��?�99�{����b�o�x�Ff�pd�|
x������*&<�����[AIE
��9�]���n��-&2g����`��LY���:�-�:�����R�������F�aK�Fu�#Br��/����233��v�K��=����'���x����-�?q������otH��m3����������E���w�o�J}���c������S?X�e��\;�	19k��N;������#���O3�^?�ay+\=���BM���N�IR�PTR�..
���m�G|L�t�X�-�����c�	K��U	�! `����s� T�`��
d����i>b���b}g(�����9��Lq@�|�aX/��������x�����<
��xo�5�+d�Q�ih���c�"$D����iP�S�O�o��kh0�7�h��R����S�U���J�T�NnG��������4}
�.K�48�pu������S�����%�Z���@8���P/0������97��	�a��T
�g@bT8W�xqf7o�������\���K�������o���pYv���1��G�V�����.S�P�����}���BN�ktS�f��kK' �7%XDFN�#��*�)/W�G�Q4.9x�Z���i��osE�&���I����WCYC������sa���t=K��zZj�o�
m����6��-������L��
�r�2���~A�~����U�������/�����Ky|~�^�6�����l�{��y��X������@C�/���kT0j��	��),�{+7���*^�\�������4���=<{|��@9=Kdd�����PTP#���,?���C��`��
G[���ws��+C��g^��:.F,�������'"==E�y�����%u��j����KC�T��p�T4��dQ��:�8�2�������H�|1c��!�e�qiS8�=ID��tad�D�6��?'��Jp���[y��F�_2W^8�6�fa��@���mQK^��=4�O
�x�
�Ae�w�@�G��E�d>������S;�������#uD=LB�{��k��B��#�~����Y?
�]
�q��S����,"$!�d<t+��Y
�*2x�<��DW�Ey����RT��Jkoz�TG=���?�+*LoS�����l��9�Ii���5��A��f�@*���HN���g=`^N���A�d����?o������)�K5����?3��v������`F�����|��H�p�-����9���Om"I���������n���\ya,�u��k��$�6O��QYO[i������f4�����(/������^���o�b�e���v~vW;��)"4&	�|��`����>BMI��B����/�����=�$�����{L#��F%u����}$F:[��H���w�/T���p��kp��^�p��U|0�����U5@��&�9(�?O=GpT�H�Gy�?(����9z]_�fw�I���,�6W������S�,���������J�#�tR�(����B#3p�^
h�qMT5��C�4�xK}d��C#�y����|�`�G���r ��5��~I��E-�?J�Rv���n-y�G�� �D���Q��<W^x�����L8X��6f����$�07��E��,2���H�Lv8z#�_�l����N�N�>����"_MA*���;Z���������L.g�"��Jy�u*[aD�v��������=��C��?,��������������J����>�1i�&t���Z
��D��TL;�
����s��PWV��[�q���HC�My!���H
���H#����!oiN+!��;��Vt����E���6BEC����<��?<�Ww���/��	�O,C�f}�B�������k��N��[��}���5�zM����c�R������F�;o<>���]Q��}.����0��)/����
5���}sP���P�-O&�qk��h�6����k���~��c�XLm�"5)���\yA���9v�{�~����&B^?����|m����O�xxz"}���|<u���{C~�B&-���g��Y
M��o���%Gd$'#����N�U+���E�+_d&�@���[�@����H������x�:�CC��Lj]���BQ�(��w�#�U�5\�W'$\����h(��GfR2�I��."P��y�rHy������
"Wm�Bc���C�
��U2E��[H��f��|nv`E�T�U[5�����~��p��e�������62������ [N��[!�].���!-���
��b���f_W$y=G����TGfz4�:�����}/%�h��_i���q�T��V����*`��c���hc�F��LU}��jX)�B�)��T��@sPA����/-hh@s��=��1��SM���M��=<��vA%?x�g#C����&����m+�HG	'=��gk3���k��O.����sK1���mj�:�6-FK������`��=��Cy4=�^�J��p����2��'�bUP���<T�^���T^`�]�f;W^�q��v��m{�aA,
���C�x������=ru�C���t�4��yd+/�ftnX��7����+(�����9,X����P��|QX��7��?]�V�������s�����}���@�]�N�lL�0�[�2g)L��
b�d�'��.]�HMI{@xa��-�nT
���#<!5M�����B���P��1��V������P�+@����f�0��_�����������G��������
���kPjY
��}�X��&�r�w@ ��~�!A�QQ��S��C�
(������x!��Kh���m��`��P��?�x���8�����C���h����^����a������d�0k��t�p�[g7�A��8�mX?u[�A,=�R��������������c��C���F�v����6������w����`��O�8��u�|�?����O�&%9�?�s���Cn���#����ai0@�u�)�yf����{��_;'o���=��9M IDATaW��=��<M����aE��_�1sOb�o�	B�7O�'���~?�
s�a���X3������^���-]�qh�]���}r�G���G�������������e�<�]9��#Q�A��.lxH�v �����2f�)��������\7u��B��8��6���:�m�������l����[qfz/Tn�	oo�AC���<���|����n����r����z�T�c�HI��
^xs�,��p�����9�l��k,Wj�;x:>>��fs�0�������}	*�j��O�e`�6��HlB�N)%�Tq������#8T�4��7,��4��l���{V�
/��pzj�����)���
F���#a����La"9>~W����4LF"�S-���kN��"7x����y~���RS�����8A�2@���eT���WN�}�1�g_�������]�q��P��	����{(=�"�^:�0��]�$�z~�B�^� ��c���]��AS��\��N}��}��9�������2X7�����|��4�L8l�l�"<���l 6���H�N#���VC��6V���
�[�B|T(T	fa�u�������Cp��g"�7��\�����i������!���o^]Bp�#�l����Eb|8j5�;k�����Ut�$���}/ $�1\{�p�'T�q��#h��w<���������<�5��u�>�R��Wx�{	�Z������@����/��+����L�;6
�O��Dh�����-���
Y\Z��~��������D<��D��d���?��J�	�����4�_�I���G}�u ���u�C-��F��F��+NC������
O�3�
�G���� �V�!��x'S���7����`���B��]C���x��_X��7I~���r}�����<R���QUJF����:x�=)�0���[c`�VI$D{%sx!�zb���n�>�'����>]�'�A����������(���F��C�����k���?��,�c��zo"�(���
TlXQ���{��Dcb,�1j��a�
+
��"*("�{����>�"��������'��z����������'���BE~/����vM���
rTG0��>�rx����
|p�`���*��{��(�">zC0�	����A+�iZ����4(s��i
l?�������c�8�0��3Ta��J�,$Pt������/?B$�����/D���#;a��uT%c�uC��5��j�����*�*�?:���9������[S��4U�ndsL�����#?�5��Ax�����0f�=�3�D�J��,��M���'�+S�1~�}�k*c�m],9A���8��K�7��[�0�Cml������D`�����Xw����D�����c]Wu+kb��;��Vx���4���I�����Jc����e=fA|y\��N�������m�����x
(��K*�Lx��+��fpEL��� B#��J=�$����-=����0Lv�I���J�v&����/1	Y��@�W���^.O���-���37������d��]��)�9�x��v4/�t����	47+�e��������C�����_�,��;�r�(�����5x�������o�?���A0X�o��^�!�6������O��]9��������sx���.��\��~#q��
�ij#0:��!��E,<�W�)�/$�;�~=�ER�2��+30�1qPjc��������i�!��}�tj#vq���i{T��O��C
���!H�����v8}�T#``(���Q�P��6���������2����k�'��U�u��?���� .�5v?���C�k�:���a:]�����g�{��]'���Ohn?��?�A�f����
bB|a5�W�7����UP�V3�0����:V��� ��o����2w�^���U��a1�'�9��SH-������p�Rh�����d$;���)���
"��U��|�j\YA}�d�� +<��� �`��w��{7�G�DV|<��&�1�B���Pj�I��A������?i��1$�b���p{d�GA��b��B�i(��A4K�0m$2C�J@E3S$��LPF{���qA��H h�WcHy�*�����[!��2tAcm/:C��
b��j	����l���Iy��%d�U�<��`� �:�� �>�b"���SjYm-�9�����T���un�����D��i��Si���G�/�8����w@@}����3$�@�xo���Cob�U3���b/^������d~�B�I�k�C��6�2	r�������	I7�@��=�V��
��f�����|������X�����S)m��w������4�1�5�(<{�]��c�fO����Z*��)�x�R~�����a���	(4BPT8�k��QElp<,Q���m�P�E���
�N����di�xA"���J�^8s�:�5���{�>~(��=�1C����$O��j�n,�9�;���[RBEBbO�P��)/�9t��*,�%�7i�R�SD5FF��~v<��~~�d���[0vx_RQ����W^���r������tq� ���Cj�
CLl6<���)ef�){�^�I����H��#c[���1y�����Hv~�����a����/��=Q���[�RXO������xAd�|�F�Cm��V��o�����������tTU1�C;(�����.<�7�s'�?qZ�[�^`�������������."e�i���}=�����c3p���
�����p��>����7�	\��v=��Er0e�@���I�At���1+P��n�^��7��c�Y<���6����(�n���7D���f�h�mW'�|z�G-�@+S�������2|<��@|�n�y`�J�F�!����6b��5����{YdeX7�-��=]�k���'/A~>����������������rr�F��S�=�-F;1E'����S����)����4�5��5!����i����I%���=W��$�1�#����F�������q��1�23�����s��|���2��@����;�����+�hs:���� &�]�����D)Y�WR�������h����k���n�����I+X�_L�����^���js�+|
/hR��������7�O��~3�����}����r9�����_��AL�!��3_x!gnr�J����E�����P�@
�:M(�J�������a-
*����>[���9i#z�qW~�UG	b�Cj����v�D�_�����MD|��g�E��������f�`����i��H�?�UI���e:����l��5����`J���\u�y���z��W��v�0e-WO���
�r���	�af7����#on��As<9�!w�mF�c��\����LGe���I���N�HI%6Bb���*��E����v�����Tv������\�yyeX���[N"��O�F���������^m�~o^]���;"8����������������E�������k���p��X����B�����C0��)_�X��a�]/]�v1�+/0��p�46���������5W�V���s�F�+�`��;�#�hs���Jf�9G{���_���]I3�!�?����t��\u������(5h�Q�	�������P�������� xA�DUi %(��P��
�5e��B��*���d�a�Y����i���!�������*��/�j���P ��(R�qL�x���:�H9�M#�W����`JZ���T&�n�g�x�'�#+XJ
L
����m��#8�0��)@�B�"G_4�Z;]_����s3��U�+9�#��q�
`VU��+0���s��w_k�=p�����[I����?�C��Xq��HG&zZ8A������QQ��_��0��Ut���nP��6����c�e=��zqu���������v�U��*��>r������!<��j�)���L��~�������I�(/�
Tw2���:�����_O�c>������d.+Z�8<�
�	Z`������jCW�x+x�N��A{���<��%�vQ���xz���1p�n59RH���B}.�+��QW:���!h��
hYliL���R*��)���`/�Lth.O

��C0��V�����b��W�0�@��z0��AA�puO�����<.�l@@+[�`mRI����T���O0k@�>���n=����,�i*Rg�������l9k,�����5x���fv��I�(��z���Y��?f��_����y�;�Cw��|/���M
P�9c�m/�}�F`T$&���UO��;��#�$�r~�B)G��}�O�+��D��7�)%�RK3$8�)��} C��$-��k7�<����i7��?C��Gqa�`��B%J������*�4GRHc�^h�w>\v��a�V*x����f�{�"����`����aln5[��z�\�y��*��@�~?����&��y�����z���t��;gs������\���7�l�����=+�X�����>��	x�8a=o����#p\=����6��_���3��2����ZH�
��A�IS���hnN>%��l�o_��H�r�=E��9i#�����G�1���G��B�C(�z���~%��,	��N���]�C���/\���t�6~�	hM��|I�<��5h���o`���s���"������3���"���k���vWo�;�1;�@�]�����Rj\����b���
Z��!v�!hMLq��qo��"��W0�$���&��M(��NcV��V9��o�"H�U�51���I
%���������������/d�� ��3���$��Nn#��)+���Yz%z~�S.� U�T��&A)^``�������]�1��1�<�_x2����i;�H0��U��U3����J��Ii�G�6������$#?x�).�S� ZM���Q�1�%����T*w����/�bI�`��~�N�J		I����n�|/���GJ�O�
/>I���`)�+�Z��/@��^��
@-��E�V���
N���_�"���0vX_�����<~�-�����ds"�r��^��f2l�|
\���#L�LY@x���,������x����L.p
_����*� ����+B����H�P������d�&*�
�J��b�#�D�ZA�D��^PhjL��������A�������B�&�q��7�����Fu8� Ux��!0�z�������z��,;�$��D<u=��v��J�
�����`%���[wKA��t�6��o�����qz�B4l�a�����8<�w]H�����`�
�R��8HO���y@�g���8�����:�
��7�G��|��I��{H���A���)H��{�
,���y��"[����E�l|d�6���W0q�1$U�^#�l�9�F���RZ0��P:%5y�Iq�`����X���c�-�)��@���-s���9��I�~��i#��������g�1�o��������l������mPPF�3x�)/��*�@{���t�Jx�$0���~a���$Z������Z���T���Y��:��o6|v.X�{�i�����.��W��"��DW��^`m�Z��
?Q{%dR��@"��>�l�������N
�����[���X��V]���H���������������&��SF��_����F�����A��H1�^�!"Xz��Nih�@��w����A��A�-DA>I��
s(^��IkI�)�~|��`�w<�����y�	%d(���q����"���)u���V���������f0l`I��@B�NLy!	o]��I�	��wM{����+�4�*/�tr�i��x�t�K:7#��g��Qg���E���3��x��x�?����i�Lz�2RE�����Ma�8x���0�xz�mf!4�U�Z�������t}�@���<'��j}�}�O!�����_��z
������0���_��=/�I���aJ���
�6�9����2<�q�c	pS������-}y7R���	����~B'J����������y*	)���	|��*/t�TN;#���=�8�+/�9�v#+���HR^ yx{��h,����N**������/��_RA�?]�����L��b���#�T�O�B����x�+/��CzTWT����i>�E�*�S^h����C�V�K7���\}��������*82H�of�$�����F�p��[���"�����	"��6R)�1����*��f���R6��S�RA�Q�:�J��)�����T��� �T����9�S]�KN�J	k���W����z�����G�������D�TL=�)/,!���u��
�*�<�F
����X��
��RCaK~�B%	L�u��2�'X���n<���Pz��R]���B#Y~�u������B��������G�r��w�cl;l�F�%��~���2�+/����*�~���3����H�t���(/��`A{���<��/���������s ��w�zO�J^��V��q�#�L�� /�'"������lR1��j
Mj�qh��jx��E�#�'��'E3D�����@�!�\$�l�l�X�Q^`i"��S�`)1��]b�Q��R���:�~�L��s�R��>uLy������X�#4�n�Z����S.�0�U;$������1������y�V�*/0�ad��8x��>~t�+��r�	�[5G��m�U1 %3^H:}���55�?��R�q��2)�T��S�r��xA� �6�yZ�~!&��RR
���{������t��@���u�+8���.4�cX�y�*�fB��OU�L�x�v�q��pf���D���n��;/�MQ�E�_�����'��f`m���U^`*
=<J��x����+��x�����AP&��(L)^���E)*�������)�osxA�� Wy��.d�I~��4 
�)|���e�v���5��+/XZ;��t�!Tm,���Li*�N�y/��������#���$m�R$(7����Wy�) $R��}��S?H�8�)�3�����2���u`cj����x�	9]d �F�*���G�A�d�4hp����I��������ZX*��P���<0�����#R��#� +^Xv��+/T�������O*�J~�B�=�M�"�'ioB"i�/$�x�*�W^H����n4@�nW�SF��/kk�C�C0��^�'���&��%a����5W]�L�$\=%�����������x�Rv����"���:�f")8�.!R�WxA������^������1f�=,�7A8I�,X�K�OAu#C��2��h8v�
���bi#>�^����M+R<8�_�M�/l�/?L�m�J�:I��/<z����zum��������?����v=��
#�bxH����&�r��#�K�de��X4gb��9�l��$��=����fc��h*k���3�hBKY.�nan�Y�uV��I�=��O�X������9E���v;!�*�D�ZA�O��_������T+���������������?�C��O��8-/�����Y��A��w��/**^X��;��������.������[��6i�.t:�"6,�Ir�9��*����d�e��
��\Es[8����dy�P��sR	r8A'��Z����PR����
S���4����X:��}���@��~g�,X���,��B��,�D��������?�>��X��!�1m���"��X����`�Km���8Li�����
��}�Gs��N�����xD���|�"A*,�\���|�����Qj
���%����i�?�C IDAT���Z�f|�������_�-X���K�_�v.�P��OaK4U�x~��C^{��1�C�j��������W`�K�����IE�5���@2��Uk����P�Z�/���K�O�:D^�0�N�B);V`��}�|��o��m��-$-:�L�M���Q�	�������HON�z�����ul�z+[:
��{�~�i�m�)�=T��������\�AE�"z��H��Wy��z��mb��A�d�o��&j�C{����u?HQ��OM�E��Sx����k`p@������s���s�qD�yC��������`t!��oz�F��.�fq����5|
�u�p
��5;����2����	��7���~��pa��A��6�[�PO7��,��T��#%�}�#�
�}(�
nc�� K9�o��	i�G����4���0��2J;1)�����k�`i/X����"��~ql/��6�2�_{�;� �����h;v��"�s�M��7Wc`��5[v��Yr`�����(
A
�!��������E��[;�j�b�v9��[���@4~%F�%��T6���s[�f�R �s���"�"^0k9�������0o9.^������)�%�W�'Q��=���� +�g�������|�������s5��}����DG�R���xao���n�����1h�j�Cy���"����=��������HN��qukx<;�f�(��H%��5������PT�`(�4>�<��������&�U���.�
C�Q��i�W>���*B}��_]����&e�?��,��2�}(�|�E�#tio�P:������3�8�0f]\����)8�?
�?����(Tk��}Q���k�S]�&52-<VE�����N���}xm�F�.`��"�!�n_�I.Hy��`
h�W����'Z��r��:
0���&%:���GAy���d��"�M*��Qc�T��A���tB�)�t�T�������T�8�d�[$Q^��i�A���)�R*�5MeE�D� ����Mh4b�S������
�X��,�wa���qu��5�!2���P{�~�d��M�{�e�anG3�y������9�C0��n�)���SC0U������F�ASR��{��S*&����l9|Q���PZ��0�T%���I�YE���i�-�o�9?���'o)
El������MI�Kj��T�V��h/��*Qg�6~;���D�^���*l�W�'�W_x�A�/�6X�5�������:6Rj����������	y�L8����	ks��t�Tgvw��>�G��?���A-t �jw����>F%":1���XNj�)x��^����kX�3y�j���Lq��e W���,���')!0(�/��,���K���g��������R�=�H���}3��)���D)"����7SCP�i�	�����(`�����:4��`c�P�
xd�gk#���x
�dJ@QgJ�T� C�&z��
���K�yRk�s�\U�����3Re`�*N:�!����Z6��
��f�����������Nc�*EU�'������n#�=s�*�
	���U����p��x������C�&��,�J�������J�����)%Y����`��0��Nl3_:����MN"%<���s~�)wH��RE0���uB):�(/d���TRwf�F�yc���@���P��i�<����V�a��+���Ua9h1��E*M�����������4�{D�=�z�W���RF�����B���)mC�WT����,�C|�?4��H�`,jh`��#W~b��^��P�{�������
��q)1��{]�{���=�}������B�fS�_��6���	��@E��c>'((�AIM/oqu]�i���6d
��{����X�P���������
��=��A��y�(}Y~����$]�@�i�*Aj={!��r��4��HC�yZ�J����q*]�������9=�/�� P�=�+#��qRP�m�Z��t�S�<��[�@��;P0 ��J����2���=�z�nH�q/^`) ��pp6]D�zu�

��l9��
SE��D��8�j7R@0@��)��l�	������!C{Z�J%������x� :�+G�	INw CjO
P����2��D���j#���������	������'���f���)��B��wio|�L*���Bsd������Wy����xM�;�0�>k��!���@����_�(�hQ�*}__#������b+J<�����S��RH
3������6�=��/d%�"�3�5A����0&5��w�O�B���kBV]	��?<�
rj"�������*4���N�<���
s���a�P��UZs����r�f����T�$����.o�,����/����LU�T���C�zM8���r��c����k�����SO���<�_~��UT�x!)u�}"�D��aXn�C����Ge���@��D<��>W�
���7���,<u�2�^���������g����t�;t��$��M�����q���/��~=m������
�	t�����I���/����}�4bc�	H��0�t�H�XN�^H�����@��h�M���������w���=�����-I�6�W�6�0��cI����6/�PP{^(�uK��|-]��]��8����J���F����M!�x�~^xA�&_��-�BQ��~���=�ee9m������a�AN������6"9�p��X_9)*��7��e���ei��:q����[���6���=���/�:
������Cx���*�������FH{\i�_xA��(��s��2n
A��6s�Aj�P�X<� n�����������=�8x���+��>M!�y�K!����$�Ba�,��?MQ�9����W~m���{���/Hk����������}
���Z�t��Kx�tL)�*X��, �������}������ZP���H��E����G�D;B�������x��-^r�	�B�������%9�/Hfm^��N%]K���������p'�!�y����I��^x�������P�6-�x��V��/m#����+�>x��l-�$X@j����w\��{�z��_������ZP���H��E�]�D����$�����6��jCa��Y@�$���VK�$��/Hf��ZKP^(��-;�����PR;O�J���3���P<v����������d���zd(���I�$Y�PG�@9��/H��B�R��-j���jA���#]�����^�^(�'Ch�_��/�W=_������yI�(��YY�$�Sy�%����eg]� ����� 
���>x�x|!��c�o��{
�K���i=� �G�:�I��t�^��{�z��_������ZP���H��E�]�D����$�����_�|��[�J��%1�/Hfe^��N���/�W���u	��/Hc7
��4�Zv������/�����)�/������$��'-�5x�4��=]\��IV��P��/��t�/nt�?�,T���7��B��'q��g��}_�O��_����?PWW�����e��)�n�#��$-P��[\\7���fI�Pjc	���i��c�?�bF�u"�Gj�-r����;3���"o	�v �G��-r���l�o�@���tB��n^����[pOX�t�KQ{�STJ��������������������#]��w�?E���������������Y�OqXQz}���m����,���^��t�[������m_��#+��W������ZP���H��E��{�����o���`��`��h��^~hZ�Z�ZZJJ
�%utt����e2YYY��������4/sm���9�|6!�?�J��m�����b�����-I3Jm,a=R3m�t,��X�(�N�H��E�8::���PRR*r_e�a=e�_����?%i�������RNy(�z����)I���V����= ��$?	�K�O�mV�-����?KP^(=�#�q�E����t���������`T���V�	�MOX�dv*�Z�J����+�G2;�V���X.m+##SZS(�q���9��3�?�n�b�P�O���X;c�����P���Vg�zJ����+�G2;�V-�?�ey�������?�z���4k�)M��[��x�V������PXOi�$���#��J������< ��g{a�2n��/|O�.��+����P��/��t�/nt�?�,T���7�2������.�G��J�}�?�kq��'�2���]���)]��]��8�����?�IV��
a=���7��q*�������<=g��Sv�������?��^(]���a��t�S��{�z��_������ZP���H��E��<��-��uGH���������)����<�����Ho�G�������C���l[���`eQ-(����k���.����n���!�/��R������m/�G��-j���x�����[|
^��p��"�?qE�v� [\5�������� Ix�����}Y�(+��7�����?%ia����?���,��3�-f��yZ���]�>d����-�KRRTTT�MZ�����a#4��WdW���j|����kX��#�z�:5Y%�hP�n�������*
������Y�9�>�T���~�Sa��H���GJ�	+��}� �]���!����&���U������&Z@���-��$�.-K��V�E���"-�,��H���XOJ�>8�.�8��Yiii��������Y�����v=Yz����.�������������K�j����.���X�	mMDe$�����$�#��+�B7��k�������qrg(I�Z���wim)��eED�X�g�)�����H���4���G��1��5�9��V��Cz>q�o]�$���-�$����.�z$��t���t�*�Z,�5x!��d�&H�B�^�@T�Du�������i�����j~���k�R� ��T�/v���^�<z� -C���UX �]\��+(*#<K2�Rlg���`����n������$8z����-�	�+�a�����>����e��EA��pi�����{(������w�i.@�Jm�x-�!�����N�BP����*+!:��we��8��!�0�����|���We��PX�g4n����mV��+(�C;f�w��y���?����e�����P!�EY��w?����Z��_��`l�8i����#9���-��
;��H+�����SO�)Y��v���4UF��
E�����`a-V���'��B��
a���� ]g����������.����n{�?��oQ{��x��;�d��B��Y�����-�o��Pr�.��x�s�Bi���=�/H�?���]xA:��,�*���
^�������xA�}S�Z�Sp\��
���J��#^ps�����m�g0e��X��'�8S��w���
��R���������������Y$u���)$�$nrr*F�
C}\�q7�>���{��1P$�LV���m�q(�[:����4
����]O�IX}�(�� ��!+�k���.����n{�?��oQ{/o�����/�?N���G�c��%�s��B}�t�|S��Aj�l��m`������ .!
O���iq��tjq��sX��S�;`�����Ia*��B���NHB���p��c�.�tpr�$�_��*!��7���A�������&�^�������BN����Pn��PvO�rJM[C���P�r*���5�A�����}q������m;�v^��&H<VQC�lZ�����:P�R���zF�����o����[��f:<r\o�G�W�j�Sy���8~p	bcB�Kc'o��m�����F�
/��'v�\�������
5�J��1u����p�5��m�c��������0�8����(.xAm|?$�����r�2?J<��*JSy����w�
=�)��w���S������o��i{�ZV�����0S(���
/�hX1�L�M-#�q�7a�S�(.�Y}M(�6B�$d���r������p��4�5�<�!l�tG5]�B�����oj�3�&��f1
:�I�"�n���v�
5���n|���������^��w��������n7�D����y�/�-���3o.�M�O���T����"��+J�����t?bS�����F��l�,��G[����{�AXD�R
�������u}�^K�M����-��_a7���'�*����C5�~c�T�+X)C^]a��
������T����"uE�1�<������|��B�����M7w�������y'����G����V?K<��R^x�q
j�Z�_�B�����X�� �bM$�
b����l�s&��{��U�2f�����+.�Y���|cXx��[|A��>�w�fN���/��U32�-G��{���{z�}�������y����"�A(�
��/Hw����������.����n{�?��oQ{���;�P��9��i���.~�P������a�<���^�-\����� �
�����zt?�|�,~�����q�����/<�$�}��B����76AfT�^��U�m���r{����]��N�����T�����5�P����v�z��rq�
���?v5V���O!I'X����n����>�|%��� �	����(�P���Y��?#��o`Ci�:�#��S��[*y���B���$�v��W�����m���]��`���*�����#�u�4����*������-mx�'�>a���a�B�����<J���J��1����7���!0�$����E����z~��w���_��������g\r^
1�6����0=E}J�7�P�������Y����<Pm�>l+z���^�U�E�%��j�]�8��L���^��x��u�J���^8r�O�>�tWxA����/��m$�b�6��u;�h�D<t{���d|�����>n���q��#?*�����!�8~�*�#��M�	<�Q^X�e?��CZZ:����P�r%�����=����.zw����?�����1�'WV`��1*g.��Iu#T7���'������t��Ol[i]����������nP�n��p#��s��������!���v���C��WH����c�����P�iN?
Uy��@2!b�����u�b!XY������)I��$�]��xAd����������d�v����L�~~�]KK�����<�;�[.G�:IAQ�Y�S����9~
�WW@DT��]���_BdT0�];�1���%�7���������q�N����?:���Uk��@Jj2�����tHy���YK����o
/�+��K������r����������O������v�LL�*�j��X�T�p�N}�u�M;��Zb������F�;��.��5f���l�\A����k`N�.�rl?*�����UH \}�"��?�MT���m�.�olM-L>�u�+�/*�Z������������d�K�^����Gw�]�6�u��b}�S� ��Q�[�MC,>w�	�`���q��	�>s�]�p�����t�^�����#~���J���Lw^yc��}t1k�>�fP��r8�x��
����
���.\ya����s��8q��7�����b��}�	���CM��a�&426������F����m�����0k�1�m�*�/(V�G�EF`����"�B��6Ajx:|6�j��P��7�����d�iCq��h�h��[-������60T�����&��o��n%�u�$RI`EN�2TZ���J��]P���W����2J�4_�����$��EvZ
�[v���)�GVR<�&���p:��R_>�|��P����9���Rc0��UW��_�����# ���DG@EYa��4���d���O���&�p\�dp�� IDAT�LUA�NDz�9O��j0����.���#&>��[��=}�bX�=��D���������2�=�Z�9��E�%�X�Vf��2"�^����n?��.m~�Y������k���+Hy�����M�����R@\l8�������8��G��w��K�����BJ[���eoXX�GJr<��S��s*U����@YE�Ww���3��
��J����a�7S^hi����x�vCF�	y�~/q�q3�-:�� oT1����@B|$FNXG�F��ql�{W^��n�53*2����y��U�����x�����|
^`�o�X���koDt��_��P�����Uu�i����M�C`�X�u���:�����������kc��Ux���������L��K�L��Qc����~��A��wS^�vl9�_���F�U���m��tM]�������U?�i������/0������w���b�o�����
�m�,�!�_+?xA�[k(4�+�<o���YR�Iu~���h����K���n����!dT�������o5:=��E��]�2�M��3���
����<��*/h��Z}K�����zN�|������}_��D����{�/�@��-�����2�dU����H����[G����,z@VI!��!���
���T�w���`�	�LD�I�vz-O��4�>[�7�"-���BFd����q�,(��+�ME�P�j=��-R1�<f%�����]�i�q��{��C�C��!=��t=�F�S'>gxt����q~�,{A��K6��/T��N��@A�A;�������s�^�|�����U�*|�8�����`^|���O&X5�{�),����}1���I�c�m+����}������F�:�����U���W\�����:[���G�`�������)/�7���-�}k����*	��z#3(	[�C}��lf@�N<�k����u����.�l���F�a����*:PfM{^��"����(Ny�M�8z���L�3��� ��<�FU��IU�s?���6uz�����cp�^n9LA!%=��	��m�>x�w�H�!%#��y��0����)�x,��8�r���>�aT�Wn8�t/}We�S}{T�2��������Sc1��r'	�\WC������k��+/������J�#�RA��Gx&�{f�{�����
G��W�COylvK��k�bh�P>�#�30�\7�3p�C&T)��(G�r-���}iH&>���ZR?�����@6F?��d%�~A��bI������J)���v����u~���9��1~����{e�����?��f{�0�D�IH�H��T�2��fc�3��C/O���#�Q�v�V�;j���`�S^�^��F����],"AAV^�����1������Gm�X��������BE�����o.���5���v��o����:�h���� ��q���� ���Xq��m-��o"������������}]�z(�=�k�+^PTT�2��7��zC�_C��(����\���tn�������SN8zn�v_����6�,]g�<�"��/zw�����A-��4z�I�a2�b��>�.�����]�N�P�v�3�L����<���:�aC�Qvg��>�l�F��`a>��u�>�!��gA��<}�O����
?q/SQ��
H	���?10�yM�&��=�@��\mAQW��� ������Xd�g�)!�k�"�]:��$@��
�	�m����P������2��D	~��Pe�:�H��.%�%�x�&��e�XQ�7�u/��S�^cm���������Tdu7�~��S��<�h�D����_����q��]d�ue|�v$���o����&��w�����Juz0����[�������.h�6���~�)!5,	^���*��#��7�����T�de�v�$�C�]U�z�E_�<�q�"�VS���#�YjMk��:t�
�o�%)_S^�O������6-��m��fWl�6Zt]��d,�y��������� h���K�w�U���!�8IK~��������	�bH��tO�w��E�Z-������{��i�L[!!1�\�����)���8�_���HZ5$�Vo����=�a�����iL#ha��=�~a,�\�������C'����<����&l��B��K�`\�2}�6����0�XY����9,_���VIO����v�l;@E�n��|6����c��-�}�����C,�5��8~�
~[0
A�a8�����]�~��$��~G���P�a���Hd|I{��^PhT�BVG�yg(��G�����q,��9�CH(�mA����h����������T���f��e�_����?%i����xA�{��
�L�������e=���L</�`��
Z����hia�{���nWq���=(��?���6�p���������qYV����M{P���:�%Y��n�������]��V��+S����W��A�]���m��c��x�>���N�0q��<0���R��u0��\�mF^7
��� �+��c�;�!Va��1�g����Rp�5�����
%���|�����q)�X�x
k��������'�����L���p���#�
_l�6�J'G,&(�:��o("���m
>���W/����?���f����.�Y����:�>��I���(^86�o?���*���[���<���u��t������#V������8�p��������;?�Z0�Vm���-q���	``E�	)�8���v���(����<)����9�/v\�����3n:����`��}\���1��>�� ���G�B�J��ec���\(W�/����N35�l	�\Z���{k���wP��D��.��
�Awz�������������P�d�� ;!�Z�$�4)Oo����lj�$��b��A�ZPm�����a��K�����
n��@���0tB��M�w���!�_��]	d�Dv"=�2�RP���]������;���� ��%����MOMe�U����8�6B�;
��6BYQ���q��t���o|���r6=P�N��gb�G'B_�*����e�Z/��G���@"��q������u���Lj�uz���4������!�XJ1��pGr����)��1����GM�%-�,������������:�Ol^3m:� 0!���!H�g�?�*R��]�.�]��]
�3�`(]�n:���v%DE��p��p��v�t�#����5]�x��I�,J�����`�w�f/<N`�p�]t
��9�w�]{Y��A\Op����	������o����%t=_�z�����,��1[R�k��}g�9g?f��,z���y��7��j[~9���z��5(�|��	���]�D����.c�
{���oV����P�u��!���1�~O�I�l8scf���{*`�����������>�� ��q#��������:l��"&-��������F~��E����02����=g
w26?xA����_��N��#+2*=�!��3dx����aH:r�<P����/B�T�9";)���1dx�Bs�L�-���H�v�`��H��
���+����w!����F1!�@{9��5�fPy�r�S:���H�v�D���\u!��d�$px!��*��sa<o��
�����4[v�S��@_Vj"�_�^���?�9������o�v
�� ����0�!HY��[�C��\��
��	SQ{��Gq�@�y7D^���yg�]���q�C
���#-�=��������H��Ac{C^[�H�(/h�HsMB�CGT����U&���?d�P�����]C�c�9T�����D�V������c��
6�vCdb&Z�c��'�mZ�����/��Wh?=�g={�`�������..xx���AEyx�����>�I\6�q���d����������A�+��������������^P����=�U�$h���=������O?����H��Y5�����i��M�����/^`��Z�JA��n��hDB��������p��4�[o/qP��a3/X�h�:�a�����n#\�\@k�.�G`+�oC���
�w�`�S����Rq)�����7�����sT���wo-�Q�0Y-jvSXP�`1�{���c=Z���u&�-�HA���4��`guMD�d#29�0����>P�m�����"��y�2��*39/�Q��Tw��T�E}���08p�+}���DgP �:��A�Z:���m�,��rl~�������$�qm1����`�egR�G�>T�`}7��?;������6Xl=G_���>(!�G7�T0��\�%��D�L��#")
T����-�2�3�����Vc������L��#������$����2*�6��f��3��B�s��z�v�
#MCLh:���K�=�SI�0�~'�][H�g5��[4/����`�iO�����p��&t��	7i���%rx���U:l�������c��A_�M/P�StM��kzZZ��9Hp��Bc?��&�X]����������r\�(])�	���h=��^%�|�K<C�w�Xc(�c���R�u���������c�C�4�����$�g��.>;�CA��	(�P���,L)^�2S�FCE����2HQ��8-x�
#y����oO���9��k���S	^0��w������~��J��A���u��$�C^K��J�=���PP����~�O4+����:WO�2Xq����TF���Q|�`A����og,z�!54����i��aJA�u>���P�$����(L�����
4����t�"��"��B�w�5����nP!�&������c��P��.4���yME4��n���R�����.h��+����RVq�+@�D�����`	��n�HH'x�;���J>PA�fx��.��3��co�p�5|w{ ����$(_�^��]��G��U�H��L��Q	�^��b�|�PY��j����0�����/l:0#�� ,�`GM}�y�9�t��C�V���X��uq��>�����/��V%���\�axA"3XI��n�o�A"x����hP�N7�a���������R2`)Vm��3����oI&(�(�$4o���JT����Cg����Y�z��-�>k��#��!�g���������~q��L���Q�����_Wm�/�&s�!o9{���c�e��P��J���t��j<�]������B��oO?����i]�a���"T���|5C�8�G��Gh���5� _�j���=������[�RXO��W_����?%i^Y������b�
�&�H>G��o$���/��&={OG�ZM�x~3�������8x��m���a>Kq��1�Y��y������*5���kr�hT�����#�>M���Q[�
(�M��((����&��+��{��t*Zt������	�t:�'�&��4��a���o��q���4��*
!t�r����c�Ry���W@��M�����n&E�Y<�W�RP��������mk�E��sSA��*�"��X��_����?WU��������2p$��J�O�Obm�!8��������f�x�:V�Ey:�_�R���T&w����HREp������88g,�n�O��j]k����N!��p��c�&��e
	-L�P�H���s=���@�{^��v\<�X7n�~���Y����O!2�c���X��+f�<��}:�6�:�&x����\����������x/JX��o�z�^m�>4���@b=��l�	����NKuh5V��]�B���W���o_��Xt���v\,�@�>��t�<���\/w����IM�)&qx!;9���S��72���(�����D���%2�C��]n������e��P&`!��E���A����D�z�q�?�Z�~D�;d�2��4�mQ�5�#��v��*x�M�N�hX�;�~p�+��\y�)$D����
'��{�G^N[��UW��AN�99E���'.��Y��#�}��<�D�98uu�D��4���H{D���������<�X�����>s�T�
�����E�%�j��i�u�7����\?0����78���5u�"e����~�H��l�O��9L���5��z�`��2x�
4� �%RG�w�(
L��D<y�u*��'���?��,�������A[����n�^s��k��U��N�@���;���(�00 ��}�����y������������v���}q/�na���z0"p����+/�2a�1��]����5AHZ�JQ�rK4#����i���/W^`
	6[��.����x���^��h��o���J*X<~�.������H�eyj�1=�a��o�,m����O��H����%w���]CU����O���M�?|q�!�a���X=�
,�J_����j5w�\������^P���jm���/�?|}��SAh����[@|���S���!v�A���i#�gP�E[������"��n?R?d-�^P�,���I�0U���SAX��@������-G��I��<����i#�F��
	j��9P�@6gJ
����G��b�����4y�I�~�$�15�)�y��>�T��X��0l1G��0����A�q�z�� �(os��0��8R�0 ���F�6�� �`I������}r�r���X/4�A�8z/�X�`�%�n1+�%+x�4�����L'�����cRN(RW�����4��H�Necn���}�&��^�a��v��L���
��W%(� ���>7�3�����9m5�wu���"A8�1���5	�9�.������e����JC�#?����9MURy�^��#��DA�=_%RNQ�+�O�fW���"L�����w�����D��>7�+(����l"��������Q����'r�� O�{{�+-��S��Zft����.�
 ��v�������K�O&�*m�Y�D�?��� E�MVw:�m���?>D3M���zT���O��l�2m�3�O�g/DP`u��d�	�����4q*�����D'�](�)*K�'�z���*^��������$8a�)��t�H�$to���|B���c����-,+xA�l�� �R��y�@�/C
S�-����xz�p����WdG/��F��O(����>��@�"�l���_~�02�u$j4�����@������2R7������l�#��e�lh���������_(x��}Lt��`e{������*�6��A��d/��A��}9�y����T(�T]Z���i��(�~I�����R5���>mD�V�p��l�@u5=Rj�E���?�����i�����'4���,�D�O�������
.�^�z�cp���������&�O���$q���G������M �+>���<�$��a|��1��i�d1.�X�O���2� F)�#:6{��{{g�6��3����zI:�*�������vR����t$F�"'"��/^����U��*C��2O������(�{z����wa�����R��J�jZ�����AE
y_��*��BRp*J����}��84a��T������>:h`���tx��m3N�}S���+x!"!���t]IA?�:�$��(R[lW�2�?�gkT4-!��d��@5���lR�{�O��p���n��	����1���yU�O�
�Y�YEE�6B��c��#b�EXu�'��A�^����y�M�:�I�
^`j?�^D@�/j����F�Xwi�7\����!�
��w�@���w�N`vNJf�B@�/���O����M��M��G�f�vX�w<vYH��o�{�N,@����I�/Hb������6�m�/^Q��R IDAT�R�"�cx��K7�!&&�>����A���)|
$J0#����4�I���z056$���?�
�����?��t�����(��7

�7g���A�*���+�����>}!��.�;���C�F�y�jDn
'�+��^����;OAw|O:5E���%�X�^P��&�=�:�����.�Z�]/��*D���L�2�s����Z��5Q�T���b�\"�'����������D��M�#��X��K��}��������C"�/�&����x�|	����1kZ����Jv����9��*���,�~8$���RhEA�5['�Zs�?~��
z�����Iy��yH�����b�Y����F�#��E�F3:U��b���$�)������3���Z,�4�N:/�$�AU���%y��ThG:]�y��������������	�lJa��}���-��>��VF�M�=��B`t$����������|�����u�#������������]J)Q��8��]H�Y���0�a
l�t��O��Qu{1��b@g,?�����V�~�����z�Ly���a��x#��V����d\b"��{�A�ka��[88i&�<���q����_�H8��|�^�Q�
>���H�8��<�&e3Yf�����LL#��$8/+A�w^��
[UXv2���$3J2�~��{�}�;+x��!(Qj���7H~��+%����G��PY* 0 ����=����`�g��:Hxx�+0�)����3P�����F�Hz��fH�:��84��v�|��@'��C��s����95���C�lUDZ����^��0��qY�zw
]����+�^�{"����RI0H����}����Qya�xl&�!8yu:W^x��U��&�������}[>S^`r�:Z�����������`J�u��f1�P�>AI�����h�l(O�w�*�2����P������p�66k=N�C��}�o����
�}����;�V�'�0.NJ���(Q�799A"���xR1�#)Xw��:f+WrhHA�Kg7qV����y�`L��MZ���c��p$����3��5����x/���g���9�P�TL����C��k����2(/t�����`p�)��v0W^8pf=`���>3Hy�5}f������-��07���	L�a��6<��>7�Tj��0k�:���%�3�S}�����l�����S�	�@�N����%';1�������
�=J�:%�t�����1k)�D���!�E��p�Z��z�{ ��^J�0�	�C��lDP:�D�\7�;!'��T�5�#����D?������B����~yJ��\�q
ns5� ��F������
�{f���8���Y���'���Z��P ��juD��U�G�)7���<�RF��p�%�	n4��awB�Q���D�V�0��z+��V�����������D��?�QJ���'����zTr��|/��[����L�&E�S^XOJ	!����:H��O',���d����W+��{-��R@6��{<������W��������%-��*uI��`%{sR��T����jg|M ���>PkS��������`%3��.�'�����DB�?y/05��u�|(�]��"xa��@2�L���3�R��R��HY�Lya�����J�~s�CRv���L�c}���#
������>��b����1��txH�HD6"�!���l��)h�B��M��<�)�{��
M;��9-Y�L
�2�v�!h�=KQpU$�br��r�j����:V�0�*������Z�(���TJ��9�IFGJq�u
)/(���TXi���@�(/0h ���	:X�p&_��r��:��B\r<�G\&�����us�L�)#X�Qy�_R^�F`��>'x��.�1�����b��[JM`F*LM���k�6��\�O�5���>�
�����@�p��)P4���k�\>S ���c����n��0���4����D������yH*u]GsE�b���B����R�_*G6��a�t9�|�~M�Ly�WRp::eKS: vM���� �EJ#U\zqE������9�W}�H�a	"Iy��j�^�#�P��8S|`�A�v[���(e��4�=��o^6W\�Z�7Wt	{��
�R�������`M@������$-Y���J��@���T�N���U�b �+/4&�J��K)RXz&0X����(�CZ�W���e��g:)/�&�����F��4,�����Rz�0ROH�L�#G\�W�N�����B)C5 (�T LZj��)�}� ]A�+/��*)�0%��R^8������9S;|O�.fbx�8�P#��1)/ ��}U�&Q����b�]g#_�@)�����(9���_���M;]��i����4��{>������S��'\��s�
���~�����<��n�7fbd��bx�s�[���c�<�6������Y���m��]�3���?��U;�����6��8D���c�����4�����}]\��/�4.�;x^��T��(���0�=H/��I����_���V��t����r��8���sxa���<E������,m�����|���+Vo��Uf,\���6L�A��f/<����Y!h��"vR�
���x�6L�r#����{w"�P��a��C���0�}j�SY�z��B�����a��B(�~eI��A���lG���6{�a�.��
t�Ny/��H���H���"����O����������J�rt�*�$�p����F��S�������k����f!�G�O~Z���7^H�=?�����@���ar�}��|�a-HR�6�H7E��;P*M������#
���?��&���}��l��)�q`�|�������&�Fo�o����X��1������[�q,��>��V������1R�D��-0j�R,�S��0��&��
:�����$j�SI|�\��$O=���S�ntb�)G��`��t�}&��9��a��9t?����x����g�{:!����X
{
(�������@�0?��9I����&����B?q~����+����_��to���P����F�1��1�p��n����iZ������&t���e����6���P$@���3��*��)t�P�+.�|p��Z;Q�b6�z�W�K�JF�����`U���g/0��V����=�0�y]1��T��Z��9��^��$a��)LI�/�@�������}�O�P���E�w0o:�y�RH�����������&VN`j
��#y��1��s���P\y��'x!�l��	��08����������R�*
��m���X|�<�Vu!9h���?��|��=2�T��Qj<�'��{��_�^`��7'�V%:��>��a�R�v)0��E��!(>����?�������	.����V�Id���4J3{v����%�K� ��3��h��f�B���<�6(����������`h�4Re�j7���tQ<��F������SD0��$/w�7�H���#vJ<�zc��w-�/�����3{)%��$��i�h.r��Hy��Ju�����=��������)uC���?��s7����x1��h��N������[N B\����*+]���~0�-���#�N��i����u��s/)+$��|.�������F�*�p���W�
�X��C��,i�
��pu@ ����Y��uQ�����Kg6 8�O/h�2L��)X+���^xJ�tg�C2��0x�<�^_��["]�vo���mQ��"��Se`pB��A�]��T���:v��[��A���Y������Z`�C<I�2U���^`���\�)0okW�W�G[�v���L�u
��>���Oq�~6n�S*�*��@�I�����O����W�,u���>3n�q��������f
0�>]�gV��N��8>����������v�xh^�O�E��T�~����}��f��oH�bx�����,��������S���#������'x����S��OtB���n�Dsk�]'V��0��&5: �>�"���A�6X�m"b�:�%3xA�](�c����tj�)���{H}�
6VP�����@� �)�������
��N��������@�j�	}��^���v�����B���+"50_�b�\��������"��S/P+N�S��A�����1��j�@���:A�M7hQ>� ��]�����o�H$�T"n�i����E���<��)��`�e@D��-b��t�RU$���A���������#���o����)��h:�F��m|.^�!��T�)-08B�����A�c�^��g��PzuH!�.�l���V��F Q�f���>T�l(m�(����E)h�{8�R���=�v��${�,�U�Jy��.��T�ss����he*�L
1���Tb����)=�yK)H<��U7������$����}0���X���(R����I,���������A�K>���5yZ�)
]���3��0��gV2������S��bx��*h������}A��7P�\��G�Oh3xA��-W ���D)".���6b�_=�R�����m��Tk���X����������S@�Di����vFT|�^�y��e����[!�N�[��~iSg>��=gX��XV�
,�C)"h��rkJ+�����_�H�����GR��l����Y�TX;6Kac�+���sw���'�{_
4����xl�����`��������@����:����)�~,Y���Sp����t�WD8�}������x���z������^��1����[���m:��?������{���h
�NuU���I�_%��+)Q��T��;�������`Zu�L�������L�����f` �^`�
,-�x���z��]���~>�X�	��.>%�RD,C3�[;��">P�m'���u�ScXzo=z����/�BWU�RP����1��8<D'��T?�[iL���)���OO���jy������j
z_���5Oq���V6��5��9A,Q��xF�D�:3+�)/0�3'n����B1�`J{��05�'^�aW�..Sz�=�����}��O���c��XZ�'y�	y9���u�%�rB���y�
V����0����?���z�"�>��@s]���q�c;_6�0�����a@`	KU����]���Y�����N]�5���]�>""��}��m#�'�������Y�������!X�O�}y�����Um��Agb�SN�����3x��](�{���n���H��,}��JKR]
�	�$x�W4lH�D��.��B���0Xt�q�v��;�43���G����dD��xh;���X*n�y�e����7�o�a7Q|`�.Rb�Ki_����E~,�R^���5�����]\��#����g�k����cu�������q��Z��U��L��4^f����<��N��"}N'�k���YE/����Q=kn����Qb�����f�+]U��1oH��$)O����C�����d�y�����H
O�aMK|��Cp�3��K��}���K
q��T�h?�4v&0��^`�Ox��h��`�k�+���G����d�5��;n������e�)i����&?_�3�.���SE�~:6�o������/q��.���Z�5=��b��.����q��k��w����n�A���3�Y�2}k�����#s�ie��6���s���	b@������z. ������"��H*����k<~�'x�C�F�z�����)n��:��
���
����)������"�4{ ��{;����8K9���O1(X����C����N���EE��w�_�b��'^����A�:���	E���, )���J!s�����.�Z�RXO.6A>6������PE�?���	~J������/��������YT�d�6�0�1+x�0�[Vs�4m��
^��p���_��r�YL*+x�w[KV��YSVi#r����&3x�0�IRx�0�5/��}�i�c*4_)�����
c��Fn��
^�m���.3x!���n����������
����
��s2?���6���^�m�����i#d9�,�F�r�|�[�6"���
^�m���U����������k���Y�-��[X���an{�^��B;���xA��+j�=a=��/��.�GZ������W��x!��� �N�����?v��(� k�_����y1�/���������4=�� ��Cj���MB����4��i�������mxA6�-/{���)���I�Z� ��$�'���I�ZB�_Z�����^��^z��- ��u����}��]����m{�?�����5��B���i���^�����E�dm�o��B����G�2z@�
zG��xA6�����*���o������B~����� �=����iw�d����$+�#��dSG�dcW��"`^���ZpOX�l���������m/�G����w^H��/H�����/���e=�/���������uA�$�= ��#��� ��B�v�������/��7xA2{
�BF;	��d�F�ZB�_Z�����^��^z��-�+x!d�b�E�I�2��@b�Du%��������bzu99h��%I�BWGV:�d����?�ia����s>�/��,z�����s��b��a��PTTF��$�Orr2�������t �z���Gm������3*�?|*4���D�����SP��U%���z�����iZ����)))�������X)��4lWN��K���GIN������r3HN���1�k��o��!��U������&�E�Z������P�GO	�p�jy�j=R�$�qA�'��,�!f������<�[����	���?�m9]Oj���)-��K�qN�#�x���������W�������43����<�{f��zd��rZF0{����y=���	��k#+w�g����l$�vl�
���|[��gr�
��������G�QY�)h�|~�@�R	���~,�]�$��U�����H�4��:�Sp\��
���J��#�����k������\ZQ�X
����I��-�'{d
�?i���.j����}^�5����[�O�6*�E�?!!!������jA�4����g��IG�db�<�T�O��2�;����}jkk�y���������c
���VQS�OAX]�1���w�ba=����j	�)(�K6����$�Z� �
}	��l�X��{�zd�_��]����m{�?����������iw�l����}��]����]{!X);��E�������C���l�=%�������C���l�=��+�����!X)�}�=��+���?��m^��;�G����k^,Z�C�@Q�����b_�P-+!!���zzz�j^���D


���Qn��6�z
�K2LH������@Q�o���044��y~�<'c	�����������yNF��k�o���p���CEE%��h�zdd�<�V�ORF����a������S�)
EXO�����?�i�������w�����;!�c	�����������v�������0r!���� [	'�ek_i{�#�e�^��l�+m�E�?�Ikiw�l����}��]����m�����t2�y]X�l���������m/�G������t2��AX�4�A�m������ �G�����t2YK���JWG�O��^���Hb%�����U��X@�d�����#��"m�����l����}���(��-��H�#d�^��l�+m��������J��6/z��V�]�dg����(�GV����]�dg���Y�O^XQv}%��J�����Y�O^XQv}���m�����?���(����UV�����.�GZ������W�����`��;B��������.�GZ��}Q�OQ
�1�������w�?�ZP��������^���: IDAT�{��z��
�o+�G�6�f�?�XO�m���$��#��
�������$#���J��#�����k������g )9=O�$%0�	�}R$�*�S������MQ�X�����m�|�,�'�M�����\�^�(���r���?�I�9��r�
�F����V��d�sHNN���R��U�+�)��~W��U����?�w]Of�$%%����Q��������{S�bv��G��i�	7���l��^�������������LB����%�'���+�1�p�
)��{+


2�=����z�B��4������YO+���Q~P �e�Vy7	r�r������P
�r������z��P�D����U(������WG@LR�X����q=}��p���B7OI&������b�|/H��������dS��zU�<I������W=
������s�kv��Wv�R�$���NFt�.�R��q����zx��v�0n�������W{�-��jc�{���Y��N�����Om~��Kv���Y�`_�S���nt�?�Y�`_/j��m��`����s����
r/��k9�o�Diml������Fh/X�?g�j�����?����p������;7���',�����F���,`f��`d6������P>d��:����S�*`��������u���?o�����<4��:b����������"T=�Qx&���LV�����\���&�l�pd���TM�@!�@����"�������x�[ }jskn�r����ttR��U��)J�8f��i=� ��D��_��/���E-�'�G��E���HkA���#[�J�{n����+���]�/��#B��do^����x�w�`���/��_x!o��_��B�,-���K�$�U^�������GQ��/�{S�
vW)x��So��E�����&����S����������Ktn�$K��z���|��U�{&�4���9���8�B��[����������C���s+�7Q���������d��3�'�=<���K\���X����Gh����/���B�R����w�?�ZP��������^����`��v�U�����/��3���D�������D[�
*�����s�NT����l������ON6���79;IP��+������e�����D\���9���Po!��[������*iQ
��t��;��|
C�7��R�(Z�,��{.ASY���Q�x3X����������:�r�&��e��P��"�P��|�>"����tl���T������d]MV8��������������4�yN������s
s�)�o�����6�v���'U��co��7�U���*/t]�e��#$!��4����?3W}�F�6�oBTR����\G={4/�����j������	���~9L&���)a��<v�G�jMI��"��m�u������
yMM�9��U9i$Kx�=���o4�7���s��U;'S���	����z�j9j'��. �'�K+M��{���.������y	/L������1��������\�9�Fy���O�$�j�*�<;�p��h�����.;�@I#;���*Nv��;�M�����{�y7�h�	#m�?�r�])(:o_����sdn�<V^������bD���y�i�����^2v=6��iNa��-s�>}Ct�5V�Q;Q��6�P�N'����������7��������u���}�������i2�u���O����]�f�?�8�s���.Q��DY�zh�|vl���0�������9��b��u��g5:n�#���o,�yf�\uT�����l�y����y���1�_�8�����(Y�
e�d��Fx���
���~
0(a���=�������%`oW�''8z�]+�`�w��_����9���|�[���B���xA�~.j�=a=��/��.�GZ������W��s��v\Y���z�k����#,�����@��Z���3�"5-g��9��������57�[0+x�S��l��
�q��h����������%xa��%�Ya,=������w�����1�t���N�0u��������������_�J����G}G8���W���n[�o��+�s�>�*�5{j����>/����~
#��59�v@�� -�S��B��M���r��O\����2�~HAyG�B/�p�F�����].W{YZ�"W���(��eEy��Z��<�~x���DXS������;����"�7[o�S����x�����o
/8�����.��	*��BI�
�)U	Oo*�����)H>))9�N+�LV���Zz�|v[^\n���I��x�}����d6�=��Sx���E�~q>��9��=�0z���:
a!���$�'xAYA��M�$��p�S�bcahh(��}�"/0k�_A�q�q��3"���9�;�����0r@7|��=�NAC]
:�Z���-?�/�a�J�	<)/,_��I�!))�.\��O[��p���k�����h���O�~��#n���Jk6����B�"��eC�(�y���g.����J���N�
-����^��L����L������AS[
Zf$�jc�{l���	�]:@A^g�z����^o�����;����������`ev*������]�Ov*����r�/X/�z���'3xA��"4��m5R|��|���k9U��9��?���M�U>����T�0D�,�l�������+�5�B]U��_p���m��~��G�`a����j�}�<.=X�����_q�8L��@�k�
�C|`�[�=6�?�)j�c=���ruc}[�r9����q����W���5����akY�%�@��9G�|+g��������������;���%%�!6!�+/����6�}��20Ue%u�h����Qx�����uP����+)&l�c��9����V���kRl`P���"C_���.����X9~c6��agU����~��O�M����v��<���u*���5�9
g��M�)�5�q	0����c����z�A^^����d�n��������U~ N���z����{�R7��N6�3�$)9��4����wO_���b�/��}��|���X�1J4$�P��S������o�*��A{��Ug���� �������D���F�%p��6Zk)����������F�k��z��p��1�3��[q���q��	8�TBY�*8�b/�_La�������/��k���d
Rh���a��������p��S����8��o�?Y��7�.��=��������D�����N��@��T�+��ZV�tI�$�N�w�e��";���V��a���4�9��2D�n����w�CPyXI�[�����~W�SB%��-R>�5���
P�V���Px��G���(��J�
�6�I�)�=��?�Mn�����=D��.�����Vu�-����������r'DL������QD�������Z85�1W^�6��0���
'=����*���FBx�
�^(o��>e�@AN�=���|�������W�0��+~Q~����py)L'����������X$�&R�}.�i�p���P�}��n��q.c�����������c��BS��x��>^�
�+�)�e�/v�����6�-�i�c�y�#"13+�@dR$�Hd��q\ya��p~s�q���g�s��.�m>��gO-;�������c1���1���P��^���?+8��~��`c���T�k��wg�Z� �����Vv(���W���[V�]Z���`,�X*��j�j�X~t������#*&�&`�^4W�b1�l��Zf5�N�	�?\�v�cQ�>c���*�&�q1?}���UOW��4���
T
��
��!�<����nV������pz��gU���c��5�� ��d[��RI�b�����:��Mq��1\�9t���t���kB8}��Jy�kZ��oGjL4u��������i�Io_#�]��:�����M��i	���\A�gC�X	$~�)1���B��#H��9��A��H������y��B���+/����n���1H�z���w��_WTH|�
q�w�y(A�cO�\��x���WU���6���������w�q���9������"�\CNP�P��9��$��(�{��F���$ERx!2:{�� 5�������h}8���������{�4�7z������s1�SU��m��(�+ :�+�v���	���Xz������hQ_�?&���UO����U���+W^��gI��I��N���"$<��7r��Q����4����ZUUQ��*��\<_$AMUZ�\y!:&����+���x���">�+l�)�.);<�J��GL��+Z5�������kbkl�P[D��t��3������)O�6rhTK
kwF��H�^��>#%�+������:������$�����q�{`I|���
^�^�����n��t��V�0�W�����),����
���m?\��Nf�PQ����^�TS"%��	���o0�����i�_1y��R��.�y�o�����DS������<��H����*� ;�}y4n��K��y�F�p����p�--;�K4�����B
����FF�HU��
���S`����=a�i�u�V��M�\����#x����rL�)x��g�Cy���X�*�u����Ha�J����������:����J���}LB4���\{�}sW_\D�}D�	�P���k��5�����Jo��0��
�?=
�j�������/�pnO}};����~���l���ID���HSc����������7��g�z���S�j6���WMh�T�t���F��X�}���VN������

�� yLo�oB���:�n�X6F���A�����1�ew�_�L1�W��j����,��q�U N�|��N��%&�++tp��.�ae�%O$��V��xJ���-��/4z���{���oS1���U����o�3q���ZyA�.�}�.���>������S0}���3�����B�*M���<�����w��s:�������Xt���,�pt��x���v�K�2tH!u���*Vm:���?,0����+/�������c��>p���j�����2
����Z��,���Tf�~�~T�!�c��+/hj��M���K�r��Z�
""��Q����
U��V��������������v��}&zYE��e�h���]�I��fv�{f���Y�+������T���
Z�E�V$���{�D���4v�:�������@H���5	0��k������K�?:n)R�j��wo\���s�c��A4��<�Z��g�+/|x�~�����~�n^������/%m��=)7~~�b%��{\�������J��2�����+/�~������k|?���/(��q�`9t�.Bo?G�����^S7�an>����v��l�����%��T���,h?�����`�<�LU�\����:9��{z��e���u�3T'�����{����Xq�<|�cCiS[��}����%-?*/�=z��r�����!Z6��+G'UXX�MU���c&���#G��9U�e���\ya��c�V����������#�c��-�ue�u;�*�����t����+D�,�����Wv���(RP`e��]\�a����o&F�PD��[�a7�^X1w���)X�d:O
�`�f�59�tv<A_�0e�@q_l�K����-�YY@Rx!!�+���E�>$}����JP��r�^��`��6%���y4qv�I�o7lN��������S�����?�i����s�9+���^�0)/�!���#�3=�)*����<����������*|B"CNg
fSr/�*k�s�%�s~$�7�
W���F�>;)<cA��g���F$x�9�6�gS@�Q?X]M
��-?'H����5AG����,��<�� 9����X�����Q�c�X��@D�'�Q���������RSD�V���d��L��^p!0!2&~��9��R@�F�GS�Ip�2��o��!�1Y�;�������Q2P`���?�=��M�d0=����k�`�cM�F0"�h�:W�E"YP~������0��wQ�\_n]h�C`o���^�F�����u	p��|b���R3�8]���k�9L����~�	+��V �d=��.(��U��?d���;�j�4��5S�hYc�y�#��������Vg�.����U���3X��f�>,u����������x3&���b��`��2]cv���^�^Xz��<
A1�S3�_����Y�n�����B��x�g7���[�5��g�
^�dY�t��	����
�Sp� �}
�������j�G�o��-�9v���)��V���c�u��:�.Bw
V�y��k,��g�P��>J��g���g/��Y	�?�nq
�&��Y��=6�C�Eeq5@C�PyxI�[�����)��8���L >{D����8���-���g�je��!O�^�bS��T ��a��������a8B^F��� ����'���qQ
���@���p@���Rxu:������n��Wg�P�D4\H)#��4U%%�R8?����C^I��rvz*'��{�y�u�k�~1R7���v���6�GA�s�c����lob����px��l0��Jq�����G�az�������� x�M���&X�m�6����O���x�?�w�����7�bS�
vm����<��������XQs�?\���P��:����>�Z)(�`�%	�i^;��L_�zS��>���P��"��Q��D�v:v�d�-���F�hT�cz�?��@�0
�����;Kj.��k����.\��I:hb�isM����5����8l=c���T������Q�T��5�k9�@�AW���n)�$�@��
������\aN�;Em����sna9��������M��4&����n��oM$x���+a��oK��}��<���]�:�q���S�1���h�
�.@9�rh@����F��B6����I��x@��^>Fc�B^YA������H�����Q��;���3���D�����H�GAz�"��
h�j�����������v�*�<C�����rQd_�m(��#��4�'AO�L����RB����
Ww0�9�X&g!��/���sx!��5(B��,��f���a{�@�~SD_<���g3�.�q��e�"�S�����P����Qz[�")���'�~)h�X�Q�E���c�@���q`�G[-��H���",L���w�FXD*�����_O"(��F� �48�R���az�v0
�	�!X���X:���O�t(,��i!"�+�]�C
�%0��}���
S�)r(aH-�W&�����x�<�����a���2����kE��o��c/Z�	�th�T���E/0������:4F"*� �A�����4DG<�Dk��(��������#0��Vm����Z
I���
t`LA��T�W����u0a�=7�B`D<����9�<z�E}*c�I/�D%p(a�����P��yR�<��g���M(�����+���k	���zV���/Q�������c\���?6dW~/\�s�V���:z��x2zj��{"�c��C9
�]L@��*��������$O���#�����aq�Y���A]�1��t,�1��E$� �����Mg�S�?4��*�AQ��T��_����S���@���q��4��L�B��j��3'$,���=?���Mp�7�N�������7��;���jL;:���(nh���~��%hW�t�t)��3[-��E��/D�5��>,k�W_y���#F�m�����JA����`M�x��3���a)g,�x�C	�0���
���6��4l�3��	n��E���{�����:Tk
-��m�+����x�oh��kI��_�5����>6�}�z6&���z� IDAT�[:W���`���N�Xr�M��	���0�&�����3�h�bB]L<��_WSR�C�P�k����A>tO�9��y
/hh�b���X<�#��h��S���"
�''%�O�y����v" �wo�a�����*=f���E3�BW�������
�����0r�]�V��4���<W��@�~sx ��]qP`����O;����xY|	zc��8����NSj����9���v�UQ��%�j�X�_H���
/h�qE�~�W���
0b%LkM�3A��s�vI1`jaC����$D�8�W�B�������H��70G�cZ��=����8�o���<@@���|I5AT�6��[W�z�N�O7.3p;�0x��`����$��\���@���[�������UUM�����J�Z����Ays����i���� ^���2�'g�e������L����� >.g��r�f�����������K��YU����������="56������nx�� �P�U������M�V����}5�����bN=����������]k�Q��G����������N���a��m��hc\���xh&�Tn���aq�9�p}�~y'�I~����������s)������.���/HlZ�*9x���Kp(m����`���X��_����v���������Oo_��BLl*�8RZ	K/l�{��*L�^o�������eL=���e����Y���\�~}i�����!�����}������t��3W`F�#�P���'^���B�:�9S���������/}Y�y�[%8��H�f/0�~P�:p�����7��}F�S^����L.�>�#�'?-P��[n���i������d/���A��p�)�"f�Z��dL	������~��RCoRZ��>Q���}�l��[x�ul_�>�m�����<����O�/�*��p	��-�����*0��ou�)@�{��B%R-0!E��<X��N�� �(��6��z�Z�sn$?5��!RmxFc*�:�/Wx`���>�����{i:�_��73('�f^` ���sy^`�4hWw_������
+}Zl��'�IM�7�l�(mS'��u�&�s���������i���d+����@�~�^`J�C_���,�����S���#V��F��5	�Q���=$v�2%����v�Ov����>a'�����G`A@���_zZ�pu�����A'��D}3��w�r;��[��
O��/*�8p����$��sw������D���q��{��\M",��n�t���9�����!����#
23U���nq%�z6m���$��>J�oEe������x:�F�$��"��l_yk2WHx����N���)�%�-e�{������<�N �b�mNj�nM��-�����*��<�@��Xe�ym��K�,7|v��a-�P����T�r������B��pz���i_Qi��W�y����^�!E���h��WH0����P�W�J
�����0������V*Zt�����#1*��$R�������pq�'Wd`*�����A8�&��p�MR~��V���&W^`���
S�`�$�zrRr/�`2�q�ox�.F��� ���'_��=����35!0xAGY��z��@uC�rp�W��|?��O�;g'l����d�5�jp%�~'��L?����t��������x*/��>SCx�Asq��z`�Sp{�~}AL��o���G�N�e9h��W���)�.��e8���D���2I9�pX��v]H� �_�Dk\]k%���o*���&�������*�G0�BTTT����C�
�z���5/�r��Y����>�<���2�Z��X�Q7�}�1�G������u��Be��\��c�',����=Ju��3y\��7�[O'�Gs��UC�|��C�(�W�����*���W��?�N�`�"��>�#mDAqnC��4����HKJD��U0&�AT������~���q��iII����'#��E$|@r�{R?���0>rt ����P�=�
Q}��A��)P.iG���da
E9��b�U��W����1���?��[��|��s#�AjMt����oq�
��H���O C!�Wse��-j`��4k+��$�sI���p#�RHe@6����������U��HF��!}���)0��0x���X����^�KF���8I�	���Yc��bKF�������,M���q(]R��m�x���1%uD��J���<���1���T�����d���������I�������"�w��mYV�l���!�-$P�$�����*��:��wg���5��KPC
�>���]�I��'���S��Q}_�W����.4.�_b��T&�w���2���������,U
�N�T��y���O��������@iK�~gPj�F.�x�������)�
^`����&�EP���p�BZvR��+��,��b�wQ�w#%K)RT���mfi#�����I���s�p������K/�H���`_��S
\����7I�*��a�0��x�h����o�K.U�IE/4&E��Fv�yl<��\�O���{Q��T��A3P��UE�t�����XL����1��Dh����'�$bj�9��W�����������l��Lyq*���$�c)�
����;�����*���C��O�A4�d�yr/����#O�s���<Ln�koRP�UO�O����}y`Wq`��$$-���	��Y��������#��cUq�O����t���7��r�z�1�$�/��Q3�?E%�[��������������������S���^`}�`w������iz�+N�D���L���s:��X�L5J�RF�0m�)ZBIIc����uB�f�w�5A[���7��a���H!���oh��K."�N�3h"��Ek�p���RG`
"���W-�����������}/�#�.
��Uh�m
���&���6��9�$��8����(>�	���X��x�����rA$''�� Z#������_q��f���'�41	�*�8�oW�G�:�Z��x��":D�{H`�_G��]���0<{t�+S�������������.8w�R?��F����/=.���]3�5�����{7�����o=� � ��CZA���m:��@��8�;��^����aw2�{f�&����4+��+�"h�2{�����p�`S�U��m��kU%U�j5S����&J�B��-�����!������8��RK�z-���Gx�5|N���g�P���k��/^���U,r���W~J������p��=������5��^�y��O�$W�^��v��V��|056$���?�
�����?��t�������L��T�c��t��
;�{��$+�.���9*�/����������5�}�����;Wo�`��, )��F2E��-���hA_D4����e/T*Y�d���)<�A���2LE�~��Y����z
��#�'?-��`~�1'c�v=����Z!��M(9�@�\e�lX�a*����C������%��p�NY����/K��5�:p���`4�0��<=��.���@q�� ��
B��Ay����=S8BJLy����A��k�M(��n��4SA��p���y�?]M����C�bu3��I����gAr6_x��l'�{�t��/0`��6��~�(�A�j����9R�V�Wm`�d���|s�Lq�)�4
*���/��rd�+|,�!���jr�����gLy!�@���� ��w�A�Q�^c#W��%R^P������S����"��F|/0;�n�!�O��C
=����L��2RAH@���Lkb�?��j���}hE�-�z��J"�2���(g�,��7���Y�E�ua���AAP@����������}����FQ�P��.��7D�����G������s�z����BuZ��7(e�'�"���O0����mJ�Q��,���K�<���v�"C�O�k��g<��������Q��8A����
��KL�v>]�6���F2�Hq���_���R�d�����(L�����`�l�+��|UR^��v
�:`����]a<N�����c��e�����D��o
Q�W��B��fx�������!#'�/4\��<���]'c|���r�����T�)/t8T�z=�uC���JbL2��}C�~��X��W����sBI\���'<Y�Ai"b!� 
%-
��/h�RE|x"Wah��,����r}��j�O����SK��hg�v0&�Ju!A����`���� �����A���C�5��/��u`�WyO�����)����q��O����~(_�|)����'�P�+>�xJ���f��I��>a���=KA���Q�$UL��)%,��Ki���������B�#Xa
�n����K�0����~��l��2�W��{R"a��Q���5VpE���X�
�@����i��*s���6����!�{R)a���:y�?��;��2RTP��	���;����L/�/7����h��Va1�~���������X�a@�,S�8��O�q��
ZZ�����l��.����L�Wxa����vakll�Hb�I��H���R�
�H�:F��Z�OH�g���_�Dp}�
)K������~���h�pt���\���yh��������c1�%{G$��B�����*s���D��~���;j2�,���)%�S����y�"�:��)^��Z�f��������O9#� qX���P�:a�C����+��� *��`yRna���s��4x���$�6��u`�	.���`j*R����������q�g���XJ*SGha�����
j�Rx@�U)����d�|�R4�~�:NB"�A�I����}�	>�P�)/<s�G�:J�z/�Z�>em�:2�9Z�>��9�b�`MDSP�����R���$�#pa��pE�}J���)�_C��EL"�!M�!#�p�I,)�J�jyE��� O��b�P��K��0��cN�g�����������;�����W���K������\y!�jXpe��\{��������}�0��NL���+/���GK]��'����6(�����R^py�������L��I�PM!^x�9J�aG�O���.��a9L���+�@���	�iX�����0�iY���_E������V:���������W�������.��U]�~y�k�>�Lya��aX�an�^��L.�)/��i�S/�u�N�rb �<���5��{�~P��Y�M]�"+x! 2������-�����M;a���H`e�qR^�0�R*p���WOt.W��V�����@?J������3W^`u>�G������./P���+/����oD�U�=}vV_rY�F����~�qX���+%��R`i#��z��%���D��1���^�����2@�1��>�N
���S(Q�^<��IsN���&��@+i�@W��N�������z��g��)8}d9)0L�S�����e����?���+/�m��i,�����
�����SxX<�
O���!#����L�������@�'��Y�8�'U��������\����Gi)X�j�^������|��Bu�����y�	\��C�l��%B�Iya�i���/04l6{�N�sd�K���OakW���^3����>00��s�^xp�(O31c��(��2��e��<����eW1orSR�h�>�_�X����X�B1z�~>����:���V������`jL����E�qD�X2�'#	&��3[�Z�^��d����~
���	xM�0
^0��I�t�}�>������{���3�~�
^0� S\u����a��I���`/����cC������&�#MC�o���e��^��dT^�h}o���#0��d�����>�����|���6��g�xt�0������(�Y����"/$������[[T�X����<wfMsS#/����h8r�2ly�����.n\�`���9~(f.^����6L���&d/8�x�� �nZ�{)uS��lO� �y+6c����W�l�w�C��xB�cbbQ�fe>�NRw=�g�<+�������B2���v&�.���n���U���Jf����f�kM�����v����mx���jB0�p�L������@Q�o�
����s2Vn��� _�&��v�G���A�+�����p����`��S0��^��IBR^hcm��7^bp�R���5yY�������tj�U^`�Z��F'��DZ,��_�	�	;X�@)��tZV��H����O+��m�@�'t5�yj�`w���T����cJ���@���\��?���T�Swf������I5�����x�g�S*���������&��:Kq��>�/�t2�X��,�.`��$�Gl�W�J�N��������;��t�<Y�SJ0��b�{���)=�:��
/<p��:�6���`�
L����y�)<�Kuq��x#�.?�C
_�r���>�����s����.K��`o�,�'lNlmM���?S�����@�*��#���HR>��tr�A%l��^��99p�
6�dRR8O��	b����U�Qhmn���B�Ry4�8������R����]M�[�����������J^���%l`a�/L�9�����#��f/\�p���`�=���{�s:�����r���h���@��P���0x����nO'��h��<��,�3MKT-���\��hB�na�����Tg-���K����>���*J�	w��Wx�/�3I�k���)�����*?<�j����C�^���R^�9�aTQ+^��SG��t2Z
.L��P!Q��!���ij���;�x{�O��a��A�����<��eC�FR����z���J8��)*�(�SU}��i)�����px��
^`���m�h
:j���W�:�
7��BGl�6�s�w�P�W��$T�)�TKC��A\()�5��mZcB$�I~/9Q^�F'�;[u����iv
����IUa
�(`�+nan$�}�N���)%Xa�B}�z�I��;���^ci!<#�xp��Y����@��Q�}4�kD���}�S+N��Bdb$WU�^`i�V������`��Ia?��	i��9p��	�<�SUbG0�K`{~����{�F
��������`J��(�� XjU���r*
��Iy�)$5�HR2y�g(��4�����?�.�uL�~vC����_(}�1��`�-�[�F��;���J�S��c���A�$+)�J��0���Q-�[��^�S+N�j&,]SO`����S�XR}1#�\���hb��'�/�t\H���XZ�j����H�	��7A8�$o�]�<��4SY}��ci�+F9�LQA�NPj���+�����!��=�N�f�<
�f�������*K����K�!:B��8)���xH����Kg@-(eD}��~�0��
G��U����>��
���J+������D���/:����x�	9c(�LM�����'�!����tz
B"�+��������J��4L�������qo^AZU
q���JJ��@w`�
��ETx!($G�G����r<�/�>��# ��L��[[:M)�:������.R>���A$��u%�4�(}B �=��3|�K���1<�B�*�n`J\`j
�)���+���@��������(Rn`����$
2�C�(]K1Y>oV����������xD��wr�zJ0����S�D�>(����H�&a���TLm����C�8T�^��I���Qtm	(+I������9������J��w����.���"�"���PQ���,e/$�sm��Ka����&^�3���f6����#�>�AY#,9��	��^���ZJ����ya���d�d��=7��5O IDAT��-3)�����0l��s�;b�UW�~�57�+���W\�uV���(��S���J��I�i��d�k�cSDJ2L���k��N>H�����iO���6�Z)A�l�k�^`�xV���������#(m�t/x�{R�������~o�p���}J����/P^8�� �(U�w��_�tx���G����M��FPT �B(;�T�(/�tFAQ�D*��b��
�������B�

l�b��U��wRh�B�J�x���7��'�)E1��X����P�9[�F�2����4JS1�?\�����:���7[e/$�I��7� ���Ha2�}`i#�����_��������5�������Cz��O��9�}�
���
a�g�Y?��XZ�.�kp��}N���X:������*f6!@��X��_=B������t�T.~���b�����`���1�m�����!8��;^`���mC���N�R�&�+�y�R�Lya6��������Z�umeyL�T_�c`L�#F�y��ul���'���<��j�����V^���C_
�+(��fl4��!`��S�����|��<�~x�l��8���H3>y�)���(�KI�����#'�D|\os���~�u�q���������[V�������y����
U[ !>7.��)~�X�RIy%qq�t��_����j`����8X���� ����?sl%��
ZLaI�"�i~{�L����<������������"��'W�`PA��������"��I4a^�
��������`r(�������?��|>,����1f�~�Z����PTR������J�&�Wl��'S�L1l�VD��<Jc��10�L�'�32���J��B~]���������o~�N�������Xz�j�;����3���I�:�����Y���k��6����cr�0[x�=����)�d�a���_�F(���fv_n��������txANS���
�vE�x���S�[2�6����~��r��%�I�N+Y�r�,n?�d�h���O��RVH�:8�F��u)-�,��_�au`��e���>4h�>�w[	�����{�$U�.���w���s4��k����%E�&��g>"�~O����BRr"��[A��8?����K�����/�iW���"/0�8��N��L%n�~�f`��������/?O����P�)�������U#���D���47�Q4IQA�nt����)����y�$��#9���{;��h���`c����ZUP����~l\<�n�O����#�a�����4�\���X��.�s�
-��, *���a2��k#��Y���_����z
��8#�?����
���s2Vn����������������Sh�w[ c�qV�rd����`�8��Ca/���}���_v�Bn�-l�2�����r/�v���.
xgnL-��L�%��x��3�'N�im3�������>������2��i#D���:���������6"�s���S�����-5eF��?Rf��OQ�e/��� �d/��\2K!������4�S��B0=���� r�T1���|�v��1mDn�WP&��TpU(��;=�Dn������3��X��AI�Te(V���Q���E'/��
/�E���S���K��2K���xAk���H�yk"�7���� Y	�W��W����kA���#Y���{Q�On����QR�s�^��G�~%iI�,�G��8E*L���^(�o~��{����R2h�"�����I�3W���,�D(���03������/���x!wv��4��F"><���6�<�C���Y�D��/�n���)�Y[1/�������PR�Q��K���ej���.���z���?^H��/�.�����0�`�<��/���������Hv�����q-(���$k_q{�m�_�q%�>���IyD�W���- �����>���������>��x!?|��/��]%5�/���� ��xAt[�EM^�+
}%�B�7x�`w�/������x!O��e'B�R���w�?�ZP���H����^����`��v�T���G�$��_����/H������{�h�_������7v��^x!g����%���*/j
�B^XQ��(Y@�R�)���x�`�/�.X O,����u�cE#0�/>�L^���m+:�6��������ZpOXOv/������]�Ov*��s�/�Yg=zn��}5����e���CZ=��G(/S��CLL��� %%������z
�gR�����L�>�CK�f��u=�����8���AF��}Gld4��C���bv��G�����;�g"��#������I[8�-�nH=�s�����s�`����?N�f����kIyy�B1q'!��H��������cN��f=-�����a����7H%f�en��]M	2ry:���,7��8��>�K�����?����g�On�s�����M�����4���������@�'%%����H7�E��)N�������o��+�|������������4��E����4�r[�s*�x[�����TD��PE������
���Kvv���Y�`��S���nt�?�Y�`�/j��m��`�����z
�gR�%�G�O~Z�(���� �������z���������f��B�O~Z;gcEDD����9kXHk�)���oZ������~+J����������%�'�6������?�%�g{a�Bn^����ZpOX�d��������m/�G������c��#���l{�?���������k/+%g���Y�O^XQr}���m��������c���;\r}���m��g�?yaE��!+%c���U�O^YR2����]�����?Rnnn��B^y^�G���-�dw������G�|�L�%**
jjj�,F��Fc�?b/�
��#�1Ddd$?�[T��c3�CS�?�`d1��#��$����`2����)���?v��(�rk��i'�'���Q���y3��4/tm��:��4!�?���Ei����l���OB����s��g�?�i����
���������d$����}��]����l{�?�����5�'����m/�G���w�?�ZP�������d�ua=�����.�G\J�����W������XO�m�H���� �G�I�mQ���t2Y�
��JWG�O��^����b%�����U��X@�$�����#��"n�����d����}���(��-����#$�^��d�+n��������J��6/z��V�\�$g����(��(��o�����\�$g���Y�O^XQ2}�J��5�z��W��L?�$c����o��/����~��xA�.�����������m/�G������!X)���l{�?���������m_��S��{���z$����]����l{�?���8��Jq�'���$ocqF�#��$��(��o
���Ya=�X����)8��2��Q�$�:� �
�d/��=a1Q9Z�0���|�O�6�u�CuJ����/����#��.���
��"*�GdSH���c��zj�_����<�A�zM�1&!W��)�n)��j[�5�f���O�i���L���ML�������}��P���<)����Iw;��P�<�+'���t����9iR�uM���5����Q�l`�V��=���T�3.�<�q��h�@y+<>i��SZ:n	;�|^]��1���<�W�TC@�w����N�K}�����6�����-�d����E��B�'�|:�H-��\i�>xR��$,���@��+Q<���3������m����i�S^��>{g�M+":)���d�z)2x~3���
�q4\7'S����4�v����
����cf���#������xA�������������m/�G���������������v=� )�d��/�fo^�N�����'������Lnk
�Bn-�B�m������=(����_�, ���#��G����/dcC^�I�^��Q�.��xA�/j�=a=��/��.�G\J�����W��s�w\I���zxAR��_^��� ����%��[O�Rm%���������ZN�ro����/d�C^�������e^(\��l6� ��x!
����L=)x���w�B�F����M����B^^�������4���?y���
Z5���SR�c�����!I�x����II8}�fz_/�����S����_�����=G� /����r������x�~��mafb���
�, �������}��]����l{�?�����5��6�/�%�>��)��������.�:T@����\'G.�}�	����\�6G����W���^1t�S�o]��.=0|��<�����U�CUy4������"�3����V����0�?K��4��J�uZ@V]�����Wi#��U���b?�CVC�G>�x.�6�Kx�W���x�Hs����K#<>�M�q��C#D�CN+I^XP��?���U�c��s4�&����H��.s�.����	Z�t��Ggs�>/���<��c�jQ
�����
r4��T���&���T���������d:��W�B��*��JF�2���0���'����6�[�?.��~%���_I��P0R�A[}�x��o�,��&��XE����;��h���K�l��	�	��_b�yo�FRDR����F���w���P��`���
�^�r4m�7����r�.�����PP��~����'���I�����������AxL(j���3/����}�����a�#��)���;mD�I�pi�B4�?�.��5�����ZxxnW���U6)Y��;����%���g?b���4�[�"Ix�}�,rZ��U&��[����y* &�����*�s�.��k�;�����rC�K��oB]AU��4�^0��A�z5���Z�*�s�N����o�{�\����]N*��0�F]l~��+c��[9���92W�*�M�~Q�7�'��1�q���(��
�����bX�.(go���o�DqS�����]����y��?4�_�C{��?�z���~�Vo��q����v��%��VFz���9���@#������
�1�2���}E��P���� Y�������q{�#�%�^��d�+n��
��;����v=E^H���_��Y��7k���#("���:���k�H�����KxA���6����_/�U
Q��`�V��3S�����{E�m^�Sk���G�U��������^�8nz�����}������_/���N>�a�mVh����t���`��-�"}3�^������������=H
^0�a���P2S*pxAJN
V�J�}���v����0���I^�y�p/��U��BJb>�X��]s��KxaV��X|q�4��/�Z;��M�}x�P������u���\������g�0m-jZ�re���KN��$��>���?�C�6�^X�t5�U	9i���(��M�;�H�@[�V�j��F�^��������X��J����\������nf	��������oZO��[����0}�`<y���_���w��XE�����- �����4H��_��8z�
�C���x����j�^�'���D��zRR���>WoX�~ooPLm�����^>_q�� ��������f��So����z8~�*/��/��$�?�:���	�P����������=go���6L�$:����5���!_�4-r�.|����Z�Ny�N���5���\��6B�2;���
����.�';��E�?�
���=���^�QU���� C���^����Oqt�H���c��K�J=y��R�^|�I�UR�"s��'�@��=�U�c�2���-���:���������X��5K"x�Hk*se��[���u�F����A��gP�g�^B����1��:q��_R�����	RHYA�\j��!�+�������%�=.�+/�1�]�B�WuD�|���(H�\�:���d���������sN�q��
����o�~
���
u:iGs�c+W`�8|FlZ#�=�_�@�����	1����Oz��WXs�$:���&*AZZ
��=���������*z8@�nxv<����$,nd��qXy�c���������U����u-0���Hc�JY���:���l.��{�t�$lWFb�?>�Y���)���m��f:���]���p��������r���������gBVM����=�:
�@�*�'|��*���BB�4+�����"�#3�UG=����5H�w�$��j]-�yG�g�3�Ms���~����w������k�ch55�vKs���4�dx�r����G�CZU�q_���)/����K�������7�����?��p���5����
��ly��4$''�e��x��B�DS��
^(���e� C�j��0VWA;ks<�
��/���P��c�s��@CA}Jb�S��R�r�P#E'���j��q	z��cp����������@���%_#���E)R^�VR����f������n����F�c��et��mE�w�S�1�r3��mS�h��B��E���E��I	�\�-WVx�;_����192e)���DkR��D����5�?����PM)))�C�L������@U'�?��W�T�j�� &1!�Qy����\q��b������
1����US���p�
�}��H��]&Zj�r�5�����y(��&�{�D`@�2�7����o�)(��*�����#({��6kio����������B%�
R}�;���A����e#<��0��\�i�z��c�6�������R�;=-����}+D�G#>)���@	���TT���~���'�<Y���Z�QC[E������h��V����}����{3
���� 
O���*���\���bDgm(+IAUI��?{'5�*�AU()Ha
�����1+���%K`X��|��8}	��t��nu�{����e�oWmyxq��z����!�A�9(��f�� S�! �;��!�aX���>�I�S���1��R�(aV��������	��x�!<P���:L+��Hc�U^P/��~��7�{��$��;����������z�*�S����[/���tW�5��^�bH�N�����q������CFE���o��P�:�ut���?�����������|+�R�R���/{��~�b=c�l�������V�JBFI�~e�O����v-m>V��@�&�M$�K(��ND:G�lXqY����4J���h.��>�'%&Y"�+��>���R�V����4�V��;������tR���t���b�d`\�9�����������FCJ�t�I������I�6������YP�7GBd(��M�5)���:���N��%���3zV���<��d�a�����W��E��l;������G�b24�d��Y���X��o�I�V�/_��.GrB,�'��5�o ��$������xKV�B�J�P�DM���3Q��6:V��'�����m�5���),�w�E�����W�cb��PQP���:S�cO���uc4wh%y,:?���0����g�G���Lya��^X�y3�^[��Vo,��8��O<�~"��*/���;�^	��|}��];��. "�.�Y�j-�A���[3���N��{��z��oW�j�����@�k;|������K�8����h�����vN�@�~���Bx�/�+4��
���4h���VI��U��z�(�u�f1<������s�����[F��IyAE]��}f�tw1
!
%U
x�}��hW�*5���7��_?�w�0jT4t�
��@�I�!C���kS������s��'7������A��A���x]_�7�ul=���R��
vGV�B,]���2��s�%_7�������,|><��Y)n#�����s$ IDAT~[��C
��>������;]C�^��klI�J�����]��n����T�����+�e6�[K�*����h��
����.�)?#o�������!����B�
�c5#l��K���J1��9�Z%����z��ni�q9�po~�>��|
�������ma���%����2}���:��>N~�p��$��F�
�����sRt}e�b�e���y<�F��rJ�T���aq���Q��b���������(�����UK������w�6�����x����q���}�	I��1���c���0U3�k�Zy<�?�Uc��6;���_�?�_���l��-��
j:��s>����^\A��G�9|"���h��l��i�S^�������	Yzp���{�{'�'�1N��/�KU�q��
k�P2+F�������(w�Y����OL����`I����TSR���7q���������w�7o�������>_p��k,�����e���36��������~�55����F���������L�Z���"IE~�������bc���������R�=��{t�C��|%�rK�v_T�!��P�S���w��t2S^�bS#[5��qi,=z
�����Q]�}���{��}*�j]��ou�W�\����ug��O�s#g@k��l�P�+�x��������vs��=�O�G���u�n�	ZX�a&���%kw��������Q����|���:���4����j�^��o?�Q�)(����CVn����,L�������/��?���V�l������Xd,t�w�,���0e�@���C�������p�^0�nNSol�"X 3�^���;^y���W�kj�����p��'"b�V��������p����'�Z�RXO�������r���9�d���'3x���-�XYb���hbo�s/_��?��c���Mz:#��@7�I��P"�!��(��������^� ������JUK x�yhMh��@$n} ��b~����?|�}h����(D���?
����� okHB$��pBgZ������!������xI�C��5C�"%,�����&WrP(cyk�]�����#�����c���R<q���}�����11E���1u�N ��������V�N����>�g�2����"���K+q��k��=�����s�n��)nk����j���+�]`4>��BWE~�	W�S�~Dk=
�&S7��N����R{_���$+xA�r]�9T�����U�1Bn�G��G�~r/(�����r!��
1�Pb�R|Z1	�z�(>b6{���e(���L��>� ���
���~b([�B�8,������w����{2"�����&����/��x�h�M��Q�����1I��
��nP0Q�v�������������f3+"��;�t��@}0B���-�g;�4�����6�P�De\�������y�q����Nq����O�AE�������>�G�e8pd�Hc�JY�Cmh_���~=eE����?��#f�,�/]L���-�m74�2�t,����uO_��{�M�j`��h]��>~!�!5��������c���hBP���5�����Zf��`T����E\&H`o��|�_�:^Xr�O��NA+w
 ���3o�����R�-�^���W��'��#=��&@��C��l��z]���z��!�~�u�`���I���������-�$��!�mT��?9�;<�������{z#���\��^��K��3��cm�r��z�fu�&�t�E�JFPZ�
]��= ���p4�1��+O1�Y��a�nP�:������&�p�������+N�^����'��:*J���Cj9����/L�7�}���}�b�������#����3��q��L�?��
��&he���m������=����g��z�z�J �
��S��y��bf���1�X�+&���s�Rtdq�J&����sa�HF����}6M��" $	/]�8�p�y4\<��z����C�����8
�+���]y����&�k�W�>���45��&���t�F�}�
��R�������B�v���
�p��O�����p{�S@�|B�
6X����3�g�^�h����w*�� #�[���"g�D���4G��HD���%y�
���4+����%&��a>�����`���z�����
�
6��n�#����>����&}L�"�
�t���
�~�@�^���i����O(�J��8����b�Qo���,�q��Vm�]T���pv4���� �K,�Z�k�'(v��s��P4Q��@3�����)�fh�L���'(#��?
x���@�Ci�lv�1��8�H�'C�����x
�f���.���C�a�������8��fX���p9�ezLG�N�A������=j��ul�7��T�D����t�(T��_�����d��}��	��sOb��z����Cm�_�F1�:P)fF0�Z�7��������x^?e�����*XQ�
Y
���d/l�}�O���N	D|��qY����[0��
l���Q�T{6�Z�V�:�/�O=rx���y���;���=]���+��>	�Z�Y�����g1��Dl��
l���O�N�&�����-�}�Da^��{x�H��-�`K�zK�����|[�%^�>���/a��v�14���)
�;6�?������.�7�����3F�K�{N/��<]C~|u������ 6�k��6����<������=�,����
�/
]C��2GW�!0b\��C��p&�"��G>���1j�%l���+��f+/Tj�
�_��^xv�0���N{����<�
�u��r�\
��G�Y{�}j'8�fc��=�;-���q|��1����]�{�"AR(}z�_Yr;gv���Gqp�`��X",�!~������7�_?������.�0�l����A�q~��i-��i)9~������������������3�	FY�{�����g%���is�PITx!2!�.��Zp��}�1��1�'ce�EP�U��[���2|��W�����g�(�?����+�,�k�-L���e�khe����AW��8��0������w���elz����$.�f��4�$����Ca�X������]1��X[w9F��
�V�m�;�����=�@_�*����B��
QJ�
�(����+��VS��q!��z�V����>���K�Wl|!��?���O��o��t��G��`V�)X�b#���/�_���1-�x��*�����������a��(V���]���������M�������|T�-E���h^�<�\?r����M����H������Fi��;K���hS�"V����v��`���c���{����`S�h����� B�y��>���Fp���X8\P��}���>3�����8:}z.��3����5�_��:��&�uY�E��(���:�0��%�7��-Oll���]��u�#xa��C4���}B�X!�Q��?��b�*_�&����W$(��{�i�2��vi����0�����L���^�v�d/������'!c�C�lR���M���,T �9x����(mm�k��9�;6�>�~��b���<���u;1����o�������T,gGi%L8����)��0etj�!��R���r�!a��N�����>Q��wcP��y��b���DfmN_�	CJajD�=����>����w��]�w���9�����������<V�;?��X2�d�A�rO
"�����D�=�Vx����B0�p�L������@Q�o�
����s2Vn����n~��{��}�4z�����a��S�/��E�D�'}���� gj��~����B���H�
�r�����G��������"$zB�u��������%*�m9��`��u��	��W�2�<�HHF��t��E��+p������>���S/ G��&���!���1P���	��
�&"�%3x��{x��([�6_8�o���� j���b�RX}�D�#[���W/9����]z`��u�eW�J�Pg1�}':U��j6�h>k:v���n��<���������[�
��N`
C*se���
����"���N*
�?����X���2m;$5�2�;�Q�_�v�!���
���C��<�<��OU�*B��$W^`��i���X:���A�t�c�Hi:�f_	.�;���Mp��zo��v�T���OH�a��k`3�d�`8��N���w�Rx���xNy��v�z�H���q�JC�=_;0xAVC�G>�p�}�����.B�Z����5��Hs�^`����S{���^>/����X��+JYU�E���r��}K�W�{�R����!uv�g/h���\)
�`�+W8�I|
zPv���U��N�OZ�N@����L�y�p�����U���O�P�N(Z�) y���52e�����wU����'xA�"�}��Ai=�w�gzF�z8����*�%i������!�X�J��Hy����4�����������}�to_�=��G
�u���&:<��nZ�}U�r����T)<��CE
����^tbQM^	G�=�*N�J�W:q��AwL����F�0�����pXb����-�����[�����m�������L���<=D�N?�+;���d�5���*�+W��{8�
���	S:�1��}� ���Kw|$���?�Ie���K���<�*�i������j�	l
$�����M�?cOO��Z����s��~|��T�������M%M-��5�?��W
�
�����d�0���M73x��D���70	�^
C�r�6�LJ=w#�xT1�����	hX�?�NY���F���D^w��@�Y)�^Eh�Js���s/hS��1��@���:sL�ASE�n�v�:S���B-�4j���7w��H6���L'?����[�'t4i	=El�����h<q��7�2O}��!�S��]�j�"��VIxANKfC��7@��)�M{�|�W!0l������9����B)&0xAVC��~�)��xA�BLz���0��vUi��x�>wh���JX0`J��HM��vEi"h��"�A���ZF�CF�������!(1��
�8�J��I��vYi|%�5%X���]���O�`����WgH��-����4$rZ����}�0">���Nghh�t�HT��T�!����~(���E��)�_^`*��f!��u�)�Oq�>t��V����x�{���O���>^�-���#`!��A[��g���H����?�q�P�6���aZ�=)6�G�&}�s�8�u�[�*�No�@CnJV�B)���]}0��xsU�z6��A�g����{$���T5V��Y�������^`�n!�����A9�
h\�������tTu����y=J�c������F����v��:��N�+�)b���"-1��S���q$LJ���������iB+�,_�m+���+��`aW��\� c���\-X����'6�q����k����jXZt�)��D�>Xai�����Ws`
-�B���\5���]`P�����>e+�H�a7�O���e����N����Ra�k���-���������6�_q�����
�xCi/�_?���������1��4�:e��B0�!�]:��Y��(�z���U�kd�1������0������1����.�k�Bd\KF��j�R�Q������lQ����g�W�Se���><����lL�6��D�XWZ��s�����y��TqIq��(lH+��o�d:���j��?	��������`��^���q�c�'���j��p�J@L ��MjF�o�*���P������DRG����a:P�`�y�f`��%��w>_/,vZI��h~=�����a�i�qw�bN�������a��k�-�{�Gv%����EpSgH�&����5g�u�_��J��e�k��n��� 2!����AE��y�_��Y7��e�zmb����n<��{�O��������R��F�����a����|��.����	������W/h�u��kw0�}s<u�����Sr�#e�I;b�����d}z�vA�re���E����6Ce�EGDA_K#6���1��v�J�g���XO�h9)���m]3s4-Q�������Iya��s�h`{=}�~C�U�+e����=�����+c��[�u����?�f5���55�kkR������Q���6������d,����:��� ��}�ce�H&(/dk��P�����J�����p��cD������������?D�����_�2��`)H"o�����
����������I�T2�9{�6=2��m��|Zy��-*���7�@�.�1�)EY;���)�]"Z�-�x�}:=��*��F�Rv���([hf��R�F�=r
��; ��	w^��D�
���m�E-X)��p�A�?����
���s2Vn���P��q����-����z:u$��������$���#{�������`iJ� �����7�RB��H�1���Bu���������N��d(����)q�<x�Bi!��Y#dA3Z"l{������w���"R"b	���*��,='%!��''%3x���
WS�J�8v������	6�f�G��w�@SJ��������SF�����
)/����{�_����b�t��9m���J���~�d/4���0B}U:����.��B������B�2�8����ur�2�_c������M��)	qH�E���R�����KQ��<��f��$M�A'?;��$}��Vf�)�� �����iHRpx7���/�����|1#�(�BNKJ��<USk�d/h�,��{��ZNj����[:����)��r��z[#��3_P���`�W��@R^��^�`w���0TZ,x���,C'����5����R�Y�'���{�����@���q��nDD��-��MV�SCx���~i��=�&������5�c���� �J�M/_t+c���R�jd����y
�����,���E�����+�A-Sx�GR�R���	^`0B�
��
�*
81��4x�A
�KW�i�����Nb������HE!�7������=uy�=mG��0��gWL��}hl4t�����F�
�$���.uyz��@�
���^�����y��)_@���w��Q��c����U1��C$�2��MR^�G��
�l��s :W(]U��g���;�A?J���[�iI������5:��B�2�&E��o<����g%r��������{p4)�*�+a���tx�;W^�����1�j_��4��,�)#X�]y�0zW���3�Q��5�	����N��������E���g'
^��W�Hy!����P�����P�N�B&�)/��h����x�b����W��[o����9��� g�+^���r�e9���|"L@
A}��?��a�� -}E=�z�3�����������Ax�Sec�>���l~��,���)h�QQ�����t��.���1��{��SSF����AF]�f��i$L�q���p�L�����m��lhq*���Arl
��l`m�@�4x!��h��K<�\��K�����o�\ya�k�&��Ra|��9Uya�)�BA_� �(�}"��/�C��^��DK���'e��0�b���Cv��������+BQK�vNKUJ�^�$��C��@)���������A$�O)~W^��}W'Q�7<]G�c��)/T �����@$�� >��M|P�7R����'�R��>>�\��`�| �>>�c�E�<JZ��E�#���/[7�f�����U��COvcd��p����d����\RA����B��]p�TzV����>3S^���8��J�#��`'�'���p����:��"�>����T�j0���zx��� IDATg
|�n�U��wD)����H��L����RBZ��A
�[��iX��:�_�YOJ��!��)/�4�/�D����~L3t�����p����>����Z�.��$��8���@�~��#����4!
^�5�{���l*p����u��a8����M��<�q_(��T6�m�+�c���<%C�a�pv�,��..^|H5�)O�������"B��CFx�j��H�=���q��g���V�!�r��>�/���}�`��`	���v��C2�l���q	���.����Z4t�R��%�����;�)/�� �����)O1����������*/d��=�U^` ��W�4��	��c&��<Z��V���"���W�o��d[�V�����]��O�`�$�������p�����z��y5��q����U�-���a������r	)	x���O���Z1��>/�R�����f�	G�NbX�T�o/4*^���`�����
��.Ex|����9�����)t*���w�F���jbi3��l
��@�%�" ��B�������b��Hk0�A��+��kU����!&�5�m����^�L�>q�>>�����;����[��t�'�;ah���~�&���SF������7�����>���3(���{pj�x�������R�<z�	[a���hV�O��a0i�=={|��@��-�;����as��w���`�����[���'P��8�c����5����J����Dj�j��d/t�Y��c8�b)+T/mM)2���[UF�9J���>���"���$�9
����@�/r�BRR2FL^�~���j������0k�0������S49}��<mDFx���

�T�:�3s�P�\�3'�m�J�*Q���N/��/ ����@�^J]��XY�z��������*L�
������T��<I��������"M�@v�0h��@N��:���o��<���k�������e
/�j���+������'���x��o��&(������O����`~�<'c�v=��&�����
�O�����w���]�V%y�h������0��"�����fT^H&�����?��e�[@�rM��@�~S��/E�cYcS��� +Y�I�"�p�$>K��B`B��^�8���Rt2W�GUDR���x}/��������8h�����<��l15�vBklcJ��s���b�:��N���hz�B�B������+8�P���Z�J��iUz�����d�����V7S�e/��z���g����;\x�$^`����z~��s�/_@]JU�?��,��k�/�wD�jA+����b��{7j4�DcM��{W�];6��bC@@�����;3��R����'��;sf���{g���=�r�^�<q*t�$���[(�V���������V�0�l�)9,>t��
}���<�����}���u�.�$~������D}�
�B5��
���)9���$�����k��H����i��eooU]t��L�#m��b��G���E����D1��&.�1�c_=���r�V�l�B
��E������-�!#��!��*s�p�A�N����
tB���H	��
�m^8z������b�������P��k#��3�to���	�6=m���~��H��A��K:M���A^��fsCTD��������9���*�-h@�hz����[A�n]	!�E/x�����>h�0���O����}� �7�N�*�w�CT���6�C��9�cSy���'_y)/������o4�3��������X�=B�NSf�����z�|\�_��0v�68]^���)�d)7� ;_�%?x�q�
�S��h^���x�JO#�Z�S����A�|�2T�
��9��}� 0g(����$c����4:	Kj>�����N�<W�wGWR	���M�
p������E��}s�/T�
�9�����-�����
/0C�4��0it�w���X���:��`���
B0�Q��8��]�AW�T)�D`l;1��.��0��=���w�F'T���y��;Vw�i��)\DW*K�7�u�0��K|
/��nJ������%�h�l�<vFWKz�����x����S^H�#�k�=A�,��{�_)��T
�
/8����� :����-���c,�/d�;��,�4���������@�~`!'�X
"x�).����f���I4�0�*
�)|�UR|��(�Fz�5��M��ZUm�avC���]��c�����E!$~����x���7���
�����`�B�y�D��;-�!%����p��0��<l����������Q�����Jy)/$�+%����D���R�`i��!]��=���xT���H^y�6�@�}�\��,0����t`�/���LRdH�
/���>��#&>�mUy=����������h��o�� ��
�J�
/�9�?��L���}���l	p�:�D��$'�9�ZP�dz��v4~^��#��1u����
���s������Pl���{��m�VMr�f�_�}�J��m�:�t#5��l���3���	xSe0n�����jhZ�FGt�(w^�iF��
{v�:H���xA^S��e`J:	��q+���HPK^`P{0��k)lR�boC$�%�3@��{P%R
����=�|Ha�!gB����m�n��a'T���CI|
/�	�y��<��g'��mB���?�r,��_qo��ZE�B\�qUH������a��kP��Ta�m���pX�BWV���7���%�#�&G��f�}�����4�w�����v�����~/^`�!��.t���`N�������f�h Kj)�8����������J	*"5>����P,�C"���!/n"��S�S��)�O����F������O���vR�(R�:)��\���`3n�����������d�������)�`�@
+����H�'0!x���!���7s1������&�P,��_����a�P��6F��B�Y�~v5�H)���D�-/0@��>w�v������i!LtH
���^�pr?�_�.�6<C�b����9�(���CQ��R%RnKge^���cX;p;���]j��|����������`?q9�����7����/�	��A�AA��6�A�ik(\�H
����/�	|`p�Q�� �a�*D�B�B"�"�A�������~(�jp��;�Iu`7v�>��E,�a2i]��s1:�4��/4�>�� �x[RX���7�}_�`V/(�3_UCO�su]�pL�����������!.R�pb�L
�P
�^�#k��z�6���B�G@@nxAE]}��A�IIN���m9x`feK�����Ql)���=Ka?~�*Y 1.�� �����������:;�*[�YZo�'�
�������c}�4t.U�Ik������];�&�H�c:m3E����u��G�q�{W�v�����Ql��B�����BZf�>�L0c2�S�*,�C6�p��:�?�j&,�����2bvNM,����>�`4��`�KR�	9eb�e��p��>�{V��*Z�9���\,t]�quF�3�w��S�a_�;�������0N>�xK��<�X[�5LaNu�� z�1x!!-�T��"SF`�
,������%��8��B�E��j*?�NABz"�>��CaD&G|q��F�!X!7������v��Z���cq�����'����jzw����f�5���g����������v?-��+;`;�wx\��*6���N)/�R������N������s�m
�����~��#)�=uGG
I���+�<�X�	6~	�����z7k�!m������W%8a��l�N
��(]{<�������+��W��vX�x�)�by(����-�b�;���C{�n���O���J_+/(P�6iA�C�~C����wy�/�4��	�/Q��zts��2R�d������p���E�)����*:��� zM}ooQ����k:;�/��K����;���v�
��4s���c���+F��-N������$�S^P�����.��v�6g(���'6
6�\z�������_�I���]~�<�^`�<g�,�j�����i�a��e���_�'8�t�:]P�Z1�����
���gG���@0AUS'�A��I���p�^`u���K�tI���!D��-�'>���NJN����B�]$�F�1mvR�j"�^$�G���(���������y0/x��2�P�G����m�R�O��c�[$��0>�������m,J]��O^�BQ��/onx������j�,��^(���nS^���ho�a#�G��#/xA��Kd*/x�D�,�� f�R�V�P*
*�J
QJM�����|�Ly����|��^(i��Q����W�2����[V�d%i��@a ��$s���H�X�_UX�P����e��~�~^����u�s��(n���d`�`A���Ck�k��r�IT�����=��:)�0������3W�`�@�����Qwi��6��mH"��) %e$s�����WP������Q�PR�e�|^a#�w[��J�����b���b�M���%� m�	��5��tGD�|��Kj]��zP������Kj���Oq7�K�Gi�/nxAZ#��]^��� ��J�K����/�|%���������z��U�(/�	����;���*P�U E%RlZ�I�I��"&^��a�P����d�����OF�9)8�����I�K�H���j����]�/o��,�c_�;����xA'�E�
q�/�|�I��/H���I���� ]����=�?��/%�.�OI=(����H��%�^�����+�����/HkD��+���[���SIr	�������xA�9S���P\�	�B�=�������P�~��-��ly��#�P�F����B�>*,�/�!^(l
����P*n*< Y��d���5a�R��-�ua|J�A���G��-���6>���/��U����i�H�vxA<��x~*I.^�{� ��/�?g��S���9^(��~�����
���?���-�B���Z#�%#^(���P�I&� �
&|o�/\xv)iiEj��P'2S�2r�*@���7���Ka�-o�{B
���^���a��S��J���n��n������9���������e��eWY%�������b�(k�����M�1I����OYk^���6����o���G��S9!z���O�����)2����x��� co$#���-C���&b�%%%((��x)%9�8��M�H�e�?�����jf})��#��ez>&G������N�����j�8�$��,�fz�Se��T���Ml��e
���
�k���mKedd"��Br�#���frr2/���\����`���
J��?��Iv$+#��Q^��|�����O��6�$9>������>���T��
=�*����f��OII����w�O����������j�Z�v��7�c�����lYMc=�����J���,������H��r���R"S9����R��%�U
���8���?2t�*z���0k�6�����\m����Ka~6+�P�~/�O�������)�C��}y��n���(�_����:2�v	�#����@y�o����kil�Ic���H����)���|)
K��H�����
i��������Q�G�����4����w6��|�+��u	�St�}���|OoY�/�������xA�T�6���Hw����0>%��t��#]���zy��c��S�!����H��%�.�OI=(���f��|+	���H����!���|+	��i|���[�?�����!���|+	���H����!lVJ����*���<);��H�����#�������� �����233���Z.NT1�&���R2)")�\l�B�vU�d��T�.v������R�����^�(��T����
�#��J%�0>��v�*e�jEEE�������g�S�GHa|����|cR�,�f�I���IzS������O%iQIzS�����w��?����&���=*Y{��H��E�&(/�[B��W��;��Ik�������)��[^��������'�K:#�[^�������)��[�<�Oy:��F]��t�~I��SRJ��0>��oI�'�K�=���G�>.I
����{�/[���G:�,��
��K��G����85�#����G���W�j9��/Hw���������Z����nya|����Z/O�{�BJ:#�[^�������)��W^����o%aYIxQz6����o%a�<�Oy��cc+�G3\z6����o%aYIxQ:6��J��URV����'�cG��URV���I��`��y ?x�?)���I#&
���bW�hEMm��G���Aa��0���������]��<T�����6+E����?�[,J�RU�\�&RS��n��/Y!�Y��==�r#_��(�e@S.�(C����?Ro\�d�,JTM~�I��A�|j�l��2T���rs�DGGCUU����N��j�SP����H}y�G"��2�����xi��������;"'KWJ�����?�rU��sq���O�|&>)'���b����)V#�P���G_Y��"����eMH����Z����j�&�I��[<�r���w�?�B��Y��-h|�e ��(���hEUO�
����4���w��X����}��p����w������,�d� =���������#i�i������V��d��0FM:��3c�]QZ��u���������*U��b��3��������������R�T�<��0��>�2������/!��E����Z���y��t�,o�{B�����Q�Rq���
�#��J%�/���h�x$��eE7�&�z�
A>E+��@�Y���H�o���$+f�
-R`�������S�����N�t�{�3<�?J���������k��e�L��o:
i��B��.I^x�����|<PQ���?�����	z��������>����#i�l~L����{��CM���!`0"]4$gP�$x��y�u�gH{�������4\0�)��ue�;9
tWO�����h��|�}�����"S*�����e���*J�d[]*��q�����b����*�Z������:(���f�/�������xA�$lVJ��%�.�OI=(����H��%�^��G�D3B�JzeH��/������x�h�������GV��3�xA:~�^Vx�{yZ�G�����}%��� 
��X6xA��g���_���i|x�l�%�u��^������������Z����nya|����Z���3�`j���j��3?�0����J4mZ�3��.��p�m�FIO�UZ�B�>�p��F��6*�/4������>4�H�rg9�hN���&�i�.���m/���/dF&#�-�j�JL�B�J%�{^�/h6����h��n���g�X��Yf����(��W���o�bt����z��K�"�u����2��Herg�]�SL,.�����v���
J^6j.�]
{�y8�gz��fkgU5m��}�H��3����]c�9��d���$������b�c�$
/�k����(T����EH��b�����R^N
��`���".-�L�Vu��K^H}�
YU%�y@��
rFE�Vv_������#���gF�!��=����Z-vc�PP��B%
=��j�Q������o�H��@i)/��c����1r�1��(R��+����
8�[p��eg6�����8�.���������/�]��H��n%4���+[��`��4)ix���A�\wv�&�A��%�I*/|�
���wa�k�X
���N�"�s��C�^�,+��\^��/���[�>����0��L��h���m�`���E*WPfI*/��`P�vp�{
��b���Ej��]s���c��+E*��yt�n���E����eGc����N,���$��k��B�����%!��1�6kY�~�.�#)/�i����PV�eB+ IDAT����:�+R���[���#��M��%���Po����
^x��-B>��{�V����,���)���{�������s�#����o<��g�"�Tffv:���D��H����P���.��n��e�E[���(�)6.�����LKO��	C� /���/ 4,�����	����c��,�����/�mb6+�vU�d��T�.v������R�X��G�D��<�c����w�x�#z��W2�S���M0cc�/����K��"8��/?��x�/��+�{�%8t>rC�����4����(|������mB��~x!�5����H����aKzx9��.w�Bjz��0�S+0�����c�^���!jT�P�kC����E=XT����+e^2|
�9.@FFZ�}$ix�a��?�]����'�PG�&��B~x!��(�h��+�J^H}�rf!g\�k53&���@�_�b�cI�$��S�vp���V�r/�+��a^E�X��;MK^����Aqo��;i@UK�ODKzJ�^�!:�}���w)E.[^H^�U�G��C�>��������_\E�J�Z��E99,��
\r�����0�}w<�z����R�i�l��q�����$	/�~}3��n���Kx������m.j4�&�%���)�#m�����?�*/$&%c����9q8��g.\�I��~�8�U�MQ�f��Rx�����s��`P����0}�OX�v;~�=���d�V,�3)�
G�8�`G�C��S!@�M+��h���{���wx���A}��3�B���^���D��id�������`�B�5��%�����|22h��*(i�")<�����
�Y�`��7��G�������'���/����)]�V�0>�y�t������W�������������������	�tC�Oj������9����CTX:�k���_�Sd�0���
����r����\_a��]�MJw�t����w`6�b�d`����y�
��1���>����?3;"0,:����5E�Z����|
���A���2��5>E��q����w_`��{���V����5���7����g�r�W�
���=�/���:��	����`�
Z:�x�����aU�=dh���_��XZ�������	�g�@p�+�W���|����4VGff�8����Zu�B-��6C?yp����R��q|�dT���m{@FFW�.���-���DVV&����V�g6h�e"�?��RM��4���a�Z�94�lz�V�������<��/,����Tu��yn���]��Y�2DT@.,o~z�r�g��o�����;��
�!����Co ���^�H�����VP�b[�������4�
��aH�P����,������z�Y)Phfy+]�\����t�/���2��b��0�����V�	���w���N� ��������i�e�z	�o9:1��m<>�X���AVE���S��?��Q��k���!�����������E}�A��N0���
�a<a=>�^���`O��'��Q$z�NG��
R^8��
��qS�����������`�����^��"H�
�������)��H���������447A_�Z�C�����B���%��y>�,tu0��
�r��~����5Ln�������z���3�=���0��@�{��W'x~���cB�y�A���D�
K�e��nmq��nz�@OM�t]����q}�������C����<��]��'���S��
'RVh�z��uy5G���@�^s�z��
=~+B����8����$�������^���?01��N����C\�B��ILy!&:5�������n?�z�t���z����b(���S������h�jj�n�����=�)/����s��8}b	�\JSU��Z����t�R�T����T�=SN��KjC�6C�M�@=�o�MO�<!�!�oUjS��q��t�J*�PQ�����xts?j�tF���?5�;0��rP� ?�O���Y�����{�;�?Ks.�*���6~{�
&*�0�j6y�����L0��/�������z:n���z�����KVsjNF@b�|�k3#	}L�����X�+��B��7�����Uvh��@�<~�j���4E����=RP�2CfBRn��J��H�x�n0i��kU��1��B�;?��2C]�*=[@���<%�
�Pjm���:��^�r'���r����^������ZH<q���%CupGdG ��
�z�����X���t�*}��AIT�A���P���i�$��+�����*���C�z�%��(�k��^�����)H$����Dfd,T�G
�e�m(�5�I{�C�2������rH>���3��
�H2����l�aT��|]����H������+����O|�����e��mGb��>t����5BBZ2Rh��q�,�*br��PSP���.p
x�YM�B��Y���;�H����J�����}�W��_ci�zv�g0UmC<9%5Y�jEOVz_����4�l��?q%S���F{2,quG�^&��8=V������E�0����c������{�p����w�!�	�U35���Ik!�����������K$�ya}���F
�������t�����l��2B��Aq��������]]�������8��f��Q��w������+A8d�X�
��4^a�����I����1��qyK�zhA�H���Y<�y=��K�s\&����T��:l�iBQE�V� *8=�;�c�M9��������G~�}a��|���7��y�>���x�%���2����x��DJX�����|c7�`��@��W���)�8��bn���fa���H�����"�
=�/����t���
�=]�8�*���	�|�r`��C������h�YtLUA��.��B^];�����8�D�p��y5e|:����E�+�W5����z��?���U%d�g���=�OqS~�/?y�����1�q���q��M0�6��6��TX2���v"e�e�v����q���z>��
Ey�o?�t����4�����KM�����}��}�����
�I�k\y����o�`��}��S���7�O
���-��@S�ui
|�O�_����*i�������l�����ZG�U�c����l-��������0T���J/�B0����U���18]'���I�&�	���W��������;�=��e4�b�.����zV]��Z�%�������UC'@�.��np���L�>����k=�=u�O�snCZF:6����{7��������`vf�I��\	A��^�yc��i�i�
�������SQ��W^��D��Xpd'����^�I�[�G����T��.)�����O]�z�D�**�m
q���:�i@���q��+����T������*������>���
d��W�n���s�`�W�Z`������f�aU;!�TD�\���}p3�
�����K	�r
�[{�B���"�S���5W����)/$�E�����Y��*��5����j�5�i�b��q����af���L���\����������;x��]���u�z���
+�����qe�"�j�u��Cjb�RSp����3���C~���]�	o���8��i��g��������B�V���<9���]C������_�X~aT��yM8m���b�5;���P$w���?��b������;�p�x<z����$�b�{��zS�F��0:�5Uhij`��]AXD$����l��u[��)0��%����"���"WoX�y/oH������fP������n6�'�����?��?���g/�{^����fa����056D�"�����0o��25q���-�/d&$"b�~���K��C�A]����5��H������A0k�.N���~�I������5��k�'a|����(o�M�D�'/xa^�����A�����G�_�_�/�i�b�J����Fm5��%��l���$.�����Cy�.�+��G��k�19cHGk$$���=/����=���&z6��M'�}/��
�����G4�yWo|������y�%�c�~Z{���nN�{�u�tRhHNM�p5p��[�������m��
����8�0xAYEG����F��^W�{y�z������y�Sc�?C`hl�
��x������
�5�	���������2�`����`���=8
�A���N��0��t`PA�NS���^��\�~a5"�|1b�#�S�F+T4�A�B t�Lq��V��{)4E�ap�yb�E��)��w�@�V�@m��\���j�zx|w?zX�G��",T��/n�^��T�6���3
���������q��qM#?x!��/�Li���*��R!���T����c��V��B}�^��B{3dEQ�����?3�����)�� ���G�
h+�v(�v7
�����6���!�y(d
�hsK]�v/���A{~�����C�lQ
z�ye�F,G���A�������������8���
�><' a��	�}��4�^���xfJb�8�B������]H�rCJ�{�=�
��!���S=�F�D��ib�-;SA����N��[;D���:I���B��UH����oaL��K��'�h��7\����A	����N%�X;v���������!���l�P�6wjZb�hK�����z�F��\�kT��kw0�~?i�*c����E�
����k�t��[x�cO_a�[������������?`�/2x!��Q�����
����d_���`]�,�7�����M�=9��s������_��[
����S��>����w�i�:�7�:���R��:��������G/A=H�A��������8�}��}�yck�)��;'C�6,:v����������m��%mn|���T����]g��*W�C=��^h�t�"��^W/0�"��UN���� xa��c8�}*�
� &2&U���^���}���
z���3p����@@B|��rx������~���Na�_}a�j��?�zMD�~��KC89�NPC�z)�D^������i	53D�F�P�6z�����p!�T�����%v}8��� 8�3\Z^�?�>'�a�yo����;#25J����1�����������	{/B�T2#b ���� vo��R�zH:}�����PE�-7(wh�C4�j�sX�A	
��p����NP��O=��k�4���!��FG���q��v�H�w	r��t���b��H:wJ��j*H>}�T�!��=�
�������H������mL�w���GF8l�?@��-�R�{"+C��.CK��5��������#�L�3�AV|�9���i�E'��WG��_0x��Q������K���4�("y�3>�3�����B�n����.���6����~����
"}�����0��V������d8x�i
{a��0��G�v�9sx����}/�a!�9���i�28>�N#h�����o�
�Cw�F��z<iM!N*)��B��k��sj������8���/���M�I;L�u|*UW�@��s,m����p$'d�����r6��CC{-<<����}�@$����a�"2������Q����%.m
#P 
��r;VM�P�R	����k���{#i����`�^3�;��i�����=5��'�|�_]W��F�����{8
m,�}(����Dul���[L�����6��	J0������������sj�6�o�?4X����v�W��2Y�8t��:!�)������Sc-<s��
��`�� ���O�b���!�G�L������"x_t(����H�����8�1h�A�hF`��?C�v�."S9� C�1�c����}T��:�'���:�6d����O"!� �g�b1j�1�/p�{�\h7RG���3��<��g�)O~����*���G?m�Qw[_r������������l<���L�Q���<"����Xu�q�hvz.^�������s�t`3�;�E����a�$�����/lp���2���10��2�bZ�c���Ek*%t�j
�oL���
�u�G���B�~�`��]���]�m�:?w��v�1����La�����Gk���>Ih!�@�-����=�v'0�g5W���aqRA�������n���Hk�����Mk���ft���zc��YX�����������6�z�x��g�����P����iM����uk������m�}����~c�^���nB�����M9P����i��{Ho�;r�C�i�i���7���o~�B���hR���?��6����+H�`���`U��Zu�oGws�#�������.�����Ac1z�*�=\�����n�}�3s��a�o89k	��[�Z&�&[g��W��O����E�bj��0��`*�=l�r8�'��
�!����y���Fo|���<�q$(9�����+�����'?xa�����@e�"Rc����H��\i�������1����'0P�A=+/�R���w���v�L�����cq��&��,V�����G��K4�8>����~��=��F�%�]��)^h7t>���s�@C������p=�l;
C*�wx}��
[�[�W�.�
1a��u����
&6�6q���u���Q&Z|6s�����s�y��i���c�q��B	h��D����/�7�`���8�|(�/;�C���m;h��C�����P$w����^XCpS^�w�,~��{�������s��� �^�^d8�tB#�:�n�-Mtl���,���i��>6�t�4RP`i��\���)��*9�;�r��/������� ��H���'��U5�/�0������L�C
W\\adPuk�H���wb�����25�������X�	ZHz�zQ�J���o���I�n���n;����/L�Ba-����J�?ec^��
a|���������t��������/A�|������v�5���&����+��'�/05����Q�jG$�@L�	����Zt���I�m����tj#��B6��),�!���q9v�-����d~�L�6����EH�lx!>)�:�BMs=��0w�-tmR��6�����/�25�vF]���xu/����nOT�C`�V8n�cZ�N+uv��T
D*X�a#���0p�6�;

���J5x�I0�t��Gv�GF�H]���7�4"HA�������yW�j�<��!e���N@?qu$��l�a������P�<�����x������9��]�������Q�\���NI6���VJxJ/���2�j"�8\J�b������4��$E��L' K�@_(����Ae����9����\u 0x!+1
M*q�fA�(#�^ mzeA�����q9�
b6�g+^P2��^�QH
�����A��-��1�N�F �t:i�?U��|�:�������g����n��3�R��v]!G���RmZ%�	����s�m1��5�s��!�0�B���fGeh~~��KQ����O

y��KkkbDc[�{�aN(��'/aU������XRJN�b��w.��c)w��Y�.q�w:�@����^
G�'��
��s�<��T�)��zw������34��;i����i��b���XLP��{O���6VHIq�C( �������B��j��������v�>�-).��lqS~�;������������kx��������h��Ulq����j�TkH��W5`��=m�3���s��������6d�f���w�����s�h��E�����C
^������F����||�B�=:
��������c6a������
[7��Y�%8��@
=d��I/�2A�o1�����y8)��doA�*^02��]&"�6ko9m��m����c�1�m�sodu��g��������#f��?caF>����+-�ww!��3[���??�;�,_^�B4�4?�w���a�A7 IDAT1����I@��Z3���8�j���m����|<�F�6��a�����8�2���'P[�
Up��������y�S�jbQ����p��s���&WEH'��,
����������Sg:@!�VYJbpA/R5 �m/0E�X�p��+$��� ���b�)7d��*on�*��n���AVr*T�t�A	/C�����,�(wi�$�x�A�R]PJm!h�)7������/ Ou�������?�y"���"p�A�<����R��f
�P5�mm9��].����D�����`���,�F$�{��9�7gpp������p(6�Me+�5>�e�^�!E�	�y�$�����8t0�qo,���m��y�7�����4�^'RSx�!/h���q����v�R�a�������-�~��mT�5����Y�TRx���6��B�k�x<����BB�G��l`�������g�f�hS7;lS���N��Lm��?�F���;3�i"�U��<�0G8����~9Q�����'����a�6S��%C��7��[�0�C^����)|x�����Lu����?�A(m��s��m�����mI�����1��Y���}���j������Aa&NF#�-������$�����BCv�l�����#�xtd�l��2�`7���O��/�B�����t]�f�C������aN�rh1H�+fT0W�E}$De��&���8R-:M��|���u�nC�O�7�g
�/�82�O#�l1��/��zU������2)7h�iC����:���6���
L�4A���<��+/��x��|<��9R��^���;r��a#d��a�k2�����Y��,�D�{�:�8)?x!�����r���
{��u��?g�!���=�Hj
u5��B,�V�S�=�=�:F�0�u�Q�������7�F�O������~|�a
zp`a?)��������\���
����V��U��E����u��{��p�B��T����'����i�7�Cs,#�����,���~]1���Z����*�����[`0��5�P���~��`"����q��j�����$/05���Q��*�_�@�"rBA��Q
�T��K�r�����nxG ��;��=���V�����v��XZ����5q�n^�c���)< �a��mhJ����!4�THA��0����M��b����r6������m�!4&7�����@K^`e������x�������������x���Lk�4�����}sBA��vF������2�_��K�A<a�BlZA-q�l���C]�\��+���_ghaM���/���/�EA���U�0N/oG�A����2/�j����Yt_V�pSbP��!a����#������k�F\ �������f"��	As�h�{���,�E�.'`R�w�����e�
%�;�����h�o�j����qf���u�-���U�\��6��_�Q����2����g.^��U5\�uS�����0�h�N��6������Ax���BO'���B��d���3\Ua�Q�	���������bvv������Q����q�!���?7��4�1L7������!�Jg/�������,����C��������|�1����= ���T�PU���at�������T��_���/�������$$G��v��c�
��e{�����{z���7^�������[��vU���Am,=�������K���X����������Ot��p�_q���5���APxv��������?1���4����q=�a�Ew������`� x�?4�7��
�����?��
�tr^GC%Ox����5�!Wa`����������
�eRqRa����!������5�����<��B?����G������P�o6�\�d2��_����������}e�t�����n�%�`<n9o ��0�6H��5�����&�uM�jWx���m:��@�:�������#��[�$����2������"����.�$��`\W�)Y�
M��JC\������� W]������������ C!!���	����<dK�(/42B��`R`0�a$�t�oa�t������F@��
����5�
�t��������{��^���B�`4r�/l!E�ph7��X����0a��z�Ky��N�}\7�BGPR]`���)��}|���#��f�� ��0p���m3`4|���"�N����������.^8��6���w����[��xa��W^�%eE�����@�4��2K^�Zya"�d�<�������X~:H���y�<u�z�<�T~��t[�<&��#V^����lQ�=$��\m�~
/�#E����!�2�Ry������z�������DJBy��itJ������+%d�Rh�z8�P�6C(^}3:)�rc]���U^�0��p��R?8���{s��K�q���T>�dk5h��"I���M	"�v�`pS6��
/��wTN��+�����w;�p8wJ����y��h���>�_]x����� x�)�P{pm7:��� ���
/��7�R�Hy��� �~r�����r\�����/8�]���>�,��Q�Reh�v8.ZH!%:��'oD�!n�^�r��ob=�2�
��v���]%Yb�������]7�z�/������:�l�e���2mV;���
��
����
��<�����O��2�V �g��yB�Ve�2���y��R^H�y��H��)/0���S^Hqu���L�@��%���g�@�)<�h �N������?x�):�(/�a�=sBF�*8�p�������<t�����v5��L
u�Rx�h<d�"��E���\�vhG�2�B���r+/d��.�6��m��R�`
���p�W��D�^`j��������d	�W.9�B?��@��K�O0�6)�2�Ld!#X�Zy�A�j��0C
�]c(�����1�V+��wmH��T�>�=G�TRx��	��V��[��	|B��g��X�V^0���CI0��
�+
e�Rn����qmg8������������(pu{������)/��]R`�������;�:X�������\�a���^����?������Y��>���{����*�>H��Oy�B�M b'�i>P�+t���7�<��:��r=���lpuA��<?SD���������By���&�0U�~�y�����<t���kx���0Sv��R�������Zb����(�d�oJ�@��d+/���IY\��I��S�0��D�)��*�
P|���=���0)/��[y!�8��mIy��!��2P ������l����z�;���;a9�;�b��&��_����<%!�DJ4wC��������,{xnp����x>m7W^��}]"���`��!���X��lx�,�/T��B3��3���7vs�����z�i���n�w��P�g���N�����_Z�0��G�������!8�Aw}���M���L�+e�S�T�����Z���/��:n���Oa������%��Q��������:���x/z��V^�����`2�9��5��p��K��a�DZK2��������3�5�m
k�@���2��1T�Du���)�����U�g)DE�c���t���jT2����yX����+8?��BF������yH&[,���;Wp���W/���K�w�"��`��ueUT��B5Cc8={���h�h����D�Y�s#D��V�;�!-H5�T �w�I�%%'��n���EP<+s����>����M��WII��~M�����HoXi��	��S^�H���n�mE�����V�x�_+/�2m��wao��@A8�\+1������	� E.���������
�``^�>ySh�������=4�n�B�^���Y4��P0����������&�a?���8����R^�K����q��a�1xs�Z��@���yW��'�z�i�H�KF�<+�bN�i�_�.�H�+l���/�b��1����t*#��l%z�wm��Kx��\~
A}�^8L������|0$��6��T��������:��a��3�.R������-{�bh��$���'�_�!��g)84���N'4X�Y?j��@��#E�d�$x /�/d�*H���/2��3jxD�2�F���&��N�9���+����,��k��j���#=)���Ul��_��c~���J�?e{�	�#�����/�������#�t������}��_M^��<��9��b}� %)��
��_�t(�fV����F����Ej�$.�`j��E#�s��Go����',�VW���-)��,�����?�o`��gE/�
��<Cp���\�!,:��5@LB
^x}��g���iSd��NH����r�/��w`�m�Fu3�b��G�����|���o
?�T��B7��
t�9�~�_8�]HY!^����k��M2y\=���W���/X>� �
����z<�����ge��C�S���d����%��=����Y<v�S
#�Z�Q�������0Wg�Zy���.���CJT����N�Amk��S0^�G
It
�m`���6�D:�Y�b�>�{��'	��/����e$�v�)�3A$/��y;!^�k����LTn����c�d�.,�V7?��t�H���
-�!�Kc���SUH9O�g������Iqk="����w���o���q�
�}�S���HB'li3=�N�����HZ<�NSL��$9N����2��8�� �A5�qKa��n��P����4��G�C��A��lf
����Go�wOB�^v��)�$o��,���<�T���A�_�@a2c�L�,����d_�+4D\�E!&�R��Q�b"U��IOe�����h��0��a�6C�a7Re [~�H�|���/0�?�+�o�COH^�v
X������O�@��[�>|��6M8������U�Y�0A�X���YbSx��`�"fsxc���=���"�9�J������������;����Jt��kv���O���6������+$�A'%�E����y-e<�Dj�������Q~�������t]d��N;���;`��/�����b�?x���u0��	|P'x�9���Q�����>����q��N]��{��]G(�IGUR.x�v��m��F�G��T�>Wq9{j9:w�����X�S���B�HBi�#4��E�^PVV����S����r�;p	n^�R��~e�7>*^h�u���.�Eu:I���B%��i�C��'��I1��>y����M^`�Q-]#x��$����:�w��#)���I��>�]���:������yTn	�����?-�=:gZ�����+�/<�x�sAW�����=a�b�/��������wU�-�L�#�a���`����G|�]YV	sjN���{p�tfj��">�����W�1��`��
5��06:��S��(�L� 3��h��9�A����|��9@VL���Xb�{��>��n��X����X��5#o�y.����}YC](��C�r)�r�b�r��Q&���
Vf��,^<�dp�
��6C�gW?`����Q��t�Pqh���d
��?,��.��(��;Q�(Ty�H��M)=��H:sPQ������9�L]"��'�(��,�B)���,��H&(�D�O��B��k\!"#$��\�B�T%�^�*P���~S�f]~�B3:=����{�B<�����I����x����������:��BO���-��F�CK�8RH	;���~�<`��I��������A�FXv�0z�uM���LkQ��[K�c~�M��SI�������,m~g�����-R^`�B����nEs����}F
S��LM������<��'�#���-K��;�Q���I�#��s���L�������0�dW�
��R4`�_���aVG��_�xH��~����P
^`0A��:O,���:E��on����8��oJ�"X����.�C3��v��D}�Q���#r�����*��L-��4����m�H$�d����)�'*@�D������J�L�b�P0p@IU����-��HD���<LK����D����DvX��v��WY]�����hx=N�q��4��pekFo0��)���Lc���Bnx��-��Y���
I��T��(��B 
�{Y�;���>�� f��Z0���?�����z4������.4�{��� � ���A3UEd�����D�?��&}��b
L��.=���:�?3HA��&Gf"�+�����y��`�u��(�������M�F��Bkk����i��6eg���Oy�) �!��=���c
[�
/��5��������%[�x�d��6���`���_��E�`�y�G���C\$��\������D\�p�+��L�aJ��8�~
��wS}�Ak�����[x�u�gMo1��������1��h��5Fv��;X��@�����K$n	�'���E����Z[Z�I{Y�Mk�QMl��I��������	�BeR����#RM��RK"X��9HkX�=5!K���������	���������5i���zen���0�(��MjD�(��ra�R�U a��^0�3�FrU�G^oq���x��[�$���B��o:��u}�{�,��6����]u
���/��S���a�>�"��@J���oj9,=��HAAGMNn�m�,�g%)1�>���������������?����u N>���5�a��}<�K^PSV��o�~����s c��#ph�������^x��������8�-�x��m��/��{g����/��@	�ww���[�h[(�����"��P�-��]�	� 	D�n���gf��Hd7�w7��<O����33����{���$�����|m{����JZ���1����s��im�w/EY���o�P�e��U��d^�y���u��W7���*��BM�r��1'��XR?�pp	�5�[��(S�Y�pz����f���M�!��}x7W(��]rS^���u:��#]���,���s�`am������!}N���4�>W��+^���#���B�1Sd���;j�@��� �]'�>���}���������p��&X�:�*�?��t=�?���by*����'7N�j��B�9��
*7��C����O�+�
���A�yA���T"�?��G#X�~�����W���)c��S^�<f0O��u�ax��6�mx��o�I���0����9g1f~9��a*
��O3;x�*��!)������u�!<������������rR^�?�X�k�vUxw�j�@90[4������D�r�Q���F(��@vP^����K��/����o#6���sUz�Q�[��+��}�������^���9����]v�+/��vam��PX�����N��y�/�����r�4a[*y�R��M������}��6"?��/��VAm�v�U�����-m��^��r�Ox���Y�q��6B[D�A*�:��5H�A�%'xA��P�?u�U�*�u�����XM)-S-0%�`�/n<M��mp ?��,	�N� �'���� �V��D�I�����w&>K=#�v�d35��c��Y�J~��N���F�cW�ms�4������6B�������)������F�:���U�HU?'xA��/h�~A�!������w����)�1���"�V�������'������`mi	{������=����K���2�	<)G�6�IQ��N���;[x����N�����;���3�v��\��;)R�V54oT'+:�Ir���XP�L#���'���K�����k�R�,��k�\4E���� m��f���U������������U����G��!�u�����j>������j�����B���B�>�v
/����t26��%�J%� IDAT&�2U�g-����������"C�0!%�K;���R�P@~��.��T��I�����!\YB������,
���H����>��%�e=%M=/H�Wm[�B�<.��w�V�6������2^���Ri#��ZX(��������=1i����E|�����E|�����������]I�o�_�4�=/��E/hbU~��u�$���^�m����4���U/����W���< ���/����w���H�_)By��F�0�^(��L�\bxAZ��Ji���uu=(m{i���u}���+B��^�o/��|*��w�%�������B����4+_���U[V��-O�~��������5� �W�M/x!s���qe�21e�$M/H�WaU< �i��o�{b>��u�����Ai���H�_u�xA�A/���4�^���T���K���}�-���#+�iV�������
xA[��(�/(�+)j
xA
�.�^�B������-L��B�^Kbt:�@N���D�22�=2��(��*���hq�����������fe^���">��^�����!���o���b==|��R,�����,�a$�E�<��2;L2I@j���������	���*���VVe>&Fi�5�,�S��Re>�O$������&���c�j���mm76�����������%LMM�\ihjEy����Z����|4b�=#��	����0��Mm�G�12�+%�����0g#O��\���������\����UG���� UhT���ln���7*����2�"�VVV�j��F�I����,��sl���h|"�7(�#�g5c7����`�����$�b�dCc��>��D���(V��L��7)�%���3x{{��xV��HM+\�w2���|4�7;#K�B;�m��O})���������XzV����u���$Q����'�M����O�W�%b>*,
W���*���r�t9C}�Y������.�������G��!��K��������.k�����y�-����tYC��kkk��NX��u ���+#��E|���.k��������8�bkk[p����|Tp�������*t)�����\U���3���hy�������ru-;�����;����� m��f���U������������U����G�6�Xl�|�]��������Z�Q��������V�E|4�E�l��H�[MX�����JM��l��H�[MX������O�����MX�����!�#�o5a�0�����_}[MxM�(`���9jT,Y�F���SRR`f�y�?mO4�Ro$%%��B�&1�< �����n-�#�����o�IHH�R��R�|
v$E|D|��}Zo�{5K�/)d�|�y%������>�fmz[��RSSycc�l|a/b>;�">">���>�7}z������6����Q�g�l!��Mo���P^���E��ByA����d1i����E|�����E|������Iku=(m{i���uu=(m{}��>�LfQ��v��k]�G]J�^�GZ��c]�N&3?�����o+�#����A�G�I��0�LV�b>�xIwuD|t�{ez�Q�K����4~V��^�6�b�RZ��k]�G]J�^�GZ��k]���O�{,�b>��pi���H�_u�����A����J�|�	�">���t6D|���&,�S|�f�&V�t6D|���&,��h���������J���&,��h����������\��#�MD\��K�/��=��Ty�s62��b
���B
�2��	P��E�V���m����u�9*mz@�����T���>�����lk�r���Wyy"�y���h������^�a�(a��B
Y����d�[#��H�!��V���n0�CMa��������Z`��L����m������e�X�����
+_*\��)�(������yj9��P�5wG��2��0s�T$�(���0�&��Ji>i�H����m��,-����r�m�=�&��zsu��[X5���s����}���sss]
A���:�$�kH����4iL��h���l�6����������'��C6��������$o_<2FQ�?;���kh���K���&O2@rr��a���r9���%_+�� ����!Q��94:�2�2������_�On�4������F�
C���z�'���2��Q�K����4~V��9�vCjb���L����������V����j���m���h{�����j��vmm{\��������O�&���zY�h,�^�Z@����!�>�r;)X}��RI��$�-K��9�w�H���������j����v=�Q������a�=XQvL�^G�M�|�]_��F#)Y���@� T�|S�a�z����jB5��`���z���ML�����m'��HB������^���j[��6���+�z�|
L"��J5�K�
�=j�b�t�Sa�"��T<ue�z��p�^�(����[-5C@�M���NbB��k���t��x��>��A�����;�������@�[��@8���
��u�����
�����xA����^�6�b�RZ��k]�G]J�^�GZ��k]��#����B�W����sH�^���V����}^��O��������
w���Z���������Vm/h����G�����,
xA;�.L���x�0�'Ox����	�@�6M���L���4��&x��n�=B�n�r�����q�����.�����Uv">!��r��
n�Ep��m�<�$~R0��(����"�Dc���`��_�{��ApH���=�/�m����Y�N��������m���H�^��.����m/�#���.���^h��\Z9]���m���k�h^���l=�-FwX��>#�5&eI����=��B��9l&y*3��:�Q�H��!%Tj�[��/������1�������5W���/����jdS$l��o:!f�.�:[�:m��_���.��&����Kc���^��C��M�JcZ��
�T]AAJ���K�h_q���nBg������a=��J�������~�"� ������mO�����o?���R�_�����9I2t)����/�����)�?Ri�.�n�y�m��R���e����v����R�Z=K�7�����I
/���D*��0�2���!^���4���9$�, �g:���h$G*�b����9oTCA�,�`mW�jtGtx�,����V�\P��4<��o��� ���<\=6�����&]��}_�4��*K/���
�[�/������Ug��-aon�M����.�� �^����3��-'b����I�S�����VU�K���<��s;a�I�i��&3*���t��v����XEkWs4���M��R;U*k
^�����=	���
���c�Pi�6hRy�\�NHJ�FI�&xpg7"U��t�x
�l��������<\81	�����3NP��Ix����1��f��:��-����n(����Sq�h�q�������nVi�n�:��]f'��DRL8^�<�_���<:�)	�)`xA����ra��Wf��i>y�	�IX�n&�����������U��B���Z�l�~Q^����A!h��b���v�^|�I��m%f|1
��,\��~9��1,[�������1�������UH8|N��'�T&����^�6�b�RZ��k]�G]J�^�GZ��k]��#����Wx���������&����^�p��.^��`K��2R����,�#nQ������b��_�������=^�U�#X�n���'a7�g��L
�y�2�{>b�x!#%
��a��	����~�ix!��={����Y�!�SO���cM��{���s#$�R����~���X�e*����sxaR��X��k�J��Cjx��<�-
�M,t/XW4�me3����k�5���w&)6�B�^�\w B_�������g��pq���7i�����\+��[e{|N�����	�m=3��S�W����h�EGb0��m���L
����89�>zl�������4�NE��f�^h�a��
[|�sx�H��(J���7��i
^�����%����/�i1�O���H�|A���;�W�oq{�������TvY���~e&X���'��&��o���#q����:��t%h`=�H�:,�����H�`X���F*��o�A�	<�T^X�tz�SL8p��B+V��7�[���w-��nZ~��g/�q��/��h�c�/b`o���_~��&~�N�GOI�9�?
��>����8|��am^o�����O�������r��*u�+�c��h�B���4+�j����;}I����D���H���u�f���X�����P����^�msO��`�Hmz@�����';x�����9���]������.�p{e�9Ne���z���n�
�����0o��y�N#C�},�e]��OP�n3������p�4������M0���g��0��]�=b���L���=����B��}��K�#%�yxu����N����p:�����}W��}�U�M��KQ��*{4���!^�o�����3\y������AP�������n�U�pu�DzF�����]�^��������^<:���sS^`�c�#=>�v&��]LU!�M
�8 =))w�t=E��VF.tZ�^,2��`Z�q������r��`\�
��B��:	4aX
�@��$�$�6L8���9W^���
�� XZ
)��r#������#GS���*���``c��t���W��kH�|.O{~�,��������������B�e�7`�
�t����-07�Fu��0�5�c��{�m`na�k��`�w��"�\����<V�$Yv�l<?��	++��>k�|��;�����5X���u�*4��� ^DF�9wV!���<�x^O"��]���k� �iN�Q������Hz^���F�m,
���Gb��@� T�|3�1�w��iM�bG�������I$�S��+M����\@zH,L����M ?���>B��0�;@��*R��e�:0*I���2��Qn�z������
�N>���.�zl��9��?����B�J��S������'����Z���8Ber����c�����h��1N���`eJP�w-8���IIG��t�u\x
Yr*&5(�m<�N����`��|�������s<�NTj](��������>�D�+X�j@`�%�
}�z��~���{/�@�w�:0v�C��z��3�<�h?��B�a��&��"��/�G��}�z`3���B��[d"��I-���+/Xt�����
)� �}J��tX�h��g����5c�d����J�o���Ejp$�&*����s��8�}�|+����HK�u��|\����������G�0ok��)}|i}���Zf&Hd}�C*����#b~�O���e����"������?�����{4E����0)[F�<�|�&��rH��B	��!?s ��EZ�)t���Qf�����RH�!��eYtiC��ed$$��Z�]�����(QrS^`���g�Y9"2&�v}������cW�����������!���B"_�n�V�������w����p/���������nJ�V@Zz*l��R�*�[��`�#W�����\ya��y�{~\3�+6G3������b���\�6���X�+��F�F�P�Rs$&�M�����-=��f���f5��I�N��cCc��m��xbh������}��Y��
�`�e
�~6002���1�(n��������{��9��w��</7����%����1pia������t�O?����(��
�x�0
��4�cj���Q(3F�������)�<�����im@�$A[�����O�2&x�kRb����T�k�i��#��B�Ol���h�2E����0s5�cj�.�P���%G�!pELQ�s�Z�����r�!�T�}�����gE�c�-��!���A�(9�����7��r��lOs��
d?`q�*a��n^�BQox5�����Y[���������B�v�������sa%�w�n?����Q�r{xV��d�i�r\8�
���|LL�p��F�G�V_���)��^84�����P�jGR_���G'���7����!q��t����P�o#O�F���������s�����wd�!�M����s.��|Ge�/8Y:���_��e����`��6�_�P���B?R�p����������?��l���������D>���=��I)r|�r�-lq�����?�Z�-Zz6�����Y�b��B]�MJ����1���(n[�������s1��xX�Z��^�vg?=<��m����9��������L������'T�Kn�B7oKx�6����F�2f�B��&�J@>nh�?�����9l�Z��K��b\[7}���F�{}��<��hs�����iJ�5G���h�}%X8�">L�s?>SU�q3������j�R-]�w����2��;��5������������`J!7�Q��2p,gM��86���[����C}����G�\y����h>�2|��F�&N(���7<��#�i�r������
J��_���+����S�����,��d���������!���EP����KZ�������D��e
{#,]��nF�{P�f�(F���Gi'��z�&�~�����|M��a�J�M�wN�U����T}n����(Q������g��<�j5I����]����c�]81�[O�����l���������Z�|�Nt���#����&m������qq%����-#���o�tj!�n���}������M����}����9���Fs�&���������5��[�O� eKv�����&���~���b1������e1X|�0�-�f�������.DPl$�����/!$>������ ��/�e���v�3���e]��H:WgH�{�2%/�S�Z��,��2�J��.������=��-��j������<>������y��n*��^�R���s#�7|���Q������S�v���vEQ�<&�w��}I��E�
���(R�1��^����
c�=@��Uh8i=��O[�����[��?����&V�xqqo���aD���������:�������"��
+g�n>	S����`p�p�W�����%T��zj��is\���(�%i�(/�_��+/�����7��������q�9<��733��P��7�>���-�4o�L����T�p/��uj`���?�c>������?����V��]i>�n��H��o��"�|����~�x��I�������.�s-&�����px��9����F�Url#������e�c��]����]=�>�� ��q�����	^�����a�ad�����a�]f�**�*/(�&�W���J1�/!�:�Q�]Z��o���b	e/����{��z,�ec���<���j�6Ds������08E�p���2��������#�P������4�O�E�����l���
��U�\�"���S���Rz�"�C�������vvE�_����J_?9��6�r>�>:�J���g'1��
�ux�������
��ps,Os����������v�;�7VC]���Hl�0u�v��]���L���-��Q�e�K�D�#p�Wy��\���4����6fK�&m�#q�+����WV��XiAI��D��H ���=�0�����2H�IA��P���|9
f��H�?f�\�t4���"�h������v��=|4��
�����������`����qa��L�T�1}�L$�����������`ImFO\�����w�.��v�|��W����+���]�����(Yn�+�����?tvo����a����pNo��E�^S�f��<��Y!;x���K����+��z5z8}_w��C�n���@l7��,C��n(����7|��/;x��UE�N��F IDATM�����t�����~���C�)e�Uz^�27���0w���d�k��:��\n���O$�>�0�H��'���T����IY��]0*�c��q���K������3cis}@=��q��+X�Gk�%w���jqd$��@�7������6�![{�@�6�r�~�P�N����������NF�Nh�iZ����PJ���LnP]�0x�$��Ku�t�J� ��K�"8�8m��pG�C��{�`���K`�����ce���t2�K��7����� G����r��7�Q	{�������A�������H��D��vY�v���|CF�����tI��Sc�_}����,Zz!��mJ1�����#7a��"�q��'�k��(�c�rP ��K�U�`� ,���>h:!~�)�[!��C^H����SX������0��VA����o��;|�E�� l���e�	�j�tj�l����4�0�tF�Y}0@�fl{Rj������������#c``k���p�G���IuZ��a��m,�z���^��������L���Q	J���d]�|�!Lj�C��'|�F�]�|���A��~��t����k���1�-�M�w����0��L��u~O�b��m�jI�)^%]�����K�k�EI��:a�-�'���~2~�2m��������ov�\������I�c@��8tq#>�6��I��?��O1����N���P�xe�F���S	l=���v��C/,��_���K�F�j8���n�E���^��v��sk0��/�sf>j9;O����1�����HOW~CPx�m����?�L��`�������qp�lE`B:�O�����x�&E�X"�����r/���0H���x��zTF�%_q�Q�`��?�y[��kG+�8H� �"�,9D������7=�����8�5��@Fj�$��&���N\�!�M:���_�{��J��t��p{�B�BB��9��Gd�������L9��-Sy�XW�/m����/��N@��d�%�!x{���P���**���{S����gi���B�m���6�#h�?*�1,m������p��j���R�exJ�������?ac_����}~��l�q��A�;l����c�d@P�P�]��a��G~&��3��\�D��H����WW��!���v�����D�G6�Bq����e������z���>���&]f��~�����������q�@�F#p��bM�����6��zT���W�M���<`)�n����~��a��E@��k�����a:���W����&a�����,�L��v�p��5A�<�����N@�"eQ��4}�������4&������>��	�b8Om��oNp�iF��L��Al,�[�u�Et0������!�b�J�
^X0�?�����1"�h-3�+8[,���k��#J����5g�����k�����d/�z����6�	�7D�S
���V0�r��rp#���`fk��k`�'7���(����W��p^_�F�jc���p�d��������.\���T��\{����f�;�'��C�^���5-��U�P{T\��	"�Qgl�# ��W�ahb�K#�Y�����C��Dcg8W����-A�7V���:����@1�ov��6l�a�+�}���&�k������!�������i����tT�b�������lM<>H�I��q���`3DE��� /A�f�m�b�us3�Z���$�o��U^%'x�k��ql�W�'��AHE��`C����W�e�q���H�E�V�Q�zv1*zu#� ���px���#	�I@�ZJ1�����{�Q�rG>$���Bk��}�k6���F}�z���M<<�f�����H�~X
�sGB�v3P��-��>�),0;�v�^p0"��A-;�&�B�����f����9�m�T���w�w�1�����w�1�t�2Tpr�'	>�o��}1��>��:�<�.��S�-�?��*�����]��Xw�4�Q�eJ^�B�*��T���������FJW��E�F}�J����Q��d^���n�;���2/X8���W��(}�&��� �
}n�o���?��D��h0l�	4*V�>�`��]�WM��w�����.��W��F���py�p���`�b�x|��������l�O!�x�����`�BP�Z������O�~���F�r�1}��Dp����*^��C^�k�H��R�����Q�BY�v0�����t�_�w`�o�������By:
�)�����wsU�2��YdS�6�M4�������������A8q�2}������0��Q<�$Je�a��'��`ee�zQ����l��9�Vb�$���J2aY[P^`c)R����|=I:��������b��S5Ea���������a�QR��	xA)7i���mV��h}	�����J��ze}���K(;x���E��tB�wi8���3z@�p+��U��/8Z����=���)�����w��/00�����
��5�t�,���Q/����u�5�o�����D��?��/_��2�F������kb%f������p,���q��)��Jald��6�>�o��REjpU�������+��gm��R�_��x4����-�9V��:�����'�)��K�/���oE#�Z4L����u�Hy�)$1E��/8��Y2�)e�.J�Oq�!3mK%��3���(��:��D���I���o=�N��<V�����r�����Xz�NC��L�b��!�1$e�v�)p�/�Q.���H�r��t�0�q������f�����#�������s����7!�u�LZ�?��2mJ'Mz�������2�F��a����c^�����~v�{�]5/���M��a��\ya���x��6[���}dV�^`'[��\�wW���u�~���)�)S��X�:����_'p�<=0��/00���7����uJ2��H���}ZkQ���b��t��1�?i���������N`���.Sr0.���.�[|f
=�r�5m��6��<a�k-�|��.�7Y����r���_�8�c���V��-��
��v�0��C���`F�������
���6b����C���E�2�tR��I����3R��}������^t�������7&������i�;��J��N9��`V�6H���
���g�9��!�\�U������)��[u��M:O��o��o`��1���O��}Dq���:����bd��	�05f�.�g�|L��F���A`�y���]r6c�#v�a��dv���`7�3���i%w�bza����$�� ��W|��h���z6@zlA
waD�[���/�.����y�����x���	^H{A��r�ty���(��9L�V�l�!R'!���������5��{F^`�F�����e�6H}Bj;�^AJ&��`�h����0k^S����:���"Z����w����\y���-�
��6�\18�{=��wX�Mq�33m������o�;�
F)���$�����}&f�=)t��{7,���"�41�+4��vo���|���-��	���f��i������{�x{px���;��l0x!���������\������o9�Y�e;���
�U���Pb�-�1���6v��`L�_����`[���sP!�0X��'��,�2�z���{�\a���%WZxs���^����)Wm�,����P��^�%E�R>���)3E�*������s���`U��N\ ��b,La���h��[��+/0x��H;<��
�k����)]C���h�����4D^L�{_X����������/�=��>��T"d)�2�����N]�x�z' ���#X����`Fj5���1���g��)1���T�7�0��{��_e0��D��������BX�-.T�7�o����
��W'������kK� ��q������ju����7��q!U��h��W��3����p,Z��g������4�1����)���6��n��;Z�������p|�g*�07x�����u��*������^�aC�����+��E�!�`���Y}�*��r����^/|�t����%��M�����5
�[�"�l�%�~���S�lt���C
W_���B]����h<}��tJy��=hV�v����1����Ll����c+a��u��at��yz�+40�A����I0y����J������`N�!����/}1s���U�v���>1t���"C@X*�P���nUS4�d{KC��p����A���{�6EP�T��'�=����RH�
�����?�_����l<�N���;3mK%�q)���U�7�sk!�������1��F�MX�v5G����<�CL�a�����C�CD<��
f�&���%��#�a����%;x���K����t��`�Z�M�RA$���
�9��YI�&$<
�>�����=�))X�M�A}�bH�� �9)i�����x�gE����.%���\�j������%U���[���~7��s���z0ii��NV,p��{�����wvs�s�e\!��K�`ea���O���N����X���c
�������@t��'A�1�H���5O.@��q|�tRd�U�:�+�1h�M�y��0vt����,)/(�A����F�*��N��q��=����
��@������C�����Z��*l'�VVw����������������`��,�H�O�����<[�]�*xzb
WC����\;�;�Ed�
D�������P���{��������f��0QOo"!���?3��w�uF.��?�����v�L$�WIUa&��GOo���`n���SQ��E��� /��WB����/������"����{gP���������F0h���c����*��W���h�R]x�C7	xA��#I%��������x���^D�]F||)-��C�&��#�U������M;���J����B8gAo�*4x�����pt�#� [�rfD��9�U��������L�����x��U�d�����:S������~x@x��N3�yx�p
��� �u*��o�r�bO���UD���R������,}���)��R�G�G���������lt�N����Z�����x�g�F8u�6jy�C��1{��wB����o|��@��3r��sx!��=�YN�����TX*	)�'�ON���V^h8�+�|�����ex�T�������Rl>�5����V2������+<]k���&RQPld���0
�o�D����������6���7Wp���������J_"���Q)H��|&^��-
������wp��R^H-��A=Xc���5�y��(/�y��\��jh	��I�&�CKs&�jc��KQI�r����tZ8�d��*����~����������'I�''��#a=r"���<M�/8����������4m+V.�N�'sx!�����~�7�
�J�&)�y��F)�������T�^>.��dV�^p��C��%p�������7b\��^x�����B?R^(O�,�����/;x�(m����|P4����c7�
/8���gqS�x��i;b��h���nf�
^��J��������Ci��+�R"���J��5���'�d���/p��(/P�	�:�+0�zT����L*��TL���;�:\��L'����sZ�[U;�����J1l�{�Q��� <5��e�Lya5)/D�ST�)�}���������U1�����S]`��Ly�X@�VU���T����:%9����ze���h�G���.�8�X�������"������@2�o�	.`����``��J�`I�	��fp��`���N��e�Zt1'u�}I��`Z���&SM�
���@C�����Mg����
v;g��`c��Bl"��WE�����I������\���
�+(m��I�� )�{Ig�6a3�%�Hy���_��K�R���w	��1��U��T&���� Z�"�����0�B
;T��]=����d+��rX'���2�(�P^�����0t���Kq����/8���
%k�����i�F�]?��x`���W�I�`;�.�M�P�RI0H���_��H�������tdv�����v�^���F���B����~?\�{�+/\�;����|�w��0�TX��GC�v��_/���,�K�D��]���2�l1�(�+^p��LqaR���E���]�W�E�?����&�R^`�2��b
;R$���$�vQ(�O@���;���lx�V>P^�'C9J�pgr8��g[�������"�fndN�'R�����h(1���N�,��B��(X
�L5�Lx!���`J	�f9��C��X�w�����ci������������2��"��'����`�,*�&@bBxV_l��������O��5<�t�������d����.x�c$R�����m��/05#q'��DmD��|&�P�fo��L��{Q��`���M���)#X�@y�w+*�����TJ�P������k����?�D�<�x�j6�3{���-�~"����>KA�	"d�)$�.O��v>h�k!)9�A����K�
S^��g8��(A��5���`�$���P���'���	/�'H�?��`iZ�m�����]��^�N���(/X`�l��@�<�O��4���A0��J��MQX�Y���ehN�I]!2!
H���cJ�q2m��h9�xa���y��O��a������{���g��]~�~n�B����u=�6���Wt��u�	/|E�����
)/t�N����k��N)����~��/6��[U2��`�jW����G�U�8��]��^`A�
��0�:OaS����<=Fi�����0���|��}y�+/�Z���v���� GJ{��x8W^xv���o��K�*_�iiQ�u��1��x�F��1Vm��_KR�N�@++Hya$)/��M)m��=�q=RQ�������p�t�Q�9�C�SZ�e6|6�[Iy�
���&��o��a]��W�	^�V�c�����M$�e�3��Zu�����"B)*��RI�QwHV����z\����S����b�>%9���z�����V����	P���D\;O��1�������)��bI���z,��csP��@������P�d/�
��EJ��3?,�D����X�f0XYE*��[OW�7����'6�9�����B�vXq���i��'6q�VWS���g-u���� �%����,x�d�������k�Q��P��5��)#X�Pya3J7���QZ��`P����Hy�R^�U�RK)aF�*�]�p�+�����1�������dj��F�D	��m���%1�5�^�w��[���+����E��G�2M0s����[������rf.�xA
���T)x!�~�~�����;������(|5k!��2�<�8��R4������axW���F�
/�����D
���
���h���3���0���������EHX��o���u����?d�'�/�{��tk��+2mF��a��<����0��8�O>����Ds}��2��}��D���Y}���k}�S���	^�9����tPZC���^`V	W/pEC:q�p�
����~�������fr��K��D|D|��}[o^P������
�P������{�#a�d�/4�����>��4W�[�"�->H'���B��^��N�R����G��6�%7x���	p�BCtr���)�;db�P�c_�i��?89����3h<N/�I��SD-��7���X���.�C��M��p~�O����b�����|/|pI���`dh��
��)���������+��o�N�\�)��5�������'�v��,�#�-CXt �
-�SC�~������$z�h��~i.-)u��@��h��/aH�_q��R�(��`I� IDAT	��x~OCn|0�\�F(�@2�LQ��Z�wG�NJ�x!�
����O%Y�(9=�������G
���SZ(�n�T����a@���Y~r����f�ic���&��
h��zJ��"�6�by;SJ+aH'��IV���6��(5����[�������}x���N����oH�RJ��c1LB���0���64i��Ym������`D�Q�G��Hz���?���fg���F5������7~�v�?�������t�����:��n��o�\<{zcH�a��9������A`�/�P���Jv��	���������!O����1�G�,x�g�Z$�[�f��=�aI�{W��x�7�2��N��v!6������6� qV�]^_D���Y�B���"�R�7����R����89f�sx_y����$=i]�����SW�6�^��
����A�����&��ZY��Y��t��4O���N}����B������Aoh�:B��2�?�S�sX��I�C��^��T���R�!?���F4������t:�d�+�S���Z�$��z����T�������P��/�cRa8�J)����p���{��%	����6\���`Lo�2���Q�Cu��+73��)g;���I8>�T�t�~L���v0���B)&�(�;��H���
$����=v��`���S�~V^`J�m�>B����}�@��r� ����^�:J���.��.,���uY�! ��}H�&��������z�
t0����7��yR e���j`3J}s�]� �E��N�XZ	U�����"���!)
�����G
�������0xA~�	���{-V��M��
��k��K�'�R0�����-v�c6	��[~D1VK3$|�T!�^�y^H����'���]�*!��0�!����B��[H�q�E�R;�=���(�D��[<��i�����������;/������{p�����	�{�9��/�L�U��s�+K0����	P�D��j�����(�)3P���Kn�K�0��R_�4 $u����0���Y�B�:�P�Jk���)�n5����CsV����S2x����CH5�>�]�$zxoL�b$�C�~m����>�2���G�y�m U�OWc��_HM�*��g���pu������~T,�M������24����[���� �@*F������p/��������8}c�/F����'Wp��Od�J��:f(�]�<�)�R*�L5c�M��)dOR�B�l	t���P`��Ly�]Wr`�� E�S��W;�Q������~x�0
eF�s5���T�G��d���RI�/���I�)���`[����@��v���P�b�B���8���x4�
���Y���)o�8ta�J�O?����b�����x0%�
�)8������������Pb�-?�NJ���x*	#Jg���k���L�<�K+J�A�)�����OE!->o�+/x�x���H0�|��zXX9e��t��A�����7����N�z�m�SJ�����Z���>�p�{�R�<m�G�ifvz�,�	u[O�Nt����!JG��s<��f�,R�J\;�
:��W��8�J�}x���.�7H���"�>pr���n>���������;	n����a�Q��E�qz1�Ci|h�1<�Wp�����P�@��[���!�FJ�}wd���tz���,R�Z�ul!�k�9�����b�s;|��q�������Li3X�����d���SZhA�2��;�/���W���dd���E]fa�����d�9�5��yg�bl�!���wO���?������^�#hX�~9���}��>�� ���7.UI�aL�A�|���fSr����BEJ�@�������2��r�&���5�q�\~���/�<������T���M�V6�������%E���)uAe��NE��iZ�P?�t=�_rR^`����J1�B)�N��C���^����`��`H���������Gj�B2���Z�
����.���������}C�sk�s��MG��������~�D�����pl�]tZFp����R���Ii��9��3�����U��|��!nR:
�v���+�)/��o���L�i������T�j
������S�N���2������H�
�[�����h���G��^�D89�=�`*��B�3'�����z���R���&�]Ks��J���<�����{o������H���*�#�9�#�<je�.����`�gH�;`m[Q@�R(e0x���g�?'���6�����x���"K������F�����)��J11��F<����G��#��U�^�����X�M�~Y|(\�������^�q�2Bq2��w��W�,F9��0�*�����~�^0�k~F�^��B��R�����<UD&���|-4+I����o����������<�R����C,�v��f0�� $�wc������(�P�I24$�}��E|��
_�����R^�p*�����{�R��u4^0����3���1Az�B{5���+y?^(V�
}n�#��'1�Z�P�a/J��������u�v-x|�v��}I/�����j}�n��B

��s��A(5���9�O���SS��X���{�R�!�v�B{J��p����c���_M�y���fw�e/��w�?I�#��bA�U�[M�i#���aZ�t�}q
��H��`��:|��i�����������kJ�l(c����Y_���X6~V�1���^�"r��ZZ���C����G>�zui�S��B��H���0�7����F
��-���Z�qbb��Q}0���������������A�1�D���m b����]"I����)��(�9y@x!7��/��q/��Ai���f���4�DSVE|4�Ii��[|��X'�����������/��V��sK!U����W�M��k�����rK�si�S���Hv��&��.mDnvs�41m��	^����KxA�>
R���F�w\rJ���[Pza��2#�6s��kO��J��1h����Fh�?U�M��k;o��Pg,�"��
D�y���m$���K^����#e���:}�/�c�0��
^(H��-mDA����S�M������M�S���6���=/x���S��)m�:c������:+J��J��u#Z>xA����������E]�">�zP��">��W]�^PxP���$/�{�I�^���V����}^��O���	x!�9�;P��J�aN
��<����v�d���j^`Je���in ��&�6+���]������������Vm/h����G�����,
xA;���v��]/^���E��^�6@b�RZ��k]�G]J�^�GZ��k]��#����B�W����sH�^���V����}^��O�������QyA�"�_�47/|�E/hbei���4�SmY���<��~��y�fgQ���sv�xAw�=pxA���������E]�">�zP��">��W]�^PxP���$/�{�I�^���V����}^��O��������
w���Z���������Vm/h����G�����,
xA;���v��]/^���E��^�6@b�RZ��k]�G]J�^�GZ��k]��#����B�W����sH�^���V����}^��O��������
w���Z���������Vm/h����G�����,
xA;���v��]/^���E��9���>�,�msO�G�WF�}����#]�������[�y�H�5D|t�������G���O�������5���u�R��-��1WJbH�G�j�����\�qC���������m�����.��|�">��J5E|t�u������l�b>��]W�D|t�y���Q�OR���^6��^�6�b�RZ��k]�G]J�^�GZ��k]���O�{,�b>��pi���H�_u�����A����J�|�	�">���t6D|���&,�S|�f�&V�t6D|���&,��h���������J���&,��h����������\��c�����Dx��>G��%�_���8-���P��������#22...�i^�������3 mz@��[XX���ahh�M7J����d���a��Q2#">��Vm�QQQ���������
�1����� �#��M��z�����cJ9�P�|
vE|D|��}Zo�����1m^	��%������B�G��~�/���;����
��BJJ
�r�^������r���
�JPnxb>��IW�D|t�y���Q�O����m
t5��+��Qwj�����]�Q�">u�F���\011��]]������W�G9?������<�w��8+���G�'�������.��w�">y�HW5���;�����V�r���(�']�����/��������/&Y����o��b>yE\�������y�.����t���������]�'/��}��?���)>�$���&�������">��^�����!���O����b>�[K��,����tWG�Gw���g}z���*��W�u����n��W�">yyH��� �o��B�/H@�Y)���.����m/�#����o����=[1uW���E|�����E|���t��f�t���eMxQ:">��V��)>b�R+B:">��V�E|4�E�l�S|�f�t�D�E|4�E�l��H�[MX.L���&".l��r�R� �����jh��+m�0�\����m����q��/��[�����O^���b��_��,GBJ���,����>������I�!�����T�">J�I'���0Kadd�����)	w�����ht"�7V��cgb���t}~KA�O~��v;��S��-$E�jb�*������-��-Uj�Se'��x/������/����oI�������
R�z$������=SS���/pm�|�I1������U��Vp��O{���S|lMS�!,�������m�]I�����l���
���S�xW�����h<x����'���:��2o�H������x����+��Uj��^����$�|��T�n(��](��r���"�������0,j��-}�Y��J�����">:q�����(�*�T���x��e��\b3t��X�i�gX�����d���m�#���pN!�@+<�����a�>w!/�t6	�b8k����K4��� ������W#$���k|��oo��?��,�����A�FE������Z�u�Z�.�n�A� ���;��
*��03��{��G��y����}���L_/���m!���F8\��ze/�FT��������K�]���q������_�#��jv������kN�@�|2+��"�W������ �'��lQ�s[v�i���b�����"uC^���B��� _�������i{�#���^��|�+m������ �n�,P- ���Wx!��%����/��nB��k^��7� �
����/;��Y@�
�G2�#��������<�%m�5��9e�,�Ag*�����W�����/W������B�v�r����t��'�M��E���k�^����:�i���J��whX��\��3�g/?;��5P��z��"4�oX@���g!X)_�J���i-(����k_i{/l����;B����}xd!���{�	�����IQ�j��������n���)����(��v�>�����������2N��������h���2f&f��� �K�"Z��#����Y�Z���R�1����C;ee,0o���.��_yU�R�1I�G���G�X�&5m��;�*q{��x�'����[P63DZL�WoR����4�U�JI���*�o<�
���
����C[�����H��B~�(����Z��-�M�|��T����g��od
/���w�{��u��V�-�����8����!b��U���)�s��M^(/���Cw�xAKKWoHv�����s?{H�6Q���a�������_B�r��2W��Q#f��gW"6N�����
"����
�Z���}T��
�FV9-������NNk$j�me��P��(���b�����k�1�vC�8}��k��V}xG�������d8�y�c�C#��Q�����]�cN�N�����1�@Hl���]=�.E����.+p��r�l>kO��\�Jy�c-{����qk�u�$SV::e:/[��5�F��
���KdF��5�b������4����I^�?��/��'`��C�0���'�Z�����J��p�-�a]��8���_���wc���^X�z���4��[�ffN��7�8�����F!��Wn��@i<4�g�VF�-, ��uSa�	���~��w�?�ZP��������.�_-(Kx!��k�}���Cg�]$���jx���������;�����������������u?{���W��+x�f�
l��{��������1y��H�����Ss��������qs0{�F|$���]n��^���*eM��%"������H�	�VS���
!��xz�\��ECY����o����D�\�����6������^������j��5������9Mja���W�z���5/�(Z�T�����//K�/�~8�O8������3+��������o�t�*�.3�)���������x���Q���x]w��v��:!�Bn����m�CO���iIT�������Hl�}���
��oI�x~�G�'t���CS7���J�G�jv����}[���2%���yu<���[�������.���K��6���^�v\�*�V��/-L���e�P�dlPu'�22d.��^`}.\��&�����>���� �����vc��������@KSz�:���tEph�����q�L����w�)0$%%����PP����
K�������}�����OH�v�c��6�����o;�q���:������[���{R�����A�3�ck`�/�b����H/�T+�>�()"v�-��	�Z��A���XuY���e)+�v{�T��/f{P�?b�*_*6����m�3x!!:OO�@Zj
��aY��n

]cX7
��'��Op)�f�)P�����Q��	Z������x�vyk�m��.����.GF`7�����\S(����hn/�����~��
#�b����H'���m���8$&'a����*^������&6����g1��0���S�����7S^�\�<>����w8��T^��`���89k��?��y)L�6l����CSM�:�=S^hN��44p����|
���URR�*��o��XM����(T.Y
������6�w�e����)�x��e��HG������#��JOO�_p ��lF�����} _�)����&m���-b��`HTW^�A�17.�Tj;���<l2J�C��mG�Z
���$�J�b�����bn�v�j���Z������M����[����-u
L��/>�e��l���
���������5IIcb�^\���:��������G�1���v�������O���QL����	��k���}}h����Q��z��]GW�?-j�����'�l�b�8��S�o���K���bQ��M�nh]����t��dg�?��aEq��$���9O
��@����4�|�E����1:��bj���
"�\�>)�?�D��7PPW���2�6CJ`8���AzB��U�zKD�A�C<����)�������@��	���F��U����Ch��E���P.n���!����:���-u���N\y!��mh:V���.o�Z�R����jV��>q)A�P����������sHI��m���������M��1��R�^
4jW ��!��s�W��y�A��{�<%��M�V(���W�%m��r��N�������*�������F�;)����n�z`���>R�=��2������\y!��{�4j�����h/F���b��Z��#���������7z��:Z����� IDAT���Cs1e�QDD����h��/t�
����������47n�EX����#;x�XGK{O����<��Cw/��_����������::X��}G*���'8|�.�M�B
BXr��6lH�]L���{�SS�+��]��E���y��nw1�VU���i�w����m��e�n��C_]
��*c��'���&�H=VGM�?����p,]L�ACE��>@=�������>,�����O\��������x���%U^([�����"��?�EL,�X�<���RT���/>f@�[�����>��l�5�5��`��	1�%`��)(V�4:��uum�]��W������DmY`���)/��k�O����3W��������^�����:���M���c�����	��>�N�U��
��B'�����/Y�w�OaZ�,������'h�f"=�-���=4�������b�R���g�oh�c�vm;��PQV'�_
�{x�����x�~�N��]���=o�o����������L���j�W���������|D������{_wR0�6a��f�jjZx��_�����_T�^��e-�2��yi�	9�r�`D�)�P���������
����C��8��(Y���]�5a���`i�@�#��.�_g4n�vFrr�y���;��o����������S������}���$R��L�]N�e.����>�I?���B}��������mQj���Pq��������w���y��p��<��|Vf4s��{��6�m���[����������!���B,���|�8������!%GT15�j�.4J
��������)5�bah��t�������a����_V�Q�T�b��H�ga�zEE�5����2�#��:��[����-#��)��!`�����Ft������M��y10����lE>�g������)
����9�~��y4���*v��s#�v
�w��k��F�g��_p��%W�����T�����Y�w*�*�5�LT>��`�����]��Bm�$V��+{���=��1{�����-w��bQ3�����i��v��S��,����<����0��B�P��W�q��Q�9� ���p��
4��
]��f��-'f"�~��7����4�{���/�T��MCT���o�Q^����+U�6��c'��U������W^��mZ��������m���qmZq��=�C[Cz��t���]�����
:���'55L���BC9���������c�jl5��cOn��l��]W��'0k��m
��0x�G�����J�a��:��0�C{��A
�d�u���������0u�^��O��^=����Xx���ZaT���e'O�"�5�u+l�|�>�1��j_,���M�1�UK����;�������y��$�?�u�h�j���}��������2>��8���m������@���d�'�_��,{Y��C�����OQ�^X����;��r#�F���?�~@��E������ �'�Z��
P���P�qz���E�
6Bu�i���b��������b������;�@�.m9H0���ek�c��AX�f+_�n\���}�*���
�t���"�vZ�d���cg�-.;�7_��������+6����}���O�y�:p�~���8r�"��� sD��k����,_�F��2�� ��S�{�^�^�Hy%cm$?OnI���x���{)l�Ja={G
������������B|��R�����JVk���F��@��� �;��;M���+����.=X~|l1�������xaV�x����}Q��}$��%����y���5b��q��U��6����(Y��V����43.�a��~�4���? g�������a���Z��,����%O�`�������7�6�]w����	(��������h\��~��=���
�3���K��P0�oz���s�V}�&6!�?��}����L���=t�
{�`�M���%p#���q)�E�%3���=�����o�mQ�8V�:��sV��_����IX��,N�^�������h�`=�������}����U"fv��/2z3�`�#Y�/d]����>#0l�"���C]T�
�t�+���rf�J>wKZ���=����Iq?�~�M8�8���~��������.�`���0�^`>�����������������
$S�:�b��]hcW�C ��v�d,>�_"�1�co�sxg�{���=.�E\x��Y�_��i�t���H
�38 ��(��@����TO�}m��D��E)jqx!54����P@�*�(��h��?�1�`����}��UJ#��+(�jRP(z="�6����Q,]~�����('uB�K_��� �>��j��Sa��"��1�#r�%��H�����uAjp��<�y�D,����{o����$/�t���'>��+/$��+���B��>�RCh�CDP`^�E
(0�b�E��9������Hx�����r��~/$<{���UI�B�>b��0�������h!��T��"��K����l������_n}$R^`���HV����F��5��Q�z<yz�&��5=abl��
�`��9�e�	���������w%v�� �����X��C��Xzz'Z����G��t�^`r�����A���n��!NL�J�U�01�����P��#���b�Rg/l���\o�B__(������?��?6u����J����U��{���biF���� /\z�����s3=z	+���7����%�)���� ���F;T��{���|J��
	�c�S$�X���?��������Vc�8wq=��M��t������0�`���N�_��#CS� �����[!a�y��e��te���C�NV�_�tt�p��?����~_)8}����j��;����P��#)���MZ
��s�(�����g *:�h_n����1�(WP`{�m��4�
����e������������,G�j-9( R^(aV�����3�����?*������+������=t3V��
[�=��}X)jR
���x�������t�����,l�>��]YI7����GO.�@{4o��Z���$��Z';x�|��O>UK�����)<�1~/�83��"���L�%�
�)�Z��'�!�i����!=���v�	�9O�/
s�^�*���E�	�a� �%��A�r����2�S�
�hXo<�^�}W��3-^��^e�4"(al�v�g���|}1����V�^X����e��_���
��Y�Yp�7!���?���<R��?��FtM\�����5�3���%����b��s<��M�,������Ds�`:��y<���n�������rM��������`����j�(cRM�Yc����Q��ZXx��X:�~:�:�RL����0����-�93x�#��n�����\�������G�u�u`id��t
�o���J�K����A��4�bt�#R^` �@�o�vh�����������o��*C}���aH�F�����[T�]���~3�<�R��d7Wc�Cp6>������l,R^`@C~���7BEK{r[���q���v��AC4��;N��z6�1��`D���pt
���c`�?��e8_ME�f�����'M��-�H��(��aS����_p�����~�Y�}|�6Xz�$��q U�0�~�����=�Co�:��.G���p��=���0� ���_=���[o��~��c,���/��q��Y.��O�^P�K��)�
��b�~���}�(#\x���cA����3Fm��.��AV(Np��={����hIp�;�o>�{}}<�y���<�q����1�p��c^�������re:�P�i�Y�cD~*E����1nxxp0���e�.d��}�0����nW�6 @��Nv�B��x<�	�-���*��0���VoT_d�7��HID����f����^���L>���C���Otx�WE��2s���;�b�����i�K��`��^`���������
���
���P7x�����AD�����2��(����.����Ha����ga������w�{/(8��nr5���O�^5�;���b����t���ZQ,����B�����I/(�k@kP��-v�-����6^��6J>T���`t	��#����ja��/|�D?�����[��e�v�QIk\�2
�:#����x����gvL�CT�{���A��_���k��a	��i��0r��:Kq��
���X0_�N��p;M��^������[��JP�SC�n]�-�HZI���,�7
M��Sr��"�{��0��:(�������X=������5J�������I� nt���>�9���(�.j�����o^�@�0z`���,H~��s��(m��!A�X�[��0�y!�w#��,��b����}|fdqp�?��0��V�:v&�:�K	���tDi#.<��9=���#W{��v�tj�W�B�5=�SjY����@��A���I)�VT����$�>��9DE�7SX�6vz4�L���-�2N��C���kh]]*x�)f|��LY��;��E�e�3���Y��t!���@	S��C���P�������o�?c�zz8'���}y������O��)h�@��u�6��D4���3�ZE�����4SSP17��BZLW!�>u�V�9�s�	(Z����+"�]t�}�!f������`���9h�����R	������T	T/��it[�|	0��������R�D�
C(�U��Ait����jZ����E�� $�|u�����$�A��!�:��]������J�Ei�Dk]}J��@_�HKL���6�'h!��'�j��`En�����TR�f�����G��D�aH����G�%M�Lv��~�U-E�h��G"x��\d����6��6�P���O�]�=
O�x�WvA���P�t
�;��[��U;��	x�� I�^`�k#�uC��e������������X_��7CUl�t	O��� ��X5K����_����{v�B9c��Q#cH�%����
���&��N�_!�yMk����IY(��L��mH������Mq4'pA�@��`��w�� *��� �UL���b�.�v��L5���x�������(GJZZ��
�V����o��d���_���a/���k5��!4�Z4�O+���
�(���_�S���d|#�%%�[����1X���
�zE�e�8�����TjD��+A����}�����	z(bb3��Ly���TF^O�����euZX����{��"�*���d:����3��U��oU�&���q "I����5�����#�Ir6�
�FRp�����	}��ZE����zWp(_�������������:�@��
��.]��]�q(#��0�C����V��C��0�m�NJ<9+��^yK�%���)j��C@�-�M����q��T�n�7]�f.���%�L�
B�T�A"VTwWH|��>W���e�Z��RZf�������c#��r,���ljA~�N���("%9uF���-���p;������1}��ph�����=*��/��Sp�L����o]"���0'�y���XN
]��@���7\1��gVD���v���X�������gx�u�4
�_��@U!j�J�����H]��M0��t�59t��jhU13P�@�U�b���XJ�}~E��}x�
�`eR�����6����n��8e��{�0�7�~wh�H���z`�+"xa��=|N��!+���������wj
�0���.�?���t�^��<!*�����B��L1�A	���\���;�;^P�E%��?������mx��)�
=��[z��L����u��,oa���Hya�z6����'�ri����cW�*���=�x�2�G�hN0}0WhY����&���������~�k����c��=�_^8@�B�;n,WH�#eQp�)5���{~v�R6��}{�����c��SQ'�����N��6:������`����84����+��b��^�i@J�,-�J����&��O��&�kK��
V�:M�����x����^`k�"����yx����ez~�	\/�p#��:��O��4���������3���#��$�vt?����6iKv��n]X
�B��X��������*|������x0���H�g�*-A�US|��	W$�g�WE���t��/t�����9��!}:���=������
Z5��=���-]D�E�����#g���@�n�H2�����,+h�^;v�
��?pUO�G	�b��\�����MY�F����<r��ul��Y�F����w]xA�E%$�}�*fP�n�����Z�/��X%*�����|�D)�Gc�CU^�j���FP�����Eq�e
[�	/D�����0��oA��$|��U��<��$��/05����Pu����'2�����p�#t
gd����8��w�2����,?���'PP��Xw�6m��;��UM�L0���2`*��I��[��A;B���G	$�5h�F,�bK������$2���}x��'k����l�C)
X�����#)/0P����1nW���}��CA� >���.jP�������E�v����E��^`)-�S���$c��\���g�8�G0��=t ���:D'��-������^����b���B�5]�SkY����=��lZ�SR�`�D�)7��{2��t.J����{�4I��m�
�	���;�OJ��Jo���j?�.��1�9�6"��,�7�@��O���^q����^����N4�
%,x:	�����R~��0mL�\��S8`��������'3�[C�@��_P^WCP#���<?�T��x���P�{x
�
�q%�"�����`���FU{�9O��H�%b�>�V���#5��"����g�V�+K)��4,]�"=Te��Q��6(�?����
E�RB��3�������K�
?�O��_"���#��ZB��d��"<�K3��4�gt�Ny��5���^���J�Gm(���y�Sj�dR(P�)�����O�����$?!�u/$Rj�o�l0��L}��)B�����H��j�/�$��Gq7Iy�w#�_�����9�E�An}����y���>��`�_�J���g1~��l��C7rx�A
�
�a����6G I����n\��OX�����2�����Oa_�}����\<5���;++���R�n5��J�~d��6b���$A]��H|$����zV+���<1�T^��f���@��f����s���JB�����R=������.�1��%�._��.��O)\�{��7�:��X�������:6<��������SCxN0�U��\������`�c=��G���h�x(O�0��X�V�*/0��ICRR������t�6��?�=8�i?��~bu��AJ�������@bR�8�HNN�
D�S#�����F�D���9
�E�/I���V�du7���u�Q\=�
S^�3�C����>��4�	���3���2�L+�q�� �VyA/���R�DH�G>Om-�#l���EL��M;��D�STP�Wo���I�����U/t�<��D}��<���F�M��=C<�Z���`��6��������QZ%��A����/���J�%X��$��%g���.B-R^��0�k��(S���F��#�Z�S^8zr,��X	/o7�+��7W&5��0�RJt�o�+���Q�I4�f��_�������CW�8�C	�Q?�aa���^����2�<4�36���CO����x���'`)�P���1GHy��
�X�w,%�#������K�F��6�s�0��n6�����iR���6 @��P`�N��h�Em�s����� IDATA��T��w�T"A/0E��`B@6S@XOjs��l.#e�n,��z������Lea]��$����O���P0U�n4���~�'][�EJtI����!���^`c0%�)��,�-���@�b��n��T�.S�P���w?����u��_?��2&U4����,h�k�����q���#e	{�J"?���D{8$��zo��[�g�RhV������M�9��jv��;;���u��� n�
�0����(e��N�J����
������AORT`*	:��H����SP��|:�j�_{��������@P:���;a��
\=a%�)M����"+�P��"��3Si�<b8Wf��	��]��#�0�[W���G��t����3g��[<u��I��)��{����k�Vy!>)�;u�����'���U���Fv�ji��u��WL�����M`��iS�~q�3V�PDO�.�4�.^���B����n�{T�P/�����	/T_\��o�@�],��%#5NN%+����� �k�����������a������,\��/t�B
��=�o�~P���C�1m�J��2���^`)T������Q�"O�����W^h���n��9�F`�"g��<��a*
��������E�%L���U[0c������5aX��BP^(���<;I��Z�+�3���������	zK:"f�M�7��t�]��*�O?~�d^�������3��#�'/- �_��3x!6,���
0��F�]3������H��l�$K[��x<;���3Nv1���<X7������C:�V�t���_�U�����T��c�__zX&R^������y����;\xr��A���q[1x�)��C�X��8a�j:��HA��xK
�K!��L(�,;M4i�	�� 6S}`��)X���L� �N��TY��k��KM��,�St`*s]6q�JV���B#���$�D���<����|��e+���?��S�����o�B���������M���)=��v�Y���>�NAQ ���\�(�EMz(�R�1���������`�+�����%3�����1��c�)�!�.;x��!�=�S>�e����Sw:�u�� #0����)6^}xG*������O�y��YI��R�R.aj����Y���������^`�J���G���;�#;x�A-���
=�������di0�=���/���I���'�S�`�-�?wS`�vC�^���?�?/���z,q������D`�D��G�\�/E@����K#��/O��
�SnVz������!��'�_A��W,`����)�DO���=D��SD�S�L
A�[}D��q�����WU`��o�4X#��(R:@�����5��q0ATB�J��H	�).��S�H	��Q��#���;��
���Jh7�W��m�yjV'->l�o��|I��T"�T8K��I����>�0(��@�SD���-m��7����^����R�#��3���GbI��L����)OH�#�6v<}(�{��� %�$�����)���G�����-�q��KO�l�*h�S
/05	���M��y�����(��@�^��T�&c��eO��V�v�K'�M�>�z�XH)#2�)E�n9|+N��@�]:�����R~�{?���`nT�����o��>��+����x��xu�
��	�JX�z������I�z^�n���������(���� �1)�&�o�t��,5�k�I9�����L:k�^�W���� ��k��f�Lx���!�U����_zS@N��#yJ	V��L�E�u��p��[L�W�N`k#��S������1���`�3���x������Q*
kJU�sdG�����)?�� ���I�,�-�����=��q����&�����>�2��8J������P�J����6-)��F�(;�M��5��A��r���������~��:�L���w@�TjQ�C'���`����(�JB����<��B�G�:�-�mF��r0ATfN>_�g(^�
'(�SUhO�E������}����6=��<�g������m`J,�R�`�!44u)���q�w��U�&��#)����?�~=Q0<�s��>G}����a�{w[�/�z���X��/b�z�",����/�Oi:XZ��GX���;�Z����������s�����g6��l�4�����wo�G�BfP�|�A�@�a9���U�
��pxL:�]�������T�����3��/���R����r���|`�S>���(����%�T}%'��!2��j:�����.��:����Z�
���SgIF�i
-���]���x�t/}�i��+���*/���o���gL{�Z7[@��G�
z��������-����{A/vI������^�}�v�D��\��(�~�@v}4��c

c(5K�
,
��G��,uS@�K��4(���05��a���t�+�b\�A��w
E�����4	�tM�R:��i�/��L��Eq�>g���F�q��}l���0x�"����}S��N�M~t��T�i/�/]�F�������K.���*�%L"�6W]u
l�9���z�����rw��A��Yj8�:S��!u��t� �q� �������` :�]>��v�����\���=f5�
10#��_�s1��khq�Z��9R��^p �����G
W�<0�|�����?�
������A	�k=�f^�>��;;3�V�o�Y��=�~��������S������0��2>�P������[�	A��������������
�0�e�P^��?�ej�-�	/T�(�?Z3%E������<���Xa�8p������<X1����}��������<KU���k��������{\~��x����wO�G���������c��]|.l[F���x:�	�z��������@���+a@#G����T��zz�u���{)�)"h?��4�H�[x�L��l�l.Y�c���I�BG]Q�
�<Q��}�8�q�{�N��X�FLEe���<��8�8����)/X
���"����0�i�	/�U�C���J��O|�!�v0������G��1CrT2���#���i ��CHE�R���,��$��2�)=M�����F�mA�0;2�.����)8m
��L;j�_X62]�f� ;����h������#g���Ic:���=�t�^�����z@y�(ciN��BQ��{���D��;��/����4�LA�u�B��`�n3�^���xA�r�w��N������/�G:���ua��/|�1?����D�������0N����(x3f����r��wz_�� ����HpB���)3(ME^�_�y1~^�Q|�3x!�l�������r�WN���rjSP��^((���<D��4}��Z��*�[J�����4�e����?�\k�����F�fa?�r����������������T�]S<�>��OA���2����G��\�1/Q�?��9fN}�^������o�FH3g���.��a�B0PA������;;xA�����
/H:�/Hj��U�P����l��� _������i{�#���^��|�+m������ �n���x�����;�E�A��\�^��I-"/�/�oei}$��������;��w+Y��w�C��
y���.S�d���n�f�����^���,����`i4^�P���KX������\&��NxA����oY����>�{wXS"��X�U����B�l0�e��Z�w
���n��J���@9^�I�&���^`��|�#+�k_i{�#���^��|�+m���?��uG������`����Ex�w��^(>���yA�rg7�U����� �oxAz
=|o^vDA����P�<�1^�?��B��^��[@�������#��"m�����|����}��]��ZP���MB{��
�x����/���x!w�����MhUp- ���F��������aG4�BA�H�|x!��"��g{a�n���I|���Lf��g[(j��Wa����b�=_*
����=���M�/�x��6:�4�	i��������8{w�w�'''CEE%��$���������O��l�)��RRR�������R�F5$�2������.���������?!J�e��H�9������|'�)J���?*�F��-Q��U.e\	�A2�+�N���AR�����i�i)������.��'����7ibr��������T*�����U�E-��N�I�&��h&�b�K��#�.�_��~sM}� �l
����������M��k
����$�D�k=���Wm�z&F4�B���%e���V�x���k��)UC���}a�_�E
���V���/HmB���j��������eY��{�z�������r�Q~������yl^��F�YC�O~Z?����l���Q��mmm�����Ie6����R.	���Ye�����R�EEe�C���2�;?:��VL�?��*?j
����7faz��V,�G<��W-�?�ey���#���QK��aU��Ba^���`�|�+m�����|����}������0��o��H����^��|�+m��������J��V=���������V=&��JY���!�G~��E��daE��Q��#+��Od���YXQ~}���me����//�tY,Z�C�@a���?�T�(P�JHH�����leY�c�L�)44&&&�1����#s���C�?25��;�#s����/_����8_��e���w&�GV�]��dgKy�$�GV�M�����������l:��^����r^������@a�o111�tL)�0a=������
�~+L����������#�����������c	��g{a�nAyA�*l'����w�H���i-(����k_i{NZKkA���#_�J���i-(����?��d2�����}i{�#���^��|�+M���d2���iv���
�����A��4��o���d�8��#����������8#��J��#�����k!��/���B�R����w�?�ZP��������^��S��{���z����m/�G����w�?�ZP~��`��l+��������C���l+����`�,v����#?���g�?�����(L�����'��Y��,�(�>�������w��/���B��� _�������i{�#���^��|�+m�B�RZ������W���HkA��/L�)L�=�ua=�����.�GZ������W��Sp��AX�4�A�m������ �G��������z��R�����gd�?�XI>uxA>vz-��������R�P��>�������e)+%r}�W���&�h@�?�+�+6������������
���RPP��V�\�����\����v�>���?I;�c�e�%mV`�g���`]��J+���ib��7�($�������������<r����HKU�v���(**���]������"��W�Q�",.���ZX�y��/���b=���x�~ ����qd���RS��_��TM��Zi�~��<�>�z�9t`������f=�>�%%%y�.O��d=���"9&<O���A$Y�8cwhS�H���{^Y�'���u<Y�'U!	����uI�\��	r�����2y�'�������N����1���LKK�_������(��Q�e�I�eu�
,Tm���~Y��gHd:��d�\G��Eg�
0r���Fa�_��	������8���F.������������4�������eY��{�z$��y^Y�O��\��Hd�<�,M�?�'+�����ewDGK0f�f:��t��1{�W1S��O>��'#�=�q:�6��v
2��'�������,�I^�P.%c��1D��r���s����{�;N��)K�����4�P��?�� ���x�F���m���k�>	7��}�I��q�\�����*�����y5�0�-��Rg$F��o���C������'�c��w^.�7+E!n��
f*��L����
-2-��Kc���> +�'�o�",��?k�����a���??�����!u�&�5Pl��w=��[��n	��	
&T��X@���k!X)_�J���i-(����k_i{/l��&�/�-��^����<<�}�� ��� ��xA:�e�Z��`T1��1
%Y5^��^B����/�����r��/�l��r
^���xA������}S�N0F����g��6�pO���k����
<�I���'��o�K/�}�������]�\{3==�&��ySF��iQ�������PPP��^��74,�f.�������wF|B"�cb1r@w��z>B��o^���[pOX�|���������m/�G����wi����-�����w�����
�� 216W������Qq���KOo{.��.z��������NU��=Vq���hS����.�G��d��`XT��� �C24uq�l�Dk�<��.F���$���*7h��������^03VCGJ���=-e���u��HV�Z�lw�9t�4D��K��]Y�&M5���Z�<�X��@d��`�g�:�����Atp����Hd�J�����O�I��W�#�Pv<p�A�u68����s���.W�D}�^�L�������S���2�8t�g=a�Y�)�n����W�|������Dm$��;+/D?�������J�l��G ��E���&Q;Q��P^���k/��q�v8ps���+�\������(4������:�����Q��#����jt�3���d������������h�
�~^P�����{$2A�Q��w� "�yH�N���T^����s���]�&�to?�6+�����6����������#���H���j�*�o�� �.�������^h��Y	�.����l_u�s���"��Cy!-<IO<�j[	�B�K#��������$B���D�D������&T*��/����F5������rj$x���:c�af��;q�,�"K��F��:��J�����(��=+u����n����^8qN�������sr�w����-\?�;%��V�P��+o?��������+����uga��?������xA�-[ **x!.>�v�����>a���6U*px���9�+Z������_���wc���^`c��T���0qd�l���� /�O
�o�9��0��q��5���@la�� _��J��W���HkA���#_�J�{a��4�~im)�����������Yo ��!>,������6�����x��SlW�^Xty&;��u���^pl��W	01U�O�}��c�hXU�=�eEh��G��{���,_���S��*�G�x��]x|����B/(�*���
�2���r�N���m�j�K��Q�_I9���.��Ieqi����s�(cxa��U��k*��S�d�6"=9��OC�[G���R(��s���Y5�j��;������WaX�i9~�~V���U���H�\�!�����:F���6��O����E��a@�K~�I)�Xyc�7������6����e�����,�%eU4�7.n�
1Fx!��K(�,
m�|��SR�p�64:d��G����[�D�f'�|��,T`lI���Il>Y���j�Ty[��=+�2L��oB<�T��/H��l�;��Y����������Y����������� �����vc�����������������C']���t�h\7Sya��]�D
II�\'���xQ����y;o_����j�ik�������
���^`���v��l�O����OL7����}��)/��2C(�~fI���.�Zm� IDATq�k�������s^,5;#h�)!�~�/��V��{�zr�x��/�'�����r�P��/M�?g�����'{xAM�����bb�����h�d:tu�����������pH����Wj�*��9�7b�mW�6�I���	�������7�p��;��Mu\���
F�?���D����c:����4( q���z�;G.��������>�w���5�w���8cv�g��:����{���9���bp�N��'^^�]Ikt�n�UX�04E�v������g0�~/�y��E���"��*�`F����-��!�r�v���-����~D$DC����x ��>��.Q[+cs�+U+��AJZ
=\�@���%Z����TVG�.�PTT��=a��H��9��������u�1'�c.���;��,��
�a�H	qiHIJ��5�(b��6}
����k'#��q�S�����C��^�+/�t��?�/<��n�L��|�I�����A�`j����4~2z�5����rQ�]�(�(/�,��A�M�D�w>��Q�p[~A	X��f�.�����g>��/j��[����m���k*���0g�;XR�ulGsh�+a�[ n���u�p�8��O��b�����i�������8��{���h���[>PPW��
]��X��� -8*U��ue$=�����H��R1]��z��`������nU���%�m����2�9i#�q��%�d������cN�V�SD�>:x�.e��C���*k+"�QN����+�M#�n�������/���]���Aa~�vb:7�MC��{��Ajj2:-�j��0����������A�
zh�p4T�q��n���{k'T-�����cW����
W^��D�����U��1���2�y]#nK��/Qk�tL����g����ec��n/�B��xX:C�^{6����A���C����.
���HOM���/�%4�S����G�s����Gh����z�����)F�a�������l�b��K��x�^��b6z�[�~q0����=3�-�&��%��.��E�j������=�����A|��m�QcH)(������;����wh�q��Cc��B����X���C�_�����Z������q�n�-����x��
]�M�*�La��[G��^����bH����������q�����

I�A]M��tJ~X�x�������`���u�������_��^��_�p��:���#6"8�#o��$'��=������*-�Eex_���ah����k�<~���Wi#���s�4R�����.t:�E��f�w�V�����������n���FH��DzB�kTC��&(�0C*=dJ*�,�z)�A�/���R�v���Q�&������������
j��,���Ty!"6�.-G*�N��s�u��Xqb&����vb��������gX��PVR��sat�9�
���saF�PQq���Tg�������I�B�b��v?�|���>�����^
F�����`�m�g~0��$��!��|�0a�Ug$$��1Wm������2$�k�o�������A|R�Vl�����x%���g{�>(gf����! �#�^*a@��������W�|#������4���9W�p}z�}@�N���j��.��@UK;�����)�=lY���{��/�q�o9�~Ge���+x�������}��]+���nE���p�w��^���������m������Q�a;�7�����&%���)�.Q��O���6|NlG��k�2l6T��{������`M�f�%�G�����s6c����
"|^������� S�Tj3���V���*���F�[vm��T8����%�1��2������|k7"h��};��p����_��1����C0�u,JP�H�h<jL_sk'WV�P�]w���
�z���m:F:���`����!||�I
��u�F�};��a���� z�]�&hbUK�m���������+/��}���4+W�+0��F��*���c���v�>F��U����z\+v`kb�7�r���v���)W�8����934UI9��]�_��yUt���@���o�Z���k���'�����5��*�yU��Q��d�����C���Z��w����w�����@E]�wOqxA�~���t���&�]�+��X�#���m������L��?���pdQO8�������v�D�w�p��^�{�9)/���!��m�~H�J��P.c��}�h��nM����}��S}�^PB������i�1�?x
&�H��'��!T��p�.�I���1�VG��[�x���U:���#�?�+/(�zB��gh������I���~�w�O}���I���
���i��2^c�
5�s���HKL�jU+�l;�&H��j�jP&�"��c������Z�:P�P�v��9�E���r���*�31�1QB�z�x����Wi���'��������@��p����PQS�*����I���8�WUC);
(�)r�!6,5;�@�������}�h:�n��h8�OND��VkC��:=��"�K
��g�VM���6���S�&c�`@��W7�q��v:�����I������k�
h�"",7M��%������
[������8�G*AO������;�k��g�@z��3��5c�����qe��Oq��J������'�����/���]�����T�1�o��>3aT����a������P����I	�r��G7�����fS$���}w�����*�m5�EBY�E�������t]�V�.[7G��	������*D&D���	F���)��H��l�pH����k�A�G���v�oA��N(�U�]G���<>E��W���db�}�w�/�=��9��:3��_�z��Y�6�/���|E��MU`*�N�E���ekwp���N�w��$M�����1e� ,�{gVU���?
�F@@��10���;V�v�Z]����P���@1	�����U�{��*���g���wf��9w�7�w�~]���8;���j�����P����������2�MakU��;�����������Vn���4�Y�M��O���-���/6��b�L&E���wsx��t��
T*oK��Ef�
)z�^���sj�D`r���a&2.�C�����p������!���Z�GIa|����|�f��{�]�������5Z���u��*m���*�ZL����D�f�/��H2�7���)B��0�f\~�OB�`��l��Q��9�^wlp?����G�H����]�1���j���r],=�
�����s��wo��&]�DaN�]�o]�`9��074�C��X}~�8���)^�z�-^V@y�R��8D$��k$�w����PQ��E#�|�:�"�}��.���^K����
�������0��,������q��+�4�K^�P�Di�{}"]��"#� .���};Z6����aY���7�/td��T��C��2��2	$0�����m�C���x|�����h�(����K�c�O}#e�2�)|����i�������� ��Y�(UA�eTQ�B�1��@�������6-V�����_d��B���f�8;���o���)h�^�"��`�����������Dx&���*���0��<&�{�^v�HJ����Q���N������	�?MK�a��`�X�����l��Yr��v���-v����e��Z�6o�D8� R�a�����H���!~�5Z\-�t����Sin��������_vJ��P.E���9�
�'���ktg�#n�U(�� �Z�^������e�� �J��f@�P	j�eJ@�Y���tZ�,3H;�Q���aY��H��B�+�Ty��Zk��|�xEA�B��v�\�!��\�:tO�|��m�c���03���u�����@�&�$
,;���M^�c?[�����hs#26QqA|���p�`���X�4�KV��a%���Bi�j05��'EF������p����>�^9M$���������R3���Nt���A%-x�	���W�"=1��+����j,�>���(�W��h��Ov�`���L��
���J<��3�=�o�{!�(��2MaXU�:�x���;Y��7����a���T^�D7��q��}�[/�
�����9m�?�@�B9x�
����>�VwXO����q��N�fI5$��)/0��:?���:����g*^X8�8Vm3����	F��uaL���0q�::�����2N'��e��tx&/����;�\����s�������#n�=Z�%%�kRh�����p��;��p�1xz?�p���vc/��K[�I#7`��Y=h)�����p��|�y�����e�9���Bc�<�����87�)��)���`�Ka� x!�#��=�������kUG����=������z��#38Y�\�^�v``���:���7f(���D��No��y@�������y$_�	Q�VP��F����k�g.�V4;�C����.��������
|�^�����-X�6��w[��o�����S8�`nT�6y�q��5�h4��L�`Z����4���^���BP�|C�?8�o�P��>����(���K����N &1�9qh���6���
�)�*(Cu�EW����F����N0�+���]WW�o�Q�i�����@����}�Lp�;��l�����f�)��ef�\��on��nl�S^��l�����^��%bn��@��<��#�1��R,9>�C�Hh�3�L��*(sA�����y���^P/a�d�cHp�p����)ItuA��3��o4M�9��up��a\��u~Y��g�A���l�
�*���������g�q�!���m����P�+�[�L��|5��4Y��{s������3�����Cdd��;%�������#�����HQ��o�/�8o�����)v�9�P�D��p���Z����j������)�/]�t��.Sc����b��?��a>|"��H�V��xG�/���H<q��	�(EC�����v���5����@����0��Hx|
�tM8����N���-5��U���Qy�;1�������q��X��s.��������!�����<�����ac�?����00x�A��p��&���X�~u��:���]<w�z�v��
�oZ��)Z��x?8��7��n�j�=����>	w�,G�!�p�y)��������>���ya�l�����j���D�Me�3�������{GW����d�!"^���Y����oCr\$��]�����{�������
����eMH��D���t������J%
�2^�A�y�x�B6h������J��8��R�4w����.*����Q�0F�e��M���j��	�H����'�^u�r���x��`�rP4�C���F�p��F�&H��J��O�B
�.���"(X���9��?�����F����9���r�B�6�0�$�0x�m�G�#68"�.��G
k�����$����s���,�j���gP�F�	���^���zw��L� VG����>JA������T�#�j�%����.�	0�	�@�G*�����5�'!�B@����8X�����Rw��:RaH
������}�P�o���{�%���� ������b��������=�������`dR�����u������_a���g�x��Y
}�,��E���*�K�<���e����!��3;`���8}�o����z���Ni��T�����{����D��$t8�O�S[�����������d(f,���3��b5k��0�������!.�a�c)�oB��7����k�5�������<,l�w��D�2v����X�j%��ue�n�oc|�>�ve[a���%���e����+���/�`��t\}{����X�`�[����N@`�������q�/��������'�]���J�r�&���ahl�w	6X�n'fN�^xz���$:�Ca*�-���]N'��B.H0z��<x *:���q���AXD�_���=#�p��C��ED��$��d�>�"�bp��9L�Xtf���"�I���8\���1+t��b���� �Er�������*��(�6��K�~P�GH�����/i��_��J�[��z'��\���3\y������/\B~��E��R�>�b��S�b3�T\�&�=6���I�V"�N���������;9���_w,���I��m�Vl�z!�`0�a,���������������x{G\u��$��^�K���B�f���!>y� ������b��qT_�A�C�T�2���X\�Vd�5M+�D���\ �,�[[�
���.y�bj^``�NX��v/C}�K�|82��(7�����t���TTp�)����2��HY�]?}��yJ^5�tO���Dt*�Am����k:q����H��N�*���"0|�	�����c�!,	J����W`�[H"1.��L�a�o%�n&��E�0��~i([E�C�:�">:S&����2�v)
uEl8����=�`&)+��{�����r�����6�)0����t���k�t.��0�����NT��}��vB�Y�%�P�'��tU��9�����tR��;���z��f	a`��OTWT�n����������_�	v�_]�B+�5xA�))���GR^�]RbP���Tj,3���t�-���T���1t�^=��$�T_j���7�p/(�	�66�P���>����O��
U�5B�Rup����J�mF���MExsx!7�EYT,]n���o=�o6+�����1��lp�g��et���t���
%1��Pwx9��O�cRE��Q��!�]WF83�_XM�N�5���N��(���o`�$:���3#��)9Zhq����ho��:=��k~�c�t�N�od�z���%��8(���H��������?p��e�ct�YgGy�����z��,����D`�BnR�������s��]]�yq5�����O�Z�'���`u�6}Z�D>��\�P�u��Ch�?WE`�	ZZ��x}�O=������'���k�q�T~���L����+��r�+$T��Mj��)����AO��}�p7����]��N���n0���`���H�yv�MUU�����=gc�����}&Wu`����k�;-YwXY�����$������s|>'��� x��O}�iO�A��%����������8����i������3�dsn�������QC�|�!��x`�%N_��0G~����X���%Rq�%���$I
/���g��44mzv���6���BA��w�O�+to�o8P��5�W�����[��=Sx������{�J�k�"�����	��"��������f^�	Xx��	�cJ�Bmh�����t� cR7���u��/�5�&.>9}MC��`��76p����'px�)1�;3��z�7������}����xF�}}
*5E���8���bj�\f���+���q��e/0����8����pH����u�C?#q��A����
m��*/�����_�������Y}�,�/���&!��"���U�=�n�!xqxAEG���G�������{��������k�aP���Qm`���0�j��.�E_:�Z��>D@aLu�
�9�qkZ//�V����&��!.������g�&����#RZ�
�F
���s�U|�l��%U��^��������W�3��C�'�{bK�E���������s;:���%��";I��	iI��l���(0%�e!)=t���	�a������>��������\����&�/��������B�����}���
�����od���X��wx���y���X�{�I���KyTR��O�wq=���e.^0*��1� IDAT[V�� ��AL���9y� ��<�A���A��|h>p>WT`����g����(U�
��@D'��>u�&=�����9=���t_�l'5_t���Iq�<������b��0x��L��Y��������y� 2���!j���������P6)����+n�l�L� d~�Z�ZHs}B���E�B4�3Wg��.�F�?���T�"2�#��EC]d���ZCKdx��k(�k#��+T�-�����/I�L�*e�BXJ�I���������#���2�Q�L*���hg#��r3/��jY��ZPRQ P!��T�FJ
����j�\�F�����$���zq7^������L�g���C��P'�L�!!2F�U��bb^��O/U
E��x�[��Gz2i��;k������Ew���v'-�aj��0�tM4����H%B�T>w$�SP�0����xp�S����Y�P��*Tm���+��S��fe�����^�6dv�
���*h��'7�c��d�\��&6������O�2r�4��!�7/���9T�����GX�Lq��.��j�U"�0|�V�X>�f�����P�RmX7�%5����@�X������:�����n��P��qR~�+����W`S�)ZUh�
"-3���6������>�:T�yw�ye"��YG��4� �`a��8�}
�b�8�0�fv<���vA���$M� ��~|�b/x���PB\B"F8��/�H7��T��U�����<�/.	t�Sx�"
+1�wg
a�T���s��}v��U��{�U�P;J��p�}=�|�F��,?K�O_���ow=��h1q�#q!$�y@x�X�e�,k�m>D���G���u�/���N��A�L����ja|�p��R��G���8�V-M�/hi�$��.��G��8f���	�0�F;8���IV}���]�U��5����I+���@��b'����H�~����b
G~�B����DlPtv�Y��;����:��B
N<�����b���<W�����L
��lMZ���G�����N�t��Ly��=.���������9a�>W^p��'^\�I���k����Bo;:�����I����5�<��VC�"8b��h��N����z�?��NIR~���`����Q����/0����~#-���&]0%'dK�+/�9���tq�|2�>���>�
�DR^XG��eU�R<n'�}}I���DzjN=����R�O���FmuplK$oK�;<�+^����I������t��<u*i��B��������IjSJlo��-�2�����	b������H��Fu,��w�a�LKY��J�4hCI������E}Z<�P�����	��B��F��!������(��%�����b�K�Q^p �����`�F�����H�
��jH|��/p�2��a�Q�N%�tom���s�J�K��Meh��1��F�t��$�U�]�~<�C�*�(<�:6����T^a��O�<*�5��gfa���:����)D��P�����P��7�o(���P{P<���o,3E�R�^`A�������@h��s����Wr�F���@�n�r�+�^p���{������T�-��b��6�N��s���)/�Dr�t���Z/�^R�|����35����-^����{�\\��i�����G�o�����'�BJ
�"aB�)JY�S�����S_���p�������3u�oJ������+�9,�M�]�|��&�X�C�|�����$tm7�B=���My���g0gI74���Ac����������^��Y'���A��p��"�Z�p
�J!�t�
d/���C&���S�ac\��"^`���	i��b���>���!n�h;�B�����������Tt���S��S�U#����ic�BG$]�]��9�Mm��zZm[�48�3z�j��r�U������e$I��LuA�N"����"~�4?HxO�RW���a�}o�
BY����CF�������F��mj;�R1X8`���\R^`J����=,��RkRW�%��OO�z�i����
r���MF���Ym5��S{)$�KR���]�����]O*�\q��%��c�����h:���|C<9������py��C�KZ��7|���/\{v�n������L�����W��q��VT�0���RA�SC{�
��0�e�C=���;����B�#�wr�O[�CF���������e0�����T%���
����90md��?T�:A7�����p[2	��t�<5���H��������^xF�j4OLHn������r��HR^��x���[7z?%Ip��<dK�+/$S���irz
�U���[z.�S^x���I�yC*d1A<T�qO����A,�D.P�/�������1�B?�8K
g����[�
k�V���)��W���S�1\yav�qX� P���z���i��rf1������O��R��rL-bc��Q^��\^]�����-����� x�^��xrq'�"�B��S����K���x�I*�q��*��P�E_���
�n���)/���$�����t��L,�����'Q��H�k��8�+�g�i��8��n�*�;N!a">@��63�oT�T����3E=-$�Q��y@BV�?��!�5)��
B�-��C!#X�\y�An���jU
I;�@k���:�PR^��e�&���
�K�
����A��H���a���>��Z5@�cR^ ����y{��H��c9!������F��Z�:9����NJ��6�y�I�
��B�g*JVVE���<x�vP��B*)/T�!�I*,[i��z���B�)���6
�.�A!����#�x���q������z�<�p ���D$Ee�0��sxA��B�QhA���l�Wr��R��'��������Ay��x��<&�y�H`7��`GXX��6��
���5��������X��t����������X6��L��3NKH=0��O e=c��W�cRWH���:��(�}0������?�������
�^@H���I��������AGg���l
��$x!29o"_��s]�a��\,��X�U^`��Iax�]-z\�v�S����)t�`������]���1�C9�����w�-��=5xAlW���^����������M��$���Va���(gn���AUE��.�^�j<l�����W�hmG1�����c0�o��5m/�T�H)�k����*����e>����I�6��J���dRt= 	�p��yx��C!��VuD|F"��>@)Rb�Q���0w�Z��*�y�^(��_8	_������m��)�3N�����3i��5xA���Z����^
��M���k�r��t�j�)_���=�]Y������)?����;��QEv���^�K�`iX#�v�1�����e�c��H�G.�����������"{;H�����j��)?x���)�#���bN����/��t�W����������w��N=l�Dq)Y���nt��?2��q�L�(gZN1��=I�������p�����u�":9>^`��n����D��L���j�K^���1_`U��Y���
��=�y�C
��I�OX�n��L�az���t��di���m��)�qC������2i��M�a��?�
^{�  ^\�BY|-�/T���f�8�'cA������zQ8���.
/&���W��l�3x�V#M+4�dAS��Y#{m:u��U�-�UK-������
8�#������xh�(���\vE��x#��BqQY(����+GsBS�F��z�I��>�����V��&�l��6>O���k��_K�q������y�SU��H�t���d�>��]m}�<��3x�U=�������"�}���1���pU���|��������"�9����$����>t=�:���-_�e����������bmj&�>�f��^`��uJ3mz$9?�_��'�I�����V�
����H>���Q�&VB���N�i��7g�;7}MyA�J
���K)�(��W������|���r�o��U2�����9���J�*}CD��$T���CNT����#��R����T��B	�R���w.E���
B'WM�����7�h��w�L\w��
�q��vn���;/EI�k�i�}gg�Z�-����������.�i����Z�Zp%�cW���YM�����u#����#c0�a\n����$�)c��g�~��|��$��S/(YS��>+���QoT�<x����[��^R@Y���a����6�r��m���%A��&PH�(��������{M�Y�	v��,D�b;��B4dg~��B&�Qyy(Z&�_�%k�p���0��o.�B���x������]M������e3��o��w���M�+�4)����&�@WR\`�����J\
��G������:��������n^�_:��O
��u��CE())a��Y��b�/T,[=;��%�/��C���M*�a/���>L�E
��<�����X��BH�r���x����[���Na��"*&��y�.��D�o�?�����VS�n�@|B4[u���3���J1������6�TM���&��b�w9<^P�U�bN�������p��o2)���^�����B���<I�&+���!��hun����y�K!3<��ZC��q�C��>����Yc��t����ace��H<:�	������H�s-�"�r�kB@��Z6��T�^`!��n [
�V�6�|�US`�s]�Ae��iW���w�!Xb ��q�!������q��vb
�L��q��u��L�c��x�
��j,��ZRH��}��l�aXH�v�p����(/�
;�������p4�l�����N!sX��4M�Q(����*�j���]��g��7��$�w��>`��l;�+2�������O]���]h�jr��S��Dz�Em`�
,L���q�+Bd��������{�JM8���Hn[SM�lU�a5�M����8��9>��#)�?^P��C�����o=z�
L�[��H����������dx���������Hx�URep[25G���>��P�u���������U]}��/w��:s�!#)����^�9�6l����a��+2��6���������N�{9�\��6�hs?^`}\G�r�O{�l���<�KDX|m	�h�N�@4���	"(�[��G�cE��p���?!��L��/�y��s�]Z���gQ��������x[G�r�����N3��w;�FB;�fp|��4h��%/$��#S<�)S�B��|bC�����Cy��d'����",��5
�q��.�d���d�P������O�X�W���O����
�w��]�]|��w"%5�<��7?��:��I�:������h�e|�`\�&�������;�b}{�8��r���E������������~�9���qY����[��r(�iz	�����^8F�CO�t�	����6+�MB�	����C�:e�Y�j����g����_����b��|��n2B�@�\5����9h�@�`���"�5
���N�$�-�PD�nv<o*�������B���`�)��D�mCd���GRXP&p!�X�4R^�NJ��>j��<�������-R����V�j�����v����Q<N������������\�$R�?Fv���{_G[z�� �����0�IPC�cc�T�?,Na��i55X4��.����N�g���*��V��{�M����X�����i�+q�����<h�w�4
�"��k}�
�����C�	8��BMR|H������N��� [�_�����u���q�����������(}xPh�"�Sk�/�/(����Wp "�>	�I	a
��`�K�F,�6�Yt>�y��]��k��k^``Bt8���B��5J0��$"B�aHa'�R� �����6o_�u
mhj���#g���}��6�����w�G
u������J�E���F�,��9�qj�b4l��	�x���/�U����fIK|h��?��H��a�W��J�����Rh��^`�#��I�Tm��L"�x2nMJC��OS~�d{���H%8\����P�6"^����w�,�3
G=�0�Q�K�_�s�r��Z�PA��hM��(z8T�0t?=���Rh��]���gj�E��0��R| 5	UmX���Z&�*�����|�T���b/0O���'�/���X0��9���=h��_0�����HD�{���+��\�^���
\�<�/r)�X�Gt�#u55��K��SoX�|3oK�`
B<��$����� ��2o�Wa3�{y���������J���f��{�\�z��O~a#$��ky�����-��������)^�{E�L~�BQk����� ��de�ka#de[;_�$)/��������^�n��sE�������5�8@�"RB���y�oJ��d���� �&6Bu������<���m�����^�0����g��B�+��*�9��/He�^(�]��i������?��I��?#�rB�� xA�u}o{����=��/7l���(^�u}?����F�L����~
^�V[��+(l�,����/�����[,���K�,x�hz@��;.�msO��|����������-/��|�+�ui6���[����/�cD�kS����Y�/H�}^��_--�;�):�Rbxy������/ ����BJ	��\��C��^`�)<?<%e���`���IcywR�����a_�M��I�r���0f:�2��/���?��/|������^���c�g���?SH^�������y@��;%��J��WZ���H�A���G����zqi6����<�K�^������/���?�^���� ���Z��^�����/|��
()�rq�`T�8Q0!3���\Y,
	���/����CP^��n�������b�_x@��;)�������i��#��[^��WZ��l�K[�<�K�^������/���?�^���� ���ZZ���T1M
�����,�/H�/!����/|?_5�^(�G��9x!���^�tv���w����o������Y����������R^*5�$���ts)�c�fea��������/�va|
����^��G���;_�]��<z�))q����"���M599PPP�I�T��+[�b���
�h���?��Y��||^Ei  ����v���$#�c�,],�-q��_������E������}���PQQ����,�*�F�N^��k=��?
P����\�������#�T ��d�
�;�����#���������^���)u���4���
������� ����'==��DUUUZ�����'�s2S�D��k�$��#%�[�Pd��iY�d�yY�G�
���,����������.��|���M��"���aM^��j�g�]J�jPWW���a033�Y�'4u'��H�/"�d�I���i���#%-V`~����Y�R������t����i��
���Nw��	a#$r�������?���fY�6�����������p�����H�^�4���[��9��|�KR�0>�x�������\�###���%�EIq��g>�?������������ ��<�+����xn@GGG:CE����"2�4Ca|����|+N��l���	��%���>��%������o]���|/�\�= �� a�R�����0>�zP��������^��G���vF���0>�����������-_��G����\���0>�zP��������^���8m��q�#���oya|��_i��#��W^��HZ�� IDAT��oeaYYxQ~6����oea�goo��W�T�%�<�y��1.�H����M���#�������u@�O�Fa|����(n�-!!����UX��9_�K�������G�����4�X&C����=](�������21,��L�(7#�����RNKK�6�����U�)
������{z�8������������� y]��H���YB������%(/�8�5q����v2Y��|����������-/��|�+���t2��B���3B��������.����_��t2�yI�����,,�#/���0>���������zP��������.����o��4>?��dqFU��8^�qy���q��fa|���|���|�*X-����Y)_�Jk]i=(��������Z/n�#lVJ;#�[^��WZ���H�A��/N�#lV�w�Hk]i=(��������Z/N�S�6���
��vv���0>�����������+/lV�����,��,�(?��������3��/�b���� �a-n�{B�;_��.����oya|��_i���=��?�����G�����0>�zP~���������YX�G^��
a|��[i-���zP��������.����o��4>?���8�*�G/��<���8��S�0>�xI>yxA>~�/�|�IR���o����$���t�6+%���Y���r�*�G"w}���m|����P�����/�9u.�/����fQ2��}K�d�|���&5��-��f<������[q�gS��=�'k�yF5KDtrN�ny������y����9M�<�o~(V~��&	O���>I�
-xt�!�����z��p?w����n��H��/��,n
44���!�}W)�>ko��`���4��I��)�������0��������j���x[D����Z�m�s���g1���
�_~��Y����L�h�5��|k�"_NY�#�^-���������%i�o����k^������`�*�x�'�����Z�������������N�������Ps��/�w��������i��#��[^��WZ����xA��$���L�%xA���9m	���9n��Z�$���
��������/�Q���X�$����-�?����W�d�_^�Ig�/H�1�����R�T�< ��Pa�R�����0>�zP��������^��G�xA��	^��{����}��[���}o�/���r��������/�Q���X�$����-�?����W�d�_^�Ig�/H�1��/^x���������u���X��7������?��z��]��"��x��=:���������������YI\v�����HKOG���P�f�/lGE�b��Kp`�dg������LRi��+�L���=B���^����=�?��/�Z�GZ���0>�����x�_U��
�!))�_��v�e^�8�uZ�Dr|4�Z���'�����_]&��M�r+�7g;�n����0�����YSh�D��V���up��~c��OC��+$*�i��G�O�#�����?S��f{�ZP�����^H�~:�G#n�j���XR���"a���}-���F������T����FH��Dm;�6/�)Q�O3Z^��9����e���<���cO���:R.���My(����qk�CwRK��|����YQ�H{�Q��l/�����7l���x�hhBOS{o��I��6�u���am����I�����kF��m��4��~�t6Q	����z��#��lO��/������/cc�!p��I�&���aj��~��D�$�,���{���++��~:6�"Qs��-�.�<t�����e
/8�kF�����'���{�m
����p8?�F�,��c������i����i����}����QB�lk�DH�D�z��D�����sp��1�{}S��;����!.1��:��2�93Cl[��^MA��j�p2��k���1:>�n�bT'�D�r3��f��g�����<�F�b�c��;�3����K(c(=��o��\~�e	/dE% ��7�Y ��;�6���iO���B
�7�����2��a#�w��5�.`����a����5 ����+�6$�R���

/$��b��#�<f���g/���}8,p��+*�5G�j�
l�,���n����7�K�a��C�:n�����S�|�����9x�`�xxz��C`(��l���D�9���#|������� �16+��_i��#��[^��WZ��m|x��QT��������wdeI�� �\�|q�zL[�Sk������!�B�3�f%<�q��}a�1'����������n�
�s��86_���0���eh�����N��:�X��/����S��?^h�z8��<BP��������Y`��V?+��G��7��\��e����e
/�4��6�C�F?�0��>V����z?^�ZZ�e�p�^����E>ia��
�^PUR����0��Q>��^�X�*�������xaY�q�}|���������?z��/��BK�����c��?^(gZ�K����~�����22?����!�DXr0��^PQV����X�5��0+V�B���P�h-u^�/������X��f9��	x�	��RL��P�g�B������a��Qx��9��S�A��`��}�0�B�#p��Yh�4���MT���\BDT4>\���\��U���;)0��g����PPJ����
�����M�K�k�)���4�r:A����qC��r(�B��|8�������gh���#e�x����I����>�<������t��Y= 	����U6�]�������B�}��VPWQ*4��~��Ka+n�{B
�{]����j��0��������/�x�
��P�iVk������J�bP�����l/������b��h�v,�p��
�C�f�x��@^:�����<oh�._XM-}�m?'�.��L��z��S`L����8zx���1l�f^��
	z������x�rC~���9������Q/��.�]������O\x��W�$���lh�)�UO-\-]%4����w�}�F�-����7R.���:����o?-P��
��L���.��%�����P�<��7�����`_T�/��[�c���SI�`6��F��4�t�������e������5qr�T��}�����!��#N��5z���B��B��s��kf#��/�����jR}�������I��`Z�{f��Ny��{�^�z���HE�2�6HG5KD4���M
h�kd�ZPRR��3�Q�H��V�]� 8������<�_h,6_|Z�X/l�M�T�v���f��hk�;�����&����W:?������E�u��t�-5u��D�������}�:p�o
���u�w�,�����
�����������2t,�>s�_�����
��P�s���h�����]����M�$%��ii���+/L�����n�#�����������~�ed��W?(�<������aU�F�h�?[y�U�Ja|��s����W�r����4�h�"i�Q0U%����:T����5q�IdEB�q
(h�!��c��������\�I�����-D��C������?�B��DC����z�2}���B�������3�C��%��P=
H\u�a1���� ����Q��)���{
,j4G#;Gx{�����h�q"�)���>�>;��]�.����Ku���6�����u���M7��i��RS��/�>F������:�1l[���m��c����]����2���Ax�[�1QA���G�T�h�e2"��afn�MK��r}��������Cn�����[>���Ql��o������uRTP��@����>�nS�5���*S3�V�,�>�e";9*%���2��"�=�����O]���%%h�[�)'��o���w �R�_K�@j5t�WoZ���H�{J��NJ�����
�E2)=(i!3(������?���H{�������Y�������t�9S�:�y�%I���,1�m��W���P�����������C�
����U��|��G`���I�{c�����)�[7GbJ2R330u�:T,Y
3�8�����g�����MGy���&TV�6���Uut���c�T<x���-t����$�o]�"[jc��8��Y���t_�P��O*\$���:Z�����V��AXlA���T�u�8���0mg:b��X���6��3���D���������7w$��M���CE��7�+/�����It��"���t��+c%��Fh�v�#�
������P��*�6������m
�>2���y2�u���4�|]p0*O�Al�S���r�]�C_����x,:w
LU����?q�&=_ZV�E���/����(4�������84r^�"PCc�w������
*�4��h6f?�*%M1�����?�z>1��5W/`A����>4�l��5���F�wA�2�����M���|Zr��$]�y�S^��,�����x��^���4��t:��9O�c����i��'�O��L�j�������U�~�KyJ`������M���HYA~��q��&4����U[��8]\���jq����0����N�C��S`�W��Hs��o�q6�U5QB����q��Y��\���U�j����V^<�r�&��-��<����X�m��7<������6~i�]v�s��`*�i)��t�8�	��0�]?~�}�nxy`v��(A�rf�������m
���zrK��|�����W�<�XR�2����v�����&D��e#$������|��m�
��r�4J_��w���H��a��|��/��0�������P�A4 ����Ddf�����0.Y�L��,Z�q})���,~=?��J�
`o3��o������2hV�^�������~./��w�����,�������V����Ddd�a���(iP��&��Q������-�h5�"������s�����U�N4�����5�m7���
�^����2`?B��RFUp��\�o��c��HJ�E)cl:B*W����n2nyFL|�X~`��/��Z��"!%�Z���ZLU!����TEJ�G<���s���:�����/�iam���$����9]���R)e��MAPd6���w!("g��5���l�+q���M���R2�;h���L<�����G�k���,<|�����t��T\=���m��y�#R����?~�!t����-{"�T��q�F<4��gS_��	��)
�a�hXO
uE���������6
��Th��S���ee��;�e��p�������=k/_O����\ya�s4~a�E�B�����j�z��������r>?����d$�K�F�P�]*U����
��u�=�%�N=@vb*�h�ie%z�����b���:�J�Q�WIy]U�'�se%sC���"���/��u��V����+���I��4{5F�9wdE'B�^x=�e@������`/8=9K�(zGh��,���*���`��0����[/�_
�8�QSN���Fl�M,,x����0�]���������FM�\_r�������:�����8/>�����X{����/��`aj���S�������)/�w������������3
����X��v
���am�/��wr���8����?b��7���{�����8H0����va��aX�v����JR:g��^/�����6�!Wy!#3eJ�����ow�/�(�����9,Z��V�����>���oa��7�sx����M�����)�u���2+6������|��<x���f�~zxa��3x{�$x ?H/��3�����&��R�\�cx!���0��xqH��k�Ea|����(n�M���=_�&]��yv���cy_GF#41	j�'��9�����?%0�z��\��7(QW/m�m�HKM�c7tr����W���;b�������?:�V�cp`�d���
-mC<������c�����k>��}��.c��=p�;5�k�����O`�����-	�s�{��B����Ri��eg<z�����4X�Q��u��=A*��8�6}'�!<(Q!Y�����)(/�6�� ��k��b�N	S������k�k�F\��7b���q�
�~�~���i?��^x�J��b����2�v����.��`��f0����j`�X����0h�q���U�ulc"�g�&�Z7�~]���c��:N��j=�%'��g��N��*������
>�D���|��O3�VQ��sxaJ�x���h���DI=J��������qU$�����o���|Q��T�pp�L<���K"$6�is���!�\����`��������m:bm����Epl4��xqx��S7�����	��{�r��i�����^C�,	$������h��9Q�no}x��s���^��q�
"�y���bQ��c����*���HvN�?��at���X����i���TO�w��_�oG���B�Kl1�����8�v�5��oB���z��oc�5xAA[��#7q�Z����4'vG��'�|����"n�(U)M'�M�v�
Z�� i�>&������������	��������Bk���
���H�J�Q�lH=y���@�v��S�zN�L";��jc	������raS�_/^=�N�'��6?�bB`^���z��&���(CB|Zw��K����mo��=���.�������;��8���z��i��?�z�9���J*�>����u�I�Vb��������M��s���1p	n]�F�D��'�����_��~Wwx�vM[��m����7Q]������k������L����]�9�����@J�u��R��Rx�H��	Q�����jAQC��,/S>�_��CA�����U9�?�ElJl�j�PoP�ht���
7�}%3]��+�����hQ
�jH:�Q�zH:�����t�)�����BC���>�2�@u��N��-��U�??&�B��
��nW)�����*�K� ���3�������������7��`�g@����pcl�t�M�"���Sn����;�vB��h�����^(e`�M�O���c���y��#0*�������i���=����hc���Q0�����,T�M���ff����+��N���V:�y9���8T��������2 kGa�2�h���O��BK��:0���N��
}�6,��{����M�x��)��q�vb�x�5.���@�=�v����d���������EKp��h�fR����A�c���P4����2���I���$L���K��&���6�
�����#��]�5�F��O��
M!��)cA��m@��7��nG���p��9f����/��=�����6���*����'���V]����F���=[a���_Z�c6�1��ggz~,r���wn`t�VXw�=w0�yk�k3�v������?*���������R]���3���������H���'?x��ET+�G���
]{�	x�a�`��Q(m\m��c��?8��!�
��zaL�e�||:J��bh�?��i4�����Wo���9����#����>�7� ��������Y���P����������	�4�m'#0b
����M��x��"�(�t��5�&�=������g�/�BP��R]z�0���'���
N{������at�����H��}��3z��J���z������������E��u�C�;��t�
}�>
[�{C
���$}/��&c��mX�u\}=���Y�U}�o�Q�����(&����nvM�L]��p3��M���.����{��E7���E����w���{]�=�����y���������:4-_N����W�����A�y,=�G��{��Rj�B�g�'O������7{@��.�����m��g����5=���
���S�~�7/�c�/�.\BZ��X����!�k�gS�G7�� IDAT�/���;���F�=Fg�-��>�NG!���a���^(`k/a���'a;��x�����Z�H`f��{a��o�Z�#�N���L���� V3�C�����i����b��B�N0����0}�T-�����	�������7`x��X�c��~����g45�|������
a���N]�A��&X�/R~V(i��tV���
w�@ �~US������~�	��Vx�MG����\�F>�y�GkW�Y��6�I�m��H�����"�*�)^�0��P��iM�!�;`!�y<��7�m|�i������������c�/X�O_�)����Q=k9�A������HL�d��'�,��R%L��p(������p?m�/�y���:zw��mn <�m��7�y�\������-e��g��zl��'�x�#+�����_^+�L��������r�o"��MJ^��x��y?�B��6���*=
���}���/��p����^�Q�<n�,�����`;���>!:&��	!���R	���y����X[x��q�>A�t���S����6E��i�=G��
�CaR�&����O^���JT)Ze
���=�l
c�AoLm7/����B����:g��A������H�^����E�����c��3|��������������c���0��?m��{�H���>�g�\o��m�������cG1��'����M��h�R�l�-1��PX2���x�qK��E�E�����S���@r��i�_���M��
^X�u�Tt$�v#����{�1o�z�e������^�#����&�*����g�tUHrA:v2�,'�|��������^sIx��	O��������_��4u�|����
����qXYY�.!�)�>����;��{��?�|\Jm���V@x���-�7q$u�?}I#�;������1������W5��<�2n[�O��d/$���p�Nc��_��s���!�gGE����������u�n����<
b7SR,�������_Mv��w�|�'^x���R��(U�Y�,Y�\��P�`����X�`���$�Q���k����n��0p��3�}9�QcWc�/ta� i/�j�����S�(_�U]�	,<���|��`C�l�%�/X�D��?�	w��^4�����B~�mZ�SVc�����N�����YX����b%�pr��_��VI�����������%��>��w*��^�_4u�r][�o��������rDp���'��u�D�4+��_���}p��7������?	=��� :c��8����B��m����)�������.b����o';��_v�2F�q��|��wM�b�U�Kbw�p��w�"��|�����,2���h��I��^��������^Xy�������	��8��s�����K�Q�/��p��UM���
����tYX0�#��
Cw������M��Y�.����h�N���!w���&�	�� ��)X���s������U��%Kq�'��(�����3D_Fy�����s�td�w���5a��Q��"j���� T`;u��~O>6�L`�q7�N�g�6�;�l������kc��`L�A�V��"xw0�$�K����o�'���XB�Mv~������8���/"�wju<�/����&���	
|��P���<������b����M�m��?
k%�C� ������H������&�+�?�6��q�V��/��G}��6��5�.70�#o����S���������9��EG�w/D�^X0�w�FI��9?u�{�������tI���������]�7�����}�/��;�?G@��:�0�pT����s��	17�}�w�E��
\�#$�`R!y����w!!"�u7�q1;�=��<G�U���8X�[�	U�o=OW�b�q�0��|�.�(���l��!_"�M�G�o��1��k���c�,<
���$��mJ^N
c�{������A81����Et]��]/��q	G*$���zI !���^H����'N�_��@m�.LK��fx��o�v�agZ ��G�����'���s��`4�j!���������A`DM��[~�� ^]a��0	!Le^��P���,�"�q:5�z�p�e��MsF�w��g��e������^����$fo}�!���w�hi+]\�q�V��&����-�a_��;zM�������.o����+��W�w���D�f�0e;�\ �I�����;���oxA���Jutr��=�/`������pH���6^��F+s|��#&mJt�I
!,�g������\�"�*���%>'1�g!�/%�G�f[=t��A��D��G��;�����@��YXb���XD�a��<y��%�/����n�P��:���x�5� ��k �C���|��X�6J�@��e^����V��bm}T,��-��B�f�x��K(b�����>S
�t�~��R�t������R�.<[}���7aea���}�\�������F��?-��p��
X�M��;�f�u�
'�|t�ZrtF���S�������^#y�1G����w���u�`�cv�(�Iq�_G��Z�*b��5�:���@4%�:�w
V���q �pJxA�}?��]WO�q9'��TW:/����;��H��g�
�������.y���<O�����s�.�������sZ��[�����}4k9T�s�;!lmRZ���e~�k4��3l94�%]4� �6���z���	�z���p�.�$�`i�O/C���!�4����;@:�q���(�:l?2GSG���V��tr8vnZ7�vk!$�)��"X���2�,����W�H%���q�V��a`�_���C�|���py���.)����F��Rj�7A�j��y�������zC>�n�i&�p��������HIa#��g���t��C�}�x���+*��b%��"=����KB	)�e��th��	C�ho��QJ6B�|t�"X���?���N���0���0V����IQ	E����ifm�j�fn�8F"����ya'��*?�&����bF���}b��A����&��LW������X�����KP����7�.D����s@!���?`�����$]x��zn�:�jC���F�;�X�!��H�G���pV���/boJP!)��9���
JxA����
$lZ��dt��MC���zu@�_�k��#��?���f���tkpC��Y�p{��#�E�*0a�������Xxr�\���E:z���[����P��"\Jd�t����L��9���s���	������@��
D�y��,"�����]��������F������9������Wv(�/3\{���qj��h���3�=�b7��6���O����0��CF�+x!#�^��mZ��fto�x���\�%�TZW�9����p&h���Ux��u��un�^X�f+,�M�j(V�P�PAj���-{p��]	'\e?J��.
����Z[��uk�B�W�E��$W�Sg.�I��h�_�	QN����frU��t��4*���o��MeZ=���D��������1�������T?����d�QN��m������)5xa��+�Q��8u�
���Y�j�IA��+S��+���;�4/�
���p�:�M[�i�vo>�&�������r����1prn�|���yaG����t��qk���S����s2���0�����Bw�<�GZ�������`��	/��z��C]����\U.�e������{P��+�85���g4�B� �^4��@ \����������6��d��9/�����Z�7/_d��t�;���'���
�rV�A���e�O���ah3���g�T<�N;c.p
�"%�P�/��pv�:���-�B�&��k����D��u5Y��0@���������&��H����BGWG�x�e���|1\���z5��p:/l:�����a�~Z�g�y��[sZ,���v�r�m��4	^���?6!�=�6�.	�i���!5��5}�^��.��rA��'t���qj��m������UK�Y�.�p�tO�m�f.@>�/��]gJx�!���.s�����1�q,8�G����pi�xz�6���b�O�c����W�a����6|?�\J�C�r���5z������9��f�D�����:^��/���ya��� BI�X�2z_b�W���G�_�`5����3��-eH	��`�����������/K��oOtx��.�m�h�������F��}�w>��w���M5�B���)a�t^����.[��c�&�Cj�#>[�9?w�K�.�uA������G���q�w��[�5�?C��_�{� ��7
�6Mc��{0�b�����B����}��x��X^�<d&d��+#x!b�UX�W��F�@��@
����m����~�h����\������^������)��O@�2��B����A�=0�C��sx[v�;����5�9�BH	/D�����y��� �����/^���;����y��|Y�����8	���Xo��Ia��Ye+�~��8{��Hx���tkYw���[t��S1�y'|�6q�tJ������{;	>D��������
���H(���.	�GI����X��Qa��p�p���DJ�ya������1-���D���\d�����M�!CJ�	����Y*LX�D�'�v�:m��+>���R����s��� ���[#�9"C;x�C�4L�.�6�-���<m���]�K�R�Mp���U�p�T�s������E�����
/#�V��;��|��
��U>Nw/�`)���y�<]�:��<����H/;/�j�
������y`����ya��C��3�����]\���E�����\	�+���G:<|�`��� D���/!:&A�0����U^ A@
-���ajWn��_4u��mG�yH�k�����.�)��CWc������������@X�Ys�� ������v��?a��v�b�����~�A������\JWD�rUq��������y��"�������a���[��M�����N�m�F��0�yW����!�Za��?�Q����%�l9s^�z���s���&��C�����p+[c6��$��X|j���.�q^���-���~�j6������eP:���B��!#DJ��p�!�������%�aX�6e^n"�CYgTx��<�����Bt8N\��������b��0E��)���A:/��������h�p(v�-@�Z�X�s2C�4�������m�}>�����T��g'��t�����x!"���"_����fH'�f�������KJ
^��[�P��1��
����)A��0��T:"|������ BI�@������Z�����������9�����BK3l?���nK���8;�H�'~�]A�����!�V��exA@?���t^���I����P��*2�����8����nA^�E���t^���"�%!�a���(Dz�y����e�^�~�(�6����@�y��]+�e:v2\
��C1^���z)�������!b�p�K����b���}t������`hS
�K���#�eX���w�����	6���y!��pyMM >���<}�>�������V:-�34D�������Uym,E��N'V@�������W��;N���:�	���5Zk��
|a�{l�����m���J���&�/�o��'�:����;�������b�(��}*�u�>~y���;���������-f��.�Nx-],���ex��m>89����Y,�`4���3zQ��6��<o�b�6�|������}+���vb<�g<�O��O�3����D�S��Y�aj��,�F�/��x
-����?�b��a$�fb��a��pi��SBF@�����>�����m�t�$�����a`:�n*��E�!\$TR
���.��wGT/�����"��)��t���0����G
{|����&��S�����__n[|U�y��6>0�����<C
^H�����se���~�{�X��Z���!v��=�w`������V����������4Ac�lot���'w�&�H�dL������������0��f�u�� R��w���6�?F�"e��$kVL���f�yA���<�Z������L�{�"z���!-�H�a��?P�,w 2�ER�^���]+C�utSZ�zx�`��D��.���?�I��w�K�KQ�<�}95G���t��)'����
���~��R�C�g�PI��������||�"�1F��n���UxA
v�p�.~��0�K#�����qx�\����7��E��:��N��
V�.
�\�>c������+~�_�D��F����(���'����{�b�6�g_?��oS�e�^_�����-��+&O����J!�y4,A��[�XA_�zE���B#������\�]�{���x����z6�~y����>��CZb��S�P���d����w�d��0�;N%�p�1���N��x��F�h+�k�p7�5���2��H^0�w� @�5���B����pdaD��#��{��v
, ��[���a)�	'��%����_�n0��]��S�3�.��a�s0�Mg�[�-�"��������we8JB,b|�2y�S�q�	]4�+����2�?:B�q@c�EZ�3��p�x��N.a��~E�2gI��Z���i��'���qw|B��qIg�$x��m]��U������I!�7��Lt,��5�����tQ���������~ ���qt���D��@��+BF���jD'	8��<a�o�q��0swB��X{H��5oU�6�A�
�����
�
xul�����di�\��|�2��j��R����G<���}�v���9T8)�$�������{q��'"�C�"\�{!N[�w�;�<�o�,�sB���x���h�n4"��p��?�|n�k��pqiLp�i�=���/���5���"��|?����G�t�������p�Z�y���� ���>�D_*�B��+x!��uI�0oP1`��&a����^��#��y#G�!.�1�-M`����uJ1�w��M�,���qN�~F��d���CQ�*�����y�@.���� �e��1`�������N�f���8��d��G�#�!�U���a-���!��C����M����>�s^p���~���?vo�CK>
�����{�����n������8���D��6��%������B�:����%n<���,?��W,��nX���Mx>
��[Wq�Z�N��Nk��������"�h���j�6����wS[��,C/@�N`�� ��Dhj�w����"��pDN
7�+u
���6B,����?�O����p:x�"��]�>�-�\�����N	/��C�W�|2��pw��4<�0u�3���������pSWs���;^�����/tQ����[�2�i�}����8D����+D?J5�W[Q��5�'pg�
t����F��H/�6B@t�;v�!�0����q5�l�I/t����<�3����1��]~F�����o(�?����B��x_~o�I�>z��Mc1�IsymZq���4�e[|B�aN���e�6T-^-�T��9�O��)�����1�P�+���Qg��Z����r^(��>h;^�^�}��;5������_4(�{���8	;Mf��D����a��$�`cY@�]���0����H[���~�vp��1sW������C
X3��1��L]<�Ncy���t8��1]��x^�e�0��3+w���N�s���g�����>i��9/4�X&�:��B6vxA��~wp��N�m������$�D�B��u�U��>_=k6B����OHA@�	'L�����e����TmNIDAT�/������b�	_��K�_tx:�r����x�6���n����/�������}�y��]�t���yo�8�F/��rGnq�6u��"	���z
v�`���}7Nc�{O��'��O
^H�������F�g��v�j���g/��C�8���b��OQ�nG���#:Y�5a��
�[x=t��zx���)��i9/T)�M\z�0{N,��zA
�`in�^�&�{���Wp��^Twt�!%D�B�
-%$ ������
������a'��n-����Qs������8zf
���2���?2��d.�G""2D��H	/9��}�D������?���y�hKr����L�.��G���~��������Bj��8o/�!���t���N	{��p��Yg�c%p���;ND�gSs��+�}��x�4���2s6qc��4��Gm3a��-"��|'S����`$�c��u������D(���^��U�/�ah��g����.��vgf�G>��]���O�-n�J���K)=����dx%s�EF�c:�#
�[P����5\]�d��?�>$@�??!����������oJ�z��nBx�����^D�[O��hBs=�����'q�n4��
0�z &}Z��p������B���pN�N�7��W�	�4�o���
�y�u������'!��'n���U�N�5���{�z?	�{'s�*���E'9.	/������X���y�y�wF�m���}�&�/0\�	-:��I-H���:�A��^:g����)$�F����}����{�>�����M�����������{�y��s[:]����6��7����X�>��	?������c��%�tn�����O����+���6k�0��Hb��U���^�R��W�&���m\��[~F��+���#p��E�b���x�����G���	/��A�Z.<�?�9=�j:��vU��q�9/�{�����������MK6b��z�4�3�K���9�����c�
)�r^xM���6-�g8fx���� ��'�����`E���4�6�|y���{�Y��eK���A�^�T���5x�k���t�'��+]��8;���ff�`t�^�/V�C���k�����mP�p����e b��:�x��8x�]����f>U��Qt�2#���bef���*���K�����'s�eW��6?
^H>rR��z\���Z��V^[x��N^0D{ob�����dJx!���Y,#xA���T}/����>�
/dW�j'=x�@M���f/�����s/����X�Y�����>��^�G;oB/���J��W$�~d���t���awkR���Y���^6-x�M�wf������r�Lja#�����}������2[��\.��o����{Fa#���M����&�Y���/hS63y��2S����6"��)xAw���~mF�6�GkxA���<J�����;��mqO����KVkW��U
[^��a��j�
^HVP��M
^�]3}�P��>��z]
^����/����2\)x!����>���In2�
:8,?���*x!S��U����t)xA7�r*��rJy�����������PZ?b�Q���8��j<��d�<
^0����\���;�j����f�v5?YU�����V������G��G��t�u(xAw��YB��T���K9/����K��W�]4�6���U�3��r��+xA�9V��nz�Tn/����mW���W�
^��HR�����/������)�)���Nhn[�S�1�������dUA��W�cX}�Z�����cH�YQ/�e��u
������`��W�B���C�������r�,+xA�9V��nz�Tn/����mW���W�
^��HR�����/������)�)�����#G�di��j9�(O���M'K�X���g{f5?�.�N
���I�l����G���P��5$DG�����O��f��������yt���t�:�-j���V������k����<�E��`{����Ofz���8����L�W�*���8j<ff���}��~�Z����k?��?44fff011y�:�8ST|���}�O�:����A�0<Ix�k�9�?��d�cy��T�\V����!��SG��9o��n���X��q���M����c�1
@x�~�M���r�������m��@���~���p	&v�b|����<��f6�gV����{<�a������������	QYm"[��{~�:_�����{?C�G�I�K0�������n���DEE���Z/������	�)�o��z��4�:��a�|�f�Y���8�M3��'��X�!2N�����;VE+��-7�_	��xz��[��rN{���@z�BNu=7�,s���ON�*�kW��v:�T.5?9��v�*xA;�r*����R^�v��h�SN��M�$_���b����.je^5?���.-���E����U���fo�jM��@���Z5?z�@���1��z�67�r�����0`j~(��V��3Y��2)�*��P��a�X-VV�����'�
��������s�����=1�j<Y=�
[^��a��j�j~�������J�i������CE�����p�����4?j�RG���P�c8m�Q��}�h�:r����J�'��Y��>T4\j~��>j~��'��k��1hU�R �)p����T��V||<��XJ;�7��Zv&!�vW��255�����M�G�Ov*����T[��r��D3LBn9W��T������j~�Sm��R���f�UB�W1|@��y��I����cPy�\���,Kh�
��T�,U.���$���!�������G�Ov*�������]j<��K��-5?�k��%��d������rN{��R@)�P
(�J��R@)�P
(�J��R@)�P
(�J��R@)�P
(�T@��0P
(�J��R@)�P
(�J��R@)�P
(�J��R@)�P
(�J��R GP�B���W
(�J��R@)�P
(�J��R@)�P
(�J��R@)�P
(�J��R@��P
(�J��R@)�P
(�J��R@)�P
(�J��R@)�P
(�J��R G�g��g��G�IEND�B`�
nodep.pngimage/pngDownload
�PNG


IHDR4�X�� IDATx^��	�^Ey�'{BVBBH�N��� �Zk�X��[�R�RD\�][w[�[�Jm]�V�B����a��d#	$d%{���2�7�����������=~b����w�;�<��3�3g�sN�����������u����$ 	H@��$ 	H@��$ 	H@��$ 	H@�5:
�
6n�������/��$ 	H@��$ 	H@��$ 	H@��$ 	H�#�B���F�V�Y�m���A[��$ 	H@��$ 	H@��$ 	H@��$ 	H��8���o��uK��e[4x`4hpQ�_���}V)�X��$ 	H@��$ 	H@��$ 	H@��$ ��	�2s��F�����m��������?��|���������j�s p����#�<����q�a���5A�����������{��v�-��x L�2%�5*���z(�;6����e-\�0��*���{&���c�e���k���a���a�}�I-*�\�2<���a���Ie���z���h��p�$��~���`��p��&���7n>�`a����
���>���0p����h#v��^{�a��%��l��0q���1I��x��0n��0z���z�k��a�����L�([��'��ra������}E,�:a���j�-[��7'Z����[�����������,YR��&MJj#7/^��(�z����1DY���/�3�Z�tiQ��w�=2$���x�*�,l���S}���WjY�W�������f��b|c_�e�+���M��\����q��Y��m�1y�}��G�}a[w�yg1���^w�}w�w�}�yQb���''��{������r��V�ZU�!�k���dt�A�E�M��Lbe�a�B� �zhr�(�1y��'�te�
��^����,�3O��Sc:�">$cnK�([����(���+5��=e���;�����rQ�o�:u�������H[S��"�;��5njLGY��S���za���d�q6AFL7|�����VY�Q�2�"�[�n]1�������O-���l"�������[M�c��������E���mLG���_���e���e�H-��G)lK-�|�X���Uf���f
�z���;���AR�2c:��]w�?���j����f�dm���_���q9��^�H��c��I)���	�vjn�����b�)W��QFq�d�����:��	�7�njN[�^e�s�n�bnK�wS������,��������eZ)c���fl��
���2�"��"u-I����8 �,|���5n������w�w��N
����g��!�T��Nq��+������q�WJ�o���p�G$'��t6�S-e�s�=E����(��)Yj EY84&��$e�h�X\�^�LNe$�I��g���K�>�I���CI.�I�Eo�o�F$	����T/n&�baO�?5� ���e��L��:&)��8^�&RG VJM~S�J���%��B6S}�E��}J�H��<����(BH-�E>�6����O���^�I(6}(�d[�B	�A+��
g�������F8���W�b��8��N�c�����Z/|	�3f$��ve$�b����T����v�m�Fl*/�"�8"�cLG���h�,������#���d�"UX
/�$���>�X�5H��/d
R���Dev�a�1��^�������������:&)���M�Te1�QPV�m�
��Gb:������R����6X7�\����[jY��Xn��Sc:����um�^e�;e�a�:�CX��n���Y�1G�n������T�C��q����Ap��!�������zE�*�fj�G1�V���X<���c��ZL�������R�"+� �e�����1��nRbe�t�I���R�2c:�����>:�Z��e���'Y��K]g�Fl�5nj������[S�t�&��ajn
���K.&U��ae�t�1>�������sS�71&��\JjN[�^e�sb����qX|�975OGY�g>J�W�~d-�Jq���!�W��)��q���~�<]�kH]��+�+�������E�����Nhx`��;��P"C��J��,D"p�5���O>��_w�u��c�I�L��'��e��0w��b�����d�O�P^�26�HLr����	����5�1��>���f�DBb8��,&�y���"B i�����A{��md&XL
�(��8��:&)��8�A�Z;>UC@��P�,l��E�IR�l*�.���4n���>AI;6�S�NT��!B`���RV�">��X�T�7�5>
��I����`_�Oc0	��(��I���6��Zq���������0��R���`������� ���c���o/��T�b�x���M����D�����UfL�&8>:u��%�#���(#a��d�!B`a�AR/|!k�c�=6����2&G��tl4c�e�
x���Q�$>?u�EY���SjFY�*>:u��D�p �Ab+5��Iy|�t�o��j�EL�2���A��75��,x�&����J�'���X���S7�Y��nc���AO<�Z��6�� ����O-+>Y�M��;ec[M�W�k���>�V���?AY�c��ZL�����H�*6�Z��W��0e���a����O���c:�����^e�t���n�)�p�	)�Z��e���G�r�-E�/u��W0��R7����[b�xb
�ajLGY���b��2�r��Eaj������;��������,�HYe���)�E��(>������(��G��
�H��o�8,��A>�W���Oe������{
���(R%�L�W�����(f�u*h�w���'4���A1C)����W^ye8���Ki��W_]��	*���	3U9p�N��P�31�>�LY,xI��R����+5��&&�Te� K=	�M��;���x�O��!B i������OG>�)����� XL
�(��X&��1G����b�S5d�%��^I^�>��e,���x�^��D��$O���Gp�!B�Gp1w�!��OPmLMh���)�%=���@��CR�"A@����.�H`�e,I�������8X��E�Wj���$R�"iG\QFB�1Ir�
�T�����^[����
��40��:���^��c:����#���dsH�*0&��e�a��!���f�$�}�I'����^�*���1�b�__��?L��`O���O���f
��"��V�_�k6�"�J���E��������O��S������H~W�Q�Y�V���1e���05_��2��8E��8�X�8�������(+u��x��||�@��%�N;�x�T|�Q/��Mul5��2&��Ke��[���xe-B�J���lP2�����e5���1�c
����<>�9)��Sl�����!�,C�ZfL��G�p�)�����{��w��dm�	����(~"H���b�2�����50��5|+s.��2����\�qm$��fSc'��97u|c���RRs��t��u[jY0g��^�QR�F���+�sS�t�__�����k�TAb�qX<�����������0�Q���$}��(c��OUH�c��O!��E�������]����5��.ef�	T��W\����V��V[����e�n��Zx�z�@|�5�S���k�7J���SH,xSE=��wJ��	��'���������(��`C�Mb6
R��=��wJ��	����&����-�%�3����e##U���x�z���>O���_���o�@� L���H4���%��	��$w���G������u������;$�\~���/xA�i�-�@��+P���4��%PxUI������f�) h`c��k$*�*���DF�*T���5o�}l�O��M��W�B
l�*h�Z�Y��h���T�����[%����qS�"�R����w�sbP�SJT�E`Q�����7�����V���WL(j����{Z���������U�g�$P:���
�8<���K/�%��8��?T���Z���K�p�"����JXU"���z?��*U��J ��lAC�+��*���e$��{�S_{��U��$�D�Wa�D
�Pzs� h��yM���
u�UM&O!��4$���^"��5V��rb��Uj$\P��K����4�_�����/~qK���I�LQ�p�w�SO=���-K-MA���$O�{�Z��VN��A�<,xS�e(\	T�>AO�5�R��k�xB=
�O��7[���=�
����{�-��)S�(h��������o����}�^��@<���P��K���vv������Cs1�������/~^����V�I��	0��-
��vZ�W��I�4���_xR�K�@����
�����>A��G)	dCAbNh�{���i�
�	�(h3f�@$�
��n�)L�:�8���������gSWAC���r;�V��T��U����vzB��ys�[���u��)���������t����E��u������rP[J�������g=k�Z�Y�&�*
��$@~�����A��O<1l����=��w\��w�uWq�3e+�h���� ���a��
��{�-�A���$	��nk{u���3g�T%PI�?�x!h �
����W����?<8u�Q�mc�9��S�z����@	 h@�So����O{�A����q���N9��0d��*6�:gNAv��4�3�p4�^{�U���@"��a����Z6
��"�Y�dI�s�=��3��;���T0p�	k^/	T���7�X��zA������c�=����q��>�`��!�g����*��u��c��q�����^���vn��������>�h`-0{��bN��@	��*������XB��G�_�0����C�!�*vz?�s�
���6I�~����������6�x�(�?I}�=��w�]$EY �p�	����F 
���O?���[�n-�M���_}���k)���[$y�}�=|��
S������+6���O���)��
,8��
7�6m�T, P��<��U��X�b�$t��� �Cb[L�!�F0���
�B|e6���@�i�j�CN�n$h������y�������|~�������=��C
���=�P�I���������m����H������o�%�	M��>O����q����+�C$D>��j�������}|�>��S���p�����<�2q<6Ot v��@	`��j6v�����2k\���c��S����;�6u3��X�1��8���{I��	t&hx��
'��(�!.b���@�Ol�x!�GD�gyI��	�����S�4�p"->�5@�� �G���
�g��X�-r�����,j�^�n�_���(h���P7n\!�!w���g�KN�W1����Q�g���w���$���a�Cw�POi��n���@��K.	/{��v��u�]W$�	�I�}����Y$��.A*����T���Q���[o�5<���n����p�Om�s�=�)<�N@���
���@����"Q���?����_~yx�^.����������.g�qF�����
e,�K�fo�L��wc�,d�����ErL�`��,����E��%�V&@2�E/������b��SwHt���,>���$�<����l_1Z+��u�R$(c,_O����A�26�l��"�I2��^��3�?$JI~��m��	44Pgb���~�f��gC��<&?[���O	44�D�����(�3b#|:�?
�I�#�am����� ������%SB�L;��<|�fU�����!����`�Q�@�����{���\��E,_/h�"Mb~
�r>��c�9�]�Ln{G�����k[�N���5*����y���\sMq
	y|�;�|='03&�m7�s�n&L(������{��������l[#�t�
38t�L����4�N6eU������'�����B��e���'*�yK ��*G��@|Z��(�������� &���!��g��oD��w6�>�o9~c�����:A�c��&	�8�����92��� ������d~��"��'�{�?�����j����L��p�?�G�3N��$w8Y������w��93���G�����"��3�8q
�k^l�D>O�zI��	���8"e�l�2��"���s!�$�'�g}�g�<�����W�	8^��r9�|��"���B�(���c���$�y�P[������n*by�6og��U�1'��8�����d����������*�����@g�N�%?�P�S�a���L>���x�����_��fD
^�-
z�����44��!�1���i�����~A8}���&l�3�,������q��,jO:��"�Cb%?6����3����eA�k,������9�yN�4T�$�;�0���������4��a����+�(=(�Q8�f����d����}k
vN�;��9s���� dC�F"��-��9����O'��Z�@#A�L���7��?������xB�gS���M�(tn��[�|	tvB'�0&���6�w.���iF~�f���H������}��W1��������G����������	
�|�M]���5�U�F��H�'����k&�o�1<�O��'�08����%�V&���!��q�P�X��f.ser;�[l��r�����+�Z���-o�	��������!�G�������v�^ ���O�_�C��m}oP�����~I����_6�FI�i�	$��N`g����v��7��	�&c��;���r������K�3AC�Dly.:{�D.�������!_*����J����o��%���!_"���4T���sKP���`%z����^��W�
-�V�	(h�E�~UKP��R�aez����^���
-�%V��(h�%�~MKP��R�aez����^��W�2
vZ��$ 	H@��$ 	H@��$ 	H@��$ 	H��4����I@��$ 	H@��$ 	H@��$ 	H@��$��(h�eh-X��$ 	H@��$ 	H@��$ 	H@��$ ��P��Sr�'	H@��$ 	H@��$ 	H@��$ 	H@��.#��a�����F`��ma�����K/}F�.���p�UW�D�������}��0y����g��Qa���a�����g!�&�v�����~5\p��n����$ 	H@��$ 	H@��$ 	H�O��kt8��g�=��Z��O�Gx��W���^Jyer��w�O|��G?�Q��3f���;/�{����W�B4T���k�P����O
�E�\AC�t����$ 	H@��$ 	H@��$ 	T�����;NACf���y��!�~L@A���~l��n���n�����$ 	H@��$ 	H@��$ 	4 ���y�P�������
�;�7
���w�u
���OI@��$ 	H@��$ 	H@��$������-CA������;�#��AACvF���
�	H@��$ 	H@��$ 	H@��R(hh���
�[�wdG@A�����^A�].	H@��$ 	H@��$ 	H@�@�44TA������;�#��AACvF���.��$ 	H@��$ 	H@��$ 	H�d
���AAC�V��P���!;�W�`�K@��$ 	H@��$ 	H@��$P2
�U����y����(hP����+h��% 	H@��$ 	H@��$ 	H@(������*hP����xGv4(h���4����$ 	H@��$ 	H@��$ 	�L@AC�@4(hh�j�#;
4dg�
�r	H@��$ 	H@��$ 	H@��J&���y�
44o5��
�3z
H�0 IDATv�$ 	H@��$ 	H@��$ 	H@%P��<P
�������
����\��$ 	H@��$ 	H@��$ ��	(hh��
�[�wdG@A�����^A�].	H@��$ 	H@��$ 	H@�@�44TA������;�#��AACvF���.��$ 	H@��$ 	H@��$ 	H�d
���AAC�V��P���!;�W�`�K@��$ 	H@��$ 	H@��$P2
�U����y����(hP����+h��% 	H@��$ 	H@��$ 	H@(������*hP����xG��n���][����/o����^�:l���%�<�%�����a�^�K�����������
JZ�B���~����.�xK��$ 	H@��$ 	H@��$ 	H@}A@AC��44`���;�'����%�\�:���k������~U!
��;m�$ 	H@��$ 	H@��$ 	H��	(hh����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����44oH��
y���m#��AK��$ 	H@��$ 	H@��$ 	H ������)hh�LAC���yP��W��6
�	H@��$ 	H@��$ 	H@��R(hh�����4��?�y��!�L���GqD)���eK8p`�'�������!C����B�$�4�u��M����qc6lX)eQ��C��RV�cr��ma���a��A�u+�^[�n-�SF�b�a�����E����}�!%�V��}*/����U�8��ys���6�5�(^e�����������E��6����Ge����1�X~��1&������2b��m����[Yc�e�����5������Q���2�X���Nv_���9����l����L��~��5H��Z��,{^+s����b�8�5���YF\Q��l�y��1Y�}��x���LY�,s��qX��2�P��Z�qE��l�y��1Y��^e�Uf���1Y�}��_�������2����*�^����j[b����i#�X�
�����L~�~l�fe\�u�����e��7�0e������z����������������RU��o�:��0n��J�;���>�hx����>��v�m���*u��
��?�f��Y���Q�K/�4�q���;�n���0a����s�8Ed��a��Qa���95�h�O<����p�i�e��k��6�R�2eJvm_�hQX�re1���\.���-+��q��K�wh����]n�Olw��g�&��?c;c�*�ku5�[Y��#G�,g%�0���.���|%y���v�v��*1I�T���v���������V�X�.]��&M�T�%U���c;
��wk�b4�X�tQ
r�(hP����Z�Tjm4(hP��:��s�bU
�U�3^��i�Io
�CU+CA�����lj}�� R�
U���c;
R�k���u��&T�#F�(�|%�:w������N:)�=:�X���y��C���p��2m��p���v���Oh������
Zb(�J%<��<��z��������/���AA���q��T����
4��0k��1��/���c;c��r���29�v
4���
��/>�`8��c������y�{^x��
Q�~��W��7�pC8����1cH����?��3����<��3'��7�	��������$h����3q��B��8�(��V�;T�rH�����x�=��*\�	���_T�����n=�P��Y�f��c��j�����[���p:��������%����GqD����zk�F6�9���]w�U���������d��������������xw���<�H�X@r�'<x�����������_�x}�1����Xb�3���w�}�p�}��J�X@��[n��,����{,<���a����'O�D�;4�,^�8v�a��c����'�|r�Mw��J4��Jv�0�����?������1��*�����SN��|�Jl%��e��=������7�h��\�,^��v[�x��8��Q���x��U��6�>�p����g����s�;�>qrU�����u���;�(����x���������;��W���
��++%������������=c&1����d������=6Ol��{Md��;�!s�^{�U��w;�c>'����}\7n7�tS����R��U��S|���y2��1���s�8b>���	^�����~MC��|�uUj��b;���:���n���"G�1��{\��v�g�~����v�Yb����6?��/�]�WN���ym����Z������#���b;�/�1����<c�uW���[�/���y:�����1����X�sdy��:4���h;c�u<�M��Kl�8g]��_�2<�Y�*�l'�%�#�K��h+9�s�;����w�������
�}wc;�������s�������U��#W��W=�k$h���a��/���k���Y�c��^9�:�6�f�F<O���m}\� �R�.�g�^Kl�����Q������2��w���iA3	c���L(����!�� ���������Y����sp�Xc�d���O����Y�0`�$P&����"����Gyd�$���E0�������G40�q �	n~�b1�'I1�;�'����,1��L@1�d��KR������(��SVgIo67�h+~'��-m����`%)@I�qE�m�����S�'�F��2���L�@�I�0	��������G�s�NG}tHH��_Xa'���gS�Ic6�����b�0������H�������9�����l��(��0���D4�>��	��A9"�g^�AW_�}��7�K�i�&@X�re�7���&��H�=�u��a��AD���������I���Z_\�-�h��u���7�;�9e����+�}Z��L���������w|>��>�4�h&Vc�����c���#���V�	���,�?��d�c����c��x��d~/&����U]�	�9��9�����+nn�~����E[�o�o��?#&h�kg�����.{�������}�@<��v��W�g?������|�`#:[�j$h ��}�o�x�E��x�������c>����n�:v��yW�s�a�/����������7s��}����� a���G�������3���j'�xb�������R&��57c��J�^�
���=1	�!vL|W/H�c�~�>��l�a������b;�M������{�l�>��0�1��,�k��Z����v�1������9�i�1�Wg�������v�r|~����v�W��� �R�Kl�Q�c;�.|:~��>�s�5�c�b=Fl�O�o����F���u���:����L�����y:8��:������zl�T�+��Q��������[5��L�P��c������,
r��������0��������y�u	q�������������M��_b;����6s=y*��Ul���!oG�
�'�G~.�g����X��j�����>o�9Hr�9��q����]g�������l���\��ssy|P����������Z��,oG���H���������<~�Ql���������������8 Zx�s�[$
Y�T+����9*C��;�	��&�0��N+�D���6��*)�Z�x���Lz�6���y��"���z�7�e���E����c������	&��� 	����w8����d1���e�|���}5�vLz��W,�[0������|��&P$)B��V��>�
a#8_�����,���#��M��Io��$����	6���S{LN�9���,�H ����|6�K�G��$C|{��A_�������9`l��!��J��#6��{�	�\/h���X�K�E�K������L_>��1��x��Ix2v�{�fL�������f�����&��O���(������1��>l�����z����4�.����	�K�2��7;	�W68����zA�g��V������)	�c���YW>�����d��������
�?�]/h�~����_�%��6��f|�j�;
�,ti�_�-}p�(h�����B{7�I�K2������{��mG�@��K|q6_/h`>d^�s�q~lr]~���}�hE!G=����,��c;�1>��������v��'6���[W��;�1���\}76B���a�16dn��a��z*Swb;��$������)?�6�>�����&`���i�^
�b;�Dl���o>��(�����v��(rh��w��������^��zQ���&c>���#R���3r/�8��,���N�v���K���Ql���#�KlGL�(��YlG��<���N���Qwb;`�q��_b�(hh�a��g�s<V�����y�&V���~��=�9�)�v����E|��?�v0�/����n�� �_�c;�p��h;9���������
����u44�����y���(h�!�#>#���G_
�1��������o���2������sk����!��$�y�<�%F�mg��.��\��>���y��>w�Y�.����V��:
���u|�:��Y������Q\��'oO������6`�=�/�_c��y����(oc;��}�����>g�?�b��
S�44�aRa1���b6��"�C�I#&6��xq�,<X���xdL xBC��R�G����� >y��,�f��O��A=YBc�~���o�(�@
g������S����E0�S��#��z���]�����h���
L$�i��� )�S&1������S||��B�������O?���
$O���q��`S����W������	
l�0g��%Pd#��#h�����L��m�96;�yl~l���]=�G0�E�
=���&��v�3A�$���b���������sB�n�������!����A_�tW���(���H������Pf�\��I��"������x�(h�O���=I&�5��M>�m��,]�A_������^��������(pc�������j��������u4�r�����wE2�y���i76O2����Nh �`A�
� ��5Jz�CY��u����b;b�&�k����s|�������clS�Z�������NlG,!�s�;�4q�	'�P�8|�vs1\|�Vo������	
�8m����Vc�l��{�Yi�c������EL����C�2��_�c>�w�@�<v���������Nh 6�-�.c���:^c>�c!���������c8�����u/>����[Ln������Sl����y�|�F���������wL�w<e�����[����w�b;�9�c�c;�h�0��x�&y���v0`�k�������yb6���SO=���������1�!<��Df��|^���Oh��a��y�=�����cl���}����q"$'C�����v������y;l{�w���������X���^+�����Nh`-0%�OW�zl���������(��9�������7��bM������>���<1:�P���c��
L"���������=@ �� 4������a����)$[��S
z����6�	
��Pl��#~�. IDAT&��	�=c�8�xTkt�8����-���(����@<�G���	

8a�������/���������"�����M]���Q�@���%.�i{_)�;Kz���L���,�|�?�'h��	
�
�P�x3���&X#ACG�T	�����������Q����X���;������FI��u!��������s���	
������A������ngI����_�c�Y6:��l�� ����z�^�	:��^���I����i��W��W�\u�U�� �[�I}��H������������l�����a������Y ����<ueg6�����=Q���D���Q��5��|aL����vu�0�X�zA�|�<*v��=�������y;�"�Vk{�OW�6�\����Bx�0��e�u�&.~ ���2v��wW�1
�V��v�wN��%������!O�#�����]����UlG�[��1�k��}��3W��q����u��V�	��JL�h$wc~�qN��i�h�'��y�����|:EW�s��8����g�_������d��G;�3�b_�Yvfo����+$�|���~g�cV�%�c.�S���q����v��{�c;�-�tl�1��)��(h�c��9����[~�<qm��h;Omb�\<P���%��6�t�eb��b;�y�����uWt���i>�&��NlG<@,���]g��Fk��o�$��b���8�c|�~?�>���v���K�o$�!_�1����������Zb��b;<�=��x���\wb;|c���+����o$h�X�g�O�������u&h�o;s���N���3�Y��1��O��/p����~�tgv���s99H�<�� �m�5-h(���<q��cA	���Ot�L��}��7�������=����#@@�f&	m���	�x�	N�AD�/>�L���	
�G������������������[���Z�������w���%v'��5�5����a�|{���]AC��r�|{w
�������,���v���]	z���-�v���.��������
}W�]���v�vx*q�o�o0�����?[�Wv}-bl���a���o���.�Dr������,#������]����5��PlT�t��{"�i�i����E[�#h��P�#h����Me�vM�+X�%�f�D5�������E����U��UL�)(�rM�#�Q3�� ��x*��A�>U��l�rQo��,��9]�$9Q!>]�S�i+�e�:��B���������O�y���?�9*6O�yB'�����.7�'�C��������al�vrNn��]��6�������hl��7��
����e��y���v�v��Zv������!��D���v�,O��C�.0��+���NAC�u��Oh�B/���9+�=���p�g��]>��S|���'4�,\9-�VzWq���>����v��	�M��2�3���<�Rgc���k�rJ|�yB����7��`l�	
)�B�����-Oh��k#�g������NAC�}����
yK�����*��������������S��4���V�`���wEv�ml�+'4�p�T�6c��b;
�v�vu�=�v����
=6��)hH%��Y���ju��
�)�}�oA���������J�m�#
JB�+��w~Io
&�MzW�U'U��NA����!T�������4��U�U'U8��NA�����S�YAC*A������ju��
�5fSj�v���`����N;-c%�U�������Xi���%�4��6���8+v{�Ioc;_9Q��ZJu�����4����>+SH����
�UAC*A������ju��
�5fSj����p��w
)VT�{-ZV�T�P��K��I����
Lz��N��U*!����
U�e���.��NA����]Y����)hP��:J4���,	(h�V�+hP����Zc6��
4L�2%��*y��������d��V��w~Io
&�Mz�z�j��s�[A���j��rjkl�_l��������Y�Rr��4(hH�
R	z�4T��4(hP�P�1�R[
4�JB��w���a��e�kf4��T��V��.����3�C�I5�����7�	&������
���V���!i�T�f
*j�=����*h0����T���c;
R���T���%���'�|2v�a�j������I���a�*U����^�:l��9�3&����-[��U���A���qymv`7���+���N5����t����c�����{J�7m���YS�u�|nOw�X�"L�6-����{���Q��������o���hNs��m�6O�s����v�v�9{b��3g�����`lgl����m,�3C��������r����$o�s�����]6]��9��8]t��������__��������#s2�Pvl��!+���e����H�N9>���S|g�qF�����S|�����s��������V�����O�������)>���+�3����h1�Nl��Y%�������r����	c;c;c�\xB�'4�����T���%
��v
r[3B4(h���N���
�VT�4���V�`���w�|uJ�4(h��I>
4�L�2*y����ub�4��J��)hP��0t�[4���,	(h�V�+hP����Zc6��k��
,(�R������WA����Ymz�4(hH��j�`���w�,6��9'���VOhHCU+��.����*V���N�o����
i�������7��M�K_�R8��������{���?��p�������%��4�|�PA
4Tk���VA�������vZ
�J�k�[AC%
7��&��Kz{B�Io�����b����6�S�P��ZJu�����4����>+SH����
���n���p�Yg�������0y������,�v�m��_�rx��_�Z'��@�P���]���i&�/
g�qFv�`��}��'4T�S�������t+�^	&��Kz���6�]=_�R�����v
R�NU�5��/�S�`lglWU���z��)hP���Q����4p�u�]�>��b�A���s��������6�>�/�JP�P�nj��'4xB�'4Tk����<�a��))&T�{-ZV�T�P��K��I����
Lz��Nt��=����
��T��.��NA����])��2���)hP��:P{$h�K����B����b��n���P�P�S���AAC��lJm4(hP�0*eU���[��e������;�Ru/��&��Kz+h0�m��,Z�rrNz+hP�P�QZn-�����4����G[���c;
R�g�
|�
7����~_3���_9
��e
4(h���M���
4�����k�;������&�������s�[A�����S�������4��U�_���9�v
4�t����
�_���*
��9
4Tk���VA��
R|H��5��_�[A�Io��U��i��9���AAC������v��v
�������{Z��c;
z:n4�����	(h�V�+hP����Zc6��
4(hP���C�v�I����
Lz�����N�o�Io
�FO5�6��/�S�`lglWM��Z��)hP���q��!���gM@AC��_A��
��)�U���AA���R�{Mz���V�`���w�<uZ}sNz+hP��6z�y��]~���c;c�j����:��NA������R
_|q���;�g?��0`����x�*C@ACe�����
�5fSj��AA��
)>�j����/������I��y������V���!m�T�nc��b;
�v�v���=�u����
=7����|�;�r���7��}�s�R{��+C@ACe�JA��
���4(h���M���
4�����k�;������&�������s�[A�����S�������4��U�_���9�v
4�t�$	~���w��]����f�
?���5����W����Ju�'4(h
�5fSj��AA��
)>�j����/������I��y������V���!m�T�nc��b;
�v�v���=�u����
=7=4\~����s�	s��	�\rI=zt8��s������������K���K��	(hh�.����r�4Tk���VA��
R|H��5��_�[A�Io��U��i��9���AAC������v��v
�������{Z��c;
z:nz,hX�~}��'>Q��[��u��p�E�����a����u�~	�<���'�|2v�a-_��
��??L�4)6�R�N�����������1c��!CR����[�l	�V�
�
����T�����y�����Q\��X�tiq2����M�6�5k�c�1��E2d��a��i�5=<��c������~�dl~���E�s���m��y������7�3�������9380��c;c�����nc��:th6]olgl�c��|%y���v�v�����j
�9o�h��bO9��{���������#s2�Pvl7`����\���Y���h��'44C��?�	
���	
}?{����	
9nl�(\�re!��ia��z��ea�������-7�R��S|�=��	
>��S|-��wyer~��<�a���c��b;Oh0�3�kAg���sl�	
���:�4���,	(h�V�+hP����Zc6��
4(h���

!���/������I��H�z����V����z#6���v��v
�����}g�J�9�S���!u�*hH%��YP�P�nW���AAC��lJm4(hP���!��T�^���%�4��6�]5O�V����
4���j�ml�_l�������������9�S������&���!���K@��$ 	H@��$ 	H@��$ 	H@��$P:�N
w���p��_����a?������
�h����K��$ 	H@��$ 	H@��$ 	H@��$ 	t���u�D	�����N
w�|u8�Y/j�,lG�P��B��E
��?'	H@��$ 	H@��$ 	H@��$ 	H@�������3�'L�9��
��[�	����B��h;��b�Nl�������o�����$ 	H@��$ 	H@��$ 	H@��$ 	H`g��1h�$�)��6YBg��{o�6}���Sx����u;���o���R��$ 	H@��$ 	H@��$ 	H@��$ �����%�>���������{C8�����P�Qh;�����gV`g/���$ 	H@��$ 	H@��$ 	H@��$ 	H@��@�e;i<���OtzB��w��8�&h�]�@���!��~'8xI@��$ 	H@��$ 	H@��$ 	H@��$ �n�>�M��H����a��7���NP��nm?y�������$ 	H@��$ 	H@��$ 	H@��$ 	H@;#�A������{n	���ZQ:y�^����Kho��$ 	H@��$ 	H@��$ 	H@��$ 	�x�k(j/��2sv�wE<z��a�������vx�G�D����"�	�+	H@��$ 	H@��$ 	H@��$ 	H@�@�	<Sh�����SA���o�}Z���l/�5T5T�����$ 	H@��$ 	H@��$ 	H@��$ 	H�t!<-A�T�������G=-h(�W'Zh$���&���$ 	H@��$ 	H@��$ 	H@��$ 	�sO�*�SA���yj7)xBC7A�1	H@��$ 	H@��$ 	H@��$ 	H@��v ��}��w*hX4on8��S�
q���k����K_�V���9��w��a���������}9l����w����������y�����y��_.�����Z�����/�s���W^~���n���$ 	H@��$ 	H@��$ 	H@��$ 	H���"h@���o}%���O��_]���'�5|���>�����{z��m{��o�S*�����/���i4\Y4,*~�����/~Ax|��a����+��;�~�$ 	H@��$ 	H@��$ 	H@��$ 	H@�&���a�Cw����eA�~������O��pS8�����yYS���\��p�G>Y|��^yV�����
�+��g�C�
���m���|1|����]������shx�9�=�<L�41��W��.h���N��6BAC���$ 	H@��$ 	H@��$ 	H@��$ 	H@�A`����^9Of@����?Z.��{�+_����K��&R�T�Nj��7���p5rd5jdx�{?=��n	C\��O�Nu�>��w���G
Z����$ 	H@��$ 	H@��$ 	H@��$ 	H�[����X�P2C3��/����+^��5���p�i'�����?�P�
���x�^.��w
�e~H��$ 	H@��$ 	H@��$ 	H@��$��z,h�����o��R������U��y�i������	;��
��

x�;�O.�4r��]�rBAC��5��$ 	H@��$ 	H@��$ 	H@��$ 	��@�
|������-[;���v)f��zA���f���84\��+�Y����o~/�=}���W�.���'>z~����i���;?|��������_���Sk�>	H@��$ 	H@��$ 	H@��$ 	H@�@�H4����}����G��
>,|��_O�_>��w��[��'W�
���P�����>;,{|y�������~SACYc9��$ 	H@��$ 	H@��$ 	H@��$ �>"���>j�_+	H@��$ 	H@��$ 	H@��$ 	H@�@�P���c�$ 	H@��$ 	H@��$ 	H@��$ 	H@9P��s��v	H@��$ 	H@��$ 	H@��$ 	H@�@�P���c�$ 	H@��$ 	H@��$ 	H@��$ 	H@9P��s��v	H@��$ 	H@��$ 	H@��$ 	H@�@�P���c�$ 	H@��$ 	H@��$ 	H@��$ 	H@9P��s��v	H@��$ 	H@��$ 	H@��$ 	H@�@�P���c�$ 	H@��$ 	H@��$ 	H@��$ 	H@9P��s��v	H@��$ 	H@��$ 	H@��$ 	H@�@�P���c�$ 	H@��$ 	H@��$ 	H@��$ 	H@9P��s��v	H@��$ 	H@��$ 	H@��$ 	H@�@����a��G�h���$�'a��>�j�ThQ����%��$P���B_���-	H@hi�!Z�{�����~�O���hm�Z���z��N
�[�M�!p�����W�
o��5,[�,L�2�2u.��O<�D5jT>|xYEV����Wu3fLe�\FEs�w�-^�8L�<98���)#W{����_��[&L�P��*����;�r��r�����\������������~1��s�b<���%���x.��-g{7���������r]����+h(+�n9YP�P��v��_����:��������!?�^�����f<g<W��Y�Rr��L������+h������[�(P��;
��_�j��UV8��s�_z7�S��*#�zT�����t�	����.���wLy
xL�����U����7��������x.?{7�3���DI�yn���7���9����g�BAC^'d���EAC�d(�G� h�����������-[��!C*S��*J�9z?�������k��Ae��D99�;�y��,�z��N�o����3x��J��2+����0��-g{�y~������\����;�������x�x��8�
e�:���9��j�9�o9�_r����\��v$� IDAT�xn��'��wC��F�}lB_���+�1���*h��;���FA��w=�j��>��$ 	H@��$ ���x�����wV��VT��$ 	H@����}_�5:{��a��?gW~Uie{B�'4�fL;)HACoP�;�
��Km�$ 	H@��$ 	�2
�����$ 	H@hi
Z�{v���X��W�$	>�������o���w�#�p��p��C�	}�K�
���tiy���w���l+�����O�_\��0`����s�������o���]�}�+���5�~^
	(h�0$ 	H���&�tzX�����>8<����U���>!����kg3o������6?�!������������w�;S?�������?l]�9��^��O�	]8��~y��0���
�~��N��w�������=�lj��rsXu��������� <u��]R��J@�@�	(h�v�Y��&0���O����7�',��������^�V���M�?<�%�	[V,k��������PX��_
����Qy��D����y�������?[W�O�|U�~o�}���]���>���CgV_��.�0p�Qa���1,��ow�����e�~@�@
�1
4|���>�������}/�9a|x�+�",X�$\y���5g�y���"h@�p��������s_��w�6���h���g�;-,^�x���^������>~@�!���;���$ 	tE`��g�5����n.�W������U��~���a����>vGOn��{F:6�:|�����4������
=���*Z��Y����}s������}
R�y�$ ��O@AC��c[�7�pX~�a�����C��=��#a��?�+0b�W����}=��I��dX��������f��]�Bw?������+h�T-S�H@ACulBAC�
_����������~x�����io���W���0n��0��������0t���i����ozU1|X����F��|�����^S��p��W�������~b���_�Z�!�^�.��5g�������m��q���i������
/	�G����.Nh��'�����	���	(hh���r�������C����������'�_:&l��.<x��a����>���C�Ql ���#��n�F
�}����'��}������a�����w�f|`vq���������������K~�p�$��������0�V�A#������l~Xy��a�
��]������w�q��0�yS�����<|��0|��0�m�A#��j����q���6-�|��0������j�]�{9Ub��Qa����}@X����
������N�3�mpX~��0�����s�]F��y��*�k��	/�+������v����-���Cj�
C&��Z�N�N8���u��������O�������q�S��:���X���M��}��/��~`X��G��#���sB���G��w�>=�_�/N�h�/{��ww��a�S[jO�m*Nh����aSF�b��M ���9~7u���G�uw�
���(lf��mE���	kk?_��wh��'��'N(�=��������_�����Q�f�e��M.N���a[����P;2���#��/�[�S�4=����K��l��>�~�$ 	�&
��/����G����B4�v��ea�?�?���e����������a����vdnX���{����_�g��)|%l��`���_�@-������A�6�?7���7��g�$�:��������|@�	
[�/	#�:5,����yg2i�Z��-,�����|��V�-�sjXu����?�:Lz�����#��W]������������W�I
��;p�������:�:�����[X�����	c_����������g��Q=�L���7��]�;���/�
��Q�{i���M��v��<aRy���,����5��0�&����������w`�y���g����0l����/�������5�3?������o��7��{k��1����<7<���*��g������'L��a&��>�
��������w�X����o8�����j',���k�?��>�9*�����=�N�^��n�����F��g��P���Okj�;�fl�?�����eb���D%���g�<�V���
�upX�����A��1����
���0��_��-*�g�E�<�6�j<W�����}����x]������>����t�3�������^����iV��a��A����G����3.l|���M�]��b����\�i�~��wj>�C�������w?�g}�K�*4T��BP�P!A����*L�<1l��
�l��;�	oz�Y����qx�+_.���p���������p�}��������\����j'4���O7�27���^V+���~��p��G�+W����q���?�:^�	�?��Z=��9=r���	���	(hh���r������S�c�_���?������aF�T���qS������#����~��5a���1���%�
3?xXM�pc������
[�m	��gq������f��s~��<���a���m���%���!<������}�=l�������+N#@���������k��!L}���f�����~�u����p�������b��������P!����G�G>ug{�����r_!@H���������p���m/�
}^�����������0��3��_-
��~��p�9�����_X[�4�M��{������c
�������������k�������������C���B�A�0���ah�������/:4p�]��c]t�����G�����_�v��V]�xqZG�������@3�%�jb�a�M+�
Yu����������������l����7���_&���B<����M����������<�������9�gds���5&V�>Xc<��[�d|����$��4�f�X��"0��g������a�I�+6�����C��D�5A���x!
`r�#������bC�
�=��HX���k
��O�~]2yZx��k����;��_x�k������Wl��?��w����7�,���w���:�:����������D+~��0����|��a���9l^2��`�t^}������=�������c�<;�����������}��0�&@x�'�
����z\uYM qS!��o��7���9���xzHxj�
�h;uZ���lR?����6�g�-O,	#fS��V���>����co
�Fv����8��jB���?+����I��DX�_�	�kL�U0>�UE_�����1�{Ym�|qX_����.���{}����w��;�������u��v����~[x�����i��~�_����1�<��0x��������>������������M��eI�>]��c�~g�Fje��a����l��Z�.l���j"����vO^2u�g��`{������^����_��x���/���}������&���a�%�	������
�j��h��:����C��b\���>��Cg���9;�Q
q�u������0����>���������[��^�k1�5�������]�3���k{@�D���y������n�W� ����TTRAC�
��_�����������������{��}�������p���������������>�Oa��u����pmn~�����F��M��k��Qa��F������gXrW����?~��_�w�����U��gM�K@ACwI�9	H@��N0�u��`s������0���1��F���/����������A����}6���GXs��b�9^�����?
�j�K�{&�3�� �P�dF�{��������`�>�bz�w���iK�h����w��DMl�!Ly��b}������!��m�����
��QK��x����K��.
~���eu����iZ�����>p���)���A�r\���7������/{�+�)NA@���{�|��������
�}��p���&�ff��O�viQ��a�_<���3����������_`5�vB�����A��8���ad�nk�\��>��_�������n(�Q���-	{����4�A����?~�������-p�����jb���^o=�&R�=>����v��M}���a�SaQ���'���f���d�f��S4���n���sr��/���
��E�=}�HF^��J@�@4h"������g�1�������W<�7�w;����+��_�1���(a���6L'��=a���F�9!��=������6[w;��0��g���ZX��7��1�����w�P;��C��b��[���8]a��������a����S�+/�8��������?��ALT�n��v�^cu]�v�um][�v����.T0����3�>����~���N�����9����e�}%[�$U�@���H������I
tM�����N�2���V���s�b��:D��m�,�w_��vp����v���,^a6�����6����Q����V(W��'l�
saG�IK�=.�>�9�5�Y��~v�'�IvY���T���|~�_�P����+�	��O��8���d���]���W56O�F�i���|}���im�9��?���A0�q�A�>0D��������c�;s8�WE<9��t�kw����a
���J�����;���������������+r,�<� �WXQ"��Uh�����w�>�)��9�h������n������x���?s{�r���)k���4������
0�lB�"c�V(������G����1l��@!?
GJ�$|��Ppf�4 ��!��+7�0j"$,'�^A0A�]��G����.X�c���:�kU�)=��Q	;�G��eaog�6kr��!�$��QF��"�$Y �, 
9eI���$�w,��p	�'����r��4�4;��Q��BJ���
l�&8�+4d�t�G

�8��|RR�)4���(�X�a�3��?�y;[��0��O���Yv=;��$�,���@��p`e�"���o�kX�p�����(�h`��2���@��U�����$���N���	��Ck��a���@�I������E�,��/4QjMU�2 �4��aKPC���G��
\n�
�����Pg`
��)�����������zS�x���2
a?S��e�BC�q���mg��Z���b/���:�v���f�����B������2�'��D~p�L����,�����}ID����O�����z;��_:.������z"Y@��d��i	h�����.(`'=��H�%�`E����'��z�t���	�S��������O	
�X���:�������X��ktW:�O�����m%�*��P�-�(
s�NXq���a������xB��i���P�0j������F{��dL�Fp� ��B�Vj@�a|O�7h#���@C����v0�`�ol��3L������D�u�)G���C�mz!�B&��M�8	��]|�PP`G>�2dt���I���?o�Ph#5y�A(4P��)��\o\( �����m�8LH��3��Cz���(����������H���� ���c��O��E�Y���Me��P$`���D�*D�7��(<��%�����t@���cf9v�P������
�+e4��M�?�����`9ZN�aR_R*iu+[�w.}4�9�J�����Ph��9*�S�B�����B���1�@�Ph��}�v��#x�vE�{Mp�
V��$��R��d����4��!
h�i���=.��os��0��7��}�Q���{���W�x���(���B���3��/�{���|���E#Q�?=}��������F��"���$��$�!'�)�%Y@��d���8�xO{vQwCJ|�S�{�����9���z���|7��2�
h���6"�Y$|����q���~*����(���O�����a��x#�f����� %*Y8���X���@�i�Bt�?�6���c��p��=�#��5��JjJT��%�:��`��a X
����ic������\�T���[����@��Xh������Vs(>�N@Q^%RV��p��O)4$x����
����e+�����(�F��/����_^B~\<.p ����0��d4�8���(WV����w������;a��O���4'8���b7��,�V7
���	u
��j�O4(l����F!m���p�L9�U?X�CIE���>5.��X�a.�f\4�}�Rh>��6.�B���M��d��r���[����/Y����I��=�qt����Nuv��������+��|������a�X��W�7�p����I~o)���P`E�*�P�v4K�z����3XM\,N���E�U� r�w�N�������	G&�9�$pA���(��Hpb����)���%�"���j�v�.B(70�!s�f�w��L��@�������<��)TM,��*F�����4���Y�9`U�b���0�0h�fV��9TFJd8������}TQ!�M����~��^�]���Z��j����!D����D�t�Q��Cdd�?cU>1�=��%� ���
��@�T#Bw�I�%X�����B�ma��S6��8a�����c����2m������)�)x��2��c�L�!�?*_�:U���V�r�;I��n=u�� ��G��s(OV@�)��D!X�"��V�F��b���7C;��g����4~����37�hf������A���8�[���-�8oX��B��`%�����o��K���&q�����4����-�E�@N[@r���W�40�a��](�T5*��Y1{�Z�o�� ���c��mP'j3�U������)�����CU,]���)HJJB�f
����/^z������u����0�o����R�
e	hP���:+Y@��d����CN�EGAp���*J��Ny)}l��yai\���R�$H�,��� �	��ey5������n��U��g[�n5���2����>S|�&A���"d)t�Z}�'V��p	����D��yr� �qv��7�2����]nzG(D����}p-7����, Y�, 
�`�<�T
����C�N�@���4��a�!Y@��d�9`��tHA��G�@K
�q-54���[ ��i\�(Y@��d�����=�.�)Y��Y@���e5���a�>P&�!��6�������-��
�}�P*��/�"�=�$Y@�@���4�����5� 
g�J-UXH@����q��$H�, Y@��d��$H�!H@CR*F��d��$H�, Y�?a	h(8�(
�Ppf��R���4(��K�, Y@��d��$H�, Y@��d���4��!�b$H�, Y@��d�������3�� 
g�J-UX0�`}:����=�����A[[���9�555����T�����D�Vuu����h�"�w�_ll,��������,0e(�|�JNN�kjj�����*�|g�)��M���"?�u������7E���������wq�bi���]Z�)�����S��E~�I�9i.��
J9��_!�������W*aFP-e�z�b������������9�H	h�����KR9�r�4T+W,�����SRR++��.:��]]]�t�)�U��;���R?��.�tX����dN��k�S����R���"�wE~�)�|�{]Z�)�������������
�u�zN��+����?W�����zNZ�}��)h�*�|�qR��i IDAT�����������JVN�3�Q�}����VJ��,�g���<3�7W$m�+���";|�
p�����b����/L������&�������]Z�)�|��s�zN��������7i=�x�7E���zN�����S���4���\�@��/rh�M*F��d��i���������75�%���{�Me���,��!TUU����^_BB�h����woK^6 ��{^�9'�����$yr"��.(�|����,���a��z������e���[n�.(�|W��[~���z/�zE}�)�|�9���7E������_+(�|�qW�������������������������7i=���s�{������^�~������������n;��|��;:R>�r�
�t�p�#b%\"b�/T��T�O8)���E}�)�|W�����w�����"�wwE}�)�|�1W�����wi=��'�r����KQ����������*X%(��MZ�)��M��R�����������T���Pp�Tza�^�
�l���JHi�33�`����]�W�
i\�b�K@�b����{���������+o\9�JiN��o���"��o�K�9�\�IO���$�!��eRI
d	h(8�-�0)�Rza���*gZ*����*ZR���"�wE~�)�|��	hP����!����e�$���I�9�|�I�9i.�<w����|��s�z.����P�4��v�K@C~��R
�h�is��n������f����AZu��&��q�����-�/��S�=]���s�<� ���t;U��'�����g�I]R%�
�N6�������O���R�p���H��T����_$�����������5�����|��Iv�Q��u�jSn7f[HE���v5R��$��������o�Tz�+�x��H9Q��5�-���}���3����������mN��e������9Zfv�fo����f�2����x��V��%�e0S����/��+r[6��y=����`]"<�bp^�X	h�+Ku��, 
��!�:�����6�T�d����iNH�7���|3RC
�$�!�Or����A�c%)�d��k	hH?6���jN�L>��4������H@C��_$�!ggT��I@C^XY��?g	h��
�����4��A��$H@�4$�[H@C��a�����%
�o��� 
����G�@���4H@C�����2	h�����Y��T	h��1��	h���@����1~DQ����Q�R9T,W������k1y����a����02��/M��_�������������cZ�H�|������E\\�tkkK�/�B�/Y S�G��]���	���n��7�'����
Q��+�/�2��Ak1m�Fd�OV����>[gV�4��l�j�Y������m6�����/�.73[�`B�)�nHZ5�+����!���Q|�����������)2�s�mJa����T^N\,
���mKk$�'B�N�w��,��e��X{�������TN���N*�/Quqy\p]lE{���B�@
;�~U}���T0B��`�Kx�z��Q%qg���*�k.�4�@�u������t6TRU�McK8t������>%5tJ��`^�g?E��wc")4�
u��3q{�T�7W�M��w_/��gi��������s���L�L��r�vC��;0)��G{�������|
���G����LX�+K'���8>�j��#�Ps�t����W�_|u�.�1d:�
����$��_����r�8�t�^�	��������;>{���We���G|d������E�$%�����o�����)'�����`�W��_�����6)m-u�������,s^��(^����Q�hm�=����g_��Z�&|�u�J~h3W��Glt���a�Y8{��e�����UH������-��Ey��&BOS
���y���abg�����"��:Y���+b����J��Z�v���������v�K����!��}a��j^N��P6��f��H�������?��v��X	��_!�+��zd���Z
�����p4�����}�}]�A�@�v�{{����J����2�m��������|�E����+4�GLD
�]������$g��J�(��@Ej�1�����l
���F�������E�y�pn>bbR�@�Z�����_��BC����R��pj�����6��U�f�����t�	��������w�t:t���$>v���8hT��E��2���e]=�;9��b��f�zP���vy9
4�M���
�����ZTn<9�m����!'N�v����Z�V[
�B�&�K�Tj���WP����7vf�o�L%[M���������$���5~DBd�qy���Br\�y'���/���,
���I��I�a���1e�`����7���������?.\����[}��_4�'$�b��>`x�������?�����+xy��I�����F�v���_�$�l��
k��4,�������l�KN
_RwF�~���W
������<���K���1#;�l�S��s�dh��g��K��Su~�	h����
�����.)�A�Y*��*{��|���:.t����� ���2\��������*h�9����O�'����bh���q�e���@�AI=X7��F���������h��}n��:����5\���5s8�4����������pt��.4P��`������9:`e;�����22@�������n�2k�yIX���g'w�
�|z�5��p�
\�k,��c?jn�����u���7���Y�(�l����E��x<*��U
~��'n�|�s
hp�6Fk�{��p@C�f�q��L��?��������aa]�w��i�}#l�z�B�o��dTQ�����p����*2���-�aF�r�c�#4t���@���!��a�U�����!5�g����>'�~���L��+��>�o����<*z��U�$��j�h����M��@����M���?����D�:������L������j~�VHug�9
44n:gh
T��@�h��t�������(��C'u9k��B�hH��A���K}w��}r2���v�6���iyrh
pG��SX��o��9�at�PSQ��m
�`W��������w����T�Ix����I���l`%�![�=��$�A�=Y�!�7
��?��,������0�7��x��pr,����A]M
�I�>�;�450e�R����)�'�]

�O^���~�W��Cl\<�1����#�BB���{*�GQ��"����Ed����>�|�^��o��t�Y ���*��ah�����������=�����p��F��JJJ�~y+��4�t�1�>c��m'����0�D�*����W�`O�����������wB������r4�l�v�K�X�{�P}p,��>K�M@�i;�����������tug,���K�1(i��:1;c�oX�o)TU���ac�L�����Y�;/o�)44qi��5���zO����;�Y�@K]�o�������lc��������=� �����V%���b�{}�[���EQ��a����P���^�
�8z���������e5��up_e�?~�h��_q���=��X������hX=d=^�>���Fo�����B���:5���|�H���o>��8[�i/��c�����_�x��h�����$�@��tZ��"%0�3wg��S�Jb��OZ��cB��0��APl$�X��`��UO�+:$��������9����J�/%%<]��v:B� �z�/�qpQ����[�[�P
%*�9n(=��p�k�i�Ps+�r��gk_����PVS����0,�/�WRV�#����(�Vz(���7z���/�M*-�s���5�`PJ?]�n��e����p�H����"�Hq������I�����fP�Q��1�4����T��k�����H!un#�9p����r/;�D�f�MDy��~�x��L����G}x�E���#�U44��qo�+��h���
���:�Os��s�o����k�#�f>E2�G��k��fI	����<F�<�Q��J���0�z�[��bE��O
������I�+��C�������H	�B�������hj
�\�;�8[��g�a����M���uF����1bC��z;����������M�o����D�y�p�FP������z��E(��sA��nG����P����^�_��x�ZJ�F�E�C��j@��S�AN�qP��E�>����+���:��?�-z4���Ec������2=+����?������8;g8��4@������vK!��#���":����F��}�����cD���^��� ������"T)�����V��������{Q��z�^Q��]q���nwE���j��3*WO�
�S�>��PW���������:�(�3�m�� �Z�����aC����t����@���*��u�o����T����efm��7F�������82�����$�M��+.�h����fa�����8�=u{5�S�qB��S��0���4�0��R�ax�2�s��|�cA�x)����m�'�`|��B���_(�_u���!�*-Z|����U����q�Q��N�����1m�M�A`������oQh�*T�����H���Fvp*��o����eT��*~Jp�O�[S�P|v��<0��N�x

zP���v��x�p�
FZ�]<��"|Q��hi�g����@�������s��J�at���2�C����s�+�;�w$���zR�2��yq���Ph�Zg�<��KP�rC��+��	
������Sd�TnLT �_���a��M������)�B�p��
/�N�~����
�!����1�P�?�����z�������&�6�M�������RU�Bm������	���6Y��������u�n:���(R���j*���������*t/��x��X=���$�o�N���77��[���7���Ez��
����i�n�px�`��W�����*8�_�b�.���'�ak��.��q�yv\�Im�E�������"����1��4-g��
!&>	�)�m�CR����&���P��+��,cZ�N�7��i{����BCsRzxN*
���cJ�2�.�w�l��
���������5�1����E(C����o�)F4u������<z�"�zXKm}�)���F�c�17z� h�C9��g�\�@`@���Jm�(�S@�WN�6��+LH�4��V_�2����;�C�
�s����o�x��W��\���`���x��E,�a���v;;?3"OV

_���P���A�JahTs��8���g��P���v�rP�R%��3$���<�.��D���}ZD�B�FU{�x�!��7t{����;��+��S��kD��H�2D���H������E�A�X'[�=R<���[�����o�e�Z�2��a�cg��TG{�?��}�-�y�5<�k��]�����,����8���
�i_��.��G���IS|����u�oN�1����8��{�?Z�6���2�,Uqs��B�)P�T��:.J��g��2��J
�.��S���p}o86���:������wh?�B��U��6c���(�&jt2m�K��)��5,���]�	�P!�6�g	��O��_������i~������@X��;����G~�%����[z5wP��
!�t�mj�����Z���!R!��4��{8H�%'�G����	O�)����>��SA��2��\�&`����q`~z����a^����[o'���� Tji���ve��x�	�h�����!��cTh�����]$��A��g�
/�x��B��~['�����6�CTH����?�+f6�d�8����_�#+��\��(l_M4�����w��r.��Ik���Q�:��h�>�5�[��$���s�P�!��������7����(Fk VpPS�&��R(�F���
��!�q��Z�B�������_�ta���f��5�Z���A�VsI�'�����5��V05+�{

5k��#ZEEe�h����c���D|`
���2�%��t_I��z���x=�����������%�����!�#I�y0#)���<��3PF��D������c ���`4�_(	��8������:74��$���B���h�9L/�)P+����o�~������!������
(�s<�T4*U{�1�wA����D������,��qzV�A��Zu�"��C$=��d�~����PhP��C��W�n�q���]8)����w���z���phT�5'g�>D��$�cu�
�BC��gx���2e��&Y
�����/z�N�u�������=#��k
�j�����P	����:���u(�D�`�&�h�gT	qa��p�Xg7}J��a�[l{|)d����':��Ee�"B��_����G�b.�Q���c������$�U#3����	z8�
�k�}7��dO�hB�y�{+��
�+���_�}���r$P�\z.�}O��	����1���q>����,<�5	e���������|������(�x8Ti-���V�<��������=��Q��h��`Y�9���#��98��L�Z
Q�����nu�Z���������N��D�s{�Ph0u�C�� ��qqM��+t�������xKk�FC�M��,�C�h���v�QU@�������0�Ax�s"Jw�Ny4�LM��?����������j��A��	��}I3���F�{""'��Y��?�Z"�w(;�����ie'k��#
������cg.S3ZP%����a@����]���-����eK�d1{<q�'�^�s�&<z:V��J���`������=W����� �f
Q�jy��G`��S�0��v�,yz�������y���h�u���A@�_���1����T�X �����&���=�$s`���
��b������r, �!(2���yf�s�n�	��U����;��XN�������V]{���O
�
�Ft|�\��
���R`8`��UTw��[���{��;c���.������|�#V�\'�2ia����/�����p��9��O8�N�����S:M��^��b��1��z#��?��%0`&������,lfO��(�<������
���J{L����%k(2�*� �L��_�2��@���s{.L��_��5C7��_���b+��B
�_���u��-~��^��IC�@���G@CVc��Iu�G���}��~����wJ{y�!����m�)�AY_�����
�6-���$�K���J�=Z���?�������z�U�b��uH�s�}���J�,A�@8"_DA�\Z������{������r
���!E�t�ng�X
St3$��]��!����Uq��M�� ��T����E-3r��	�AV;�9d�����[X�>�F Au��F����
�ob���s�7j�u���E��+���`E�8�xQ~9Rgx����d}y�A�JS�.�9��vO�w�
:���F��]w[5\��8��Us4d�y��������=L��z�t�U�l�-�����1�.{!�"�#Qb@Qjja%@�W�z�M�?�)|FBh"����K=>>�-48�uD��(��	@�E�c`�7�s�^������_� �'��Zx# ��e�Q���#'��h�w���r~&�����&������(R�^_:���x�N����C�;���}I�8���f������J4��t��qj���� ��:\(:T�;��Pm�$�)��(��g����B� *�[<�\:a"J��M�&�x��p�s�>x�g�
�_�ssG|�=�'��o��[��hhK@�����0�@�^cpk�
{�N��	%w�+Q$�|tf/���� ����E���qnmJj�e
4�<�OnS�PX��h�� ����y��F�=py��t&l&40q��!0,T���(T������ IDAT���[P��Yxvj��=H�Af����:
F\X��^>�
Z��h1{+��lM��|s�dZ��m=?��l�E>���{�A���v��!�/��R�8���u=�a���(d�#��9�l�\/�{���`�a������&0j�U���9p<ac�������9�A�W^z���x�]Z�S� ��f��:������#��C��3���������������B�^@G�:z��c��I��
����b���ui��!��>�7����$�}��m�M�r���u�������@����|z�p��P=���Cl�v0����[��g!"|��S����0�����#�n�a��%b�������)`H�z�_q��8�tnM���~%��=}���w����1��m%�/�
< Sh�v&%����#iu0�������}��sG'�I�E8��'u���3���z\��}�B����v�7c���i�Kfmu{H����p��R$��M��8�c l��bj^nmF�����w'g��5D��	�h�u
����]V���~��$�LS%x�'��@��W8^X`n�	s}M�ic����X�0b�q��FR������|,�+z.2�0�� L�4�Fk"���K��/�F���1��c?p=�����O<��h]����������0l�-���:��A����#��j����X��2f�}�`fvq����������+�
(c A�����=7=�q��7Lh�T����ghX���"7�i�y��
����Vh����P��i8~��7���}���=JrFq��8tk/�3��Bz����c���N03����c1n���[Z�}����ke3��d�;�X
*���%A�GzB��L
����ZM�]� �"�����Tm�Z���Dq���D�����QD�	W^AtCD.9�����,9���Lu���2���40P��6N�
�s]�y'6��!g�:�w0��y�����2A.��qf]�������>�{uM%��I��F�p������_5��%4���wr�o��rz��c"T�5���1�����\;��Q[��
���D4�o����O�;���������h��;~�G�&z�5V���o����P�!�q.
�~����������P���@���Z�L��!�A+a�HXV['�
h"���>��������7�E��?p_dIV�I!54�g���Tn��0�d��+���L�3~����/ZX�@9�c����H�%�d�,7Lqq���:�J�_�q��LT����p��q���D����j{C�ZL}J�O�3G5
rMd�}lGu�9��-�q�x$��E����D#�4n��U�1P����X���0�p�l��3��8����<�/ZV@C�.�p��x�#��K�2��5������L\��B�M���������
"i
��������/���t������L�x��0��bx��.����E��kT^G����A����Sh��7����jJ�#���
O!ha8�@��3ZY�(������[*`�ZG5m�N����p�������J����>�
u�{.5V[����R@��y���������\~7��i!��PA����G$�W�RB��x��PE��xF\��i&x�:	!)��Oai^%���:������ 
m���]�g4$���	��
���&��(tz���p��n��C	*A��#����kO�A�{8
�n$�O��@B������V��#��@��
���)��x(��{JP�;t���($\��
2�=������)��bb�����Q����v�V��r�B@C�����!�45�h���<�#��JU�_�tli-|� �Zm(�I�<hp�7o�OC����/�{�V��������RT���>99Eh����)����gQ����!��P�i/������5����G��	�����o��/��B���������0�Bi<
�k�g�jk�a@��dUeh(�x"�]	,x
}sz�&X�������*��Q�G�&#xXA��6�(���@�&�@pl3�BO������}�	JJ����-(T�3�L`����T��p��u:D���<XUh-�|�@��kp�pT�w��i��t0�awP�J'�,�@�:��%`������Rjg4*
��;����-����
���OvO!x���/������V����!d

������������`�Z1oH��7Y�Sj���0Q���X������h$Q�+|g/L�4|���k"#SC���h)������������M@+���1D��H0����:����m�����~0m�a)���a&�N��h��s��3Z	�����o���J-��B��\����
�B��\�"F��I`���7�^����:��M�:��
4���Q�l�I�����O����.l��_v����^��]�q�G!��Xy��5;�����:b������9�3Sh�U�n<�& ����
��"b��rM����p����Y�(E
���6��)��7F��T�F���M��kb��������M{��b:�S�he,9�}����Z��.����q�hh-��U��c���Q�����la�&���{g�:�.�5�V	��v�X
2;��2������:�$���|�	Vf�T�
��1��D\w��q���X�z
Y�=�]�zq�����#oy�!���BF^��BN��P�m� ��CD��B�4p��\jf_H����}�i4�H�#;)��u#�����A
rr,���i�"j�������]���$�,#�8p�y�5r��B��yn��R��f�~8T!�IMa "�E
�@�_hP��K��M�V2���W��
%�;�5�5pg�Ch�i�D�"�~+Tx����Rx0=5Kf@��~GRP����B�"�Y�%n�z������;0*c�&�h����@�����MfUM`R�� d�\�`{�� BC���F�L�5���W��B���x���3S�������n�}�����L:�aLIx��G���ZO I��4(��E�u(�Im,��J��Ck�B�U$�D�{�SQ��w�
h�v8�j�?t����x~z�8lB��+4��G'~����C�S��q���|M���4'�,��u��0L��^�K���,��j'�������vvb��3���=�,Uw�.N3Y�?�������B�9��������n�
��q(���7�")?T0ggC�Jua^�ND�:����������@0 ����O��I�Ar���m8�{_���C�UUS���-+����l�A��m:����.C�����<����
��2� :�G�UZb� ��-���P��BqB>�L��-lfW�!AE�J�,��"k���=Q�b�Q�%������hX�-���g>8���
=�����Q��e�`������5E1v�B
#�����7Q���2�?7�	hASM���y�)��V#w]��������ep�m f�P���lPoB�h���]w_	�!;�[�M-#T���7�}y%�l+@C����;���jRGA�>�c 8O!�>����*��`U�<��nF�
��I��a^��)���><��:���p��Z����N��I
3����vn��f���Ia�P(D'(}�� +1\=;������h�]��~3K'R4P���]qM��������p����/- ����
�j�D���tu0��F
!�x���S��P�6�K8����s��%�G%�+�im[�6vJ�.��>��/j6+@
v�tp�@�H`�{t:�l�06+&BRT�>P�:�N��������pqt���z��)��	4��cH�����,�b��0���?���<Bp�������]�;)&���@�,�`<����NQW�����a�6��g_��ybg�"Pa-}v���BBy{cR�K�9�'l��E=+�0�J���Z_����R��^�=�B1K=�"�N20AK]{T�c�����5�k9��[.<	@��EQ��6_z-rh��4vi�6U;����8ps�Ph�}�T{(����0`y�R&'MR��i:���>e!'X	o��M���[v~fD����/]�h5+�DR]H�@�2)m0�����/���&�jCc�����nAXD.>��^�+A�@��#��a�Z-��Z��	S6�B�?�
�����E>U!��}Y���4������Q��&.m	'���l&�
�W�Fa:�f����av����@�,o����He�2+)0(�������N��Kc=.�"�a����%�a�?+
\��R5uD~�i%Tl��-R��J�J:��F�h����8���`���Vr��J����BP���AT`���h�=�v��{��go���
��� �c�~��w�B�7����6R��?����8�>�raY�����KjX����4t-TH�����9��	��2�R��WvY_^'`�nx>���������0��c��Pt`h"�+�B�F���(�J]�����dz/������PX����D>�Ap����?GVMx}/������b������lk1�u��q���������<�����xe6�d�.QMv��c�`r)cV@�����E8�UX=�4i
���N��D����k�&������\�@�,�D������
=�K:6�}q#��5�������Nsw��](.p���h���@t"^��x~�#q��DRn.�
�/�;�h�j)D��!��LhM���@_�>r���6����BHx%�a�%�
��iM�#����Tn�]4�G��=�F���p#��L�(o9
���h�C��34����-#0��@
���j���t���T��pf�����
hxO>��kt������A��Nz}�!��R���Y7U��S�)���\E
q������^�F��[h����H�"	��o�K@C�����3�������p������
�<<O ���	);��W��^@�TT
�o/���_Rp�[�7o@YWj%J%��4e4��}qAP�Q��#L��pq�H�m�o�",�)+�O��#D�jH�2�����*�BX��=��\�J�l7�S@+.l$X!���������$��v%+c��-�]�+��*se����j-io:{�&����C:H��������)�fO6;@�)'i@�W�/���J��Q��H�V�@��Sh����W&y~Y4�Z�����w0�= �����{�E����wv�H�����%k	���	:C��M"%g
"����?.��5}aR���J�r��� #��5�����.�d��r�Ti�Fq
�8���o�m������)-@��h��o�+����m��������I�
��J�j�+m}�F�TI*�R�7�K����V���-3�L�P�����,�Hp�����8{�!a9�G�0�w���;<=�0����_�
�H��n�J���8�U,{;��I�����������C�(J�4r�����H:�0����(
��!5<�X ��>�����\�F���7����Ia����D��=p��An<3�L��
hX�gi�k�z��]W�	�>
~�)
��qD�����S�M��S)��<���7
*B���m;��,F�����$`�u�W�S=�z��t~=X��!���xo�K��gYw�*�eA;�>5m[rd�4�'��BM�;�P�X����6��)3���Y�a~���Pc�"B������-�
���s[bZ�?���:M��Q�@+P���C}�w������u�n_3�N_�J�gTh`I��X�t)�D1��"��+�_Y�j�{��M

1�s�0)T��F?��}AT,
�Y�1g�j�0��D'��>yog�i�L/������;0����h`%���A0v1��m���9�+�.7���`��>'h�����������>����

����w��Zd
4������
^Qwk�:B�60\�{O�L_�(dD����j��(V�����*�>��@��w���2"�I��:���7R�@��'�^PX����I���^Q���+�'��a���������
�P��Epw��Pl�����-�t��|~q�3�7���|��
�OVt�:���++�+��NNt���w3���@��4�A�nq !		7�@�q)�]~Rh�1��E�
�����3�P����������:��9��Ug�-���rL���
|��*\^:��� U��4�.Ch�;j>��(Rn��m�^'Rh�k�k4E����H*��Y@ ���;��7��5~�&�Mp�,�D:���cqk�l5�	e	������2�oK"i��U4��
=�c��=k�E

lC�R��}k�O�
/��o���9Q��@�R���b��*4t
i�CY����/�@�sgx$���gm��	�J�$T%��mM��.4��
�n�:�S��B��U9d���zc��p!��CSp��@��#8���<����	n�040���bQ�^	kxPh�v.E���J �YF�%�!'��]w_bS����f�&���OO�; ,6&:�p0��iR����T,&�Q�qK�?�������4�j��6.B� ��I������d�R�)�.�/I���Jo�@<k2Qhh�������;���w�%R]�/^�B&�F�
���C��Cp��T��+n_YE�)|X�0DF������H�����O�F9r�?��E��`H�F�18u`I�Ou�;�2+4<�+�^<=F���E��f���4��N�]|:y��+����0,�i��y���7N'N��a7�#�H������������^??+�o���c��{r��*r���'����8�I�q����f)��6?n�k�
�C��d��Cvq��
zm�6���<9��	�	�s)l,����Z)t����p��z�)��}���\x���kf

?�t0�_*l"�a1s�+�;Y�0���C_�������
q���h�S<!�]d �H
)2.Q(*�E�����Y��P����X��/Av�:�W���1X�a���"��qR��P%�nj�L,�]�H�!7�V,G�4g���;����0��(4���{���I���x��6*D!E5��:� ��+��0��8��{�MY
_����W]�����B����lPR���B������)4��
�3���.$���v���"T�<���y�k'�^���������@�$z�KF��6�:�7�����kt2!!���"�#���p�2*4hh)������%#��}?(4pyFA����'��
�
��a�7;�e}�p�$��5�R�`y�?I�������E{�V-�&5�a���!"��B��i�b00W��Q�������V����a$2Sh�
�� 1��P `u�$:�]��X-��pS�}/ 	N��jB5���
.oM4p=��!#9�<u{�������X�b�`/��������AJc�����A�oRZ�8DG
�l$O���q����<�Z�RZ��6���l�`��C�p���'�(t�~�@��`e���Y�����2������iy�q����

v�ww���9� �hh��O\���r.��i
T��@�0�)4t��vm��R�"8�e���b�F����z��:w���'��v�Q�`��kWWQ�	z'��(#�`J��xZ=s?�Vm�����@k�{���_��4�U`��!`�j+,�}����1@���DH���Qh	��z��I��t�*�B���9�J�M����-q���L7����

���"�B�h�"������
U�/IY
((�{����wlOST`�!9 �r����)��)����F������B�{zU��%�S�ReDoX��X������9����`�BYW'M	�AnO��c��M
�x���@��k��"n����N
W�%)+��v�k�Y����P�#����_�4 IDATh�~����|�_H��*�������(��Z�|���D

:d7}
h8���Qh����x��	G�g�
3��B�K]k�
e�zv�����V�!���|�
M����O���^��)���^���
��������P.�02���RH���Q���%�s���7��#���;a[��R�H%a�7lJU=8�'�J��#8����(�h���TO����=p�
� �)t�M��xvx�hK<�\f�����OR�I�B��~b��u��
)48��O�Lj����T�����z,&E��(�r<�o[��G*_4�����`L�U��R�U�^qu��3I4��X�����.����6H@���N��F
���j
z"\���,a&�5o����Ry's���W�x���(��<\ ��������p{�_��k�H���GO_�h�I�~�h���G3�CX��u�������0|��S���Z�-��@C]���S���8���J:�Cq���P��8�o�r(+#k�C}.N�s�
h`xA�Z����V_���W	����1p������V�8�����)tB8�����(��;c��=�J/��hs1����b-���	#�a�Q�Ht��/�(�-������o��ktu,%��	�`�%Q��~yj����;�ME�QG������>��-����_)L��E��x���'���~�2S,�n<���t��m�"$�������qe+��\@�$GE�^�@���!�F�
X����8a�g�_7��Z�:b94�*�+Q, �Ch�j����?���Na�0��&o����.���v�s��M�����[��

�h6�+��h�K�����`�{����jS:!|�h�S���)#��F}�P�-�h#>�TJf����r����lb������kT���:�(Xd)��k������*��&h�h�����QrpQ!S���Z��zM'R7c�8|D���$��H8�b`G��*����)4�SxCJ���B�?�oC��0
�Lro)H�J��7�;YD�(����?����bp����T���p��$���>)N��TJ�!p�<<vz���,�>P��#�36���
`���Q�Mu!p�����@���N�W�P�X���I��;���P��u�g�|*�\mY���5}U�L��5e�����q������$400R~�3�^R�^��KAi����`Ka-b��!1<Q�R<��D�9G�'BN���E�A	��w��d*���%:���'x.&sh:Q���
�R�3�HdYf��,S������Rh��
u~�5-m$���}��3��v��W�A����z��pm��H�O}��
h`�v����D�:p�>�}�R<X��B��pl�
�o_���!���z��Q''��_��p$�b���@�;��"e�>00P�JC���\�13����]����]1��81�~hBj�/�K�%��)`�z��>��,'�*28?�Q��BN��]3k��yOoF���H!"�������p�+�U��4m#3R���HR�(���� ��l�
�t�����H��@�s��i\h��J���x
�J
<F��� $�����K+K����/���"%�Gbt$.�5�����gl�I�R���G8e�\)`���O�
'�|^��[/��N6�����3� ���"�� �r~�8v�BN�*4p����
$�o����b2����Mpb�af��������:~?r����Px�E���.���$��5K	�������������W��;.S��2�Z>����C�/a�p
�W��%v�����q��oX���v6= �m�4��UX	���O(l����h���/pb��7��s�W�I�a�m��;�<��vV��6��].��C�z���Y����XcQ$�.+#�����a1��8��WT�3��MLmaH�C2���������V�!� ����h?�����;���~���P;�P��02)�c�Zh`{�����=�m2�be�����(�0�w�N����R������'��J�I	S�� �'��j��q��)�is�!�����n�(��� ������EX�d��LL��;������U.�M�Z�������V�����}�m��qw�X�ka:�4%�����Y^V����psk��W�A#
h0�R�$
%�q��}#����Q
�!44r��w��tO�`)74s�F��v���0�0���(��O8T�h���"�[z�6u��"$��/+@���$�B�����2�%0".��0j�m�La0����g��Z���"�"���������!=0�ac��q��E������+`��~���XB�,��pGsjW$������)��RQ3�y�W���o����E*w��6e�hL��p���j'4(�X���&�~ �����N�`�sk���xE���R���������?m������r;u?������+c�
h��5M�Co���I[�0��Q���}��!�3f�M9h�.�?�}�w���4�;@�������y���;"��+ri�������at6Q���h���������U�)�y"��
F�3�
�$���z4�O���O���_���f���L�)��q��%(���M��
]�[�����*i����n�nQA������s���u����V�[l����}��|,*r������|�,L�gf������_r�=c5�3�����B���J����~�|S�a��B���b�����XE�~_�)4l$
�'�7�����(RIO�G��h��CN��U$n %��f�>px4��7k� �Y��`���

�e0�����[-R*4��l~���O���VF`��G����`�t��An3��B���|b�MD�F8�,C7��{ ��8C�l���_`�g�
��&Q���xNEXI��4VdH�UA-r/���Tg�~���{��OI���1 �����R�Gp2�!e;���]a4h�jGV�`�!�N"e;�&�6���f#%��-�V�����Y��R+#Q_���kf������R�ct��U��g?-��
{w��o�rn&lm��K�������Z�pA�������o
���	}p�pa���]J��������wn�'�aA����@��r�?����Y��>�kZ���zN�S|?��5����Q����JZ���x�V�q��b�(�D��8���I�T4�2����$}F�wx�p9�@�Q&B��38��D���nbF�<�@C������&�3�g����
E���z��p?#4Q�7�cd��P��@�P
>�#�b����$����RcMio T(CxmI�O�����i����TIVh��E�����d����bB�e� +4D:Dn!�(N$t���a5SS$�2CW�?y�x���V�ARZ��y��9�h�g)�u�J�&��<R�81���h���Q�I������a��g���:��!)9&A����B���^��C�^%�v�W�JY/i
�V�!��\�y�2(B*
2���xH.�bh������&�]L��?Ad�@������cE�r��1�*�=��z��E��M��H	��H�������p���^�k�%� ��N���@l}tM��Z)G*
a�gl{��"�c��`H���>���hyl|
�k����o
�rY�M����~�/�'�s�V��{O�D�Cxl�����]�h0+R�p��XE��e@������q�^�p_�?���5(���xBL�������w����h�t���X(J*
��\������E�����C��@��PMX�-'"����
Ej����
���!�
_�c0+\'��{�4�U���g<��EAR�X!�
�D{�D:���i��}Trc�mBn,���o"\R�'7%ZM%�I��>�]�����*�	��^�����trI1S��V��`XBY��'G�
U���<�`8���k�{�B����DL�k�8Gn���#����
���4�!��Qr��z�^��+��D���xZ7��b���F�o�I�&�|N*�ZZ�|���c�	��b���YD�,D:7���O_|4|���N���j�����S���$���a�A����[��;����I�A��5��@C�x��g�080� �;��q���)s9�3������[����rB�z���	y����Y@����_J�@��5D��J�rB�g��|��#[����6f�����<@������2��!�K���8|+�o�����������o��-�!��(�=?4�[Vv��������NpC�Hq����������:��lU�M����A�<�s��QZ��s}h�h~�H������c�h��u�Q�R���hZt�;�\��A�2�Fl�������&HO��q�U�E�[a�-c������U���P���R��^��NR��$@�]b0����������+;�Oh��e�
?r9����lyi
?�wNM���+��{@CV��-�!���h�h��1�����H��U)
�,�my}
��'�o
�I'o	h���rV|	h�a@C��^��R
(�$�A1�(o.S���St���7���M4��ymV�����-�Y�Af���[Irt��e�4$��4��..
I

2U�����,�N���UF��s��J�)���[m���I@��5&|	h���2#�4(�V4Tt6B�r:�"����~h��[��c�H��M�L1C�v��D��&� %����Iq"I
�g�4�L�e�������g-����kP2��4i2�z|q���N�SD�������R������5�
���	h��%�����������r��YU��U5-���5 
J����g���_�H��P6��W��4��Z��L	h�� Y!�@Fk@Rh�w�I@CF{R�I'
_��4���������v��C�Vh�-::�����<��U�)`��t.U�y�8���
�j ���4�����������q�<��	hP�&�8���4d���,�95 
��V���u��$�!=�$��j ���4��m$�!��UEY&
_��4(�w��|$�A��/
������$�!+jY*�?W4|���c���������}'������hiiAC�t�,����'�����'w��
���O�8�
|�&?��m��k��Q�\��������F�[�*$$D��***r�[N��+����;n]K�XQt||<bcc����i�����iy�L�������u~���.o�|k]�P�7����r=W��j�wG�I�CP���u�,�[��^FN�nY���COmCf�o�ja��}����z^��L�I���SD�}�N���[Vu����Ye������[N���P7w�p����7��P�X ]���{�M��G��y�����7}m��d��.3��5@�8?y�Aaq�t����{��������NL��l�����������*�����W�6�c��A26N��^!)4����lW�`�����7����'&&���O������*����q��+��0rf��>����s���R��"GGW����������`�./�2�o�����I�9��~��s������.sOV�!���o�BZ�I�sY1�d�2������N�1�mQ�������������.����1U�_����	h��*���
p��T�i\������kkk�����W�5i*�����<�)k���<���s�z.�>��IA��.�Y��M�;����<�zNZ�)�~�t�������������=M�����e�'�!��T?Q_�|r�:::?���������������],s�A��m(����~��V>���w]�g�.����wn+�����R�&���<�Ff����[f�����y~���=��ue������`��\�ev?No�����q=�r� ���o�BZ����\z����G������������������_��e�+����qA��7e]�)��g�w8�v����&��^��xR
([
H

9���}�w�I�o<��)��Dq���Re��\s�:�I

�y�IY�;���z�CZ�)����w���7�~~%�������X��s�zN1�G��EY�7i='��r�[�K�y~S���������E3VI�(Y
H@C�ipi\rNoU���R��rF.���%�A9|�yCPZ�I���1+)�Je���
A������K�9����zN�	PUN�G�p�|�/���Wq_ ?���������]�I@����Rj%���*�c���_���`nn�)6kh�@�({�/�6�������O�=�/�0	M���eQ|QU�*�����������6e����aff�SnV4����j���6��6zzz���8$ (6&Km���S����YZnv(L��^@��%g�N�^=���@WWW�U�hPK��J���hF���t9��% T3N�U���M�f03CU#~V��S�=�����e��M���9���wq�S�{z�%V_��_�59����\�g��9�����C���+r�����x] F���\������QUG�g�X�sI������F_���XQ�=u�k�iCO���%�S���7y�*��wy�No���_�..���s����:�x�*�;�����g��M��ST�������4��u������#�<���L)_�v���Re*
YQ�R��`���-���se��,l�Q��AF�gj:	h�@C�e���6rSw�Jj��v|O���&�@lB��O����y���J��t��Po�O��G���-�����UL�[���Kb�b2��b��*���O��a�`5�������z�C���YP�TDN��x?���*'?B�m�\��O�_��sk��_��|�K �s<���Km�������0��h�Bln`c�2~����$�(�]�W� ���5�XC��S�Hz�������B��A����
U��s;�
����mJ�e�e?�C�M*
���S����2�s5 
�nR	h��]<;II@C��#��J2�^����������Z�����u�P;�*W��?Q���hF�!R��4��.!
��s{�dyv�	hHj		h�.=Ry�������� 
Y�%�!+jY*�?W�4������iT-����a�a�����G�s�y$1�}�h����k��k}3OY����JW�)#I@��U�%	$������

;-��}��i�	8r���jkS[4k>	7o�������K�����:�������o�zj�7^"�9����n�(��r��E�
���W.p�8D���K�j�P���/�D�	4�6�E����#]M��"�
���;����x�!cZ��T�������RcN��������033T4�`��/�Y
��#��i�\��o5]#�\����<h�-	��M�i�<��N�A�����&3��1����
@��E��E�h����Vz�\f�n^Qk��m��&P$��8_c����z�j8��^�|_��[v���}/���#����/D@L@���J���\{x�� 2&u��w�����^�)�XI�������tt�7����n�����|J���n��n�W�
}����Q4�Pe�2��1�V�����]�\��;nNKZ'(:d�BC�����u%�V����]��\�2��f�y��\iRFN��� 7j�h��w�g8���P�@�u���
C���������#*���GOrue$�K�	�-����}��y&O���]�.����Fn�(����]c2�WZ�
4Lo������-���<�y/��{�LD���&edy�+Z��R���~v9��\�S+���z��pl2Wv��+G�U

>��8��>��*�5��cj��r����a1�hm_A�t���������))~���)��\����&��������R���}���x������c��-X���T��-nf
S[�������Owt\�F���16��f�0z{��7�����]�������������u<��A�:;0n��[ W���S��C�`;T���G�f8���pI�^�qS�&��S�==aM�PK����Ng�#d�P��D���
-Z-����h IDAT�]���|��%��,�YZHv:������1���,7��z���,��	���|Wl������h_Rl���x~������l��Iy�N���G�<�?��U��J���`[����i��6���EH���f
d�p��~��*
�br��"������J@�\��e�����,

y��A�|eq���4�y���X����B��}�����0N�@���sx�?E�����p��<4�2jj?ly#d&���n��
@>K�_4��o�f�~�K�*J��mLmt[p)��3�P�@�v�R�)P��/d�������)�K
�
����v �`BF���C��:� ����w� �K��zC�>u���M�@��
S0��o�r!
�Z��u/
���S��_4����W>OP�|[���,���C1���?�O���������?��*h0-��R�x�w��
�j��U�w��4
6�j��q�nx�������H0��F��#��ebF���4�J.�g�K|���)h�Q�^�v�����hH��VF:�"�Muu���&���
hPU�D�VSq}�d4�M)�����P&W^����r�!.!/����-2�*�4D4�+�"��CQ	g�;��u�BC��\����4h��aF�����@��ex�����m�~5���~=q�������LL0�u+��1C���!~�-X�.|���E��0����K����S�.G
j�����������6I@C:;����9�Y��$Z�f.X��c����|,�M���3�{��������+2�@Cbb"Vn��a���2f.$[F'��2�:Wo�ap�N�����"���4DD���EH����j!�r�w~2L
m���T���Q1�PQQA��c����+��n0��E������_�	#+D����u�@Bb��^*L57����]!��^�
%Z%N���,���q	1��
�C�&t#�N�Z�D�!neV�� �Uee��R������Z����@���>�7n#��������?��Jj��v��dy����go����_��/�Q��/,m���_���l��O��� ,�O�-�G�O-@�*]��o
���"�S�����������"l�����'/�X����#_^��7�zp��J�Z�����S\��6���W6	����0�?y���\������A���`oRo��_6�,Y�e�AUEG��D�\�HHh`�����b�2�3J2[N?�.����gx��U�g�-����������5���6�F�VQ��C��=��������7��5'�S�+\�_�E����Ph�]�N�X�6u����+�����_���>�?��WhLU�1m�;U��G���6�4u��m,"�CD�
*
��t��"c�#���p,������Qm5z����'�hp,l��
��;���G�  <+U��L���)��b_~��SI7���������I�<h^1/"b�����E+onG7i5���'�>��	m���@��(0e����BC�
y�����1�c9�����C6��������7Esa*�	�������b���+�	��������+�G�4_���!��~����f%	�0����?w�CS]3�8B���3����7�Q	l��)��Y��CSC
:�j8v��*�X� n<��s����N���K^��<��^F���5SXw�
Uu���C��#�;vB>��2��l5���>C@��|e�0#w?�k}_RS�n���q��j?jzF�y����A+Oq�7&���=��A�j�	���?��U���Y0o1����D�g:����*����6������1��oW�c"�$���a��?>��+W��h�n[�����?�A�3�Y�"��M��jC�fi�3UD,;�����V
*zZ�=���c����[#���n��P+D�������<����'����M��@��Ka8�?")_5J���<�������Q���on�D�D.>�����*��C��-B�=8����i[����z��90�	1{��YAo0m���{���Y��t�9�: �:�V�J�(WD�K������;�G�PSQ��G�`K>��j�[~�q��:����
��J�|��X�}�z�����BO]����6�z�C�����t�u0��l�F��0&Z&b��:�j���KC0��\,~���Tj �Sj���o������DZcM#��F�h��A���P1.�WFe�B���4����s��0��w���`e�]��.:`�`C�jM�v?�?��PD���<n?9m�54����D||��W��uu���P�Pe�=��Q!b��x<�]X!n?u��e!�s����z��ZE���1o�[f�i�y�n���@����9B�������[(4����:���Z�)��$���+wE!�R�T�~A���Zg����2���/����u��v��
�:��*#>>�����d����D\v?��*��5p��F��:��Q<o9�8�P<�	����O�^���T�*z7�L����s�i���6%�1��z�@t\*��7�Kp}zA����0�|���m*L�-#SD|���������?����	\(��5�����?��eN���m������������
����|��3�id����x�y)L���]/�#*����y�L(4<\=������ W�����L������0/S��Z��'����LOw5dD���TG���"�X}a2�U
3\~v��h����q��!�{e���6��7�N	�A[SzZ�x���=�����Z�fG.�A��5~y���aRd���G�ad���u3imK��xu��.����P�����������%��!>��C>��gJz7�����'�J�F�T�!B�h�Q��g �q��4\��������M94/����j�G�5��@�\����x�������`���K�����D
^{��8�YQ*��Xn�>���X��5���:�P�W<�$���q~Q�:��8�p;����vLO�����e�pG�������?7l��@����pFt�"T���$�����
���W����8i
h��]�����^������4><0-[M��}z�.I�v�L�;����}�8��Bhl��w",,
�a�Q�����������W�'�6�

e�6����<>���O�����`�k?Q���Mql�o*Vh�}k�7�y��>,�
���Ux��N
G��{x9|p:bb��]wi
���E��v"�q�7`t�V�ebF}�*�?�Z���W\���!�����O��o�A�~6����t�����Z�����1;���3Zs�^~>X�r���u�<��5��%�7�\�~�F
��=��\e�-�!(3��F�|���m�7�~(�;/�.�+���]�z����C���(�3n�V_�7�O�����C�:��j�{b����Dm����O���]��F�q�>�q���`�X��WvM��MQ���C2^�9�`�'��p��bTi3�G������yN���]�$���c����3����+gEo�
&P��A���a
��_x(����|��'�h��C�%����V6�Q�&�<{�k�^�o�A���9�;��B�w���:�_w�>������.7*.N��J��O�=1�q"m3�+4�x��q�p*VZ�	�?�������U�
�p�"�����z��Xp��x&.�n;,���Rg�������5V�w����_x���Q��]�W���{-�k�SR��In�M�.�U ��i��L�%�) ���6��un�
@���Q��
�����Q�P��u�DJ�����+�%�st�&�ws�;%+4<�}�woPF�*�Q�*wz��O�IK������Z��~�B�����`���&��w�.���P���h�9GO��R��,N�Z8~���Ds�7
YY�b���~�a
��XbE}�3���Ks�5�4�+�%8��>�B�a����Ie��
��C�r�4��`���(�?/��s}�=����(K���	oP"�
�/]-W�(J��G�Z�Q2Iud����L�ef���o��l���7v���G�Q�Li1�qu@���6]���'O���G6kJ{�h��3F�����6����'�����'O�:.\�u�b����oc�����-/���G,��a���>+V�T����9�|�D���h5'IAqi�^#l�7st�X��{��m
Y[cb+g^V���=as�"�1�aC�n�#U��U*�r��d�D��bT�fx����Z	����9L���TN�g2m�>�'�������8�}7n&�a!++�m���r��p�.>~���o�������\�wW#��n��q�����g�Z��b��#)R\y��Z�h�Cm�=;��T?���B�
�7�DD���������6x��04i�\�pm���ry!BC>�`���M�G��S��e+�T=��Y����}��$����>:}�7�oz�������9����KV�Z�����=�6!w<I���\.����!�����;i�Z��8��:4O�k)�ioT�N_�.���m--8����;"*:a�������#�i��B���};�.14�/]������������P��U����������4x���w~ic����JR��q��|
~-�WA���`iR�&-<�����40���l@��F�� O:�A�B��!a��=i�w�p9�h����/��I����pLs!��>h��C�g����_��K.;#�&
���O��&��

5G���Gy}��fy�����[������M�
"2,�
|���2��
::F��c����2e����b�l���03�G@Cg>4]@�=h��9:t��=���M=�0d�>�]�������
�^��B�c�����u?�
����b����(�Sw |��'oV��w��\�����?������vu7+V6�����><eu��Mp������i���,��l#�7]����6����Eth����b�:N��-j$���rr��"�q�}�VK�i<�>UJu��_����z�o������O��s���S������p���Wt�d
v�S�LQF7���B�=/��O�	T�*�����`�gEM���Y�PX�F���#���R��m�GD���5O$m��7�h` ��� � ���X�>�#\0x�u��N�86'\�c�[z�	l������3���)H�0�S9���#�P������\x��5
��=�hA���P���?,�D�0{�����6LTp��lQW\��Q��{�������.hs$":Gn�����n�<fw���[\E��[]\Ds}l\��>G������V�C�i���pT(bI��N�q��{���T����' ����h`��xb��Q.���:�h���W�t��G��0p������o�V�[�y`R�=���En�!����/`��O�n��AkXu���#��U�t�q�f��|vC�����M������	> ���--���^?��V0k�����6#�7`X�	a�.��{���n,��
o�w�NA��/��*�$IM@�+O��`�r�&o�:�'�C�S]������/a�j$B-�zA��v%8�"W������!K�jn$`�pRm�nV1��C��.�������%*�`���%��]Cp��������8*�h��g)4+��Z���������|&Y���^�$�3�h����_�<|��pJ
*&��{	��:!z�E�tuB�$�����,���fHx�	/}�ja���A
WhRz0�=�W��:���D.]l~�3*M��G�	D��XA�C�t���\�p��9<x�
u����~hU���9vK���nK���{s���E�����]��8������m;�?*������7��quF;��2����"")�XT}��%2�����P:d��s��0p��(�����^^��
!0�W�������<�O/ �%�+
��a�B����P�B;\�w�������l��k�=��������h����9,�5
�����]#0��B<~}�t���:tPS�t#,�?���<L���l��\#��m0�wYN��N��*�:}k����'�F�Y���A�5����+�)4�'�m��h,�;`aB}�6�C?��C�k���A��N��^�����1��| 8�M�I*D	$�|�������C b'�����q����
ZN����@�osG�����S�����i1�n�-��&U��~6|h�40B��7�����[�9�_<�z+����H��?���t�c\���=��S��#�I������cn�������E��[�o_`��gT����CL�'��3�`��(;��i������
uE��`S�L�@+���s���-K)����
�~o�����F��	)�zy��0��,��!��R�	l�{gz�:���K�@n����GwLm��A�"m�0�(�i*������(��<��F��w�
��q����A�N>��PZ
��6_��^5�`��!�Zu�X���F|�h�&��A�Cnk���:�8�h�����mh��'(_oZ�Mv��YG�81/��=}���Y�����P�������c�x�2F6\�YG�
xA�A?�����U�#�K�vU(PO�)�0���%��-�
M�������5����em�<�x�b'�O��y�O����<l@�����	����ebZ@��=�o��Of� R�a�z����T�#bc#q��5K���4�����[.�c�\�n�����CKY��n�:��@v�o����",���f8F����R~/��?6&nn�pq���S�o-��W����g��Dv���9<��1d�����s�x�����oH0����]�J��;��":H��C��tx;��ARg���'|-��������'�������]���u�2�n�k�0�R�b����Q �5i#��Aer�������]��taX��AH7������"���gcI��OH v��v�h�$�Cu{,��u}��LC�yx��������
�m��U�aJ���)��w�I����B�S6�g������
�
���Z������n&]�@0��;���p�?�v����t@v�����Io3*���
���>o���������B:����^|���w1�n%��F[]./�W�Z6XDm�w�����t����|��Q�@�A{7bU�����em{��`�7A�bO�� ��t�?�.~D�c�]�/'�a-A0	V����
� ��\�
]����c7����]�!������U���]����=�Y�`��M�P����a�X��@#p&���-����3����g���m{���h���Y}��}>g5���bn��{d������r��!��'�����#�v9���U�������-���%N<q�����Qj����B����W@�z7�(`fI�h8�s�Kw?�h���#���=Wo@c��8��1&97����]��C�����#��Xq�O���w�4�%��;| ��\K:o��>&��Osgy��y�;����1�~,:u���pmP�n�e0t3��)RM
��!�)�u�Y�(�SY��%A�\.�
�@r/���u���]^��!���
{����uP��}�������p���z��`Pa��#B�����#��cw����%�������ZU��C�y��a���������\�R��e����U���n�����u�,!@����W����l��k���w�] �Q��h=w
XZ
�a����_3zX���[�r�6�����I �������KP��7o���V���C@`�B���2���8<a<�
�h���T.�\��%�xF�W)ZT���lYL�B��%��s�@��-d�[�z���g�"���h�^�"�&2��R
i�����[���Bo���
D�bNx��Bk�1�%%n� IDAT�Yx���7b�����,& �gOO�n��p��R����c�����/�+,P��`ZM�]��x�`?4�N�6#8(���4(���G^���%�k$�
']�"��b���w��3���k��E��-q��%�-S�
����^x����b��X9o� �X��i���s��tiMy<�����V�,�BB���YG���vHvH���1i��o�r���hP����4duw�o����7o=�������n/[$��EE,�^����8(d[Q�N�� ���F��u���������I����{

����O�sI�>=(�C���=]�UN�S�t������3�r���Z��4�iBM
40���v6��L7Y�M���������lB"I$W���n�X��]z���T��(��O�j2�p���G�%��ss���/P��EI�a���Y�b�k!W�2�����pDdD�����s4�u_���"%��e:�F�m�=v�t�4�
��3v��}s�$��C��E�����#���\��
�[e
7Hv#�������f��������t��[O��[�K����S����}~�T^�R.����I�1�"M(���t|�P{�D �Z{�7F�	�7���"���;�1�M�t3w���7�C��@��ks�"U���@+@X��W�ZS��
������������
&�Z��$��T���O���1-Kc)0nRn/�q��?�l>��B�@0�`���]W^bP�pH���U���
mX�
��\B��G��3���j����n�!���(GJ������6��"�@0�P����-�����<>aa������ ��2���������ZjX���P�(S�6E�(��MjXp�z;���&�X�A��JqK8$[)~�:�����A��k�T���8q�H��k��[r�I���u9A;�N=�C`T��V��~��c6���^�-^�\K�#�����t
��V����O
�-G�g�$����tn�����6t�8���v�3l5>��/4Nq0(�������t���E�Q/�&�C_�}-Bn�:@�7r��
�
����_6�d�a��h��Ap):@��l����t��G�RO8���s��}

a#S���������{�x�d���0�7a#V@�MM��u���:���w_$����������qkD�&�'#���"w	^�B	B�P1��!t�2-���+AW����!����O����4��F���x�������Iif�A���H}L�/���g�Z{���p��X��`�~�&�u��5p�(#MC������a������\3*N��3�H�Mh`���\*�,�0oRd0�"�Q��4�?����6����&������7XZc1����������cX���|k
�D��P��"�>� ��*	���X]�)	������O��z���TR#������x>������R�*��Na4D�:R�r�(�����68{{�������
����H�c���������������~$@���@�i>kMn ��
��ch�s ��<������S��P@`���L�!��5���>)D�"%&�/���|��y��
���T��Pq��{��.^z?����O
G�h�=�����G�L|G��V,}��&��,�70l�2\�w���/���S��`h�
�:~������b{�!%�)����)��Q����U�����;-�����@��x������FB�gj�piT�J#��0*X\@	��>��[�����s7���>(�w4�����Ce��V������=��.]p����O"��k\����4�u� ���x>%U���24������b?.� n�'dh�g^\������{�����d7����S����&�����R����l�PR(J
2���t����N�#��v7tI�`�g��qMWR�����v�����8L�?��0�N���8������Bi�>�'p�zZFpy�G(9<%������i�5��-W�nK9/M����}[�r�U��x���'��1�i�PaFp,����������5h��6���I�����%8�E�d��0����PW� ��$IQ!-��
�&����r�&�b��v�A�sq����B{k�`�h"���G����3Y���=���7F��q��bq�I�q����0�������8k���4�|��4�����;H�y(��a6�5k����s�������T'������KwZ�?��%����^dK��Kp��,.����Ye�S������2/��g/�[���8qlv��6-��$h������V�z�o�;$�����m\B��$�@m
ML�����'� L�rbs���q��� [p����QG:��$���jPGFN���:��q)�>�bc_I��h=@s7�q��Y�a;��g���z���>���a�Px�����d?���*4P�|��P�\�}���nG�B�'))���W��2�[�w�j�v�ZL��I�����}�������C���H���� ������'�e�`|�g��gl�f��",��)i�KoP�B�v�u�<�|��le:�':R�`��w/���=+�L6�a����0/4���%8�!�N��bAu�.�IUh5
�O��|d���;����'s���52�!����h�&e��o<8 ;�om_�H���U���M������4����.8hO�����H�i�{<���
p������O����C����	vh�U�H0�@�����}�0�������������S_g7�p����~�"�c����o3����z�
E,����yT?��+9�4p�m"p(�������FdvHh����C���p��r�'��r�+���
��lJ6Q� ����a��C�w��
 �`�P�X��;z���.�*�Xb�&�Fn)~k���o��(i�`�G�xMJ=���}f�h�����
���*;���B�U��y`�]���lB�\](J��������',#���m�$���>r8z/_�����F��o���w�gO�rb��aBI�����Mjy0���++����~��I0 ������-��;���D�N�����{�'C���Q��������X�������P�`8!�K�1-�x�!�%z.KJ��?L��[�A���m���h�\N���!�R�!+����3����W�_����?`8�L�|X{���JRM����B���4h�AY���|��8)[l�|En���������1m��p�z(i�^����1�����!Z��A���Hwp�9����]w\��)~'s9�n(�[-���hM�����TU��S��~W������ye������4�y��[n�������,�����!=1w��d��@e���������t22+�L��9�W�H�;I���@�>�tP����~�M�I�a��M�:vP������:���}�$�!�{����
|��A?,���<�7���4�����a�,onf��l�&8�4��gM�
-M

��E��m���8q��o��G�Z�������8I�����lKtl��#���#���wl�4d���&��@C9����z��,m����A�BZ@��=�D,V~����}Tk:$���4����t`��nR���;��H�
x3�J��8tp*���Y�����[I,��R�!-��oB��|���#P'�FVe���H	4����U��H�%/0�����mga�j��9W����2��"���������ts�e���0d��80��b`��w~�8e@�R*4\v�L7A�����L

����t��'��E.����"T�b%��t;�o��������4t"I�g��>|z�go.��CG���-���Jt�5��`���M�	��6ZHnCBq��
�"H��^��UP����E- :�(H��	8v�z�+*�2��QA����Z����.�c����>#Q�
�y��?v���}.r#&��r{����0n�m�}n���T��V�����x�I'����=�
�z�+4t_x�>�������y�~d�$Rh`5k<}B7	�����U�e������E�uZ*���7=;C��Q�v��&)�~h`@���A��=p�PT�
.�� \B���!��`T�5�/lGB��78/rre����������,R�X�R�1��	�P70��u��;G�#a�O9*������H	4|X9,�.��a���g7��~�\(w��h��XG��vF��7�p,�4�z��j�X��R#uvCA�bB�=�b�����UE�����OJ
S7')4��
�B�B 3�;�t�Ke]�F��zC�	jX�-����8��Z�_
��#r�|�MRt�(����@����x��]�2�N����yru�K��:l�Pt`B�\X����]�>����������`����7`o^�,��i��d���r$�����Bj
��u#7I���6���~�I�&t8�����p[�v�C�(j���\GL���31��0AL�4
k��O$�tx��Ej���Q!=�Z�<rU1�mn�
��P�`eq����>Am��/�!�J���46�.$X���MpH��P�d�/��Zmr�I�+'on#E���eC��ch}|��H���{	��+@�>-����kT��('��-J+�d@�3�jE������#\���B6��	��0��2R� XU�z5�M��t�8/�%� ���
+����n+�� 6�E*�`N��lg��z��T��X�g��@�����_�%w���	�V�H	4�=�B���J��;�<p`�c:-�-�&��^QD���C�H���������t7nL�j��	H�C�Uq~Pk��A�$����������)����$U�N��������k�����+4���Bt�����B����Y����B	bH[1�0�`Kr�Y	44*�U�D�C}V.��]1h`����Fa7uh�D�-nW�79|K�az�m��H/��O�M�[y�zp����w��v���L�<J@�����t���6��Hi��+���];�!�`�OY)�� d�&��u-p���m����lp���y��o-���cP��A�&X��8>C�]&�w{�B�&d

2�������Tz�-5$wf?����i(s��qY%��
��s�~Y
4X�vB���0r��I�=�H���BAq����SS��u����)��ZZ@+�1��/9�S�$ �P�r'��%�Kj�����u�8W�����B�
��u�C<�Cu�e��K���>�V���v�k�(��"��;�?2��]EDG������F�y��@�������VhX��3����:^\��F|;��=^@���-�.���z�p����0�i[rS���u�d�a+4�9L�-��Nj���`�~�~�&�N��0�\V��C��;����W��K�"BN�����.��(k����D���f���2�����v/��]��`;5����%w~��`��	B�!��{@�.�Q������h�o.� �#�
�!��9)4l#��nB�A��Ui
����G�D��Rhh8��� ��a��s�PhxruJ������BCQR�x��E(4�J�6��x��~H_@���Hu����\+��2e�|�

������G
�&��&8�Vh�"p���V������`�~Rh�}Vd�4�""8*B�[`7��z�*�a��I�F��j|����nR��"{����������4(N@(���w�p���5�~��?)~����~�F
R
}h�PW�Fsg�(F���� ��#��u�?r���a���n�=A���7�*��)�l�y	��>Y�����@���� >�	V�����z�8$�{��k���~��
R�0�J�����x��	�o���!-��������'�2�/Fl�%�C0�����]C���5��D.rC��_z8�0�@J��������y�l��Q�v��M����ZXL�
�����rE�#p�.<y[Sr�v�(R���b���b8��t����y��c��3U������E����+\"Ll����A�b������{b��cB9�S��B����S����R+4���[�Q(4�w9�
��:N,����N�EY�����omZ���UB�`!��I���^S}����.5k��C��������f��dwlC���\����2�3h���~�hR]��+�"A��
�2�+p|�8����%�{a����99>�@��.C����?�k����J�$��X?x��/���\p�D9�I��������Z���O�,
E�Z�3:��I7w�csR��L.9R+400�=;�>�4��o��3\D��kp��xT��_
������3�
8xy���Th�Z})T�F���q��D���vw�4���>>>�Z�9����KV�{�x�\�r�p#��&�Cq��5c�����t&�#����'�`��
F�@�����jU%��C�P��n��P[`�!5�_����!%$��}���^�=����|M�&�1�W�fu�J��k =@���
 ����
���L�J��&T�e9��%Z�5�6T-�I�VZ@��8}s����[�,�.Sh`�,�n�o)���;��6�@a���7��������6�����^t�EV6��~��<���E2�Fx��x��e�������������h�M~�Y>�7����N���A�KhC�iI��<�CRmp���BZ@�[�Yr��x/�w��n���#������]DM���g���Q���s�P�b���o���*�6�������D��}�n��n3Cl�q���7����'K��&�V����;�a�����o��E4�`���#v]����'���	J�j@�5�q��N!�@�i��!�������Ci���~^W�b�7M���1hT2����,����/��6�o�����'$���:��Gj1��K�^�C�U|��mX��m��{��������?����>�#]���P�� ��|��*����40������<���:th�W��c2x��A������Cf�����<�Z�!����kG�I��K�'��g�cf�zL/�P��:�*,6)X���D2���S:���}���>�]�F�_��@���0�0e�����T+�W��KS�����6�1m���.�7^��!8�ybz'G�G�	7���}��0�l��F�B����]�
��k\]<zD�
�K	V_��$�YU��A�j`R�$��w=��������V�P�n����_#��

���JaQ�x�:lC��<F�
y�z�Cr�q��$~�4h�Xa�n�8����K���dp���l;��f�B��#�
��~'wI������I��B���n%2�kMn(���C�����f����@���CUG����~����8C`�<� Sq��
���4� )��exH�g��>�F��W��J��6���`����J*�a��);$�M���R9���������:=$
ZM*A�Fi�����.��X|�1�������9���B����B���CC����`�;���/^���n$t�4F����O�Vm{|�|���N+���u�|�%@!�'�%�!b�hV/���g�-4h5��/aQ��+j�FC��\|I���+{�.4*��N�Z�tC4���5H��V�0�����"z�e��l�pr����=���ue�/�^l�o��Sm�d���Iq�)�>�Uq��!X�;�������0����N���5����r�pa�����pRnx��/va���M ���w����+��B�#7~Q��I�������q�c\������@�I��������F.R�
AU�����O�:�f��2�2����[7���c��{���rz����%�Y��D����� ��lI���H5�o
P�
����o3��*���0|B�W���|���e����� (n,�
��%�����T��,\Vh���.�����Y IDAT�Po�8�O��P����,�����cP�?p��+����Q���zgr���G�n$��=
��T�=B	�7_��a�4�b��hZ���y"���}�)4����'n�w8��(Hn:X]b���B=��������<�j��� +Up9�d���7=Cy���"��x��W��}�!"7�&��*���Q����D��6��������`�P��'|h`�&�%Er{D��o���4�oB@Fu':4#����]��������,�[�$�nH�e���: r�">��>�|�4�3��*����:��$)n?�w��65�o���`B�3��h�5���-B�!5�P~�l<����g���U0#�g���CFX���ei�����hQ�o2�P���0��v�@M�u���<:�J�1�@�*��7#�����]DXD�����
��h]�By�%E����'+,�"C�H������u���G������S(|
#��[���j��{�J
����
��	��e\�+
�3n�r�Ae�]���<6�$��9�GLlN���
�c@�?��M
����d�.�!�����!RHd��+XY������%���'��=�Q�Dk��Mr�Ft�~ASI�)I�j�&t���E��Ln�6��W���
i)4�������������>0MJE��]���a�1h�X"����tUG�7q7�$�������b�Z
EK����h)V������.���w����/������Z����3�����f���=�.��Gk�{���y<\������������|����U�uP���<w�����q@�9�$:������
�]\`��Y�J�i����|��w#Q��B���p��5,$|?i��+�<�����U�-�'���G4�<�J�������+a���h����w-��'C��C���E��T�xp��4�������?p��9��Bo>�{�rt`�[�c�]D,�����y`H�6j�~k�4�q9�����
�������@r3z��a���4��������s���	�����m������PF����x~|>&���oNu���N�{M��tk0s�V|��;�%�[t] �O^4���f��0�F�����B�����"��!?�I6��6M$�0'7M@$�	�.���m��,L��A\G�^|�����r;�U���	Q��~|%|��R�Q
zh��/��:��{���9�Nu�K��#g�����'��J���"J���P��K� �M?�C�r+�s�j8���r� A�Q7	~��o���7/�M����K�������n8B�r�Y�E������{�N�	�u�l�o���e](qD
!�B��O����}p�S�
��"��$� ���-*��0��~���7>���o����g3/���wS*'���vQ5B������$�gO�"�B��+�	r�...��m��tiq��5�Q�����-�tq�!mB�-��s��A�����!.8�W���tU��1�U��&������~!!�n��!���@��t�"F�qJ�^j/I�9��b
T�w"~������~����qE���2Jj���q�0�k�SI@�oV��C�8��C���\���_�oQp���7�Y���x�>+<�6��)[w*��>��W����"���M(Elq7q��3|��9>]��|@��P�
M��R�P�Q�AT*4����U�(����\aH�g�9@U�6toq
�W�O,�h���<�7�M�Y��4o4�)��x/����i�r�a���g���]������%�>v3�� 
 ����{�r�0������>��m�� qc!�������"����=/�4DF�R	�T�(W�F/#|]����C�G�����Qy4XJ_,Z����ts�K���q��^�D�R�������gv8E`���
|��s�3�s�
Q��0�e���o^��j�()<�����uU{j�o�T��<�
}f��vU��=�U������<&����T��L�"~]�^��}��.x��Qv���������{b�|��t����F���_�F�,������;Q�p�8[����&����\����1�md���*0|4��jC����8v`�$T���n�&��Y�<���x{��C�B8r�.=n�u����;��9��{���8�K��t���n�>�JT�{0�BCj{9���H�/�m�L4��&h���V�"$|7a�r3��%I��|V(�������}\�|
]�r">|����Ic��^�J���Swth�X�'�[v|h��O��_���0��is����������C��_^r����^�P2fog�	5!����	hHi~�R��)~R.'�+m��rB_mJ.����2B>:�m�baj����!��zNF�����i_�r"MJ���&4d�$���]N$/���z���9g�R4d��%��:U���x5fE
b���+W���w��rB�y'���\N$�6�}��!���u���r�m�dJ�V����nc��q�����i�4�Ey���&����Cz��Gyo��F��M.'2z���O@CfjoRu��r"����\n�[�����[�Bw}��M��s9�Y�,DCB>{|P���}����	}�������������w���4	�	JE��3~����HmVoL����I���4)���N�+S2Ro��.��E?-J~.�h���*�-U5��W-?u:�nL��B$�B1c�2�1!q�T���Mhx�����nQ�*��YJ��(�Nh��!.^�����}�O��\���}��)���5�!��P��<h@��v����������&T
hH����4�!���������Ney��2��A3z�i��K
hx�������Yj@C��3n&�Y@�*�7P�In�����J�;h@��-�x~�`�T"R,����j_F�aw�j:�������4�!-��r���_[k@�~��Qr�����9�{|�7��1�NS8Sm3-BZ
iQ��yj@C�E4�����H@�*4nD��D��8�v%M��>��&K"S
hxV�L��D�3F��]-2%��vM�Rk�������M2�8����������1�U�����fE�!-��Vyj@����*@CZ��7��
�����23�4��L�YZU�m
hH��2\DM��e��e�~Ii�4���ZL��Oh@C�55�A��J�+9����X)��h@�4��(��X�B�������(_+C�@���4��m��1��4��_4���cVR�������.=Rj@��V����u�P?��������4�'�QkDh@C���
�w�j5�(���������2"�N=4�!c��4h@Cz�D
hH+ke��,�
���4h@Cj��4��r�4��v��R4�!=����
����Z9����I;N��-�
�w�h@�4d����<�X@b{B2���:���������
�15�!=�������
%�e�vEGG������iRgc�l��5H���6�������
fffo�U�K�����O��~&1Q�����':gq���or�{d�CDG�u�2b�����=;R��46������y��SPP��������;��M�:���A������k������B�<����P������/,,,`bb������-���h�3L���e�?����I�^-���M��23[�D�w���������de~��!�EG"���k��,�=9v	�2F�I����M���-9��q2�x75������\_�[����'E
IE��0�c����{e~33��mL���k�'n��f�4�O�(L�$���-�V�(�=��Nn���<I4zf���k�g�
���RI��x��g��-%}����=�e�e7��|�!������v��u5��|
h���4X	2������V��4T/W4��K�prr�4u�WE5����ZjV�����Yk�K�� /�i���y��d��.����[V�Yy~���]��	PM��������][�e��m=��s�~+ ;=�O�,+��o�zN�����(3������~�����s�����:f�����|W�/���o��W���4d�����x�� �^�����t�OM���4dM�'+�j���7�e�������xW��Y��}.�z.�)Jj@C�����sYo~��sY��x��~EV]�i�=}�����7_/���,Z�2��_���%d���� 44���oUg�������"��6���������kdd�Y���z�k�����(88X���W�(���:�����SS����SNz���pV$#�oi�\���=+�oy���s!��oYy������[V�Yq=��U���{V�����������#-�Oj���;DZ�'%yf��M[����\J�dZ���x�l���<�e���>�{Z~/�"�w1�5����I-���4��������g���������H��d��.��U�7�F�v�/s<��W��z�C��������(s����7m=�)4d�o�~j�������"#G[�i.'����d��.������1m�g ������j�Y �-�
�o�����0i@Cj�NfM�U7�d�. 3��#��w
h���]��z>�x�x������������U�������][�i����.�����][�e��h
h����x�f�2���)4d���%�X@��\��q���Kuvv�������p�MhZ�,Lw-�����q�����6�<YiE�(  �����-�|#��.#D*`	_������o\��*�tN�k��[x��RE�R���Y���(	����q
�������0XYYe�&�i=��d��������]
TnF���������)��^0�I�w;a�Ym��o��-��-�����������d���v�H�[p�70-��J�����e�.��w!��^�r=��v�H�=�m�����d������MmS��T���s=���}M������10�I����+�����q�88�9�c~Ku��8���K���"Oa���{7����x������3�D�}�w>����I�k�wq������
dU@U��P����������, @��P����K�n�l|���-��tMq��	�~�N�����
��LL�s'}���S��0B6x�H~�ws�gId;�������M����n
�`���Y�a�V�:��Za�{�������U�v�wttu�j���[��bT-��dZ�t���aN�q;�����8�?��O��S_�~R
��rH^?�k�������N�<XJ�m�+�����IE�>�,��,��HL���{������Z��Z`x�I�?�F�@���up%�-�z�m�0�3�U)W
h�\N��A��x�]������;�������BC�Qh�����7��
2J4����
hH�Y��bh@CF���[
h��}�f��>��
�c��*E���Z��
h�F�f�W-�
�����������B�M���4�Q�&N��/��Wf�s�rT�\���*��_����#?J�d���W�c�Hm�1w
�sF�f�_��������+�v���"�t�^��4d��
�=�!��IZY��t�$����)��]L�����O�!_]�D#W%3���{)��Xw\���&U��K�}��<I��Phh_�
|����4V?�����=+��@��SS�&~����'��4�[]D!+G�G��}��)j�t�]h��,���JQ:]�5�N#���;�T����
�T�'��h�ck���\p����fXy�r���U�:Xw�
�{���������=��+c+��}�$�B��M�!A���7��`o�Y�����7�OQ���S�����������G����F#��]���Wa���)�CF�,���p"B^v������ ��S���W#+,��O;�LJ���PG�eU�T5u��`�[�V�XwH�/�����fN7��o7�7|��,�_{���I%��B�g��`��k���>Zs8��S�yZ
-K�op�u����q�#e�������=�n��5����x�>j\���X���h	�
4��sAt@L*B��������yR�z�

�w�����0�qv|�6vMnhR�
6��Xs�/�I^�W����Zc��������_p��J�[�TU$
��-5�Z�XnS���"�L����.�Y�h����}31�� ��f�����+��w��50o�!�w��S��;��%���j���E=qV�0)UZ�)x���o����RU�4J~����E�����y��-[!�����������T�]
���p.��/�E��Cqi���R��Malf���S�����{�����uI�F����Y����#Ad'���������������=��r��8�j0�����X�6�\ �^�7�m��.i�48u���@�hX�V�E���)������\��
)���2�[)4��}F����m��tt����������)���&�j�-����3�]����zh���B|:��$��E�,�Rh@CJ-���k@�h�^��=�G6#�$�>�G[��a���lQ�d���O���'�8?����eY�ab��r�m�1�
���BY��x�������HLu��/��L��#.MZ
=�����O�����
&����Y]���/��Z���.]����H��@C���a���P�v�w4�-Q�]+���9�6��)�0kd��S�. �	
�M�~��X���d�Hy��n<���G�V�4C
l�����al�:�R���IE3�m�r#�!����|�eP O9>�$�
����~Y��s�;���@��V����S��Q�w4�vv@gG,?}#�#�m�T������6E���a���hp�c��y�p�jP��m��n�@DT�F���+5�T�m�hXt�'E���7/>^�v���4\��
7�[�\�Y�"?B���0)�������H�l����S4>�G ��bE�vJu�J�a,Z�A6�W����4��|�J��������9�``h��M����?�zh���x�~]���$,��;\�91��^NJ�����?������=}
�'}������^�����
���C(Y��
h�2s>���*h������O���������J��'�S)!C����)F�2V��h����=�6��3SS4�_���EpH(��0�W'Gxzy��<����i���^���!�B�4$kh�Ra��
a�!}}u��b���	���z#k�����.����Z%���~���C�����/����2�xQQQ�������QH�!z��
h�y;v!�c��]Dyz"p�!�����~]�,_�F�1��M���
���������	�{3|Q�4��a��g�z�1�nY����}�����C���p�"9��X��?�{P(�T)���y�-0�Rq�P�������;�(hk��O����a���x4��������`��l���VNF(��
B��L(Jv�]4����obm�]�������`l�
��*��mAp�f��u-ah�
�g� �3
e����&�����|P{l��j_:�����{��������|�*#TZ)����0�[���!�=���8��s�)4��S�K����|�b|��5�����q<���������C+���+n��:cH���i����+�?lx����kX|� ��-Qp���C���;~�;�n={�;w@z��f��7�W�}�����n�{`z�>x��
;�7p�l���#Z��=�e�<y�yj����)4\�~����#��_�:p0����� ��=>-��H(@5�^Ek��>�	��o��O�`�c7X���/�_*x��y7"82�VF��E���=��-���2-����J�a��+(b��rS�DDG�U�/R��-e��q'���4GA�?��v�F�+��U�rJ����-s=�(��J�b��A^��<J��M��?�@C�|N�[�"�+f<o�#���%�{�b����iU���>�s�����6�����h�R�J�@Px8�����PAA;�[
���Xz�"�y��������b IDAT�zf��mFqm+

-K��W/��q�6�c�����N����U��r80�~���k�@�,�3;�����)��L���M���w�n��z���S���x�e�A��!�kQ��7��v[}���e�/��%U�)A03c#l�|C��k��8v�!�\��O�V�����%���������9<�0a��d�O���
���z�������`<�;B�6}q��~�0m�NPEy<��}K'`p@������-����
�� ,8��X3i8�E�>_���G�����{���ai�����N��/

�v��;n�rd�� ���On_������7����]�k��D��7:��� *C8v�?�vW

��}���Q��(7<�v���
���0������)���Vv9�a��,��l���lh�}$�:[Ak��������F��5a�3/No_���o�	�f�g��
�p��At>�m����8���n11�D�!���������eS�>��������E��Majn���*���h���:{,���K����09@�O`���(��k���Qs|5�6�����O��/(Z=�>i
�*C�������j�s4Tq�������=���u6BW���.����0�o4��-�u�����������5��
��o��
a9��Ghx<�����9j�2�����1
@���(�>�-�!`B�����K~c��b�������X��{��P �!fn	�?o	;X�viSUV���Jib��`��;*@��dC��e�����k��H��pn#t�m��_��!:��5��S~�01�!��S���4��_�;�����Y�wyl�;���G������f���y�
F�������!}������Q;��=n�7�3�sC4�Qqp�Y�k���skp���d���)4N�U�r�37�'�w�\��/���noeY�9Y���Le��nx���s���;o<��.up�����'��"�{��@��6�����;����
�U)�*g��y�^�o��D��[�b�^(���w���f't�X��>��[O�a�XE�����ogn��&
	_6���4k3c��+��D��y��
�l���N��_�,M�����'1�{\��w���{����-��+��=/Lh_O�����\}P�3���Q<���:�����-5�Nd��O��lg������o�WV�zP�`��������5\�|�����7�8��b���q����
������=��5K!7���~I��5?�5�jxT4��������l�x7Y�*�Ho�\���c�P/=C';�5/����~�.,����%���w���]�!h�~X~��7�M``i������L��(8dc
����~�`�tfpm����}(4�[��69U����-�0�_^xDb�/t�l�u������4�q��Xw��
��/]�p�3�q�0n�;���\��X2��������RS�S��s�x;�s��u>?���Du*���fGn;#>G�f>#��P������p��.�c[��}pX4U���B�-�g��u����1�E5X����PU��%-�����>������p|�:'l���,�o����� )�V1KTc������/~}�	�"���3����x�%G|��u�Z$�����������li���&�x��H+��>y�F�r4Q6��(�����5�������8�>Z}��G��.�q�i��������L)4�d����
��:��wNv�������}���}��c�	_�K�ZFRc5!���|������#j����?"��j.�V������<��0��J�sm�g�#��%r��'�[�#��.�T�����@o�.j`�Z
�*��~wm`��1�N�DLP��l��������`��WY��^�*�E{�s��}+bBB`�����v�<"�_��*�M�"������eD���Vm���
_���9(pB��m��:5�������j��6�jD���b%��q�:b��`R��Rj��=bBCa����TE���|N�S�s��
a�3'B�lb�0���q��e}
�;*�����y� �������Ka�=;��^�'d�H���ub�������]��EB��E�?�M�:�v���X0�|G����i��0����a���h����i����5����8,���{������Sh�z��G���qh��������B4m��_�`���/��6���!�p����O�|���y������H�X���m��K��	�����u.���V���0���m���^������������-��h]�c�80
��K)���@8����&�(�|f�N�?�p��(�p�-`f����:<���������i_\����W����P������>�����5,��K,C������_���N�<H�%}�`��Ji"_�.�^�U|������{��^.�'�!��:��\�����}.o������,\�CX9a����w��.T~o6�s��)�=�D���p�����wU��3+T����'�����]�������`Kh�P���o�����4���_����;��5�� �S��B���T���x)}�r��2F��=�d_J�u}/}��6�s�������*$4�W-�B���i�����E�����	����gQdX'�>�x�^�����/2�#��]�����F���:x�HV�5��f��
hH���-#���u�!8�����y������f-Z�>������Q��J-�k��v�6��k���~�_��Q/�����i]�<{	�{tdW�Z�*����n���{��!~8}��%��������4|��o���	!\T���N�U��a��
�n�������q)�+&
4,�����B�l��'��^,�^W
hH�2�����u`Z� ������(�LG`�i��H#�-�U����i��'`��3�����BB��F����s��D���0�d���37�;h�|�
�q�m�����t71��&
qs5���\b������?�W�P����!�O�N�\(��SO\��M*c��s<�}�5��
�=�v����#`�`sVX�0��u�4�W��#��+6\Y��
�1G���R����p���n$��D�&�x�?���n���@D�s|����*��=��\U<>�
��qshx`Sy��3n���
Z���/f�H=���_gW���\N,2�.@����y�����r�,N���I={a��cX��������+����
h�|�Ns�c����:m
��YkO�D����
����
��gNsc�-�p�d)����>y�-����n�c��=xN�fr���j�u����fbt���t��5h��[6�l,:]��8,Lj��>�0��~��;�}Dx�"7_E��������9�Sn�q�R�s������`?�}z�w�C��0�������Ky.����;'��Pl���������e����/*p��/�C]c��KjCP �OO,���]0�?'U������`���>�����18sCC����w���`il�!Gcz�x�������r��k�d��V�!���BNkK<!h�-������V�P���z�������A�b�u���l��0�@�
�SsZy����}�W��� 0AkRN�^{N�����>��eJ�����a�{m1������0p�F�*��YF$7j������uL'p���4|������H�ba���d�Q9�CB
���C�1z�UgB|�P9�3�<x�JVm�)4'(��Bi�D������_mb;������w��c����

VP���wr���x�&4)Y������OjBj�xv�*ls�&����8�b������ \�������&��v_�G�}���r�UB����]O�8����C��U��^3S��R��r���A�V�9Q��{�5P���_�`�����I0��N(Q���<�"�"���]+���%X7e|<���X��'H����X>�C���d3���Eh7t"��\A�����T�Fi*L<�Sh�]�j���uT�����]4\<��.G���q������n_����O�s�?��U����nd=c����S�<�O���#Z�ukbu=�u��/���I�S�������Hi�*X�����a�J��
�n����S��8~5u����y>���-��Fc��`6
J(���@��s���F�|����\`�2�L���
EM1���Y����lt�Y$p�^X���w�����G�	�`��@T(b���+�������sm� \8��5�Bn{C4�>���(W�D��ay3!���|U�Wl�O��; 
��
�'ml0a���i�2BQ�y,��� ��k��#�=h�a4����	S��1����`tw;����:���W	h�vHZ�*aG%4�����.�1g��um��WwbP�E���""���/�M�%�;G1��������
_����Y��K���*'���U�F�J��8~v�r�v��yhT{ v������hRw0��K�;��
�<\���C�E#�]�����uJc��'8���k���GP�*]��[c��G������#s;���uGxxf�����j�9��A����1�Qy,>s}3�:~^<\���c/o&�����aN�����(�z��(����vK,`y?�����!+��@�o���hW��2�I4� lq��s�����F��E���]�[
	t�Xv�Q��M�_5�D5#O�p��NBcZV�b���"2�]
���4�m^�-�j\A�!�
���K�0�K]��v^�������l,N������M�B�b�9L^s��*s��%��:���Ck^��N�A�B�����A�(���l��K��&a��\�K[*�����F%�a{
%�_��o,z�B��g���V<���A�
B������"���n���L�B��?".>T@C�������������0kZ���j�}7����-�!p�^��wQ���E�>����,P� �G{�P��R�s���������X
��z�����a�E `L�\�q�;��F^�b������w���C���1p�#ux?���(���B9Mx����0����!��]������������@<�
We|�������>B��fh�b�������E���4l!p�iX\�����T p���P�O���	��0|�c4,eM�:��~�C����>o��-��������?����.}��=�1��g�O0��?��/��v�l������� �tAl�1m#6 �'�	���-@�_8Yv���o����H[F�\������z�����8���/z���wz+4�}f��i���s��s
�W��M?cJ����b��q���[���=��h\����o|��=x��*����?�����MA@C8������!x��+
�7��� ���a�N*�@��\�`�w�`������]����s�
�
F4�?�e��6�?��[����gO����i��(OXt�����92���"������|69"d�u�~�,��C���0�wP@�����lff
h0)_���3���-�u���/���M�X2}������[�aR�Bv��ShP���G$��
�[7��=F0B��>- P��K�
]���
C�I�)����5k���1�;�6�,Glz����}[^)\��A��B����+@C��=0��WbO��s�.Dy=�_�_��\_@�c����W�y��XC�>>����\�����k�UP��Q���w��U@C��_���Q�s�
�������wU����e�!���W|k���~����_���-����Q*E	�z�=�\%+`!��>��P��R��;A�� �����d�/q����A���	����|��������0����GP��g�o����2����nu

�����@��
����s)�_�;���FT�������� ��-,�#�`o�_��S���i�Gt���|���]��ca��j�S0�����h�S�
/����@C!HJ0�=EA#~����J�T��'���k���x�B���|���k�+��_���P?}�\�����i]`HN���P����GwjU���3���9�����e�|���V"��EFt��_W O��y��G.+������=uU������OV�5����4�A���y�Ho4�{���\D)��[��.���O���?�����b\|�[
�|7�����!��8F-�Wm��[��fiKW�Z[�����R�p�����������C��',��p��C)��~��>g)��,��o�Z�Lf��
1��`?"E���v_�<L����7;4.��������]��U�
�"
h��@�R\����Gh���yx,��U�z����bEaV�D\�z/X�^=�n�e���GB�A��.���5���=�q!+�
�l;��N�Q�����p;.��9�Q���

�|j�*�b�u�����1�0��T~��8�[���m�17�y�����QNp��u�*�����&0������P�;G��x*t����,Ub�O�pw�j�qTJ
�]L��.�����P�����	�d^�S
~�m!�P���"Q�[G����s����P��-NO��kw��Vi��fx��@�*����7�A�>j���{�O�'|��+������p�'�p�,>+_l�M��_-_��h���g�`��P�mx�����}nn���Q����/�7|�9od��#�}�������J���fF�������m�b������R������~Qx�6=y�.�����_BoFXt$�R�0��~�.����e	Tt,����� �
4�Z��oV�D�$���H��8���N�]�V\��v���m���_K*-,�y�}����C������0�FO��|�-ey���*�b����nj���W�A��cKTQ����zL���R�����Uh�77������7m�:tD�7���7����*����8y?v�A����@�	4�2����1�q�3��|@�V�x�"B9���}�t\_5���E�c��3�p���*�u�7��9�,Y�.����rQ�@C�\�0����\S�`]~m���9�>+>o\�pC�-d�`��Lj�K��P��7�_���a��c�~�N9���y���KW�`^���[��^���`4���g�V�����*R����PPDk�T����5�!�@��4��=�f��p"
���F�Q��x����P�����!��Mh����q�
{~��n'���u��!o�*8�{%��T�����5����(Q�1�6gv,W
	KWC����\X9~z|?_��(Q��:�761���GH!J��M5���U�'6������0��(V����/]8��xT����#�z>����Q��E���ph�_xp�t�P�b]�����K&�f�	]<S@��I<�}}~^��_�D+{-���r�Q�	o&��`]���	�m�������}�X]�h=ha�Q0�BD�b���R;^�.9@C�����$�j�fQ>|Ma|_�X�������{�V�v?<"���
�� ����!��5-��p��
J���V�+�@]���A(U�C�����p,���$�D�eU�&h!*9�1y�?ZU1�M*;H]6� ���Z��i��	)X�[��]Gp�YgL^���b����K@��P��v�rfq��	7�_����=\U@�����6�p�&�1��5|�s��`Xt���Q��^���D��MP���������`1�Z��F���������P�JJ}�o|I��5��P��b��Q���Te(� �����M�/�`�`*N$�Z��h�8
�d��d>���[�=T

��$�P
�7������O	��wA�M�r��s�$��p�����*C����F0���'R��h(���������#nh�QEXE�������< � IDAT���T~�r�J1
hX�M�<�����JIA��*@�!S���������9T����}�Q��#��]�1����9o�����!~g��S����ze���xC��RL�PS)$�������j*4��KS���tE!�C�4�	�<#�!`���'���t@�G�Ks��|���w��a��V�@x����B	c��A���7�X�6{����&�A).�W�����(� ��B�]������YnB����7C��]����Qn@��{��e�JoZ��$�~�+�`\�	��N��-�D�D�K:����W)���6�k	s,8�W�r�	
�4U�4n���uG�B�
�����h76@���0�!&����K���!.D)���u�^��>i����D]a�)?�����O�j�C������J
b�)�d�
����
���A��$t!��7+�P� 6����^a�7Z�����@l�@�@��(Fp0�u�_�
�6��A9���J<H|��0��y��N>r�=6��������!����3/�������v	���L��L�(��r.��v��T��.����8�
W����wy	�t�e�&dn(%�����;'���t�����*vC6��m� 4"�w	��E�
/<�������Tc�7]�0��|�c
~o�e��}
r�<��a��`R��R
X0���A���G�`V�~\]"?������{�R6��s[Af<��2A��H��"T���,]�|I)2���%��#��A(AQIe�����pCA��{���1����s��/�Tr��%����"h�����Z�
�d��x�..0)W!.��Cvv���,+�qh��1���(!d��T��E��%x���3 `aF5���H�N����������
���E9!������A������CB�����[�����)mdhk����}���b�}���D5�o���r���*oz���p(Pvtv���.L���7�P��P�l����:�G�bE�L p��'��A�����!@��?\�1��*�X�����������k)�@wx�����S)R����R.��s����*�AB|�\��W�6�����������T�
�R-�qs��m�K�s�u����=�\[(�A��BT/��STo@����� ������<������W���9�R�����R1�8 �	e�NPpD�cU<QrH����`D��H��`@����Y�K�#B�������(Gu��m}� Y���Ex��E]C ���vY��`�`��#;S��7_Ql0�����v���oq��DDN��2����C��������|�s�C4a���4���4h@CR�}|�V@�j���B�FB\Mx�f�vn�>�����=1q�<|9�������� �~���
'n�������z��(���L�@	���Woa��p�M5o�+J
���P��X�]z	����iydm�h��<������� �l������@�
Ja�>7�jW�y`�����,�
�[F26�t��J�"�pa��\�@�x�P�BC����f�+"h�~�u���PB�A�0J��F��F1h��8�A�Q`����+��=�@�)�+�����A�}��L�p����;�YU��y�J
U�4�j�;��)e�{;<h����By;�`cK�)���//���LL���x*5��D~����X���.��
�g�����*~b�s��o����$��`�(��&0DB������A�/�S�A

}�����~|��-.������A
�s�f
o�<��F7nm9w6l�&"1��G~���OC�*U�:���������0�ACU��a��5��/yk�����!��[�r��K
��V�
�k����6��M��Wj)
�D5�Z��p����t?!n"t@���Th�aP*4����|6��HH����`���g�.���w��c�V�*6P�a$��@~��XO��TWX@B��#��� ��P��6���N�
R�-.`x���.�!0���1/	��0�

���d���B�AT���|Q.7:��A�`n0mq���U���~j�H����P�A���+�Q���*����7t�B��;�A�B������q�&qm��������R���|�2�
�Tg�'L �
�	;��ue	J����� 

������-���JUA~���W��	�\y��������N-�te#p�^%*4���������x��RO;�L��q��,����
�HMH-� �	�O�F��r����� �j�?P

�P�� ���u:}�\ ��^����f�J�A\P4x$���m�a����Z��r]!q.�[�&|��|�Z-�����H���&���� �<#L �
=��G)>���1�;S��H�������~���@�Md[�M�B���8�w-�SD��*��^?,R�	q

toQ�]�Wh�
]���M������t������l����b�����<Q�05�T�4m+��"�[�������vx��7p�F����Rg��G��P0�A���_��T
t@�=���U.!�uC���}���������

�"B�
��tI�U~�B�A�<�|$������`���r���T�*'� �	���	:�A�_���=��5� U_W������oSJ)3H���:�6L�o��0�

��b]K��r�
���J�`�b?����P02]gc�*!�C|�����7L9W�'hF�vS��o<D���v�c�.f)����[n`������?�1Kx3�w��
h�0�7��E��:����rC���������^Rh�]�D��C�t��J�A�6��;���R��7��^4��ri���O73��`4�U-������1�Sm\s���@�P����?H���0��sO\�G�9�*�������
B�Q�jA;�R�� %@C�*%8�]�0�\ �:�a\[*4������vQ��7�9eo�2$�����&��x7Z��CJ��-��P�x��}�u������� ��@�S�9�0DB��h;�FQT~�}��8���d^r��R���3�9|Ne���
�u�@v�s-�q{!i�����OP��Ee��M�:FR

:hcn�F�p�%�.0J)�F�r�Pb2U7�R�B�M@��&�k	����\�K�u�8�A)4,;�������������j%��`7�=�~�
�
�v�m���4V�a��T+�C@oF�$�Y�PP��_�:�E�!w�)��Q�
�<����-V��8�JT�!,"��^b���TT���
:��0��M7
��@\T�a��n�Jy����x+<2&N�
�-{W�Ry�����r���0�tc!A��m���$V��C*-����<R.0��������5�zu*����'�T|QN��@��Sq!���qQ�_����A��v�}��B��U���(���c�%�A����e7�:�������������0g��rY!�
 1���R�hSA��t��@���(4$���5�����>�CU�w4xz�
��	�0j�D|��|�{�$���������?��.��=����)4��+�1
����A�l|�e������4�a|8�IE�A\7Pa �����k(w
	b��&y����UH���)4DS�A�JH<qu���B�;�� ��]�H�F`�w���g`Aw��G���<��}v>�M����\9�B�@�Y�|Qh��\L(��� #	i�tA���J]!�.l�N�rB|��F[d�
���x���;J�����������KB��!��5V��6�4�)4H<*N�5n��cG`N���-;���tY���.A�!

T��z�
DB���.��X1>k"��=���A�%�K��)��/�A����B�`�;��K���;�5q� .!�uC��x(.�&$���@�;�P�!><�/���O��q ��'.$�L�Z:P��v+w�r��M�5���C#O�����W��C)�Z���x�������*�����*��*���������j����)#JSM`?*z��
����&�F"1�� n�"B���6����n�+�O
�i�!���@,�����.m��^�2� ��?�('��n�[��=qc�4�^\}<��at����k�^�D��T=E�"�BCn��xN��.OY�����%Q�H�/:�@�!������#��77��&.<tvy�@�s�:��wv�J���+�.���L��9�y�!��
�l�1�����Wh

)x��&�4h@�����sx+�A��L����Z��������D����b�6T�P
E�����q��5t����@���'��{����x��Z��������	���MKL�!�2�3�-���bi���PRl���!I�F��Y��H	��M�v�����!_�<L4|��,������+��f��T.B������O�����eSH4�!������
4�\vC���M:�&���4DQ��w�Ju�c��2~|�6v��T$D��8��i�t�/Y+��9���`HYx]H48����.\n���3o����N�A����=!=��?�`�g5\���Kq������ntSa����3~=p��;O��KL��.7^E��:7a�pS���E����Me	�Sh�Y�EZ�����afg4�1F	JH����A0�!Noez]�}>���z���%���R.",�S[���p�>����e��|��9����},�P��!<����Uqi!i�����h��Gv��u���J�!7�������)�lB���8���[Y���+w�=�����q�&��T���
��a%q�A��P:_>i�LI�/;rNv���� Q\� @����M�������!�""?7�DqAT��&�]�������R��v�),������xC���?�����Ke��

�f�xH��,o����4���=�����Y�9�S�`!�����
p `@W���������[��'d�_j���Wn�u���>�����E�����
�<����2>�B;���>�n5�l�(�
3��S�%|�����*�4����a���x�b�K#?��%��Ek(�R�GH��-�3��a0�
t!a��E(i���^�[�6\(E9���K��O�`�[.v��OqBg��*4�,�O��w
	���[~������]w��7��.]�	( A���Z��c��S*���KpA@>oT��^"��.���
kb��+�6GB���U.+4 � n(
k�_�+�zp'�[�j#�lU���Q0����;�����A}��R_�8�T�����������8���Rq�q#1���V��7�LMx8t�%�Qy��J+$��t#7��E"���a�~��C\]|���(KPDg��f~�Z��x���_��E�@�@�T������W>�(�y�2��]�q���{J�i��#�>O��f��k�Q���xpS�����Jy@�wk�|�VP���(W��$���M��A��
EB����%�%����(P�*���f�����!�.	��������U�(���������@oU�����H��z���� �t#����V���f68�m�K

y����(���M���
F�N�
�X;y�*o���0��Vn.��������]Q��C����F�U\l�9;$Tl�
.5���/�-3�c�(�����Sy���NA"��KJBr�w���G����b����)k���E�[���"4���c7h���98��3�0�]�
X�D��g�Q���G�2t�z������%���%` �~[���z�a	]M�1�<?�PXu �%��1t���f%���/Z)+�S^���zK�rC�K=��DwM�"! ����|��%T>���{S����p���8����B!el?�S��aa��(K��D=���<��!(o'�'�(�2n>�Pm �?8F�%������.�2���XHh���-���5�76EQaP��q@C���P�x%G�y�oh\�c���u\�{.�o��t,�������u��<������Gr�X�Nd3���+��p}�����SQ�tk�������M_�����c��+����]���B����Uh��%��P%@������)�J(M��T�K�d�0 n%n0������o��A�~�ys��_K7��N0�uU�z�Y�������\��MD %@C�.���r~�v���\r�c@-Z��5�WA����������(%�����|�=S�����@��t��g�O[ObV�������s��G�.*
U	���ye��<U >����/���nB��ar�:���ME#��P����B�S��b�,��*W��"#��{�v����-�@�B�Q�*i��B�� mi]� ������`!��7�����<2�E�ta���A��T��%���%?�{�sy�7��4W(�V�Y{U(snG���

FEr��K5uX��"1�x���Wb��h��Sl�(BT,���an��Gu�!���=����lg�_�a�t�ti!?C����$�����}
NvF�<�ZC���������tU ��n���s*����r�.0��������G��CEQ;��%,���F��5��RD�?w���T'D��
D�@�~<p��� @C��(M�!��B�{� q� A��6|.��T$�hI�@�kQP���/�3B��x*D�'T�u�\�a�3T+b���-�^,����4�z���! 4
S�?G/���2���C��Yk����i;�A@(�����-Fp�g�>���0BtkDwEs���� ���z!����Q�
�z!�����gTI1{I�A`��}'�6D�B����QaBl����
����{��:�s^@CT4�&,)��t���,"��5��|��`�w�/��W.'t@���p��w$o9\�=,9��4�~��_P�>P��?�����f�T|X�vS�����.T���'��\�>��(�<���QL�{g�U���?��%���������������k���������tH7|��" *���{�{�G���g��;w�7����2��-� �����2hLN.&tZ%��3�z`���'���6".��P!��X����	�_��)Z���j����F�B���.���	���;'�AI�����b>���;�B�Bh�71C��4��\��
T���H0�!\E�=�Y��S��!��NP:vAE��z�D@�wo��*�����$Uh�|EHEN�����<�\e���9I%������-\np��A�4���
G=y��
L�Tll�
:�G*�*ff��"X�"��.4a[q�8-�S��!R
��EugR���]$
��^_��p�Q��=4�T%5Wh�k��y
��]0�z���'nTs�
�#�V���{����B�44�h���P�6�����A���"�6��
l��m�����p��in`Y�rqV���;I�A]���+6��U��L��7����>_����
�����%UJ4�����f	����aM�FrX�!�\fk�;��D,�;��Bo�[m(���
�@���
�O�����Gp����_y~�p��J������&���6���,Q7��JXx���R�=6 ��tM�������P!��\E����^��e �����!��@��}E��� �J.w�Q_~Q�d�0L��_�Ii�������E���a$���&��<e;��a�}^��Da��
E��.(�K*�w����d�����OM������j(�Y.��B���d

����oDkq��u�#����n ��
��I�jf]��F������U���+���LA��"i��XC$�!3�tZ�fhX�q7J�	�*�����h
�4����DZxA���
�����8h�i���/���{L��`�1��M�������W��.����dr#h�	-��*�6��i5�Oq-��!-VJ	4�%M�8��C� IDAT���$�!g
��I�hHO���[@���Kv��#�!���3����3�$��e��7�@CF���idDf���N��NR�<�>��M��d����\@����Cf�����zN����	�H��U���)-@CF���i����h�hs�7��Ip�����3�y�(��\N�(����=�?�Ni)7=@CZ��
q����L}�c����1z�e�����!3��'�������3��h����2����h������r(a��u��3�w�t�q�����<���y����o�-��g�;��L�r"�e��Ln����Np�Q�vF��n���HV @08(��@��adG���u��2����h�*j�!�������w}uF��n��v�� ��B�����������OWa�������r�*
_L)
� ��;eh��JJeH�i�����#���4H@����\3`%���

���PQ	h��%�!c�l�G�rKmO;~A(�dG��4�7�f
����5���8��NV��#U	y	h��E���<��3����%
t]���0"9�,����/{	h���YUa�5���vg�l 5��$��gX=k����.�h�N�7Y$�!+��z����.�"��E��{�<4I�A�(�%��CV
��oZ�����-%����%�l(C
:B�!<�=�]��xY
4��2�(�4�����	h��Q)
�ae��_���{�T$�Ar��*)4|�'E23*h���~vZE~��sK�����[�%e=%�!{zN����l��"
�cg���������.�����i�(�$�!���4H@Cv�J	h�+Ke�r������� 
��;�W	h�����T	hH��rF<	h����k!
9���'
��O��=v��R$�!�,+�+Y��iH��� �
E��4��^��	h��Q)
�ae��_���{�T$�Ar��*
����*
i�T��'
9�rz-$�!���4dgI@CvZ[�eI@��m*�(Y@f	h���d	h���d��4��q 
���R���R��h��T ��+66�������5u�WE%�!�
��������m#M �	����_����w�CE}����#44�����PNS[������FPP�����~S��.��o�s�+��M���BSS3Ms�_%�"�wE~�I�9�{�)�x��s�7����;,--�����LW��E�^�Y�]�4,�H��[@r���>�o)}0I�����OMyAPZ���s��\��&����\��K�WKE}�I��	�)�x�U���|N��_$@U1�I@��}���
^�}�d.'E��I�/�;��.�������b)�d�_��?�T�\����8������,Suf����M!  �������M��K]CBBD>���r�/�d"���[�������'�����)�E����T���Qn��wv��W4���[V>y�+��-'��,���e���7E�<�����]�sI�
�:�����&��2�>�������G�=+�!��=��SQ�o�|.{���3&�2�<�{n{.(��MQ�s��Yy_fE�?c�K

Y��R���r�BC<9beZ��������
��
�jjj
�v~�pP4�JE������B�ZIII�����w����hDFF*���������7E���~S��.����s
5����s�%�/����E��)���4����iV���]��)�z�4�S�������9	hP�Y��V�Y �
���$i'���2R����#I|)��q�s�������~WT	~E���~S������JX*�x��s�Dq.���k��E��e�D�\m&2S���4�S���"�wi>�x�]Z��\ gbz�+����9	h��CE�����4��H{����M �&i��'���gL s���p��y�+��M��I�������z(��MQi\1�_$�A����S���s�|.������4��e�X�	�H�]��1%�!;�,���Y���x-_�w,Cm+jm	'�t��g�Z��J#�,-�+���}N[<��>��I��v������j2
�`()�LO��*nXX���r��	��z&�D�W���Y����+����H~�g(e�������h�e�b<���C9�E�
�KS���SRQI�|"�67���<��~����T+��u�*�4�������S�oi�(9F��x7�)a
� 9�N~Y]��Dt��n�r�|�[V�y	� �)�����pr��P�e����\3q����g���%N�x�P����@y�c�P��[v����d
{SD!2�������J�5l���G�5��d�x7�_
��/�o�0���2;(R��y��*�Y���i}���1nF�*�����j�J�F�?7����;BW�>�m�V��������a����H@�4d�JC��#IQ$��
��c���3d�+��CH��Vt�	C���J#�,
����#�D�SO#��;9������ ����'�R���Q5u�En�����������uig����G��R#%��4����?�h�L�r�@K%����K^�����E#�\n~!*�q����[�l.}X�������oDGd�u�W\��9v��_�RN�2`�JE����?'�p�q�:1���K�s�b<�~b
���e��&>��9)H�x����y�k��ETx��[�s�k�p3�C�fi��e4�[�����J@�4d����-
�ae��_���{�T���9�v��{�����4d��+	hP���Z��������T�|- 
����r���Y��]����g{��_���;�Rrn?I@C���4d����9�qj	h��������)�a��u�8��(e���T�	e������^��G�a
f/^�I#�Ho8q�
.^�}=�t���P'�]Y
���������$��� /Kf}>���
j6�0lS>K�ghe�B�q����t���;�d���D*&�0l?!�v#���L��41��S���>��]a���X_����3�����e$o��d�H|^�
�c��o��t�W�i5(�"d�|Nd�B���>�U.���0����+������jb��gp����t��=j:�;0'�?q~K��D`X��V3T�o$��@C�>�p��\4k3	[��HW�J�kmC\��9]�d�m�8�l��8�'����g3�_NJ�+�%+�:d�.�\�qq�Y��Wy����o����m�b�L�t��Bm=��+��������@�z���"�MV�zz	�����|�)]�N[�_�-ikqB,y
b���V�/��_���=�S�dq����uzvj
T��7���D������������S�t�K-rV
s�v���'0�~���=]ul�X
�Z��~;c�i)L�

&S� `�!X,�n���HZy
�Aq�����Tp�f4z��H����{���x�(�e�.-��3=�,����@G�g��JKU����.����~S�^�\���a	���u����~OWrjd���;+�����j����(�X\�����
��I]�,iRV(4�w����^���B1UX�)���+�E`H[�t�Io��,�
��7`��\z�NW�T-�`1�>M<��t�����a��(��\?4+���������~F�������&���-x8�{���ad�|m������J'��k_�������'�����O�d(��$������I�sY�


{L��}�q�:l��6]f�7�F�N�ppE��ed�H@C���jd	h��������)��Va�����y�6���=;���'O
��{��?�Af����O�F����4O����w�G���M� Y@^��yY2�����_h0�Qaw���;C(��5�������;�[��B������7����P���H�^WD��=�������i�[z+$O�A�dh8F��[�,���Vi�y�	f�?hPWU�������������,R����<N��WO��@C���g���Fg�o2Xd��o$�l[�Q��������pw{.������4�-��|�4��JH�z������A��,�9x2�����L5C}��|3{]�@���x����K��!�����a���/48�����=��x�@��*L���)a�ub��?�F+�����44.���`i���
��K��EI�z�>�'�3tj���q�Wf��N������'c��?���D�+�����2]NVd /���t8t
�"�+6�
��F�Mm
��p@���
����������O�g4���������p�o\*���(C�3�(+�=G��w��s[s�P��L��2
��6��]�4X����N
�o�
��'������d������O22~r	h�������Y��zv����8"""1�og��t��(^����.T���0�_Whij`��K����Fu����kB��������@�Z��~�~��G (8���p���?���)�.�vY�q��&t���X�CB�f�^hiiR�����m�����R��R
f�fX�{T�Uq������
�+��CH2�������at���X6y��V��4�z�3dLV)������U����D������60�[J*��^r
1~a���%�\�NeV��������T	l�44���F��4^34()���d��	����&l��}tp)tj��2$Q�Rd}������{�~���l���E��{��@��P'�A�I?�����ka��w��*�]_"����2B�����(��H��:��BIC[g"����$���S
h�o%ee|�5�>p�`�}*����{gv��0�q���_7�%�
�!���/���	��C�*/��+T��4(��d�`��x�:"n<���I�q����0��*�V�x�o�
 :c�"dG�a�d���Q����4/1��*�z�|�A+�A�EMh�-�]�n�z��B�!����K#`�j��U3��8�M^.�Mk��BC����_��/�����
������3��u��%�z���O�����6�B�2���|:��Hj�o�57��f�i�U�.=�������u�e�s]E�Z��BC�r���T�>~'�U��^|������uD[��2[�b��sx����u�mu5hkR��B��v����T��{�D�G<ia������.����/��^�k���`F���^eJ���S���;���6��Rj������w�U �jo�'�AW����2�����{0|�>~���CsQ�Fw��{��e�����������z
���)�)vn���p���)0���C�=�����S}qO�;yJ	����(\��m���-������q��y<Zv��02���+;���aT��E)~dd(��|�B�=��7����o�+Q�kk������%��|���u��?����v]�����x��"t��*�j��i<�:�A�b5����\:�}�����{��z��<������3�?�Uk�D���E���8��A�]�X��P�P��!��7��%^:v7>����F��O�s�|�&���|~=��^���aa�h�y���������_��!_Y�i8��W'����'��`���\���������-������)������V6��{�$x{��*��6�����#�/amSO��~N�Iam[��>�����$e��4j�Ph05w@�Vi��q��N�s]�!3

�F*�1��l���k��0i�>��`�:_�ja=�Ha�|O
��k��G�T�[��Y��C�U�a��"��y�9t�U��9����R}=�����u�Y�"X�!�'%*�`�"o��c5����q�:
5���2���p�X n_�����G��!( V(4�R��u3���>�2�,���S����������jC�Pxx�>��B����M�������wK�_��\O8V�A��:�K>n�pfO���^n��z�Q��&'w�vK/��������/����t�z�&�c�B/�y}!.&�c�w/"`e�.l��yD�����z���V	�~����qgcl_��!���`�JW��JdWn�������'���c�B[��Fv��]M�����6��"��T�Kw��o�N������Wek$/��;�I*7���~�.z���B`�i�E�a��E0���}I����Uq��~\�NP���5����]U(���=�{gB�.0��K�-��BCd�?���C�10/P�������5E�*}���0�+��7��/5���������c��1�Gtx���eU
������oQy+t���3�yw��n
V� ��B�����pE�������Ic@�����%|O��DG�[�K�<{��b{���

���'��Bek������� ��cG�k��wn���t��7>^�|~;�4���������+/�C�2�S����;u��vB�����^�0�:�#�6����W�0�����T���am`���n����iijb�o*4PL�u���b�?���������w����]��������Wh�*	%�=��mX��
��>@-�%)6F��70��m���{��t�SSSh�{{��h����T~U�U���07TF���w-
!��@MA��46��D���g���Q�4TBHx<���M������W3%4*���/c��%���ZUV�G�8��`�C'�]���F��IgV���U4/����
��^��p?�i���?`���Y=A��=��[-�RwV��
�4B�B�J�2�/�+C��0Z��8�x+}���U�A_�X��^�&���lB*
�p��y��1E���:���
��r>Q�yL
�4�����_d���[!�;>L(4t�8����_��H���1������5���m����������RG����R��������L?"�	(b@���_�P���WG�B�x�������;�v�6����;������
=M#�zc��Y���������P�ZA
q�	*R'�?o���L�:�}��k@SM7��@���>�,��<?E���u9��������nQ8���7������T!�&-����������(/�>�/]�rZ"�4������0�����m��J��K��a���p�����a�
����o��A�����"��F$�5�����������!������6�J�#�:��?����t�aA�4�)4\#@�5��:�U���q��$������2����q<��C����g���1hI���K�]�G����W-���ocp�e,����A�no����Xu�������chR5a����7@UGU�)a�I��';��
z6�g������@YZ�Q*FZ�������jV�/��3Zz���3Z	^.�:M tk�w��������N�x�EY��M�
��a6�4
��X���I'�Y��+�^����)"^�
����`�g=��:�jya���{����U������v�r���K0��D���0���b��AE�B�o(�T��1�,��|TU1�:�J���3�S�^����e8CIM�"V�\�C+#���4(���{�����
���Uq�[���1�zod$�h�N�n��F������f�L���������@?_)�8����{�!��y[����]���@�I;��)t,����eq{���'CM�A�����U��S�Mi������>�RVhx`
u���t���DuXTh"��ov��]�>P�osMR9����w���V'�W���
�

\o����f)gQ���U��G��{T��0-U�UZ�o8���E������XaN�
�!����R��2�u%Z7����A�5������3�(K�w]ef8z ��@�z�{+A�i[�&�@}���,h�zCp�'Nm���`@k�.����
������
����du-]<�q��<���aj]@(6�����������{�����]Tk5B�}\����B�����h�g6�,�����4�1�B#������i�i�A�Fa��E�	�B�bM�[���wn���iN@s��2�-��9������%�A�c\f
h8~�
�#���%������O� IDAT��Vm��^�Z����(]�(
p�3�7x��-:�l��c���ySi��Vhh��n���]�P�i4U+����@�=|Z�F����y��0"�s��V�t���O^����'1m�P�{x�����sv�T*C,�h�OU�T���f�Y�f�s�w���p�hl��`N'����_�1�$�!g
�#�"��'"^�B�>��>�jj�=����
�F�1g��>r1�n�OjE���f�������A�>>L/�����*[�0���pT�l���=>��
m���^#��k����
�D=h @����P1�D��m�� hW&U#z/�];��+��t8��&�	��}���t��A��#��HW��?�����g!�U�
�
�D�4
�E����*]��N�k=[�
�a#|P
���b0�O��m�o
���B�|q|^���+"��3����A��V0t;7D��5J�z��/?�d�p�M\��7��>Cf��J������������E��[g���T��Ky��E`�"�o���bi���?yFwi#��������1���1A/=�`a��O~A.��:V-A�������U���;�<��-��'o���XOu��m����������	t[�E	�(he'K�����6f������L	{o>��a�1`�al����G����E���t����;�c���7P����G��kv�j���� ��7�@������c���hV�0L��
���4p�/@�B/�t�^R�I�H� ����
U���������:���� �n��c��Lg���t���7����5�t���+�����v�S;�|~Y�K��o|/_�6v�ai]q�b`mWL��y���e�FCd��&���Li��6����i��-���i�`��xK���yB9�,�X
�t@��'*���\�#6�ee���_��o`��������Vc���p*����K���s�ee0������ny���N,�����6��c��^0b��3>x���cb7V��wo�E�
��o�N�~���6��x8v��-���v�wF����mR�Q]]�!������Ce�n80��������30�A���T��)4��T�����y��W')QK�.?e��$���W������r Z��B ������F1�R�{-z��}/��)4t�>��V����ba�,qC���d%Z�r����~(S]Wlj��������ZM
��x(���(���D���X7�|���s,��.�kh*��AL-���n���=��y?w�m�k��A��-������y���iB���{�5m�?��r5uq�r�\�T0����ev�5�Jh��2�P��>�����A����*2�l���1���������y��N���	n(W�/�ba�/.08���_�`���(s,���*
��q�D������>a����K;u���������O	����Y9fd��]���-=���4���F_r������u�q���	-d2�0��0��k �?j��m����_���h�y&(Q�����M���(L�|��8�����^OY�����}|3������0��p���K^Q��F�Y��e���6;�0�X{�v��|�V�k�y��9v�7�_���2�����(:�'�4���������Rox����uqg�p�i3��h(Rg��tM�B�$�����
'!"�//,�S�������0�+�L��0�|�%��g����>o��A<�C|�"��%OEd�/\�� ��k�(m9�:��i�j*�
����)Z.�c��?�6�Bct*_3�P�+/�/yz`V����'��7�M[a�������:n�[#c\{�J�]�.��>��}��(ji���������k+,�
��FmL9��l�Ji��S�X����T*c��-ij�,���e}mX,���w!t�C���0���'i��}
+�$=�Y�^��lr�&L��
���N@�$x�������������k[
��.�����$����-Oj@�
�z��i5<z��V��u%�k��?W�F�c

%X�(��"j�2�I9�`%�a��(l�)�G��������mn.8��������j�7�8x��<����Nl�6*34���[�'p��o5s�Y��T��:�� �����c��x0�� ��{���&�`�w��8�t'�4����.6S�������^��-�W���]�
F0 ��]GT/�B�����kV�)-�a��p�SU�K0Sxt(��<����b���������6�������=an`�V�:B�jQ������Ux~DQ�-���0�L��A�z/0����W��L�������@���6Q�~���;��?�}t *�o@����%��T��Y��?�+@����p`��K��Xzf�h������w�ZL�H&S���� �P/���$*4�=��|Li�3���21�@�&R����@rc��!^��r�:�q�@�z�4x�
�v>5�>"�����^� ��~��/��A%U����P���F�o,���h�#��h�8�5���Mt�m��f"���x>'�`�Gog �$CD|�A��XUI���
+�G�KCu�~&�HW	�^q�G��j�y&
*�A�6D���F��(=�����T��TP���w_$������1([D^%@-|6�y�)����)?U�:������6�"�����P��*t������h]S
�/D�OM�g���c�>�i����������i��b|M�zE�@>�~c|���E�-`���/`9��]E\H�v��>{`F CF��#`�XOo��w`:�"|����0;��z��5"P���+�0������^,h6���|��@�K�]���3�w�u��6��_@
�TV�{Bo�
�A�X���jZ=�o��>�����8 �@e�������6�F����#���)4��!�e������eh���f��~���x!�\H9�S�����?x����%x�O?��m�{�Qj�f<Z�q�6�?������c]^���m�;�OPu)=i���n`��������u��g��`NW�
��� �84"@��&�o�-@��J����z�P
��E�N�b\�p��HL����P���?����)�2�`Y�5"�<����<�D��g�es���\��������p��W����"	���r �FN	4h�[�]��u�?�9j�wdz�3��u~0�o�r4�8�RZ��
/O���������z}h�$x�����F�.V�^�9�z]��������6zL���3���\u������:�y�_dx0z�q[gu���j��#k��T���~�����V����}�B�j�p����:U��9P�=���t"^J�!�@����`z�����"������rT/X�m�0i�p�j��|^���ji���$���&��������%�!;:0S@���O�y�1B�h��M����	t7��.]�	�|o3��n)�����?mBBC�|=phq}��Sx��#ttT�t�$�B�R����6�M>�y���
&����S��Sl	��t2�f�r���,Y��#�f�M�2�)����xJ�u��+p����Z!5�!�.�
E}�n�M��O�H

X��s^��qr1���Ix�!����*>��H��������Fg��j!W�#������e�dh�|``!��y��8�"h�HJ%	
X�X�z��B�!����@������'`�2�A�I_�H.������&�����
\�v����`��'W����4���k?"IQA�{�]_����5�	5�b9�Q�C�Q/JM�*4�W_�������xhZL��8�t9A���}[B�D~�?L�	��n$4+��z��Z�'1��E�V(�Ph`��pl7��[����(S���`XG(i�������~L�O�O������V�!)2D�z
R}��P���#��;���)��'q���$��#���Vi�5�(	�&?�a���*�
�5�@�w�|����7�/=w�Kw?4���mWc(����C�}��'�����]���_3���Pb� �Y�A(>�������(�����iT��>��}������Q�^���|P��B�=j:�;0��`r�r��}d;��U�i�M
x����c�fT�y��Q�����9���/Td@��t^�de04�� �A�����mG\<�F(�Wl�,R
�Z���%�U�[�<�����n�f��Aq��O�_8�

����������[����X����*�xh�j<������������m~���wb����-B)������[�%�I��W/�.���4t��Pl��pRW	lZ=��-i8����C�Jm�e�I���2���&Y4��X��;���`��S�G�����7�>.8K
	11	��8��J�o!.^<��W�%^��X�N���k��J�j�(%T�2+<��c�f�����	��S��������?4q�0�����U�S���@����>i����0q�)Q6��p�����Ni�dy��(\�=R����t���LKP-�
��]�����W��`���B?����7�v4�C!M��
tV
���sF��hm�'�G���xq�P�$u_P���
N�y�&7����i
�(�E��,�������� ��T�`
O�hh�)��?�$)%\9$���-��B�����x]H� }4��h!@�$h�4�o#p���O85!
�	����.�!*�'�jnp s9������`��-�m�LO����z�)�����UE#���{�PD��������PGO�A0�p����G���N���pD����eC�p,)j����+[p���?����YTi������~NP���N)�
l�%����?�����?�D�����]@���')���|5G4�����cq�����/]�=��*?���t:�e�m	hX������{~/�,�=z��gzBj@C<
��w�j�+�)����	@�r����=y<G��_|C|z��J�@��kkP��d����Oa_�����8zVp������i(�*��3������z�m������oI�A���N�S�-a�P!MM���B�D�j5Q���_�C���w��[���

��^����l��(ha)h[�	����J�
�L��v	Ck����(o�V/���=�)��8�����o1�T*8���M���}M-��sZ��wn����m���--���B%��_z-+#��}��!��^ �������(�%:�l�[G���T�\N(�\�b�0x����]jC��-�v��Bjj������KG��=��	uJ���64en$�]c��;�icSN������������g,��R�q������k�X�k��5�I�����W"���&�V]�wZCf�VhC���I��7��i<�\���K��x��vbux����+�`�A��[�>��4E�
"��"9�G�F�Ro)h�D����Y�7�� �(\v>H
	�I�4�CTa���Vad���
��7�M3����x�����'@lI���0T&h�jaD�B!�����/����ys�R���P�8�����BTW�����.��v��8��
���SuRyYrz����jj���I�Ip�������>��G�*T����^u�58pB��`;1�!��>��M������`��8m�r�V���p��r������tX`p�������w�Bj�-��T���P�9�C��Yh�
��I]-x����N���t�U�I����`�k���%1����O>��x?�J�[�lbU�*����`���H�%�:��3QhWGM�<1�P�������P�PRxO�����%��"��#xA����;�A|<zQ�����p�i��J0�4�i^]�	~��P'oD	��|��'�h�����a�b:������RR`��nI|�����&��L����S2����niK��J��������pv�Q	����������R�F�G������(���>h�A���u�!��o&��,f��E�`=�!�qFP#I]G0\z�f+����l�M�A
jf:t�����oA�n�����n�XWY�d�j�������|O�U������.�����?8�)�����>���N�����v'
�B����3(P:6���K\u��������P�/��*���B�Qk�d������A��N��0R
`���b�E����t�N*� ����>R�pC���@����������y�J���p��MSD4p�PWg8�Y��+G����"���xj�<R�$8��Q_�{��c������P��&J��L�`�i���	6���5uZOP��_�����%)����6w\����(R�1���������^�����N�y�C�Qk���-���M����Rd.'T��;�^��s��\���P� �b��b��v-�C
	k����;���.�6�+}7E��|_
��A��/��R���[��PhhP�)�|����S�W���*C�e�\YBajj�m��)��!�+6	7�j�/�N���
_���-D�q�/�����
�����*0����N�R��p��E��!�����W��{;��E�
���6AR�xhZ���oVs��� Y@H	4T*T����������df������n
U��K4\�D�QK�dyH@C�zNr6��b(���} �m!�q��c�FJ���hA���,���a�w#q�Cj��"y��A�����J�pf�V�o��D�@�����y���,U1�RB�Zk����@�4
:5�"����n'AC�2�`noR����|�����`p!e�����Hb�8�Sw(Ny�b����>s�4��������/

�����

(���F������1�$B
.�vi$\Bh�����n�m_�� ��>�S*4��?��D�BJ���7�:�Rh�b�R|P�6�2���
�Z>[:5wq�D��5���@�N�Kb��I�#���A0����$C2��SUG������/��vir!�s�5�&8�Th�N`C�N�~�	�(���#l#��+��LHjUO@
����pr1v�I�+��dA�E9t2$�V�ep�h�:v�\��^uq�u���������BC�%{aO.&���B��&n=#�����SWoQ7J��E�E{��D
�������O��#��.��7���=�j}h3��	d��.T��C��`�
^�R�R�N�
CP��W

�""��5v�p��f���xN�D����3��mMM=��7��eRH8&�GT��UZ8�Mj���hX��wb����F�r������U���)L�i����!A������+t������3`���PH���&*t�Lp��&��a��

�
�����K�0��ujj���5����s���z�p����,p��/h/�+TJH
4p9�����[��f'kK{rr���hr�Q�XCd��hH���L�O�z�	���5�������f��!Y��KT���O	��8M(]��$��N��_e�D4������yL%�Az�����B
������D����\<�������1;���Q���Cf����AE2��~�7�YQA��n�W�\*
������T'��3{���B�&)4D��8o�_<(��F

��B�"��6�q������]
*�[%����$6�ep�hXB
�z�+���E�������}B$�in�<���L"�Vs`�Vh`����_p�3�!���J�B����p���B�h�����F�p�lpb=��5��}������C����;�U����h�r��r%YV�E�����&kK�I�8���tKf��c-�����p�
�O �Ezj� IDATv'����
����������\��*��]����P��0�����^�I���
w�(�[`��������nS��RSq�����B�I�3�P�����+�����
�h��F����O�G�'>�D[�Z�=EJ��pzn3��������
�4�-����)*$
����I(4����k8p~yJ��"R*4��B��J
��-� ����po/�*l��Pd� ��z�G� 4�#,�����)A��R�8����
(D����s�w�%d@C!RS�\��p	Q�\F���F�����:��B��:�q�{Qv���
Rz�Nk�a+)4t#�����A���0%�������t��ur��)���@���4K�C�9:1�n������fh�rv%`����y�
�x3�S�	�@�����d

#Z!`����qk6��4���6Y!��@�U'#��	���N�_y#\B<~r-q�~�p7�!�BCmDr^����^\���6�XD�#[hu����uPX<���ss�����
�����������zA�q^��XX����ch����mD��n�Cj


`�!*&B�
�nD�����P���P`X��������Q.oj�(��=��
���h#�(42H(*�*+>4v�����X�a���t_�
G�G�2}��\60x`L�p\|_���{�k��B�@V��qA4p�,���

2�aP���wg�{�D=�4
���#�0��*���$ZP��*��

,$�d���X�*�Z���K
V�`���&��V�xK��������c���B�[��b-f(�I�\n��;�
���?��
a�J6�9&�	N�h��N8H��|N��]s[G������BCmM����1���N�9��_�f}F�I4W u�(�'�;����#����hRG �z������h�A0RCRh�%��;�c�X@���Y�8#5��e{"0����	���4��P��*.���z)URs�@;z�'�4A�>��cl@s=z�p��4����VI+��5m�6�8A�I`���p�����@�\-0��!��I��U���0�?M W������p������`�����

�t�G��TH}T(A�&X��\\FR����������c���~�B�]K����k�eQ��@�������Aeo$E�^���{�^�G����qR�&�sZwc�Tv��b����a3��S]�H]d]����d*�m`��<g�u���t�
���G}��mf'����A�:���W���M�
Lx>&Uh��r8�_��"��-ARG�?��Php9������z{�8�

~�.@��F�:%��=���2��n|2��������~>'����k��Ao�
�
^7���fwF�	[E���m��0X���6���nF�6c�-�cQ����@�>�l�!�7���1��]�������eM���8~8�\Gj���:�����B	�O��	����=c+��/���N���m8�l�p�@�����1e/6�������P!��{��N�zor����L�Fj�K���B���kQ�����+4���Y�9���fv�rpq�L�R��7�T�<�D[S����`���h�gV���BC�%����A^���\Y>��%�!]]�k"K@C.xT-$���@O������e��D�&u�s�	�+]��������3�����

������v�����E��6�'�c��cg.�
4��������?+7c@���!5Y:�m���	����0z����r��%UT�H	4�1���]�'��^�v�N���^�����6����m�,>��2M
hx�"��=H�*����`r�J���.����
4�T��*�KW��bJ\40��r~J���p�A������~���!�u��c������o�]%���FPF��]���Zd�"� ���2����R7!�>�f���dr7���=���T;MDl��W��2&��a��g}��y���%YC[��D�$^	����e��5$U��"�R��
��WrC��1#_�G����1L�'7�z�4��Y%
UKZ!�����!\Ib��p���o��$\z��Tl�a�{�"���<����4p�F��;����m�����0�s�&-M4���X�!�����*���~���	U;Kx�2�N����S��J�"`���,e]�����c���0��9�
L��M��W������������6�G@C����Fnx��b�Gr� �M���kw/>������]"/V�IP�a��A�8������;��k�BhW�8���
cXhE.%�P:UZ��u�
z�*�=7��B���c���������A0��b7)��UT&������8x��V���)n8���{Lr��������/o\y���0c�%�����0�B��7����\a��b���������Kp��O�B����uWKXA�q�����-����oy
�&$�K���K���[bs>�i�����������^�(o�e&vl#j�

]z�#`]c�;�e7~>���^�0|P�$�h��	�*�q(%\<0��C��$W(��pGqx��P���d

4T��z{R���D��NvG�.��I8Q�@�&��7o�������;C

������'��!*2��L�E�|hO��7�F�b����A�vp���7d@��6�Gv�[ ��A8��/�i8y�`����&5v1qt�,�l?U��
�'��B�@v��g|ty�8qx�m��Q����C�����o�=$��n8�Uj���\���g�-�w����eT&��;���@��=�l������������I��e���-k;C)��U0��
�DJ��h79�
�?�f�;��T�^��I�����T>X���\0�n6bcc���irIq��f�����V
au�s'W���U��
����4�\<K^=��2p��8�\|K�t#���x�:�B�C�#���B��P\v��C��N��>(UY�6\���+
����K!B��	Z�5�0��{��w7N���@C���G�dN�q�$W	�Y�*4������"� F��K�}������e���18�M����������P�Du
���Z$Uh`����-��w.�0B^$�{w�"/a��u���q���+-��d��}�{�X���
~��G��I��*�����J���@��	�?���F(^�������Xd<$�p�u�����7�`.��R=����9��c��
��U%��R�����:���S���V$iy�����}�rT#at"<��{@C4)�,�
Iv�E����w.'h���y?hs����,�N�����U\c�a�����4F ��O���"q��l���>�������v�=oS�
�V��e�o�`hS��%*4p�.-G$���>)Rk�/.A�E�4<;=�z�&���������8Z��7<��[���8c��������KD���E�xr|:J������!����k��)�5�����lI����686I��&
�l��{�b.s��6� 8��� ?��$e�����-����]"{Vh���<�d�����TWO���@����7�EG'�.\��A*�}�m�`��-`�E�a��u]�1m������SG1�V�d@�Prk���?g�y]�O�����G�vI�:S�o*48j�W(�\'.�6��n������V��]��K�M��]0��H��p��r�X�x=��B��A���E��:���}�O��
k����}���v������E! i]SSh�%����$4/D �����$
�vm82|�J�TMG8���m~r`�a3I���+��y��h����
3������f��7�x�!V<+ZWVj��aY:�*��������H2�-h������*�}E��Y��$���_���49N��^A��@o�����������]���}M�~�
����k/N�����p�����7��������p���o�_x�zZF"�7���`� ,*X�/�.<�Gn-He%���Xtr4�W.`Y��f+�y?��Q>�R����4��6]�Ej�B	�U�I���V�$w:��n%�5�
���T�!/�:��o0�������6���#�i��)��0���`��m��q~���{�g�h\|^7��u���zm�(Ix�2����%x�������&8or���c�M���N ��^���_��mo_��L(]��h�K�>L�G�j���F��!��To����BC��H!�|��������@C�'�[�{9^	��R�_Z���i��^`�!����+�������7#�9tO���#� }�za��(��`�Q�/b�B R�3�	~�9�<������p�n>z�U�u-uRX�K���p��I��XB��UZ+	�40���uPAeGU�"��\fh���
e	d8p1��!AZ���[^
+h�VgnE���WX��gI�E��A���D��*_
>D�Y�r�C�*8/�}�H�B���MkH�Zj�0���g`9�V"�`@�
z���3Z�s��)x��H����a��gwy��E�5��`���)/�8�o�=Z?"��$�H�,`�cD���l��nyKx/�JnB��R>P#��

4�s0C|L�5�7�E���
�t`(6(q���A�
�T/�Q�
����@r�����`��c�Y:�An����O��KR��W�r����mg"��eXL�)�Z���	zu
 �s8t�:��C��{
vg���#�A��7��OB,����4��r���`Q�%L�j��=o���C�Ap���qp�a�o���y@UutQx�{G�A��������M�&5���F�Fc����{ibDAz/���� >�������v���3s��}`h�H��#%>��|�8��������/�u���<�1��9r��k��p7w6�
�����
�	�xD�Y�P�i?�!�ksQ�X����}/���A�nh��6�q\�HXWo	�]%(!��h�7�i7�U����+XUm�$��Z�7�#�Y(�k��+�����2� �w���;��sK���Dh�����3�kk����nBd�;�G�G��`�u*Q��^�s%F����-mt 4"�i��
mxO3����z�"�V(1X�������x�K�w���S*�Z���#�C�k�y�A�9�g�T`h�u���+��c�~S�u��e8L�u������������sM��������$��y�gq������[~�����y����i�&jx��v�p��A�)E0S��=���i��A^�v(��+@C,[��n��7�~�mztj�
|��c���$�u�L��Pq����hz��6���*�,Z��!)<�����[���O�@���?��9���Q�LI�����^��Y\�z���xo`/�C	J��^r�gv@���P����P��+@C��vW��*O@C��TR���t9�h��
��K���"?�d�����@�����>w1�j��T-�(���r"���#�@���r�!�o�s9����]�W�XPg���H� '2��}�%X�6Ba�K���hxmXPefu9��2���6��}lpr3���
��Y�u����*V5@��e�wS
Cr
�LU��hP5ma���PX���z��r"�y�3}v@�:�/���4t��d��p���c(�Bw7�U�%du9�����P����������s����hP{!j��u@��*TY�4�
��2Y]N�5+
m	Uh�����6��gv�^4�����WV�]��\Nt�9��(������@����)@CA����S������R��|(@��o����
��r�Q���>M�K�
�k����:����K��N����`s�V^���5�'�f��7���_#,4���*}��
���8�Q�������Q{S�T3�>�b��"]>D(�@CA\sNy*@��mqhx������!7�U���h�`2��,���EG���L��4��d���U����\��N����
jo��Pr���Tn�T��:T����S�r��
)�A�F�Ch�C�eI�
�k?�:00vvvT\��fE(hP��"�]���P���s��A^��
����_hx����Th�/�M�Z
c(@Ca�+J�r�
�����\h�T
�PP-��[�Z@���.n@C��+��,N@���/
����V�����H�
�v���V-�9��-_L�4����Ni��4�n�
��roU�����*@�����(@��n*�R[@
�]Q���P����V��*@C����rP���jY%���
�P4��4���
so�!��
�k?h(<�/������
���Si���hM����K�T�����W6)Wi�����a�\�������������)}QN�
�g@}��,b.<,��$$3�������mY�5����~��~a*�����kW1�����$��
�9���
��9�I�j��@�	o0���B�hkk��RGQ��7�{��`����+|u-�{NH�79����_7�T�51��c����J���.���o*�(5FRg�1�@7��j����������)��(��^�
�i����7O�TT�{�DSx�~��k�H�&���~�HJ��W="���=��b�
�
o-��:����^P7����S"���:�7U*����=�X���M�w�����X���jEu|S��^/���V�)"b��7�"�^��M�k�3�����^�$&�{^Q�{����8�1��"�������w�v�B�����H�4��������Br%������Q�B��xh0���~��_��hq��T����;�R�@��R�)��]���
��
��<�y|+��]�=e>W��le>Wx��7��/���2�+~�������\����|�x�S�s�|�M�#CY�u>W\��������4��]�C�kh(:�L1��	dq6(����������u��
o�G_a���y|S�s�o|+��]�������aggW�T����2�+,s�7Ue>W��7e>W<�7e��x�o��>���7��s|}�&��&BJ9J���z�����������;


E�%�U���y����3BOO�(U[-u������%������{Q����)��X[[�1�`ay/��.�||��b-,,�j��s��t�sE aa�
��P��{q�
s/����,���V�����u|+���8�����k����o�|.�����D������(���M��u|S�so�>��>Y�q�����{�8�o�u>���^��eA��6����PwR��?��BC���
��E�����
���POO*���.�Nq����]ay��	����E�+�'>�s����o����{^����������=�����~(�9�>��{���Aq���\���������V�D++e��Z@��-UL�����V��T�@*H�����Kq����x���2�S�sEcTR_-��������V\��2�+��]��C___}f����o���+�j�[�(���b��Ij�����Am�O��8��4������RY0)����ROM��R=5�.����s/���2�S�s�1�V�u|+�>��x�_�A������*�9e>��^T�rP�s�����c�W[��+�==H��
��Z;)��x��P��b.%d~n���(�4�p�_��5�^yT�4�W����m��S��	�N#���|�eU�����������?'))�_�^�8N�U����Cp'�@����(i��r��x���������Lp�F%��3C�~)�����
��n�rf��z��d���z���hdw9�����mh�>I�S���d���(���w*�U..�=�JKK���9�o�;�R������������o��O4��s]<��z����n�����u_<��~�U������"��� IDAT�'�������^�x�$�X]�d����5�7B�G�o�zZVq�r��s�	I~5���g����u/ ��e��rWZ���b�����������^����|n����'W�E����~�#���U�{FC�f|S������������*��<e�ur����_�JT�����-�tD�Y�<�� ���^������Jj��^����8:C��sn�X`q�A
�se�X�D++e��Z@
U��"�x\����C�0n�M�^�w-]P��$_y*@�4���)q��=H��" 7U8_��F��&�>��E\�V�t����q#��m�76�B\�Z��Z#m9Kc�
�����e����,
��������2��}h=�y�e�����}�}y������nG�������]%�p��6b�(��v�_���_��a����bU�%�>�g���JD�@
�c� ������Z��ab���aj�K����	7�.������V�Jp����!(�o�����;]�WLh��!��W�"9�p�8�^�O����{E��J�lM����`	�#��uK��N����^#�O�x��"r�F��(�����New�V������ hP��7���M��R������RE���H�)@��{n�����4\[+@C�����Y
���!�}��`����]rnqhx�=R)����4�;�b�����I�F�-j�T���1hPO;�\��������o6���^On��
���f�Y�)��k��d
<jWC�j�!����m>���k�����`��y�6�r������a��3J��dfq��\�z+��;�������%�����4���
����:�^u,�������d������/g/cF�z���j��oh�t��%0�?B�6P�BCLX*��ODy]���:������.� ���;v���c�;C�������������������J���dit�V?��.?�\�&��bp�7{�<�b"hx}CiZ�@�Q%��A�H	G���_�0��	'�����N�����"�A��z&���L����S�����a��k��ZL_����Dlh�I�����c���U�Y�@C`D4v����"���F��,����t���������L��H�@C�w���m�b���X�c�\�ED1uc�����Vh���`�=�������Gq���\]��>�1p���J�5r^��h������`��1~>�7��Rh�(�����qq] �|��
�<s����n]��\���������K�r0������J����%��������zS

��um7�si���O���su}!q�yJ�Q�wD0<������Gy�T��J8���1rPlv?�����z�Z 52����0�D��(j�[�!����RP�L�	i���;���.'���6�,������	UCV*�Cu
g}�X�q	1�I�D3�n*�%kDu*4��>�f
�i��+Gu
�M�9
U>����r7�����SSx.�����Th���MGa��9b�������������� ��%�<z���~�o__&O�z�����s7O�K�yI�n��G����BK��Xs�0<��U���;,O�2
�?b"flX���g��9C�c��?rU��DV����Q��.��G����M�BC��U������[=x
��;?];���2��]�K�����;��������:�Frx""N��*?�F60t1C�
����{?��U��FV�h�m�)������/��G�5e�y�R�X[bp��x�(GO]����B~��m{���\�s^�=~��'�c@��-<_Ww����
�Pt��4(@C^{���O��F���y�B��*Y[���v��-@C��$���Q�V*������	�r����Eh����������
X9|�[���3vlBR%�;T�sC�>��M�������~��H�
���Y��+N�:��tx�@C	����\�6/y�
{E�N�o����)����u��Q�T	<����_��u���o�u�'y
� ��/Z�F�_`Cq*�h��V�
��`hi�������4��Z��?G�<T��,o`�� x���m�<�	�f^��I�������q�p�mD&��[�yJ��D.��e)����%[u
�S�>+M
5���;��C-l(�@�?Ggb@�I�p�P
i����u�]�����	4h�{��`3�^��Y������O���1�<����8�;5��v���I7��F`X�ne��Jn"�h�e�L]����'0A�@C��P��"�>�;7M����N���C-i	�ACW�?���WQii��48|Uw������������
��m�Q�h�m�)����0{�r��G�������������3073��k�]��::HLJ��`�����������h���OI����B_O������6#6.�Q11���#���!-5�y��y��X�
��F
G�N��P�t��)U:�i�VE�(u/D-�����	T-E�
,�t����C+W<����#>����Z�p����r�����������+���X
7�p-8�o�4pZ*F��
}|z�8�p��~�>��77��jn*u����+
:Y�8/�q��0�8�$.��]�P_�32�N��0��F�2%����y��������a��<@[��/|�1J�"���x�F�g����)z�
}CCX�c����(m'�HHN�������5��x]�Q�2��� �'~9{E�o�P��A�1�s�����5���������X�����HMI���\j>��h=7�hy)�DE r�
��)��R�u"t��4��I���=s��Q����`.���g=�A�Bu��9
�Q���)N��TU]��o��Kc`\Bu�5���qH�IU@�^��������MU�X�������V	��Z}
������&6
�����J�/%"�V��w��c��'rRh������,��owm��c�82���je������W?����B��b%����qk��[��hm�?�����w1�Yk8��!%5�lZ������%�@/���� �����=��KO�_���]��`�&���woC����������Y~�����g<W�$&�F�Th�y������*���k��>}�FY����K��}���:�S�V�({����N�������l������~h�26��}{A�����ul:�'�=#"0k�^hXV�'�:��n�k!KC-�/{,��L����P�C~���4�5
f�v�����hT�jcl�k����@����G����v�;�-78��vi�q0��!��Yy�����=C���SF�[��w�u*@�^E��'r�����@�����B��g�]G�������j�e�c7��~��R�A���TiH��w�@CK��"~�U�L�*��.e��G���	�Sh��ZU��e�Z���O0-U�������I������������C��5���
	����+*�����($����i��8���)�52��M����a��%���{)
'~��zc��

N��S���N�E��|����{���G��6�L_X8V��Y#>"MR�����S%��6H*4�1^��o�4��b���c�281k2R�e����}������5�3�W�v�Vh���pk��<A9
a1q���%$�}��bi�.k��[O���	&�������Qy�1�H7�~��,�w���{r�����������0�:>y��I�]������]��$�'c�T����$Q������~=tY>�m,0�n%�]{H�y�I8>iS��b���g�����s'�*4�k1N�����OB�n�anU�O����1\����������'��R�%t��p��v���<�{%����0��.�y�aS���c26.��<��y�72�� _���!�����[�����@�
j9)4�S�5���"��t�Lh�����L����P����#���\AS�0���n�3h0�)oS�����X}�ZV����q^��#:!��"��{����B(,��=�t��Y����7�
-���W�#�Yfu�����L0n�/�lS���p�Y0\m�a���ym�U

�<<��)���%��w<~�n���T,�C7�1���{��������V���i3���zjb��HD��n �N���J]�u��7�����g��
�����n���
0���i����H�A��/���#/����������J��x!&��Bv

�bN��.���?�N�;X��5���b>zVq��n�6�>�$������TW��c���`=|}�,�9�����h���8K/��j
MJ�2~?u�

!����%1�����
{#������s���&���L���?���C/wg��GlR2�8�.H��T^��[���|�'������a�o�.����UD$��y��*m$4���	t)[M�/������d�)U�A���?<#*).�v�����X�w�����������!FTl�_n��5�����@���Wj�u����Ts�\�*Z�t�u9�������ThO��
��_���:��6:9U,J�k��8��{
��4un(��r�
.��+��ri��=!��~R�-�����'w�F2�:F}j���[Q��_���%�'�����+<k����9��
���A���8����D|D����,��fWW��wWw���T���Ey���u���T���Z	����l6B���l��������{��^M3M2A�0hi�6�H�{�i�1�e�a2������s	�U��rRh��$����}�����k�	(e��	�u��LW
,���S9]�a��L������8t7��������z�9�b��D��n.:�k���Wx��J�?XG]MWh8�kw4�D�RZ�K���@��>�t0�P<��@�S�a����a�%���4|�XOm

�A�����mR���0<��Q�m�\��T^Xs�wy������@D��c����`<.��9���1���.7���}�ShH�;#�pB*���\�th	���	]����V�����A�uSh�����Mj��u�TR�����R�a��'��Z��&���B��Xh�k��������(������?�@��x���
Qw�`h���[�������a�g ���ka8���*L^c�|2V*4���!f�1�R��U
�*4���yi��j���cD/�M�z�j#�A�����QD�
�3����nWh�� f���F��p�5�����G.q���	��gS�p�x���t9W����y�����'�N�
���.��y\*�{�r	�q@�sd�vH<�Ih�4�t�i�/RY��cW�'�`!��> �^Z���$��H��>��7���������@��zm��o1�(�k$��G��C�O�JO�
� v�~h��
��T��_���P�B%�i�U�����K�aP�68�u�o^�z2/
�=u�����	&��)�`�o3��y^�?���]���Q�	��1u�B<}B�a0���r<�x��L�{]n�?����.�{�y�p,�� �.��<�0��F&��L`��1xFe�J��a0mPB�aJ�w���~i{�
W����U	|�r�I2_-^[0m�m^k3�|w���]��`=�W�����(��6����*
U]uP��6��k*��f���y������O����~]�w��-q���@4mQ}:@�����������h�P_������w~����6����x�R �t�
�d�=hi����.y��-$<��y[�Gm��y���#�3�&xD����a(9��xSR���e:�������d�=��FJ��x������tf
m`��4���7���[��=����	�bq�M��)�F�|���� ��ue���	�v�`�8g� �PJ�u��=^����p��6bn<�^IC|uF���P�!d]�~����Pv����U>�_]�^)#�WI�C�*D���
D���*�!,&?:�d���U���n�1z�X���>mW[���j�tJ�|.T�E�Tv�xSM��R��ag�
���)�"4�>x�nJ �F,�9s��F������~��c�Q��Z�*
�q��[�����#?�
��B��BC�6Mp��
��yx"�F���j ,<���p���5�;j*��z�����WS���~��m����x���t�����
��~���|�;�b`m����Lj���n��

��R3�2�4n�a���4r[�xbF0 v�|����b���)���<��t
�jT����R��
&����yL<p�	�����T���q��S�k�c����9�b�}tS��G
,�t14����'�b����>�x%�U(���������-b��C�1�6�c�o���ZO,�����&�`���6���Uq�7'/H��B_a��(��X~�6�l����������xF-�4��I�`�j��C�g*���^4�s�������2j�C��`��$��=�@�Y���t����mW����_��J�4���w�Q��>o$����k��P�"�Sp����{J(��;-�]M�kk}	4\����P#�}
�2���H��4�����Lp|~4�6BD`
���L�C��QN@�����?��Y$a�}���|�hY���KV�����Jv%Q��;�_�t���M�x�!�0x�B���b|�6���
=k����g�m��Xr�(F6i�9��I�`L�VX�����$C����]��!��Q����\����������*��b-������&a�6nU$���F�xp�����A���I|���9CC}�f���1�?y,�k���������U��,���pT-]Vm

�+WB='L{��mUw��|?����������j��w`0����)�4��[�|+����	A]�w�p���s��p���4F��q��p���nAr��C���HyF���uQ0��s�@�	]��'������G�A���2���$�MKc	 hB�7i�7DJ(�#�M�VG���N���
Ze��U��4D��b���n}�5�p�6L&vF��a�QD��]���e������u@��x]EX����`��V��k�w	+�����~o������'�C!��I	4���B��?�s�2Z� :���6�����" 1���6��m�t�O!���pn����	�=k�~�:��6go���}Q�n�Q�`
,�}|�o@���I����4����������8��(���#D�y{�J4��{��]_�����3Q�q�9L��N4���)F4t�1o�Ry�WB3�7��k������ry,8q#��y��!��Z�]
�#c$������Q�7��akj(���nc*
�N���|	��F���/
�wC#�U��8��@;Vq�����M0��g�n�sAx���K`��;�����s�(E��:]N�x�/k;GD��A��ya'�����O�c�O}`_�
6%+���-R�a���H���{�6c���01�E�n�e�����/.[�nC~���P��>��q��6��9����a���]�s~�%��M�	hX��sL���[�s���5�c/����6~h7����U87�{p�y=�h1���k	F�I�a����>X��K\�zWi�m����5]�]}c�Q���iL�u�9��z}�������^�����,����D`f�1���R|I��[����JxB�k�" ���?��,+7�U@C�r��RR+�������%`��O����LK
��F��z��)�I��&��p�����������B���r��*6��C=s�}����|#�gT���7`�l�������|Q��-�� ).U:�����h��eE�uC~�K���������f44,_�J���s�������j�1[����~:vQB	~���������d9[cC|��6��q��|/�Dl)n8��,���`a�V�� *RA��.��_��si+sL�s6��r��&F{Tc� B3,��" IDATep���q3P�1���f��o��j�%���L�
<�~i~���������]�_��F7�D��{+�'�H���3o���j�!�~'D�]������$��*+����F�m�~���0AX�Z�wF����I��}��(kl)���^���'M�F��(������c�0?����,��J�a���50E-�r2^��n�hj��g��������}d~�>��jv�D�%�d<�yF�����"C�A��S�ofh���~�k�W^��j[,&�Q��<�{���q0�b1TWx~�h���h[�2j�C�t�J��������A�����O��0���L�7E�'7��$A���
����*�]��
�8n>�xQK"9O���q
/%H�A��qW|��\Z�LN��C@���>Sui������%���+o����4����KI����m�������<p�%:M������!��0��F�
:\S��Ow��v2z�hc7��������p �7 ���g��\����tj���)�D���>9�����BP*���b��2]
�f]��'��>�a��Ep�������:<�)B	����{�����8��������P�����V[T*]K
����?7:E���P��Q�.�-���1������$��u�\8�>*k����
���H
	%(\Y�3��lL�8BP%�4T�f	��T��FBX
��#.>���)]J|cB6Rx|:��CR�1*���?�^�Zp�a���#`���Gb�:�P��h���!9>!g���������/�����"�����2�@��Z*Yl��[lS�.�����I�I���0����H��R�s�x*"�h&�C��pp�r��p������t����J�	z�j�
]�����^����='!�Vu�.�3�7��I�R���"��BhW�i
;`�:������H�����x���+ch;��@�nug	XW�#��������?���#���.R9GG*]Xd(4���:e�!�|h���!nN@������G�akn	;� `����m�8�L��	��v�����A�����v�S�7$����i\������A�Y_`U97�=���Dy$ �9]����D���a����=C��y�E@��N���c������0	-|Ib��SJ��q�x�����8�z�<.��w�>�9c�����_-C@��N���Gm��J
�x]k����mTs�*�%;�����;R��������/�����1��!�	��!���.*���b��k^Ih�H_
[��aH/#�=���TNa�pq�����3�X���*��e��_��{�iX�.����(��;��"�r(*��^�N���
&������p�'R�i�#�p{�%�Qj�+���ne�d�=8����e~(9�"��BR(A��.�p�e��]���q�t/�K��{�6�������J"h�/*-#�2�$*�h�A'$�`������Ebp,"�=�@�����E�����_���}M���:�����'a���,;1$�������&p�����Tq/�-��+m�C*HU���W
��p-�uv=�Y�����4�������B��������6����lSB�*(@�J�T��"#�]���h9�1�"4���gy*5��P��� ��R�&�������O	��J���gu3���_MBi��/�	�������;F$E031�!}�����,
I����d
>9P�w�<m�5\�z�|)�j��ERa�<J��l�h0����exzCK.?-1�v9|sL��Y
���{�
�g@���lrO/d	���_z�&I���4�,$�0�i~~UmK��;	���Qd�������s���O**��	���>o^�>?U-���V�Og.������BQ�
A�KA!4U �G8���O(*|��C����3�?cxJF��ny��`�m�b���hQ�4�>�}/��W��hE�A@Y����t5�da�-Th�/��J�����x�M{����$#�
h�1��S��'t��.���g�����X���:e��p����G0j�;��9
��~G�0NMt�����D�O���H����}8v��0+Ip�@C���.>�t87��)x��%(�d�U��`�Q�_<9
"�����k��8�u[�^�t#�������[�8�l}�`������I~��rB����w�`���R�����%�[���:c���|��e;3sl9�B�J�B(9��0���x�Z����	�C�a��e���]��[�����
���}%D!���:b|�68w�������#�s��}��
�N��~X(;�V����rBl����)��)��G����{X;~O��G����Y���?����	h�������,�!N]Y���>�U�1������X�"�E���Y+���a���u��M���$De���F��0�T[��H�~��������$!�
#=�n��S-$��p�6����8���LF�C��]�y�kDcaY���������&t*��'����a2�-"�

��������B^4��Y���I����KK�Pl�3���j����t���	����>/���q'���f��w4y�G�������q���+~�����E�z-�����I�[w���
���-�|7�f,�n J3��Ot�~A��H����!��I�r�pp����%�P���p���(U�Jq��5l�~V�q�9B��O�'h1��������T`@�xv�\��s���\�|^��/;R!��MT#HP���2��	<�	XYH�A(-�����gnr���c�!� �F��V<���~���� �-��C�2%0���?go���P������8�?���;Nc~��8s'~O��x��M��)6\��5�������(����Q�'���9.�X���w������Y]}���%�/�&?�p��������Q�� ��q�}7l�[
�Z�q��<�����	}���c8��8z�K*'���D9������z��Md��X�c*�n��9���Mm6����P�����q��BM*Mt �aih��wh�42'��s�����~��<�k(����?Aq�X�1��JLj�����	
�H��1�{b���X�{Tx����]���
h����
Q��6���TI�O�����p�1:����K4N�?�������%�0��?��[T����,q_W���
n66Q��Mpj�D>N�t#���ek�������"4~�,|����w��|��
�<�X�qk�I�A��� �����J6�Xu�6n?�_�'�P��-�p���B�Ob��%l��'��q
��5�i�a\����+u��k���`�����ccL�~43�6���"��G!b��x���2G$Lx�t#�h����
1��M|���T����\9EA*4����J���&�Y�9���"7��k�AY6���>D@�S�~��u����$���6��=���ka���`L>�A���"����P��� EO�f2��2�[�D"�]�LJ �p��
����]@�A5�����7���$� `���!`#	�4Lm0��z����\�%���������|�����44��
R�A
�J�����^(C
BMB���}��se�,������5�-������Cm����D�	@!��6�T�x~Z������.���U$lT��*�y���5���z�@$��j<�n���-TD����i�x�������x����h��;�qo�N�q?^;�y
��
�Nu�����p*'��I`��$� Nv�}-	S��a��B�:������FB��Zh�p9��q�F�S��v�T���Zr��+4
����q��BP
�W�&�������8f������z���t"~i����w�Y*�;O$�.5�|G�|T
]�)4������BD:�����n$v\\g��p-U3��K���M��y�������H�� �p�u����!;�A�M��F���:s��M*4���
K�	�a`�3'BO���=�9|�6�s�P��1�8����
�Mt,�A�p���g=��<��<��K#d}2\Nh��W���f��TKCq�����tKQ�7X����JW��	��3�K���O���GU�A�-A���~��T:`4�3!��������v$�
"��S��w��7�Pb�����RI!E��
�!~�Ym3]B���Y����0`�`����k�Q�H��Z�<q�7@��5~��
�$�W
q��A�k#�*'��aO�e�a���6��ABVzJ5����	��p�(K��G�#kh���!�����K*'L����&���c�b�,�slVM�C��(��a��qTY����	4�9u��
���TR�S���*
	+�IE�{O�Q��"~��n�A�k�^s���3G0�}�ur%�	[3|KE�Qm�b�����.�p���V���H!�Q��-\J�����%�0���2M���P��ti[9��4�[t@ A���/bT�.���v�2����m���D<"��H(�pL�C�WC�$�~`*U�CMG�+i�-�������=�-�A��	H�z�%&W/� ����=�;����Ax���Thx����jPqv=x�9��$��Z(��;�~����rB����;��>��JD��+T=p���sT�IW���3���&����)�@TekK�� �����J�fT��z������x�?���V6�u�2hp�����y�!#M�yH����C�Y(<U�i�`����,�������j��y�+c��������sg����^4����+\���o��\O�c��M���'.���[A��QW�n�Or�djO�
<�mm��v}U��n��F�y��}Ub)�2��FB��}���N�)7b>�.f�Y�)�OffUJ�
4����7�{*=4mPk���G��(����  ���������`�z���L	@d
��_�q���e������Z 7@C'��{w�L��V�4��F���4n�a�_�+��������*�d
�n��11�6NX{������|]�h�!W�F����;U��;�!�*I��c��v�0��BB���`�D8F�A����$��x;���]���=�4��
�@*4|K�]�r�&��/
�i4
�<%�_�!��&m��i���:]�{>v�
h��&�-��?�g.��N����+4�x������=�/�����i����!'���8U��@����e1�C7�B
lg��`� �m4�}0A���e��dE^��C}]�����Mp�

��� �bi���)�����;S3�Pp���y�_���
��TDa%U
��B�3��	"�@�<o���*4Lh�����	&o\-�9���0��~����V]nB��

G�=Q�*���J��� ����s�@
�����������
xa��#��)~��~�X|V���B���n}�2��~��c�y�eCGb��E���G������t7aIC��s����h��]N�vt@<�]���a��!�3g^&��boG����q3Z�������'Or��9
u�����5h^�2�!�P�d�L���]ZHI�PTw�����T�29
������S�$�D���BC
��|)o[M��0�B��!;��4�pHK�	?�
1K�������P�R�-H!�"�qRxA��Cf9����6��[�
B5��B����]��x�}-Rp�<�'���pp3�{����6�~�����K�a�?p�>L��T9����TA�J�����\�v�uE��d^5�L&�0���X\�,G��)���PM�){�.Z~�g�|�^�K�zB
cf����Q�C�J"��s���{�*����i�t��+���������s|��=��;��FW3:5��^�}��f���VE|���t7!��

��9a�t�V��P-��{������p�

���IU�����<��{aQ<_��fbd|QN<
����P�!+�  �7�`R�Z�.������3�P=a*\��k	4?���)�dfo�B���$�Ja�����=��*4��6	���F�a�_��B�i�[��6b��C�6�����1b�zl]6mzM���#�,��!'�a`�vXqy/��q����T�~

�7J��^�-�����9�~d��)4���6�B�b�T������^�0�VY�?}�����Q��� ~���C���G<e.�<�h�S��T��~�eL/� r^4@!!9
O�R�������L�A��
0�x4<����)����s��[��)4p^$@UCv@C��fH�)���x�U����2!��ThP
;��A�V���A�q���	��� �&"�n�ful"2�.��RQ��hJ��w��D�!�R1�e���M�%~(A(=��Bf~�ft!aD&:�a��b�C~����^U���%H�HIb��"+�0q���|����5���B���Eh��ML��_p��	4�a�v�&R�Al�����o�W�ZtIa�/��8B��DU��r�~��5��`����t�`A�G�oDpB(44�&��H�!��Th�b"7�RM!+� ���� �u������`}�%����	H�5\���B�<*4��"_�6��#�Q��z;��_��KB.3z��)U%�z�P��
4D=�V*V��H 4(�U(S��u�:]
{�1��e>2c��oT{8�
E�w/
/�U��&DE^4�1@<]3�R�@�:��y�6R�'��N�;���4>c����~�.;������J�a\G4Q� T���4��:�2���~IT/�@K�"H�{Em��?v�nB��:9ic�_
:U�����9O��*�N�d�_uq�O��p=������
���z�sn�qOH����P���.'�
���	�Q��i�kn����>����~�������x��t��H���v��������Cm������^�e�����rW�8wR�������*<
�6]*�,����N<�V
ZvT�{-��}����*g�rS\h���v����P��!�������'�����	�d(4���!z5K�{��>����pwk4�L��g�Thx��@]E]�ES���T��
Thxz�
%W�n����@U�!5"�.�B�]�b����b � ���R���R4�z�SI.���

�/��DM$����	���K0V��-��MD2!YQ�Ph�v)K�!����LW�J�7Br��/�����A�GHA�+���B�Q5$�����d]$�P��k�t����Hu�oZl�rs�oK�7�'A����R���O������t�!����@4� T�<��H�qT.�v�?h�}�x	9%���Z:���;K�@���}�z�2=�5�k�K����->]�m���/mFC����u��qK~G[����:h���n-2������Bxl�TTX4r2>���{-;a��������=#����!�t���������te!����P�X2�t����!;�!���paN���c��Ld@
A|�

�p�oJXi���D�nB��1��]�����������tm�aT����������A)�p@C�wd&� ��
M"<�K^Ph���G�Q�J
�S/I��������G�o#�i<lz��e	��g���K�����J�i�RH@
-�_n�<�J������"� ��W"d��)]`�
�C��	V�M������:;�[�B������D��C��EjB�T�(����G���5���;�g���@�����r�&�l�~wP��\9���A�V*�8
�P���~%�`fF�Ft!���J7��Wl��=�]�
x���a�����t9�h����YJ�/n�=F����'(\P��D��@������c�#$� �O��>�����^�r��+����:[ 7@C�R��Q�N����/>h�����?��Xs#n���Y�����;�
�h8G��-�]����g� IDAT�+��g
�		���E	�U�Dn`57�:}��W���.��{>	����~�3Bv@�pU�I����E)�O_�C�B��S��aN����0��s�[oEx�{|�QS������3r�� ���C���_�]�G)����Tt�����D�
4��Zy�[�����)K���Y��E\�Vf~����{��#
�4VUi�����Q��Q�k�u��&�3��q$%	S�"I3��G�w�e5�H�� �����q����r���kZ�z��_9
1tq�~E�v�BI����g��]BT*Obk���.���G{��k@�����H��Z});I�V����L��Pf.*�=�����{'��I��5kLiY]�N����&t
��kr������$���M�D|�m�t��4t�^��v����=;0�q3�;.)����!#�;�6��n%���o}������qn�$cT������g�,a��	=�9`(~9�n���RB<����������4��]�'��J?���w����/��u@�P����?qr�s^���
&�n/}"H������9��.#��;6���>����)�����3}a�������zO\�����7^J[Z���]��:�K���D���u��������oB�:�F����\���i�m��?//'��~��(Y��jbZ�s�G4�6$h�������I���ooF]R�9��jq�����J�IH�^9
:nTwj�.�n��Jc%���� ���7��KM��"��]�T�+�4�������J�A����5��K�����,���.�	���
�)�Ki��^�01��+b7���n	A��%J7��]������z�u���.��}>�K��N��t�f��}(�B��``Y"h�31G��'��P?���#��K�J�2�A�m>p�	>��5��u�����<ME����c�1�+�z�F
7�N��	�������f�pb�~�FgJ"�'������]�Y��4�jupp�p�>��P�E
��^�P���m��?��8N��~}���B��t�Q����A�����E�q|�
7��]��K~�S���x�uAW���y�Ou8�'W��.$�8�.�)�:4�X&h���0�~B�C�%,���N�	��t1!���w���Hj��a'��r<���1�.%�����B(6�mZ�'P�Ie$|A%�/	H�q�*7��`������u�_��,�Z���!��mW�e,M����67���.�<�GT�0}�����g8qq���9�A���Q���|����M:���7�	�j�8��`���e�=k�F7E:y
|am_��$fI���?�H��Z��;�o�T`���7.�����57S��y���"�eS9��A��8w�4�4���}�(3'�a���9I�_�x�n�L���'�G��&�|�_?�N��������S�h��L�p<�
�^;(]D�1������p?!�T��~��=�u~[������	o�Gw���� c^/
�4������xw�����h5�/�������;�����g{�^4�����
��O7����$.h�����������Gal�tw"���Z��I4A-� �}8���&�9S}%2��6���e��l|�g4X����g|�������I&� �l�Y�'�q�M�3��BcK�Xx_�G
=�D"F:�4��[� \��xV8��!��)��<W��h��Jr�gR�Z�m�P1a�5�Lp@����&���w���6�����Y
�aF���0�3&>q����|���:�PT��xJ�}l���p#�`��S�?�k�w��&� �	���LE�
=�+�_X��vA�~�
~!�1��5��bC$}���h����O���
������$��_n��"�|\��t� ��x��,��+��o����	���PH�!�#����8���n(��A���T`�+���5���w4����U���.m�{t;�C��t#a��K�U%��h��N��B(Fh_�T?)Gw���!���b��z�P:*����n��f�S=8SQa��9xQ�!���p��y�/7�cZ�����.N�P���[�EFV�!�=� 6�F�6���v����>T�0���p11��	�yE �T��K���j�s^�����*���}�)�$�p�!��hF��(U4&�����j>�3�������7Qn_e��F�6��_�A�����`s�I�MD*O�&,�
"�A�	7���S�X�����a'#$�K#��}���WZ���H�zB���<���.���Bbm��*s�TX����\��c5�������p�j{}�_��$O�
�_	�x�G�%c/U����Q|�M����k�����wBm,�����EpC�(���#�1�b"!$���f��:�|8���a�?����C�_�h�'�b�sd��wv���d|�e���
���!(�o������p�S��ih]�"c������*i��Cw�������������k����������6vwX�(*��3���� g��K��>����������}���9�sZp>�5AV��R�A4�r:'�=mM]t�>����x��	pQ����M�[�_-��.'��
:`��0�5�~�f�D�JU��'�i���Z
����]C�A���L��#���K|�o�A�j�<v�h��������2�u>���0h�RY�t�������M%���}�p
N�k��pP���n?Ba(2��F�(*�=�H���@7�=�����|���h�7�
7��~0���P�g[�������|��J|��J&�}5�	��U%pM��#�v�)�#��4�k�
Y]����OL�'��eD��t-uD��G�!8���f0�N�/�vY[��1��z�k h�q��-��.p���tZe���	��O�7�����I����^I��b����D������pT���B(� ��t��d��lw��t�G��zM*��`(��� ���s��+��6���)6� �W��Y������<�m�oW���8��Rh�^�$z��J��T,��{�J��X.kiHE!~�6�����R	��EC�hgY	��;�
TJ."r[e���PnXu��
��V������a]Ce.5��{6bV����C�]�����{��{��d��W������;b8/�� ��U���>C���w.���G�
��2���n���!��>}��g�H�a���t�Q���m��T��r��5����KN�LM-
�T<)f�w��

�^�3?�;i��Y���P!�&�`���@����me$�5��z�pCA1��<������&Z������S��6U��C����rB�	���qH�E��4�6r��Vh@�e��0�N��
�r ��o$���`���h���k�7?���/l���k�_b���K {�\��\w���Tj	W���G�/d
s*E�t�;���Y��A�����E���r�#t�/]c�h*��D��<�y�����_^�2hg��`�AQ�O��*�'�,t��	'�P��L-s�����5�L*!a
�d�n�3��\����-�,>�\2{6*&�����9O8��H�1�`���|����W�hU�(6\�����Z���4|�����
������P�HT*WR��YV�U�:(h�A���z�ypN�[�8���|hx��
�w��*���pnl�(���a-�����
/^�a����4Q���$dc���0
7�
H������z !@CR;F���
������=��������(+���9�W��4�V[�R�I)�{.'��wZJ��Dj��s�!���hH��T��4�T�?:��
?�~�U~l���g|��h�O��%N\@Czkc\@CzkKb��-�!��%G��
��ob�����|�[��
���q�7����+ �
�h��9IxB��H��u�O��4�'mj��hH�:��r�~d���r"5����'g�����Wl���K$�uB�aO�z��'����wZI��DJ��k@CJ���|�4$4��_��PA?�
�R�>
��R=�|�!�
��JL�~�P����,�A��hM��*@C����9+@C���4�\��f�
�����
���
);�R;wh����!�Gd�(/9 �C��q���T�H�Y�MR�q�Q��TL��K?>�4|�������� 9�����T���?�@t�A��()U�i�!�](3P�������ER���]����d�"��2RP�h�H�]ik:�hH?N�!������4�\�~�sFR�G�+I~D�'�hH���_�
��O
����^b)@C�OJ��HV���=�
)�����4|��
��<cK����@Cj<shH�^�y�P�����oI��������#'S��y�D;��,��x�LE(�(=����4��g�
��~Fk��TR�o?�YR���!��65sV����mh��_hH�q���+@C�=�
�="���j(@CZ}2��K�|N
��>�nz��4$�S��������4(@CF���
�������t�h(m��O�b���G��-��&k�Z���F�I�3""�����5k��I���!�
a� ��5�����	���B__?��J�BOOjjj1���
A.�k����^���+nJD����a7�uhh�L������������������!���M�Z��uNLYf��p���$���{b�i���P��ib�'*]Y���������L������

��$��q]������D�#����uPTT�|a�k}+Y��x?[H�x��'.�gi�������r�?z}K�>�=�sVA@H����O[�>�A�KP|�&*NB�7�j!�EH��Ik���+���j�?G��s���[B�{\c6�m~DE������1"��{/K���f���E���3�b�{�n��#>}�H@���k���/�����<�rDkO�3t�j3�xWuDB���z�j|%pw|�\�%*����$*�TLT6�.l��Ubr�o�*��MD:&�=I�G�1���
��O�0,��j�s���C#{��V7Y�).'��3XP��������@�]	�t�h0L��DZ��SF�b�)He������KF��_3*��#^�Rz�7����e��.�����x@���K;@v|�������7e?���+2�xW�so�+���y�N��)������<2�~.������#�s����4+(uM3=�
i�Q|�"�x��@f���)���������J2��4����T��-&#�o�~.��oy�+���7�����d�x��~N��}w���EP�so}S�ss}S�s}���s�xO��'���i����d�4�9J��_���02J����:"##�L��S!�%$z55����Y'$$Z�UGG'!��}�����#���`hh�����lKZ�2�x�VHI���f%��{J~��wZ^�Rr^���=#�oiy�'�����u}���]�����e����s��
u����Q�7e?������'�B�����|����������K���=�S�<:��y}�����:����E�!���J=�U(

��q)�B�����<5U�X��D�����KF���d���GH���oCF���Q��{��GF���g��-��w��3���Q����K�}�~������S��~�(L�d��M��e��M��ytj��
���������4��G��0)/L�g�&OM�
���L���>r���]9���������\�X����u}S�3���Q�������]��BWW7��t�SF]�2�xW���������t�$%[5��
�����2R(@C�y��x��@*/L�2��P�S���L��'=�<�f�����7e?�����b��2���Q
>�x�|Q�hH_+S�k�����\�GQ��A��)����MZm����������V�����K��Oz@
9t����J��P���l�EI�]yaJ/L����I~����Zv-�U6�$���xz> ��HK��	B	��i�J�s�b�w�4Q���D�R+���brg���gj�������S����c�
�������k��?AK~�&d���=��|
Kd�:�����x����!YH$�9'CFJ����k��Exj����=P��\ONO�\��D����@������%�U�hkzkd�|0p���������&�z�x9JJ(=��=��e����$o�i<7��:0����n�AR�k�
���J?](@C�?RhHz��N
�������!)���
���1�!a��3�V�������6)@���L��NK5V����4_hH|�}/�4|����S������
�1��2�H�P��������
���q��4
���S�+=�P���
���>V��o����������������N~�g��)@CB{L��=�
���4��(�8y*@�����!���4�\�*9�����}�
�CJL��R(@C�x
��
�1�4�Y�c����\�z+���@����Vb����m����1nht		���`��S1In��3����(�o���@pH|����C���5!E(q��f�&������#P(�:�yD�B��>���(l��/Mu��{�n�
�P�F���Te�������C���6����@.
Xg��n�A��C���g4�hA��	�����#���_�q{�7�k���`x�Kt��09=8��c��kh��lL�T���5���~���9�oN�<���:z�4�����oEN	���r���u��t"�����?����p�E![���_k��+a�6R�U��u���P���-}�$�Yj
A��@��!��A�|heK���������nk����n�~F�[$:���P�K�m�a��w����@��������f_<�][NNP�n=<�� _T)�2A��9%]N����U�p�n ��&L�}~g�����;}
4(��u����5?<^r
����%��b`���}��^'�����n�g&(M����g7�D�b���b�%X�h�z��w��F��S����v�Xu�}�`�v��u��z0�W��+�sSV�n�����?�|d��g�@��x�s��H
�!��)��#��:�����n��g����D�S��eL������<����'���NP�z���*����'�����g�����u����0{z��P�.�������A�����X�lP�����h��`����E�	�Y��0�JO�>�Gr4��<R��D�|�����9+`��8z��e��&������4��&a�����9��8�vvv��K��)4�.�!�>���2^<�o�'	jV��+qrw����R�Y�u~��������+�	{H�@C�A��d��(�i4�.��>�Z�	�M��~s���"[E�����~��S�*����;��_ZJ���k��`��x��w���	��wGTd���}�����0�UoN��^��yJ
�n,B�b=0��D���0��n�XwgFW��b�Eq9�b]������%��Ob��� ���2�9�?y������c��~����E&Kst���o���������wk�X�!v��%r��
�k��?�tv���7e��l�v����w��DPz >=��@��;a��M92���j2Nr
q���l(��D6���u�r�4��)�|����&��	��f��&�IH�;15�u��+
�����6����Q���h�����0�x-��G
Zd���7���>H�A.=
~o#���B?h����C��k'��;aj
>;���UW�����������7?�r�IT�Ex{���n�vJ�A_�
�J���N}�U�$)��^�}�Wo�X��
h�=
��G
����s(��O����r|hr
���X�&���~4���t}�x��G^��+d��^\�	�\�a��`���lsh�p.��&�����0��y6�T�"�%~1Sh��5�-����D�	�	4�:;r=t�a�������r_>���&:}J$L	��g����n�w��������`mS'����) IDATW'��X$'�P,s��j�Mw��p@����0�������
E�lQ<S!ly�7��)��EBN	��|���qzJV�����E`��������I�@�I>��
���k�ih(�6���������
X$��~'r\m)�s2!���{�8&��*L������E-u-�&�Y�o�U�������h����0�n��
��B�������hI�/������
l�s��!��#N��Sc������@[K�a���3�tu0q�"�A��8z��Th8p�tutP�FE����7������][K8����\���E�o�{Oo_��f����v�k�=����;�=z}��MRg)��P�@b�'����H�e�z`������L�jhC@"d6WG�r��i����c=8����{$J����!03VG`p�7�A/��N[��f�B��=���J7&}�2��u*�L���y�� U����	@�f�O���.�D\�_���8p1V�j�T_G��oE�!�}E����[n�
5��vG�W8�gdG��P���&C3�^
���7�L'd���wP����}�����P3#d/�+�9��Jw3�a&
<��G�kJv2��=9��kA�YAZzjxq&ez���� ��j �f�I�G�����~����e<��X������<��������O�|h���n�;��c���Z�.|�CC*/d�5��g7��������2
"����������
AY��h��x���-�q�(oJ��_<�#��q_�\&c
�}muT��uF\q����g�t�����������4�����*6<|���
��J��������;W2����4��p
�

k��a������uP��.�Q�?'|������She��CdD,9�f)��;�����<Om-�\�\(z���m%��t"Y�j�������RC�
p����#���0���\T��p7�����u���)�����H�4��������;�@s-�8���(��oY�FX���C�3
�6KiM����!�e*�)���'Wd�S=Q
	.�B��G����D����|:
C�`1�<�O��W�
t�@�?�[��q����Q!��
�v�"0�\�nA(8Dq�zP����D������@(,��	�
K`������~?��C�yhZe�����0�Dd�?L�D�[g��M��sq���q2���UR�@�	��W@+g�y0n�
j�+������ab
��m������#aX�9�o^F�G�Z�s�w�z�Q}"��L�@�����C�_�|��Lk���45��{��M�[�,��U������[Y�h�NFl�*1���7x�Q�$���&?�=��v5�if�o���}h��
�����w7%lk�B�FX��W��&a��}p��>�z��r�&c���%!�Je�C����=�-�0�:6mM��_$r���^�n�~�<�����hZ{��9��M�,����6�C�W���=4�el�d,��/FHh�|>�b��(]�v��_�����Q:o��\�[=��������aW��|2�9S_�k��:n:�`��@T.��:E���9t�Q�P<�^�:��=�/�K l�6Lme����g=�B�s���p����f��������]���Z�P�x��|��0tc4�7��)f��&�0��K�j��#�0���^�����s��r�.�S�+����Tu�WL�si�z<��QTd�	�Dv3M�N�o���1����%v�����:���J�����]���[!���><�w��g��#\8�t��K�@[��H�A�l���K�`����MZ�B���t1��:��b^x�`��!z�����s��g�*��&���;'���s��7�3��}Q8sn����l3�B���e�9��a�����"b\@C0������$YU�U�2��},r�x�xpt�,��27
T�*��wJ����:�h03T���f?j8{?�8����;��j{_4��21�����/�gz�3���r3�c����������`�a���@0g�?���B����e��9���n>(_@�{�~�2s��w����0��)��]�d��C�p�^�����u��?B*4��D�ZFXr�G�+�z#~����u��r��6�u]�N��oa�6i�6n8����6��}�����PP����; �����������wX�kXsS����������2�+;=��w����
!N�n������w��r��KC�`Y���&����W�<�v�7��� ���� ��~�a|��M���n�F$�j����Ne����\��"�L[
�!���V���3T������Q�!�K�����2mD�/���p�r�w/�2�!����y�)R����:Th$�#�m�	-���w��C��k�|E�4L,`��"����o�\Su�Va���wz;*5�^�j��#�0B���;��3;��
����a�
~�7q�����W��/Ad����I�I}|1��4�����V�������k�F��x���{���6��V�������M��6*$t�:z���
L���Y�:���4D�����c�
k� ��q�n�J5�\�������m1h���:M~����U8u|-��{�~����6�����.� ���'r�*����J��Vm����
��(����m�,��u�G!,,]z���z{���m���`4j<�{s�����9�q�!8a�*�P�����R{��L�!�3N/��v��?���%��im��fu�=�
��������;?7lm?\���,�����@/0�F�[��{G,�����a@�����������ThXpq��!��j��hT�:���Yg����m����lF����Qv<�q_�����.{�����r�rhW�).�����W��d���xX�n�c�����*$��8Z�\k���=��Z�+��M�[�.�����"�`�k�o\����F���Q�_g*���B�=�L����p^�8cN��2���1��C�3��(x�"��5�O�

C������C�r�}7d3�,�	�����C��4����,�4
�=�w�����kQ�y�.��@�}~�e�f>�e��N��^%:"+�����L� _-����K�����4�/��sF��_=1YsU�M�6x����
��%������wm�m��6�\��hhi@�����+xzo'�[�@�F��3�qj&�B�Q�F�
���]_
��pz����x.�\��O��g�w�{;����D��;��������R�s�i���

�+�����>A���@�6���}g@����G���n������d�<�����<�X���7	
�0�Ol��U����3�|��3\�
���ed
�g��|�?TSh�Lek�]�{�Ms`J B(4�2,KT��������+d������m�	��5��e6�9��.D�z�aY�"���=�Ph�22�M��x�~:��_��P���7�||2�����[��>��~�Q��4��L��|��j��Z��t�J�`��"���g�xyp
J�Y��wN�|<�Ne_�=��#8����w�eq��2�[2�g'�1�7s������x�r"����|V�[�?w`���}��Oo����~��#����C����e(�c\^�����o7���Qh0-P�����y�}>|_��d�ip���s��?��7�-e�������[������/�c�<���F*eD����avk8n�����x����8w�����y����������U�g��=V�����ZU_M��E~������s<��$�)��3d?so����R!.�!�g"�����V�_vF����%���
�G���""y.�K��|���ko/#(,�����cacA��W�T�����ro^�8��}D������?�(�~�|���,�Th�V�7�\�������.�p��)�/D�O��pp{���N����Y����u������J��i����
�J��N���������{a� �������5�o�!]<8z��BA�<x����]���7r*��;�Eu�������������x���T�P�����a������`�F�����?�S^�u�>	/���>�z�/�JPz �=�X���%Jug� ��?��h`�{6=�����p�? ���#��P��G�Q��4u�k4�9Mw�tq�|(J���[�'i������a����@C�\���0�kj���PX��8�k.�Qqa��`������?������hH��J��iiA��B�QoK�:#�E4,5y@�a����[�75��#�r'�`��~t1����&j���W?G<o�%hh�Gf����� B�V�p:@W!�6���{#�+�:���:oTd�k���|l������	GE*3����BC8��w0������H�h��0��^L,Uoh|"������lP�<f�9��*��/!�^Go��X��,������j2nQ��rySF6>�[@��.�hL���lu���?��Y���4*��l���=�����N>�%V��H��Fo�����U1��
������@��Al�t$� d��"����@���4�a�_�����N���e	6���^�������p���D�ZZp�+!�YE�^7��E���0:J0���Ljx�/[� ����
E�N���H��$/_	!��hH0�do=�]��=u���W-��R���6����|!\�,�$,a����"`A}Ku<' ��
XnF Sm8s��%d'�Q�/4������&�����`YvBCB��esaBu�wW���!��I�5����5��w��`���] h`N#Ga	*��(�<6�\*�H�C��s�+S��������6!��v�;���5���yRUA3k��,�]`P�����}
�[v����0�e(|l�^���?oO�-�aj��s	4�G��{��NcMS	4��	�.�t���k�4��U���2����sY���H?o	M���<x*�s�b���*��eY��`_	#������f��# aHw��oA�T���%���N�QQx,�%��
h����J���UjC3SV��	����������%<w����{���9�)Z���]�s_��7��m�J���Y3�������	�>��������0�?Oi�W��m�����,^?��-��O����4\����?;�{�)��s��K��� ���+`k]w�A	q3Y�b���������4����p��~���ypL�O���4H���p�q����n$6y�qI=��BmB
"�oPh$N&�U������B�*�K�5����kb���XYQ�_@_vzq�4� ���:���:���XVv3
z�t�_
�8�Og[�����
�;i�}M���N�9[.�pr�%�����1������ARN<��6��N C
1�B���..�am�qup)��g�{�����c��p���l�_�wTl��vKu��w��@����Mc���u��)V�>������k����C �Ui���om�q����8F�pJ��Xw�<xh;�a_L;���t��{�cL���Q�Ew�=8��+��m�
m���
!������O.���]���9��E�b�d�w���7@�G�bu���J������}x
�������S����\�����*��)���SB}�;�Yh"0�"��P��/��a,��fs,[�������u	 �&$��\7��H0b�r7��c��+�`�=h�;�l�j�gML��)�����&,q��#���9�[g�0	*�x���K]Q4�6���@C�2��@@S�+���'2Ue/b[F�p�����������;[b�7T��J�!��r�!�]�S��0������z�f ��e����1���f��=�4�q����P�A:�R� ���I�I8��j��+�y\7�@���[a\�;n�s}�]��h�%���0���U�?p��K����u�A+G\=��x�$���E��cPg���#x�7	
���� �@�X�S�sh�
��:�="o��S$,�nho�E�����
>T�0�4^�'����E��	���#�����%����K��u

9h����@�n����[��/UmE���;�b�#��i�{N#�yz���(9������wc�?��%K>xz��:_)	>�7z�[�}�����+���=�f�J��p�����p��~<��6n�~��h�j5����n)�ZEc_p�?��]�u����1��������p��W�_����e��q��#6���=�Hh�}�)���//�L�����<|��%|Y�_�.���C`�w�v��eK��R�v����Hw��F	U\d�J�m������c��e�S���H��o
�:���ND�=P?U�?��
m�����!P.~��s,l����"7:����#0��<�g[4��5�-0���^��&Yp��-	Ft�1
�����K�N���
����a����k�&�]XC��[�o3=w�C��eYV^X1?Q'�7�Xs���K��
��������$'
�n(F��lFY���VL�>Kn����~��b��5h^��4��r[
�^�����n$z��D���q��=�D���+�3/-B�Oi@Wi0n��G���w:��UF`��������0�����a��Q����J4p�����iT�pg��U��g� ��l�cNMC���d�������� ~�4��C�<U$����2X���Rh���g�c�@�������_�CC@�X�>JL��P��2\>:F����
*g�c>�
u�����&�Q�|����@���7�%����=���E�6�~v�F�"-��>n)d��o�C���!���W���t�3�v
���Q��8�����'���xf6��/��RU�3���W�y�pU�����gh����Sp�x��5!!���R5a^�<�n�������������u�>��\u;���)�0/`?*���GC��/�����/�p������)'����`����!����v�Q��0��_BF4���o/�w�,�n�_��;������b�����������A���W&��Y�2�k}	4d����oe���������m7m�N��L��:����(=r	���!�x�2������.0D|QgUh(�k*n���`�;������r7����(���Y8��"�����+�B��d}�Um&�$����*!�g��|�~�0H��|4xA�� ��h��n/����.�G/���3�,y�x._���(4X��4��g&��g���?:���v���?S+�+��QU�W����	0�����e���cF@5�?��~���0J���8
Ow���*"���^�h�'���+_�D�h����s��{�?p��YT�U�O��������q��bV�x���}^�f��XJu�n%�N7����Z����-��aH��8��(�o�EW�@�����ft&�`�g��u?k����ADT8�����8�g�u��`���s�Y����]�.c?X�@���oP����T��KK���o��%�;������r��t���U#�sf+�a���c����l����[
�{l7����?�l,�3I������x
��C7#���z([��s����%���vcp���|�����g��{[�q��C�������@r�@b��t=~�7a�������	/���W�#��%lr�J�� ����5����	��J�r���M�'ic���h�����"%$q�n�
������x����o@:������1e+@Cr����#--���yl��j:�X
�}��=��[ ����c:O�9��"��}�^N
�`�O����%w�z�|��\E���	���*o���A���f��0Z]"6� �K��G�qV8>�5h��m�r�������?�(��$w���p��[�����6e����7�x�8�lc�l�y0����#�����v9���� IDAT1�����6����q=�o
"M&��`���yH��Ow�
`qsx����uX�uL��cT.'�9�Nmc������������a8xao`�}<��%=,y�8c�{�K�XM�����l7��4�%'� 
�P���]$��i���8@(��.�����MU�;��y�����kI���Dl[8{���QY��P�����*>%z��������v?/O��N�A�N��g��d����d�
�.UwwS������Tz{�����y
��  � �f�M���(������y$h{�gx3�2����6��*�_�&<W�`���O�}p@EqF
z����e.x��T5����!�.Ux���8oM�HxA��P�8s_8
Q����c�2g����v��uE�1���c ��{�Q��'���/C���-,~����	c�9�����#p��%eh5Z��E���uy�7s�F�W��&�!�{oZN��hm���
�xS'w>���1j6@�Y{����~��2�*D��F�����x�Sb>@�������mP[qI��-o�F�I	�"x�v��6�&8�F�v���(��!�����xI����g }N�;W'T)�B
B��k��x�tN�P�b=�N��q��\�5;'��?c���I>�
�r����X<}yK�#���`?����^�]��07������o���2�/� @��v�xK��-TOP���������a����]N�b\��P�
5
���7����9o���
��W��`"��uX����]^6�A����H����{���od���
7�B%86a�'B9�������}�e8!����y�Q���T^��[�"�$�2_������t����p��B9g��Be��z�u�H��?��D���DR����6.���*~)��yCz��Q�;���X�z�[��P�AWSckv��"�v9��q��B����������Tt���{��\u�O�v{�)0�!� �AC���#�@Cz$t9��qf+�WmG��e��B�a@���/�%L*<t�>��5�y���F�����q�������w��B[�g"����-'���:X���e��1�=���z6`���QBB<�a�oO(�@v-�F��u(p9�@i�8���DU'U(F� �E��������B)����������.�cq*����G��*��rr�{Q1�`��
M��&�Q�e�B)��
�r�2�����5�������uP�a,A��P�@�H�����l��$�B"��v	��.a�t�a�=�������F�3v�OTm�\���p@�S��3�����s��~�i���QB��q
4u�T(����vg��zD����}�Xt����\]y��/T���u����RI!��8�������A�<+H�����A�v�A ��T>�=�M����c������x�:��m��km)��6��uq	Rxn��&}N5���`h�X
�G��4�Onrm
������L�qU��aGE��{���`K��.4�~��S��2� �)��Y�}�dhP�A��Qa����t�����-B����4��rM������mB=A�
�p��:��
����-��L/kW��^;\
B����C�U*)�(�
v-`D��{T�1a_=yr�.�4i��G��`����K��a�6!��[�������-S����\:-����BE���7��?p9�R!"S�����V*4�A����<yKj�&8qY��S��6���s���}����
�
4������f�j���K���d�	�iq�I��wRL��V�����

"ll7]w��;��4���T[h����[�E�M���t���\+D�B������)���`�����X����+s�����s����S�=��4���bA{8������Q������_,k0C�'"T�����U�)T��Z��:���s,m0[*)��\
����B����%2��;T8��6��4T
9>����XR&|B��x�����W�bh�>f&��)�"����
�H!��R!"�QV����N�hP����,�X�
�7	N�4�������>�G�R�����?�r�
h�_���3b�!��������5
���|8N	c���.���=����
��?�7R=!�uM�0��������:�p����r@�N����D
/�'���qK%�l%��@=������E��[��}���FL����(D|_/'Tk���b�H;�����Q��`\96Q*7����*���M	RTj0�8.Mr��<�ThHhHi�A�T���7���I��P
P�-�U�)���7��l��0g�~�
�E��0%h�t`l����.��btybkKqcV�-F��A����U������H�M�+����R5�{��^@B
�����kQ� ��b�+,/
��]2���_�Pr�B�F�
S�n����Uk!]f���+�#��7gv���e��!����F����G�3�2R�@�o:����A��W��k��'���:�F�&aDWU�������I[
4����!�H���; �����{��"����gB�"\_����U(�v���T�&��QU����8�I�8�	����F,�
�Z�q�!��_Q�D��op|]���f�v(�_�L���	���� %��\N�������Q������	����1���*���������R���<��s�{��8�d���Kb(�R�b�I�g��Y7���8��p^	R�S�a����,��H�L�!�!��B}��@�	M�)U���!�=������%�[�i	�h����K7���PB8z����ah�.��h5����%���d-F�h�7b*jV)��Tz�^�,��=�2��'W����������7wv+�����?}	�3Y�D�h_��!��~�Jy?_$h�Ip[
�x[V@Uy�U'\�&sK�j���0��v���&D��r�s���g�'i����6�T

}[���3�����.���0-i��������Ahe��&�6��ru!����>�8�,���Amt�:D�B��A�}E�!m�����~h��m������M5����
h�oF�B@�t=`��4����v7!��>G<�$h(������/�ps����nlPmoXl�F
�"��V���
e�	40���|)�B��F����-���*����S�-�a��;hk]+.��$3�x��f~Th0����dI	X!�Y=k�!4�,	������t������,�!�/*4��BC�"�D#��Q��D�����*�e�_����QL(4��@#�
f���a~#�7Q��.�&f�B�[�B	b����ax�o��B��9�������hU� ��wt9!\Bx8D@�R
n�#[E-�(�\�!"$*z|����4����}tq��D1*4u�&�.!B9�e�ps�M�MUN�{
�G'����TaxO�H6�������+@q�'VT�A*4�

��
%	S$4$h8w��u�Q_+g^��2�w�-��!����S�D|�&�0��<�����r�n'�-�U�x$������ �]�iFB(�Ms+�d���c ��@C���0�B�p!T%��������� �D^;O)j����	I�
����.� "\�C���,���Q����N�u���K��NWmB�!�B�
��`�����/D�9S�@[��������
U"���~EJl�3�~�y�R����!�v}�S���R��al��G�E�o
:�	3�K�w�&T@�����(����y�q��!T/�V���\�A��������r�X��W���7P���"���I"$4~�����%��`��7��r�h8�bB�!���Ve������4>
����ub���Th�=�	�������8���:\g�:���"��M���C9��hh�����4�P�h���s�{���CJ�� �����T�q������r7!��1��{���`1�g�B�b#�%�8�F�ZTt��"X~V�����O_
b�

���b+4�������c\@C������=�������*4��Z����@)�6�������8�4�p�k

�;ND�����p%�� �H A���/�{������������j�$1��J/��[_*�����!>�R�](C��{��B�!1�&D��<^���������;&�L��1@���B� F�bu%���B��?;��&D%�	4@!��&�r0���PTP��RA�9� �B�nx���T�u��_(4B�AB���+XLE�ATTP�'2�j�Q�]T�"0y�cS��h���}n�Tp�
h
	�|
2�V��j�}�r~�Di�S9J(4,�:�`*-�GPB(0������0��A		T���GE)��0�}�R��
44��=�{�T��&��~k�}�n�}��7�c�C"����
B5A��A���yq�TTP
^;��Q�.\�M�hd/]4�_��F�e5�����t$,������r��M` ��a����G��A7i��He?f�G������_���`��~1p�
h��DM�I��������C!���%K��Th�������R&���o(�^��H `H5~�4i����;�����
ad��h��u:s�%����%�!\fx��(a
�f��{@C��}p��J�'L�����
h��o1���B��Z���~�_4h4;�F�}M����0gFK��h+��
���\�����	�5v�^���6�'JB�,��3�n�\�uadd�� ��*�]������
��^���?�B��@C��S�tqT��Q����0:�;�I*=�����������_m+�-S�h�lh�Y
����X�zF��M��CHA��m�@��c�:CV�(��8���K�I48[�ap�.����t��{�-����Th�����m�,K(4�~q��3S�a�T���s�|�P�h~��@�0�o�����z�m��X�
h�Q}�4����~����RA�b��&"����64]�_��jB%����hO����&�Q� �{���ra�Z�PYXzs=���'��M�����,C?�Z�_��`����R�56�p.\O�a���ur*Zh(��8

�I�����5U�;_CI���R������)/��P,� ��5Th�uh���C�=��HL��P�dG<���+
�'�O��U@��Ph��\*!Xi�g'`K *7_Sh��v
N��+�Nu��D���F�R�eY��r����(AhA@
�x�r�h2��3�h0!�KE�c��������%;����z"�!��(��t+Tz�R�N�22p!W�.�%�p����9r�n����JW_(4���X��%��+���"?=�����%\Tf���W����#�u�G�|�����^&�KhL7�%�!� 0�4.���G��@5�����	,�I�fB�w�N������0T:x}lc���b+4��������.�smd=����Q�:�=�<���q\�_�	O�16� ���YrS���4���-�]�B�n�3M��.'�������Ph�Z�)��3�JJ���q�8���&�%�x.���l��? �-�A(1�v�������

��z�j����P�����������������9�t�s
��)O�^��Ur�l+�S����������H�w�[���]�b�1a�*�tzFW����HE��|Th�����*�J"�Vh�|o-�Nt��wt�IR���m[�z�5Z�A������BC�����:�.��Y{�\��-�\(@Cr���OZ���vO�;�At�_LL���&��[��h��6��9�����&o.<y�
w8�-]N��T?���R����:����l\G�'��������W`���_<�������4kP!!���l#�
M�4nj
�����^����y�:}�[�H��yn��,�g�(�]�Z�y��f����q
Y,�?I+��-�tKA��n����H�D��/�]�*����C���7���`�C{X��w�<�+_���EW��O��-�!TpP�{�(������{�I���P�S}�o�Q:]���'���H_��h�� ��o04�A������www��4��n��mI)7-�MK����r����caa	�M�p���5C��	1X��#�7Uux33���"|�y��&#3�����J�x�M?�3I
�P��1�lu�����7�,��jG���a����������O����|�`]�@�5T���.
�QQ���%;��2�^����Lte���t	W���G�u�[@��g7���y�������j
�r�
oE9�6��g7�!L�\Ep���-Tz�X��n<l��M����a����h]��G{�Rx��K�l������49�Is=��ia\���0���.�q��H���-,n0���KaF�\����'��'���\�f�E#�02t��	1�������t�X&�W����*�q-��aA�E��Q��.P���I�u����
�T�*���$�rVP
"��GCF�@��6���*���&����7�p�:�(_���X \B���v����xrn��A�zZ�w�D� K�;CP�q^�%Q�x����J��D�����������_D�����(d]Yn8� �y�BE�������G����&'"������
4����/��h��]��4h����IJ5�Z�BuD�x�UCV�~A4hA�]�Pqi��@��+
R9A����B,~**��`�I��v�� ��K�B�p�/�:X�@���%D��[�����k���~	���F��L��BC�6|���<�42� F��}	�B��z=�.�k��h������G��;�R�B�� T(o\B������pc�N�������*�D�J-x�["�$��� �G����������+j5�0E���Pg�Z!][������G6V�|�����T��bM�*9�#|hn%���9�!_�R�A4�l��/��5y����p����Y4�!������9
������T�E��<;��w����������-���@�A8 �>�K��u���8����T����(������4�8�'jU��=��� ^�y�:�?U����B��l)m/����k:~T$xNc���b�a���~2
�A�wV�u-����p��FX�`�?���~ �v�����B�F�� �I��P��4.a��5�s�A�����T@X���|ag��m4� ����	�Q�Hks��1����K�~�	�ei�mN�}1��A(2%�]�Y�=����{nK-L���J�A�Q@���c����rP,���U=��z�.�$h(�9�Uh*
;��FM�����}�-&�-d�������v��t��$�T\p���~�n*��T��Xy�`���pc!�\8�X7���Ls��s�e^�
��.��
��T^*�9/��-E�|%���EQ��-��-�.4�)��"��o����4z��{�����U���B���x�4g�A�����&�+w���	#��4 j�G���3(�h8����C<��,ts2���|��"��*p@d�+������Z����/�ChG�Q��������������tC���T,�F�/c��>�G�B��o����
[�N��Y�r�L�)�u�p5!�c{���TV��� ���P�0�P�n_^S���!�_F�����0cDW��*��W�@)����/^2��A@b2��9z����l���rN�HE�~ghh0�{�p�
��F|���:P�A�!���H_�����W#��"��A��P�j�����
B)A�Z���������G��r�w�7,?B>�t{�K�_A
bm� �#��� ��p�[�����y� L�����n����{x�T=����Ps0i��{�&h���6���wl�'

Z,�{���t�G53�~�7���YRf{� IDAT4xl��p������6#���4�v1Ab�{����l��l�h�h�p_aP�!���B�=��5���������B��/�r�Ju	����Z�2L[
�][�hOu)���&%������p&t�!��44l2����kh`��q(`[!h���8�4�q�N���w����T9A
Z�w�U�Kp �T�� \J�]���r������E1�pc���N*<4m1�|�/�s���/��� ����e��<�,������Ce]D[��t"\I�^>�`S���#���B�E��P�.�k�O��px|Q����
w��Uj	W�W���]�|Sl\7��|����o��7���,!�@B��N,�z1|�����8ib��U�_���+&���g���kX����Kdk�
g�w���Pw0D?�k��{Gx��%FV���G��?����.�E�L6�cC�gW��B��������7vbB��Xss7Jf����;�Y�Uh��x��A�L�N7eh�W
����d��
�	
 A�_A
Zj;�� \D��{@�	XP ���.���Fs���)�"�ps�����(���{�����/�Q��JC���
Fqb�To�t.�f���������������'�n
�����K���P���+R����K��,	�����|IBn<!;}��p����;�3�9�5��hnZ}��s
Q��� Fc��T�S�I77=��vw�5��T�u/kV
S�N�h�j�N����	�]�I����*AQ�h_�m�77��>x��4T�3�l��;���
�R�3�J�R���O�{�od����"�A@���R����n�"B('��@��x��0���!�3�����m4��3V����K�z�
!�X�^������C������m
\>:�.,&�����."�f]��>�b���?��|������@��Uqn������S�7��o�M�������%���i�\TCx���eU�P}�_�$�ml.��f�����Mw�zB��/B���N�'j�1�����"����T'X������+�*�O6��r?�{�taJ!��q���{�H�"���4�{4�C�;���1�5��'.�<��q�����{����
�]D�q�H7�����n�q����Z�A��IU��(�8**>��3�����{�T�V���Iw<��'*~2[���%���	�����p������e�|�"���V[���~�Im��h�m�E	.�[<���Q��0�n��JB�"u0����X��o�S
��1LR�r�~����7���&i^M%�H�W�*4�D��T���t���cry�L��_�o7J�"-���k]���e]*������� ��1\�-'��[,a�*c3�>��<)����)�?~h��e7�#��M=-=L���r"h8�z7<�J����?����1��D��%����zB	;���ah�Q(cfO ����8�%���_*3�|��g�����L�`�������t��9���p��%H�C'��t���?@�r�E�SiV�Z���P)�	��$�K���Lv�H���_r�y��@
�����U��q���q�-Z��]���}iD���5[y*J���I]�&{�����-�I��U��U[(O��P����5�;={/��������'��#�Vm����(.x�ch��o�>���U���,�Y����B��F�n��4��4d����!+@C�J��Ti
yQ������dg��
�YV^����Df��Q�!����t�]Nd�n	�QTi���6�
qr%�Cj�����/-�!'���<U����U~j�Y�SH��L(����S2���<�M�!�!;�)(y}h��6�4�Z}r���.'2[����u	�V)��
?s;dh����Ty�]Nd����H����Nwft�!�"�4�E�r���.'r"������[��f9�
�Y��,+�������M2,����/N��gwHh���
J~9
4;�R��.'T���8����e�f0-_���~��}������z��N��;D�Bn�g$5
�R���E���$d�������r"������!/���2���Kn[�@
�m$�<���
���WA�n��4�*@C��gVrP���XO��
����DLh�1����F�Z��T�b%S�2�a	�!�,�
����&QuB�jBM"Y�!�9}8�4�mh���Z~�4t����B_G]�Ixf�o�j�L7�4$���LH����C���a ��ea��f���4
��-f|o&
��s�����h�3N�*dO������i�4���
��zw��Mn��@������P,��uW����@C�R �f�����+@CN[X����y�"E�H������Kn�]r��Jy�2ih���2�L2`�4���U�~=���4d�z��-L@��VI;fa��vK�B��r%v;�����
�?�u�+���v������vS%?hP�JJ����4���
���=O�_�@�X@r���U�3j�_
�%TPX,�
9��!�6V���m����z��l����Z��K�
�5�h��!�S�����m�*@CN�����4|�Zr�:*@C��V�Yu(@�4��[������!\#hP�����j�����)����Q�R�b�i4T��B��S��BBBCCabbR �+*��k���\_???BW7o��f�Y� ?
����7!��@R��;�x���o>,4!�q()F

�����ZJuu�`m��/*�m����,��J�-������$�y���ccc-�u*hX!��T����,eX����AGGZZZ��oW�TM�c�2T����=c��5�w���Y��D������������=��[�fb1D�������D�������Du|��WG�a�'�������e5��4��Gy"��vV��r����Un`��q����O�9'����/;�hij"���2?���l�*y���\IuM��F�R�l����������>�UC��-?���^���/L�[j;�vW�3���CV.U�����M�RZ6�V���H�!;�Qzy(@CzR~W,���a
�c�x��������m��svUTc��5���.�eY�����y!��]����SX���[a�
s/��[a���^�O�jV��I_���2�+|�/�|�p�\V�s��������Q�-���2�+|�[a���|���we>W8�s��}=���4|�a��mh�m�g�<����M �&e��'F�LY�7x���)��^��7e>���
���Z��MY,�����+@C����|����(�j�<`�
���%�6x3����)�|Ny�����������f��nJn�>n$&&B�=��eL��]����C��� ����
Q�����Y�<3�,��{f��i�f_V����#�<
k�J<�cbb���FF�Lv������u�j^�y|���Ba���y|���=��rz���V��{�bhn�������{a���q>�z����
�z�2����\n=������s9�����L^�u|S�s��>����i�����Ba�
�|.;�{N��9�g^�wE�!'����GkE���\Z�D_�#b��qg*D��r��<��^������
���(4�N����{����P�s��V�g	+��<�)���wb�0���<�)�9e}�`��Y�ma�
��K2���'���S�'��+�����>��4����2>:(@C�������Tpzk��T�@*���I#������p.(��o�G
'������EY/��2�S�s��+�j������0��(�������\���)O����!��eJN��h�V���o
D���K@@,--s����0�.��e�[����?&�	~���b"����������k���:X�,��_A�������(������O����A�"����u����8�djj���F"`�����Y4�S$W�z������j	0MLr���!PWA������� ���K�JC�a
���m���{��>�y5��)�pX�OH����?�����q*NSe��������V'J��fg�|���_�#����+3��+]uD���\�t6����jB/>in�_C(���cdW��7s�}�M�K�D����fZ@"���-V���&9f�����j���l�4��}�$U��j��� x�����_Tm����9�D��M����z��kZ�|�����<s����>ZE��/8�U��ta|�Q��V|��eG����ah��$U9��Y<����sb|S7�x���r�*ba=p�
��W��R�b�- ��x��8������5u������
��?����?s8�/���k��th��T�i��"���L�>���L'Wf�����|y6��qgS<A��_��F���a��	�RV^�K�8Tuu���w�*���!yRvn�POE<�s�H��<���"F���7�U^6��N[<w��R�F5�����yi��S6���'�����&��U��1^|Z$�.'���6�� �|]����Lk{��<��j(�g����c�~�L�T�������+������f�Q\��=�����,P������1���k%��-���s:�Q6�0e���.������B��~�2T3G��_�h[�L��ft��[���
�b9����\����G���(4�g!�w����4��-�A5;�T��D*@CN]����4�~��Au[�ST�R��(@C��WS+@C��j
���)@C�vXh�Us�Xa
��c�����!�M��(@C��4�e�
�$
���.�
��4�m/hP����M���
������[ '���h�n�8��v�p���t���o���W`��?�e�q���+�'V��>���t�T%�4�b����
��6?+4���������s0�w�h��PuX�!��d�#-��YJ��!���t��t~9�0'��x�(�8�@�V����in��&D�r�v#h�������P7��v�$�@"?��%�n����h���AaqhV�{/�����I n�Y���k����	4�4�CBX4b���';�6��5w�bt�
8���3v�wY���t�j��5uF9
4$R%����0�vS��}�5���v�y�!1Q�U�f��%G���6,�
��Ty���g1�F#��e*��!QN
3�������i���w���d����!}1r��5ov)4��D���x�#}
��q����@����1�ak�:����M���~�
��+'�]��J����N>���Z$��'�����>�%����l��M���&�N�����[�?��U���

�ti��g/b��~�z�*UH�S��_�o���d(]r�����L�>�r���	��l�T��M��

3M������Oy������>�7�����t�#���(��b�E��B',��.����9	4�q}��tj���Wc1��N��z�Y"���z��������@
���\�~=5T(���z���9
4n�	�n]��|���!3���j���32C��#���B��0��W~~�4
�[�J���/��hXtq3F���YG�`Y�Y����Rh�;fN�������U�e����w�]��8�1C��#7l3���x��t��F�^�����3�_z�
� ���W���xc���2��s��^[3�{v
�M���v}8�x�DO[of�=�������u<�����a
��'4'��Ks���;�������g��,���I�~x���w]��%�*���������]p�|��t"rARhXx�
F5�����n;��tM�����KnB�?.fr��}���?�����6=�����uk�N��TO���V������������3�qr��U�{����h��6��!�:l�y����=_�=�VX��X��I��u�	p~��W��T�uv
�)�C�T��/a�D�O�����K�}����,P�Cd7�p��.�.Z%�+�Z���eG}>TpN
���@��1|��hH�M@$�������Dh�id����
(��
�#"l�B�T���4h���W
����� ���4<���#�7hV�>�����8,�~3�W��/�"��WE9s�L���	�h����ln�~�4���
�[��s4�Yk�!&.�����I�V�9��������;�4�6#�
�4�vk�X�WH��@������s���1�
4�P��p��8���T����0������<�����!����U����8�=S�
����@�+����G�2�h�y:�[�@3�<��1�_YE���d��J��@C"�h����'C����<6l���AP�Tq<x��7���|��-�����'�����X,��	3[������k��X�(Q�6�9�/��^#��k�������5L/QA"\c��vzh��9n�����2��m�W�v��o�L��d����4��/n���N��1q�X@�af��*]/hP�Ly)?����
�������xi�������9����^8�&�����
�4�.����c��OS�ss�s�n`������1�>���;�[%�bU,�*�`dj���@���TExz�"&|�>o\�m�4���,���S��@�=b��X?o��i��e����Q_�B��k�����B���R�=hU�B�����=R����C�,�����p��&8�:�����^�<��=K�*�^�~����:��������xUL�Vh����5A~P�0��1��b`���/UV����k��t�	D��6�S
jjp��6B�����

=+D�b�d��/�AX��O5N�>�����x��><}KF�fN�X��Po���	Q1x��
��tm<������A~_�|,�=	�	��Q�a$J�Ve����uu
n;��� ������B�
�BC��c���|��#�������">1=�N�K�G������`nl��M'�4�C���iqx�9cJ��2���~��v����s>�SG�s�C�V������VA��U�o)�����x�e��C[K�n�2J����Z�6N������(;�!=�!�9Q�=��D�v����6�V>���.����"h��n����7�^1��s�j�\��R��{�{G"������ZU����@3@PYD�{)b}�Y����%���@�C��+��EY���D0MY~�6�\�I��Wt[K�����,+�u����"�u�aZe2&]��`T�l5�)����cV6u�"��ux;��]��.�~/����.Q���<��f�A�m��r�i�o�:�iUS�oi�`\��q��sJp��� �jb|�b�c�f
������5q�Q���F�Zf���
�:����CXd�RZ������= �����'W��]n���=K@C]�yx��3�Rh�mU��"I�#l�UhU-��R������]����.;#�����������P%�4��h�zE�d�\����*��@G���wx�W/��8���}���
��4p��	4�kqT[7��b���Y�<�������.����x"�����!>?���Z��2G'���+����������u������y�&bT72���y�N#�s�xP��$f�;��f��yW,�yA���_}��=7,51\B��5�M��pv&����������7�!$:
-l�I��8���+�.|�$�������[*4X��f/	����;����_3X��������C��\5�����N!��"��N����+"b���t%�� ���Fu��<[�^;��F��:�fc�1���g8fFJ����*��sl��T��������z�Z��_�v�=D�^?�X��<���U�����������U"�;���U���c������gEr�r|*[�[p �2���oVBz@��������,��#�0�YC�a�'x��b\��I�*1\ry��eK��}���gh0��f�t�����������K�
����g�Y�Z��]����M��q��ba��Xp���M�+�������?t��7!!0����{��gl��>���N IDAT�j�:������q��?���w,�����e]^y�b���������}�Z��G���<i����D�����6���L��{67Eb|3��z��-������Rh���s��{���_��
���D�A��e��I�O�(nj��/�"��A�
50a�
T�X�_��P�h)��v���j����/\!m�yA���<���	�����a�����`\�g���\%��]��������7����aJ��[����g�:�f�R�!("����iTi
j&0��|x�b�>����f@����������/���e�!o8��TeP�4���}������ �ca8�#��8ox������*!-�q�|�~kf�o�;�9	��P��{��
xO��X^>��:~����������m�����'�XYJ��;��1�US�����������v� ��Be��wH��E��������=|>�����B�U�:��f���<8�Q�~h6��������Q����!�.p:������?qm��(Y�3��vClT������Y�F�N�AK��.n���K��Z�IK�A���4�f:&�����K!�l
m���qh��e��|��������h^������9l��X��MKJ�����0��0���������qg5N:�������ThX���6��/O�&���c������aj�TA'�;���#���/G
���X{8�o����PR�����r~C�2���t�Ep<������,T
�
��	�s>	���F��z��_�+�����H�8�K�cx��I����1hXUS~��X������mu�)\�AD4j��M=m�����k���.M���� ����W	��q�!�!�����^���W"�B���&j�����1���@$���wB�!,"g����6� �[�,��V]*@<r���c&���]ma]�]�e�D���|EYV�jRi���X<s��B_����&�����:���f�n�B���h���_'���Yo}��C�
�|�m����0h���lP�
;O�&����{<]��3�>��em����������y�*Yq^^R�A��,�A���y����X�=.�/����U��Th0���[��b�XD?rB��[H�aL�C�+�Z7��	M�1�A����|������|B(4�������F�	���ab"�16��^�G�v4�:�d�C�]@��'��&}z"h�.���0�d���9|�66�e�����l����o��5�q���z��1�/z��,��G7���R����x��x}a����f���P��Pt����u.��#��6����W_�M��7���?����=�bC5�rXwc?�k97��v,�G�@���-�������C�#T������ $�[*0�o5�k��q<���k	
���5n�OR�8q9|<�����]�bc"�e�T`0�����pd)j4���59.���w����kJ����\��8����5���M������r
V_~�xq�t���?�w�L�xi�Th��}[v�G���rd�a������o�&�X�V{�j�O>�X/���>Oh`Y�>��3��{���Y��������_���B�~����X�~��D��o6�!.$Zf(:�.���m�\���>��(*��:��z��yK=h[j���@��i!�3�=�>]N������(>�Q�q�=��>`�L�53���!�����`l�VrL\t�������Q���b�����KoY���7�_<-����`L��]��D�u���1!��@i+|������E\|�3;t����xTa�����B��[��x����<��.}�����V_9��#'��eV��e�]�������U�z�y��ThhY�2�mt8/�#��s���
�e]�����V`�:�y����"�uU5|h����-��5��'"$�?Yo�m��v�+���q��s���#���_�n��hP��C���n�36�e���T�r�u��z<zz}��������i�l�{�Th�_�U���]������PfPIX7NRD�5�>*M)}[=��sG�'������{n{��u�7]���rB<g�����l������	���7�F�T���i,.�]��&6���f&��J� ������a&hH���i�������(p@��7b��$���{�"**�F��0��`���X�z+75�����c�@OWs~]��:�?.h$*4:q�|0�k�k��E!��3���#|9����1�I���`f}1��|p�'��g.�D�"�"���j�3&���R�GjU�����qR����_Q�QW�8]�$�/,�q0�v���08^�������,�n�N��8�}�[@��I�����g�O�@�#�\�����.��/�I��
N���Y�����K���|=_B��������|��^�=�V�S�V��������]�!���s����up��7Z���>����@C���|����k��@G�4/��@��.k����Q������u��EWhX�o�t����MY+\��5��_����~����
�����a��E��=,�3z�GH���
��������Q�n�y�O��5.������dX������B����YI���L��O�n���EB�!o���P,�3E���|�'�;�u������K�����Y��%��f5�`��y����sw��:�b�>��s!V��V{�����C�������ehc<��������.Hz@C�A7h�A�/'���P��A�NW�����^��t�q�����-A�N%�gB@�"��@�Y$�0s�"��&��tZe>���_�7�����UxC��Dbh,���F�u�����K�pB%nP�sRe�>Bb`44��s�[B�'�%p!�QW�n%�����`�EU$�E!��;�����)-��x�I�x�H�.��hYA��(<�>�Ex-&��N@�s���`������+c����+�K�%������}�_G��������5�{q,��� �<ym�?�@��������>�����q��/��-�������q��?>�SK�b������,D��8q�s����ox/���1����i����`<�-BW\&�B���h�����"�9�pt#D�����H�w���}���a�p����W�V,-�aI�F�{�6Jr�'<
�����op�;�)5���%���.@��w�Hu�o=F8a� ��>��S|v�*O����gn������Q��$��z����+���L��pU!���Qul���|��6�_���
�c���R��,��_�J���p����x`47�/�z�j�������{�5�i���h#��2f�(kj�����7����"���q��Q�
j)O�	���a��m�� ������97\_���/�@_���}�.�����7���J�
������3�(Y���T�M�C��cZ�v�����J�a�q�����h�T���
&�.��������R���H����1�
��X��c��)

"������
_9K�!��F�Me��0��.�����^|��3^S����DQ�$�(���"~�������T��lKr�Y�a��c���<M�Q�k�V������zc���<e���P�W�n��6��������	��oRK.:P��%��J8$F
'6��&�zB
#�F�O
*�<|����T�49�L���r����o� �J~�!]U�����o������=~9y����1���Z7�q���S��Y��>�aTS<y��53�����v��4%�������6
BKM��k��G�%�`m���'C�� s�

x3�8��7����k3#,�@��/����=�������5s�l����q��#�*W��;������h���X�w4��z�e��W�I@�!�vr����+���H��YK�af��8�t=������ap�����n�FX�zT'H�2�4��]Is+L���%�gbx�O��������u�H5����a��Nh8��l�������!
�A��=a�R��z�
+"�1!�����h���n�:_y:-�!��G:�� r�%	4����_w����E �%4lL{�&��@�����i
���[<�����U+�$U.����y?�r{������5�Q������{Hu�Xp�<���u�'�n���0�us��w�k��N�;��g����z����w���T�B;o��4�+�\���,7Tn����P���w{�`�g�3�Fx�����VOD�F���GP��T<8��Q� ����%��of�'g��n��x~y+�������T��hB��qKh0�6���?`��hW�9�������|qA������|�
�MK����&����j��FH�a��i��-$l0��
=�w��'��}�iX����x�g�Y|Vw4;�������������c
��|�P������b���XO�#����V�`)�Jx��`ug���?GI�b|Xqg���L���>�_b��=�P5�
48���s)h��K<jU���]Q�S��WK	%�Z����v����v:�
$D0����]�]��5d:��A����a��(L���w�>����1��6�����E���6�l�PR���Q���@�UM\�>��9���T]
7�baf��r%4d]�V�D1+5��;J�����{��2�\�AB�FcLY���0�OVh�?e]_z&�!a4bdW	F��2}���Q�t��`4Am�%&��W�w
U8>�����OF�-����E��nm�����BXM����	)x��a}n��^��N0������:���9tTn�G\���M�q3���C�����40&,p-��2��|z@��
|���Qb�=�ii�8_?w��?Y��������_!��Qw�J�!��Uh��C�RE	4�s�a��6m�a���
N��}[h����E��EK`Nw��>P7����[�BC���0"���������&�
�/>C|P�;)�)���n�J�d}uJ�A�hQ�3K�e6�h�
��cK1��W8�|��9�^�����Q�<&S�aI��x������Wh� �5���Z����zL�x���j����������]���:�$���������[�t��8�o*��(��q��a�_�`n]
�[��-�J(������Z�=k����(��[�����C`������p/J0b�o}0���X�g���k�_�*R�2l�����alV�;O��D������"����G�����]	*0��rp�,��~�_7	4�n�A=\_�@�2�p�J.{����lcB#�������T�~"NZ@���)�~�kf�C�����"m7� VM��8�)��
�������+���i=����ry����@��i��Wq�5����P� � ��/A(���A	�!�Pl��.GI��}m(�:���p8lz�C��X���(��P���x�l��<^���'l�M�@��>��u
�m�p�w��mg�}�8J��s3��]8%�[3	 |�4[o\���1<�%\=���z��T�1~<�����3O���@���00����W��f�s����q�Wc��O1r�
4/W�e���K������5^�I�a.�����J�b����f�����-V_>�q��`��m�Z��,o�5��
=:|�������L�m���A=�?��Y��������C��a�ZK�d8zv��4�Z���+1���8��&����C�j�b,�\^��
c���	?�d9O��^?���������>�>������9�.Ks��+
�������o���������bP���p��y���4�p-������O'�{��V��`��kh���m1i�!,����E�x����a>��M��9+��
�����2F~��m;8����K(Z�
�\���c��>X�q'F��C���V�J�`o�GO�I]����|}+iN�����*7n?��!���"����A-c����0��vH�>x�7��@�WG�r���sW`����U�|b��pfO������Jy��
�`l�{2J���3��!��=G|�u���� N�]����M2p���4��tzhHN�m�lJ��C�jM�J�����@�k��(U���$Zv��/N��Q�J�z�����T�h�vPJ�
�Pp���j������8��']y"��5:�S����-3��\�/O�p^r��i��{h������G�#�6�Y����_Ph��}�s��s�(�a8|�_�3t�j�}����LigLl^^������%��������s0��_��`?�\$!�R�w� ��r�k�4����]B��8�v�SR�m����<[���0.���4��S��z�� ��n����NJ�gnmE�R
��\V
�i�__�b�p�qFw�M��x�{�j���/R�7,2(hX�2Fu���22�V#u�HhH�E���<��B
bn"����y�4�M�U�$%K��� ���pn24��f�knL�0�� C"O�	�Z�0D��PnN�H�C�>�:A�}1B6�<��/�x_�PE�?)����$��(��P/n�x�0	RD����M-Y���/%� �Ph�@7���=������$W,-�AS���������0*Q�z<Axk�6���w����2�*�����E��'J�'��mMl?��_V���Ox��6���!������m��r�VL��)K��6��N
,`n�EE�@X�����OBR���m5��0e�S�R���/*���T�����������6AZ@�F	3�u��x�PDy��T1�A��g0��!K����G5B��k�?�������=�c<iL�����H,h�3�r�,�7�>�_:$��L�rbA�RI�+�������17��q�����?7_�S�Y��	*�8{��%a��m}����J���2�8>��A%�@����*�&���P%dh���;9�)Os��TV\�Yq��T+p|�EE���Se!9��v'��'�����
}�` 7����b]A���	�9O��m��<��x��w���kqBp���+2��j(
{1o�~����	~�|���pu1�F#�~|[�+4,VK��  R����P���i���SN��Bd8��1��(���S�	U�oXW_��$O��!���_���)v�y�^�.��t��G7Q���To!a��=�B�	o�	�$���<�v@�%�0�a^���L�
�
�.7�A���PO��'���H���'>K���K���m�Sy���Nj��W()�*^�*��7P.���%O��~�7x�<9l>P.,��_P�aY���S-��(cO���	f:���I��[ 2�4����.�����p�<q<���T`��]�q�����U!�#}
�*�>b\��8�mk,�/q����pT.��-����j}�D������{T�����jI���P�js�l�<��!�'��\<�k�C~��r"�@��C[0����w]�28��A�K/����L����p�m�W�=�B�%|�y	�H0NYK%�#`��5��!�2?�)���AH��~9�3�����*��\N�$�^�F�cE����)n$����f��^Hz�s���y7�4�k-���sC�b	D�w�\�9�t�����X�r�D��t�Y
�	��z�Ph�s�.V�d0�I6nO)G���guj������]Nh�3-�c7l���uP���� ��w��~"����I��E�~�s�H�d E4]�d$�4���m����I8���%�l��_Q�a:�t�_�[�y~=�(������ ������W��J�O��S���oP��H���P�����3U�fZ@����]3��mq���TO

��# �	;L<��Oz]
Lo4���BYv��	m
m�m?���31�Rw	%B��h��q��n��
����?xE��	�xr�'4��Y��>�����3�a�c��Jxa��������tb6�fbR�U} ���sx!���4��9z��SU�A��.����	��yog��`�U? IDAT L��K��8��$�m}��k���2/��~ ���Wc�����������N���L������?@�T}�Y�_�E�bT=h�gwB}���LM�/�������������wxMW��k���X�� `��b�����jhHp0��6�1��Ie��S���s�<��u*j����JC��+�q�i���x�f�H�=*����0������	�(�jQ�S�e-�
4�R"2D��	��5`���ThJ
�Tq�'�`E�!9$|
��fC��%��H����������B	�������j��q*B�|~���[��3�M@�����C��D^t���IE�d7,�?k���c�x2��
	4���aC�nBC
�i��N��R��r��������0�_��'O�+	LD���_Y�,'���������B����gg<A����U��Ttn8��&��
i��8��������:Vl"�Tj���F��;$�(��^ry;��J��]ND�U���K$������	����#Q���*!=�A�j�q<����+'WQM�6�������E�JMQ��6��O=�T�z�.��
���}�����3�m��u�N���O����*4���{PAw%6.�$����w��/�:H�A������+t�9�:�	��ui;��~�����R��������H��zK�������ky�D
"��k'��n��&`��e��p�,{��]X�G?U��V������+j�~�����v`��C|N_9;uD�`�(�2��
�&�)n$���hi(JvHaOc���Ek>�\B�Y�<@��%��k
�3T�|M��i��a(��	�*2���`�o��-������'��W��`��-���o�����)�0���T�&!�=}l�y�Z���W/�A�vT��r.������#j���? ����{IPA(>��sS�uJ�F@x!QcY���1d�2�R�bx��N8��)�5h*������=$� ��Q�d�:���'��p��Ii�-�.��8qH���!�A('tm3Z�w:���.u��8kw|�.���kGO]R���b<>=/�4p�u��tn=.n�����v��p��IS���C���@$�;�0��w�Z�%������jx�`R��G�A��<]����*H5����h��.&�f�T�����@���<A���y����Ph�Z�"�c��1��Cr��8����n�L�fAT6U�D�O�/�m�4�|��k��S�-�{w��XY@��&���K���)�����pK!��������#��������u�y��)�b f�&F����C��UP���$������d~�\����|3u\�5�&��}�1|>n(�>���g���$�<%(��T�Vn(e�|�1~�&��sl
����Dsa���]h�k"%�V��,�@��.'�����VZ�S[1��R�������,B���D������Q�z"�2��l-m]�1*���(�f��$��q�������i�Y�4y�>?
��
�4��o}�[��������z"��h��^~��P�f�����7�L�.����P�y�c�}�'�p����*�p��..8����+Q��"�J����}�B�Pgn(p ��T�O���Z����uR)�?�v�V*44��/<H���p���toN���l����<e��)���(��������
��aL�Bmar�%)�&D]��/����hQ�?.�������H-���	Ft�Gy��o���uE"�1��w�r�����k+���K���@�PM��lF� �t?!�D$
B�A�

J�����������Sh�����6P��@���Es��
��e�m<0�VmK	R������$��s1K#NH4Y�����Yus�}�{E�L��I��R��s
���:��m

U;#��
�W�Q)�}��4X��M�*��xE���m�R�/v�
C���S^��OI< ���E�d���1e�l�;������BMaDG[���$��>�����`�N���Rn�	�	�����0��-6����U0w�+��-��A�2��p���h�C���L�]�
i��h[�nN�@�OM������z
�`8�1"p�38
����������Nz���~Oh�_�4v���N$���Z�
�6����'�Fl�r�(y��~��+*�0�������M�����B�'W�?��n@�t����edY�����&��$!�o����S��5
�����t�K�Y6<�-\M��bB��7��s�U���J�-����W��
�Uh�����"z�%�P;���`�`1U�"�H#6�8wz�����������(Gl�	��pB2�0�f~���nC%G�4�8�������"M�2��Ie#L!>�n��)���0&�m�k�I��_��#��MTH�He�.Y9!�BC�=R�_l��gB�B�m��-Bu���Ed{Dp	���*�)��R
�W��Ju��VhR�&�8��[��R�^��)@�/TK���5���uU.���6�yFw>�Sh�8�?Fm�M��:���D97x?���(k-7v�?~S[6��O��]~�-Cx�5$�@�PMn!*��A����GE�d��K3C�~J������������I�&DxW�A�
=Z����npG�<��-����+���+�Xn�������'/w4+[	_�[���I�h(geK*4�M(�D�!,$�ZR�A���`$�N����N��BC��l�u�

�9?4���m4-[Q*44)]�.?�P)�J��� �<��K.�������%�2����?bH�ftr��D2�0���Y��?���Y�:�'��R� �+V�v�
��k	��%� ��

jzT|"$&>��9������N�1#-�����5J���5#����1�`��x�`��a�f�Tg�55��3N1���Zv����]t�A��
Wo�6�j"x�E�;�h���!�Q��O0/?����G���������T���$�`��$������d��l�Th����C��r�����&D�_��m(�l�p��&^����h�����UE�#������g�*�P	4<
p��.1��T����n(���/&3g^&�/�&"��J	����s�H���w��MU�K�R����}q�i���q�����TWJ��|%�5�.�����[���T���k�� T��M����R�\*3���7<��#

:@���6NR5H<�� \N��u�n:�|��@��

��,y	W���������_7E�A(2���3�w��/AB	F�j�z?��X��Z��&�	�@C���^�Q-BnS����p+q�0F��I�,E���[�K�S�O��NP���Xtk���^	�RF�P]��6�:����['�J�!�BC2�p�!���Ce5
���wb���Q��(�r����U����@��x	�����R��)!4h�(�����t��)A�w`�� �[

�pS�3��b��$��6�����{�s0��
�5�K��T����	�H%��>�������"5� $�.���/M7���`���N��i�$@S*4p�7j�6��]��Q���*j�K%�0��q�������t�@�F�[��

&Th��s����B�_d��o���!�y#���k��[�
b\^ �O@�����5|��'oW4+]_�����c��!	4��*�������tCC7B�%��,N��p}F���~��0A*4��A�5��(��� �e��URQ!h�!�P��'�%�p����u�����
|����/�	�����6b��}X�k��@��� t����
K[{��AX��9�< d����d�����d���|�&�����=��&���X� ��u���jI

+���������B�������^�4L,��!�GW�b�����q2wm�
������Z�x9?����?�RA�g�H�!��q	cY�����DH�����Jt;!>KN0�

����{4�

t	�g��hX�M�R5|h�	P�U����J h��]����1�q����Jw�z�����`�P�B�A@�TXC��������{��bU�:B	G��� ���m+UE$�}Q�x�`o2��4xA(;�t�����*����������k�A)K���J*4���}���R5B����M

B5A
eJ�F��
���d��Y�A���K��h�l4�^^������&DxW�A�
-��������W�V�R�aZ4�mt_Q�r[���U�ap�w��}�5��"4,m������
e����&7T�Z��aY�<h��[u<^�Q\'��[�[�W�zh��N��hf_
S����[a��;h(gm��� `y/�� �|/����AT�T���O�/�m�4��O����p5�����7�������k0�����"��e�0}��@��/@���aK����J�a���+��i]9�4���#'/`���2��n��~]aL"9���IN�P��]��1aD�{%(��T,�B���_�����U��r8h���������x�����Z�8��oY�
o^>y+����1r�
	4��1�>�Zp*/�8���E�;�u�O?���~v����X�P�*2<������64�������]e�:�����?���Y^�_�(����:��N:i�W������cO�������.�K��]y���x������U1��W+���?����q�0<�����@�E�b(9��\�p[�1A���Z��w(b�P�ci8}�����4�1
���0�^�	�J���Q �o��N�0��8�����eT���ko�3:}Z|�����
�ON���U�:�G�&�H��nM'J@A��`cn�E57tl0�J	��t�.X�2�8��_�{n*�3E�^�B{��0��7X{�ti<��������a�,
���A�Q��k�����>~���u�N������t�a�M-h�5O{����U��&��n*�^��^C=3�<4-j���V#��XG��b�p��>�
Bu����<ET��Lp��<�5U��PHO�!��j��a�E]��t��4$P}A�t�iP�A���TL.&D@C�=�)��e�G��/��Z��.,"�`0�<"����%�I ���o�_B���T�y����.+��K�z}�����t�s�_��lB`��[!�i0��V�"����RFH���N�������H��^`��t��Zq"���Rh0)�6u9b3=�B�E�>Y�AC�v�fH�>��<���]��tG��(!����=��=E���0�SQT��	M��?mrE���)@C�R��������7�m��������4hA|�~vP�����X��`*.<}N�~�f��<e!�V����N�����]���'t+�lq���=��xJ����t]!���7�������i
z�*C�4!�?|�
h��N4J�C�7��[���W��S=�>���2�4�g���	\[�����at_�nHhBu�����v�`Xu�����	
�I�x�Fx�7����"�A��Y vp��Qgw�����]|��@�[P(���
��s�p1�,��I��J7>�������
�G�*�2�w���&�����b�����U�]��?���B�n�
���S��	bC>y_d���y���?�������@����~�r�0�1�!����`�P,x�����K�gl�60�Ns<��AF[�,���O�nXu�
�����:-��s�-��?Z��������r��HU�IuZr�K:e(��DHt�To*�8�L�L7�ZC�Q���k�$����MW�!#Ns>(�8@��
�j��Ws�ZM�� ����~Z�0SGl%�����cK�q\sc*84���6=.��v�q��4U&��R������U�1�.B����T�1"$+��m[������ShEu��E�H��LW��M*�t��F���v�}���2R=!Rl�0�A�'��F�%n���@��(aj�
o>�R��C'��h������jG��{��tO1�n,���3�U�kL%����K��.� \bEF�q�R�(������������Sh�[Y=ZP���z�����M��C}�@s)��B7�#�����Hz^	��iM})�"������B�p��+F��m�&�5���a�D,���v

9GH�l�.~��/k� ����Kx��3R����X|�h
�p����}�t��v�2&7�$����YKW"V����1���	A|wt��]��P���T�x����w�Qm>q��$$�Cpwwww�@��B[����J)R��]���;Hq�����O4�6!i����dw���o���w�'q�+��T`Xr� ��������Q�<5���t#��X�|�%�B�������]��=�qa�"o�C��~>8�g����At�w����&�a����X�dh�Aw������h�imK)N@���9v�vV&-��1%�en����d\��"�'���B�_�a<��L��s�Y�������H]����.��Ck>�z����|��y
����
�K��6���0�Q}�g~Fq�^����pa>�u`������W�����$���5��Li�J>�� �"�0����&�s�(7�D��~��X{�
>jX�6mO�9Ihp(]%�������V"�2��@�P_��u�t��u^����[#�;�T�!��
��8Z��6NA�*mQ�fW�������_��]��{���J;�F����M�>���r��������z��]j(��i��`B�OR���%Z�=U=X�Y��O�%?���TX���E�I|��� ����M���u�v�7���A���������0��p|}|:~o�#���|��RD=y��{�����h(G�b`�tG�nv�0��|4`�V� �� ��4��Ub�!f�k���?CP�Pu�z;��#��C����BC`H"�����k������@�Hx��X	��d����B<zR�@4l�B�p����n(�W���B�������������I��HfX�?F�n�
�Z��mW������D���b������B$���ZK�[���*D����Pz ��{�?����u_G��G�s6�"nP1���Y�b��j`�%A��

"�m�c9��|��w����W�����
�C����?��8�a��X4��+A���u/��3��]�Yq�RU��5���5��H�vm�
����[R���s}����� 8Nen�k���b�_��������NB.'PN���p@�;t/�U��	]Q�9D����'!����������vC�+�������~��_PJC�U��n/�w��4D��mc�hed=���C����k��@a\�:B�@,�L��}z�5�Ak��j�$�eE(�t��O�����)@�l�T�n-���b==A�A3�T���p�����)�x\e=�C�������_[��:F��BQa��u)@���gp��u��~Z�'�_��Q�z��"����L���^bX�.(NS,�����\��Y�%�Q������Ww��|c�M0`Z��S�L�A��h��[��~��]�.ODYZ��J�����.v�=	���m���r
���C�J����[W��q��@_��u���k�G����"����K�#K	3��x!��7�*�`jF��d���t;�-��5�
F������6�|�`D� ?�G�x��W���0�H���cREB���t��wb��t�q}G/�����B�N\�
��kT���_:!=���;��kO���s������h��v"8v/Y�	��\��}?���V��H��5A/��a|�9~�����
Og&�.�t&a�c���}wc������7�;�����;1T���b�Bz�\*�i��4"��9��Hy����!���S�!��'Lt.��������L�2�
���B���a�gO�3�?h����������t�V�,�$( ��@Cs�����8j��MRA�\��;c�����*
�\�Swm�������u��Z IDAT��&Lk�MBa���w��%��H�b�+\P��~u������$�/��a���g����1����hBE8������P�.+8��@k�����wCF

eK�G���%~��r���H������4���x�}7�A���q�J�"��r��o��k�5[�A����R�|.S=t����&����|��n���m���K����
�����P�R�z�Pt ��o�u ����v��PrhQX���{W�������
�e�Qjd1���t�sD��F�������s,�Z:���w�h����Sr*���D����)@�>�M�y�)���6��u�obt�Z)������+�kzW�@��m��[��
������������s@�0�
f�]�S^ �Ltn��H���Ze7w-��O<p��}t����

���~�"���=�7���6��	����N�h���y���R ~���

��3�w����Q��+��T�GfN���_����@C���l(�4d�Q�H27u�i��P�VR�����]�A�kE\U�u����S���jc���G	���(��B��x����������]Nd�L�
YM/��2�#��N3=�!'����y�d�
9Y���+������E&�.z=��6��Ev�d��J;3�AS���t�r[�������Z�l+Wz.'�-C�������}�+�>l���=#�����S��.'����@CV�����v9��2F�0�����������Y�+��T4���L/�����C��5�kJ����-wYMS���s9����/3�!�����S���d����D>����D��FF@Cv���i'C��7#�ASy�T:i
��;-�������!�-�~�����������@��U�P��$�TO"�f�[�.���TqWDEEc��u�@�IR�B����lZ@��W~X�e�tU1�Z��C������&I�wD^�O���[�I�%�&U������]�����V�8��l�~�(W(H�
��Z�P����]�rS��
�U����&�O�@���8��S�J��|��*@��&T��m�JLhP�J�G
d�����u���3��CA�7�k��h*@�f��
��c���
9jrh�Qs���4�_�.���!�N����`M���
��5��a���Q,L���I�TP����t��(@C�6��
��5�*@�zvS�������
�	���r��KN�=O
9m$%?���
��Z-(@�jv��X��CU�������n~��f��}-���
��Y{��Z~����7E�!��Mr���Tu�
9�`�!G��m��G��l3f'���6���S���4�%�(4d\%�h�t�T��,�
��K�B2�h�g��n���4�Vw
�����+�4����r"�ZY���
��[T��*1�A+�_hx?�����!���4��#h���
9j�l�L������4d��5��4h���.Ah��J�!kMV���4�o/hP�������rtu�������v�RT�R,�,�
�U�4�f����
o,�
���r6]hP��
����T��
�X���(@���//^�
����!U)@C�6Xh�Qsg[f
��m�����!�M���A�&�u	*@C�U�
Yk�
�����!}{)@�4��4e-�4d�n�U��h(�j���<a���D���6G�klb	��9��������������"��4$����	b����aZi������g���2@1h������`cc���Y���=�4�!""B~obb��I�e���������LIW�/""5�Oz�%B^�9�����T{��J��k:2�!�P��������all}}�P*�gi�[4IH�4���{��G"|��\v�/��j@b�u.��/�w�D�S��*��C�o�L
�U.�&#������:$J���aZY��<
��4���X��7���^�TF	Ic�����Fr����_����C�01>Se��g�h��[��8]��Zd����]UceW�f��x���T�U�E�����j�����x��i��Fb\��Tu��:�����^o�j�����*������d���r]^���������#M���T�xFL�
f�R��1�J��^��av�o�f��u�T.����
��mOr��J�9��V��y���A���GG�<SfMTs�������.�e��������LS���M'��wa��������������������}g�s}~n��x.��_���7��@vf�����)�9e}.�g����2�����xN����c��O~]�����5Q����D�w�iX@�N����x�\ P&L��)���5S��:aR���W��L�}�T���2���[~n��x.���� �~����V�s�OQR��z�2����2��������?�+��xNi�9��3=z�����b������@��.y��^�~���h�W��))���R�-��E��[��O����U]���`#M���j���H)��S!���k{�,��qqq000��j�5��t{�57�����-;�������-7���~/���-?�w���k��_�{~��+���.�=��o�x�����{���g���s���N���S�s9�>�N�����l�y�������:��d{���2;���]Qh���T���[@Qh�;U��
�wZ�fJ����	�����J~m��v�k����SN������J�_O|('��}�{��FJ��S�s�BC�xJ5S��������h9�xNq9��7H�H%��wQ;�x.��S�{.Rh��H���r�
���6�j���I��v��u�uAP@��2�<���+@C�l��x���Q��'�#�=��o�x.�o���+��������2��-s��(G~n��x.��G+@�d��{57��!E�!7��,y�h��X���o��u1m<{x4G���bs��f�g~@*@C�@>�CTPB�?B�(,,��Wn� 88X�����{�C'�tc�W������P�E����8����hHL�������i�}��J+��b��m�[dSm-��06�T{W���M�m���%�7<<\�����H�F���������3u�{v�#u���:8�������-+��0�w�d{�dw�o�E���.�I?��w--hV������.��o%:B���
��r�t�����U��b�pXU���{�����7@xl��+�]h
%�Y{�P6)�h�� �@�s���h��`�E�J��Y^����������$7��T�[[�R�SSU��+^n��"tq�3�\U
C����Q�ik�����Y���.�D��J�n�W��t��Z�c���rK{W�v��}��pN�}cs�F
u`b���\V����g��KZ���`���*	>�.7�o����:k���l9Xd��8��
�����4d�V���@C�(kD�{��K���]���u�~��v�3�S<Ge:���
�{���(JT��� \�
S!�;J������
��H�|��4�@^�H��_�G,��m��,����2���bN�E��+�X�sGq=*Ycb�'��0J)R,����Z��-Rj�Y���O�cn�9--]��~��6~���o��w����-Gn��Y�q9Z,}�����h�1�n����F�T{c�*mpI;&GM�)�3����<U����6�{pD���>����B':��k�$X`��C6���
�b�>�o�6�ou~D|bw,5p������WY))I�r���g9�_�|
���d��GC��Eh`�V|S]�
��)GoD�������,\[��h�r,�aN
���@V�)�W4hx/�)�W(@C��yE�!�(4(@C�ynDI�!���!�v�
��(/�P�����4d�v�y�4d�u�o�
����^r}�*@��5�
��HhP�^y)�4�m)@���0u

��Y{���4�n_hH�V�BCRh�99&~6T�����V���Z�,^�~����b��#2}*~�m9��������8z�bc�0�og�8�M	=|��m{�A�*�S#��v�=�R�]�6C��E��V��X
��w�4����fxx(qQ�:�	���wv��R/\^�r����e�����(����;��K�i����:����(���b��Wj�dbgl�����Ysm���=�B�p��z������.�S}3X��c��-j�aB�/��}'?R����yA�A��%�U�['?h�!z�e���dxKD���g��1U3��B�3>6�j���K���$U�!�=zr��a(��Q�����@�����\����D���j�Q��
&�vD��Uj]�:����S��.h����dO��K�����2���Y��c��ij�����*������.9ri+W�.Rs��-�j�R�1a8�����Y*��e��lRa�^��z��ps�|���x���RX�_s'��K���?Q����7F��`�,�������k�e����H�78(����~��=%��Mg���f
�G���;*�:;l��P�Lg��������_�\�j�V06���[YS�hX�B"�p��!�o�_c�����	Q��D��|��e����;+g4��G.m@�_b�f��,j�oSc��V��H����@����;��W��M��#�!<J���R��\�)�!��/�8��)i�i�4��`f���5��cm�9���Q�g�P��}����`ij���wgj��f�k���Ow��K��t�$L^�����~?��O��RZ�^�I�A�k~<�#�6��31�U��x��M�FG�K��j]'"g�B��Q�q�?&~��)�?W�L6v��7���x��u����0@�f�X��O~���9�Bp�R���ih(��bC�`_�	<�oD��]��!�?k3N~�]�kDdM+4���&�T}>�@C�����H�u�\�B��z�kGY������*=��;�X�I�J�5����j�MV.�$����%v�Edd�.,��BC�����3�?4
4�c�<�����X��ku��]aY�N�|�U-�^<h�C@����`�����]�l�1�WG<����3���G�Lk?�@�f�]*�����E�1���S��������ame	���q���-�3�4�$L����3-�A���P����&���4h����97rf��JK�p��Ua=���4$_'�hH�F�����v��h�Z}
f\���+@C:�a�����	G��<����>^���+7��s@��.L'�D�Ok�,P��*�hh0��q�#��z����7��=m]L�6?^�6���
Sj�����#.Q�E�d�(\�����8i�2����}-4����S�A�
�U�!��U��V��,P��4
4\>��:��� 0A�I�mv
���k�".!A�;���q��x�u���h���G�������*�$9�&������}��f�3�?�
����g����Q�C:L��������E@������sO�444�l{�������qM
���{,,�tr5�0�U�pE��>8�P�h)T+^K�P���u�&���>/p��9�+���]=-���g�����>8����s����jh�2�W\��
����g���V��d���Tw��@C�^�x�9E��������0s���)�����|44����Y��
��yh���-f���9k��jM
�	�1�t&64FV���^�j�R�U-�^<h�C@������I���m���X>��O����9�J��e�������X��F��<}>LML��I]Bg�B���ah`���jc��m�$��a��J8�/ ��j��>2�W~8t�,�uO�&~�m��
���i	�!�����7`��~2�/�����C�k�Jl����@����F�V�~�S��G�Saj����6C����BK[g��D����v������0~�|}}����r����
������F�-�/��
NPJ�0���6�_�����I`��C��	Gd`
����{���Se��~�	OD��f|��h�����Cb��L!/�`h�Csm\]Bp�L��q�C���)L�0$�y���L`b�C�!�6�d�J��oQ�{{�e�K�4�)�x*F$+4�n����B�(�������\j��B��8����c���C�����t��u-Obe�E�M`���G�[��������^���A������(�i%�3�I�.z�{I���������BC��f�� th�?��@@X�
-	O�h���)��ZD���*
�y����&�}���m���-"����6��HC|��Lt���K��"�4,g������

������H��o��B�xE`���X�i<e�������2��=\a��s���~�W�

�m+a`��,��Zg�B�^�+������6cB�	����>���+`�o��nC0���(�m�����|�4rj$�3�5�O�g�e�K|^i,������x�'�=F*4�*�
�Bc��z���Rh�V���W�m9o��g�l�g���|��L�KF.'t��Q�:|.���8�#`�MO$x b�?0�J����Q�O��~�	�sw@�����H����G����q��q�F<
g���w�	��~��|Wh!b���!�C��+�\x��m.6'�� j�9��8@���R�� �����!=����@?=� m<��6D�R��u�g01�E��Cp��.DE��]���<m����s��\�e�����`e��8Ah�ptu
p����	%4���*����W���jheK���6J*4�<������������6	��
�����X>����mi��`D������`����X��oP^�c���D/��--���e�w��EA�����0�:��������V�4L�L�W$<�A�?�BC��]0��7B'.�~��0hQM���9[�W���[����1ot���]�e�����3B���i�M��oW��yU4����ql�3�C��&�t`:@������U�-h��jC�<��7*����P_p`��v?���
���}���n��W�/��,�=�by�i�������
7�b�[W�pF��D|{~!�[����e{����xJ���<-�5����Y��"Z������9WW��mI�]�&L�7OF5�n���6�E�E#�'��w�T���s����Wm4+Tl�:l_�/-E����b/Y��_�e�^�j������4&�������#�u�'����#>9��5�~�������M�������T7d4T�c�"�-d��|��?s���>�I���E��8nfts�?�O��XC�����?�h�7���BO����:?�hj	��6�����y 6<�&'���D����

�<D���p|��[��N�����:_��63ShH�����hDE������1"�@�(�(�������x� ^�m67�O�>y���D�-��5�#�����D��b�q����/�M��l�W	8*V���W�G{��P��!��B���x�8�o����MZ���Q�b����JMZ��y�L��Z�>��;4Ib��(��b�{����8��j1�e{#�%���h�N�����W/���=i�UGC�9�q�G63�>�Ng����&��z
TO}B���P�Dq|��%�
m��s�8v�����p��m|���s�?}F�mej�1m[�����j��
f|�z7����.�=9��|.G���`�<�%:��"���uG���8����C_�L�z6^��8k�La7%L�����6\^������k#���gf����Th���,�+���v�F���Q>���|���'p}�X~'� �<��r~����g�l�

��4���	Wo�#��.���������sb�j�aR�"�f�����;7B���H�)wV��@���B��I�*��IzGd��Ml���4���xt�<��C�~��{7f������/�������'�3]*���'g�E�%x���7�A�����$�~����	q���l��y<l,1��x�>f,�61qQ�����x��&v�X�z�:�j���m��?��*H����W��6\� IDATX�V������������%������`�o��8zi#��������@��F�6J�������go���a����u8�g�����5tk:�6�2������(C;�3+��p��^l7�~�j+M��4$<A�I�����k��������
������B�q���n5���AbD,��=�A�b�5�{Z@���6����S���z�VC�����CP�kR����*
Eh��G��8��%�!6�c �h�7���������������������j�*���z�>��-��j_������W���3��e{����;��/��+|��gt����6EXT$�Y,�,����3��6���y`����i}F���B�G�/�����Ph�Z�	�z>�?W���A�A��r�<c��M�9i6��<P��+�-����P�>��!p+\}fM�

�z��#{��+����J:�`�z���@Lz@C`D~=����4*^UY��w�E!K[Lk�������Ll�	z:�b�X������k;�����������N��
�	����]�i�{�����Z��+/��U0.�.��p<�b�H�A�g�{�s�$0 ����y������C�2F�^�����?���e��2���6N���
���h8�������o��E��M��3_��������~x_���� �9��N�B��&���k%�g�B_�*k�zM�����y�Z����%*�0�X'!��R���\���`%�Q'�4m?���I]�5�����fWO���Q��3Z�!B�A��on�R�����Q��i�B���WN�}�_p����t�������v*~��L?��1��]*4���jN���M���)4���`�y��6��8�:t��oz`��������;�^�(�8�:�?��J�2��a�w����y��`^T������3��q����1��"�n
7���m��|��B�DK~��#�:s}�P�\_~�3Q�)o�� ���Ce�����@��CQ�c+�\�����x�;i=����,�77��|�Q���M�.��wW�|J�4G��&����,X*4iC��l�=�rC��9~~�)�k�@�nIk�1k?��w�7���
�Hh�L����[�ApH6n�P_�����04�F7C>7Z��+�	(_���k��U��2=�A>�s�#�abn������y�^G�jm�'E���3rnY�����qR�<�/B�VT�Q�*j:��4�;��Cw�*8��)N��7�j=�N�q������C���3��
�nG��WR}}EHa��
KD����M��=����IN|W����\sm�5����Q��������Y�A+/G�)���������NRY*��P�P�s��b>�i^�I���]�w8�:�8V��#��GqM]��h�_���*-/�r�����m(.'���4�!�����P��1t� ^Wo���~]���M��el��r�2(U����;��G��9~�:EN��BC�
p��-���i�ETT������l�uP�V�_����?���P�a:��R[H
4�����&����/|<���,��X@�4p��j���� ��O��G��_���}x��:�[�s����,�����;U.�4dl*h��@�����>D�Q��g��7���,Nn���3��<�k����p#��`8�����{On��x/�D�����8��6�g�8'On��`^OOE�������rN�l�����52��E�����d(&,�b��x$jd�s�������e<�4xsq*���k�?�mtP�����
����0n�#��
}N��=�kK�4���(�i������ZW���l;S�x�	`�A��)�e~�~n��(�����U��a�vf!#�aT�B�����,h��|C�a����Z�����jF�-��������"�y�K
�V�@���6�����>^����� �mt�p��?����1�9�|aS���6���;<���-'���������e������������>�B���=~$d1��#^�hh���'�x��ss�v�P�����F�b�9���~�U�S,��m����\��$�Gc������]OlFy�
��le�[��iw# 1��/txL��S����
����#�
i
�:T��g��G �-L��o{��G���|F@�q�����x_h[�!�������i#7���ut,bO��q�&x�&��!j�)	4���K���6����7�����2�\���	'�N�:���-l��\X
�6�%b�A4�@������0���?������W)m[n�_P�^E����g���s5�
���S(Y�)������WB�/%����<xt6��\p(��'A�F_!��?'��G��?���������Pn�.T]�];����?�F�A06�����t�� 0�Z4���H\��M2�������������-3c�������Ie�������W�	,�E���$@�[�1�/N����;�:"K�#�����lF��v���L'�E�����\\�+1/��pA���0�Zz:�X�	���g���Ze�S��L0F��Q���@��0Kv#�U,�`�s�S�N����I�A��X���������pF��#j�a�)������

�7�U����K�q}|:�����/bL�~��?��~����T�<�=Jj)fQ���iL�:n�'�%������w�F���.,A������L�1����e;a���
�%����a�e������z�/�����#����;�N��Xyw�(~�;�h�=��	;4.TC
�	���}]zuG
V����o����`��5���i�7������?M��s����K_?n6�R���)�����E�'c��(���@X��T���|O����k���!3����R��������E����?���p������{!�?u>.�S�yQ��0N��J4�����Rn$*v�%�>�FU[W��D���pz�D��/���A$�
B�i.�������LWl���Z���M�r��H.����8�r���[����.��{���	�U�'E�fCp���@C��p�N�-��p�z*U���]Q�Q��N�v��	������;�
�%"���j����1��8�b&Z��!���
��b��(�V��B��PSn��~�64���P��4��D����x����IylXA@��������$rCC��E�]`8�.�jn����Zg������:���g���{K1����
�?���a!��P�m�����uj��
$���+���7%
V��P�hS����|&��
G���_�6��.���G�������H��{�o������zF������>a������[`L���m�`8����s1�6������Oe��y��Re�=��{��r��F���g��k	F�+��}��U��/���:��s�!:6iW��.�u��>�Y�����5�$�`3��	�'x��"����S�:sCq�^X
�\qT�+-���TC8�������[sx{\A��S�s�'*�Jf@����M����[<`�C�O��kF��@I4��G�Jx��@u*���c$�0��w��v��]���s(`U7��w�7���=%h���>pq,�BJ�M�"�e�~	������:4�H�,�l>7�B�r�q��~	Vj�-v_�f5�`����P$^zH�A�u��_.�����m
�S�O����2�E[�d�����'�m��>`��A��<.2�~����BC���/p�����i����h�5,��-���Z�����~�"���-K�xP%�4&�_�������!|���!�}���V���Y"���Q�-7���s����^9.�Sn�\?������2��|�q�D��*56�������h@��'�q��S8X�r.g�Bt)1�h���.��v�&3��[V�p��1{�	48�����?��C��n��s�W���������H��W��;�����_��F�5���#z�o.����8�-_�����I�����hR�:�l��$Hpb��C�{���b�<����_b��_d5��:�G���w������J��'=����}\�~�a�����;�P�s���������q��8PBQ[{����C�0�e7n�c.������(�U�7]�t)��7��E=F`��e���P<�{�g��_q�������������2L��1�;'|��s��f82��.���|N�����B�:�9�3����#��Y�YFH�`�OD\+]�������%]��
�'��cS ���f_�� ����	�����I�5K�?�a��T�f�% {G=l[��1�n-��/�Ic<9�1B���hh����e<]V���%=���/pi�h�rc5���.U	�����^��_����fs3������U������z���	4x����;��`���
EZ��������$�J�pK<A��v�m��7�g�����tUq^'Uw���P��������w��tA���5��5'��9�~�m��c�P<z�i\'��Kuw�^2���e��x��� ���HB �r������	��A��4~'�?���>�C�	�ZFx����!��b	H<�A:�|�w1�cNW��cP�;�OD"���<o
Cq��:Z������UX�	������P�t9!�����u�0�A,WB��W��J89�2	c� �����gm	\���PwRj���c#��b>��*�8��B���<�����q��0g�����o���W"��`��{Bx"��@Q������0�_3������Q�\#���+�]+b����4b>�_>"��%+�P�n��t��o����W�p+P�,���9Lk��/���X8FT��?.G����p�%�g*���0�k�S��y�k X��Vs��"��G<����8WyF��E	}�����8	�|�CqL��p��Pm�G�CY�d��]���E<�x��9����ul��b,�U �P��w����e���x(�	��7]���X�S�����XS5��~����E���28�2LF�7�4�!�����S!"��5����������t�[
��n)�"Bj7_~7�.#"���)�.���_��<i�DY��r���*����sJ��M�u&�I��fb������2>�S*C(A��:Phi���jv����xpa�Th�{v3�_����E�� kj!
��q�)@C��P��H�s1�k���p�J����V�T�P0p�@�7�y�_�E�.�^-R�Q$Ym������B�>2=WB�o��<H~���
�u���$�)X��e�p��PC0'���KJ�����BCz@C���C,q��`�JbI�$���L��
�"�"$n���H3�Y���`�����y�E���Lq��yIN�����/�D���v��yI�W������`�|��`e���-����E�����v����'��	��Z���7�LLp�^0��$�`A��MD��O�x0;r��j<1��fw�\���fqbg�+c�e��%�0�YATv5CPD<�����c�TC�%�`A��_D����)z���B�F�KK�pC,����*����6����	/�Y�V�[*1���	h��7'����2��
i�������~y/��P��<��]��L���:��������V$��`eJ�Me.��b��+��:�Xu\��1#�A���=@�@���	�� ���`��>��>G��7�M��{�1�|%��m�g� �Q�����u"�Jyq�2|�^�����O)������RQ[Ns������n�B\��$Ta��9;`6�B�Y�x�������gT�W)=�Al�\��	�<9_�\78:�a��1���7�'\�]KT��?%��7@�<7n���r���U���F��=���eRc$(���R��g�zR�"<zr��P���M~�����2X��~LL��H "��Zf!C�^���[�@����	Th��uV��3G t�o�0���F7���T/).'�ua��H����]p� g	80��O�A�P^#\NX��R*-�B(9Xm���[O��{I%-sDo=	���F����2n�T�H���s�������I@���1&\w�!����5��5f?
E��M<�����(�*@���������q�i�}��v���������o�2����+�����=�]N��3�E�W()��,L�\�^��q�~Mq	aol����g�A�r3jS�YR�A�
!��=��*2X�x
�<=��|&�/m���,�������_o\G�`[���=��������u���+�`���tx�
+�n��WO��wnd�?5K�O������bT�����A��9G�A���P���d�1R=���������Q����~�w�E��I��_��"�v9����6�1!JS�icM�QON����p���7mi��2T���6���n�K :$^�3zv~�����v�hq������(QF�*�I��
TR�����OL�{�R�SEG�GK��]N���o�D��&�v1�<���@#	Ht�m�
���4�����nbh�{_#���rQ
:S)������a���h�x�\C_����w$��1���|���F���(��=4$_s�X4
���"oq����h���a�q�l,	M�n�T�$
���@�^o��n��h��������O���]�!,�N���X3�3�S�U��t���1a���W�e�h�	M��)������a?���X�>�J9��+�
/$��8%�4$�-�\E+�4����TR(N5�Y��bx�yX����ODE�G^���C	����<_��360��[��������A-~�	B[B�A��a�>�R�(�Pr�CV��@�k���#���I�0(����vbD�}�8w/�����U�CO�y���qU��Oh�����{'7\9��T��b<�m�R�43D���?E��c����Iq#Q�X�(T�����Lp��qx�z ���-���nEk��KU�9�]�|����%�,��q}���o�(j�o'���O�b�e]k�w�	R%����.���B#	�=��sq��_(�\Q��j��
�X�m&K�A�o�o�@���1������B�BI�����|����e[�^�N�t� Np�����q�=�w|\"���H�#h�Z������ZB@��Kp+sw�>��)�J����p�x"��lg�#��R���S^<��*���_���#�`���d\���8������*�Gq� �*!3����G_t�O�;}���j�*��F�����Z�6N�}�(2�]O�.\�`�,����n�����0��m�q<�+U
�P�DY���6��3|��	UREa��>�Q����B6�x�,3'4�X�xj�P�g����;��t�$	B��W�BE�B������b��)�=k�*&z+Nz@�p���'�P5�g���33Oq#q�����|�A5��u�n����BM	4����z����z���TXy�(U
�p�qh��w=fu����7���aTrr�W����F�h���gJ�&s\8��BS�H�sc�4'��u���Bi���d�+�w��	=������:X����� �0����)^��C*K���/�b����D�o�]���H����!������Y�0��79�,E�)����FMp�"���''Y����beQ��G�F���0�|���������q���<���Y���l\�;��@�h�
!�wQ���p����)W
�
;pS�F*:Z�!�6��o�M�i��wS��0����\u�5=�A���.�2�VXs�nzb����I�(b�
�6Xv�
@\��
��p����{�2�����I�xX���
B�%��������x�J��$��_ IDAT�G\�bmhHv9Qn��TR0w��]e�� ��`^D��"RJ]�sk�� �Gr[n�%�� ��6����aW��&���	���lI����	�B(1����!%	��� ���_c�57�B�fN��`}#�pM2������q�:!=��+pS�
��x�!R*4�9AE�x|4��/y�@��{���k7�Y_����xr�8^?��n�Q�J+��P�Z[X�r��6	v�JHh(E�k@�ZxN8m��3h�Z
F�|�
�h�c�mz�e���?�W���2��c�P���POX������B�p&���6�)YDs���������d�1���������wb%�KbbC�`����T����a8�+G��8����w A7���/F�� ��<����p1���XGU5��:9cD�f������5?I+=hH��
�����^�Z*WA!��4O�I�3�/������qg��_�zh9n�t�H���u�a��}�U��~#I# �w���#w��wLBj=���ZVj�!>>�����I����	U_wJ�w-�.�`b�{�Jxz�:|���A���J�!��=*4��BCo�3���UAx�9����!cS)@C���5�3.�����p�� �r��7��sc���7#K99�4Ex�wC��b�T�[(�A�PYp�gV�qM��+4�CNVbHc�4�r���:

���y�����"Th�F�Be��B����1Or���B�!�<>�c>� �A�&�P��)���c�I����Ph�M�,h���}h�Nr7!��

l�U����5�6s��uO������]���he !���A
/4.o����c�	Z�+F�}he�R�~��L��ep�F���p��Y�b��*vUp7�^
���XDR�Y���W��Tj�W�/����o�+4l��j_c�����l#OT�������a���tG�P���Y�x�G�F������-��Y�����Fq����/T8�Q���.w44w�WS��zn.��s1h0hY��abs�6;��>UL�t���i)4��.��,@���v��'*4L�B���(	OH!��]�jHxa;�k���cR>�����O�q�A
�M�O��sp�TTH��q��Ph�gg�Z��=�G���t��BC,OR�1-�Y�L���uZ�C�f�&�xJ���}�[ 22A��.V�!�����;e>��Q5d4�]�"�=q��B���0�*	hx���Th��

Tgn(���h{,iq�-������FFP�a��$���G�W�^S�M�;�iB��a2�3bO���F���T������#f
+�h0�n"���D��$E��sS�M���A���Tf0��O*3�m��#tu����!d4
56U��@9��8�u���`����4<���ThA��B���V���1��!�B�������V��R��s�BC�JB,�

!�X�1N0/��p��
U
`��mR	B�'76�hDs}Sl��i4|z�'��0��4Y���V���/����I���6l-��mpJ
JBS��_{/�C_H��O�D��DKG����X���64��G!����W�)

�@��A7���ye�,���2��/�+��!��oE���y
����7

�����p�@��CI�i)4�]W�<��(��1Kld��	�z�=.��
}V������p��� �Lw�z�B�x/��((��Ef@C!I���DinhO��s'c$�P���	+�j0���\p���X���Re����

���P�!]���}Wc��P�UN����|��'!�����BC���f�B]A(A���b/_��xh�g;�!T��C�!�)�&DY�������Q�����sT���-e��BC����z!�j��^8:����6��A�n�L��\������BB�����VM��������V������4�2�w��

������W0�Es��e����h(�XE�.���7�:0!R(hS�

=�K�
���D���G����Vh0���hn��]����7fo���Th�G��� \HWf���@t��A���nP���G�x�	��mEj�a���Q�lWl>9M*
�T�K)S,�
��d%�4@AK�&t�`3���4����.',��O��:�6�:u��Cu�X&��,�48�����`ot���l�Q���K5������'x����)�B!{���O���V�����K�Q����*4$i�O%L�S�t�B�z*4����t!aD7�B-������GH&-j%�#�,qw$C�@��Cs��Z��3
m�ey	#�~������<B�A(A8��P�a$v�\��
�B�	1%��t�Q�P%\�{�^���V�S�Op��V<{y7�*���i������JS�H��x�.���R������B����0^9����~��*������G��<Q�����X���<���A(4�Q��%�+px�T��Nr7!BZ

�������f�J3S�
B5�0�BT'tP�L\w�)�BCDt4��=��[w���X0r�t7!��

l����cc0�C��w7��	���u�:�u�0��~�8&t �����"����hn'�	�@C(O�G�c;�"Vv��L��m�j"���?�GQ�p���F� �D8p�[�����	����(��yQ��8E�.T��s�
zT�[S�)4D����iE�>;�%�'��bq����

]�JEAD��A����:�psQ�`��!#���Pf�2�TB
����0�'o|�mAL�"�?�)�)��.�fr=	� �R+4�h�1�?���7��Th��5�.���P�)M�X���B��s������k���_<�C�G�:�o
�&<�*�\��u�a��@t�n-]a���u�'�W�m�Dnv_�8O?h���\���B4��H�^TS��]�K7"����p�6���
7�"����������"���6����_����I�Bz@�b�+�C�v����D
� �����b���hT�O����r������*��&Jf@�PM$�%�K*��q0hj	���e�����������A��*}f�I5��J���<($Tl�l�����E�%����*"���D��U��o�
��h�'��w-eYH�'����z�zB
E�{o5!+���\QG��2��_*=�a�T���K=����K*�������(�������Ms	4����x*4��BCA��V�:��vS5w���
�!|�<�����{�x4�5W��%�[*N��s4:���WON7.����g����P�g��KM�����	���
�7�@��TA�@�������~�w�HfY��������=*b	���\��P���d���TgxE���t�#��DH����

��������Th�N��[>B�AK�;l�:��N�;�}�b�9����	�ol�������l��7h��'����p��oe|�@�oV
����Q�s4XX�Iw"L�y�t3��MSl���*���ka<|���}t����

���~�"	�{��/I��m&��{�LhHnF��zJw����!5� ~�)�;L����e����_rJD��Ph���t�>\�!E��k�A���S��R5;�H���@�����30F�������@��h���"6��~u�!�v�
�h�TB>o�xA���	X{�p��+�(�%���&}Dx�w��\'s)������������B����
��z��J;�o):P
�|�$w"�4�����<9��C�}�/�a��CR����+O9:q�S��.3��B9N���	�ps�nyD~YUh(�S<�9�v��
w�W
O�w���BC�R�Y�^N��:���l�S�sc|���W<����� 4p���#�2y44-o%}�	��oz�V��SM;<��4=��&��?��,������;("("���{�cI�5��'Q5��cI���h��{��{E�������%� �� �3y�������[f�9�wcs��r�T��/0���]�S�`u�8�����,�u���m(

��MfkA�h'�&-D�eD*z��E`��&�����v�<i��v�T��oM��{����9�8�q�����H}����!����k�+�����X�b����^4t�����8��)7Ls�
�j�OK�e��m�t��7��~��S�'c��0�2�j��v�EE7��C�$]�w�DBz���Z;�`D��Z�^F��
�?lM
^�M�{�G�����y��4�n�����}����
%���B�
)C0�	�d�"��o\){sv�0�A��}������U��Iv�� ���'��D���fG�����)��i��S4�D�,�FOnY�@f�l(��]���������C6M�������9�������Cp�)P$�Z��;-6K�V���U>P�g�6�&�"YLtj�
��
��N��)d���7HN��6FF4&h�z���[w������X�L��C�l������Bn5��B���l6Ph�H��H��6-Jw#K����

d��?�C������[�G
R�A�g3��+�����^:�]�������d�r2hg���%�V&�Wt�P]�HLJ�[	&���M�!��%�n@�=�2�C
�N��������=�F*�	��%@!38��9j q�K�H��c���-R�`��d���`+�jXB�l.�3h2�)P����7������Pw��[G���4h�,���c�C�>��0��Lk�q.����
���gu�f,��/>r���R3s �?:|���H�}����X�j2yo�Be�� ��BI0��}O=���v�L0��J,kC�q�v��lJ��RB*��Cy,��� ���VG�j�u'���9���M��1Xb@C�oBZM������T��nC�
)�����z�d�Bcq��u����o���{������@`F )D0�	fq!XS��)�Z0ER0�"�TG�[�a�]�a�����y�P��l��]i'+�gN�AjM��@���.)Y�]��vF�vGc�YL�2)9�}�@�+M��po;�S&����B�o
�OD�M-��s@�O2�@���S����l.�)_2ZN�
I|��'�kw�N�Y\��eJ�M�d?E�7��4d���gH�g'���)/�9�������^���K��tX��j�bB�4�����		�Y����,��&�b*spW4���4&��M�^���'������L������v����'>��YS�,)4�@������,�$e#c�P�.�t��G�k�0�
����M2�4����"���S�9������`��TW�;X��p��d�W*{����)T����1z<>�Zi��q��hI6Z�H�,l�4�s��Q����N�")�\����-&��A�J[�_$����Bh�r���a9D'&���6�=�I�z��59*-Sq

�������518@������k|��/�ym��mK��������]~�p�>Y\m����
C���YB�t���"�+�����m/��0�]�n3K�1���>'��IT�������R'��V���M�'����u��p�k�/���X�a�m=�3�ygW������2"b�������h}Ri�*4��q�O!3>�����uC��0�c7���W��a�vH�������Y�Nv�M4�TC��3��:��-<yt2hpmL�z�����mA��pd��|�R�B���
W9`�{?��������=�%��� �t�xP��b�Kh�|�C�s�������~	K��X�a4Z���FN��������V�d��,%&�
�7�!���0�3���-�8�E>��%�~�1}��q��e�
�������
K��������V�vy������q2����0����?��)w�|��������X�y��X�����[_�C���W�HI�h;�����hd\�;v5ZW�g��\�!3(�g_����Z#;NB6i�P�3���~3*�'<��z3k����P�|��0����jZ��+�~���Z<�
Z�*�~�-bD�����kh�t��c40�
V6�@��;������=I�3����v0}'O'��C�;�+ZD��!�`q

�7��.�]����Q��T�^�.����&r;��/�q��Utm���Q����^MZ�5 I�TL�{��������I0YP=X�a��^��.�L_������s���!X�y���e=��~<-^1���@���I��>�uf��Z�{.�����}�X��cl��o�:v��-:��a����]��NQ

�q����1'�jvhG}�
���?��u��Mk�����]��18���{`i`�8Z��E�&8c9��F��Y��x|�3O�2Y[0U�/�t��A�����5��v,�3������]p��4Y��
���`z��l�O����*R����e�.�
L��I�L��
��9��~J^���]b�W/�`c�I�d$�?�`�lz�I��e��!��,n���N����	F����C0��jd_A��\)��{�P,Wq����������H0C��f}
z��W��7�\g��B��H;�I�!�TPZ����������
����!�����4g{��oa^�i.�`\������^G�@����H�#��"Xb@��egj�7�u�l��%I��x��xA��_����cI��o�*��eA���EJ$]c����hZ�o�g�6�6o.���c(
h�j���u��(�h�~��7��
���]��L��4��- �aVw�=t�����i��g�YR��;������?iG���A���Fu�"eM��$�m�a�����
����	R�4�k�j�&�U���,"�rB��%eP�����e�gOh��>��z���--Kb3�D��wV&��aY]��.��`��
�cR{���~�r���P�,]��+�����n�d���?��Q�x��r���[���#��`J�q��Y�����<|�	�ic]����!�s����.��h��������o@?��]K�������p�L"j����74d�b��}�phS���|�K��|�b�����g�e�/�K��{�02�m]��xpm=���������@=R�a������AU�\������4l����<�K������pX�O�Cl
�������1�Q+�<�/_�o��M�7�k���i��lm8�
���p��[�o|A�'L��������zB
��zI�gLcm81�3��^�2C^����M��;�f6Re���
��0��d��M�z8k"���

GIQ����of���&6��=�g��*4���n�5xl���A�c}�m���#����^�
0��O1dI
����Q
�hX�a']$���;?�W�����Q��|�RR�"�&���P�T��Ca@CHX��>��*~[��D2����q��_�@C`p(��9
C=|:r]���^ �=�����b��M��#;�Z���([��2>hx{t�P�����nT���Vy���'��5���&�62����:��
��O����
��?�m�0���u�
h(m��|Q@CE��<}*�rB��*r������,@��������(i�U0t�������v%��`���E��.�)hx�}St�y-'JZ7��e�4�8�3�BC�T� o}%�_�P�z��r���>������Y�P��+Ry��Dy��0����/h(�6e��8�A�z*C>)Q��4���wQ�8��w��w�fQ@����<�4�SGi�4����T6��DY��(���l���6���j�0�������6����~���m_
EGL
�h�w���"�C�Py���P�Fka@���$�;���>y��h�V��&����
���a&���cTr���gI
�����>��������������bJ�A�!}�*h	�$�
	��vo�I;?������� k��]>4�����e4�$j�-#���)���U�r���tV�i IDATgK
��a����x�M
��W
E�J
h���$r�������
�A
%6�E@
9�@
��P|�*Ce��\(�P1,�:�PQu
����4T�s��{(��e1����(V�:�P���,@C�#%[
h�-N%�%��#'���c%�4��M9E�Q���_�f� ��Q�" ���a ����h(>F�!�J~��P���eI4�et��n4T�s/�����u����A�)���U�r���gK
��a����x�M
��W
E�J
h���$r�������
�A
%6�E@
9�@
��P|�*C4��,	����+��h(��*o�h���^
���
�!�@�|#R
���2�@C���J��5�A��,X�d������ �7I�xG`@Cs7�w����fff"<<������%�Pq���J�<�Y����aeeUU��
y�hG<@��d�8�J<�Y���������$���|S������zS��.�������se��)���x��s�����!�����&����\y]_*J;�yN�GW��X�x�]���%���~��<�Y�!"P)# ���s���xa�<�U1=U�	Ae]���9A &���b����<'��*�hULO����bY�jy�%<�:����x��(�����x��s�5�*J;�z�s�y�]�������@��'O���
�J�{>/��T���;++QQQ���(U���oVWeJ111������Ve��B���������WH}��E���r����X����M���\�u�������w����T�a[�~��x/qG��`E����uA���2��*�x/��w�*�������
e��)�xW�����
�:��yW���x�+��\Y?�E�����|�(����Ne���������gL�e^E���v]P����>�)r�����,�~�](4���u���l

���\������?7��T�����t��n*,ikk+��+�xg':..���PQQQ����������tH$����y��cW���2�we��)�x�.r��9�z��+�����E<�)���x�S���<'�����F���x�S��h�<���sb>�|����LO�X��4(�g����v
��W��������$CU!�T�������7e���s�Ji����J�*�xg�]Y�o�:��9W�����w�<�����|S���<kkk���W�J���&�����&����.�k��#����.h�<�T�0	����V��T<@�H����Q���w1��b\
�����^*�x@�����!VVV�f�����bjQ��
ex������]
h`�	�������:?'�{��w4(��D��"����z*QX��U�����M���V����IL��h�(���Wi��Tp�oV�$�������me�����2��5��y:"Sd���|�������g9��^jY9$�kJKK�����Ya�.��I�
�_FF���f/�Y�xg�����t5���"U�d�����Z��)��B�OtE�~��R�����C��I��7o�����p�D��^���.T���B�ue�<��v+�XW�:�u��sP��o�7E=�)���Z����J:��_�B-*���N�Z�HM/����v������ls���x�J�FhDX�c�]��,�>@F��;���o�]�`������RUd�.�{E�t����7>.���������:�R�S��[�-��M����^�vnh��rK�@CyDY���E�
�j�p�JR����*f/����Pn�-
�J�_XFE��}�N���}�����*�t^���[��V�HO���������t�JX��k��3��,b#�@rj,|��y�����3��e�������������������>��~R�
F���1b�^�~�"^����i]���3��9^�U�Co�o�)M�\�	�>���B��D8;�,��R�������e�q�����Dx��fS��?�5m�2?|4���5 �����h����*�)�vG�U
��{#��w��-�������Z
�7�
�$��w{���������������4T��)���s"���76��Gh@CQc^
e{5���rb�o����1|D�Z�
����[]09�+������-�~]��s��7EF�����\V��a�yq���������m��{�|�V&U"����q�����sy�!�+a�PyN��?���cn��	M���X�4����8t������WO�:�����{<
�[k��R:����_|3�����nr��f��}�to�c3���]��+^��D
��������T}{��e�Mk�z���3��a��F%�3���/�t����&����f7�#W�*�"�vl�n.������������ru;:9{�����UN��y�/����n_�?]���5
Q������%����z���)ZL��S_=��O,c��V�2����%��e�b�:}�qi�/o���5Rc���b�\�(��h(�����-��~���V�I�/�}s�B|�
A���b�_#�*�7s��&���x n�����U����,����T�.���$�G�����7y����>:]��?+U��v|)�3�2��4����F���!;.N��)Z���g+p��)2{7v�0H�~��fU���8��$��I3W�w�s��8�y>��=%!�����>E
����#��V�/�b\o��DY�ox�!��:6�onBz��C3p�q:�v��9,����������/���+��<M��H3��BC��z����MS]�O@�3�l6{-�����%:FV��,s\[�����v_�����%���T���qk/�x\;���(��6��K���T�4��KN%�2Rh���+�:��,���Oe��4���%�w���%��v�hmn�Z�Ua��������Y
r�L�h�D@��K��w����d�?�bn���z 0(�.���!}�=�����������>�m��~;�
�cC,�c#&|�-n��SX�������{{��(�@E��*h�<�S
���������b��bE����o����'V(�!(4�!�pvP�@���������,���v�����S�9����G�	T�jqa(��//>��6�%.���"���h<�~�N*�����h8����@e4Tq5���1��
�@C��\p����J��S��UZ���6� K�E��#����6������Pp����99J����|��#$�"���|�|�FVh�}:<w|U���,T����nxpe�"�-u]�
o;�h(���T�(h������#v�,��O�@�U-7X;4���T����%�\?Y�/H+h����4����@C5���^����@C�if��[��3}�@�yMTq����	r}��f.-`Q��KYP@C�����z����E
�s z�=�v�Za�5
������? /X S`(��������.�C�e�Bn>4�2�
��
�Wo������u�Q��J����y�*�������o��������������w~����wl��g.s����s�&U�.�[`���HNIE|B�������hdgeS��
���t�$u)���������9|�<�m��~�M�H?+
\!�(�+}�4����NPSU��'�D��b��%f���D�q��>���o��Gf�l�0�S�����e.�+3�����am-���5V�
	��b
�	��{p)�23P�^{�5���k����9�u��� -9�F�
��
�������7�=c+x]�����`<:������K;��u�iD4���m���C����j���Mp��?~�{������vP�|��
D;�&����?��Ks|��?.�����W1��(�<���!����aJ�Q���W�8d*�u�`�c�����=���e�E�!1)�N��5).����E�H���*:�����to��
��9�������Y���H,LU����~]���;�F
@UK�k����L\��A��l4�����T��2�;j���4��eC���]4p�|:��Fl|6�����:nze���hi�@OW�+4$%g��{�����i�"���P��*W�������9mwhN/�f*8r6��e�1��i����_�=�h�/�&R^dR������:����X�{�l������xl}�����-L��Y��Q]_��ja9�)�dGj�����)"4r��W8I����AKU3�������I�L�AsK�|�X
:�.|���>�

����E*
��������G��0GL$��������k�XK����PC
����y]������������6/S�D/S1�v5�#�b��Kx���S\kRY�������W5c�Dl�{���2��_|�)$�GB'����W3�i�K34dQ�[��@�$&:���}"����Wo4�Ey�+�
��,r�*��H]�o���3=K�;5L��}�~�����
I���3��^�#�"�G|�PW����l�jq��~.c���r|��{<����g��L|P��G?���3PUQ������������������1WhHH���-�Z�A���4��i����t�U���a���[� )L�k+���P�����N����84�|�n�������~�]����G�H�D�o��M
a�p{uWS��h����������+4$����
�����f�`PM�?����1Z��
]5T����Axr4�>�A
����I;q��B���V����wN���e����1����,�����������KD����cB;@�%���]��B���4�k�����x���
��1��@����%�Z��CK~�gv�D���`@;��o�Ebl0u��=�sk^��G
������S�#h`���t��2^�
����������}�#-5m���u�������h8��ht�;�]�?k�eTT�x������H��Im=c�����%E����|sk'�[�3����qz��p����wGrB$T������0���f���|�N�>[�5B�vcy[7N��:�<P��)�[�tI2�t������=�������	�q��r�Q�n=������"3#
������y�����cs{KMm}���	/}/�~VX_�����������e�o��gB�K����ahZ��caq�{��3��
��!3=�����FCS���x�zn�Z���i����B�o��k��Wp��_����3+G^���~�|�k�@[��o�F��[E/��S�h�a<\�����m/~w�*4���5_l�%I�����������Qpl��(M������a��)�5(�Y�x�>�E��"�z�3�?��&�
C��`�};2���e�����N�@/#�_��������47�r��\a.h�>t�:�H�	���s���=H����?sp�V�.tP���?!.�%Z
��OoFBT0�~�a`Z���Y�`�[h�
�����g��1��u��ScP��s���X���,���`��uZ��{����=�:6������xIj?���H�Q���$$�Gr�^������
Y�<��T*R�`B�
�:�`�����j��]RS�9�~�qw���`���w��s"H���3z��C��T��t
�h��R
�[j�)*�&���6����;
Sh0�w���N?���]LEd\&E��8����lD�g���&�:kR_$x@��Z�0�9E)4����c�O��:y�]R�;q����yt)��]}6���;f!���{N��+���>��O�����$%��DW��zZ�?���1��caXUN�
t'�n��}�~�H��2T��N
	�?7�&�N��/��}05Z��V'}h����_��HsBM���;"5@'���(�Xl�c�����*��6����cc���TG\`::��@Bx��=��#��Pm��#��!L�5qrv8Whh��1|�����C�Y���@�R���I���DS��8K�����cP�xY]n���x<;G���0����?F�m������d"O5���w�TWG��[O1�~� �b��L��.�k�����+�7
^�dW���Yh������!+!j&�0�Q�@���6B�Yo��&��h4�Th>)~�-�
��n�/S��
Z
�`�1����6�Oo���A�R�Ep������������	�1��Y��]�A�'�5$���$����������3�N���	xqb	�����"�B��]M��N*=�$6���J���N����H
�����.�A�+/Tm�)t-j�0���s�]�u�Q;K�@���\�!��*����'���Q��0s����_�\
}����l��6_�Z��V��x�F����#�7�(����������� o���/��J4����V����s�cG�_�vb��~8t��wF;<�y�G����
����Kf�uM"���-n�y�1�����HI��U3"�b����IG���v(�
�	ym0�^�A��h��=_14���������;M�������ps��mzx�N@�o{c`n��6�u��l�:i#(2��/K@�,Qz3�*6��s���P��=����}�6�,CM&?#��A��xq��,k���&n�]�&�f!.���?����?���.���6cV��h����v������Z��L�
l`S����79���Y��{���l�\��b���p4����f�Xy�_���l,9���Q��s4������P\������O���}���'�-�M*W���Y^e�c
x?���R��-�`p�~:Z����\��O�a@7-�%d��a}���@������``��t����`
0�����	��"h1�zj"!�^hoep���rj����sSUH�|��`�-g��@4�y�N�L��i����������u;Sy���X>���8y1
}	��qX�����6����,�'��k�
G��c�G�`6N�40 ���j�"R�+-1,j����C�C/�]�W���/0��:B�%d�d��������S���F�$
�T{;��4��k��4�#N�MEM���
1����5q���@9L���	V�L?��t���X����6�����
f\{���;�TS�>��W�����X��������a�m��`
��)�'X{6j0�c��BH:� Uhx�D}
�uo!�����������ym.��Z�a�F6����i��f	���������r�=Ep�4���
���&3��-:7	�(o\JzoDo��L
��UF�����\D��(i�����hW�v�_����7V���TLo�Co�U�31D$����p,�6�j���O�7�~�����|�
�����%��4���(�P���55��_�Q�K<9����b��[0���@��|8��`�H�t^X�3B�Jm�8�������:jxu-�6:������n�����o�-�;��A�������)�y=�>���������Z�-�"�Ih;�	�'����M����nh�Z]-9l�4�*�i���e@2"���=p[��^-�����<F���qp���6ju����`��P���!W�_g@CI�&�(C�~��������
�x��8-^�F�����C
A�:}N�
�������!M������@��;�7a3����M����n����-���'4�6���Am��V�����y������(,��������8�a_��u����e���������3�n��������n���i������������8�fA���~��_����\�G�<�;)�6��
��"xA��8��Twl����P_�!�p0��^LH�M���P��������TX_c��Q�T2�����|(_Lwl����C�V�q,h8��#��t����C���5-L��������������9�NpC<M���p�,��8db[�
���9 ��l(A)s9H1H-�x��&Uh`��`���&�
���� IDATc�J u�q�o\������������&��Ra��������8~j���1e���DD�G�(�A����B��O���;R�������Ij�D����Q�G@���k#��A}?��,Evb�\a.
h���}����E�����n���vb�O"��/��������mh���~t��WO�����|H�BK�4'�|�v���-��)�'�F3�����$�F����ClA�a������"&����i���u	b���-n\�����������m^T#���I4����� >�,W<�40����I�:H������~�����;ol6�����.���(
6j������`L/]Dl��3�������:�	Y�gO��F�n�udO��Zl����T^���LGfa|_������t��B
\��m�t4t��S5l=��	�o��D����A��$Ca@��s�94��c�Q��+�=��I����#`jVMZ������Q?���"��Q|�3�n��O�/��=���?� ���U:��J40 �A1���A�\��w���Wf�C�CrL&7��
���U�����K�@C��$�=���2����:=���T":�,��� que4�z�NZ|a���dU����hEP���qH�%���#���V��8��l�	�	4����t]�z&��<�%��B�j�?3\X=M?5���p����u�����D������D�h���x�R�_[`�~f��o�
�)_�%�b��Zc���yb��k;������eXMV�������E��@CV�����xZWHn>�v;D/>��uGfD
>0�)W�t`���[	�cia_�T�`��3�� �i<�,t�m�W�E��'�PY��Y�8_:#�O������d�c$���Ru�S��tC��gT��g1@���jZ��_����}����D?�DB�]8�\��q�@� ����P���WgW"��'�?^�-��cA��8��`��w����l�\��F�JKB6�@��}�%��)=���
N#�����lh�*�	b����\��T �&{�����'�:�'����4b5�Mma���������&���M�Bh�D@���A�v�>�nL��=��������b~�}=��8��|F�2����J_}��IIX�x6'�v��^BO/����@��:�Z�f
�7Rq@S}h��-_94��}��������H��Do�NF@h:�6��]1�S]���������A@�����O
h`;��\��� _�n5f��p~�D���w�=�E��������A�C|Xj5���B>��~Z�\5
-\�>��&C�vH��\����Gk<���{��G��0���O�(�J�ya@��Mm|�u8�G����6��{;��b����6q9>��k���x\��w���i'{&�]9�G��b��e�����.���,@�=q�6���g�yu�VU�z�F�&���
��*���U&�����</�c`-<{�����h�H���#����A��|�6�M%�A��_&����+���Q%�A��2���D�T�����~B�*�S'X�vkO�����!��������>h�w�A
����V��B��rXb��4^�������no�����	�Zj��ZN��w����X\����m@C,-����it>!�X��s;���'��F��U���f��p0��@C|Z�����[���l'� ����
B��x���_�;��V0q=,#�`��m���:�R��sn�r�k�������nf���|O�}�j� R^ �~�>KR0!��!������U��,)|�C?OEbB];l'��76CHA��8H��
����7�j0E)4���~u�=��jk���5�FBB&��}������/�>�
���V_����O���~EZ�\������!�M��~��1��Z,��5�l�#4H����p,8�9W{�L �����9�L]H��&�H��B���P��\��	�����?bJ��x���/=9������p:�M��I���Ti0���3��^ �^�o&`�M��0�����Q
a���1�j�s�"��^��z����@�{�����8�P��	v
���+�q��;�u0��f.���Y�P����,�v��wr[ j����� ��JA�_\qr�}R�p���w`�b�
4tZ��$��V&�'�4��I^���>/�R��V�����:�x���!�ZNx�	B�U��m����h(I�De�[�g�qQ/q��_h��+x��E���{��8��s���������V�g�En��Z���+)��u�b��g��B�#�����s���H����Cj�F����8R���6�p���\��i��|��I�/pd�x�� ]4g�/|/p8�ALq���m��0A����E�2]�-���?�]��.5:/���R�	~���x��!m��C�&x�M�k���=�������q��A�K��c44��{�O�z�*Y�ri*����|��]�N�-�z�����g��7�������H!XT���w�+.��G�g�<&�"~�a�p��q
I��E�'���b����������)�������,0X�R���G�E����x��R�����s�7�8�'�w��eq+8n�uv�L����(8������J�_�v+T�^�7�)�W����q�"rE�m����B����N!e�~�m���IU���M���crv�����
�o�E�l�w���r��u[��[�����\	vm�;u
���c��R�:M`fS�+4�4d�n��a�����7�.IJ
���!��k�F���q`�h~�`���*��?H �s�]4�+9�������z4����20�!/�M��X�)zO\���b�
�V�9�����S��C�T���-��~�1d!���&mM�=O�3�7�C*��G;��D��@�
�/�b\o]<��OiN�{S-����|30�,���I=h��c�������Ru�y��=$��
I�8��~@�9Z�����*�N�6t���!�4�����(������XT�{��s���.�|��VEM���5��S�rc`k��������
]z����Q���o�s'W�|zJ4hSL�0���
�l��)6h���P�-��SsiDG\$�������	&���LI��E���z��CBH�����?���+����)��2]�	�11�>uR���W4�1��E��2&( U� �~*):�2'���&abG���9� -S��6�Ie���B�Kx�~H��9������)7H��#�J�B�6���1��9`m5��*�)��c��3��
a^[��#���^'OV;��Z�7!D��(k��,'Rn='eh7��V�Zxf3{B�(������&`�_(2^�@����M�0��+.��C�Y5�����;�V�*"�3}Z���8� Mf� j�=�4H�R^I��Ev�X����#�]{"��,"�

� %�������$U��b�u�]��-��P�gq��K)�DTi4���Z����?���xRc�YN����A)H��v���}�4��	��:�\v{�|�|�a���c2��:/m�����������2����P���\H
�h`���?6r	f5���/!2*���@^����U�"?�0~�<th������ecl�w���YEH�d
ZN0�n�Z��d�>��ED�m@C-��J��FLB&��1���1�@CU3uRh y3Rh�_K�Q���>�dR!Y�P��(��{]��pe���0nU.���g7�B�4{_���-��>����%Ea��^�F

C`X��OE�Q��J�al����U"�����W�T���R
�v��gvbV��p��c�S#h�mSh������9�	�����9/�e���
z32���rT
�@CM*0�	f	���	8��(-��I9Th�����d?��%���|:T�[:t fq�Q&�W���Y\!��]�N:]G���N�
��j��]Z���#?�'��
����, �2n����R�����R���ZH&P��9z���A�Y3�h!���x�*I$y��]��J0�A�Q�@SM`�i��^d �Z���u%�0@`)"0�	�
*40��}���A@�6�_���������}�ERD�A
	{)OG�r`����;����I%A���BR�A��f@�ST��,1�P}�:`�<`�)4�N

��R���p&�<	�,��8G0C������T$���m��QhH$��0Rh��p����<����u+���5�6�]��!��

b�J#H����,)X���p����lD�"YT��\Qaf��Xws!<H��@��IQ��j+��P��"�C���#���6�����_�4Li�3�]������^�Ew��8�d�� �
Q��
lJBp
_���
��SG}�~X�[B0���$�\
�6�Dr�xPh`�.��A	L�a��� �)�����A:��0����H�J����v�4UI�3+N�
G&���������
��h;\�����
�^+4l�Qs�����n���������v����x�k��p���j<����0\(4�=�D#�v�����O#����V�Y.��iSh���80��\��=:�k/L����?@���
�ru�;����;�6�H9�_Z<�D������8��	nz���������2�
.M?��������n���A�d�p��Ft��]\O@�h������?���v��!���j��o��+xn�:
Y�����(6���������
f�p`
|�9����n����c�J�_��J�#����.�6���}uj�^��d��e`C��0vu;q����>}�X<�m(��l0�%�C�����b���4��m2�C ��%�� �4�:^�qK�U�!�`-����������y��2����(8���Ra���|�?c�
���Wj�t��z�BC$��(
hP�����R==a����S��d��9@%��[5l8�I�A�jU�0OA�O��8)w���M��V��`��8c����'���KCf���s����*l�[�������?����r�4\��-M��U�B��c����\���+4��0��Or��gw<aT�:���5G	����?�#w�4�^8��
�_�
���n��{��V���
��(@��;��/��Ds��`@�+ZLf������N���i��X�[RTh��10��dI����oG�o����=P�t��A\R6B�~���Wn8������)���C^�a�],&��/����Q��v�%��a������4T!p�i�8�g��uFD�?5����A�NTh���dM%�j���)�RW����'���Z���C��\��u�Q�MDa

�WX���B�@��� �sR]��-�Q00�-�:\\�&c�9� �;��!��5�e0DA�����%4��T:���R|�7�����1���xS�!����6m>d�$��)40�f)aT]#���X�G�A��i���@H�0���G�
���������d#�+�}F^�������>��phJ�+4dF'!�Y��"f�I��!���hH�F�9����w^B����P�5���540����a�r#���d�86R�h���p�F�B)5����x�o*4p��bS1@��A�0�{N����}�P��4$���*40uM�KSe�Sh����K���'����������

�������_�pu�f�sT :MB��ERa���r� �S�d�C��&���jy�G���HK��O�
���`�@C�#�T�P��v���`dd��"X��h%�������=��
\�`o?��zH���r"�B�������)�G��I�C���W��9S8r���@����CR�016$�b>�d(-��G{�:�P���(Lx�`F������A�����4��
lK�����|����G3g���B]z;��B���}�KK
%zh��@CRt�c����o�F*
�s�v�����$1�&5��g
��@��3sC��xL'��<:��^��P��5YXt������0x��`��\��N��&~YeE)4|A��d3�N��3�Bsg;4l>u��F/�����>�h���
���|�0��/���6jD�����j��
��sr�QP��������d�i����9;���N;����O?������a_c�����?OmE����}E�$�BCI7?O��
�QVSC���@���y���������/�%E�n9�h`
	F����g��jqP�����dY����N��o���ccWu�[�^���.R]`yN�bC�e/�]�h�YS�UhN�7�h�)F��fC��8����,0jP�Yb��	V7��`*��K;-T���mSu��P�����$r�H���E`���i�M�����3Z�����"#/�p���j��c��������6M�S�(�j�6���� �l��I�A5]�\�!�:���W�r ���)���pP�%4\��JWH��Amx�����-����en�:��A��� ������\0e�8�SM���K���I�����DR_�x�a>������ �at<�7q�:"� M�{���/�����/��<��=����do������_�}>���)F���G�"���3Iu"���>�&��`���'	�8D�,n5������`IP�y&2h;��w�x�J:���tRD��4\}q^!W�=��z����6|�8��������B^����2t���o\}!")�!(>G}��}G���&����p-�4��UW�#��OIu�� �K4i��}0�"�B���Kp1�bha�f~X_�UEU��m��9y!�0�5iWp�M������[0���B��,@�A5��U���	��M/s�Vi��u�c����,�����3r&��yq=�q�B�Y��
����������\����%�;X����\�KW#n��`�n+����;h>�6�
���e^3�B����������I��I��OD��X�4h�����^\��*�p�W�_��D��D��W�&��xgg?���:�P��<D�Vf��H�z	dEC��=�-������#�+��%r|^�JB����*q����������~��+Uh������g����=-�_>��Rx��5��i����yRG��-"�H� 59�[2���O6LR
����snM��yc��`�DI;3;I
��#�����7������l����v5���J�Z�40�BB�����`���z��<>MPy��]D��8��`��g�:���l�v���*�h������
�����3_a��D�l!��>��"��-���J������&KVL9�s�W`������--\���y���0�G��.M�z��v�����S�7��m�oSh��pm<��6�T�����g��\8�)4�����\~l�F���sA�oaVlL�$D�xl���/����%<^c� ���Ma

\#��`V���S;�$���
�[��G�gM:��L�b:�Re�XV�k�8t��@�

0�a>Ttt����XR_�6��������#- �#n�B�������s_1��$�Y���!��u�l��������U���y�BU1��Sk�!��^
u�D��������?�}�$��kZn�fmCt��Vu��]� ��c���'���z���k9��l'T�}�>YQD���3p��I�����/"�Ryi������/Wq������������t����`�v�o��k�atM����NnD�~q��/
�����z��t"zfg��w����sX�~&��RI�9�����b"cz�,�2�a��d��kY����|���B��dG0��,�hG�������MxH�y3�>����%��x�c�f0��6��h�<P��n%xF&�_# IDATu����[�/�h�bC��UP�Z
N5
�|�V��T�4��]�~����s��JVWR�v�=<���J�sqp�\�4{�}�3.I�a�0�;$B����
���>��c"_")���{���9�8���oI��j��Q��!o���P��

f�5������!(��Q0 ��/��������s5��	�"����~��������	���{%Y������bz(W0H"�%��5n��D�Hx=�
����r���������hL�
~��}a@C'�
��������K"i�9����M���������!^9�)����H�L7��0����9��48t�C���b`�����tlt�����}	h5������*Yk�"�*����o����a�i�S��W�H��3��d�B�G�+O*���Ms)q� [�Um
�j�-'��R�����O��"mZ�	[��hL�Y6-Z��~�!�Tu��Q�Z�9���T����
��s{����P3��T
iC���4�T�����4�$Br7��1�A�#�A�g>D�p��k ����$����0��3sTrS1@�}��9�+�1� �����uz.�`����m�_�xyj�[~�f��7KN��DJdm���v�aO�0p!�����C�m���������$��(�����������K
u�u: ��
����8Th�'����nG�o]��/�q�6����E��*��uGj)��;�i��x~l2���(�y�I��@C%Vo���.�h�$G�f�����3�8�#%%+�m��"�����80������l�}�[U��v2������q�1Mf�h9��6��v4Q��:/_0	�A�/�(�?o�*Vh(Yd�P�����U��*
h(mK�
���$�eJRoE-��r��}��K��>}��������k�m@Cqe+��RU���9� =�*�y������'4�S���W��}:���%=.�.�@6X50�����m�S�����+"P�"������W����[cv��Z���ZN}-���Yi��CH��an� ��u�$" "��G�m��u�o��(�>T�v����H}-��4�e���]���:+��y-'J�guY�JC��d�1/��^QSa�e������n���e��x'�� �
��lO�*�P��A�."P1# ���y^
��� �h@�,Q�<y4�y�A�\��[[��I���I
�Gp%�I�R�������`[e�Hh�,4�1x^guHJ)dA�AJ��!!(g��I
�FL��\P$�,$����:xxm�.�I��2���TD@D@D@��A�@�c64�[
�8�dhJ@�)�6�,Gu"�?
�w�`} C��*�V�Uh+}�h(�S(�4����( hP@��
4�A��&�Y�$��6�4�6N�(/���QT6�AcHQu�AQ��������({�P�F�r��*��T�	�A
E�y4���@
h(�&jP@��� �Sh@�,CM
�DI�)m�P��^^
�c%�����s
�A��������(k�P���r��*��T�	�A
E�y4���@
h(�&jP@���_��J&?\�.��bTw��Eff&���amm]�����*�p�I*^Df��p���FFF444dn++3	G��9���kd�Y�����/==��c��j���8��_Q+a�9����*jQ_��1��)����_]���,6�YBuG!=�V���]�TUU������D��R\�J�ye�&��!VrK!�-��M!
W�J����
�Be��)��_W��������[Y��"��������vS��Q���b���������P
W������
���#w9i����V�������}�aS���+r\����}�wH4.�XUD��m�������{�H�����?mu5 )g..o*���������Ku,�*\�����/����@US�,��u���J�9�2�L96 �4��pM��,hh��P����������"�n�T��2�w�Yq������� )�| ��������0��(+����]��o�:��w]<�)�-����\Ey�*�~��9����sb�Qy]_*J;�yN<�U��X�P���b���7e}���|��U��]���?{X�7���@�����;�*�6?���CT��n���;w���c�v���]�����������E%p@X���:z���73��=�+
����
���!X�|�
�������I�@C��0��UOY����\����r�se���9a=W�.`����<�	���7����.���^�ses='
��?�+����RR���|5P�j��'O8�7+Qy�-3L�($$�����3��fq�&%%%�D���m��5::�����"��JK$�������������!)N1d�%Q��2.�����0>>�S�����h�RGq���T9%y~+�q�,���<����^��BY���rg}���oe�����\��BY�������&��
�?W�����?��^��EQ���YV�7a=W��s���E�W�����ey~+��9I���|.�"�������hI!��|


������.��g��LN��
��*i�zNY���r/��[Y���Y/�7>�rg�^V�����Y�������wa=W�7�$��U�X���&������?A�+��:�	���9�	�]�t
P���x�	4�E��h(=m.�0	/L���J&��RX@J�'��X�j6�����^�l�@C��1.
e��E�&�-����\�x��\.����7����a=W�����+��9�)���4Hn]&�T�j@JOc/Leo)�0	��3BI&�?���L��4���������&����\�g��CY���
���,)OEY���P6����+{�/�*��e�����z�l�oeu='������PRFz!���PN�no�i��,����O��^���Bw"	E�wh�cJU����G9�������d���:-q"p��B��Hq������b+;+���+���K�rK��s�������j�6���O��$3��R��������T�U���$U
���HY��o���vc���t�Kq�o�h,��^[�:>o[��l���oy�:��0Ri�T���}a�`Z���a�x&��J����	�{�Q\����tHj����T�d��*b��B�$�J2������]f���0�K�"�gQD�[����c^E��D���g�N!V��0����<���v~����������$�{n	����3�$��6�9�����?QR�s	*Apm(l���0�=_	�goUD'��}��8���N3�{�Z#���q%���������)��;� A3��znt�,$����w��+�OW2R�\�$��y�Pu]R��&RRE���KJs��4����I��8jYH�?Wh0�y��[��l�*tD�F�:
h��Bw"	D����,,tLR�a8r���H*��n��}V�rI*?��������(�d�^�/5��Rr�q��P������0�������H������}��te��utX�QJ��Yo*D�+tV�UK�KBr��)��i~���E������y�����T�ret�0��b����uYb�S���vQ%z�(	����*�B�;���{�/t<�@���1		��0�-��.�m�������L(�C�2��o����{q����8��x*�!�(KT\n�ZO.Qy��d��B_$����UA���x��^���fE�,�Jf?2XW.w�[�3R6��h`"�.�3�b/�)�a�����h�����N�3T��h�_!��x
@C�i`A���H@C�yn��Sh�Om	~�j��k@���KOz�Pr�J��$�Nh���!
9��4�\7���s+
y���#�����3����EQ�D��v�`r���X�afL�[}����[�*jT��o~,]�s&���G,_�3M�#�.8$�.����������'$���x���O�C���q������q�f�r����U~�"�/c5 
����Ar������^�n�)p���B���:*���P�`(h(������W��-���[�W��U�TGL`4�.:�^R@���1*���w���a�)�t|��y������`<2������p�5&?����g���o��.�g�c[3��71�V�N�_�������%�,�mC��G�G��@���2j���Tw��Gq
s�,���k�i�.��=_�7P7���31���|���y�����k��{���puU��+)��,����#x��W��{d�n���Cw|9��+:!I)4,�=����1s��zV�t��4���� ���0�\t�ViWh������w����a]��G`| v����
��.���^����_�.\��!��,
�aN����h6u^��
>�_0I*4�j����D�W�G�O��D����4F����
��gI
������p��s|�,��<I*4H��B��
b���Uo�hX��)6?~�	�jc��[b�5��$	4Lm\������1����f����B����1����2��l,P�$
4������D��J#..
�j����������<$�d!i�v���H<l���r)��*��|���������
��9�'~��`�I����L�*KA����NJh�>yJmk!j�%�OL?����E!��c�(�sI*4���K���
�6���g�-f��J*�Pu~;|XwI�qy��(��X�;�W�����;�k�y��AM�-������.���K�d���g
��}q����O
\u�PJ��x�_�;e�+7������o_�~�zu���h`0CM{9}���i�{����8u�z��Dva�|1���C��3i��D[`�Y`������4�4@Cn�uP��x�������$��0�|��@�B��
�����s����i�AJ^&���{�Rd�u%
4����go����Y���$�S���	T��H"� �Z�_�4���c^�%�wb����T�@��F����8��7���D~
�p6�
[���!I�AJN
�3,���L���g�yY9,�;S�o��)������H0�f��2	~k�
@CVbj"6�n�T���
�;Hh8�s��+�V�V�,d�O�@���~o>�r���^J,��2�:���r�J��a�G��q�lW"��vjH��dw�L%�F��^O�
�p��G��d�1�I-,���[��!1%k������1���4<~��rf2
I�O
�)��L�^%�48�C�n
���*�W�BR@CZR2bhP��N����~Uj���B�b��@���u�������d���~�r��4Y��2C�$
4��4^����f��A���9���
k����A�xO9t���'`����~�4��`_��v���i`���PTa��
PQVF��
p����r
"Z5���O!6.�DN���A!�HKM�8�}�3����!2���s%���n�U�`��n�q��E�t�QpB
dW9
�U{B�\]�����Xo4�T
����"�Q�S#���������g����������<��� 00���yy���.
%h(g.����A<n]���oR�}PJ7'C.��O���]�A�6��J�#�$���'<�C1��%�����q��;������O����B��������������@JV�>��n6u��
��a�=��,j��u
��
���[m��k/��sy�9VDbT"R�������a���SB^Uov���-w����5�d��`�8��l�VD�� |���&KZAFNAN�x��)��A�K������+�7_��JrP�T�����VhPR�F���]�e��
����/[���G'�I�PT�����3�����v=�$U��PU7@����
��S�����-'B^��������*8t�U�f������+�-Ns��tv�j��<o^S�`�H��#��E�(+A�eCj?|]�	�^�P�������]�����%�@���kw"��;��:
��@J*<'/�q/���Op�@���B����`�d:<F��*��4�?{�|��r�������������
P�^��#��
m��=X-��R{X������B@�V���"+3N����s��9�����������!��"K3��������U����=��+���%P�<�d*E��)Dd�*D��`0e$dT����n?�l
@Z
2j��!#���o����}=*�YAB�
�PRP���Fs&BV[��i�g.���1b������<�u,��Ae���5?�?%2��~��&��
9=�9��������7��	��� ����7��oX����N����c_��&^�>Z���J���6������~(��\Zc|WW��C�[[H+)�g��H�5�����'����j��h�y�B�{���+k_��73�,.�ES���� �-�,��*	O��h����2h*k!��nK����`�a�S��AY���[Q��`��%��D�
-�{���,�;'������fRlx��c[�;��)�q�7�������������WhXw�O�w\�_��@#��U�L�����f5���R�R�K������j2<il-oT����jZ�g�3��o[�#���hn��'g�B�
�����zW�]�y�G@Y=�F<�l�'���Z�uy�bc1��$x�S��0t{{
����Z�'�4M�Je�G�:�50��X��
WV���p,m��H���������du,%%
5E5�p����S5��vM��wp�_77�{�4h���rz���-p��(S��q>��
�4�9������H�M�rC
�}����eO*,1��PD�_>�{��&4f*����?���4��[����y1�+4m���,�Nw�r}
�����h�(VQ�����K����������7i����x~���:����.�<�E��R��i,>����?ZV�e�����87�O��t��m�U���GL����������~��I�O\�����1����BCjj*��_����(���������ZGeuiW��MH�'eh�����z�����4�����m8�t�h.~B��B�V3��&A��
���\�A��aP�x�1Nw�4$��#��a6}@�~(U�#V����TM����@�����I1�����!^����m������+=_�:s�H����+k���GDb�E��`=L}�Am
�"6%C��8�r���8�1���^sL|56�6����@����^	�<��=�2�gf��p�q�A���LC;�v�T��

C-�b��Z����g��p+���Z�����x�i(`��8E:a��>+�5����e��aV�Y�xw��@K^�i��lK��|���6g�o1�4F�c��
`�F��8�t	���hf���i���
�_���}����o�p��x���f��x^}}��u�F�"}������rRhPhb	��z<���/ g���H�����Pj_�������R*�Pjg�������
�� E�
IO���!�]R"Dz���$(����H��B����

��Cut��J_�(u������n��x�r9)4nS��X�x�r���b`�����7^}�����@�����q��gh�*��������X4�#Ti�O]Yw��b���h[�";��%����'H<�����������1�� �/�V�H|���QPB�;�d�D��NW�P������67rN�]���7<��'b��C�
B;���S��~�����`��k���}�0����0FKQ��{C~9���;�r�.�N���R`�Q�4�{�[|��h�W�N���^��mK���A���H11>9���:�;�zq���hog���f4Ia��'���+�9)4��l�:����\�Qu��@U�?|���,[�P���^QZ�hhn%������]=Z�c`,h=����x�'~[��������������hL�j�� IDAT���a�n�������MK�9=v�v�
��Rl�lPY��a�rSh��L���	l*D��"(�H���hkK�}G%05��C������O��[w%���wo��� {m�B��JN���HLLC��"X�P�^������E���s���o��/��r�t1)�v20�A������M�!!*O%�>D������<�n��HM6mE�~����4C������K�0�+��{s �z�H�NC�^�;���������H���_IA!�)��l�����D�RqN�0���������"|>����4�����6�U8���N��H
�*R\�!1:_n&�|g|:�����
s���G�S2����5J���*���x&��SPO���#q�}�{(@Q�6������*��]�F�CZ]*���/����B�
���:}������du������W�a��u� k����0�jA��1����������@��bN�+���kAT��+4(u���cw�6�-?y!��+�-��"��	/I�NF[
�]�]����1�	�=��w����z`m�����k�1�~Z(�qv��h�K��]0��Y��������-E%��u�II4����HN�~��2}�R��B���"�'������
	7>��u5�Bs�7��{�%!�RF�$������d����!�,��v|�������
�As[��:����{9e"W������PR�FT�?.������k��7�@^Av�[�����"��65[A�����Y~��:&����
����q���+W����Y7��m7b)�^����:�n\��c����Ca]�9�u��H�w��i������g��^��{>L�j�I���s���=������6i�=����:�]	iz/�����<*V�0O� vU���P���h#��@	�y�x��o?r��}�0�OW��|��T�m�:}r��g7�����,����2:������0��#���H�4�S
��8q�*�#4�/��w�2�L�����0e������DKO
�44��
O/���f9�F��z?�8_G��W��z><����T�3N��Y`h����� 
%hh�Z���H����<���������,�a��;hU�/�|�{��{�z�����D\|��I������0��@������lO���8.'����%��������lg�g�hJp��!�`��*mD'���G����W��:��` ���������.mE�'^AIOQL����G���i�9�p�����A�V����/0JS���{����G����^8?�$���3}����T���{��/�5�*���M��
4X�5��y-<���������w�g����
������q(!��IIq(_�=����������q�w99ED�y#2�+5�j5�������}8�s t
�C������8�U�@���M���;��C�_ t��A�����R��E�v�
?���b+m����_p�7�~3��{�Rh����Cg`�b6�^�J��t(K0�UN���g`4c��d��|�y���f�j�:P$��x����@vP~|\{�����
�E2��:��=FCdn
��-�ad�5��8L��D��#����B<����k�q�:�������*��#��������6\	l����>�m1e
���u�	���E��r��������6}HY��,,\�c�;�����"E@����?n�����
��C9���K7������Q����	�*��@�)a�m��
���#��-X�[�M�Y]gu,o��/��LL���9?�O�?� oj��{O2����s����?~0��.�&^�>��)o�,�ep��������������5����L�p����!������r�j�d8�~]���~k�LIr�!�V���� �����)=A�C�
���4���
�c���hC0�U:��Nc������)�}����C[{X��������u	�^Z���({C��_OM��s�O�#�8�� �X��w�ad���xe
��p��������@�/�;���5��a��`�U�om�T�X�o��h|�3�(~��3�'�a���h�V���{���
��G�M�`����%���e��^�5��s]K�G�Q�����M`08b������i0hc�_}�O���f��2��m���������������y�e��6��5��0
m2���ph8��8W�`���e�U�?bbp��Lj;���HI���:��)7��tkE|��B������Q�C�:
�U����*����K��#u��M^$�����1h�V�#M����;�"�t �Z"t�W(VW#�+QWB�3������r��O��F/$y��t�3���i@d��!9c�����JcD��Zd4��cw����1�M0F�f������NN^��kf���v)�zz��3,;�Qt�v�
�Z;�Z�������>�[���+X5`�^=�z��M�� fu���"Y������(z��^�Gr�+q��m4�l
9�����hH��B��E�O���{P����vD����J�[;����4�����'Tj� u�M�4mx���L�2�D�����'!��5��#��Z���A0��wY5M�Q��ye5����z��}�#��OyU=$�3iN����I���H@[B"e�|h��S���	h�J��|��X^y9��Ec����e��6A�*��z�T]�hWx�z��~Klp��a��,����'be��I����)�p
;b��*�6��C^��y
-��{�G'�N<����S%SL~3����`�[��5�+����__��uU�a��%b1z"=Ly3�m�O�!�
�@CXR���y
�4W6�~����5�6tZ������M:����M����m��}�}=�c��_Q^��C
�?]#u�����hj�C�7a�	�X��z|�!\������;����c���p�u��.'�AmRC��~F@*t�Ys-:�QB�g����s��@�B�{���zfH
�E�� 4$<�E�[�����.D
�����������IZ|2��@��=�OmR#$�#��__�B�5�_w������-�����/'����0v�QX��kH�Y��DO�����q=���u�GaR��Xq�z7��������s���gO�^8�~���-k����`f)�;r��X�����[Int8��-Hk�B�LJ����BU�@R��0�@MGx��D�U��`��	h�to.����_�*����945n�*:�X�b���-M��t���U�����f��nl��O�������aw��s�"Lh�;
�}��W����.�l�?�}]�����`�?W��
����F$?���`��S���[G�<}�:�����%g�L3�4l��s�<��j�����q�����/R`E&%lu4a���K�=H��&��yC{	I�����t�1�@�?����Y�4d7�m~������aUL8;:��K�+<B����5��[K�����
����� ��w?���������Sn@���q01��.�th��!���>����y���P��<n^�G�f"���	��Ih�T�
�@�x>5��D4,�=H�P��g	�x�&z0�~�:��!��M;E�y�������h����	q]n@C��$�}I�uy���U�n�A�4.`� �
�9��j 
��t<�z+r����xT��O!HC�J���q���=V�����(%D}������Q~���W�����4��N�@���x���"�]2W�P�z�t.U�+P�b)>��@���W4�>#��S�F�
F5�h�H��2��������F*�/&�A��?��)RI��,��*�	������D�������
"+��}�?���������/��aP�i�h � �H���SP��1�%���6$<����}��; ����I����!�AT�����u!�����g�>�?z!�k0�RB"�����3���]D�����5��a��;hna���>���-&�kE`p��XA����v
!��D�XW�Zc3�aF�6�|�8�]���g��4������]�b���u�
�5�!W�1��|n�������h�SW@�m�q�~�������<�5|.:!����}�B���l��}�-Wgx��:���*Fn@���:z����{�b�N�H @�!����9R=x�A�O����T�n9;��s�F-���K�@k�!��a���P��G���pn�$8����Wi�9~
��3��H�������|�l��r-�!NY7�-�3�/��$���z3��WDx�4
�p��R�8K�%��q�V�:������$���-CKTj�w���M��0�T��@���9p!��qk�����R4x�M��/�"�n��s���73��@�������1}�P�����R��gUO�65�cb�y�<N�;{����LD��UU�D�.3-aif�C��$����!��-����9���jI����u][����|z���~�j��h�m���o"���A�����4�l�AIY������n_�B�p��r�M��
���6U������1�u3L;~c���Oo<���m����������=�|d����(���jC��>^m�h�(�'x�*)0���>������Wf2&�����OAhP�P ��5j�Z~����j�j��i� �[������87�Df�� P��7>��c�QsB]�2F\� �
��/��_]p��a4��M�����[V��2�:�����r�FC�ol��� :2 ��D9�z04u��]��j�<���]8s��a�)��0
�tC����
Q�!$�a������������#�m�L����`v����vc�h�:9�Av>��[�Rt���}f����09!Ef�,����A��=��t;���=c��o���o�(}���x�=�	���6�7~�\��!��������� dh/d�)6�������_�N�[��������|��v`��������6��1���
Vs�"ky�4X�[���I#���0�9	n�\� ����)H�K�������������~��"��
�)�7���j����u���,��}=������F����4��"6����r�j$GD�
�V���B�mS<D\���S�x�d-F|����f��c���'h���r��A�:��n`f�0�����eH�*G���>mj�s�����B`�1���2�J�������SD�z��*2���bD?|����&Q��E���5��<yMa�CgH/:�
�uV.�@�S�J����#n����'�B���G�����]�n�+�)`f���j&/N��	yY6
����~A�zaKPSQ�GJ43:���=C�$��c&�N</RZ` ;�??�^��������
%
&���/��;F����������pRG���&��?q�!#��VS���!W��g0���VR��]�/�`����nl���N&��c���;��42�X�����E��F�
�<oL�al�I`��@�R��p���0��(n���YG'e��Q���>`�����7�Y�r��VI���+h
4",���@�W3D�����������H)HCo�����e�����~�Uv��F}%�l��,�T�i���4���������y�>>r%�cU�����4\�`�7��gd~"����������+��[bA~��p������%�;G��/�g&�(/����0�`:��arBD����A�;�*�������h_�>���s�$V�Xz����5�khd�mm����\v@��>Ar7�T�>��-�BSR��3&Po�oK2�NK�>pb;��M��e��HML 0b!�o������� �/�,E(�z������3�9
���7Ik@��x���vf.��@��+D�������n�@�h���+40%E���;d���xl���l����	)	���w���g�����/p�v��)����+-��tz=1��q��q���'��{U{$�%r##D&G��Q/�Y�O�x;K*-�HF���a����UV*Vh���c/����~h-����D+���\�5�����W�B���9����b:�����������7V��2LN0�E�;/����jW��Xrb���t��>���rdL����)A�\=A����r�����
�����A5��%�1ih`�
)&�M�����!g�
��&�Vq�i5��Hu�N})$(���)��:�>��f�s��]&j���[ne�	h�77��.�����'o�]m{h�*��+Oph�^������u9L�v����h8|�9>x��������*o��
�@[M�+:��L�*'���{�+\duR��P������a���[�t�=�Z��{fZ"���T��)uV�C�X�x��_����G\N�H��zb���ho�
�46?�K���s�q�
�4
�Vh���;�����:Q?>��&F��OP���d�	����#&��M�-�"�U����o1�V
�d	�0�`z�_��&�����r�9
VX���D��6�����E��Wvh���ngy^e0�Q
,���W3LN����U�������`N@����:��Su����e�x�����&LmL�g�2LN$��n��9X�aU^Y��=7�!&&wo��bG�4�������[qdZB���q=�O���7��@C\\j���0)'

��F4�J�cY��||R�����L���%	
�P��������<()Iq �+��B���.7��)x�IB�o
�����,�j�QB�K2"�R��A�sO���T�~���K	������/
����:)>���%��)� P����x`���2����P7R��x��D������Z��B�	��Q
���	����{�������	R���XU#<��!�w���0�l�k��^0a/���09�����;CT�����B�A�����
�	v�pi���p�>Tz5�_e��`f("w]"��w�=��#��8��9KC������s��$dt�I
�#��W!h�����is����
+!b�����/���r���Pu
���R���4#Q��U�M����7�Z=<�t�+��1�aB�f�{�,j��������y��5q��:�}��'{�Ov@S�P�V��z�;�
���3���B�a���u���W>������q�%��CPo[<| 3�2��T��6x5���e���;����>=�����s��W�h@�g���������2V�apqk��+���,��{������f��J�7�����Q�^Gx�KW�`&'�������C�8���.�;<�'���+A(�j����H���?z���Gpx�/HNJ�L���x����@��\E�~�10����g����x�$��4���~�Gh(E@�Vo����`�&B�"p��}���W��_�afLd��@���{0m��@�(�Kf�!��kR�&�����5���nf895���`��`t�v�j ��	h��������x����kZ3h���)4��,����M��B��WK���4�l����"\��b9������KyKH�4��"L��+��o��S���z��F��I8��=7����b�a�&�����
(��	h` A2�T���D���pe��L���/L�!	�O������D�����	�~ThxM�A58�8k����������8��0��t���YS����:�����lc����tdd�BaOR�,@���/���
��������v�Y���{Q����7&���xD�����7��cS2!}���7�-�����AX�fc��	�~Ph I^=�
x��01��d.��I

�I�aW|P�0�@�8��������(�A��P�W#���()4�������<m,��q)\1��B���_���F���?�B;�V�Y��r`����"��-��HZ���ru�A�F	[ IDAT�	|��fR�{�������'IX��+�O�
�&X^���A�AT�?I�n�3� h�an����F�
�:�z~S^f2�A�G�������

��)'d��:�!3c>�V�<2H���@����f+�l�lb�>��$IT&��+|4�����R�p�>�������P���'��$�9���3���C)G�5��:��M$��q����P�f���w`�=/�F������C��"hp' �����H����`
.�#����0��1�Uh��M���M~�
����
��W���4�r`D\�����/��u0��+}����`�<�HQ$�	q�����/���n�������+�I���C�9��v��o�	��������1$=K��O7���B�Y[�����vxWh��T��J�F:�g

=�xHi1��[��z�)WW�PO`R�jha���aY��\���;�l��in���
�jz\�aq�U\�a��{�R@�g�P�k0���`�(����;����q./��>��k�N����p�����A?��_x�F(��` ��O��9f�b���D�J�h~`*�
�^��@Sh����7e�U���BS�`���{��-�������;�2�
�jh``��v�	F~�<��`f(�as��H�\V�f�"x���0��\�t���~P��~;��;h�'���!��h���t�e,B�NRa`J�	Z���#T���j	
��w�����z�k������>�89e���E��`L��D�����^��H���0�S�!��:��8Roa

;HV��UER�����Zv�i����=������!�\���[����V�����D��g(U�G��l��fr�h�7��qs*�I���303i���n�Wk���F���>h����Cw�L�������#s��4����]��k�����J���*&U�J�W������KI�C�C�f�O��k�b������ |���a��f`v���<�U�1�
)4TY�X"$��MZ�����������`>�sN�9\���qw�>�4�����%4�n��i���?WW`J�����,K����hX�iW���E���g��`ya@Chb(��t���+������Ut� �n���������B��3�
�h����BSg0$3�tX����ukV��	��b���t�;�.-�

�<.�A���o�q��d�0����?���$��x(0�RSPle����R��)4�Oo�����P��e�@�Kf�x�S2]�����>��������=��`�O'�4��ip��C�������c�?1�_�v���������U��#��5�����at�FX�?}��N����Qp�cz4��Mh5TF��8�����n��@WhH ���1P��F�I$T����+GN@�qRd�i�������
^���>_�!�AS��<�������$;��
	th���0E����)�$5��d����>��J*��^�Gpl�

�d�!�N����w������2X|t��]R��4��j��o>c|��d�"5L�9���	,Xi�s3\`�-��4�*40S�K@�!��m���h����ThpsG@T��d���4�l���U�a�����b�8����40�(�P��������40eSh�*�G������qv`���Z�x�45��]d�7����T�wT��OI����s�S�^w�`q����?K')1r�_o�[���(�P�L����tU��!�/>���If�AYW��a�H����A��LD���I���.)=�:B��L��TF)ru�8R� �	�v�J
	���*EJ���$���'d
��|[-��H��d�7����D�vH�AX��rP3��2�:�8�����DjL���#) P[2����tP���E9j���l�����J��v*Z���
��:\9Am|�BI(��WlO&8�Z���*4�\z��5K��[q��&U�����i��)4��z
���������'�0����A

|�Ji$�s�8��`hJ�"Q�X��f_;�	)X���g%��^FSs[�H�`fn����~�������/��q��[�&�h��HfuhNN	������qR���
��U����~B���t�	���
��������303�d��-	�^_�17�AM����	f�L��Q�Z=�zM�@-9���t����&8�������

�q��j��pj�X�����_(W�)4�pu��]F����h9h.��^���)WW�J���=5��]��?
]����Lc0�L�!����i��4N�#"��f��
�:h��~�?h(E@�"khP��t�\s�/���Ltk�G��ZM���&	pg�q��l��$�Y2��p�V�6j>���W�t�@���1�����)�D����0y������TK]
�4��$�L�x��$�n.�]���@�����=��vw
q�1gj�������<LI�f8h(|����
4X��P�.�����1m�x�'��M�"����*�O������.'���lY�j����|�A6�>|�����<2?�T>�s�������{��������1tn����5v�S�L�Y{fN@���h�Gs�1�n��3��/4]���9���+,ZX���'<j4X�����i������Ky����P���@6����LJX��"��[DH�j����P�R�-��`�4]��C�$���P|4������`i��	�O'��%v]+p�q�q��h�����d���q�
jt���n��1[�t[���j&��������IZ7�H�W�������������=���	:�Q�����P��>*��N��((� 1
�u�%�������K+h�C	�vD8����
�m��M,@B���Lq
��\�T�X[{�]��*d���tl��
�����
`~�.Z�����ZV7rs
Vft����\�v��=��	�I0�n��n��m�;S	��MoA7��Vl�bez�k����r�4Wq���[��=�F���(�*������������g@R"�8l�=sI���p�h�Ik���Wy��7��XV�����d������$(T �������o4�Wn��]���t�m��C������&��?� �����y'���R��&<	����A�*J�{D0SY��`���1�����N�d!������h�����
vV0�0�����	��.�d�tRRP�M�X�����)?��Y]v@��O
��ef=}���W�`��Cl��/�����G��B�bE�o�Kf$�/7�'��U�A��Gj"R�H������Md���`�tWa0C���mf�0�	��d^��)3�����\~��0�q9iL�%9��OL����3��.5z�i2�B*���a'�8�qd:���	���R�����L��_�!�l��x����@A�<3E�L�2L<l�k.-CE��hI�XR}���;�4T.��!�x�C�
�L�b��iJ�����7����:#�H��`V]+.0�7?\!@�cQ��sd���������������pLh3��G0���t�X3;�A�4������)��r����w���/O�q�.�%U��]��V2w���2��o��1�%�
��.L�!kY�50��b�3|���Mo�vbe�Ma���~�r�3�.N��
h`�
�T�&�V|�� �L�A��Ti�8,���\�!p�'�����l��D�8������CF�lh�&u�J;�G*=q��n�m&�;�"�� �<�7��k�D�+���a�X��'����@�z=���f{]u���Pc���^V6;��qm���6[�
����b|��@C�=��Jm���6l����G���m\Hb��n��<{�~�6R��%����~����f*�)~'���x�8V���WNbQ��d��4jX���gu�
It����j�����.%������.BM��g>O���+�>����Ov@Cm���T��4�*���)0l���\'��1�d��5����$0NZ�~p��~�,dF*�dVBdb��]KiW��$��H
�o_J�
�)
�
5H�a��F��[4o�@dQ��U��9
����_�_3�=>����4�(������C����1o?~��=�~��s������	hH�k�k]��)/(�(r���6g
W��Q�#���c>�0�r4����7SQN����1�l0WJX�qd������E�H�zb�(,�-��}'f���yN���	�(g<y��1?�	�?
��>���q(�s�gL���������/���YYU:G��T����G�GV
�����ag�>�y�e;t��� G����S� B���8���
�����Th�f�������;[0�f_:���8f�����k��	K2)���.|&bm��4��sDc����H�>���W�/�h<ok�n�ETB���I�A�
=�����1-������d�i��r;�[�=w2��H6����sh�	�����w����2�H ����dR"	�<����������p�jS�<A�d����`�'�I�=��=��.b�8q�ia'��"����SN@��.��`M����;��n�L����&:6�lKa���0"�.�Ax�����
�M��L�a��'�cP{��M���8����LStmX����A�z�1s�YD�������I�A��"����b/F�My2;��)�T�MuN�m��t�9���� s���#I�*dK>�Q)t �L&CB����@r}>���d�����F����L��s�+�>���:Y�A-�j��d)�W����BUN�lQM��7�+;��HUS�eBx���@���@<���h��L�����O�$
1�F�BShX��)�	���u�|2C�MJd���������������
�iO��Sk��\����dj��T�������%��	�(2/���4�^����B����0�F�L��CyR2�i�������^���Pn���thj���m��r bu���B&)���#2>��&s3�?<�9)4d7�mx�1h��|=psM����:>L��h.Lk;?	f�f�0��a���ZF��0��p\w�U2�SA�")^T�!O�
L)�9��G��"h�b@�G��2?�~30����\����sh�D&�-v&T��������!p��78�P���q��uZu����W��y�XR�`�+Z�V�?h�L��
������?�����x��<|}���������
�����l=���(������|<��h�E
�����DT���`@����iJs �R/E���P(�����Tn���M2�>&�����B*7��_E�T���P%���H�3Ga�A�/7�Qh�6D�����f&+� U$���D������i������`J���<�������/���	~$�������	J����f4<�$rP���x���D�W*,��������������R"R������g
	�>���-��<D������L:5�~���|��"i"%0��$Z��
�=� y��U���L?T��El �*��D��KP�T���dI�3M���Z|���LYH))���NjP��!�����?<#9)4��cJ�C�|�����/�3���-i�S�c���OQ��{�3�aa�N������"��y��>en��'"��>
��x���a������I��83���h��W���F\e)��q�r�!f�#C���)���Hz��M���:l��!�(���_�<������9V�aK;�$�v���n���� %.]m�����H��y�hU7����+����A;��r
Jtv������E�@C�f=a[�5�#���g>�w��������w��#��:&6�M���?����H"�yL�
��;3S�>�����	�0���C�9����ZU�f"�b���>0��{�c�j�G
���0��}lk���S�{z�����O�Gxr~/���N<:�&v52�gmh���,Q_@C)��=�*��\�V�d��u;�H��v��H!)�]������fL�AA$�h���O\��*6� ��4&�M�.�����"�,��	�L[0��d��W�X�!3%�r$�Kh(|�
@C�
��9
�Kar$wi�#;��$������\��[�������j3EiZs��uvP_.�����??qrH��
���Z�f�o[dM�{�L
�)Wd8��t^LU�������O���o~����]��f59Q���
�x:XS)c-���FQ��&'�"����
h(�<g:�
��~~����D~�g����DA�*�09
E�~n&'�*���7�����������YTar�*���7'��8�'���q��ON@Ca��.|v@CQ�#�8s$~����D~������I��3��
h����t�YMNH:����h(���3������C^iekr"�@9�����F'v��LN����4�����R4���$�N����h(�z-�X�A��_e�S~49Q�u^����`�'	�A�jE��C7SE��B��tEI���!��@�����XW���4hp3uL�aP��P ���s�9�f���4H�F�O���%��4H���C$_���4�\���s�@C�O�4�]G���4]+	@C��m���!�z�����g��h���OH[��j@����I���;�4@CQ�1!~��(x
�e����V6B


%����E��8eA����)(4�^�� =H��5h��������Prz���Pr��(s"
EY���[����H�A��"�h(�
�`�� 
�N�F%
�P�}L�_��
^�P����������� 
%�w
@��m
h����@h����!�:|@�+��
��D7��2'
��"�H��H:��P��4��F����$��!.m��0�n^�4RRRCC�B�U�"���4��s���Bw�T�X�Ix�c<idG>..JJJ�NK��|U��o�8^��Oll,!%%U,���vFbZx���["����gyy�\�b�U2~�?=���@rr2�_IF[*�*��^�*%>>rrr���)I�*������(������8(���8�$nE��m�l�����Y�i��������r7��Pip�FM`�fT���
�T �493�}�����k~����H�SG����,��A��~#>�h������+�4�3��$�_,q�����p;4�X�Q�Dj��i�iA��0���dth
(�R����U=�S|�$W�����% �VD����G���r<;%e=��w���ZE�����h�H��	�
Vd�K��V�����@��K����RV��D$hf��^���T���d�y���%���������?�����
����`a "�bv vwwww��v'b*6bba�(%�
�����XPte�f/��s��|�M��</$-2�������OI�+�7)9��?�O����#$$������Z��h(��$�%��/i4X����E���X*
}�uB-�����R�W�t��IJ���?�AJkg�_Z�����K��VZ�;{���\������d��5Oi����\�;�(��]X����.��J�;a='��~��O)����J�~���c='V��q�L]��7�� �Ch�?����{$�VH8/}��|@ l�J_����,PZ7L�P:��<�	���7����.��J_�s��F����s���w�CX����MX����M0��������	������
>>>�kM#�#�������Wbb"���~�&��]�d[����������^���d�dddJb��������r���(**�6���PZ�;�nL��I��.7+�r����������'�o�r\(���4�or���Bi��Jsg}���o��������k�����s/���������_��������W����YZ�7a=�{����'e����%m\(��[i]�g�����������B��1wma IDATx�B���J�#p�/9��xj*������I%#������)����!i���
���Si�����������^Z������3/��[i���z�����s�~�9�|�������u~�s�s~��p�;FXh��,���kh(9�T�0	���[����RX@OO*����.�����l��s�z�d�J�W��:�	��s~+��]X����.��!++[|f	����o����j������b��LI�V����b{|BF�����<m���- �
���,9#T����X@O�>������^��7a='��~~�(Y9�����|�����h(Y3���VX�	����E%+a='\8*Y=��j+�w���\*\jh(\;	����������o��s�xU���Tk�I*���������
���K���u�?�@p���p}{��}�8"���b�3�#���c�07�&��t>��@C^�I��������^^����>]������[���T(���[�,
�y|������S����1~q��
?[y���p��g�����
�#����6��������O���a��������
�����/���L��������RVI)d������]B����.Gc]���Kw��#�R���z*�}���l�L�����m7U� ������t1\Mv���%T�sh�tB���?v�����8����B5;�)M�?�F���k�������~����������� 
��u�����B������H��!��A����Nh�����R
@���D~�>��c�V�T�P�V��p��K��^�[��E�O
n���������O��gQ�j"
%����+
%����Z@�?��4@��x���w��P�����<Rh�A���x_���{��s��'���?�i�x]��������PP������SN,h(Z{wlh(�-8?h(��
C
�RN<h�s�EI��4��'&��4���V�k-
�|z� 
����)�a����=i8����'aQ�uMk���OX�e/�OU�oX��~��,���!2*�N�!&&����yr�w��s�IIIT4(��m��6�4^�<����55��G��VE�_�Z@J�����0��2s�����;bq��(?�A����c.,J����`��c8�g��Z`[�W
u������&-���)��T���;�,v��Q�4_F�?j�O/EB\8����-8u`������4�tJ�Q3)H�,�Y�.'B��q9�9:���=�����W���V�+�g����y���D�|
%4���?����!�-�,-�C��h������A��$C^U���Z�U�c�0�x$)]q��PQ��I��������
��m�T���3���"���-K]�>HL�����B��+��>�V��n=�N;�
���.9g,��C��J����F������"��g�
����-x~|�������T����@ZQ^NG��.'�FeTjf�'���*5�FZB���(��D�	4�Z��a4�O=@�{P����n:\l6)M^��y7a��=�
�:mp��1��)R[oY��)K:)���N�����#*�#�x��]X�cl��+i@�gG�h��n��q]T�*S��;�v/v�Y�4_F�2}H����cD��E����m])�l��iPR���}�{�/+<|�6n^�C������`����L<tI����N�DbBv���G"7��4D�g���C)����Y�j�-�@���"��/rq��(����ML�UE9���Hu\��
N�������gBq
���!���A���?S%��W��04��T�K�+CVA����Tg�>��y��AEJ��������J$��|�F8��Cy�[��h�\��6^����p��w����t9��8v��c�2�m�����E�g\L�9&���3����gi��M����i*��Q�H���(.���E���P��kl�9�g���"fE' ��}��jW�tyE��.'�O��S�W���E��et��k����j��t�H�r"��8
1�ap}h�?2b
��Z�D�JJ��>)h��1�������o�X�)�a���X0]4���~�`u�����|�	��\�������j��y'L;����@�YYH����=u�@��|��J���c�8�?����u�q��
J�
�]�Pz[@J������ %)��=V`��Y����4�I�����x��U���+RIj��T��?w����������y��s��4�W0�A%3��u���������	/�d��s��h�
x�Zj��&���
�Y�����Y5E@��Dt(W��E3r'��dhY�?��fy�
4��������_j�I���
Y�#���G��M����L���(�x=�{���������|��9���Wq
�UL�U��]��@C�	����y���1@2�A�h��D��}�|�10�A��e�����[x8��������1[�e�t���_�W6�Q�z8���H��$
�������9�����h8�F�'����S�Hm^�@C'5��JF����:� )%�Q�t�scX���G#+� I������6����aV����*���7��('���c�P�>�D
M���cQ����4hU��Ju����}��y�)8�����$aq
��h��.3����1,��>�`�L4l*�G
�O&�sOE��Z�%��g\\@C�2������h�lh�*������h��������{��yeyD��q�E�~�@J(
�l=h���y�
�����������u'�]Fjj���wBUE��
�}�	HKI!=#�����U[����v-���}���p��22h��!?���T����m8�O��(�~_����l'u�����L���8�N1���d����/�o?��#���Ah��Z��@���F��		I<z`�;�>���TB�_������f�Q�C��$<[z��jY���b���YYYG�2E3��z�4��@C���aV�	�jOL���3������gh�P��q�����~%����A�V���<Q���������P�'�[���W���".~@Zh
��4�� ����
�jSmH�K"�)�����}A��s�07�&~}���vsX�����s:����������)Y�04�8�c�;|��(�
yD'�ObX��'T������p��d|��o��H���rM*G������(Ln�g^<@(� =�o
��}@%
m����!���-5� �S6Wq��.�fTA

���J
Q_8}p��l������.<_�B����"Sb`��'�}�@
	]�,��>9�����.8�q��0�����As�FW���O��#�0j�I���������+y�m�N�>G7�oBx�;���������a S�(S���m�����,<r9F*U@�Q�����4�q��,df����J�Wq�a�l���g�m����'�x'j{�.R���I�a�Q��diZ���I?����D�����BF�'�����B��
�i	�����YhF�u5*a���(�����{c��e�e$S�f��)j���l1�VO���b��S(�����$�6����������4��`	s������=�M�aL�����

����$�S��P�����81��;</#9+
S��Y�Z��`��H��@|z2:�gL��a����Vz����F*��>)�*5EM5��� �7d'u���6��-e��6�K0��[T�������(�Q�����$Fe`����H��B_X/�q�B�o2n�|���oc5������`�Ui�����qf�7�*����
�U���������s+AQ]��S�����L��Ngm�z&��}�n�}O���n���1��}�I)��n�	1q�q��*�n4��=*�����wj����z%+Wi�tj���t\qYu��hRo,�	�y��$�}xc�0,���q8���z&��B��a;DD��'�m������^x���v���h����
^~�& -)YR�x�y�X��
��M��;�{2���
u����r��S�����\���@��nY9<yx�;p�@W��6���	:YO�^����w����<n����$4��/n� ���=1v���\���b3�������c
Z���Fd�{�_�Jd���}�?�C����u�����N�L@=���g�q4���<�&t��[�y4�~�����������zg$p��Z4l�U�������#��(�dU4a9v
��.�/���-���Cr�G��P��@�����;gqh���,x]=�h>sb?�PM��>�i)0�2�6��/���v�W4F���9���)H�����CQ�Ns<�=u����VY�����D�a�!)+����I���G�vQ��92R���d��x�O,�rI����VTA����:���*
n�&F<�g��hFg��UG���H�F�I�y��'�#����2����.>�@����R�C�����2m	��n	��s	)0]�������W��������f�9�]�]�9����3"�z�g���P���(��m�}QI1���"D�`���B�������n���y(�m�d��������	��������u��M!��V���4t������|������[�3���=qu������w��1�oeZ����B�������D�n��������Q�h��_o& �c�����\9s��)���<f�����G���^��^s��������!�&��iYy�6��0��)CT2���k�r���}��:��h]U������:*�������������my�5�m����A���1*�o4�����==G
s�Xs����X*h+*���;��:��-+U�/$���M5S4$��!!5�����.�����)���V]� -K�x����1�As0��-��b��	�m�����ek����0P���+gPFYq)�X��?|"By���j����%R<]�d����vC����`d"G��:�1�<���L�Y^�����{�G�����z�F�v���'�)�����Qs%4mM���4_��
a���F�!�����1p{����o�HspdO���TF��4<����%0��?�6\8�e���tT�������1�th�������

u-��O�n'�4>��(g 
�Q��HE���#��mQ�n�) �L�Mxx'��������{@���<�k���w�@��2�5%������,(t��� N���t�4H��@�~O��4��j��DN���k�P�!#�>�����;b(��������3�t>\�aET��#����(�R�y�\MB����`���P��>���������\PA[
�[���[���t�/�7$���o�S�8�s#tkh���t�edb����������B���^���0�wKh(��)s^��>-�BCWcx���so,�RT���?b��B?��d�YB��*�#��i�unquU�=|1:��eZ�"��%dGFA�������fN@V`�u��J�
�� ��
$�t�:Z�!:�+���(

�U����(������f(k�G�f��~o���Q������������1�8O�@���P���S�E{Q��s��S	��M�4�C��<�o����<�������G����\��`h��T���:�[J�@
�����t�q1��P/[
w����M��}H�i�zu�H��P��t��P�P��H�!��%�4����<^'�/['����n-�C����^T�gW�Z�N�qT���`����$����ze�4�"�����"�c�u������	���W���/�@�q�5�!�����8<Xh���X�T�N=����[��:��u�%$F��uuH�����Kt����AP���g����@�Mm���������N�Sf��*9��O�!�l'g���
e	t�1h�_1PV�@�
���7i|?h�Y��������rPU���[���������=	\>���|=}I4�R@)*������k.K{I�������$�/�Y>��xMc�S^���W���}���.������)4f��ET1:����h?{�z
:X��
�>�;�6�h�*���~���$T����~�H}���Q���!�M���}�7����2"W��Td�FC���
��p�2��h�"��m�����D�Vlb)}-���L���	���h-�����9+�m��.L(�BC^���+/�B(N�X�6m�B����=;� ��G}�/������0u�A���B��]�'"��GC���yW���n8o�	M��B��������KP�J��
�:-��L��7����M��{�$���ohj���G���y��2�K{��Q��`V�������9&�3Pyz�<Q�^�h���&jc������;F��Hp�:�I��!�;d�*�r�	���aJ��x���$���.��s�4V��c2��ZI��_�����<�<�@�?�E
�n�p���8���7�BOWi����<8@�����
N��S��+���/�z��W��=})v�_������)?����S�4������c�p���#����
�
9�gU�����R�4�\����5�%��Ck�AEB�����m���p��*40��'����@�����l�[�`��2>\�Cv��E�4|�E�����?��G&��v%D�������p��w��v��������nU�~v�H����Z$�&�*�����Y�w�d+( =,�+!�Z(�G��
S|�����4�UA��Pa�1>l�BVbf���2y
{M�����N����W�������!g6�:m5���Q�N^@����t�Qgw���)�{���>1����F�`��zz�k����..y<����0��H���,�6\�Y�����`]���`Y�>8��b
6�4��~��N�����B�bm���i'z���7 !>�;M���Q��b����y�
/��#��)�����u60o�O����H��=�0@����:t�[Ot���|\��x��6����*'}�o����}�*$h��/���z������v2~?��`��=d�S�B@N���q|�x�mH�I)^>3����2��z�,L�����p�H*�YK#)�����`'ekH@�@�.��zs�����������-� E��	��{�eL�����oaB�[H�`U��O����]1��%TR��m�������
Q���}�J��2���!�2[P�����h���p�&�" �������a����]E$A'�]x�}6��4����h�c}EMl�pD��M����������9����#������G{���������3�Vj���\0�V�y���D�+k�En'���`����L��<��U����
x�2a^IP��FLp��p`�[X��EZR�"���9m	���,�t�����9���'��{�`�����@Y��h����Ah�O���r�!�;	
z�"!<��pq%�2|hhZ<B��X�K�6�B`Ep����0��� �$x�]�w���PQ*��Vx���
���@�j4���@Q^q���5���@	'��N8�8
�U��Vz�5�eD$��q��F�����s������N�u��>�v���q��o	e]�}�:F6�J����`��+�0m����2�	�
A�������^��>�6����5��R
�����O�B*��Zd�M&������L�;�������4b�^�A��%�M$��<����]CL���1�����������0'�
����E��W��b���X��+F�t<�	�bu^O@��n%�'�����hPV��-2���n:��U�q��.RL_p�V��K�Yd�rC����"���B��\���1����
(o��w��a�y\]�J��	h����Cw�z�4��	��N����#�����{IY9��\�����.��2��'m����F���d�zA�b
��W���q������8<�1u��D�	V|� IDATz,;"��e���2���E�5py�5���C���9�`���"���>|o�"��un��|y����������P�����X�h�`���z�����}��"�Q}J����)�3���f&�r�!�����qH������1��}}���LR�Ii���s�������HWrULe������{n�r��5��*�O�h��r0^{�+<:d�&����1���B��"�4��8
���q%��<��i5HU.�����2�7���z"���=�a#�{+����^e����tCNW�'/����v����t���� ��v����7.hp�w�
�#[�\"7��� \�s
�-�~�����f�5�E�4L��<����������[Gb������4e�-�%�����^�4]s9��3�c��i�&�,K����J~@C��}��	��!K��e��)WN�;/����4L�����z�CL$��T`K�-���i�
Xq�,�[��������Fm���4m�(�@G��b=���F��������u�X���{9�]hU���_��M>w���U��E��&Xw���5"�X+��������=�u�m.�)N-�y~#,[SW�$�h`u���
C�[�=r"~h�7L�����O�:���2������h��TR�q�V����C�4/H�qe���@���FM�!�1d��$�����[/u���@�E���~eT�!�pY�2BEMw��Q��d�������a��`,�����?�N}2�hK���dXuR��0>��s�a�$m�G�
2���b��S���M
=�N���G����qK%��K���t��sx���"!��4�-�@��2lK";*���(d�S��D2�e��`����	PF�&N��S�'4�>��^�"Hay���#�f2�G�"�!�$��)�R����W����L'#`&&��Bi�
�/%�r�'�!n�B)L�h�i�/��X5%������u��5��a{Ww��x���E9-t1�����9��G; ��Go>����"�Y�����1 ���5X���������PV���7`������p��+�����"=3�0?y
JS� ��qHhkQ[�B�eS�?�L_(M��M� QN�C
���su��W����g�G���WU�\'+$��L��H���z"��3�?|�(@�i��
Z��%2��t���M� #5	~�������*�'��8��!I-���\J���6��l&'Pb$^�8H�����%0�����4�$��Q�������;7�{�?�S��i�t�~�7"H��� ���2h�C�����\!"���������3��V���9��g2�O<w����`�w	�����&A�
�o�X�
~Os(Q�y��i�����@�;��mB �+Z���>���
���`��u���i�=���+}��b�Z����:���+�����h8�������������������.��R����QF��m�2�U����1W4��/w�A�_�}(���
l\<y0�F���Fc������*��c���J�b&"��`B�SD��/2���*��@%n ���<��Q��4#FNV#�--��C�@���hOI0��}�.�t����$���4�x�e��,1D�����Cn�T�okFLR�����N�@�3��KH�r���J��G^@CvR*bv^���nH}��zU��,��S?�!Hg�-4f�@��d�D�Zq�sP�?����IH��!��r�
�L{���E���P$�ABE	�Ph^���""��6Q�QG$��1�i6d~��b����
4�e{XF�n�bk��V�@����9��>���������s�xZ�b�����f�^FFo^�@[�<^��
F,�����c��.�P���d���L�O��q��z�j=��,��7�����eW,�h��``��������$|���'�/�9=�
�2�����������V�s���a��i�6�0V-��.<�Ch������jus�[t�@S�X����.^8�:�K�a
��2���h�g�	@�4���T�4?���>���BRr
�u������:�?������x����R��fb���HLJ����f�����}�

r<���"����k�J��I��4�'���)
����0nXo��P4��
/�/�-PX������N@����h�>�O���Ph��m+��u5]{�s^_�!
�oRh���+�h9��8u}FtY���N!(�����E��X�!��(���vfn��QN����j��R	�������C���j��O�)]��
��3����5�����2y
VV�-����������^�#@�#�v����6{//��}��J-t�Q7}_����\72t��W�ac�;����������[
��L��S[!M7%�Y�����O������!�EWO�7�`����=}c4k;Qd��yyj�i�����G0b�1�>Y��7��n���t��6Rh`�
�A�>�(WR�@7Zj���<_�&�Z ��K���>�����D�����t���a!99�nDeC�n�9�Y������I��0��"\�0�1�y?� E�Q;`O
Z��KF�Gw�q�!'M�MQ��6%HJ�����i�j�!x��T�g���E�?�tH$�jM���FWcP�'�v*�e�l�����y2P�c��4����q����A�$!�x_�jOI=�=�����&0�������
9q�E��Ml Z�R�i�Q �S����E/Nb]���y0 b��
��U�,k�E���0��Rn�j`�o��S�
R��F�y�q��.�!4H��B�Wr`��\�b�9�$"u���aS�qx��V�k����`�7��M�k�m�:(n�
��`5�R2��W���afE����6��4��>��n1�W]%�
�t`��x�(��x"R�|D9:4�~ N��G����;D�,t[T����&)><��F/L�� '��Ff������M�f
&��X��D��x�y=�`�w�s�
r�������|�a�&�
.qq)��`�f=l�&�V���LT�o�^{;�a�a(�[��qtS��S��z-N8��x��V���Q^(�e�A���}��(V���
��A7��zB�~�q��c�������U����Y�Kq����R��I��6n�!l]��Z���As�f�;�KWx�-��0o�W���i0�B|0q�1$%��[2�4�=r��4��q��[��������nc3%��r�����79�����4�`�u�:�7�iFN��Sts��n&	�[���q��W
��]�n��Q�o/�E��s�[yN�{�L����f�W���ym��P3����`6p�n��2&4n����Q��TH��cl��m�f�1�\5�b��S�q����!W}��i���".��+(���Q0�����?������qZ����
�u����
�'m�}!>��?X��wX-9��q�@aC~@��q9Tc�����������n$����v!;]T���L����,|�r���>��
Q�K=�h(rEY-e�#��������9�T��#���6X��8��G�����c��g�4������h-(���(�nn�l5���/T�,R~@Cf�G�|q
U��� ��� ������PmS�2r"~h0�����'"�T������
:��K5�_;����b��~��b�3k�RY�LF�L4\�}���7X3��+)��f�������Bh��Q�����[���nBA^	��{2����>��
Y��wv����wVm���������P���)N&C>��et*���)4��V~@���2�*+
��g���p����B�{A@�wxN>�����2��v�s�u#1��!��<��zD�U�0�I�,|�rb:�eJ
�Bq��5bI}�a�j����Ze���~��:�8�I�����W ���C�T\�����	M�s�a�{�i`��T��J.Si}�v��cO\`Q�
�����=�����9P��4�Gr#��Z�ku(���u
��H��=&`��`@����bi�����3t����0kiY���Y�c�m�5P���Q�}56��Q������!����X��(!�}R��&�A����x����c�y,,������;m�W����4�������{#��@�o{�h��P��=�A��%���,2&�'`a�g7��������]��+#ao/�K��s)��h������$�K!~��"�������A��4!Fj����j��lud�ml�5�����>���iL���1d�����]��R.����.���'=D�6,��`�W~L`@�*��0%�I�)�
����v��$�����=x��z�� Rw`aI�6haR�����k��d���JH��S��#2�s���3�h`���UsdED!��M�w�DJ��E ����H���\EJ��=� ����Y�����Bq�$n����@��sK�R���(@���:�
�I:yj�L�A�z������D2�?E����fh6t)1���lr���8	vc0����� N������!�n���>��o��>�	�gQ�t
�"��zT�q�������n ���o��J{]R�$%�G�)��^�*)��@C��3q{�4���@��A��z?�i�[
&@?����E��,o����#��[.��G ����.m'P0A9���$��rB�����,Z�J������Ey����=�:�D3\y����B���'�{A�����%!'��K:��l����2��:0W�@��
�n��!��"�������V����x�,F&������H�3�S8�����,$
��0����J�*2�����8�#��
�SZ�_��T���c	tV�g/:k�����[b�8.Ay�`��kc�O�#�7%	2xK�Y�'�7���E�!J8s4�����#������s'���"W*J���D
���� cV��F�n$��2K��:�9!�;�������(r�-4���������f��[/��!����.�'u���h������R�M
3����)qddA��&�:� ��Ba���lKV8b��N�Y���k�s������,`@�9�~����qe��&Mi�l��;���LR;�G��X0�
�g���"�v,p���{\��]��7p1Bh�@�x����2'5��Sv���}��`Fu��vG(�g�1�������#p�i�PL��������;��
T`s���|:7](��M�}���X�M���@C�o��!5X#s���F��-cH��� ���L����A
������������s5��������'
��dq7�8���FO[���2�����N�����P���@9hp%�"�c$�u��b��x�������d0���Lj�d�� �@^-PX��-��SH�73hBe�`A�[�A^�$�j� ��?Z�����!5*%7h�~�
@��
4tk:\�ch�9�
|�*�hx��ul1k{ORg�m2K�q��E����
��+ �x�'WC��X(7���BC�.o�G�A���?��F���P|������M^@�@�V8��&�6�����h@F4x��q�6�O�'�=���������tH&������{z��,����e�X8Dj
CNm#�A��]�Sq�)�C'��K�Th��=v=p��F0����p��s�
�[
���������A9@C�a�q��&��`���1\B3�Q�n"�Rh?�<vm�I��D���M��SRh��'��;
+2*����8{d6:�����#���5{�����f��[���)dxAj
����MZ������	4t���v�E�F���H�M���\���cr�X4��y
��2�6
�^�I������4<%��fR$=J��nY$���Q��p�&�����*:��.���b��`�	9����0Rhx�]B�����������	�UhH!>��$4�y����r�"�G� �+���Dr
A7~tjB]FH	���F.%X�� h^�5.�B���90��+N����"s��Sh�����p����	��0���C��hJ��Ah�m�Oa�iO�z�#���J�|Z��r��&x��&�����@����,��A:)40�M���=���:��	�Uh``C��z8����l�k�}`�_��������y��"�vRy'p���(L����A��PV����Sr�4�6b

)p����&��w�/���*4�y����72	8� P�����

L��):0H����
'��'�rc���$w!��w�u����\W���
7��u�'�@^�7��y���p�����������{a�{>���Z�Fhz�3H�}�����F�{�H
�\�������<�/�����R�����B�
��gX���b���C��c��q/�%���}�	$X�]��`0*;�[���hL3���@�P��g��1a\9��6���`ua@�
������V7Sfh�a,W~�����eMo���Dera��#n\��!�};��Ms"~���H
>�TZ���r�U�C���]B�7�B\�/���w�}H!%�o����IyI�������pyN74��/Nn�

,}Z<��R��JYC>���/�)�I3��8!h��rhn�4��!(�3^����]G��a��#���\JE����CQB~@C��-����'tC��hZV��n��H%��
}!�X������BC�3��cl��:[�1����pT+*�6��N���c0�gM����i<69"�C��R�N-���������
�N������b��<�|�zHrt!#�.2|�0J@�dYR�!�e��@��1���Q�P��{@CwRk9G��<}���)�4����p%�-������y<v������u�L[���1H���-��X
����u@ ��3�l��'F�;� ��p�v-�����TH��[���uBb,�5���i���l:����]��DQC~@�^�&�����4Z�@D�h`��H�o�t��-�?hX�ZB]^��>���?�jN
,���0��nl�1�<�f7��X|yi��P���Y�����V����U�������0*G���T���R��40��Q�V�"Pj���\
�G�M��h`� �'��$�����
V�H5��\n��s5\��&���`�[���6���������Ha�&
�} ��4������}RF`� ��"X��"�c�r������	9@�(Z�W�����.�������y}�B��i�Q�\LX�2��S���:l�:�����If�"�\rE���-L�w�/h�oO��W��zB�o��e�"�_`&��Wh���xK�������"��[��x2*�TB<�B�eRh����{)�'9wV��bM;(�SFA�c�[R�����\����
L5���w�kX�
��?4R����Q2^x�#�6�.$6����M���B�1������#��T�C�
Z�a�����S>!Q��.{`J��^��S�����%ca*��(l���D�&H�ur�: 3�=��������

�� ��
:|�����Bt��k���H�t�\V�R��\���[�@SM���:��H����z�s!��}��\2)�]�I��\����P���a�V��� ���8��>�i-���^ra1�O,�=dk�����@��^�n��/L%�
w����Y�t�y�+�!��|���x����R����!�z�
��d0��~������A��wOq�LiB�?��H����]pX���B��kP��[��BC��l�z�'��r��S����o��4(�Q���>������5�$�L&���h��\����XV\`�H�E�8_)4�h���n��L+��+4��{�X��8���h�1�)����<S"p-�C
,0��a���A���� IDAT�"�f�9�,wO��W

NI\)!-���F�z��)j�����PP�sW:w���BC5cR�q�E[��0��Or��%�0������y��;��/��%��;��]��_2�h`pA�djWF���P�1�.sH������0��4�dE% �+
mjs�,|��p�!��X ��C��n�X��+��;
qeR��GcU��\�A��"���4�"%���Rc0�A\�pg2���=�
�.X��]B0�
������@n����T�*40id�`��NPS;X8�].H�oP���`�|R}�+W�����=�U��������Q��4�>���}p�lt�B.X��������#G��,�]�3x��KW]�����d�%,_��\`�sWG-D�*u���e�_l���F���T����H0U�%:~���4��Lk�d�s��k�t4@�?[N��G�����)������fd�"XX�f;w3a��N���zu�aX��~�x��=����

9_�a����~�u��<?��p��K����)�����q�o�}� �
K����i��$����g���� ?jBZ �(,���m�ICf�rw�+��1r�&\<��wZ
���Q�j}����-� .%�+�CB������u��?3K��4|��
@��
4�l5�jsc�����z|.���>�
0n�}����,.�?[\�0��j����1�����.V0����C�4�Z�5�g)���+_Co�a.��PCz#������Pk���
��N�[~�}zx*4��EZP2b��a����J���%/�a8��3)S���%���q�h�.h�R�!ZT�E�X$����Je��h��d`�%�����b���H����� E�Y�oe�T0_�����n&r��.����rM~[f��E�nh��WD75Y��k<�E����m�w�`�`l�<)t�|Yyv�I~;�n�5�P'��b����8���(H��y��t�I}��v�?>���
e�x���D�?�;��B����>tk�1/�
���*�x��E�q�rp@���S�p�)7����@�EPT��[��;:������=����U������d���#�C7x������k�%w�Q����v��p���(g@��q{��
����n(2h����*�QcP���+�K���hT5n���U���ME~!/���~:b�?���	��K�-����BCLH6���s���Hj�;������<t)�e�R=	���6dT�"|hM�&�\d�^��\��}���|6���m�i�/X`@���v�&� .-	sj���:\
z����s��	���������j���������zs5K�0wc(s��B������E1������gQ~W�=��aa�C?T�!������PS�}nr����d��w#��J}GNB3kv��
7I5bE��X�F�o�6�E����(�:y���5QC�z����� D��
�*��&���K�G"A,Q��R�v���
&V�������y>�M�(���D��d��%P���.�+�T�4��d��t�S	�m���Q���w$�n�i#�}
�b2`�^�)�_�g�*�k�t{�~��W��!h��!r�f����Q��
tAe�&p}y��4T�������d8�]A�(��V��d@��g��q��04hJ�!���6��I?���H��*w_�����#�!����o��GT&sk�M� �x�s����Q��w?��K�iM�kh���4uA@S9�X�������t�.h� 9�ZfVt�H����m�����dl��S��u(�����B�$�r#'����y��d
����
6.�l(s#���������':���d�������P��hE���d�,_�'�f_-:�vr�������=��G�H&t���7�?������xL����E��'�;0��)sNq����H��},�3��f
{�&x~�{@���>[L}$ao]���?`���r*$%Mu{H`C��+���h|f@s'�:��m�T�=!	a�P"i���rE�Z=Ds������;i�L7c'))���Y�%?��H[���0�9�+�40�L1"���1Y�� ?��������
�$?/�D7�h.e*
��������\=B���>���&�������Z�
|��b�IT�6hP51@�I�����]��2���g��"�~1�A���rzj���G]`���kr��x� ����+���c��{�S�{
�������x�'w@:���q�G�����?o�^�~�����������n�����9���7�}�n���Q�B�r�y���������P�d�w�?�oC~

�7\I���UR�P�AR���
iO�"��W��������H{�	M:�W�E�o(Rqy��������$��A���-�g��Q�\��*����O�R����\K�,	�xM7XY`@��vej��>1z����r��s�� �����f`3��YO�a�,���X07�(�����*=���!0����L$��q5s,�8���c�.�Z��m�g��S+���
�X^/�P���Q�4���`I;3��nGH�l}�`�f$���	�eC���T������ ��r��1��'�����O]r����8����i��jR��yr��B�4d�a{xB<�1T�u-s��K���mMRNhgT�n9���Of*9
��6���L��r����`I��*4H��)I�QV����� ����O�a��EYUu��u��
������
�j��G��j|�v �����\�A������������k�D�9(����Ag���b���\��A���z��Q&�Mt������d���W��DF�����==E���O�&���P|4�?)rk�|�3w�������c0���;�T�3���1��B�Add������i����l}���1���f�)�����3��������w�2�I��9W����\��h��(�_��w��$���E����7����
Q�n.���"�I������>gn$2�3�M�9d� �_��D�{�%t����!����	����c�/�9�Y���1����A	�b��nG�����A!�qw����$79��4�-`�}�{����/|������`�
m	Rb��D�)����Q�jR~�Q<������O+h�L{���w�	�z��i��PW��y�>s+�e�����U���r��k�=N���P6��/[^@��UHT���{��s�k�2h�6��Z5���-��\�����]<[�����������*� G�gE��|�v��\S�A�~2bF�Sb��L�L�|J��_/�BC9�&������"�9R��Q]�!��F}���E�Z�I1H`�X`@s�������{d*�g����0?��
j,0�����Mw�.�E�9\�@VI��w�uh��8L�N�sC�-��u���XJ{�0����
p��Z��A���E�R�6���P���+�'H��11������(�l�����A����;�[	i����{��Rh�$e4�D�N��pr5�y�4����'6������w/��DA!?�A\�����!%/�;���C���s��*=�``U��Q�x�������d�����G"�'��Zx����h�wd$�����=.P�����$�k^
�������5�����u�O�!3�)��!��&����V��9@���Tx��Kv�'��,O�$tV��n?�?�K�$Hy'��uy��b����!��2b�(r�I�1)q�[�R�������O�O�������`u�Oq�c����Q�Sr���ZR���o��H�zDn;�>L�3!1r[�s*��H!(.o�a^@�'[�����4b��n�]N�
�<���_�)�h��KO���Un[D�����:2CI����
�8!F�*X�:\�!����n$WR���>TG�E�6(�4Bz�G�>��n.���
�R��j�$�8�)��;o(h		[����=�
,�ACW��M`I30|���&Z�1�a���.P��T;�M ��Z�Es	�M.+���e#k����.I�������")�="wS������?���������������������7p
�"��B-��8rpA3"�4��*����op	b4k����������A�YR�H�=�nR���{g����'�B �wwwww/�ZJ�*|�"
E���[qw��B�=�3�^B��r�Ko��$w#��;�;;�����	��QL����T�nCXR
7�B�P����{DHu����Jw�&�{�4��hP�������>�@���P�t1��ZA����%���	��b���_��|��D�Pq���Hh�����-{e��yKH���M���-����j
_�4���V2L�HukTB%J���@�swO�����(@�0L�+u�7=�.�����r"�z�!m/+@�~
�\#��I
h��]�M	h�U��zR9��v��/=�A�:��L����/%�A���TWZ@Cf��!�W���Pm�4|��u�NZ@�.��
u�4d�cP���!'����<i
��__�HrB�R��K_��4�����]��������h/+������t�FV�#-�!+Oj6� ��<�����l�C����!���6R2�=u��hP�N}��4�DFl5� �B8�r�12������e���e�
9��v2ZWZ!'2ZwV,�Z���x,*����1&�=i�	m�K�K��\��r��M����4�)@���Q�h���-Y�>��J���
��og$u{�A���'s���Z�C����v�G�_>�)��h��e�
��	����!���4��[hP�O�\
����t�[t����S���}�nhP�S��O��\�
h�)���%T'�^E�5n����
�����S2���]

�F���aie+��zkfJ��T���=�
������|
���)e
�
��uN�4(@�4���j(

��mE�!�<���U>��3�EC2�w��i(@Cz~H�{hH�C�~�
��K���A�M�>C��D�s(@C�}��kP�����N{
��5��4d�����V�hPy (��������C\�
��!�������4d�S�
��@���s\�s��v%��uw��)@C���4d��TZ��lho�4h���J*@CzJ�^���*�4h�/]�V�]{4���!}��C�����S��9Y�h�jg,�^h���-+[�
��=E�A>�5�
��J�9�!c<q������1QQ:^#S��-�vy����y��ccc����\�r�]�%�4��p��yx�ydz����Cpp0P�HM�L|���N�
�E�o��������_���Q&��y����]����,!sZZZ�Y"ke��A��,����H������
���:�J�u��������ig@�9�_g�!!!������Y�+��#�xX���a)�d�����uq&
��X��'}�e�"=/�����	�tU����c�+���)�`������i�o���Cd����v9���"Y�E���5��oip��|UcH��x�*�lsg�kA��7�`+��|�1�6_�����)�c2���c?���#q.��6�-Cet������M�q��13
��=�~�8_�m�s������h�x�~����--{�k"�$s�n��'u��z<�Z������H��!�cZ�2�|�z�1��0��������@�M��Q�v��r���#44...j�����
��!z�4|/+m��< ������q)@��v�3�Nh��G���EP��2�<�t`���w�:C�y����o���������V�s�d�`��v��|S�s�7_a��]�^W�s���N�)�9������:�3��u�m?�xN�#7�0>�����;#�)��7�4�	�������@f���������
������o�x���o��������we<�	WWW�r��%�2�������a��7C��
��
��|Sx
s��P�����a�{�@��G��e����x@�@<!�de�1�p1raY)��6777��!�(���#��}DW��cCF��C��5i__��������(�;����H�?~�������y������C����|��������>�����?�x.�����j7��\���2�3��
e<���9u����/��\f�C|l?��M�}������U����g���!?�u<����/���v|���(4�{v�|��x@Qh�:�A!�
o��!�xW�B�*!'��:��j�3������0w8j�����P�s��c�P��
bQb.+

g����2��=UwV��M�)�9�]EY�&C~�������?���4d�{�b��y@����a�2�
Y����Re�
��IY�C��
��a%���j0�	Ae<�����:�Pv��M�4�����we<g��]������>���+����c-�~�����1������?VW����D�{�)x@
���G��p����x���q}�f(��;�r�<�T&��g������8C����U���;������K�eb�M�a��n�������pvv~'������c2�0b�M���"S���R��M$M���7&��1��C��H%cdd$�������\���{f��� �z�`mm-�*�[�a
�L�Pe��=��-���qf�v�3�}�����o��
�����Hs'DC?����W�1�I�����:���5|L��~i����o�����E��!f&���7������������o����xS���/�]-cu�)��-���,SN�8�<�����.+��x#c����H�6M�+�Z��I<;�$��x�c�3�����5�1L�P����5���
��������S-�t�|�����I����[� �C��G�L
��l����h�W���R��= ��<M�`�m��!�4S[m���b9�c����,�
�q����N���4����#&�yk\N������I{u�f�<��_�x/�L9����S�\�R�>Uzm��|��$�����uz�uD�n5k6��UX�	���g!�C�6D�K�,dq�75�<���f�����O�� P_������������~',�������q��c}u��ku�x ��^����xm����������;�	.�f"�P(7���*���vF����A����V"&L��>�I����FE���<������x S=ol�
��2���nU����u^�4(@��;U
*@�������
��uN����?

����h����!�>��5(@��gP��UFr*@CF��]Yh��o)�
�^��*@C�}h�5(@�vg^��[f�R�����R��P�m=��S<��<�
Y��)!'>l1h�Z��b��x@��D�a�4(@CZ�$���t�l
�@��S8�k�F��}��4��"��m��tF\X8��T��)!����zY�����Zf
���F�*����82�����)��-�L�r*���o��b�����im?��#��qw%it�S���BK�������N�@C||<"���E�
�<tV]kkd_\`�V�T��z�"��sX��,?���F�0-�v+u��,��+,��������"��`Yu�I�3��)��Wn�5*��<���,U.�hI�7�X5��[jU_Fe����������~��k���L�pol|��V��Q9U�g�q�����T~t��l��Q>{5���u��
�����N����E#52�J�������GWhTN�Y�

m*G@h�/������k���+�0�w���0>o���h��V�_�

��T�_p��(��
V>�U�H^�C
�w��mSk,\�I�hF�/ ��bH�vF=��"����t��k��6F����D�������#��Y��eK�&]
���A�F��u��:_#W���C����7�K�y��Q���y���}��d����VP���u?����Q��p<��~>5�A��K�o�P��$�����]n+�W/��u}i�5���z3�����j�<qk IDAT�!�B�p���:@Xd0j�L����cZ�S9���m��rF����G;.��fe���B�������>;"��D���c�+@C�y�����T\�����=��D���hUN�H�sqx�O	JP�m�wv����
��Y��������Gj)w�����8�]����fc�����EU���/����:q����N���1�h�����ih�B@��y�0����4/X�5��G���'/?�Y���
K�L��_�I�C�����]�3����(�?x�[w���r�8�w�w�R*�j���k8v�������(�
�
��uN�4(@CZ�5����[`��,,]��jF��c���cE�&4�
��~�
�
�A�����������s>��]
�&f������M��;y���N���l�S��(8�/�Sv�����U�k�!��/b�}`Z*�V`�������a��*�L3�7������������4D��`��S�T��������0�V'��g���w�aH�������4,�9������V~:�y��AhR@7�X]
W@�"�q���,4���1��<�I-�����r���b�|8t���
�����ek��j�,	4D��c����b��-
��@��-�������I�_����x4����9���(�W���V7_�%��C�g�U��H
�k����Kg7!/�r�I�O]����g���������~�>6�P�|/������-��{nt
4�����5���$F]�!��S���p���	��
L�%��q�������D�}�<�"�i������CW7���N���&���4��56~����
L�%��;9�.X�O������lV���uy]415G����w���Ui��
�}����
1�+p@4x>��^������m}*�
�t6��E�������:a�<�3��E��	�{����k�8s	}��_4#@���T(�
�`����ps�\��Cz���������`�
��R�]LL,��aaZ�wo%���
z�K���0o|y	����@���9�����~��3���V����Z�����O�}t
ny�g�X��X3��4]ooo�����s��
���@C���P#_�����!8*"�>\������)..���C@D�sW����0b�y�n�a��"�C���4�_����
�u�=&6���}*���"G�qx{d�4����j������3\[OA����~�RM�z��0���X�|��|��B|\r6����H��Y��c	8t��S��6r��~GQj@�e�"p�F&�����>�p]8�/��f�_j��}���O�S��D?y��cyL��nY�v�Z������kS�nMP0qu�u����5�`��"��G���0���8SS��l�Xo?��;�x�w���`^�0BvG|h8K��{3��:!"���i��0/���-G�{�Pm�n��	M\l��K���g��������X��7<�}��v����M�����~?�L�>����k0�#B"������o��]
`b������3�q�J+�B�R�`ld��I���[Z���Q�XML�9��@�l��e�0����H�Y��
_l������Sa������K;�BC�u`cn�]7b��?q��6�r���q��-�o2�\�#��~�kB"B�3'$��8J���7��������8(������s'�x�����_��3�$<afb�;����*���u�&��	��C�U�h(��a�������*�dk6kG�n4����VN+SZ@C<}��2��[��u�.9���`���.>de�v��X��.�����a^���,|�ig�g�Xv�	#3~��
���qngX4(�O_D����0�\��L6	BX4)��]a��by"��^oqT^���3����P�����-1=ada#K���v�N��e"�^���&x�T+����nrw��'W�A�����_]����G��6�\��T��S��U��?]?��*4�1��8����X7g��\�1^��c�����F�B�Q=G,��7�#��1���w�H��#,_���sb;'��-��{�U�B���i�/&�kG���7������}�s�6R�����l+
���eJf�)m����2N�����

`7������������q���
�����t*X�i�6)=�A\�+���36�,����h��(����1a������G���i������k�n�i�>C!���qG���P,[l{�
�����c�O�w����Z	������
K����a���S�;�����^����O�O���.�y����V��]r�����������p�

A������	&\|}N�31\f<�z�M�I���k=i��;p���tg���������!e&�?�����M^YvJ�_5v{Z@��P��3y�Mq��n�;�	�����s�t�k�vv��W����X��]������g�G-�����V.���pt���T`x������|��u���yw��:�I?�}��J��Y���I��25��^5���[>Yt��#�S,?zT+����q��s|���/�����$�v��K|6}����M}���moi��/���M4.Um+������8������������oa��
q>��=�� U���w����%q?tm�g�
���m{�����=�����v58q>A��)wp!*Z7���������7�pf�����7$4�CJ�>5���%�bT��0��l���(�3�7��S(�:t?�)�x���9�����c;��7�6�}���B����DFGc���(�+'&w����%�8�c�o�m�6

q��%��l�&���B}��*
��X""27�F�����
��Lq�^yq�^����@3x��A�&6\�7��#��|�y`Pw{x������L�T�D�\�R��Cs���}p�A.�`;lH(/<y����\�Iwq2F�6�8q>��sLi�~ec,���b��p���L�|3v&���G��v����v�%.��ZH���
���Q������
�X����A��}$9y��Yv�0GL��_�F�{�J|�cy�0B�.�x�"N��W��bE�|�����b�������Q���
��q����p+`���K7I����%����$�dL
h��C�����f�6c!���P�r+DE����3������ds����"*"��7���#�J����K*6$XP����>��A�t���������{k�����cG��P��P��+:���]�]>���|n�z4<^���G��������F����na����;l�<���@��_3�Q��}�T�s.-;|N�^��?���D��fMRr�A���n�
1!0upA����~�P(7�&����J����������;W�B�_�BU����������`�������h0�����<�������?��������o��5j�Kx�	����JY�s�)�;�����U�>F|?�wk���A�����q8�o�����A�/��R{�&l������5
m�BnM���g�3'~�9,��5��Q<�?>*m�4�4l�	�JU�U���'4,S��w����p��9�k�_��u�����l0��}�1a�@��)�����f��#�����NMEv���Tu���A5�&��,����jM��>?��6k��Y�[�����7���4u�w��@u\yvw^��cZW�W~$ao����/�������h��E�R=���X��/��g�Rm<r��-g!*&aQ��^������9>��P�`cY&�sI���J�B���q�&���Wr���g��m�� 42l�|��yur��C��S���H"��J���y��.�Uu�uz��3w��k��1u�>��
v������x�\�gz��R��T)%[C"p��Z�����Vj}C��|E��f�a��	N���l��7j<{p��G�f<v^7�m�[q�N��TH�L�XK�C<��7�����5E�*x_��~�#�y|�����|_��~J"Q�r[xs�����h�m�Lfx��.�^���LaY���%��v���E*C��]��


�L�U���]*7x��G����01���^ql��opl������O0����k�y�2B�������T<���=��
?8e/�m�G��O���7�D���9��'����j<��NK�Y�FQ�!�����w6��
�8����&�Jx��$��������
�7����G����}P�d}��[��9P��:�r����8����ThX2,U;Tm�t^Z����x+����mD�"���3i��[�%�7�5}������������x�M0]�.���a���J�o�R��������-T	�y��s1��G���b�Q��3o�����;���y�	N�����_�M�RZ@C���1�V��u"�G��C�*�p��u,��s�j��nU����.jQ+���'\]]�}���4d!�a��U��7�?�m����H��GN����=J�p����`nf���(�"h`����?��-'Z4����H�`�A.>XX�i��X�v��L����%���O.������!**����~9s�r��[��4�Tf��C�p����t����4�XQ�&��MA;���c9'X����%�uYj@��&}q��C�����.���N]
���k�A?��?�
���7���3���#�?����E��G�aV��8��
t���1�yX���r�V�h�9���J��� bC}aj�J�a.rw�	�7vs�
�D>��������\��;@��������=�v%!:�3Q��
��lU�������#{�1�m�{I#Cj@�������Q\�4����W~p��^�X�vs�
�{��Y�\0��EJ�;�K��~HGD��pQ��r)�r��E-�pQ���yM	4��I!d�aX���8�
������c�`Y�2"�\�m�&����i����p���
�B�`��"�B���!p�&�����^Q9B��Q�:�Q�~=�Z�n���u�h?x�8����.��y� &�e�����/[�-���-�@CGW���S�/���&����+�/1��O����	b��;_>K�*�b9�U��\�%Cs���d���}�p��E�����S4(^�\q�����_�A��~�$�����K�b��e��x
8��������*|�`�o���B�����|�[�{&�,��e��c��J�1���F���jC�x��.�?N�@�����MWva����bV
���"+�	/���4�r��[�vXwq���k���>/�jr['n���|��xM����}:��i
�\�Y
V�"��K��������q�!"�j[
��9�����AE��� �"�\�u���������x��a3�����Q9�m+D�E��("p��,�M��$�B����&�&��&���T��c{DT��^a��� S�K��u�@C��'0v��iW	4�U(D��	aKY��4�4,�%s���\�p�������6����"�@�u�&�y>B�.��7a�@�@.f�:r��6p��+!���oa,y�����<��~O��\(]�.��8N���W
����t�=�?���E.�x�1�ugcf��yK`��=�-J�A�:�x
���3[0�f'xT[��2z�DX�
�$|q���#�	j8�!o����!2[�!4:s�~���L����P-W=����\���S9�x~���^=�G����+�pW\���������6��dL(�o��h��
����u'p�����#A4��V�! �n�� �m>�ta<���+n�����O1��w�'�������`j����75��a�m\~sZ
'����*'��T�@CP�?���e�C�����F�*�
yl�6�T���&���S�:�N�.x� Q�������u���&����-*����P�`M��/�@EN*]b_�4uf����l�7������z���`��`���C�`��1\���}�����������K�����&���?����s�k�L.�x�5'�<^�C>Nj��������&��IJ
hX1�&n<��.��BP6_N>��������)~?r�;9�0�Q5�=|+���:�	1
�a��������uA�?��k��\`��B�m��M��#[{8~?�����^sD�:��	�+��48XYa��^��/�,_�7w�n�`�Y���>'��]�m��x�
x����^�=;��u[����un�������l�?���&5����p��s�{�W'G�fsD�������6����l'P1�GG�o�N5�������@C^n4Y�� f�-������W��F���*u�m����8��&c9���H���yo(���@�Bf����;��3����Q�R�ZXs�����?��AqdP�.���n��TNh^����v����=�S���l�k������8�:���H�����[�X�nd�
>�����<��_D���(	4���l&(�f.!��Xa��`4�c���
���F.����lc�f/
��vx��l&x�*�[�M���|1"��6����q�D�T��~ �����("��'�	����T��sv�$1����*	��fe� ��A���B!	u�%����N�>�;I*S"���m�Tt��+�9!��X�er��<�.�^�� x_��(]�� �7&�V��)z��o_��	L�-.,U����f�z��8G��N�A
�q��
~��m,Dw��o6�����g�9h�/HB@"�D�}�1�����M�Vb(�9�^�|��|�%�P���S,�U���w��?/�^Oz���X��3�\���nJ4�r���t*r�+B���]�c�W�Phh�a����@�qk�7�����G��k��d��  *\=�5�O��s�*�������ZuZ�;>A���xN��7_���UO*��&p���x��5���y���v��p����G@�{���<_r�j����!��^����7���m�yN��0A����J������c�����u([����Xf1��p	�h���N��O�|�"9���-**�|��0������s)��0��L��=j��������X�n�h@�S��hQn n���B��r�.��	������\��wc)���^��i�~h�������e�	H8��0�F8qo�TN��#��q?&��B.\y�?�x�9���7_�$8'U�������0�������T�T�(G{�H�����pa�4[[�������C���&s���#��J���]�5�����n�U�!
f���IY�����ma��G|F&iC
~�oH������s��/w|�1�+��L�D�����gP��-6�hP���&T)��=jN��'�	K�DQ�J���4��#� �x ��uv9��9��l�g&Nr	�A���pb�o(�M
A|���	4�����^A�1�jnT`�[|�/�w~�<_�����-�I����*p�C7Q�@,r������7�oA����� ��{�0�t�B�aD�������].���BDH�[���?�^���w��9!�p�HJ�vv�w!�}q+�
�/ZM��9o#�U

���F4�Onq���
4��rw�E�"q��YB���}e����y���cJrC������"����`@���jN������(hNu��g��L4���3Q=A9���]�'�j�����E�#����&7��sN&-���T�!.�U�,�G�N�X�f���{�<	�l�3�9�
��g�Z�}Q�d=��S��d����H���~�J)�A�wmz���c����1��^�5�{��e���&����p�����������3���S���ih�B@��##�kvD*/�Wo���>��x�&����@�r%Q�� ���;��[��>a��Z�X

�������0�w'�q���V�zE�B�����vH�R�N_���;�9��VM��[& (��0�Wi�4����/���`_��G��n � IDAT<^|9�����9^���R���1�aO.��c��u����N]
���k�A?������_������*w����TRj@��~��kz��zr��[��{ZWO�zSe�h������U���\�Z�YE<|O-�k���{f%CK��u���m�]X�B�`���;@������a]�2bC(;�O�	�-_f`�H.�����pDbjT
S����iTK�S������v�����/��� �������XX`A!���z�,����y���V�����`F%4�����NEY�i��0qr@��KT[���[T)�.�X7�w���(��=�U��b;t1�=��qA!���
&��+x$u�&@�	�8��A�<%����(/`�V .1���������a���hj	�I��h�p�������S��1����9A��g���������|��Q�2�l9Z�$�[�a��-�` �2Fb�b�$� ��+-A���<�
������\|$� ��aKdk����`�������,#��-�������F���p��ql���*��PH�\��;m�Au��B��8���7�J��)���|a�����$�"�r�$&J�*.a��o�}�&�u��1�������T�A�k)��d����%���ba	p ��b_�Pe�lb�1��� �����y����[��)��c���b��fd+��8�>�CB�ra����N�$C6/����\�]�JE� |�YXv�����a��b=|M{���,�rwK��eLreC�_Ga�WL��?/R�!�P������Ev��Ixaj�fX���q���K�D�����P]�
h��D��eeB�����O�J�����w����?u���Q�����TQh����K�����T)�!!���r@������yMDp��wfVv��iW`d�����l�'nI&���3d��m_��Ob�B�F�x?�Z���9��a�E�S8�u�s�F�<��BC��-�j�s�}�IU�'�826k���Ae���T!'���m��o0��y��P�SBO�b�1���T2I�%�K��o��DN�<�D�B�����`�9����B>*8��&��O|V�;,�����Y�C��<"���7gH�B�LICGl}�%�+H��	l�����=(FQ��{�mb����Ho�g��qq�U�A��&��8����`����/TG�/�SB-�l��?wD	���p�����o7�����;u|�:u�
��d�:(�~{x�"��0���%<���M0f�z,�����	;�����y2�?���5�gN
h(����V�K�@,�3�q��p�����l����������gB_o;��r��0���h�Qk��R��\�('+������
�)4��-�6�e���<}�v�u[O
h���+E ��!���5l==~_���"�%��R��P�5'w�^�@��m�a����Y�0**���j�#2�48Sqa|������]�^�hb��(.��3w�����	��##N
�����	����8��0���0�0�g���%l�h������kQ�X�����;\lJ
9\��hM0�vP���xl�����U!'����pU �v��s��b���p����8����~T�y~�7a��R�����(R�TA�����M!"|��K����@�p-R
m
F��7ab$!���P(�1�>*C������xmz������S�l�X��D&���4#�'�W����'�W���k�m+������@!�P%o�N�I�1����*��m��N|6��O��Lqs��e�����S�O���J��BN��}woFQ��Vl!�QI����'��$@�����E��{�*�D4�������fq�{;�	%B��8�����o	�&rb���TZ����[�,��?�p,*sv�}8�`b��	"�!4�6����}gP��"��s���]9��$�U���.���"��X�.}��2;6|����p��Imw�r"��	_:�rua_��Zu�4�����{�W��Z���a$�����{�I�LL-	j���%�#$
9����RI�h��TPp���2,E�"���!!�<�}�i�u5������	6h�f."#�$l`����3�	�����S�r��*V�>2��>J*<��>��B�F����c	4XX8P-c�Tr�U�2XB�L�������<W~j�N�)-��L����y/<�~�9�V�e�z\������a�o�72�����r��r���$�
Bq���M�'�^�.|��Nxa�\�
�������s&(����lE$� ��p��**"���'�m��X��NU� �C�;~��\NH�<���	��s��TtDP��T3X}f�����yA�"���}	R�~����R�a���@i��1��PlX}�{*Dt�K�{����io�J#P�"Dye��A�B��B�r"$"/|����T�����^n�A(X��3���}����i�;\%����i0��@�j�Qr��&���@�577��<�)��NqN@(6Xq.�����9b������U�DH������1�/����pe������1��}^rW~E�>� ��\�R
�j�M�q��H^����O��d
����
�9�!����k�%�!H��J����l�<��s"W��4$C�u�;Y	5����(S�~�^x����\����)<8�����8��
4\�����=t�F��)
�������h�\JY��p)`U����3* X"�[5,��&���l�p|9�v�*�46q�'5;T���Q��"`���&uBN��:�+E�y��|��}u�Q���;���D�B4lY6����gW�����}
���K�>,�/U!��&UJ�����F*u�R%���yT��F������\�-����klt�^�f��'�@(68rc�Z�]���A]O��O����;�_���p���J���;�0q������4z�<�b��K!�N

|��,���b���e��M;������d�H|������	��;���N�)4��f�[�Ou�=�H���Y�bztl!�	hP�B5�\�
���U�P||Y�����q����P^�
*�/��������w��
i�Fh�O��W��XG������'�=K=$Kj@�7%���
@��90��e|[�<�>~=����;\�$��y������96����;e����i�����2��HICN�4P�.�/6�*u��}����f$��8y'�R��g����`��*�N��e�B���}��:�j���Q����W)h�����9,��BL��UF��2��H�,j��gK�4�$���jH�|*=���[����	�����@�L��i��������8B���]��	�P�@D�����
K���(J����B���;H�%�/BH�"M/�EJ�����f���]��*	Ba��?���Pg�"�u�����-_�E�zB�{�+T�*�A�����ov�O��A%�,� �9&�����[�/�#�"��z��0��$���;�D^9�.�5TY��IPa���R9��n��@$�bE�?��4��~T����d�������$D*�In��3������|H
4$�u���Z���������Bf_y�]	0��TBx���K�`I���{�`�b���OaV��O��BAa*��PfTa�*	��K ��q9&"����Ph0-�W�@X4,+�6��!BR$������p��/a^��Ma�"a����	B�R�mk���j��(���!�D���]�(4(A@]L���DJ����

�����r��]��2�����gNS!?e�w0O��n���'��sKN��v"8�,~WA*�������BQ����0��pi��=�#D

s������u����[%�c8�/)3}��o�S��}v�f��v;L���kw�t��/�-�C��1��d��r���P��
?^�BC���*���	�w(�� RR���W�c����h%FV�J*44/�Y�$t�B��y6���/�

s�������P��	b��h�
�\$&U��_.M��5��1�Q�}m����9wZ�Ho(���(?�`�Kn�D�B]���f�3�]A�|q"&�r�E��{��JH����4+�\�BC�~T���_�_�

P�b-?���-��
*�!7>p7�	Q�R��~�:�{���?����

6RmA(5�<�R*=���-���B�[���`N���o��__���Pu�$�4��U��^�������
������;�C*&u���A>{���_���M����nxW�[��*� �BU�
��s|�x�0������!�����L
hp�@��p��]��d �0l����$�P���P��BM����7o)�]�<�����)4X��K�A��� �^��**j�*��O^$B
������/����AE�a�����	;��+4�aP�FXI(#<*
c:��t��?0O_#�0gY ���@�Xl�	�j��&V���!p �=��Z�cH����p�T���C{�K��&TI!�7�axQ�_��
���BC�������e��� �j��0*8A
c�s�?�>q�*4��-�[������:aI
ATIm�`�M�Z�0�o���s�b����p�L8������TW0��ApH1,�Th����e~���D���5zw���)�=������M�E��?�{�JD�����JEr��F%��@������d�"�Dj�r�tx�����S��� f����h���H`�]�ob�r�*������h��(�D�(Q��l��B�vB���}+������C�F��L���{Q����B��B�G�+%�����g����;���g�OTt�E��Rm�����&�-h%�^�V7��6Ukwg���V�;\�m������BC��7"��iS�.<N�k�o��> ��P�|O�%�	�b��;���J"�PO*4,�

�Jw�
b����	��N�&a"������|���N8�<�O����-$�>�#}6ZB
u�|�kl'$�����Rar��D��R"�;�[v����nB�"�kk��P��7�}m5�T�+����U2��.�6��%G7��N�����|N�%
�����ex���������1�Y|��_�xu�/M���`����uN�8�
�aS��s� B4T*��)!�EwnB��

5�������j��ch�O�*��7Td����G�/CC����T�`;"��9���U@��(.<�'�F[8!6W�k�\��qh���l�7<p��BU��=*4��,!����(��/}��L�����$�&�q��:*74�PmJ

*�A*V$����-�W��]_B��T�J�$)�\�0TS�BC=�.)����V�����hS�uOu���h�	O�������bxJ�����8I�!�J8�!v�@�=)%����6c���([����r1�r�>8��+K5T�kU�����Z�!�0��7�L8nS���l�6N���*�A��a�RQ���T|��j
����d�		4a��m�By��$�E��~��r�B�����y��'��C*'$*4P�@��T")� ����2�+Y�����FnF�OWb7c���J��!���c7c��.��#%[E�	1�y@P�C<P�!��[��P;V�MC�Rh��y���P5���xp�M�����7L8���%���3�.p'�!��V!�M��6C��4�B�� 6E���V�!IT�K4u��}&)���^���*��5���G	�"�U�sS�I�wTb(�j����
���-4S3(@C�@c�B�Je	j��?�����?��C�`&��L��u�_�|��@������N5���C�ZU�a�~��\��I�hrPh�t�6�V,#�
�"_��(�I��))��0��o�T����;���5Z4���]�<k{ 5�����p`�	c���5�*��0�4^nz���k������&?����O�����DG���P��"�Vo-����A�p��L��!���
�	4�:C�y�R���vs�e��n��*��hZ���<��
���4��.B�����'�)���.J�a�w���N$�@�X"V�|�i
+��Y4Qh}z��)����t%t�'6��7�O���l��"�pN�b�4����f!g�/G��sk`l�X�oaS�Fb��~�c�x{l>���/J��Szw���+�w��	��p'v��D��eZ,9��]�PKJ��������� BB�X5�B�{�D�!.4!?!�3���e7D�}
+��I
����F$������{�<&9��@�]�6����\X�,l�����Tf��_a��>B��310���M�����UE��c�d��X�<��M���
�N��/
��_��3�
hp�.��O�a�2V��{����D������E���0����\st�T�J�9R�G,�w��M(�g���(�X���P=�w���l�'q��	!�����;"�*4,d�"����!(�qb�.	��Y_�?����[��J�vd�r�b�d�p~�v�L��g��[s��ln�v�q0���pr����v����I���?�l������{f��B9��_q�C����B����'c_2��n)_�C���}��~�w$���kQ<�d�E���g����Ekb%Cy����(�Q7�r����]\�+&��VT;�!'����TK0���y�*�b�	�N	�"h�zN�|�#�e����7b�%�P}!�/D*0��'E�v�*n0������S�hV1����s���YU7��f��$

�}��q�|O�X�3����WaRP��&
����b�i��RE"b�E�%�q��.�8w��+����0���-q8�V������� ��EHq�Q���k!�{���@e��Ny=�q�-y
L���Q���K	�D��+5��;3�C���<�!���ex���B5aD��Yq��0��#�3~����(4����������6w��X�5V>��OK��a1D����%(��"�)C*��zx��@��������b���"���shW�P�����^Q1��>�.�#<P�p�(T�����
�2O)����o��P^����`**��� h����y���e�^%>!��P��&2�C~x���K��o_���@0�R�7\ �v>^��\����
�,���_���_�;�N��+TJ���������0���p�}/���	c_��s��g���24�Hh8�I������C�N�g�Klz�L�S�E������z<
| �Pz�O�Xv�7|Rn2#�%�!���2!���6�	��]�V�����E��)���9a����2����q���D�A����4�.RNv��/���/7�]
V��2���3V,+����3����B�g��� ��Vm�Hi�S��p���v�p��n�'~���l�������G���T�8��SJ�
C���S����y�������s`8aB.��-�8����\I
&T{qu��j��0�U]���R C%<�r���h]������^��n���;��n�<������~�w0���}*A�c�eg�K�y�����`�{8��NU�
B���n���`�]����qCN�@�<.� !���������$��I(4�����5�>a-?�A@�]��\`���wZU(#�� {�����\iB
�
����	��T����=e�����<����
"	��U��r�%�����jUE��u�����g4�i���)~��v�]
��a���)��}����(4���c��`>T��0B?*/l���� ��sq�^�T����F*tkcsq��,��n�5�Q�of-���"��T ��R�@���T`0�J���a�� �������D�r�	�3�BR�A�|��B��3�ED��9L���$Ta�p�j$����0�!������,c��P� IDAT$A�����D����?zw�Ex}�-XA!��y89���u,��D�A��Mp(��I�K+[������bx,�����E�3��p=g.EH;����.����b�Ph�L8FD�c�y?
-XK��t,�������zl�]��YI8EUG�7�T>L
h�%@x`'��s<'hZt�������[��1Ug��5j1R�ph�r��+�:B.�����Pu�����TB��EH����q7������j����X�'Q������K4`�	/�5?�s����
�(�HU�d

^�s��82�w�6k;��C�z��-h�s� ��v\l1���T�:q�O��#�J�o*��z�^\��+�Q��C�:��/�BC<��f��I�wD+��9	A���E5����`_���A�A��S�:@�P9���4��Ld��r�$
��K�|�AraO���_�>.����G��L
b���6�TJxt�TB������\�{�S!��>q��_�
"�Eh���x�s4QTix��6���~h�Le*�Ap�'���h��/X���
i������z�Td8C`�![A�"������x����b�C�)���&������SHK�aT��T�)��l�/��B�����r�cl�~�>���N�v���^/p��-2������������o����0��oS��4D	�r ��"�C�|���0�X�t���P:O-��</A��p���|��P[���(.>���
K��bA���C�-�5*�_�=��DX}�{	H������hkn�g������w��%�Z���-�����#dX�~?4JB�k���1
f/M��E��\�����e)����u�>A��?��.�\�E���ZV/����������w�<~w�&T��G���cC�����b
U"�_��Y�_X�Y����h]a�{��|J���@$^C���!7je��k	�|��-�4�<�D�6TZT-8�r��PO�����`�M>TW�D@�X���	E\������������I�@�+�bD8���)T�	���Gw�@����gJ$C�0
�}��B�h�7�q�P����a8�������-�������-��D���������R�O�Ny��x��||��V�� �5*Y��5�*�p�����h���
��2<�
C��T���+��>��O��	�	�R����R�B�X��h���M+In��qd�O��*7��*��S�H�?�=	M���r�-	���!I����J��[�;�=���xx�pb����V���87/l�PC)��
"|y^,��y|���Sh@�[�q^)��u�%��@Cc��%�3�-t�����}0���t�v8�
=�4hC(�����C������Rh����>U����������Q
������oT�k���@^"4���$O�B�n��4d!�A���48pC������e����c����R�4�
��C�*�q�>�2�DR��������{�����
:�n"��{�Rh�F8�����c�%����qf���)5U�GQh���_�-5�!#����^�
�����A?����u���
9�I=)��h�h[�|j@�.lJh�E�P�&@�>��+T�����%�|I�
�_�i�=fF���i��^���8��Qg�������m��X.��#�=���m���rICNhk_DL8��9���k�d�MSZ@��u�C���}�MeCJ!'��/������2�
��[Wuh4��m}�'i�	m��dH
CD�X�6!�Ff��!'R�_����i����}��4����L)��6u�4hS�>�IrB���4������h�Pv}�vT�iK��f�n��B���&���N��5=��hH����}�0����������
B#�������lM�&k���;|���X�W)?�s-�N��'-�A��
����u(@CD��r���V������Y�Nm���[!�s��e�HL�S�6F�8XZX�4xQ�q���2T��%kI�����F���p�;�Uhx����v�����J#�vSh��Ek��)@C�9�
��
i�Vh����
��>��H`j�q�;�'m���c�b�	I��e�4���A}_e$�4h��'��b��"�8[�����IR�M����
��?j[�4D$�:h��g��S���������4�)@C��5�J����<��A?�����$ �*B#��m�j��Wf$]���]
������^��%��Z�P�y��J��,���4J���L1L�T�P���3�+S��,4dz�PP<��P�=<)���
��VoU���_�
��q*5d

����ah@�.|�M�4h���(�
�����T�����-:��q���[7���8C�BCfxU�:������(@C��U�U��>z@����n�4(@C������h�:�]�A%�D��Y�r"������
��KhP�W��
��ve�A;�e��4d�{/�
�����
��yh��o�QJ2��J��z@���RN�@���4d�s�
���z�b�Az@��iW�hP�h��Kt���]�4���A}_e$�4d�{��U�����R
���e��4d���Z�4hw��A;�eF)h��*uj�h��sJ9�Y�
�����4(@C������4T���o�uv�FF�+?���4�@!��i�������7r���q�Y��4�����������1�����������t������)�|Y)���o���c�M�\�|`�)�cn��X�CCCevM���7&��1��C��H%cdd$����Y�U��a���.�B��[�����[7lw�Zu��n���;AA���f����p��3{��p&�o�9��<op0���S�U�K����V��_L��:�B�P��>��+D���1+3����[��!"���p������^�{4"��,����i9��*,����T����t��>L������I_��vt""��Y~���k���,z:)���6��l�I��{��������I������dl*G�?�������]?
�>/S����.#��h-m�O�����������N4��IH/���Q�)�B"� **�{���2�i�)*(�&���[J�{:}�I2+5��h�;y���>������%�y������9r|��N��W4h����v5vg�@C�R���5@�1�Je�y_�ehfP3s{mG3�4M��P��G�b���'�<T
���]TOf�2s{���[fm������e> [3�K?@v�#�-3�o��\������]3��|�]3����4�9�|.U&�(��:����u�4��|N+g�b�_�^��|���.S55�mk@4|��NIi�
��7����S�k��k��~95�f��h��Of�4���7�e�����e�����e�}���f>�������f>���7�|.s�o���9�e��9M{�����@��g�VN3#L�46jj@����o�P�.�TFtt4BBB```�"������HA<����+����O�������&M�3%e��������3�cKPP����V!�������,����p����$��jO���������e��<��e����{f��s{O����;��o������Y�����3�|.�\!��w��3������|.��i�b�=-�i�<���Y�7�|������&�2nj����/d��-���R�����2-���]���oR���}
h2�+��<�����TC�j\N�NK��d��.�Nf����]z�6d�N������Yo|d��.�{f�2k{�<3�o���k�s��F�f>��k@3����}�V�m-����f>�9�7M{��G�V4|�Z���W�!��R��I�`�8�5u,�L 5��iI#����5��s� 3�j�s��\��R���:�i6�3���Y��f>�9��f>g�R�zf�)��o���k���~��+dHJ53���R��i2�L5 ��lz���)M;w�>r���(o������yd�	�f<}L �>�"������&v���?���%5I�������X�>>>��������v��� 2���cD!_)BR6G�,L�4�N���,������P'+}�D������O���*���L�������:�=�l���H7#zz1c}f	������<��@dtx�!�����Se|K5��QFi��s�B�V�w�����uTy�Z���
�~1q���l�p��Xn�����n&��Tl�����-3=�On{W=�kgxEy��GK���4�%�0jF�l��Ddn(�b�ji1��Y��%zfh�g
�[����A3�����+�*<����oQhJ��oacZ�����E���(&����4���u�s��$���j�UL�`��v�������To�43�o	5����s����:I�����H'�����
����
���i,��@�j@
���0s��$�W7R?�"�w$e�D�K;�0�9��
\�6�����?C�������;_�S>�M����)���S%���IK���2C(Q�
�
\2��&���Z���k�J��e��A����t��oU��M
�]7jNChH���4	�M
|l�~��?p[�Z[�s3���}��L�R�5)���i\���~�[ ����5����{w�[�)CS��������.c�7�~�L��k�(D�?MHZ
,��D��O�Y+C����~pv��!m�
��}�^_NWU��l7X������y��D���8�f��U$9�u?B��I���#j��o���Qh��-^S~��
��q^�F�!}(4h������
���|k�4@���qMy��5�����
�����N4d�w��-�
��
h�OJ
h����R����{��A�����5@CF|k�l�
��}O�5@�����-;�)4�Y�������t�VT,[
���"��Z3�X�I#�%Zc�����1y�<<�q��i)3��S���_�z�.\��Q>��������)�#�m.�}���������j@4d���4@CJZkZ(44.�>��0Q��L�����e�������s<���V��ENm��A��pv�oh7l6�j��������v<���V:u"��B��wn�
C��
;�-
�1w�!(8�����N���P�k�D��y��`���C�d�'�6�0��l�5�N����mW���C����"x��9*-.�s����9�(6�n�K�zL�
b�5�e�V6x���Zv����O��~�h([�%�Q�xm\��
��>T������?�- nzK���X�=����
�;rj
�����^[xm��,~R��"}<�wl,:�����

F}Z#h�Q�������z>�,�0��lT+�*rZ
?�i�%W�`h�Z�|r�Zv��/
3}�t��V��ENm��QU��6�{���|����A�D�������O���Z��^S?�5�"�?a7]S����{
}���U�G`��]���z����5Z�0+�%��o��*q<��;���X�%86<xx&��:�����j���w(c�-I��o4�WwD��Er�
"_�K�i�qL�v_�������O�SA[��eCF��@C���2�E�o�������=�"Y�T�"d�#(����������v�S�U}�������&�u���r�e��_8������9�J7��-.�������}_���%��e��i
4ja�'���1�]F��z������?���7��R����������7�����b�����9Fn���z��

����k�����
8���Z�n�+JN�����N��g�vm����9�O�m�"���O]H0?m}JM��f&�L
���j��2�����<����yK�"[Kt��\��������]�D+>%@���:�������O_���H��v��B�K|)�������3��������5�2N;�
�!%�5-���M*��cWQ�P��K�AGW�F�~��5c�m���{����P�:06���@CDD4�
F�f�A��#�	4��[����[G34���������5���I�_Rh���7����/�&|/5�IV�_H��gI
;l����^msN��b�HK��S�y��y"Z�������uz���kpq����3��^����aM���U(�&��}�a�f<�O���ta��
����r�7��X6k��n�����_
���W(B/����dx%�/%��.5�5������-���M@C�.��a�D��L�<ry��022��s�;XHn��t�j�������%ycKj���y}��xpG���-�;��lZ��^"�E�\��tI������h�����;�*Y`Bj
�o�����1�S�h���@���9,H���
4l���R6(L�=9!5�IN�)I��@��.P��)����7�`[������V=�BU����(���$o�����P��J����.N�������%`U�$����.��r���?}��F�Y�j�n�8���hH�od��3�
�/���������BBB1�wG�<{�f�(V�KVm�BOa�a��3xu��E��7B��U��QB���R_�jV���{x[1~�������#>zz!:*�yt��m���c	�!�
������?��[�N8U+�I-AcE����
YM-���������S8�tF����.��tr����A�;�7KE�
Z��������(�|]�	�����> g������N#h���
4(��^�z�@�t~(:"��K��z��UA��}��=)�|QcL���-h��3�SX�����7�lK�
��������g�b������w���mK���n�q�)�SMA����Xu��
���J	�;y
���I�|�8Jo����ci�A5J�H��-7��W�X�����|~:rE�.��g|p��&6,]mm<q���+����%���zk�m&M,�������B�/�ZY���P(�Q�t=h������Gg���}���@��{���>����������
T�a��*�1=���l��j3b��;�����c��pz�\4�>��C��5Q�Bshi������)PV��k!��p��[NJ�����B�@�F$�%�(��������J�Z���`EC�9�jf�~^�Pe�Te�����]A��U�7�����!�t�8�	�
6�:�]M�[����I�0��*��5R~nj���/#�������O$�U�p��AXX4��
e(YL{sn-�
u����)��9WH�1o��v�uP�l� �L��O�y�������p��vL�x�v�a����[�;��J��]�v"x�����<-6��1b�*>��2���F��`���+��������[����"��@����o�@�����B}�0���}]#]�����M<F�K0r��*����jl�o'_��3�b�3x��A���0-`���h��quPjR1�<�/����Thx��)������j�4�)��7��,����S��`�����(2�����)�u�"�,;�$��A��j�!��f{�=�	�y�PlDAQ�xw���9_G[d�s����{(2�������O�����:&L{��uT�X!�'�k�"�
��	�C�T�w>�I��p�S.n?m��1B�ad]�����=b���c��z&z����W�c6�U�"��M��p����7������(1�0�T$����v9jf�����Pzzqi�x~�}�������6�leg����6nM���w�In��EL*�P�Fw*ZMf�y��(R�&�T��'�����S��x�@��� ~72�@�F��g��n����

M���y�?�%@(8��a��	�G�1��{�g8qt1����?:�������W�Y�f������3����%z�Y/�w<����e}`c[�qF�����eS�k%�u����z�Y�7��@�6l�4�k�P���+�3���gY3���<�4(�v���+��}�����W�sqBG��^��-��5��%�{�\�!��)��Z:|����J����
���!�y�!�Y���{���a�Z�

F��l���� IDATQ0m��Y�|t����CUx�9z��!��;��mE�B�?��\hq�4o?�qC�{`��_/[.��!Lt������:
aO� ��%	�f=�k�5�&���	*4p�5����+�����U�!���X ��Uhq��(W�l����(wO�9��pf�F ��R:��!h�1D<~�v
�k��+2���M�������'��~�*�6���v���g
K��|M�����j4����/���{X��>�c)�+�}�/g� ��9�BM�v�%�Vs���KoXb��C����j����7��u�G�<������?(J B|�!��m�c��cT�r��!���`>��:!!�-s%L�T'�����/a>��<�����Y����cl��9 �(�h�����p����~\b�G��9*0(��A;@�j
�l������D��Hq��� �5u-�l�	������\��M�B'���?C��7P�}��G�o�Th��-^��%���\P@J�H�0�9���6���~�!p�]�"����
2]�'oW���N5"%@�X/t�0&�����c������nx��c����Op��D��w��_��s�V�����M��v��Q{��`W������x���7�\���y���#9,�f����v��6�u},D��:�����8����ec������>_YT���
�2�����uEq�	
����Th0f_��yo�5���$�L

����5ic���Q�b[���#���{�����h���g�����o��v���e�MF���+���k6���������F�fc`e��}T���?�#�c��=����.������P�,f\��u<���~�%[��}�/d�
��,��i_���pn�u<����M������5x��$��k���=Z�(�M9�1��s�����g���}�<�a"�4(U�����9`���C��*��O�f~�Y���L�������������1�w��P�����l���
��5"��#x��xm�R���� �"vl,���#���&#�#���#��^�|60l��n��7|'�����wA��Mg�a�cw�?s�U$�>��_[9��1)h�����u8��F��#���C�X~�I��-��Hu��T�Y���^�;��|��ro���x~�����[a�� ���OoH��qo���!"hS�������%1�!��/�����~U����B~�:��)h��3�+���[6t[!*0��]��4?��M��2�^%kD<��Pp�f?����-�=���b�
��!"�~�Nc��D�����mm�������6:0�.E�����p���������Th=�
z���<��
�B>�,�^���u�����q�M�,f"!�U=!���0CPX$�?��� ��l8���"A�Q�W��79�A�7�a�]�
%�~���^z��KLm�A�Q�"�����b�R��?�w�����
�?����������5?������������\[��m�-�����c�gr�4�=�|��SO�a������5�����X���{������K�{�%�kd���5�`k���aX�!7lvFc]���G���7\�[Mh��6�`�5/iw_>��U��W��N�U�����H�W�`|u����*�����!c(y��z=!�+�[�v�~\����(Y�����;�h���u
���4o/#kq}�,���B�v�!"$�[����#���@���+�t7�����3Q��..��1%:�!�;z�����s�\z�W�s!���uqci��C���x��Li�\�a`�����2�}#��8Os�"m6���<��dY/� gYX�c�9�w(��a�g2���{}���Ql}�49��������-��D��E�n7BR�&4X�`f��l_:8z�6v_��CG�����B��Uae���VL���<���)�\�(������g��3�	�m����$���B�W���Y�6���+���8&����91���$�f^�/��f�/�������@��R��������]Hp���������%&
��u;�����G6���	&��i�R�>x(,���t�~��%�����P��^m&\���Th�?s!�����=G g������,�����*�[�.���7oqw*��=; �E"��K*4(,�����<e�N!d���D��s�x�J8���g�ps���o:Jr���h�2����y����K��{����H���B(��S���B�a"?��=1S��s��2�p��yX�����p����#���+6�@�-p��.����}8=~�'/����?j��7��6�BC���q�PA�����Cn���J�������a���?��|�����
����y'h8q����}�B��6j���V_�9TF��e0k�
4)[�����c����I���@C���8�9q�z.�<��I4/
�SE�!}����!`����[�����n�s�������a��=����70� �'���s�t��^D��`fh�������hZ�<���It��tb@��x�����r#$��������Z�.�E`8�>|��5����hZ<������r�Ia��� ���yp��bQl��H�O\G��y%��������hV���������;�����l���KhPr�����e~g)��oA��S����.O�����8���#�P.�E������9�Z�I{�ynG�gG�#��0�����3����\\>�U�
��=������p�:�u;L�����9^<T�:~;6����%j�(J��Ymq��t��f�NR�PEJh@�+����������[��x��������h��PB	9����&�:��nu�D�����\�	D�`~=,[���=M�|}�w3��{�f�8�p.�?|�B���9�	r�J��c��e����Q��.�r���XjUQp��VM7V\$h�
k)����@[K�!WN,_ �NjHh(]�.���
�9�\n�KW�a����uN[d�f�z�n�Hy�6py�����g!���
ok��2��������� �����#��$�����A�T�����%��C��<$w�=<oz����8��������+JQ�����\�E����������%l ��Z���N���8��y�,�"�"�����^���?����~{Bx (����jV�2��!o�<]��@�Kt��r�Jx�Ee0���c;C	2<^�B�������ox�_�7�A�^y�|�+���������*�����;v~�M��X(x�D�[��6�m��(�'��/wn�e����}����u��u�
�*[!�ybw� ��TA
.����,Z2��c�~��p�S.��;������-�����Y���?JN(�Y=�qCP��C�����]U�����E]�
�[�a���X�z������
vy����?��������9
�����P�R;����'%�p���|q�G�����Q�j'\���PC����OCCp��~4m1��!`��mx��*\�]�}��w���'�b9��������L�X�-�q�e���G�" ��?n#����A^��A��#%����$�[5XB
:��$Ek�.������P����$p!��w�an���oc�V��P�]��}��
�	4���/xSw��������>jH���cK��k�7�����f���"<��cf���aP�y�P�a��OG��kD~x������
&
;A[i�eS`�g
���	2��Y��yF��g�r�h���N�R(a������?���1��������;�O� ��
�k}�b1�Oh�22�T~3�AQ��.��7xC/�Fo���<~SC��Q��s����<�
�|��^!0�9���B���W
�t��T@�	��u@��S0hSOJ�G���P�BN\�Qw�G]n<�(�������_������^;��y����X��;�3	4�9\B	�=?���^���:����W�~<�S~n�6{��X�����+	F���+����7�P���G�$�0����O�A6n��,]?�9���k���K�rSO�%!�AQ.��gG��;��d������g�I)5.���e�%� `����<d���.���&����3�s-�.4�C'�1�n�I0�g�q��f��7#y�fk���(FZB�����C������&,v��U�$`����Jy��:G��g�1����m%��������\4�����>�=�6�?m�a����\%�Q>SN�PR��zTC�!%@�8���/���3��n���`�����#���������6�`�� ����^]��
#e{�0j�/�3�-�C�������8�����h�`�t� ��7�36�]��"��oa��;|�,�x����(<<]8����K���n-Zc��}�����I��j�v��~�G$p��N�n ��Y����	�����d,[=cX��5C$ ���'��B�
�^ �>v�6�X;]<,Z����<h\�mK�w<:'�}��]@�f9$H�
��t��q]b��K.����K�f��WB�.�@�	�Y�����l�}z5,8vxp�}
���#���������8~�/�q�.B6m�?~g���\����/u�����;�:����p�lK��
�{O�xX�����-��_����&��P�h>3�����E��W	�g�oTs�y|����Tv�;7�{�#0�1�����U����?MX��evA����������`�1Do�f5cl�����NZm�_	� x�q	4v��KHA@1�sc�p!��pb���r[�lP�$�C�����>�@C������W�t����y���v)*��v���M'���<����hoj�����6�vvC��	#����C�W#7Bw=�^;���N9CQ?�o����>t	0H��Y�mg����`�����A�tvDV��jcB@�
�Tt���F����<�.���[�]@�9��?@��Pv/��#/�S�c���7�2���N���Z�������!��c/��PD��D��S�2��@��m.��4�������7|��i�
���%sK���
#,��]��������l�A�C��������G�����C��	,'\��D� �ZT����>ou���6lx�1�{AzxGW�+Ya �n-�tC?B�M�0�6�����I����B
���:Z`A�����B���3���-��������F�C���F�2����}��u�U/�L��pxy���DQ���(��)�L��Y�s�,:Xa�H�ZA��q��o��aV�rO���!�����U8�u0�+���G!_]#�Nxv4��������Rn$rU0���`�,��!����h��"���(��e�"XV����
B/��2��G�V������2�]�|Y��h�Av�NJ��`S���KHA�u����1�@	R��4��	N�^T����j#���J����"���v3�z����@��>D���*��	�
a�E>������Dj����ZE���}�v�0�(���oa�����l	�'Y4T��=����,������+�u���[6!��9��j��kV��
��r9���.���;�<�,�y��k(��~;�s��U�*�x�����8��/�'����������*�}��0/^������0�/���L�v�>�	g� G6;,��&��\�`���]Q~�L<���N<Pt�@�X�3�poI�~�
/^��>��|�`^��	���E�+Q��F�n���n������|i�4�'��<[r��_�� ��BC���Tj8��\1,���*X������hP��~��hx��|��=�VF�V����sR-@���{`��5;���TA	��������x�1K�L�7w�?N���������D�82����E��
�I8uh�PBI�}�$fin&�!*8��������j�k@�u7��Ryc7����~.���
�4�[����>�Q��m�
�xO,h����
�h�����/*��o���"�y���7Gn�tZ'�����'��?��K@����tY��He��7��J����f��`A���UKB��@����Pl0�M����_���������7���2f�,Ix4���j������n�J�O�d���/y[ +V^�$�:��U�[K�1��\\���C��"&��/�[���B3)��%*���[�p��n�� �<	�%����O.�ty8S��4Y?A�r9������Va���p���PBa� !�R��0;r�sS��������k�]���3OQ��&�Tpxo*AP���
�2n;6��$o�&5$4D����L��-�*(`����S!R����p�G��U0A!{����+�U�����q�W��jo���y�&�za��`�������a8~&�s]	1�����?�R"($J*+<~�r
�S��"D�r
�P�A�����X�
�QA"DB"�A���������ty`���� nF7m4����p��rnT���	�f��&v5�/��~�-�P���mSX*4��c�IX�b0��J{���h���J
	JT���u�b����A����[���;��J���O������R���7�(	��+�;3b��T.'����c��Cv%�2����a]���T!���#�����*qa�)��A���y�"�'~hP�=��\G���������r�:����a~���"TY��M'�hpiPL��pw�C(��0��������7���e\r��2Te	0@���� �p��ME�"��yF���3.�?m��6D��<4c[����j���c_U	X\p���}/~=�[8�6�y��VR!�	aD9����a�97.��{
��>N����n���
4���X��tU���TO(�����.�����6a����x��6{���a����@�*7�#@4p�F�������L�����4o
d�0��'���o=��&��7�����u
������zJ���s,d���<�aU�&#�bI�*-h��TZx�2$��uD���akWR��/�^��E���$���4l:B�s��oxP��e�|~]���g�T�@�x��nO1q�)�zy�������@��$��#~
h{�
��� 7;Lj�����0,W:Yr�g�X����!:,~����U?����D
�7��U�I�|����xM�!��U*7��=��������?��$o�z�>

��������v�(b$5$���9w�QaW��C-q�%}������^��y��b�e��%yh$B��	��0��q�S]�*t������?�J@�o�*��b�Qq�e6�G��<���2Pb(��!�}
hPg7��(�5'6��������EW����m��dv���i���37�-�b�0�b-L>��r��C�q��V��pC��w����m0���X���%�P7\��3!T�X�}<a����7q�P�:!!�A��*�Lc{�P��s��g�	���!���m���zEy@gg.��`��4o0_��yu,	-}]��?�:�I5���5W��x�.!��a��4"��P��n��P��l.�*���1U��q���w�)�YBI�B
�Xt��<:h`��W�0��.|g�e{#�4"���sn��������� ��z���A�P�p@���hs��w������~����������B�@��#w6hC�.}����K��V�n�m]���b���}�)P����7'�9@��5,����2�]��d>��QEA�2�  ,��/�Z*���]���#����+����������=t�\5��M#l7b'���V��:�eJ5�-��!��xyo~�C����n�T�X���
TD��F�CS�>�o����qL�UJ�: IDAT���o��*�*)T��l1��=��P�����g7�����NK8"������O/���E����b�����k��������o����QT�UJ������~��'�b�R+�4���E�| T�����B�]�������F������8y���	&�Na\*)�QAA�@(���zms	�	B����z��
&����������q!p��X���Sc��y�K
��+�����B(-�2"���
T�	�c#�
C7n��V��sY��Iu�>tO�B�%�	�vT�tBHe����R�A
rsy�E����7��+��`�CmYV����x���kd����op��������z�2�����v�
��s�:��z�Op0z���>�]�����*�A������u��K%��7�u~�{��W��%�,��r���V�"�"]�S/	M�Q�!���t�eD��@�^��A��0��~-�"�{r4� E��GP4�G5
��\T��N��i"�y!�m�ge&�R����o��� ���3�J�R	A���\�[�Og!��E�>b,�T.'B���{]�;���T�{A�:A�C��\k9���0�B���Fg��omy�K�.k����a�����E[|��o]�� ���&FD��:���*w�O�|`O8\
�4�.x���uW�0�UL�����Y7�����W@*�a��i�y��nQ�o�9O����V�-�:���������P���a�z��,��#S�V�ZA�A���4D�g�z��Tn$J�5���>�#�X�M�57��"�u9Q���TR0�� d@2�#x<��D�p���?�I�'���!w�w /�8�6�%�(�����	O��B�I��|��pg��TEP�v���2X�u�%'Lyi�2�BB"M�.fx���}��USX��T(`�R
yY��V�@� �#�=�F[��M�Tl�w�^�� ��aS����g���e�Z�Q�&7V�9��o^c��a��d*(�2y�b���cM(�7
RAZ(4�al���i����7/��71��2��;���R�K5�^�V\�����&��g�'4������]��xw�$���%�p�y7������E8���
��,T�7+R�

��fP���8Tu�b\�1��� �r��Z�,N�l��;���.C�_�`�+������#HE�������||�"��
�s�X�
5������Pi�|�k�����M3	4������.E~S���z����b�����4��z�
j5��9�
��]��z�FB������&������,Z�q�z�Jq�/]�1C>��8����,_V��\��GQ�@�PJP9$h&�4}��R5B�w���u4�C��8!>!��u�%�SF���W��Q���4�����P�`)�pc���{�1��NM1�`�������%��r���89�b��hH�@��Yy�������}��!��@����pV*4(��F���I�~	h�ia��y������2b�\
��}�%4��/����������3Rh#�"p����/�cTj�������_�A���P���!B	q��R�����LA�<~
5��v�/��q�5�Z)�P�7g�-G��}��!!����r�����	t�{���!����]'���Ym�	3���!� �%���C\��-��}�F�Q��b�Th�z|5*5@w�����P���,�����I�0���c� �P*T�a�4H��zz\@Z�ic��@tle)����r3L��p���:*a�+4�
�%~VtT`U�2�
*4��B�;D�P�
���ts�G���|#��p������P�*�o�r�bH#D�+n�		?�*C��L	E�B��^�4LbHh�Bo(zP�~���RQA4p�^�X�a<o56���Sn�w��qC��?

J�b����>�3&��_�&���
Bu����N}@��T.s��A�W[OU��W��������C�@W�"�Uh(:�������w�B��
�aU���d������p;�F�4�
R���	��	���N��
�3KR���D|���E�8���(���%�l�{P��?�)�Zu
��:�����,Hu_x�������+�-<Z�����Z�q%�u �U������Q�B��@������y�c��P�xI�!�yB]!>��r�U���A�����|�,F������7�z�p���Mnx\�D>�#����u�<�{���hQ������[��S����j�������p����P/y�+5CR]N���gO�F���r�8�W
B�A���JU;PM�0j��'�3��%���c�6h�rZIu�2�������U�/�ZC a��qh�jV���(��7��a�%�U��
h�R�3��M��TJ�!� T�&�-hh�v
��MD�*�%� 	!�~���JT����^By�9�]M��g�TvX�z�t�Fw4����L�Am�r���^�-uyh(�����
���Z�����U��I
z�y��b,�MG���p �'��)�)4�U�I�6��O����B�QU���43]u��s�,^����8"��2�L#� ��f/���SO�9!�A���n;�]�Oxt���+U�a�8�R)4����Dx($Q��@�3������;4F��b��o�J(4(�V�e	��������ySW��5�A
��7��4j#T@��w�.!j�e�+��hQ���^�GP�Y�!�K�P��V��c�z*4t�B�F�g~9A����X����J���
D��QYs�/��M���t=4�f����@��P��.!���H_(�@��G<l
��B��J
J0�GE���bA*2Z�z<���gc*�|�N�I!Yx�"�Tp�
h��q:�.�BY�$��	�1��B���K��=Y6�F�Y�b���tq!>X��|�%�`�K���@	����),(C,
n�;�QC6S�`�Y.!T@.��np
���VQm!�6�g

M��-��"0T*4��~�Q���_(4T��>�e	����O��-	����1���#����@��������+_��<�o���2�	��+$p��n�C(4����Pw��|�k�N�f`��A�W��T<��B]A�j���H(��/�3l�ThPA���i�$i��*�G���'��c�/�_��C"�O��
�mU�����`���g�y8N5!a��(�����E\��K��m�It��T�c�p+�5�!~y�[�A��B���~S�\@�=h�

q��P�)�P�n"����B�p�;y1���R�A�z@Ees�29tf�m�:�������| �K@�J�*�@4(�WF�&��������@5��	Q��z��?�D����)0b"�5���c��b��.!�By��B��31�g�B]	/�B�gc�T��"_�_����C��*���|�� T"��v"�����m��v�_��� Tt
ZJ� ��/��$h�IxA(4�!�&��B��wP4�q��%���w��]R*4xZ��B���
=���W��@eR��-��G��B���XM�9���.wz��!d�C(��G�%W�V���'$�p�

��@	Q��B�a�
/�/k�eg?�e];:K��!�����B��=Aqp/�D-�"�UhXu�S*%��3���

���p��"9�	u����P���<����T[���i��p� �r��?���������BEO]�]����r7!l@�g`$��3��G�r�F��#���/U� ��.6�>oQB	K�|�O��U

B�b���RB4��r����g�>S��$�q=V�J
\Cx	'C�nQ�JDK3o�e��4�V3��� �76��s8,�	3�?�5"F����aTh�U����"����1��/)4�B%�e����PgA������|!H�%<���&�� |Q�}L9!^\���"T��
h��h��G�/
e�B� T�&Dh(��D���.��i���'��2��qk��t��8T�7u�����f?$����G�}�*r_��v��z��^�p�Q��y���vp	
P.�\����W�[�G,�P���p91u�N�+^�����Xk������G���������p������0�"]ML�?<M�����)�wGO������*��]
"�:����kV^�6��F�*��t����\T�L�a�|8{��;
���M��8���/��91

y��aY�H���T���Pu�J-z��W@
���h8����]�<w�m���B��=qo�|iK)�����,�q�4�^����x�m?F]RU����1�����1K�����O{J�
���o������Qe�h033��"D�J	�f�%�8����v1.hl�������t�W9A����/���]��@��O�M"����K��&U�a���hR�:e��!������Pi�M
$T_ly;���#%���m�~&h��s<���]�RLe�K`��+4��U�������e����mT]?�~����u�Qe���|��I>O4���hH�@�A���T���8��nQ�X�A'Nn�H�G��[�I|����Ir�>?���o�?}����'|	h�����.=�|Y�V���3;�������]���#p�g���}�Wb@C�|9����<��p�!�*c�Sn�LhP��>����CwJ/	$��P� obp�!����\A��y���=�����N'X]����p�7l~>z?�q��;�!�!0�$&5��
x����K7�U�n/��+��W�����=��� n<5�>zt��k��~���@C�*�Q���<0�{�O��x����(:��
�g���g�VB@�-C������+A��U�vB|	W�>A���	=C��kpj�l��S�"���o��(U�+48��E}��/������,�.��GNH���;�*������:P�.����~u��R^A������Z�	;�Q!�m����T.+�,�)�%����G�"HQG������M�z��+=�8U!���"�?'�*4������Ar�����cI��*MWA��"�!�~/E����P����Am%n��m:-�� ?��CB@C�,����Or�����8zbe,� ���q��p�����x��6�V
����A}s#�����l�����]gR^�
��(������`	�w����I�Gn���vJ��
�i��SSGB���G��1

h���Pn����s��C>�|��������� =&�n
��B��xs�y�[�������B���y�q��RD����vB(�A���F�Pq���`A�P����W9jf��U17V� �pn�ErAx�.�[	��B��p;��i�"/�ys�g'�����9�|�?�"CH�S�h=��� �(1�0��������-b������D����P��LU��9����TtPPr���{��	�]��@�H�Y�F�z���^��zn;�)�*�QR�5�r�����7���c0oV���E�� G����*!���7�J�(.�q��~�R�B�=pCU�	v�	|�T�A���M���e��4��-����J����A@�n����h��9���O�����ED~��xU(7\��m;��z��;��B�@�� |��]���L���m81��@C$�!���nrS}a��)(V��t�!���������@���D�����u�����O��)K^�fwy�q����,�1h�&����y�����Epc�����3V�A<��4����.�YC869�����7�P�����������
�g�!�����7kAIk���n�E���R��qW��`��������*@��w0����y���w��Q$��5�.%|����r���Lu����y��Tu�S��{�!N�d���D���������	B�]�)m�1�2���B�����T��,q���w�X�A�f9���r������s����|>���y[�nx�$|�9r��=����
�h��7f��De�#�]c�L&��\�o����������W0��O�R��`mb�QU���I�y�r�z,� �U�.,	D�]�<w�7��&D

?����?�+
��C���2����/��My���
��P���T����I�f
3���/aN�V�8�+����d9\�5���/�m�a�����X���`7�����&}������m��j(�
"3���>�����
�A��{��Ph0���t� ���w�S��.""���?�>����Z����c��*�$`r�
��W���S0��	m3�Tg�*��%?Sh@��Q�����9ie�d�3����D��7�I	b(���>����G��/L�T�
�!R�AY��.\B��h��CO`������b]�h���u�%�b	�7�6��.'T@C�
�Q�D]y /��5����c4���� gv{��[	���{�:1�����$���
c�t�n�������a�`���T](.�D?'���C|��z�b�S�7h���n�_����X7h����9�?<-U$J�����H�����Ts"`!���n9>l�6	T���qV������h:��
o`���tM��z*�tY�MF��/���5��u���B�WW,���4�[M�~��TI����u�o.�)����>��P�c��1c���"�|�n�X�7���?�3Z�2T�}�=
%�ft�����oS%��W����	�b�n5�!���5_^g$�%����

� ��S���53]����C�������R�P1A
b�-`������(��Y������R�=h1��P��UX�"�PM���g�`Bov����j*�������)A��B�X<�o����M�����D���60��V�	���%@���lTM�5���p�4u`��Y�����v�E�����Bm��p-!�$���*C��	���#�a2�7��N���Q�6�z�AwY����v�M��92�g�~��Vv�u����������*%�@B�U�%�@�"��#��	�3��9�J �:y�d�hs�h�0���W!�t�I���
�DzUr!������-
<x���������O@"t?�98��M�i���W�A�+�h�q�M�BAp!�$���A
!����@�jE���&�+��x�KH.��G(��B��N(��� T�e�p1�^6l��4�����������Y�:����Ya�/�. ���
]?�����>�p���D��)��<\o7�U~��k1��0�I�����5��1�?��px����G���
	Y "'�@���Q����@t�h)�B
���g�����iB��
�{~u�P� �p{�y-u1r�[^x��)�������q�Q�B��B�A����xB�}�m*��3N���C�T1�J�=�A�vT��#�>����l�]�O��k����`�8^��k��u�����M��{���_E4���"o�|��W����>�P=!�_A;4�tJsx<����t�IV:����C��n*�E��"���{
��J�TX.-D?B�W|�!�[vTC�����>����E���4m�P��9���������J0B��i?:�J��]�Mei�pG!\k%
g������7C8����*�)T

�Yr:�6?]KD�p����q
M�
1w�J���@�A�B�a�����\.�z�0�l,-1�E+~W�q��s�=w6h�N��%�������v��6m1fk�R��w�"a#c����Qu�yG8{x�+0MJc�����:~Hhp%l���z9'q�.��+�
�����1���C������^�h0��U��B�6�>8���}c�AT;��Zt���r�u�Zbty9u>����kC���o��{5�79��K���2�' p����RQ���=���/��v���S��<W�C�M�J�� IDATKq�����PLB�t%T��C\�4���V<���:M�����,���MiM���(6f�]�Cai!�[^�m�W����>^��gN���k`U�A�_g�,������\��_������o<���C���E>�!)���'C
��C�bQ�����Y����i]n�sC�_�%���Up�!U��8���F2i����U����y�&���p��p���4|)���R/J*M���a}�H������j�k@Cj�Z|�!9yj���Z�
�hHN�N,MB.'K�����gzL�5����������|�S��.'��+!�A�|�2~J�����[���t�&�
]C	�u������Dj��n^��F���c�	�#�b��y&?�@Cj������r"%�(DG�M@�����zi�4�Ey�:�����������
)�;��O��Dz10���r"��b)�����o\7�-_�ja!<�$�!\\�EH���. ��|fQ�B���/>s����<����o�o\�)*�x�SB~s���(�4H���E~�,���H��
))+=���r"�vl�'X�[��E�p���:@Cz�?96�u9����4:��"%�pw=�U|�F��l�J���V&�9!�!��IhH�r����4$���!�J?�gH�!�T��M
|��
���SZ�h�
)iC�!%��~�j����
��~�n|�Rh�
�������t���T�"��!-�-�<5@���m�����O�mf=�uq�UP?��Sh����(���
��M��
����S'ub�@R��kW
�k����NS�����w`U%m�Kw7��
&����������[�v��kwwba���A
�tw��3��, ��������|g��9g~�o�%Y���V���V�8�����'���T��s���Mj�Q�)pL(
�3�4h��`b3�#��H
}�]DC����,p�H(
0%�S)�����Jj�� V(XnO%
������w@����B�~0@C��Ph����Vh(��JoZi
c}h(���������
e�������4���*��


%�B�y���
y���GZ�I���
��_Y�G����/y��4��RB����wL@����B�~0@C��Ph����Vh(��JoZh��o����]�fe��P��KJw�d��4���*��
@CI��P~^, 
y�R��#
��Ch����blh(���_���l�_I�^J��E[�4�}��H�� 1SyF� 
�d�P����� 
�wt
5��, 
��7��t��4���)M5����B]�gh���!
��gh����blh(��&
i��e��JA���tBUA���B��$m44�SE��Y~���

���q��QZ3���4����������###�����K����(^

��KqW�$������'����CZ�o�<����&���]��z���.����\iYgW=�����������a='��+�+!����}����s�8�����u='��;t%��+gl^�kv#����T\B%�F@Ci����$�����\��%����R25/|.���$
����+�*c9H��MX�	��2v����z^J��MZ�������.����U�x�A��_Jj����@Z�s��K���r<==%4��l�Xp}�6�*��F���!44�����3;���*K!<<***PTT,K��H]cbbx>jjj���d"��^V����L��m��BCi��u���OHH�T���vY��wq��W����[Q��<����V��{\�������4�w6���&��]�s�
�:�Y�K��MX���\Q�?�"���{Q>CE{��������\������,����em^�������$9����,��Kb�

E��B�?���B���_�\�����7Y�n*f��������
�&_)����wdd$w�P�\9���:�Y''�O���D����y���K��M���4���u��79���T-ixc���t���9�|~�s���"����s������.����}��������>�x�s� M����@YI;A�Nb��d$���u� ��QF�d�(��0*6E��\�r�V	~i��|����f	i�����.�������^ji}~a=%��7a='���:����t�wa='������p5�����>���R�9h(�u*��R@C��x��I���pI����,^�e��. �L�p���|�s�z���w���z�s�y���.���s��9��Qq�%JC9�<��A��_Jj��4\��x�{q�Ch(.K��P`@C�DY|q|%�v�)����Jz�_�A.$�P�0�/Y���3hl��)��������>$�zV�C��������TQ��:�UO�G�g��Gi� ..���R�r"))�w������G����w!!:TbyEF)))`�����rBw$�N�������xY����(�6�<��s�$++[�E�hyE=�K�q�����4�;���������wf�����(���&��������"���7����G���<�SV#����4�� ��n��RSKC�U��~{��QI2�Aq��J�z�/W:�qJ��fn,�Z)�H��/P?d�(MI�	��O�Qq�w���
s�x
�aa�s�ZZHP�\��
M'��^�:�D��Tkxx��EK�}EI�%�ef�g,+����_�[|��+'G!8�?���1�����
"~LW�Y�����=^v�7+s4�\��W����V@U��P��B_�B�h4�	����%��U��������H�(<8�S�	�l�x}K{��P:��{�aXr�����Acx�D8�$e�;^������e�6���p(b��~��4[V7m#�_H�/���IJ
�iW:��<���	��������!������53��w-�V����Iew3����7F�I9�?p�KM�NX-�xb��ONio]qqZe����d��J��������$�1n��	bBK�Q�F�&����KM^��XTGH9�RU'�2�[@^v��o�{D!�w-hiE4TB4�y>+�hTc��Kn�.������[�ah�:�JS#@���'\N��+U��TZ@�N�@�4d��Pv���PSh��4d��P�N�e��P{-s��������h(�*
%���}@C��Mi��4~@C�m(�Pr����}q�,(4�!���vb���|\l�y
m��~�`rB���_���u�,[������o	
��+N\V{���<y@P.��Jf����=:���Yz���a_���O�_�eS{�!���Pv��4@C��Z�@����������:|b}���S�.�c~�x>s��-T>Yo�������7`��
��?kMk���"*%
�M��<q��"�`�myy^���XP}A��-�DE4�
Z�g�������l@����c�z�g����J�1r�yG�]�����fx��g8���k#�����{�
�N\P����
��S/7�]^����8���Q�D��c��v��q�TgB���qk�mwq������y"d5t��?��2���_��JKBI�%��n(V�Es�"k^��Y���d2�I�B��Nhg�����
4V$]��X�����5��������jB��/��&A�Y�|�GN�
C���P�U��~�!�5�����4&�4��QA�����U�����Rh0����M���;4T�q���<��E�4p	��;o���J'����h�E����#���s+[p��U�I�-E	44���W���y��vJ��a�����~e_���#W�<qa���Pt����?�rd
�bJ������1Ih^�'������/�D�Th���A�����U%�y�?����J�]�J;����*4�5���!���������'&cy�M�J�"Kh�e�q���R�\G�������)G�C����BCM�N�O����:�������|��m��x��4�B
�����r���1q!���m���_�U���(�C}9�k�������&��W�������
�N\H��O������	#�p�D�c��U��F.+@��~����ND�������Kl����t���'�jr�HS
3�7��c��J�1������5��@��5�����W
@CY����Y���x�6�:s<����v�@O�t������C�u���40����&���������|�����m�-;�4,�7w��*�?��aBnh(;A�!�h-I�a��JL�:�o�/89�	H���)�S��n�_��t�&�%a�������/fr�A��h�,�u�^�������C�Z����� �d��`�x�g>
�@��B9��R�~����	M'��Wj����{��
�'WA��TD]�V�MjI
I~����j�E`qABa�S�2�K����	@C��R�@C��0�|��u�R4�z�~�('W0���,$umd�G�@��������_����4�l3n��`b`^�@�<�&^��{4��s�Qm�ZDQ
zU�@��|;�8� #�������9�
Dx\?��o
�GN	%4,j��9cNo�24��K.?'�@K�@`�4
��/���3����2
4t�W�.D��(��S���xk	,+�*q����L�j�����������G8�$����&��&��X�@`�$�y�r�4Z��K�l��*@���<��wi����4(��ba�Xx�2�y� E�4�0��
�����P^��)�$�S���H
i�R�\���v�>L���C�.!!!?����BKS5�U���� /���$L3�J����
PSUE�VMp��}��p�����E#�:x
q�	�������9��i_)�A��pRR26�:�hxL*���h���w�z�4;����|����v584�-���P���@N@�����of���2�(�PiH#�������V=�Nr����o��]$z����j�0�A;��������O�zM��dk���h���
}������w����IL�u�5hL/�d�;�������NtH�f�P���c�^F��Q��H�����F�?��+�����I7l����QQ�"�
FDR��OU~����x�m�`���0R2Bdr$fZ��j��H�3���g�'����O`&U��7Qo��`*'>�@����J�6�����hX�YbH�!�����}��:��nC������@���p`�u��Lm�R����G�K�C+�V�@��{9����A��"����
���O�����f-��3���%����R��x���������O�O���o���
��";�|]#\q;�6tt��53,g�U�+0��ry�����\�Ka#���@�P
��Eum�����?��TuM���q�)���Mk:=-����#&��uZB^Q�\@����4�t=Sl�r�u���ejI�9�TfB����oF���x��Whp9�
�-����`R�����r���y�*�P��4nb��������\u�x�G�T��+KEk����,��������_}Pg�)T���4m*���|-��-����)��5!�*�����n5h�+��?�v�A�	����2,��<da�@������p��X4_W.����2*u�!�V�A��*u����z����zuTa=���	��R��a�x������|������$���,���Y��=I��3��y(������q]�L�A�ZC�����[���e��zZb��c�X�>�uG��{�w��4�/��c��i~��i�D/�Y��3�k��_����C��X^v��������A�N%�Y����EB� ��TN��5�QVGJ�th�1��HRPe����4��!5<�=����""�m�����!��|����Y*���@J���=�D(�X�e�h %�3t�z��})�8�Z�=���_��>�"&�&�<"����S�T�9�#i�����_��!W�-���	��nCF]��C��t���[��
�r
	o���w�r�3��nno���PNQ��=�p[1%����.RK��;�7�s�y���� 5:��v2�dY�QFI��lrfP�����xg'
F��HN�����������8���J�6��%}��f�����G��
����;#-&2��P�S��n��U��F�=/�.�
k����@,�2(5!��0f��jP��
��ew���Dd+�@�}
$��!��[~Sjh��I)\����R��Pq_!5,����lw������Pj\���x]��|���<���I[Rh`��S�������'C�B�M� ��g$>��?W�X�������&b������Ph���_��.����?9(��B��{�5P���F��3��{�x� �Avt])����5'����<�M���@�V�C\H,:����p��
���y�������:������[A��ZU�_������3���'���@ol80?
������'_\��3zV����h������F"�����F�1��\���x��v<u��q�~��)���u{g���BCK�����\/s(ANV���p��f��}��inZ�����=0m�*z/�uR��r� Whh`��������3<�;og�[����x��C�����MY��|h40u�J�����������/��w��#��;E(*(�����.]Z���;��|	�z��,}v��n������,�m��?���_���@%�����;�������	���
w�V����	���|u|��4(i����e�&�#�����y�>���U��P���]������d�<��x�-foA��'����M3�B��c����6B�\���&X8�B������%��j������n<����
5}S���(�����U�J�y^;�{��x�r��PT��}�������*|���J
l�SP�D��'�����J��T��p=�������)�SY��T������D���aR�9"C�L��7�v���������?�k�9TF���<��{��YM#hn�o�p��&v�NmN��r��M�B&t����_��~6PS������6�n��=?vmP*4�~�9�i^]�_���> [/������Ud0��:��rp�L��o�w�BPD*���B?:
�B@X*�<�J�A{�D��	v������Z��Cm���A��^'�8����jJ�m�H�p�n*�q"�N5W�����b0���=(|
J���y�n�ShH�����G��p�i<Ns��u��!��#�k4B3��j��L*Z�g^��������6�����^�A]3;���G�����-)1��7Fd\}���`��utK�C��,~�:����8���}�S�YPUP��["E13�J�o?L�aq��Xr��l2u��4VsRh��l����|�������^�A�q��7Nh�����^<<��V���i��p��b���������	o�+��=K��k���]�����D����=��������m��c����e��W���"�U���q]4�7���wo��f���>~�����5�'�S�7<�A�-4����V�z���i�II�4�q��������
&�}CO_����}�j2���4o��y����o��P��#�4��O'�wX@u�C`�;�����;�}�*���)B���L�@��/��N���	~O�A�
��n�T7�4�:�|��Etl������r!o�;�����q�1D�O���Nv0��+����hh������������>u���C�_������ \��<������
Z���y�>���=���[<�6�������#�x�~�l{���}���X�)Lh�T
��i�N�5��`�7��C���U�����xF�O�fjhX_��=;����A�������]B	J����Ms��sX��	�>%�
�6�����2N��)�(�,oFq��z*4�dp�AO�N��Yy=�w���W�^�t�-�B���@Ck;42���Xx�,&q�� IDAT�T����m���w?xb�}sv{���.���B%D�=�g#z����h�����u,Lu�p��|�{���#�X;t�<n�=@��M����3�r����/����[���VQFPT,�\�
��`���S��@UQ��[��Q����_X�*��
4?{����x�9���|�1��_0��=����-
s�_���&��g+vo~��!\�a����G+L=x�,+���%�W.�p6������]~���(,�D��ar����j�z�����~�0��UJ_jUEHL�hP�v�&���1�]#v���������hTE��w������!�,L��2=k�����
�1$�z���4��C����k��^u�h�� e���u��1F7������#nq0���������?p�]���
�|}/
�2W��,
eh�t�.L���H�T�_���!��m�1�����B]����R	��y���{����g��V.�	DL��s��������(�7tND�uiQI7������v���	W����KZd)p�������c5F
��jU��b�.���4�	A���,�����<�� ����%�6fP)��-7�d��
�6�����nVqA�����5ohP��F?Z��tC���%�2Kn�c�����L[A�a���kd"�_$��"mX!-"
�V���I
;�w��FuTR��7�CC������P�QFk��\y`D��x
�J���]/���s���7�����-�%�K�B��3��z��=����0V2N/��s^���:��)��$|�����L������r�6BGQ�C������2���	;m;<	{��
����
m>�r��
���PaX��w����ho�U��b��T��Y��#6�l�����h���rz���W����Ri�IN
����e�k<���>�(�Q0P4������F��P�!'�A�^\9��7���m�>��������ey>E�9�pu� h���mj�<:{�Xt9���8�0���
eM��1w�C��}�I/�X���ihe���X|�
�����q������u>�Q���n�A\[9&���M��1!��Ey�]����l�:��^��P�������2[N@C��V�7�=4*)!.0	����c��c�f���t�6�������`��\�&/��U��1�P1�����EP���N����fwli=..��f�)^l�Vf���{���1mvQ9��IM��	�H��@y�#m��{���h�����H����^Q;��m��|�C�@�����)�o�zH��N��Pw������f8di3"��h��Xg�ZP"p�
J�[@�bM0�}���'�R�-A
�5�|y+�����>�o���l�N�Rm���m��8�j4���j!��
hXA����%�P�8L��m���C�-���m�D�xf���A���3�W�9_�W���%�!��J��o�C����a%���tE��X�!��9@A	�O\�t������ ��H����#��%#�R�Uz?&�=S��di���S�?a}�whH%���J��3�BN������E�w���F2�DT��
Y-C��s��z��vd��,��wv��`#�f����9��BPQV$�{a�vf��#�6����
AR���4g0����q�������]�M��[�1d7��uA�#r~��4bv�����Ht�E�
�������!���������5�D���P��`�8h�m��g��|UC���@��?00BsZk��B�`
%�;��y�~�@��(��h�������j�w���!��
u��VG�I�LE�iLm��P$���!��G���V���!���}%)���&/��Acr���'��Kdmo��O�.0x�)-��`@>��5Ejp�7����Ur��-e�������5'����fp���w!P3TC���X�F�B��u�L�����h4�9��	Mr7Q�[5<]O�P>BA��=����$��e��?��i:5J)1pzr#{-��3+`�g��8ta-t�s�m��w�
MC�����}ic���m`0�|��M!,2Z�z�zt�6��7_�����p���u����]�V��1�K���0������h�<x)v���Ck�����a�_	;O�1�W��?c��)���{�gZX[5��F�z�8!Vh`M�#8�!.�m�0�.o���+q��V��1g�&���3M���k��y���>)��9��-��;�1}�w��O�a���&�����mg �e42�%��c��
����a��p9�
v�`@������@�U$�ao_���|��?���
��J�
����K����������
�w�����z���c��k?����V��m^��g���jTt�P��$��Pw�l���A�������(
X���0��G����
L�����H&P�
^N���^v����He+��v���~Z������T��n��t������-*6���V���~�9;�a�4�����
���u%���`��;�
�������I�j`�97�lT	_����=�
�����}(�l�!�o�oSs�}�]�-l$61��az�Z<�TZs�jVR@UZC^x�:U�M�w�[�c��H4��L�>���{�5Q�qt5dak�������uY �4w^������R��P�H<x=
��hc��p�'�xc]9���J������y)��*�
����s/-l9���������8�z�_��>N^.hY�.6�;��U���I�.��4�?9�;,��t����Q�k;k�.����h�MG������p��E���&�-�Y�B
��RX�w3���G�j�q��ojJj*�����Z[�}�/7�_NOCMkT�����>�!'�a��8�wtI�'��-��u�I������u�J���1�!h�~2n]\�}�<�m
o\.��e�����`�x^=9EPC7^=���������E�Y�si-O>��O��o]D.e��
40 �A��^��C�����w��fo����L���������B��r_@�h�P3�B{�_�8
UU=:t�����7O\p@���e��3���:�{rA��F�������t��a�A=v����������w84O&&�����t^�+N�)�Pti�'.\_H����8�8��'��Kv�u}}������@��i}oXY���]!xB��P������4���
�/./,����M�Ptm������j97�*�����4���m��S���4���K�J�4��Ui�$�����������4����up�Xi�p ����p4��q���@�'t�

���{zw���	4���?,h��H�\*1QU���������{�����_����,]d�_���:�
A(rx�&�j`���!�+ 0�
�F�a��0:�����`���06�G��Z�^}�kc�?Ap��S��MY�7dv���WN���Z��md

-�zv������N%�k��0����
'�m��]��2����;�U�w���^/�~�B�<��6�C1��(,;�
���g�"����%�h�PV��A�1f���]Wi�N�f4z�����w��A�.��ca�X����%���>��4�U1�M�z�z���cO��W���u�9����Fr��;}���hJ�8Y�q����rFQ>M����X��#QA[��~����V�o���/���=���gu���@�-NO8�����_�%�D0�Y=�����p������zb��+4��x��A
�b��Due���`�����`H�2�:�re��*�����b����U4�����1A���yA,�$�4H���/����R�����Gll>�~���/���A�:��
�u�@�Y?��p���ED�����`gt31�����Fo^�H�r8v�^���XR��4���B�s-aQ��7}�h�
-Fp�hir�����RD��5��M�0{�������f
���P�C(��Y '�A��	�Lh�X����t��kAAK>���!y�,k���I�i��w�G)���Ar#E�}v@���*��V�'z����/��bn!+��J�m���@r
4z�����$4D$G`��}H����f����"��kk�F]m�i!��/��r�B#�BT_���*Q)Q�d�	���FM���U�(����h`����#����a���s%\�]���TP��������e�6���c��L�*:�,v9�Q�����Iw^^M���z�+@TQ���/g��j���wc��r��z�;!w8�����
b;8�;s��� .k��=�����XRk	e1�uZ�
�Ff����q������\����qD�fk��[pc�/�ei�n��x�O�T�rB�NH�������%��fPSQx�g���y��3�m�0��~=�hRZ��z8Q�m�#Ww`R�����TT5�A'���>�����7��A*�,-�����+�iD��p���fV��S����@

U�4����tj���
x���v�~`n(6P�	����-KA<��#����8�#�D�_O�T�S���5�����lMRw��,��N��hP�S.G�9�pc�;Zm���$OR.��b��pm�;j��S/w#��?_�����s��tM��� $��O��Pm�
!��Bw�_t�\t���RY`'L3�<��mv?����B)+(#�mL���B����<�6M�����'�
*"����
�8��_i�hv��7������|c>�����5)�H	D��DRQ�G2m��Q]� N�@c6��;�,O��Ks�d5��h^����^
A'��A�>
L�@�b�Le0�A
�V @���Ps�Op�q0@@�Io(�!_�H��&�C�I$��`����1�Al�(R�P0�CM�MoK�
?�tG�'���@���r���r�#������RK��5����{�ol�l���Y��������:0�C��V�A��J��q�d�q�%��A����U��y�_�g�"H���
��D����B��)"@�@�{���*���>�����Oj
j����H@�[p�5��
Wkn{D�s�=�#�^��/�I�A����<)�W\���HY���CFW�+(�2���D���!��G4�$w)�#�4P��4l��a��}�y�68qX!k{�.'T��C�2����l�Y���o�� �r��m,lw�4(�(�~zc������������/\%�i����'|z����>��!"����S`���� �@�z���
��n������t������np0�
t"���=�e:�x=%�����H4��$�<n�����8D_�����H�a=��?����VU{DD�B��V��w`��h��P^��`e^���[���xB���9��j����8�2�_���#=MU��ka�;O.�����O^��U�@�&�M�+S]3���q��r�N�Fp�0Ey%,�6�C�x�r����#�����g.1>���O�
b����n�����-����y�<_��x�V���g�#������_����)�����qR�0���fV\��
������t����-��l�M�����L�D\������Be��i7������>�j��C��J�7�c4�~����`n b���|����������zT�<�+H|z~����]G���n�����q�������X�f
;�r�^�}t�o�LO���V�����=9� ncA�%;��Zy-�ng_����zBSh�(������s3L�rI)���]J������wrh8�����Nq������=?��St�# �9�����7�|h�i����F�
"��N'���C��xO��=�_�8��U�k:�������p�%m�Q\o�$�F����&�e~�N3�����g�Sd������_]�F{;T6U�M]R ������<�f�h`u�E �U��h^�:Tk�:�h�����c�����y���a�#7E�ax�}�6����nO,<=�.�B�5��k��VshSL�
�H��B�*��I'����W��qQ����������:��Wi���t"7�R|3�Jy�9
��5���X��|$��`e���?�w'�����hI������W����|#�
���#��&����P��>j��u]x�v���>�����?xo��3P"e�c��#4P��5�hPV"%	�����H��:�_7��D�q������������������hPV����1Rm����$����0�b K����t������w=4�����>)>�zw�F�<)E��
���>�][��Vq����	�X�xP���sRt'%�wW���
\����8Z6����Whc�T�Bz[�Ab���������`���@o��Le0���I�x�o��HH�������q���jxx�� DaCn@�#xP��[N_� R%xa%)0��M��w=��{fe0S]�@*2]G���7	3$��5���(G� ����3��h� ?K7���w�/0��Z�4o���^0���	h`����DX��)�u�DXx
���a�p]9���w��T�O3���UQ���>V�NR��o�
4X�aD�������w��r5h�����O���L=���y���2�
5�W��v��!��_��E�&����x���^��[��=LtOP��:���9�V��i�X�mkVFW�j���=����

'���OH86���{��������un���8�O�.'�d�iH��s����A�4w_��Nt��w!�v����I��K )�����!p%u��������L}����0������	����<q�c����h��L*��?qe�����4kt�
�_�nV�a���������@������~�k�2�e���bf�&�	'�'E~����`��.�$�q0���*()O�o�O��:Ih��%Kg>�P��)��g/w#�\M��v��=���c��!X�a'�N�G��j�nd�������aLJ������I��[RW9�hH���,�h�����^>��13��h�X������N��	���*'��bT3x���s;!��2
r��������3iBI>������F�!�AR����5�Q�����T|H"�6I��
���A�����> ��{h���^�����u���/��5�7�������2���q��h����O��}r,���'��N�
��_RZ�>�hppD|j<��J������2��������a�e��UL�:�$�����m`���7���h������+.\B[������B�X��A��}L�p���������\j�%��w��X��}���.4FT"w;������TH�_��~t�������m*jw��
����n�a\]>���P�1���K_:��Bf��ixI��u���=:i�����>;�M����C�v�����+4���	u��xI'���J���u�#*�m�
���N���)�8�a����v�e�>'����;�i�}C{
4����-)4\#�Mr!��P0��!�~�E/q�*4�����Lp�Whx�?u��4")4��C�a�xw0����G�@���q����0�6P��bpD�V��
������!��H���3�����`��$�s�$�#�F��\M�A����c���{����
w��6�5;������N����H ��T?D

S�@�LM���g���LA0eu0�6���E}40��r��
B��U'���'9H�6��B����MD�3Z�0=Q�f�����,Rz �+)�z���H�}C��O����d�
A1� O�Y�j�r5CG������O�Z�9R���[&���N�����6�'����H�\��N�`��_�'���%��n�����By��5�\d0�!��f�:!|`h� IDAT��O�3`WhP%�b�����j�$R�����@C�~d�7Wh Wl�6�E�Cxa

'��2������?405�h�F�������u��6����!?��4�E�qhA��	�����@4�hH��@����%s� C�A�#(���.)�*4�����O���E*	�� z�c�t�	����3witR85(�T*p����^���N���_b8A40 �	�^�3'9�A�u5$�"���H�����9Rh�P�tRh��\����+��6��7�+����\�d�� ���������� ;d�t�H��9
V�j���7�����a���<h�5�)4$�����������fm�|��`m(��6�P�6���s7��v��O'�n>>��m'�����5r=w7�BV��N{���(\���t���
'�!���tp�t��#����O��;�YX�}��H&q�����1��\W0e����%(�M!4������`�)4�Z��t��_��\U�+4����x~|���9���vc��n�@.'�=8J�vR����L*��Y�6`���\���S��A������+X:�(��;�����	�aX���}L��)Ud��x�X�o:�C$Q1���"�1������T������\Q��@���:��,��`�"i��j�xs~����Q�y�0I���I����}\����� ���Q XPIK��U���E�G�����l4�	b����JX�@j�P��X�R}�v��}$z�gi��>�P/�B���=�q�I\Y���Bc�0�����6�}|�~?Hn$&���d�j#���H��`��

E4kU�nzbF��xIs��
�F�)P�����M�q����m����K����n��kn���`���q���	�����<��P�d��R�"<:�hsq7)&����L�������b+�W�E�xC���M���B�
u�q�~&S���T��NN��"St`�(��#9��BO�N�����0n?�!;�!���7���5f�������>R�*,�p��z���=���Dy5:5��4�v\��\}sM������T���B��c����r����s)ShhY�N;A7���w�gE����C
��b^BN@���<��-��j���%C4t�
�/�Zt0l��j

[��
r�Bv

����
Q��Wg`�4��~�gg���h<���N9DP���6�wL��qy
y�f���{05�C����:R���������m�����!�
"(��������D4�M��{Q�v?8��U�[�~������@�	8wu,-ZreV���j�hHL��0ST�I��n/�uyJ
L��
m���ira]�W|`�����9��XZ�J���i
���B�h���/}DF��|��
�Z38qe����Hy ,�]�m�����0���d�:���S�����m4h�"
N���ggM��$r7�BV������k{M\�IJ_���Ha9)4�%����O��suQ��=��`B WB����XZ1� �D������u	&�����:�����0�V���<)3h�8�����k�s�	=Rz8'���6
p��1�6n�W���@{Ab��)4lyt!�1�U��x�k�e4�m��o�����
�XR^�6���JZ'G�aP����O�_r��kY��IU�NC���cT�\0��=��k�}c{c������Mu��������"p*�BCC�s�1~&���9r����]������"��������b

N�|P�T���X=��\jh]���ai�v\���C�b�
bw�.h`�����XLe�����M�b��

#�����5��]@Lo��H]�������:��eT�?7s��]��@��f�A
����[��z�jc�]I���+�m�80����_�}>��T@C��q�����022����`���T�P��6|���I�$s���e������Z������[U�����#^����Y�L@�&�s�L?o	B��H7F�oW��p���<
��F���a@J�o?���*Wi��
L��9������@����P��]B�J�r�Nl	�:f$	.������>z��#�v�e��^��qs�E���Dv^��	�5���/Y�>�d�[#��T�F-�y|7���J����(C�h(�(;�a�my�0���mDq����<�W3�'�x� ����c�M:�L/��!+���N���u��V���,�{�9��&�F�?y����F�� )���k`�{��6�����a���(��!��UV�MyM�����t`!'���]��s���-��+ (�*��q�$�d4�����l0Q6�.+��^��8�N���
t���� ")�$w<�b<c<3��)�	,&p������!w��%%������K����`P�Y��x��2��S����i��g40%D&EbN�9p	w���IV�������>���\p0xb��Z�01)1�t��@CN��osx��N&��rB�N�4����c/��)i[��
$c_�Nk�%.�gG�F������z.:Y�v�~D~��m����=� ���k
����q���o@���M}�������{�g�%�8w��L]:�^�6US)_w�CO4������K�O��S������m�LR���B�N~���9
L�@��*�����_Qs�q:�`�M���~X�W�qE�3��(Yh����	�4W������D<���@
}����H���nAE���	���7�F��
�'���d:0�� -�?��y,*�
�
��TQc��7$B�~����x�3��E�R�:������Y;<Y���B;k�$�M.F�IY�����6�^�
I�<MJ�%��]g����)*���,0��+��A����R���=��M*�M�Hr?�NJr�U�������B���-s� ����<)�(Wk����<�l2�Le!��kh�}}���N�M���C��*�3Z4NlIi�F�@g F����%�Mj���� �m0�!��*�8����!#�K��2dH�D��+)���_�%�b%k�D�YG�
I�"����/R�w����y���)��C9�S���9�������9����B/��;���@�����sI#�o/�4���f��V��z1 E�	��)4��=����}����@C�~T!P)�AdKw05�Bs��q���+��
h`J�1�P#e�8�4;�%5���L����������xJ�Ic��x2�h�J'vc�>��"���t�v�$�`!� ����CY����'���`{�xd.'�����*��hp��L� -$���k�H�]}��J�-h��p
6���!4�7��&�T@7?���\SdTh�����"�#���8���������|e��$+7�$�Y��5���1DAi���������+b�>��J&U�$7���!#�B����@�F*)F|�ST�}�����zD�:�]0*��C��P(�!?�y9
f�`=�T��t���#��E-%�X��+V���5/������<���V��U��<M|X<�v�����H�YCA�����(�"�)���
��n��AK��7o��x���u�rP�40P��`���}3�
|�x�
���6���$n
��[�6w�p��!:a�Cy���b����%p����-�����7r���/sA����h�mG����a���>�f��QLjL}aA�
-8���6���t����:�"Y��p�l����X�q(w+�J��������@C���\�"��~�y;���aL��+B0 c������N��r�3:}�T"�����L,�w\���]����Nz�K���s^���|���z�q�B�W��n�<��(y�*�~�o�~��1�^��4���F-"7`�|$�!�
��/!w3xNh:e-bC>0��{g@YK���`.!�
+��_CaN���:N���?�GJ
������p���7G�!s�D�,S�yF����i��

7��D��s.U}�w:	�fx��������U�.Z�����H0�J�>�}/�oD��MXJ�)_��}�y.��u������l?l�r����M\�W��p0�)Q�z��S���%�)4�!u�f������3l��N4�4����������w	�"7�����K�0�A��#me��p�T����Y=UD� �)g����uy�o�������a�Uw�~�<����..2��)4�j����:�_�"w����r��R��&�D��_z'���"�>��Y3���N!3���i\m���"�TF ��f����j�)e��N*�qeg*ktg�(.G���� �is���l���O����:�?�������]�
��6Y�t	���s[��;'8��7�������&���H�kF����5�8|O������ 7l���r�|}�4x����>�,������L�"j��@?4�R��� ��C'k�#�n�
���^���WA��h�l
�}nA����S,��	���n�}�k(i���):���c�`n����9
������5��|l!�*��
Fj�I�I|�t&wA��(�����
���ih���-8��C����W�q���/��D�����@Rrxpm
Gz��~Ft�|�uC���JJQ�V�������"X&c�+�`n���f���\�����4()j���|�)0���m
���X`@S(`�I����D��`]��x>���Gk
T�	l&wWn��V�gp�R�`y8=X��-~�����@������b>)���
N]����.���E�.h��q
��]��>��X��c����=1�;�6�f�:��;��R+$����PRz8���������N\���

F���T���M��7g�
���'�F���H�b�5P��#""�Hy"������������7�F�4��q���xw{�����I�e"�t`��������c�	�b�h`�[��'|�j�E;r}���1�~�� �n�{r}#G���������w��r%�1n������
����o��cT&sk��9�����h�X+�^J(���Y��)�%H������'�,�j���-?0"������HZ�
NtLHM ��wC�U�ad�&�En&d��Z�t�M�����c����:��?za]����&:Z�b`B<^|���"�H�~j7u+�:�����Wbr���@�5��S;��e�K. �4�o'6 ��G�JSXL$Z�h��!N�0v���8�h`�����2�nq��}������y:���n5r�C�po���Mp���w�2n�oxFs�6w�N������d@Cbr*�����:F�&<��F�&�C��?C�����aj�61�|��*s��U��6�#��#wQ�E��:-�����Z����n�4In�l���
���1�]#���p��.�p��E����m��g��Hlv��"��5S���
%#Rc������Gj:�^��+�P�D��{Y�����}>c#�i�B0W�mk��X[����]_;�c�e�=z	��0����.��~&(4��\e.�4�1�a��c��i��v6|�-]��d�����9���i�!"�h2J�*J���
_�q��E��b����@!9��d�����G���H"���9J�]��~��!���1dbh2���0��02��@r�!�9Y '������P�2�A
2n$�&;�� yg�����������g@���D�6ft9���;9����--.'����?'�����0��$�P�z�����^LUA� !]h��+H:dt9!����_�v2"�qPk������U�����L5,��ft9Q�v�%$�D'��~���r��\�4����	h(H~IS�� ���4b�0�SVT���XR����m���S���M�����3��a^����Cq����DA���
k:��4��6^]W����e4:�"��{@CWl�~��Da*�=��0yw������Ka��+�P�rJK��.'
S''0��������}��0�|/mn@CQ�YRy�U$]~V�A��g4H�����h(��g�]N�\v$T��(��;q�5@Ci���K�� �nr,P�, 
e��BBB���F��4�d�	@CIZ�������mi�Y2��4|;:%4���e�������D�;��5J^������y�Gq����;��7���G<)V���Y]��U���P�I&�$��q��u��.W[�w���C�>����<��$4Tm���B�T���syQ� 
��`��@C�6�������A@SUh�lW�	$��G����9�Px�@C�mX�r�����7����<����{�������"
��k$R1h��$!�Eih(J�J6oh444$k��&
0����-�����\1V@2[�q�	E�P�V��G�Dh��z��i��)4�������h���������@�����kh(*�
����8�\re@�4���J,�G@C
U
�	@�4d����RpQ��*@����A��e+T�[@Jq���j��GC	����P���na�P�� 
���4�����@C�G�4��B%gh(9�G�� 
�1��2�h������Ov���������;���6����%EQ������c]�w�uw]{�\k����B�@0QP���������.����Q�����gf��o����=���^f����D�9�A���g)��x�Thp��u7�f��J:i��fX��0����&���Nq��w�P�������~���\ge�->>�g������x:Uup��t�x+-���(!!����Fvd��1}�;��5(7�=��.��}{�~NMM���R�nWe[�7��r�eu�1~�w�n���T��+;��L=��V�
nY���{f�������~�#������rWZ�������g:���{�=$��d�LU�1��og
�_Db�����^���|�$SuU�M����k�F�'���+�����1TZ~��r��������+JoCf3��|���B�2[t���L���(P54�}��e�W(P�\�4+�����e�!��<�+Y$���������o%
5�w���~e���73�9E�W�k�7�u����J�r��R7oooX[[Kn�J
hP�$2�N0���s��,B�y�����/lll��o^�L
�4���H�����2�C������"##����ncZ�I���=�:�I���<�I����.�)����I��E����.�s��~���&�s�����b>'=�9i������[�������������Q�nQa���������[|0Io)>��R�����&�
^4@GGG��T�5���Ky|�91�Sb7�'����&���+U@�4�]�����"Ui�@���_rk�WU>n�:��/9;�Kh���P��A�CX@�,���-\�T�N�U�����#��Y�3��fy��===hkk��j+��aaI�r_])
�3e������eL����"�$�T�_���3����*
���*���]�����n�"����������]���*��"�mf����&eg~"��M��.��\���T��=w��ob>������)r����=;�!r��R��|.g��r��e�+���Z� ��M��9e�������#7�](4��t�u�), ��;�}�#b�|������!'�N���J�����:�	�i�p����w]�'>�|N(ne}���r���&�s�;�.e���&�sb}.o��Y��T�7�~�0����&�]�Gg���84dl#q���7@C�q
��$>����*��b)&�������T�]
9+i�*o�X�����	�@Uz�/b\���������1s�b}Nz����_�|Nz�.�s���	�'g�sh��Y�(�������L��@�&1��;=�rj*p����'��\�:�I���<�I��� �&�+�$svAPU|K���ic� IDAT��|N�������9Uwr�R��|N��r�S�r������A�^�!�Y�
�j^��K�u���
�}������	f�����b\z��~��x=�)�o�ua��=�����Obb"�������pY������}�tClll���Jm�L]X?����zfn����������F�nGf*/Ug�b�����fWZ�nfh��������������M���h}����Ni�o�-�1�ZQK����L-�)�;{J)�7m5
�����SB
e����!�]RB����^;��BHtBr�|N�o�o�n�;\v���=�Zef|��z(��9�Luu5�3V��IQ������������%�JJ=�iF^D���9]�\)/3��+��B���%hh����l(1w��m9�������cP����}�
�����"������l��/����`�>�.��R�+O�K�,�!��%��f4�i(q��@J0��l�c_�t��1��o����DA3l��>��� ��*/<�v^>8��b
�`c�rTd�*lf���_e��"aaaa������5"~l�!g-*JSu������C���Y�����O���By�]Y����6�c��@6��1�����T�^��e��daF����J[D9�S�v��++���
�2���9Z;&S�B'G�������"4<����m��<���k���"o�@��.�zy�p
3W��������]_Y��h}i��J6Z �L5�*W2K������qRD�
i��1
�*��<� ��5�,���%��,���f�Z@
y��I;���@C�yoDM�����������oV- ���Z0��/�����������b�	�A1{�{���T��@C�����%���If_;��}���,�@
��3r"����t=&������;P��3*:��rB����1�3��9K�c���<M��q������z|9�~��M����kU�uJ�R��N�/�����{�i^u�WR�:�z	Y@
y�a�A
�x�PhP�Z�{����a��-�<�w��k���9<mA�����~��V�Q�)����P=����fL�*���N5  ,��U��AM��cP�����}�����g����
��]��oPx�BEhR��y}�����Xs��B�����rh(la��5����G���a��o������r�L�'��_���
��{��Gv�����!(<k�1T����Z��a���L��\�}G����*U'Ye�	4x����[��!$2�U����=D��vp�4Q���]�l����P��w���)#��U��Bu�<vZJB��\��dG�t���4��l����_jz��vV6���k"�~�v���~R�m	���:{z�)t�"+[�A����G�� �3�B���T�+#��'�^*t_Zg���
����oe�������c��=�����aA�L������6���K=~?��X������k�4��P���P���D�[��T�63�
��������B��w���N���y�3�Wv
C��'f]��:$�:��@�L-S�%��JTh���4t����
�*���wr
h��(����	
}cx_��.�(�}
|��C��sy.����
{!&�~�N�����^����L�����L����5�������p|��mP�L����}�+D�

	�A�y����hr�� �j[��g4��v��
���o���|��rJ:�y�������n��S�������g��T�qx��E��[@���7��Od������`?�<H�
Vn��� �=U�;�d�Q�{v
�������L�!d�M�-��e�`�k�����}�`2��B�	����������������qC��_��f���-�>|��kw��K�$+@�*�8a����s�G���wx�������������k�ah�.���9�
".�@C�xL��h@�"�*�E��{�jih�M���!�`Bf���:��C���Mw7<|���Q24,4�7.El�b2��
?7�����q��%���]�|���Q�,?�v���W�E�b��u��/7,�m�tMN
��-O�[Zf
LP&��E���=�`����~���y�:�z}�t��qA���u�N�l�JI*@��{�p.h��A�?�s�
��VH�u�!1.QG�A�]��\�@C�o���m��4��,E`�'h���@��K�aZ�~�shH����}�P��$��=+g�0��0L��/����C
%�`YJOf+h�*��b���)0A������A������
�
5�� ������u�!��J���MS3��g��t�J�Q�@C��C����(�)0A����w�nWj��6��Hk1���B�m3%{����N����,L������J
�����3���mUhH��G��0�W����A���w/@C���7�Y���8�������8{�L����X��m���&b�cf��������YKa���f
j���k\��������F�z��a�~D5���;r8��?�	��G���;&&�+,���u[������|�R�uk|����Y��T���xDH�i
�b��7�`� ����`9b=�w�����q\�9F�p������%f��3C|
������Z��f�>9��L����666�{�hPm���q)S����5cM'�2J1�\�1�[����s{
���:�^���7.���?�Tz ���7�3�h��D�rA���Q�L���50�S4�����`�����A�V���������T���.�����/� �C���G�
�=�b|��p,T�	��e�|:5���}~�������� D����i�t��|K�E���x9S��B������:���~1}����P
;���O�(c[-���\��D��j�W���=6�1�k?�^u��X��5l�����!A\��Wjsa+�Sy��.��JcD�.�>s�n�+����c��������ttP�����	#L����"!!�6�@HD8
=m�b���8���A�����/���9�1�a�~	V����&��se��w���v(kW���)dm�<�R�����9�����	X���������;�}����������1�s�����y���V�1X����� 42����(���E��hS�6j�*G�q-:�h{���{�V����Q�������84e>���R��1v�b�L�����?�1��������dGY�\��7�(�]��>y�:[����-�(�`ah�9?u�1C
��>��g/�~�`����_���_=:��<}>b���#K���������*#4*����b���������`����g/���S~Mc���=�{�A8�� ��� �u*M?;@PBWh�����=V�<�=F���t,X�6����K����$S�w���\��a�2�?j���{�����������w�
��iA��%����}7�7Q���+�#T~0����?�u���O�nP�M�l�ZZ����:��w�Z���9��I����S�j�v�v�q�7��ft��(Y���`���oF�-K�����>F�l���Q�S#��l����
������/S��62&��6g���?{�!��b�����C���i��T��8���_������{����	��P�m�TD��^������FQ�@�{���������H���m������v�t�>��aX����}����[�tP_���P�m����#0�K����:-����?c�mO1�f)��Q[�DaS�o����RRc�S-������bz�J8��=N?�����5��k�
x��>EDL:W(��E��.<B)9�q`R��X~�1Wh8��=��7F���Xx�TJ�jC�*%�nbz

	a�:|����Y�(4�@���P37�n�Z\��%��&���t/r��v����/������������A�:w�����V�%
#��q�oAN�&Us�	Wh�y�	uksh:�!��!.��6h�vF����A��������R=�"��*�*D��\�!��(��V��r��]���H�W���H�� %C��h�P��������	\�u'5���
�nf�Hz��*U���1��?j���?C�^��/�����@�������v�"��5��V�S��t�C�����q������Mt�5�riC��_�2���@�����e����[���=h5��tE�$��G�����IUx�q����1����Z�z��Q�ld��pZ(��G�7�ag�_\�O�6X�?C�5o��H�&
���E�c*r����|���^0��*��b� l�U�$�BC���xs~;��b�B�N����
z��T�q`����'�q������������ih�<ZMCN�'#��<��C|T8l�v�E�jp?��t�����N���+�B����0,P��������@FK�H���|�� ��%Jw�}*���������BP�Zk�����:��#`S�����4"|�R�`b_/O�G����:Jv�O��Y@�q���VQ�T#kF@Ce�RZ����9�E,���zS\�x�-�N����=}�c��}4�bD�N���F�v�	��Ic&�^�&e��=���w��]���~����i�N�&�Y��������>oq��6��0��~
<�~�5*�9I��Vh�1QC���PS���W��q:�Z#�?�6���&�����	�EW�g���B�/2	�h�6�kuC5�& `K(l����
�Q]������y}�S����r��
�3����u��om0���_oCZS���W�>-;
����m���8B�����wi�O���B���C������x��=��p��A������Uq��n�Z�-Q�x
�F��6�[���qf1�b"��oP����Af�*���@�#_~}p)bB>�������/���C�i����x{l5�w���l�DXVn+zO��������S�km��#��k��g7#��
�u�MS~���i���\���J+��w���9%�#_�z����2a3/S�������K��'��uI��>W�r��r��������=!�A���=���?D�6#�keGcq^l���1-���^���S�/q��">���uP���P�����.>�<��R�^7>���g`�n$���S��@�^3x���>�s��_=+����_������O���mj��C"��#�����
��jOZ@��I~����������2�N�
_�{w���C��z�x�������}������	U�wF}���Da����*X�{�R��ph
�P?_�~��J�nz�l���9���+6�?�:l4�@����8�o��~��BC��#����>�J@���w����;�F$`M�y
�t�6�����}�H��%�CHe�0������z����
y�<��"�^�:u�#���i���?uO
{L���,��|�V�ix�A!����(V.}_$����fGD�z������P�+4�����i�-��
;�^������U��Qu�*�IU�����!�ik�\�,�=h�F�3]��"I^�A�������x�u�j��F
�xN
v��C�����<�6�C�mF���]��DT��>�4�0����h\�B�.S��g�����qj
Ui��������|0 �)4D��dY���.�3+����M�S�������������\�?�A�+��]�����o
��C�d�l��L�]�uc��\�M)���L��G�
�M������2�������&B��n���������n�H��A��;������ae���^H���n�����(4�X �'�\��`��C���
�
��u�>�Gq?����Bf\���CEo���
�F�.��

���=���jxu�%^��XYG�����i�^
yh8~�

X�G4}���=��^�f�n���GN^D�r�P�x<�A�	u�]h�2���?-i��BN�lR����������_�jy�b�^8aJ��:��&�����G{�[��zw�����vi
��\�-x�)��C��]��W-����k�~�����97B��s���_��J�h���h0�E�U#[������rq���I's�,�!}�
�A���.�����aF���>���`)-��a���V�4����������84�Ot]4Q��.O@�<VR�5~���+f��M!x��ah�8t�2W=`�m���2���X�{���\����k��>6}!:��k� �
}t�������c�����F��o\��.�xh��S���s7<y���up�<t�5	
�U���7��,m���N��Z�5k~���|�:�:�"��(d���v�w�{���������S����qt�B��s�&ZU��
g�`T��\q���}q��=�GE���g^o`mj�m��N�����'�`�#<}�sX�A,���t ���7�?B��-1~�RG0�-�����K��w��X0
?����v`�J
4�n��!�1g�f����k��Q��e��h]�m�^IV�`���o���������d�
3z�������������o�o;z�Vd���������$Sh��X���91p#5���Ns&�}+4����K��d@����5f���?2�E������1_LY����^S��#rLiE��e�P���<���q��W<��|
z���p������`]��M����%GOr����)f$���X���{��F�����r���<	�hS���7�K.�7�^��*��"����M�;}�����#�}�r�M�f������������5&���
��s��P��IcxX��4���g�K�&�a�U�s#�;o��a�s�
��X��x�i]:p����S��r|)�m�"���'��S����s��a��F���O` ���
YX�m��a~�X}�,^~�M~T��:�6�����v���������������c������A������8:e�\����<�0�[G^�3h�����8���F��n�,C�:5�-�WM��#�;��D�?�}�a9��/����G������k��as{w����z�bI����E
F$C������1�s;#�1{2���)YIi
��<�����0�x���.x������������&��]7�F)�p��?�_uG4|
����3���bOyD��H��o���.����+�k���O��`�����\_�����S�
�W-	r��*�w�-$�I�
�����v�J�}��6��I��:�z6A�
WB*�Z��u�]S	������6�+p�!!(��G�B�2�����|�����J908A�?-��G�om��"��.���-h��A� ����C�WSDl�E�>����!�P�z��}����+�q�!��tUF>-yL�|M�@�o�	����l���)E����=�F�`
�}{#����?4�8!��Q*�F���O=h�6�2��iIP�#h�q�(�kT�0�6�j�	u�
�]��s+:�\�na�0*������|�1$A����
T��`��)=��pxyz����@�W�h�"���Y��"X!���(����2�#l-=c���9�`�[U���p$����}�����=�
��s����A��p��#�f���w	�)J���q�%�W7����@��o���)��qt
��J������?���5�\�������M���<�/�6��H������6������O@x����1��1��U{{~���D�Nc�M��T��[��FFm��l?��W��p/����������Q�8t!>?��� _������2��n���3�����(�r0� ��d*�XNu���3�Q�A�9�
ez����3�<=�B"��X����2!M
����w�x��-�kf�66C!3K�:=�5����W1�EO,<��+��R1����
L�saf����`W��]D��I�+�^4f 1��::<��]�4�_h A���X�6riSf����:�w�_�7bT^K
4���r:��)Ej�����Zl�?���n,��QK IDAT@���|M0��X�o�������Rz@,G����@�W�A��(��j��s�a���z�
�:�q�a�AF��o��j0����������!�i4��#�-��>3a1��S���B	0i����1u7D>
 `W�>fe�lcZ@���k`_�4
�/��������h^�'6�mj����9�^�������`nl�RE*q���c/T��
��^+22��>>������h�~4B_?F���6!���8\��|l�t����;��t���$H���Uh�6��B�^���:�h�Q�~�����?��XUk�����1tX�m�z��
�����k��<v-
����pa���3���u�����Q��(������j�B�g�O���zA�`-��C���:�6��&S�[B������deo�����M��������s�CV��d!6��X�������K������|��-��E��bS��XO:
�6��kv����(�g&��Z�H�&Xb@C��������j��h���9�uaZ@C����P�&�l�������-t6����Z�� *2w/�C�>������p�t���8�`���
[@�'����
�^4��C��#�u�(��s�&�A��eac�H�H
��E;G���k�3&[�8�
#g���?�!N�������}O�eM�>��S<�����O~���
=��n��>04h�N��h�<v��m���Q
{[��C��=B�`�!�e��~�n4��%H��:��?��\���N����=Woq��H��������/�Q���f�"@B�B�����C�&4��Es4���4�M�9m^�A�n4��p\�o@����rzZ��C�.eh�F��h����Iy0HC�$/�`�T���~t)��8p5�����}�oaK@C7����C	!�N�x����l�n�L�k��2
wh?����A��o��������'j������Q!G�7$�?����qw���X�x��dpl=����@��,�F��k$������0�x�����h(\�="}x�h��/����M��~�,]��JGD�����^_��rp����BU�R:��@�@A+��dl��7��L0��;�o����sf�h��.q�A��^��0�HP���g������;�
�~5u���z%��*���E���0hW��z;L~O��2������/�_j����l���n��YQ�<�����}#��N
yhx��nR�N'rzPG��mEBt�K_L��?ev����`�Ofb���s��������w��O�AdL�z��BK%i��)5�0�L�T����dP"jWK:�)Ki
s��#��$"[$a��,�^�	�r
�_�%"_@�����������@�G�J���FI���
��}M�	�!}_@�j
�vN�L�At����e���<Hh`��C��F9��^s�(�P����3�q��;44�m*�^�`��-;��ho���mr35���Y�)(t��E�RWK��7�Y��~`'�7�����_����h'��t�m��@���I�RY:��2����������:w-mh>���ZrxK��&t�j��#|��m���4��D��\
0�m�3�!�=�&�"e��{���
���y�f��)9q��
L�6��t�O���<�U',��;��R>XF ������s<����SX{��*.��
{�6��*M��,�Dq���R��I��,LC@�R�i����������E�e���)��N�_���g�������@
��s��R���W�"�u����/�g��i�V�YO]@���,
��&S�x��*���B��,��GY;u�7R����������J}ODf�[@Q���C�6D9;[�Ksijr�6\��)��x����.K&`j������Z5�]:��`��-�i��� �6��|	������F���:I]��No�����1/{
��gp�:��;/z��8H��a]��q���6����,,���Y5d������E�=�}����7:T��Sb������`�
L� eh`j�/^�n=�(��W1XF
)7c�T�1��wRK���u��t����cJ[G���������M[�y�\7�^����@�
�.%?�	�ZqH�=GY��J������1����Z�v��zL�m�/���~;.�>���^�6L��%S�����+.������g�&�ir�X������FVRZ@CAn<'��
G0x�������38�@E[Z��z����Q���
!����|Ql�<�`~�r��?�m��Ta<�	@_ d��>�|�	��� ��"�t�9 yvm|�"���0#�A����NJ�\{L���U����9����>���G��
��+�\�	4
C�������F����(lE���t�?!����nU��h���	a�����:t�� ��K������! ���%�3�5b_��,!�H�!��)�o�����8~�C���BN�<}��Gn�$��r&�� h�?r�^Z@��@��T"������%����a���0 8'�`.%0B�mKD����m��!��`R>X��������o�����N("��8�| ���"�iT��VM�������5Smv���Y��)�#+ h�U.G��/._`D��u�=GZl&�!����|�At�Cj�w8��i�D������/IE#�������t�� m\<���/a0�N$���
�h�*tHe'D��<��(�u%#0����~�	��S�	����q��Ae{O���aZ�����,1���TU�)\4���]�Z�)��`L�������NR[��*6��"��m�'9������[�o��C�NoF����et�?S�h�t'|~v�<�<��{�A�w��B������?0���;���{�b��M���Ng��}��	�X��ph5o/�D�6�����8(�2���0�Ig������N0�:����I�j��_?�
O��bt���W��7d���k��~�}��K-��p��}���H�CI,;�79����c,?�{�\�/
;R���'U2+#S������`���h�=e��lm���
�h�����}��$Z�u��2����SM<?�E4�
drB��6j���W4��H7����������>�E�H��g�48��2t�NiM�8h!�D8A���SR�S`5������#���
�0C��x|"�"Q1er�40��#W7��������c\CP�B{,�9�;��9� m��Y��l"��h�U�%
[9`��q�a1v�r=��(40u�"�!pM�i�cE;��jLa ���:�%��@�P8mb2�A�NT{_��V4�|�a�������~P�n�QQRwX���������m�!0v `��m"������u^o4.��wOaD��(H�,1A~�|	����!�\&n����	n�!����f������1^�������������h�"[���(�m���Xv����������<]3EX����,ok�T���B%���\�"�;i#�
2�:��uc�YMi
L��Q���up��+�jB����q���>�BK���GW��o�i$�������h`J��m@�n����m34l��i,W�g�c�8��+~OR�f������x|���F�.cQ��*B	�3&���?��3�'�4$��� ��)d����ar�XRO���Ud��tpU��� 9��-�ioJ�fe��(Ls��7^�'��H�!WY�y��+'h)�!�X
Y}�2��$ �]�<�^�\�,��;�)BhUq���GRD����4K�Jr`������W���6���������A�������j�H�����2�@�h`~_��W�Nxun#lQc�\_�%�Sh	�	���f�*��)4��@C������	tm5�����F�hA>C�%�������������/P����O�������*(�n�>��&�|se����
�>"T�;�/m�I���8�
��z���\�@I0�������%�U��?<G���\���(�r>����JX##��A�M����A�fq���[��+R� ���`YJ$5���a����,�D�<h�9��#�<���������
���He$	pa��3������������@C>Rlr\e���ZW�>��Q@C�&J�4�!��A
�����H�0
��x��U|&Y�QCza����4r���+6r� %�0d��O��
)=��;�@5��)Bt�,1�A^�!e��H����Hv�{@�I]�z�������;%c���ucK��+K4����$�d�w^��k��u)f�3�_a�����I���@C�n'��*�����]'��KWx�=�a?��P�8��$��!�3��<���.����n���:��]����*��7�X�6����c!;^����;$}L)�B���?a���`]9�+4�>�Ui?��;0u���w�e�|�0�@�����-��Pl����k|',:�+C��
I9��6��M��|h`!V�G��o�����<�W 5�6��
DG��^��m�O����������>��CO�$�������yx�R
3����6]y�0X���G�U�����X���`g�`�L��);�:��E
�`G�
�H
40�	Y0��^����k�@m9q�:�L��!�g�)e&_���O�1�q|�"4�ct���:�Ip���3���
v�'�wS>_���T-L
���?S[V��.��Y�&5��HaJCV�I�&����BI U��@
�1���H
4�~p��V��,dS�h�\�+<F�������m�R���:��sPh�\��������At����
g�������$����E,�����`�{

�����,��*0u��F����\�� -���`A2��m�x��"��A�_��	E��l�]4\ 	���j`��=�.��2�D9q?	�b�L	����9XA�
�o�~� �L?q������5��g���	��G��}��J"%��+R�s@�z<�S�p}�'	�`��am��X�WhXw��W@C���0C�4�L
���bR7��0)4�be��5p�N��n�gRAH	!(4�<���t��LM�{@���?�O��?��6��^���{>��V��%G'��>s'H��w������[��|�!��jB��Vp�����y��p��(�DSRh��������y�	�R+4�w��>Rc`��B��[/��)4���xRh���[3��

K����	����CJ��(Z\f��7�4�����"�LH���:7HR*40H�Q.�p,�Vh��\
����bu)�g�eW�v���
�^��|i��N����f:!�>�����g���J`*���|40�"�-` �����^Z�h9��k����H�$�@4K |�vR(h��=�9��R�������3���q4h���S���Ph��x�6����%�wl���@�F_�����N� ��+-���

�%(ORa�[;I	�O/�N���\d��T�(,��s~hW��a"d@Wh�����_�Aj������<�K�(4�q����	�D�sP!l�Rh��s�o��Da�� �����q�T�:#���d������
�B�$��TXX��7n�t%�S2��u�4�BC�&xC��Ov���&X�F��F[Rc8�B�7��x}f��w#���0���@������'u�xE�����*��������ep�h`���G���N�S]tiS���eo�\���+4_�7!^�2�}��\����o���")=��i�<�"�BkT����
L5����X�$�s�#/�dH�G�&Z'
�_��:�q��*����n���Vh�z���8]WMC�
u��r��;z�h�i����SxP��>5����5�nJjl��01�E������Ov]j��
q��>"�~������.�jm���`[CA�bQ��!���)���6=����E5q?�M��2���`@�&�F
u��)z�����9E`��I���C�d�q���s���F

�B�#�_����."�Es����\�!(0!�-�n��B��������\Q�����
����0���o�k���b�z8}{:7���i����O��1m������D�6���J��t�
5�K����7���`�[��(��'�IY��@/Z�a�����KC�S�v����o3O���g��F)���@��W'����(P���3y]�|�B8�X��BA����=K;RfH�
L�a�o���$#*>�B�xQ���x0�'�S��������R"%����^�U,X=5
L`h���2�y�zR\GPF�Z���-���g�>����*R
�i������&�
����

���P>�����
Jj5'[F����=)�!$~��,}��p|�����w,=��]�`��_H��)4��
)20E���?�
9����oc�h�%V�&��,|��)]����A�>j�p�� ����!��C

,$D,A�j��}��(�K�(4��T>��1�@���kv�pPO
v�BCW��}����3e�x��3�5�e�0����8~�+�A�a-D��]���u��/��Px��Ia����2�t(�D�URhh��C�4��,]����G��=������7�40@������,ORT�?����"r����.��@��4&t����X$7�BF,/
��A	��m���I������:%5t����uQ%0��H��rX���dp�hx~d	lkv"���(��/We��G0F?��%�=!0pU�%_����iM��:F�I�a�{���g7d�BC|@8b_\��O�xp]
��
��� �S�����D�?>���T���+���(�Dy���!��B�^c'��x��H
/�
)�PYL�A��0�-�a��$5�`]���
���N(����;�04dh�4/@C�S\H@�1�t,\K��,�a&�S<���O�Ry''��/��!Qi�)�DJ�@��?���!����5���kO�KL�����r
��G#X�k7�E��ua���R��
�������&D��i*4���Y��h2E��?/`�Lr�)4h��A�
t$��@q*�\#�b?%R���)�B�&���o}�eK�e���
�y�_Y@C�OK
�
4T�������,v#�����A1�dQK���3� �N�RZ@Ca�����?n�I�u�N$
=k7�8�!�[��.�����1l��o�G(4d��e����AR`h�[�7�e@C�Z���B5.�=}����3���6������u��v(`��.0b��)�{���{V���?�/������#!��f�����I���d&����1,���gu����w�/�I���I��Xzd7������V1�k?��	Rb�w��8h���i#���iAa�V�&��}&"�df�X��E�c@�6\��HY���)M��h`��;���H�.�6�W 8"�6�G�8�,�����(\���I�!���[W40��n����{���40�1m��Z���8�K����#)&=��,�@�B��6u�0�Bb�����q0����! 4�������
Ws_��u����e��"X�R~no_r�D�N�X�L0-q��S��<��Na����j%�`��=_3:9�=�a��]�����\,=�q��`H��_��9�,��_���Gk�~���f�#r��X��I������������@�,����3�x��������Xb@�x������T�F�'}������T�
9��}�_�I��N���Y���0|�F�:r�!��yf�l|j�a���<�EA,���P��#����C|,�u�
l�������z��mZ�0��a0D$-������R����:�"Sn`!)�.[
2��G0����)�c==��:��'S�`�S�_� IDAT�F�m���������'O�����h���"�l��B<0x!u]�����G���RY��<l�_X�
����-��Jgh�Na6Xh�`�����O!�(4�v1����p.b�a���e�C���=�Bd�P���IE�A"�������1i�������B��/�&&�.,��]�J��-�/���Rh���#��x���|P�D?h&����\�w����U��_}D/
1�.yx���d,�6��3��xH	;
a��f����!�dX5��0��V\r#e;E����{�R�P�
mR+1���#�������Y�����F��Aq�/7e{�C��A"�%�p��"�x�	��imF��v�#�b�%4�>}���J����yD������rc����XW���h�h7����O�2C=����hC�*YA���u�WCA)�������-����N��|�������V9D���e	J����5��O7��"�����iiA�u
��5h�y�q�<��6���!8A���C�Z5z'�C����"@�L�V�zU.�}���Bm��:�-Qg�tb������d���������:hQH
Z������V�����U����J����Sh��^� �H�G��6��B���|FZ0���9����IZ�)D�E���
:
l�m��8���?�k_q�)�6�7�`4���$U
#4�&��TD�AO�S����!����BV$����PO�Fjn\�!l3�2L�����n�<@SJxO�m��u��d

��!xFr���(��$K���
1����_��dn��S�I��O'wo#p��F���l���~pE���Ku�GVre�R�H�	%��!+XlzM
Q���]>�+�����a��BP��/��D[�{t����C��(�'��b��/�<�$?OG���a�H>��TX>���aG*
�v/���p?��L�A����MF@C��.������X'
&z��� ����
�C���=��jKhhZ��9��{a��U���/��V|�����p�(���,M�������[�>�u�Nf�r5��H0��!�����i{����x�`�O+��5Pm(�E��'G����d���Q�~�k�NK����5GP��I�L���K��/E���?$��y4>>�25]���,�qE�D�*>���oI

,��0 )m5Ro>o
�E
7�6���
���Y<�
���6�F,��|�y�������I�����^��a+���o5�c��;FM�|4f�i�:��A��^Jhp{y$�s��tEHx`2������o��#u\�P8
?���C��1�
�;.0�e�UG�
����4��;�.A������S�"u��B��S-�O�7��0��H�w�@S&p�1��
�z�0'���_`�
`�����xhR"��4(<
��/F��,�S�q'5�b�'���>0E�����)d����P��������cm~25��5��9�"�4�����P�}�b�6���/!hB� +61BC���:�y{0�/����
VT���~�a%�5,�������2�Ru(B�Nq����z��P����h��Tc�
�Mm
@JO�r��x�Fg�'X�
����B	.+��2�R?�M���
�B�m�S=")t*�&?������7���`N}u�A�6{�]�����@�=�n����W���nxt��Vn��{������T�{���aj�(E�&����Wo�80�6���U�A���o�4��(�w��a���A�A3C}^$�\�];=�/��=K�e�l��������M������� 

u��@P/R����@�#�$�{��`�-�E!��iOI�6����A�a\��90p 1,��L��~����iH�\,<V�z�����zQ.��C *]u�
���~�:B�&ui�s�+�A���"��N��P����xR��iZ��wX
]�
����Q5y����h���@�O�E~m$���c��Z�&<l�V�*I�-h+�TdmL�;�
��F�c�{��y�)�h`y:u���������]��u���84��i�n>�g?�6��!""h���`�*6�U��4Vj����0�C�L-���)T��W�c��<4
��������J�����Q�[R��kj���AK��C,�K)��A���I���Fs+�Q�T"Xh�8�c)X���x��Y���v�;�j�%����T��rI��,%����3F�AMGF}k"t��d�!��'�zq�7�.�~�
��*��B�\��	h�5>c���D��4^�C��7q"�~��qG�nIM����A��s0�D���
�y�n�)��p���E����h0,d���k���s�n����p]�5f������5��~r>hH���_
yhX��n�s*�D��4{�Zth�%)nQ$
��S,.��a�L�A���4���m�1�b)
q�i��Gy��
������F�
���h�����)F��h`�,��oc����JI[ ��Y5��BN������Th��������R�#�eXQ�!, �R����q��@�Ph��l)� ��&�����`p�R�����fG��������}�-�I�B���V>)CN(RVz��4(+���'=�!�����fr"�����4dGy9��<@CN�);���:dg,�����.?��O
4dw��������Z@����7��
�����AY��N(�f���G%��!'��uZ@�2�����r�>�U�,�Dv����h��:�R�,��,�����=�AYy�D>�����)���X-�4�1�!��Z�),�w- ������ �E�U
�XK\+,�5�!k�wm4,��KL���b���j"&�z���G2c4�o54|k+4��?y�J4d��@C6���jZ�b����ZR@C�.�(��)o����t��$A�����A������Z
_[G
�z����e&'4�!3~#��Q�!G����� �EH
�XK\+, , ,�:�2��:OA�$'- r���[�r���Q���������@C�XZ(4d�]e�J]�!{������F�]C4d�

�Ph���	�A
��q��@Y@
9dh%#�4(�FhP�Z�Zaaa���T�Y������3vV�R��
OA�u@�r�)�M
�dW���=���h�V��|�hP�G��@C�?4�!+^&�4d����9b4�7E��J/��Z%�
�/F9���6sI��x�
����������8�	�Au��'W�����,;W�A~���O3���DDFFBOOO�������}�tCDDtuu�/_>U�V��%&&���E�Pj)..�����#+�3���3�DEEASS��������.-���CL���~^2JV�������U���l���fo��.�?�X���A4�I���sO9�iR?�c�o��^��
��Q�ID^�����N�B�be�����k�|.��/�1���S�k4������|lK}dv�����BC1}M��������|9h�T�K=��E<@���J���f�W��(Z���s	j�x�����;w��A��b>���9��XT��������ym}.�� ��U��rc|3
�B��Y���4L�'���l������5���ABI
h������U0���s�<S}4Hr�O�����uJbi�g�feU�<��9;�TV����T���M�����]���T����b>'= [��T���<E���<������+���b>'=�9i��91�Sd�#\+���T������|.����w�T�Wn?�{$� ,�-@C��5[2���@Jy�@|0I��sk�-v&2����	�Hy|�9��oR�w1�������4O������e��'O�"�s���|N��������&��9��9���
yz�$*/, ,�d&iCC�,��I%$$d)������2	z

��.:������u�������d���9Yge�
�9�*��T�����c�~�	��L����r��s��i����[v�R�w)�o�����/Hu|���3����&U��|.�\A�����T�71����\v�?�#���=;�!��=��)��M��rv}N���k���y�_���&���2�=;����;7�](4d��y��

y�\�y�[�SSA���������T��=��o�!i�*o��O8I����I������=w��oR�w���<�I���|.gO���\�[@����\�{a��@�����Is|�.��s��@CNXY���Y@
y���&���w�U95H1�T�'��\���b\�R���91�����j)��M,�Ks|������4�]�������3��$��M��.U�}�@U�X�#C����@����DFR��������@�&1��;=�rj�H��<���p�-J���<������e}��[9Hu|����X�������F���V���|.�^��r�9q�(oyl�j+�]�{�<H��� ���U�_Y -��m�':;/W��hj���F}�l�.�
��� x��SL��Ki��z�R�}��p~!�������I���D |����j�����>�4�p|5DF|�s�}�`!�<���z�)�A7\s�����l���[%q������D[�j��������6HLL��G��l��W�Q�H{f\��w�s���R��j.%2{��/�,�h�m��T�(6;,���.����#����
���A^'.�Ao���)��C��:I�9�5�D�5��R�j��
��;*SeV���X��Vf�*���V#X-�u�J%<��AxHBV�P��UK���>��'oF��g���[�^�R�ut�	U��f�N�k���H-�{� ��L9��7	�AA�������w�@��A��!��3h�;�J�5@C���2g7U�K
�T�C�����A��S�	�A+��k��7����s�Z-��sO\
9g���$�@
i{����~E�{�������h�S> �4�tX�����+���m$��}�!s�@
���*�%�4��
�A
�����I
�X+o\+�������7���j)���{�h�9[g�$4�!=�@�2��(zO����K�c�����w�Z%gTt.�D�
��x-���a}�,Y�����P4}�����/_>���LV9�C�����M���S�R��R��~���-v:]mm���_�v�VE\/1��BC}s�)Z����"����$�4��������-���"l�7{���M��x�h����nsh���IQv
�~���}�7�C��V�.Vf����T<���
���Zw@lP ,�4���y�D�6W�r7z�W����_�Og��h�O���s�����c�,��J�?���CB@T����������u��]W���.��0	��n������"*�9��> w���{�;3�������X�4����l���B��2�� �:*|�K.��5��%!b��4�u
X����Ch2��N� v?$���BN�o�
��_�:��~x�$]���f����JJi��qy�kh���>6��&Q?X���}����"��G+Xh�I��iNa]�^���y����\�9tU���4����F]���t���z���'�\���g��w��[�����'�cP��
\E���mM��86��+�u��\���������<|��1���_���R�!32
��� kT	�I�Pm�T�>�>
�f
!ob,Q9Q�������;d4sC3����u������5�
}k����
����"
%U<�� �Uu���7�!Q9Qf�����'�1Y�O��������U^
�&�p��M�+����������[��P�0�U��������^>��&���T�r��������{��.�������HK�:��o4�����[#1b�16�
�h�jV�E��z8�H|{[�(��
9�d�<q^�n����qDx-Q���9��$*�?s��j:�Q�Y_<9�o����Kh�6��b7d��@J]�'�H|i�r��c������p�QF��l-��7I�9ha]:aKh�g��I1PTR���>8(�X������,�w��FJ3����*��X�������^s$�C]�!����C��m+M�������-�]+�
RZ!'�w`���o5_��Q�

N��u%5h�<����X�(I&!�DIF��2e)�w��-�)))HJJ���n�V\Dm_4��j+�4�W�r�n��jc�������0�_�b/�k�3����#�/c��a_��n�AL����^��a`�L*//'�-{���c{~-BF���@����,�ob��u#���a�h�?3�%������$(w(��'�h-�,�{�t)2ZrPl�Ul���P�@��������;"�e�Q����^��E����p�A��Zu�p`g����%n����	4�}�s#�*�\
&�af��{Gb���l�����H�J.w@������%�O!?X �@�6�0��)�|�����v!/_i
y��,�V���~��33���(��6�g�����8uh{/�1�U�Z����?��
��x��-���������:
-�)i��{#�~�\���Z�[
]'����(�h����#yUW��E����>�W�_Z����++M��/�1�~
���;��@C��CV{

-��	�	4����y��}����m�
4��I�i^%�-���T�AZV�-��}����
4X��P7D�Q�9��e������N���5V@����F�s_����	�! <aY�k.��h��oN�\k�������������r4�l����8��&�
^��B/c����V��
N�����������h(G@��[�q`��C�."55
�G�u����PG������3�1e�`()*`�������Nm�����\����m(�BB�V�u��SR���1C{s8""*9�9T���L������9��B�w�������y��A}�B�<����(R{PWS��S_h�<���@���4
i�|���X�b2�����~������C���E��������P�P����	40e������������i,ur���N�������;
�`����/ka���@_0$������o��4��M���J��PS[���-�]��Rn��1}F�5Rd��C������ZR�2������"�O�)"3(j#M�I�C�s���A��6�}@Nfd�����R^JE$��
��`���� 9���]y$���>�?�C��X�dQ���y�����v�sG�BCM����j_$��B%Y��eEi4�S��4��p>�g���2���q�a"�/5��wi03����1��I�h'-T�,�,�e��Q�D#{j��=w;~��\�a��h���ykC�PG�Ty;���BXT���*�B����m����1:������a�|p�.7`1q�����������a9a)$,A���CVUr���������R�N0����*=�����^�'�?��-|�������w�����g������,�������j3R�?@^S��G�v������^�
n�q��3������L�!����M��d6��Ra�d9�75,o��
���Pu�d�����j��C{�4����Kgs������9���qS�dd��SGy�.= E���t���i�Y����������}���X�������3���YX�Hc��4�jIcH'8�MGbJ�_}�(@V8|5
;( 6!�/�C_[
I�9�G�)�i9��0i����jV!/�7�x����)tm*]M��b��T�e�g�h��y#������4��A��zP��)�=Y����u��d,bC����
J��h��#=���w�A����N'�����I�h���t��4���/#;#��u�5ReP5RC�-=�IyTp��K�L�@�_�BQS	a!p_�5z��y{�'R������b���0�^c8T��^<�)���H]���@Y^�-jA��FO� IDATn�*�K����jBYN��x���	x�Uu����
<�������=��1��1��+`a���~��p�{��+4��{K;8a��hf^�k����4���[c3t��K�$�b����kd��M�!0&5��0��^����0�B��E
���8��Y9�U����p6���������tK���*�#6-���Sk7��w��E����3�S�:���k�"��"��@Y_�E\F*=��u���Gg��q,v���VM���~�J����T���&~}z���KO���� 93+=oB��!�%D������p���A��G�	R`��	�*8@_U��.�����������;/$Q���h���{�IS+���w�����R2�0��@�J�/�#�L��tShX�s^���M{�\����Cq

MZ��Us^���?�F��ph1o_���7���T�X�z�(�����v�
����G�ePPR���|^���}�]�#�9A^A�C�)	���W^X�/n^Z���m� �
N���P�b�#��N�\��0O�mn�)�z����Q��.y9�a��\��k�vp0��y��}Z[}�]�C��?��#�P�<<����F����L���w������G�AJ�����a����#F�'4���{�R����W/�dT�G` 6]�.�x�������r�=w�{t���*��iD��4����,�V�Z�v��h������d�gH~����"E{/Z#�#34qg.�������hc��cg�vL{	j
�����\�����lE[k�N�m�	ySc�uj���y��~�5�/��T������$G����BC��+d��r#;^F��Y���m�P�
��^FfX�4i�%'#�����+��!;H�x���*m�!v�1�����au���$�<�R��������R!U
�w��=���D��5�9��*W�+	�`b����B����,�:���g*�\N@�1��2�2p�d������WH��T��U������\�m#Y��ye)�] [�Y
�������\����r��� �}��������5I��t<:�!�*�6���y���,8N����o���s��V�4��j�#�x�`���6�*�d��z��������c��!���u���<L�{*�&�4�v1�C�`��r
Rxq'���h<�����Mn���y�������LkV��]�y�-9E)0%
%Ui�����|M*h��x�����]��Q��!81g�����=�9b��M��yuS��XR ���0��� vw�������Y���������{-b��������}��hL�?�<��o��'n�_&T���iI��L��KK��]
�O���
<�"���qD�Vt�����j�Zs")!�U����E��t�����F�A��=K��������R��J����W��B�Y���W���K�LX��t������{�s_�T����^�+q�8>"gV���/h���\H��vU�F���D}��}G����
��]���:�U�q�������j
|��T�-�v�_+���C}�B��������|D�&*�������U��RG���}?��M�#��\�O��Z����V3��e����cTu��}�8��Q�+����\���:��;�?��h�#[@�<?���������e���Gw,BzJ"�\���
�����.����6������=f����[�i
��6c�P��Hv����cZ���#���t��<�W��A���F�	U���j�)��4�dqw�BhTEC��|��=���l`�u;��m���Cu'�h���
-��@jb4�������h;~=�c��vft*[�v�M�����nIC����X�o�������
����<�=�E� y�3����r<�����������w�H�}����l8���B{{(tj���Tz�e"�w���
Sh�O���;�`��j�p�)�U�S�I��n��p��Cj
l~j��>�(�k������M�����Z+���'����0��B'{y�zg�3 ���z:�!0"�+4h�H�uP6����k:��s����Vr����0�s�h�z�W\��/tt���0o}�������;���p���\{��d8��umaGj
�i���M��c���W;����*����7.p��*�����x�8����s��z��!$�/_\�S�et���1�\n���W�B���"j����L�z9�CPoS[$����L���r���Nz��>�F��Y���2(�����H�����b�=d�f���F\�!�+�[<a�����P�>)�]�
]�yj(B6�����{{P�B��v���$����������j��a�h�Bd{���5[�Ad�i����H�W���OA

���X�����h���:a��i�U��(�Qpv��k���U}w��@7�n��XI�v�V���Vd�<���zT�1����p��!W^���B�����7�AKY����2����ng0��D���t�:��bt����ME^�O/���`,�:���ec������_�+�BC=C���������
v��y��>US/z�K9��������!S�Sh�x�.���F�L�jz��ch����#������W�
5,���_���C�1��e��r1�``

];�7�S/����x���44mT��q8q�*�#��;|�
.\s�YecX[Y[&6>���m-u4�g�>�;|��-4Q�G@R����
���c��Y�6��_��O�fw6����������:a�1R�EG���R|�fh(xF	@C�4���i���
]����fO��|�6���;���hP�������1��j��-\FR\�!;)q��9�*R]c��P��}��s5dG���F$��� �~4d++A�D	;�>���Y��� 4�L�g���@���BC�]�����R��������
i$� k����H���ZH}��F���}H<�Z�,��OE*T��g�>�E
j�^1���
F�������i�tq�q"�{�b�B#L�#�i���XW$ru�MG��D���a��:������c{8[����x,��b1���Qx���,;�����u�bz��h�f�v����6X��c��x��Z%�9�g�'B�J5��C�N=(��}��XK��+��I���f*;�GJ�GD=����<u���3x8�'L�����a��K���L��
�p5f���5�C��O�P!��9��g�[
�������/���j�/�x��+��JY��7������_u��������5���K�l�T���x��6���P���z������o��!Rh00Y�I�x�D^h`}d��=�G#�B�Yk�����W�n����/��B�x������4�z��w���H6^~Y�� ��.�����l<���S+%�HCNx����
�9�p�%#���t��C���j�0.O3���<6�L��^
��&�&v�Q$n*h`��U��qes$���"�y
�&�=�#m����7���.��M����1����yC4TiSF&x���v�D��G���=��<���j�E�9��&���LXv�	��9����v�0��0}.�,���yH!)����A8��z�S}�@��>t�����x��
�����#������8���������c1��v��7$H���z�E��c��+��~��	}tp�a�K.����{���N�����T���4\|���-:�}6�e'��!���xO�k�����:j�p����6�?��}�c�����q������8�0����0��!�.�<�)�4�O�����o�J����E����MN� {,~
#	r����}�17��.�q%e5���p������#n��SX��7�_��q
\~����>��7\��U�t��6����~Uu]�1��?����*)����r���a���ncE�n�����:&*r
�X�&�&�,���4L;�K;�DPl8�T5q��-���#���_�����C`��K���o�?U�pm(��a5)l������N5��[7~��t��D��@��gy}�����W�C��������
�g��]S��o����T��$���W6�������
	�h�e:��[��}K0���}4x<qF��;A
'(�D4j6��N���R�����A�s�����g\u^��3���!_���y��#�������`Q����=%���EhR8Y�����0�z�	4yucl��fa@Ck++4����K�����������1v�NT70��&M���)����wH���a���h������v����������S�o�z���2�4���@�d�
�M�����.��2I�0B�P���8r$Q������B ������ �$���i^�
�@�#���#��h
�������lH�*\	�P� �&��$=��M��
AA�N��U��B����FV����#��e
��~'A}8����^�!M6~���\i!+"
���~%\�	�Q�D�Dv|"d+�"��?��B{AZ)4dS_�s�"���z�h����j����Z���"'�����5r �6�����Hy�	e$�����$	��6��5��z�xx&����Aa^�K���w����\�#3@��hP���B���<��*��qtX�6�(�z>�WvFSY2�m��D��Uhc��6�P,�������Fp���j����#C�����K����m���n�u��!�;���8Z$�����o�����k��8Z��	h��)�D���
��'C���o&{:�`u;�TGA�h�G!9�!��}��_���s�p��0X9���#v(�{��
e��O����Z$�����/h���V�5a�n���hD�D��2�j����E(�*��Yk�|#k���7�]��J���b�
f�����>\�n�y����������e��I�yu	�ZN�y�)���Ug��r�AU��-:,��gG� O�����������@���FAW��t-h�������aQ��V��o�����m�x|
�����9���f�� w����+��^�Q�N
�@Sgx|{���4x/NA�&�s�[�=N,cQ@����4��)A��V
��t������3q�	6���#Rxz)Ns�qiC$R	z���['A�����p���5��`���
p{_4�D�����,�#�������_���D��|�V^O
��F�
�����n�����1F���
]:���g@��$��lH������A��+y(�d������j4%u�S+�A���/ ���n?S���f�xK��E�\`��g�&���
.`��Oi��J�*���@��x^��a�V�����K�l�o��~�]�A�v���j$F�������:�F���8h�D����{y}^�w�0������p~�`��>�B�x ���JH�����`�r02�n�yt&o����n�F�/���F��E1*�nm���oVo����^�OISa@�����|�L�`H�i ;$� ������=�"�H����P��������B�D;�G��Kh�6�F��kP�;)'�9��'4xh����
�������hH�TZG&�����-8�`Dka#��N�0�b�q�������i�xS�X��	�Le8����=��=����!1Z@��������=���V�8�8V&2�$5DqSa@C��?!(�!�o��^������m��7��Q����3gt�2W	x��'8?�#|}r�AS��N�����>b�s��l�z,�����3�!��'����
�I���*�'	������i��������k�zg��ui�
�-+C��|�>�~{3�>	����x6� OKM�����=�PB��d�:���9�7yp��j	��t�.�$��G!P�LP��`4<���.����pz	jV�P��$�4'�w����%7��8� ���N��`�8�,����0���>a����"���`Hfs��
E=�g�'FT�{����o���������4L���ka�`�b��*U��{%���+N�<OQ@����y���<5�yj����4�6�����������/bn��Xuuz�u�����{��#MClq��?�c/��uq��9������Aui�����^:�!���6���@������Z��K������%h(|l��r����h�����A����+�����'����Y�3�,1����`��fb�/��H��Z�`��^�� TTH���-R���xh��f_�0-hX�v)?�)p������3�h�`����+t�w!	#P�H
40�gh��P6��7���)u{a1)0��v����}z
�E��/���/=,
�-h(�@�[����6��z��)ww��p��c�.~�h�"�x%�f���B���"'�p�Tq���T�X��*����i��i/�K�J��I��M���(���/����iT&0�C"�!�\(2|����6cit��7����4�6�H}��B0�AZO�?}���F�o�Y�5�2�B����I�4/.�D�*��T.�I�x/�+4�������a��+?�U����!:X�+7�(��<ym�=�3�A�v�� UK3�b:��W�����J����+)�e`����p�/x��1��'0
{�};�A�&��'!90�[���Bg�S���������p�4��>-b@���<Lh7�
A's0���C\IA��!W1P����
���z|?�65=~	rj�T�Rc�AR�������,��A���~A�������>}."I�A��9��r��)1�Z���fP����#�8� *���%4��B�i���2U��� F�WXN�EE�]��+7��mD?u�Oh`�������]����%o�7���s#�����u��{+b=�H2��[��M���6P>�tfs[Yh�J���x�I@L���(�rOG
3R����@���Q>AY�B��2��9	��	z�����i���$J�
��WK���l��;�G�&�x��
�)�����=l`��V�o�2�IRa@SM���u*��6w$�&��������F^%�I
���;70�����Jj
������1�muC��M �$��&8���n��sCOH�]�W���
#�@PL�=���Zu�)Ow�D`m�!�pbO^���r���+�]�lD!'�i#w��P�?�l�:=5����)��^������9qx()m�0��.��pn�L<��;"�+Ah(*���G`���c;���(L:���|�;��}��[��(�AMQ@Clz
��:B=;F����,�'0�g�~|����+J8�C0�,�>1��y�Yh�a��s\I���o�pe���4/xE�p��nQw�(�hc���
�s]�A�`���J�=���h��6�wz?B}�'�#�`K)�=�Ly��
��6"��^�1]���������0����
�	������Y����U�r����g�q���
�'�%/F�*��N�C��Mj�]��#+���r����5���*�B���6�����j����3u?vo����~�W��������@����$K�
������c�C�>l�w'4�
H�AM]����+�A^��s&�[5��<��|�����
|b�q���
0�V_��H�^:�CXt�l�e�����������B������aS�2v���Pz���������%��T��k�q�Y��
n�~��4��kon���naZ�����a�j���?b���@�
���r�5���U<���r����W�b�O!��A����M�8����UR+`u��C���6���
��������N�5E��>�z��Z��b��p
��d���m����u�R�^����Q�Q
�V���������_{��X�	����3�"��x|����A{.�W]���T���*�r���"�/��O�q2�����5F��N*f*��0���3a8�i/*�`	�z����$	��LPA����%��!�.6 IDATL�AI��Nh�WA����Ej^��M����Q0`@C^�>x�q��Q7u��"�@�L��H�A��rA5:@`������*�$e)RaP���Y:x���>���JU���|��A
����`
z�r���{x �:B�Yz�K�2i�L�.j\���{2wW�!�!�����mZ^�*
�r
���8���������5�_�O^�t/�^����Z��:��&u*v�����9����4Lk)`��Ok���������8�}y����������O��n�����Y�N�6�����0��tzW��4HI�x0z�����T����t\w���M' $�)>��������"�������o2�	L��m�����Ak@���/.��W+����s������!%���T�x��V����44��C)���p���~�#�wM���m��s�n^��8t���)Y��BN����4��\��D

LI!�}:�vL��w�lw������$
9����U�w�4��.Se0�y��n3�9P�SX�����}f\5m��\�a�qs��L���`��L��y?8�	[L�mR_;���tLj��3��g7�q�yya$:���+�!��2��p�����.�9�y�n��P���C.$Ee�B}���������I����������Sw"=��$��d��G�������������4\Y�y��������i<�F��q��@��
�{�>����<��W���e��[����3�nSi)�����BN�9N%���J�d�qk����k���>�� ��dH�-���<�lC�c�kf�k;��L�[���0�AJ��,�t���Em#�4z/�L���%{�<�32<������Dj�_"�7�
R�*H=y�y�)�x��
l����yI5�MYT5������xD�x:���|�����rh8�(#H����,���c+��n�N��w��"���������O|3I�!����Zo?f���T"��dRn`u3 B�T�����v�B����+k��Iu����h�~*��s����o��8ql>�W
�A@�(o��S���3�h5��Y�����i����
Rw�=��f�V�qc�	bh�v�������A�8|h?���������2������i��ya$��i���yU���A��70���'{��������#`�T�l���x��<l7������^�.���a��P�\�iJ�{T����"���l�WD�Z������oC�������t��1�Mx�>�}P[�6f<��5�k�$�	^����!y�{�z" 9��r�.qRQ@�6)��h7�4OW�����&�S��0��D�<��O�������'�(���Q��m'�=�w@b������G�� �u��$��w���#�6����`jb]d��P��@C9���j�^F��v������I����C�����;m4��,�?wc���
�g-CkZ<��C�&�q��%4&��
I��$��Cq�����V�L�hX�a�K�<�#/��EH�6�
�zH%y���(��|�L�h�e���{�p�d�lOr�7�K����`������4�M��@C�ff<�����1}�~Li��D@�|���x��j���n���{��4dE�s`@�Nq+��6�l�A�#R)��)4�=�#����\�)��I���"���[�����bmND3U��fs~�!�)=�����Ja6h��YvA��dm�H�&aIRQ@�>y���FYO��n�!o�(
��������!$(�L���[����

;O�`\o-,���\&�jGM��Mc�[��m�2��{O���Y���p����������I/n�T�������5f-@,�k`�h��b?�g�	�}q�����a"
Rhhr����}�:�LR=v>��)��4�w
^�g�����`����� �c�E�SX���.d��r�u;����0>��n��'�Pk�/<L�Io
s�N��N�:~������U-~�&�l�C��^��k>��a���������H�a8f��aP��
����Rh���'[������b�4��
�LUa��T�0"H!��Hze�Wky�$�=-)��
n�����sH�!62�� ����^!O�!,:1AXUC�0��
i��	����
L��I_-�Z��-UNa[����C��`A�T�`���$O��1]w8���<HA�&Sh�������b|��`Fn��/T���r��k�3�93'zD�q��a���f�N@D�j<�~q��!�Mq��}� ����2����8#o���������u�����&S���vbr�v�{�(Wh��~v>"�����pR���f������QY�B���ShEJ�i��hkY����.�H�2��)�8���5�&X���jB#^�'�s�����4��?���p��k�4��c��c�US>.)4L�k;�mz0�����R,����p�d�MI��o�<���7��}��y#H	�������
�(�)�5��CUL']E:�3I++B�Bh|��=��~��`��3�"��g�����KX�U�oW�B��~]x��
���he��q[�B����`}��������V�)4�l�#O���mkL9�/��L���w����K�
����������\<'Iy�<������Shh�t<�^@�vcy��
Rh�<�6���F�eF��l��y�=s=�m�C��.L�u'�E�y��e,�K�
�{;�o�n���5�-��h���Z�|-EM\|w�,s���K�)4�'!����11�2j�3E�B
CC�����I����oX�v���M���B��du������8>m��][\��>h`�	,,;�O#eK��jA����)�1���p,}����	�n�'��0&�7��r����rR�����>��T�.� �GF��d����v����M�O����)Rg`ST�"E(>��l�0e��B��I�'/�K���B"���9��L�A��2��e��$�����M�k+���$�&A�D~����0�Tt����gNr2&�	&j
���B��������
����i
?�g��3��:�yq7�C
/	n��������Q��:�!2��9���\<W=��=�(�0,��Ih�O�"P��GQ;��5�l� ��k6%1�+*�&yg����Q�+@��,1%A0u���0;�x~=���xEJ,�D��T&���������L

[��� s�9��M�O�qoL�f�������
,1�	y
g��b8�k������[�p5�������h�E�*����s~�BC{�68�}�+��I���X�`���&]q@	2iO(!.�{���ss���Z�����L

���0B�M��x�	��Th8J��@�|z��i�07/,"�����0����X8
%eR�1�a.��B���Y~�,�D@�{
]Q�s�^[���@!S�;��U�oo��0��3���e�z�G��BS�0�V�KR
������(<X Rh`�3C��[�z�r	K�:�'�g{$:��C�B�B��[`|uk)4d�����b

��&R89\����2>�?�X���P�
�mG���=h�k"�y��8hh5�RhXC@S)/��
lS ����T�BC���q������`^����K��M���-��pw�4�M�M�&�������Z�(P�	�/���z���q�A�!
7����eM_�2�yu�
hC�l�Ypq�pT#%/AT�fG�
�H�aA�qs�X�D�8��O�)4����H��� 6�u	��"����`�3�j���0�A�SC(���C��)Go�
�N��C
�i���4�
R������<�K_(4��@qRa@�ZX�����S�����
����!!<�eq��!���#��E|���J{,�.�&f!)V���k���l*�wW����f�������\�S��;����NN*����$40��7on����Vk���.�7H�L���g���h<{~�~������R�Ph �i�a�������]no�C�!8}�B��n�CW4m:�/�=y�>8��	H�������_!n*h����=�,�3ID��m�9�%RP������@!!���R��X+0���/�ey]2�3�0�w����)4��
U)\��u)�mU
��0�� n*h`�Bav>�al�����+4��&�,��SA@e����%/�`]�uy@��?�C�1�r:�G����).�^Bo���Q�)������j�-���7�E��
���e�0�Q?$�<=��<�6�s�/aL�����*^��

���^K�w��� G�j���1���j��/�S���b�=?��� �Ij'�,����!�
K�P��@C9�m\M@�-Y�������L8���%��W?���{x�x��$)�_�A����l���C����C������L����;
���@����Oj���^0E	�yu�� ���F�jfb?��o$�Tt0��?���,�-na/�)����B�v
����G43����s��YjVFG���H�{,�Qjkj���"!#�?/
�Ch(�@�=o�����&�g������gO4���$�E��I�j[�O�D<��R~��Z�PhMt;}�r��� �oX�BC��@b2),�D��+|1).��C/�h �(�Q&�Y�����p�#��R�%�s�:���?B}l�aJq@C������R[$�!Z$J+�@u�1b���F~�!�y����"��3S��+��AmDe�>���#�P\[�7Q!S��)��X��P^�<��>|-
h`��sG����4RR���f�Uh`@C�f�hf�B����`$����X��!��y�T����'�y�?�V������KqN��b���E���I�����~2��Q�i����	��r�($E2����*y�g�C���T���H$R����@C�1��A����^��C�~�<��)X��)�Y|��i���Xb@�<f0Sc<����P!��t�M�~�g����=���~���G���`�,&�$`!�����}����k�d9)*P�k�p'���3��c���{�������|�tZ���z)-�����S0C�Y+�
�A�w�� �����(���k�����As��:�&G~��A�`�E���ke���S\v:��r���e�g�Z��k���	I�|�
�N�h|�!3!^,��0�!�6���c��r(���X��
��s$��@.��=���)1d����T��9r-Z���B��#x�'0n�2	~����9L�
,�+�b�
�M�h����I�S��S��*<}�(�����Afa@� �N��9�U�O�"^$�+Rh`��N^���V�E��S��x�����n���RA\��z��H6�/R����v�[���C4_���~|�Ko��V����P�U��Y����-��dS�<g@C��pBQ[�g]���
C�>�\����0oG!u(X���n��5zZ�<)�)�t����!-��C�
L�������4~����[�
�k�C�jV�\����.��e?S�����F�?*Uu��C���C���@�9����~���]�&�>w~�3[t��G���0�Ka'jP���������\��s���
��p�)����e��������:���jeK!�����5l�z� !��g��_�������w���,X����)4xS������y7��� Ib3RT��m��`@C&y�D��0Sc�A^m,DD0������.���b��`������)?���&����!������.���P�E����|4�v��Mk=�a�T$~'u�����
��@���P_��u*��P�p��
^��'0�T;����y@���@��P�6�a���ybJ��<�Kh`�2�����P�������'��E@��t0(���`a*��~����O���,�~|�jZ����r
z'����
�u��E�8��U��f�Tu>8}�`5��y@���
�v�B�l<�{�����;�\�4��
M�;Scxx��,�q�S��2�`~�i�o<�z0)9�����S��}y���+f�h�)����h�i
��R��`,h8��^G����a7^�����h?�u�����v@[,����������UI���*������������d�����==��V��=���F�Y�s�����-7r�����A��"���yY���(zb��m\Y��YJ�F
L�ATG�N�4��^I2�Y`v�Z��������C�'��r���D�����,1�!���`y�j��dR+H��
9�('���CHE�,��	�6��P�q'�C��K������}�!��'��A�{ r���(4�4o���'	���j:���L���L�������������0��2�Fq�����Dvy
�H��BpC��]s0�
��F{A,�D6��I�0j��G���<$P(W�W5��1�Op���av�B`0�	Mu^h��L���li%�C����I��7I�������)7f.S,P���U�������	�@JB(��B}-8�paK��-��G����3��v#�x��~����C��d+(��[��*��<N�(���>S_�hx~#��B��bZ�|q�����n���ID���C���]Hm"���Y(>%l��a����?l�2��	`�IqY\1���P��1eiB�Wh0�*�f�D���Y�"�3I�3O�t����\�������$��\��er/�#���������(<������Jp������!�8�w�?�U�����<�!>-k�m�}�kV���:��M�jK~���x��g��g�?��L�����/PS��F!$��{'�PXrr)4((��F!��gd�7|�@��b�=����������K2h���-�pV�46���� ��y�a�������7�!�k����J�(��i�9��.=-�o������N�����n���~j��T_����z
����JT��1�C^�s�5x�����P��x��xre��RQ

L�������~��P� �Y4�wUG-
�"C�����j�6���K�7WF��t�W���V��������l��t{0��i-9J���R�"��z��#�5��������N��}x"�����:���h�������aVG	��P���8

L�@�J�N�wp1l;D���{\����L�>����a���#��?��?Kh��r�d����� �N�]ZR,�����M.��@T�=�6�),0E�D��X��z]��JC���b"��BC6�q1@����#����_`Z�5<.�z3��� �4�'4��	
��hHa.X����)��9
��Z���'�,�F�{���h9�/�Q?�-�:E~���_������r9���04�Oj4oC�>}yk?:L��3�`��;�'��9}���)(4�5��R����$��
d}�����y�	�X�����;��of��}Wyh�oE�/�/�"��C<LEvl"���.P�		�r���Sa@C$=O�� Sy�0�A��ry

�����>`�5}�����Lm#��f@����CH#��_C)E<�Lba(�h������B��Z��}��pr��jI�]�G0�NRo`y�I�!���u��C.@�B�����n^[WIQq��J�
�k4G����������
J����;��_#9)�a~���&�
�6�36� ����������@�)�1`�[�������<������z�T��x���B/
Y� �����W��y������*�P��|a@���*j,hH{&@�[(����X�k�oyE0U���^A��1�m��������#5����"���%P%X-nL
�	P2Q#e��`�z�M�����
7r<�������i�'����V���	�"3>��5#��7o" IDAT��� �� �@d����m�K���{_��
�(�$���9�1��Ud�PHN��g�|�&��DP'�o�������l����I�:�]�w���n�������4�b�������&�����K0��(��	UYZ�Y�V��J�W���zSw���mw�B�TpD��J���B����bh-���UXb@C'��|��L���O.�b��a�m���8Zb���XBc�f�3s��e�c����c��F3�}pS����C��~��c�q���G*!fu���7����P"����V�jn�������Q���e�1��]M�~�����^��P��)�����}���$FI�A��
!��=x��m?H$q� 2LhO�W��I��pf�'I!�s���] ��
�-��UU0�pF��T������@��/h(x���l
_���4HR��@�$u��[\���~��
��zE��r�k�IFYY�	�p�<�2�+6��T��#�"I��
���5y���o]V��[��,�_�P��]�}+h(�6�e]�
���oUwA@��h�0��[�U�:�JZY,'
�5}���$i���;{��
�Q���T'qYI��+/��@���������������p(��m��\a@CI���Lq@������"U������%��,�h(����o�CNHR�����f���qm��<x�k�,�la@��j��z�+W>/h(}/���
���
~�54|��4|������@���@C�#&
�h�t�����0�P~��4@C��*
�w���1*�9Jh���D��A�b���~�����1IJ6��P�q+�����
	9Q��[��	@C���4�|��e��b���)G0E����t}�$
%l�BE]�{�^ ��)I��m���Y$3
8�_��Q����$�E��� �x}Mnh�����e��h��o��h���+��4@���YB����@C)�7�J�!�����p�P�	9~�@C���4�l��r)h���8?��Ow�"*4��9)i�**� �8����P>����P>�SE��4|�;.
�o�K��4@CQ�&88n����%�o���4@Cy��B?+�@C���� 
� ��U$/!��h(��@C���,��h(��S��,�KI�$
��V��+
��>	@C��O�������4|��.IK� 
���@�4��y*�F���@a@CbF
\>>��}5����&���������p�����F��l
cb������B}e�eX_vv6��������Rxh[j�(�����k�"���$)P���uJR���IM������Xd?d�2Q;���ki7������4����v�e�>����������}�qa�H�S)�f���9
"nR�Mb��^6�IK�m����T��.����o���!�U���l����EQ�]JFP*��?z_{F�)t��}���H�N-6������9Q���ie��STR�B%������$��B
�����&��m���fQ=���=�����S��M����3�>����%���j��g*l�KA	�����]�>��hAF���UZNJ���.'%�h����|��g"M)�����
�c���KHr&2�2�W��y;���Z���+���u�����)���4�{a���$=�����]�V �a�6[��9eS�)�.��U2������[PhP/����B)))HJ���|��W�(h(��/
��r��{�5����`E��l��`@~�s����������
���SY�^T��[E��l�	�\��{�l����_��o�=W��+*�|���7�{�b:�	��`�}o[�G�WQ����^g��G�sR���D���_������0ev�����/:&l�W<�"o��7��YV�u�$
��/+��"��{����*�|���7�{�b�\�9��++6����`�U���`�U���p�[1�ouN���w�	4���|/�FhGa�������=)))}U+���`ra�)������{EKL��%I���?�Qi���:������$�^V�u��{������R��{�wI��:oY~�}��BE����V������W��[E������i�}�y,n�u�WD{.�� �so�B���~N��jY�W�=�-�?z*��M�����������Ks����BE~�UT{�4�{Y����1��q���O�|# (4��� �^~fk��T b���3��G-u���SQ�o?B���|*��SE��l�UT���<��}�����:�E���A[V�ou������++��"��{N��++�������~����~����=����=FYh���@C�����IX0���Z:=H��,��T>j���]�����s�|<�K��y�@C�[�@C����9��+�7f��E���x�7�����7h������?'���;�����}BO��4dg�#1:�d=���Ltn�I����L��,R�
Ha�TvLY#���$���O^)9Hk�[��EGGCWW���i9:���)����!""���;�����[Q���n]�wm�n�]�s��n��n�@)��#�g�-��x�+���>>���{��{g~slll�mV����(��-hCm��:�m"����)�!�cX,b��(�J�]������~��6��R��{'��|����V�k����~n�ccci������	"�u�N�Ui=�3r_%W��(%�}?$yK.����|��c���t�������L]���<��kGg���v��b�3XMSW��( L�����������7cD��s��y�kW��rK������$�|��=F�!�i{�LI�S�{��t�|g	HIu�5���|W��~�����-L`�n���=��������'��4�'������E���SZ������]�MV%!D�� &�uI�����2G�y:m;h��k7k���t=��L4���)�_��
!�^�����j�V��v�|���)/
-��d��A��/U'e:'��u��S���[.I����&}������'k��lm����H��c�������e,���������u�b�[��d�I��{ ��<u>~�R�M������x���'��M��_���=�g��������uq���d�i"|���|=���I�n�d��������v���s�����Z��I+<�V��Z�ijjz�Ya�<��&i��)VG�K�_~����{>����%��4�[���R�!�G�oY�?�����-��?ZfZ3'(�s�)���p����'4}��v������>0�H�B��8(�UO6�I���/��l��D�
�!%�Kj�j�����&��4@��s�5

G�A4|��F4|�~���j��o��3o
��1��?]+
��O�x���
)���)4@C����v~iR��4@C������h��GY4d�c��j����
��h���
��Rv��.�hH]�iR��{@4�8'�h�
_;[��B���P�pg��
M���!�JQ1��um.�-r�R�����h�~.��
]��o��N_&�

9l-��B1l:{#�W���ST���
����S�*��z)|����d������g�HQ=��G&u���[/b��&h>6i%�/����#;T��yS�_;'��/7G&��Vl�����g���YY�y�bx��##l�z��5/�����������&�@��#ST�(?�o��L}{�(]\d�+�\��m�G!.A���E�*��$��@C��K0����U'`1�AJ���O!P���UR�..r�[_(�?�I�2�#��6%0��gOU~�+�����2@	}3=X�������/;��l������jsK���;�Q��T��$������K��@�wP�G"��6B�cQ�P�d��<�����h������"`e��2Nz��"�n03L��Xz
5�
���P�D/�}���O�;D�}���
l��#Ei�#C���Z"(��]k����x}?Eu�;�~���10ac�������RV�o	f,���:d���4����K���b���HT����	���e3C7{�,��O{��P��*+C��a��?���9|���7�`n��*�������@�!l�I�(����V�Y3�_�Z�����(M��	�G� ��}������)��R���8\�xM�8�)��N:���R?�~��%����1�SmIo��+���_F������~�)�)E��)���E��S�..rz*4d5�F�|%���#,�����T�)�D�hhX*'B"P��=v^|���R�~�~Ht�u:������Rh�jn�F����?����q/�J��	4L�������W��Y������M�R�07�
�D��	h�9F�&��h�f�q+�EH��isW`�/�O���
#��Hi����}G��E/�������^����Gad`+N�vm���l�����Vm�)�)_�U+hd�Rz,�k�5@��s�5@C������#���|�*=4��d��A�[c^��k����qM�$7��	4��Y������h�V�4�>}����4���`J�z�f��c��?� �<�g
[|	�u; ����
J���w��2u�
�Qu���x�
4t.W
�=�������/^!��X���!����kGh�������[
����y�m*"p���4�l>������[LV�|��0%+P�o�+��*N/��n��V��4��B�b6x��yzu�g��'�p�n�g��W`�w"�'��������6=�����0G�N��M@����1w���0��
���#7�>�<��LZ�T����4��t����9bT}o�!62

���S��i,R]�	��-I�%��������Ux���~�3����'`������������������}�������|,]>]:M��@C�����
�n������a��^)��o9���w=�h���4
[�����4�/\7�^!���4L���	�nbx�"�z��m1�z����f�h��\���:`��5j
�A����5@C(lmU��?�4L��c��n��/��l���Mc�}��/\C�V
�mCZ�3�+�-��`p�' �_��������f
j�z�����c����&�F;}��-�k���u��\E[��A�����	�T'��Z�Z�������]K!{�����,���G�{~;�E��I�|������7�dI�����2.�`��.��������
J�R5t��"��j��b�� :&U�Q/�z;9�Qh�a����E�2�~�*��B?��S](#����E�"�����Y6<|I~��XKOF���c���PF)d�2������Q!o3Tpi�#wV�?��TrhUj��W��7g����E��9�k�.�����o9
&����%�����;��B��~���0�&���:Q���\8]�6�vY�7�����7�2B���&���
O�������or

�$��wj]m���������?�/��1�k���D�#�@$���=��g�2d�6���-��/2"����B),M�q��{,<xM�FM��hkka��(�+�Th��)�9c��C��*��X ���s���
c}��f*A���3:7����[���

����	?�������/��9����/���Oq��lL�<�	���{�>�w�D�-=�1�gG�k�$�8P'/���N����nz���6g��`��S��l����>LH��,����ug��c ���
S#}�=�{���������
p��'~nY.9my��������&w�!����v�~ ~�t3z�B�����k.4��O�3~�)��dCc�/��[�@LZs%\�bp�r��
@G;4�Y�9P=�=B�����\^����i��cp�f���+����������C���2����1�My�)�C�/,<��*�W^����m&n��)m��}3��mY������
[|�u���MJ�6���7�g_��H
h(���+�e�hc��3�

���-����	�cl���/�}���J����1���.��E!D������"��V�S�u����Q�:�L���X��sH^c���b9�������`�ZY��S;xN���-a����n�f���n�z�3Q]a'�X?=[xN��\�����e��0���O��"��{hqL���
o�#`}���i��0��C*4X3����iP?(��G�������u��P�����<����`��5�N�#��=hB���Ph�

F�����~�61}b��X�<0�Qa7n!�����X?}�t�$�U�-�=�B�T�]��
�a;."&$�;KM8�^���%��`X:/b�#q�����%�kg��o�9w��pB��������c���^��;r�<�E��v��(�O?~[^7�e\��kA(4�/��m`��:"����K�/&M�"����_����b��4��?B�������ej(bBP�
�fe�"n���9w�F���uY���d>�E�l�:+�=D����_��B���&4bC�8r:Tj�bZ�~�8o?����������~�x��0�;�!9����Ez�����9`�`��m����G<���������p{�cX���o~����~v8S�!24
Q�h�u�LQ�����n��k����(=��
��zn�M��Phpj��O���{���
m���Q��x��*#�E�\,p~�
��s�A��O��g�z^�

n������R�4�w�a�l&���4P�+�/��WK���_����+�n)A.�K����V ��6�W2���T�������h;�������H�	#=^����T5�g@�\	Oy�-�>����O"	zE����e
p�^�Th8�,����u��*Q��Pmh�j�	{BY&�������!����g��,H�e,����

7^G!<"����4��uX�X��{�a����-��M��y��Tt�
sS{�{��!P���Hx�p����p�Y�s&x������fx��2n=��<UP0O=�����i��A��#d�~�p��*��-��i��q��<���AM������D�*2���G�b���fW��{WnG�fC�Xp�;�����5)>
	�������L,p��;�[��%��F�V024������]g��_����gCC�4��!��|��]�V�x����+���9�\��>oey��� � �P����F��}�

������kx5��I����o �]N�Z�3�T�A�~��[����|��Wm
���.��:�yD���`���p���z�C ��f���tE�&� �mv9��itP�\3>�jc�����cp���7����p����(-!-@C��p�?|p�a}���#d�c������T?A����U�t�k���sD��E�5hr��X�����+���+�U�@���v�BlH�u��c�b��Th����l&�-�{�����B�)kfC���,����0��-�����=���A�LR�!��'���l;UGS���C/�9� �[��m�����-l�EzL��v����vf��S�mb�$bY�~IN�P���*YB��X�A�#��*�C7��^���{�>�[���0*�l/���m����c1����)tL���Q���6���-A��lC��9y�4J���6)�!�K)�5�#�}/n�aA�h4x%>}x���E���U���3\��@�]��<Y<(euKh�tQ�_�<�	)���� �b�A�~Y��P�A�;|#�@�����@C�21�p��q�a��|�z��[y<#�,S���B	@�s:�
����

f�Z!d�>_U����sbl���Z�F����2'����UD{zC����Z!�����������R?e}������������+��:���6��7��es�8|�����E��j�C��8l�g>��������U(]�*WjC��K������U���wO�c�l�����b��uX�~���]�Q��9|�N6m IDATd%��������aQ����;W�i=^^/���0F��+��o7G�����C~Y�g�3q^��gDF*Y6�a��~�^X��
�/���U���-�P�r*X�����j���'��,Yr��Y]��c��]v�<�I�'*�W����-���K5_���N�����t��Z���[��kv���P�)��m��*���a��_>k���U��X�x ��W��"~\=o�>��s��I
�� �~���[4*�C	��}kr�d���]���n��A�C������w�ct���V|��;��$��3�P;����C\�s��Sm��������~����$��Th�5��5����@��11�W�\�Z��|�^t���B0�N�	���s;1��B������yR�=�Z[�>�����~�������'��G;�-U&z�t�<.�},�Tv,�����.(�����%��������,��Z{
��M�����g�{�O���~���+�������]/?�o�����q�F�����#6�y�E��ai�g�z��`E$��V�������A(4�4�,�*��w��'6b�x��t�9^~��ne����B�[r��#��� |M����:/ �Yr�.���1�~%�	����0���,��V_ ��T����Z���8"���J�cL>��|5Cb

]kUC%���0h�j�h���c6�r�<�QQ�D1yNM��
���Y��(L����U5K���c!�����Y�15�]��QF��F���0�Q��P����+O�*��o}��vQ+���4��u����K�0g�:�����l�u��J���'�\���9
�s����$�������c���)'E�T+�#�.H���GO��5�������� �������#|(�����Uoq!���B�C�
��v-����s���OTn073M2���k0�og3�Q�d18����~�������@C�Kq��h�Z��"�a���������~�|�6��?�~&{������>�4@C�2������P��0~�z��"�����o�q��'t/��3\(��������u���{���������7����3��?�O�9������Q<W
�P�Hw���<�P8GE���l����Ta<��|��n�"�E�K7�}s6����w�����)��jb@�����������m}��s3�o���m����@C,�9������1oap�����/��Y���$LZ�]~o�o���.��:n>9+������]����jE��������:������R����-�����a���Jx���>|6hX���?+����g�/�*���E�������9��O_#A����E������%������%;`������K��a�������������&�`D�*%0j�A�<��k�Oh���.f�<��R��b�8p���
,���Oq������t.��s6�
���]���;�B��������,��'�@��yq��S��\.>��G��}Rk��3!oN�>�S{���
g���S����m�le*a��Tm�����}kc���e�=�	\ ���@�.��3��\<�6������#�;d�C��X��
v(h>f3��@B��A�:�5���\Y�$1o�%	4�p��C71�w-�<p},�{�R�������D�9����^��\�����p�,ZWx���!�
Q7{kS�kVZ*SoWgn{�J�\����_� �����������kV��w�x������> ��A�
�����/�8x�~a��'�r��R�K��-~g�3����1�i6�z���	����-�V�,����M���|�(~x���Y��!)�!����y��y�/�v&���5�7��m�xN��,��#��D���I���]��D�"���q��kl�uA�j���r
,��A����l��|7��{?�	C�o����hX�j��YTe�*���7o��o�(����H��~�|��,�F!��s�]�)���3��k�I�B$�`Z���rDV���5L��3���}�5�w������cm�L���4��Y}f�kCI���`�����o='{.8������8Y��PF\��&�$����%&A�� �
��C��s��/��;��(.A��[0�����C\�5j����,�����kX��U4����X��
��`�6�Q��q�C
���@���~�lh�%�aX� B�������:�f�B���0g�K�p�
b8.h[� ��O�BC�z�g�JC�cP��C��PBf}� �mT��+�F C/��S'4 ���'	�d6�1����vg��k�K�
/����B�1��4��.�y^��@�iVc	 ���*c.����"��"=\p��g����o���
`p�����l$������t������������]�!;�L�pr,*�\8{��
j.-�co"�7�g�������k������a��������~r�x����bx��5|��IAHh�|9��.rXk��kg���T<^�'F��L@����|E��n������Q��A
��_+�.��<b9�������R9A�����O1��������R�g<p:BB���ad}#L���
G���oH,!�q�azn�sSI�0m	4�"p������0vw(&������}C����_@L
hhS)��
+���F������	��p�*O���.��\�8w}1jN8su!�iB%����1��x���J�HtG�|Mq��pV-is1B�D���p��R�i�o�n����:��#��j
������=�#���<��;m���y�<���k�M�?|:6��[��N�v�������@�iB��\!�p�6�Q�z';���B].2���������v��o��=����*���=��`��E�����)[�j~�����t����e���8vv+&���+�?���,����`���;L��y�Q�R>��6�hki������L[P�d}B7	�<��U�{|I��AEx(���_��\�+���C'7��G������-P^�J5`=w��}%vZ���}���hm�1��\����Ez�^��<��+�:0(i�	�!���%A��9��.�!l��W�'�<����'����JV���VN�gq0�	�*>B��Dlp$�[���
�_��bP6�<�i����@$�X:��� d& ��w�@����0-#]���B���~���W���0��J��<`�hB��	���� D�B�+�	�����2D���H���ZVh���\O;&���1L���9�r��`�����
�
��$���z6���"��a������kP���%�m1�_���SD��I��P��p|xq�\�3�����j]�`���P�Z{D�z|rq/�sa���Y0��.e�����
?�K2@C���0&C�_m>?+/��~a���N0��iy�&|F���|F �`��T@�^�u #l$(���~���0U��Y`@��b��t�V��r�TU����A�|�u�KB� |���0n\�{ti�����/���'aQ�Jh�y]���O;D�����1���K�5��a����=��fq���<\�@��=�0��"l�2].��j97OE������z��Y	4�����L�|���G��p��T����b�B�s�w�C����u:&�����=8_���P�����>��WC��`����J����h��7���e������'��[���A(t�4��tG�*���.����_��f���*]�>�=���o��:7���Wh G8���g����d�`	4\��W�w2�7���>rq1R�� a�����L�8w����"2gr�0��)�d}��,�0.T%D��\J��i|[2e��7�!a=S|b|%AR@�%������:��9��Rya����V�'^{a/���	Z
(!�i��p�eD'�:h��h��yD|N�SW�<���CI��pe.����Rm��<~��:�_�����"]���2+��������>��s��36�g�'�Z�)����A���N0��kG���u2,�yB
YL-���i���[i=a�<�������XL<�+	qu��.6Y�dm�C<��	�
k~�����p�d�
q��fc�8��mJr>�|��9�Us���|�#���p����x�
6~�@H�m$ZV����_�m)D���JJ��������_{�5�T��g�x�>Gn����%���SY��.�0i�MLh[����E9��<R�>�5��o��x�y��~|�7�7���R��A���<N�8��5�1�RY-LQ� ��k�%�`of�u7a$�l��/����Hh�9vz�_�,����G�z����5\y���
G�I���CN�p}q'�Z�S�a����S��61�Al0A{�	�_����k
��!�!7-�4@���F4�B���p��9d����b��y��wh�e���K�&��4\�����#<~�O^�U���5d"�>V�JB��~�J�z���o�<�AF���]�b���I8��?v�2|	4p���q���\�E�Z�����w��X!`����q�j��W{@]���./��:!4��^��w8't-�������7��e�����A4$}j���4�����M����e�Y�$���������p��uA���:A�A�#����O�P�
p�UK*4��:��Yv�������"����B�R��g	����$6]���*O����Cw�o��(��1{^�ed�r��D��+����������}�[���V@~���|l~|�
�.	{�� ���
F��
Q4Oy���]�����/n(�T�~W�
W'$4
�g�r(��+�]�UF6��AT`(����sv,�.�(��{N?@*�hH��s,?z?7�#}=�&(�d�*,��
��l���a��FE�KO^S�a�*F���^�076�z�����s���7�{6�������M�]��"��Sw�a<�� ���]��@�1'��i�.sS�[�o�\����"Le��U�|�-
o��{mW���Hh��-��*��+���������=	� ��q
�����>���U1r�jq#�r�@O�F4E�);��
�����	���_�L.���E�k�AX<��N�o?y�
��u��"��>T	���!��"��Vh7q;6�m���vrwlt|�}����[/	p]��!\q��[lQ]���i�n���NJ��7A.�.�q�� �b��y�alt����2��X�`�������?�OX����:�/-���� �P�HiH
h�26F�j9��������!��b����[�w��Z����p��	&�����	2��R����0C���9��=���{����.������_����x&%�K @�Y��$���7a���I"(?E$�����q	mx�Y����p�P�A�u�
�M[`?x ��R_�"$�9~�T{�,��N/�Qca���E�H���|/!����SM ��E�e��W�pY
>�V��[gi7!���`������o�.V��up���k<���L�"0W/u�V]�A�����;R��S��Dy�B�A��\`1���y�:�E�FPFy�A+�s��Dld�W��q��S��u��?U*0��u�D^�"���9��M�R������8q���-tx]��@-�2K�j%l ��z��u.�h�D������9��:"��
�6�f=D��^sR*9�L8u�;�aD`"�����Zr�u�)���-�w�3O�,!�bD�
����=}��%4r���G��e|c�C�����H�����}�u�'>�J��z�N�������p������
w�q���6����5n/~�G������=U����>�\��*Js7��������;#����~^W}$HQmni	B��4�w	?�B�
6�d]cT�W>�>p!O�)��Y���{�sj��Ih"T��:7)#�r�|Y�5��������P��+�@�.8PIA
!�����<\���b������P}�^���)�k}����I5�[o���UU��c��'����PE(7ZT7��c����X�{�M�N�{�H����XQI��A�.(%� ��=a2���
s�+0*A��uVR@C&��(M?�OA��zB�2?��H���;�������uuQ��`=?M���r�e��ul�g�}��������Y�H8���
h�S��0 �+��H�Ap���g�����]����/�zB�R�a��������_w`�o��|x�ET?���(	4v�@0�>f��.�
��A�rMain+�,3����_���8�pG���;�
����BH$1��j���%���G�q�������j�(^�2�<�(A
�� "�d��\9�S�� �����
'WB
�'Ti���o���tj1��b������8�A@�HX�D_sW��Y��)�5�
0��}��w��7w1l?�����%w�%�}Z��.~��jQ����C��I��
�����B�P]�
h���P&x��`�����(h#}����r��!���0���Cf���{�]����*"�RB���N�|���_(��� �u�)�O{q!YO�C��CB"�	4�����'R!"�C�&�u0"x5r���'���@�*$��4�!�U�ge�!���KB����db9��v���r_D^��B�5wT~C*�z�&�oBK�o"H���>�|��u�RA���%�����%4q7}�f?C�������B��#q�;��4���\������j��%�������P�5�G��$��<o#�j;�:7����<����	-'�Wo�J
��%d���Kn���p�Fv����\�N*;����m��g�'|v��b�I}�{9K��AB�y�:�Y�f�yQ(<��j��+�s��,�C�q�H
� ��P���a�� �������1~�L���8, �EKT��NPA���>���.���+C�`o+,9?zt����}�I�|#���8<��-	Q�������)�&,3eZ�� F�k ���q��1Z�%��(V�*��8���<�|��^/	b<�8���p�cH�b���,'���p��/��
�D��}�s/�1�a=��f��g>�4�'.|�%������a���������/C+��+����
���������
4e���xJ���Tt�3��������=��B\�D���m8�g�@��g�1��,7�����Wh���>?eL�%����d:����
�D�z~�8O6�P�
"rb@��2z��	��K���I�J���T����o�Z����B�9\x��x@���1�d�Y�7[yH��S��\���4������;����)�sr@C����V�o|B���	5�e����/�hZ}�PG�N�a�����W
;/���Y V0�PR(�l�zn9`Me��`kn�/|p����M���3�:��_R�aY�
�b�P�{���w0�Ia��*Q���������j�Iu���K�d=J�q���+wy]Rq�\1�=v�K�m/\O�I��.���������3��^KfC]\����B<8�2w7e:��&�s�/��������9�M4����Nm0|���IYN���G���TcP���

�9���
�A��J>�h����7�q��]��
�kVO����t��~[���v�
9R���L�@	}��Z4s��y���(��|C9*QlAuc>�	k���\��BC��u��h�y�7�}��|h�|���4��m@�f\l���a���D�M����i���_�u����m���f���z���=��Jh����.���H	��(��S?�C4$}�i���4�Q�?x�X�%}������p���|��'�;��M,i���M.�4�q���'��c��p�/7'l��
�>�eMXDDq�X����T���4|�4��g{�{� IDAT��$�)��K	����o
4�Zd��C1\�S{o��u�1��R	48fq�BC',�1e����s�)�������W���p��	^X�Ywc��&�����J���"��S>n����v�C
.�2�cU7i	Q���<}��TI�M���B��~y��f��5���N[�m#:����R�!�����E�s[����NU��r�(��B���H4�����T�8�������E1a{��jN(4�r3Y��C�������$�D���q���t�pW�k��8����� ����-�n!}n�lvf�H��m>|��lsB��!�n���"��sJ����o�d�l���Pw���
��1�ce��l�0u�8�!.^�k���7�aw|��xV�?l��F�6��M���!���Tf��e/�w��a���x��[&���vt���UoJ����?P��c�J!�>o`=�f�r��/T ����������$�U*w�z�L��������F\����� ����.]�Z�t%,��w��!��T[�������K���Wo�}7	8(9���ry����T	L��������
I
Q���|�
��d�0s6������%hA@�Th��E���=�y����B~�@������j��v�A�~��B�y���K;
��!g��,B�Th0��c���L#� ~&'�c����?������������ut������$�P�,�s���0�W�� ��	�����4���E�Z��� w.��,�nWB]�!& ����+����G8q^E**�A��/ATN0�_����4D�����o�3���7aLu�0�6�TU*4V�JU
�����QC�}
��R�A�`Ni�`\�U�A��m�PC�=J�0$4 �S����b`.P����a�"w�n���e]$���b�Q6s�#'n�O��Q����h%�pA�	#�	�
:9���C��`���Lh����~#h�_

��r��x����ey�(	=�%$4���g> 3w�������c�����BCX4^�{�B?����oQ�a��*���)4lz�������Q\T����O�����n��FVi]Q�#I."�����#?�T������h�W��	q@C���A��j���%*>��G*@��B���gh�a��=]$�!��P�A�\�	_J��$$4;��:�b��3J�D�
�P��0G��z8p[)�[�.�&D�R��VA=}���s��v~�G��	{�0���R�A(:�y��N�&"N�������r��b���G�	q@C1B�E�'�.�'��/��TjA(4L�B���c���P���7�oF������Y��E{	oZ�T

��BC�|M�����������BC�F���@O��K�� ����������YV�+p��T.5@B
���5������2t'@ ����4�����
3�B�jq�;d[5��e��Z|M�a���<�jTl%�D���������~_Y�����%D�v�%!T�n��>o�����������6��0a�,X=������K����v������[�=���{C��O?x���Tz*9���U���B�+,�0.hVJe�g*q@��6f���!���5���J[�T��4t=����_u����4��V
�)��-��-�GJ�Km!l!7�M��5��*�W�-*�~�����:7"��Kk%���� ��K|WNA�J'�
��c�E��*��������B�/���

�4�(�2�J��JRoxC��&�n"���0\�vP/U0�>#h/�P"!����H�r4��'��a=Zf�.~c�EXv� l.d���U)4P��3�� �I7*4P�B�Z�(�j\[����s�k���S��w�g�S�����������#2<����x��ud5j���r�	Q�d��P>��&����z�6h�vFTT��-X�uZr������D��BC����-[�b�-.b�R���5�/A5�-0nV�`
�B
a;�P���,y�	�qn�K�Ay��XT�6���H5���M���hhP�\������3�8��>h�b��/jT�(�
s�"|M�a���3��Tn%���H��g�mG��}eYS&���%?�S����[�L�e�L�� �as��q�A�P�V��8�\h�<q�T���q�X�O�>J��+�@�MDu��P!��q���u�B������M�.�G����f����Th���3[?Sh��6����T���4!�aJ���3�!l'2}�a���X
V���2C����g�"*_��o��@�]����;�\L��gz\�I)4����.2Yc���[�s<��2�S*4K�����i�	�_�v"|����<��K�Dcn$pu��?S�a�:��p�1��ZjR���}Q��I�T~b@���8O@���#�����6q@C��@hR(*t,RI~7�jki7!��

�\B�B�%��$(��xu�u��U�����%p�*M3KY�:!9��S�<Xw� ���}�q@��.%��G(4P��|.�G�E�.�6_Sh�<�*:�>�F�����F���W��K���?{�u��`����c-�~K/���x��~ar���T��
�2B
E���8���y44�E���q��x�}�|���&�(+�&D�R�A�
tP'$4��[+����q�����@�n&�=n�N�	�����v�bc���ZR�u�.��`>�=�g��3K
����M�����
z����FBXM�}
�����K��A�:`��U1P%	+���H(!|4�<U+�BH���a���(S�sf�?���.������.]�o'%E�	��@CpH(V��B�X�|�6����M$��
y�:�������sr2���E29��K�6�-����d1�
�e+#K�N�!����NO�A4$}�j���4��h���*�O�	��Io���(��;=���PN~K)1�4x�a���r����5���Q'o�����/<a����,Q<��g'�:@�v^�C��pN`�E�!�wcQ<�p��1<|�k&Qh���mE��}���@O
h��)w��(�����s0�/�:��N���U������~�O��I%�S7�C�q���YN����SQ������u~���D��d�)�Ne6�k1�7�v��!�����{�B�����}iC��������#��l����_���E��0c]���99�A�C�����O�B���y�S]��kS���)"�ka5��J�������^
s�5�p���1���+A�I��x��	9���i�FZT�g ��#x��cTZ�
K����?�"���	��U�
�G�2��m�1��kB���y[0�#	9Y�����t��x�1i�!��_�O	J��sw^�'���tG�2��]=�^�2Db�K���V�=����
��
�k.�
�[�D�'�V��
���o<�����Sh�����^��IU	_r~�4���f��N�;mL^�N�R���4�+U���o%���[K;A,��/��2�

��)����������xE�?G5���sgF*E�|��Ck��
��d���������'Q�-7�V�5	�A(MR�^����S6k	.DqQ�����s���C�<�RM�W�	~����	@�(0�;�=�,T&���?� ���������
��$	1N-#8q��;*U4��M���b~Y�[&.=���DBR@C��hGA����+�r�4Xb,w�~}����@�����T�h�Y�E^[|�� ����^��Q��P*=��[6��J���t{aJ�+P�eo�r�	>�����I
���]-v�))�k(�>��!h9wa����!��@������z�A�'�e�����Z4�~���Y���2���������7��P`0�]����V��Su�5!������ZD�*4��`��P���t�����*�]�a>���b(!��
�����D��[�����>hG���/�3������;�aB���0c��LTw�ZPh���.pW'U�x�����������5�<5��F�JqW�=���qE$$ ,#���{��� �����\�c�\ ��������e]��P:0�P����a��$"����J	�<��B�	��>.=��U�����(_���a�!��r�!3-��m+�7=�������0(A��w�e�y�MZ���y'�/��}%	6(d��h�r�/�A�!�F�Z�:�?"����x��p��|~���:A�j�\������bf � ����`dk4�]X5(��Q ��Y�"X�"�����9����(�}�P�������L0�}0-|~-�|)uNo����(=��lC.�9Q������0��� "(�.��D�r�|P 3O�����8;��;n�
_.ZR�]�c{a�!�)�.@�|pb���JE��u��a�J�-$4�~�c���B����L+�8�!����)x�k��F%r�R]+M�� �������s@��F��,R�����z���F�R��k.�;����B�����G�r�Xy6B�]XGt.o@B��BC��*[m�X������-�������.D�+N�t���D���p��Q�
-)�?�]-�����	'��*)���E;#�������(S�K<����e]��7��B��8uy6aZ�"�m-]����mJAW�b��yv��'����?; m*�B���S\��'�)V�������(��3m��eq���e�u��S�w��5��6�J;BsW
Ez��
ysE�f��3���k`g�
���W�/� �-�Q�Y�1��R����J���  a!�D�_p��=s>SD6/�C�����G�*.�<�7�������w**x��KiL����
����s�&Y����R��^�PDD��4�O?� F�����vwyO�~`1n?</�!�?pb-�����]0ff;$j�
�J�T��};O����@��/=fc#}�M�g_�Bsxr,�^����>o�0��%-���!��'��/���%C�J��6�;*2�s�^A
�m*T���I{��}�HOk	�+�rL��;_I{	�0�rC���Tf�"�������f�u�QsG����7�B�a���8TG`�~)�q|3bZC�<�.t���8����PA�q��h�KpL��C���q��*��9�c�����D�����#��@�!���G���:�q4���N�1���B�]�D����T��b��{�����-��%p��1ts��LU��',�Y[�R���~��F2m�-��������P�2Y���^q�r��_�
�&���u���}^?�.*�v��k���r�}�rMdE�?����S�GC������D�������Ay��&n�������������A�"�#��S�*PA
�93���Pc0(SL*8Ds�L<��a?!l*D:���j�x����ci.�'��9^qN]7�+��y���`!�+Y/�5�1�**�3��r!�����J�Z|vy�9�$����6�<b�x�l�P(P6hp�]-�s�z����f�;���~A4�t����*%�{�\RqA(7���]5���;w��WX���B�k�b(B9����c�"D�F�$�������A��nB�?�G_��/������\���z��aeC�E��������
B�B(,<�%���x?@��S�N�� �X�R+�`��8,�*������a�!`�>�fc;�.��L���2gv��)-����]>�����D	�����|����.��En�DK�'O�����VA����9tx�<F�j#%!)������'�e�bB��E��Q�����I�Eq]4����Tbh���,^
�9�����!AHR�6��m��������N5�K��>y�	� �h}U�
R����S��C�<�q���������6*����P���u�rr�}��3x�4�S=cT���]�	���Q�!?��j�h���p�x�&�0�����I�R���-�F���yK���x������9#��([�Tt'�0�����99��;����P4���&����
sZ�W�|��[�����1^|����� �b���L5�-Tu9mM��I+������6��c�����#����iO!l,>�1^ 7��G��}������4��7�����e��3/��N~^�16��5��29��U�����p�1�Q
5N�������J��Px�������S��x(K@CU���:N�SN]�M��_�!+��}���
����9��!1����pu���M#W���������T��U���[��~+�1���[8��R��{',�wS;���GP"�������B�x'�CKn���mk�"�S9Q(4�M
�
���T0��KS=H���0h=S��h���qtgh� )*�"D7c���hZ�:��:7��p�n��/^����hI���

qO�c	~����q"��M��ntB�����j
��:46�:�E�Mm�K�!�,e�X�C�C4=�T�4����C4$�C�!�
���_~�5�!�y��WhHm�-]b@CF�gr@CF�kZ�g9��|�f9����69�!��g��	-'R[1#.��s���/�K�4��:$4|����r�i�?��Oh9����.������&��Hm����T�`FB�����X�����.�{�A�g�����W��Cj�������k5���Z�t,<��DZ�jh������Y��wXZ�Kq��
).,'HU��p�V��P����9������3$��H�|��+)�!����}2@C����e���kb��Mh9��6	U�p.F��3~�$�;$��H����/)�A�<2R�����T�/���������}
hHK~iI����<�M�����y$O4�G/���
?��t�6)��J�p��h��\�sA���U�(w��]QR���;��4x}���%�0�F���&���u�����j
�_��v*:�J5�N���-��_����0���9lH�j����
�����A4|�l�
��
);�!e��0vz
������FT�Yw�6���H}��L�����M4|��O�!������R"�����������]k
����
I��hH���=S�� �)�u�F�:=<����{���M�
�.O�!l�$B����1�����A4�J�.����
�0g^�TGa����4�����=���m�a
���C�hB
���}��r�
���
��K�|5@�4��)��Q��4@C�?Fq5�
��kg�h�X��	hH���
���?V���:^����E��o���*����-���4���4@CZzO�6=z@4�G/����(4d�c�_2�Q��5�(4|���Qh���@����c���IK!{Z�?�������5@�h�g�8Mi�HEh��Tt�wJ�4@�hX�gk���^��A�~���R�_������p��
���>��9h�����hH��4@C��/M����hH{�r�
�(k���{l2Z�4@��?"���
���c��S�a���
�����_p(5M����h�q��h�
�A4�8#�z5�
����)�h�7���E4�������!m=�4@C�� M�o���[���#
��q��h���&��L4|�#���1�
);�A4���I]l�,�
�~-������Q�J���Hh���@��G�z@K:��)N�mh����L
oood��%����	4@C���� &84������-t�M���&Wk��X�d��#������&^�+~����M��6�Vi�� BE011IS>?Bb��X�����J������LU�
��M�0|y���MP����<>�	:S������j���"�������� IDAT�xG�����K����8�����Z�����%�;�qW�s&�MC!7�In������;3g��������]mD��YGj��*l��<�F����{��[F����f���U���BT�)�oz&����K�|N��V�����}1
�jfi����BB#�K,������a|�22D����R��%v�d��M�;];�+��L���=FGA��{�T���\����V8�3�)c�J���{r���7K=k�$����u�����_��T�G�R7�i &�@�"�����wm�����.W�{��B���-��,4u`�v��4m��a��R��@�4��C� 3hH/�e�r������c���v�V���o�Tc8I��s��Hy��O��Q����'U`/#$�T�_S����7��w�3�|Nz@�<�S ;��me�Ky|��s��^!��.��������47���9y>��<�W�V��9���s�����4�
O���hHw���@���&�R�@ �0I��g�2�e'���4�o�>w�g'��M��Io|�r��s����|�
���q
s)(3aB��o�\]����7��wh��MMMuy����4�WH��������'	4�x�"]rr!�2�\����S�Lc6K5����� uRU<c���tp�Y�[j�Gn��(�r�C[��a2S���VU�������CBB�}z��\�j�v��rdd$������������jSq2D����|.H��Ky|S�������oR�����:�I��Kq>� ����.��M�����\Z�?�"�����|�H��(��T�7y>�������iy�*�{f{.Hy|��|N��=-����;#�����-)���{@Vh�<M,����$�|g�D�r"�<�So�T�;{N�����O�;�����^���y>'��R��|�Ky|��s����r���&����s����r���&���w����r��G�G_������\�/�h�<M*�0�/L�����Ry)O U��2G.R��2� ��p�-��@�4P����4H���s�|.s�q��J�����7)����9��wy>'������|NT7/�s��~4GF���/i����-a������<��_��g��"}>��+����aff�L2�^i�A�*�3�������khh$7I����+��=QI^i�	�W�anb�����,*���B��=(+�>���Qn"<<���*����[DS����������m����	
$�����ln��uM����������W�7U�)a~�>x���w�H���#����~���haC�o��Tg�FH��'����o���_����Is�����1���i�5�,[)�oA����;�����A�[;������}��������
�[��.^G*�P
��G����[M�h���`Z�BO�_�:��{Oi{&7]F�o��--��b����Q�j�������~�@�4���T�[��J<�#���(����2f2�vQ8Y��(oh�w�����8����zp^���gv����MpE�4NI���#0�c���2����r����?�f�E�+�b�|�����V]�?��x�����^i��G��
�Ua�rV�~-D����~�J�QmF���_��E�)i�/��w;(-�NU�:�:��uF���gn������G��k]��00mm�W����~�^-��VFhg�&/�����?3:��4�5�?�����= {@�@�����5�5Y-
2����mj���b�BCj[MN/I�@C�ivY�A}d�!��7�-���i7hP��H�%2��R�����hH����������.
���	= 
�f����_�]e���jO�6�d��d��jHXY�!)4�X��tO�����|��(U��~����Vb�_=���>5F��C����/;+d���k&���{a�����JeK�z���d{�����hX�*��:��Y�q���������(k�|��< 
���e���t����bS|9�X�;���?���c�6����@�vj���__���ag�O�t|�*����~������CG�_�Bi[��@�

c6��3���]tX�29&�]cO!"����a�v(��Ggf��^�"�E�l�p��+^�z(����;���
J������0��I|	���:�bL��?���4aF
<7?�u2j��}K��i_���A~�vd9����{}|��wN�R�"=�[��9���(?uJ����7��l��6���h��_�h�Ju^��K�S	@������}j=���S�,*)C����0��R,�>}�������2�v�f05����k�J���u������37���t����f  �7E��&Qz
fY��h|��������(e��S������N��).�Y�
�����������0����a)�/3&J�aq����c����>Kf��-���������G�?��n��R���i�f]S����T:��Y�����N��sE����^��(�_)�*��q�a�����|4&�����2�BC�RMJcH��.�}}'������6�^�Fi��(AZ
���}0�Yg�_3G)��ZX�(���b9��y9L��Z����|�p�����L�@C�����0�����Q�UX6���G���V)99�H0�U5����X��w<�3J���a)���a�p��
�����F�2����iX�$�^z&=]������U��Z�4�@������2�B��9�1fH��Y�������4��O�8w�&:�������
3�v.�m{�ap�N������O��adh���b�����l�0�/�����]�S�]��Czc��mh��!�MM0w�z������~Zq��L�h�<�'
��`Q�B_�A���j�U
4\�9���'�S�t��0�I�������)��y�oM0f�l���4���S�f�8�%ke8�P�*+�Xg��g7S\��4x�s�����R-���;��j�����IQ$�P���T�������l�;�4���!�4���xd���h(��$��+���g8�����a�fa����4�7�2q��&�x�P�<�h�Y��>�ED�O�
�Z:p�=��MR�W�D|���^�S�Gz'T5�P"O����#��f
�!kvd���WC�h������Gt
�.�M����]I���
h(����)��w�Jhh�f:��z�G��@�s��(���c��R&�h��iFl^������kR�
��L���z�^I�&���?��p����a�u�2hx��g�Qh�������Hq�	&U��l�����R�~�R����(�}E��)���|!�����h������Rr��e��ska��=G�~������073Ea�|X�j�
""#��G{��a��062B��p��e��p��9��BBm�
X�yBB��[8���_	B����7�����"�@��%����V��Bg���U�?����yre��P�`cX����C'��!g6a�|��������]����\u�
|B#0�V|���s�[��U�(��MR�(������Y���n�U*��d�A=�-K��
Mm�=�������|Dx�����a���L,@�8�7M���Hd�:���-���Q��0+�X��rh)�?=G�!k��zv~~�v9�5"��'���h�A��
a�A���f���j�Mm`��vS��wN"�������M;Z�.�F��cI�������q��6�|�A�]ad`������4;�W���/y[��B�����_��&UG���3x��������C����������q6e
5G���p������������eB����������yk%�J\��y��M������t� X}!��9v��
#=]�,X�T��cG���.�N�����c[��x�����`����������v�������;�Z=�	b��=���;�,����6Oh�6�30��/d5#����z��TP�<��1|�%�8��?�����#7�����������b����6��{'�t����^���zW(4�;u��?�nF����h1�����G������H��DsS�.�R~d�'����)���k��_������@���9�w;����?��,Pe�8�l&]9��Y��y�R���W>�D�����>����4�3@7�G�%��!���HG&�����
v��Y-�#�9�!-�M������1��s}��W`���XT�=����U[b���]�=�U�qU�����oL"wJk�k�a��=���R�G�"��-���.���=/n�<X������c��C������/��
	e9��@���������!��-����D(E�h���vq����c3Tn:{����\��p�g��G���

���:�PW(\�	L�Y�wQo�����e�t�}���yb-|�_e�m����+�>M��t*��Y��<����w�F�������/]O$�JM��W_�=E}MS�����O<����^�.=o
���BCh�������}�(}"���E*6�������|�}VY��=w?��%~+��ol:j+������N���uQ�mF����0�v��a"n[�wq�������C�=���+bP�nw��(wK�yxA�GD��H5�L��$f+'<�ej��E8)!\$������R�:S]����������h{�b���H����+��/q���7n�b.�_�����g7`HJ:to(�.�G��������F������Ph����A�����G���(@

Z�z�����B�!{�2tn!��_��Q�~/��1=���t/��7�y�$���
4F��1ZZ�8s�_��������3)0LA��]aabE�����r"�"���1�{j�@*�����g� M^�'���w�3����w�n�\���UJ���@��L@��%�B���g�/^��C���`O}��=e���q
���o�������#���{N{��F��P�D���=B��}mB��g�����Z�Vk#v���=�><��ns`F�&Vy�|w��w��*Mp(4�Z�P��4_������yw���"��=��.A��\4��c��?E�H�Ixxx,�M�P��y]#<::��aB1A�������5�R�l�U���������Ph���C<99�*���Yq�>>�k����M�	6���'��1���H���>��`��2�}#:\������)|?��G���[�-h~H����f *<������Py�|kE��;�4��D+X����P_D���nm���#�� �bn��ool������@���
y*�c���|xd��[UGR@���9�t�m�6^��mO���p�y�TR`�R��L�D�z!�CQ����>*~[=p$�zk�f������yLJ65���bp�P����G���@d����zb�s�X |}�Q��	-�#�?]{Y���HX�j���@|x��5�ak�M�/H��O��Jucq?���H��p�D Q�;6�"_=0X�I����#G.])f��$�|�H���h�����������`@vW�n���D�BE�D�����}����%c�p�OR�Q(S�y��.��8������=����T�j���K����q��7�(^�f�Z���c��X����+H�Bq8�C1R����������52>�'������������pb@���5�w�E}��������X6���>c���hV�3�������q����W���wa���Sz�����`I�LY?���S�HL������|��xO�^�&,
�1��f�0����1��AQ�\���L;��s<�~��������: �ceq~������*�Tl�W�/�����V���������'gaH�S�����h�l�hL��g��gq��&,Z�K5�v5���c�;m�/���x��'��-���]������\���y��KE���Uh�zLo��v�����c����a���O���������z��E��#6^<&�zE�x���?&��k�|������{��������N���.�E�^>�'����0}�F�h�=�OC�����L1����
�k7�w>}d����K'���@���Q�H)���K��Ph�46����E.�����\�/E������
�:��V<���Tk���JwN�<���
mm��5)�j�K�;��@C���~��;�=>���Y��qd��s�!�t'�����Z�y`��{�L�������-K���S�&��ZhP�uG������w�?k���(��\�(Iv�$�z.�$%�2yt��]�[�jXy.���W���7���k/#q�Y���>5
a���t9,5���> �����s��M�[�������j��9G�ak�������!���S���������B�����[TW<k�
A>;-��.t������&���5�,��Q�s�����V�y����DT���ET��-n��w�F�M�z���g�.>�M�U������	E��|���Q��U�C�o�&����H���"��M��}�O|(����v���0��+ap���+��������E�����
��y)=,?����R:Hx$l]mR,���u	P!_Q��2�)>�?FS�e��$E�����L��������u�M�0�L�o(� �Q��Zh^Z#v
{�W��������o�>	����WQ?<w�U$�>�}�My}�VR5D�;��J!
2� 
�sO�
h8r�"���P��H1Y�s�	zth��v�K��8x�J+�|����K<z�
���E�!�d�X������w�{����c����R������'aAvHx$��	I0�P�P�������+7\��y�8��/:{�����>!�C���<�,�����x��ol��9(C*���S��Y%
)��2���@�Q�*0�_Z��0q��Z��o3��	]Z�����������^ �$MK��7-�$v�����A	6�m>n��"��
�7Z|0�W�;f {�%tnlh����aD�"W�>�vz[X�B �
�����$�#>�F�������k9�P��������C���I
go�BV���1���PoZD���k�����yv�^
P����j�.�p���E�Nh�������}���c���Kli�����Q�P�~z����x��$l-���(�
,��:���dM,�����k�nk��^��8��!F�o����������V�DA��x����+�7n�9��#������e�*���`@�Z�{7Z�*��7o`J��Xu��:�A0}�:t������N
p�g���S},l����E��d���^�>��������n=�q�*���|�v8x��5������G/t^��d���ka�>��d)l�u��6��Kdsn�g�#p��\��87�l��E��'����l��](�������Zq����w�G@�����X�n�@�(d)��,����
F���*���],pq�O��K
hXR��\��\y�blaR<�Br_��
����yx8��h,#�Q��4�E�
'�>���
���t~}_@
|<���Ja��c��W~^J��z��*N����`���c|�����e�c0A�J��	*��
���70�ZkK�]����W�����)���v�k��~:�^���.����C�����y";<ac@L�>���,g��H@/��0
{����gi��:-��I�
�A�@�}K��I���B�N_�y>�Z�0=��ce�~���<pb
\Z� ��
�o"��]��-�������X'`�+��f��\���`���y���|�v��_
�����R5;a���d�"�����[��hq��X�r�0�v�NcC������(�m����q�������n�Ib��f�����A�^���R`��t��06�g
]W��>��~�t�G�=�I����@��xO �]�B��w@�0Y�*���{^���S��q�����C�i�����&��a�J,����o��N0�"t��p9��:s�@Cl;�%?��~j[��~nW
������_��/P���� �3%u�" IDAT�� 
#Oi�c���U�@�@����P����+�H9c0��>�,y�G��"dER�Q�>H���
	�(Y��S�v)�H�+'E�����.7�������(�a���al�E�gi?�Q��!]f��9�yo=����\�{���^`���;�1
�*
��c��O��C�=�l,��9�����h\�5�5��{��t��u���y����z0:�6��^�������m�h<@O���+{����lk�G�l���"����c����Q�1�R��=�N

�y*�"GI�����k����P<p���X�����@��J�z���0p���WW	�����p�;D�g����-pH
���P��j��������m=ab[ n���mD��?0���-r��"T�U��7Wa�XK�>�T�[�l��S��lg��}��j
���,������D���������/X��K�=:�&�p{g*�&Ag�X}P�BC��=`��8�
�@��Y7��=8�R������(�r!��ad�a����;����hc|������C�EUGR@C-���X�(�����e*`��8<~ZL���2�0b�2��TO>��c���� ���_d������������!A��$
���SJ�}
�ng�Mk}P�(-@<C�V����Z�sK��y�=�{lLx��&-��W,h�@_kl��Z�b����!����	W.���1��
B-T�aB����]���)
�>@�@4�iI�� o~=�QY~���������(X���z[a�2o�tP�pl�	g�����U��h���#��v%�53�z
�aBN���`�V?t�n����`E�B��F�;�BC���dk���c��ru45�B�j�|�^�D��`���x���p��(Y������|���],���>��-2�~����
��B��b������}X��A�����B�j�1g�(�-��>=�?�1��|LZ7��s�bH�����8��u�s$4,�Lp�}8�"�wp �	�{�f����7a@p`�������)���?��������~�n��8�-�����h�nN���������G��D�������/�
����a�s[@
F�t�6��!P&�$P$��w�V��8C�u��o_����S<t=�����������fc�����_��
�����H�]0�JV��;W�{�T��wr���`���hA!�|z'`�y�b��y�8K�J�^��t�8oHs�K��#���?�+�����c~�A�u`3A�~���������}LS���kO7�<E��B0A����h)la�`r����b�=Mf��2y�A�
h��`�O>^�\v^=���_����lh1��G�ol�n��rv�5}W�B^�lp�����)4��Mg��+���,�L�Y��^K;bx���.�J�.�O�7����P�+���kgj�&~�v�������@����;H��w���p
�J�g�W�(�����my=jwZ����p�Q8}�D��:h�D@��Z)cZkc�x'\x�������9�
��o��`�4��\��.��A��z0�qs��P��n�e�`lc���*t�s���4P��.� ���!�	�[x2�
�a=-�%����p���nQZ���j��5Z�.`����8����(t�B����p��Bu��e0��u����
�?-�q�������J����N�"����
�h��$����p?����h��*T%����u���eE]<jL4�`�PhP@
���o��`�kj�+JT${uh�H�.��_��gR

#�aA(w)�����nI����C�m�9�9mMD�a��/���H8D��=AC@�����BOG�hXD����)��XT������d��Ka��a�A�����2� 
2����G�������k��#8$����X�A����`��5���n������31l�c����4���8^�~O/z�/Uf&�D���
e��L4�_�� ����0��	�)�D�������)���,��R_�@+ET(���Me*_+
(4�����snA_�&��^{����'?��4��o�@�z
����vg�����
���B���F�j
)���Cqx������]���.������k����=����>���������B���R@(\�\�����o�k��h�p��O��c&>.�����[�������5*���"�b���w���K�L�C&4�����+�9:U�;�]�go�D������Z�rg�������[�7{Y���
�����S\�<������>�!\x�t������1���������uT,�^(5(s$4p�:���s	�|�����;o���/^X��z�[W�>)5�j�����)BN����%:����hW�<��1z���m�#��~��������.D6w��'��z+4���6������omY�!���YrB�mnG�������#}�w"�����:�?�����lof������R�����AB������v�]H=�`�_e����c$�m�#�o#���I�Hh57�w�]��#�{$4����*�c�/�>���0��p����_�-�����x;M�U�
S��]������\�0�z[��P�6;j�*�u~�>��(�r^Cy+�u��	�a�v�--t�K�i�N14�d_��}
�J���������?�FZ��C�/R��<R��F;�����B�4(������� ���]��"���e����=����+���-Dft��W�����	8�*��-������v�/��A�����|(��"����Qh��Z��o�WA��]��i��"4�6�v��~P�P	��jR����;��BaZ���e��0#�D����u:M�)R����>>��h8C���Z
;�`h�:k~X>uHQ���D>b���Tw\�m�2���A'�|�(������u���u��n\4���1\`n���J6����T��4��z������P�`��\+8@q$��a�Y`���N���|B�"+�1����a~|�h�����;�^����uq@���C��3D�NlG�}p������?�8���/.@��w�z��.V���������4�8��th��W$�c�H����K���m��I�&����\�3���^�F�����-G�!)w,w��i�2E�������kw,�<����4�m3N(�.\�
��������0��NV���clL���U!��v�f��0w_�TR}`��_��x��LH�`��5��\[@n�L�����"e��X�w6Z��)�.��J9�?t��Q{0j^WL�
������;�>��&���z�'������K�O�_��B�&�*�	�vi�~�iQ>�?�Z�e��0�Z������|0L���e70�wm�2x{s��2�
J\����f��.R����@�?<>>��+������z&���6y*	�����&���� E��m��������0X@|�������I
��HcJ�;���s����px�8������}G��&[���R��ut(�����HRo�3���Cc����!�	�X-�I�����m������9	A_^)��?�>)��7��k���a�����������F�j��(��	s�m���\�Bp��K(40�0�M�Y2U����b��m��;%@�h���BI���0��F����`�-�|��+-z����)
t���	�k�`���|���-��e���������6����0��}��C-��z���}���C�������Ed���M�h��B��%���h`���#~��j5����+_�X����gx�pF�*�������A�����w��6��CQ7���tQ��	����
��� �)th!�AV�PycU&i����py(b�*����%��G�!�Gb@?����������2<|}K��C��M���
��(�uG��+�X�����	{	\`��O�����J9UF��e����&eob@���kiQ8��n�j��4���k-~/���r�U�
?��B��P{G*"K��C�f����z�pA4��*��mgb����������w���	:�\�-kz#�C)-�F�VB�����^�����qy��k�Pv����Pm���j���	�z>o_���nB$h�t�(WG]�b����3d��������#�=��+�����A�����4��O�#h�
��|�"�=y��(����������72�[0�v�G���%���	m$����oakf!�>|����C���X
���	(�3/�@�@����`�y0��i|�m�&����X�c�H��n�W�Wa&��iN;�?c>)H�'%9������G}S
�&��T(P��u�+��0%d���G�����m]�>�E([(�_S
gaeb��oa���J����@���{�����������"�;�a&�
�(RG`����D����M�4���	�ZVR��K3��})m�b�A�4����5!��y� (��}A���I�!@8�t�j����=R)*�][����]�����1�_LO
����"��#��[���i�
��v
&l�F��������0F��2��k�g|[
\���.1`�k�Z����������}w"��G�q	]8QZ����vZ��1�A�y��>�z5E�k	5"E]�Z��'�!B@$����#��J���.�����L
hP�H��!�����-}��CjX�.��mRyJ����P��� ��GB���P
����uI�?�9V��I@��f�y�&�dJ���G�< 
2� 
��WR{U����,Y/�Hp�	o_;}	_�}1�W�o@�v�b��-��k�DT�\YH��Z�����(����
��8rH.����BGG�^Hc��]3
o�_l$�s����Q2tHr���B������!�����
u����Go�5���9v>�(
���2���@��7���H�o��{��4����y���A��1I��R�U�^q�&;o�q"))t��4�����R���d�}�� ���V���^B�!�H%���	y���G�Gx�~��D��XY��IpH�kw����f�p|$Th(������������7�|����������2�A�
�Q(��&8/VkH���`O2��s��)��t�������Ku4�"��?z���B��C:0���'=��WhX�6�9�5ka���B�a���(�+I"Fu���+c����?9~4����X�8M0��.�DY}\\������������O�YD�Er6��
as<��5ja��3��FM��C(4��r%s����]+V��>����p��S�-`�%6�� :�����_��y�H��T+3�M����-��q8-i�

���2�(d��b�Lpgw@�JK
hh�T���@_��xL;�u�C�h`����.���m�s��wO��`��0�)4����On@�<EEX����-J��yU��[
)0����E�'ha��Bea��p��g=Z7�y	��<.��?�5L�P�I��-S[i�>��`�aP��yq7�u}�����B��8��r�Y���W(j�%�ra��S
4���1r���!Z���~<-z�@4&�_�7bw�)���Z�!�#�B���k(�CW�bxm������g7�p��xJ�
2�r�$v��"+A�rC����-Ag���������]��=
����/l�p�J1	��:�\����	u�7�T=8$C���8���Z�L��`��P_*�$b��/�X6P(4(�9�V��{�`@��,��������'8G��,��XB�!���p��|uI�������bUZQ[��&��N����a58LDaZ,gu��.����)�XE�������)4<�qH��3���#����R���P�BS���6>��K��6� _�u`_q�sR-�&�����M�*���g@
�3��sb���BQA4�����v7�C7�u{���;b����BP�w

"��2��%�:��������!$�H����T��0>��hA
&\�.���[
8A4���=��"�6��7�k�P�9w����9zi���|�a*�>)5&��&"���X�i,
$s��m�����ti��PvxN�'��
�@����Za���

��CB����`�7�0
n���H�$�|�E��e�����]Q�-)4l�)�8���.}�7�$URH u���r4�H���P��^^\�l�������U�=����k�x�8#�

������VQ���\�{���MmI���E���J���eP���AF"1����xs�hG������.������������"�C|��@���z#����n@
a��O��k4~�gx�P0{.t����-E�R�)����^�������w

F��tH�����>�sX	�xa})�"p�!>�3��BA�<�s�r0�4�]}O��p�L\(d��~B����D �B����zFe�B����B��A
%��������h���I9��bE��E
p��*T1�����Fh`���T&�}�R�Pj�����5�*��m~(W����P����I^��p���4�;:����>(C����F�b2X��yr��'�o��7�Q����\�h��J��BT�������������B8�C>�0��Z���8h�C�Bs�.��e������9WnO��

����B�!��:$�Hh8���s����p��[���h�w��>��B�3���D�(�����*�g@C��]p��:�n8� �{�v�q@CsRK8sl�g/�*�;�;�J.=��D$������X��-)�4��������Q�Zw\����m���P����`H�������(�J<gR�H.����
%q��5l���	.�':Sx��[���
/�
�U����������B��adr���<�6�g#����b�W��H���Ph8I����N�OE�G��w,�i������Iq����te,>�[����{�p

���aX�����w�t��G���D���r&zP��Ug`d�N��P��&�`���"]�

��1kN
W�P��m'@��)�<�-��
����k�����3�[,�e�@�2=8�����%���E(}��b�}�Ph�'%
��(v��~Z��R%v#gb

��RK#�)�����N�B���ahTBO,8��0\��FFB���p�����q��0��P#x�
#}
�D*��'�U8���H��CO0�����7�)R����n�#j�"��J���'%sk��g
�E!��F���G�W�P
mp��I�������� �G��
���H� �
�D��P��a��t3~�h�%������'Y�B��%D���!W1��&V4R!��F�(H1�~K���B�ee��y�	,	~cU��G�va�/�?F�'�8�F�#!�P��.��a1~4p8�R�1�2(���@���}.�-	�c�s���mH!>v����N2� 
2��>�{��6q.
ff&"\��/a&�5��m{��t������_����O��BN�WhP����K1�WG<y�n�=��al|oV8|�B����8����D�����"����6����5�D�	sS4�	UC���2�OS��d&(4��f�������)04hV�6?x����c���(B������s�����"
�	4��.I�V��^�Bhwe ��W(4pK�@�MR�_i'���-0���>���8��w�<�T*��qh5_��@��g)"�����*;
A��"�$���hX6�	�����e �vq�������1��Rhx�����r�[Q�lq@Chx�]�/v�"C����5
1�V��@��w��"�*
�]L�q�BJX��$���e��7S(
_���C`�_8}k�Pf���gP�`s���4+I�����i� IDAT�s�G��|Lx$4�.��6����?�F���hhZ�j8S��E��U1��a�F���YG�+/O������'1�m[�+R����|	�<=)LE����g
CqK:v��'��,����������7&�h`�'6f�u��c����
�����6Q��I�<����R���g3A�������O������-�)B|�\G@���T��\���\1�v]#�ai{Z�����dC�B��@u�z�:��G�b���bW��bU�"E1��~z��/	�
e��S�	=����/d/n4�9��T's������������
��mL�1��F�K�����������>���GQ��(�'K{t��o���wakh"���
���\!5��/n��(n}�f��%4���F�5��,���z�0�t��u������)���CB��
��w�zt} ��0��.��������4� �����P�"���s�
��8<�Bz6�'���*����n����',?>G��E���-N�$5����@��������p~�,�P�t��.�(��g������bA��Cp���Gq��I���N��u{u���Q�
���h!�w�����v�� /�s��j��ckG�|��9�J	�����E��@C�����_�u����9��"�
�GN���H�b:/�kP?)I�+l����Ia&8�|Zp�4����
%���'V�����
\�����-�h
���~D�?gE�����DRA�B �?-��Q`��"�[���HRK�)������;
�R�F�Z���`�Y�O9�F��
Wj����P�|lJ�����
�	=���)\��Ce�����p��{�a��T�.��&B�"�I����h�L-E]Ya����w5i�X��7F0���m
��K;4m�����\���3��8�!D~~tyO��)W�����Cyd�W2����4d��)T8��]R��~ly��e�8�D�}2s�P��m6&-�hh��B���	���?]k������[d������P�d=�}>��4%u��X��f�A��i����>2Ga�����l�7

Cg�e�Z;��8J�
e��`�&�gN�
�<$�����y_�wJ�H0�����Xi�����}.)"���4R��MJ#���A�6�/�����h�2�p`���,���!k����x���b�q�>X�����C���N��@C�	�p�p��a���D�
	ah�M���"�M����?;;�T
CG����S(�x:]3�I��CB|%(�U�T���B�]
�Q��Hq^��^(+X�.���_����4h���*]w#o��0��)����,qm�:��:}D�=��"X1"���2Z��WQ�A���F�A[��j�a7���3s�b+Gh��������__(lF���Dy|���h�1KA
ysa!
�
o��'c()Il�Y�bq~M����BCN;L��C,R\}�+��8o>gC2�����.���}0`�<Q,+4,�=X�f�21��YX�E���Lq���\eJ��>�gjJ�V�oH���0A�����x1����q�h�T7�7��;�E��6�8w2���BI!����hx#7�����4O���$��{	zh����N"��u"�!�Vn]�w����@CI�!���hZ���]����ah`��PZ� �
uG��/i(�yVcp���Xd��# �#��i'�&Qh�};�`LN.N��;�T&th����6aD��X���E�)O�hT�kP�R��"4O�:�i@�������nP�����6�
�B�d��xI�
�n����P�7SZFv7._�������
Y�r``���R��W�
���V����#1���a��c����Vh�u!��\'s��A��T��6#��w��5J��Y������Pob@�5���K�lK
���d�@C@X��9H{����#�u�,ZloG�����t�R����:����~4T����M1jom�5�����f/�j��R������Ten/���)�`������Y���9��������U.jW?���J�'��(���p�����.u��0����"�Eh�?>��G�����2�:2�(tEh������'���8����}	$��w�0#��]�B<Zu'~sZ��������������
�����d���U����;rQ��:�����g/�����c0u���P��B	��@0Dcj��

4t���f���58</�?
�B���c
i�j���������N<"(�_�p�0��3b�R�YM;�;��0��Z��]�,I�+����&D�\�)����..
�;�����GaQ�R���{�c|��z��$���j�
����h���Q\�O��y�W��<���������kv���XR��^5���@�KZ��u#\�
�C��$���RK���@C������J	���P#�+��$��3�NH�;���@�WD`������I��:z~R!*������BD,�|�h�xJ���
��Z8����@�ym���js(�o\6�kZ�g��E�!@sQ��#������B^8����Q�">�p�6`\E�[��e[���_�J�,=�et������&�M1>�����sS�{c�84DR�X|*4�.\����r��v{8fa%�
	�xN��sNm(BNp=�\V�`h�_-C�v�H�.�(,H|2XL���g`]R��6,QB��U!���P��58��.u#=MR��'�%�;��7^���9k��
���2A�	�c�s�,r� .����������]!�2� 
2��>�}���e�v�X��X�YX<m�J4oT��h2�E����]z��*�!1����6�:,BU,XI/��3F��G��5p��s���Y���A�{���0��$����9��'���Y}z�����;�6]�u�!���Iy@Y�A�����yQ�hHYkf�TI
�����(����#���jsr�������\���L>�|m���e�*����5=���!���B������9<�"\EJ��Q:U����`������|��-������z��6~vp=	�cPD��
�hsJm�r"�y(�NY�A������!'Rj��hEG��*wy���_x�������������!�yg�����H��v0T��+U(�U�4���rB�y'4�2e�JhP&}r�����|����
�\em�rB����Y]���j�J��.�=�5�Y�4�4����*��!'Rc8�/`E�	�t0���T}\�z4���9�G�<q���~���EN��/��@�j��L
'E�B�����4�@�4����j�!}��K�=�^���j�����h���*
���2e�A5�����1a.2���GT	�������R����P�����CJp��H�%X�q*B����C�8���Lp�:2����"
����<�N�V�	,r�$#��������2�4��wS��*�����P���P��u=�^( ���@Cr=���d���>��W�hh[�6��/"�&�\��j�
hP�f�#T4�Q�RU�(�p��-JzA�Kk�A6�yH�2� 
2��>��4����R~1�@C�iPh������2��^�-ST�{)
���r��@�r������4dD�Jh�gT�2��Q�����d���y(s���BC�l��Y-
���|�����{@d�A��� 
��g��_�2��yTd�!#z�4d��c�����^T�����@C��U�����4�m[�@C��W]r��ui	������_�O�@����2��k��\����2� 
2��>��4����R~1�@C�iPh������2��^��Uz]T��������������hH����������.
���2��!'�� �y@2[�����=���h�����e�!}�,���y�G@��V3::�����%����fv�@��
i��	2�rgW�����������r�('  @�!O ��9����wv�T����P���:����$��M�����T�7)�wy>'���e�I/;���1������jQ�<�����EGLG#�����G��9y>����(J��9�>���e�|N��v���l�����b�p�M ��2��y�P��4#&���<��H��Id�!�wO��A�������cSo�T�7���4�7��wy>'��.���|N���~���r���&���9����4s=�T`mF|�Nhx���
�%g!{������wpv��i*ooo�����f���ye�����������Lf����� �����J��,����g��&���Xx�rz)4��sA����?,,LP����������)64
������)�w)�o�������&K��oR����:�I��Kq>� ����.��M�����\Z�?�"�����|�H��(��T�7y>�������iy�*�{f{.Hy|��|N��=-����;#�����-)���{ �)4|��U�������m���<�0����#��������+��������E�


I�y��wn���H���K^�r��Ku|�r���&���X���s�������9i����9i����9i����9����f5R���|Nz�����4�s�������@��fr]U���4��v��I��]�_R�������,����.d$���M#U�����S�[A���T��<��f�qy>'=Inns)�o�|Nz�+���������<���s����.��R�-�����r��1�����j]��_�2��y�S�.��R�@ �^�_����$
��I)��M��Io|�r��s����|N��IMU1#>���W,)�o�|Nz�����<��^��s����O�~���u���vd*�h����o���KxT ��U:'�V�,��L+�	����>�C����o��yb������)���$���?-���k�����$/���f���H]�)O�DCN����V�[�3W�����,��#�J�-�5�t�sd}}]%vFEE��d��P��&
TI]��$�����<�^_��:��?��;B�j&�zU]��vNIKKKUYf�|2��'�$
�	M�X��+3�%#�4�D��c�H�g�^�=T�<mU_�T���tuuS�K�K�.����.�Bc���	��,$��* ��H����-��A7�#v���/�v8�#z7�O�K�|����������W�Z�^��:����h���[On�_j�;Pu�)~V���o?�3-�'�������}��������W-:�1��i�k
�����&{)�wvDf��*�B�Wm��Lz���4�����J��V	���	;�����=dE���e��oF�2��~�@�(x�G@�OH6�V��1�8�����8��N
���$��2� K���s�8����q����
������]�oB���������Q��#�R{XYc���t*-c��*4w|�~&f�e���+�"�������������u��I��������*{��������fN�x�z/�������[}}m=TO��_U9?�~���TUvr>��2��[P:J���F(�O~V2�|��{ _Oh{<N73�)����[yrA�0������$����#&�_��p��/����]R0���O��_�H��������(*���-�
n��yt�9<
���aA�P��Ex�������O�F)��
��%e�A����g�2����"[%{�;�@C���B��(4�@C��72���m��@��-d�!�|-��d���������n�e���m[u��4�C+��
2��chH����J��h�l}Vj��@C�[\779�D�{��qe�f,X����/^��KG����rBS�����z��e��_�c�P�8q�
�?~�p��nX�*��:���/Vn�===�s����\��6�4a��8v�2\>����*k�|�= 
���e�A������0���4���^XT�^e7\Z
����������EX��������1E�~T��V��5w>aZ�|������QU
�������Q`�2<�V);um� G�ax5c�R��R��q�98�q:���������2;���������CLh��TT�/!G�A�DYh�gU*�������ib
�B��O��~�:�LFX����TUU
Y-s�i�����9������<2��?�{c���l�o��]���S���r9��'��"R�Bj�����8�9>��-��E�y.������0��5���E����V��8.�
ab���R&U�?�.j�5��]������h�|�TS��U]U
E����L���(���Ph(0���<C�5�q��=�����C��x6��R�4�mC[����d��Q~����~2�)2<��~�!��;���q�����6]��1|���aZ��y4��>h�Y��d��{��7�-#����Di4�S�_����1���L��?L)��/�J������s��Kw�J�j�a�� 4�i���0���R���8�����b�������q���ll]g����G��=W�7��NM���(��;ta!B��GA�@C���pErW���{���r�������=]�j��w�;�/��9s��v�R���ysD����f
|�����{p�����������*i��#��H	�`bww��������������k+vwbwa�")����3|  q)��gv��N�3g��93�y��L.���Vh0�a�������C��|'Z[g������\d=
��`CW���:�3������G3��8���������<��=U����F��K]��Thh��D���~���pc>y�.�}� 
**c�Y��[��h�}�V�<k����;����a����/.wcH��_FJ
40�A�&Gzz����_f���1�Og��(c���?���������������WKW���I+a@C��h� 
����4$�e`-
skkb���

4HJ��G��8v�g�L(i���kY
�U0��	V����.Vh�"-�����vlV9WZ���������nh���������C�;��A������b�J<(-`Q���$,��deY�@�����������;� -%�=��#?���e
4H�
]{/��C�1j����`e*3Y�}_!��YC4��@���R��XZ��d�����u��kY
]{����(X��UH�A�^*��w��@C�E�p_�)%����!�*����M�h��~���TR��@CFJ2�m���%�;,"���LU���3aY
v����.��hHI������Kl���@C+�ap�}
��4H�{{������%������}�K�>��e	4j�o��^Mf��`�f5>���_����������S��4h���f-|�U<�+�}PZ��Lo�2++����QT�q@h�_�f�_��������	@C):��� 
��>"'��of����G�$��-{0~X_^��������I�����PSU���6n?ii$�K���� /'�������":�j����r���%���B�
�c�q�'$��Czs8"$,.L=����E5����,�V��<�v��M�r;
K��Z%�+Dnm!���4|�{������;�
�pi��8�*�{
9���$i#��;o����v�=����������`����g������4h(R_��D}]W�|p��;��AHL6���oDl��Y!M�����8uL�0��
�w6\~�7��>��h���
����#%�����t�z�]MRR�R�����5'D�?q-yIL������N&J�OM���P4L�W���4�����6F���+u���`��4e��]$<�S@���u� �~1����i ,�e��>rj>���J����8YE�X��r%q��J�G���z���7�0a�3�^C[��6���9Z7�]�������<n������C?���-���w$A�p��J�h���]'T�~q����.�v, IDATBtA@k�YML�&+����������$��B� -�&�jT�*���3�c���H��������Z�-4&jr�����A�^K���A
~w��?E
�)4�t���yV��������1@����TP�z����$|�/GR�/���u�'�.ga��0�>���Q5��]����`0h2L-�Ac����!IqM'-��'��#��	����k5�����K&!=)A�� _�j��}���:b��p���~1�Ap9��.X:�F�*�vj"�|���,<�����q>���k�[����34�0:���?1�S�P�B�����X�*RR��y�/F��N!.,�v,G���(��������3 o��1�?w��E:)8@��:b��$��U��q�~�Sc�oJ��B�	g(����/�������
����EZh0�o\����������)�?����t(���$RX`

���CRW�VvH�p��IRm�o������������7/?��Qd�
ZFBdk��

)�Q�H��C-�F���d�l���62��0�����{��Q_	
-$\:
	Mm^��3Gh��|���@��6��"��}H�[r;].�z�:5���9�)��c!��
���ri!��l��QER2���l�Y�.t!�
4���K��4.I���9<t����o�O�'�[�y=����>b��
�����'�ih_�:�����X$�&b��90�����@QV	���]������$�Kk�-�����BC�Z��1�
7^_��^KiX��{�7����'�g�;,�����y���}V@^F*�
q��3Whhj���R���En�B�z.t����p��0�UuC<{t���`m��\�tf"��`i��>W���g1f���f>n\\�gh�n
t��\8�d(�.����}��+�D��E,�BU�h@EIa�i�t8kg������������L��T����FvW�S�1`���1��H��Y�7������S��{�d�#��Jm\�K��U�BC(��d'�����M
�R4�����a��G��Uh#E
�����I<���6��3��X9�:���#�\V���^�'���X:]*�v
���{���?%W}�����4�����g/���r�:���c���d�>��FH����q�?'���htk��:6�V��������1������_\�}y��gk����9?�����F�A���
MI����d<~��]Uy������B�K�
��T��s��s��CMy$�5`rg��vR�X

t
-~�iuZ�	N"�Op�Y�!����	Gh4���d�!=��9&�Mx4I�I���&�b o�����2�c��`�HcGWqP���1����'�!�+4xm��e�����5��A���U���Tj�����"�/��=���>������d�� �&���X�����L�RJE
Q��x$�-4��M��)�g�7��l�~4?�<������o	��}X��:20o�����������B�x��u��$S����Du�����#�x�xo�����N����&%		��3�"�?�T]� ����"��E��%?{�T7(M���P�m?�> ������Ks�E	��vXcS�����w^O�:
��B��&��.���!�G-@���H��B�Os�t�GI#d����#R����RH�#-&ZCh�������R�e(�9!��5����c�z��H���$�4���)4�O�4�(� �?�T�^n���P&%�:�v`}�H�'��\�!��C�'�C��%�����5R}������"�����|5�N����n�:ER�4���G�BZ�*��Na���\��C)IPtj��!J{g�)h`�(�Z��:����c������-B��������:����o�^��+MlX�I]�=��wl
��(�#�%� �����@��{��O��J[������z�	�4�d

���hhb�.�1��#����QA�]{��Mk���4��p��'\���>��)�>�i��X�

��'�-=CY�['���1�I9:������4?tT���^�%#�������-05�F=s��QDu��\���`aT�����������J��f�{������.�70�.����m%v��Ccb'���F�{,=�����O4^��k�i4�R��'{���-�n=��v
��k���������/�=^~�����R���w��`;f��*�P��.������q�T`�c����q�����'o��4��/��e��������4��,
S�g�8xi	��247XB����w���C�q��x/n<��!T���,�������x�F�#%
�����H��gl����8����}����u�p%���oO���-(�F��\!��f�y]dU(�=�zu��Z���d�zX���$�AY��������0��?�pr�t�'������`2��$n�:#8�����������
9�~�Z/�lo-K�}fr���1�/�m�th�l	��Cq���]���i|\8��p�[ZC����WX�����	�SE������Z:@�w/R�Q�����������|}?{6j>��}��~����[�����9�=�o�N*��HW�8

CjA��)������kf��5t�7<`;�!�'Sb`�����)$�Z����#�"� :|���9�U�	)8H)H�	A)1���8�}:�=�6>n>�F[z������&4�KP��)
�wE�_d��qg�	*G�H"e5km�u�+48�n�O^�gsCRn���x2����RQ{I[j�*H������r�
�q��3�c������������9����e(�����S���
*�<���0��(f��%������K���>_x��_��X�k��2d�k�mz ��+(R~@�G�+\��gr:�;����:v���*U��iN>Y���!5�6v���{�0������g^W!+�iIY�m0�����r�����U/X>O��� �����m
��vZC=z�����.x��
��E]�
�_���VQ���m��&_N����H���N]�W���A�A���TK4��zz���!��#���F���{cx�8s��m`ea�7n�x���vo�q�c��_�&�:�k�G�^a��^��[$$$�q�Z������9�N���_����{�^`@�N�`�w��#Z����_%��&�Kh(U_����m��F"&���:P��-��hhj^uLt��&mZ�����7T����'
hhja�:�:��]��Q_���am1v�u���(�h����|��!0�*�x�U�|s^�A�QH��G�6���7@2�sE�B����t��0�i��/-�*b���4T@
-9L!���t�1���S��Xk^�c���hv"}�������]�6h��O��)c��0��ce�l����c���i���@4i0�\;]���S���v���5�U��Wg���B��^j,)" 0a8m���M��4~���5{��~�������%���qx������+.�����~�� 7�����M��F���	�u�	j�V�%�� �AYF��������L.��qS�7<��J/��;[a�����)Sz��B/�3c�c?���a3�@N?����8��!Wm�d���n!��������]��0���O���c:�����C �z�@����y�6+����AP0���Iu�]?M���y�*Z�����C�8?2�:02�k�C�}��?��p�(;����q�q��g!��3�#_���w%m2�������
r���=j�������"O=����uO9�}B��������it�'�����:�0�e3�u�����P�~<�w������Axp�,uQ� ���~k�h��;W��I'��\q�u�qz���_��
4H���|��H~�
����6���@�SZl��!X�6�]�\�vH�$w2�7o��EEp!��1��o�$����yx���\9�m�+��@��B�����Vz\,;tG�(i�E����l����������"��{�GEB����yE������&����:��e;6Ay���K���� ������0/Xy�0��/!���i�����`+����#@"��Q�5l�*��<D��C��=PD�\�=Uh�������	d�4@��#�k��Y!��J�W������� ���M+����.�Bk�x���+L�9���)�����t�����!wd�vu��8��S�e8to7�TtA�0d����r�F��Vv0����q-�FCCI+O/F��}�������e�L�1����m����������`�~l>�����a�h�O������
��4������{�p�����//�C��x���=c����i �����W�OO��W��D�������\�vh�a�6�C�z}���A���������hL���gg���l\��Vd��]��
l�������!Mk+���8����9�@[�6	���P8w����L)�3T�����$&����[B��r�q��}"�h���;�,"0b��@�8L��D"":
�;��|���:��~�-5I:y����6<y��f���q����IT�o��`�=L������I-4�o����T<�r$p�A,>�$g���0{m 4T%1�����/�+��?c��2�0��&~�;m0�
.����i��yS�M���!��C���y���D	W��V���m��e��l�Y���[Q��hh�N~����UV��P�kp�Vj;) ���_&��s�G�����)�
����n��Sw<y��)*h`��6�m�z@m�\���x5��������F�B��6|�r!�K���/���5v����� �M �|�M~���<���Z��n_�2��f/$�&�x�	
�fU���^�<9<���3���4�h��$�����\�7[��/���JMh���@++1 	Q�"9�t:��b9��:�e�}d��g6��~|��r����F��AIP&��,���V�&0#�>w������`��o��!T��Nc|\��C���z#u���A�{/#�yt�������3A�!�,�
*���}A@���%�,��p�*A��Hu���������:�mV��B�~
�i��(��
Hr�.C��.���N�:#��1��p0�C	2��Y�"��M�u�a�n�;~�>��S�Zz4��cW���\9��z�W"��'�xs� ���]k�|�E�!�@S��
�6u��6j6���G6C���\������t��6;���Fp�7`�L��\���D^t�j����|Z�� ��u](7h��m�Ag�R�S�q���2)4���[g�5pZ�2Dj��
�i���NM1��u��0�uw_l��O\CUU%4�y�	w��	��H���!]�O`��4����n�������sU��'����]�"����+��0���(K-5T�T��w��$�au��;���d���;2��1���������h}m�47*S������OA�iP����{	pr����4�o���1j�	H�P����S���^��$�lK$f�R%>���aL����h��|�\	,�@�.��>���+��h<������E�3��:h�V%��3��9���b�����PU��<���
���p��n4���.�F``7�S9�j�!wP!4�j���h���.��z����P���A���y$��M���i���z�~��$.l����p�e
�!��=�����n����������X�>3N�]h#O�������7jZ�� D�B%����n�`��>e4tm8�������Jj�:������_i��n$p �����
h`��@�|���
O?^�G�s���k�
C#�>x�vu-;�;�;��:�����8���a�>�?���x�~	Z��k�w#&!C�.�a�����l9;�T �P`��@�J�{\�
p&X��.'j=��&��lN��?Tj����*|6n���u�\I�N:�f:s<���^�~�����;w8�|�4�?F��'��GO�Dc�0�,�<�aC�q�5�{#�����;�>D,��9s�+�����H		����x=l�H���
-����g�TM	1���E��<D�U��z�$���vj#�^u�}h��?��|8��K@�?�<Ln$�:�ZGx����V������4G�����b?�<���w�����:�����'H�C}r���+��{;�!h���-�{��+%6��w�z��O��]�Vv����!���Z���30�mGcb&T�6�=�_���6�:�U	�{������UB(�����@���x��R��,^��pt�Cj6���5(mZ�z���W';���Q" B��0�������C�\�����
�_l'5Ara�h�?4�p��:�l���@FJ�M�����h�0����h�0�
q�hi�����'b��=��\�w����l��[A@���?���<|��sNZz��6���u�;qv����1���8�Z���3�������'���C����/�|f��A�A�;��qJ4x����SW"@0�`�;s��@������
;�����JF<2��wNp`��������������.������<�����GM�l5���N���E��8��YJ
,��CC��Z*o��/���J\r(.����\���E�!��������_���a
�a���������p�`�Px����4d�uk��k`�C7��a�1�5F��&��$/���(�	m� G//�&����_��`�������B�k�.4�������/����`��:�:�����X����["�z����������r"�Ns/���Mtq�#�"�9��RTS��<)�������(���������v??F*I�\Aa�����KK��K��8q.�$l��)z�
�������A�%Xq0���_`o�����f�3y4m>�*c�����������|��r�l�V`3S5����m�H\����� �R��\��GV�����FXu�����rB�N�-kk��?�'�L�k(�� ����ID���0���
�?�A��I?o�S��r�h��r�f��yTv1�r�����g�
�r9��-���?��NW ���@��<���z���P��N\f��2���[O'
����`8��/�i�|(_���P���^���'��HH�m}F���[2��,U�K`�%)4d�p�z{����R?�����@�&��c@@MU�s^���"5wA@[<��w�-���V����kO����"���8@C�[�<H
��M!����k���k ���4��f��b,0�@��
R�������x���p�
�HABM��,�*�X!��T���2m�g�����B+��RC��kH��	R�H���J	�G�Be�D�|tCj�?WnH�#�@�DRx�PV�����p������@i�I"��>��B�'X�TJ���@����\���a�xH����4���1��%���tRqP�a���"��&���![�N������\
�S��P"�CRG/����*���.����D.h`���5���{�EbZ�yXp`*������Z�����&`�LY�
���p���m3
/�������$����@X3l&m�m��K���%W|`����Q���������=
��n���}���Y����5��jr�b@����w�1��������\N�:�G�:=���e�xr�+4<}x�!;�����<�������8}$S9���=���=�F�^�A��`
}C�������t���$@+�IM����]H\��kf�a&m�����-�����)|{sY�Hs�4�����;CQ�Jv���+�t�Q�NJ���,�-
�St����,1��aD7u:���!���M���
,����
\����#����,��E0��p��
s�XC�
4��@K��9��m�O�3��� IDAT��z�.f�	���Y.'.�������`@CVvP���,�HB����3����N�!�8p!2���<�~-�*�f��N��;�������13�K	.�I�H��Y+%HK��+L�A^^O���}HY�����X�>�\���.f@Cv��J�%x��E��
,/M���@��P�
�$d%~���I_N���R��J`�q#_�"�)?e���K
���h��7�������,��������$p��)9�9^��;H�T�*
L	"2`��o`�����d���e@��K*�N�Sh<���oq ��-��g������Q�pF��FH��}��@��������f{�����7��n���q5����ZW�����)e��������!!+I A�_��Z}50wL�"�N8�<J
t9Akcrm�@���W�"�6��{�C��#����j�H<�R��E��S���H���V�H1C+��D��gH�r�Z�L�TL O��U�q�!��Nh�����H�xK��u�T����>h��t	 �
qO\qf7��;r�!��KD��A�U9����+��<�����)B��r�n�������J�jB�����q����5��O@CzbW�`
I^�i�H����{,�wG����J��d��H��B���\e0h���(��D@s!q���h{�*�U����>�r�����5Uq��;&7��_.���e����t����Hq���:_��n-1��M��=�v�M�"�S�`1��x���wD4�e�q���p5��8���~�t��AL=}���X{�xR�k,���.UoR��x+:���R�/��i]9Rc����1�9"S���dR2r>�a=2�J�\N$���
��0kD�Z��A�AIA��L��goo���=Z��
��L�'r-����;.����&�B>p�A�N��zv�O�����O���\�����:3�����w��}��{�f\����qth4��j�:D8���yj����;�WU������������8J D<��?��Ocl�{{���
F�\K0��������=A
�p��j-F���>��U��Y�6D5�Z<~��C\�@����Xoo�s7���Tq��!L��[�M!��/���m~��k���N��=�����mWR0���:��D�L�!��3���xkv{��{�+fl��A��u3����Z��8qg�5������K�)\����N��=� ���+�BDi�%;;M�H���	`���R�j����������������,0��
���#0���~�1������Wd`
��^P�S��.+��p��KU�z�����{�J�;S� ���c3���4����jl=�zGp�� Cj����@��?�����}9�ToUG<�w��������.�v��J
Zu�������St��V�0@0)sf�6��@ZYw�G�{8����dZb�
I9)�Xz�s����s�����������h@JL!B��=U���i?�����F��h8��B�$Be��>����-��������p��,��}��l�QX�h�����{���%QTg��a5��}t9���?�����AJ^���p����.[���4�&F��kR;�{���0J�A��?���.���j���������7���P��h�O�� ��W{H��������0)�r��y"�\������}~�w)9�:��
������w`������������q�&��6���R9�p�0�~����`����:/���4@�4�t��:R��)������`�&�"�p����E`�����w�&�"7�0n�b�lR�N|j�&J]<q
�8��\Ed94�<p��j�IN=��	����*����i����R�'����@�����n�/�o���5���j��

���p����X���
#�^(�]���n'
h�e��DZ�����>M1b��R
]j�����4��S5m�:���gR^�A�T�2������5^���B����T�%������u7����}���`�� �o��]HQ\���$&[fJ��Th��F�����t*��6Wh��\�L��������=��z&|�\anZ�
,7l/�����T�9p��7nW�������M��4���

w����6)4�su��
�������;�:���=�&��nR��|)be��x�(��R����a��D0C�t����J>��NnNH�a
�f$e��P�0W��-�H^lN��Q����^G�1���\�����2t{G��]�:r6�����q4�{�#`������
	r?����)��K�a�4����������\�!��N:�XiL����z���K\�!��u�����FQ�:;N~@���Mj���+8q7N���^t2�A
,��L�����L����;K'�Y����i:n_X�f����\�����R
z���F2�1$;�a��������o:�!	RU�=�J�������j����u$���7���&�"eX�J��nC$�&�,�d.(�\��1���D

�L��R��C���P�5)��d+'��$H"k�?h�� ��H��SOn���:�|^��X�V= ��'U�D���x�I}�\�U9��j��lM�H5 ���S"'�w� �������$�@	��"v�?P$D��'XH#\.���

�	4d�I��V+�\u)V��'rA@C-3'��M�*������
4�a

�<<��`�fc��\H��o
w7�B^��������8�ERJ�
S����w����Rg x���p�\D�o7��-���I��rdi�;���1�h.��A�������-�~\B�-�_{U�<4os4����*=������v���ih�v���B�3)4 uKrCa��f�[���[N��V�����h�a:�������	c�:����5���w�S��SV=J40u��������X��40p��T`.!��r-���2�]�F8������\+$���<m:�!�L�`�JRhN�Rh'�������%�`%Fz����������� N�~��
ZX���EE:	���b��L7],��G��������^KpShP!��}� ����a)�]f�r���X��T r
�Iq������N��6�z�R���1���7�����5�����
h�i������R��:+}~@s�N0��!&������)�!�L����D4h�HJ
	����J'_)4X�

2�24���S(�d*�����Y����Z�kG��~����y�[���`

~�>s���������b�FWh�YCRa����1��KZ38B��5��zS�`v);(sP�w�/�[������s5v����J`�2��s-�B�� C�����TSR�"�"��5�=�����k
�N#K�!h`m��U|Z��md�+��\O��%E�5_�������<+���)�%��8EBi�m�����I]�6'��3��a���`�����EI��
mH��pW�#�eC
���s�)4LA��{\!��3w7��W

�"��0(7����Qru�@Rh�%�����d��F�.R�|��IrYF���tmYZ���hP�:1w/B��$D]=)R��>���)�j���

�^,5�N/���Z����Ci�MCZD���C
�
�q�F��v*5h�]~�2E�<*"5v�H�
:%��jr�aS�V��p���},�K��ft_��k[sxA�v�`Y^�Rh`kI�'��%E������mCle

q��ng�HR�e�NM�Up��?���>������m2mb2�9��gof����E�%�p�N<�5Q���q0�*7�4�K�BC$)4�s���
�����u�3��Th8y5���^���&0�l#��������2��{<zs�`���a�u]�a�*4�"��u��3g�����r��`�����)�F�gdq��=��A�8En���9+�m�3�Y�A��@
l�)*����+>��j1�/�g��3��5��@[��T���)4thH

g�q5ue}����9x1��&r�5��B��h^w$�K���&���
3���nX>�o����� ���PR^��g������l7�)4������ 5�����g�KRh��C.����%��=�u�o��D�F38� ���6#,��K�+��4�kZP{Gs����r���
U��������������e
����k�*Rq����&5�����D���P��i� u�>}���'OH�a>�'%��	���k���j?-��$�V�B��/���#(L4���
�G����O��#��!�d
�Vw���w�r�Y?G|>�K���r��BC���p��3L{�J�4R�O%W�>'��rt]^V���x�E����\e��_w���[	`n-�
�����������x��UX���;H��\O0��&�9��tf}2�!ra��mtE��Z�J�T�5@nJ5�B��^.s���0�H�!�
D����I�a�A>�1�A�Ai����+o��K���DH)��}�s�6��{q��\���z^���w�|
�{��w6�p��i�N��Y)��>X��M��W��a�n���$Zt������_j��M��xD�$�,����1>x<��M�L

��=,�Z
�������$l��	|	

��.�'U==�z�_>1
���jn��m.z��f�TU���.���L����61.�n-;X���'o��v��r"'8����Uc��!x���A���^(0��sWn�4<$E��!��S������ w=���B��.����|�dNrY�/M�w��m:����
on�G���&Z���L(�j�j��@��
�iK'i���:?q�_}Za��g�hW
Q����?O�;���%
g@]t�!n}�B�*R_�
5��C����l��W����F��q��G�nl��'��beW=�BCcK=hh�7?v�z��w�i��X:��D��������I$��y�	}(N���dS��7H<L�����}��8c����B���_:^!@C
���zFK�9A/U?������@�E�X� _��T���?F�Ou����a�,����U���,~%�������P�wL*Th�qpz�+�}������BQ

�����#�Uy��b�h<&h���6�-��s�W�8g//�E�LU��Cv"8�t�����:���>ki�"��<��`�ia�{GRd"�L������Z7���\��L��u�����A����}�G�p����m�H�4H���&&�mR��'�f�� S��
�k���,���XC��Ld
M��N��� �tj`�S?�|M�����@�KQ�;D@C<��hK/�~�$�L/�-I>q�]o��8Y�u]
Sh��;�N� 9}I�u���g
ZmzB�A+.���m)9��E�e�/1������O�7�F��k	�p#_����7��	<���w���E��-�8�$���"��9�c{&,o�/��P��
�CY�NS�V��t�hY�Fk��� I��;������O8�L%E�f"hpp�����y�vr9����3�3�Y8i/�����k����"���By1_�]v@�$�b�Q��������&����m,H�A��OX�}���>�+��Rh��<�Q�0�����a�A�p������8

i�=����A��I�A���8�hH��'�����dh�>��;�~�407�i;	L� ��
��?&�
����
��~�����-�C�
m� ������b���;G�0r1�\G(���!��

�����Z���
�����
���&G�*L��!eh��Z0�L}!��2��,E��B���A�����
�!������n%2�of���l�z��Y

����x�* +��a�s�n�B
l�]���W!�bK*a��rTNzH0�N���+[���r����`qS>��uD��'���(� ���\H�!�v����C\%8 K�A�����
��<|��.o���Mk����������e��r/��Q� ��+����1��t���m���ci�>������G�������K�S�e��M��n(�
;�o�n-�h��\P�}z
�7�*�/19���s�?���1��b�v�
G�����l����\������)RT�D
Y@C��=ae���T�pj��K?��}�i��	{B�ms\#W��;��s����{����zf������9\=����!!>
��_����S�9�/	�@�`1}�&w�@~���b�*r9�6�Y�G��g������a�:�����	���0-���
UEI����27L�@_K
Hy��@;��5�s��� _��x`.%~&��6cDw5����
�:��Rh`@C��J�!wl3���
��^���=�����@��"S�` F�J�G���Q�H���Uu�I�Z+v����:(���t�"#'���#�
���F\B:IuG��qX���\�`j����d$o;�1������qd}��Vf_��T#�,�?)TD���F��?��-N�h0'��LAxp'�ds� O��c7U��!����R I��
,0���V��g
�gN��Cwo��CW�p�P�H�������P�`���CR^�N��������S�Iw7���'=�z�x4��,��z�������7U�n%�:���6�|N��~{?s�F��n5�JA���l��uv���U4[j�FH��
 hR�+�A��>TfH��r:�������v���I��R���p�(���>����>����=����E�p{�	N�$%���T�n4�5�9�����U&��~Qh`�Qmv5?��^`v3��]_�=�i>�J'du�+
m����Y,����l����F/'5*�QO�?������ ����iL�@�G/z/y�
4�<��H�It_��A��SP�����%�y�)8�Z��7�4��"��V>W��nEr������?���lcL�Ew$�=�*�`��	�{Vq� -6
ZCf�R�3���i�f��b8 ��*^=����CJ�F�1����K�;�7r5����`�U'���\@�.�����O7]�T��B"�B���S0c!`�t��Z!9��\h���E��K���t��a"���I'�U�����#��bI���z`��X���T~R�0��HAKK��J�=�MP�d�O�	Y�
��~�[�#w��.�������g�B3��&�wrH�9�r��p����*khXD�B`L������e.">G����������F:�Q���);(�HCEN��th��g\��	9�Q�[w�F9�4������#[��S)�s������D{Rl�NL�Z�e���������/���g��nJ8Oj
Y@��g�x��L�g3���".�N@�NJt��92��
I���g��3t��h�nG�7��3�U���y����(4�Vk��uqL� $�;h`���s��9��'?^��E
������m9����}��5#��h\��<�H.�����|5�)���W�q��QR^R���_��\V,��A�37y���/�pW�1A���6A���)��������0g�A�_AO�����\}����0�@+� �TH�aO�����80����b���K�T���P���^p����_��;{m�p������-S��B\���K��h����7s��Bn7���m��i_S������%	��3C������7^�q��!�"BK���~ap��^��G�ojz
�������������xD�q�����q`��\T0e��

�����'�RQM����M��Ys���i��\����X���	��r��h���{�h�$r3Q����?j�d
J��0�6��������D����E���	z6�p5��{`��W:a��K������� ��I���?����x��L��E�A�oa:c:��B��g���� �={ �\������s+�h�_��s�B@��A��j6��n�����s����P h �=�����6Q�S�2T� IDAT�Su`."�r�"���j�����`��� �"ss���Ni��h�w^�������*����������7�$f7%w��7o���7A�JB���`�A����q���` �^3SX������!������
������*��pg�1�L�`�%�z`�L���/�8���#�Qgi;R��)%Y^�XR%U2V���GQ�������������=�oQB~@���#�NQ�4��ZJ��@C|R4w?�lc�v�����Z�f�`@�+�;|�V������[�kx�q:*���M������/��8
������L..�a��E���U�B�S�V��~4wuu��f�#��,�j`P����q��.��M����2�2����&W�	�8}e'f�Y����b��?p��F%�����APh�A��J���h���0�,����O
��zui+��KH���9-.�����80�
tv��s�U����"Kmf���G+��M]y\N���cg�Q�/�=;��$� e��2073���BAit�M�P�%.9h(�]r
E����4�b�Pq��������
%��+�%���%����4�W��2����oi�(e4���"�)��DE�� ����+�PVeV�|�TJcK����o�F�	m(U�^��
L[�fXA@C�T��gZ���
n>J4T�:���.'��.g\�2��6�<���h��-�,l����Q��u��
e]���/�����!!Gp�``FNw%�����r��
���(@C9�]��r9Q���d��S@��=�����u��TqBQ.'��We�[��=�%
��=�+��� ���++���������r>5���Q�W�x
��N�*s=s�{s��(M�����D�=?����^�!?��"��l(h�^�	@�4@����J
4|3�R��X- 
�zf�4@Ca�C*��,��� jK�]<h�QY����Y+|Ne	�]:�:��Nh(��;�Y�,l-�.h��:�P=���Y�@�FJp$
60��aE�S(I
��VQ��QZ������d�CrI!I`S�����b�"h(��P@C8�U0�	vR\��$H���A2[L��s�'~Y
�[�%�(
�:����\e�$A�W3)I[V�4�P���\m�\H����&�&Xd����V�T� z{	@�4@���Kib
@CiZOH+�- 
���@�4�[������Z*
��T������U�����5�������nhzDy��4�g�V���!�Z@C����h����;�oh�g@�4@���Kib
@CiZOH+�- 
���@�4@��\NT�g��r��]����kkq-I�A\��8�[��*�:
@��k�oY�4@���o��,h����_��Vh��@�4@���Kib
@CiZOH+�-P���������.)i���m���K�6���B�i���}}��Q�	@C���y��>e��&�*������edd 55��E��.~���Ru�*$'Q#�Ty�e��������K�����
�{���j:�5*�]�-���/;�����I��\QFz��"<&��h��}a�=�@�*����(��Y�Oz�ElZF��_P��9'!A��'N�{����Z�w/�b�n|+�zg|�^}BNR����~�V�=Am.<���W��[n��&))Y��*oc*J�g$���o?��;�Y�%A�Ihy7�w�_����Sdb=y������{���u�k�(��
gt1�E:��]�M����b�[nQg�����o��E��k�<>������*��V��� ���]AM
���}����o��F����jKVk���:��$���5De�4z�Err��A��|.T���_Wa��)���IUk$$$ ..ZZZ��oe���?����n�*::�7�4|��&
����R�c-P�PQ�)
J����������U��;�L�R���������$~/L�/�+�'��]��7q���^�s�d�9aA���9��.q}�s���#������z�V�|����9a>W����I\�s�������X����������- 
���
��7�^�"��<�����1�,�K����0	��x������0��s�����Zq��A������9�����^!����\�gH�+q����x�oB�}�'t�@�����
BBT�x�����&��n&_m��I�2Yk�We
PPP���le2�Ll�����SRR*��*K&e��+K}�����0i�o%C_Q������OLL�T���ze��%��[��Z	+��V��q���<�U��^�w�,�u|���:���o����q>�s� ���]wq���\����{�Q������<�S�<�u|�s�v}�8}�<��e�l�q��u>W���<�����{�wA��<��������s�\ �+Oo-K"V b��'U�\�����#���8+�'�����d.+������M8�'��+�'H��E�����qq�����'���o��������G�k.�������-f���-ZY(�?��Py.���$~H��Ip9Qy�Pec������I����M.�:��s��M\���}}��yhV�\�AaA��u�R�+��]T���s�Z�f%K,��]�o=Z���J��.���c}NJ}�������\ua\�&���0��<O����{L �����",�����8�wq����0�+��Q�r��M\O�
����"
�P�F��[+����\�{Q��A��	�j�����V��B/]-�4��NB,�r�@A@�x,��U��j�	��+%No�pL�}�^X�
�	*���C��Xs�P��6K�����4�"����@jj*������3BS�P�z�/V��9%%��u���(�M�9����dq�V���/%�'%%U��RU���{������-�*c����{�1�����w���^�|*[����qS����lU(����o�r�|�R�<+K�����6O�����7Y��_��m�LCH&�V�KjHI�sY���5�-��_�t��B���R�Q����V������T�t�b>����RK6�(�6�(����9$����_�]��MC%S���;Q�~�8����
����o�(��E-��.�m�G-*\�����[_)'T	��m!N��� �a����{�o�*H�~�����g�Op3�L�������,�������6��UNF���y{���%`�z��M^��U���o�X����4|��,���h�����(\[�����ax��mT��X5��Uzh��w�2Jx������T�Y�#0I�Ty���b(b\��[�B�B-�����C)|�X7��p5�y)��m���{�g�:������v�#Q�@��nc��^M.�l�S�-��������TXen�u��>q��#�k
��G���s���<��Z�T-���	��"J��9q��H�y����T�
^�{����P��kc\6�$4���vH�,���J����@�sP�3*�$
����P9�o7�n�����-��s�
���x�`WS���i%���="�g%Q���b�������*n	@CE��*l@C��4_&H�UI;h�<��`���������6h���>$
E��1�4���P����4���P�&�Z����4|i{h�>�P����P�6�h)��b)d��Q�V��s������_g4�[uj���	-���4cl�m�|���7-3����7����$%'�s�f��`���$\�v/^�a����2�4=�q��.�lfl��]��!����4T�.
� jo�^

=F,��#+1|�.l������xj��4�'�0�X�rF���dv��F��j.��X�U����M{���_EN�U�����N<}+���_����-���p�>������8`�F8o�\fEX�lS;\?�����hY
�����={Yx��G���I����	��a��B��
F����h$F�����
�*�kc�4�pTQ�C��W�j���K�.��.�H�C��O"�[�@���,:Y��+2*��8��x��i
�p�C���E�?o�E--���'�D�-k������x�������y�d����1�g���%���PG�[kc��_��c	���Y�U�ta���AJDADPT���n��]��q����n���$D��F�5��8(����8gr��{O��-q
��
��s1�MOr���>y������q��<��Kdq+4H��A����C�cM������@�zYH�( ��-O�D���{=\��v�*cq
1��!��
%�J�j��PhP�-	��]���aT�4��O�U]E��������8�S:Q�
��!6�+>�\���1���ABLD��+J��k�C|L�\��ZRFN�;O��C�rl�C�yxpp.�Ku�V�A�@���������PU��U�cy�z�jSp��i��y�)�(rs������7�G,���6#:12_��D�<^$BIY
>���XUz�ys�wt[4�V�w[D	��B���	�{���(�k����yjG������{��)�(r�v�����������[�����;�Ux!'�/�E��*��������F.�4�q�Y�����uq��;��o���]3,�qA�y�[�`V]	4�6���;�o���m��l�����-XI�^EGek*���hqw�|�'.���������Zc��9���������9���m1��z��>-�6��P�@C�jE��*������s[=�g$n����ueh����/�T�y����p���t��'���]��?Z3�%��Mu!�� 
�S��������l�.���F����������O�6������ ��#�����X�jfN���A_O'�_�	��.�"�/��!C>�Y}��	�����$D���P|:�4@Cn{��de��q�b�<�����Y�@C��C���!>{��mx��
�����(rN@C��;pf�L���^�������J[T��K;���l���Z{��Hq
��h����vR���^���Wj[In~�1���P������x�%%5%h�������1c�0��O
�Z���G���m7s�'� /+�{��}���I��"�+�#�$h���=����M�@�u������!h����C����'��"<�C��?/�[��b��7�Rr���r���27}����hhY�'<��P��d��0�~:�<���}�	4\=��m�p�r��
u;�������@����G-��U�~u������E���0}[*���/���.����6N���a��>����l�Wn��Eh c����G�#P����7TA��D'������)kI���:���t������[��H
������L��c�,.�@����������~f���p��������*�5���v]|��G�4@C�Vm��a���~��E��'`���~�45�a]�,�o?y99$&%b��^PRT���BUE������<8w�	�

h��v8�X" #�b0�O'G���������c�	F��%����"��Y���y���r<�u�`P�NP"�R���@n��j���22RX}���s4j�P}9���COY8����������9��e��ORRRCCC����P4�))),�9��j���G���o�52������=kTGmss�����1�qCij���������X�:
ZuD������S!��5�c��PPT�u�f���������VU�BAI/�Oc��s$(a\�����'h�yJ����0��{�N���Rx|� >�s��K��������/X�	~;����r���	S�j�������!4�#���C�����e�������g����9z=�=�Be�v?������w�|����#������`O��Ftd0Whh�m*�H���2c�+�a�Q����,�6������O"��&V8�u�~���M��a*+'w�M
Jr�:lb�CahR;����"t�:�22p���l��N������9���4�������6���j��i�������,�g�,^>8������Kye~=��4����Sk��c��T�-���>��������������M�V�KrR�]��� j�oS3j��K���D�1�g����M=~�|=]rl�m�6����I'6�������F�}0!>&��f���������
Mr��+C�J�g���P��2=��tb��9�X|qM����Z����HT��9%)�/��	x;F�P��d��B�ClH
�t�XM�>��?����:1�0T�N��o�����$�wN1������CiT���)��Q��c�A�X�6�X��i5eT4Km��s����
�",xq�qr� ������A���#��'��h��pDor����<z��P�}�W��Q+���	

,�=6��R��d�5���&���w�%�\|y�f�F���!WN���B�!_�4�Lm�#+�d� ��|�;�2eLu��&��Q� � �
Q\u�B���z���G
�]>�)�$,jR�"����1�V�f_Rc��2U`f�r��������b���)����{��0��	��dp�-�>�c�}ih*���]r�=�m��P���4q�7�@���������%���q(���e�&<>	���ED|2����W=�����E	8TR�����cz�HW'o�?(����N��m�4��%\���U�]]���/#q�R Ft5B9%��|����PQ��L Xx�9��p��������e�l�'�+���^��?�|^���,F.�B�2*���	(o����n`.[S�x�em4w�FpXdd�0{���]����4����*��<��^��m{������� �m�������
��hbS����3O�p�A�������s��}�+�DG�PQP������Sx|��KG������������w�����D��.�����8h2>�BKE
mZ����/���� ���>�!%#���H������H�ZHS��@��=�#f�= �Ae`cRe�i-U�k��0H�+!z�-|OL�J��\�!�C ��<�|M�W2���� kZ���N��Y� ��(��S~�������� �?K����'���
R�*t�}&&���7��z��)��n��A_}�:��l�P�"/���Rqhe[;�DE������e_E((������}�1���K���&�� ������}�����M�����7�h�7p���-C4�����Dc����"91�+&(�h"��^^����aR�1=��������r���`l]�B����c��tN���z���gF�q>O�S=����x��w�p��R�
!�����y�T�����)��>Hc��o��}pp�����{>�I�����jv���/�\i��ao�S]�G�"���]��fV�ZOH�����;^_���U��/��]S����~�6��edA�bR����"��|A4�4,K6�D�?���*��GG@��m�L�����%���i4
�Q�����/��?x���vMU5�D�'�J����
���b�~\^�vm�@���������w��
������
dp��&z'�`r�U������0��^��rMuG9,���3�P����D\R�R���#���Zi�dUp��!��wF�*�����]�>Z���7Sh�m��������O'|{���{0��6|����fY���?��(�*AU^7���

U��BQV�}��4^!�QR���v�+8�jS�
/&�������:(��]2^=N�IYY������	|<iMJe��!��������n��Cb�w�/}��+�����Ix�2����2��p�\�"�v	i�h����i�
��A��9���	�w��5x^�	Uh0�X
��I���Y��� ��A~�qb�dt��W#��'�Z��9e.��^�q$�F!)1GW��^��h�o:��e��� IDATp���yB���X�l�:O�>u;�

v
;!��
��/q(A�����_���u��,��fp|�x|����[E�T���]���j4���*^8��i>�q���n^_��p�3����Ypr�T���J��+R���>�������O^8�d�NX9yE��s���cTgY�j=^�����<�NO�����w/�����P���������j�kL�R���F��,�z��=}>�}m�R8F���Mk����������kd�_TX��G$�{~�\�R!E�b%U
�M�����OVe&%&�����^��9@���q��V�;��'���q�V��x|� �����k�8����*�1�F:�(��w�DK]�T��O\yaz���:��a�v���/0�v5,�~������%bH!:!9�/����&F��Ac>9x�
��?bR#j��{`��[�H�L��%)=x�J�MOo��Xr��}�5�=��^�y����)�W�` �Y��F�P(

4�6,�:���/���
�����7��s��Ms���wb��z�K�gjxz"���|[A
������;���W�Y���6����Q<
���d�^��
�����Q�N���+��rh���v"�Q���Ci��"Mc�Ph��C%��G%��SWV�*<����a&����I4>�����`��}7u>G��H�e�0��uS6$����0�����p���>'qX#>���di|�����.��qV@�7zh��8���h�*j`�Ug�~���l4��~���c�����S���6�sh[����o��](����L��Z
4~�E�N����~�����:ha��L}�+��[�Alr���7��C�u��r	<zI����a
�z�/,�M�1&���"����?�h:Ac���{<w�'�������e�=���T�j�f�{����x�~���6���0���j*Z��8�O��_�����*Th����]\���mQ�i���W�B?s�A���i���$�\�I����$F��N�i,;t�Z��X	w_�b����?�	o���!X{�!�h�5�sM����vyt$���8z�$&c��+07���u����\p��f�k���zO�t��������o�<~����@��`�|�b��'86�����&z���*B	T_>���!�P����K��4W���.�]}������w�,��6������i���,�����������\<�DF��5��S�^$);�������dI|���+l�{������N����eYS��y������#�N����f�)"�jV�����^)w��%�v
;��G��������v�*�~����/��c������U�$������>A�@N�-�0�m5�$�O�P�k�������3
������h@e���/4���������#
E��z��SL��>�����C�����h]��=�����r�������.�DD��CM\vu�S���~�h`��&������6�_=:�6}����YR=x�q�inG������xv�:\���E<�J�����y]��;��g��������h3%n������
��`�l�����T�l��q��xS9'x>��	�(]�C:��i~-F�=�
�����M.���Y'�aV[��"�]�v�vb2�a��4�#�������UC0z�y�!����:���e7��A�����K'XVjH�����O�l�����uAWbh������x�7�����._�a6r�s����mSh�n����[��K�����pp�(�bqV@C�6u�6�=?�}
s�Z�|x	*�h�AQ`��.aBp�F�;�m&
�^��L��w/n��F�kx;X�|]�bG����m:F6�4�Y>��>�S�t�����+��A����@������H:��f�
�f�r�������P+!���h��A�(�^�A�~p;M�PSP�7\�F���bi�#�m">��!�}Dn$������8���F�PZ�0����G"�g�I����`�D��%��K<�����uV�7����3v��Aa��Y
���z%����8���a�������66�
���,B��A��_����j���h����@��I����t�*:Z�;m�'���r�Z�=�2�d�=�����S�����#��Z���I[�+u���u79���I���B�������� r�%��'`���{@c~{D�;��>�4�������\����"�7��R�*H	��0����hx��\WY_�8\0�����G,�
���1��	v�|��
2�b���h��
X L�4������D%�=Z��1�Q7�/o�U|~��rb��B�`�Dh����4/�������X����������Q��&/#�@V����8p��`q���=��V������$�_}\v��G4�1�����0������:�������K6<{���������XG�a�S�8��+�!&.��b|��X{�3v�-�(rU����0w�)v�����$,S���b�����S���E*����% 8��[��?oP�������c�h������<����@���"�����c�b��e0�7�X07n��.����;���eg 02�[u��3��:��S{����O���{����OC�:�8����S�!)D���4��������w#Wp��Z�k$�\?� *g������f�>G���y��y �<���r����9����S7�gC�����@�W]��.�2�6�[#��]%����wZLS �q����eZ���p�/%/��7�x��N���t����&�C��3�)�Kyjq�J�{���<��v�PjoO�0��y`��g�H�Z��#0B����6=��-��b�O���9d
K�[D����B���c[����6� ���������+��� ����s}

4��iCK{Zd_�*�p������&m��o����p(!��-���oM��9�P����0��`��|����.ZM=�K����K�z�FA��/�7�uJYQ��pk�h���-�q���
,�Y�X``E��9Q�~O��A�Ci��������2*0����I����������{w�d�s(t���)4�WV��i��2��NOShh5�(���yU������=�:t��t^���|�^\];��v�&�8M�����T��"�jw��@�~����6M��
)+���p(�� ,~4���<�
�%�f"���oy/�������h1]4��>77�$(d	����:�����+��
lCU��Y���!�6����W�w!n��ZJz���p������lG�'����e��<
G	x�S5&��']�q�AW��L%����R��<�;�M�~��qM-:c��%�K��G*��y{���A{\V�^��4d�
��g1��&,�5��l���1nT:�����M�u���������
Q]�X�����v`��A�W+�������\�1;����h������o4��";���Q����E��
P!H���x�n�W��kJ��\�
6r02! r{w#��I"���h��
���sR^^
�+���j<�������M�6��~:Uj+@�6���C��*�jWA������_>�\N�a_?�M���{�f��j����h9`.�]m����k�s��mf3���ep&����<�9v��D�	4�4�-��i�\�<L�WET�W���3��A���S�+���v���aK�`��N�������Q�U_;�!>h`u��s>�	���6Nl
CS4�1���C�ncqx�HO�j����7�m8�Q�6=W	�)40���9&�����b���5����OlD4=�l$Ha$����m����^[��Y��P�!��#��/�E����F������=����������K�2�%�BCf�1��m���;�\����j����g���&����*�E���Qf�����^���N�(2���!q�_
c���k�@x����
J�����v��s��VH�%w/��_�>Bk�DF�����8�0�������G5��{�����?~����������;8:�*��hkcI�9)�~�[���(���l�����vP�����s�o��sK�����p9�t�6����])K�J��VU�6@������+�8����P��sQ4�PB���x&r��������l<��X��J���X!u�-M�BR�7|�9s��t��|��t�>����Q���7���oHj���zOj���0��:�@J/(-�#K��R�����A��h��^���A
�E����~�Nk��P��"�}i���e
��&�)4X��@f>T�t�����
QI���b�V��__��Ae�����D@\��0�B\��2����K�b�Mo��a��q,�2����A������(zO�z���3������a��Q4���Z�����������@c����81�l'�L8��",�2!	���}��6\&h�M��X���J7���An���d4�u����Q�2	@���QB�$N_����W�����
BgGz�_X��5�"(����hp~~o��b��������Q���Q�Z���w�/9 ���L��#>��������x�7�k��@[%K�c����E^ch����7�F�����	`���H8����cZ�a��C�p�%�T�9(�?g���i;�e����7x�7����
�t5�9���5���t���]�o�I%����chH�?#Z�I�u�h:�r��vN��i4G
���Q-0~��\_?1+�AVM��m�����m�
�7/�A���4���E:r�>|��C�W���CO�	����&�����vb����������`��
&�Y�h���a�L��w���#�QE%���F'D7V�l�����*���~	���8�_79
���A�
��gYN��9B�~�r4h�*bTK;(��b--~�S�9��@��QyTl0Q!���|KN�1�4�lh(�@�R-�j�S����!�?t��}��`eh��uj�ch(6;�����p���|���|E

4�|l�[�j��x���|g'���BP�{;l_��2����������9����;2`2-|����������8�e����]K�"����rb�������������+����S~�$���+A(����Wwsx����9��{����e*
o�� �4�O�{Y������u�)������3��	�'W��-��S�x�2��D3�/X{�]����,�-r����5J���`E�2�jhO������>���Ks9�e�
�����7~J��2�a����N5h3���`	_�@H�x;H���UM���8����b0�;7g�W2W�`�	;������)��������Y*4d��`

7O����h`}�-L�a
��`N�e}$}_������9
�%ea�L�t��R4�++� ���G���\�L���t_���Sk�h�C>=#>�	�������hq�)+0E���d�����E��4����)Qt���H��c��+��#)��t��K�b	Sn���H*��ER����#4��E�V�(��d��M��_5+���J�@�l	��~�UT�9 j�U(w����W?@I$��B��4p���Q\������N��i)YiD���w+D�9�VA���8$����J]�A��!�G�AZ[�+�B}jDL?	9d	~H~D�H����H� ���_7�b�$0co6'@4e�����;�}b���j��C��xE�%��8����?�s0�
�t����*����(Dt�1��r��K�qB��4C�R��G�]�
B�J���W�*:U�w����u��
��&
d�T9�4����>b������@��-'�1�_�47�gY`�"/R�KU�P�����Ja�f_�wz��fZp%�N��`YZ��(�$�Mk�C.!��q����
PS����M����!":����C��X��&�.����1��1�_Db$)?]������x�Ap�Y<}�8���*�C�1��/��[�O��4X�4��f�!(���af�in$���� ���J�
��e ���m������s��B����Z]��"St�#���	�p~������+�������1�5�1�d�o4gP���;�w�~�s����;����-W�����n�f�	@�C���\5A�cMR`�Y:Q$WF����`����\�MDq�C����(���8��@��E'�6�9��^H�C��.$����,�S�T��R�+6���H���otH�N.��z��X]��3��b��B���-������w��
��M�f1�FL�)L�B��-��=�N���YA���e�8:�m�zu����i2W+0�r�^;�h��VG|~���4����E���������,��,�q��Nl��5�k5,�Uo��&���C8t``Y����7��������i�!���O|����^��U� E������'���g��]G0�����R�X���@�'��tG����68��i�Si�X��Gn&���iC�Dm��rJ�����5Jp)k�`1�Nz���6f�C�o�����M��=R���L��D���^���pm�@��r�������
���	��ZR���F�7p���d4����G���x"�VF���v���/��������6C /��c/7���v���y:����p��$�J&`�L`@�*�4e C����I';���B:�)�Oj���][ ~����
;���m�t�&�����
��0��R��6�
�i��C���T� Es������~��Wu"�X��t;O�T��Y�%N�pqnBv@C m�=��Mmi��z�{RX�'��)%��������(\9�&���:*�r���Lj�^*��M���$��|'0\1��W��J��x����`c�uJ����h(�X�A"I��l���
L]�Y��4R���K8X����\��)��>���?NY2����������ez�'��iO����`��h�yWUa�'@�7k����f?���7H����C\��T��C�����������Ay��T����0���A�:���'�D����n�9� �x�'�>�l'���(mY��)Y�2�t����~�P����'0����
S+�e0�A����������d�}������@���E�\��������/����1;���*K2�@dc��
Q��v���m��A���T'���������~���P�R�z��������t'���KY��\\d�������#�k9�z?��
�r��On�������E���T���n��UJ���FJ�>�1��0�U#�!�1�A��3%�������B?:�)K��,�7�P��[��*��0�i]�17�6g�y������
�}=*�����c��S�C@��>����)��0�bi�fXv�^�
Z4��n���^�z��W�g��]���&�1�|��T	����hxG��0�d4�����i����9�������b��i�}kK"I��!H?�v9�Tj���"lI������L��*)*2�V����0,/Ocy50w�(�@1C�a���_ ��D.'l�� �+�_w�&W��Bk��//p=�u�m�hd����`��X<
~���c��f�W��I� �L�p�a��9������p�A���suKd4���p��C���B�q�

-�����>f���`Q`�F���`��$r9�@��|����	8��&��>sb��������`jl�v���K�������i���+�������d�_i������Vb3�,��"n<<������m�P���Viu5m<s������0��W����i�r�I9a<)�)���
�b�&��08a\�ZxL�x�]�cSY`�Dq�R���3�a(�e����prCUK#�9�0�>�6B�*e��>;z��i�U��j!�������5�eR[t�y�
h������dN�� IDATrRl������5I�A�^��&����i�%ZvD��+�p"C���'���h`����{�	�j"$,��E��C{gp��.���Ge�N��!CRz��P
�O]B���05���c�Cv@����H��
,�S�NE!'�!�4�� ���-I�W�~a��
m���� ���a_�K���)d*����{Q��}|���9K~@������	4j����.�|�Cc�`��������	h�[�&�>x��M����j���v�AC�&�����e�q��C������?��8�mr[r78`�^�_�����@��_A.&�)0��;��a�Q
`n
����.q�7�k��U�CL	b��N$deT$W�7��������=,>Sm��`u�40�+LP�*G���VM�!X�Y�V�f�M��R��`n(ajY
��C�4��[T��W�A�B���� h���/0��~w��������G�!����dLE@�[T���p��|������`O��y>a�"���]T���
���� 
�d���i���]���^��]c�>�	�t�k����`!�u�o��N41�	Rh ���:M�n4�;��
�����=�~�Y
Y�73���Wd�������c���q��*/,���P��2�n�@�Fj
���Eb�P��BC�1���O��a�D%�MDV


i����)��	�{'���x~(����HFu:��\O�vP�3�
����!9J����\!O�3��
#YZ���Ot���M��PP�G{e�	�E��jx����oI��!+�A�@�DEJP��i��eW������6����Fce��}	�qM��	~Rh��J�l�R���,}5D���E��@p���6d�4�m�Ki*C����xC
|�:�r O+K�)iiD@�(����-$COua��8������B0����:������|�B�����V������^��	�Rh�T��	pH���>�J��7������>�C�g�+:��o��/)��P��6��Ha���B's_���u�����$� ���-�������������WL ���Wj���
L�a��T��.M�H�����|�a�Af�����L`�����B���JyUr��
����[}�����/���bR�R�X4:���D���.�����V�����D����I�A�n���
z�r���#M�����0�Q[l�y��'0K�4�aM��X~����0���a!�F��n4f��pv�Rt\1�k4�OL*6&!';ah�����rb��u��cA��7��9�O!_	h�'w\��4��%�()��(��h��m�� c��P�����lJj)aV`�&X�I������\E$�v%X�#"����v�\F

�� M������B�$W���w�8Uh�ZsG��-��u2
��IY�n�����N�\�����D���== _�L��k���D��@��m(U�G������H����}_P�A�l5C���#�T���D�Z�L��7w	aR�	�	���zw��Bf�b���O%��v�u&e�C���W|`.$��sQ�\&07q�!�u+G��tl_'���g�W�<uW<<4�6��M?����(������4���

-�B����

�
�AL	���3��7����n5�B���%�j"���

"{X���*�?�>��zVh���w�Z���y�!	�I����8��6�+4�^��h`�\$�
���P�2Q�� r���RU��b���{����tJ�WhH���:�h(a^�$��������f�����T`�W	�����Ci@C�r�O'L�}��VV����QkX���p��G�
����x�'P���>4#��t��Z��u��e7< ]l�a�3����H���#/�@i���� �F�����R^�`'����iC���0��`����u�(4<s�'uE��}c�� 
h�L

�)�<p{��r�rpqN@������Rh8�%�����$�Y�t���iU�������:Rs�&(B����
A
�H��&��APER"�i7.��

��L+����m��l�����������i8��������!��`!�B����P�� �?��NC�|9�
La���'������� ��O�;�)8�x*:� w3����O��.����{���i�.���9���s�S&�D����
�����B�(h�����������+����0%��mfP�H4t��W�-A��������\m��`�!��c��!\]�]#3r�0��7�+4�9�9��v�|�]��{q����H��J�H!�,��n��~L��q�.����y��q������1|�|���~|���
��d��������>?*�d��@Cf��|�~40���t�������- 0
R�B�(c	t�������p��zW������*fVh``C��6p`.(������B��+w����io���Bn�����4�Y���L2/G��@	4���C�!��"��7S�XI���kw
h`�o�biS_�+���hp�y0Sh`��e���O��J����'l�&e��Sg`�>������T���\86����*4�w�F��������#�o��"�@4������D|CSJ�� D�&��a@C���4
�9�6��:s��~��G��|H�A�
����xC���`���N��%�(G�6R�s�	q+4��sh���
&�l�p�\r#���(��0�BW�$(��;\�{�N�p����8�����J��Am'?[��`?A�h(K��qO�`U�)\��+)H$~K�.����v���~�m���G���:�4����@\��=�L#5�
��
�H�����\��Q��x���6�}gR����?��k��^��t@A�>O��N_l?���4��/��C�+'�40��[��	:0FMk�����)�nV	1��8u�C�T��+L?�Mu���B����
�!�IAf�
[�<!����g�u8��s#����9���n���<6!���H�y<��N���h�"u���x����BS|L��m��r��������P�X!NWQq�~��{4�B�a���X�h�-v@3�J44���f-^��Lth��O^B5;k�5#���D���Ar9�6�>o�&��^>����R}�0�����
h�	B�h�*M
2�9�	�� ���@n��:D���_�o��$F��	hS�IN(�^-���C�^$I��h�i8��l�/��J�|B��k��c�`V�9�<�6�X�����4M�A�N�-�5�tr�-�O���z��+'i�`6]=��e,�����0�nm��$H�6*����!��p���k 6���U�o���
�kqx���}>��Y
���N�t�MhyZ0N��A����4��j=�
Z�Meqn��F����\}���3���O� �_������"$&�����o���;��g�4�+
���m�\7M�����
A-i�!�����6�K���J��>S#8�s:*Ti��gR��d4XUm�j�������\
�����/�)T���		1�?mIuBU��D����}salf���t�f�L���6���;3����;	=C�`�E��/H�m�����#��#����x:���^���h`�)���<�4Kp{f40�������������$��\G�kz��(�����/�i�{;)S0h�}gjQ�+s0�	q0�BaP�(���_�`:q�u�J��2�D���gT��=�60��g����Gf���������E���u���	�`�S�HoOr���tx-�v �$��L9#�!'����
w���^>#�G=Zt
Z&r(O�(�"�7� Q�"����L�0x�%�v*C�>gjL����P�%yt��I���0*uV�'G��|������!���6i��Sx���Y��$��/�L

L����:���]�f ��
-���M�
t��|�Z�������U�!WK�d��u-��/yj��K�\NQT[sE\{�v�U��\R�Y
���:��NRNr�C���T��	vZ;�'��| _��N���f@�|-s��\S0���Wlj���tR�����B����7��
�;�B�-��	3�Oi�H��:��������w���p����z����)��$7oI'�#��m~�.��MN�GF�#'�{cM����?�"���5:�0����)B8�C)mx�z*�
������
K����(Z[��/�M�Sz,��aJ�H���}�ao��_I>[�����&�6��J�t$07�������"�T�W�����D���'��TN�A_R��s��)������2^]�Z�������H��1w�/w4L���1�S�������X���h��4��b���<n�D���`��d��g��>���8�$7L���\Ll=���0�T������N.-"I���W4�(��

�t�����&�bY�'�
�jb��^4��O��)�D�L�KS=�E�
��:\
���F��"ke��F:vBeS~�n��M��s�`kb�1-�r7���^�c��sl���4h`����.n�k��w.q�z4��&�>8��&wS���n�|���1�$��A�[u'H"��G�GP�g>������s����Dk;�v�H������e�\�I�AZG�TWH����d���A���2S�Z���	����
r��O�^Y`@��_�.�����]7).�*�Q�����SG�b���t��:W���\iA���0 AuH3D����5�YA�}��=����������F���A��"�k=o�5�T�M�rSs�=����mq@[�'���D�m���jMZ"%��3�WhH��F��3�^�u!%<r�P(W��}�����x�WP%E���g�;h�OehP%����1����u��Wh`��w���k�����n����W���z0����e�&��4���s
��tQ��l:��������/�phE�1s7���]S[�kjpwL}�*�T�0Jj�,�1��c�	��A��:�8����k��2e�
t
��B$'��o� G@���&�H����i�b,I\�r���Hp�����O�q�3)'0�����aY�L��l��A�A^Y��!����$)�����B�����d�$������g7�d"��d*����m���p�����h=�8�8����jRr����W�Te
r?V��$�?��K.#���)M��`mf@���=i.'r����(X�L�����3B?���]7V�j-9`�H.���*����EW>^?��_�>�
�����s�!�.�o��q]����`_��
��d���G��;�Fe�sp��70`�/�(h(j�;3�-@o:z�6A�:���"�d�%���
�HmA4�q���Z�{CG��||�����v��@�6;��{r�a�n���6��'��q��
�cJ Wb���=������)4<��/�f��Ln�V	~�����tB��S�@��.�(rU�Cr����jh`c��HRc�����/��������G�@rMq.���G.&�
��m��=���4� yt]riA�����������CSE#i�B���2(U���+��@�e�F!L���bA��O����I.
��w;��F��+�p��X`@�M�V�g�)����
:x�����������k:�����Y��a(?��*��������rcC��1��
Ef����5��{��y�G`a�g����iF���Oo�����M,���zO�^Is��;�a:�T5�v�^goR9�{jwG�������MPR�9�ty���BC�r����D�����<�r��� (��P�W��=A1�|x��&�D� P#��Yo��}K�������W��1
��G���(e�.�Vr�fkf�_Th :�-�<�����T&h����4\H�E��,s�����a�52�����l\'E���I4d�s���>\��U������n��}H~����R0`;�{�m�)C�T4��������o��cx\<�}J�2���%�O�=G�L��E�r�@�>��������{r_@.3�_��	�p��;4Iy��U9H0���"p����4�|A��)���hT&5�q'.������C�R8������I���
��!�'�� s<�r�C�0����D�)���Rr�E�m�'x��MRlJ��,0��}�B�m���T��5�o'���)7x?�%�Q<s1�z����+,0E�B��c�����������4�h`�OSD��C���F�dE��4��E�L�JB���iM4��:�D�)-<;C+X�S������maJl�M�p���=�7����H��F�X���*������)�(G����*�I��[�v���P�U�$����X���$�����X�����4�Tw,hX������H��T�<$!��]`��u9Rx�qV]�&�q����������%EL"���o�
W���A�KzW�`8���^���(������P��b|$��/�	��G�ZE�>�{
��4�2�=1c�TGU�1� D5�o���BC�&�Q��2=e���?�2��4�)e���F�w�5���$��<��"e@[C��4�3���zo�u�	}���f!�+7\p�A��"�@���$l92���%�����7����
wq�9�4�'(�l
b�9R�#��"�M�?-�������!aQq$��jC��#Z����b��	SnhW�<w)����|�0�C��!�$Zc���*f�#78���Ms��u����
m�A�HZ?a����C7^a!���xV+o���O�9�rC������K�C��V~x��th7s�
h`jwe�����K����S��J�!�GI���X
�w�-Q�D.��h�6tl��eiQ��w�<�4I�ISqPTP�h���/pWk� ���QKB������'���"z�{������J����K�f���@���`�n�*�b[�Xu������Z��@C^�@�����	4��o��9
��/s��
����G��@z$?-����,I
9
�b������=K�������	h(fM�wus��iK���D~�������z�]N����~�
b,"��

4��:��2����o��
*!����
�n�������l��Bn����'M^�w���q��'�A��Cv@C~�**i

4�v��"� y)(�p8��u�v}���'k���W�"�<a��M-R�����k�8l�\�$��dW�_
iWqK�����)���w9Q�6��JN2�40��i[Wl�k�
h�k�����	q�!�|���wa���PXe�|�s9�S���(_����X
yk�[����P|��4@Cn{�4��RB������	h��|Y(4�������7�@����4��F���P4��8��ru����Wzxtt!��SO��;�N�Oq�;/�	@C��������W@s��������:�+��;���uW���>��[~XF�vW�+K�:�72W��&!R�[.�
��BC^�W|h�%�G2�D���T�4uu���xE4gh(�F��`������'��h�P�����������ZNH'X�hZ@���=SPh$h(h?���Z�x����y��Z�$h(��� ��
������$�������@C������w��� 
111����m]S���:K
��o��P�`�bdh(>K�!��UPh����x��ch����$h����!h����{q���wM�����
���}L�A�����4@���{�r�!�W@�n���B�A��])�G�@�h����k��m�
0�}���&C���O�SRRCC�|�]\
@C�<�|q���u#ue
$H��2&��$����7}K�B&�m�������PRR���TQ�^��)11��-//_he�������+**�*fY/��PMj\�/_� IDAT:��^��2.��������������}~
�o���OqK����5/��J�s�g�~SJ�C�������y����(����yMVd����6^�����O�w<'�p����X�������e������@Y��[~�����r�b��1��-����	E��E�����A!%U6�w����rS��I����p����������^��f����
�n��w��wu=x�U-�&�;���~�
�G��I��%5������������G����4an����^Fl�\���5}}���{- �d��~3W����'�����
�(=br^M_d�.'��"�9��	Y ;���ZHT��F�8����P%���~���HKK���<$����'|���!����_R�=I����~�����uI}�Ir�sE���cI~�	�9�[����.��7a<'y�7I���xN����>'�G�����.�O������K@C��l��I����I@�'�xj�'���y�s���������$�����0�+>w�xj*��7Ix�p������=�'��s�s�s�7U�T�����9��	���;��h���*�HM�A��`�?n&�
55������V�$��������-P��c���T9Q��X�|�Y\�=���	��������\N�����w����������?�U�R����b���2)����|.Hr���[Q��b����FR�o���Yg������wI��+Hjg�]R�o�x���s�=�(����sQ��K���~�s�w}./}�0�������$��$u<'��^��ea��'����PWR��?oA���\b�D����|������>����SM��s�������$��K��MR�;��%���$�wa<'y�v�%��&��a<�{O��i�U�l$��&��$��&��]�I^�s�BC�	�,�?1��b�I��
@C�����0a���0a��y6�����dQ���.y�����%��&����\Qy���zH��MRa\2�/� 
���RT��s�x�����Ua<'8�]}�(�#�w����~(
���B�9@C�����I�0��*��
Ha)��T<r���.,����_-���0�_o*9I��M$��&��]�IfU����.��7I����K��MR���J&�*���;������!���Y ;�!6�#����z����WI�Jf�iif�V���x�Y4��n~�W��M���a��%7Qs�S��:^{=)p>��A++D��KZ��H{�Y5@=������[�����_�KY������!����I��-���|[`����Z����R��0K^B&�
��S���b�-�H(���TlZL+�)��^W{��g_�c����kW�UP��$?��|;���- 
|m�G���7��M+�X1/F�:�C�@1���E��.��/x�7)����i����`�	w����S�-������h�+��)ZA��U�6��?N�����\��O�?�l����4��LE"�4@C^;�4��b���!v�O*h���~N#
��ca�"
�[U
���<��x_��V{h(jW$o�����K�]- 
��@C��B��jh���v(h(������R��`=HH-X�7X@~���T�4@C^��4��b���!v�O*h���~N#
��ca�"
�[U
���<��x_��V{h(jW$o�����K�]- 
��@C��B��jh���v(h(������R���d�L3�_�
;�f�J�Z����Wo�?�-=�x�L��G^��[����	��h��*�����/N��YYY���S����*��wx%%��%�����Z!��Y@���h�ko7�0b�b�;�s&������T=c�9��
�S���W�=�V���	���#���_v	h��kn\X�&�'���	y���]k(+k����<�E�����_���2��E�Yp��q���O���3��X�"��P�Lg]��+(&O�����}��4�E.L��������L�6����w`U&o�����ADD�����n��������JPZ�����9dX���f��@��3����������H}Q�����G���*S0s��2�j��\!�n������5�����b\���q�H�����*��8���T���m5
���	��.�?���2R���o���7���W�!� ���>�uq���~�b���j�F��L���A�m[H�(����#G���g���]
�w_�hh������uT��{q�
�(�a���#:.��kk0g�.L���T�k��c@��Xqhl����r���vu����z7��������h�5T�~'[���AJE�G<J��V�e*WX#�i9���	���e�����S:[�b��;���f�/�vm[�j	�T�^;0�������=�|)YIhi��T���/�����&j����nz�����r����
��t�����:.�
���n8j;CJ\
�I�hjZ�����L�������~M,U�,�/4T�Z�3�c>B^V^���k�Yx��>G���;�@�>to����%.��
����������-K�>�:;r�n��	�`yu-IT��������c�&�n�)�+��*!�'*j��7���I�����h���x$%�YO��8�+��S���	4��O����o���K/���~IB�����_�2![�b��	3�|�A�K?(t�Q���i9a5x������x=�{�c`e4�`�{
���n���-'���}
5�8�_4t��7_mFS�18y�t�1�fM!'���>'K����5lQ���>_���~O�H�����?�&�P���1�h����E��c�$�"��M{	PG����)4��@��m~z6�h�������������n��I���@��YH����=ax��H�8�*�~�!����b���0�h%E���.���;"���9�"�A4��l-O�AJR��/+�f�8JSy
[������ \��
4�;���
|<n��@��V������Jz�~�����OO"2�}�������M����G��g��h�����v��ql�������")�ae:���T`:�>L<Q��e)�+��JZF��1��@��h�W�+?<����'�hH:~J�:"����h�	Avp���.�)���S���
W�<�R���1������S���s�������TJz��hh_o<����s�����G<%��0_y
F���"r��e~W�av�jXv���v
N������zu�s�!+7�����)��
��g@Dc��0W�P�:�����+0�qJ��@C%���)�������KU��2���a�~�����&"����	��
��[f0�<��:-������Y������h�M
G����R2���I<���CI����W���[�>��,W�@����m���8{y
9���	������� &%
�!����/8-:��
!oNAU��:�%>��h0�����=���-�����������.���5�h(��	����?hX��������3W����Q�z��}7��N;�
�����������
���`��
PTP@���p��c��p��=����I���s���3�����}:q8":6_\=X�+�}sC�o�Z���������Hp����HyA��2O����`��^<Q�@Q#PR�!0,w_�p��Y
)�H;���`���FU�����p��+����s�e�O}5�B����"**
zzz�sU4��@�V5=T�1	1��y���t�����	x1�>�����k�_<�6�����]#�S��-_���P�>������������
m�
�����U�G�o���3��{G�������	���C���ND��)�}��-��X�)6x�>G��S`jd�����<��1z�r^H�/n�?��[�qC�`��~pvl���y;���DE�j�_��^���b0�������4�F���f��uN�
�7��P�f;�%DARB
�vL���%}�@��O/��K��5���b��I���U�{~�Grb$�\^
�Z� ��NM���3h<����$�zr������#�x�z�����t�� ����w<����am�b4.7/,"�BC�aaSWN�A����f��/�Nh�~&�eh��>^����Kh�m	��� '��7O�s���
 #����x�bb���SFH�K�|r������/�}"�}���B�$P�}�|s�;�FlTW��V�7�Ti)q��H��s�K3�(
h�����{k���
M�?SN������u|���,�1�?k����A����
��w�8(���W1l#U9tp����<�����4V�������$�����������$#������0���@s[m�II`9A�I�[�jrRtVKo~���s���V���<���&<��o��"��;vJ�����Tk	&�?L;���!����S����Q
�1.����ZkH(� ��;$e!�,��G~?��M*B��#$���7�r�3a>O��E���{`
�}��vK/.���v�$�yi��^���/�*�����>W��������	��V������l������1Iq��:9s-�Lj���1W=y����0Z4�Y{��@��������,�am�PYM������LB���P���Vk�]'����(��_s;	4��uuv������;.|x���F!����_C���KS��7�����h�8���.3X���#��R���'����i��s��O���6WS�gj	:��>�;"��Q)�p5���Gg0�Zs�)��s^�Q;S\�B�&�t�p��3\��.k���
��3���T)�!N����@��4��@C�������7���+�|? ��H[[A����n�k�\u�T����������C��s������tH[YA�v-dzx"��k�{&�:w���,�����67�����H��
��B���
�j�BB�[���:���Be@|�������#7"*r����W �Z�������1������3��]3��YzW��y[�Fv@R���m)4o���p������!�X��8	1�FLT��E��;�����K5^&��[|����'�?��:M������ ���G�O9w�vu�A��
M����-2������K��@-@�	5���"�4to����y�Y�?����5���g
�M���:l8q���M������&u�p��W
r�P��	u��f,VUF�Z��$�{B���������q>�D�)�B�}�FwYu���t��9`�Zt����f�a��?����!p��������/`������C����/���x��Z��`V�@��0��BwH�G�~A�'�����
�������M}�sjq1	l?7M����=�����B��VE�������#�sJ��Xyh�Ui�:���
Iz�pb:�-���4���]�1���N�����G&�o����P�����������V���V�=��f��h����'���)t�����)
9�,l������#����BZP|�������4�8m}����	���}��t����d!73>3nC�L��k�=R���C��`�G��=���o�c(9�p"32uL�;�/#k��S_�~&]��gIRQ

]�+���.�b��g�i��N�x���a�l��'L��qP8]��1���<|��u�� -I�2��?'=�P��L�ANJK��$��lL�W����=/��F���-ka�cd<�F%~O;�����X�������#���!��!%I�����-o��w%�uia���u9MR`����E�\�{Ze2_h?������p�a��y0R2Abf�V�
q����dR`�T�FW�>�r��� ���o7|�BSYx��/�������Se
v{lFzN:��"���5�4��7������f
L��E��w�P��Wj`�����j��D;<
�;!�[�N��`�d�����>iP����]���W����)&U5�I��]�.X�t&���1��m���C�s~�d���-x�4
��J���-�!����1��D���?�H`�n���t��
;>�'|a��h��(�{c��W0���{�+��V�ja�h�U/��� *=�'��V0����$���u/�v���c����{����������^k��hh�k^.���K(�^��|���P�q�'�����O��
F�hZc0]�%p��z$��`D�-����ks���lRD�?�>���v%�^���-�b�Y)������3��n�6��A��s��x�?�K��p�lH��8��Y��.��BC5����������)|�|�Owab���6
��p��lD���W�����JR�x�������D	V������b���*�"���)��+���t�.�����V������[F��� ���n�N@��L4��]#i>�y� zn�@�,E�e���DBl_�~��q�h<�
��XS������`j%�������sp�P<L,e���
b"rh_���!z�$Ej�-�;TW@2�H�=���X�K-���g�g�<f3k4h��^Kp�d��*��F�������PEtx6���%�5W�q9�v"z�n�8s���)�����S���7�A-=I4��F���k��y����(,V�a���p����kL�xbG,�����6Q��b �K}E|���oq4<��Rd�F�?.����2D��r�g,�c�
���Z~l��
����P�����������te3�V�B���W!���32�G^J�~����6��J �������u��;��Q�<�P�A��t�N;C���� a�	��U���#�<C�>m�!���b�F�O(��B�������fz'f���{F�=��������q�@����z�	�t��w���@}����j�����]���8��w�#��bU��s^~��#=2U@RN��.����H�������G��k�vEc+���a��a�e&1��>��`��px5��/�������vu<�ShHuG��c|���d�����,����������U ����7����Tj>����W�� ��v�f�uZ������"������(R`������.�/��@���H]�4���,GTB �����|�gd�U�)\�!4����!���1����^��!�s���AM\t[��N#�K�?��}�-�O�SR������g�x��bi�Jk�i�~��eTQ�q�<[
�*�c����n��

%#8�7�(� >9������)����t%Wbc�#� ��� Es��IQ���������nl�a�����X{�g����s����{�:�Rf��
Wn=���Y>d�{^�����'��{{\�vUla]�^>~���G�v�0l�|lY9;_E�U��x���zu�:������W���D��p��j�?�
K������[���2����l ���P�2������7H��Z6L"��h���
W������$�������h���9��/M����lz�`���$
���
�'WG��($��BNG���QmA]�rzTDvj6�/|D�)58��&.�K�
����5C��o���0DE���V��b�y,]?�T_4����<p;OR=X5�&�o�C�yt����#	�K�Z�-hu5]�%���64m�Wn�����q��F8T�E���}|{�����	h�Kk)R�}x>>��c���TO�W�C�:�8vv-�����s[���;��DT�g��'�i	]s:���UhPU����;0~�Z���
]��������V���)���j2�8���.�su-l�r0`���8��7�4LP����yJ��% ��{���#S����������a�s~t��8��>�`��
��o�������k�c�5��6�~r�(���v��dhH`+[�r,�F�E���p�X.���Z��!>&�����q� IDAT�n_Z��4�}~��=��8��m�	%em4m�.R�n7�������TG�v�+4��{6v��YU�f�4�d���YX�~��Z������X�a-d�d1��,����6l!���(�ax-SxG$�?&Z� ��(=Z�?���4���bi|Pul��[�� � ���8�p�7�aI�N6��F���.�xG��R�������Uw�8�������~&��������-q��g��ec^skL>���}�QR����A�rf���H�)�\�D�� X�����b�a<�!_����A����
�
4D_�@��`����}t�UC����j��#'� 75��q�����Lz�T�j��G�nZ��M���.���h���=��f�D4�,�`2�Q�� ����>m���)
�p���	��A��G������{�M����|#!������|�G���8�p81�}v��G�=� ��P�c��������x��3����-���c���hdV	���~4�^�Ce
4,{t�C	���$6t�����C ����1��>����~�%u������o��6#0��VXk��B]�&9������7A[A�4�|F����61w��w'Fs@b���<���6�Q��b��@C;�jO���P�R�OY������Lv
��1WUAN�'�7l���� ��)$���z�&[�@����PU#����
2�+C��	�Fb�(�?}
��4�����l�������r�
�5C���T���z�utD��S��G�>��H�6;vD���P<).h��^ Np���3v�!X�3��(?�E(��N��	H�t	*}z#��Kz6L���#�\�H:}����E����1$tu�%)	R���

��4�Z�
4�V����e+��C��/!$�t9 ���9��u���r���K����5�6n������1�!���*��.G?%����R��_D�����3�1usL�d��Jr��"����x�!6��DlB�u�����h_W�c���+�
��&���4��m�~��Y=�G+�Xb��i5\qK�����t*��?K%�T0k����u*����+�n6�����G���M]an`]+���b$�3�����Y��z�L�E
��E��.�p��0�w_�Sw����&�)���<�����6q�s���`����g�z0�g���O��0��[�H�4�Kt��>q�l%����l�1L��	�Zfd8zc=��BP���{1��2�������;8H���es7,q�����9b�9�*��`p�������m0h��
������H�L�����}@��~v(
��(�A��)T��#`�3h71G��pX����������c����kR�>�@�@���/8� ����]�a=�>>�����<�_h�)M$v���;p:D�A��@�V
���F�������U����<����{B
%S*
h���f^w���ki����gy���y��c�3z���`��>�@�����8�p�c���`g��r�:����OZX��'�������B0��=�=�k�MX4�����	38��_��20�Iu,����W��K1�T nP^�q%:��4�w�W�;z�[�g`�������*D���p��s(�D�����7�1��_Dqu�Y5��l��Y�&8�T�`��z����:�H�!�AZ`�J
��js����r���^�P��>	����uaH��;�7��eO\��Q��==E4l#8�Y_(H)p��q3X�Za�����i�`Q�5���%K�mT~�>��y�+�$�>A���ck�B����z�����������,Z��|�/*0�c��I�����L�$�YK�M9-�*|�l�N�60jJ�Pb������:�i��8�0��t�
�
-ymT����R��>�48���`���WK1��x���Lu��c�!p+:=�o@�����.� -9�������xR�S9���n(N}<��/�1�hW�t�>%:�Y��
��M@P�;����CP�gto6[O�@�*���������������@�V�����hPW��B���p���6kQ��iRc]����5��g}�
05����h(��Z��%�a����O�Oc\���L��z����ag^j�z��u������`AtB�4��������'���\�m��wOS����t�uQ$t
���q*:�W�����H���������vV��1�����Z,���K���%�@�7OR���*�D0|�.|3��w��0����8�Lq�X�C�Z�J���9dO� �Fkr!!6��g@���$n�M�@���W7�<H�%�~ke������l��.�-�@3�3�?����&A��9�

�`V	0�`��-�������9����xT�&��	ab�H<��~V��
���X���6L�*a6�/�X�

r(4����6�}w\��������T�������/E+4��@C�Wr�# ��*��� S���.Bids��&s�@��%H��CBO
�GB�W=��v���&��/Y9���'0!�nCF��k�����<�rCc	�&8�����8�=
��Kb�o�C�;mB!)d�"���*�
���Eq)�k���(�?$���~�f�����-�v
N��������������f�`d���aE���W���T]r������6����������3�n����9�&�G ��Zd&��0�7����_�H���
���� <�������-4L��Ye]��]��m���EHH�A��1X>������wa^�o�o,cq@��am��9����#7��C[���k#��dHA'\z��C	��~����Nu�����S��u��8|{�\ZR�/��������yy����W�BO���b���tT-p��t(+h��C�{�����T�
vf��E�ALb0o���i�z/v\H�BeT4i��'�6dUA������hODP���<�,�E����^n���F�:s����)���0��4}4H�����������o�H�[p��v
���|/,��ck���L
m��Y
?�?����t���MM��bzfv���x�4���P<}��T����`����-�<��Q��b�L3���v00[
���6S��F
uz����L<q�:�B�� �������-����1�M..'k�I#��[K��w��C��.�*�b\�aF�ejW�D#P��hH���������H����
*4�������!K���^�������D@C�+~_�AF]�c�A�vm��}�wc9N��'h1o�3�_�C�[h�/D�
��x���D����5�!������+t���0R>8zf
��Y@JC�4���I0s�@��%�cx��X�S�E'�������)�0cI�i:f&v� 0a��q�]�
<�?�[��������&WZ�kqg�U�s�xx)�' ���D��/�������:b��S���;����vm7/��B`�7�e�v�����q�,�������NG-��44�I��`0����vw7>�A�1��ocw�Y����
�������3�V\��
�[O��f�5aD���]��l,�
�0!Pb��Nl����g������B��S��`R�:����RI��W��G�Iy�>��>�c��x���+S,��R�R�"����u��!�
ZG�q'��F����m��_��G�oS*0�Yf�{q6�\,-�t����3�Dy�����g �=���aQ�l�c���X�y2�3��&���+��wQ@�*)'�a���-�*P����w�X�����H��Ya�������
L��ct*�u����Q��Xk���B3PIO{�����io�*�#LS(P\������l"��;G`���%��()���
h�?#$����lz�|	���=�M�v���J�lf+���K-'����J
�UM8d ����4�8��4 ������$���~������r���k#p��|��xBR�H�	
�E�����G��0 ����N��@$IE#��3����3�^Ce��wG��K����%.#�������r���b*���-���tm<�^��4)o���e@���r=T�2�A�p'XmO��xa��
�YK�|M�MUt�P���������q�[b��#p1�G������M KpCU=s�9�k����+���hf�H*��"���>8�Y`\��J�	n����~Z��y���8,m��o��&}x=����
4,�������dRV�!;4i�X ����2==Iq!
����}TI	A�vS��cP���v%Ip�A��R�H���+)d"�-��{��-)
4 M0���7i�������Au �$��qy���I�,(�m��-R�^��Y>@�����Iy����� ���]]@��28����8�mS��	�P��!��M|���BS�5�oB��R��&��`h�>2u���� ejJesf��|�H���?C�n]H�g�������K=�O��?����c�r�:�+Xp�a_�+���4���b@+-Z0�"�(4tV��IZ����if�:Y9���0w�g%0��)7��d`�TS�]'+RX��B���x�.��$��7����R,IWJ
4��j9���;���5����?=F�z�M�����&>�7��\l<!��ZNHI�`��]��)L����
,�`���:dp���oZf��n������m������w�>���E �F1U%Rq�����1ckO,~sv��;~��vi4�������ez7��w~O���X���_��`��9P'��������i��f>������k�����T������H�8��+�{%9?�)�r��ANP����=o�j��$WxO��Q���*�O�)
q���.���y	�`0���*\1HLJ�s��~s+��M���� E��g���u�.�0����R��`D��o��u�(��JS}�l�)1��'407�gi�"���m�a����,�mBxnc,�����_8������m]�������V��,#�4�e�6</	��]����&Q���$�kS��e��>�H`�������7�bD
{<%�@�$����������������o�^���{t#�a��!�/)��0�����l�.�A^�`�G��'��Lx(���&,}>��2K>�!����������p��R�����x��C:
z|���Y{Rv�Aw��\���;8�V�.R!`�K�#p0��\�~��k�����p<A�8,q��-����a9EC,!�������=Z�g ���'|�>*���x$&T���!8@�@�.��!-!��e�����w����n
R��f�+�t������u]F��2����]
�e�����������:2�~d~L�#_P�>�����`�f���O	�����/9Z�hhe��R���G���?�~DIN����	��H;}[�M�d\z����n_W`hY{��Z�7���`/���}�@�<��}��Z�	�������I
��WBB��:m���C�c��tA�u�����4w�
FN�i������������3��kJ�7��h������s���
l�?62��h��:��M&������]+�]�������_�fI��-)%��)��(�6V��R�`�������?�������Vy1�]M�fc�
��',8������{\�X�!�u�{e��|�o�Ae��MG8�	-���?����*����=F����3=�4�H�G�/0�	����it���MA�6�}dP��q2`�^+e�����~��}���D=�C�I����Xi�C#n�SJ
4���Td�6�?.�k(��}��2��\8�[
�}7��=��@�~%��u���`���Ia.9AQb���	~�	�#6R�#�!��>�����h ��i����E�8���A���P�<�8e��G��W���#U�:����a�B)7����?A������r����j�k�KR�P���������i���j4�n���~v����H�K����~����0�����M0W%����B���(�4�E� l��b,�����C��E07*���j�I)=<o���DIRq@C)�<=@��Y)�������f���C���F��a����0u���+�"4�{cmR50���c�C��A��;i���]`�e�{�v��f������������cp��,��U�1��	hPe�{dI��	�/�G�F+q����:����q��$���>��V��0xAVF	�����Q-��p�++t��'��D�������S��-Zp��#��`������q(mt�����	|p�J�}Nb`�m�{m$�5��C7���S�5X�Kn+�Jj[%M�YNh����Fy�A���p�/w��Eu���i ���I"��4�������6��z�~n#��&b�q��#���c����6����6�����M���=Rz���L;L��FU��Af�CQ@��#gI��	V��gV�G��}�������x��jU*���0���}E�?��E���@I��W>9�1�@pD�,��M�o/��]hh���{�>p23Aus,�p��~�����G4��@�i{+�����.����w�{>�P��rh�W���T�V����������{�>���g���YT����0�������*���@C@�'V����$oJ�����l��������7����q��J����6�

g.o��u
�g�ru�N�G�����k����m����������p����a��-�st!b��y~�� ��`�0�A]U�+3L��.mF���p���!0����M��
�YH����m��
B�A[��TzsKf���]�v/Q?(4HK�����]�����1h�I�^�9$�"B����I�ZQI�$5���*R�c��k������N
w.	]�+������Q��\J�M��wH��2�^����B���]0������V�$���7�-���#|<o����8}`�4I���-Pv ���bh��7���ig��s4a�l�]�������]_7�:C ���fV����W������F����2���'29h����I9!m+���B4zU5�����0����1��;�� I�������>V��C]��`��&VXz�#F�6#������NxR2sJN��h����0R30��)���R�<h`j	���������z�,�|��.P�(L��)x��	��U�:��.�����������o�Y�Nm��X.'%�
���9���C!!�������I��<Sh�M�X� ������QaiG��`0���C

����g�=[T����1�]�x~q�N8�U]q0��!����<0�F1���eI?Sh`�B-TG����f����h`�B�����>YF�G����?DLZ�

�teu1��^n��~�����mG`���� U=%U��)
��0S��MRa��]0���H��e��f�����h�W���������.�������P�TV�!��(�b<�;�42"E������#G�H�
btg�2�UH���mZ��
Sh�'5����[g�$q�������{�I��)l�r�.��p�CLe���h��J���
l�_\N�� $�U�R�H���
�r;	4\��m"��=�;O���M@�F
$�����DFha���`d��<�&hH#�qRh(�!���2�o�3���l�&�?�Y�%���7�A��#~�f���H9���y�$���Sd�|�������4�n��C�c0��.<��hN,hX2��O�)4t"�������&V�:��pp�,�G���b�������O�A����Th�T��5�K�<o0p�+�h:�
a��jpS7u!uk�����[�~���*���&���u��bV����M;i�I�!��;t�?����63H��)�qu�1i� IDAT���9��p�o��0��Z�����?,u��6�&X,hPS&e,Rf�}%��`�C	����X:�W�h[�vq=��!��������3��b��k��Z���t�Q�!�����O��12H���(�A�*��f� #,�d5�5�z>�����$���0��O������n���z���X�&���~��|�Ku��+q;
i
y(��!���!�������� e���j4��l���>`tMRA���d	������'bS3�����B�*�X��&�0����a��;hiM�8	`b����\�
F/Gk����
���K�!h�AsI	b�sO�% F�3��� #!C�:X�tv������������%�n0$��[�W�]���^��Y+��2�g�v��pV���A�%��ruf!�,2��9%������:����0B��.���^�q3�2�����'x��4����TXbe�7A��`

+�m�?�^���Dn�1�`�iT����O�pu������);�YqU	��PP�A4\�H@�,���`���������
�	��R������.S��<�T

��Z���:E_R�8�*�=�k_���-��*CO���`�&����-��27��py����������;I��-��
4��4���#����:��2S|��
���B�T��q5n!�0���4<���F.p���k���,}�����;�&������y�a�q:&�>�5'�kYr�)�����u�`����l�Y_�^s'Q��@���c�������7>%���������)�c��4W"5��H=!�?�d9�F�#f�B��H����I�����_/J����3	\��������jL��!���SxD�	#�r���z�bZ�F*6`PC%g�����5q��!��sI)A�� ��`�0H@��"^MF��\���B��a3t�s�����0%���bdV�7���Rh�>$�
���*�	�bE�8���i>���I���D�|S�xr+�>�C�v*?
����/X,Id���"�v}�qhc��AvJ*P���H�60RT,M�+�?.�6�d���U%���g�}q��C��������1��W#���7�
_���0��$�	f	��q��}�l�J���{��<��'�����e���FLh�����4�%Wd�#[	f%����\z��v4%u89d�k�����T

JC��zh�M�E�Rs��@���.�-��&����5�`?e3^�����������l#� ��qz?a_����k����G��
0��^k'p��O�����P[�,���w�m1����wk"��`��g�8�!��M($��i�g����)h��~4���_���y�X^j�	_q@[�g��	d����j�� t\p���-!l��qk	g��d�w�t�A��%���4�|FP���{HQa�$��+C�M��BB�T�����j��[�>����Il�l+

�nM���P���c?jU���dc�S����1��8$������,nD%`@�m�w}�?Rh�!�Z�6�Ey������$���j4(�T�a�n�9�Z���J@u���,���������4�a^C@�����`i��M�f�C�F8v�*������1>�������DA���Vm��a}��c ��#������?\���P��0p!�`���i��
K����bfNFl����)�o
u���(�F��()���7�\��^��$�?bx��C;����#o7�\t�/��hY*4���B���|bn��d9����c��kh��H��x�g~��"���sU4��@�^]#X����>��"9���*4H��p�	�38�;^[_�eq=xm{��u�~�h�����5���v�
�#V�v\��1J��]�n'DF!))5]�a��)������8����T��q�dtk?>hh\�y��^"I�K���a,����(gi���	�@��%�A,��
3'���K�b��K[���.��h�I�~p�,'hQz�0,�z��,�%I��VkE�5��tc/�8��4�;�Ev!�2w��=SQ����<3��Q��HNI���LR����c�7v{y���S7d
/3r�RnGakY-����q�)4��r��o�����X=������&�������Y<�?2�7�:�Z��!�G����mI��KR����2C�*�`E�8�%
��H�I^d�����1
[�g I>3)���^�QSh8�sZuY��TV��;)+�[��

�4�,1`A�<��h����}�"�@���:����77#:�#Zw]��1���2��JN���6`mTu�k�5�$�S�cx,�m����aO������b��v~.mi[u��#=�����4~���BM��Q�cM��B����kx���8D;����$eYe�y�V$�z��!Lk1���iQ@C
5tvH�%�u�|��F[��s�s��V��@��P��$�Cm��`jg��1��9Te�L�L����P��guy�@�c��@���0��)�2Dd2��|�wV��,*�{�cE[;l{��+�z���5�T|�J
40�����?��TP���+��pD�)q�9�WD����Kx2���z��� ��"�<����\q�YJD�y�m*�`	U
����X0x �'F�"')�o?�����a0�62>�C���l).B��5>o�ca@�v{G�n�o��89s-ns�����n�'��T�.B�w
��J�����7�9	i0&K���X(X������
��hR���N}�M��v��t��!'�d�Z���lsr	@).�h�'{�)�mi��&MI�����|p��;�f[��Hqr������s��M2��E
��7y<-)`������m(>�}�YV����*TF=���H`��E�i���<n��cE��su7YM����\ia��%�����K��`0C]w�h'L`B�#�&B�t��N8�p5��q�'���n*rx�4������NIM 0h�����H���������
��Kh`*���#�f�1���'����uH���
D��)"0@ROi���`v2�X��6�)*dA��������]0�����}� ih��Q���O�����[BY���>>����{)3��
x?�}�#X����P!u��@C:A�dY!N�5jH������"���!���>�Q#|���z�BBS�[O������g��x���#F��>#�$Yg|��������9�!ocI��b-M*
h�Z�,��Z,����
�@CE39�o�]�p�Nt4��A��g4H��:�Rx�6	�o�aJ/=iK#�&�?�r����_�_�}����B4�4 ��hL���.G���<��(�J���l�t]
Y��L'	����ax�y�@C�j�P��1���qn�"����Xb�����H�\YE�
�������.|����N�sW�w^��WD�;x�^Z�
���jOv#�4/�� Wq�^�����������	������l�io�����X���&����+'��2�v�Zp�vOf���W�xX],��'g���X0e�3�v 95}ZN"��`�����
������s���e���"�$�")%Um�������d�`������YCeX� kN�DJx����@�$=�3�	����>1w����;^���������_8�����^;�<�����&��n{h64��
~KB�AR*�����J���q�EX���A�����1�I���c5�.��P����n��40u�Jd3��B��{�*�Z�@���V����z��3�>�M<o�bx�h`���qPNQfa�B�0���!6��aj}'����Ct��zO@CC%���X0����0�����$��);|4�df���	�W� �,ZY�x�i�`*/��HZ������v�����p�>ko��f������a��z�����00��4���P�) "5����Q�]��p���+� �_RbH� �����:�A���d@0'}'��>SC(��0�,��]C.��xOJ4 �%U�A� +)P}e@�%����:���1�_���]IA�H�[����rT�)"<$�����x��C�+��CA�����Z��� �������?S�`��d��2����9���c�N�����T*�A�
�q`�����8�)9�`�J"5-%n1!��h`j�}�6��l�`���fsk�XZ�a��T+��9�@v]�{����t��-4n_!z���L&e
6f����`��+a�18�~�R>���P��4N��\1�+��+J)�J������
�k�^�^����|/Y��
��*d?1���Q>p�x�����N��p�>0{	fGQ�rg�~�b$Y1`�:�9Th�N�Z��.����)R�Q����YA�O�tz�c6�
��vp[���NP�S���"��jv��	)i�p"5�����=��w�K�h`*F2L,
g���a[���h�ZG�����	.�G}��~fe
��$�������DXH�����I=��\IB}�a�:!���� �a��4��B���,I�}���	�7�T5��+X�P���	���m9��(x�d@�S-E���q����H	H_-���|�x�J����pm����O��dp�kZJ�,�M*�P(��_�����dpS�`�jT�
��T!X<.�����$��9��i�:�`$��J�o���������80X��;���$���`���C�*�
h`PB�8�R015���Ktx6:�@"�k�xX"+/����(�����p�B��S��"&���?��-,o�7��	s�V"������z�#�!�����}����-��&���CO4����HEA�l�����(oRO�ABKyd�4��� �����A��rIa�)1HW6C2S]�<i�	ZN�wV���S��o�4(m��G��
�g�#F��,_��[�oE��W~�����)�}��]a

���f�"H��zFWT�6_��������W��]�C�q�b6��U�$+_?�Z ��Z��G���KsRl�,������i���YQEJ�/,zO����p�k���a�~>�V�� �<��YU��.��b�H���<�3q�9U�|�!;#	>w��������]���=x�������
yz���kz��{�i8�~W���+hPS�G�����~P�k�y�XE-\&r��=�_x�m]�����xh�Tw>�|P u���wEY
��9q�4�Ev�����yS���"=1UCM;x�"�z��1�+6�v�����u��8����_�b�%���	�$�"8�
���AM���?�<���^�AC��[S�������p��#��hU}2y�w"<t�W���{�1z��m?��z_�������r�
,Y��i�[�Bs��gB��:��=G���>7k@l�
�t�I4:���H�a��p�������u;��ucXW0�	�l�}�&F!�pY��S����.s��
;�DR@$���EC�{�4�w�y�2�c�d��|{X������/6�U0�
���p��CE�{Qe�h"j���PQ&OFCZ8�
S��g���lJ
4�6��@Ci�����GL4��@Ci����/h�Y��>/h(K}�c����_q@Cy��;�S�r���0 "�g,�����6�_�P���JUI)24����2kI���2�2U�r��yq�a��M��l�����ZU��~4��F��J�
4�!��i�-'~���y���%�nC���,^E�,m��(K���)
h(i�;_I��;�_�^A��������X��V �d+����H��_���XgQ@�����Ty
�J��R#m��dZv*����o�7z��������FJ[WA��������h��b����
�����V]����
K��q����8����H�kqq���p�A�p�������w"�	����SQ@��n�w��(���%���Q������yq@Cy���ROa���w�P�#�{��G
��������;"������h
�=D@CiGL�_4�|��T'��
�!C`SH���9]�ZD@CIF��yD@�������0P��
���!����WR�"���A
�s��ME	N�B����E��s|WS��oX�MaY��
���h(��eE^��
�R�+�w5�����
�1��]"����/��Y8x��Ezn:U�m~E
4�"���Z"���oXy@F���B���R��{��qe���G�em�,�j4T�q���MA�,����h0��Me�?1���?���h�g�3)I� �Lj��kI4��qQ��
��
��
�������N�B�/�U��4�h0~q&�P>��4����;�������h�w��?��B��u�~�hE@��~���O4���O=��h���h}����h
��)4���V^4���
d/�����������X����RT#�*���
��
"���g���BCi��$�E@CIF�|�����G�P>��+j
E��h�g��]�h������h���H��
�/Q��pD@?("��7<7E!������OO(��OG���;���.tw#  H(J�������]�����k7� 
������<�
�/g����X{����3�|�kz�P��
"��`-H�ZT�P�2��1�n�-����7q2�J���
����7++?~��^�H#���bJ$J���q������+'"\���?!!!***�*KBV)�)�J[����k+Vs���9+�X������l�HYY�?fCq���]EGd%~�Efdd ���+*~��Y��������������*H{���|lR��R�%&&��HIIw�E^^��$�h���u{/��+@l|KM����Ir�;����{nw$��M"C��O? %�i����
:���^K���
rm���y�yA�(P���{~3�3�G�d�����������R|'�
�.�T{/,��Oi�~���6�(~��ZKt���oRb�c_��#?��������������L���.���2��i�)�W�[M)e�y���
��E=����2��h�R�����0.�P�(��\�����?�@.��������A��E,�;�����w�\����~4��J
��b����WZ����Y		���.���xK)
����[�'|����UZ�;���
����^��������^Z�����E���d�|�4�o��\�[�(���4�o��\��Js{��J_{���������$��'�s"�%���l��j@4�=�L��T�&��&�����
��?1�,���h\�^�V���P��7�|N4��{�������o��-�����Z�'�
�w.x.��\�{��S1X4����|�t��D�/�;��-��������D9�j@T�>�������
d;��������[�\q�����1�+��r��k������v���ls����0�^R�������b�rzzz�T�)��.��Q�qK��V��Bin��y|+�������:����.X-��\Q����_Z�{i��};W��J�z�h>W������%)^n���|����PZ�7�|�x���t;�_���o�J��VZ�s���K�3�W;�D{)4������j��)4�=�At�������{2E'������,)4�>+������4���<��������z��4�w�|���� ����=�THS�gSZ�_D�����K��&������4�w�|���w�|N��P�I�_���X�
Y#�[2j@4����+D/L�o)zaM ��7�����	dI�?�x��l-���4�o���h>WR�������o��-����� �kL))���s��\Ii��e�h>':pT\m�$�#j���^�P4G-�����������t�E�z��e �^�,r���CLY������AIZLI����,��g)1d�	���EGGCSS��������J�p����#U� IDAT""����o7+b�g�������6J��ib��,:w=iii`�����%���b���$ �9/Q�/NA�{�
-�D���e
��)66������%���y��m���{A�������Y���KP_)��f��{^��(�7qz�4">���b�W���*���71J���maE����*U���"���J��V|�=_��H���MBZ	��7�.���U{O�
C���B)�$f"Fn\����^�'��U�>��s��k5���O����Q�����~W'��������j>�!eL�E*��J*�G�/�y���S2���]�)��-UJ����������E������Q@W��y���H�J��,�k>��.����_��$-,
�� D@C�4�\2
�Q��2�s5�+���6
-�����
%���!H�0�3d�T
�"��PT2��I����/L����UB��P�d�����\E�H��!���t\l1]��83���.����b��+#)���3�-�W�EX��B�������$R2�����Ym�)�M����?uM%�b�i����%�D�mE\Yb��V���"����~�LWX\�;���Q�%��� =��������G���UY�h���"���
��} �VA��x�%+������(YF��A��$|���%��	h(���_U��k���(���|�#��������?��6�f��cR�5����%,�{��?f��sT�����KJB�����C9����3��
�C&BAU4������j��
O�I��I;���<3"�����h�}���@4d��P������h(�;&���Kbi"��p��h(���Vt5 ��n��h(�z
�_�y)Q4����G4���
+�h���
"�������#���Ee��j@4�=�T4��Ak-j��vU�!:1�Z:p������~P�$$��[/x�c��+��'?	�
hX�y�^^�)M�`���B���rK���b��}B�D�[�/>�����E���Vs���U�M)$�	4(���YW������qw�p����~kH+����n��	"[�����p�:�?�2z����	�����Z"-9z��������u��G����=�J�m�*�W����H���I���5�R�3�B| ���{��
u=�;������%T:A�>6������N��8���uu��f��4��sAB]���$W���aB�D.�)�F��X�0�m44SB\Z���|��)I���
v<�*�E4dF�!���kWD���P�D(S{�Sb*�U*� r���WU���9�(��-(�r���l��+�D�4��h���H�+CJQ�Wu	V}g!��1$�O��v����i1��Q�+�r�x�l(��Y��[��D�U��T@C{���N�E���p��	�
n^�iz��	�iK���u|1��������b����r�h��Q
~���vC#��8'�5��*�|�3<&�*� �rM��2���G�#��fH�ME�]���|^����(A�Cy��yZ�%���h(7R��a=_/��}�c
�B�����������=fa���BUz��m�����Wv
��W�h�W-���m��)9�?9"��E���7�>np���*�9��T�H��2����N
��w��
h�j�q1P�^�g� �G��&�m��1�c���b�z��������M�y��3kl��+���hh2j1n�Z���a���EZ�E4����5'<�e\-t�M(����1��-�m| T��E.L��'W� ����D$����c[��,L��@Um[b��-y�C�����*��%��w�_��u

K����Q$�Ca��Cpq�����o�3����c�Z�K������y��|��^>HKOG��`kc	o��8q�_���@[S�;4�.���D���7��b��!��"�_�j@4�=7\4��Ak-j�aE��r`72�~��l~��8t�6������C[$f��~A���l
+���W</�q�AZB�.����
RMB�-L����@��pEjL�����2n1,-��Pa
]���9��fR���������m"�yZ��da�#���%h�\[+��#3�����)AYF�����)Tg���mT�"4>�i��(����A�\��h���������A����5*@�H+�y�`3d	<����s�?4�����v��'�uWe�a��������P\R���s��eY@��1���i?)_`Ba
vem`oR;n�/P=�5qq
�����U^3��i�?4TXX^s��sF�5�f��R�����m
�����wE�>	C�+�6be�������|h��F���?1��Z�D
-����������
fUz 2���F%h�������ul�/
f���o�4�������
��dc���������[P�B����@���4����A����:�AZRs�8a�vW���?4:�����7wJ���JW�>�gh�!`� l�St�E@C455�����@

Vl����t���� PG�.��!8����g�����
�ii�?�>}�����pa���9�;����v����J�
��_�a�effa���HNN�7`QlwMT����
�Dr/n?���t2��?�>��p*�6��B��"ik��	q$o9��7�s���0�3d�TEVV>~�==�<��/E
%h��$kS��v��%:�{?�z62x����XfR4>^]E��2�X�6Tl�v�R��w��eU��5v�6��`�^����kO��x���[����������"F5k�9G`R�����	U�q��O�}���Ew7���~���c3��;��#�����4j�2�8r��;8q������E�?�w�	U<��.�S�hT���q,8~	qX��7�$%��!��\��c������%���.����89����H�a9z������'��L�G&7��}���L�m��o?�@CA��M@JF
WL`
/>��������-Z7�����"T& �}��t�������&�@������c�0��,(����T9����8����@^Zjr�8�v�+4���E�yq��+.&e:����
��Gc�F��������j�����A]A���������_
�j��6q9�H�#��9�>��z�w#��;��3��gCVU���L��|��@���I�a��Qg�6�����s�d��p�R`�|�/���i��0��bT�O7����-WhH�E�:x�r*�L���=SY��d<�G����t������~�&-���<����A��`P�-�)����d�	Dx=���9/7�U�O��h(W��-��:rp*t,k�\�.�~�0���l4��&Sb`K�}�j4�+$���IEH����7��w� �m���%}.w�2R`�a&�?>�o�nSh�����_��g���*4Eu(�����;T����!T�*l)YE8t]�t:���o��[��BC93g�o<��
	\8��#1p�vD�����i��e>�1,�-�^Z���w
��
{�Vp���)�4�M�����c���&B�l�uc'^���6T���<��}���L����5B�d��W��@	j�A^�:���qG��28�
����r$%��gV���O�*4��>��6Td%���5"���!�}�[$*�P��"=���G�I��@'
�y���������0R����Q��J����H�
}��Y4�5d��^�����<Sh��8�����CP�P�	,`��%���:rh@��+4>E���
��B�<1)Y\�����N������ F}��	/	
`6�(��&�x��"n_t:�R>���5~��:�����ap����_,��L�}�E���!.s��b��t������v8��[e5�g���������"�+A��pF�%?��}7��/��EACn@CV\���om�@d� cm��u� ��
�!�w��)�P}*�@����m��:�	����$���)>*�BLZ��n�SR*��u����^#��;^��k �}8WhWSD�gTz�C������}�
�	�G��sj:2��@J�N���:>�e���kU�

�/�y<�*�\z������B3G���#��Cd���|������4���DVB
$�|Y's$�	]5�����}
��3i1r.�9*y��
j�N0m=���>GV�8Q�
�!��>��G�~�cdb��Nn�����
'������5[#���O�i��<
��0�<��E������_�9��)�}���i��T���_�%�4x#��_T��|1	)�������p�}I��P2�����H������\B��O��

���G��CH��i�|�C���NmB��g0�8
z&t����c�Wq�B>N�=�D�-���8��1XC\Z2r�{��������W`�i,��@��}��|@v��cpjt8^���s�$hL�&�)%U��%��1�;Y
=0��X���2�'�IFB�����:�~�bR~Cn@C3�h8��
	,=����F�]����������az���5��|�4������EkTh���>v�>�����sK>g�tp>D�0���j����3s@���-�:��0��(n��7�6�[AiC�<U��<�����RK��5�K=7
�

S[����G�5���J<x	C�2�p`R3����,�$��������w�y����Wp��)��6�@�����V�E��d�Y�NIq*<����RYZ���6���)�Y��
R���C������*Wl�}���P4�z���I7��I�C��nX��7H��q��R��sk����Q���My���T�t����������%�`��
�/+)��)\�AJM����4���&�H�L�8�#^���]*0�����+��f�n���^���7�k5���������$���i����]}��)�2��._��4P��71��y�x�� �v���$a	y)x�������{�.� /�,���a:��Sqy]x�rE~��s�m��w���|��B����'M9�yF@VW2Z�x9����O��^�@�yD�����������������
Ps�V�^
��*���@��$�Gq�W��m�s,RC���"K��!�F
*��B�O��$H�
����G�;�-���G><��w0u�~���a����{>T���C7n�w#zw3j3V�M�2�8a>|����&�oI��R0��b������O�D�Z���������7�fv����P�����m���4hiR9��~�(Z���s?�+�u�5�������"��1\:�FbT �_\��M�����w�������f����
M`h�������sy_�M�A��
�����]���*��SB�)/d�&B{�#�S��p�=�jC��{���h�P��8=_�}���M�����<��I��t�M���O{��-O���?
�5���>�Ng�h�_"��pJ�yQh����.5yY>s�C�jm�u��X�{��w��G��dJ1������)$�N�K��I%�>���c{�^�1������<|MC)y�N��S�}�a�:0��sX7X-�
�5��we�������{�����#-4R*j�?��|E��Z��X�;�[�kL_��Pv�$������%�Ix���x�`2>��I�)x����~�"(�9�����7����%��@�W��|�2d�FC��������p���@���<���@	]�\��}�~����G�AVU5�h@��q��Ix{5�����aXz�AF^�L����>���1��Z���@�����e+3%D�����<���Z8�2~�g9��S���zf�H��7*:x~� �ikQ�	~�m�����0����!���I��p	����Y������c��=�&V�D���
�q��^������}+�d� Rn

=��F��=�I[bL�J(���cw��J��
�^��C��1um�� '��plv#x�G���
)6����H�l[�
T�E���M�Hqg�����_pN���

+����~���jW�G��ey9�=EH�p*��Rh�|�����Y���	��'�aQ�	5����U�.-c4����fs��^�k<
�����5���TJR][N�s��J�A�������5�K������t�����>9����<����i��5�m�a��Yy.�E�� ���A���D��U����=OII����{�<������C3)p�
�6������O^Djj����k�BUE,��~;u�RRH�a�r�2��h-ic�I���|�>�]�E������N����$����Q��ee��n�<�}��H��5��!����wb���<���?{��p����bD���(����
4���S;�se+�������K4�h���^������*2���S]���FF�(-��yY�<��B�T�A�4�=��'H��V�������DL\"c�_������A/I��/����U�<��0@��qS1|�F���"4&���0��������� ,?K���q��
��9�N�j"8:
�����7@CY-m ��8��/��

��OE��K��kC��K��'�x���*��m]��>mQ��85q�._�������E�`hzQe��b�8�����^�W =��J������z��P��������p0��������jq�a��YJxF�7B_ce�{t�U�0��|��;��`��~`�f�;o�p0����86�:n��
��(�S�^��`�g
�}����U����������q��6��"�E��"�������z� [����a��" :�
����KK�@>h`@�G�GN���V���f4���o�����@�J�y��C��+���j}��V���KQ�V3|���+R<�>�7TM,`��7\WM�PB��7�JM�I�6x��6�h�2f!nL�������0"���vM7�����9hpyT{��W ���Cjf�F���5�Zz��1��,�
�����`\������@?*c,Z���&�b��H	�@���Ex�u12���A��1*������
�F����	P�6FJl��*A�$��m�c�%����	��j<�.�FY��O�����8�������Qg�~�Z�&U;"���Zp��&Ufj����-�������{�]U=���s�ss7���K���<�w����Jm&S��P/[	$WHyW��`���4�h=	��#��QU�ETT��uc?T��iT�S*��r��
hhr����5����>:u[����@YE�Q�|�>����@�Z=p��L��!��q����J���\G8�t�����1�e}�`�jZ��P���E�4�d��%����S�hP�����c�� �1Q�-��mi�1���N�7k���(r)aFP���4��&`j],�����������!/�~��,
z�������g?`���$��Y�������0�E�C[\#8,������@�rTV(�������9�0xb����+��&�hhZ�@�����p���O<W7���}����9�Z(VSY�N0T��G7��esX|f��4�����WBPFY
�m���N8��F..�
���c*�(�I�4^���<�--Up��aP	����j�"���=��y}�/7�!��;���@��R�� M�q���>�2�#�t�%T{��P���&R����*h�;@qG���N����!d+�E���������: #0Y!tMt�3#���M�)6	���p�����!S�,R��B���`	5�������P�U	� ���af�R�j'5AV������G���PlJ�w,������
A���n����6�
R���y����&����&40  ��L�Yu�d/�wg���A��h���w���GW�@@Ud0m�?�@���>*��5m�D��H&����]0"@�k�JK2���0��i��ip0�L�v|�5��q8����K�pnzA��6��D�'B�����-x�m&����ex�a"�"�yG����u�P��0���(�f�^�zKH�h 94�h���*�Ti���g�� IDAT�B�RYK5���6m=��h�G!���A�F��������n�@��)�\/�3m�� �kym�^���kV�������S�|���k��B��#��Oc����:r���^�#]Um��������W�am�%Xv~-�����f����jt��A4��~���3O/���;�����+{�G��8�z����aw�����G�V��n��s���`�����i���}�b��yX�uzn�a�3th���h:Fy���"fs���\�Q{�@_M��M������
��a��������3q��VfUs'o4�m��O����4H*K�v]C<��`��������@�QYp�G��<%+
(��!��/�3T�������������/��3�#��6���/��#o`����x����]��6��a:��o����1)q:Y��6�����9�y�5�d��!9Ce�oy���������g�j��F��E@�~��H
ID��Hk�!p�+X����=0&� `'mD��f_W��p��/�����
R���RI+G��~k����4�[7*����S,0h��)��8�m�3#��G�H�&��>RW�2�,z��/��`!��O�wh9��a��r��*�Q�6>���|&�N������W*m��nl��9X�����x�(!�~pN��z���o�*���c��
6+��f~�{I�Gd�L%D�JF�G:lVi�cl�� o,��k�(7Z���!+�3*�%��	�gkH���2A01B��;����!*T��C���
Oo\1h�r,Z�
F��h��/�������@/��%�f�v8z�`%��X��K{�����K�;��.��/nb����6��=��[������':D!������As�vmGc�����u:�=�� �~4�����NGx��}z�����M����Q0�����$y^B�z�x������V�SNYo��m��xG�'�?�������]m�a�H��"#,��lw��OC`������<*�C����Rg[�0T �!��[$?����x���:T@�Yz�i^>�>�>%g ��t�TE��G`e��S�D�����E��g���pIC���Pq�axOI �	Ae�P�`������`>w%��O���������-inB�qn�9�A@��'��Nk:@�mW|<�-kh�0+)	W�p� p�JT�|��#��kD�{f�#x�6�"���%3`6u�L���2�r������	X��?�%�]�sV���q���#�����:�-:��A����Ma'�t�<��84�6A��s$�����.�C���K GVr2".��)�
��h}��U�r�C�q��AA��B�yjt_"�4:�A��,����quy��>���#��cR��x�`���!:�9AS�zf,���:=3��W`U}8�<���Ar�z�:��A��=_!p�H�/�� ��#�^s{F���YEh�X����h:fnl��4Z+���"��#�5���w2�.M�wW�������xph=������$x^?�zg���%|>�����Z}��p&z��JB�����7����^�uY5��Q���I�����@bJ��j����C[U��W��m���v9�����`�/8[� ���#bB����I]mi�%�e���?,��G�E�Q��K#Ul>'�"�����7��lk�j�">��
Z����������Y�����MC���Mk������|���#b��R�j�p��
 �@_�\���W@C]��p.kO�#6��e]<��[s�N��#�Q�l���s�0X�����:%#-*4���yo��hP?/^"��::H�$�k
��Q.1J��K�/F��:������Q���������=��=�>]����[��d3c�z��W�~���1�����g�
����Q-<v�@���(/����z;�|��@G��?;�,��������N�S����cg��1�d�?�o���'���{w����![n)��W�A�6���J�v�0�s'�~4��*A�+��H!y�i|����r� ������	�_
��hTM���t�N����3�������K>Pu��2�J
�a�
m��#����Y4�u���{n_�����^�0���@L����~�h�a�D��K1�Sw�r�'4��,����{M.(�I�A���[�ANZc[���t!������>t4z��'��G6m	g���JH 0B�+@D&|����n��>7�ABL�k�~����F��;N9���;�M��������Yp2v���W?`@���S0��hT/W���rg+�69z�p1��V��`[�-���wN�*��D��TP1��T���P9e�}��8�v�N�b]����`���5���/�/��q��
�i9�C
,0����
���0x�Pl�F ��^��������N�hg��\f\�q��T'��+������E%�:���&��N
���PZ�r����L���
�9��5n
hWt������;����p���-Pw�\��='����"C��x�ltm��a���B�|�{������p����5k^��	-+;RX�����p=�����B���pyD[V����&��s=�hP)c	r���7�n�
�
*xw�j�N��H���)
�n�����`�������C�q%MS�7��������&"�=%�5��z������;�N�V����),	)�<�6-�������0��"�C�|UD��K E��+�BDj|����Fe�,0��&-�@JJ����?q�j;{w�B��c���oI�B�����M@0�A�N������V�'t�,�&@A��1������\��!�;��u���zq\E��#`J'�
"�����6c��4����5����|�>���AE�N���J=�K_���F������+o�s�HH��B�&^
�InC0�)�
L���u<�$�Aw�-������*���������^AA�,h�����F�K����\�`oGcx���~*�)80%� L�J���g�R^S������utHY�NQ�`
��~es��7���a�~gt%U�`R~�G�@M�~V�+(�
LMb��0���a��A
5�EE,�S���2d�NR�`���PF�
��"��C�}�3����N�D���Q<G4�4���IW����v�TW�q#��*�h�e�3L kc)C-4���AM���t�P(6�G�W�p���i�K�:�����B�|��m��7�p�>$I%�SR�VB��{Hh)#v�e�����pR$]{qU�V2F<)H0����%��9�#>�bC���Ph`G���4��6��U�\)2�>���}9�W����Sm������<��r�Y���J K��j��b���W���_S�����
�[��)�,4��k?��O9�`�r����?
&A����;�)h����6"��q�#�5KRa��K"^��q�4(����r� S7x�g!
����y�0��#��]�R�P1����lj��-�}`������� H�aS��W���e��&�p4��a�����������	r��_�
�_��� ���:���,���qR�f?h��6�_�f��P)g�;a�{�3���?������5N�PY���J96'V��;�px�v��<���_��5�c��4'��@SnxEJ?�Fl�J
����c3h(��:):���GS[���)�>��^�ZXsy3?<���� ���OT��4�sb)�����&br��\���eU<x��A�-�Wr���,��I��0i�XUG��!Mn;~I3�nO��q��&�6���F�����/����
�����km�������7��d��!�^��f���Z�gg����'�w�i�>�?��h�N`���/?���^!�����r�
��	�����]��8Rw`e&��&%����m�?�/*����W��I�fh���6WJ`y|�:����!|��`VvO�(|a���iS��3h7�����	�M���<���?����R�yI:����Wd(7����$��'\�B���s@AZ]��9�!6`j�Zv5�u\��
������^+�[�����^w��>6�w<"	�(7��NqKB�I[�������m^B5�\"�h`��Ag%�T2�?�CH)�b��)�i����
�2�\3\����5*��	1i�z�&^M�m���v�M�(W�g�m @74��D%:@dQ��N�����m����570��g�YX�f0llj�����n@��!C�@�j�<�&O������P�z[t#p���W}�H@E����������5\����� F���U	j'����^�$|$xa4)0L�e��8<C���9����a��hc�-�Hq��@���8�m���� k�	�~�H�C��'��P=�����Vq���E1:��7�&BHy��o]No��#/@�^������Wt���G�{(�\����;�	J�<��w1(��%��S�&�������y���
��Q�R���z�z��oIZ�	;�������4W�:�1��w�d��29����|�Pa�^���l��F�H�F1�o@JC�`7�=���Vy)�)(Q�\��z�nd���{,�h>��j>�GN����0:��?�V�������X��+D���|9����AU�ZP����������u!E�p1��Acx9�[V�rCX�`H�F��'����v���|`�:�_>���4]�k��:g�����h�W\�tT���<O��������4�wb3GR������~�&~�u��xzi,\"*��6�a3��40X�ZW���s���C����������=88�+���c�X�+�]s
\NH����}80�)�����5t(�s����V�#\���]a�1'nn@�6�B@x"6����nv8v��B�iLM�[~+'/Y�K����;����	 7�����n�{sX�����Fn);�	�����uy�����K@�%�6G����\�A��y�Mg_	u���cq��.R�IG�Z}���G�	���a%�r�:xv:7���~�����mq��n����y	��^���=a�o�"������c)0T3q���
6���S��j�p����	?��i�7r��"~�|
���
"�!���{����x�GO_")9�&`��hi������u;1id?~���sK����H��D�7,��%g����w�PP���T�!/O$�'��mE�C\J��a�iJ3�/���t�N�������l�}]�6���h��E��+��D'ER3�L��z/A{:E�[����F�?|	)3H�Y i�����������AI�U��
�d�������x������
�^�K�I�� �&����n����hP�1�_���m;��?���E�/@���������5�������)�8���V��G�aV��8�����*W.���-������@C��5 O���S��4�����	����E��P��T�b���"���� K�Dj�p
��[n@R� �
��^����h`�BO���%s���X�:w������&�?*4(��F#+�R���C��ms@���\H0a���L�^^DdbzU����!Y�4��	�a)Htu����1��@n/Sz`�@/yf/��4'���� ��pm6��k9��[�@�$�����y����W^]���1��H*_���_
���������`�[�w���TM-aI

�%�a�&�#���}�qw��A�A�d�3)/)
���l�Y\�M���������I"JS;�U��JY3�����}x9���E�����hp���[t������<Ido�	1��v��X9�&��}D�)4���_����b�������H���X`�	�.��B��}�q6�M����9���z�,m��
4v
Ytz+�)Ik���;�P{$��%����`�p0H���I&Yl40�?
�z��H��J.�������40�(��a^����
��B����)�m0����T0w,�������t��n�C�{i�t$Wo�A�|��t�TnD�+|Q�n<{rM[����`c��_�a�B=����hH!������v�o��E	4h\`M
w�'bAL�`^=)� ��:���l��p�#Q����w

���ip2�X���8l E�a��0�v>��iZ�j�=*��%<L�jL���3��d��#j���o��q���T�]��z
$�������5�/a����	��!�+4������>p���ic]_���8��A��\]���KI�|����A�A4�:h[A+�}�62�F���(0���`u���rS�Ee3�����h����r7���
hH������ �������F�	H!#(��X�\B�>��n�H����`�����sj��� j1�;#j�q�Oj����s���]C���qy$��.��{�<��hPj[
�wI��{]$^y
	������/��B)Ad}�%�'P"U�D������b!�`F`Ddl�!z%m���x�
r���i;~�����T"�����=4�� ��#g��AW�$r��[��j����{�|��

�0j�����S	T�wg���Ar�0�N
����Mz"��������qjH���r����B�����	��
v����s.��)@0�,0%�9�H�,L����[��xl���Y:E�����T���~�&�����@�-���P��

�����}�!h���NiT�m��\f8����kF#=.����$�������h����BC��D��A��\����`�skQ����T������j��x��4���[90�����p��2����y�����)4��pmW�DG���up{�}ju��M*P���u�se�	�G`A��N�������diV���h`�B,��LQa����vt>����7�p�4�m?��AWR�`�f��H?��?��N���������b���h��+����/� Cp�J%mD\���A���4�[�s�X���j��<w!!�G��8`�������F9��w���1�&Wh����G

it��LGK:Y��+4D��*L��+A����4�18��k@hx��")&��v17l�������+����B�OTXH�������I�1p���Pv��������D�
�����,>�B�e1�w���<>SN
���z�}n#�Xy�w������A����[�������h9��+48�S���(��0����\�}@?$��+e0;w9�^���o��K�k��
��I�"��0T��:��U�
I~9����$�a�&Ec�u7[��;��>*�Y,�z���+K������ L��+W
�������q?���������`�n���Sh�U�y����%,^p	S�7��y�0cVK����i@��x�[��9<:����h��?/G���Z�&�
h�0�#wiH��K�Up;9%h0�

)$SOc!�k����2w,��B�Q:�%�4h����}/�3�*R<���l�4,n�E�!	����A��1�_��E�L���@��}j--�:{7g

��������IMfw;���q�8a��� 6<&%.r�E}�gR�&�h���!�v����H|���k�s���sW!�6�3H	A�M�TP��J}q�3��J;O�cP'h5k���;'�XE\:
��yY6����\B0�5A���
i!8h��Z�4��Y���+ga�l3�-��nrp;w=���q����D���
�/sO6w?u��f ��Y���#��&�+9@���W/�������)��@�m�l=��]��V��7�i���#��SQ��3>#�c&����q����hP�'�
zfRBQ��
<�4-h0f

������w��g���������*����4���������<s�:sC!I}��7w��D��� IDAT�Sh�7wv/�.+N���#���0u�NC���yR�\Sn@C���}�;W��(�X�p��5��f4@�����
��
��y�-����

cH�a�)��c7>�

�.��Cy-$�fru������2����0�"����\	��"r�GsG���Da�������aF�8���aD �R���d��BC#�|t���p��q�n0���BCu��(�����[���H��[�r����r�9I.s�
������E��
,j�!-��5@hw���
r�[#�6�b����s�/�~�m
��P������h`�0+6��n$�����8\�~�Q1=��wn X�6����
���E���#�������%�8T��Q�/=�q��+�a��S��`������n�<�dW����
C}�X������iR�M��e��O��B�����~�\�(B����
�jz��j4?��J�5;I�r1I]n��s[���joT�n�����
R.�w�C=�#��CW�����F"i�	�6v!I�$d�z�w��n�h
�A�d��qu�-#�����H��	�����X���I�v4��#�5��xu%Ti�:���9v"I��P�����A�aX�����<�$4��n�B'�cT�V���wnr��-).0W,�hh�X�������h�R�+?���c�
��\~
40haA�^��H�'�I�a9X>
+��T�_8��!Z�M���}�Jy��$c��X��/6^9�y�{b���`j�]f�r�{��-g��G���qog�����b��jr��i�����;�M�3�aU�U.P'�������
��ED)+������X7�>�������B�*��a�M�7���>��x�[�����1��������Emr?z���8�~5�kb��yQd/�1�A��
��M�[\E��H���ko��O�[,i����H�
]����xk#O��������[_O�X���I�`?������@u���D
rj��@��c�Q��<���3�����A�d�����
��H&���e���n���5�5�'_������-��p�j��J�
=`?h
dU5��L<�0�{��h�>�\�/�v�r����c-�o6�k���f��!��s��_�g;�#��s�[��[���a[��i�H/w�=�I��)4X�5r��Nd���MS��A���Hi�)]�{pr�r�@!Lq�4p�o�~@j���."��&S\�%���n�a�a&�#.�5�@lE�Q�p{mO������
��U��� r?�|o����@C<�k�qRH�P����A��+����Z�����$��{�����B��um��C�%���$�""r�yj������K>�=_�oy���v%[��
�����5�6��{�V�J.%��|i�V��F�-���D'���=r`
Z���GT_
���8sr!:��
2���S_�hxH��.D,�����m�T$E
��`U�6ww���T7�
�(4���	5I��~I!i���NA���f|��
|C~����W��[_O(�"�}l:��Jc�m�������\�@�\4L$ui��S���gI��]tZ���������$aIu�A���q�����h`.�ud��2���r�����7h��Ee�\	2`*5��&�����{	�`�
�H����� {V��Ee���XKo���@�(M���I���

�>FT�"�A��L���f�S�;B�G|j�)�kN�sSO�~t�'�XD�S�}���2W����%��Q��|B�c)�����H�r"��7���
�q�?r��f�	����Y����D������WF��((�bw\��:|"ud�:��-�"��V�)no�F�-��r���xN�����������?����)�_�R��H$p�[���������hHY!�T!�HqA��X�\xR&:JDC��d��I-�2��.��*w�����%?�i�t*Q
*�p��Wo�2��w�i�D
���*BRG)����GLQ��T�;���P���5a4+�DY��g��?)��r�>�i�o.-�^�Mw$��q�����F��"W?�[��k��I�	I!�*�������=�����W[���[�q��],�7�����y4�$_���G�!��Q��!5�\Y8�}�0��<��
����8�|_B���Y��4��g��;AH)(��S��D����S�` S�`n%�h�K���8��B��iE��+b�� ����� ���~�z���FR7R���Mn+���'��q�!=!�C#��#����`.1���7{��=W�|��k����6�r���K�
h�c]�jw��B�+�9�@����i�$���
0 ��7{f@�������RJ`����b�^�hf���S�E�2�������5�D���N!Ss`��6�8�����n�����]�eB� �3���:S�]�����\��������J]U��3�C�K���}<sO�@�Nc^R�q���'�y�v����i�%7q4p�Ij_OJ[������5���I}S��y��f
zm��U��o�{/y�]8�����lu���h�9
���]���Pyu���-�{���]W����s7�*��D^��U�RBmJ�&;Sq�h`0���6�V��mM"��JB���
Li"#��&�
�f�%�T`6����|�G�6����fye��hq����{`����k�s�-Hk��l�#�7����J"�@4������X?��%kM$����]$���ftM��2���2�������`���
��a	)�OOn���}�:F�>![�#���N��L	 [4����:��L� o�D�
��M��w��m^��FFL*4�%?L����Xk�~4tQ"�i����1��D��A��<���R[#&]C
*��jV6�h��d�t�$�!�Jo���j `G<���#���$������������B�|��z�G���
��~}@��6�=���l����5�.4���\���W�6� PA�/%�����1��Q�������������0U���g1a��_�=�M�r��9{����s3��G���>.^����a��?�+��	���h"����-��z� %�B��S��K.�����y-�<�>�����������xv� >����mRP|�v5$�u������6:�~K!�oAk�C� k���N|�}��uM��.>�����o)]E��}���j@�P�+.�zG!��krSQ����&���do;��:��X07)���;�4)/�}���kN..B��A���'�}Uf����4��=��9T������P�s��l`��N<�Xv��<zH&E�~�40�2�z�&5���w`U%m���������������v���������vw7�b*��� ��|��]Xt�{������p��y��3���r|?w����s)��O����C�
`�9.�"Bjh0�(����X`� �\��h`����WT����Y�P~�,�,��0����������2��O�g����~��G������.���P��:���#��H'w�'�����j6�9m$�
�`
z�k���(cg?�##&
�m:��l�Y�b��@�&��6�Gc. �u
������hP�6G�t���	|�`��@���6j������po�<��������To1���A��|���������Q�
)���5��x��\��F�~�wj��.��>)9�l\H.)EjACV�D8P1���[;�"��
z/&%/����G7�s���T�:������Zt��
��	��K���z�����w���(�a\���ak@�29,����T�z4���u����<~?�c)�oHI�oxh�O��K@���6�ED4���I4?aiv^zK�����z����?�]�cV�Z�N��_3�c��p���vu-x��� �������1,Q�����<�z�8[�
<}���)�l���i
&hH�5���V������C.�����&/�
����*��tpc@�9x���O�k���	���k��cX����RA@��?.h7��)>��+oo�
,������>��~|Mma+)���@�-�Vb����Z�=bS�����(�/C~@�J���<���	;w��Dz��tF��d�;e���bd��Q���|��$
@�w4����-�.��E�6p7=:�����P���*X���/�����������/+7c��!��y���P�������.\��(4<"E���t��6zEa	�	���#	]l�w=)}����K���


�<��W\��8�h(N>,�4@keh(�m�4����%�[�!]Q@��s�!����������,����q9Q�r������0��{����Y���e��ty�8�~jtB���``��.�&7%�Q���U�P�����q9�5�3�A^M��E.1T�ZI���@�D����9��TS�N�28���o�"�����.��y]NH=s��(��$��y�u9Q��h(�:�v�y�4�l���AL��)U0%����/i\KI�[y4H#���Q�P�<�R����oU����oU/i�+� ���e^y]N|M=�I�1��8l���#� ��%�PT�_
E�/���
���4�4�f]J������*��|�J'������4�ly	@�w40w
5��T���K���t�6�dW��$��� N��=��8����4������U������L:��nZ�������,�e;`�L8����~��@�6��s�t�5Q��,�`�
JcLn2r�4|�3,@��s�#""��'�u��O�}?W"yM�R���;{����K�AkI'�4H��ys���m*
�4���4O����S%m�2S'?���� ���S��� =�Jh�=|��#H)�N�h�z�<A��h ������#�}�!����~Z��v��XT�cGqr��M�
��W'�
E�@�������4�T�R�����P��.���4(j��f���vC	�^o��`%���h���;�4H����&
��RPPLMMI���:d(�����6{rr2�3����$�'X�,X@��]�� (4��A�A�gF���,���dh�+	@�4��Y�������%���p�dh(�/u��������PZ���Z

_k����g��I%K

_c��N+
���4H����&
���4h��t�Sq��?u;���/[@���+
� 
�=�� ����-
�[I�A�y��Fh(��,
�k��X�4H��@�t�)�Vr����ma9@C��]J����(
�XI�8� ���S�!��B��� �����`���4��i���4@�4H�X	@�d�'�4@CQ�Dp9!����PTK��/
�{���t�]K���h��=��J��Pr�-,gh(}�@C��\��A+�G����b
@��-)(4

�z�
�G���C�N�����F�B��K4�f��/��W]�U�
���*����&����@ff&���`ff&����\��l
���������d+�!��BK���CC���ee&"%%F��������000(��29�![!���v���

�2Ww�T9(gd�X�RSS�d�tuuK����X^IP,���m�%y]���B��zwIbbb���eeeI����)���.�)|���kn@A����Y���+�s����j�����/��M�8��0q�R��d��f������Q�Tom���d{/������n�z��������{�nM�&�V������7���=
j��J!H���Je19�+��$��z������&��4��j�S�o����#�����f���+��fi
��+Y�}Q;[E�(r�(vn�GL���"$��Udi�o)J�HB��E]Cq�/�����5��T�D�D�#93�_y��x� M�	_m�rP�T�����A�����DJ��B�94���M������Sb��U�#Yn��1	HaYb/�2����wv+d��>��J����MV�;k{�xN��la<W6���~��r�&��do�B���0����.��d���0��s�=������xNV����}���4|�'](����4|?�MX���,/&�k��jYVzY�0	@C���++�]��7a<'{��,�wa<'{�]������
se��.N=d�����?%�F��7Ym�� 
���"KA�����
Y]��{���B�Yz�
�*X@l���G�������#f��lJJ
��R��
��\���u39nY<�{��!��RT$9w
�j������Hh�d�K+������wv��{9==***�u��L9������SE�r�V��Yn�������^��Y��d���6%�����wY��+�j{g�]V�7a<���s%=�(���j�%9�(���$OY����\���I�&K2�4����^���MV�s�l�%�\�D����

%q'�<����[,��w�I�O<�'S b�����k*���YNV�7�D�l�p�����uY=�!��d�����w���r�&��dO�_���,�o�xNX�����+Y����\��X/+O�������h��PV���Y@��[*L��	���Z�SSa) �����\d��@�l.����#
�	�����_�A6a<'������j)���^�&��a<'{�]���xNxJw<'
��	9��
R������W["E�!*���O�$�����F�����l S��8D�6�7rd%u�)�������CGG�������7b�7R����������~�rrr�^���2������b�K�����b�-n"&_����jq�(3��2�`�,v}�����Thjj�����w��!e����{Q����d^,-���2E��>!!��QRR*�u,n��
��������eQ����,�t_�o�]��,�4�{ZT�<nY	�C�����HH�d�h���H/#��������'������2�������3���d�+��n�h�
i���>(f�=%��:�f�&MC(�� 9#��Y���^#Z�q"w��������!����JP��=+���Kv]C������������������i�o��]�<L�S�T����U�r�M4����Y��s��X.���F�Z�z����<%���X+A^��B��1�GV	@�4���%!X��,P�����u���)u��\Lm�����`K�>�F��D�����������������J�m\�E��n�<���e������3Ko�C�����2�=��������O�,J���r�N�@�����a��=�"-��l��^���8�9'nt!^)Z��NDW��K�k�X�P�`��_�"�;����=��o���&�����^�">D���zU�&�!po���P	@���"����[���4
l�M���L�|��iJ��j�,�AId]�y���Yn�J���
|�kK���o���al�����FV2�G�:U��� 3�[Z:�M��CK��2_��Uq7�`���.`������'yE9�p����M����K*{��+
�b��S!	

�ae����������BC�Ph�����@C���DJ�	@C���8�@Cq�&����ArK
@C�6���mT�1��4���������4��m�A<�
@�xv�K$��8)��s+	@�8�F�8� ��J;����)4�����<����;�a��p�Y�Kt��v�O�Y�n�N�!ip�y�<�����Nm��V���Y�{�7\a����e�_���,\��V�x�~��aW�J���e�����lh���A�������^��a	z��^���
4�y\���6�R��������]_���blW,���F-'@Q���sB..�Y�y����D�4�X �d0�3�*:�{i)40[���r�
Hsy�������L��pd'�C���8�%�S�@���%�����^P�������������� ���]N�9[qs�"$F�N�t��WM���2rI
���� IDAT�� !9������q����rg��U�K�&o���
t���fo��#]%�bW�+�������\�mri
F�Vh�z�_���a��q]�S��NH.�wJ�.'�s����
��g�G�G/��� !!�X��H�@C����D.�T����}����Th���3����]��b��������]���u��f
\�C@�dj\������K|]9	��7��@��}p���b�W�	Kh0";�t���Ph�����]����p����d�2��o4�q�x��������__G�_�D���#Kh��:��oXEl�HS����:z9U�opt��q���nlX�;��,V��.V�@������iLm�G��gP��6f�L��~�I�&'�4��h����������������*)m�!#<I�^B��Y���h�XT>�>�������U����=���&������V��$��&Q=��,M��\[���/2:$[���Du���5N���wD�#�����\������6?�����jJT�B"Kh���F���P05�9{2�����	'/C��|��L%J�9��c�kkA���m����7�����-I+#m�Agv=�my	�5-9J2��
&���\1�]%�_��>�:� n�S��Z�
��IE�� ���&���A�Xp@��NPh��XDA�APh(���'��Rh����X0C�(�b�.�cX�n��[��`H�.E^Cq���� ��#++����/dddb���HJJ��((���{����Nm�Y_!�`fh�~��4@CY����������qr�jh(��zy��NE���o4��EJ�t{���P�@��i
�D����UZ@Cf`<�>�A���L
���"��C��W��@��}m�W����vH��F���i�����%MX�@��N�������z�7Z�����R<xEO��[�����$5���[�UG�r�hn���.��	4t�<�����E%e��[7M��9�
4,����sm�24T33A
s3|�V&�Ee��{N�6|k��M�����������t���y�)9��4��N#���`j`����FFv]��N�T�{�}-`Q���"������1�j_(��/�,M�aX��x�������*�����_z��������h��b(^�;��	f*#@C���P�h����o4d�g �����O�(�4��A���S �t��9�����y-�b�5�&� m�!��#(�X!3"��
�m1�A�_�b�����T�%y���1�<�����h���b~�g�mWi
��4P��&����4�}�J,�4@C�5�<��f�^���gw��E���b���v�tu��P��������0i� ���`��BSC�����{:8w�TUT��E#�<pI�)��O��!�8I�#��F�������My����j����n->u�3���4���Fzz:�4�S6��X@���j8��yy�<��}_i������Y<}uu���=������3��/U11��>}��;33aaa033+���Zh(�@����0h,:q�>��i�6=�E�p�8�����C��C��v�^�647*4m~@�m��h�m"=��8x�L+�I�ax��6��\[�c�bT�����+�U�z��gfu}c~p�*jhW��+������`���*�8��&��Z�����hj�������L�8�������������~�':i���.,��y#|�����kG���-]��������j
U���
_�T�����4�gT�^D��x$��������0�H�v0�1��v�u�C�������
�C��`d$� ��:�2��7�y
����WT�	-x'��"����a�n�tL~s2����3i?���p��8����`M;'�Q9����wEhUi�������	2��`���/	aWVB^Ui�`��7��qg;tj�Iy�4����N'���M�:)�|��	E-C6��4.�����6FP������?4z�A�P��#���nt����r;inqP��
9U�>��4n~@C=�ig|�!��B5C(9�"y���U������H"���!�(��+�����=rH=�	9c:-�@6�eO��<�.��������rK+��E�g$�My8�i�O	\�AN[�>1P�f�����9y9(������l:9�T��5��z&�Uh�ph�z�E����?��� *��n��6���E�������LRDX9	��uC��������T\Y7
z�l�d���k���mx��Z�Z5J��+��3��*-z�J�'|^B�	��@T��;����~�N������e�L$�E���5�3
F����!\������vi/��?�4�^�a`i��G�!��38
��r6�8f���yP�M�v�V@^A^�����G������vE�2�U�D�3��'(�jv�w�s�"��?{q~����u/��$	���q �Th���sn.�4�}ms<xuQ�A����9�#%w���P�CG���������)��1z�=�������i�
�u���:A?#95��-���D����-`
k���^p��r�]�fSx���B��aT�����M*o��	�2���MDX�?,L�`��<���+8����Q���C�+0���"##��A^N1	a8uc�,��]��������a�������@�x���
c���vj
�;�����n�N�:z�w�?
�:�����������[a�_��������x�����[�#�TvF\b(��K�x�n������t"8��"Z��������Zx1�+�<{O=.p;��������a�oMs��o!�7�t
V[�����>:F�~zo�}���{�K�z����`��}��S���)}H�x'y�k�
::F��j(�����Y����Ys�#8��V�����B[��_�_���}�1i�lX7��0m�.zAG��7�H�a]�8jjZ�ta+��_C��}�X����{��bm�����[a�_����Y���u�d�TU5`hh������)��a
T�3����}\���c;��i��'���g����p��j��)���Ks�.���m��p@���oa@C=;k���r

�Xu��F��!\=}���C,�����
oBOS?vl�_��G��5��Am$�:C*��g�=!v�X������������0ZoXv�&���BXB"������v6t����]��br��8��
!q��;�<B�P���m��p�$��5IZ6����k�ul6����[��CTL:����kw��k���Q�%^�:��UM������.n>��.�~���=vv�����g�p�.�����j�L��.�N9wo;��kn<�G�z�Oc�lFD����akU�+B�E����
�m�
�����S�Fg�ec�����;5�F6��~&<{}����u=87��:M�Nuz��B�z��X�K��T����q��#��q�)�U����M�D�h�\��P��G��AlBf������qvFt��S�N�����g6��F�;�I�n��$��S*���g��{}�L����v���6�����E���?��i8WhhLv���'�W1��(*(�C�����F��0_X�T�����|_���;T�������G�BC�J-�,
�'{�4�n����������[O�����3���b(1��o����%z�~�������M������B}�\�N�~�m��x�{��\�������}����>�Whi�q��������j�#�������f��(V��/hx�����#�����J���W�5���VM���8����)���C����\0��d@sA@���
�r��;W^���0l��1>�&`��gX��6/�/$[.�T:������s��.�����A�f&��{�
&Z�����������7!�JqZ�0��(�'_���>!Bc����+��E��P���g`v�xe���Sh����;�����t�0�3���w�Im��wnz�B��5i>��s/q�A�~�V��]/w��w���Aw�FP�5��� >%Kz���|C����y��0x�
l�#��;�?7��P~X5��v���-P~ps���D����8�6��S	8|�����	�����(~�O�FU�[�S|���%nuP�BC��G$\&�"����5���&"7���>t;s����Y4>��~z����I�in�9%E������H���M*���lS��m{����I|N�;�#��^�

I���di�Z�J��� �Shuh�����De��AwhG(�"f�Ed��� ����BC�K*���
x�
�����bW��A~�+h�mn�u�S�������LJ���=�1&�]���-[���EEb�c��o��0������N��"���Si�g��������FM�����n�p��{Lo�l���2�B���f-�BCJ�C*
7�|8���-/Z����1�����T���~�v����u{����6�B�z��+44�`Ke)���[��uH0l�
����*$?4l+==z_gc��kH�9���0�!��G$������s�ki n�Q(��M�w��eb���1J�����#���>{
9zFY������H$\��lv����r;�<}��7�BAkP]Z#��c��������	�s�#��e���D�
����a/3���Z};A��	G/����S�hX�+4�y���
�:�x���x�Z;A����o!#<����������c���r������D�����C\��x
�~����z*�
KB��'`�
fH:�9uE���M���2�������|�w;#�#�tO�
i/��9���t����^�
��z�]����N�"�'�+4�ox�
=�6Th�U��5�@��xJ�k5gk���Dk������N���d�(�����uUx�q+Ej
����}ME,�k���k/#q�Iv�X��iX1}�L���������w��J{�-q�~(Bb
_/��W~@��p[���X��b@����d�{�j#q��,��b�|r�8��d�"/S�
��E�|�Y�Sp}���V���BXb(��t���1������m:�A�����f/��(��|���������kwiblD�LZh�f���'F���{�bx��8G�E�UP�1����/?����f,�����)4tj��	*5�'�����T4���(Z<`p�#��?����A���
zv��m<��0nX�wA�,��an(=E�>e�v��Q�
��$@C��?�����{BK�=�l,"�44��A]++l�{���q��s�Ih����P6���{������H	ID2
�y���W����������
���6?����y��}������7���)��-q����O�}a@���+0a'-�[ �6>����������k���
�V����-*�p��u�����Z�I���k�w�l���cF����o5�7j����r�tl�z�*�DBjN?�������s{�!����@CJR���C�t����J�Tp�t"*�V�����F��������LT��Z����jV��j$F������M���]�
'�*
���������0���.k��	�����	��y�TL+s@������
�
��EsE
}G00"����h�M��Gg���4����r��rB�r+$�\�-�jS��N��	�
�Azy9L;������f�y���"8�9��0�!��:hW�E
3��,4��Tq�����*2�hq����c����q��x<Y����nF�AsM��~Bv��D=�������M|��R���x���hPQ��?
�JW;%��j@�Di'�����)L;��!�{�a������<�q����%TG�@Vp"�i��&�Y�	|@�_ed��!�NT���
4��p��������z����h`@@����~����.8��P�p�����}
M�������cb�A�����ZF@h3�r=��&�c2�r��k"A
[9�`��?�r�����P���'s���/-�(���!���Q����86�/*�m-�,��E7N��q�.[$F����u��z2o�����9��kj�����1��A��������.->��e�Fp��*6���wN#G����:� G}�<b�?pxA�����o� ��S[8���\0'H4L�;O��1m�����U��xN��L�`X�e8w�O�������Q��t���7��y\�_�s�r��
�
��x��4�[
�&\jj"�x�G���k�i���S�D��3�K��\{���3��r���i�stm�����^,mm���+�
��.���7�{����a��zw��-�0����U�z�"��C�+*��Z&M�*44�3�o�=r?�zo�@r�1m�^�=8Um����2�����F�P�R[^��� d����
G�� �;4h�p%v����A(A_C�,�P��QE4��G\~E}�C�����#���??��b��a�>d?���!;KG�,~��~����Tt%����9n��l��]�9�������0�� �f9�m9k�!�;46M��f�Au*n(h���U����Q�Agx�}��/K��h�~�s8������M�����c+9�0b�X�l0�^�@����6���G���@�%���BuXXV�5����K�}����70G�Sx�~����
4p�����O��(��l�2]{LFh����1�q���H�����.b��N0!��G��8{�Ot�9�����M{A��=��o���
������xK*�&��0���\���M�sX�����M�V����0�)*���q���@[����v'����;��*���M,V����GN�m�������`��H�����`��c�dlD�����vj�D��h}�8�451�iC�?/��$@���������T@tl�6��4�a�#�������zN��� :y��
���+���_�g�=� �m���Co�!�tX���rg�m�S�D<�1�X~3G����$���/bH��p��������+���UF���xk3�w����-/?*6����[���������4�b@���������vo�cp��
�M�Yc���6��_�S��h�������J#os������N�Wq��@C��3��x������woxL �V�������H��9�o7���50���]���8�`�k��Q]������6F�l,������@�_�Dy���$����&�k�v`����Y��4,�����1�^��w4�:��w
��hs������m���3���8��9���z�e�*�9�%�����
��O����l<6��Eu��g!�T������4f D�B[�o�`v�Y�[�������T����;8�1��Jl�|��H�N�`.#��13&Z8��~�0��XJu�F�������+h��}Ut�Q�����8D��"$9
m��\�=�)���y]�xx���):T��~
����^Ec�y�mk��3�L�|}�� �6�/<	��n�(�zojp�a�EO��L_�?����}a�����D
�j[	�?����1t�mT��EEsm�������ic�����h�����?`��f��i��
�0��o���)�iyT�v���	���������)��,��+V^:I�����	��9�p��1�����I?�������9N>��nuDk�ILM�Y fu���;@e����
V�$� ��!�����6&H	��n-k�Y�o�e�Z3^+�"5<�t���3�����OQ����
Ag� ������k��U*h�=q*6��P���W	P4�E���0��/o��
e%�7����7��C3dD� ����4�@CFd,b�]��'2c�`����(���>o=�� g$=xM���Hr}	y
9��oK�+^�<:�C��`r_D�<��4uGsT���-�t������x��zh`u����j*_��s� �\b�_���E�<�5bA@�$��p
�oD�44�y��b����U���.yy_,� IDAT�������+���	�J����h0����|Js��R��{��9������E���8����j "1�C+n�@�*N;��5��������^�1��Q4��S-������u'#06�
?�l�?���P���1��AX��bt�F���F�m��.��R^����SqBa@C����#�h^�C:��!��s�d��X�O��92#c����������X �$�����K"�A�+�_��\9����"�b
G�?�5�5�MP�&�Sh<�`9�l������>���4�S������R�>Z}:!��=z�9��p��;�����?wCw�P:���k�Po����i����,rk�@c��w�ZR_�� �������9�:��X!��G�LsD�U�����v���JzP��E�����[q�_�A�t�rF���Y�Ak<�	�<�,�H:��E����
4GUG�f7R�H��I���=�\����?�#�?NT���d�1(������0�I*#����h#�_&�����8������^��8D���'?��i]8�ic�������/"�g��n����*����N���	N��`���������}�����<�t�����tLk����`�zw�jO������K��]�4��1
s-���@����q4�j�jt(n���Rm��8���k���� ���IDh����?���WH$"n ��w"��0s�p,_���#��[
�w^�`��UH�N��@���+�%*P�oG:Zt��NO0��5��-��X��������2��>��=�9Q��e���8NG���pu��5���dI�u:����t~������'?�E���<�_UMM����
��8����*
eh�"�l���!�c<�i�E�����@����^G��G:E�
*�6���h����C�PRV���t��r�k�����E=�����+Lh����z���cq��%�
��q�1x���2��d��>?`�A����*t��K0h�O���X�p����X�	�	�{^��u�)�K��}�����i�XC�U�BCuRg�3�I��x�&�A�P��IPA���D��A�iR>��u#yo-� xAt*���K������"2S�9���P+W��1���@���iEsZt��A�!�y�]_��w���pWj�|��@w(�����HRR�:�h�y>"�����#�h3@��)������'j�5|���r�!�6X���O��SM�@�F�,M����`-�����P���jP�D*��t� ���A!����C�j��e0���2��D�&vI�n�%�h`JYw�X�&�
�u���K����_�0
��*9!�C,�CI��\4���j������B���hR���(����H=�	������U8Wd��S	�1d�#x�N+���>+9�����
��&�`����^P*:VThP�������J��{��
�f������h4`:>�y������6��=������G �n4�?
�<����=~ �ER�P����`^�.�Z��
6*<<����B��s���X:�D@+��O���
��`l�Eg����/]�y�VB����a��xI

,��	J���2�/<?�f�js����&A
�qg��P��0%x��	L�!'�U��(Gue��t�R�`@C�5�\L�UB�BYd/:i�llQ�!��%��A;�p�Mn������\7?�����~���Nu���.�������������:�4	^b�L!���/����#��IW-�wH�;L��I)q�d���*N\_�t%��w����$l<2���)��?��=��n��Zo4���`0Ayr��N��||����u�r������d����w�����t�L��>�����qR�`@�}R����������W�`��py��`���Q
����O��+FzVh�`$?��	�������;�r�	o�
;Q�@����P��w=q����4S��F<�����q���\���`���������'�;���zG���o82�	
��MD�w�d�����������n�6ey1X�������X���v��K�I�����g7"**8��D��a_�.��r�e0S]`p^�
k��Z�f��\���@gR�b�U�w��-30c�^,�Ut���&=8������>0�b����C�e]�\�	Z������������rq;);�� �s�������gW1��������'��3Wq�:cW��������c ��="�
qBa@����tnM
JXC�Sl��P������}>�-R�����`.)1d�{�
9q'wj��~�t7�4�������Z����9w�\7*�^^C���c�����0'���H���]��0��Q(��o]�����?q��$@�%mh���>p� �>Q����:b76��KXPVRE�N���:��rb�z����@������99��	�x����Vy��������{�!�T&���dz���De<'pSC]�H1���w��������,`
���O�����N��@CN������*]�gO3n��8xn	�1	v-g����l��	v���������m���h`�3�������:h7��0����O�&�=L�Fv����M���G���$zG?�0C�&����@�w�0}�f,�#Z?c���[���&�&�����;<E}�1�S�c*�N�E@Cy�*x�v59H��hWDxA��q�X�y�a�F�����_�K�wsx���)WNT��W���}4���	L�!h`J�V���Sr�q�����^�=]w�G���Mjw'8������GXQ����o=5��I+4��%`��ebl�1���1���H�M��K��g�:�(�wX��������@�P��N��lk+=����Uft��Y��0�cU���+<����*��.x��@SZ8t�?t��~��J��6����#�
y�|�9��k�������M�Z
����p�3�s��:v���O�@��]�I��
��[al����FRO���_��=cg`��uNd�bTIla��\"�u9�{,���\��*�K��tzW7=^��6����������Z�d8v���
�r�4h;X�v|;$~����0u�%]
������������!�j��W��7�
9.'������7!+����U�0��Aqg���)�]�r!� �1���*�ZB��un�&P!�eRV`@WK �!��](�Zp "��C:��jgA�Q5���D���,0����~���
����"���IQ)36z��"z�)'�x��\�!�C)�=���&Tk�\��59���>��)6Dm9	���%�o
zjj��hl���+�P������X����x�����Lu��	h�!�����(n#�}"�!�Nn��z���?��5�����?}����������;F�k����!��K9��y���
#��@C%#c�
E5S3R�U��	p}�3����;��i�����]q��������T56� ������[a@��O$��$�����V���
��J6����BnY&`�J�����l����.](.)"(���@m�������#�w��X��6 H�q�Z��P#�!��]d|������
�{N�0i��>@ �B9dq�"��c�kk�z$���X�a���"w�q{Nr��t��bi�?�@�N��L�lF`0T�7�*�X]T[YA��
Rn~D��w\�!�4]���Z j��PLYS{F=��&R�u9���5w"�����P���>wK�=�QSo���P0Q�����>O �5��`|�+Ww�S�G�w42ISNGIG�a�W[DM��?����h�V��
t�8�2X����z|0��9�Zh��W�	�9�*Fn�@����a��mW�)
�+h|��c���.� ����Y�5�6o�F��a��)��|<HI�]�:W�g�P��
|�|p��a�k�����p�B�a�g�y7gbq��i�,N1����MV�	��;��s�&�x�S��D$�x���""2S�
��
��r�.���9�0n��lRfD6w�Kn".�!L)!'0�� �a��S��P����L�;/��U#XxJ��^�������<o�7��W�	������{t���T�P��eI����{���uXV���N��{I���P��)$����z���>�G�7�4�M��jhU|����3K�aW�p�4��:�<)�(��!b�V���Y�3��P�iox���
���b�F���Rj@��V=���)��}�>���}-4x��Uh`����I�U�O�/����*4��<�/��.+&�\���8����D
Sw����<��Q���c2�!v��qlS,:��C�d4[(�������Rg������J�E40��
t:0�
��D>�l����s'����&I��<?��y�_*4������kQ��jRh�F���; ��1�	>��D'
c��@�R� ����<$�$n�DI�379pB���yZ����A��q�C���c/�z�+4�IE3�m�}E����������N)=�&��d'�
u9����������i���4p�����CPECdF�����4��{�e�|:�#7���H��F���7������@.!2HQ����g�P$�A�\R�[��6�h��J�9JHa��'��m��E��L���a�g'�!+�NQ8���2����&�]9�#��_�
L5�
l#���A�r�����BC"<o� Ha<w!�a�:�n��)4\��:�G�����&s��''6�V����i.�:��
o��<
^w�H1���do������a�@FZJ.d�4���������u�\�2u����3q�,0���s{@��WX`�
\�a�Tt�S����}������v�����e�{���G����r������+��EN=%n|�@��U��t/��g����B
���A�"�����p��I��&"?�v�5�4����3��b�z���9�P��T�����bA��3���D�Lp��z�h�@&���
Mk���[��i��r5�w�Fh���'�&��f/�.a��&���(w������L9s�`S�6m(���=[���33�*BZF
��C^����2�90�����:�&�)~T\�����rS^����������
����� 0WIy�)_�x��N���`���q��*j�������*��:�6A��4R�(��$��F��g�0������Kh�D�����QDx f���?����,��q�]B������D�>��I�&X�R���������$����{�i\��_��BC���\H��kc�[T�#rsF����0�w&_?|�����#G�6C�k�t�:���I�3������>L���cJ.&����S�H�a*6����
;�����
�
=Hy���i����^�Bu�0�Y$�b��Gn��)�=u���M��	����B�~� ����!?���LT77�Mo?l����^���9���.RhA

L�����ZYb������,�Uh��������$@CR��vo7�'����m�E� ���}V�b�Zz���i�~�a����$����_(4�>>��L��#��B�URI�H��)L���Fm���u*k����K�C/����g9WF`j	��V�j�
#�����+����cp��w�.h��2���{-#e��hO��.����F�!0���`�-m�W"0���N�8�}H*9

L�b��}\�[
��F~U�g.�����u=�:���3��x~�����`�K�6�o4��p7;������>D

����������������kK�$�r�����'�
�uE��}���^Nd��)�{�!j#L��)A��k���0U�n��B�������4Fgu� '3�X���uZH��	�>i�p�g*y���$���4��d}��OIqm��=Xd
bI��V������c

�����B�
��M����E%:��7�p�o�����p��
�4���`|�n��~r�48���N&�I�0�	3v<��5��wc�=������������M���B�����~��'��
s�<���-0d�-��`����Q0W6����<VF�H�
yV�
SSZqCa@���m���U���/?�C#�*�@�*��p�4"H��_�f������k�)����8�7-CG'����3�w<������O��������}0v�zJ�
*�j��;��2��c�h^H��9@C�5#��Z��`��	�/<������M����jP�����D�
���=��`

	WA�M=��:��M���B�z�:��L?��'�0��}h�o@

������$�o@'��A�^�0�7�+R�|r� �HID�T!r���A��-��B����.
�W� �'��(R/�

�� #,�\<��BSMp��5�����%W0�z3�ZW���C�������#w7���

l�_�6����zC������hak�����O@���O� ����"��.���\�o8!h`�BORvXv�:�Kp<��t��)�_����a

�h�����z
��	)4��E.����"L�an0�
�
��i��N��h�
����=W�

I�.�}�,w7���

�������\8���T�:B�����@�!��V�t��kUEZ��#��;W	"���Y�8!hP�b���n��E*"TR�`Fc��*)5��H	"3"�+30��d��En�R^z��%)=�3�e����ZCo�p���Bm�\:XH��� ��(�����0�L�[?���up�������0�H����`�SnJ�!Z�L�������
Z�3f��H���'4�;�B�KR� X������BC���?��@�+\�a,A2��H�1����
����������Pkg�����$uM�
C�����:����#�1b�G.����������hQM�C�I���o#"N��*N�h�N'h���c��lR:�����p�!0�ns���xt��Y,I=��:�Y�p�-�eV���/�B%��x��4�x�;�T]U=����������qZ���#
�����jtt���-���L����O^B����`o�_��Er��W9!��_Vn��qC�I@APp(ztj��c����hxD����N>6��)4�����6�1�K\�M2Ht���4A�@A�h����:�I`=<��	�����C��D~��6���[� %�?��
�tt0�U+�'�Y@�?�|P!
��-h(�@C�1�I��6'I�c�(�O9��6��O'�S��C�yF���Y^�!��c��
T�+B�T����w[��x�m[#��h;��q���l�f���'�����2�$��{W�a���8wh)����$:i���9|<��`�P�B��v�P��N��?������.���A[����6����Rr����3�6Y82e9|B>���+�����1h��d�	����	�^���T0	�7�~X��8]����-�18�T��+��}(�2�4���x�\�����
����"�4�y�?�4���������x>M���"�4���"m�j���|�BQ@C���0`�jzu���	���V]``A-��*�����
eZ�d�
,0�!���yrt���y�i�U�NL�4zt1��Fr/M�J0"w��re���X����0�X����Z�%��(Zh����B�2�JZ�H��].D��
�sx]�|zTL*��C�\�nY��F$sq��I%��q�C�����u��-�#���i�{�
�;�@�F��-G�$���ND����h�N������nD@��.��n�xQmi@���F�%��A���6����
��b�E&���[�
,��~�2v2���8���M������^�#�Od�3P������O#Sf�|M��o��)����Nd�GE�p�� �9pW,9ZS�wEM��*4�������"� IDATPnk���a�S#%K-�����Uh`���	B`m�))0�9

����Jb)�|{�~����^[
������-���$���3�����DT�W6��bZ�YB������
��|��x�rj���B�	�v����#�6>Si���rTr��WW��$D��C}��}$���a��0p�y������"��X��4�W���*0BUS����s��p0��F���������6������L�jp%���X{=��w_��{��u����)I$����yu�����o�46h`��;4O�G�+0W!����Q����@��e����>saH�I$=���y��~��fP���[s7��"Bm&���K�����K������:����0�@��.���]R������q�6  ��6M8@�`��?��I���@�.��� ���T��L&%
0WC;-�u73���c�sX�Q�R�I��5&>}����+�q�������c*�k��
���yf&vX�U0l-j�+�nH"UvJ����9����?*����e�3���K������F�����:��?�$Qh���.8�*�!��o8<S���#�B���;�������E�-�^���h3��P�B���W9`��������:���5��m�lA���8(�&L���mz�7���������`�|�I���k��Y�~p���\��ZHJ�������2�)),�_�4��[X����g��3�3�a����=n%?g@P��[GP�f������`��������,�q��<>�O���������]��"���������&�z!��D������E�;44�j���w�U]���$$�����R�H�Rh�R�������*PZ������	N�������7��7���>}�d������y�;P�W�A���X�@�h��*���	����0�<���<�E��m�%���(L^�3�w�����m�����5J��+RJ)
�������iG!;=m�!,��@Cg*74-]R��~?z5������u,�����Q��sO���W^�E��?��F�����
���3��I�6@�P9(Q��|����{:��@C1*Su�b�x����������?�����	�A��~�&�g�����tT��, �=��:M�]@2���
B)A�w����N-F����S�%WhmlC@A@�y���oQ�\s���K$4����0�!0��XR����k��p��Ttk��T���B
��5�
e�$�B%B>T�(�^?����V�:QW��~���Z�;`5�e�]�^�V��
���.O�q- D(5�`�w��tk����%��j�I
"l����0���R��h^�7zx���V:�W���a�}Z�w:4��>!������!+�;<��f�"9����|y��D
��P�t#*��1�0F�����7��5�F�1B}��c	��x�qXJ���o�� ��;E" ��U������H��07���k�������Vh(Q��T�����c�7bX��	��1�I8�������g�=N`,U""�*�p|�2����e�q���X�7Yw��<���a54Mi)4\�q���	Py����4�>���Q����r����Y:�
UDz��^^�+U���,p��*>+�V������WsL�UM�q���z&
B}aj��2���@���*�`�~��1	�A��y� �:�g=��#��X��%���n14����H}��t���Ke�����a�������6�"$"
?n��i�j`!CY|�����j%��M������[t@�"%�����V�����J��at���yYs�ZW���w���p�w������cwn`�����K_-���pB�)!�OLc�
���_>���wc������O��M�B��A������a�j�	cV�Oq��4���-�L����>n~��
u����EQzL~����������
��:� �:L]��}���<��?���y�QqZ<\pv5J���SZ

!!�c��
�	�A
4��F���;Z($�V+�
��h �@C������O����?[��0t�w"���w���A�3|��l�G�F��2C,�hQ�M�\������27�u�V��y�[

Vx��a-� BP����Hw���i�o����>3���!�W�2<����_�`���l�(��d!��+��}KM��A���S��\w��r��k�/��b�������4)Q
K�A$4�,]&������C��
B��U�����
f�B`ab��p0���L�QMa|c����A)ys����N�W-[CE�!���C�hXB8A���e]"�P~�W�8���2_�wy����������)��"�Lh���o��C2D�?��!+#"��LY�8r!�7yJh������?f��B�K����G���PH0�����0���Hh��q7Z����Mu�TV
�
H�����x���KE�.��:qA���*J���
��8n��bX��mD"�B�y��2��M�@�����%�%t!R���0*Z1�������B���>�g`>��m�SEU����8+s�4�.�B��[���K7��!,D?����o��R��
����W��~�����l&R��_���{��M
�Y����%�e�*#���\��F�� ��f��k�J
�T�!%���� ��$��HCQ�x������g5�a'��;P)���2$�=04hR�4��p�1�h��L|x�2���(H�����f�������
f�k	�q����&k)
��M�y�b����0�Ox%
"�����!�c��M���{%���	!��+k������9��p�\�[Tx��r������0������M���2��'���_���T��Z����p��X�����hV�+��[M���U��6���=?B3\?���6�Y�4x�����+�z�}��2$��'�P���Y��g��g���J������(@C>D��*����&����G�V([�"89�]��s�17�b�����I�@�+�NZ�i�U1g�jn���I�TJ���.�B���>
����~�{{	%�Sr�!�<&l��e�)��Mv�T>�h��$��Y@�!#VL	hH�hH�B
��7����s��'�����m��Oh�l���?��Y]gz@CV��[�%
9��mHh��z�*+%�!����z4r�=9Q���L]Ff���*E����pO�Q�4��6@CW�k�%
9��F��K����o����L���&
9������R�J�����YQ�(#-�!���H9����HY���
�����J��!'2�&ZF(������~s1k����V>m��,�4��� 2�S:��!�#�1|�����N�)?���4dU�����^������������K
h��~�4�V���^��CF�N
h�hyy1������4dUy���CN�%U�!����I	h��&�r"��Nh�����)@CvY6k�U��|4d�mWJQ,��,�
��~)@�4(@����4d��K����Q�4d���>�f6 �����Gh9��4d����6���+��4���{��C�JK=�4d�Es�<h�y�+@C�l^�
]�
�!3;�
�=;>�4h�>�����*<��@�?[�0�]����6C���)��
�g[h���
�����^�
��L�
�����A�Q��5
����r�jhP���sJ}����4hm�\��
��
o?~
��k�#�+V46U�.�E�!S����4��y�����.(4d� P���.
�[%���e�!����5+@C��\����4d���4d�F���
���vK�<hx�B
�������
����r2�4(@CN�7�.���4d�l��I�A�~��!W^EZU�
Z�+�+@C�M���!�M�T���A���
��L��QN^�
9i���K���
��}�U��l�
��)�U
����4��
o[I45�]�
��+��V�h��1���X@k(@��&��
��
�����
��:��bh��T��P2e�l��
�j^��t,�
�hH�f
����r�
h�Ik�^]
��}�W�����4hf[h��NI�R��m�Ihx�J
������h��^9}�4(@CN�9�>�Z[ 5�A��r(Cll,�������C5��j�!o
99"ty�;�|��������I��z]�2g��~��m���w�}]��"""���]��7]��Y���M��������q�uy~S�s�055�+��i�.�w]�������o�<������we=��G��"*U��9=��S���G���i��(�[P���u?�j����{H��IY@��7T��47�Y�����l�+��E��]��������?Oj��TW�7]x�
p��~QUP��#�������\��Y�Re=g�5��G�(�s��|4\3����i
���R�b�����}�j���������������j�8�-��O)  ���011�O��������r,--����RHV�������j,
�1����^���.��J�����������p�sz�g����1/�o��^������[^���x�U���o�<�����MW��.����tu������������\v�?�����{v~CdG�)SW�7e=���s�����6+�{~{/�����������\fG��1������J��y�7����x)Wkcc���7�;(&3�\���"���W��x�;((��������1���]����hDFF�����]�]W�7]��<���xW;9���N-idg���n��+�9��~Q�s��������9]Z���xW�s�����ts=��G��zNti��5�,���E�X�$��`�U�V]���+�v��]�Mv�� ]�����dknH���GA��7]��z�...y���v������/bp������]Y�)!'rtb��)�9%�D�9�]�����n�o�xW��s��
9ae�����!��R��I�`�?�5kZ�, �d����Q���we\77�AT���9kZ���]Tu��E^��Y�b.+�9e=�53f�)E�����MY�����
�9�����2�sv�+@C�Y�)-�CH
h�����3�R=}����]7��oX�v���G���S��`:�;��'���6�(s�W5�&$��	'sss��W_d\�B�����/���������������8/��lmSLL���^F5��n��'F�����Qx�Sf�V�pJ���L�y����e���0���*:6C�K+SF��,oHX�d	��h��2��u�g�\F�q�����M��>�� T��f����74�J����4�����a9�/�v0�*8.���?�������a=�g�m~�������Cbq�=<z�~��:�i���4�C�[�2�������1x|=C�j:�e�p
3�.���r>D���wq[tu~Ki���2���
Gk��,������aBcr�C/,mq�,w�$�]��a�c���"�����M�t�Mk~�,R�����8���k���5�/P�����Y}�2[^n(�)@Cf���_'-���,����#C6�'��&�����U~��N(�lp�y�A9��������L�'3������o���%[�rm<
���u(�+P,��0q���z�s���m�"�E�@E�T����*�J��b/��G@X�t���u���e��x�+���d���R����xJ�P�������
��W�
F�,.5����l���9����=Rj�J�����LY/Cb�y��i���-�d����5��Wv��^����3j��*�������0G�XG)5�-0R����dw5y��6S��"�/��u�p)�6����R�hV���z�z;Rj�u�a�B�s�mw���x����4���
�+[73Ed(�4(@C�����AK�)�+P���3������
���QZ�X��bh��wR��}��V)@�fW�����
��#�U
����t�jh��;����
�s��!{������A3;e�*hH��
������B�A����k34���_|������kQ�VU��ZBNh����j��t������<6�m���gp��>")3��UT�\^������(^�U��[;�.Q4�����_>q��D�Fud?��X -(@C�
��
����������8~u���
�v�i�u����l=��V��^<����zm-�Z��8ve�V��8�G���q����S�;"R��$=�����~Ch��;u�t����{a�����q[�����3�6�{���g�tg����M�seg%�q�4�-,���xJ&�7h�U��/�Y�f0*TL�|)]�U

���C�q���������Z���,G��L��&����m����S�18sm<�����0`~[5@���uqV+4)��>
���K/�����c'�j���{a��3p�B�|���>������w��?���+2TV�LY
4� ��89�
�I�N����
�5`������������+V��Ey���C_�X�+�J�!��u��=���g��!K�j���Gd
��f��C��Z��o���e�<�1+��/� t�y�G����Vhpg���(��<Gf�)���L���EA(>��~��d�cs3Z�����I[�1���G'�6R�u2�.����dw_�h8w�,�lp��Y4��E
�ie��W���s����������h'�_��/��b���Z�����9b��S�*�f�&���l^�z�IKk������=?Z5>.�j���nE��F��r)D���XO�O�f�B���,A�p�����s���{-*,%���&����^������kZ3�<zQ�fcZ�X�
���'�~������6A9��a=0n����W/��c�Q���.�W��+�.�]�nc���0t��\�Nv

�����D�	�qw�E��k�N���c��1?[��_���c`�}�������Y���U

��=`cf�����S�rpsr��)]�
�6�[(@�vsx�Z?wJ�w!'��m��0BZ���K�T���v��^8v�"����%3
4�"#%D1a�`�����?`���q��c<���c�����Zq��[����v��vN��?kh�?�V�A���_�}#th0;O}��`����j��n�~x�u���h�y��@C�~kU/Nh���g	;�����l�>3�L�A�*�����G���y����6���C��u�?4�}n���'��h040F�����=_C�
�E�aC3��x�t��6�P�x1T/UK�����@C��30(Zq���4��� b�.�w��i;e%��}+�;uF����4���D��s����)e�`d�/�"x�����@������G_��9�
���`]�~'#������3i#���FJ��2�����J�a���0��l<��h04���O������Erh9����������`em�};3�?�3e5�`�A����^-���8�b�R�X'��_�t��+v�]���4T�s�F��\������8y(z��$���*�����	��mO�����43�O
��h4�;NL�6(@C�0�*���Ka� "��&���������?�
��<��Y�v���������
����2wU�����-[�f��T����8t�,lm�Q�\i�]��FF�����a�afj��g������h�}GNK��������������[�BpH�
�)�?nL\=���O�^�1�,VX�[�q�*���hT��;�I-��U��`o�g�_I���
je��J���4���D���A�n<����T���>�����w��������v���6��]{�����Pd��4mooo��d��Y~��
��w&��!'l�
0�+W�����7L�v����MI��Zu�fv
~���~@�N_���n]�c�*�z�8����R&w�=tl8���	���s�@����t���;8Z�l�&�������y�"���o?��!������-��W��s��hR�#8��"��m���k�����x�~ IDAT�v���q��.��p��_���Kl8�9Jn��%�B�����_�`T�������TQ�����i��zg�2X�+A]�{����0��������8����p|X��V��P��EE�#L�/����}va}q�qr:�8UE�*@�����y��I�-l$�%�t��V��ms�.*��sv&�����
DA{7�=��Vh^�Y��
�Q�������?h?+�~,�Q������>9;�E�jB��]��/}����W�L���ob���]��anb�>�q������l>C�\((�<�=""��g�R�����f��3 ���C������Sck<{}�__G�����7���{\t�����@�]�~�?����O�3N�����[�������������|����.�����2�m�C��k��;��0�������:���e7��#��vXw�����P]=
=S����p���D�����T��Q[�����������?�?6=�!d�j��q��\���bM��� �F��x�!}Xm��\�Z�������L��6�sK^V���
E&|\y�
C�mh������� �cs=Z�#��J��uhd���7�����:%>������k*����}Paz<^�����������f?�/�P��|�dtn:���p��f�^�}�O��?M%�[�S��L�-p�}���-��a�;�O���5��h
9��w������X�O��	��{����C(4�Z;#z���#?��ui2V>��.���'g��i)4�q+���Z���_���op�����1e�z|������+/���3z��������R�&z����
�����l5J9;ab�N��i������-wL��T
��I����=�BC�:�p��%�_�����'���=1o�!l�|,<Xg9�B�b�Z�����A���\�<g�Th��{g�<~
/�d����������+��6)-�!���N�oL�����%B������]�~�KVe���&�����l����n��T"0a|RC#Xt��X__D9�g4���������E<�'�Q�.]��Q7nP���e�I(!��h��`��1B�.�u��~
��]�w'����1�u��%�5�BC��{�.��U��F��L5�Q�7����+5�Au�b=�E���1 ���*��e�:I�����hS��|�Au�8��w���Q�����!�7�SQw�u�:��M����Y(4X~0a����uY��~������ilmi�pX��'�	��
z�f����e��R�!��A���-��0������0���j8��F^�"��X}Eu;S�y�!d�	�}g+���C��&MKp�!���<�����s#D�����T�����m`��!>�C�/:"xW(��`���kT=�����1�hh=3}�
C�.����S�~���	���0.���X�����}8�O8��$
��4I�*4���m��h+������*s��'�������yA@�>���N>[�@�o87D������?bU�r�1�C��(<_����o�9�6y<?V���BC�O,������@j
���r���%�F������^���s4B�E\���X���|���
�V��)����s][�7���r��t.�����>>[�2_�C�P��rn�������8������PT���1�]�?���
{
�u!H>7����SJ���w��pD��(�3�6
q�z�/fE
Q�Cy�/�����O�j2.���4x<�����?]�w���mC���V���gV��M��Q�t�S�����S�=8��P��#x
������k�8w� �V�1��D�q�7�\�O�>h?	���������|���>�M�qj������
�5���T��Uc�����4��_���P_(�d����`�g�v}K�������h��g3>����`���x���kc�_��{�#�k��7A\l<��|��%L�^1���� <})�,���������^���[�z��������E���7�\6�m;��zDp�H�"�7�K�G�	
�Z!0 ���z���k����
gO��6��j��5���xc���0�����!z��W/�P�y�}���g���m�����!���B��f���^��v�/���*JZ@�I�0*�w9S��]0�X�������7��c�F�����Y���CC�o8���9/S�����cD������B�*(7V��^�j���1��
�eA�a�[B'�}���{�}K(�7���]�+^����@f7��!:,6�
Q�����^�u��q@��,�$F*4����������4�GV(4�q+��;4��V�m=�bN���6N�?��#0�G���|�����4��NM0}�>t�S	��W��b�\�~�t;J:;`b�����`��s8v�_�i+9��X�C�[(4t�[�k��8p�.�aD���g�0�i��4D�)�&/���p�L�B(C�/��!T%

�z���c���
�y�=�D�B��k�	��r�(W��_���x�-��]`h���T8��M��	������	�f�F�z�:��)Wl8u��|?L��B����y���3v���9^���5{��9���������/0��Q'{k��K��p[i���U���>�nb������ehV�
�8�[#4�������V��4|��W(%���d+��3���7�Sh�0�>\�$���lj}���mqo�%��D��-�3#������h�r0�0����%�`de
Sx�����(��"�zT�5�8��VD��������@o\�}B�aw��h�x ��p?D�z��w_z�}���~����9]��H��}��HM��?,�:���84+S��:>y�����?�;�������y���q��~����u��B��i���l��T;�\
��C'��� ��Cv}�G8�3����g��b?h�FmII�a�����,A=pJ�&����^wG����(�������S��hX������U�m�@�#<*�������{V��O���"���Uc��h�.LM���pu�����S�j,���H�����<|�B�z�� ���]�[�t��X����=I���(h���iZ�L������0,X�#� h���=&���t���z8��
�Y(k�
a(�}��J��:�B���������azb��
��v�;��U��l���}�n�{��]�b��i����r"

���E���=X�;"��iX�:���i�	G��;���rc���kx�G���������;!�K/��i�ah�(�V?��
|v��G�����/��)���c�OY����gc}��e�R,���y����s��* d���L�
i�(h��@C�F�����U��Q��3'����h01�F�~s�y�0����)i��_�o������{�
lX�]�q�
w��q2�6brh���-�����)�w�A�:��1~H:�u����3����n>�+��G.������X��X�;�Y������������M���+P��&��0�"L��p���[��[8��!��tX �)�Z_:��#������T�X�����A�B�``��XF���A%�'�-�@C�<]���VI�b�X�g�l���C	MTE��-a#V,'����/���k:�oq������-��[8��<9���&����hXu�t����^nv
�x���9~���3����hO��nM�c��q���l=���6%�!y��6�&�k���Ix���m\C���#�
u���*D`����f�$�q�7����;A��W�m{�������	�[����g��{���qG��P�P�1��?X�w��������k��x�y&C}<{s�;�46.!4A��=�_�^��n�����V����u��e@j@C���0.J�_�"�8@l���es:J���<��
��,��D��StN �PI
���@���D+�}�������a�����M�!2��sD\<F'�|�#$q��S�H7�������P�)t�j�R*���������!��!:�<����d;<]�(�X��O��*��*B
AW#�s��h8�oE��l���gn��>&e�E��J�S��h�/��6������������/��m�d_�!^hQg0�����/aP�������|	*������:��c�C*����{���
&\�Y��~��8uu=t��-�[�:��#��]�����1��rx����p��^�o?��/����3�mLp�h��p��S�}�mm���O��7��]��M�����0�G�J�A���R�&f��'�W;	 �����'��o$O��b�}��<�����5$� ����7n�P��J��x������9�?������������y�
(���n����t�����+������C`�:���|1=��b��i���t��&���4g�Q����#���okG��NX�?��(O�o=�*Uq� �:�@\ �Md0�F��3��q ��"X����H��?:6���	���7�������`AD]�Bg�����?��U���T���K�����K`9p0�x0,A!�#��E�
"N������w��YK�,1E�����!�Cu�,����N�
!������~~��i���/�L	M�1����>������-�W/�t��,%��J�`H�"T���"/_�q�j�n$��c ��CiC�`�t�I���0��� ���m�y������7K�xM��'���0�Z�kVID��{��!l��q`,z�I�ylLj���F)
z�&���>�N��4T�����}�k�E=0l��:��sVS�"t�Y��(��N
h����e�^���Us�
��{�!PB'��_�x1������B����7���I<
�w��O����C[��j�uG+�vt�O)���A��L�B���t�l��v�$i4���,xU<Y�wHc3�8��'a�	�0-d��� ��2_���O0q4@�Om�>�O���z��c�l��K���������8X�6�9A��kQ��7��i�0f9E��� ��%.�����'"�<a.�U����c�a]�X�U
�����w�������6�����J|l���<!�[�|P����C���!���9R]�Jbp��}l+@���pT��nO�E��o���WonT�yV�S'i�cZ�E����s�[})3��B�,U8��>�������-��D�
pu,��P_B��\�{q=�K�wi4���v�^F�y8�!v��� ���$�P�\�������b�_�v�����;�~P6��Ky������\��Ga����l��UU�fx�rA�:}�m`���g`�{?i�]M�����u����Q�����?�c'�9�;7#0��"����(^�DB
'���V-"4�g�
�~�v�P@��68�;#'8c��|������nz>��+P�!�����g4��QN�Z(���P��[���{�@|��3��Wc�I��^cK	44ok
_���.�;�����Qb~K��������|%��
����E��/Q��1|}c�V�4Q�a�d�c(
?�h|�kQ|��3	m���3TF��	}�7��]
C5�����1A���f�Mi
V��\\��s8���6,��6P�;��������64D��0iP������T
Q��������k���/�R~�cP��9^]����n�	E��6&���ke(���!�\
pmYj���]}��}LT<�v���t�������S�N���yB^�J�%�y,B^���GV04I��KY4 ��w	8s����t���s
����k���obR�V���C�U��/����h�~ �0�� �l��.P���qM{V�[���C�#d��q
	#�A��5�F�Ih`��A2k�N���r��/do���6��\��1���S�i��o���<�C���b�i�1�����%����%	fl:}�@�%��-�_�F�$<�V>(Oxb �Q�'�����v_��O���.X��4��0�b<�\,�~_���*b�%wD�u�xt���'n?������h��w[���Q��� ��������I@$9�������TCI�q���P�@�+>�}�������q�p�6��2�?j�G�n���4���9�po>;�Z����h8�.���!�hx��:^_|��[F��|��_�7^FiB
"��n���x������%��i�p�:�X��x����7�D�O�����_nC���c��P��N���������L
h8��)�S�|��x�*����N����b;}mfF�hS�
�O^�55	��d�)%�!��&%J���+�����D����: ����������	|��;C{:�+H�!���m���
-`����RJ@��
��m�xN�����x������:����c���t �����hT�n��3�kjs�@C���P�PA�\���v���]�28H��H	Bh�R�4��W����VN0�t�Y<��U�O�������T���q�oM����4D��K�	������m~#�X��|~��8�a���Tg���� ����*@���$K.T��|4<!Iu��
����G�@�����0q�`	L3TAU����I�L|�-cZs����S!�����g�`,-�l�,ann�Z�*&�1$i�$�f��0rLH1��H�� JukV�Ji��e�|>:��g.\E,�����Ux��������@C��PD�����)���dgj)5�A������n�y�U�4�=��!o
����P�������t6;�UhJWh�
�����!�_�.n]�������OlY>\��Mn
������S��>=*���Y/N�g}�V�`��O�ah`����K��H��Br�O���z��*��PBi�_VB!!���$�G��.+�O�a�����<��F�;�D*��o�aFU'��}#yz�/����@Tb�
�������<O��s	
|&����/��I��������G+���<.��DEw��yz�����\�V��6
d;�Sq���zn|V�`�K��j���f���x��bb��������>���	6��.���O���� ���/�3T�@�{������L�����MQ��l}?�^&
�Q��
���k�i��'��B����+�Ou*�Ep�kw�%���o���5>�`H@07S�
���?���cJ�T�u$_I���+�yN����b���hX����'��H���K��0)]1��A��'�9��!><�
Z�2�����=7[2�^�2����P��{b������uX��BP�BoC���t�Ys�56}G��*��ez)%�A8�
����e��
F�Fo0�~�c�+_�'p(2	��p	�D8����I0���t>����	[������U�\�
�x�*!��H��q�B���F>�*��������
O<�<��	=ZNJ#1��b	�w�H����z
���F�;i��1}a���h������p�r2,E��m����=��P��C6��e%���{�Q�P�E�+be��~�i��ui
�t������;#��}�T����>]����<������	5�#7oK0A
��c;q���#	3�h��B^�t�f5K��������~/4�\R�a!�1���O~��� �����p��p�*),�w��N�-"A�bT&(��"D�<�3�G�$�7�C����SZ@�T�#^hf�R�|����?��������q�$`#�e4�S��N]D�����b@����>�q0&KG�i�f�e'���0m��CMD>�}���7y2�P�9��6�#�0�<������$ ��'����aD5��}{$� �P5y����i=�����Rb^��p�>!
�R}�Nb�CV.��G�<a���6�qT���F
�<�r�TR�y�4�vB�".���dv�g�	�X��_�S�p3F�� IDATS���7��y"�������F%K#��:�JH�"l�z��kO�O�S�����������WuCC�r��%�':�E��GP��+"������;"p��7����4�
�k>G�r���v�vT9N0.T*4��w!��.?:���7a��L��8��?����CN������kmzXqN"���@Oe_W!�
<�&m�r�rn�,c$��R@�Yt���&�����`$��P|�
�����&x���3 �`]��Gy p�����]!�Q} �Z���lT�r"h?�$�jG�TJ���N��_�����R
����*`<4�6�	����~(75!�H�~9`���x�:����v�&�>�����	�b% qoa��tnN:�%�g�vQ����n��@��:	G$��&������������@�Rd�hH
h�	;O-��:��4O?{���2��g����	�~��������oC	44���0�f�����2��;��"C�R��hK'���T��h���}�o�0��9�������sB�T-�����O�x�k
4���o���O����`��p�J
/�Ga�4W|?��~�1��!�8a���gZr�����^���-���&� ���	/�8���	jf�UL� |���������Tw�<y)� �a ��Z3������R��MZYK�a�$g�cb9�4tD�A�u-\*C���E��1~j!,����/�������N����uM��0~�_�������X��,��v��2�~���B���NuB���lJh0(��6�x�8��Jg`\���f�<~Vc� �/*<����,wD���R�I
���s-�
�Oy��o_�V�S�
���bY����	��o	C�a�R=!��W�No�|�GI(�D33	4���!D�O�������]���� V��6TqA��o�^\P���p8�5D�A���
�����uiS����j�)�Fb,~��S�i'�����*1���h���Zy�">���<��6��6��Z#� �F�"�s��0g��u����k��H�A($�r�j������7���v��5��{�%H1��^��v�$�P��0DR�	bM��'�q���y:E�!��I�C��bx���R�8�+�a���DuM�u�:�e]�&t!��&����>���=*��=#�m Q=y��rG�U����]��C������7�k4L��c��&K�JqW	~|����I[��BQg	�<�z��]��������Z����W�0`O|�zB���H�_�!�^��"��603B�o;����gJr����RI� 	��VfT@~v��-�u�	^�~���n{�����,��
mWAT`�=34�w��]��e{��&���	x�{3�5�Uj@��m��tw_��O�;�{q�����%g.�*�Ej����)%�A*.>�vkB�Q$���EP��S���'V��l1��� hP��b&�JK�!���p���k.^�+a�ATY?��	�������q��H�C�RQ�xh������A
�*�����o�����
!��>D���,��<`�IJ
h06�E��	�������#S<������+[�q�'���&������x*s�8���/`��!����������0������\�.S�������!
R����2��5��}�O��/cGH!F������Jp )�0b�44oT.Tz��m��z����:	�!5�a���Ts��2��IH��K��%�v��ctm�����<O����"t�v"����M�����0nXQ�C�0i������4��(�
�n������l�:WY�j
��7��
��'O�|�[Q|�a���K��p)R�0�a��{�9V���h���K���Th�3X���1eM�K�4X[8��S%���3z��/e8��Z��_�{�Tg��������[������o)4��}��B�B���B����5(J%�����P�R��������$��$��0B��������h��d:��B
�[^/T��&D[R:5��n��O�#$��`�PjX��#�o�G��6!�=g~�uG�����4COT!PS�QH���@�A��h$�������Th �PL���g�=��T�8N@B(P` &6��A�B-��
���v�J�	Y�F�I/�{��E"(����Ra��Ff�������P���$���O��T+C�A*�T���&�����&�����8�n���7�IPh����]Cy���u����x���;@��}�G!�8�BD�YN(4�_�o��a?D�J�^>$'Sj@�PM0.[���zt��{�DHA*4s�PB��=<^�����lB��w��"-��S���C���EJ������}���B�8���U�!��f��?
�����8J���hl����B=-�r3+�H5��$�(�

���'�|���po+��HP�II�A�������#���oGR:�

���"��O�
gS	:��	\!��IJhhAi�#W�[�	x�����4�<��
	


��B C	O��{	'<�+4���%:7�%�'J��#�3�M
)q}��N��3GY��+%����D��4
t��N�I��������k���j�����Y�Oy�QR�X"�0�i#y�m�����>�?���&DJI�aH��Xq�$T"�A��K���V�G�jUd���f������,\���� �aD=bZ�
-5��B� �P�����'����Gl���Gd�	��BC�_f���#F�o��

B5����@�sGOd���;��>;<�O(AEHA�-��Y/�M���BC�:<�y�"��QE(�
E��� @}J$F^`���
=z���gZ��g�W�	j���m��r���d[�
��6E�J�����@%���RhP�=��
�]DH��R�"���!�����m�:{���v�M))4�,����&(4�S����Y����9.!!T��������b�_3�����~-m��<�%��=!��9X���H�R�hgV�A��%�eAD}��]<y?,>��4����b*4|��(��b�~r���p��7��=��
��`Z�D������?o��iZ
Q����`�
\)�aDzK�a�-����;�^��}L����Th��PTh���m_kn�3��/[[�A
q��2��p�E������;���c^l
A��c


qt�
�A@	U����h�7�Q�A��0dX#:�V��x���-a���RX8�� �h
	�vYQ�]@��P�|�{MU��P�jD���/��&�
��(��� ��f������@���_mKPvH������!5|��}��g"��fQ�:%�g�D=�F�x��H_��������vL��@������g�B�PM�\���n���k(�\.hX��{��
+{���5�6������H���~Z�	&�?���=�R�e��m'���$��bX��'zb���Eb���1���
QYMEi��0[�$M��
��7���������A
,���"�:�9��c
�$���*4�TV�B�9k�+���s3U��_��@���`#�

��2t6��U~	�	�����:
�@h�6��Tq�J��^/l[��.��e(�����ksFNt�*3�������F��_�`�����vS����R]A���a�����)6���/�����B�h6h�����m��+�^�!2*V5g���d&�4�����K0��1O^J`O
4X

'�B�I#~_���u�9\��(�f�.0�[�����B��<��L(4��R�%CK<;E��V�a��B��,+�����Lqjf �L

�Th�Z� D�_�|������e�BR|i��h�	Gox��_T*��d�R��L(4Da����M�����s���y��0� �J�BPQZ�
�����u���]hS�<^�`0��y��uk���l����5������U�1��������
�G���V���6����Y�� �PB�=s	����a4.z<�

k�~ �\�����(?*/��p��R9A
4����� ���

j��w�l?J�*��~�Z���q�&�B�F�� �P^0g8a�-S��2cQ�-@�����'"�Z��C!'��h�����
��P���)4m]K��T�������PiX#�ZtJ�'�B
J%
�f���_��@��r�� ��gi�'{n�f����e�H��1���!��
H4�l���#��:m�'?�,��C��������A�<������4\�|%��3�Na��o;�L�1����V`UB�kT���������s�~��Z����d�<�b%!�����.'�Sl?��f��C�}/!���

���P$���4��|��Fe���D����W
��=*�y�y���hNE�u<D=�i=YWJ

���?{w��;$4�Y��P�%q��U�P�&�^�'
B����DR��H�nxJ5HMSJ@C$�)=L����k5���N�=���pA*4���0p)#�+��
�Y(k�
�h��w
6�K#�E������0�;���-{Q�qlJ�(��B>��0�")@����_���q���W���c+Y�P�}�D�@�y��^�^�FbM����u8Q)������l�PiP���%�&�)D;���Nm���`�/���Ji��
��#��dR��]J#�>%������.���M�&P��
F��p��^BA� `���L�
i�h��@C�BF6��{���u%����k�
+�~�f�l����q�r��nr�A����~��sDG�����h�qJ"�P�zW�,�����8�w���|�N�{F9���h��;�!R���qn
"�C��_��Q1�u�{��+6�N��pe�6��!��BA�)�D�~a���;[\�A����{-~������Z-�=�p
BI@�)��-k����_Kg���R]�A��2�PH����|���_�'B(IJ5�=gg�L����\&��� B.�d�����{v���������)���EE������)�By���Y��,��>�DD�I��h�	M���`C���}g����`2��2����(Q�H��at!-.����P������49�J)
�T�h\m�����[�}��� �<��������%e!CC{�pB�B��w�Q�����g<5j��m��eH��o�3��E�S�����!���F��~	D�I������m�% �4�DF�(����T�V�#:&���%�����N{sz�O
hP��N���t:
� �!#��qT_��q-�<
QZ���N'W�6���@���E�Js#�����x���D\8�B��~��s�E!�HX����k^�7�y�9	Ho�X����,`��r���E�N���M:R��C��H�R
��!�0B���,�h��W�D�8�Z�����+�N&�<�f���p����'d��� M%>����c�7�'�^n
E��6������G8\�i�Hnv����cK����CtP
���hK��������6�>B�B���{��o��'#�\��g��Q�+�}������u�Z�%6�IB5"	�A�/�����9��7����������
p���|�0b�%�����	V��U�����^��"��Pix��:N�$��������@���L��:��)������cp�&�9^p�0��t�Z�A�/|����������dL�J�{o�!���5�\�����k���(�6��X��a���1���>=(�k��3��"���^����uQ����G�� C0����Br�a��32�eHk�*���-��n����O� �g��8����p��3,53��D����y�����,�RJi)4DQ!����d��^�R�j�!��E8c����������L�=jA$4D�q�67-�v�Nzr���#�#�����TQ���'��;ua���R�@��e���/�'p=S����@(O)%Uhj��%�"dC7��T `�B�C�����Qk��	�����E+������gI'��+5��J���g�IS�BaA
4�ece������	&X�(D@�P�?j&TJP�PNa2]\`T��[v6k�4�*"|��!�����4�j%��Y���/�bP������(��n	��n�����B�=���P���]����[����U���B��>����O���s�O?��'
���Q��q�����I����_O����V����Tu[~��p��N�RUh�l��$�f�wOE�����[��!��3v������o�9�T�H �\�Pe�I7��Tg(�H����Q�%�������0B=A�>`U
�t���X����G�.W�Up�h0ax�R�le�� ��pN
���5/�}���M�L��sM�)��!b����3�9���N�"���/|������'���@2I�_�t���_�:Aq����O@?�����Rh@�sgXSI�KL	|�p��:�Q�P*�sj��4�P7
�mK����E,m��*p� �h����)��!�1�h�T���R����#R�����fa1O>!��|�
�D��w"|F��(�3�!�,�$��a��T���;����p	,�����	^��*�~��j�RSh���<�]�*�$Z3�CpX@"����=��+��I�.Tz���B1���*�@��B��C�����\*�������ui�������,���\#h;���1i�\��[�0wNTc+��gx���%��q���{��#�!�C�������]�UM��a�g�c������0td�B��rC������l�������>���R��
5����x�(�����yvnbx��8���G���7!�3����_a�w�_�C�S�!����PU�*4��UG[�!��5�h����$�a� ���A4����k�1F�H����Cp�H���[9>l����aF��O�b��^�������z-U&D�5� ���O	?r:��r�%K��}W;	�
p"�u7na%Cr��H'|P,�1��>�=�����_�;4����a	Jos��z?��"�@�O��uh 6�y������1% �D>�<�{����;��W���������_�<���������`�E�	���������k�
JH��"H)�X��-v�����.���.0ET$�A����-����{������s��;����TX���������"|w'��{��w���`�A�������en(��K wr�H��
��	�I���eE���L��XYw���{���e[(��7#@L�����t�
����]h���6��EsO�T���
�
��B���D���/����P@�AH��(�X�F��# �&`a2)0W�������	0 ���5g1�KSA�}L�n(D��H�a���������8|�w��"w#��n�����^4�}
S��\m�����k[d\<1�����y8So`S����W����J���r��X�i�I��)Q����;������
�to��?��c�(Q��E()&0 ����p%�!�������a��C���`�?X��X`�B5K�,�T$� ����0Rb�!�uw��Ok�X��6d�E�z�������F���P���]��{+�a.9����������(nK
kt��{��j�
Z�K�npm�?�~F���s�q|ILi?
���G��/>��m��E�J)����B4��xN�'��
�>��
�W\F�C�����auO�s=a7��cI���K���o@���H�I�~M����-��R�]vMF

o_q%�^c������/Rh`��/��v�	��������SE,#��*�����������H�8	L��Sv���4��.|�����v��-V$�9z'��w�����X����.�O�xaz����1k�"e2r9���OUIh�A�������u�q�m� IDAT"����Hl���s�f����Rj�T��j�
Z�$e�������x�5��+�aJ{��i?��!}�]�T���:%`o��S�2Rh�*UFv)k���vB��M�B�
)J�TJY|�Ck�/<`�b����n���qw1/~w`y�4|!�q{O�;=;d�JA��\*�����=E���Z��9b���R��)��U#8�����4��%yZh(`@��-�P��9�TL�q�Y�������1�H�J�]���N\~�*r����F7��NrW�7��I�W|�E6������7���z:��*�)��X���!I��b�������
���]Y��Q��b��nrZ:%����gA���z@\�A�^���D�@C�$
�h���`q�s9!iY��@CVu��w{ �����Rw0XE���a8~]|)���!?��h��u�n�
���/q2�KsR���������� ���+3�!�y��t"U���-#�!����ti]Nd�n���N^������$�����
�~yY^Z�J�-�tP�@.4��"tk�bMn���Hn��Y~
�yQ��@C^����L�r"�u�%�'�9<����Fv��4]f@��y�V�������O��@�����*CA��<ErW�@p����8�q�/('���6���\��2�TV$h�^j�����������h[~�3#�!�����Wee�oz@���Gzef4�U����,h��^�8Oh(`@��5�4��G@C�qj!
� ���8� nO	�r��
h�-��]l\y���LH{���i��?�E�Z	@�x=&
���4�gG�K�(��cQ�k7T�.(�(�j�H�=/�4�n�
@C����BM]�!#Wg�������?�!oz[~����k
����Iq�I��v�k�!���Q~��gzZ��gh���$���������r���H�w~�+
����S��������4@���*
���O������?�J�����ZI�BCN��_Wh�i�

���4
���t��s��s��!oFG��_�\��h��rK��Ah���$�!
*�t�?711	��SKK������q�g���7A��BAB����3b� 
�Z�4��SB<�
N@C�+h�����k%
���4d�O� ��b	@�d�%m��A�F<��W�f��!o�U�U����)���!�����H�� 
��Kv�
@Cv{NH'�=�����>;��7E��o
���D��i@{J�L�|������(�!�4��a��H��O��Y9T�����J�$��|��b���_I���I�$J�#��Y����vHZ'v�c�H�"�&-���}��S�h��I���Uw�O���f���w>����/\�� ����<>Ef����?����������e������ml)�}�=��������AtR��=����yr�H�p7��,q�B��������M���M�|~��l$�������n}~M'����|N��<�=��[�A>ye�����}������^Z�o��������G�:7�R���_�d��\�V	�>�������^���;��w�,��h�j��#������7���o�kF*]�����1e��&��Fj�b��Zv��8MZ{�w�9�3/2x��>�^Nn���oA�\�]D17�K7/Cye�7���r~-@��O�4��^���z #�!�6T� ''�_�'��%�>�����1	Ha�g7�|����;
i����]~1}i~�I��3��s�d���d����4?������WH���9��wa>'�����0������P������}������	@C~���:����3d���M �y�@xa�>{�[�����&h��>����K��M��I��M��]��I����7���)��S9�#H���o,��t�r+�4?�����A
��bN�y��t�WH���`���3�?��{��V���������Q�i�;���F���sTg6cy����;(((@�da�-����&+))IU�s��j�1�2ZZZlA0�������&%%q*V]]���m�����=����������i�wi~��g{�����,���&���@Z�o�j��8�K;W�V{g�.��7a>�������E�Y�{^�C�E{$�SZ�o�|����Ib�y77�������&��������.�"��a��BC^����?��BC�b���N�|��]�+��(8w���TZ�����>��}�y�IZ��]��z�C��I��ui�wv�K��M��I��4��4?�����>�������>�����=��_�
�����?a���'zY(���h(8C*�0	/L�Zs���R�@��%�\����A:�p�����x@U��_�A:a>'��
�W��RX�����4���9��wa>'��9����9h��y�����4��^��o)�0	��s����J�	'h��
^i�wi~�	�9a>�;O�����>���?� �_�i�wh�N{�s���"����&HS�s��|����`����A��&B[s�2b��b���l��F�1�c^e+mV����d]-h�o�U��{a<,�>�����%�/{�j��M�(��/_��X�b������mU�$���E���s�mO�&�Q(�|�_ob��rp�2�Q=��E��Q>���h�+�\��Y���K�~�-��e������I�P���oU��>_��`���������HA_q��N�d�=)Y��(����L�$�����"e�|�Q� ��b������|�N;$M����r�����'$-+����{�E(��H2��/�g������S��$���:��>��lU
���0jA�wq��Uq�o�-\��k���*P�g��������-����2e�n=��|N[I�Uq�y��Gq�=7+���.�����i}������������i6������
�c s�l���od�S{�QsE����t��-�;B���9*&������5���#�������	4F4�V���H�����Po)�������_�xV�^
�������<��o����.����@C�|�����C$6����(|={��
�����kH\�5��"���������E�����]��}������V�/������������^s���u�S��v\�d�=1�`��9)g��3\����,��BHu(|����I�t,-�J!
��}�
�I��
B�s��J��wP�������G��'�)���o����{l�"�A�?]����x�&��1r��%U����1v<��l�e^���a�B�N������J]1�����;V��h>�#{�`dm\r("=S-��prta�%���Y����b��1�s69G3h/��U1���� 
��A��7{@
��
@�4��Vh��������	@C��oF�@������*
��9!�����P0�[
�8��Z
@C�z\~��4���Xjh�y
9�����3�Yh����,/h���Xlh(@@����3�'�U��Q��
l,���f/��	��dis��c���<$
�.��C?|JNF��5`k]�gq��'�<x�Z�y���_�X[�a%�]^�
C���P�rI�#������3�� 
i�5/�=5��)�k��`ZBG�_��B�\��:�`�i/D������z�[���f�U�	p_=P����B��Aq�lW�v]����x8x�Du�iV����r�9���9��M]t���������-�IT��m�a���x�*@�t��=k����Q8���2�����;�L_V5[�� Qn
�D�?�e����`���G��Ph(Y�������S�)�c��M�uB��8xe��fO���^D���;�$*7/��.�}��T����hWO�:]z��Of�(e-Q��"�
�=E=47n��� ���`���3�~$������Eno���Q���"��o��z���q��V���(?���z42j�E9P^�0������r�=y�6/����;`������/I�����-T�����\kon)4�{�
��l;�<�bF���1*1;�m����c�����Sk,<y������%�c;k�*(`���������j[�:r������>�����'%�|G�����0�c,9z����
����*�����
�$J'�lm����l1}o�h��m5,:r![�e�(7����0<�?
u#$%}�u9�d���\�2
��i�U������!((h���3������rr*b���@Cc��xO�P����^����Q-�M����]�������'%������
4�d�M^/���N��! F2����b�)o��_�HB�a��t���-~;���L�L$����#���B�����6}XB8N�CO�.����%��aJ��X�u��c���������*��8��=������V���Y��o�M�'nSx<RX�N:Q!:6���VL����TTQ��5n/�!V����������>���)�<���d�=F�#���{z���������1^�<�A��J�(
h��h&���o���(���������p\�y��6���4$�_FQ���|
~��%�0iD?����\���VvFi�F\�a'�um�?��'��"����|3YVD�!���%����B��$�}�vY�R��2�w?k�2[W��s>x�w���4�*m������w��
F�����H���g������v�7�K�u�A�h1�i?#v���~�Q������@�AJj��~�+�
]���g0�.-�@���o��.�uJK5�����"�`�l����b��a��L�;3�����.��������K�|$����M�E���3������6��`�hx��@$?4*������������an�����>��,rNq�q���-����@�L�"�������1��:����*���QH��<�M������X#6��_�|M&�a9j�)���8�
4L��3ol��J��%�`�S��p���|	4+\#��c��g``��
�d�K�Vct��``����Fy-+Xh��}M���1�m�D�1�J�7�6�`��+-]\}�O
�e�Q�������P���^x}�"��<sh�\�1�\=�aU�@�X#P0#	@C����7�Y�u�M�?a`��p�j�*(W�+7��L�bH���A�:A^Ng/���"���3�nr���g�@NV.5+c��C�����	�������1�N���^yy����(�6����El�q�j}����PZ�(��RI�<7�:�� �2�q�e����]Eh���n<odN)5���?69��B�~U�pa|<v����4�=���A��Ph�(��.,I��g9`�L
���]���������Mz��]������CbB�O&XW����L�v����y�G�WA��-;� ��#-�����@���&�U�����+���	K�VFht<WL�����o<��g6���G����6���p�7sZ:",�#�b�v�>�4q@�"��g9Z���lIe��{�x�!����0��<�#0���T/����J'�Xf���Z�r�����l]��
�*Zp��E����'�q}/FM>����pt�\����*�\�i��|��-��������������(����q�Y�-#�-U���������@�M_���FBp|,��������<��������_�We�������������w�j|M�������2b}��0�ZUGq�
(D��l����p��O�1�r���w��j9��t���Qk��~��Qhp2���zndE0��zD~�������%��^��������_`�������S0h�4:!X����!)�h�5|�l�hbL�>P�W��K�p��'���Me5`$���L��e�z�{�3>�8�P�����?V����tm={��%M0j�\^��Nc� +uE��q�+4���
%:�p����+�1�tJa��m�O�D#��Bi/�i��{�:�A��Eq���#^aF���@j����![L
2r8x�l�
�8�-��� ����s��=����W�=P��($�}O
GQ�s
�h(S6��3z;��WX�n����/����/�SX>>#��=%�jZ;SW�{�V���Y)48XTF�&��]����U�w�Ex �m��]����Z[wt1�<��Z�Y�
+�D��m��Ov����X��[����2��]��>0��h��Z��>���)44���g�~�t�&u��b4fOB���
l�p��^`n`�)��x��{.���"TI���������#?��/��������,�<-9%�*S	G_<B,���G���bt-m U�f��P�P!LypFT���1��d��W<����B�:�U�9R���6���;����g�\�AKNw#C1��&��y"�TH
�={�um~��$�T�ACV*�G�BEp��E����%�!�=k���h��)���`����s�t����'�m^���	��^��A3`�l����XT������[<�s�(Le,�^���BC�x�+��`,A	�
������t6�Z� *�T�3����O�0�E����aJ���V�B1�
=��<�����16=�L���U*�{�\R�),�S{C�_b��������0��$KYz�����������oo�����o���m��}���.�W5YuR������O��.���oB����t{
=klL�W��m�P�@�r=��������Q����H,�Y�����&�]�{�KP��}��
D'Ec~����dT353\}}���0j����E��s����5�G=��}���I���IkT����/)������
�t��L�=���C�����q�(J�	�����u����H6���@���u*���w�nX������[���{���y��1�����!��I5Z���B�C�����"���+��A�r��A�3=1��~|�����<��qa��z���������%c���
�/��u����\��m!,�<�rD��#�cQ���o���
���N.�a*�#��Ez

,�
���=)���������[���:X����'�q���:��
����t#�]SW���[Z��i<��wAu+��������Z��f,B?�`�N�����F*��BC�X��#����&/�pJ�����m���Boc�0��	���>�"R`�T�J4n���{�ph`Dc�������[���&����?cr��PST���WX}�*,K��<��F���EY���665��c��c��.J���y��=�0�EcO�����.�E���(k�Z���O�

�T�@���I�'�jB�Y*�r��]T��Vei�f�����%R�
���+�o���������������!����r6]��u��h�E�:�i����~�����u�UsB5��S��wD�g���uY�p��y�&�?��1?������-�hhk���>Q�k�3�����`�[�+�����Z�`�%i]o�
3ZCt�-K��B���B#cP�����;qh\_	^�D��������6,Jj�}��m�}m����A!��qO^�s����av���j'jZ���cyGzW�s�FhN�g����w�Ajn5�x<n�>#RhX��-�n����q+D���w�q��P��ct+�o��S�|y�%

o������op��
��8un"������0\'X�uRc�`��?��<.���y ����^���EeQ�y����w7���G�X����nx�FbR,�S��>7=�r������j�RU8����g�4��m{>>�jF��	F�����������^I�>P�F\��E���?�����]������K��kM��U�m���<_��z�7z������O���Ko�(��},����U�B���iN������Gm�
t��
y�����x%v=�Sh�PP������*�s�����u�E��8������ytb���g��g���u���.�����	
�gN:}��?c\�Ft`��Ua�����X��L��UY=T���������KA[��Z��N��]m������bv-�* IDAT���I�;��Ep�A�XQ(���718��
)_h���6��`�-$$���)��/��6�0��!g|0��V�
����7����O^#��S������� {��b��K��p8���M9Y?��0l~�o"���J(��'��=��q}T�s������%ukr�!�����xT��CK�f�����\B"��0��G��`�H���vSXX�<�n�@��)
��o�s��Ma�����s��^���0��d<�-�wB_I�������1�=�F�R�U\~u
�r��#+AH�Klx��_�5���:?����g����G�.8r�y=����N(��i����A�F@K^���"06�^^����l�����_��s����LB?������W����t+�e��D�hP�y�8'>?����A���~{D�i���7���������9������~��p���=�FS�F��3��$}���k�;�������6��K��u%~o9����d�BC����W
��(��2Uh�B�\yUM�G����q���$>����g��=��h9��7����:�>�ut_3k9c�^<���N����~\o�l�Oo�x���%�6�F��#��x����@?B���Z�C��J��P���}�o89g\�D1yZ��������x���t�:H����.*W��a?�������>F%��{K�~�+���yF��$& ��{��.������v?2�Z9�I���5��qT64�w{x�
����r���N����_MN=�oL!at�zP���g�<i�g��}�46G#s+���`������u�Kv��y��4����vaaW,������X����y/�Gc�K���7��~^���M�2��f	9�/G

rL�������,;�O���Y�s4�6��JS��4��pz49�D/���}��	z��b��}��������eaaZ
�����@�m^}GL�����)44�W���������D�p��d����8p��#�������Wop��7:�j����G�V(cf��+6�w��4��]�,mQ�'���H�$��fO:M�.Tio�8@���<������w����{�3��_�������k|}�����-�=:4F����������|��-� ��Z9�4h��:��OT�;g�s����`��#�<���M�.�
�iS3mHh��w2|-�bi=$�EC�������h�c,.�0�V9���A@D�+��
�D�#�a�>����3�_�?����J�)�~9}l����@����.�y|}�'Rh����o?G�3�U��3��e��,kW����
��hN��zcr{l��G��e�������>��bA�	�
��ua^�2������p��FO9�%���8�dt&�a���p���_>�?t��[�
���:t���K���e�����mYV-#��xm;�W.��{���	��>����x�}>�,`@ ����8���i(t�UE���h(;���`�Q��@��A	D_{�C�q��d8���;m�A�\)(��K-��X�gz��r:(=��F�G�UR�x�e�Xq������������|���pA�5�i��9h3�������@��zhA ��S�9�PRC�s;����QBU�(�:��-x�E��-i#`���	$wMA��m�L��m+5�E�"�s�6�,C�U#q`�J�[6��U�}mx<�B��-h�|>0B"_s�`v��sd-�*��\�����VIi�������]0d��'\xyA0T1����������"��9�����R�X��&RF@C�����d�g�B���#��hxtXE��0rs����(�����5�h�vqWx�B����p��j�}y��[O�`���k~����@��f4m;�9]_%�u��6�'w_��:�m��V8�q�]��s�_��*���#9��������b�ywW������.z4�[��A�:�1s����r\k�!��
4F��cZTo������p{����	G�s�+��������&�Q>S7
G�&��"��
|b�������NIs$�a�Ss�%�q�a(J(����=��q�.�H��e��0�bc�=[���z���X���+�^5��!,��qQx�P�g�&��G�����M��F�%*�{�G��S���nU8�p��GkP[���|0�~���V&-��P���� ��X��%��D}�����66�AWA�������khQ?�Q
�k��\9�m����j��jk�r�Jd�x�X��MJ5�����aM�U|m(��Z�7���V�6m���x������{�2]�*�5X]W<Z�7���w�K�iV=-{P���[�n�r{*m����Z
�`
����)4�{E���}�G^�S���kb����l'bhs��4�w
T�{���P����-X~��W���f���P�a���Hu�N������u�zg�Om��4k�E�	}�x��r�e�����/N�v��/�T��.[1��(Q�D"ha$��n����x�����X^c)�]���[���������
k��������[�lB��=a�eC���8|����������#~x����Uh�\����`����F���^�y>�[��L��=�����'nf@Cu��p�+�U4��cl�3����b�_}��0��a%<�	�szNN���.��BQ
c�����[����}�MJ*k�f�?#�]��M����5�������(M�����w���*�m��4�p��>�Z�+m���	FYx*>s�~
�tk`��Lv�Y���0��b�� H!�tk�}b������1��. �%�:�b=�l�,\�`���d��p8p��u�E}
�?l�0��'k�GG�^(�d ��8�
���X��#�����64n>��kPO���#M
t������������)�;�bm����b�k�u����'�M��A0�P��g�h�|tt�������z��Oy�%���6����:���G�K00���}����r�`�kS����E����`l����q��5�
�����2H�����I-{��>��j#J��`\�����o��_�2���n���2�� �>w�UE;����l���6l����0t�^R��B8����~�:N������^hF.1X`�D!���m4�����f�m��Wo8)�
�13�AUA�v����X�M����$�u�y�{G�B��ai�s��xzcF�f�w�,�i�pl_t\�Ns`eo^����v]����Za��k��&wI��v\���mr@d���~�=�z��Bw8[��,�� Cr%���U���������j�ZT ���}94kkr�a�������"6_��%6����
�c��x���~�F���i�CF@�����.Q���R��1��:,C������q�aaV,��C7|�F �eTt����"8�p��XY6��c1PV*��^���
_�cG!��<��{z�\Fh���{T�2O��r���EC=9����#���|������R�(O�Np����n���q��*��R�^��Q�3266��1�V���.��a]�z�Z��s3��a�����}�[a��}hn^a��t����3��~K�������t����������R�p�����Lh�Q�Ja����cf��Oa{����w3�4h���N���
�G��d8f6j�	�AGY��6�������tp�Nh0J�F�����k�X��hX��S���@E�6}?�-�q\����XL�C#���n����>'8a�� ��}�@�E��*Z�x��A�8M0D=:��;0���2���1���L��X��'��H��j�=�/���+��"��I*��?"�������$�]��	�����<?�7�����;��\g���c��.�����V�7�V,����Z�5�t�%�Vdp<�4�����+��_i��A�u�jq���7��X��PZ��
�����[��3Y��\���9(0��t��Y���`J���,�]����
0��+��`@��O��j����J��g���e ��+���y6=���e2&���:���

��f�F��e�4�j��@1�c��\�	�����T�R���%0�390!
w��{�92�S�����P��1��
���&j������P�]�OsUl���E40.Km�B��HL���	^�VP���}��n�^� �{����t��B8���L���}n!:1=�W&;���F	�ML�N����)I�h��C*���`��6(S��]9�N+�a���P'x�� �sK���~D>���h:~%���]G�6�u��#H����P�3B�����>�1�NX��� !&���$b+j��"���k���}e�!85w(�{�G�-[��^9���^��I=�e�i��4���#�87�������C��((i+!�U,j�r����P��
>'$���T[��bB��M�5+���<�����u�:a��#0R�$�)�J��3F[�<0�vS��s�������:��\A�2�	4����/8�p6�>������G����-N<{�����o���y��r�!��S��^^o^����8Oc:����x"�c��i����`|�Z^�./�������{I�6����	�aM��0��oPT[It /� 
b��?111		hx���"�c":L�>k�F�������9�,bn)�����5u�����M�/h���E@P(SN�*+�dYl���1�m��0���������	���y��Q�^��'�5�����6�ZD����F�m�4��{u���XO�!8�S���h(���&�(D/*���-������M� ���B����*
� ���A�����V���?D�	������N��
�
l���_3||N'��DG~����sY�\\�A]A���t�`-���\�
���j	^/�q�����n��q3����=-� J3�Nx��wq%�T�ay�*t��3?���]x�Zk�hH��mJsUsUL?���Zs����'2������Y�q�w�����
�����`��(S�:J�U��#KR�45w��A�����V�'�}�@�[
&t��d���##�����6�j��^O/���`>�#W`��f
53�~�rh��K^�'��
��U��^�����t����h�Je��l"�6����?�%�4�B�����I�A��%��uBB�SUD(�Y���!�4h*�ax��+&�'6��}Z��j����@�|v?��Lp���hPWP��k�0�Qw��S��h��_��t*�?%q�|�;�����[R�`Am��\�a��In������=�	��y*6�����p�������])KR����N�E���-Lk3�C,&�F�N$��5�+D���il��y���ux5�hQ���.��*"�A���Bi���`���!#���S����fm��
���P*	���E�'��Z���>25*�B�B!������c[�k�;4	(� J=h�y�
kB�$M'3\�?C��f4�������!G�?V�K����~2F��KE�%<q���:�	����?�	hP#E��6�Z�x~���
$�(�����}��ky����<,L�2�m�r����v�o���'� �6����`��~X:d3:�h���1�"����.m�A
�z}�><��6o���U���JC�	@X^����GF�������&�y)k4�'a�]=��>��	C;;l����|b^cU�����4�;6K���P�?�
���&U��WX��y���Zhnd
'"$	9���.�a�Q�o�G����q��0�����R��`��@�
i7�{[R\�!���������� ,���]���H��G���a[����/.W��=��\��p���@�����Yq���Y;:�E��I���8������y��;���"�����T/��������8����`�Y��2��!����K�4{���H�a��qil��Ie����O�08��N����c���� 
��u���?�e��
�><�`J�#�h,���Y{R�x��9Q�00��`��5���1D�8��?���GQ�������Em5��~�' $m^��[y6���u9���B6�T���Q�����,��k��*�~��:��k�3(##{���7nf@�>��8���>�?���oC����8�N%�P���
~����1�)A	�I��
C�a��]p,i
[�R���*m����L�����
,���6g~l�7����t
5��>T�5��J���T$�e����n�|&n�x����w��k���"�����z�n$>}I��;8�M-�I�C����
��{�$���Qy)�f����'c��<�	9J�-��D��#��o
�V��uEdx�(����5:
%I�c.'�
�
,O�����w!q�6�����Wl@s�wy%��
��h.����0�I=����Js`��\�6=;�����,X�-����_R�W�f=<�	�<'Sc�nR���H������I)��=��e�;,�L'�	`j��m�����l9�0�`	B���X�'^0��A����iX�=�:���[{E.'����=:�TDm������J�a������M�kWGHT4�Q\Im#+��_��&(���?����(�Z����"X����u�1��n"Wg���@���r9����V�mq��zxq�����!(<�`7t]�%5_6�S�5���)�"��t2|� 7tY��k9���� Fo=�Im���m�}����c�A+�	�`*Pg���PR+�'��J@��Kn�|�`����rV�����6�C�J�h���.?��SR}`@�(���up�iW���|A�_��_{�@E������}�
�u��}W~��������;������/i�Z�	���i������.�w�o���T��������|�wTR*3u!e\?T�������+H�6���R��;��r�j��M��p��4�j�!��H��""�))��5^M�����$	�
�F�V�	^���F�#�]�")�(����i8C�.B2�Mf8���k������O/�YL(VS����N�
L*�iY� ��OSN���0���,�����-<�M�-z��nwT2*
r-���4a_��T����0����<'���������~Uj�@�*#���r�?���`�����xEn/�z�@Dn$�/�1|�?�#K�V��L��i]N,�W�+)����:�%��0Ag���I�M�x�C5fc3H���/B� �k��['�-Z+��_����}B���COX�I�������)t.�k����yu<fW�
��?+���+l�u\y���.'F]���E>��SV�D�`p�}��O����+;��6�6s}Td��Z+c�m�T���w+*h�su����q�2O,�����#��
0Q+��6f
�|���DyR���9T�f��l�����Jy}�F�
�,�\N���:�-CT�gRd�v��4����3�iL�Qm��� ��{�6f-9�!
��	�{v��70Xr���nf�������fYe4i��w��d��^;�;�uaU\����g��xI��C&���p�a�]uL�y�7i������E��m����G������+F^&)R�`���}I��)n�&�IC�

���s$0��������1�)JU�A�%*��������P�tYx�����plz?�����n�^���G� �*p�������s���m�����b^a�z���o2b^�������`Z���v"�@�f������h9s3��hX�k�+@���<�UAQ���^t�h�
��H����*��
�n�P`j!��	���h���F�Jx��n������c���X�������29L�|�?c�p��7�	X��=WR��5 �r��Q������=S��H5�����������w�X�����x������*���G1��������� IDAT�_
���r�b�KK������45D!R��YA����+
�^�;~���h�V�F��i�~�3o ���!}�R�@�aaq���a��@C���P��#���{�=�O��Cy���8�� ������"���=�MR��}�T���n'X�_������+7��s��������h01�����������K`���%�d�����s-m�b�FH�t;h�

���|���V��h��/
�/��#�����t:���uh�mB�������
F=!����~���$i��@C#+��F_tr{���T���^�I���p�ML��tRX`� X�h�T�%�H9�b��YK'����"{QW#��
�w��b<�L�a��0�b
��&�������!����40@!��@c�^����X0�Y*���_5�v��-ca�����Q�V'\8������BQ�t�*d4�W,��I�H|��#�2�RP*c@�F�e��(Q�"w-a:�5�X�M�����(J���tdn7��Sq��T�� WRE��!K�.MK"��'��ba�%���4���)�T�8A���&0@�m�W6���h�L�	$x�N�������aY�I���*4l%��G����pI���@�5�wr��q���Mu:����9z�"�������D�M
|LN��0����	"����c�f�@�������%�)t��NYxc

��1�p����gI��Ag�:��10����tJ��g�7�����az����y��Uvwv�MB��N'#��
)��
�sE����.5�;a��� ���������)"�7���t]~M��"tM�l���n�Hq!N�
h`�	�}�t���e�b��u�@C�����1N���n
p�����&X�U�a�
��������D�i6�N�D��=0}�(�vh� r����$�k��pp�N�FT�G^�,I�2��'��	h`�+\kv��mcx]�D��u��
��!��&�=�D@C�GC|�K���`H �)�:Z���E����H����D"-�5' c�\�&�C<H��@�����A?��su����� ��#���a �C��S��V���N"!��.�x�	���&�������p���]��1�q*w7���

tB��-��O�M����:��Z�I��LH�A�������;�	����3I�&�r��&;�/�
^hQ��uX����%s�+s�S=`�0��v��'[��~O!�h�k�	�i���R/�dp���Bh;3:m�F"-��T���'��7������Z�����Wq���O1�.t���U_L���vR��~�+s��-Lb��:�:�E������U���a�Cq6�,���5��aI�����R_4*��K��
405�����z.\���yn���~Lm�s!���1��/uY��-0
���QZ~�sUY��A��C���
PH��;������qE������U�K���2"�]Z�u����iq/�7�������>z�mi1]���{���yl
L���rL�\�\T������t�7����#C��d	O��>Hh�N�$i�'�X�*f��
9��X�`:�X��I

N�	^y�A��1>h\����`!�B���[i��3m8l�P�	\����+��%w]���:]��Q��	���P�2�G�yq�$@�m���������!����
���p#����n$����H-��L}�M�AAF��4nt�e����?�/Z/[���Z�y�\z}@�J8�I�fL�����/�����U��#K���|I�D@C�
�SAV��E��x
�jU��cgR����#�����5Whh�l=O�i�;wM���M���e@SC�~���cm�@��W�H��4��g2��6����BP�-=������Q�?�(�z�w�
4��k�Mt�8M[�P\E�����-9(��

��d��q��;�����P�
~/��oto��O6A�%	D���3�g�(������.��DJ
u0x�>�����M�oP���(4��^g���B���0(���D�	L��q=;����N�6q�6�6������5D�&X]���"���T���7��~5l �Rh�=�Ho�5���`H�B���x����� ��B1��g

^�q���W�qw,�����!��f�� GJ
;��o[Rz`

C��&��P��05�I�V�Wp��T%�R����� 
���P��`^e%m�2Yt��5����x�
��`�����6��}��f���5��E

�Hy�\�mt-��o���������T�81ML���(�@����Zv��
"��L���9b���eZA��p-����<�}���R�yt���u�+=��� V_f4���'���"�`���
4L$�wRT`

M�u��{����#=��5����io�'�����%`v��Z���+k%�9����+��8����M^/H=#��q�i��1��)�1o��7����S������Ug��
>�]/0���W`!=��h�����^��,>z]�j�
~�~a)0����U&c����V�
��:|^�L���M\9B4:��V�y�RS���`ua@�'X[��%Wd�����!��X��Hba�Y�H��x�������A�+����z0���W�q���ryWy`��	�x������5����S�`��L%��IcH�$��O
P`�n�t�~^��\QA4���\N0�5�M��\K4#w{����TB:

2</�D>����
:�����R�!)4�$e��hfj�����(��A���U$	�
�U0����)tXrG��A���8�����=pv�(�WoH�%�a��
w��E<���M�����Sd��}���9�m�������>�+4�6q��Ns����g��k��'`��'/��6�Jn�
�����.��`����2W��V��L��%Q��|6�O���B�g<;��>��~u�4���������+b��� �}K���h�^�)4�uG�	-Hy�B�t&�a�G����6����G���5wE�����[�9���;�9��Dar�&�z�!U��!��I��{
o��[�P#�W��D�8Aa�\�aA}W����A�YE|��g9R+��h����35ih���/�q���|1
�4ag�"X�<w%w3��Q�9t�������!�C���m��DZ�@�y�B:
��3�<���[�l\����N���.�p�!�H�E�����i�!� 0���a�4��]zY�����X��
k�)LA���z@�AS�(ZwR'�R���,	��}@�n8{2m�4��s,�Meq�����@C1K��t�����=��|E�
����@+��B/�Ign@�S$��"�3&��E �>���Lm�4@CVv���g����z0�,�����U�K������v
���`����o��SY4��yv���|�������	��"�?��Uh�\Z��%���m�|��$(�
T��z������L�J�#k��`��O&d4����I��1���U�d��T >��#�`�N��
_�~�<W'Q0_�;�>�h��(g�9sEq��������!�q�����V����BFc���I��m����w<���g7�
,�6n���R��I��y,:v�K�&R��0��{�r��I5oY7j���HR��!��S�NM�s�$�&�(d4�G�)����;�'x{�|�_���-3�+d>�N��!�NA��M��4X/�$�!�i������-���P$����a	Rf�
��P��
�"����jc���-�6k��~�90�2�*�����9@���k� d�Y�n�)i�8@CMK'���lm���x�*hP#������z��9�>���
l��0�����
sM1r�\���C�� �-j�*X�F���P���;���� �?}��R��<fZ�y����q$���P�
4��2�[��[�$x�!_�1��r�����G��w��q&_����/� h�t	�����)=�TX�=���8ZV��]RtY=
:�!��JP��]7���������������1v�^��BF@�<�x-7�-=�	6$w/��S�����6d#*�F2�l���>���b�B��������K��,.sC�	#-������C���)�I���>�N��H���k��.)�a[N�F(�])4�*�cR�y����6�/��@Mr����2�
.��>�H�&o�F�[���
Ao�s��Q��`��Lh�� ������0��t��j��������b
��H����1����h�p|)wk��`]M}R~����@4�����~���h4 ��6��y���/Y|'���s���Q��	mJ��
,����I1�#W%jYK��a)H����9�H�U�NF%b,��aq��^���K��<����[����O	S����g:q=����8�z�=!�t]?�s��������P� ���0��A�v�S�A�\H0��~� ���M��W�������m������7�P]�w��j��EK�d>0v��m�����lC�����G.zH�a�m�[t�����cZ��_���*�� ���gn(~6?���Z0�A�\P�xq
�t)��.��4�Hx�G����=S_�[�:���1B�N��m/��oh��N��'�a���R1e�Q$x�(���BS*�E�h�7�G�E�x��|���w`U-]���AIl��D���������;�0��Q��.��DE<�~���>gb����=����y������]{I���tk.����Ra�b�?c���:�8�t-�-6��p;Fa&�< M��� ��^�~R�hm5�BV���lvoYh��pZSX
3$�By]�BG������"R���d���1�p
��2��D��4�"(��P�Q���_}~/���S�hB���$��/R�f�7�MY
z4�W���[X��}O�����X[gh*(�SS����lvkL�v������H��t��=3����2C@��X�����d��%����Z���Ay/���J�H�v�
�mj�	�U����whS�T�"@�Y��������py�]����56?]�9�a!#fx�N�\���;��B�!N�9�n�54�c,�!C
;���=i���?��������D@�m@{��?_X(
Ce����������4^��w'����_��0��?�@�R�~�q��<�}
!C��RL8I!'H��6�Y���)�����GO�x�A���gL�a	�
��A���w������%�����\�ap��|#���{P��8�����3���}6���f
	*P�JP�X�'�4t�YV��L����X�	�=��5XP$�B�l�N�LE��,TS�#�O!�]/��:���fp(_��	"#��cv;gmD��c.�H����d1L;r��u�p�l��g]0�Eii ��������������M�ka@!"�,�s0%�",:��~�������(���X?�O���y�RT�A�6���6��h`U����0E�f:G��T�x���x��Jhc�	W� �����K�����^�EH������>
7��1�4���
��E�\P�H�b`����	���Q��
�jW#�����X�Oo>�C%l�p�����������H�v-������������%NzzaA��X�:)Q���EwT.e�^Gf>��B�{����c����M?h����C:���"��QMRL� e���-������`�_g^�v�K�.��;�wt���w�Q8�pH\Z��(�������"y5m�����,��P���`�83�'���Ug��A�1!Y8"����""U���;)"Xv��m����!/�m������^����u)>w�ws���I�i���u��>��
I�k�/�#~JU�a@{g�*i�������6]��CC1t��M���&��)�OMm���4��=�lf

$_�)W=�����O���0�^h**r����1��3�^HU#d

�(�D��HR�S�T
C�����P�G��$��tt7&:4�vOw��)v��S}�F�gLY
]H��,�q�xw���Z�0h��TBwK#�gN�������������h`�r�~35����<D���<�(���q��<F����E�/������SX��c��2B��d�XHV�A�I�W�#5z�&�
��S�@f�
��kW�������(�����t��m��yy����j�[��,�d�c�k�h`
L���1�(��CDR�%�n��r?���z>�e�w%�4H`�s
_��C`�	o���(GP��^���6�e@�|�^q[��E�2��-h������J�&�g|�Q�����\�����-���	�	j<�A;T�*�q�S)U+>�A6�+��_�����w�yh	v�����E�+�o��[jWDk3���g�*�,N�{�B��h���#�0���jt-�������*W�`c�k�E���%e��P��CFU�G3��x�C����g���q���i��y�k����`������pB�N���k��olu���>��#���:�z���^�|����T(���>�W�9F]!5M�a���]�>�=�G�p�����������e�f6������(��)4��`�\(�fv
����C��Kpv�P��O]�H������Eum
�����BV$EF�uM�<��g����������	t�u-ZK����b�o@�u���Q����D���v�\�<��A�0��|x�c�"�?L�G��G��EZ2�c�J=I���bm�����@�����m���??�[��0q(��=yq����hY����Ci'\�����?�Ad4������;f�q��3L�j��Oe;Z��9�s
������GA��}4�r��L��(�a!"���k|Wn���.��t�`��s�����������j���(zn�o{D���BT�S]�
~��$
CB}�R������A�j��������&�f&�}�����~��/�.R����CN�����g��T���"������2� ����'O�6�<�J��Q�Z�\���[���I��	V�h����j��%s9Y�L�� ��;z���X�e�i��D�M��	MUh�F�����E��?��:�j��S��v2$C�K��N
#-���MvY��������&�J���
��+� n����h�[����4����������sQ����Q��f4���4�[r�MQ���l�_��A��E��3U��N}q��nx��H��?
����|����������bgN��)����R��!�k�����z�#
��I��y�r����K�:�	Hi�
�t���t��?���_]T������������m�u�E�T(��5�)�Da�^q���t]�5c�������`�D-��
��Ety{q����CN�SoVy�r"�����d9����	h��6
K]Y
�2
�}Y
����C\�!�����d9�][�*���)��S��yXR{^v���rY
y�pU���y�l��63�!?��
h���B�
��$
�z�p�/�@C�v�`����y@���Q*44J$�)''
���im
@����������/� �g�FR�jL�c�.�@��I�����/
��������X8�Q�N���;���V�r��a�(��<-L�)���&���3�����?�"+�������#
����/�7H@����B��#���pQ����o�
@��.M/ 
����%�ATO�9�4������^�����HHN�3��`�)
b���xWrn�4�����A��\A
�-��9+!
9��PZ�@�y@���9nHHZLE%�~�i��S�Myh����Z��������@���*9�� �����P�����*4�����,*

y�aA���g�!��Lr�C����h(8�"7-�����xu	@�x�b��!ZZZ�;.�%��0)Og�~sB� IDATO�~��Y�PL��������ch����U9��wW��Y&
y��?�.
����mU��9������h(�[
�}�o+�!g�������%VZr�C����h(8�"7-�����xu	@�x�b��A��5B	����?
_#���|d�����J���*��B�I�;VE��j�-�����P0���w/��z@��e*i��L��?���;�<RPP�-O��\*��mGa*yyy+V��f���lP����k�2H�B�����-obb"����L����������g�s��L�JNN��(�����;�B�}R��='
$��}��T���xHKKCRR2G����
�9��)|O����~�d������Y��rTq!(���������~��u�[���.�h���q�)T����A��2�Y��\A����=(�v��,;���w����~�>���#,2��Yk����G��[C�:�������VA�<��=Y2�X�.%S[T%�����_���aePa��GQ�{n�XLR�Ye��*������>�a�^�]��K^��f����<�?��]E�	�~_��k��4(�x�,�av�oy}m����"�V�����w�r�P�h/js���A�/:�p����PP�:��BBBP�D��jb��%
h���I�E��3wBWW�����0����?���PT�;����~�1�
J/������Y�+��������\����{^��o�xN����E�����0�+z�������\����xNX�.(kG�e���	!'���
��_y@
��&LEo)L��d�yB����b�;���a\X�y/*<5���0��s����;���[Qx���9��	d���7��y�N���E����0���\�@���o����Z��`_���PVN�0�nb'��}�������;b�RRCf.?�����������f�y[������d����(())�r"�M�T��<�jg7�I�1I������=.�u�w/H�(����|.��^��o����s�����rg}�����j/����c�����}/��7a<������E���y9��������~�s��>'N��������s�(����x.7�{^~/����������B���
�-N�="�(�x`�L�D�J�y@����BC����NQ}���^��oE����zQ=�Q���0�+z�v�������_��\������W��)��7a<W��oE��������������AB!��_�_���u����h(�A+�	S�@
&a)����)��@�	�EO��(����~�s�x���w�����~+���^4�/� 
��N)(��9a<WP�b~�!���G���
B;B�{~�Ch�/m��y@
�-&L��������T@
���I�������pa�p|Cs�Ja<'��r�7�����M������wa<W4���= �}�����(�wv�������wP-������w<'
�c=C���y�O@��p��mk}M��%�N��;��C5S������^0�=BC���s�������#V����D"�N�Y%�\��j"c>�r���Q
cQ,6������
8����\�5���Q�����y����P�~*�g���K66/L�
�h��k
�5�E��4fB�S����p��8��O�.l�n�o
���|7�kd1}���v���Y�?��K1-����U���'�T��).����
���*a�j�>���0�|�U�������6~����Ph�w�"x _<`^�eu������������{��5o�	>_>��-'�;@!,)_�*� 
��U����4"<����q�@��� @C��� 
����Wh�_g�5h����/'
��L(@��
�����������q�2Z)
����������s}�@C���_[�������4��oz�4@C~�<h�/m��y@
�-�h�����
@C��;��	@Cv='~9h�gB	h�@���4�{��%�P8��4����@C^z����A������4�K����A�U��h����#�a��m�0��s����j�*�����w�_�SF���5,\�
G��!n�t�6��x���D4kP���Z�#-���I=���!��k��e����O�@^V����������������ph���&���
�"2!��0r;��s�qp}�	
����)���:��l��O�2Ye�m�a�U�����7�T�
����e������}w��d�97CNh��}����y���������U]�)�`���b�c�#�0�5����-S���$�����&����n�U.c�#��.+��@��:&�{�-�:Y`�Y�duue0��>�\{�-Y���4�����oXJ_���5[��B%�d��B���Yy���`�_��P��!.\��7���u]+g����Nb���y���X�k
�D�?O��
�v}�`A��V���K�'���]�|��@�f3=$G$!��h�yrbA�1Xt|&�����O��_������<w�Xe2f�X�P�:�n���6g�����4FE����V�$�MyrbY��Xz���1z���H��d]�

�w�S�ri�{��E������*ozk'�������l��U��Thh�KWOF�~+U���c[�2�D-��p?=M����=���UQEU����S��*��YS�JUh�����?���	���w+[���P^
S���������|t=8L,u�u0���;7G�r3���&�]}�h[�)V�����r�`n
���(_/���z9)�i��a��xn#����{1��d��XL�:�J���D�^�z�su?TZ�&�1��-|��+�U�U.-sR�$<s�R���O�����2dJYe���(���eu��Xa>!�S���]����8���}|y�)[n�����Q�;�:�`��_������f���Z$e�`3�1�.v�����swZ�hn
|��QL�l'R��rbp��8tf1::O����=S�s@9!�=��L� 
���2�/G@��e�0uLjl�%kw@GK=:����O�v���o��k�.����!�1�{������b���yaa��}��=dd�S5(���Q��CFZwBk���Z�$x�O����7�Arh����d�^�ycK���	4HJH���D�5l������ELl�6��
}j����O!
�V�HK`���������"��(����4L�e����#����I�P������m|f�
Q���P^���+j���K�a���X�uv�����2�*�l��8q1��9,r|��� 7�%�l�XOALgU���O�=I��Bn
2R�X�sFn�6�k�a@����~�w�9���4~�
��:�q=$���J�%amd�KO_�s�AFJ��:c��9�?�U�[@���4�Md��8��
Zz��W	/��/@�]�Y�sq.��d/��I����W���C��#�
4�HJcz�Q����Q��m��G�v�������i���=iu�6�p�rZ������EhH
|���� cQ�@
Qg7@�I_��CvRN����W@C��v�|U�4H�H����>�xvn/�S�"�
�R�o��|�N���n(�,[(����x��6F�"�.���RF�03���^.�����)HC�����"��|�$
���-G@����90�������!}:���;PSUA�2fX�u?�1�o���b���PRTD��v�x�Wh8�r
r�����-��;���x:9����p8���0|���};�����BBajT���Q-��G�o������T����m3h��b��=���T�����B���
^����4l-���,�jIey��&}��X'=��{'������yd�2�*9��C5S������ $$%J�(�����Pp��$??��^QiPl��?��!�+#1�BTtN�]���dT(W�����c�H$�O@C�r
a�_��1��F���J�8�s
�r�kT�$��s?�BP�������;hff���5��Y
�e����
�y��L8Z���.���FD�'8X��Q�b����n�LI{�J+�����g9Ye�~���#(oX���BFJ'��G|b4Z�L���D���'����F��Kp��*��c�At����}�����Rh8��>�H=�=��	���@pT$������
v�����Sy+����-?_�&&�a�
h�%E���8T34E�����.��G��	edy>��5����=�B��6]0���w��m%��o��ZS�MD�u<��������(H�r��u�z�[{�����;S����*��	G�#����N1��B�P���n��*�=���1����x�j9�������n���r4,o����s�ai`�>E���EUL=�Z�k�J��|��(Y���uu�xTk1J���u��.�����P�~*�i^���?����������/������o����0��D1���>E�����q��;_�O_A���Xq�h�{D�J�0R���w�Zq���=�:o��$�^y���y���m0`�u���G'��y;���G�2�hQ�������1g�}T����l���_Q�Dm&\��3f��B;k5��jt��slV���uNe����?�<���j��a��F%�U}�"_�$bC�2���w#59l�gt==�K��N���0��L5������9�P�	��

[�����T�5����@.��;��P\���NkE%b��?Z����b�R��T�����y��!/�D�XO�^���{�WMJk���A���[��F5}U��uTn��!}��a�sCUT��X���CO�������c�:I\E���2t��c��;ng�J��?[|�	D�Em3%	y�d��|�O����+3[�����p�
e���5
y�����8Y�'vg�P@T���cT�T��\�~(�Y�G������5x>rE��c��Q������(k��1���=B�����l���*N]��jM���=���b�h���ns��B����l�H,�zc����1��y�L�v��� ))��.[�O�S�o�eY{��v��0��)C����E��BC��Sq�u'62���P\����H��}C�����A��o&*�����a�����C������j�_���wN`��U��6�uM1{E/tj9
��J����TF�k�����������������
��p��C�ONVC{-�
=�}�<�����N���P���"B E��������]K��4��5�4�mm"�Y����r^����>��������W����>�G�c��>�n�@��)�#�k(��z��e�,�x��m�^�{������T�	�����L�p���\Wh(����Z���L����6t�!�#�!��g��,�O�����h��_i�_�B�������
��n��g����1���k���g��F���}���\�����p���
J�
PUT���w���Q4�Rm�CQVcw,B�]�},��U�;�8�La���a�5b!fX�?���?=�$���^}��!���	J���r<*Y`|���@��h6'U�r����q&Z�4�s�����"�1�������
aqqXz��e�P��UJ�d�0���1��z�q�7�u������sn����5En?+�ASI�:�$�H�)�����Cpd��C���#E���|�$��R0�YC�}�����	��C���p�8���H1����C��^G��Vp(_�����J��\�!82���c�������i�@�N:xSZ6�{,=���;�p��S�';�edh\%�C���P�����|��+5�w�������~��A��hS�2���x�w�53�AQY�����������������+'��jE((��?�'��=@�*x�N�&�Y�����EeI������h�A
��|����D���)4C�&S!���X�+y^Z���w��\[�J00�K�A	�w[N���u����a�|��f=v#4�T�L����<���@�����_
n����vi�[��+����

�~�&�p��h����)��h����:%�`Z�	��o��G������d){�G�c��B�������b�p�����SF��C�������3��#�
��+���z&�s�{�����dz�H������(�o3f�
h`�<���0��WV��/����g�i����t�l^����G���-��9o7���?��T�kn����gb���L�������AQZ���&���'��p����[0�q����Z&5���C����jX�W�S�4����� ,��Vz�1�fo���:��\�t*�����e��1�34��q���~i)�C
1�V��qyu�������S7j&^X�v�>4��b����8����x���S�������[O�����W��A�>|����07������%�'�Q����H!:���'��A'�'�������4���$�go���'����s�AN<K�5$h^#
�����v��GS����K��|bWQ
����"u	��G�f���#W�@K~A_��ws�\WhH!�>�"m��\U��
�-�!|�4H�xN�nG�=��o���F�C��84M�����}=N�*�|�����`@Z1�v�[|4�hl�h��Oo ���?���uE��7\�ABI�o����/b�DJ�g�g�R������hL�-�3��@���\B"����;[���L�!%�+�h��~��������	��.Y� ���h��� �4V��6@4�]�5�kT�o�����U
��������	+��KW������
�A��1�����������h4��
�~�p�t
vsS�F�����k���������(�\	�[[!):���w}�q���B�q
!�$���n���+����,��b��{���

f�����^|AP�3$�%�,^���h_j�34����'N��^�
���*����3���V���SOx��GP7���5���U�8@�T�i�zs�i0u���Z��}C����������3�;�:�ZC��H�����c�Y��W������T����x��o�F����T@����5��O�������(N����8�����E=U4X��l�S��1���b�{����w��Co/<G�au�t�m�y���6�P:�P��
J��12����"�����2ShK�����iL��:���de��-9�-��>x"2)�-
`l�������Kp6�����%e4�(k�o��|>����G�`��c���������U�P1})��d;8���[{��F�����|iN�Es�1��ES2Uh��1���]�	��x�����@�q�&�n'��jh(*�����{��T�tB��~#����z�4���?=Ok5ahZ�:���C�\6�e��,YA�� 
"�)�3}%u7�TT�!?��#���ew��j��*�?�>y��]�`������%�\��Jeaaf�������
��h�cfa���)44s�����O��T��`W���h��%G���v�,�����������s4�5*��
eS_���e"�Fa����PWAu�(l�����(�h�� ���`�&�/q����x@����P��T��@NE��zYzM~w�4��Gh(��H�nMK���C������N/iS��>�h�~u��{�A�>x��,+6��S$+�ak�)�pe-�I
�S�t����<������������4��:m����v=���!D�bJf�����2d4�o���O���!"cB`_�3����w�����,\z������U?�<\��'\x�	I1h�z{	�C�0��Vl<���[����54��K�BBr���q�!T�F�6�R�Aa���+Z���g{��fc��x�EY
�����&-���0~t����R�s]N�����	�Ow���eW.��u�$+�A�r��W������=h����W����L��H��[W���~l�o3��p�(�E���SeZ�V�<�3XPRic IDAT�"�5�	h�_�lL-��eW���w�0��p��1
����j��O��P����XhnU�/��@�����w�t��-��& �@�n���cCV����84h:l�rz�x�)4-�g��F�w�	5e44�����ZqD�Ly�����|z}O�����J��&�A��nhF���o���Up�6��������0�-���6�O�F�����h�#Z@L��E��y�+t4�9l0n��oP
�]|�x�-6:Q��S�>��5��"��
�iAd���P88���S���R[b0�U��#�pta#����5cka������
	h/�sXv��q>���\|��d����X��#�� �yV��������<mD����0L�p�(�K�	hIy5i!�we},�M���Z8M0��8<��n3���0�iO��!��(�!���ha<�����N����A%�e���S�
�'��FE����bhj��`Fq���o(�
�1��7�����R�$�����f]}Cmr!(���R�B�?$ChM}g����W�EW����q7 �/>���@	-EiR���:���4$�����B�?����T?�8v=�Pv�0����$�����O�/L&E�M;�����fw)�Q��2t	8pj&^������nm�a��yh\�3�	�z���P�F�3O��y��H4C3���D��,,K�o�����'�M��^`X��x����xN��'	
X�#��!��'��U��|��ZD0�\gv��E���C�3nVn����������������p��Rt��%��r�m��^D��A�WkF��C�����z	<��C����`v������pzh��q��[>���i��S�
����� ����N2HK�(�c�A�U��c���L4�����J�k?v~#>�J�V����:��NU�9iT�X������g�[`p�yp�y!_>r{Ov��������@������X?�2f,���`]����W���d!%�^��Y��� ?wt���w�4��j��A�X����TQ
�z
����Z��+$}I�~��X��%���wE[�d~��pb�:�_?
f������p��<|c���Xxt3A_0�e�?��z�����i,��������	�L���s�[�8�~mk��^K���w.aj�A�����qU����8���e�'b����L0�:&�\�%�����1��y�'��*�1,'&����0�5� ������Z*��r�0�o��CP��'3������" ������u�9���A��y
y)Kc�/��u� 
7���=zZ������T��W\��J�9pdDt]�F��lW3���P���A���S����F����	��������
�a��w���Vo���}�y�V��/���:46�����<l�A���b �'e*��6���hbY���gxKdf�iN`�5��:�>���>4�
��6�����$p��8�h�)�������������I����'e4�U����,���Dk���^���gE(m�K�Jm%\<��5�1	����8�3*��h�Q
�7|��K��;��iI��E#v.M�H�A�6A��Y�K��lC����&]����~��@?o�����Q�\����M�Z�����T����w�e__�+k���`�Y���GGa�l&���	K��xxc�h���Ts����WV�k�{4�6]�M}S;�7G4A�j%���Vjc'���I�����:�9nl��
f�Zp�"��'^?9�/�^p(������d?���y��X4���ON���1/��W1�TR_�b��v	a�����WWI��	�tX�n���, f�&8����3,���n��=h�_��}LqY�6����3��h<��=�a���8��{7���C��������76<���Vqx���:�������6y���Nk���P,s��U7�!�k0vuX���7#�C3b��]h�$�e��c��8�A�j����!)��6z����c������1l�--�#V�������8�����������B#�CU��	�!<�;�U��A�8����B1��KB[��$A����r�`YZ�%$��X�����d�%��U�f���A?���.�N�����dL�$PBSV�R_'����v���IhUG��&�����S���'�����	�<�6�shH�}�d��P��	4>��qG���P�<
�De� �Ck94�����J��H!3�e;T����O����
!�@�����=� |��u��d�����.�������j$��{�
�����H�� ����#Pa���K��$���leC��H�M��"di��@����y�����LGJt8b�Un�� �eP�0	��lY�n��������4c������4T��������BqD���<g\��e�TC��^��B������2Th�T�Jx��*�gB�-(��t����[
���hp��Vh�/�7�u�K"6$�@%����y;k��z���q����G��l��0�g%=5y��l�p�x�_��q���l�\��$�[���S�7C�H������7`=���<
�����RD$z6&���&M�s"M��m����8���
��x�
Bxm����������qKg����N�=�hN���>`��
^���:K[����|�:?d@���&�<� �vrx������
4��i

i���������CP#x#:(Q�����,��p'�^���������A�C<6aY�^��@�������1L���T�8=;�I���l_f@�u��(kf������ec�yp�F������6"��+v�Fs���{���%vY�
{GASM=����-}���2�p��O${29Q�tT36��+����5�=���}����0��&��6f�?�J5���Gx�,J��0��L��N�0>CGA
G|��.���w���{��RSh���������*��h���h���V�A��H9������P<�����kk��c����5�1~Xo~��ea)���L����11X�h���r�k�PTL=��JJ	
D�W�*�����1l�����1�{@�(���p�VR~���-�:�jBi�X�y/��i-�YH���Q����o��8	4N�m%E�,���BCd�/^�9�A����AR�G��"h��+�Pp��o��D���L��!��3��+���4n�>���>��mC���Y
V�Y�������6d��=�}�h�fE�Q|qqz�����8�n�C5�t
����yZf4�i��N���
�/���L#��q-v^E"�������������3����p
v_c+X�:��2:a��H4�.�����ciX�=\�a��Z��^
V�f�W~�FZR��M�����*����}5u��n�u�n�a$F��E�&��Y�OJ��������1�������-�|���W/[c3|���eI:�h`�ns���C!�:����6��8H���� am�uj#���	h`�f�:�Q��9��8� RM���/F�_���Q��,�\�1�T��z�����hH�kf�*������l����P��Z��M=f���1��[�����q�6����8)+�A����!��{<<��m'��6�������VIc��n]�.�<p��Wh8��~�b����1��������S
��{��������-S��;����e����K��N��#8�6m���BN�^��h������|��zg����Y�|�� �h�~��W^�2�2��j�^��4���P���
�\mc54�Mw��|�|���������G��88�R%�	LH}����1�|R2{��HI��2����=�������BB�(�`s���S"�/��'���)�g!1�,(��������0@����Y�x��c�|�����t��� �s>�����M�1��
f�7�eXb������N����kv<P��'k�i�����SM�*��A�J�Cd<W�8�2��=�� KT:%h#-U�S�����4<H��Ai�W[��Y�	��/<��\08�a���Y�'�&���
l��C�atr��ob�Wo�O���E�E��b���HJ�;����Fp�#�	~��^�a��#\I���
R7�����/g^{i�7-���ER����+>����	A�7)|�i��i��i:���^�@���������mR0%�Q��)������
ie�V��R�5�8�Z�u��E�������xjG��"4,(h`��32���v��i�{���x��.}��t�O�&�
�9-�9�/�i�����m�Q;
�T�&������O��{��������)��"C�1��I~sK���p<�0m�6��1][������c��6�g6����������:6��,����{��N��+e�{�/E^��P�P�^OS���������_R�2>�e6T�������z��%�9�����vvD7���
h�`d�������fu�F���U��|,)q�~��I�iN�Q����~�1���q+��B
sKh���2):��j���c�|������l�H�WB���K�
�.'��tY�h<%��Wcj���a&�@����6����wI"Wxp�;������6^���m�����)9�������b=B2����g��!���h���&������JP��6��������s��`}-$+�A��w������]��GU��lAMst�
���������Y��0�a��#F�=����bb��T��F����4%����
�����]�u8�����oI��j��`�S#��|�
Iy�������#v���cE�����K
u���U��e�`���x����r��%4�2/	��=���<�U�;��m �������b�`�PzFp�F���D���]�>���,J������w���t����F��R���a�i/�R2�s9���p����,6�
�DQ�V���JUt�{�+x��Lz	I)Y�o�����I����3%����\���TrdP��*�;�:�B�9� n����
�����tj6�=����^�d��A
���j�I�� A��p
m�� ��@0���(�m�����[�*4�@�=��
V|�@X�u&��ccP��2mevU���(��������~�
����k�E9G\~����B�����6�����~����W�|>��0�p]���rB�����<�=:�Z�B��	f<,�#���Sx~H}��G�n�{RA�st������������F0���'���J�>2��-C�c�MLo�_���N�^��q�!��+<Ic�Mw8>��Y�|&�����E>���c4�H��]�A'&���H���LY
?����dh��CURX�K��5Ima��x�r��1	;����&�m}i���8�P����%��T<WRx�/����������� 	3 ����q��H
WT7Sm�v:
r��A�$��C�Z2}'h!��w�Z��
L�%9H����)��������%V�/*U��O�}�<��j��hL)S�{�C��lROx����\e!-%~x�R�b�h�!���)�S(�4G�;}�i,�DyU{�E�1:NN���x�%hU��Th�HbHYK���� �WiDJ!gY�juj5�����W@��$�A�3w4D�Y%�A@"��Y�����?�4&deY�"X�m�il�H�Y�9 �BN�����Kk�o~�����4Qe4]�a���$�jLj��
��@��w����<�	>��SV`@�����D���|�",���l����v���;��`�a=R|�
��aM�����%�C����:��
h` D��@B0��Bo[�G����h�!��6��d�pc'R��Eex�J�������~��&WqH�/�W5��
4�]c��"��B�����(��
�He���G?�&Gh���f��>��}R��hH�q�:fdKI<�z��kh`>�T����_�%�� N��h`��C�n���G�3�CuC����5��~�kZ��Y��f������`�0�!r��
����0&I1n|�=��G1{U[�w��4��8��Ci������|s/::O����Q����l,La����Rf@�$
���5D=#l����o���t����e`]��o��[��}�'����x�}R��V��B3Rc`���\Y�u����x�q�A���/��
\vt�.F��v���n7�%#t�)��t���3�0`�,������P�fU<q6U*������4���v5*���Qz~�d^�y��gN7�Zf����.�������$n�����
.oa�/�g4Az����e.�����@��#(e�/�6C]�J������m���W���
q�_I����
��~f�
40ui
���Z�NF�>�����
h�R�1�=���:�)-�T'�L4���v�i�}vh���S�&�L���]�	�_?�������e�
h�/����z�P�~�R%��
�B��M\���yK���d�������L�ap���x�?*S�	�����DR�x�w��w�m���n�E��$�LPC�Z3�J��G��DY��M��X����C=��r
l�y����a��t�a��S�cKo
�8��1-�+s	������3Shxh'����K���:�/O���H��������G�`B������a��Y�&�=U54�QX,q����j&��|����0t��tH�B��j6�!!���o��h����`�W�&u��R�
�=wN���Uh�v8Z��Fsu}Z�Q"�l���N��r���5e4Tt���n;Q��8|~�=���M��I=Z�)�K���wv[��a�+r��)^����.���C!##��	~`�'��.�Xu�	Wj��&Wh�z�%I�j#��0u�~-��i����
.���Aqe�>��+At�r���18����7�a�(;��Bc��L�A���A�T�B���p,'`)�!
4��0��8)^X����g�����}F��>����Q �P���W�r���3��i��)Y4����Sh��!�Td�"ShA��~d E-�T��� hu���av��{�@�}^A�XQ���`�A�(D��\0��A����V����|]_�����<��
/	�`a�:�8�)��PRvHS��400Xc9�cf#S�p4��=a���n��)J0���L��W��W[��M��-�Shp%��:y�m�S}�����E�F���(��t�A���i������L	�i�n�N���7�M{g��2ShX=�W`j�t:�{s���M����
\�CB��<�CLea��E����m��*k�4�E�3�����M�mh����
<�w��Y&�I�.\�����E�sn�����:C}s�%���yu
��Z��
L� �d�3�@�
�`�cH��K0`njMa-��b���{~Ra`*,��i��`>6�q��a@
��X�#�x��n��k���g0jVs��a j�p&hb=��X:�$��k��4��
�_m�h�N�����1� ��a
�I�4fB�S����]��i�;��@��H��:
h`

^!14:�
v)%z���ro�L����Qlv9D�	�il��e	����?�b��Xt�"����3����B��_�6d��p~���7�(���l�C

Go�`P�N��SS6`����a� ���������� 4h*��4t���+C|
����7p5��p�4��i�2�A��;������O!�#P���51�}g�Ny���I
��Lzx�v��?���X�&��Y
P�'5���l���+*�
���+)4��,t����hoS;��F)h����@
\l��@�X�������v�&������BH(���&�)E�������T'����vd�	���pB��@�	� IDAT��_����Y���O];�1@�;�Xt!Q��p��c<�����������mP'P�}><��La""�R�~�&WTHt��P��.������H���"<��(����d�$79���O�C�q:���}��D��6����s��7�r�x�k��C
,�L�AI�t���������
���0��7r���&r����m/<��q1�0�j��N���}�CIM^77��Aa�h�����\� ���.��`B�)�����6=x(�����Y|�L���9�/��9��f�_;1��u��{�x�������Q��xy_<u��;�U�	]%mT�+7_w0�0����kV����B���m���9
�����gThn��n��0�w��9\���$T��K�A����j{\zuc���7�Q�T��S��N�	l������6�B��xh��dSmH7��5
�����y�&�2�A���;H��5����~��M%�����(��Z��O/�$�%����}1�����)4��LB���p�Q�#H@�R /
h8p)�H�A���HAE3	�x�'���F�)4�=���e���N����CV�������I�e%Ej�h� ���Z"��["�KCCU���`��
4|���+4X����s	hU7��(�����6"�,IU5�hH&h2��+Wh`�p��ur���k�M��	Y]��_���\A��<��BCJ�?R��w����#�B�U��B��5�)A|'���'�
*�& ����H"�6��m���@��Y(9t���+4T�
iRh�kP'�"�lP�2�H5���Pl�����1����8(�Djd�(d�B�&\U�AA����`��nC��5�a"�6��v��d
M�B/T�o��z+��p,�����z��9����C$0�4�@���I��A
oN?�� ���q��H��#kG��q)4�N+�4��P�s5��z���1������1��N��U-�������5
����>������F���T��r�^Q�o4�c�2�@d��l��������SW���;�h��7�H!!�Bv��b��jcS��)4<�r�'��&���8�2�p�$!<��k�����1� �sk�7�������N0�gR�`�1r;e40@��i,|�������:�����b)4�~	CE-���m�j������($�ZKh�G��K��V�IJX�a���~x
��9H��l;����r�B���� '��AQRf@CC3�jH�j�;B��K��s=t�V3��CK��q��/����4yy�������QV��(lV�0�z�B�:��:Ga��X�?���	@�(w?��@C!X�XN@���2����ky��VMp��T�.3C��^t:�����������0r@7��}���`�j�*%������h�$E���P�lZ����e�Q�hR:��k����������z��yT������-t�
4x$��O"�,�X���h����H���_��e�M�h[y�{*%�+��{k?">�����DR�W<�E
=�P,���P��(�Y�����{�4\�!����n��2�:�!c�s��_����@\pa��������4�:���H:�(]��������w����^��Q�N�����n�@+�t��y�Z�cX���\��,/�7��SY��s-������������
��Q�l��s�
h�S������2��u+�L�5���eo����s�
�����t�65�X\:UEx����Q8U
����+)��O����%��^���h�x�,�D~l0��`���4�~�W'��a\���icZ�J�����3^aV@��{t�S WS�1����4xa���|����5n��bX�P`�
Lv�stWcheYk���cd8�)$��vq
?Q	��^����4��������i�t�������vy��0�(�����t����K`�3������P9��C����`������x��~Op��{:�����|�D����<��t�y����O4��8���s����RV�l
C��$�
5K�;)34����ly|�9g6���$|)^(��u��>�c�,��L�6~��!
"b������������k���vww`����"Hw7|�,� �������^��z�������y��.V_���5��rE^y����7����
����~Y[���xpx>j����P�To3f;\��E�:��@=�^����/��N���}X6��B����$������	4t#���d�@�����9�t����7��}2w��V� ��L����A|$u��t{:�6TX���>����]��}�J��_���&��g^3�^�J9�!�!�d����!I[���P��	��R�����pf
c9�}���\Ub���$�G��������
��}zCs��F\R*V=��X��u`O�����nS���ed^#�m �
��x�k*r�!qX����0��B'4�	hH�Vfv����C}f�!C�`Ek+l' ��I#R�H�p�b`*?
���W������O��a������N6Nd�T$�)�l~t��/�)�`P{g�}'�2�Ae��h��
5{3
��RFX\2�
��'0��S��B�aMj]+�s�x�H�!��N+�-�?�!e
S�?��(��=�)�����,R��9�o���t��
����jo���(�������� s&,-�4Au���6���D�y�FT���`�X��a�t�V��	4X���~]�R~e�l�>�i����_`���C[=��fjH)���0"���� vh�@-
}o����0�f��)"03_�_�n�Iu/�U<%��?+4|'S���&E_��d����H�a.VmK�����j�A��t�?ef(i��a�^A��M7�:���-^|����~��+������n�[�Y��Vi0��:��ge�c-���7����)#��0�VVV�D2��*�-�B�x2��~��P��H"�l��i�>jc����iMR��k:���-H�B�6���G�]2?�Jr��22�Uh�~��/y�q&���2��ak�M�P���&���A7[��J�L�!hB���A�|"r���9
�C�A�
���q����zM�L�A����[�8"��S�8a������z����f���Dh6���1O�����_�����r`gY���g��
�:��YT�����O�&��sp�k�G6 6!}���6�i��)%�s�7aQ����I	f~b���|����;6\������X��	�^��8�1Qx��=n����

���/A�4���Y���u���x��DN����~��e��E(��mV�>��:�)��`��t���\v

�t����$��R�����f
��^��	�hPG����'���g[�G�A��h�X���Q�]O/Z�������
&/S9`p��:�tz�	4�8�:����*�Q����d��3f��	����_wCh0��g~��/R�0%�Cw�C��haS��%�-�]�-=��c&%6��a;`Z{R�PU���W\��q���G�a���X�������>{��������+|0`A�`
M��}Ro`*��Z�/�-d�����>�?� ���W{���I-";��B���=5�iy|wO����L������T�dH�;���]R���.W�:�&"��2�}()H�
-�%CKWG6���
b�SaE�����a[5����63�(@�4�k�m��S"p"��,��2��rU;��|>�d��m�xxq~fm��Bx�Wh�����7#���u]M�j�[��r���H�8���� w8���=7����1�Df:Z 99nt`��N���W���87��k:(�3��C�dFb)�o� ��R
`�r�*<��/����u3XU��>F<�I��D��P�U� ���K ��J���p�0���[%�Q\����>�������
���"2��D�L����C��h���5���w�`8)"�������};��B��%�0s���q����^���33lm����od*"l��k	R�!3-I�!��=��<�8��4T�w�f���AE,��M-���%]��
Li"����d��CXj�a
��������\o��:T5���i��u���)3�����HLl8^t(�T&��E���4�r��gGQ��MF�?��������@��e	|�M�~�����=��UdAg�e����shH���}_�B���r!1��)70g�%�y���4Z����D<�vS�Mg�|�!}�LZ(�����4����4������	�J��/�	�p��Bk*��w*�W��������~:�,DQhH!3e�4�bN��i��4���o����LA��0�\�5�e�c@SH�!����H�}*���
-���M;��V"��`j*_&��&�yv=��C

Gy��*��%�5�B�F��z`0����2��d�����~!�
�4�cq���S�` F��{|n���+d�Luu��H�q���C2�U����f4���G���J�:]�`��S�����I�KJQrdR������Ph0iR�C��{K�"<C2�2A�L:�yW�G:���������P�me^���4S!`*���B�G)<;���^��*�j�q�����}��`E��.��MV0"�T���������s?i��T1��;�!7���E�9������t�������LJ0���S[�ZRCyH0���������7Xu�F����fVB^]�j�<�Y���F�9�9"���n�^��
G����$?���+��������;Zn���iZ����Z�����7>�Z���N���.�g������@-R�������S�`�.���-6�BV��`
,����e[�����`i2��{V�yu�
~�d��*����zX4��w�]� ,1����+u����S5]������:����p��
�d�P�L;��������=2!4���|,u�p��{{2�����O��5R��\�����t�0f�zC�<���Th����#��i-��5��p�4Fdu�
&�����G>�y���w2�vN��g����.������F�lp��=�n�SN�����p��M��Y%��6�vO�x+h�����o ���h�zd����sSYh�|���+L�0j��du���VQ�����
������5�kW�5c��]���%*��_\\<6�9B7`�2��SqP�pv@���O]�`��]�i1�B���9����g����3r:������}�l�.-l���?������&2:'IBII�����pF�Vu!��\�
�>��@���������4�V�r�������$��h�D�E�������$��	h�D�����I�#7��H�������<�(��j�A���Q��%v�6VG}U�8QNy�T�D$�^Q����D~����B�B7�������W�0?���YMN�7��>'��0���Py(�4����kz�
y�K�p�������jrBRy�h�T���G�!�i��YMNf�~4f>
:��&'��;2���������h'���W��$?��y�jr"���J�Hi:PL��:��F�y�J@C�.��2 ��dO�@�$�3�z���w�<��Ot���jrB��`��
�\f��
��nvid4T^r
"=h(�R���P�����r!�J^	@C�yg� 
��s��V5Y���%��4�V���o9	@�.
���q�U�l|�'���dV�)=l&S%~����%��A�%*z|����q��A�d�=<���y�l����t�� n����4�^v� zY���4���JNh(�w%	��)7�����q��9<�t+��@�XU�{�{}�LP��R
Si92d�1/N�[j���EUf����A*)J�	@�x%*
��W^|@C^J���@�4|-RJ �% 
�,�B.
� 
���()A��p�;��	

y-9���v�A�B�(m

�[/�% (4�w�5g�P2�S�\


%��I:��E�A��������
y�'F
�d�x�+A���m���������+MN��4�w�YKh	@C�yq� 
�P��U
�����4����'
���B�:P|J@����]N��d�'h(y�� s,
Y���[���j��)	@CQ�~�K[���j�4�U�Y�qqq����"{B�B	�Z9
H�A����F���HEsx�X�9���,��~��RRRCC�<�]R
@C����&,L�jd��
������TDEEACC�J��x��(��d<���#�����]JJ*������ �*�����!��s���b�����o�KN/P�NJJBBBTUIrQD�!#
��H}��-D�����u}��TL
�������999Q��?�'/��$>�,����?Y���V*y.���Ya�o9�XC;"o��x�`�����5�n�&?�uXq�7;�20�Q(�l�MHELR���-��.�!"5U�'g�,N���R ��{'�SH����]2�},I��x)��
�M�����V���|�S�&bRv��[�����VT��|��S����������{a?gN������m���$UV_e<���+��\��1b%o�$��j�`
��B��I�JC����^����h�x��&B)��6i�%���}a�/�!�@�,���b�4��Z�
�*�V���\��{&����E���Z�Ya�V`�(���y��4�o������	d���d����W��<�	����_Q���0�+}�]��	�9A�?_S��4�o�u>WZ�_X�,��.
%�K2[\J@����=�x��,��x���E5����-�u�$
�+iW8�9�TJ��&��J��V���0�+}�]���N���|N���>����!��J��&��J��&��������	��p��o�ww������4B	��HKK�rOJJJ�*F�2�����s����d���J�sf�W&[�\i�#�T}/������m��<{q�Jk}g��������R�����8m������ ���\�K��V��{A���:�����q�]��������_Z�{i��e�+����_!����?'j�Z���6�+�5DQ�Ci���\���u=�H_������y|+��9I�����E�GQ�wA�A��#�J K	

%�:�@����*��
D�`rB25�d�RZ�;{;�u|+
I���J�
��Z�Y�+�7>Js}g����o���g@,11�{����o������Y�K��&������2�V>J��&��J��&�wa?�0�Vh(�R���+h(9�TX0	��S[%�Sa)L %S�JF,�����s�@�l.���Y2�,��]J��EJ�$�0��s�1KN,��\����\����t�o�uN���[����������	hHKIDb�W�r����d�<����-�_���	��`*���Xx��^������BWWW����7RR��l���D2 f$AAA���)�fVR���].Z�'N��n�1�������1�R�<���s�ZBB��uMM�\�z+%!)������H�$�%h���Z�e�� ����t�c���p(++s�J�8i)(��^�D��(��S�2���q���*�$~�[��[^2/�$�4����_q�{�R�_��$���/�,��������D�d�=_����b���>(��@R�HE�D���x+�=*M�����g|�WV��9�����3Z�]'R�q��^�{)��R��99s%i|�d����(�B^�p��>Wj�)RS�n�4�������q�R�����KQQK��#�����y�d���a|+�
��|.QV�
%w���Lc|�-E�{v�]ZJ
2*�woUOJ*�r�.��������$��!,.��
�� #���4����y�.
y*6!Pi/�����Ho|�:>_��#v�y�m�p\�
�Y�����A����J)��7^=����%S�Gq��#���M��/��I1FA
#
�L�%0�V�p��k��� IDAT��G��(����"����� ���@��o���A�i~c)��U-tQ�o����(��Q����B1�Q�d�L3{�},��Jh*
a���I	�}��������c|�s���ky)J@r%�X�5�}��\��S����V)��$f:UG������~�3y,���t���-t� (�]�~��'�*�,&hFb}�V�F�?�,x+�-\�COJ���)���^u0M5�xgR��DJ@C]	JU����2����.�B+�H<�Rp�i��FsBS+�h���[��*�IXh(��)��?]�Pr^���P<��������4����Ar�Qh�\}b1	@�d��)6h��������Rr% 
�+���4���s^��d�����4fi~Z�P�e^T)
@CQ�|��
@�d��`rB09!��$�"�@��4`�J8jh���
�U��!<&��U� �������a�������Y�����������X�2<����+&6m���N�5��P��"O�I2�����ga�"I�����$C��xfHbO�@��6dM����1{�C���5�������Pd&r\�h�04C�����
��Zxyv��e��GI
J�z0��?������x;q�Xy4�d9MUx�!V��fC�"!0�E��(���Gw�?���:T����:b=�����$V���\�M}Y=����6����X��y��'`A
�/���u��}*>�=����)!tYx
gv�1��+i����g���mh����
;?����S�����W�0F�*�py�E�|d
 i�A�H�;k �K�5d���x��g���||?KFm�Q����l�����M�������$Vh0�<�'~��H$kxeMc�Uw�����C��=�9.����Q��r8��vs���
Ti3#Oe]�Y��Z�@C�����B���q��}|��?��9=����j�]o�cu��u��X�^FY�j4��G��
������V��7�WU��'~_�_F I
6s��������O�;_��`�����*����������%V�������?� V���TE`D��������!6^~��X��I
��$BIY
���n'��������$)4,��O���i�y�
���HG�zw��-;�
�����9�7������5����h�y#��$��5��1���\�� ���C������_"��?�|d�`zp(��}]�5���&4��!x���P�h0��D���w�ASE	�>�q�u�����;oj!�Gw������L��\?�Sv�m�+����$��6e�hn{c3\�p�{X�es$����'��X�A�#����pX ��p�|Q��ho�E�p�x�qJ+g��P�����`��a�mn�s�jUC�j�����
�0w��\k����`���8�u7�>���������-�z��p��'�_�����40�����.���>
)����N
4kXG���KY	@C�y����4���a�������6y%
4$&'c��;���5�?^�@��70�E�e=�y���	�qq�Z���!�.i�!��7�{� �MD�
��c��-�ME�*J+�P��hx�ym�b4�o�0g7$�D�j�a������!6�Z�@�G�@|�
D�*���D�@�@���<[��;f��
�h���G�������+���p�8kx������%��I~�/�����W��5��Q��~������/.�h���!^/���z��n�J-&8G����wM�*�2��1�B&���J^�Z���5FI
k������G�4�I�`f��X��v�X�@��z���*�RS���%4H�K��;����6-6@��f�x��GM\�
��2X���8rO�w&I����X�������K%� /+�C`��p~��"����{�#)Y��,)�����M*��K�&�$
4H�������l(j�Ak`}������b�Q@�@zS[�o��<������a�����,�h9�P���,M��m�<������c��<�/��������bB�z�h���
7��_��4E�+�4��
K����i�x�X����jcP�������G�0�g�\�N^����QL;��iX�~�O
YL3�rr���8�vh���\Na�l��1CzAEY	��o����yx�	%�S	�
4���b��8������<����Z�;b'��w2�gWVC�ZAFZ
��������=��z����zJJ
ahh�k��k��x
C[�E���x���}f�f������
E%8��
iii,:����F-���g�<@�M��{PD�di�/,���`j����&�|����.�5�0r�D���T�4���b
�	�����4k��I��
b�{��R	���1L45���W����*V��c�P�L|
����Q��{�<���`j������/�y��3�(��T���Wh��!V����;���,H��L"���~~����A=#

Lh�g����o��,/-ee�������D�f����:��H�>cV�V<_�>�����������x��~�ll�F�y�)���?�n\�}��ZZ���=z�T��~4${� �V �
(�/���D$<�\%5(4�SS`N�@�m�������P�n����j
�t+GN
*�L�H�C��p�%�@��	�u�{�i���R�)�1A�Y_����<��J�%{q'�Or*WmPl���
_(M$��ScH��!��H)K#�7��-�BC�?(4���v��@Fyd4(���� ��)#��m�H	I����H���9��2��(����%����MY���=�0�Kc���������]��8>�"������Z=��;�������A��� B�����h=%��P��g<:���4.�5�[t�M�H��B2���WL�����y5<?�_��)o�Sh�������������O��=���D�7?����<�k��g�@ZR2l7N���F:��}*���
����+/XM�Y5%|�s�w_��k#���)zo���F�r�_�(t�T���{P~F/(���2�������S�>P�h���v"���Y92����R���w$��p��j���hN��p���~�#����^Y�+^sh�C�
hP����8����X��kIt� ���6pr�$w�%%aF�FPQ���������z5��������oR��~����]��������o�@C
q�X��5Og�
'�+*P��U�m�B��.p�V��+),�r���E}Y#�
�u�!%-z�wl��x�������N����q\n@C���`j��Gy{�T��9��Ft����}P��D����9F�w`n���*p|�
rJ�PPQ���xc?��n��] G~�����E�!���|����&0���K����]x|h)��N�i��d���>��~E+��QA>PT���5���$����)4T��&�y�w��G���F�����C^^���#K�������s�����=���K���-��x�h�}_�V�Q��������W���L���C����x�t!.�	�u<^-KXUt��<��
��Q����nd��[�2F�P�~"����Wg��q�h������/g�
��!4��������P���
��w"�k�������������eV�V�����~���_�8:��[����:�i}�������g.�1�TW���h����=�h��B=��'�+4�pP��{���B��e #+�O	�w@�M9)4T��C�*�!C�z����6��ycxGFa�Sz���I���E�^��L�����G�����a�����F#x��"%��(S�1d��|���Yjgj�������Bs���'?Jxsi	�G���6�F���]`
�����n���Ul6�����Ct�'jv]�XJ_^Y.�'C��W���������zh�e���	5�������Fxsq��"Xa�Gi��x��Y�����@��r����:A��&>��v����!!6��fxvjjw_���@��_�2�0���Bs���V!5%�:,�q�����Tu,�3����|�3cqUn��hj3������f*5���'�De���`?p7��~.��� ��;��Y���n�������NY�58l����o��4j��+��g��o���b`�pr}�;��`R����c���6�[����u����W��&Q��2���c��[p�^L�A�.�0�!��%}�8��|��J��n/!'�6��U�4�D��������'�y�����k��&���>s��[��Gc+��*�����z0\C�`���]���6��Um�r�z|�\��<�4�1�jC�^�����\�a����Mi�r:��F����������7`�g��MU�����7��|M�/69��1\�ACA	C�4�z����2Z��!q�����r�+�u)��=[��2]u�����K_��/()���'dI��L3#�wK�m�[�z�@��!����7���M��aP�T���{"R�rSh��9�_}�������|����m�������.��&?����$�;������!�7k
�0�xf�K�NS:����<���p������I9��)��������s���4�l����x#m5��������[ZK���N���Tg�R��4q��c

�����O��wq]N@���d<z����is������DXZ�����D��OL����bh�|H��i��kW�������4X��E��
psM����H���}GehjJ����h��Z5^��NG�x��6�u���[rg4#�>xk�y`��UC�{W�X8��?��`�����@���������#'h�$��N��~��g\Z4��C<Q���O�������*���~e
�o��Jf&�����!����^?�B�����z� ]���U�c��|�f��#�mm�.��h��
��`�y��l��E��#��E�B���{���"�s����M,�0���\��g������I�2��@��������s/m�6��i����+���5�
�}�=�/�����,t'6���"��B�_tF7�s
.����&���( ��;4��2���y��G\���"�;V���<�^Djt<��k��O���N�
C��xco�IW������/��8#�[0���@�o8d4i^3�(*rE���!P�Hs�~{x8����7�4��V���
������^�|Y]�Ni�����y��j�C{���2Uu��P�m�@�G���rDJX��u�3�R��r-�y��7��v�|�l�������	��- s\��~my�~��t���aDL�u���K}��q������\����wiF�E{o9��;������t�Y�.�3���u���G ���aI�v��r�����W���A�f*��c��K����!�H�$�L�`��G�B����q��s��F�0�������\~��_~`j�&(Kyb���CW� '��;@�����y;��!�������C:�9(Q�|��[^.������_q��+�96������G���l@{h�)# ,
���w5�ScT0��{�Sv��{}�r9
�*TFCc��_�����	�ZW����|�h�Q�~����co�(�wv���	����
=��������>���9,�C�.��z�~"���N�!,&[����HFC��hY�f�=��+o��~E8�?'��I����T�V���[qeL�-����U�y�N��\���~E��3w\����#��m0��n�w]��r��f�p��.�o���)��-fa��&�'�!0*U:��u�^��

V�
h�^��x���pxy&�������J_{�����#J���4��~�������+��M�q�����'��P�ME+l�}���I�?��hp��l#TUT������&Sh�x��Cj��>�>�X�������8J�4��/O���O�%K�4e.C-����6F�55�a�A���4q�]��[�q0�����kW��)-Z'�@% *���kMt���^.IhP1����@�D��x�N���P��o�_	@��/L�7�pf�b���V�F���Q�:����xJ��s���q�<T1/�
&�8��	+�����h�/����h�&��� #p��.z6j�������9h=�:�����}%R�;�!��s/^���]q��g~����	��o5cc�;q��P�=(����T���@�j��4��!�aC��� �L�����lkKv7��V-�A��a7�!X��Z5�
}�/,F�`��������C�|��1�n]�!�-�����[��	�}4\z����ef���0z����7o�'�=��9�P,ttx�(���Oca������h���LXd(4,�zC)�e��x�$���-Rgx����9eH*"-"�IH
M�PA�C�<T��Bm-�]�'�A�.�����\54d��=F�@�x�A��&�
������O0�{� �%2F�H|
)u2Y����g��i=�@�C���V�f�Y"�5
iaIH�y�4��u����%��d{�T��U�
�*!�C�<"!��D E,�g�"h��Hq�4�������6AQ��6.?s��.o��e�����?����
5=�q��6�V���~��i ������h:j�v�37Q�eW��^���2&xzd����3{��S��'j�������E������5�U����L������t^Y�
�0�
���r(!��)q	0��_�>���J
��a���2����A|�Zvt''�9�'\z,���T�M�F����s���T������3{#��X����}�@�Yu�N���0��
f�B����=@�@������5x�G�CWR0�����u�c��{f_��!e��^bT�������z-sc*��P���2)\���	�����5n��of�>K�6cZW*������S���4���-*����	}j����"�^����VXs�!Vwu��{O���~��hKq�:{3Z5�6A���;a^������'g,�������b�Aa�m�����u�����>��h!$&�L��>s:�?��C���3�P��px�mW?7��.'� 6<��M����h<t	�]��8hpr����p��Ht������B����s��I�
�G�Q��,8�X�����������\B�+���NJ'-�o���y-�����`�|O~y#R���;��S���yi4i�&&��5���\��s�=8|t�+t`w��\���6r����~F@EU��wI��"������Y��.�`dZI�1pw����&r��)M�/�_>��tvs������� u2%��y��y��C���
�<��h���k
���e�A�Ov��J��x����^��/q�BT�;���8]x��u�G��e���.�3���j �`^]��w}{0���dP���!h�4��B�9e��D�u)�$�'6%P���P������a�N��S��UD'���,.�
D��t`M."0r�	�N�Ark!�����Qtp�18_��E���_t�����w��1�����_��E������7>o �Tjt^�M9$���u������6��
40H ��5��	s�nt�&U�M}I��L����U:����ci�|A�*>p�C_����dr���e�m?�G'�7��^�|�'�`�c���p�`�t`\���vr��r���,39����6���e ;��8Ac9��N��>��}3,j�������K���o����{�%�bR�x���_�e��~&���Vl��"��$���1+��\�"�1�A^E���#�������Qy�EP�<T�~.����Q9�r0��n8�����+K)�!��~/R���%���
�24W
EuK�����K�@k��N��J&�w����h�|BC���#.<{�g_�qf�\t]��h�r��Ct�c��R���Z[�{FkZ����D=H�	hP�W����1��47����nk9�nB���cn��VXj����{�����#��_;q IDAT����q�S�V���X��:���s�0��}|��6
���S0���g�_b�]K0����n�+*4=�[�����k�s��XU�><�T���f0F|g�g�ff9�����c"�<��
Z����s���1O�E���d4�����F{8w�a���A�������/�Q�@<x�5�Z^��`��>�{�d���i����������f�3�������u�a�%��V/��s��Q;����6�6���8���7���`&#�\{���=a����w%�
��#�.F��;�eu��phRg���<��R�Z����q���{o����Q�jp�S:��CWo8�(�����������/���
������+(�
R^�^p���B~.�������`b"==iDG��J`b4R��3�h�L�j�p���-���e4R����@Ce9���`�����/a[M���J����������	�#�G�
��S�p�&��
r�
h��9��)��{�Zt�[�\�ca�����O�>���Y���J�;1��c�y�C�c�������t_�e�41�[g����IC�1z��!�r�*���r�,i-�`����Q������'��/g���xV�6f����`N@���/���s�i�r\&x���e�C�C�:59�����9����s�������k��yU�\q�+�����81d
���hC�Gi�EW��s�f��	7�CVv�������\n@�)����OA�B����TQ�> �T�wA��;H!H@gLS�}���#x�-8�u�=�^z�0��H��F���<��l��Fe������8\� �f�sRU����*����="!���X|	e���1��7���,_,,�,����{ G��z�*�v�
2:*?���RI���<F�� ��o�1p"��� ���$��L��������o`��/2
h`@��o>p#��@S
�!�.���6���4���cf��Xw�L�4	d����8�`L��t@;�?|N����@p�Nc��=v�|�����r�����Q
#0�a����nO
��O<|����c���86s ��9��U��R�uh*��	8��-.� �"���k�R�s����s���}0��}���R���k�g����
<	��W�k�p���.����@��k������� ����d2����#,���?!�(����Jf.v������}����������2&�Y�#�_b����~�1����������9
�[���w`���@��Ls+CU5|���"������=���v���9���FA
��}9�p������#F_����+����`f)��D�Eq�\�=�{�7�_o�|qB�
-1��,����L|9�0��T%X�Z�j9l��S[�E���m�����������`G�~�3�����=�b��	X�m#���+��C_�<��7�rXH{�8��0&����w������U�Zv���1��x ��@C������_�$)x�`�P@s�H^��i���8�c��� ����0��L	tS���/i�rx�n�q��v��k�P�6+XY�mf~��=;���i��u�|��2�������w��+��q�Q��n
��$��������������]^�O�v�����@[KujTE�N�s
��%f�O�y��
3T��N�	%�S	�
4�E�%Z(}
HA{F���Z�Y�-y�iiM�������������_�G���z��sL�����`�������s�h�<������/m��B�U��O�S"e�������('���3�����H~�m:�D7�������s�4���i����E;����=��Bc++:$��:�:S)`��Z�2\<�	F����wr&'���8q�<J� U8l"�+;w�7������#G�������
)�$�B�JWF�[d0����:`!���7\]9����u����
���#v?~;SS�������aY��t�+P�D���M"`��(2��B��
�+��s�Ri�0�
�+LN�B["���f�����Y+U�Y����$s}���4��$C��.���"�R��n���S gC�it�	r ���c�c�I���Z�Cq��Bf#�T	r �By�)b�zAmr9$}�D�O<�I��<��$�"f�w(u3�}R����Hts,���iMyh����&"����5'�m�y/~i_�}��P�L������0l���j��No��M�"���eM4�na*������t���qa�h�~:9����[���7�Bn!��G4(�k�M��t�4?�9�m���g,?��!����q"��w@�#�:B���v^��	���r��U�Y�<�g2�a0A��W�&���~���v�
�;����n�H���9�Pc�4��<3�N�����O>��>h��LC?�|����
�����.p��'���4�[q��lH[$�Ih�L��R,0�T��m�������������$�3�R��3��0��C��t�@SO_�J
oI������P��!t3��	�86K�}���Cg�@���i����g����"�����H]�>����O-v>|�:&x��j�q�b�������Ox$)���K��h����M2�A��buX���(C�s5c�^�~sh};��?-R�"O�
�t��F���xr����2�Ht���������,85�'��J�����D�9���a��t��	m��|�nl���|x�����.AAY
WV�N����T���$,�G�"�a6nm����f��� �q�@P��`:`�����Q��T��;��0O8t^����f&%+K��l��L�3L?03m�l��ScaC�:z�9�p��"X�o?�W��*�{�������I<��C����xB��$
t�����`��������6��x�����n�:C���C��s�!#�+|����N�
8y���9Z���Ax7v���v�pd�Z��!�q�x���T�A�p{?���!��'��r�<��q���mz^�@L
D/.G���n��w��q�>*6P!��<��C�aQ]	1a)�8B�����?�4h�9�8���M

��lL��X���:�[]���Nj��=&���v����3��m���I\��9��6���rz=�j�^��\IA���H!��!T	0�z�`��a��G�����I� �n��E��'#��7�fB���1�	���"�a<����;�g�N�j:���F6���
�cx�Z�V�����`���(E�+��q6���5}�My��Bj����j������h>�,���d�&2�<�C9�A�4�Lc�������LaU WK�����B�c@����1GR��|F�N�K�
�/N�4��^���~�<o2rJ����J@��qxX��S�@�����nO�4g�	LaAKE�IY����e=�i�����p(�
G���^84q:�m�������.��sE}�[����O���4��43���e�����|{�	(��\��`�����f�M��+\��2LN�S}Y��&��n�5�*���7K1�&m���P�I�2�����n�0��~�����H�����$%�H}������?f���J��<���p��2�aA����e������0�x��/����d����	�V�0�d�[>�9��+4x����o�,��>���W��A�6s����/y�&'��Z[�e��s��e,7��)tkQU�����D �����{�a��-��/d8������P4d��omL����������� l�@��rf�`����\��3:��uz8�	�=��MHy��cW�!���-q��;���@��M��a_�}��\Rr`i���40�+�&�����Rh�8
��(���h���YR�p����C'%I��,����h���o�d|x����4XY��f-�����H0EMGu���X|�6(+u{j�����X��
�O��5��Q}\}�'hle

LI���?��:}V�{X��N��{����09�nq��6�W���V�Q�T����{c���3�1#m\�k>�����-;������M|���J�t�a��;8=o&��������m���{��h�8zOCTH+���h���n�}7�����g����^�>�f��luZ+T���2��ejC�s}!��Kn@��0��D�PRO��m2�H��"�r��H�[I)�A������&'Lv�_RRP�3�Z����VF��;duU9��-��O�����;�k0����Kq|�!Mi���	0����3�)|F��$�+<���
Ci$|H4�~�tH����3�	�"X�u=������Y\,�����D����������`��W\+p�A��&���"��u��qPwv��D
La���x���Yv���.�.0�
�*J8x�9&v�������p�lS��kY�;+l��o��������TN��j�RD(]��'���?l����`@Ce�2P$��O��*����HE�:@Z\����><LP&U��c�c�MgT's���0� ��S�0�@[sC�����8d�kP�,jZ�r�CZ���"��f<���}OJ;�<?c���PDW{[\���5����)�,�3�]�g��MD�<s�k����-~DEb��WhbfuZ����Z�����i���R�|�&X����ih`�
���'���1�2hU�4i������WE4���hH�y����h��k�D%�*�uj<Vv��W^���LK��������B����#��Z��xM~]����]oq��:�
h�����������k2�p�|�v�
)N"����K������Qh_��}{��6�QF�k���?;��up?
l��I���p�l8��s_#
@�4�(���di��x����K0�\FOt�>n0Vm�������`��jfb�������-+���m�����ThpaN�6���G-�L�Pc��2��j%A�����b

����m�����uk]���0�8D0D[� �T]���O��5I�
N(��J@T����lti@Xs!�{��Z�Y��v&x������e����oKU~-^h(�@�H��I����@�����/O������GrmfD���Y��x�L�����wfJ�-l���E�������Y�
�|��G�r�0���\���P^_?S���3����g66%��*4�!��!����]��Wh�igG����f4���������	�����~'�� 6��+v8� d����2L<u
[I��=)4�!�)/{���sh��������M���k���:<<����W�E�m#��IJ�mJ0e��������O����$�j�\e5$y����r&����pH��oA�N��B��%��uv

q�}�:������d�*#�a(�{#�m���������� �� S�>23�T���&[���DV�AJQ��M�BC-Rh��	���p7
�t��	q\v@�J;2��(
���`����_%4%s{o>���MI���+�Kh����&���u`V���D��jtD��c�����g�[�����	�~Qh8����C��h0`�D����B�8�|�a�{:���;RP�h
���I�6��i	���9���/

*�P�R�	����.x7e��Z�����"�~�UU���P�2����H�!f������T:��sz������`��\�����<�VT�j���}������w���R�v����!�����w�BSB����h���1���kR����B������g�<x?��>%�tjS�<������
����,��9����,��#S9$�OXA�?
_���Su�d�?.�${������	4l��K:���wn�|$��NZ3����"�=4�Li�R����~O`�8.7����0�����$�mlc�	4����m� Tn�1!�|c�+�g.;��������$���=� <)>��E��#(��p�������}��
A-�����udb��6����]�@��]?�}y�MB��;���@:������r�jt�,���������BC��xN�5�Ij���9\���$0�I�q\��Z����p��^��5L�

����_'��l���
-��������|���
�&X^��L��,�fm����Sh`�	n��aa�����LD���p���H4�����(��s?+4<!��A/M8$��6�z�}-�Y�&�$�
zi���(�����*MU3��S��a�q9
m,-h��U�4V�2�8���H�����$�a~��C7-�d
5����md!�5���%�������9�G���	�`�T)T�����������"�&��y�L���6RG�!X@���A�`^�;\o�My����� ?�������S�i����m�j4�
�{Ruxrh4�-�`�
�dj��#0����������7�I��b�BC���`�~D*��0�A���@�n��N��\5"�1��o,���}���3����Keq����x������%���8

���JV
�P�x�?�[R�`�Jt�W�
�[�!s��1�KO����rt��4�=dWT`

}�
����KN��e��p~�|t[���6��(�_�%��g�cdK�!�9��%��	h�'��F��|����0��Y,o�
�n��no5�o��$�.��A��%����

#m�`7��`<:��7��>v�qB�u��'��\����g�ha��\�a,)A����ML��4��}��a�bf0Z�p���~��a�<0��2����Q��]��[�A��4iNp�u�4��iOQ~t%4D�E����x:�WgP2$�8�����3�D�&���,����4�,g�U�j��m����LH���)4T�&!Z�Z��?�����&��Y���U6���x�c��a��;8<�3�m8���UIj]���hl*���\G��_��t�����U�
�/:�Ie,>�C�W#��(~�����7�+e��9
o�$���,~x���g2�d2������")���WI�TYO'�U��}��������*\��]D�/�P�^^o�L��<�*)���h�
�d����%]�x�s�c������#>|������x���Cf(�D={����fUh���kO���]0f������
����O��

��dK�)4�x�f4��;{�+At]������V��
=��!���Ly���:���M�`l{2#zB���?�
P�������[{�C�}32�k��j�?�lE�
�H����'���=[�h�In@���z;���'����r���@����!�f�A�{M$�.�7�a����������D�X� Oc���Bk�=��f4�_pz�Zq�� d�]RK �{Rb��R�h��YA��I
h��in���
�zj\��`Ig���=���H���H�����;���>��Jw������]���������v�����kww7v��Hw��3�eQ/pA�8���;=s��o��5Tt�����-K���&|�^��;�T�w(�uo&�N�A�&���T��a&B4t�UV*4����N�+����l)��>Wh`Cw��g(/�
P��C!����C�������-����S���t��<�kv��>��P��TA*�!�kY�������v��� z1O�	%���BC��k������ T�3��� �*=�{�N��]i:t���h3}ulZ��E�:�1�3��0�g��s�J=�2���&�������b��;�z�p"�Z����;�B�P�H��C�b�����.O�7��*Q
����:M�s�Q�_=Gg����@��)4,m����#�O�n�� =����v��o�TTP
/�������$��gg��"'�<���������

4����0��xK�$�?��_��

�IEO���^�7��<�Pa����;�d:a|�	��%M( IDATB�A�@C�*F�'����h��P�f�����A2� &0s�X#�HS|(/FW�>��k�����9K���@C�a��v�
p��i�*<\�u�(5�+��-9$4����jeb���W�4���[f����u��	��
�����=����L�1����@B5�.��I�ykO�H��NZh\V�(�����]��eu��=�73����
U��c��r����3�x�������C����oE���k\}sK�l1hH�@��f�P:o~i�p���1�yk	 �A��hP������~5k��+�F�p����3��(�<��/�`Z�^	
�<=��R�/���$p�JU�����G���.1�(�>vL��7�-��������X����8�������P6T��<�N�e�^y{��ols�`����42�&��R�G�/����a���'FS�A���ghFB����*<i�"�B��6m���]	_Z�����
��0�!�3�&�-nO��:���_���E�)�*��6D<�ppx������:���	6 C�7<���f�;O�z����g������zML�!��?��r�����A4�@�T�������%�r��n������jw���~[H�e�[3F]�#d�o�>�
�l�8��&�K;������������"�V�&+@P-���T_\���A��%����PR�z�^9��@���&>�Z���c�]0m����.��������0i�[n����H��U)4X�+	��O`1�8��>�^	K�w\��BC���x����Y1~�a�kRY
b�tP��y�+���[T�����6�O�!O�:���~��V��5�"h�75G��fI
�'�h/�0��f��[
j�v(7�p`�Pi��d�.���W-���>h4r..nX�!�y�u1w�����db

�mPh���Z�s.=�����@�_hRw�>��M�W+��FI��#F"R
��@(�n6�����S��zJ��W���mk��^Y�6h��okaV2��N	%��	��MG��;A��T��p�����hx�d7�L�%o�8Z�u�?��U���pn"�7��c�#�����:����jg�f no�[
����y���K7c�C��s����<�L����7T�C��E$8 �L�N�G��!A�y��M��R�����o�K��9V^��[�|�Y�t�	)��E��9� �����PT���Ap�.�3����dQ�0�
o�����k�M���b�Q
�����
v�~ ���\	��0f��Hs�0e�E�����������qS���Ef�8�i1 h���������x���\}�_�+%�Cd� ��[9� ����I��0��)>�z�Ggv�L�o2~��pc�b���N�m	�����=�&-D����q����������^�&oo��,� Y���Ib

B����!u-�>6e*��
m��yk�;m\��Q���)�!�F�p��/����eniB����l6"������u���T�����x;F���H3�@��}���h�5�8��{��'>Wh����R��I�[��8{|:r��A���2/h(P�	�x�^�8`�H�6<8�A�\Uq��f�����5F�;�%��P��!����k�����r�*���4+Z�l'o��=��3�(\�'W�l���Xm�g����m
��&���'���jI`��0i^"��F;�z��P\��'%�E��G��vb>"$0Z���\���#lqj�7r�P��y!*�.w�Bd�6=x��TNT)4��T��q�B9l��t1k��~	jkB�A��[����
�W�4�Qy�@�^��{y};��&T7Q��C4�p&�xz��[%T`d�����4)��p@�Fcd~T5xrnE���PD����IF@O�~4��*� ����5���E���G��G4%a���'@W��8N����MW�
�E�.�Q\=%� LkT��W��MQ�n�+�C�h�)/����

"�l�4�i�(>/���(F�
1
/�l&�@�B��[I
C3��9�f4h���2	Sd+�,�xf����R�'z� ����y]W��<���	�z�)�Q��d	q�Q��ytw���8N����u��xyu3�W�-�t��]0���.1�q]�MP�7��\z������&t�Uh(����7�����;K��t����c4�������[�#8�I�:Sb��7'i~��
�/���N��;N����0�����>�J����P6�0+����%4��+4�>��*{L�����T@Cc�G����^HE���T���Q12���v�K�u�ef��n��
HL#!���H� ����b��l���x�����H�aN��Xr�UP+{A����	�|�8�Uh@C�|�%� ���_�+��"�'����x�Ls���2�oX0*9������}��O�/>�BC��(>�M����;�Q�!F�A
N-r����oY�p�m��Uf������W�@���1���{��������e�=85���p���
�+��p�����c�r ��^y�N�*�����Uamj���h�+�A�����h�9E4�����@\�c��R��m��T���]=[}-+D��9�j������9����������
��	�����"4*�	������C
9�����B3��1m�y���-����yOb��[R]B����)!����\�.���\E�f'�c�7�H�;&�+��6a���F9r�(
�!�k0�A��P��oGQ���7��<��k�BE]l��:u�q�n8����)�r��H�O�![q=�G�@�wr����`N�-� �9���z�u_Shff��CB�A���l~��9hh_�
��*Z��~36k����w�H�}�H�����c���x@b��~f\"��Bi*zh�f�}���&�y�������X7b�l������|�0�5�N���*4��k���{%����w<~'McW��*ZW��}�����5fy����:�����������(��W_����{b�f\��<H���J$&�_�_��57!.���a��\�f�j�����_��m��
B�@�x��0�`��z,��W�V}j�����k0�SH�'|���ph����������J��i���a.�G����T�8B��{��X������P����B��A�E���_
���B�[fs��o�a\����(�����Pz6<L�����+'\@���Z>Xt��Y$� �#�/�&i�Om%����o�o���Z2
���	I��A�l�i~���.d���1f@�u5��E7����e�/���w,� ���H�I�x��-�-Y@��	�A���%����B���u�Q�J�^|G�����=k,���5�0��3���)���41m�QL��DB��a���@�f��0�}�%|�g�V���+����=p����ZK�	���S���mG3�|�N�xf4�8�c����_I�!@�����f%L
�`b���go|��P��B�����o=wena�-`7�~�y�>izC��MEE�!�E�
�Y��m���X��h6c���hQ��5n2�KT�P�%����hI��	1��}�J���
h(di���K�����!�F�}q���� T��h��v>�m�J4ke���0�[>P��
�	7�r������46��r/3�KL���f���],��E�JJ�� �Xv�w�>����o��������y��^(4�;2M�~!��s�W�4���q��b6�>9a�"�k������#p=Z5_-�<8	�������V��B�j�����/���'��M��XJB	����+�%�f�\��Hq}��K�	|����S�P�b���}P��U������Q���p
��

h�v�33i.B��3K3���f���+]�r���g�p��v���D\������C�|��O^��v�Z5�����iO7>��2o����BK�����E+�:�'d�vr�W��'j��Q�i-[�]�CqJ
$V�
����@CR�+@��5�
�hHj���fr�[�)5��kr"���C��o�@��
a�").1�!)�����hHi�R����x5Gb@�&��q|
h�eP'�qMN��?�~�4$7��.1�!��]���59�n����_z����|jh�D>�CqMN�$?�|�6�pe�O��FJ��<l\�)��*�t�������U(ti�B��/	�,OI���Mh�xB�01�L��F��Dr2��������0_RF���������}
hHi�9||@Cj��k@Cj��V��59��4��B(Jd#��:hS,��N����7��QA)��/NF����8��?S%)�W�a4�Nr�KhHn��=��@Cr��
������VoE��P�|)���/X��M��`���eC�x������"���>i����w$37l�/a�E�6�.Zo�D�E�:����@C4I�N?�@�
�c��N45��c���`@*��zc=�-��������Pv4o��m`e�@V�R	��4d���
�����
���Pn�r�:��"�RD��TH�S��O+K��y��Uh�\1)@�f�3=��
���4�Mo�������
F�&��TzP�?h�i	4|��������!5j5�q*@C��0#��
���6�
��z��	�!����4��%M�<|��CB�P����n��5���T�1�*n��8I�����!���4h�M�iZ8SS�[d2�4d�6R�����h�8A���z��5]�8�t�89�,@Czhh���As�R2���^�xL
��V5���Q��f�BC��N	��P���ez�IQhHO��p^�!c�SZ�R����>��4�}������}B)+@�f�D�`mm���T#�,��R��K�����/J
d�P�����
��
)��
���T?�4|ZW
��~���OhP������~�
I����_���
����SBj��Asu��bR����	�E2F;�e.�!-k;��R�����o��4|��O8]h�L�(@�4h�')�(5��5�
�X��Z�!�]JRZ���W��O�J��;_��
���>����!�5�y�+@C��Z�_wJH���4h�.�SL
���Z#��(@C�h����4�em�}Z
���u��RT��oU�	��
�ihP���$%�R�>F�#��u�R~i��H�d�ak�#�/�FEE�����7#R���4����g�t���hx{{kL����f��{&����%���{XYY!k���"����#^�&+a�K8##�d�O���ua����Y��[fnn�U�o"����K��H?d�
KN�d�Q��k}��n�~��I�}}}ahh]�/�����U+l����cY��))�=5������L���5=�%'�Y��1KrB�,LR�{�RKY��0+D�,�8����a�p�H��/nD&�a3H�=U
�f���ojF�a�����Q~�i��K���k��ws��������[��A;$��5����w����H��&;SB���0�Y�v=��rEfGtT�����o�����HjV2�����,��,�4�H��8������cz��E���|.\;+��e���ku������-����g��ZF�wo�&���uR\])���8�$F�>!�I��w'hi�|���{{����JP�hHI�Q�*5�&5���&�'#h0���f#�h�4�Y�����	d�x��a0�X0�����.cB�e�����
�e��������������2������\z�g�U>��\���P�s����z���t���2�K/}1-��Y�����<�e������v?:�C���bpn�����MIC��Y
��q�M��|����G��|�]Y0eN\�v��^f=�y|S�s�o|���]��e�������\f����|2�����2������2��|�]��e���4���\�@��'O�������U
�z�
�
�LWyJ,3?~Dhh(R�g!a/��2��r�Q~?��#����%���"����&��-��y!C�V.��2k�,�����K�fO7��uO7gF����������3�����{j�2�������S�u|���=3����2k��Y�7e>�������F�_�����H��$%��:�)�����KJ�LM�����������:��dO��25���]QhH��T����E�!�4�B�g>"V!�"6���4���|�)�J����Y�����3���Y��x�3������E�g��-��w���y|���]�����>���RKf�����?��'(c��Y�7e>�9�7���f��r�-�/
����S��|5�
�����`�8�U39U&��R3=)c��Y����97�
��gc\2��qh�|�h��@�2�S�sc���\*�s�o|���e>����2����9�I���4hn^����j 1�!�;
Qb����.<�� ���$L��U������<�TL�c�����WS��Cu��,��q�������}�or=��DT:�����+��%K��W=�Z�M%��R5���.>����}����_\C�O�"�M������8��������S-��D��������V��'%nu�:Y���nvu������@ifDGG'U�O��~��~�y���5�)�WZ�o)�`*N��^�<��vf������7u�'����,0������(�)��|.)u��~�����r>5������*-��:���4��m|S'�&��V|�^���OF���W�{;S���U�~�j|S;C�x��0�@MD%�����%nF[���	��5R(5#���[F��j6�������v�S�Q��=�v@
s���������\f�����z|KJ���_��'��y_"aZQ��i����
���M�$��R�
�wB~7$�E��g��KvxU��s���(�pK�})�P)� ��)����X�
��Z�)�CS�������o���������h���!)I#=��W�az�N��r4[I :m���������]�[o\�k"�d����*��Jvx%`�����/���z	(1�_�����A��������P�s��n��B��k�m����o+�G<�?���!���(3�+���q�.e������Z������������f���7����K8)Cf]��RJ
�[�9��RJ
(5��@�����?�-\3`h��
eZ4T�J4���!������>�!}=3
����#��Q�hHj��L��!3�����
���^��bT��o��
����^��4|�6�/
��>�E��RI�hHJm)~�Pj ���4h�ER4�\�?�)s�d�&T*WeK���1m�2������r��=$&���#'/����G�z5P�x!�����
;��v�
�Q�Z�O�=t��>|"%,kT.���K������.e{�����
k%5+��LV
��q\�!�����88���~����RhhU� |BQ�l.l>v^z%)?;��A�q;�Fx�4��wjI�������1������6����WI
���Vhh^�|�BP�H^l�t]=��l��mHR���54,��?��S����kR��}����}6�
[����Lr=hZ��L�6
�����j�%5N>:S3\}q��6A��j�Kx�y�@�l�8Ia�z�yp2zU+ck9��{d
F4�����:`j
-���O�x�������=IE���SG����vo�����?Fnun�6�>��@r�O�p��,�v�Y������1���$U�O�'\\�.���p���7\���gu���y���)*X~�&O,?����c��*-�����{f���#���
����%I�T�{��'��H���O���c�Wz
�i�a�se�y��q��%���&FR�<��=��p*��Th���	�=���kb����C���&�`5{>�\�
S��%i�%-k���#�[�O�����5�3}�����G� ���d����4
44�_~�!��3/v?������X4�? IDAT��z�N��#n]iZ��e���	
����
�����Tk��4\>����;��Q�����=q��R�h��g2nE\?86��wxz�J�H�>}�5`2"V�,���}��x��s��������*�C��D�vX��W���Tj0F&6j����!���dFn�Y������oT�p5����nnJ�i��]mH/�#>� �����������9E�Z"�7/��'�HZ�YP{dv��W���.������/�=C�!-j@�@C����bh���O�[�����T��Uka�C�$���9h�N4tFV�w�k�Z'}�7�H�0e��?��Ls��U���D��-��{��_�w��}5?�Bi+Z@��O8�#�������%����024����c�����������c�f��E�k�<�X�Yg..�MM0��5���������+�/j@2N3*@�4|�[��t���Dl���E����9�b�_'1���h0*f��9��i����a��#��v���"���N���^����mm]t�a�/��v���}����|�"���NM�a���_{8V�]���������>��j�V?��SJ��&��@��N-1a�?|�~s��D'���k�$_^<��ER�'!��(�&��I�!"2��,@�:��d��L	4�v�����B'������@�E��yz:�9�9����r�:�|399�����?�]�i�Q�@��VV�mP����.M3,�P<�Jfw�1^���@�n�|�+Y�����r�xO�����g���I5d53F��C$4
4L���O�OU���
3;v��m���D�L4Dq�p��Tm<
q�u;�����W��.{	X;T7���D~��p<�+��'��Be�;x�qz�F��7w�HCSe���P�y�LmS#�t�4��9�������@�8�w���&�Lv�qg�{x>J���d'�Y�FSr��/���i����	�ASyW�I��4��g�6B��c�h�ruC�[W�U,��
U�H�0�����[B�m�y��a�����s3S-���o�@AxD8��}=����FFhX�*�8/�9|
�THp�U+7�D0����wm$���7>\���LO|����<9���Ujs�X-!�61O���B..?w�X�tF
�!a��c6�9���yW�R	�@R��wv���2�1uG�T�$����g����#�Ff��K�N�>��f�Z
s~�<�K���������Za��<)@C:��M~���$D{y"���_�v^�sa���qdA�F�	�Y�/���L�P_�0s���;��k��jS�G{������WK~~��~�/������z�h������.���j������[op��KnW����t�����DC����g�k��06������z�5��A�<h]���u0��
�o?���?}��E��B(4t���~n��k���[ou���B���.�L,�,�<�p����E�����7�]`�.'t,te������gT�b���)��g�����I��\��R�A������)��8���������`L B(4�{����
^N��l@����>��|9G������s�k|8�N�r�<%����zT-�Kz�y�~T/�����y��8����v3l�xG�mad��
�`�������9�15���G/����K�G�rEa���	[# $��9�����q��Th��d3���
3����'�������<��?���&����x��q�������%1��L8����C����J:>�A�O�z����|}��u�8�K�~�xz3���Q�l}d�������+/����p��n���^��{�|��c�?��V^Sh���(QC��e�,U������3xx������d�����1�b�D��C�g�D��VyRh�����7�d�!�F����8�yA��Q6WEl��l8S��B�*���gk�c������D#04@�oZ�5.>;����"���3F�����|�\�P��Th��j>�������m�������h�l�1��/�5�GUj�5����`,:>&z�x��9&6�!��������g"L��Tp��:#�K8E�E�6�Q�������eZ]+�b\����z4+�����i������-F7�����{����4F��y|��rz�[S�$���sR���yr�����E���GNk+t�V���3��������Pb[���P!ab�&0����Pg=��sW�\�0ZR�N<�������/�|�d8��1v���=�#��'�L3�����q]��ug/�9�7���aEz}�����)|��Q������

�����WE�B�����,�e:a<���]S���?f�=���[�q�w�!��}7�B��L#�����������.��6�iZ�8�f�����O���/���W��%k����i��	C�y��F��5-]�J���;n�^���,n>~��+�wG�#��F4uf~�i����7b=����7������`��-��a��;"PB@�P��yz>C|a�����`��g���I#��W�p��y�E4�V�ks'�.]D(��2���d�-O�WTl�������p��B�#;��w|��]['�Y�p8X��

"�����;���Wp���x^ZV���n>9�v�KS4�6����W�9�1�����v���
��5��#q�����E9�r�`Q^o�yod���*�7�W~6 ��$�GR��|e`U��x�������F�~9�x�MS`�a�L;��9>\&w�������\C�Uh��� n>��}�$����u���s����?�6#�eb!������l3\*4��o�0���}��q�������}dr[I���s�/�D���k�O���?I����sf+"9��0!/�B�>�-C(�G����k��IG�c�4d�{���Dd�����G9�e�U�^�����Yu��EW���|v,j�G����6���+�S��r���C�������:#I������N�0�a5���}`0f���`oj�=w�PW�����y��+x��y�����C�c�w��������b�-W���-���������X�w�Rr��u�O<��B��������<��U�C��D9&�h ��|�M�wxi�3 �
g��B)��}f��C����P�O�\�%���|�>����~��<�1=��>��������i�l��6��t;���i��j��Z

�}�Kd�0E�������4Q������B��f$����� ����uA����z����~�t�8���-��b|Oh�� �����:Er��_;9��~.��B���
���/���~��0"X ������Z���>���������q�0�Q�TF���'�Z���}�����^�9�jj���e
�V������E�D��]��j��k��a9�7�'m|�5���Z)Dy��c`�W��?F#�%�B?�U���zJhh_�*f�-�O>��s�A��ep���{���V�����n����
��lU�=��9s�����>.�y���n�V�h\��]L=}��$�`a�y�SN���;�������5\<!��W��8�o�w���T���)4���}�8������pNe��Uj����Xw�~i�A����=�g��������tY�,[�s�P�0�y�z�/^R~f��=�m�V��5oKcc��������W[�B�A�.��P���M���C�/�{ �F���'1s�ru����	o�^���)Z����}A�~x����m�b�uv5|���{_5��EDD.^(���:'�o ������v�_!n��xx�k�(T�7�]�������hl� �<����s���l��|��������;5���8���$��87�D�F#���
7N��4r�%����.�{q]����g�w�_�B��}��y�H��2�,S���Y���k���O�F��;_YQ�@����K�d�K��A��Pl�����i�@�UE��E��c�u�:�
�m��(T��'eJ
���E5�O�!�}tc7�a�����$������)�{��<Y���j����}�.a\�]80�&��|�jMG���?c�0a��u���rF�,��E�P�nn���e�C�����e�cV(�D��2�z��-�c�r(R�k�8�q�~�����=�I?��1H��^��q�<��|���h���+�#�����$�����3��F����)!\�������<�q�
�:���RG��&���5�:����������Y�h����|~�Qol��i��^.��E�Y"_s�������/f$<"���)����;��QW��$�Pwt�f���.no�����h�kN>Ye�w�{I���5��k�����R��/��j���@���L�XK+��>��
������0���*o�1���"T*M��l��U�����(\]���K���e����'�t���a0��p��sU6�z`���7���k��[�r��
�n���iMA��	�u^}YGn��X'����'f���������#�lVn\Z���#�/����Oc�J�bO{N����"W�������"��e�D=Y�����o��2,&�O?��a[�U�'���/<?��:��?�~���HX�������J?�O�.��y�}��:���l_�1U��
t�E.}*P|��)�?��d>���"_���_���I%2�_���y��//����s[���S ?��A;s��#��a|���!!��^�r�x������1,��!��9B�G�����A�&Z�F�� h�6�;��uv�{7"��!+�������T)5��V����L}}D{��Q��R�!��I��+#�=�E'GD����Yc��u�GB��7�l���e\�,�"�E�h8p�,�mh�!B<�q�!zQ����[�}�����)�.Q���}n����`{.����� 7��BC��5p�S=��f����K������&���C|��[7\���S����	�0CqJ��ut��Pt�Ex!���������X��Sj �H
�0x�pLj0o|]a�MO'�&�>���[9t:����+a�������Mh��ehH�@CcS���>�zq3�B��r;:>��P�=�,��z�T��E��VuG���Cx��:w]�E�����(�~��?h�`"�95�a��~���/>�a���1p�!�q4��D J�����)��y�;c��Kx����+`�����Y��p��[	4�s�1�>zGH�-�HlGg��<�x�C�����'($��>����e|"������}�c��q	��0�n�r�x��1,��pC��U���%�g7�@����%��4�������x6�6t��	/������Y	 �_���{�]��`����A�������0�G��\�{^<y��	�p��O��d���tv�7��WA�x2"�@E]���~`']��m-����9y h���]���M�`�Yx�������A���������_I�a��������tA����JI��r�,�l7n>q�����&���H���7x�F9����-F������G������&�������,j�,���y0��X��O}�����s���+;��Tc��C�`hd�����3:�L�f�qe�t�����)J����ySx�������;������eBC0b�^,����vh�v$V�9H�� 1�������/l�r��
9����Mv���,��-������pp����>^o���9��VyRh�cFR��0���-�x<���;����y��T�C+l��f�*?����<��C��$�P�@q(.!�Y����au
5���<����F�7�jr�������v
EQ��e�5�w�\��t�6���~�~���s1��,,?�5���c
��P�pC��w��%,-���t#$&���������=8�Hn�	' �F��������.
�AN�<<�BQ���&0�����Ih�����7f�`Lm��_^�/��wMR��<'h���y����v\k��N<(��k��\���+ ��->�����Wx\|B�����~���5T*i�n���h^6���������}�<�wy��Iw��K<�A��[�4�
�����:je���]/B���%	p��~��[��p�P�x���Y�[c$Ap.0Gs�5d�V��A�1���/\�d*���Z�>�������Ul��T%��w��k�c�@���� �m �-@���I���uV�k<QG�K��T9Dd������!��a�����`E	xQ���:u��xU�Ex�H����+Q����mQ�`^� �����������1�2�n\/.%4�r�_6p��L�Kh�F����������Q"_M��g�O�������0�[-���S�{�D��� F�
>[�������A��	]�\�r�f�zb!��8~ma�`�g�(����.�9���Po\�G�Z���b(����G����1|�wC�r]�x� �a!��6����=�}~Fc@����1��X����Z�..psG���0��Lt���z�X�jz������N�e,�$�9�4  ��]�O�mn���\����y�������x���Xs��\#|8��t,9� �`��}_�xZf6�db'���{B
�aQ�=�bM�i��s{�*���E����f��Rsy �wa7����������r�^��E�B��p�0*�y����Ep�������ox�&F1,��5TZ��y��F����JX5�)�7-�H��������e1)U��B����T�5;��q[�����o$��c���+%�}l-��G��p#����yx�;��8#����(���k���S}]�k]}7�s��8����T��G/p��;Vti���K�ZR0�~��%X���Ur�i
���p�4D�je�jC����#Ln\�i�a�%g��7�~�Z�9OV�"UB�b�y�wxR\|@�)�<un�^���A��8r�k	�}�r�Bst�X
��s��FE��&Q]�=1����`of�	���-�7���K|�f#<v��K	FtY�3����9h�:U����:N�A�[/��=~�a�*>|v�~�g�Ir��v=�::�sC'v�sV3���1R�v�����I�&<b6�����lv=wK����j�`�.��(/B`�!p�X�������u��`��W��~���-�Z�����KWXT�<v[����X��)���$�`��"��G���h�yR��e���~#�iz
���k���NnGB�[2�B���y\lh��������/�$4���3�������P���&fX}�~��]9/�+~$����7/T���?����@���q��-V�������U�R��r�,�p�=�������G$����{�����no�����a|��Xw�
����k�f���v����0�qs�1^r�����9��qMe���A���8����0�I�'���\E���q����,,�������#���D������e�(s�O�������[$� �y��V���� �O�������4�k���?��p-�zpp�4���O	�D�b� �Ci]������C���6�C�C(X����b;�
m]�-Z�O-���O-�s���~��U�0
;��[�
>�� �|�P�JW�1H��8��7B=���C~B�n�����!JU�.����E��!(1�������e��x�z�P4 �pd�i������8�ji���p�0�7
q���\s�z��F�Lq��r8�)/A��0��-�@������
c�)m�N����`��}Y����9��:�W)4��T@�L<���P�+�����������JB��L�m�*
�1���/���;�W�,�^���[���4 �pLf�>gi�<�E	/�<Tt���B/� �>o�C�����z�	���?���?l�$���}�������_����S���j7���M�!x�z���������h8��dq ��I<]B�xZ�}�� IDATn�&��p�;�X�p���e�e��������������.�-d�| k;�{~�����.*�v�*��8��y?j`I`���/�T���Jw��`@�^��}&��	9pz�+����������|U�]6�i���LC6��
-���^�Q���������

���s���(P�B
�	�CyF(��N/tX�yc�'h����K<tp���������qo�ij%+\�S9����"�*�q�� �[Y��]8^]
�h��|���@C�ANxG@B��(�:�:4�����t�Z�=�y�Q�WVz����~�E�4�5���� ��
�8����xE������$�!�'>���>�`_�%:���c�*eX����B���M,%4# �q�6���?mcU� @;�#����#�������{z�8W��z�j0F����wk#��-�e�s�$��S��gC�0#��;����N����{_&����0�M!��]h��"��ah������������^�J�B�:d�?0h����(a�bE�
C^��-Y�Jg[KX��e�"[5G��B��Q������T��t�����e��G�?)�v�H����t��x	���	��v�����>���(�� ��
O�� ��kfb���$Q�d�yg+o�<}�F���3cC�|D9.�Tjq�(�3	E��]��^O��,-�y�o�OtD��9�xfB��0{�*L���A(ET.�2�Y�C��]I��M7�J��0������@����|��V�]�����T���ZV���	4�������s3��;��#{����h�J���<�����J

o�����j�;���cl�:��h�<�N�~���5�z�h(��}[��mI?�����TX07���Cw�~R����jE�Q��9�Zr��%����}	&���=��C����iYVfR����W�#�r�gw���.z����1v��q	
����y`T���>G�_YE���0�h��p]�46	���L���Z
����1���O��,dN}
H����%�u=������7��:Hp������.,�cha�����o�FA������"��������������N�������p�	��7���
�nbU����l�#�k�Y�l�� oFK�a7��zb%�����y��s����������5����������������#i�"����'������x��������}h����Zc����]����PJ�.��#*�oF !��xC�"�n�P���mR��o�z�6y��Vb��e-�t�����G7����R����m�~�V�����j���G�w�n�^�/q|����0�pd5z���U3�!��W���b����8�:(7s�
�<c��M<�pB���xhq�������
v
��f�?��`����(���Tn�Ck���RI���]��?o���U>�$�P2{���
����AO�9�ra���0!�%n��E��W�XM�Z���L�?�|}
��JI�b����3��\�����h)�U�<H}���(�XR��sk�M[	&l����e8:�`���6h�8#nhe�Nu�����CQ�����Lo_�;������4��A
kC�J��
f\�l ���o7��|���?�1�w���7�59��~��B�<9������Ttx��-MB,����&P-��>����+~��U����V�����#�9c���F���.OQ�@^\�A�)Ro*"rX[���6R�N
�0��2W�@�o�^�7L������k�^}R^����1���5X�4� �)��0�����AxC��>rs���g��N5��2n�����N�cpC����
\�5��G�whP���Fu�n|.�SU=v���z�-n����T��az}����������E���G�*���w&���@��� �
�D��TG9�E*3�����*a���sK���c�S���3���x��|6��� �IB���{4����Y+�xb�6���
����J�7~�\��8w�
V���G��-	X��nTq�p�W�O�p9�1��I�l}��������{���?Z8���;�0���f�o�3�e&��N��W����4u�&}�����>�3��l[���1�j���Q7�Dp%6uq�t�� ��E�����C�����z����-��@0�]��Kc��k?F��I���{��@h��\�!�	D���~�+�@�}}B1!��5����s<��&��
zT(���)�
L��g�^sh�k�s���~�"j�����Ew������*�a��0�SJ�������oL�AU�l� *����f!��#$aZ�)n�����\b&'�R�i�|8A0��{O�B�PRxI�`>a��[c�k������z�����PerB��Z����B�2��*CA;+�B�a8�tC�A8U��'@���x����[�=���n>>�A|��K3��6#LH��y�zw�w�6�2�y��^������%�������-	4�LNT��S:�Vq�@�R��,�1�%����]���I��.�Sh��"`��&B�^F��S�f$�pO�z��x�������-��`�d���pv���A*g%�3a6��PyC�|�7����@A����`�m&oc�#H�+77��x`7c]�|P��*Z�R�!��'���:�<X�>�{���ya���$\1��;�@�����'���Y�^0\��y%���/�! D�~T�0t�(���'`��'
45�#��AR~Ih(hm�n�*���V����TX0�3���
,i�C	�U��N�z����	�a���LXL�����Cv4�WX*2E����(a����/�fy]��	0�I�/|>`Q�v��B��wpL���n����`Iu��
��b��}(�'o�����|��O��5�S7�����,��4�a=A�A�}./�5+]��&8���T�9��Cu��j�7���Dz/��7�s�.��a{���aj�
'w��*����cK��{�T&'"�tb�x�
����n*(<�D�&������~�\1��0��o5�4�/��������S1>"����K��1�����w��#�G�^��0U�w.nD�<ai�W�����8H7����.���5Y�<��H�d���:�P��������I�����)A3� Ha�*X�����k��0B1 ��������-r�&���7�Q`NU��v<��8�������b��T�A(c����]P�|;������]D}��,E���8�����������R�CU�q�^@���?�RT�p��-���e��F�U�
4��m_���f���CQ�	�W�a�v���>���������t
��_��QG��a_�����R)�������rV2�#o�_��?e�le�%� ��Ps��T6~�\Y����$����1�u|�V�����5.���O��W�N����l�@���ps�'��%d�:����j�4uq��w(��V�+<;�G%���]��&p�{�34���~�I��Z��\P�9F9��q_�'p�
'TZ�����]QC�G�2
����
�6:���s�S(#��JQ����uR��8���y���s�����zC�yy����"�$�!����4��j�������"��q��s��qs�{������LQ�����
���n�/�/���+n�U���7%�!��8�%>��yP�_S}���)K���=�C����������q'4D�=�3?�y�����7o���DBm!p�Fuj/��T.X&��H
B�A���~7I%���oq���v�|T83Ga���c�X�yq��S;h�� p�f���L�p�G*�4��P��mZ"��)h��x�����������ACg���H���e%��
�������]���v�
��"�v���W���	�  ����f$����=$(rn$
���P@��C�`��O��>�~A�j�@���U�a37�*���2*'���Vm�E5�2��B@`V�v��fX�=:��y�����ny��%#�S�����D�R�R	�@R���7w�}�6���2�-����{q���@���%���3��>�Q���7K�!�v�!}
Ym�x�����g/����SJ�`7>���7�s����q���y���j_	4�z>����a����:�o1js!&d<os�_������������MKa��[�]�A{��f�X�a�g��t�

A�T�(�]x�[��1�f"��O�a��vh;~��*$��lSPH�q�����Lk��6��q��VUBB:N�� �hJ������PTP
\��@�����m����tl�����-��/�d\�T��������.���Jx���Tg��7����4Q���X�0Dx�1�\2�,�Y)g��TeH-�������2�#���m�w<H��fwm�����q�+��M�G�Y��4!\|

[����6�ey�����l7�v�{�zP�x
��0�3�m:�Q�k�t����j����m��]���������$������R��^?�� �PDp#H��jR�A]�`����)�}��!�+�E�V?I�����6a���J�3X��F@Dbw���2�OFQ�a�Z�Ih���7�X���i���M>�:�@C����V*4P��B�.�sq/j6��}�U+����v������K��b���
h�{x��

�8B8Uig��-4��_&�B����x�sN���BrW(4�.T�nl�m�v�:HB���%��� �{��a�8�������W��LP�`=����5i���B�'LO�a��%��W�D�'��$����7���Y,���~E��*,�~��z��3�.��6�ShPA�������@87`�DI�K
� TN�0�L�������n���s��  ��\?t�T�j
���vU��s��B��������uXJ�������T]�W��o����D��Eh����R�`!�yK�0��t��@�8���bV� ,��Q��@�:�n LO�a\��H3�*��m!'���5������v6��w:�X*��3Bx�WB4<tu�UF����s8R&=n���T���� T"���
��`���h� F�_84�P^~������T^hC�UY��M�;�/@uG*�4,YTB�X?�t�s�ThHK��7����R4w5,�;]�O �8Z��XV)4u>/8/w�� \\��C�{�W���������P�d;�$�$,0�i	��"������#���r�|ND����h�M���=�d�^���''54�x�9I�6X�b
�}�12h��h�Th����A���a]�]��O�>I~��4�(��|�����`^��!�T������}r�S��&��B��`�E�N�9��8a������1��un\�6�iFB���~�� ��m�h��uM)h��+DXd��Bx�&�_**8Q����-�t%���<�I�I��y=�k���=���
V
{������*i����.Q������c�5��^[�^wm]c���Nl�%�;���c�E�������{�����C��	<J��9)��#>�#K���z^�8

�V����T@C���	},��w�����f�5��2���aCe�D��`K����5�fX��F�;M��hxB��5�F�BC[v\l����L8E0�*4��e�
��}�����g�B�F*du�P�v7�E��������B�9��Yh�����qS���[J�w��S�au�vN����� �.t�=m��T$�������=�h$���+4�
q/?�\����G��M:������

m�����S'K��ig)
BN:�f�$�\`�pd����C��
z�� ���Q�c��O�G��{�*"p�Q�QP��V/�s���p+�����M�r�j	!�op��
����Q��B�/�`������
��O����ae�����/���R�a�Y���B�f��~,R%��
k
Zax
��]	��;(Aa����}
KSn���P��8����:+���n``����&�T@���B�������Pq�|�]J��MD�{G|

����^�6Q����z���mhk1��1���Wk5���*��P�d*A��~n���%���7!�A�&�}���j�8���{����)t�B����{�:zV��wn��j�0��Y���0�MG�_�'Z0]a=u��Kia1a�V�-R��Mp~���i4����#.2W�	��N���%� �U

B�!��e�|��w2�� �'

�nJ	���z�	R���=]�$$.��s�={�jV�!O%����8"�� ��Q��]iswQ[
��^(C��A��o�eQ���(�XD��P�xh6�������J�c���n�yxtc�<F@V�������Q��D��Th�r�Q.~�� l4��~��C)�&�a���V�zB�V���N$�P��_�Vg<���M�r�=�]���B�a�'u�p<�5ZL���f���Y��Be�M�����U�cdj�S;��r�
B��?���:�j�wM@�z�%����k��4E�������p��:*G�GC*mhSB�� �x���� �PhP�Ca
����?0C����Kk��l/U�����(4|�UR�(Dp�M�!��b�P'P-�p�dki	!��^��xkk\_�� Z!�G��sw��@,�����T;���

�	�n|a+!,"�����PH����
"M�o|�F $���Zm�v�����=��'{z�W���#�<�
�[�ek�'�b�6�0��vE��Fxv��V���/Q�wf*;x�m$T�	qT@C��B� 
B]@K��PaQ���T
�>4�����dLYDJ�(�����?�4�|6w�BC6=T����?��^v��Ca������P�h������s��B\�q��zB(n|���������M���

�x�om��yY���fD�!*��r�m�S����K"���|h�!��G�^v��x%!�������� T���&���Jf������w��m(��*3h*H�2����#��O�!p�Zv�,H�E���7�O����Oh'a��}�`��!��� �H�=�A�!Z@�!�,>�.d�Z�N�"��S�8HA�B9i=!��c'a���o�n�$��J�v�KJ�m*=D{yR_O�	� l>�SR��.B���K���Q��~�eH���$�S��{�1�P5�B������a��]���3�(����"��C�]�h���9(4oX+����E�[��M"���-�����la�O�Pu���������,]+Uxb�����Z )@��[������^c0�PJ��;%����R��5=�����>�����������rf��E�������������|��]b�T�'��7&��L�"}z<q����02�[V�x�8m�����oU�h��_q{J��h��([O�
*�����P�\������:{b��Y�,"���{���)�^>�������_�~d
B�>��4�kQZ�Lhr�u��3(_�>h(���Z��M��9qW%��|�#�"D@�X���2�)�1l�����U���~��R�a��G������>�^���A{�V���%m,�������j>.b�q�#�+�aY�R��S?�/
�"��B��n��b��X�A�S|�m�C���p&p���"x9����Ph�=���!��t�b�]��H��7���j���9I�����H��y�`T��;u�M�!��Rx2�	q0aG�2�'���h�9��k�K
��/�z������Rh�]�<�saN����c�^�*��"v�[��l�-��p����g^����"�q��w���/����Z���i3.>�RR�vsr}r�zr�Q(9,�_��A��a�&�_Y�\.z�V���FzB������_V-�h�t�4S&T��Z�%6?84{y��<���+�X*9�/����i1�-N
������Pu<�?j������4yw�e�x�q�h���hC�l�P��I�J�c�ja������ IDAT�?NBxX��7x�x���>/�s����;�C��}�g�,%�������-<}��.3/!��f3J}s���L��jr,4d�U�[�����(�j�7O����,O�������k���P��l�+����
;(!����b�_�ax�v/hx���v�����x��Tuv�r �����e�� ��E�;-�|��:��ov,������
 ��TH�a����������(���������XYKa���}m5���Y�@���#�M>�x���:��D��#�oah)Aaq�i���6����������������>.���	�B�P�8E���/.H������}|��%�9n�����lC�6�PH
� ��T-/w�s+*����p�m���c�.D�@��_�����q_P�&*%p ;}���cBb���
�._<#�1~�>�6�~�jEw^�B�`@�����]ZT�y��?@��wJ�&���Bi�W�[����4j�nY4,#\��6|�6C�PO���#�=���.@���{�����7��-,�l���C��7%��
��!�L�B�a<������Z�uz��Xz���.&q1����0����������T�l���|������1�}��������_m��(l��#r!c%�#y=�tz��|���������d����DB%�l�`�_~I�!��!;i��>J�ZF�	�p��1<t�,��&������h�kB+�PO��u��}�>�a�i	���*^�1N$��h+�N�� ��
�� 3�[_��T�a�����R/�����^D�
7���'@C�f�p���k����i���<k�
��BO*L���1��D��%������^�;����"m&�;�������4<
�5�z��4����y?3��b�1��!�C0�2�
�h��)6�n�������-HR��B�8���/ba�N���A�;J�;��7Op�,��V��"�A�b�����������r�{8s��T6�D�2��/����i�9�����f��w�����4�������h�����������V	�]1�6T�!��
�Gn@��}����=�P_���Mv1ZB�&�i3RN?�!U�bDd��T������7��E��(4����	V �i��� !���q
��������
L^����%E=xl��h�/1�K@�6�L��W!��%�)G.bT�
�@C�"yQ�����:��Ut�P\����wh����s�H�J<}����k����z���RUG�N�{���xNPb0�����ba�zXp�����w1��k��C�,����B|@���d�k	!8,����g	4�0��SB�G��S���f�h�s
�A�
��oN%R����D@����7C��;$�+�5�m���%��-�L��sc�����{��;:���#�O� l,��a_�e���K���
h0l^����]`>�9���5��,�m�����v����k3�xCa>�'w�yp��������h��ES4��8"���U=�^>��6Ru!=t��]0L�?4������O�%�����Om�"�|v#F�G
�)4����%���]�-jP��#��Q���3Lz��N��������F&��XN��Q�W�8��G��9����

Fm���Vs����t�}ZS9��/������"��c�������C,�P��=JU��������H��s�� �������1�Rmd���P\�
��]����a�������sG��I{���	��T�g`���������}ZT�~x����k�i]��%>'lq��_u9U���/���p����UgOq�c4�`J������6�>|6 A�6� ���EK�1EpX�l����ZQi���� �C������Yk������������	
D����"�o�6�����=?i4D�9q��\����2����X����1�>�,�����W��E{(�p�������]���� �n-���2��
����
m*��K|��H=	Tm�N������,@���O��Mi�@��(�\�K�����"����T�i�<�"-D@�����"��s��|G�un�_h#m/���HK,X�4�
�� 0��E[��y$�M�����KB�
"�6�A��Oh�L�>�f����'�mQW�D!�*�P���S\P?DK��Tt�'�0.�;��Nu�0>������E�%��h�a�!�V�c��<WU���{G>�2�u*g��l�P\q�8���Sn(�r�O�JX������j:�yc�06��z8��q�Q\��SK@�H=#�m��e����� �
h���S���{a_����������E��w9fl��Di
��.�����1�T�mD�,:�5&�<7�����
hG����%7�F|���.�_�.�E��f�$\&�����6���B,���NA(���<5�����9��+b(���A���T�EZ
u��s�.�O����~�P&�u�z�J&8M@!"$FMK
:�)��� ����1
�*<��r7x��O��+\_CZ%��J���E%-��i*-,��#?Qh�.��~h@NS�@�_�
����M�`�H	6�� -%B�"�U���(D��s���3a��A���/����~k���*���6���([��1�<@E����MP�c��P�x���X;1@���/��66
�%�S�!��T=H�����@�,s��r�g��O�7�
\�> �T���	��"<V��h�g�_�%��������g/$p ��t+�G4�J*�!�*a��X�( ��Z4�� lD@�G6�G~.��R����==hq��n��9��8nJ��� ��F�F����^4�m(d>������
my�4hP�!��&&��������A�&�,h��ff;�r��3Q�.��Q9V�02� ������C�#�����E��}hr�7���A��1��2�,�~N���������b���'�D��8-��
�;8i��;�t(9���Pqv�
��\���F��b!'�"�"���f�"��I���Asu�=���;���6���K_Uy���%���3�� �Xp�[�Jp��7_W����� wN���H��4$�%���Hj�xh�i5hH�@C2:��,'���7G�h��D�0�/ZN�a�2�����,GJ���Ri)�/YN�v������V�I,��V�I�|�ZN|K^!��	*L��S�8��$%CR�����{��r�[�!T�	,���}�'S:���H��S"��,'R"���FB@CZ�=)@CZ�)-�QA���C'X5��`����~Kr�����D��N�d9�����l4|5��s@\����Z�K|$��W�tK������MJ�Kh����A����tP���@Czo���/��zR��=6��E�T\��f�3����ZN�F�T_��P�B{�S�"��[�����*PQ��
?��k9��
u	:��,Tr��4f�XJ���HJ�-����i�����Pi��A�TkU8<�9iK��=��&)���F�-��B���fq-'R�N�4�V��t�H�-�
���|Z6hP�����
����zi*@����4|��
���>%�6V�[ w�E�6e:%=�D�P��D4R<���|�H�:�����;V������KR�YS,QhH��LrB)4��Mcs�{�}�d*]�(�uP���n��S�����a����(�L�������oc_n
���s�1�!i��@�Px�����0�!�R#�6��eNn��h�q�����&G?a�������)@Cz>;�/[J
E[YI��� �����/Bj
�P�x��3�����3����Vy�U�j��4���W���iG%5kh�8'\�!5z�4�F��^�
���m�
����
����.u��u����/[N���WW���j���G�����C������_�Y��Y�!}��TJ$��!)���������hH�6W���he%���!��RhP�����
����zi*@����4(@�����IA����\�A~�����R���l�O�R�������������J�
���(�RZ )-�
Ii-�X��Ho-�
)sF�!e�QIE�Z@2�	W�hH���
������4|{�*@�4|{/J��!m��G�E��G��iY/hH��V��������
�����G��yQJ��@RZ@��Z��J(-��Z@R��(@C�������@B@Czl���(�{��3gN��K�2)@C�R�$��:�w�nnn������FZ6�w����_���D��$CBB++��~�����E;���M���:?�����k]]�o������2�K�����O�AOO�{��4�_�)�si���Af�xN������2�K��4-�������.:���)@C�^�Jf?J(@C�9����
 �	ph�8w��)��@�L��=u}aR��x����������?12V
��|S&������]��gW�s��(��z<
��~�/�k�7�����xNyI��\�@��g������Ci�t�w��D����L	&::��������2��"��|||```]]��T�)k``�L���(E��(��T�(����B�E��O+���r_P��.�hh��b���3j�Mv����'���1=?�R�����]��o�������I���|S��.:��>������x.�XA]��8���|S�s�>?�����H�k�=5�!R�>IIS]�o�x.m����'S����������7u��dO��25���]QhH�3�����@FSh������555�����3hkk�]��CEu��T��.������]��)�Z�yu���$GDD ,,L��%u������|S�����7u���ENe<�VCYYe<�^���xN=�_���z��(�9e~N�F5��������G+�9��)��i;�S�uE(uM��h@�"i�H��X��	�s�G��2��4e��XN���"I���oKM]%�������M]���K����:�we<�H�!��V��q��������S�_]��2�S�������\��}[��u<������|���4|�u��V�P���s��&�@*�n��S�^e���e��)��/L��z�wu~�)�9e<�^�;iUu}�)�9�|��kW�s��������(���!u��
��~�/�k�7=\�JW�{Z�ChH��V���Z !�!���^����j��������_D!�%�)�/���_���(b���)��V&��)�������
�o_K��K����^�T�>���H�}}�X��0�:p��5C�H[;>k�T���py���N��������i��W�	�?)�2^�f�i�����y
`��+IJ������)t��Qx�gN������vJ������������m�e���x����\F�kR��=����&�5�&���r���|K����k�hA���h��z��u7��W�t�d%����)�'�_%�>I����of��=)�I��i���T�<���6|���}������n>���8k������{�i��It�
��G�����Q2q�/��o������'�������������$%^R��oh9��'%�t���|��	Hj/�iK��o7���a��{jZ=��K���	���eq��u�g���Qz��7�C��PU��o��J��	
�+� `��d7�a���r�Nv��F��T[�C���	:g�Hn2�.�4������os���:��~r M�L��}�������}�L��Ap��#C�95
���<�|H��W�0��*5���4�k����';������2�yg,h�{�����[ ��=����������J��q��T�G����Pg�#�m"Qi������v����_��9�4�iz���� $W+x��O��s��n0\_�HW5+d���KWeJ������R���H:]�������Sw�5�^�hw���B������A%uZ��L��i~���@��*n��q���{jDj���$%m��������$U����A���(q�H�P��4i��D�!E:RND2��S���q��!c���RJhH?gJ���P���mwh�z{+@�q���%�#������"+@�75_���
��t�Ja�!U�5C$�
�4�[Hh�!
����A1;(����
e��t�BRr�_+����_�g-X�1�������pz�����V�*�-/o��������3����I�����.�����<��W����@F���"`i�v�)

?^�NO��RhhZ�|��p�������Rh��t@���px�����V�)�AA>x���W�LI�!��Z���s��ia�Q�I��

�:���=�1��hl<�	�_�OR��;��3�$)N���?#
#�V�
���\�{�O����V)��0��,,�9
��_����nZ
VhW�<��y�����^JR[O��[/^�CW�$�S��vUx�������#����������S��P���-��VY<q������������9��v�����
�����������q���������hM���F���q�y:'�<l�6��JR��������K��_g7$;����@���u0i�����v��$9��7��n��/��/���������A����i�d���Sh���"t��3�L���%���C�a��U^t\���=x��!��z���������{��Sh8���:�����F�m��4iv�.8aq�������O0�hNX�%~lj
��,D���hK���5Dv�<I���C�0���$��{p����q��a�*�����"���c���7e/�Nj�����>%�i�`��a�"�i�	����\�`
�#A{���$)�����������`������V�uMp�n0^�K����B��'�a�g�+.w��`5��������������L�h��;E����Pw@���|�q�P*wN�=]Uo�H�����c������a&�H{�����>.������a����_9?&�y�Ml��/3L�������F�������+(����h^� V^}���d���DJ)����.��?�&�\o�"�#i���Vhk�~[W��AK�����t�B�8�#��
*�LR<��AOB��z�K��f�k

���{P�h
�@@��?V`��_�1w�?��k������g/]G��_��O.���k�b`�N2���Y�a���:�n3c�_�}����~�d���\�z����}�d���d�U�H�2���[�y�r�/Q��
�j�u��4�h��nC�_)4���/�9������L��;�<�6��s��/=)	4tml���=�^�t�t0��9�f��
@JZNhkj`L���v����m��q��b���X3��4��S
��^"���wt��0�S+�Z�-���o,���g�Z��eK&���V��z5��k�������
��g�l���w|�I����_�8����M�`���[��w��o�����?�Zs��}f+������MV��"�4��1">[���K/�[��N�n�����+�E����(O�Sh���G1���[�����Ba���c�/�E����f�z��%rc��Wj4DD�c������(��{
G�@~�b�i�:�)	48�.���J�����h0oe�`�p�d�����
M������������VcD��Xrik����4D�����Thg���;�puk��6��V�d=�^����*�&+����@C![S�3����h�(�j��'���&��@��o��+�{���3����-�q
�7J@C�kg��~�"��;��12�{6��M�x�������7:��T�!C
._�>]����y�a�����8y�
�LMP�@,^�:������������3����kU����$Dp��Y�QU�n��X�i7�CB���]ZI8���|�/����sa	���o����H�b�����s��-�,��!n�w��+�|�+2|$h0������ IDAT����:{�Y���A	����XD�}J�f2��IO@3�� �|�&eE�O$��yC��)2k�tVR���a;K���C�w�hDh����?H�@C�����Jmvk
�u��[X�C�����	69^��F1;�^������an`���~����u��r�)��?����&Qq!������{����y���&��p��G���t_�
������/Z��Ud9I�9�'����K�e2���9��>�}����._��A�w���	l�����+������Pl�8���F�f������:�[��c�����x�,�y���tj0�wLIT;|	h�4����9������>�����c���{(&/�	������,��.�38F-x��U,���%C�����BN{=��F��X�n��iuK�,kM�L�����a�*��z2�Q��Lk����r�Zf��������G&���]"'���x�������n	4��������X������m�60�3������?���?q{����!Z�i���a������-�BSS�N��s.���7�w���:/��b��IE���/Q4[4��0Q�W�%��L�&0�����}�W/�x�xD�� d�ND���2OB@C�"�Q�!�,��Sg��|Y�a��'�D�2�����G�q��5�d�C�4<���9�3�������� �uNH��]��P��Lk�r�Hk3v<���m�y3B�����4����x�����'??ze7�M>���w�G�b�������[�D���������`��1��l��K^����Ot��E��\�\�[��,���G���Uz���=�m��i[�r<s���C'��zt���� �[T(���P�FDb����eg������b������1�mS��_��o����\)<~��cw��{���h���[,?z�G�g��D�,�1f�v������@WG.�o�pM*4�.V�������e��/]�7�->�[�}X���ik-���o�].b�b:Z��9t�.��yaJ�x���Vm��n����}^�7��v�\�.<|����ax�����/���g���5�fH�?L����s6�I=����H�=��%~�`on�����;�.p���(��'0�������Fu�)S&l�pW����-a���q~����`�k��f#���^�_�v`b���r�������v���vT7�t�����0��2��o=�`�)����0`�4�T��rR��[a���|;r�[ct�����:|��<���T�0���0m�! B(4��R]�q��}B	-e;��K����I}��y��#����o<1�wkp'�P����B��N��2�����8���F�,6X��4n>s��6��+3���h�[����Z2�w\�g/L��/���������-tu�d�u��l���V�y�����Z��}b���e�r��2��}�1�F��Zc��p�c�����a��}g�]���	�Uk���������H����q��ml�~u�WD�b5a���	! ,����?�r��[!~�0K����k�wCjvf�5���^�9�g�����L�w�T��cp�Nx��
�r��?#d�?Z���=� ���Z��=�[�P�����
�����g�7f�\�2�
�w��2�?�l@���Q.{Q~�=^bf��T������v�����_	
y�l�Q��23�y�����^0�\�����n�q�Y����E��mD����l%x��L��c/7�R�A7w>���7Wdb�,��A�[W��'�0�T:Y�I��fm�a�X�:��!���OD��M��|������4��a�������.h[�!��lGN�m���R��A�� ��5hq����HXt�)������=���2�=��G1�?��?�}�f-; �.w
��zfF��[��-��_���������R���P_x�u��GHd0�_�5����Bf�,���*��y���0�qA��x�J���Q����X���������E����o�I�}�fi����BC�<�`��?1��d����g����������i��[};����}`3��g��cv��]���fbX��8���<��\���D��aIj�����/�q���LoL�<���{�=P���m����+k	.T���oX8�?y�A�r��{/�^Q�}X�2Wf�w���7���#=d6��b'g��G���(�1���Y�0~��}����<ve�>�e��p0���O`��~�7�|����/`������U�P�*4�x��x�1��:�n��@OT����6�ww�Tr���Jf����W���kK�!4"Aa�(���j�.p��	�F��{���'��2}{��hV������`��	hW6f��n�+�n�����4���
k#;�K�0��t�|x�=����$+^x�	��x����>�c��a)���.�@�=�^�����8�B��}����_�8�U��04������7�����qd�,d�[������7N�����+'����-L;�7/��&K�1��\Ot�����_T��x?���?����,�,xo������d*�s��=1P��y��g����>L��#:8���1�:Z��n���������1�}L�i�xqx���>1

&����2�Ba;�s\\�
{���0���B����
���g��		)4u�A���|����QMJ��s8��
��z1u}��M�	0dB���Xz�*K�P��>��?"<�#�����&�U3�XD{���e�����>0����Qh���/�E���0�����Lx��m��/���_Rh��w�M��~��|K���`���(�w�
��b���L�VE��%�r���1�jG0!(�;�����P�����7q��!az��E��74@�w���=�8���X9 �Uv�v����h�d���0��r�/43��A��b�������B
S
�ii�� Tr��EDh4�<��s(�D�V�x�0��D�R:8�0�Y5��.���`�S�����#J^�:��=
N��v�]��\{-��P��>w�Z7#�=�������(�L�]��r+�id���J�������(�z��g�I*4�r�?�2�]�	���C�D<�(��~�Q�s8D>���e~r1Oc�Q'Q����x<��_4�����ZC������C�mS��}y=�lcd�^,������X}=Xf���z���p�H�l���`_0�$�
4X��`L�"��9������m*�}`�T`hU,�x�3N:!���o�|��Du����J��;�s�:�v����(*&�
=�����/`�j�l8���E�����^�Q!���y�>�����>>��NZ���bk��}����Sw�c9��6e\��Ph����s'Z����R���XWw�>���2�����!)V^{��F�*,�$�?��C�s�	�J�Y_Q&��p^���r��6)�����&�O�m���?6�t����f%�g��{�����V�m���������S����*�~�aa$���G�8�[B|@C�����s����G����7���[!��F�1j&B����ph�9���!D�FF����6�t��������O��	)4D���3�������������9Z ��YD�E��M[w�3L���`P���W����6����i�������}[����C�n���=�v&7j��7��B����>�i��8�����|�0i���!�k�Q��0(_
z����z|����U�

a����(�%��o�Fr>^���y%�S
�����V���S�p��+lq� �������1���`�������!�����n���*Hg ���'/����a1/W��=B��������7���gQ�XA���?��'/���O�u�,�;AN4	��Q=�4����Z2��		C��%����;��p�9������ �(&���|�k�q��#�'tP�l�O�}G��4�u����%h�Y?^��C;�=�������B|@�NIh4@�vo��5D��@�M�
��o�i�
�:�\��U������0�C��e__�R�E2n�R���5>��a��}����n�����������X��T��V:���:����a4�������Ou��7�Ww���1��B��I��������R�N���������hZL�K���*��/���A��c���01�E�V��g�4�l;	kV���m&���-8�=�_����:`���������+vm��>���������>�������v<b'�uD��5`����\|/_�-|>���'�����P��)�6��-oQ��9n>�DB�f>C�z�"�p������AV]��X��M
��t�z�&��������6�����g�Gs;.���i����(��y�q�|�l�4�����FnB n\���S�s��+O�bI�%����(���l~�5s��0m�4.�H�a�������v�~o��k����hS���[Z�Z\$����0��x�7{����'W���{�����c���x���z/����0��\t��#�u��<���5s�L����F�E��%������]�8��@5t��A���0>	ap'jbBB@��fM��������w���X�N>����R�&�9^�wp0z�)����ct�*X|�_�#$�p�`�]�j�=�pQ(�!!�a�o�0fq/������:7���W��6������szS���Z��p�������m����v�����������F�����:L����hX�`e��?ry����;fJ�!1�[��Q-���o�agf�7\��,^�N�*���o�������a7�� ����%�`oi.�����%���-���Kt��jb��s��y7Z~���R��'���0e�^��TVN�l���������U�6�:�_Np��-���~���0v�	`����@�(��]���]������N������\����5�%<aeb$A�
��Hx�~���P)4���.,���;c��BV�y��S���
�f}���/e����N�@���eyT�=�hW�6<����;���&D@�om�����e��b�Bq��'�e|��7������z��D����E���c���>�X�aL����5�����	\��`f��:�t�S�}?{.���
0w�1���+����NJ�!���fHX{�2l������~MkH�����s�#V;���
�h7"���u���z	;l=s���F�Yk�sR���7j����i�+_,��Q�,����-��,���G$T�oj4��9l-1�em,�w����%[��rIX�IP�R�\����/"A�B�X�Z��9Ty��Lks,fZ�
�6�<CJ�$`�AH�{��8��n�~�9����a#�|0�Z�?��J����BVh8��<n�>�V����F�]���s���������5����Z]ez"��.���0��kz��X}e�iE5��L>�S
@�-�1�^/d\Q. ������L�5����hL8p��-rqa#��%!��b�x��#�D�b����W��nO������%��z�*4t,��;!�{�4V���	��8���������Q���E�����I���s���i�!������0,_��Z�6o
}x������	�d0������aT�6>lX	����t?L�������=�;�e��N;h���s�t�G������V�
�I>��W/�Y�6�4��"���#���.A�F-%���Z?���U0�U'��N#hg��w"
��l���E�;w.Z �(*G�4bY-��#���K@C`Df�����f���yT����.Ge��T=(F���Qf�^��F�:XNu�.y{�P��	4L+=��%�0��p�r;��Yc��yh��v8oFG�S�`��
���k�,��g~��Y
0��0L/3O�
��/1d�g�����1�����<��	At��
��.���Ao$�>w	4����I��X�p����(G��*!�a����X&\C`��G>��C�|Y������@6!:XK��w��8���:��4��b���p�	K���W���FB
"47������q��;��=��+fiB`���Zc���h�;�t�0��s%,����S��wFm���C�\4���c�>$,�'E�����_�������5�>���9k �]1�8?���	XY`���hS�'�]��?{�TX�ck"�m	)Lh�g�@�<?����������>*����7V��f&U,r�B�ZXsq�{�����k�!X{y>��������<�9zZ�VB@3��D
�~����4���*��-��a@�I���("���',kh"�]%/���&����4�����5X�{;����D�I��bZDpAY��lJK��(���q��n���[�����������-~j3[�Lt��4X�0F��	hq�7��.x;�A0.�|D����������7����!P
�6�@�b
�}\��"�g�\��hg�;9�����I�!�9��NCD~�"���wK�aRO_.��
F��|�����Vp�M��J���gW��~�n��n�p~	+n�4����&�^
B�!��a(z���$���?
�]�%�`��G@L AXOXj����������1H�������#������c4%Q��>����{!��������l�O#�4��������"������C0��K7��+	9��%���D��b+�xB<��8�@C-�U����^���8�?����\@�so����Ng0� ��������C�����y���#��Y��%~���	SWaX�����z�i2��[P;oyY����
B����@��m��w������!�VB6���C��F�y��h�,�����%��Cp�����c�Ey�6�E��	�oF���8����p"� ��E�oDEK��K�O_c����u������P�}_�Q��!N,���@#x9G��)B
/������1���8����k�����5g�P�����������W�����?��oWn>��B��MA�J����)_o���6j�1d?���0�L! ������8V��aj������T�����&��C�C�K��T��rk��j��W��&���m�����E�*�
s�>�P�����D�ML9~�Fz�s
a��[�{}�7\�a�g���^����*��}_��������`^+�ni���&4���esI�6�����X��k�#j�u�-�:`���R:�`	4�d�K	^�@�	�x��?6��,C�]�`e��AU`���������Zy�p���\�� �e.fo��yl%�0���7���E��x��[����7��Y�?z���A  n��.�7/� �#�D<Um�+��bj���rK�[C|@C�_�p{�?��,
��B�Jp��ke�g�hU@���!��B�RT����7�_hpw���#P�'�3V%�Hh}�q?���~j�P�[�^<���!���L[t�P���ZvY������A���6���@���
t���t��`�e���^6}F"��u$��e����SoD��"����pd��z�t���!��}�aP�!B������<sZ�6h�F�������`�� ��B��'�	3; ��
��P�"�']D���I?�3����[\�yA�!�����]X7�aD�n��h�TMA��B=A�9�rbb��	rBl��cx��5
�e<SN���L�����S�Gu�B86w�?�8�����P�l����!n��
��~.��^��
�sR]�9"���o�.P�$���4���Acsh��E�a_D>��D
S�@�_������(��z�t�E(�!�-�q�K�@�9=�����)m,$� L9����E���7]^���������o�W����`����������
4m1��B�FC���#��;R�P����3���{����{�-�"4|��^��#%t ���h��`������c�R�a9�o/�G IDAT�
]{,�����n��b������D<q|VN.�8������
�H�'n��K@����K��(����������#�z�~m�q���������������%D
�FZ�r�������f���N*>hs7�$�<,���%@�{N�4���������TO��~J����;���N�).���.��;N��"����1b�TR����Zr"�R*:���p�.<�[�S�OJeq�S�x�:�;R�|e�����-1������q������#�~~�q'�Pxh<��V\q��K@�x������r ��QD9?�1=�`�������?�,�7~~X}��T�k#��IC=|�m1����a�+b�����k9��qC?r����q����v��v!��u��=g6������G�91�a�L<�#�����cv`�,'t�u�����?�
���y��8�"���v�&�#��:'���h�C���2kc���r�aL��R�@(k����UA�g�I0!���Xt���o�h�+Ah����r�r�����;�t@P�hA*>�����uP6oN|�2�
���{y�nN�I���C��%rf� E��U�����N1�]s	9��s�G��_�kW�9u%��Xv�%	���+�1���g���
hmQ:w�O��PAk��_P���"�}W�C�R�$�q���z��S�s��(���8�_(S<q��)@�����O%�����.��*�������8?Cy����|���i���4X�PQ�u]Y�������[��R�@|~��3.=���������p�@�PKX{�2�����O^I��O��R�C[KS���wE���b�U�J����^����_ ��>fK b�^9�g� �P�D	B89�E�<����
<}�q��#L��TB"���O�}g��.T�� �	�x��hF��M����+��W$@�`��(�/�'y�AU��^���4��^T,xM�n��m�z��H��i~�:�����r{`�\�@������`�+�J;&dPM.�}vVT{�AK�����VcO����`�><�UVu�����y������+c!��5�����H����IT]��
O��s�oH8!�uD�\�P��6:\8wd���Z�)a/	j����Q��p��w*����&�?q��=��Vh�L�!���K��a��R�A()h���k��vP1Y��c#,:���,'������O���s'����;�\����;7����x�AX<x���IB[X�x���::��BH�jg��E?.�q1�z]����z�.���u������*_?��EJH�	4�?������W��������k�B�@E��������AsD�P
���U�a������������B���e_O*4���B�����*���P�z���C�G*����0�~g"�������@�������<~|������}','F\�/�H!�^���f���2����`k`��4th��/L-=�n������������yJ[�CN��hP���|-��X�t�KB�����7[��EC=�������-��0�Ul���#��3h71����&�������������7��o�����v�l]< $�5�Cl���AW<g�/�\xy�L�,��q|��HN�x�"A���)���D	KS	RL����LQ����3v�
c{����qy�����#0���1�9,2T�+����ZN�96R*)<�t�UB�~(�P~���(d_*�&��M�*C���,�90��h�����p���\��/A��7WK��=��bx�YT]�����Fq��f�Z�,sK�A��G8{=��S
�Ga��8FP��0D���t�%d9Q�\C���N�Gp���X	m�_�a��Ujs(;��rb������X:�9�x��>r-V����r}	h���m�������^k�%$k���3|a������nqUjA�����X4hs*u����	3D��-��((*�OC���7��;�`3���.�7*�=���J�������}`?��C4�����6>l�7~B�Nh0���.U��L��u�d�����R�No�q���*�jd�?�� ^��`��d��c�XO.�����8�N�AA{���
����a7]
�1'��W2b��TH�&P����}���
_|	�������R�9�q��?UPZ��a��aV�����Y/���5�I�?�u�pn�J
���q�5��P1{q.�Z���t+�4��"�U'.�6F�BU1���&T�
B�i@�����z�b%7��T�LlH
� � ��[�ZD���H����u`L��k�%��
�T���/���,��,'"iCq~M j�j,�|�"%Q��!��"Q#h��� ��-����6�P��9���	1ucf�#�gd @��]
pi#;���k$^��@��-AR)A�s+q�#��������)���t�}a]�T������:zp����������UuS��x���Ce���U���)�A)��0��xU�����	�!�*R*$h����s���	I^I����������,	��a������BnK*wR�@
�+���exlq���3z���9M��b���`v�R�������2Kp����A���P%�TI0&X���kT"h! L�_;���0�.V�,m�g�WP.�zG%��r!�u���������{9�����F����D�����b�	xb�����@���������/� 1��]�g���r�
����j�G�'�O������W�������6��Q���L2k!Wn�$���l
���(��77R�:V��1��He4���`�c7��DL�&4e��s��Q����N�<�@����x�F���
a/�"�
j��jJ�!��.�u���g�����D�y?7%���Z���`�sHl!wHE���aF�!��cR�A��BtH�L;��=���M��}~����vq��&!m�����s�D�\�!��_���=?�06z�����(��4|��~�g8�A@
,]'m$��������/��k�O�q�<B#|
4�:l
jV)��Tz�^���9�
��I�U���@�?%��=����*�s�	A��[��8�|�!�\��$I��6F���0N��{�r�Z���h��G��(ug:,3|���4)�','���Ni���wpU%
?t�����``+v�������������k��vwwww`���t�wf�`Y���}w����;3w��;sg�s�*"`X��|C2Q��
��T������f$D�p W����q�����;W���$����9;p��r���#���N
hp������s��8ubE�PE(4P��ek}��������I}/���i'�%ZQaa��)iXq��%<=c��MX8�#o��p���������p��P��)�^c$��`�F��<hhG���0
E�n�r`����>8�nB�O���	p��A������k����

��FR�A�������Yrd	&����T��V�j���j	3�� :s�����������B

�D��������������.�g^K�w�[9?��(���`���� }�$�0��h�V��T���������DjBr@�.%�c�C�9�>C�]����(��w�bPEJ	~��k�\	@�PhXr��Thh�R��)��_�SK/���
�b��%�]��(yZ�h5	4<�b��	{����R���&�����8��E��B�,�1Z���?�H��u�t��l��R��3%�E^B�U��%@�X��B�R�@�D�/�w�Q�e����u��[���Y���^�M���B�*4t�]kO]�l$����2A��[��J�6"����hQC��C���B	l���xl<�4���Fe���u�!����O�H�z>H+�rA�Y�!�
P�A�*��+7J����w_����e{H��ITu�z�*7?��+��X"1� T��9$�D9�b��,�������b��������#�7�`��PhJ���	������hG�
1&,'�K|^^T���Z��a���5���c�����h�ZJ�\�>yN�f�rU��\9��K~i4t

l;;��@�&��ws��v"|�����E�hPEao� �vL��o'-B��9��a�Z�v_�%� 8��\1�FE>����	�@�(c�:�1n�.Y�w�q ���>p%n7�Ph�8���2C-,�%ja���hT�8�,p�`�H���/V�����B@��-�����������Uh�U�wcT�n�kx��% �Y-F�E�+�m��8H`�'wA
{�Rh���7tX=-J��*	B1C�>��.�[b5�ZO{�q����:�	5�����c�����|/����f"2���m����������j�v�,hj�i��T=y?��wm.�n�qc�� T"
�+ �2��V+/�����$�6��Me�;��M�!��^��g0*Y���y�9PB�"o�����O�J�y�+4���������0�M�AR�A�$�*4h�[ ��i��Ph0�k�G�0P]A*A{QO|�����/��g�b�T������r���`7!�"���2���,�2C#;�����+��&
a9a�8~;7q����<a�k�W,�%�*���1M�@�6$4x�y���*f����?RQa���9%(4�~	/�P�@��%+4lx�Z*%lx��J��

���������+,��p��A��Ph(o[	�C=�1B	b��l��y\����@��f��w��`f���`7!�"��p4g����B�|m�����0C[��Xr�%
SM!�<�@���+4d�|�~�+��e���?���I)4�?s���*4�]�E�����
#�� `�|���q�)�',~������O��J�U�l�
/B`F[�o��0���1=*G�B����o��B��A�6�|u��kp���4,>=
��t��	����7%�yn�������B��}�c�?hExT`�m���S]��Q�hkL=0=���fB�Xvn&������0q���4�|�W*C�2L;0L�A��M���a��?1���8�x��������U�)������<������lv��(��W����X7����KB
"��'�$���>��V���K�������?`��A*+9�A�&]�$uQ}�0�6�@�Ph�
e?JkJ��;��qv"|���G���&��E�Th�Byw*4���O� CZWD���)�u���Jpb�/L�r����h����)��������p�y\r���=%�=" �&B�!2����uy�|�VTK]z2�OJ�������BXP�'����
B�a��Tv6�k���8'�B�����/T)��������*_B19�A�&Td?}��*{��Q�V��@�/T�

���������u�����MI(4��<�|�W�:^��bTJ��y��T:<���|Vv\$>.�V�����[��B	?������(�!�0�7-J�������L�a!���Th�	Li!#A�h^3aA �DH��p��%����0T�l"
W7��B������q��Phy���8�F4P�������&�� �����0�^/����Km���@�fq=�F���5�����5
������r|�P�0��?�a�[�����*���R��<�u���8�(N�!h��u��5��6�8���Z8�h%��2�E�,�0��������*_h����<�.�+��N��.�a9!,!�u�K� 4�����/%P��B�1����Y�����J��\J	�3=a+a�5-*�����U��u��G�|�������Tay�F���dy�/�QNLAs��;��B��[���CX�I+��g�hN�~���c9L8x�PQ����6��	�����F��#w�����T>���0�6�bC@�A(]��a���J4�|�wy����5�)48T2����(T����HX;�'@
%����D�BC^W#������S�I�(�X�����)*,�����T�{��@K���7	�!��Y	>��S����0����0�T>g�z����B��Ph�:����e<��&��K��6��C.������&d�k�?��-r��T�>}X��	��ng�4D�����B�@�'�
4ywl�q��
n�����
���)@C����;�
�2�h������a���f�e�:��� \K���=?{����mC����@���[�a};����s��e�8�������
��yK�a���2���a��^X�b�S-������*������J���F�
����\eK
�`��%�K8ST>����fYvJ�*�V��)��5���N8���m[]�u���Y�|�	=��4�M;�@�B��v��[�f=�#p��"��a1�;Y6{��~��*�|&�I�!s�1u�&�
U)���|u�r��2�K�_�A���q���F����_����O5��.�#�r ����|���a����o���
��@uz>�LO�E���U�`ll�6�
��(�|��Q��c��$?���������[��$�`>}�|�4��X�I��R�^�T\�D@��C�BC0�sw�P��r��?u��5p��j�k8��������;�>����Dp�A ��}���@�	����2'���fYK,��!�@�����-��1����Y�ol��m(��t�=��5�Q�����3s�T,a��(T+M��6�Z������O	h�xw��s��j�j��j24h(�P#����V�N�F�2
1~�2!q�
Z�E�M�����Ji���A*.��������I�
��q���}$(,as!��j>�;��q]x�2�O��(�Zl8���J9�����n���?�Y���S9�?������mm�V�I��G?y8h��R��y����@��c0l��+��W��Sh�Ju��9����0��Yt+S:h(bk�e��{s�7�p��9�������h����������q�
����KW���3��p�{�����R��9��nM��x���i�~��lX���Z;��L�����M������#�$��w���x��i� (?d9B��8f��Ex���v��s��#J���b�#�b���hX��3�������o��/jP!�k��r�p)^}�N�2�/�P����w��}��E%( ��m��	a��@�7�� ,%�z|��bA"�m�����1TS��)-V.C("�4�n�K��64��Z�P|
4��<���X8���J�!Ts)���wS�7n����Cq��Nv90{�A��0��D��<.V�T]����ic��G�
e�%E��I[	s�1��}�Yz�'Rh�B���e���7��3���L c4U| �&N��ET���.�_�4��C~w��,��W�$d1|�F����"�����
w�;|+�6��F�?����g2a}����"������B$e��_�$o��|�*�P�d!��/���}����c�`�k?�GK�v��r��kP�L��44*_L^>�Z�U�Q��UO�?@?p���^u��H��Ik��w�j�x�
�"�H��u�0�w+	�J�O����NH[��+��mg��zqg���By}D�;en=}�<90k�a��0��D~;y��!,��7�[3��Kn���*-����]f���>��va��
,c<����%���fl:(����7�������O/�*

B��$w��&���_��	@C1;'���I�%�$4`K���R�@4�~,'a�S�6\�/�{���
��;L����~p�B��s[�"�'-$D�����1�hq���
b��W�o���S�/L�s�v��XB�K4,l;�~���'���p���s��2oe�����h#&`W\���<�U�`�����g�X�p��G�����<|��-�[G�l@������B�o~�GN�'�����1� IDAT~��i�20��B/�m]�4_:�PB��T�d?),,[w�N���a� ��<�i+�� ���gZ�h��?H���;�j���PD��}���%m'�_�@��kL��iI���/�!��s�D������z���!��M�����*������+�]����soJ���o�f�7�H���|J�������9�hN��W������:c�To�94��1��~[�J������T�&4DrW���#��F\H�2�
&
'�����h��`_�x�=���N���k����o����S7�����_8�n(�\ �<_/��E>3G�yBY�bc��0A�N<
x�K�3]C�;��_@�����r+�r�I�#�+2�e����q���p��(L�����Gu�Q8�v?���q��5�=4��?���d���B���oi3A�6�%�����GToXC�	1^n���
<Gc��]�h��~^)�Z8�I��w��6�����)����w_�����|��"�0�j�(z��;��D�������j�rf����|��������`*�.z�P�AW�x��1�=~�I���R���so7	t�<��lL����[��f�S��
7_��z����k+h�?>!^(��"�i.��&4�r��������\�����T����7VqL�����������V����g�"lM����(��7��D�
����|vy�w�1���y�s����������N����I���Br@�w����+��_xX�.���v$
e��A����M��}�&�����ial/B�	[�����|��<o�qq�J
7MG�*���{��'7����
���&4����9w\�A��5�����A��9�X�u�q�3�BL+&�%��L�l�1�1���%�`��\\�1�"��Gs�R�>�F����Z���!�{-	@���\��p�_	�O��
aV�������t�F�$�r7q��B�+P��5�}�V�CX�2"^u��P��Y����8���������7��;����P����!�0��D:X�_��L7�����oms��1�6�0" �a�-���1�W�Pk`����0�sl!��[O�`$��R���'$$l|��
�����^��mNk����
U�\��M���|��F�|%(�_[ZD���3*D9���-��yg7�>���S�s�e���������@���������)��������O�����)]���8��*�)�������(4@����=��Thk����� �#�=����X	��[�qE���s��

a�K���B����e����8�n��N����rGc�:�TcZ�PuA(%��8�J���Cb���}M��R8>��U	��(�9�y��<�����k�U-�!��|"�!�- /�Lh�q���HG�N/G8!�m�2��R{c�
12�aF�?���l�4��u#�Q�2M���6
O.Td��"��7"P�	��[Xb��RC�K�<����I���)�o��GQp��2G�.�+8�V�!���Q�@�/7�����x�A�����	�=�`&����\0���h�������E���PA�@��%Dn* 
�2C��9Q��s#���g���-�>�p�v����
�	dc�*@�y�z��!�B�H*����x��aF�X*+������P��"���}���@E�"!@a!�3+�>���AS��~Z0���w��B=�B�<���(k�(Z$Vh��y�@����7i!	1�3��}T��B�A�
�he!,%�#��V���~!;�y�����c6S��O����������w
?��5Q5$�����1,���;��=�(P�8h0�=�T��o~��j(�i��-�(D@�h�F���8�	�kf�gg�Q�����e^=<?7g>������=��|��cA�T�����=�$|��>��e���vq��h���\�����l��A|.F�
��`Ee���WNk�^��-�^"6$���[��6t��th�:�ul�fM� ���
N���V~/�5.[I�B�5mG��@�'���G���)b�	�Qm�g��"H��O�6h������B���a�9��B�(mt���.{=���Wd���
J[��^HT�32�,	4,^�%�D�rq�}����]�o���a��`������TqI
��]�m�����l=%��i��
k����IZN�<w�is��f]���*^�cl����G��������^2�M�YJ��!�eN�r"���!�4���2�!�hH��K
hH�<3c��
����eJ	h��eWg����PC&���|������3��/2���M<�%���=!��F4k �6�����&��[N��k|�*��5��^y�C_��	�	���+_����-����*@CZ��l�%�����S�(�;����/�l���T��
�L*SGOl9�����]Z�k����y�B#��s��M+��Ol9��2~hHKzY������xNI�9���:��s���'5i%4�&���s@CV(JeLhH����}j���x~��9��DZ�+��y>D����"3��
���Z���iMC�L�t�`o#�6�����`Z�L�������M
hPW��I�s@Cj����I
)��4�TCY��,	4d��UJ����j@�W������7LMMah�3K��4����g4=(@C�m
��5��4�]'u
�6�.�8?���� v��;(@��k���S��S����r���9r�V��hH���02���}����������T���3

�M+3�W� �w��@�i�o(_2���
)W�4pz
�)�b���
Y�:���
������q�!nguZ�G*����@����UDu������c���TCHkhV4J��F[�� ,/�#(@Cz�j�MSh� /��y�
�&h�����k��h�:�O2G�z��}��{C�6E�!���!C��Z3S��Vg�%�
�V���&*4d��I@Cf��4d�:���K�Z4h�������BCz�l��*@C�u�Ubh*��U��:���@�:�/+��(4d���
��k�Zv�E�4�t~/�
�d��@V�h�:WL�!����)�4�O�fD�
�����y(@�������5�
��5(@���
�����
)��4(@C����1��Kk0��+@C��.��
�����<
���:�*)*@CV�R�.�4(@�4d��W)�����������T�k��\'���������ETT��h��L�G����#Q��
s�w$r�!s
�^=��S�����K,��������3$���Idd�?��H����:of*b�e12
�&�/q���K����������mat�H��111?���)����nk��M��?#"��������>m��:XM��m��E`n5��z2�_����?�����R�d7���w�d��A��\V:����k�wGGx�>JM1�%���\E�����mhr{��Q�[�V0}�.M7M�f��n��*�{?M����2s�nW~A��9�T������B�1�m�Y���A�)~��M���������L]R��=�u��\�f�;��Vg�6��Z�1_R�=�K��5�c��|���Ugf��S��%�Vj��Oh3��4��beX���-��Lm{oldk�������*����/{�fT���s��tJEi��]o������A������3��������i�R�����
����@���������K�2)@C���"��&�wQ�����3��-r*��@f�=���4���:����kx�e��������w��4�������4��E\sM�����)

3�p#C����]��7e<�y��&�we<�y�]�)��2��D�|���b9���R��S
��u�����yH��I@f�'�zJ�5��)����L�+�_���N
���)�9e<�u�T��TS�7Mx�	p�|QU��������(��fn�S��{Q�s�9�S�_2v<�Y�����+���i%����[_�T�|Y�z�����akk�Ee��"��|}}all��/]���$�455����j~�j�_�$� s��bcc�a

������]4���0������ZN�<4��{f�������sA���&�o�����sAS�7Mn��Mij����]�s��
����u���M�}��\z�?�#���{z�C����&MM����\�����M�g\u����\���MS�s�l��y_�G�_��+

�q%�4��5�(4d�K����<"V�w<�;S��g�uPj*����y+��hj����]��7Mm��^������������k�������(�������W�/NF��7e<�y��&�we<�y�]�)

_<H�b	|��h�b�D)n��h��A�R(/L�7�T^���*���R��1��,��L�k�d�&�wM�����2��,�NF�CS�7Mx�	p�|Q�h��>%�������\fi�Ue<�l8�����Q����3�*@CF������!�\R��Iya�:�U=%U��R=-)k����]�W&�����R*�9e<����5R���M4�������4��+�����^���M��������ij{WU�T�����9h��J)3Y
|h�{�	��{��J���(����r
�����+��6.����.�2�9&�<����S���k6�l���O�{�xFZ�{�kj)GfM$222�^OK���_C�����z�xQAGG'C�1���c�24�O3���'�Q^^����E���[��3qfii��\�>��Ym�~]�I���o�ED��m��<�����n��v����p4]���D?��e��?��_�E�_^���)�����_22����R,gzD�Z�������j����w�+|��'�3�M��*�WM7��M��f�������]l����������3�!�w��Q��i>!�#8,����e<���G��~��M
'�8G4B�S�Rfn���p1��A:U��t���&�_h�i�@U�7����7Jk6�������t�q�xi�����������S��A���r��"N�o���}
�l��t"1���d�d��--���1CK�Bl�~�I}���f��S��7w��sO.
hP���l_J�J
��>4��tk��UK>����"���U&���5����*@C���>�+���M�����-�k����Sj)�9��������sP�*�c���Z&�l��~����g�s�j�[���K������'��)�S"��<O_@x�W�9��R�1>/6fPn���1���<P_��R#{�x{dPn_���)64��	���8�)��3�s�h��������Xk��z��|��_�=�,����|��P��[
����\�J
���������gj���e,��@�U*Y�Tcj���*xy�mFSB&��H�4�%��!�Q>�x�:����]����
�a���Mz�b�N���{���d9s��D�����")@�4d��V)�R��!��hP����UT�w�A�z��ATo-Y;�4d���
�|}���
����I^�N�+�~Y
(@���_V8Z��UR��Uj@2��R�yA���v�
���SJ��0s�r��S^�?�oDE��([�BNh��0nx�{�s�c���4R?��nO��l�J��T�$���q��y����~��$�:���W���(�t��}n�jZ7�EQ�kX
d���h�����s�J+

��`3S��)

?W����7`H������/jh�L�1��l{rW�?���R{���1.�rt)�Tj�%�ab���*�1Z�����uRu\|�mT�6�D-�r��?��C��-`n������QG�����UYn��>5R}��Rh��-Sm����3D�


��?,U�9b��=<�'?���n���CaT�)�,�E�RU�h������Ru\|�(���{&������^���)�
KSz�;H�@���u����X:���X����e3����0l��T�jdu+4��8�v�����0nFU���x��Y�M���}�qX�d`�����Vh��c2nl��2mG���M�y�&�
5
�{�A��=��=�Q���V�����#/`��p��K9t���|c|�u���8�������Fpi�>O�a`��{��\����Th0����
M��/},�h�O��c[�������>���	4�|���p��ab��:��?��Dc�Zp�Q��$W�����������3/Xa���Ys�P��$�8&���������
����G"��W�p\���RsP��/�r:5��=nF
����-+0�����pF���e���45��c{Su\|����h]�&�[,?j]�|�p���4��R���:/*ViO��0�����kRU��M����������_K���"ro�`�g�3���[��O(\�{����^�SUo��K4����l����k<��OLSZ�� Q7��/AdX@�E��+S'�t��L���QMm]�����N	D������/U�*Z�FF��v���A�%Z��1c�v/��k����"44(�����H����c)l�w
�^��z�m;��LN�1�#��xu
�un��{O��f51bM��^u*4�y�����o�q*�����?�M���c���j�^�U�r���,rbL���it����\<�Z�n���~U�xE���U���_T��j����,4L���G�-J�Z��m���w����'N����m��X5i����0�wG���9,���8{�r�Zc��c�%�;f:��f���X�gx��00H�&�R"hD
d��s�j�r�<"�c�Z�
�������e�U��l�P����~�pi�a�s���M��������S7��b�*DP7����s<�|�j��|u�!"*s�����=T�����h�|�������@C��`}g-���c�	4L�U�O��������|hL�t���_�:��wLu���n��7�1�4�������1z�l��?
4����O��s�L�+�
K��@\�q0K
���*����� ���
4�F� b�S|[��UoIu
���A��:��T-�4��j�k~��g�)��\�Mp'��1�y�a���(aWo�=��@C��q��5�Zd��@����Vk�����|�}I��sw����d����J�/W�"8p�|����Q+�"2*m�t_
X|�KC�j���gO��6��F
�e;���M[���@�y����U�olJC��;�\�e���w��W���:z(\wJ�6��r�������\y��'�>��@�B4jn��;��|�q�Z�{��9����h�R�~>�?���q@C	{;�r���wg
���������Z��,�	4��[e�Kb���
����|3��KF�N�~_�������a����c`��8v�",-�Q�����zz�����^adh�������
jW���%x���)�n�JX�~BB��^�[I8���bcb���}��*��������'R%#T�q��1�z������aF_%�,Ti�����J����3�aoe�6e����w�|����,k����]�K#��R��]B�"�Q��#>�B����C��hm��5�IE���^����*��4�\UY:bf�P�\
V@�����7�
;f����*��a�y���{q�����=�O��a�b0�R��i�j9�-�)����
��j��.�^t{/�u�
+3����+�%�b��s��/��a���X\g(^�{��2�mD1�]�z8�=�/��v����#��X�v,!�MObP���tW��5t(c]L��	�>R�!q��.���e�����7��}��J��T��
>�,f�\�h�sM'W��o������2'~n���n�_X kP�kw�V�*C��5���M<���r�H�XNZpj����LFaN^u-��^��7��������R����
W^����]���vxxC��7���?�!�x�M��@�����*�E���`4q�..�����0�-XQ*5�pl�z.n����k������C���a�� IDAT�e]`\�������T`9����p��`��
�l��Z��G�[t
:v��U�c���\R

QO�~4�[z�&F���B��0���.��;n���d����3F~f��D��Hh(m�]K��=jc���ca�6EK����8��z�� �u��{��KX�'?�}�4w/����>�8.���5��������`asL9��	x|�+#c�N9u���j�_r

�<>��z��B��
&
�V����G���X���x����Q�����O���P���3�k��=`T���:!��Dp*L��@��w;��e�����G*4�j���`��?"��C����&&��!��3���-��mi��mv�"������L��BCL0w�0m�����+�xp
��L'��� ���'v�>��.RV�95!)�A�5�Kd35��_&�?
�����[�����>�)�,�K����k/?�.Y�|�s������/������Tl����6���yl��g��}(��7��il>s�~�

�m?��]����Y<?�Vpa5ka��c(���*������?�l:���&�� �_������5|�<���q����q��&����\�z����j��y��6�%��s������e?wy�����>����F�>Oa����l0�O�i��o��`������KN���������������s�1��=�����m3�M��07������#EH�]��8vR���������#�3��
CxD(���MM-���-��7���e�������}L����B�K���]��L���#P��(�����[���Z
�y>:�	on�@��u�`����H�A�j%&�xw�,'�W#_��p��R�9�d,��R����B�x?pBlp$��
`����B���es���h��q�����6B�C��s������sq<��:�����_!�=w��=�)D������m[c���!��: |�vtA�c_D����(�M
 �u �nsG9���2�~���~�H���2�x\�����2�T���;WK���s�����O���K��UN���'�9�>���/��ug������QNlf�� �WxN���ri�Sh�����+^Z�:��p�b���Qx���[@�B[���7_�rhY��lx4��:(<�!�"�o����� :,[B�
�#�f} ��5F���|>k��b?���

�^��*o�g�!_s� d���x�/
�������s0�N�V1$�����Y�����
T��������F���?���9���������9:���'�q��9��F�����������.o��*mJ6D�|�q������4b��RGl�sP*4}|N��P�����
Dq��l���e��xV��

��L0�FC�>|��C\y��7l�W~>�~� ~��2�������O�����F='�#�q�p�q����g�
���96r7����d�y�ha���P�Phh�\O��p��#��� n������.aY�Nx�<���s<r@�?�f#�>-����-��P-��1�8���<��{w8Z�`�����z�V�����'���U�AN*L�q�
�5�����q�i<��`�k����k���}U�nB�S/'�{SsL���9�ef�_T�s���j�$�q���,���]�&�?/�B���Q!����I'������4��
�����s8t�~���l:{�&�O��R��[���1��������Hh`\�Xu|���X>t"�{�����!�c��]��up��#��{�PM�~�%����AB�����K����al�n�k���
[6S:��1�e^�u'`��S����.YAa!���

����1~�"����,LLq��=Y��e+�;���sg�X�o^`V���63�����uX���+���Ty����G��|��5#&���[���v"��}��mA���P�XYy�/��������l�$a���������������33��4�����7������=�/x���~D����==����������b���(���Z"�;�����a����#?7��c%S�:�n�O2��(^��#��>5���

e�7�����s�0���*�@o����#q*)u(4X�)
��]X6<=�|/�rB|_���i(R'n7m��xqi���X�_��09���KCDE#&*�M�17O8U������Fx����5�C��R{���5L*4�ti�1�|xr
E����k��^^Y���"�y��:���)���K������3nn�X�

N���������{����#����wQ�J_����b���L���p�?N���Gw������e�$����C��:zF��@��S�5>���r���&>{}c|^]A�zc�od�� /<<>��,��TR( �q��(�`h���NC��}R�"��l
T�����k�����l+�,{A���$�S\����[���������L���I�
L��|��))4�PI�I�z�T<�}�c�>������l��q�sr�N�S���Q]!N=�M+x}�����o�+����n�s��P�>������c�!����<��
p`Oj�5��H"�=L�~cs���g���
��	C��\����	��B2��^�+�0d��_F����o�2���B�A@�y���Z<�����,��%�&�U4F~�)$��e��.�B������=�&5#�����{$.�M��V
@C��U�W\�����Q��$�+�
.���3/n�_�rnL(1�������l���W�������7PY��������!&�A�����&���K�^)zPIo^�����^"��F�6�:�q�~k4��/�
�=.�0�rk�����[>t�4)Um5)�k3cLi��}�6�|�W�b���x�y�9���C���9_��6�f�h�lR���s8�{��SOo�������TSIN�������s�������l��{����\{��l�����^m���mW��f�f���C��� ����Dd���{���g:��_������yJ�.����y�����>o�C��Xwy��n�s�:�}{����G���G�����2���7����R�UC�������<�x,~=<�[��>k��f��hV��l����k�RhV��B�|�_����b;/8�c���iVh�te����k�|��������tQ����b�L�/]�Yh8p�,r����'pX[7��I`��-��]�=t
�KA!'���=C����w��X8kB�"B�z�q��]���-�x@��pT�P���������#��#`�O�F���0�h>4$w�x��tF��(���@r5��ap
W�s��/d73Avv��,����m�.U��+�8���0��g��IQgx��+w	4d31��k�1�AU��z�*����w����wh�^���[5�.h�����:�����\0y��&^�u��UN<���*!1�z�!"��Y�oz�>�+|^�YU��L��V���'�D��8��&Nxb>r�r0�T
��o���S?w�3�b'�|i-L��4�Uw�X���\���
�D�BCc�
r�t��KXPk��^�<��<��#����t���-
T��W���UV�����U�eZ��y�h�gNX�~pD��L2����|)�E�^�d:��:w�9c��u��d(�Go���I���YB	�����_��u{K��wB3���F��l�"|��B���6�Z����1��<�~��p�������;~����~X��1�����v��/�S���FW�����zt*�{�S��/����Gn��h�sz-�TlSc	44(\�l�a��i2�����������=m�p���*�����`5���	4<�E�J���y�����s��U���AX	VC����X��*!)�!twtu�m������ �c�"d
%�B��/a	143F��0.~�@�p�v�L�
+T����������Xm9������n^���)�|�"�CC�����v!�����H����������-�����h�R��A�R�{��'Z��y�����BU�������`m[����s��'G�B��z��T`��.���
��;�WD0�Z�B�����f�����#����~�<��@���0�T����S4��A��}0�w!�('��8���MN����N#A�!��[	1D�z�i�<����{��	���	;<E���h�u���w,"��X.J�����k�������3;���
��G��CUCR@���!��goB#��8x��}W��>���o�itG|7s=\���`n[��x�t����O!(4����6 ���7������j	l8}3�7����0�Ie��y^��B�a�������8���^��a>�����A��H��xCp�������c;���u��&�?��b����p"a���yv;Tvm�����}g.\�#��)�w`��oi_Wys�>��t��u|���b:!���� �e|��{,X9u���>�v��]�D�B�J����w�S��q��\�Rm�Qr@CiN�)T	[�/�8	�����:�
�s2�.���kDUZ�a��2��z���eC`�-���m^7�������!��=�pRN���5C����u�����M��#�y��r��M�����]~N�{�X�^xqq<������q}���P��P\�8�{M���39)(�������kh��v���
����'��j���`��!9�!4
a���[1D���n1D|��6�q�}��6{��A�>�KeG8�z�2�%���{Cl`A��0h�L����+o����W-�_p�>��<6��K���@���r�\���r���zG�_�xK�!�'�5��
�a���PBZ[��}KrA�/����rU��I
�S���?>>�I�
C��
c�[(�.s��d�'*�p"���y���8'�-|.��\����K��Twi=��tT	�
V
aY�/W�����F��0K<����kf�g��$��<� E,�e����h(0�q'|��kj��f8iI�w-%����/��w�{��I�i�������2��?�@���mo&��|=��{5�5��}&!o"% !���.�����b�����
�f�$\0���}��
Q���K.nD��m��~ �p����@��@o	 �F(�e���H(6���,���{8���A;'a~��86{���[<x�����K�wh�n8���Q�%��_�k�1�P%�
4T%P6�=�B��c!����*?����F7�zr�*�$Ly���]� ����$�`��f �%����u�z��������*I�����������s��7��S�>M
��T{����0��f,m�	��n@���u�W��!�yPBo�}%�0���|���@��k|Z�g�*�r��B%���ML������v�\q��&�` ��>��>8�2�e�^��,�@B�<�7
'���"E���2
�Tc����0�u���E0��EYz�,+[vE�=�%���YG�xt�k��;.��5�h�[�*)��[W�q���y�$�4�N����4���$� `�3�����W��f��]���?���
q�0��mN��{]�M&��q��|�H�W�s;H���;�z��v�l0��w�����;N���f��c���x���yDO�;�r5�<����I��hh_�>�|9{���q������O�-��B�l����V�	mg�E������Y4!�o�!�7�exBh��}:���v���9�
�c������xl�a��9��h����D��k5���G	5���8u����b��L�|���P�t<z�p�,]���u��c�_�����\�
k��d8|`��m�1��v����V���r>����:��a��0x�������]���G���E�j���3�Wl-�.]����6`��n$"R<mu
@�7�L�#��]����A���JX���0�$���bY�� �������9%�P��X.�oa6�������m ��0���`xJ�����	��:"W�&�v��e�.$�0�p�\�2�\�74#x�q�(�����p;2�i|D�F�������r����^0���J=���8V�&��Y���/��
�����,Bv���W>0%(��tk�=�e��P���D@//��K�qxym��>��!�R�g���A�Q��,g�,��3ro���w�� �(�'N�_
k���c����wwv��7����y��
/�|9�!��@��g�8�d�M��P�w)��/��� ��|��^(\�P���Zc�������+���{$���3R�[[`�6�G�h���������	d>�%���?��`�����W6���9�taK(S��i�G�]l���ttP���TY�U���*�F�4
�G�
��K0�l������M��-���ND8�]h@�a������^�f�:����x|[B�V���8�`u��� ��\�y���HQ#	44jf�Mk}Q�4������S�l����j��zHhX�f<F��+;x��x���/�#N~�oe��������[���o<\"d%����.������	�7��6�d���4)\E�Q��Jpd�s�lx�v�wa+V��k����kz|	?��8����G3��+�S��O���5:���Z�!��,��[IK�N�+5!)���KTp�����E��������6����I��mG���({Nr�����u�a������E�e;���ztP%$4�z}���FK����,*:���=�}���
��I
����'G�'[~�����gf�w���d�'9�����K;����A��p��Ql�����D�>��m�t'�Ps8a�����v*�o�Q����C�e=��<;���y�� /�v�p�.��V�:���|7?2���C������`|�Q����s�I�6�a�L�F�*p�;��w�����������Z���G�����P
�}�f�a���h�j"�?�����}wrAR���L�,4�|����ApH(:|�H�-��0j`7�:��9�WM�����O|?i6������	rW�������k��q����))<#��*����$y1C��0����8���))4$u�r*C��Z>�|�LKR
��5�����}I'��b!��2yr��*����e'��'����?���:&<�l�4���_�����r)�z����6f����8�!��H�� �
bGh;�N�'��q���!)�JH4��AG�!��;�Z����MBU�A$R+OI4t,�Son���+	 B��h-���%�U��
X�a
��Be	���A�gB���m~�
�#L��3��L��H4�<��+KES�w���A��(�.�77�;������'~��*��1����!<�jB�R�akj�`#q��}N�>C�r�����GxN(A��A�5L����<�]��i�	����
���-�]������f#�8����.�@�\�0�/f7��&���T_��x\|u����a�]���.������;w�l#�nMJ�R�Tr�$!� �q���0��YMGHE������.��C�K.��s��S|�~�cq��w�{��Y��l�{ra�&��H�!p�uX��������I�Dq?W���������O�42D��h.th�n��0�k-���!k�k��&��A���`��>�*������%��b�'�����?�����{$��0��1�N
���I@aA�qp�<��S!.(IE���X/��]��J1�'9�AD C����/T%*I�*)hsG^���0�04!�X.�������g������w���D����0!�rt��
�*G�"O��VL�6wd�1m-���K~"��]G�t���Tb	[��BA�����/�~��K���,���=+eY����L����u(De�qyswh��%R�A����,'�-���������� IDAT�q��ThJ
/<}�x���6��EcC}]Ll�
~\�����0�������u�ft�]��
�� rH[����A����^���a��nxI���������������N��|�J�T�X{�6���~���S����qlE5���V�8�$�qW�;-uF^�_���$'�������?�l�-'��0v�*L���ju��@�G�����"A,�'�q�-ngqjBr@�P�i��?�s���C����u�4�P��(�R
���s��	Y��M^�F�4�����%Q�;�
9��>�!��E
U���\$�	��vQi���s��`�P%��C��KN��G�.�l$�_�#3z���"���R������-'�_��3{!G�r�Q������p��W���D���}���7�R=A(4�:j��$�b#���9Z���[N����=�Q�����.��h� ��B���)�SXN�-�)�d�|��w:��T��vN>S�	���$�`H�!l�]v)�g�NB���@��U�LU��L
h0��C�A�k���������F:S��.�
�/�%�]�{��Lo�:�-4X��A���y�o/�����N`�ig��zx�5TMp�c�GS}`Y�f.�x�����y�3���0�n@C|\��0/��w[�`����7��0���Pd�5����A�zZ��V��,T�tB	/�r����`d�`����B�q�$`�jHh�c�[{96{�v��eK%�%�6b"V^����%T���������M>	4pa����9����B����M7���-FQ�a�����i����Y�K�o�s��R�a��������T���� 	<�T��T���w`U&m~�.�@L,���[����[]u������V����fXY����^{��L����f�y^Ho�uwx���^�R�1���np���x;?"����g@�P#�v��e\�fh�tqX T�@�U�	��.�>�\
	*�����G��D����	e
�@�=�f#t��N��K���2d� E��w������K�A��Nme��0����B%�������C�(4&�!�!����TW����������������_`,�W4�?j���N���d�e�F�+���c�E����<�&a�:D[�!�!�u��J�F��A��rl��y�������{G�A��Q��0��)�9��?�KRQ#�R�@
�ZtF�E�P�qh���6���-JtP����������b���,\<'�p�J1�����-���=7�	��:�������!�/>bq��X�w��.m�h���`X6G�n� ���\�X�{�L#��Q�Q� 	n4�����z�"\Nl"p�f���@CD4h�ym����Lf���T�����{A�E�QW{A�_���y���\������$&�A�?�T��C��<x]�[�'��ve_�r��g.W����H�����������th�����3kQ��]�W�T"?u��jr�n�0��/����E�����V��������A5H�\T��!�"���o\q����.���P�����%rN�S���0 \K|}~�Uq��������k�7����tx����Q��|��p����p	��R���6U��������}�:���AOw	D��?
�K7��������-�`_o�!�.rC(4�q�/���O�
&�v�0�������3�����������.]���^��V�JrT]���c��t��%U���H��w��",m�P����-������0Cn*J��
�DB#���h�hc��`��m��|UJPC��
B�A$~�h"�4��~��!.�A@=e���J���R}�0@W��r��F�l�8w�;*�3d���h�Z�X*��Y��yT�b-�	Pb��nh��WW���������A�G��Z-�u������~RyA���pE����v������������o>�J&r!��l���&-��au��}W���JpC��.3�o	��p��U��I'�[f����"�X��!����������/�G��lx9�3UF_�'����)�d6qjY�a��g����SxAg4�����r�#*�-e\��P�`|�����q��,�,��}�+ "���� .a��������C����Pl���t^8X����[��T�Y�1���
m�(�� ��T)	;*R�8u�_������r�����sZa�����b�Y���B�h\������[�qD��3�b�z���-x��5��"wF;L��������������>g<���w�/P����b�����p@�"�p��	���7���.�mK��C���#�V<G����	%����4Y�^��.o������z@���JZC��5���K�iu�c�;pf�L��g��mR����A{q��m���xH��a��k/m&��]�������ve7�*����&hxO���7!��J�q~�����!>���7�
R���7�(+\M|q����I���_�6�>���,{@��E�`p���n�K���J���]���g������
^�>���M�?�`�	h�Y�+�1D~Nu�/7�z��bib�@B�G��8��
YeD�l����-R

���8p�������hS�s� A
Tt�����*3�/Yk)��L��hY�7Rb�`777�"R�0���I�@CE
�t>��x1����j	��@C ���)�on�/7 ��?~�3Wh��
���[g�'�����#a�\�I�$OyL�������#PAa���p����@C�\e��E������M	��;�JD��C���X�����%Z����R�M@
A*�����~�� n�d"�"\M��Y����
vs#J��8��&��-���94+TC��EWh�#i.^����!7�zR*tq���

/B�4�E�;i�W����D�r���IY�!��?N��R�t��3P�-7�##��B�F��A����6��

��o�	h��:n5�
���	��p���|��i��P7_����|��]RDWh���*!&�!�j�t-���o��P�\3h�[��2G��j�����'��0\�Q�� T.<p�d���,�F�	4L�ZS*4|���S[wy������s���V5l������_:8S���o��=�J9rQV�^y�v{0V�/J��{�|����0t�"���)+����Q[*4P�!�n(���	(�o�G��=��PO*55�*tK������j�6�}ZyI��<��p�i���4nD=�$c��� ���90i?�tG!\K�����+GaP���E
>^�-Y
>�VC�Tu\>F�����^�g����

���(��Go�V��-�w���WV
,�2�5�O�@u����(���{��cigT���N�1o�yhX����

+�^E���xxqnThh^�A�%N�~��Ta����T�h9c��}8�F���4��y�����y2��-���;����^r�i��]5�!�q���4Z��]x��AY������
c���R�a��%���$�	i	u��|���@�?2�q�c��g�o5��J**D
\�N�b��a(F��7$*Wh��G������ty����p�q��j���1���g����d����L_�G��\����
���q��
o=������L$�P����-?W����
��zy%��0&��z�w��nnU��
����y"��743�nf���o$�  ��e���RP�3��L��X�.���

�_I��rB��M�BCY+�����\�B������@����I�o�2�T��l/o��2B�]c4�!p��pe���8$����;&�!]F�:��L�MaU�w����BC�_(����B����M���&D��� �:�b��%��������n&" }*Y6�B]B���b��	+w"����M�Jp�+�����Q��?t�� �JhRY����i���?���o�^����q�Q�2$6�p��:|�d���p51�F�H�a��cR��F��\��.$��X$�M�]����v�='��\��`�
>����Thx���Tt��������k�$8q��(�_�#�}�r��jPh(d����`�vjv�&RA ��^���}���{h�P��W1�J}�nB�+4�����������m��X�\<�D@@
�ED��0��B��y�{�(GG�\D�	@���;����H[8!��p�nD�]	4%�/4Q�Ph�@��
���32e�����hF�S������� ���!���(K
��T����I�����B�j�v��hhE���C��=��������
P����g����
@C~*(t�V_�������}��X|����v$�B�p��O5���R����~� �Pd.$���,=�<��b/U\	qt���Q A�8!hhM����R��t%�����4��MKeS�4[��Th��������Th0�j��~���(�+?�E�6B�L�B��j�b��=R��a���@C�*�����'�{�f����
����;���H""��(���J�m�$���,���>���2�^�'h(+(s}��.T��g�B�u�9�����P�R�(��OP�������a���<�$�L3�mer��
��X��/7k"��r���zH��@�PMp{~�@�=��J ��](4��B�b��w�u�Kw"�K��`C���%��[����P&�����+J7��4�2�Q����Q�*E�#@�0���F�u��	���C�R�![�VRB�=� ��.&r�l����������.o�z}|$��E������9�BCn��LBQ"�;����%T?x/�-^���+]f����}#D)y�M�"W���	�agT�!o��"�R����YG!�8n-D�@*���>U1�Rh�V��?}����%`��!.�A
�U��E��fRQ!h���H����%�p� �����y�O%B1)4����pq�PB���X��

��B�A�����G���H�)|��z�!��N�N�F���8L��R�����0g�<���Lp�����p��� �\���tS!�?v�VY�%� ���[<P��wn��eMH��CT��������t������8���Eja���TOh�������a�Ph��]*44�j��)t(��&"&���-��a����p)�K���'���p�(kM�����A�[���)��c�yG�S_fT
�44�����������^�A�'�4@! 8�y��K#����H�!�ez�������Y�`<�����c����L5��Ph��X�f��c�0���H�����R��]����<���s���]��%E|Bl@��IF�j���ObC����i��#!�u[��K: �2�-\�\%���Z|���@��

���y��tI�/A���iQk�m>s�.�B�Z�h,�

��FV�0�;�X*A4_�I�
�����UZ-��-�VJ�
�
F=�Z	.,[��_++^��kS*@C|FY�������s4�P6_��a����D�:U�y�!n��"w�lx����{��t96����Y�������?|BC�j2?��p���
�s�bx��2��y�1�_����	h�-�+�u[�b`������4���-����D0�
I���	���5�H�������nW�+��o�o����.7o����x*7���@�������O^� �U��;
��bX��X}��'���E�!��o|�����v�P������=�5���{qku�
��;`?}v����=hq���-���?,�<9x�[_m��Su�]�u*�h���kc-;UU�AH�+�Bn����|���XL���g>�p#��
�:\�vm+�6���pI����?�6�Wnl{z��5� �74���+����e��
� ?�� \WD�a������*e�G������5����+<�QQ��3�_�o�W�� �C�un�<8*DiO��!h���w>e+����z���N�L?�.��$�~��q�� �2���<��
����s��-]��ls<���,*��������0K/�������q�p�*�B����1����'���E�>�
��/�z�l��A��fb)�7��L��r|��m����R*�W�bB�V�{s8���/o����?

�3�MW���[�0j]
�t1a�9�O�<W��0D�wL�y���/��oc�������<���_�b�P��,OP��{UJ�{�������!<�� |���&�k(���;\�"���x0�[��ux4�~���P:kvn�;�����oB�����@y�r��q�.7��$�p��{Y��
������v�:,S���&r|B	����x���qZ�������V�����s�m�C���pq=�4@���:�5m:��/"��@�K�8�
���A�z3W�u���[�����GhA@B	A������nI������9p��n�
R����N8u��������^���mB1��%E�7}�G�Z C���A�g�(_��*4,2K�"�!��eJ��
-�kO�>���.�[���t�J�����EE��t�Q�J!��W�v��=&�-�5�}-�Q"�/0�V��V�"��Fe���9���9i�	t�S
7��C���
�[��rY�c6�Jba'��63�,?z���B��^�	5l<}��~��&�4_���5�t��(�#j������-X��������z�I�kO�@o���M#z�M�A����~t�v!���W
B�V#��Je��8�-��y}�6��+7����������-�D���g���� `p��2/�f/���pS!��_P�fo��2/��c�S��]�	��!�F]	4�tm�"a�����;Vl��n�^~� ��FwBFF��y��@��S���+*�e���-��C�z����8��~%|V�TC���"K�����C����w����{���/�a��KG��a�H���� 
5�#�f?:���k���	�m��hPg��[R��$7���d������7=����^��Mq'x}z�/�P.���FR���v�������e�PD����0	��@*0D
!�>!�7���@�vN�{�:�����{�����s��v��P�l��M��P����A|/�T�g������t=�:M�!��R}���n����%(!��/�!���,_M��xG�
�s#��iU�*mn1��|���.���Y~��(G��b��3G�������^���$��c���cl�_jp{��']���n.{)�@�u�r�
����(��
�����@���82��_��4�p>���T<n���/t�4�L�{�H��[�7���
��zx�)\�A
y��#-n�?��v2S�
3��mD���7����HW���4��|���hC�n��3���z�p7���	Y���bOdkk�#�@�\�Z���U9�����a<�p�bShx���
Tk����*�*	4xx���J�"7a�r9����M�)�zE
g�]��0���\���'	�Z�5��}q�.%.���9���2m����Tfk����Y�
f�Y��um���o�����*\�k��\S������r�VMU�!3o��1Nn~xM7�#��R �O����O8��)�S�`��K�(4T��'�
�A( �N��U����K�
���u���������L������.��������a�pChXu��tk! E�|Ba����a5!���? ���c���/�0�F#	Kps=(�}�B���\W�g]u���bo�W����h�P�����u@��Z�)M�I���9�m��C���MU
�BC�F� ���h��T�(�#7��e�Yc�7t.,ue IDATZV��P%�h�!&��!������p>eMl�����B7U�1���,�)�@���C���B >��4��xI(#{K���j)%�PP��B�x.%����3GbD��*���9��A�A
��E���!\��r�yJEY\f� �S���OPA�HC������=���"�:����o�?"�rM�s:�e:*,J[K����o�
�����IhC|?j���S�9�|�7
	~�vhT�
&nY�	����m�Ae�q��8"�6��o3�����I%�����!&��t�Y���X>���B��;�E
�Toi�r�k�q=t��l��w��"Y����o�~��~�P�t���w������8���W�:J��M@��]xp����d{vNFs�� �?� �
E��SY��h�|<Nr����jD��M��<Gid-��f����o"�-�#7b
���	\]��"Wy�~A4d�[Y>�B�����$�� \J�~y�cy��������j�u�d�n���h�}EO��C��#Ap}�#��
o��!?]a�����n����{JX!"�h�
����<'\�C�/�*��D=:>�jFTB$�������bD �He�VB���5�
���

B���L	V7���2����u�}�_����J�{���T�2�W�7p�gMp��P�88����G����{���<95G�A
�T�v�z�!�N�O!�����%��X��G��D�`e�P�m���t
b]��ty�+!.�A����HU.�_����~�@�(�Fc.[��:�PBpt
w7!����JB�����T�M�%��j��z�k�wL�6%P��JzTbx@��IKSl���*��eZ�<;v�*����y�;�4��\���R��s���/�&���� `
/�<�*�p(�/��P�p�"� $����B�P��s��(�(]l[�I�"�B��������GX�������9_d���g}c��8��.|�n&�sw���T���l3�D��Nr�����2�����
7�D#�D:qY���[�|��t��.
���p)!�O���Q�gI%��{"z���G���x�����}?��p�yE��ZG�o��f����N��j��cF��Ut����T�*#���%�	F6�*�;�\�`����@��_�������\:v��oZC6�+��af���!�8O�a(?�`l�zEm���t�>��]�c���H����[�M���n�L�Y�i$� �o������r��M��X��R1��*��"��X\zv� ��3�G������
��C�1��R�X�1V�@C�"�Q�@%��������j7�����������s����p+�����`$^&�NX����R��O������+[���S�M�o�P�l����Ujb��so��-�'2�hhY�1�ds�z*���a���X����#��T��3o�q�����U�����Y�.{���}�P^���8��^���..�P����[��M���
��c&5�*�������6/��N���ehT�o���p��`�Fh��K�8�R�-&���'Wl�~@����l��PN8�hP�
�<������W!�4��Y�b*���tl.'bJ3r�|�pY���|�"(b_ 5�%��$n��
�bRT���ODZhH�VL�y�t�!�-h�o�
�����g@���Q]N$�^1
	��W��4�j�q��
h�+����g.'~�]�YvT���ol.'+�����\N�c�#6�!%�,l����l����eg2��LE���X]N�.�������$,2Y�VhHc���"9���r"9��^F|���a_R���DB�@��P����]��IJ1
)�����@C|�K�q# �_�SC�J��~R=���m|}u�W��1mT���93�&H#�������H���,/.�!1���yEu9�P[���A����6��TM�K���T�'�G�	h�]U�
hH.{~�r"�l���D�c�4���RO�T	4���U,UZ �Z@�-�:'��ihc��n�8��N�qV�3�*�A�V��8
��z�)@CmP�?UhHXw)@C��-�R)@C��4���
����-������{R��
I��)+��ZW�E�0���h�I�)1(@CJ����)1����0�F�?<����� �CR
�ln��)@C�Z�PQ=*�hC��fBMB��H��
�9����R���

���)@C|Z+��U����W��i��hH��V�ESf~�B���EQhPm���A���y,hP���G�!hH���
I�?
��C+@C��X�W�����J���iU���Z-u�V����_��)�����{���A6�4|�
��
��])��%���
���-����@[@�p�!����(4Dv
����PTk'K�A����c*@C��?hH��Q��X�x����4��vWJ��P��_k���ZRC/)6��P���S
� ;D��KhP���O)h����E�=��,s�~������%�JAJ����p��[\|�.EU���o���������[�~�y���1���lMlc�!e
��>���[�{��4F4b�+�x�QS-�nO�������������� �����%��w&


��kkk'���@���d-3za!!!�[����������d-3ja	��M��'X����X@KK�?�,�����
Md	�1�uuu�:�$VF���}+���!���7cCS�y{��~��|���F��q����������By�23I��]���*S����$����g�=j��M2&�!�)���7M=5d�	�M%]���^�]��, %������9'���\��^�����g��
	Y����$v��{~K��3	Bh�g��J��]OG�����O|"�:��'����0�����o�h	_����������[�������@�^��*����]��Dl�����������	U����f�������S�?��^��������j%�	).hP��7(����?Rbk����?���2%���6)@C�����e����h����#S�LPWO���7�2y�������V��h��:��I�����;-�oiu����V���<���\�{}���7e=g��5���H��iy����MY����--�we=������S���s-����9E�!%��bC�khH=]��0������, S�*q,������sQ6��
�_E�'��<�)�9e=�z~��ciZ���*��l����PM�@���K{�/
��6/�)@C�{Q�sis=���$�z��@���O�m\�Ei�~k�/����wX���V�o�������L:�����\�eQ:::�Ud�('��{��L�����!}}'��D|�L)���:�E	I;!��V(�}���'�xOIm�����|.��������<�����V���<���J��[Z�iq=u��V�����:�)��_��K��GR��xO�w���O|�L�����K�����������=�=����V�s�9���w�y����(4$EO*y��[@QhH=]���K{DlZ�� ~���>����J$K����bE��:���������:��o=���H��]Y������iy~K��/�z.yo�%���/g���7e=�����<���\���zNQh��EB*��w��(@C*$��)��!e��*V(/Lio��0)HU�
��8�c�R�O�O{��iy����MY�)���2�$�iu~K����6�_�A�kNI)�(�9e=�R�br�����G�5�RB9�xW�{r�ChH�VV�����4��.U^����3Z�Re�, g$��\��xW6��
���M<+�����K���:rJ���4���-��we=�6����= [������������:������iPU�{����!u�g(V����p�e#<�o�]�&���V��������3��������+��{e<el��9���c?$��
i����B�������(y��L��s"�kXZ�v��wj��q���D+���&|<]-��dT�`%��:��<�<�iB�C��zQ���j��y*���������L��<�!33K%�4������g���T�^
����VV���W|@����EN��-�1��^��R��-���������R�*7^<�O�1o�tx���dujZF4�,��2.��
�
����d-��V���6��h��Z�R

Md�]?Q�J	�T����I	�(6(-��@�@��(y1k���,7�u�OX��a�dE[+;�I�+�& ��(�0l��D��dJ�hH=�@�!!�U�j�i�!�m�JJhP��T��
�����R��_i���VRN�+@C�}�
q�QZ��
����!u�[rX�
���4$�T�PZ@i��jhH���y>
��
�1��!9ZY)�?�
��z�T�!!�U�j�i�!�m�JJhP��T��
�����R��_i���VRN�+@C�}�
q�QZ��
����!u�[rX�
���4$�T�PZ@i��jhH���y>
��
�1�~	h�>���,�\�bJs@Q������oF�#�:L�������p��y�}�aaa�P�Jw�����c�1hjj"g6+4�W��lcJ����L�����h��1��(��X(@C��phP�������}�
-����+�NY+��������U�6��t�'8�@�|M`�c>G�[��;$(��%��[Na�aP3P������O���	�O�"�U���L���{�'�<�]i�2����#��R��N�`��)h�b$V,��0����t9����=C���w�6$6�0�}{�����q�-"$���er��'�
e������u�������b�q��W%Rr
m�N��s����|i��y�q��eF����xM�x����#kA�)�wN�Y�gE�R�����������$&�0�Es�����K����t9!�[��{�W�2��S0h� ^]������S�h��EDy�Aw�A�N��p��{P���V^��GhH_��=|��R>|�v�?��n7u������&j���u��!c��x��_{�%��X��0�����.����vV�2v9����	s�2�A�<q�>�s����0b��x��R#�����%x���I48���_*�d�������W�l\��:�}1^i~91]N�n��A�wcs�h1u�l�45��zU1p��x��)rj���D�G^��g�������>����^0�����/��%j�%����+��'������1��]|��P�1��b����!>��
h���-f���=������1	���ax�f��bq��ED.�-�,���6������x������/)��q5����'�U6�����P7A�"*�Z]NXd����Z���G042��C+���m�N��c�����x���\��x����{�G"�������=A���D���:OQd��W/�A��K0gR�_�B��Lhf�[��������%�n�Yh������"]b
�������wX+8��+Am���HP���D^^��scchH��%�a��%5���s��U���}�x��#N_������Y��
���X�r3�tm-��4�����)���PW��{@������qbK3o�z�����j��l:�t���A��+�n(@C��{hH���>8?�C���Fz8Z*a��
Kl�a��u��%�}�������/���g��$��@�qw�=�SB��
�����G��U;��������}\���1�M�@C����]����@C�1Y�h�[|���NL�A� ��N�0p��8����@���%1z�5oU8M
���h�lVn����v��f��x�r/��os8rl�C}S�8�V���T�.	�+�������%�]���	4��}��7���?_�|w��~��P��P�=h�=�������k�v�!s�����>����1EL.�a|���t�������;����l��7n'��V�n���&8}b%�����U0���_�2)��	M0q�3��k����eF�Y���UhPq�U�l��� L�5nR
����O_�����
�-�`���>W��-)��6���=�\�;��������`�����>Jb
2��.�)�<�� 0!�
5�u��������
�Z�h�m&V,���?)~�Hp���U��S�c��������hx������s����"��'.c��#?�F|����OL���P.����G�*@C���(4(@Cr<<~	h��x-��o&���� ��sK?s	�&������7B[KA�A�Mh@�7
FM�C��R�O^�

�������W*��v������/��m,��/_�-���7���K7`H�NR��`�<���'ti�����j��i�~9s�J	I[���@l-_�!�c��������XU���+k�I��������>��iBILk����y{�oY��/n0,[z���$�����?���2����
��r�������t8<vn�{X�5�MS3����7�|P���<�����w\!&�!��_7.�7Bp�EJ��t������hpvw�����-s��{W�ys���Sy��=�"��n`�����������MS��x�?\����5�0��-^�~�J���	D���Q����`:���h�����

"m.#+�Mo/�		��
-s�@�ksYf&��y�AZ�D�3���1�!������=�B���{P?Ky��D�U�1����_��%���d�����^���6T���F�h����A}C��)>[���I�������0�h"�}�]l#u42��/�����Pk��RB0����5a��jzj�;����0lku>k�3m��0j���[V!��x�7;�M5����^��5G��hf��i�"�)��O����/R����������
�.A�H��4�i�-<_��
^P7Q�QWS�����9��`��P��(":�����;��&7��];�M�v���u��������O���-�4���������t�	�Iu��~\:���������u*Tm#�)n�[1�!�pj6gO���u���=f�Y��^q��)4�6@���vjx���g��US|�������o������@�\�	Z���9#��V�p*6�A�}4�pB:##|tw��5k ��XX`���0��C��E��x6n�+����!o���tI��L\@C��yP�.|���*�gF��yp����������X(1����3[LZc���Z0���9�_�)����9����Q+���?c���#�����=�!�N=������M��w�s<�c��',;~���� ��}�)�������o��`N�s��r�n���DV�������vU��c��7�p�%A������\��]G�����2U�B�d�d���k	55���o�?�

���@�S1��/P	�����q�8��.&�-�������s"��o+�����-R��[�yX��J2~�����r���U��I�����������������lo���348G��8f&�Tg>}~!�N��%U�v���A{��l
�tV|O
��s�,
��=�>��^�v���2X�q��|3���+���T�w��E�������8u~��.�.��&h�t�������{�/��!�m���\B�U�?����RE�/P@&�j5�lPV�����E���b_�:�7�����{U��PG{�]S�����0o��������
t�8����s�*!��M|�s���h�?�2��(�O���y'��[�\�q�����R�!V��W���B���f{ju��,�����0B-�?g8Qy��_��#���� �yzB�Xah��-7����>����B�!����}���j��
�mJ��ln�����aV>/,[���|=�Y{	pRM������>������zL]h�6���.<������HW�24(
>�\F�F�w ���_��w��7�NC(,�k����������W�<�.��{��|s�#���}<�K.�� IDAT��2#[��x��-��|�L�wv3<���&��_x;��������w�=D>	�d�B�R������."��)�����������^}���]�
S�g�Q�$fP!�G[���CB0��9���w�20�E�
�o������J�Q���	�����BC�����N>}��<��b�=���UW�ce��x��y��3�q*B�c|���<�����R��o���z���-��~�����O[CBe����g�n��>�t��S�4����O�o�K��H[!`
���wq��C����m��{�����&��|�6��|�Q5���}�~�����czL?�Z%�p��O��]�9�3qN�n�P���+'x�����q���>.��U�J�I/���������s��W�}�	�����>���p��g��������cx;��&�9�_|���_��m&�-����@��' #�6�c����|
���u�%��]q�>�@~���
�S
�.����nq�+j���;ESG�C����v��~��g�?Ep�
U���D����/��X��_�{w/l��w�|@��w�n�x�>5+ �e�rn*�2g@�|��.������B��'1�Y]�\���f{�r}��I���U	��e��.���17��I���`Q��x��c����zud���;Z|�l�E4-��?��,f�"]rB�k�+�\`�Mv-����/xy�
�{X���`�;���u��P������8Uhp�h�6vy�R��[��������/��tKrbx�~\�^�X*"��"B��V�i���!��8��-d36���s<ja��g������)����b����S�N*4����gTi8���,� �
O�zb���XX�^zx#��1�1�'�{��-B� �Ng�?�_�

���n*D|���i���#�����{�{�B6/�����w�C[����ij�0���y���U:sl�p|7��PD��I�7s}F�����{�]��!����%rg��b�.\��:q�g��E��K`c����6_8��o�H�����cZ���x>*���A�Rrm<n���
��e����J5�v����=|������t���[��L��3��CC��r������gbi�R��B���}6��S��E0�K{����w���ye�ca����s>'���+�*�1�a|���k��/�1:��%~&�{�-\��%!�V�C����T
)A�!o������Q;6N���+��X�O��a��?�~0]V������m��{��y��%�5D�JM������,_��V����������%p�ye*6C��������"�BC�
������$�0�Zx��.��#&�e�Ox��V.��o�S����5�U!�['
�]=C\>�S���������s���:������;��%C��A��s�;�H���s��2�����.��CK[�:z�xf�|��Z�#��9����q��|�j����x�|�����~��e�~�z����%[~���.�����Iga�^.���������������H����R�B�0\�t����}���r�QcE$�P�Ng�:T��U?�ib����ic[6�e�Gcq����}��p�
0X��*�W���*���P��'�Z��@?P���
>q��m�av��o[v�c�����l���~����}<}��2��"%��|��I���3���}U�I/V���q��]���%��W<�
%����+6#k���6�!5�M��,�����o�	��o(�x |��e��A_T[{�JFWh�9yA�����#���>}���S�>.�~�/����������Vv��^ue���S�{hP�U����Q��P.�+l�o��3����!s���f�XD�t~(�%k�r3�	��Fa����;�?r������AMt4�f��TQp�QWo�E��������l�������{�J8����!z�D�B�uG����|��O��A=;���<7���9���,�T�PT����@|���o���M�P�)�l��@���!&�Al>�-�,�����<�-	���:ylT� h ��5]�4����$�bRh��<N}�:����z0����_P~Rf�\�
�/!(��n.�[7&����u>}�z-�w�2���|�� ���&9��03�z�-�C��{{z��Y��@�\uq��d�M���6h���@��`� �y��E�BP�I�*$���8��
�	0|w���%!����/s!���]���Ez`��y�Y���=��w��g�����%1���H�!!��T�n��q�b��]c�Y���;���^�r����L[J�5>!.�A!.���u3
����@���U����o����F���
��zuE�� 	4hX0.��y���vqW��}H�{��L+����p�#t+*��j�i?��2���/0c��_�SH��`�'���dp:x/#��I���"y@�q���s���O-���G��	?u�}g�$X�]@���*L^�Gb*4Tw��26�1u�_�[�v^>�C�7���N����
UC����g�t.^�.�����0wJS���	4lZ3%�6��7����cV/��t����,��A~�����'��a����%�����%:��������j�gX5"���O�=���%�x�����~-nJ4Ll@�	��������[�$�_��q�[c��+���v���'�.{v���;.\���1y�fx��G���~DU�_x9-����/rY�*���{���Jc�g�y��w������T����/.��$���_�I6��N7���r.�<��	5���C,_B
�.����0w�36�����\���;^y���K`���p��,��1������4����]�b���(N����h�h4���	��������![[XY���k�$�m�t�xh����[��!#:��
�Q��N_��N�f�����W��t!@�����~Z4�6�&������9��-2��*"�UBo��<�] ���s��c7U�"a�b�%��1}N	>�9<O
���8vf�����|���C'�J(@�e����{#�^��2Z�+�!��"P���l����}7�r�!��t��/�����
���g	vW��W�%�af�I�YD�%4���;�Oa�H�p��6	�D�/j]*�m��@\��M����������[8����=�5>b���e��^��3��aE�����>u���0k�^�r��]G���G�3L�������
hz��/y�]���?���-����A�V���!!�����z��<�&� x�o��i*����uv�o�T���`�����}t���:��S�e>�?!�.��5$`������A�c�����]��e��s�9���~���a~�]�q�{���%�x��)��������
v��D��rZp�F�Y���o��E�M�+� 0d�]��C��Ex���3	4����Pp���b)26/���nB��A]S��Ap�w�����2�������p;x�'9�����<�A��M�l�^�����E�u���VTbx5��<a���,K7�9������$��sXm<���0����Un��
�SW7d�{J��V^��&�
�7(��w}+���s�P�6?>rl_y�F
��_�jT��[�����{/o�'��d1��vSS���iE9
��x0KwQ����4��Ec����[6A�-;P�:��qa��{1�q}L<rn&:���Gd��U�c���2?1���c��9�G�������@�),$�Q5on	D(4�%�������m�= 4}�7��� ���7��nc����cN�z��e'������Oy�8�%�C������WXC��Q b�u']�u������������s��
7��s�'��vYMaE�g�iLn^�<��<����_G��XV|�<��M
������_��GY������������H�>�84��������
}Q���_���*�8��XB�k�>��LiQ}V�#T�L@�	��������z����wbc�vh�p����O{��k
�����������o�#����#�2nC�]	�6�e�
����-�a����Q��<
7B2�	;l�p��������'���6�n'���?l2g���T��
�W�3��>3������z���~�+*���b ��;qJB?1
���'gO|y���:0��#+]�\������|���xOk\��le������U�:�4 ����7g���?	9q
����������x�<d6�'����<�@CF���0�iv<z�<t�!<Z�����.h�/'f_q���3&��f���r�w�.j��F�����j�%�p	'�;z��2������/8�������_	4�*W������vy�8tVFho��iW��y���i�(o��g*�]�Hq
&�X��/Z��A�����1M[b��+�����@��S`�5��v^���-�a��m\��c7���s�!��)�k�Ak��y�
�p�f�����D���0s��o<���	�����&-�%�vn!���
��T"�P KV�&��=}�uhv�F3'c��1h0c"�������I��Y��x��.<
���~4���X}w_C�<�p��G���$z��
+���f���P�&3�q� `�1t71��3�����
`����{=-
\����q���#��vc��'OA�L�a��7�[���5,8��=TE�S����(<zo	�������R�`��V�\�=j\:�M��&�0U��*���fI��"}	 t�>�y�nj��y���r��}�r�
����C��<��A��EyP�����b$��Z�gOl���;1{R����HU�xt�����U�c����HhGb����*�>6� �!SN�o:v�G����t^/	O��>����(V��!"�!x������A�e�D����Gb.�Y(��n��f�=�w���%����������~W�j+�:��{����_���"�@C���pVYwM��	hD�Kt�A���Ph�/R�_@�����LV����=\?����eW���"�����3�������'�V�o��#q��I��,�����~�:�a���D=���������C%�"�b�rN?��'T����O"��i�0ed}���l�	X0�S|1�76�A��@/���'#S�R�x�
Jl�k-&B?{F	4<��������~������7e��;�/��58�Y��+��@���
0��!��B���/>�B+/h�.��`��ep����<�U����!�&J�)��%�*�bF����;�/�%W�%����w�U�_?�jTG�=#i~:���f��R�&� "��B�;�����f���^8}�$���9���a���&|�����X![Xg��w�?�3���?�o����C�r%��F�8}�J����,W	J���D>Ox��N0r��m�p9j�	h��d��zz����Ty��`P���fW���AR�����t�tP��9�x�}g��W1���mqG����X����wUCL@�Pf�:�A����j]�Z��hP��g���q��Y��5���YnI�/��i��J�M��	��+�� CE�e������/�K���_���[����#���h+���G��5%����!��xNC	U�������1��@���-C��`�G��W�g�&x��J��h@�B
K	]�*�QB��^I�{�/��xu�	ZT�~��j�h��M�����m^����t#a��A��xX�}SYTL4��d���
AOx+���u�Tp�����������Qh����7!B;�6���$���&��m
����}A%H!���x�pI�j
�R�A
��Z���LCW���4z�
F#�F�	ZhYk�@�7&�'*���q��NG8��������r�F�E���T���@��(����/�����]n�O���5�����:O1�=72��yK����Th@C�#�bQ/�-�\y��@���� ��
]u<_�����g��m_��kFx���^(0>Nx-aU��\N8/�&���ovo=wN*4l�:�����j�@��~CF=�����-�X�J��q�
d7CW��x�[����C
l����q��ZY�A!�7�gt+����pc���r���X5�2��=��y��.o����E�����cW\z�)���j� ]���a]����J����P���
�>��W4�P�D#��s���

g/n��}�.��E�����.Z5����K�"\Nhi����1kQ[T-�Y�l����*C������t�FW��&�����\_����Tr�:�$����
cm����Pe�p1���[��:.����Ze�7�@�PG�s��(@CD��u�����_�/�.��`�����H*P @�Y�P>(�P+2����c���2~D�"���S���p|����8qv�g8Q�B�����*9|W��`���v�7�����u"�3��_�{ �����^����G<|��]G[�.�����0��6��k��[���[rv�Y/y����C��16S�����X��/:-��B�"��w9�YS[�[��
�6Y���T���%��-A�uT�iK���k	���"��[������������-� ��
vw��vv��N������9���9�����bwHw��s�ED�"����������=�=���ze	4DP����G�y��O�����C��-�X�59!K�H�A���E���Q�q��Ok���}��#�&� ��Pbj:<�
���]>�jf�zH��h�
�!l��D��e��4���u����	�a��,�����,�.���C���f@�����9F�K�A(7���F������ye	�Y�HE�|�^x��3o��+�3�<��9l"������
��qj���#n��Nh�����ylS�?����F�A�!��B��Z�pRG�"���@�*�e�b0-_��Q���4XQA`X�R�`.�'�$3�j��%��sO�%�A�$�88@�A�u��`(U<_����`��VE���*:����&�1�IC�qs��[	1�Y
�����[����}~��F���C��$�tq�`�)���/!0P�V��  �1T��}7jqAY{;y�|�Yb�^���M�� �V(c_�p�%\}��4T�m�J��|��g�JRB
BM���9]�#��=���!�k����hS�4��/��r�{Q��<���:��$QiF����������%L�.#���o�/F��0,8x���K%�u�c����o��y�����xE������
w&�5�:F/;Wk���H`�7.��P���K�^���7�XkG����F\x�����j
���i����+/f���
"��J�}�
�w�����If$���
���W'�S���B}a5�������������A����U�U���J�P��5��<�C���8�"��y� �x�'��R>{'��B�_(8�����%%�`EE������q��<��YL��#�tr��S�}�H�zK
h��F�A�@g�x��V0�������n�v~����7}���eqh�M�u����,��2�*|fz�����
���K�
MK\�~��!�NSuA�	h0�{v3���U�x��Y��k���+�r��X��������+�&�T(>�$���B	T(H����
1��E�����9.����2�_����/��_���&�7��s��l��-��0F��cx�Q��(|Q��R�^��v��<f4�T����/`���R�a���
����1�={FR�b��u�^4��D~�29a�1k��D�}�7FiB	eAL�Y��]z������7V��1y��B/�P��� IDAT<;2�g�� ��o=�'�>�21����~�d��;�.�/�����kI���~�e"����LN4t�C��8B�n��|
C7�EU'�/d����&��fcJ��ghJS�^!g������#�^�c����{�I���
�o����pK��$�����^H����������T$0���?C������P�C�����|*`��He4�R-�������x��}N��j?�*��`[B8`�����m���p �����p��j*�����TY��A�=��9�&.��T��O^����)��"��\��^���p���0r�"��B��'D�"�*�F��X���o$\������
huQ��6��!�)Te�������_����rE�n���������*'�'��8���
��xz[~%�U�H1w��6���dh�Hk$B�A�k,��;y$o���������D�^t��kB�`lB���%�TWh��=�dm���e�{���IYN�^��)a����?��v5q)f|��6�����26K��q(3��39a��{Z��MH��x�6}�s�_��S�����������Z
������_
%&������v9XU)I����VJ�!��7B���nA+������w������7s
lFq��y��N�����S��|4�����	aj�5o��9x~��3�7��E�I4P�
�w��	#����F��Hj��Uk���[M�R[�CJ�!�d�'�B�A����Y�������O+����y,Q�O�N\8�/C�?�)5�F
dh��^����/���K����1��o��\j@Cl�kD?z@)����=6G x�h�D�TLN�]�ezY��*Tc�k����
h�'�Q��/%:Z����[=5�!��Z�<l�.���a?�����j�0q#����EI�lPA
�hz���hJXOH���6==�a%:�tS*4|�T[�� L@�����tsi����c,N�\�3�Hlyv
�<������p��*�_�IpA�>�����]���5Fc�EL���Kw��B'*@�h�{g3�U$ ��� T��6Thf/�s3�����h�	Q�#%t �bR��_H����

'�6A$��[����D��w�����	�0�&�i�a;��Q�a���6��N�����i.��p���yB� �_��*�� ��C����8
T|y	�*MOH������K�s!��*�

���P����b�����xJ ~���@C�������^X>f6Z�'[@��c"y��>��|�.	hp(\

������P�rx�����x�o��x��B�!:d���[Y���`XT4���)�oV�hp�d���xx��so[x�?��,��M�<�4���J1� �p�'O��?���<�&�p��l�:��������Cn��h;3!k/��h���$�����nq�����S
3���,*4�F������V���D������f���~��SDz�<�S�z+e��,%�Z�e|��,>�^��1�oHM�N���a��#*FMZ��F�
�`eYnT(�tu&�X�yKGJ�h����sG���!D#�!A}��n���

��u�,*5|�����

B%�u�aT=�)���.�

��P��I�+���F��QQ��$:�h���=��guf~�Q���T&dh�4��i���Tfh�x�K���.&�Z+�(���G���f/����f��lp��2�x�4��H��Qk�B�
hu����X�n����jU�(MI�xX���I��P�8x|��#�JEJ����GO��D��4�#��"����D��n03�B�.T�[<<��]���6n�EaR���|��J�Lf
��_�n�

=(.D��}9�t��.-�A
Z|��y��j�TTP
��>��!�Ph��uW�TD0�UU��H�� LD��x�W��]�fC�Q�ai&@���14;��C��P�sx�X����M~�Do��8����h0!�p�-by� ��M�����ga�������/=���_-�\z
.��#����
hj	O~?���u�
��<�X��'>��)4TX?�z.�m{w�� ^�R�a�'���e'Q~�`��I��[������1� ��S��7Bu	C��{T��{�*X�

*s"/h(J5��|���T���o���p����r�
�WA
]��N��7o����C5���9�p�!FJ�6�  LU�*,=w��+��}����MWP���2�O�&m��F%��o:��V�U�&���P��`*�E���~��C�*Xy��$0�q=����
e���3�|r��k���.*M��%���t���m�r�*��Th���B�
h��0���������0�Q��7~	����	�o�E(#�&�P�r��.����>+�&����*@	���	�������'����ib!@��P
?vs��}��@@t�]���a��nIf"RShX1�6��;��4)%��\T(4���S�iU��P]i����#�^z�S	b.�^��s��T�R�	Trq��k���c�m��]$� �*4��BC	��9���:���9�6.�B��-`�*��j���y��

�����1k��r�[
w�uG*4�Nt+�[�J��\&���>�N�R
�*V���������E\����$��[�*|>�Zr�*���������q�
%���c~�w�JGU+�\g��hh2](4<�BC�vq��=�Pi�+N���:��~��j��:p�/ T@C{*4D�����9��)&�������p)���TQ	8�3TXu�>:�*�4�P���4]��tQ����J�	/\@=�B4����q��T@C��`�?�p?V����a-�azB8��0|�	��0��Th��>�K�{*4�wv���!���S�"3
.p/R{=/a���c����<�n,�4�t��#�i�B��A���$�%Wh��#f����Tj�h�ThXp`�7o��*4����i]�

����G[���U*At�������[@C�Y�%��i��(���U�c�����%���f�T�^���������[�����*���)�H�A������D����?�s�����"��B��Xp�J
��>���50h}�B��3������	�N������gn�E��	u���q#����<P���47�w��������!�&��
�4! LH3G��.�B�8�n�z�<���~�H���eG�3E)�9�/%L���CQ�f�i��8��+R���~�>4�0Q���//",���3;d~�B�8��+TT����;~J#$x @����5�?f�
|?�A�q�����C�V��R�H4��o^3]�X�|��Y�4Be\�����m�
	����y�.��"�XH4��=��_�k�K�_Bhr"yY�	�3�7!�&=�}2)44o;T�xp�".�<Fr'�%�������������{�o0��!�t�������h�r �xL�f<b��)LP�ThP����������[ %��ya/����a^�h��o��5K�&�)e����rS~�)�!D������x>��\Z@�A!kX��������K\a�4�����nNY����J��{4��;��}��

|��A]������`���7�^����n�BC=�-��y�
Lgl�\�m���S��|4���I����L��n��J3ZQ�p�nTq/�
5g��y�+�o�MN$�T�;c>��7����+n<6��	������4���I�����~�}!�a��TV���q�����
����b���$u�������e�{���24��&`��N,�)�C���y��6�����.��W-��g����� nX!��c!�tm���i���ga��tHb'w�B����W����o9J������aW�8	h�)c���
�����@�8����p����@Tp!�x_x#%����
� ���a�20k@�a�
��z"��qhS&R���J&Bm*��p�
B��Kc�d�
h?��NBnf������z �����%!L(���(8Mp�!�e��sg#��y�N��"zH���� �!{_���o��@_[�4+1���^��-��5����VT�xHpa0����I�o6��+�%�������H�B���l�e:��p����\�G_]�9`���:�g4�W4��8L
�b�6o���-�
f,e��<����x	���j�ph0�F�1�p���	-�3�F��5�C -�0%h �K�u�i*��7�?�y
�d���`����A<����@C��p���E�?��9���n��G�:4X~fE���lF�P��DQ8a�B��4�a����NcnF#|wo�Z��8�����B��F#	P���B���~*9;��I�����{M�&HN�V���+����t��p U��E�`l�!<g�[Q�Th��������b�n��������{s����`��I���g��#�

������y{�7��*�.���_�'�e��m�j�DJQ��-��`]�N])[��|�����I@���JM�r�9�.��4)�(���d^L�������>ca���z���7�i
B����aL��a<��l�|���I@CW*74�� ���W����m��p��N��c�v��0w�T)^l��N�f4mS�l8h�+BT��m�P��5�TV�=^s�>�m���E�SqA84h���1�x��*����\
�J�aRB����\Y���b��4O���)`T�r����@��=� �����?�_c��W��hG���'??{�'�.��A�}���'�N2��Z�"LD��������:��|�0 �|"�
1����0�P��6���g� F�'7�����C�F�8��c����w��0�_�Fs=��f�~��s9T����O*)����z���b�<��=���5��e���`(� ���Bvn��v���z� ��[��CQ�JR�u�cC3��9/K��:����
O�D���gvLD=;N�~��e/�:�#��W,�!@��kVi/MiS�jv'�}�jxV��S�b!#�B���	Ly�G(L�}p��������w�u���Miz��B3���Y�?BYB�R��6n��LS���c�:�w&�1-�/���h�J��lGm|�j5F�h�4��-���Z�6]u�8�U��o�o��m�x����?��e�b��#��%����������;q�N���TiP
���]���^fFm�#b�^�tJ��$��� L>$P6���������8�i�nR�!�%���DUw�w�R�A�l)�.�#�S	�+\�����@�i�����������'o����X�*�"��E��LX�2�T��'Pu�L�uH������Y����i����0�JX�_��r(�IC~��5�`@h ���T\N
���<�������4a�l-�I	����6��4v���:����D3��E�m/8�h����x>�q���8�"y�lV��f)���QIiC84���a7^B��w?�(l[T��
�M�����V�'�%wYQhj0�7aN��&#T@���E��r�(
���0� ��B���El�
-�Y���hs�_�3��	By��PLo�~���5�'U,���LI��e���$@�_�EJ�A�d�B�����b�?�1��2���	�$��[�|���/iB�Sh
C��&.��Hs7�s�ToXu�2�b��p*P1B��0�;���U��\�A�:�UC������&2����Mx�E����7,����������4s!�V%����A[B�op�)e^G�,3e=&*�|��X|�&5m�e|�*P9B�Q�e4hP�ifB�}����2��*����7..���>���B�8�hb@
b>`�g���WTux�	�'8��P�"F���v���*�m�wYx�>�h�G�a�X���u��K��E0�\�\`���9���6ZQ�A����oT��?5�A�r|��5��&��X�C�*�����Y����u?�7������&�[1��{�����4+q�J8��,�1�Y|���W��Rj�u���E���6�����������([��Q)B�:�OR�yiW�������U�2��a���s�h�S�
�jT�ZKN���$����������y�fc�;�o�����'�%�+��T����Q�H
hp��[���������0�1Hl�����"r����s�B���]� e�:"2 "�k����'<P{��n��P�� :0k�57��yHX�`N0�3����=� �x���N�Xq��LG
�t8��O]�*m���	�s>�X]�<�����S�Y���}KC}�U&��$!�P��0C�h�~��4��CS
Zc��s�QZ�
*�w�z��vv�4��1����@�O8����r&!{�7%�����"D#WG�B�B����h�������R��&��	+��n�����TnhZ�]�����4oMe�UIs��c'���K�w���MR]a�����QR�����iB0���vZZy�0n�x���b����d�X��y=���R����wUh�\�A
=	Cxu���LO�{{����hC8�
��ZM����6��a��e|^R7��� :&5*G���q���5����� ���J�����&6,�o��$�PZ��wH�WT����T��@3���	+c����_�M���?��+T�3�V���w����_x��v��GRB����@Cy�F�_�i����+�GI@���� L�k��������p��\�_N
Uj��P�$��x���E�&����=�l �k7�F��-��h������0�O����v��e����h��aA�EJ�a��Y������#�P�b�Z�%���n��=4Sp�J�%�6��T_�@h���M�[�`�,��XG��qJB5�u��=4� ��M�aD��4�hpu�(�(D����+	��/TDE�Q��SB��4��.���I\�&���TR~����TxL�	+*R��M$/K�25�����3s+�7�$�C(��;&'�r�,�2����#���Z�����%e}^`�����W.�}@�����~�0���*�k�~�fm��4����'��#$�5�*���O��4��qYX�&;��������/CC������}�?	e�w�����@���~e�M|�?�Kh@v��Ksqa����|���&��J}��,����)Q��A�6.q�/�����@�?*����
��P�}m�?y�h�i����Vyw,M	4��:�}P/�<g�����%
��<d'���O���0(KS�s6��C}�����mC��:���kR+@C��6h�g@�_K��B���K���i�n�5�rBS.ZM�+}NTb���!��
^��Y�q�4U1{�*������G-����TMN>qB�Alj5�_�����fs#�H���n
n��I����y��%���
Nv]�R�������[
dhP�|i��P'lz~�A�*�����2|j@CV�Hh�j�y-\r�9������L�C����Dn�#%����S
��/+���Wf��gr"3�d�oF@CV��K��4���g7/�MNd5.!�C�}J��P�x�j|i�Knr"���l|i
��'+����!Lz@��|��MNd�LY��N^���Cv�'T����:5%�q��(9�r*���+#�!���!�K�����KN��h��xU��4�t)�Shx�y���UDN���������229���"�����Vg��WAd�L�<p�PW�s�4n\9���R
���D�G�o�@�p^/`;�Pd�e7|f��/�M����*wJ�!���
9]�i��
�h�������@��h�;m�QN�y��DFm����!s5�
������!{��<�4�\]�����]��CV���KE4o8H��J�n��f���4$���Z�� IDAT4��S�!�'W�`2!���i
+^H��Bq"+��3J_2�!��W���)�/h�|�e6�4d����_�_���rh��-l���??�
�9�rh��<+�e��!k���P/_�����TM�$�
��I�])k>�h�?
�
�����	

Y�u�h�B�:u�>�(

9W��BC��eZ1i:���k�������w�U�����&
����ZxE�!�����?�-7r�(4�]�
��=PIC��r��!�j2�x��<w*:�A�~a43X�����*Q�9�w�����%��_
(@C�i3hP����Vh�J�%�Q�����:!�A�ZR��4�WO���
��=�
�
y���!��P����HS|(@C�lih�����V���kYr�*i(5��@N��4�TM��4(@Cn�4h��ZV����@z@C@�}?�t��
�"���Q�$-gj*T(#�����!o
a^1���^�W��6�]y����XXXd9���Q����r�000P�]KK��d#!�	1��vdd�,����)wn%z��&���x+���DEE��4��g�8h���V�SM���v���":���NO�J�q��N3�� &�(��������zzzY��}4������M&;�=G3�"�����v�����G`��[�r��[��"V���3]��!�o�n�B/,�%~������c��q�E_�"e�Ov�o�J(�y���=�U!�����������7�h�G�f���	�!����.�b��8gi+���{���f�f������������C�T�'o\��"'��_�o�\��������3��TX��EB����*�8���-;����Y���~�z��2��wC-C���~���A����z��}���&�p2��vh���V�;�w/�B�{�b%�r��r&���%..N������M�����]�e�L s�
��c���.ZES���`�+O�&��4�������4�V�sy����_��o�|��?e�|�4��+�9����|N3/�)�9e>��s������4u�.�����)

�IW���5�
����
p��@j���`�����&�y�-��&h�]}y��k��M��i��M���2�������^������y���k���������F� !M~�ijW�h����r������?�������
����+�=%J
(5��HHH��{22����H^L��\X~r������9"d����r���/�Ty��8��Pv����3�����E[�q9::Z�nv�6�s��g��x�~����}����5�������~�5�����]��o���5q>�|������=ng&~M}�)�����e�����������u���7e>���s����������M~�i�|.'�{^y��������B�����Sj Y
(

��;(���p����T�X��D����SM����4�������N�������7>���f�X�����X��r��S�gb9�2��<	~e>���rf��?�h��M��)������LN5�����9M�?��Erf�Rb��P�������4����39U&�
��3=)����]4��G�7���2��o��������
A�|�ijW�s�������<
����r�H��/��7�V ��IS�s��%w�s
����T	��5������L�������p.�V���I7��`RL��X�!@XDbb�C��Q�����U�����?
(���*������i~���666gfE�h������{Fks ��0�����
QQQ���e�����h����U���g������9���#��nt���066�f��K.� {v:��W�u���<Wq��
D~�������
�R����[�2��@�����:�7m]����@NM�������M'��~���^�����?@@-h�`��Z)����(��^���[3����Z����#0V[�6���[�������V��gOn(����_�!�P����
��4o����/���y�����
��;{)������������.�s��>D��A�
�f��ie8��-J'Ot>H�D���-`ej�+�+@�k]�N���$
��N�(~�HQ�
��=����2]gZZ<����p��v���E���A2���C��W"����[�x�@�{&�W��_p�F�{�%%��\,�����������9�����(�
��dY<������o_
���a�oK^3V�F����VE9���+�3&�Y����X$���8yzE�/���������J�V
������Q�������������J�,{j�6�6����4�>�J �����7���6��m��5��Rxm�#�w�c�A��t[1�P~��7�x���'�������6��<(��&s����d]�>1�����C�%�j?z����@M?kt���]�i>v
���M�|"���Z�[�����4(@Cnt4h��ZV�����4��&U$�����4���F�i�j@�Vo�%�4�NK)@C��s~IE�KK)��5�
���4S�hx�V�A��h�Z�+@C��-?�R�����4d���
�
���z��A��)���
��?%����4���W�hx�57��_���]��+�(�T-W�C��t|�,����g*������P��H��'R�"��M��8�O�r�,
��vK�)�#KCP�#����2�\���|��O�A:=��I���B�.����s�00��SY���+�`7�9|�<��v��>�35������Fx���L�K��y���J7���X� D��	]Gk��F��Q�L�1h��)=g�L�Sy;�	mKUI�E|f�j@��0K���@9Y��
[:�K�N��{�F�XyaM���M��Y
'�M���Mga��B�����*c\@"v\�i�z�
��s���I���A���0n�����J��X�����
����`��(90s
Q�A>x��o��e������I�Fx���.86����J�������pn=Z���}~���r��V��<��EXD J��s�����9%��}W`��>Y.o��3�m�OMT���t��:Q��rh��^	��+_Q'�!�y����wC��uj�?�sZ���k���dI,�s���Q�"}E���u���S'��H����9
4L��2~�t
���C��d�,���1�{%��{*S��{^�U��t���K}7���j��K+`N
��������_a�_�2���;P��
�.�T8u=��B�MC��&�������$s*��������n&��SK<]����)sh�!����aw�^��F�����)��B��NB�kn=KS<[�/�yR�I��}��������j�+?*4���F���0o�B�2�G���a]1���j�OxR���,{NTh27��>g��C������a�����EkP�JET�X�������2vH������0iL��{���[����z5��f���s�16m�##,`�^�[������<�<{�N��W�en��a!��P�����
��w^��BC���+'���kE�~������h��vRC/e���?�������P9Q���Q�����q^=��kE�<4[��=L����v���@�����j	��v �`����2���2��; �'��
	1�Zu�����Sz�.`���S���$�2'���?����j��%0!?
	1q@�i�ZH���9
4D!4�V�NY�r����[���e�,����sh�����Ypm�9����;���W�7���LK������D~��p*�2[�k������T�ON
]���M���m��?8���P.�q���&5rh0��9�V��q��y�!:.�4|^����@���6��W��Er�@�5����-J��_\���!r
h�(��*n����.�\�Y��� 8�1�X�!�������U��Pn�0���v-��I�a����r�a�����G�!��1�+}W'����4T*Z����d����4����I�P�@���Y��l)4|��||��P��/.!@`���?���8r�<�tm�a��
4�q�;w�Z��K���L�e�P���J����Z��`��h3S�'�0���X��d-��#�XdXX����*�Y�gyg��?.����B��-�����Qgo ��K��C=h�I����G���u��}||P�P��L�[h��@CX�?�l����X�,��E+c��/`U�	��MS����:�1|��93Kti���0���������2����������h�[��=��*4�|t���FB|�5#����X���;|�c���.����>��X��t�
��d��A�����h�y|�������
C��]�R�N�������?��]s�B�]�(P�
�e�H(!..��
%�Q�'��?J�����L���%�l��0�{?D��?K����O!:2%*5�a��� ��	<���K9����~���A�v�".6G�$�mQ�-��K�W�|�N��a��v�b��(����-p.^E��e|�	I��\��pt�`��DdX����?�;`	�_=�
5m4��%�\W~�
��~���K#$�
:L`�[�U�;Y���������9��|��d||��DHx<������V����x�-�������/J�������
������C@Q}��i�m3`���J;�:��P.��
��e&���[BQ�����������ADH�l]f���0*0����.�[���i.��i��e�����`l��7�	#����0����s���Mqfc��#�?�xk���!n2/��GC�P�����=Ij
jU=�4��#|�:�L����J5��7h�Y��Q[D^8���0Q0n�Z��������6��;&Y����Edp�/��vt}�2G��+�6��i����q1����/�����y��El�7�".?����0(N������U�a�e�m��~�zU*4��:�i��|�F��u�y����^��F�
��5�f�����t������z�~��Rvx�kYFEN�>+

�w_ t��!��kB���l���%,�4���pz�0mSM��`,�@��;�8}Z������e����@��SH���ISw�wE��c"d������K������W��E��0���Q�� L[V���
l������������DBT���j\��Th���H�eT���_��^|�ZU�A1�l9��W�m�{5�8�Zq��xVa��!k�A���ej����K�0�Q�����WaX���tC��3���R�B�Ta�<����X���g���*�~c^�f����������.�?�wC���9�5��:f�o�E�FO�cZ@���
~l=�sl]��������������j�7��"��}��sb��}f���e"���|[����w���_��M�k0�&Xrv�>8.�4)��Z����Tp('A��W��VSw�v��� �(|�Y	�h�O�t�.aq�oX��L��?��5Fm+C���7���dP�(�f�"H`��WA0jY�mU�{<������io��}���W������>*�Z{ l�i��o���/�u��3�!����[����)L�WE�#�}:�f�������8��J�����mn���x�v�%���D<��7�����{�K�5�Q�=s���*C�@"���|�`1�}��]�n����s�/Ce_5a�"���q�����f�%�'�c�e�,�+
�2���R�q�����:3��g(YY�F��x�u[��ni�?��M��L:V�����x�^������m)�k��f���v'J�cV���Ow��X����my�4��Bt�+po���p�9)���lmt��?�������CID�=�bC�����RD��~��N_HE��+8�K@��0�w�

�����_���[�;����;���(�=��k��U!8�����e��6��}�%B��6��"����!\?=3��X�|4���8�@��-�6�y�9��\�a];L��CK����
���1���4�d������#g86���{�9�6�`�����k����B�}D�H��xqp��C��aQ�z�w����:+O ����"�xqh1���������?�V�D~���e����%�����s�f�4@��6bB�Q����^E�Y�����p
����Y����V����ZUz�D�Z���m�Q��.jV��{O����hR�9g<wy�����
M��V*$�o>��024���'q��j�+��
�nwNCdT:��J���1���� ���~]�������s�k���W���C���+_���K�����)���^*C*X���

-~���!08qlR��44�xT�EF�t�����~E��z��k�8����E��&��25�V����{�����bn>A�O�U**8h�K�!�u0�;�������b��vA�o`��G�tL�o��m�>�8���a:�5��`��2��\��u�)4l~���dT�),�����p���BA#�Q���(�w-{{���Fxl,�.,��{Ht4����c��Xz�6��p��)��������(��0�V-|y���)#�jq��E�����^�{cc1��U��� ����	���9u��[|�/-�1o��5���* �.����hc�
���P�=
����5���'
+9�9����O���f���5�,��p���aT�r(Q�q|W}6�J:YbD�rr������B(4���
�P
�?������L�����[��:y��W]�{���<��
Aig+t�v�,��������������]mLYtE�����j�}���sf\j@�-�K3��
]������5'�`�����2���7���b����Oy8�/;O�R�+D>��\�;/����Z8�����R��������7t��-�[�1a��ip/�.���:f���1a�|�w��=��G/�z~C�g����?|����Sh(����y�	�E%^�l��y-A�"��I(jIp!�rt�����L*$8�7����{�������j��u��xA��'�2 q�8�E,�6s]N��;��F��Vx�2q������C��	C�K����B�/�:\C�����h�A�X�����po��)4�yI��%��"���k��"p�4�n��q�k~':�i��rMFUC���,d���)���U������y�vKM���Z)���_cW{8�i
���X�{Q��2���/�p�f�Y��mLG����_:r���U|T4���&n��n�O#<Y�~�=��>i)4�i\u�9�8&,8�z<{���<N�x��W�`d�*r���M�������U�w��������`������Kn]
�����7���nq8�%U����T[��cE��3������T�G�x�
A��������r�.��<����e�N\�����Y����W�zP���L�>5�A��U��#�{W��uaL���Q�:	����.|g��;#��5C�6��M��?�kk3xc������P�+�1}�>xsBS�2�L��������4��Cg��uPF�&}�
jWU�=*@C>~�k9���*{��]������=p��iXZ��l�b������c�1�������q6L9Il��6�:)��{�p�b��
jb�����DpH��$����rcad*�RdTf��
��J|���/.����7�Kf��}�R�,���G���jN@u��!����oPr����+�|K��4�-�	��
�0
���	t����Q�����4�}��>��=���M���c(�R��������TR�T5F�r���2j����Ht^��Z-���GC���5v�����zIfh8�g>������(���`fe/��8�
zF<�o�3{��fB��p��ATm�O
�p^G����'�#�0��������5j�qv�}4w.���}Q�������
@���q��n��* �m��U����`����w�"4�G��p�^��v.�D`��PP���N IDAT��~g�����=��I������^O\>��0���ez\�{�m�6�����B$*4�y��������U��(@@
z���_P�n7�8��G���_�M�xp��H���p:N�r���NB�����m��N���]����4�'���e��}�,��z���2��*#���"0{k&t2���1�VRk�D��%�S��4<��{�����<�P��!����c,�/�����p�l$�ta�������9a�8�Z�f�X��c	*80_!��Q���#�qc�7h*��!��.�
���.^?�C�W,4Cx`��G��f8�5T�}t)����������h4���
D���x� �=�%�p�TL�u�XJ}s��R��^G��0j�
�����\/����H�#�p���]u���x���,�vHhp^�/���<$��u���C)����Li����7 @`P��;�S��|;�C�(������WA����
�������2��k���a\��A��y�c"������<���y�������X	�:n0,Y����d���LR�p������P>NKz�i��4o:)!]G��qC����G�C��k� ���!�g�Q
��d�K�%� ������+ >(��f�P-t�EB
�$`���O�"�P�R�7x8k�xnTY�����7����^���1����M���#���V��8z]�
!���-,%� �j����V�~Z����������#�!`��3�.A���/a��"/���P)4�C!��di�C�8B�$	T�6��A���c��0w'���g�'����y��r��/�@B�-xhNhB���a5��,�8����E��&=i

��Gu���yd6��j��.���S1x�p������0l����~�,�m�V���<	48�;�����]�������-^�`K����0i�WX��2�X�e�J��m1���4/a[#7��0��.+@C|xB���&��|B`��[/@��+�������l������A�-6��0���>�w�|xS��	2���s�aX�$B��"tE g�5���(�r�^�a�K2��r2j���f!��@���#! ��7�����]~�P��4�<g/��VT?	B���0n^1��a��B���?#��y�9�O��i������"�����;xI&0a���X�IC@f��!!�r��D�w\�^)��/��bm{K$S��u�r��4���H��TN
���S���|F�����nP�8����������q�G����&�h��,"
y�xB�e��;0�RQ����n���
4�Fp}�v*���n�U��x�w�8�2s���<�)9`�<���y��M�:�c��< 1���%����������G����Vm+���t���Uv������������+����iw��f"����j
1Dq^Y�~o�1J��x��;�;��EA�]:V
��g����bx�oW��l���5;���Z���C[��aW	
w��G�������8�y�2�!��B
�A��M�(�2������j�L���B��� ��e
!4�Z����?=;��D>D8�@�M��JP�b�;eu����"'���N�F��E�U)4�Y26	h�&�!�p�����wc�`�>4��xH�K��r�V���I����Y�U������P�7�+����N-@��~�^��!�~hZo8v�i�������H����n<�?��J�Y��������p/�hBC�mQ�/s�o�1�i>�"�0Uq��tn�
��Y��0?i>b3��N��a��vM'���]2_�Q�2����b���e��}��n����Jh0��wF�������L��"���I?���N�]���&"���A����{�����F,/��O���_���ny����UZ�1���J_s�TE�J����1���/��I���/pl����_}&�e��O�
��{��v��>=y_U��g��`�@����*�L�tI���14�2��	�v�*�.
S�#��!�������o�v?{�v�����'�+O�F��:9���71�T)�=u
���*9:���F�V�����e|Z�f^���5j`������0���<�<��`AXx����7�ZVs����0��;v�}*UVOi��?@+w���S���P���������}~:���F��&-8��4����}�4�:���O���o��#0�Cy�9x�{�C�������#����}~<�zJ9[�9!'�	�m�A��4/��F����W��:+�h�n\��$�������������V��=�1�u,�u�_a��M�����P��44�;�v�Z�q�OhS�
6����_�F����Kh��b��n>�������a�mGkGL��3z��G~o�� �n���	�	0�����
�~j���JJ��>���s����������l8���=&��OE��|�"�2�4��j������h��&��``�/��������cxX���/���@#�o�7!�/��mC��HHA����e��jN@
q���?����|}JM�A��h��,cd]�X�{�H'EGZ��=.��^�9N�� ��|�E$�5���?���DN����%�0��&"��9\W���;����k;D^�����v��'^�uB���0k�	��_�X
�.���xY�H��p�
�'vG���p�5�����5��?���9^��E�k�I���g��C�[���%�`�X��mC�����0(h��k�"��������aZ@��I0z�^�<�����E�P�k��v^���M�������x�GU1c�
�/9?u��Z�
O�
����R�G����n��@��m��7?����r=S�Y�������*��c2L/-�!��M�y�����Z�A�x�y7�f�@��O���L�{�r�.��k�X�F�����2LS�!5��l�9��h�<�������BN��PXN���C�����#dA����\Z@���G�B��-F�j����ul�b0������7L�.?,@Y�B(�h�-�=1sH���!�$��^2U]Y��
�h�u�8�m�x��7�.]��A$��/_�~��c��#p�P%�������q��r��7���W\x��MN�nF�x����8�)�����8���������%
a&���Q~}��%l���	L�j�.U�2L`p�d����OVM`d��+��e
�4X��?7
(��y���i�7-�!�����W��n����;�y�!�.�
yh��g��������J�S�8�o>�u����!5���4�h	��8�O �����5���A�Vxp#��@D����
4D�&�P��lo�����5q����T�y�"P�R�*'��KV��B1	4D�J/W��\�BTD0������<���*%����U�M����Yxz�,<����C��������j{WO����;g$h	���P�X�[=
�������JA8���h�@���k	S�zvS�>�o���l9L���m[�NW���
���x������F	L���*��%T��f�o�
������kG$,Q��
�H����~��{yO��0�phP�����d�*1/�����F���������Ih������[1R��NY}��P��>\
&��V��4�������(��\cC����_	|��1n��>��{�Du,���E#�+e�I����04`���%hP�7P.���B�"����#��f�9��D�.DR�!�����5_�|���ca�#���7�JB����6/	A��fR
��(K�r����(	4]�:Tt���Nf\j@��Uu���^�x��zNE��w������~�F�����</i
V�X�O�z�	����<��[������5I�h�����f���K~�29!T
������e��0(Q�*
���Y
�f�$~��#LN������l�ex����a����Q�������g��&k����/\�=�|o�R% ��.��� ���mT�r�)!���O�jH����{#;)`����d+�qkZ��l;K��B��sI��%���Q�^�4{s�VQ�X�
��e%|s����UXj��y�P`Rn�=&��]g[�<z%A��������+���  ��~� ���vx�_�`���i{�0����u����K�y�����R�A4����k�4DTe|=koq���Q���"������k%��\��+�y������qsN8	4�[���y���oS��U��<_i�Mh��-��5���CY,<��!��y�q��s��;���E�~|6)������c��sW
BiA���~���.�E�K��O����������l�_��F(��Y�18��&���%+@�H3�7��/<�~gTu�

TR�����	;��x���`�5q��29!�B���<T�A�^�������o6�1���U���C�o;y�fF��)G-M��7[	���x3������������k?���xt��
?�������^
��	�}����q�0�)�Q)`G:L������B1��O=�#<0(���l��������1���F6��Cu
�� �-�
H��$��tx��������uU�|K`�����UY����Y�Gu�Q�D7�!B�������x�"�U��EZ(P���ww� 	$!��;3iR$	������{������;w�?��
	^\�&����b�t�e���I���u�
����s&���Za�!�M��
�����E��r�]l��
na����`���-\[��_%��H������(�s��o�P��8�G��'{��`�I��M��b��B��	���go��
c���GT��+���;�D(D�Y[O�R�s��*K����/u�|����J�=Y�y��'�@�1���e8��!�)��QF���(#�Cy����B�l\X�0��`L�#��f���no�$���g�� P%�c'$�dq\o�W(�}*����k�D��;��xvW^�PH���O��
��qn�p������� �.�u�S�Q?�����T��THhp$V�Z_�|�CT�)I����jk���",%����:I�V��a�x9/@����%�����RI����P31������4b���>x����0e��Tmx��] *:D�������S	?���mc����=�?r���$H���L��B������B���*=�A�c�F	.#j7�TX���F���0�as�TG�C����w�bN�����_2.�tr�S������W/?��gS�l�m7h�y5�am	��c�Z�z��x������a�����C����^�
���X{�>UE����	:Hv#1�������/��9��C�`t����u�����J
�?�*(���j�����J�(O��0��1���a��G���LkF�A����!%KJ�A��������B�A��x�������i)4���+Ry�z>���[OzI�����y�Q}�M)������+`�����d�*=m�Y��v�BQ�2#�-�R|��<�8��e����-�4�J��P���y��R�A���'T�07�����^�5�0����~�9��KL)w`��8z�T~@Cr���K��m_i]�g$��=�:~^~����?��|��
:|?m:e��`��y���"vQ������]��	���1#�fU��S,o1,%`'��:}����V����w�\����#}CT+R
�h�_.G��S�h[��N�=�����������_rh	h����7�|Z����
<=��(�.7�M�">TO��d]�p�#�_�;+���*��V�6�^xX��4��(o�}��TR0%�oU��f�R�A�
�^��_?[|�5t��<�����P�kKn�su�c"m}-<Y
��fx�g0�v6��C,����M^Ra!"44�� C�MB\t!�*U�jt�Pi��np�z��x�#�>�<��	O�7�@C$�L[a\6xzF5������I
h��|��r��s��*nY��6�y�t�a�%�
�f�����S
)q��]�@4��|[�5}m�eo���V��Syl@��<�OE���Jg��:t�G�B�?�a����-9|��������.��jCS8�����p<��E�Q�Cg����
N\:�;mu��.:-�A(3��g���&
k����V<0�c�����Q(%��=�`P��k��j�VDJ
h��3c���TZ]
U�j#r+���F����T��4����@������-l:y��@�	a�6�����1mYJA�����Th�HP���X+sq�!
�?��K�������v�����!����KRT��pK!T^���4��t�N�^��l���>�1�"������P�'�wM�T[���]�FS��� ��:{	��3��vx=��e��m	N(@C����J]��1O�y�R\�*Kjr.O���t9q��Jq���;��B�x��trP���[�4d�A�3����J��D�N?jh�_�R�����~����7���z�$���G)�����s�K=Wr��j��B�r#�����:�l��<���d.�WO����P&�&Dx[��D���������#+�L�E��n3
^<�`��7�lA���$0!���}z���8��s2d�4�(��oh*�*�p������u,P���O�B���,�e*3���M����[	�����'�D�L-��k�v_�K)+-��d�����T��f\x����`L�qab��Q1��?�Y����B����@���J ���]RV��������wXZ@CF����T'�4�%���u1��������1�����rp��)BQ!h���Th���G�b���CE���g ]R��� \I�Z��2����h�G�	�n��i���h!�.3�_ps��
��P���QN<�qQ���:���3��"A_��/��L#C� �Q���c���<5�!��>7��@jn��
����)@C�/e�/%)4�zL�����'��+/-���G%�</��nP&�2O;h����TN����+P�V�H��$wVo*4���y�a;�6|�lKRhX~F���H��;X�����U�G�Q��*�HR���R��p�I���
��[��w�~aI�=V���)�gh�	*
b#?���t���q����a���G�!KL����(4�-����aT�����OL6������}E����J��o�������t�}�!�d9B�^�M���Q��Th�VW�E���[������ �ThK��`�8\�)U��W()� ��_z�y��u�>p�N�|�I
��)9�
*Y��������}T�{n������"��O�scp�VX�1O����e���r`S�� �*������5�P�b�~-j��t"�4�;��;7}"���'���o2��U*4Db��]�[�7���������	�UhX���a57�D��k����`]����'
���Q�����Y7�������n�� �F��_B��3��M�(��@��l�r��Phx�����*LU�|�Zo(4�u�7�#���g-��`P�*	T50�;
�{�z��

�%�������JCx�I�U�{��;@C��e���p9��nB�E
TI0�S�kO��������HB�A�'�R��8"w���B��+�P�Ja��6���`��jl����T ����%�
�T@�����
��5Fr�*T���P�xhp/ �u��G4{�Z�O{�
@���HXA�y���$�C�,CD9�B�A@�?D��%�TR�bo<�6��B��CCf�D�T�E��\!����c�$� 6�=������b@�P�@����� ��

�u�c�^��C���K������#O����qy�,K(4Xp3)&�����JTOmK�����7���L���e�8 IDAT_��C�~���u�

TIe>�6v�:��|���

B��P����	_;������������
���&"o��R�A�B"hj�pm9��D]��q�L�rn+��N��B%�����'T*����p	!��M���3D����P� !��8���L���>Q�8vt���B�����]�p�O�M�!���
5+����+|����C��K2���Ph8��TB�D���TS�MX-�MDj

C?_��8)_��TgR����/���Z��O�����
l��N����l������S��@����;@�"9��z���0[���Z�{������DFBz@�A}��]�a[��SMA�I�?oJ��SR�IU��<w����HM��l�g���`-]+�D�PoP�aO��2Tz�������Q;��m�q/*A���S� ���U@�F*t,P�������a��KRQ�����T��R��j�MU�Vh��\9,������BC�����uu��

�	N�������n����J�*���"����@�Noo�!�0���h���=����q��S,����9E�%$�p�`�Z�|6� ]H���n(p ����� ��

#��0{�
��#��B�PI@��*4�G�s�8@pB(4��N�&R]A(At�D�~X�
+8�4LT��_��yH��dw�.h��0`��?�W�"*3�kV�

<�@��d0�C����S*����}���bT���>L��hV�)]K�C��������Vh0��-�P��������������I���Th����)�>��P��Uv�/�}������������}r�
v����;��)"��r�[+h�

T�I�m=�����CK�7�)4��J
?���	�:����8
;��}�~X�'k<�<�����TZ��(G���"��G�o
������
r~��Ds@C"��8�������S��G�S[gK�!��1��B!�{9�v$��yO���%�;

l;t�HH
h��G���BXU)���W�48wo@[D����T�hA5�S���9<&���������7�R�~	����������RB�c;V������uR��J���T�\�O��G�&�0y=��e �48���/!<���k,���4���H��&��6E������~��8i���Cu1����������=h?v��mU+ l�Q�I�D���r7!���`�5�h����]���>����4H������g1bs�{-���`e�r�%��z\_����*�6}7&.����Y�j���{�I�gQ�������
9h����K7��D@P�:��A>�;����e_�(D���|�}h����[���P��;]>�A��IV[�8Bo
�a�x��R�?��"\�����J��X��h�R���N-���O���J"\�z��7G���q?��+�(�4T�k��\H��u�q�����|xz.�~o�����3��BWZ@C�	�4$�)�!��)	���"a4hH��(@C��)-{h�����|eP����

W)�'6��(�Z�R�>�
m:���MOM�������'�W�3�NE�
��[G����bp`C0:�����h?��7#_Q�����*4xS)����R��l
wt���M���A�U(2�+V�w�H�"��!]r�!�{W�.]JXP�Wl��
�������@���Cm�)��=O*3D���}����l�tY��MX��P��0l[8�
���[����06����M4�1Q�BTo>�e'���
��s1NP�Q��1�����K8<�u���'��#�U��u�	�� #��8[�^O�V"�qD���)~]����]Y,�>�h�\\^�����	Q����JwB�������==C�V!�	b��o�NE�w�x��-L7����[�;���k9�|�����f�l�.�7n��=#/�������
u{@���4�SAa��(.��':7��42��#I

bI�Oh�.{��99����~Z�=���BC�N�n
����)=Y��Q
� �ufc8�U�j��	D���~� E���)a)�
��R~a\Di2����yuo$7I��5	&���Pb0�P]h������<�-�+\zhh�����+�����8�$�-(h��S0��w���2f@�����(����k��6������[�����KV��4�t����\�\�6j���/���1O�s��&OK��I���ifi
V��������/{`��z
�`��L�p�KU(��P��|��+������b�dV~�"���~3�#1J,��h8��n�}Sy�X@!;n �W��3v��u����0(��E�.��/qS��[�Rhu���
O�����t�a�S3,:
�o#`��q�����\{f��M|�JkLw
��C2� 6�CV�JM�l�r���w�~A4D_"p�k���S���7�oA��R��!������V�=�!t�I�^B("��N�$�<�m���nzC���yE��B��L�f�!�bo?�i�Z������s���]
�=�P_*�/�d��������	D�&��C��(D�����n%D�D������5��X*)�SMB��n:��.������Ee1�^
�k��
J�J�	��C�sS�A������svI�"���y��\x<����|���
���
J�vW�oMhp����}-!��<Q����������',���/������W���^$�@C��t��&��`BmA���T�=�$�Po�u��n����H���~Ci����=�����3��`�j?��B������g�p��y;dh�B��3����&��!b+ex���},����On��[��J����B���p�`HhA@a���wn�~
�@l�G��U[�N��PD0��@���0j����e�&����^������RhH`�(��me��'0�Pq����A)i
4�\| ���(���#���"X��M�O�B��eB�A�%��P<0��+��(B="�9}L�HD�6����	o��O�H�Al�pB7�$�
*.�\zH�~����

����k@�pU�������Y�	;��0 d�(I#|���x�9_��+O�	(C(F��%�E��7�����)�����+�x���H�,��HW]�;g�������C�9)@C��}�8-};5��������:���&��m>�~�����x��g�nFR1,a����J	�������	����wx@�y�G7�����������o
��=�^*
DP������;�9/����	JS��']<0����	x��A
��
 T"��p���<hq����]nd�YJ�����}�� ���P�pj4������vymvT�3���k�Sqa28��������7��M�M(4$�T���Pe�*^�Q�C��������pa���4���d>xo���r�}@�	�����$��<�h�$���������G1���|FCz@C]*��8����7���]�S�'��_���9�;sy=,������t!��+6s~���TJ."�rB$||9_��
me���wp��B��c���T�	{��C4�"O�iU��<�� �mG�E!T���T�7C��#�nG����c��s���(_��,_����=o�t������ ���	��4��������8�8�L�dOx�x�hA
������7���&]DhR|E��RB��;����UT��i������T�������as`�����S���;@�+�!�y"9����Q��������o��V����TiH��2���:HVh���+��x��tu�)_��/QB
"�!��8��(T��C�t�*[�]�PB(07"��t1!T ��~�cd�ffX�rL����%����4�����g|Q��Th�N�]��b6�!�[�

B�B��~�i)4������U|�F�KE��=������������V_�p�����t�z�7���!���&�]���9�"9ni����9_�& ���Z��j
c���W����it;Q��
���d�k��B�8���P���������5~Z~u�����t�� ��65�!$<�n����w0���e�;&���g�A��z��E%
w����r�lR�x������BE���&px�
��.Z@��d�A���u����0z�L�5��&����0o�\	CXq�a(��2��S���K���8��"C�[����j����Y�Xb��X<d1�����:|��6�����G�n=��af����}2��9���"�#f�3��g$=����0sS>���B`Z�c������-A|��FB��s������hsa��Pc��E���`	�"����H��!��<����<e�������tsI���t)�4��q�L�o)4D���k_3�&��.#a��y<��f����A�&x����g�����{��c��=�9��8�c	�f�9� �"������_��{K�-�����/�yT�����>1������+����w�I����ZH
h��].�K����]�g?�4���&��c��[��������O:H �����
�nQ����7y��%��#��1b�-C�uphCe�!W<	�$=o�!-��A���	�~�����X�1h(����-+���k����n����]��B��)� �akq����u�<ba��Cj@��Z�Nt�����g�OD�F�al�C��W�g5]�V1F$�}
�P����hj�-��(*-�!�eB���ZA�B\k�P*hH�@�O�����#y:����M��d�{�����	���3B��k����J�Fo�����D�Q�a��t�����d�A�m����<E���;�XQ�$t!�[T}�C8�T2�������  �)���k}Dt�x�t3�4t�Q
�c?����vcX���j���|E�y����-1�	hr���vP��T{�~�
9hw~&�ssS�.B���C������c��=p/W�\p��7�����t9��
B��_���{pb����h�<I>S�?�s��;@��~��U�fDo��Et�?N������u���Mh�|��,R�J-��-XQh�������@CF����<�!})@C������=5�A����Y�!��d����R����8`1�8J�`�dx���&�M-�����*7=��(3-�Ay��<R��:������of���T��K�����#@m!-Mu�n����d�j��]Nh<��2Lh��2�"��
YQ�O���.'2[	�}�o�2�n#c���-�u����T�24|��fE�����l�	�Q�!TT`��.*������P7M\��e}H�����7��Mh����^����7�kJ�����
^w9��kJ
h�T��)�����T���Kz@CV��N��
���q�>F��
YQnZ@CV��v��
�.7=��.+���!���
9h�J�(�j���1�����E*'�A�u��x
%�(GC�N�8P&5����?Vo�G�����j��DJe�Z���~�^�.'��<�sts�C"�a�j([�(��Z�n;	n�:9���M7�4�7kh������h�9wQ�!+Z�4 �u������9����7��tx�N�A2oQhx�v
�������
��Q�:|HYw\������M�[�A2fQh���U2f��b�QG���'Q
��_,uw���?9�4|�?nzMl�K���H�3�[I���
��V��y*@C��/YY+h��u�!sv����!swM2g7uS)@���R/������$�sSP��4����\�b�d(@C�i
��
Y�Z�!+����Tr�=L�
������4|+��R���s���~|(

��J��[@Qhx�.
������4d�]U����j��S2w_�!svS7�4�k)��)@C��k��^��E�`
��3��R�\eh�9�[�!+Z�4d�Us~�
�����4|�{�
��d�(@Cv�J]���!����[hP���������!s�_2g���J2w��!svS7�4�k)��)@�4��R>,�V�25^��������Z�����!��\hP���h�
��V��y*@C���
�����4|�{��j�
��n(u�nP���vGro}�A��v�	���@&�\2i��L2w��!svS7�4�k)��)@�4��R>,�4|�������
�Qq����e���W:QN�jb	=��}#'$$����?�'P���4DD�B\\��F�Yd`<^1���D���F#���Ig}�F%fY�����?���s��2!q%���������j�#O��#=D@?�1112_-9V_�Z���'_��l�	��OL�}��`���t�������5Ul��'8[�a�U����-.�=����lg��X�D#��w�|x�)�f��[�*���re{�f���t�u����p�[����9�����d��W��g:�O�P��g�V�9��&.RK����3�������K�Gp�z>�s���������m'^�g%'G*��������������/L����}�-�#fE���[���t?����o�c�W�[k��xN�4��
��7OU���g������[�N�u��[����`eK�����|���k^�N�Q\N�c%%�b�l`����lP�w��
&0� 0�����ff����������2w�wq�?�2��������V`/7����~���]<��x.���x.��_������s����>����2Q�s��\vi�����+�9e<�1���TFn]�����O5Q��S��%�X@r����>�x�T$Q&L��)�����in�0)���f�����4������;7x����~S�s�o�WTs�z�2�S�s9g��������2�S�s�y�rF.J{���=]����3g����>����F������������04LG�Y�������N
�����{n��Irn�����EAS�=��,22R����]������}�r\\T*��������������"������Bnn�������{V��������hS����[�{n��>V���]����~S�s�>�������}�=+�Yq=�3�������]��H�����l�9�_�����:��d{���2+���]Qh��;���oE�!��b�W���Z5SS�W\Nh�%��\rk{w'����}�����;i���������(4h�)�9����2�Sr�S��Z���[n�������b��ArF.��������r�1��g#����E*�T,��-�
���-Q�0)@Cf�NNM�[���@f��#��wh���]Y�}>�x�x�}���7e<�;�o���+��������2��.s��Q������\�[�V����jv*�S<�BCvjJ]r��"��#�����E�P6�g*��<�T���3�|��"����j�I$�����`nn�F2}�\I��HV92npp��v--�w��������H���t�-���(|!_)���AV_Z��_A4�FG~����������|��3Z���6�����&Bz�]�g�<�����===�T�P'z��4�WVf����m�Ll�����wZ���&���u�!1*X�%j��k���dhj�����}����i���Rk��]��k�;�+iG�����T�s��~|�2���{��)��I�������{���>/2�D������'f	����4�~���Ae���fS����8D%y��$�U�����������,����#�?z=��@M������k��l���)�o:6O���R�<3����T���a������������
y
>m��4_J�?D=��jf����
>�+�D��ce�,9z<�Z�ut���=Sv(lf
c#�6��s�)cg�D
���n�R�iY =�����x���������;zf*_hP�L5
'���G<|pL������Si����~�����n���Q����2��(ee�B&�F����&B��V IDAT���4Y�
�mp��}Mf���!�T!��v
����MK���?h��wa�"�|�r���s����3��)��r��R���A
q2������5�O�.z��,R)+�-�`Q;,eq)Y��@/O�����sY{uY���*��q<k2-W[##L(����h���X{��qE�Yf(��������%�v����0���I��-7G�;W��	��)��X��F����0�	�w��Y�R��-
Dq}Ou�g�x����`G��lu/���;BB_�]c����F��&���S3J$@���w��~��nh��A�!S�'�����ZL��X�P����������
���Q����
��~�*@��m��b(@C��W��Z�4�k'hP���K���'�Z@�����z)@C��U����=hx�����
�YD�!�O��)�AV��y(@C����2���� �a����e_y��.^�*�eP�Lq�z�
��������0e�b|=<)�����N��O��ZU�Q���}��]�������7	�����{��'��|.ye:�i��n.��?Y@r��V���_��i�I����j7��Vh�Xk��[��U�����|&�]��#jk��R�q|��W�d:���d�A�-��B�"����(��m�!������h�q-��t��i�����0s�,��f�����9�n�_��>#��F�M����lc��5�1}��L�'f%���|eE��n�RX�$��d�4��!��y��L_��=������$�9�k|�fI����	5
4��;K�LB���a��!���[���;�.�P����\K�^��X��G�U�����7�d*?�H�@���	
v,�`�`������#Cu��Cexn���;AJ��h�b�����^o������+�
�0�eM
.Z 60z����0����2t��&�U�|+c�M.����qu�TD��'�i���u���i�A/�)��C��@�����V��c�M
o�����K��8�!�~;�x�$K"?�y������F�7��s���	���=jT�T��nEe(����Z�!8$7n&�L);���3�����xDE�B�r�s{t�rL��P���4��C��QM����LS�f�=�&������mlF?H��i�������`R�>���2�N�

&��#r�.uo��?Vf�.�5�A���{Of(]rd��P�rG����+U�
H�D��*��D�A���C�&���7��d���������b��qj�M*4�O�>�4-��%���u����iU:�����@D_�;;$FF��z5��&"�m��J���1C��#��\
�V-9�1�{�k����g����D��W2Fhx*�4���ax�4.Cu�9�_����������MAIR���S��T�����2<ys�6y�P�"��
���ixg��a������O��]��~��~�3_7�����v=^��I����D���k-DG�B�L���w!9
h���A�
�8zP=W=Y��P��w��wjrM���=�g�7~7��G��pv���{=r�a+3\�4d��t��4�4S2o��� �a��?����,E+���O����S��S��V%�@�����d���&��0�u�*�.�����]���o�i������^���a���W��X@X@rN;P����B��B��}I88�����o�g%���C���8{��t=���A/�����$��4����4���d��N�n�_M���h������m0v�f��� 4
4�mX��y��w� ����@���=1~�j|���'�8�C9��Xv������x
Xd�`M
E��C��q���l4|��w�^9�	[�|����}^~|a����
�����s���tF��;�5
4T��+.��y[4��@�U�R�v/
��Wg�N�,{�F����s1��@�������?��M2Y�@C�<�(j���^1�h�p)�yu@��O4���"�����3�4$Q��.��hg:��N�I�!`�\X}6�W��X�A��t��C����h0��l���f��s"���$��\	�48�-'�28n����&��-q(i�zE�	@C���ssC����h�{�q��0�YC�{�^DM
�zXc��lo����"��Q�M�mG����&��������p6��+��2��P��$��<�m������I�A�
���SQ��1{����zsM
���p�������
��v�m"*@CRh�}�
��I6�5[v����������3� eY�hA�Y��zz�����~�`h���I�I��I���{���v�;
�

�T���[��0��=�K8������W���;�5:&����a}�o�v��{�X�uo����9w����P�r����6O�R�X 3@�c�����O���=�7�:��b�M�<�~�}�yL���g��/`???888d*}NN�
�h02�B��?@[[�p��vt����~8u�O�)�	�F�l�����T��C��_���
S�vWh�B���@e`��	����0���������q��,��>C�|5��g�G�����|�6�5GAW�H��������g4B��qj�x���LL����C����e��Ssg\93�ux)��r�^[��o8�4�����%W��5�0��GG������������tQ�9�$����ie>*�j�������TX�m_M�Kc����10E�"����
Bb#ic-�.�z�:���Q�r)'����6���@0��+�*%�>���(1�G�B����M�����=�h]x�<�

6*\x���%c��q� ���{9����s�����w-]���c��]������*cR���25�op(~X�B}���N^�	�F
��3���w�� ��.
c~���5l��	����;��}o�hYE��I�\�A���[�j���6��,~���{����+Q�T��T:��O�v����*������@���T(�������Kwv@�)�e���u��E��4�sC�?$�::�z���H]��G�:�Q���{��e�U��W����������9�.���mil���I����v���f��9�q+OE��e��Beq�9~#}$FG��vI����>����!������������o_5i�������������K���B�A�(������H�����`�����^A(7\}�'K|�q%b8����g�e�~�)�6�b��X���n���(��C�7������L���|6y0d�B����V�x�����e�e=��>���'����37��T��X# ����3������X�u
Z��%����Q����sl��W��"x�x���3��@Ll6������u�g���6)���'�p�`,DJ����_�W�q��v�; 3��A����y�����*��]���d=DE�#8��Th03�b�#0��\Q���9nz�K���!=����U'V�����x�������B�Bq��3��ceYJ����{]~�1�&N�:�|-���u~���!!&��>��f(7��L�qg�m<;�����s}ghik���K(���Thpk�AAxr�1*J���F��@�Zx��4A��`X����N�s�N�]C]�,T�\O*48�u������i������n�u�W��	�
�
6U*�����b�qs
��T�+��3|�����kQ~r����{q���gY��ATH���M���%������������`>���K��o��p^:�2?�����h{G��2���

.��#��=��>���}O;�!��x�Y�:���2-����~BL`*��+��v%
�D��R���w��`�D>{��9d�������S���r�y�D�ivS�z����a�mM�G�� ,�$?;L�����i��0oQ�����I^�p��,`3�t�vW]G����3�t����6y��Q��B���Y!��@�a/����FW�w_"p�U�,m-�T��i����s�WU�O���

��\������Lu���|v���h~�\���r�;�a�cmYV����1������V��� p�AzDcZ[D$b��0�9���}4��N�Wec�������m#s<����6~?�~T�D*0��������[X�*�T3����p=�{@D��1�x8z�$���6���pP�zZ�c�����p���*Qh��u�;�>�-�W������R�[�p�H�TS��&�T�#�]�c����'��}g,����
�����������`K��z(�����x� ��Z�SK/|e�&&Zx���F
�q�iBB^q<�E8A���q�����\�4�"���X~Y��B��	,�����ulk��_�J%]�%tq�T,��D�@�z��'� �H�W�_�������xM���/��\�A>�t�}�r5��������8=F�U*����8x�Dh��*�A'O����DyM����v�W�Hh��O������[~�g�����a�2T^h��u�d��8�0o�	a!��V� ��ID�?-�G���a�c�|�!x�$r�cV�K�G���H��16�n_ h�r��q���\a\I��=i*40_���mf���D,�����>����5������yT�!4`��9���y�+���	O_@�j<�s��UL,L������=#j���9��c#�G����2��H������+���a���m���8|�:�iK��C������{�
�Rz���UT�e��B��#"��%[a�������!��<dOA�R)��V��h���H��Q�=��`ml������O{8��L�����o�?f�������_1��v�$��d�r�;�0��BHXVm
�m�B)}Tw7����`i��6��q�l������g;S�r,�eo8jW6���_
�<:����DQ�u;#�_$"��.��3�����v�������1��7_LK�����-f���[����������a~8|�w��#�E���{^[���K��R�����Y���yA�x�e������e��]5\a_�������\�z6����G�L`��b��`�]I��*0�i�����BW�"�u�z!��Q����4�sa�����ck��m����vy`����,��vA�����|Z�#iqld��#����g/10$d�*Va�wr�!����#|�?R�A��st�~���
�������zu4w> � ���i���	�6�O��!^�����BC�?{`X�
t,-e]��Y��u8�����R��4��m�
�H�0L[�hY���D���(tmj.���S�8��63�F�f��kc�t�b�9��8A��q,���~e�������vf����E��	�Ph���40nIRU���B�W�s<��7����o@<�S���/Y���6��"^}���'������a�R�Jh(k[=�5�����w!0:�k
��P?L�s4�j
"<
}�%�����T���,GC�
h��""�����	�V������-`�g�uT�<����S���Xk�}u!�s�}T9����w�k=AO���A��?^T�(h��I�����[�3��$D���5��������|C������y�|���1m�t����M��m��>8c����l�|��1�|�`�y��
9T_1/-��gOp�|<�W�ZC�T���%V���HG&��YYk�r�$u���b���
w�q�v�����m�T�qT"N��X�C�r�zp�X�����L���=1T'����R���6�EGf����1�����Ix}�ZC��]���ox�U�X�r�c���A�j������pDP1�s+���?�C�������/'�&)2��d����*SDJh`����'����
���-!��-����r�"/�+���������'p,^G~���?h0|-����]~�����
J4s�B�%���q�p(�������s�����pc����K��C��p-�,iz�d���k��r=9"�)�l�
�|eQ��0�����cQ���jzFy]���'a[6�����9��tH�����Y^������^�m���
9h�}���'�����_w������]�`���(W��p���������Z7��Q?c�����S(44oT�	����y���8�+�C`p��a�vx;�%H!
�ZB��
�z�{u�y�����4����������X�!����Y 3@C���p{$����"N�+��=�\TO[2�&�!�
n�k����O�E�B��qw�t[�M�����Y
�NB��-������������{|���@�����M���C!�����B���~>W���B�2�6�aa]^{��0N�q�o
��!4������=�$!���^�Bo��P��`�<>�������\�������\�a����B��=����Q�~���5����kN��s����VmK�a��t*�K#-l�|f���-��4����kAO��PM�xq���
3*u���`
�1�������"��-����o���_T(f��������\�*g�*�U��/��9�z`�����JW���������G�/�C��x�5�b,��E�P��
�^x�gNLg�:�����PKh0����!��m&�<�����M|��9v]������a�t�m!J (LHa������5�n��0���|=��X;��F�n�1�6I�����o��c��c�Z$?�	�n?w
��5���MG� ��N��	(�3�M��Kr����bp����G�y� ��:���[��y���G{
nv6d�����kmj���NcJ�vX|�$<���m'u��5_|�/W-B~[;<B�|p�����{1����}��������1�@����F�i��h�E��0t:���.Ujb��3h]������b��C�@���e^x�)]U�s�&u��EG�%7����7�����w���
�N��
g>[.���}�;*D�zM����.���%�m��V����U��A,�={BB�/�F�R�p�����g����}	X������K��!���]����n�D��%P��	�d&BZ@����a�|�{g���'.���1[0nFG8��J�`��oQ�Jx=����1��Y���K�r�?��$�4���]W�����.�:*�������>��b�o�3���W2��%��X���:7��	2�n��L[�=�.O}`A�	����ova���(^�"jTh.��F�������wOJ���������R���Jh�K �����~.�\�w�O*p��F\D�vz������8&��p#�p}�5	4;K��/Upw�]�1B�3.�p�U�I�� @�}]�����Y���-���,`�.�@�v���>�h�C����&8�s?ksa��@��(����?��K"�;L
��<���*��o��]��������q��5���� ����B�2��>����wg�Y����H<��J�A��O�vl���>�;qN
F\$B�i?����0��E���\dh�#l_�w\�z��D7�M�����`D���	Th�k�V���H�
u�-����P�Y�X�������r"~F4]V�s"�U��U���l��������nc������O���E��<5�����^����`F�!`�%	4�9�H���Z^w:6��c�(V��E�����T��N���C�g,��0�����V\p�bd���p��%��
����x�N�T�	j�!����p��)^�rL�!��g��x87oV���^[��l����zY�-������(/�q��%�aZ�M�	i
]�Q�Q+�G�O/#80�@��;��`�#���N�%��G	����L1�p���EMS�����7��=��=7�.?��`����������`��F�+�l����Y���0t,g�Y���I�A��Q@�Sc�48�j�0��n-24����D�$�z�3N�Q����*�sLw�j���lm�����;W�W��@���o��@�.mJ�&m���/�h�I�� IDAT�Ygn��%�e@\����������<��x�8������"�`��b�A�Q��.�]O@���8{.V�#���\��]S*n
�Z�M�.&q�l*88w>�0����b(UR[���c.�{$�<MRh��e
�H.C
b�\�7n
(2��
���N���c�rC_B&�Z�d�D��M�I�e�p���D������d6�4m[�[an
:#!$��P �&?�7n�����h�J|���"�����A���EKK�!>����"`�	@$�qc�V�"��v��kA@b/���i�]~�7-%!�uCZ@���7��?��je{�����B��Z
o���;���K �dXW��^M���A�MY$���nxr#�qW�J0"��Y0��"��Fbp������|y��1m��e��6�Q��0���L��V1g�"��?L*�M_
��#��,�u�~�2hP���D��\4D9��OR�6��:|?�Vf0����,S�dH
h�[�:*�
��G����]��l�|���>%/�Vh���NC�<}������4\��{^�h���o��rYL�������^G	4tkc*�'{BD�:X�)}:�qM6k��ch/s������K�.QX_�_a�i��0z������/U�%m�/�4*T�RE><���z��?��w-V,�
K+Tt����E�����{��<���dl��1�Pi
����:��^%�p�iJ���C����|��]�N�8sW���x��kK`�(-����@��K������=�
4e	���xw�<��2T3�4 @�����^qM\�`�����F���|�T0,_�����q#$"��57j ����`	 �n���U����5�B��cR9!������x��{D��mSS���a���.\���!!���a����/�������`���E�8�
`�^�����C;�A�a�F�}�YZ$��y�2�%F��C0��{5�%��4La�IK��D ��m�(7J���.������lg0�"	���K9~h\�~���BHR
G/E����	)���f|�8�z�8Nb ��HB,G.DH�`9��6�7<���Y,�]���n��t0�{��}��u����u��������<�n&�����%e�����o12��n�[���[Cs<�k����0���-P��<b���"�i�	�7"����^	4�ssW�$�6�f21r�Q�&�_#��A�f����[8��u>���+b�yy3��U&�����bN��yl>���%���j<XbG��2��+X�/����p�
���X�s��=�K���G�~�\t]�%\��J���m3��|c������<_�����<���(�[>N�n�o���
i
'��R�VG�������\�	��n��a�x	s-��C_q�R]�'	��Ju�.��P�s*V&L�?F��y�������rt����*��x�������V�
�F��kA�����v�p2����h3�<��~��1�=��P��Sj@C�F�x�1��o<�G�Q��Y+s�[����^J��k����p7Q��!�Q����o�
�l���Vqt~?��i�'���l��xru/�^B��+pxNOX�-*!�K;Q���w�DY4�r
��
C��RM��U�Wj�g6�R�	�sx1�7�{f#�2J4�����q�E8n�9a��Po�r��9���,1��`�������%��j��2�����;d�NR�W7�4WD�+��������tY�i��
�������Q��}p�r9���3������t�k&?��ZC�����o.IQM�pK!T^
��4��<�N�I.�m���>&��4�3����Bq!��S�E5�is����_`>O�ti�DB���x=MOK
���~Y�:D�
�����e��
&����ED����_gQ`\m<�xw�;��
�k�
����--����vv�y�be����gK�a��pq��A}�;�0���[��9���F�.� 2u.P��4���G���?) B(�j7���;�L)[G���
_���I���� j4��#�F��#��r��A�'>����*�S�Q�4��;�x�|G����&���LHh����vNj�������?N@'�M�����t�T�'O2x"-=�!���z�sTMx��nQ��	_�Y��U�����t-��*��:)g/N^[s�O
I��/�
�^>�M����W�r���!9-�	�V��.o�o��T�D8�s��G.�	��
�������'��b��:_y��{�fT�p0����;0�b��uCZ@�H��|	��Z{/���	B�a��x����C��ciJ1<��c��fe�O�d�*�@,�=~_��u������ �.���KJ8���2�p9����x�M��)����_���ls���y�\�2Xa������+��U#����e<��R�Mk��
���94$���p���q����&��@Cq.������K���`ad�U��a�����d.b�����.�����:����I	&,��TRpw+���*��'����[3s	/�������#��)O8`���������;���6�����BA[���\u��5V]];����n�DQi�n��d����g|x�{����9sf~������x:��B��Xr�f���I�vaj��\���H8��� Sb`
��uQ�����@Cf�FU����<�K�xBe�4C5�����Vx9�����
�@������`@��w�.qc�<��Y9~��o]�?�G���D�`@���+���V�8�i+��V�F�fZ�/������*�K6S?`@���s�|�XX��wu3;����;N���2,+�c����{�Q�I����B����0�<��n�TXU������/���+\��u,[������Y#7c���\
b���0/o�f�Y�0�������%�
,�{?w,�rs��GV}��Q^
�� E���������]��N��t8Nq������,���)
1���.Y���4h#�Yb���C0��b��bg�@h�������b��ua���7�r����=[=$E$A���)��tSS������2����=:B0����jHI�z��nn^m���id�e�dCS���LQV^@��vT��;d���}�F0�yz��!W���=.��|~���	 x:y>�h��K {���H �������9M��� h�����ej-��������p��M&@��
�i�\��
�13Q�Z��4O�FU���M��SR��XE �r�V0�)8��=&J3�'N^@�LE����K�mzJ��d�?���nB{tm$�B��o�~�H�!��# � ����c��e�D�`Dh
�
'�6�h�D_x�������B�a9���B�YOh|�T��4!����6^����������%<D�s�V�� D:����h�������H������$�EK=^���.1>�{���T]��^qqBn@SM�n�3]:�~�O��\�E3�F���w-q�2����k��B)7�0�^+o�������4����
��R�A���S������K�Yy46S���+��2�T�|���H%H��������3�,���P������w��
�����4�mX��z��c*�+����������|�\v�oZQ�
d8�����t�s��'OS��/�a�g�����!��g)2����4A
�Hk��T&SIH$�k9��O���&m�_���Z2�:2����TR�������r���CN�'�������"���y���g:�5�9�m�=�Q��6�-2TXY	t�H�c��`S���
~��)��]m��f?St`�;�QFS
�����zf`p��P}��]��N�
\q��q��R����}<��HD]:E��P�b�U��}�5�,�h=���/��2�E��P�*d��8���=�����/����F�o���c;�������P#�QC�

����	v��D���P_<1s�C��2w-�x�zV1��L�
���0�Ay@G��;9Ks
L�x�6�{���Gr�+!j�
������VAkT����B��7�	b��0����H'�2X$]%e����������:i b���������,�+�@�qm4p��)G���;(M���/�1+�@}�`��u5b�m��rd��r��X���G��2�5���>�~#(���Zb��n��`s�r���������t�^���[�0c�&��K!����<C=���$�H�Z�zJh8}��s����;��^m��7�I���M���5��`,&���'�4����
���������,��=��{��q=������[��*G�zz�����P������$A_���F�����n$^���@���,{�;�L� �
�q_R;�����StO�wU�5[�.������79�� fV�����F��
���c�m�;�):U�B����r��<�
�����x��=lmD�}����
�����	���8��R?|�PM!_�j���� �	c���I�e����|%S�W6G��CP�D�kx8�H�A�~�c��-<
S����#E�2�#7��RYy�j����4RO�BZ7�)���,���[>gN/<��9�9��4\q��{�T�))X�:���
LY�)<0�7\���fr���6,��X#��-O��m�"0�K,�������M5%��M� ���:�r2FPV�u�E�3�	�
��Z9�F[(���������X����%���&p
r��
h`j	dn�����f�_�97`?�@X�h$&�����4R}�oX{H����c��5� %29�C��e
���[�x<s�#���2^a E��MJ@Da(4�J����lw��S���������w40�
��5�������U����J��p�
�����#)�-l��s��o{9��On@6?$�-����g? x�-)0<"����Z���7I�����@k(]Z�1��)_1��1�5"u+D<gk���U-�
������]��5����e-y4�Pr�2^`�
���xz�������9J��8!'�A��R7S%E\),0X�yku���>��!�g�!�����&�3�����\N��j�
�;���M| UH�����)
|�p��#�� C*%�H�����}�L��
E���(�H�5�M2�``����`MJ��;���B������#��,H�*���H�.��|�=I	���/�����n���w���Q<�����4��3�!��s(���R�����4@C���z�>�F�������[�����Q�|�.��0��uwA��z&;h0j�B84�CRzhR�6���{
�RBf`���@CY���!S`����\�b3W�`���;���h��~�rJ�����s���:����6u��I`h(;���^�tZ#��
����4�����40@!���� t����tt�hQ��n,A%3D��'���|�D<��'�
4(��AG��w���f<��,��g��H��:)4hhU�."ddh�V�~>�yu�j7�O�k�
�*V=���2�n��o��W�!2�-�
u��p��F5j+������.�CdMbF�L�9h�@���hS��9�&�����-J�h`��@�����g���B&���,��}z�]B<���r$9z��=H�����^�!�����H�E{grI1��Al�?�BC�~\����`�$���O�����*�Tp�� X9�����`�E4�����	��t��)#0n�L���
o,81cz���]H07\`[�W~`!�B��.-���-L%��w�F)40����J`V���0�U#\y��l��.0�-���D����e"+�u��?
k����S��5F4�O�U2�M��0�A��QV�J*{�5�"Qh��9�8����]I��W6�V���t�FJ��6�j
#���r��B���3�g3YY��	���X{�}��MZPY�q��f?�����=[����k�N����L��@Ce��Z�������#��v�'Er=������D����[�07(L��()4����_�u���z���B%��T_8�4������-�
D&��V���������J�z�r�f��
h`�U+�����N>�0�����.!�Y�����h��?N��N��!9*4��<�"�JX;�&-������<)4��'K��E�!uCs8>�@VI���0��#'�@��YpB&�0��,����
�"�_���$����"~�h���$�~|E

�����!/�A�����H�[�����Y@C�������s�Q}xur!��+rw,���@`C�AU9�����1��0�Z�
��W�Y�,YI���qY|������8�>��,����rd�������2���{�0�UO:����sWl��t��Sh`Jj��aI�Ea*40�� �������.nY��)�1L�'���Qy�`|�w����u�*^��0����II�6�7x��f��}�b�_0�w9�F����Q^3��1���y���.��������R��1��w�3�Q�:������)@0�qC^@SM`����W.�8�:h����B��w�T��s��b����9)4��g�H���a�B�^h��������@�����s�����y���+�K"�/P9\�Jc'N��cIJ<�HQ�xmk���h������PWhz��4����/I��AsoC�^�� �#��-5(�����A���!7��
�dJ��\��f�
�@��P�.!������[WW��W���C���h�4��@��JX�MSOGa9Y[�$���.�1(�Kq&t���\D�5ef9r���J�L��8�?� ��Cx��p�l)&�J��@;�wy����w��8`����+4��B���_Q�&JP<v�PG�Th`�,
sGO��t�W��\0id�����J}���	d
�HB��5�6����/��f���B�BSKxL�LU�1Y2wb�����2h��L�Of�+<�z2���-/_�W";������ +G�F�6���j;�c�{��#IZ>�.d���X{2������T�,j��/����M�Y��\O0�f%��<OV��w��t�������{�
T�iy��B�Eg�Q>Z}C��'t/#��(�6 ��t�N��:���?�4HkkB��<R�����c����8� C��bRh ��uC��-�!��]|���A�A����L�\E0(��#�^���p�
WhPlaOs�AV�LY}�8��,�CSl����eH|������wd����C��
���Rg$�;���a@FSh��l�%g���]S0WLB���BCm��d���@����Z��{Gf
��*a�m���-�4���Fd<��
�
P��q�Ms����\Q!h�J�.'�wU�K�dR����Y2Z4$K[:��^�!��wy��������X�%
���B��(L�M�!����@���K~!7��
��^�&���}6b���Y@j����K�P�P�������ah�����0�M�����I�Mn&2!��/���F

�p
 �����.��M���BC"�3,/�����,&�J�?-ES�`�����TP`@A��{���	4$8=�4�A�%������=v���`��r����w!E�u���Pj�I�s_���=R	�8
5I%��
�8�B�K�	9+�= ���L8!h`����2m��w?��vA��#��h�]O��~'���0���S�

]I��)3
'���A�4�	4� �����AJm�]�����B#�MDN

�L7��5���Sg`�ivo�"�������\X��b���1������U�_�F0)E�����
��KH'����M�E�{3u���]O�r�;'2��"�J}s�&"h`�L������W��,���d0B��+4��vD/RUa�C2���h���`��Ep���!��,S]�����-����[����r�^���Ni�
N���\�>V=?��L�Da
J�.W.�
� IDAT������0��|l!7h�b`����a��Uhe��>�o�N��x�c�PhP!H��������P�`� r��O�'��B&����z��s����~9���`�{�+k��Is�u�Z���T��z��e)�������z���%�4Xu1!�!0��B��:|�4tYm��\�!	6�+��~�`r,��PH�	�w+_Q�N�Y@�m����.I�o������S<w����4��]�&�n0�Ndla�j4X�l�Rh���i��lq��z�7�����&X������B���}��|8)+l�

��=@�Shp�U-c�_������~l/��(K��
u�-���5��3Wt`�
���@S�I�}83Dm�B�� ��e��9h��R4����
z�`�"X��l#w3��]s=}�kY�����%��Wn��I��
��/Z��F
��A!����R
L�����?
����+u���<��v�{�����Wh�-��m��1�H]���P#���4Ah��Z� @��ou�ne�-���y�F�����rs�_���!5&	�.A�z��������Gh(�@���1�6��������CY@��&�i�T���d`C��sp��<> ��Fg� 8n 9�vD%���+����wAT��� �u�����5����a�hj�`Z�=�V$_������r1�����?/��B�6�X�5Wk�mH��b���=�Vv#rTh�`�f�A�IEu<�1M��&�Q�J��5���!$���enwKn

g^��M�W~�:��<<IB8h�!��S�)�`K�@�I2x+�s_���|�
���u�:��R�������(l"�,0����	4��6��I�~<�+;�zK�{s��M������������Y�9���P�,!�{�]/�	��I�2��1���E�Tchc�	��X��,�Q�j"��`VR�I�����@���W�� 6P���������,V�����A]�L�I�tx6s�i,��1h�N�
-�����4��1m�����L�(�:�Cf$����u�������@>����������"7�����=��%fuo�	;�a���)\A���hC�2���������

�I�uc����BY�;t���b��\4t��AY���i
S����"����|������;`��#9CQF7#�
��Ic�q�35�j�-�q-�G2]�a��@�������� K�L� �����r:�\q�A`��+�7��dWD"�go<���!`���/n{��h�&��E����B$jW0���[0�mL;����
[���{�'�J���H"8�/J�,aB�*s��ShL�
�:�4;���cR�`���
v�+���6770��]��h�jk������)�
q��a�5��E$�<lW���e��H�mj���4�����+������v�\N0���Q�r� �,K7p0��2��3�����]>��ia��I�A���P�~�.+��#��������PVT%��ep�$����y�p�M5��J���k��

hh�d)F��Lx*i^��������4(�?K5����[\E�]�w'�mF�J����C^@�jYU�r����'��Hp@�B�<�/0��D�G�n����	����E0��\�r|s"5>
��p����"�5�h(h*p`�R�J(���60������>�:��xE��g��/F.+��}R�r����hp�����`�T&�������-���!Xh{��]��QI.�^"�~w��/W�@�N�H�NF��b��"���B��C!�M��{����40���s�:9�����
�g<��P��Y�����L���)������<�c��g����P�w����xFnk.���� O��(����`K.+���������'�.��H���uj�i�DX���'����H���`������F������������C�hPi`�2}j�6������,�A���hD� ���������<"v���0����i9sM��.���A�\J��Fq�,�����������7��N{�$�R�j��G0 �4`�L}�{�!��r/���j�s�"`��,��!���;�vC��g(����1���&��k��8�K��T����9�y"��FYB�;s��M$����9���
h�'���5 �k����Rq�51h`uI�e>`��7�%�X����M�����tPJ>y����4�3�P��s=1�Y��)�D�<=_����4+�d�)1<xO�]�4�'�D�r`�����������b�����\������kRy�>���E����<����w��	4�|o����2�&cK*	>}��N�t%��i.q��|*3�h�F7S6`����O:��sh"���/��*d���z�����,�;��M���6��+40��n$g�B 0�A�.M���%��P�\Y|AC�"4&+�N��4K��9�+��a�$�BRN�$��7�����z=�*��+?;��,����d1�2\Z�}D����/�� �"t�p�zQ�����<�yC���]��En5Z�����?���D��K�]UT�y'�����tR_�8������!��F�f�r�������T��Ag�X�?u�.%�\HO ��a�qb���k������J���V���������%��TF�'h��
��>{�U�AV��{E0�C��W2 ����]!��F~<���$T���
��wL�Au���AJ]�>'7����i�E#������I�� �L���w�\J�M�������ATg���}��k��(4�����D������rG�t�`�yd�0���J�)#��W�` �BS;�G	'���� ����C�H��_�eR���Hs���NN@CY�?��d>g=!�z���Y@���N�T�������F7��`�y�<=������������c�8,m^Q�T�������8��}�w
)����#g�1��4�>mM������~�n(��eJy3e�g������������O��|�2� YR���3WR^!�*4�f�
���h�f6�
��d����X���gA�$����������|�;;�g�������t�ji����h�����'�)����L����hN�$����L���m}��H�K��y�����|��Z���������O���������H�F��	�v\�X[H��WUYl&����'�y�yd��(@C���0`���MCF[;h�Bk���t�JcM�,�#����2�;������WR4����I�.H|B���Wo�����(#���i�T��
q/A�����r2����=bOQ9L5KI	��;"j���(4(��C����$���
D���P��MU1b�F��#�;!����%��*���4_�mC�zI*PJ����Y��3���z�:Cr�@�*�?Ks�,���K����Aq�HA� ����\X���f�Kn��Su`."i�3����)�~"��h�g�)9��5��b
���N���`���,��o2�)���V��>�#�'r]�p[(�T��_w,������\$���d����A�J�>�4�TC����E�y�"WaY@�:�3����-�a�'�FF5��#���
e��+���%�^�Uy[t"����SC^��E�
u�����{y}�8����:����,f��
2���sC�=����u�����O�o�I��/6�����'��}��,z����A90���t����6���HHI�������F4�0��Z�;�^����c����;C��3�!�R!��>������-�1"���`�s(]��>�4|xOj�!�`C.�4I5*h`��;�va��&����|iMfG�R,0����#l)�@���z��.wZ��!WYl���#�������"uG�t�@%>������O@��G -'��Rc=�H�!t�<��
�,����&�������o�����.n�z�N&t���H|t�O��4T�����d�������--hP"����~��Ch������U����x��>�Q�QS	��:&�����J�|.��G��� M{!�{-�,�i����<��C&�P��(�-�j������|^�]F�����=�&��z�x}�� ��`�Z�+���"#�t2��h9��O��3��/�:L�����h�f�"�Ze�s�!��4��k-Rq�h�*g����;
�r5�+���������������@j��wN!;��bN��:lm���TwN���Csz��J�~�H��2�o�AJ��\<X�v}��aa�����)'T��c6�:L/������U�&�	h"k�C'/qW�w���t"r�WY������\N�y�����mv�lR��U�s?��r"�4�Dvo%�PEF���a��|�����@A���mMh(X
@C�
����h?���"7��(� /��(�+	y��r�$��0����DA�h(H�%1Mv�?S?e:�HHI��Q1��#�P�!/��]���/��	q��� n^%9~&Q�:�44���./���_[��gBEyM�
EY���[��W��(��t9�3y3+r+8��2<*d�h��|6mn@���[���r9Q��(�����(�rr
#����
h(��
+������?�|r�KW���4g}���LU��)'7��g�,�isJ���[���q�)���
�YFa���P�e��r��������Dq��$����	q�$
�P��q�Wh��������� 
��Uh(��K�o_h������\m������p����d�YA�nThm�	@���$
��Qb	@�(�T����)�5#��kM�����$h(	���!�6*���K
@C�m�}h��"���B�����R@C�m)
�7�
��4��2���@�4|�)�(���bi�B)D�!s 	@�4���G&�4�lJ����U��%h������g�����[PR���;���QZI�SR[@Jj�m�����W�{�4��"����om$
����A�!�6��!
�Eh��4|�)�(���bi�B)D�!s 	@�4���G&��@C�m��b@C�-/
��Lh��FJ�b	@C��MHU2Z@JF?w-�A~f�	@���'
�����	����R@C��cI�E
�C� 
=BJ���������h��l/��a�_wV�Y(������#�����;S�o�_C�nyhmd
@���$(4�6vD�%
�������4���)�z	@C��+(4�?��!�6�>�4d��i~�	��7��I
h(�����i����4���A
>z��BS�4S�*&==�?����X��"@C��k<I�xgmHKKW���r�d�. KD�K�xg�/�����D��K�x������wv�K��M������������|���a='��J�;Uq�CX�I��MX�	�s�5���r����]R�bq��W�w��5~����\����2�(�- 
����&����������nJ����.����^8O�������s�g�NM���z�4d)��Wl������.����\I����zNX��X+)�H��M������0������{���{Wu�Z������GXW-_j�������CWW����,�Y^�)DFFBYY


����R���8����j��WZ2)��^Z���z25�bSh()����w��III���L�2�u����=�\�"HX��oE9/H�x���[I�Ep{�'KI}�I�xg@R�o�:�%q=�}� ������>����������(��o��;DQ\�8yJ��MX����8c�(��x/m��$?�$u=W���(�����W�wA��(zR����J�B���_�\�����}�|����`999��v�PaAQQQ��]��;����h���CJJJ��]R�;����T$''K�$���]��>�$y�K��MR�{�!�����%
�Xa='Y�/�zN2�_���d���9aN�V5�<������G�9�\�	������IZE�Zh-P��I�Y&H�	�v�v�����/A����B����w�x��|�dIna=�*q�&��%U�U��;�wI}�I�xg}.��7I��zN2%�%��&��/�z�3

����e"��7a='��7a����1G@Cq��P��]@C��R��IJ�h-��
HaY8#�t�"��]���
a\J��\8����.
���"
�000(6�y�3KN.��_!��$?�$u�@�40�	��A2�+$uN��;��A��&��Z�4�����4��?BH|����4t0�n��	/L�����x����=�B��LS5��~��I��
eee��+�\�q��5IBB���~�����r��5�
��!�!V�g���^���|q�k!����k�{������D�2���@-���Ma�������D}	)�q�
�\���">��He3Y;�NIFFF���"���
@D��YX�W���Ve�LK��.�@���V��JH"U�����0����~��-�z�(�"<:��.:Rrh��Vh��"�h1f�b����a���+�jJQ�z��E0�_�|+`u5YQ��r���hh%�j���\����A�"J�z� ��_I������D",�]~M�����z�Fj�E[#����z'�����������	�Ev��}UDT�����|+��/@���]�rK�k�/@�%��}`�[�KTD�����Y��su�WFS�Et�V����R	@�x�%�Z��@^@��W�x�:��-�-}.�nb��0��]�g��N�A�U�	��x���wj���5�-O;�P�_h�����#�7!�2��d ]�G���_�O^��w����
�������wU	�����b)j�:�<�������[�F�"=��>?�U�Ios���BKL}~�"/�����?S�$������o\%�	~���4,����n�PP��k����(�
\�T��A�T�P�����kFB=���_�B�����1��.B~m�����o��J�����!*��@i�2��J���x
=��zD��s�W���_�����d�����@�-A������E^#�/_�y��"/G�u��X��TD�/�8�lcl��
[&��I+
��3�G��� jK	�����Pz�� iW2$[����3Y5��:M�n&hi�H� z[�����+Z��_���K����h(�6J�������r��PZz��z
@C��;h(9}��&�Pt�"
E����,��(E.'�������>����k��m��`rB���9��������&f�!n�z�^{�������zv5�9��n@�r�<��]���b���sJ���u�1��x
��u�uAh��Z@J���hu��B�?�_ch�*����I����	�y���[��L����R%Q/O�x�4�s~�a�����ull�I�:���a�sg�o�\�t�#��r>����\����Zvb�W�@�]=���CIY*�2�+V���������T0+�������HDG��r���}�������h�j_iQ��hl�������Su�-qa)4h�){���|}�H�,
����-I�GC^���4����Hu��T��txz�CD�[��eF.l�������s��m<�,�N��Z0��>�w��.3rQ
m+WBtR2T�����nb�oz�z8����a�K�����n����F��XX��	���'V�2rQ
�����K�0�CL>xP���P�4�����S���>���
=�Y��kW��v
����X�)���
hP6�B�^u���cT���'���;ZC^S���J��thC$�� �r�����.�\{�Q�T����$
��������G����x~U�����[ASM	��L�����Yc���<_�{dl<���~I��^���,�l�y�/��C������|�����P�2,�b���y>v~��?���4��n���������G��-N5P\{�& IDAT

��W@d\2�Z��]x|o�|t^�������k�%_�sT"o����a��Gb�UI�\X�R�@���z������nQ���b5��.�p���	,�����]����y�,����!*A��\�*]��h�3h	.�Z���������^�^��)l�iE(66@�� ��2E�V��W��AJUI��w�,j�6��N���'5�Z������O�a���X=�����C�������A��8pi���-ai,����F/��h��� �{��>�!Ch(E@����0w�(>,Vn�=-��~����)�����)(��$�7�>��#��2���L/o_x�~B��M~(;�4,�+7/t��2��
�`- 
�g@�4�:Z�
hH���:fX[�Y=�/Wfy�:t�����L$0�HC
�]�:?���M�,��
h8��5j������U��
h0\G����V��
�M�Q����������/��O=C�i��hh�h(|�?�u�h�E44v�������C���eQa�����jGg��
��5����P��/,�tai�����<es���0�L�n�L�E4����u�������h�������1��1q��?qq�����Q\���J�!��/R��~9� M����np�!���k���17��'oJ��zL7��q�i����gq��+������8r�Y�
�^Sa���8�SX@�r�YH8�
J]��h�a������)f�����+Sm�2����eY?�,`!�X�+na\Kf�E	4o�O|]QA���
��rX�uf�X]�n�Y������0�YYy���wNJ����,R���KL�4� 4a=m������@C������>yg���J� -/
�y�p��

��1��rBp9!��)P��r9�v�~���|��e�K���}q��#hj����6�<y99���`���PRT����CUEm�5����B��kwi�U-����C�������G������|��������&%'c��C�1~�Ie!55
���� ���<x
�Z���k��hR�v�SH$9- ���z��2�8�6�yE�<�[�\3?���BS+���s����e��aE��?;������gJN'�{��Pr�RX5bdedp��	��w��?�!82K���oHH�����&�����v}�oj��9����c��a��.g�u'��D�"�:��������
�B���p$>-
���R����a��
'�;�>oQ�,&�%��z������K��B�**b��L(�<[[�$%�`��)9��Y���,�.V����j��Mu`qY�=LMa���M�O�OJJ
�	��+(+��������$�(�`R�`�!��hgV	�x��_�]��������?"!%-L�0��YT�����(%�K��<�oT$��:�6r�Od���m���**iis���6u���},n�
��~����t���:��������4U�0���>�`��g0V��wd86�����_��1�Q3���������i�Ad2��"
���h�L
�I�3�i���Sq�|4�h�I�+$��UF���HJ�Bk��8�+��d�Q�JR�s=������T�dx����}2j�� �/�/x9��R�����c0y�>/���<O����uG��&����3Wh��C�wb�����$��HW/D��E
�
�}��^O�g�a�3�B��b#�~GU�o�~���-�)��,���%Lf�@FE2���q
F��w�lf� �,�O��!=.���X&��A��7�V9)4��j�w�%tO����+x��	#�lCh�/���.���-���8r����b`��8pt����4�B�Z������'[��a��=��w��h�h&/+*�/�����&ll�����05k��m��OuK��;���Y������
�\�������%%MS������?�+4���!��w�~wE��a�Rh����<���w���.�7�B�����(�� 0�����@��P�c+H�������������y�=�����P�b���_�3e'dTQaA���H�#�����4*.�wc6�Kb���#�BC-C���q"�-��aB�C=jT��_��~������|#����4��hx�ZX��1Z���me3�������E�Q^Sc��BE^G^����?&7�M%E��b�3��f

mH���4����YM@���+4�_�b{�������v,��1W�o���o���I�s�����q�"���y����X�vS]�	�c�����9>���@��1����[����0[kD�k���B�,�/{y�������Q�A��������L�����8>~<B�����e��_,
k�&h �������a''���!C����,���G����?�u�
�>}���7����-j����e.������`*�1)0�?u
S�����Wdp�����L�����G?���/y=��?Y�c ��6���
��@�30���N�?}����%�������Rq�

��=P����5^tq�|J����Lib`�hT�*"��G}���=l>�����_|���
:j�X6����q��+�pz�S3�������elZZ��,�����yu��cU�\���2��
a�Qw�P����������
�TMZ/g����t������C�Pv[!�mX>/�����MkY�|v;��]O��j��4��q��"��4�

����kR�sO�4J�e�~�j��Ye�L�8#��������<O���3Wh�o^
�*
8�"��/L�AGC+~�����c7��g��
�1Xv���m��6����f�m�7���`��~x��:�*����S����*����O�EwRPheW�������RY��ks��y3��DY]M�?�b��SX0�=Th4������p����R��WF<�+�E�q�-5eL���?�^���24T��
��O��������u��[d}�e#��t��1X{�6����oL�z�kUA�����G�9m��{f���0��i,�	r4��>b�9Gim��Vf��&m>������lcW�[�u�c�����f�~j��x�����p�.��������bV?�����~9��������EC;�'0�	��8�7/����F����������:H�g�t�?���_�C#�sy}-����W?\[�q�!8<����5�eR�����^L�z5	r�Th���������L�xn�C_f����F�e�	h�o�
rU3T�.�l��Ph����"�y[�e��I���-���?K<�J=&AJQRJ�H�|���"U� 

vUt�[�������+���57�C� R0	��.5X59���.��@�Y�}���BUI4O9R��7���mYtiP��r���	����Z�����c�3�n��Ko��hDs�K~m���Z���7��}`��
K����/g�H{RVI�������q����j������^�GY���	�i�^8����BHd�q���[�������x�}�������2*�a�������Up��{ZI�C��4���t�9��K����P
W��p��}V?)+�������R�6��vj)�PW�x�y-������60D�T��h����2X}uB�"�s�_�
���S����x^�w�'l�u�����,L:�����MZ$ 9-������	��B*a�����z>�����M��+��yb
��)4t��A�q��!w�@s�,�|���1���Y��$g�\�w!���Z�(�zG
G)=Shh^���;J8�r��q��	3�r�t�0^|���V�QQ�����;�
@,�1��R�\��CXt�P?L<�+{M�8�P�W����:p@��x����=���C�g���CoZ�u�Hk'
�����"���E�hh�r(��h����m":��	-mc<��g��L���CRbx�r��-�]_O��@�"�)�����v����W��|��B�����V�u�iOC��&��j =8���@�o%H����Z�����BmT5�n������Y -0���#v�'���Cu�9�U��J���>A��>�kiC���;�9Su���%"��Z�����+BF��5_��*��h.���1%�d��b]s�

����-��j$F}��c���#�{^�]����"���d��s6Th�~8��=��z�8X�4C�vC��rnOo�]o�`}MJn�n@U]m��;����e��jPV��~y�.���};�q�E��*8�i
I����u� ?/\9�Laa������,��u0��w/�D��7FL��p�_T���e���d���f�3��ei>Y9�-O7t�V�Y=e|1c'>�}��pp�$��$�����{>*<(�,��"�4|�{<��:�%DCVMz�����Z��@��0D��G:}��L��TH��x�'(P���g��dzZ�i�2�H����K����������ea�L��S�Uo����&��9�w\D��
�
�����������U���B��I%�����I��]D�2��c�N��8���Z��i}�����5��\N��L�IPh(E

�o:��@���Ds^�z`������8����W���U5T1�wOo�{��W��5u!6���ob����Uc��ax�n��$&&�A�Z��M����s8��0���p�@
P��:����~���W(�F����_�WcX�n�j^+6�����A�)yDM����'��48������ >����P�0���
�����QQ��6L��G����4��2�Pr����Q�ZU,;~��j��#��_8=/E�i�����A;���L�iW@BL0��������"�� 
�K����d��=X����	6hjd����������o:`���E+�uu�H�T	��44!���XD�

���z���+:�x�vzz�G��e����J��<����>A
l���0����/&q����O�!��h�%�b���X���~|���M���c8T0EM}C��z�[w���p|��D+Ss�y����J�������������20��+���S��X�t}-j����V�6���g����L�m~�����b�SNC�^�����GD8��+��V6Kell�	���Hr+������.`s�.�#����i��8�>Bn@>�OF ��ed�A?�:��~)
���������&.��B��t`��7Ih����B��Z���������Z����k1�8v �����~c5#��Ks0��!m���x��	3��yM&�2��!��RBm��'��c�$]���h�Fhc������s���`����MG
��m�;��
h����g�q5��$@��6�U����E�FT��l�@�����R)A	�u�@C��O��*���k�-�������`n)X��M���4D^���V<?�����CN@C��07��K�������>G���}�o0���������m�AA^�&��f\�%�fY~@�]������o���AYEjjFx�r/�V�F�K<|�]����V�WiG�J0�r�AU��.����l�;Nd������� �v=�j����f���x�F�j���F��#�
y
UM���mP45������V����O���������M�dn��s�Q~a��<M�J"�����!���I��;s/tz6D��{��l��_�Z�*�BO���Qvz7|�����	)9�-?�$������U��n!��&[��u���HM
{_�B7��V�����[	xhW����8<��@�=�0��@��(#(6����8����H���Di�x9��U�0�=��*m(R���x����b��k���=~?w����e�����%�wX��%������r7����&vu���/�,��
�m�WA!<�����A`�E���LcC�7���i���Y

��aY��O���G���@���ffXs�
Zh����&���-(O�f4�y�4��I?+������a���/�����`�w�`B���8�k�;}7mBuz�����j���L��#H�����4o�A��K8zz�-=��������F����9q��5���p4,$u������h`@���V�'�ZX���L����?��C�b��mh���<���3X|Vg[&�XYq��)@���K�[���hhF�jO�o��+hcc��O^��,��jjo]m �a����fo�� ���[5"/�A�Y5��W����0lSO?p�����V�����3J��
F:AJe;����h���+�G�����!^��$�G�?��Nhpl����F<OEe��t�(h���f<n��m������s�������Z�o7�B����'a>�����Vu�������\�N(L���M��N�Go�m]~p~~�(�Z��C�9�0g�%0�����&n:	v�dxG]q��L��|P������`D�y����/�	�
��b�q�]���G��G`���q]�`3������W���ah(������%��y�V:�,�vTW4�v�A@h4/�
'�p}�U���FQ�;`PF����mg�sZ?�]��3-�7��c�����2[Vh�� �!��g�Z|�����d>�����9C���c�d����h|��m3�;^�F��.3���:;o����r$�����;�^x�w��\8=������e*4�Q��@C�5��Su�V ���8�����wn����|��uR__y�����v���������K������uGy�0�#�4l���>�8x�)V���-��c����/�g(n~>�?��,�{,'�Au�z��]i=|�
�Lyt�
�|� ��A"}���"�&]�����%2it����:LM���6!n������/���_����_��(��2�uU����UkO�"���q]-	�y��M�G�!���A�����nIn$nP_V�iG_t"��W���=��������x�
�O�����C�.{t��Uc��J�
�����o���>�f%m�Rq��/�MiL�R�H-:���z�<�f81q�C�*��8�l�N�JGo{c����V�M�s�O�X�3\`��z�'��l�2�p��������E@��*�������'\	�2����0�vt|�c�[���Y��T���|��E���'��@����8��u�Es���{���}{j�D�{y3���k{��Mt�v���9�`����%t���\O����?�c)�7�i/�t<����0�����]��{h�a������\�0c��O���o+0t��
���D�*v0������0��fd1���t����������P�����c�dZ�a\�~�z�~o�S������*�K�`oZ���A�
9��������?������e���QB��wa}��3��]�m�`��Yho���'���
y
S�8���FC��	�E�Qx�|�^�2j=��Z���m�u
��X��C���������	hx��|�>��y����#QC^@�|M-�4�
�u���l�#f�d�}\�����PB�?��_�`���s9��:�������R��@���"R�"�1������lkD/u�L9U�R�d��������������v{q�!�-�v�H!���*TF�F��r���J�Qqw�0������kp�zw�Fz���y
��>�]+FB���:,*�p ���0d�&����u��8w`	�����Px�����g�������_������� <�}u�dr���[R"�3�;�.���������,�	���u��g��Z�<���	��)[pd�t��}6-��U �9�Sb`uaeOYB�jf;���v�n�|t�[��+F��y�2@)�����P��[G��]�&J�	hHO�E��?a�}9����Z�&�?:��V��� D���r"b�o@A�"�2���BN@��;v�k����0jm�����1�W�<
���`'�WU����/���<�z��=

5��P���SD�qU�r�h���0�iG������G�Ur��8 IDAT�j�0����G7��Vz7O�%�g�����'7V���_���Z�����R4|����]���~�����i�����pSM`�-6�[
�wv7��FY�nZ>�����]���O�QK44�DYY	��-`J�p9�D"�Wn����� 2*���Zd�����Zq���C�4+7���q�t�
�tz�6��[���n	�����
Q�����1����h!"��%e�T����1"[h��,�r��s�@C������f���r�
������s�y�b�n���M�*�V(���Y�U���+�����(������kw��������v�����b7! �Hw�����w�����3><�����sf��g�oBt0<�����T�}v�aD��
4�,n�p�6�����`L�Wv QH��b���m8��h`�%is��'O��	Q>��J�������F��}R����40�2���g��
�kR�L�E:�4��n��eRChlJ(V\��ck�����9��eR����.~��ybA�r"�>���E�$����k%0�	^X������i����gi�^�i��N
�`�iW������:����x�-���rxa�;��Y,o��Ns�e���`�zF���T�
?��e����T��'baA�
�j�N����!������
�_F�r%����Q����O������5��%f T�T�yRw��u8��T���VnB|�����!9�<�X<cSy�����W*)���� *��BC�����g
���0|�>�?-�#�A�Q�V����2���N�CNS�}QekS�Nt��__�*�U�r(�
���"�d/-�4��$7�9�C��)�t�H�!���3�i��";�4��*B��#`bl���v"6.]:L���Sae��f�^��u-Z5
�	���#J��������E<~�����H8����^x�U��-�$%�E4��@��"��x��Z�#��a;�A4���y��9;�� 

M��iC<{�o���{{����`�
��!50!��tvoDq#E�PXm��k����M4�?� `�>����D9EyXm��!�Q~`s��C��	�g��v[$>�!�/�F��'� 5 ^�W��2'h�"��Quk���V�+f��Y�����1m����-�`�,��7
�tJ��F�j�{h����M(�������`��0�q}443���!��)$�W0@W�Q���cy�V�
DScX�����y���K���J��.���������uSWX��%<�#�������a�01n���_j�@��z���K�$EQ���Q��;?��#H����}F6o;w���g��84a�n��U���6�7\��9Q��V4�3�4�\N��������1�m[R��G]�X�[ �m[��;���i��p������x3;w�*	z�K�L�`�A0�[�8{��P��\��t	�7�
�x\'p��n�8��Bv������={�n� �_����KpC[���\f�8+�[�R]Y��di0��0n5D��	40{�nK��w���n���@�1�+6�QU�7�-��~�w~�Y^@��,G5�V
c�n���qYn$�V����������a�����
�fu���������xw�)����dnzN�
�����;��i�����v��������K@����H����2���-?D2�����Rv0� E������k��>�+��
��I�1]�fe#l��6W
`'�{���Fv�me�5������1�P;��6���A����[O����Z@���NU��y�fb���Y�d.f�kM��o	b8���9���}m�+c���hA�s� ��G��L
b����Q�"���f�3!�����p0j�l��/O���#�s�vC�$����2���g��8L�����)�
�6N"���?*.	:����	4F@h4���>fs{����a
R�P����|�_D6VQT�
�~t�}�7ma�gji�����0��?R�h��^�}�l����I����s���+�~�vL�ax�Y@�"Rw����� ��m��~����{����9m���!Y

���CUSC���;�u����=Oq��8���
h�5�E�`�L�<���B�6<��j���	��[�$������9$XF�t�@)7d�'��N�'m'�L:�_(������+()��uA`Nyh������������G���W�v�~���q2��)7x��*Is���h�O�K%�R���C��ZU�����S�'��a�W�$��x���b�>r�V�%��bz_{L�tS�k��C(���W)��bR�0-�+Rd����Q��v��#W��\~���nkM
/IxL`B�����d
�W�c�3�����F��q�����D������������\��/R �
��vLbv����6������d����gxV[������@��Li=J��Xui�gu��
&����_����9"�	�����4h���>&��'�9�0�6L�b&S\8��
�Y%S��4���\]��A�J&���)T��_���	�(^�������&6���;WD�F���������V�4L�a��?�B���if��V�Xvn;��7���[�\�A40�G�j����'�6���t������^��-B;�F���I������S���y
&f����8D���)8���r#1y�!l\�>��Y����^`��^\v��f���C�T�����?��������r>����,7���!o����_���&����w��@ �j��H��	�jZ����d�C�[%z���k-�.|
�I���E�������X10����A��)���!`�E*)3~�H���j�_M�?Th�<�k��Y��x��2��D�i�qme��_AC^@�qe;��1�|p��*RX *u�?��`������?]����`�����LC�'40��w��0q�+WR���D�Aw�k�qE
�|=����[Vug��
eR@�D�C��`��CHJ�%5�Z�Q������yp�g4��������lX���%���rV'��9	������Q�j����J-R�T���w9|���h�.������-W��8��<�@�J#h��A���0��IOh�����
\���B}^��!����p5���q���cA����������Y���B��,[��3���\N07u7P�Q_��U���m5�o�J�<���Y8�XBSYI�a\��x�����c���H�F��240Ha��=��s5�Wo#2*�G��u;1s�p�aX�:`�@v�a��h��.*��s�p��y8���D�A9��xZ��F'�H��Q�LZ_��^>��&����3%��&{}��
�:Cp;Q��y��\���9���w�����m`#��y�?;�0�^{�yp���wzA�L�?
���e���
��������(��:],�i�����y�5ZNF4��/_��D����x0��Nd�F��88`���"����\D���4;��Nq�����6%� �d�O���T� �hLS�1M;0���@��$3��6j����o��m��
�io�	TE����B1��p�<"�����0�I�%�h�������\H0�#�������v�B�PRJ`��7i�zU���W�1��6?|����`


L��!1��+0%��m:��V����������se}r�1� ���r���&X�40���AUl��O�5WC)4<�����4H�!-�j����S�)44k��a�t��oK�����

��F���2B��D�Vx� �Nyha���tPAZZf9�V0�"8A4��|ArR�!#'��)>�h��k���X`

���r�m���$��B��o�t}
rM��e���JK�h��"iC�ge�\���_��@��B���Vx3�*t:W���H�gRh�>���X#|?���BC�J��~���`����f��Y�*Z�Q��p=1v����v�&��n��+?���&�!�#5���#""<� ��\�!�����9�+5�����6��������>p��)
���zC���Hu�*5��+X?�Kp�3���%�h�'y)4m��]WH=�'�����
�=�	X ���+�le��P�(����13�v�Uh����N��������+4��\�zmKd$�qu����p�	Wh����&���!�Q���&�	���F�DfA
L�!������������-���\7��S�������r���^L%a/�������n�ESs3����]5\�}��u0��u4��dQ9l�`��2
Ii���)*�h�+H��?��)@0��B����j�`���-�+4����n/.����6�x��C+'EQY��Eo�����\��
L�)���-��qu�`M�Sh`.!��_�D�B��(�N����s��/L����H�*�	5�W�h�� WOL!!��������ac2�f"8A4�$���?I-bx������o��u��X`iN���T��:���u8LpF�M���	���S�`O`�e&������a\�V8NP��������!�#�B�$��:���~O����C�����kR�����?�6��|I��-����t��##5)�cPo�r3�?RP�&��A
�K�6�H�	�������)4��M[#������O�B�#�p��&���B.$�;
��B����f����_2��!Y��t"�nA�o�� a��^�Z���&T_ZPf��tm?\oA��]�@��g��E��e��� �lgn�����n�yA��kc�Yr���B�����CP�������-Y !�	urG���������Nf'����r	�b���)���P�]����-c,���������N���

]�n�����k���}�`�98X���#�;���@���*v]���1��
Dv�a ).$�v��9m��iHR.A���sw1�[<'��t��
�&��Os��@+����z$���6}/~���c{��������y�IQ��+4�l�B�����$�"���������QM�"�����&�w���H�T3��p��(�Bs�1�OK�_{�+4��R�A��JhPl�i7\��e2hS�� T�E*I�&�����N�B�tr5����gM1*40��8tP��^����S�C���b��Ft�9���D����:�
����������le�y�����#0`�('r	�����q�+�=��\�$��,K�T���5G�SA�8�1�������u����`����
�&��g�v��l
��w{q��ZT����K<����$8��@��m��
�\��-�=��\�����k���6�F���D�(�q0�u^8/��u[�V�J�����W�/
40�(8V���\n��"B���$���M��w+����&X������in����E4�9n�{`��K�T��6�Ox�P�3���+���|`	�ToHn#Sy9J�$�NiEp�h`�+����<r�����N�g�w�/o��0������m��m���*�k�����AM}�"0"�6^��0;dzn���]����K�_7���
Dv�aU�XMpR0c��&����*.���G.����I�����^����4�l;�T��{�9�{�j
����c��O�!��@l4S��=:��(J�9+M�b	2��8x����L�R�5��B��Pp�C��P�Z���`!7����)5�^��\�.z�U���du�%��������"������� ���
Z8��@�"���k^�����d��1
G��(����h\;����� �L��3��!��q�6�HM�Zw�c��s����0���tA=r;��X�HKM�C�G[u������m��C�sb��
8s`9����<�Bj����{q�S���j"w�.h�5�/l[6
[�{V���t�����r���
�����M��SBA�P�$wE�3`�i>�^��������D��S��s�:&�^�4�br���eMm��P����Vc�8����{I����4�W�rEe������Cyy�lH���O(4t�^��<`ol���U��CP���V#r���3�aH����-]	

�^�RA�����*4�Ds���e����Z�����]����x�w:���\@dD/�g3��O�Bh��{�V<?��p��������m�b���<���;0k��:p[7Ay:}�\Q���r�Q^��aJM�`����(:�mJ�������R�, ���� b������o:���������G0���7���n�yYM�4�j�5�,������C�e'��G�!:9�m��O�?�'�6h���@C�L���p�Z���{�^�~�b�0�Es�����5��r�
�t������~fW;7���
�A��|\������P��p4���r@�5xq}=��w���xD�������������q�B*�b1��B��
���<�!?����8��}����mm��_B����U�aj
L�!�6������~/�
�)4\�����7�	�W�6OM's��`:�y��h�)��tj�����'��7�40E���!�N.��3HQa���Y@��7���$��v������>���B`���6����p�,	���
�K���m��$��bU
�I�a����q��v�����q�����<�ZUEDr�w@�g$I�R���WT~����a�]�\�/)B\!�	#Rw�PT�urE1���q�;��#������$�U�Bt�B<w!TTeh�B�/��J'�>�	L��4�;��8$�w�Bm'�R"�m$P�]["���6���F|��]Q��Wwo%�rj;����������_���g���h�s3���K���P��"���@��ZY�&X}~���o?���<�#��=�<N�A���D|��_)=|j�G

��B��g2� h�c�9�g
*t2�p�-}W��P0PA*��d�,0���������B����t:oBR�q��&����wr!By��I��0�W�6�=a2�a�=�VS����rSh��6F�.s�����py1h`��w�CsNZ��H������1�����f�#�l�V���AqzN�|K��4��'��7�7/���:Y@�"��o�x&����|Cpn�jh0����D���p��,,���\J������N��%>�����T
�<O�_O-���_�e�v����)��l�
�	���1!��#/�����P�i��@��QqL�,�A�G}h����,������H;�u�IN���!��N`[T��U'�x�
�	������������b�&IA�:y&3z������N~:W�~g�O���lJ�{��������y�r��
�I�7,����m�Y@�m��l��Co��#��?:�>d.�0��9��%�f�_����>�Z�.�g�\R[�����]�h!w1�S��)Oo0u�6U,�x����	q�	\`n(r
'_{c�%�Tj����sW0���y�VV�w����d�kkq�>��bv����E��1�")�M#�6�?%������#�	�c�s�jt:��:I D�lgeA�'�K�T+��XF.)������"�y|=��[<c�r������]�ne
,���]�Gp��=�����~� ��
����a���Y\�"���`�'�2C'�[�x�N12���,i������m������.�e��KO������Qh�cQ����
E� e�FVV���c�'XP�k���AjMLE��=�5k�FR���y�_�zq���n6��`�]�de�'��TW�����S�-W�b>�o)Q0�
���BN�=���i����r+h`�����do�]f�s�3�gG'$�iu��v����m{���hP1�A�y]�NW����p�e��2`�)���3-��uqC�&���|������}�L���8 IDATp���*�N;�FU`��HmAAKO&��IOG��1���W�����	��=����q�����cXQW�C
���I��sA��=����|�	�[��B����V�����t���[o@��RV]s�_�@�	��X0�#�^�=���|��l���O�A:�����$����)�n����vmF����)�6A_S���`�f�\����q���
��D���2mf��T'X�3I�A��2w	P�����S��Z������$�3��|���O`�jSh�p��7W�` F���}LA��Gu�
)H$���xR`�"V��N���hZ�
ZS]H�3"6�NmUh�$��e#�r$>�\��>�������T�h�bpSc�F��zB%��+$��P�!%�w�}���;T1.��_����bYQ�$����DWQ8q�=��1(��9��q���To6��Q�n���R���������"U������d�rb'��-tM����&�~]���� N~���6�E#:>	��u���On�$rShPl5rt2���#��J�Y��dM��D��4�@��S��.O�����s�|��@;N��"�v���H���$+�v��j���v� d��s��Ca���A���X�T�4������<0��-<HnuU8���/�g3)4�k�6�o<���>�E�)'0��Rb�o�i�|<��sw>���-�����!:��L�V��~���,�;����`H��$����qk�0�)�l������yJc����3�o�O���pH]7D�;b�l�}�L�Q�=k�r�-X=,�4�:Ev��Amjs���5��2w�c�\�v_�&w7u���+�)�s�Aa�0!{[q�����c�c��:s�z��g��������k�f�YOR���n@


44���_h�AF�o�"����h�pQ�����#�Cy�C��N`�
��7���>�t]�.���\J����
&�0�T���s�0��j��4���9�&�o�%�m���S8h����P�6];��Z�
9���8�!4����g��|'�>>1a���aI���=S_���/�n����O0�����o�}A*�>��Qt��a.s�[	
%�Tp���h�3���(�H����`mXB�V�������G'����]&���.��E�|xFi�����:�4��4������������,�����6N��;n]����m��>>��� C�m��x��
n^���V���
�C�]>����I�1w��y)4�����R���U�w�Gd
�l��i(����.C�\C��
��b@��(C���#a����Pd��@�����!7����PK���'��|e
�S#��!)5��E��Pu6�i����C~N��]�a�KhL�C���P�o@�����x��}n�G

2�6�����U����d<�7-���@���5��vFbD��=��#��?�'�i�0g�K���07������Z�h0�������~�va7�>��s�d��&W�/I����]��`�d�n�r�����o�r�G��W���:Ka���`n.���d��hm���z���w@C����$����=m���m�kX����� ��"�5{�����Tr]�7���@�#��WlZ��I��17�����/�fvi5����'����w��@�6�S2�2�k���W$��eM�<��}W��!�
�����4�)4��C=5��9j>�a����a7;S��
�]�c3��w��a9������{����.�I�-j��������u��:�\���FH�OG�;�==��%kn

�*WE����D�v= ���%Rh��g��^!{����{W���(��q�lk��A2^��� ��A�!��s�~'
eh���j�Z�A�����k��G�V��`N�����I|)���'���D�y�
�����g���u���i�ZpM��
/<���r����x@n.diR�����l��-�C�^t�����+Q�-M"-�m�y
t���$S���!���
�Z2;� NZh��Z�Pz�q�wnqs~&��
?��K+�P��&�
�h�`%���(LE~4&��J��Pe�4G$]F^@���*��
4u�3�3e�\�L�sL=�9��C��� @������]N������DPdcr?U���u/6+�.'��S���8/�A�e���$	4��6���]N$~nqT���+O�r�`$~�U�$�W�v8U�DJ_a�������\n&H:���!�4�
�.� �h(H�e!Nv7?S_R�I&��nc��[^�t�T]��WA�I��$�A?SU��N"`*�G<$w�}2���3�4g=r�������X����	I�� ��KC�]NH�>�
��;{>?r9Qe��gn@C~i
��4�jE�F��P4�@�U�@���4�����v� 
�����R�P��#
y�I
��x$h(��J"�4�ou��B���YXt��+���A\����C=rA�����.Z<W19K���������-(�
�B��Ze:���?��Cpx��/I��4�l;S��}@�B
E���^+h�Y�|zI@��
�7�T'�d�)=��� N$Q������,���s;��.)G|�3Hq��,� 
�m��'
?-���m�r�C:\N�;�(@�4HQw�ZV- 
e��	@�4��
@CK	@C���4
2�"	@C��'
�UI��6��$l�[��4��g��4�U�����P��X@��Z���J#�PV�M~����,T|�@C��Z���q�%^\A�A<{elh����_B��$bh���%h���v4h�a)h(P�����$
�F<�4�V%SJ���4�����*
�
���m.�(=����e���PV�������s����\��5����.�Pt�7gh�q��_�@�[ /���'
���!��Y�F����B����5]FF���Q�B��-�	��t
�������Nu+����������>}�y��-N��n�H����)�8����rq��[����"#��l��J9�3/�&���cAVV�P��hop=|�X���I��d������d2�`.M�c���A�9~����{�\���DX�����6���2R�">6�@Y����+�r~U��BFpB��S�H%��=����f��V�H�v|+��S�������������$%5���c����!E�<T�WE��)��YE�1�������Ib>W���HQ%��%��BfRR�[!�+�dE1��Q�����$���)�n����5V*�7i��9�sf�Qx��(�[�����|�IzR�6G*����`
4"�J�u/�������:Wdm��BhX�����&v��0����8A�V�",)3kZnv����)H���EPJd���u���^�
R�b�CC��D�������$h(�B��`��-��Pm'
jPR���,MAZ	Ai���H
i��y[KbYZ�,����_Z�=i���<�Ikg��0��> [��� ���:�<�	�9�[����.������9�<`'����\q�%K�<i��I��zI�G�����Kn����[I�B��J����^��*&,�K�R��&���%5�,-����0	@C�����K��&���o|���.������9�<�'����\i�cW=�����o�|N:�7a�W:�7i]��{���<������(Sx�{�2Sg&�}}���3��ey��(**��jK�����<5��!5'�F I��U*�0�2zzz�&C_Z����Y'LMM�*
�����Oe����e[���4�oE�\���.��[i����������M��;�#�:�Ik���\�����wv��u|�s?�>'�|�4�����;DI�_Z�7a>W��s%��E�K������4�o�:��d/-�pA�Q�]Ph(���	�fA���t����[%SS��\NH�'��\�����#��� Q,��������.�'>�}����1�\-�y|�s�'�/��]��7a>'��In�,9I��&��/�WJ��&�wa=�8���PV��gh(;�Txa^��No�LM�	�0��LO*�Hk�����+-w��.}>� ����:�	��9�Ik�s������0�+-��Qi���|N����A����Z��(	�GJS�Rf, 
e�RI�	Va\Xg�l��p�\��oA�$^�J��T�@U���������p�\��|���M��I��&��]��I_�s�9����w>'
�e�R�G��@^@����������[1�b�%���o�����^�'��S��@n�{��
��Y��f����<��/_����O�����794�aI�����*".X6��~z�8���P�K:Qzz�7mg�o���Bj���E��-�jJ<?��cAV6�k��`���H��x}�3C��������X��3�)��PiK:Qn��(���w���"��<�����Z.�=��$m�RA�{H�h������,+s��J�s����)|C�i���8��o�����#������j

h]Q;����YF�hC.9Hb������7s�I(�d�_q�����{��hT� �[��,_��!�}z�)��^,��p!�:�}����k�J��E��{��z�Q�~f|+T��(�������J�e�hU�j�-'�v2]~��1�U����?]WIf��|���	^��]��I,/SZV�e��
�m>�S�31����Q�/��X)o�V�����4@�X^�,X�$,��x��n{��V���}x-v:Q�_���f�h����_��u��������}�%ld�~i��X
���B��a�(/Za�#�2��z���yv�)2���j�B9��|�Pi�B"��Hx��,T���h2�)qfE������M]����H�R��H�_R+�2�%��~Q8�T�A,i�?j���y��,_k$���&H���4�6����;$��b'#dD�]Mb3#[���m"f*!�`�Ap*���	�,Pl��$���V�t/�>N�|T��B����dP�������2
���D]y%�[�a�
���U>�C��/��ne�R��A��yH��n�?
5����di���?�$T����hBr���4���.(4��h(��F~l{h�!�{S��Qi�!
��j��.� ��$
��Q��D$s�Ic.� �W�d�,
%k�t���Z@��7@C��������Y�24,_�3'
�6��� �j��c�j`rBK�l��_G�k�ekwb���<�
���KO.���~m��S�gq��}<|����u�r���P�������o���`�Y@�N��h`��,)4,U��c����5[<�����	hP�2Be�n������&|��bj��P�~T��������|%����"��xR�MO��.=��I���I/i����:/&���B� )D<������!��6��^IG��x�p.WD�(�@���l�X!�M���b��X6m��^~�H�h���"�����d�������y����?�YT@���z�i�7a��RQ�����e��������)�Z�������V��g^��������U��Y�@C��M���V�������{
��X�.��4�w���7�/��M[b�������8��E4,l���\���]0��i��n����N�0��&T��C{�*Xu�O���KM�]1�������B���5N���sc��)N�a��5pn0+O���}�;y�Cn[1����+�HM�*7<.7^�C��#
�_iIXRm))����*�2��*UY��� ���6X�' $�p�2N���}1���tg�o�n.]R�b$[df�KGc���Y�,��1���a��Jo�R������PI
go�Cs�!8xf.��Z�_����,)4��+�_����0i�x��]�����
�^�_(;����S-,<�9g��d���dz>�}����e��n���)�6�W�@���;�}t�h8/����hb[�4��9��DXl��:����6�l��)���Jh����=�oO�����&N��;�vKR�����x�a�-8�����%4�}�g'������=	
���_

q��������HM�G�Z�������B����1rQ�+�f���W����(+�X��C�"#���F'���"@��&+�	�������;m47��v����������q�����),��$�7����x���L
_� ���F����+�Gi�G\�}?��
�����m�A�, 
e��@�4��ZV�y�5�f����m�_
V�""�)�uL&�f�A�$�k�X�'S~�h('T���7��������� ��G$���9��E���0[�
�J%4�*�����2�x�@�0�qw<��JzF%4�4���YU��}���2�q�����N��	%
4�5�]�`��!%4�n���<�����f�7�������30����J�0�yS,���t:�P�P��[�������7@C����uu5F����`AA�����sO����&*Z�
���D}
Up.�~�-��GI
�G���K����8�`b�3KE��(T�����0��E���K'Gs��Cu��=J�<E@��a��`	$4|�g�7��[���:I������p�l���^�
���!=����H�5����,
S���������������>R�@Cne�
�:n ��g]8��?jsv��U�$�\RyIh��R
A��))�s�4-`��E�A��)�!��'b�{�r���hx��F�5��P`�$�6F^��������:rpz�+<�2���zj�L�ehX�e/��g���stS�a��~�r��45`kc�
;@A^�?b��PVR��%�����v-���;\����PRTD�f����8�SR����zr8""*_�b�0��wW'5-
����������c���BM��l��A�J���2L�2]��m�`��, >�PU�����6����}f�w�G[���_�rh��O:���D:�r���|/�/c�BC�B����
r�>���ph(�@����:��l�r��v���|kd�~i�R�_he%��:|N����4;O���f^�����Ud|����`�i�g���@�W�<��2��z�����fa�X'hk*",*��=S_0�W��+~PU�C�z&��)�%�� (4-����8}+�W��K�(Xkb�Aw<�����5`m����/�u�m|��	������/�����bE�7���
�p���\�QT�A�N��
r���0�h�g-����_ph?���'���m;�����?�;�P��#��KBFz��u�J�k>���x�`?>����]'I\������N���H�g��eC�_^�s #+��P/x��U�d��K��b�`�o���}<�W���##<��w�a3u2��������M+z��"��)4���AASa7n��e*vhS���S.O��t:I\k�_�6z������z�E�=;�����X���d��s7|�Po�F$����6��2Z5��v�4$���fu[��(���BC�����V��xs0f����-����H���ikU�{I��OA��G�TS��b9D<K�@��R9�)�C��G��I���"�;*A����k<2R���g�����]NSXx�9��j��L��Y{5P@������ M^���<\b�f,O��H�������e*<X����x��R�~M%|�����x��
t���^D��H ���-D�����c���PPT��]K�o��Z����|�e��#~I-�x*zJh��!d�dH��AwHQlG+�������h��>O��������4��)�`��6�,�11i�<�6�+k��4(����.�x��������rp[��`

6]+#�+~�	J�Y��_G����p>�������6����h�X�\��*r�xM��B�y^����<M���Xj��Fw�>������m�������9E�o��q�7_�e�P���yu�i��2�Xya��*b`�������=����S IDAT����,}����j�)�5�f`���l��Z 15i�(0��jT�7�o�~���
\n��
����y$tU5���3]���3��������?.����z�3OV���a�
W����Ms�:��IqX��W�$��*}6�e>Wh��~��w!�<�� oX�7��k��4�S�������?Nl���<�:O�=���p���	-�r �����W��eE�xz��Ed���`Z�_�3��sw|�cI���V�@X|���,��E�h��=��e*�M���k�����p��s\y��v�E��r��
����:���}.X2x��T�D�*n�|�����v=87l
U%%L���)IX68SM�MH0V�<
���s�|��B����f:����v^:���u�T����6�7x�R�U����~�����iA���i����u��m�4<���	�6L�����|�(���������&t��m����X D^@���n�Z���HJ��4����+���Mrp��y%��������_�.���Phb"\zt�'�����=|w�����]�������.��v`CNyz�'*�+4l��o��/\BS��b��Yy�.j����������W����>�))\�A�����'�4������5
��F��#���x����{q�=�2;��-zW�ZEe���y]�`����<���;����6���J�Z�9���_�.�������1��%vX��h���W �S*�L���&��^�����;��r�������~����(�BS�t��
���d/=�����/�M�fv����'~w�������������E��d4��
��Eek�H	B�Camd�c4?��';�`\��HMO�<W�v���q��\��O���q����/����5�k�b"���q��
�C��{5�@���Q����#|���&���s�0����u���������l3����md�r�g�������x����n��q������2J��8~o7����in�5�`=w�y}o�>���P���Cu:���'�H!���&�z��Gn� [%��C/�Wv������49-�lV�I�,{[���wv�s#�?������������#��������&���=C9�o��7�Hu�r��ba!��z2��2h�M�+$��W�CC5��|���/8�-
�����6iny�B��S�y�6T5d����#�����P�N�2%�W���c�d���}�G��/c� �}:*�*�(�a��F�!91���w8Whh�[��f�L�G�_���x�c������hNz�`�4d�<B���a�c-�j�����{�/K�P��F�}�N�>�����Oh��E�0�����NE�a:dY�S�'�|=��@sm����&Cu�Hs����,��uehUk)C�����%c�|Cz�|��#���D
�zr�l"���e��Q�9��w*�?"��MO-�y�B*
E�����������k���L\��q�,�e�i���~��,j�ht�9���^��%����,��w��NCaJ�����Fx�?�Q=��Nk�)8{c-�__�M�*�-T

|}a`wz���S�����Yc��L�aP3'�����8�f�h�o<��m;��O��SW��]��J�gfgh�����;l8{��1�S>�����S
\��CL�U��'��woC�m-�g��>J�8����#Z�?����/x]��Y!��	"���B+�����`�����TQ�C�^�6������U�W��/:,���kN_���}h�,��mAk�M�WA�$������~�X$}�v�9�,)v�`��[L��m-�����Jc\j��n[�W�P�=��{O�]�W������-L�A����d/-�:u��t�_hW��"�G3�m�����9y	/���-s^GS[#��V���=������i��+c��n���������`n�����������@�>n�}h����fsSfGvM,����wx�)�[�xd���:���{q���~���f����o#�K}��������p0�C�����i,}�sO^eU�����*���CP���\�����x����6Vu�����O��O��>�t�	�wD���&>���g���F���]�����3�{������h>�������Bh��}^���\�Z��X
m�F��s�B8-<��~sh%���B���^A���w9R�����4]9���8-r��!/�fdAk'ki=�),�'B���/���A��=�S+���5WZ�^��'�Ph`s���W�cR,�4�n7	�wM���lZ�@�;zG��C�4�Z����x^�3�.P�2�m����h���@X7
�����b��������V���	U������O����1Z��J�@�x��k�z�3�������00���2�T G��m��D4�����G�j9:��r=x��?�;�,���M���AU��<B���y9��/_u����Az��2��B�6�H
��\����4��G��B�[�{�,��-q���p���o "�������~�;���y�gu�2��rj�Y`d����/�5����g[��BMc3q�)Uq���
��^��
K�2eh8w�
i�K���Mv������=�u���
g.�@�UamY	��|��������i���?2l��D�6M����zPH��H�z����/q8B�~��3$��L�J�F��`%����*�X��#9C[����3�(���o��6��W���A���, .� G2>5��S�10�k��WWh��bv�AII������#`]�-�i0��#~��	@C�WKJ��:��E���*�=�I#��
Z(/O�Oi�8����9%��@g�R�������K7�Cv�a��3��U	�������y[X�ASM[g7��yW���)����a�8{;=�qxI�����k�� ��7��hL],�����8�������:����&������,p��VL��-�_�����f�����6������hel�g��*Ti��f����F��Dd�3��g|����W�Q��$������Y��x}k+Th1��;����CPV�GI���$�����h1����������Z��}��o0�m�����D���p��z^~��+e}�����<5�����U����Sgy�!joX�e#5<U���KV����x��2|"P�
�$�����9��{�|�v%��;/�-||JLB����>w^/�M�����
O^����x�y��>��q-�������N����p>�'X�^/]���!`u��)3����������/*��H����*�p'��m:��k �|"����"�\���&rP�
�)�:��	C'e�=NAy�L��yF�D<ME��jt �L��@�*"���J/u���L�g^���z�������U�^�Sy�X�i����������,����KIh��E�����[��(h�	4(T�s�F� �������-���������'�������-�W����O��4Tjnc�
���	,�U"��0� ����+��o�a4���{��B�X�]*����hP����5��>O��WF��D�h�8��+'0��h�����]+m����]e�\�U{�f$]��G|���v85�zl��/�R3#�WP��Pc�
��~���!.(�
����1�g��q��Yh�i����x��j���K��x����M{Y��	� ��j��@S���|��;�GRZ
N=�A��P���&:�dXw��m�U��	H�K�'�k��]L�d��;�Np `��M~��r��m�a]5-�:��v+�����G���R�������m6�Y�AE-}Z@����cO�b��?���u�H���>�0��?�,�������`�[�C
[��b\�>���������Te;�CmiW�!N?��B%5�Dy��X�<�>��2�=���qD&�`u��<���������c��8��6-������p|�B���
�*"���Z�U`�W��y�~�$,'W������7���~MZ��s-���@��{����N�#7�`P��8�v�-l1615���aN��X�z��{�x������Xl>wq��0v2f��������c���8Ae0% �����;/��N�W@�������h�������D���!���R`�{�]��!#q��ut ��A�����K�wW���N�n���EK�����[�u�X_�h1r[��u���ta�������9�_�\����+�����1�Nm,�~]l�q���r��g�1���i��JN���!�4�O6���{D��[��O}�B�-��z�;�Ac����0��I��`���9����
MH������?#r4U��c�|�[?���S7��9�=����B��=o~4T�������f[�@���h��������1
=���
%�E�"6��Z�����b��������r�J{GHt��W�G��p��(h�YAS�����H,���J�������x� ��m6m���ac\�6�&�f�:���}�F��������G�����9�V��x�.|���[���m��S�~�$X@�@�F�Zs��9�h��g^���Q������6��21������ �yp<w/����&�@O�<���7�Ct0�z_E��C8���v4/�~�o��q��A�C_R,�e������E(�:�{�\`08�g�a���Z�62�I�w�yS;jT�K�@��U
�����m&
/h!ZO����?�K'
hhB���V�}9��l���~mT]���"	���3�3/p��+�$���7q4ud����3�pj��4�/>�Kpm�\$����b�>��|4h��q�������,b"h���f�4�v>��A8�;��U*�#�6W����#j7V�
�r5��`�0��k�](X�$p�z�����:M�vF���>�uqhK����6��"y~���X�u�Z"����[�t���rU%jK����D

��S���_�`@���$��<\7��!1�3����C["1x�>�/C�z��
��!����T'l\�u�/��>��Y���c��tP�OCl]��G�.�dhG����^k�;��Yy�$���m������w� ������^�����:��� �`�����i����A�#���*v���=V"!)��][M�3��c�'��@#����N���)m+\��-|�%�4�P@���2����h���=~�#3F��?��W^�oR�A�l�����Ry��^�u�+=S5	"��v�^��2m�������6n��6#z.����a����4�I�d����|��T�UE�����.M����0������K��f;���y?N�>��nFm�hO�����`�����������y������>Nu���6���^0�����m�h������|KVh�k�%��!�G|��A$�v��:��y�>�q���y��I]����R�_z�Nr�k����[	y�r
��������R[��=0� �uY?�/�9q���X"h�]��vML0�!nK�>��^M�D��XW�����\�hi����3s�c��9����2���J�^m���+J�r�&��"rA��|Q���U(��YS��"�����I���8���X���bl	��"p����Y����n9��m)���,�+��J7N���`�`��h�O�7xWQ��]8�z*'x�����v��1�������DD���A��h���G�L����#�jKn@�A��6���!�C
\@���p�@|��������^������������@�L�>�EG�p� :�R��O&���Y0n���+�P}�R���N�=cI�����HX8O���U�w@�GZ�}�:�������X�)����A+�<����h�����"!2m[���r����P�J�����n8t��`u�_�����q�~�a��q�A��H��k�%x�~��'6�Z����pj8�q�Mp�S��h�' ��`�'�h|RW�y!�'�<<�����w

�h�'C^�sQ��������v�%�����w�9]o���[�H"$��b�&���E��^����J�JiUQ{��GDl�b������9��idyI�{��'�{�=��s��=�g�*{v�����xJ�k,��@k��7	�&����F��{���\W�&��NsdN����B�r��0�eG�x��\w�L�W���b(
���*r��>��~7���~�=��f������/���U80a�n)����LL��qtBd�O3��u�<~NT��H�O��-���T��M�FVVX�t5fNIe���/3��p���M��A����id���7�E�}��jT�G+SX�����&Y��t��$^]����yW�p����.����|_��"
�6	h(�@�!���qC:��e�B'��
�&��7��F�����o�C�����8�	8�:!7�r;�����BQ���]Ckton�#>����c����X������Nd�A'����i�2�S�\N��*c�7Dqz:���� #��������L\�4������>�zU��d��+�4��GZ������kI5!5[�%�i���s�Z"����D~���M��]GTo:�`����Mj������"T���{��3t
N8�8��):_��&��+�����M.*�/h�h`���_�D���B=���Yn$���2R2�	e����V(/p��r����BI���*��F�N��:~���=G���C�c�J'/���N'wS�^�I� �
���;8O���#G���)B��i�x8d�b+<���U���xy
�vP���P>x~<v�����1�wVR��o�T"��rW�,���.'j|f ��*�e����F�b^�
x����Stt���3tPc�RHj���*����=���Q�N����6"I��������A��	�Z��2�_��2Y���D���F��D?*�o��\NT���u��������K(4\'u��R!�mDg�G�����3A���[qq�	h<�.)0�A��.xy�5^���4e��UXY��VK�����qA����y�:��I����N��C�?[b���Y����R������p��*��"!<	:fZ���Z`[��4X	"�v�!�pR
�!tb�d ���/ =�z�4�����9�����QfSg�*���+���U

4�&�������~9�n��`���u'����>���j���T���
��cZ���S3|���N����~��K�%t�Efw���nB�a��1���.T��q>���p��X�,+��]ztK�"�>`�!\�jn+8��-5
,�5Vy������/j�U'�;����C�{��B�A����ul����4�"T��'k�?C�CTB�8���n.�9��{��8B�
[%�4������)�`����V�!t���al��-.��������c0a�R@�������?���3��B}'tm����B����j��Q��!�������A��/�q�t2F�E��&������=#����z��R���7�-����T�����o0���_�J�gh���pv���U�)>�{w|1�mG�!BE]8/
*g>��">���r�����8��)���FB�����b���*L.0��P��:c8�yjw!�Mq{��X����A0�0��!�<LPK�K3m�%5�����r�R��S�}{�&�;p>����>�i�n���]:aA�?����T����0���(��(Lx��	O�����
�����K��B�����"h�}@C������	���Gx�-��Z�;���b=:���;�+��ob�B��*�j����#�af��Z�wu=j�Nj80���c[��q�8�wLa� +nQ�N|��i2:#CQ2��

��eaX�N����	TqH��_�N��a�'��\N��%cB�� IDAT���1��B��K@	�B
#��g�gM2��iX�a��B��f��)���eu���n]�2Li36�N��q�&���{�B�H'�	����R�*w�|�T�O�*h��au�j]���:L��_N�)�
n1Q&0�`F�m��M��h��m"&��X�2dm�Ck]�gAF<� m\��1�*v����`�
c$d!8�%�n��'����m���[����|2n�j��'��/@�G�J�Cm�#�����n�����y
|��uwa�9�=
����H�&�l��{J�6��k�������>}����44��#�s9�
h��{u'uY`�GX������`KJ�1�dHR����4�T���x�6�T?%<��$@��Mal�sRc��<{b��0R��@E;uQ>+p��muI�+�tR�Y=X���b�, 9h��6d/��V�"%���i��!���>��
��k�	n�,p���O�`J��>�e��5`nu=K�G����� �,*;����!BI!�O�j���VV�Y9��y�2��PhxE����6�H�R�'9�'jW�$5+l90����>�z��Rtn9Q�M�r"��E��M��np��n�=DrK�@����X���c
������{��8|��g�b�����r4��y�����'�����V��g���j'��*�����xc<A7�w����~�z2�3���	~��{r����y�)kv�fG��v�L
=��_w�"Z�t��@�#��?����_W������h`��A>�����������D���@�����^��V�C�2h������F0E�1����o!xY��k��dT_r�dV�<����j	��S��	#�,����E�0�WV[
4��Zs\����S�/���F���y_61����o���yA�Wr7�jW�����Um�I�2(!�	��?`aH�5o@P�����x�h�2�31���J7H��NkQ�'-	5�B���
+1h��6Y���f�E����&/��������8��������*B�sVvj^��F4G�2�
4�������|���)��n�9��9���foW�

��`z��]I]�(����r#�D�|�'��+?���0�oOV_<�	�������C{w���2�Tn�����#�������8�k\��3��)��"�y@_"����c0��i���?c�>d1�5%	������&bB��R�.�O�����u:�_P�!���A��~�[��>)*�$����������?���mE���	���&-oZY
��� ����Z���7�������x��3�z�m#��pn%�*���%�uxEj`��G�WV8�w�p!Li
LkE)��� ucRh��t�!%	4X��G;�����A��}��4j����eh`Ha��5���i'	��'�!�������.�Wb�����9��0l�h1a6�7�"$�=��]���NM�� 9�b���+�?Y���,��y_"�v�!s;��4�>0(���b`�N�jPH�)�=PX�A]���	f8��C����)tJ�����@�.�������?�CVb����q���C	h�}�H@C�:Vw�7I��T�D����6���
���H	�G0C#���
���AY�]#}v��h�/��8�N�S���H�����
4Xk���	�^���h��go���,��'���c��v��
�m\����?pxG��-����Pj���Ph�{��"
7���A�32�s�2�6i�g��4���p:m%u��N�����4T��}I�=�uUic�]H����p7���

[�P�/)5l.(�5�Kt:��������Pg`EvG��m=:}H�:���FR�\�2mLs}
��|6�M�	�A�PM7�X-��O?#�l�E"���Y��2OM����qp�t��MO/��������|�N�����Z�f{��o�d8��� �OQw�����	�I^��?jdD�	4�
 �!�H}���mB
�0!/��BS-�f��	���jPE���D��z�%<;���`^_�t��O������)4��!������������B�_���K������h���hT��YNRD}P��j�p�	4X4����q��)�X��� d�&�.4���#����^��� �]sT�q�}���7j
���{�/�B>��D�}I���6-,���t��$/�����>���2��j���Og
������{������F.$�.l"�Mp���ps�]�\����g:�
��=�xb{����`�
:�mf����8�4w���d����,�������������^u�
��S�o��8�L���Q9�zp#e�?n��G'y���
t,����[{d�
4�j��{��C�R�������x">%	�����������'	wr*4�#�`�{'C$��=���.T���m�7�����������A�����hH����8�2�
�I�dX��
�����aX�nB��8�BC�?&����/�`����0q�BX�;��/(�d����!3�E2�������F�0���+4���_�L��}�D)��PKOG�\���s1z�<Ro(`���4|��#�:��	 ����pa(X-�������y+RS��Q�`��L7�)4��#�~?={u�������Y|��+���3��3�����`�f2���v��@N�aP����e�������5��	�
��6�����R(r0�r��N���C�J���N��
7��h�T�6�S�����Sr�Q���	�[���>z?�k- �Z�g���@�,��!WTo�D�-p���0��V�^��Nn�X���ru�rrG�

]�9QYO�B��S:�t����B	b)A0��P�G%�w��Q{����M��Xs�:����\a6�4X��v%'�q����Q+����?h`@A��bi-�a�PT�
��P��'�N�#��C�%��w}#���~N�U:��������v��p|�'h�E

;>������k�W������MQ����r��/`X�`7��4���;Rh�A

/H��A6���v��������0����
����F���sX���0���l���d��kD��W�h�J3H=���RI}�
�"�	4�q��aH*_��0���,w\��;��N/,?<��4�q�������l'��#Ww�RJ/��r�"������<�,,%���N�S��d@C I���C[M$�X�����$�+Q�`9���*�ku�w�v_Z�/��1���#U2Vh������]e�B���_�$"6��J#g�J�B�&�[[2��r��'�Y�B�'�B

W���)A
�}���^�7fJ��Th�!�����RS2�p���F�|��d�����"���W�0�3�P��RH
��Q%06��W��2�!)�
���E�A�������
�z�!�N����z���5�Y�OV?`��4��(>�����	�B9!K���K���@d�|nL.��A
\O-�A����.�(��{(����X%BMC��`�BE��Y�*4��+�������|�����F#2�q��P������s��@��,����p��64"�,����
f���p]
�m�j�X|���\H<Et�kz���nLu�f���Nd���`����g���.=�<�}��BCk������=P�_�@��#��q���;�0a����r#�d64�������H��O7r�p!���S�A�\I��mRrZ{����D���BC/�2��4�'��������[����*G��l`��e@�'��d�������8t�`���H���0�q��-�:�9�����I���9����o9���6 ��XOkN��t=r(4���������q��
�IT������8��&����@����
�EXa*'�����-]�N[2� 5��'�c��_P[h-��#�����������A���oC��C���du���e1�������:y�P��E*�2r�W�B����.6d�#���
�\�Drs1��X�a%�%{����^���9��7�	W���� Wx�����,��J�BCE�I��ytD:z�4n&d��)+44���MQ��A�%����&8�Th`B<o��+gI������C�{�s=7�A���	Z!��m�\�m,\',����6����b�$��F��������3��wz�C������7�

���g�o����BQ���^[�z�4�!�(�O1��7LB�n3��}�8�bC�"�\�?������\RpxG���jJ�-H��^��9Zl���{:<��h�y}/�4�DTR`G����

5]����S���%wm=�a�fRh��H(2��:�]D$$D ����Wm�(:�J�H.�A>�=�����u�Z�+���e�/��z.�CZSFE��%�K��s��8�����P��?�������������
�����O�#���0s����D7��������	�J�x��n�����r";t �������q���z�nZ��X����������Z�i���x2u�Uv�)�\������m3X����+�4|��vi���0!�����
����SWr�B[:MD�;gO�Cv��}���<K�UJ���w�@�N��"��oE��s�`Y�������������4�^��Q%[���"v���F���XDr�K���guG�o�������Y777��
�����o��TN�dC�M~����@��P�<'.��m��v�q}%��w�� ?��&���-\��E��
���~����PABR*�.��o����H��U=+�����W^���$�H?�3��o��5^D��������X6�)��&�����CD�$������/{:����z�+4�"U������Z���T~�q��T��[���~���D����4�	��$IG�bVLxq�D��F��uh���QD/�$Y4K���K>�90��n*X*��V[�&�];:uC>����	��
�5;�mr�j�u�gD�O9�@��u��(Nm�C)���vd>�v�!��C>�����	Q��rsvN^@C���`X��d��qu�48��2h0����ch��4����$I�3��5�O80������������k��[��E�_�o�rSQ�6M�o����%Y
���$�9M�T��� i�WdD�	4d���a��=<��K-�&z����p�2���,��$~��\_�y
�r�gM=R�cQ�%���h��R�uk��J�)�'�5����2��3�@"P'y��O|u!Q����M�4����&�O��
6V������4��=�5��`O���&��V��r
<�Zyh�@�U�-E���#�D��-
����Fr��Y�pk�p�J'���t.�-���K��:,�B�2���{����yp��tRnz����
�5�xI���.:���E��IF�9�U���o�8�u&����,�4�Y��>���2��9�,h`����5�����x|�9*���80�P�����M�O������{9 ���������G�*�kU�T�pv�e�~Z��<����R�?�������"�P�|��n-���+vsqwg�[������3�m�wvD��P�����`���\aPIO��au=�w��*-�6"��<f���_�aQ�4��9vA��fU�`�y��8��$X
��6���a|�z�c�$��T_����@�m��i���m:�
��x(�C��L��1�1����0l�|��z"������4�I$�����h�L��s����0�/�c���1��`+���/�����bf-�c����6P��t���A�k�P}FP����CeV�����VBOC�Z�|��;

�VU�J��q�M�a���"DBJ�h��Gc���0�S��+��1/��U\+�C�Oi�^������Z�*c���}���Gh�^��r��@�c����!Uvakj.X�a�y���g,���	~#u����n�H�7�oB����y�/��Q^9��O�0��������h�ZW����u�g�T��L'��0z�b2 ��'r]�n'B����k������x����H2 x5jB�����1��m�����������_�T����h*@�DR��s�l8��;Tu@S��T(�"��q�����n��;�	�	l

��%_<$�?�m%����D
�ov;��aWgt���Ns�������N8���y�JH��j;�w���]����nC8��'7��O#�D���������������P*s�������VN���8r��!\�L^�+f�)�&-����3r��N����M���|��>�mr���N:��t�o��r�M&@C�H���r�G�m>��M��f��~��C�o{R
9>���
E\�h�W��=�amO��+�K5R����T����������UZ�
A����4�������I���.�v
=k�����whtA(�o��_�$����+�� ��z�J	����Y���+r����/bn�!�$�
�t����;����v�1�}I�W��5-kv�{C�

�������t�B�|�j<�>�A�z�>h8���C��_�R�`0��\��N�*���rk������>m5�N��h�����d�����Nv���h�2��Z"�>���Q�,���]�mN��	V�`%��w��4A�����-�����+4$��"�N��T�S�5�i���`�<?
&U4va��}'HbX��|��/�]�m�1�S��+L��BC��d0���3c�Kn d�Z�v#W|-��w	q�xM@�6p`��a|��w��[=]z�R���K�������+X�������P`��.
��S$�>5�DR�b���@C	�?1&�TlIF|��P��I���3�0�0x�)^�os6FmY&�cW��f�b�VB�u��{I�>+�~�D,��0*fT���d�H���(��sRv�L.2�>5F.2X��;���'44���\H��vcS���k�i��YWv'�o}���������?r��Ak0nC�n�>"������D�P�h�~tm�-��2k5��N:����P�����{�n���w���c�q����h�~��?�wQ:�6I@�f�k:JH~s`w��l��\I|* �-g���_�\{�<�������mR�T `���h\�/�^�:����Q����N�>��@�����<�FPf2���)\N0��af��(O�~^�|�~~�M�90������(��/��#�P<
����8
_��9F���k`�����0~ ��>�����a
)6��i+6��k��

4��O����K|R
�_CH�*$��
������*b�1���KHi����^;s�4��\(lE�����sB,��h�]���s��U@��4{�~����RE�~a�����Z�?�8L�������/������u�w{����+SD���{��f�& v��}�hh�dO�@
���/R�����J�s�V�` �����V�M�OVF�G4��K���[���H�7���{�Q��@@�B[����CTh��[�(�Y��"H�6��<�y�����AcI����4G�e��$�\�D�,<&d��s<�	|�D�!�����K����6�^�w��������4p�mz��9(����'caWM�d��x�B�o�o�t��wM����
��p��n�6.�9�\1��4����8�� �#gr�
o��s�L{���������4X6�F�#�_A�w��C�n�pk�����f����h�b�Cr+��.\�/!w�	bo���Ub�2��=�@R%��-�l^��H�0��u����n�������v�D�]��:N���������<�@�&�������.��&8\X;��m��38z|*�xq�8��,�>b4q�O��{����
�d�?C*���[{���
���;E.x��<�}�*��b�����?hxxV��2��j����� IDATh��
�l�z�g��'0�	����M=F�u�}q��:�o�$��^F�����OD
�AdWh`8��ZpY�*;Uo��g~��(������m$�1�cN���������oSr�./���#��Ft���a54t)�*�J��B��s��������8b@=���~[u�.=y��u	h(�����+�@���lE��h�FF)
?.Z��[�rB%�[��Wn��"�k���*D�4�z�
�W�Wl Y�t��R	2h���ru9q��e\"7�4��n�.�$�G�������U�9m��%W�Cnix��@���3�)H=�_h�/?����DA�d�#
���4�^���c�����D~ye����zQ����S���
�-'/���y���y
����Q�����(�c����DQ����DQ��+M^@������� ���CA���,����AR�6mv��w�G\&w�^���
�6/��@��H�]NWu�s9Q\���|��r�C��>��C�,��EJ�^%UFv�E-3��[5eu$�%b���B��8Bv��_�{_Y�
���/����N��)��J*��>$��i?��`��`��^�+7�� �>F��4|�vW�y�K(h�l��'c{S���ho�\��W�<��W�&�.@d�a��x�������C�����.��r�?�C�,��y
%R�B�>����d���r�d+�ni�
�ne�������.
��P��^&�����R��(������[y�,
��cJ����o��>k�P��*��$�!�{'
��QAcH@CA{����4L�4����%��m����;�8�4��w%����(
o�DNd�:��xu�|~oA
�Dl���N��/jVy����b�V�d���W�)�2"y����N�+��Y~
���J@C~=�y]
�O��%H�w������Tt��t�~R/�tW#� ����Ne)��:��T,Xk�?;����\J���P�=-
���?k	h����$k 
%��RYR|@H@�t^	'��	h�!'
���W���(���S�4|h�lzESh(���_i�4������4��o$��m�(:�P���I���zgKo�$���{o��I=�h= 
�x�%��;��g-
��d
$��${[*K���	h���+��� 
�H.'�����	h(��$
���GJ����&� ��$
���H���<g���4(�]��m������R�RH=��$��G�4c�~��%��������4�doKeI=�=�����\(t�1���M�*t:Y���CCS?���$�"�_VJ@C�����}�,��"��n�Y�!��<�jiie�����"��d����#������E�_������r��ee=�&�iIE*��p����$��������
U�f�*R����-Ta�9--
����F�J�s����~;���GJ��x/���k_���������^rm$8IRRTUU���\�4����!��pW������!���,7�@����j���w����7#�34-P?��H2�5TU�f��W����m*hB#-Bn������73��PN��_q��z~���T�*R����}o��)�/~�C\y����y����[�������E�����(L>�N���$���!�[�
,E�u�d=W�n�\�RV�{9�C}e����������Mr��1*j�����2�3�AE��X���(�7������������������������J<�~SX*Mi���������j�H]$��D�Y*D��������]�9H@�N�
}��%���N��<�yt���JJD"(PP�����c, K��R��������"�wE��u�������"�wi='m��uVI�CZ�)�~����������#���������s���SR�P������?�~t9�Z�s���_�.��.�#�@��	h(;�L�W���.
e�
%��*����~0I@C<LLL����\y~��s�z�=�r����o���b�o�:����b�wi=�x��*&�#
������r���C&�����_Jv=�'����C9e)����=�_qqq���[�?�z�����������,w��**y�(U��Se���EN���r��ld#��^6Z��Z���BGG�������^P�����%�X�/�������)�������y~+���"�wE��J�x/�����o�<�yL)�����]�s��
�:���+��&��>|�����~��8�!��=��SQ�7i=W��s���W�����y~S���<�{q>�������BCq�I)��|H

e�K'���U��dJD�������?���:���u~SdEE��u�����'>y�K�9��~�{������S���<�y~��s�7�)�x��s�7���������e+��������5F�������Rr#
P
��I������,���?�c, KKJ��xi�%QE�������+�g�4������<��b~�H�j�J��w���S��	P�\N���"i=������"�+���4�D/Ke��z@��-�6��
��3Z�SSi)- �3��F.�:��
p�� �6��
���f�O-y�s*��&m�+�����]Z�)�xW��M�������J,;�(��&��s~����]og	h(�^�����@^@��#�����"��^�Fx��Z������J/����$m�jPS���������{�f�8�=�7V)�B?ri[�q�r�G���+��Q�Fd|�
�����"�#��2T�w�j�����n���G���h�RQ��R	�r��mwDi�N��xT���L�7����@�vp�\6���t[��+����#f_������Q���j�����e����r�D����j����vX�9�|�q�7�}DW���*�r�����j�?^v���i���Ru�?�uX&9���>�<����o_��.$���us�H(G&����$�)v?xX������T���oW�jmD'��H�U/��y�j�HY\�4H@CI6	h(�^������4��[*����������VS	h�����`	h(hO�O��G�����b�$��h�VRI@C���4����R��$�A^=���G
?%���}��)$�A>w]����P�~+��$E��U$�����4Hu+�= 
�����b� 
�1Z%����������P��#
���bJ@�4�7F����	h�__�tN�P��������R�y��4��'�[�H@C���4��1�4���K@C��Q��o�9�4�!����+1u�P1�����uk�N�jx��
�.Z�o���X���J|563����'��������@��uQ�v
�N�������}sqMr�i�V?��=G���CC}|��ka�"�W�����s�%���44��D\rn���Q����
�0�f����`5�&�|u�P�3lg
}5�n	(T��D��BCzd�o��ryK�I��F����
�o��Kc��W,T:Y���'PNW�No��eT@�������p�h^>I���\��%O
*T�����72SA���8�>�����h�a��X�}+�L��.��,T�,��1�w�Z��P���r���R�`R�	^^���W�U���{�����~�pX��P�1�����m1��IQBuKKt����;�tA��\�R�

&�{"b��/�A�I��)N�M�;���G�\��]|��K�:�h8��&��J��nY��V�D������B��4E�7���w}`kd���xt�����+o�����ro�����?1���au�h+!�lb���"�zh"%:Q�
��C�@Czx�|�B��	��r�_������zu�Z��P�d��}����Z5��8?�6-��-�xy
)7������P�]�����_��C;���'��.'�W����(8Wn�s7�#0�^��3��z��0�Pi�G���D��k�����9���ph��X�o�Ui@�Y�x�{d�y�
�y��xx/B
�F����H�_�>�}u��& &9�<
�E�]����Q��h�w������{�D�@�I����}Z�:����Z�����i�g�iuU��X�n*_]U;[������C'$E���wx��{_"y
�n�@K���� !�
����{'��E
����JW\.'��
����[���{s�����5vo��Pm�9{z]���jv�e��E��C�h��������1~��B�.�?�j�����	����`F�Q�b�wX��p�*�k�����^����s�s��.�P�~����
d#��S������M���N9I@�\��Te"
eh��p9�O!���W�����tA��`�>������-*�����e�6c�����9�P]&d�E�����������4f�9j�����-����h��x_H@C�������u>s��Q2���7��
4�t@�_(R#�hH�t*�U���@��j9�i�M�C�`��<�����$�����C^@���
�}2V��=3�+�@C5����{<'�
����\*V���>�h��kw������/h��PNM&3{!t�FX�W��e5%4�������,(h?�h�5�AW�z�p�oY}�Q����}��
4l�~5-��ETH��lT�SI�7hM��@C��P�d�����4�IM#�a�zu��!�kzy
���B��;��\RX�a��Xwdz������Vn����Y��"�C]sx5����N.Rzy&��pF�
.8qe]��us��6�O_���6��:c9&�/
?]\�	���l���4�
��'�����wi�������"��GBy
��z0w1��c!�hh�Cu������7����<�	4l����4q�nj��������8}hl��@C�����U���������c,���V���B��"��?l�Ci�_?��������
j*����
��t���/@��Fup���J@C���� ���CII��)��$��
���V6�<H�b2������@_�����7
P %5_�M
uL��:��h���O�

����)$��h�Uv�b!	1��6�K��tJ�M�����FzRr2��SF��o)����D}r��p���#},Z����=]���%��Xz��@�	��i��()��Ul�9�g}��l��i��,�Z�cPm(�S��|q74�������JO/�|�			��E�N	K'�P��Pz�{3W�w�r��}uL�*�������S�����b�E=���CG�k
���?CKM�_���~3=q�f��<h�icd���1����HR?0����gp��NLm�/�`�_	�^]���5R�����������#u�|��r*J�<��K�Qeq$=����`5�*F��#x6�oR3`�c<�v��Z�������Jq������tT�V[(0���@�
u���G��/��v
#q=%$���x>�����f�
�<��2*Nq�Ss*�oa�y�y����}

��"��a*'�]���b��ec3h��RS��\���;���v���:�w.#��%�S���R�N�!HF���x��D���3��n%�B,��+����pl�PhH�}	*fVPup�r6�Mz�6XC�Q;D�Y �Ly��lb������D���X�

M:������~
��#�����D���MoC�?�s4��	���uM%\='�
�r��Q���	�>��
�Q�CG���{(2��s�p`
�n�+,,�&��1��U��[�\%�����E*�L1EDH������`XUV�')B�����M�Tx8��~A��:pi����t��]��>��:������n���0�goX�q�t44���}���w��Y�k�v�M��.���?kn<y{�
X�c+|���n=�X���t|��w������3U���V�3B������`�g�t��H�5c~�}

V
�����H~g�;���~/D� ��7*5'e2��A�;��U�P��gx�>�v�
*��P��C�C���9�j��y)4�p���]a������9��}��11Xt�j�����������aFF`|�6��{	����i��	z	;S,9u��?�-`ofF}�!T������go���,?��T��M������G�����jm����z�����������������8�������:P���E�h�����
eCz��6gX}A��1;.�{I�-�A�D���H��G
���~��i���jg��%�Ms�1�h5{z�d d�Z���=E5R#��#�w��fz�r����B��=�X}A�Rww����
l[�����[������z!���N[(6_���v0�������)�i���m��Q��K����=���j84�l����9�Q9�s�������7X��D����6��QoteD?K���.v��T�h���=������	a�b<=�_����*4�G^�:;���������u��VA�z��0������K*�i<(��!~���
�����p�j	�
�^'�����>j�$�Y�~@���Ay
7����Mu�����t1m�rT44�D��Xtf�h�
�1vk'~���?��f�?����}���5eULk5�#_c��^$����Vs4���%�;H�$N�S[����J��Gz�B���l����M��$�_LB�	�B!��7���N����
14^���N�N��������*����u�� !���t�BsV��TI�Q=
8��E����8h�

)Q�wR��-����
5#:��<�r*z�BI��M	a����~�7�rP��a�������{�m�P�Y��k;D��@k�zu�Rc�n�!~���
z�z���&����u�:���@�ww���"��q���&�h-���+��rW��t:�E"),�B�U�4�Z
'����7i�P!��M��oR�(��W�����(?v�R�&!��
��d��x�Dk���Dk+d��A�eS��Z#��	����=V�N��P��,�������#���8�����D� ��]�V�e��H9sM�VbP�j���D$��M��H<@Jj�����!���^�:R�>E*)8p�4;5���.]��&�1���	���`O$l>�6�D;�O^kY���D^	�Rhh^��UrE����4#=K���1A��h���I����3��4D���r|.���
5hi����9�"c��C+4���jZXw�[$&��_�"�Wa�p���`����?���������T��'����������/�y)�[�}����s���x��fN��.slh��h0&���+���1��]{h�����v��7*6�O-�}��hW���nRuh����������]0��	SC��{,<���NS�ZZs(a3�?5-��e%\�wn���u�F�D_j�i���kq����k�ul���0��
�S�)�n������b<���������W�p��q�����{�#�VS���Xs��0���O;���[cR����<b"����2���e��>��2��~�:�?�f*L�;�4h������P"#��}~�z�{� !8
~�v�qP3h�����Ik�0�?�>�+�����r#�!6�="��Ckv���P�yxu-���}3,"56�T�QI�Xw� F����|q��%h�h@����
�yL0���	iI�Q�%X�����E�@9�or��Xvu�Ph8��2*X��U-*gR3�`oh�~��bA6zx���
����_Z=���?6�B(4�u}:�7����H�d\I���v�3� �M�!��t�BDb�n@�����X�^-���9����������DZY4!�f��}�o�JQ��*~����q"��u�y��h�4VC�����(����qoW�;��}��i�&�]'g����no~!��nqM�~���sb��%���7�� ����������}�i�L��t=>8	�MLpf�]�v��k<��-e�~����F_+Z_� %>�)B�A�PuiMz������9@]O��"E+�,�n����$��
��<O����<���A��K��p� IDAT���U�^RS�`j��M4��S�����&n�N��[���T��{t�BhX:��JBr���W�cU�?����7��F�N�8p,I(4\��f�pu�{R�P������6�����������q��n���B�F��]�n���G��������=$�5�.UW�C�S�����[��z���3G�G
��&�3a�H�w�.�+,����u�>�~���r���<����u��K����C;�����!F!:�LL�k� ��e��8��kTqj���m���w�����������P�7xt�����Um�6����2�:���5:�����G������hH�����_h���f����~	m]�n6��j� )1Z��yN�2���N��}��b=pj��00�A)4�w�
Uu\:�)��0���Z�0�F�M��U��]M��(�m�qMc���������=���#������lA�-aN��|�,8���g�A����-���N<���EeLo�9T
�
�>�~����F�,�::��8V_�4�����������U��c��S�B������_�������`��c1)6\}�����>�c����m�>��#w����s,�
O�"0k�1���J��(4��T����S����#:��Z>9���i�f�T21��V�i�Yk}����I����B�7&5r���*������k�3��8���T��nM�q�o�b��W��>�����+� 
y��J��t��4���!���qo�N*Ox�������a��|�V�����kM'T�b�;�p��#���#&���3��^\�r�C���|����Ny�#11��������GaH�3��3l"���?����������j8��Y��3MTL,&��F�z���L��6%}����XhhY�68T�������>�������
_����#�cJ��W���!
y	h(�@C��_�q�m
`�U��[�0����[����Ii����0��-����;�!,w_]�����1+�g��];�j����So2���D?'���&��i���|��<Wc���d|kN<W���q����T$���9����Z@��)�~���V���o���hohT�G�^U8�O@	��8���v6x�������c��u%M�^~
�
:����k[���pX�>9	MGhV�+-�]�~<���4a>����`�5lS����4��������G9;�}@C���$�L����&.J��.���%m����~
h8�G��l�Q�d�j�I����B������A�������H�9B�VH�;
����|���VH�~�t��&>�m���
���M$�b���>��n!���G���������=R��pC��CP6*/W�����X3�5L�TE�GW\?'TL0���h���>�#�:��5$iM�
�����?	c�[��)Ah�V�O�	����3�w&�k�p����d\;��_����(�F�c�DSl]��_�`��`tf?�'�w���u�M�QY�-U�pds���������E~g�D@Q8E��
;������-,�����.���]�g���Y�ac��V���7�
��lD,-��}�=z��f����&����1|����e��X�/9UC}v]8��{����1�/I�a���x��@���
u���[��B��������LhK<=�
�{���cK���#���X�����`D>�$����G�|
uG��+���.y
z{,��C��F���8�k?�!�W"9-
������������a�����{|�s�({����J���bt�V�f�x���-W|1��V�;�M=���1,.�v�|�2��mO�Ve�|����a-�h�|W��#��"*����X~�6H��_�L��/)m�&��M��h�N�J��EAn@�����C����i���#�`2�;��"��#X�����A��� )������EF\,	hx5x1�_�a4�B��=���r���C�����gO��d����	���~�#�l>� @���
�/q���~�L0�#2��O�J���xE�������W@`TE���>$��F@�v������
N~sN^pg���S
WW>�qg�K�4H��(;�a�>�J����CD=�Shk�<p��M`��+ ����[��7�ag_�Y�,���WI���.v������!�,#����h���9<h����g����g�,�Q\�+����N�	[m���xFI�����?�����n�+9�n+�)������ic��oF#����E�%�4,����mQ���	��!h�_b���H��}��a���8����*&����z�hx��u���S����)�#�����1�ri����b�G�w	v�`_����x��_]
:�j��Z��:�GB�D��-n�PB��4$��v��������	^x�<Z\g� �~�Hs7E�����8�oQ$4�T�i�"@-�5,��xe4��a�F[6pZCW
X$���2^�p��M�0k��d2���D��=�>~J��VQ�Z���v������  �6O5	�;x���$��H$��.hH��B��=�$�ob���/�M��sB9�A�QC��
��!H}�Jt@"#.�]; ��W��Q� ��?W�`� ��V���O�r�!�i�C��6�/^�n�.�?q�@L#4����5�	5�E�_[
#�3��OS�8yz}{ ����8z�f��4$���m�������xZ��A�I-$�<
��u��t�N_�F+7Zc��5���hP�aGk/3����a��r�T]��z3�=�r��H��MRtH����#$�e:�E��9WF�o��������g���`�4�&�[���L���-"c���m�0���������0�wtE�/��sw
�p��Eag�w�@�2`�����.������B���R��p������7L��������C��;��Z��)�\�pd6�m6o�^-�Fw���D�������/@COR��k�x)(+e�(G����������C/C�@�aQ/�<\���Q.���/{,@
����o-n�v�aEF+v�P�`�W���E=e����2� ���P
��s3��GFhVb���]# �O:��U������/�<�J`������M�>ndWc�{���OQ��m�j#��qM/ V�U�#L����q0z���{G�:�	�R?��klA�B��
h�j��F����x���n_t�;�{���
|7���7�2�W"��@�2V�

40P��*�["��wa�F%8>\{�BS�����_7v�S��8��"]�P���4�����������:��w�
�����n�p��V&�����0��'8"F����A.�9L8�+�5��N���-����;�2��Q�D�J
1��RL$�#2����_7������|��D����Q�|e2��A�*M���F����V0���+L�"hA�������;�QA���d����z�vlCu]����;3��c����#@����^��>������@���]k�,���I��Z`�������k����h�c
��:�)�!��.��h*h=+M�`��r�=y�!s����n����a�����G{^���z�
P����[".(I��@��%+������um�)8B�4�h8|"i�bV^	�q��d 2�
<���Lk#5Z�0pp�dZ7S'��U��P�NU
��z�k`��@��e��BI�B��$�1A
�$����Hkn���)��!4��#

4t��7�������x�uj�
$��Q�z�����!���:�#p����p��b���	�!������R���HA�Z^�{��y�j*�A;�����0\��u�2��
W\V�v3q��Z����}�4m;��F-&Q�E�.��q4�v��7vm}��8���������G���(����{���cM�-F���&�k����{���"���{/�gf��JYpA���<y$�S��;{���w��� ��hPQ�������������h�w)z
��S��qp"����H/��R*

�t� <���:�P����L�5�������N?���2t�A����[�=��u� ��5h��w�}ffL,��4>��8q0��7�$<_~@c7��j��17�=B��1�!W��ez�r�7��{>��������Xz�_*�������"*9�	d���8����^��e��`h�n�Jk����M��n��6B�<������s<����C1����mjk}�~����:s��s2p����f���rZ������%L
�jUC#Ks��zl���?z����'0���	V8���;��<�`Fs��v6�x�L�5h��1�l��z�@C��%�{��N�O���)?�A��#og�i���!n�E`
�?������8����^xk]uX�!��t�B�$
�x���

h����/�@L���]��Fz`�����������	�pea)��B�0�~]I�c2�/���::|���@�^ZY���UU4t�E5��u����w`����#p�����0����Sh��HBf��{1�_7���B<P�$��]�������W�U�Y�S��������D2�=���7Z���q*
�hPW�AO�o�H"']7�I��D�jqu����+���>��|v�[�>����3����[`�WN�:���~�w6
[n�C���x��c��/�����i3X����[���^
i��[��*4�m<���j]�����	f?������hB���#xA����F��70�!7oc#�;��:L��������h�aWP}us��H��I�sU����8��>�72�z�	^H���""zA�%-H�Azp2��9�{���P����rB�mv��N���NR����gRn���yM�<��m���5��IDs40���m(����M@D���,N�����&�
��j���u$��C����u�2A)w�!;�d��lNR�{�E����9���N��QU�h�� E��k�!��
%�:��tY�t��������FTh&WO�5F/7����&\!�?IM:��w��D�������VG�N�C��������#����H���L�L'YY��L��)��Bklt�B'�F��(]�&��n#t�����Tl�UdSxX;'��k��I
B�28��J'q��JD�a:��wni��e,h`������K��W����a�`��k�
���31d���vT�x�(���p��!'�H�k���1x�����T��!�������]��g���..��aa�l	-���b	RA@����h9)�������m��-�B����|�4��>�a��7����G6���@R�[��/h�=�N/�
X�ul���W����s��0l��n�p���3�	G�	�������g{����m[�,�
C�c��������aC�N�O��O��b�����/$����L�H�N����Ww`mz4H��tBx�#�=SHqc��!�~�*U���e@�2�+��<��(N*(��Z{��;�&�R�y���G&-����r����zs�!j����8�Ca��[���@��[@��,�1�a)�::p8"������}�h`e��t�^t��j����oHI!����s����!�_�W�;ws!��$9��Pt�@y�=C]R@�����������87�9�3D�f��4F)-0��-T=����!�D'�=��8^2N�y��������q�
0������XfpE�K?�wv��L�Uv�M
l���XK������$�h`m�m�!��-�;��F�O
������@���D��d�)T0%�����v
j��y~:s�S7�����F���xh	G�Z���}r	M,lQ��4����v���y:	U
��|v��e�u����a~���$����T���B�*�����d�L��N��Xh�R���#�@����PE�+40�ArB��(�s.�j2L��s�A�Z�����x��D�����H�����D����:���!G��#�n-[%����
�QZ���5K:�y!��U��������z�.2��i�����^�6����P$�@��z�L�X���(�7
9���J C���P��  R�2p����:�<$�:��#s�H<q�Pm��C�Wn"�/���Y&Bch$�>Hp�x���� Sn�"��)�� ��A��ZH:}�C,�������:+�"�y��� ��
=�7�
���B�
�����b��	�9m�8�A2SR��TX>�O%�@�WsR���@Sn�3�C��P���C��WdP �]��FB�u�\�%m:Aj�|hG�t���"����X�\Y�
�A��sE%i
�����6�#b�z����s�H�0h��H���,�mv]���\�p��#<����\I���#m�w���!E-5}x=!�%�K�G%�R
�?�6�}0m�f$��{z�Q����-����=�O����R�����b�p�{<o��	yCG�����o��S���nD�E�����D(5zP]��!r��?8����l2�������*���
��!Q��x�9x��������p+:5Cm��eRI�	�w�@�*��)0�S�T���S�xK�aJ\��\�!��\}����Lv���y#,��+��^I���a~d*�//!Xe"�c$��{R���
!i�����RwbG��Y���+�|��.'f�B�?a��6������\I
40�����>F��Qu{���qBz2W ��vv5��������?�iW&e@�8�.����p��d�8f��#�,M�{d]�zKkH��%�����!���"�mR�`P�|�1Xx�_'<y�w���L���aMR�zo�4���H���p��%1��B��,����
�y������.���� �K*'k��6��=	}��d��z�q��u�t��qg���+D0E�4��/n1���
��f�(i*h`�K��X���&\w�#�y|����Y���x��'�YGmR�S�0k�_fM(/��������h�����t�l���w�	$
~�4��o>f����]���z���KR����R[R3$��
���r�-6��w����G\����Y���%�w��]X��L�Wo���'`�? ;7���[�|F��V����R���
����@CJ*����x�fr�!X���4�T�s*  (�Z����>�}��6M4�O�2	�$@�>)������@<#��6?����>p�#L����I�������,�
9�}�F��`bV5���B�?�>w�J��P��	��#���:�;���t������k����r!�S��C�f��������pr�h���?k��	hPR��k�C\�����%����t��'�\����4j��h����
�+�������������:�R�NC��k���T.�IeA�2�RX�K�Qx��� 9��A�P�� :�����F�D���$�l�
�����p��ZZ���M��0i����k����"�>�AT��P��/����D~>�
+{��q�+��
������f<����Y��
w���^
I���'N<~��<|	��;��t$�
eRA���~9$��!'�h��q|?��xX"{X���9�G�i�����q��;�g��YG�aRg8��~�8�#H���<��8����L������3\)/�F7oH�9��d�������
�"X���������B�Y���p�a��s)I�I=�e���
���r�.F��v�����kwE'��0��n��i"�_��/�fM�h���"�i�Rzh��!���&�v�-0��S�!!1	�tSa�,��$C�p�nN#��wq*�����s�Xz����dr[�$x� H
48��AjF�c��m�l���������h�Z��h���b9�����"!��� IDAT�#q�����4�_��I��p�G'��Q������s��V���Rm*��=O�y����%�h�������������\w$��]�mI�����A��>�.d##4��4����������R
	���i>	+��p,}����@�Y�����C^���=������MTI�Y
z��PM�����N��`Q;2����6�X����j����
�F�?IH���hH{z��W�A	R`!$�O���&X�\��m��J
2
�H�{�M:"��Q�:�N1�BV���G�NCR������_�N�������V|4(T�G�w��y(�EVKW�@C�^Z�f������N��*�@Sh8�O���L�qt��)P��/�D�O�a�_��Q[������)4<�I*}DmM[V��$hA[����tQ;1�Yh`a&>�u�������@���8���
��I�����KO�a<m�o���H=�������@����ez��6��`��O��
\���G`)�B��������'�_����N�lh�?��;|G��hC������N��B��'D�E�������!��>���=�i�B�6�@��:�qu2�h!�/��^&yU�]}A$�Y

�n���u�`�m��`��CX3x�X�;����[`M}7!��U5����$��R^��im�c������f=�v���q�[b-�`0�����;Wh�A���0l�y�+A|CJ\z�������h�s;vQf�=���^=l�sc����K�����[~@��1)���	�k/a�m2"f���D��&�!�#8X`!$�MtI>^�`�|���#��i�h��t�R���\�!~��T��MRh u��m�������`lG
;�"��6�/�p�[f���\BB�D�,�8�,}��0�:���J
Wf�q�����JS=`� l�8��nDB�N�1u~�Z4�����j�
?�/�K�^H��}H���6��M0[�����")3��Gv�E��c,�|��7�����>��0s���!����kF��.S������$1���^����K���?�a4X�
&u�ld�[ ��E�'��B�=
[Q�T��T��*��A���&h8�F�L����C
���W��p,}����nZ8����Z@Y^��\����I��f��;>�C��NGI�����Cr���a�WT�h`��!SE��ZvJH��~SD\OA&�\�L��`��T�������

L�����S��!*����
����*oG�~z�i3�|��G@C���nF�CI-���*�WZ@C�3�'���8
5�5�@��������?�4�p���*����p,}����	��\HY����r�WG+40u���T��Y��k�5�<h>D���C������1��hSi.�����������T�P,q��I���dRf`�)7H�a0)��$E*Z\Um�T�q�240�y�������\�!���0 ��g����B�}M;5�m������4TGw)4"gn$Rh��������&E:�M�'����Ai'oC�)APx�R�%J��4�����Ov�o�\����q.�0��r����t�����T��i�n���O�����o�������e�.�����h\��������	$�IP�d�Lp���(��W��fB���V�����y����vs5q�	f���S`*l#�m@�0,��@Rop!�jp���M���B#\!u�mfc��hU0�������)4��
f�_������jg�D&���S������	���n>#8����t�g@���Wf`!.�bB3��d�N�S������CR�
�����9�?v�hhh��i}�Bv������������eR�`���!;���X���4:�@vZ&������I8�kE.��C�%Shx0w?�vv@�g(|���yH
40��U���{��$���LYA�6/;Z5�!����Q���T�?o�S��^��)�&E%z��}}�jw �R%"���A�QU�'<oR]
	�8C��X�
~edX;`�K1d �b� �|�����M<�������Xb

k��@�>��_��a
.���F���E#+���6�w{#�w�]�B��K���z=`����L�S�oh����=f�X�_��%���IP40@!+-�!������y��7D4Ob�b��Q��}�w %2�3�"����e�(S�:6��gsOEuRa�W�a��)�EJt�g�11� �}��;3���s�g[|�@�Bb�%V��������*���Ph

���/Wh`�	�j����_�,���E)0e%��0�)��*��K�u��\�A�g���"�Tf�BS�p&�
a���
�Sg��IY<x��:
�r+
����Z�d1�%���'������\�
�t�~��WOh��wRT���8��'�:��y��y��'?��>�w��
;A��x�RhH!��s�o�
o�����y�W	�s�m�����FRK���!���h�u����� �@#���� ��&�-h`���'{���"<'e��xN��X�z����CH9�� �)�K
����8�����RQ�TP�	(�0�ZF�vt>WT
1>x�:OG��]h�U�������?��G�!�@%Rj�9s�^���F~�%�;?�!")���ha���,����AR`I���D
qQp%�a�}g�SH
�>Vh8���v���Q,�8�+4��_
4����E\u���I��������)���x�P]���3T!�tv0�My/���*4|��f��r�GZ%�����������@��F�H����^�YC�������M���B�97��C:�!Nh����x�Px�;X��~��
#,9��.&	��:b�����V���2�B����(I�{h�@@��������E��`�:f�O�v8x����)VU���O���y�������&��/_�P�>�D�S8w��g@�|-�)��a<��W�a������
I-"o*�/���QU,���-jV����j�����@���!~8�Ni����;�^?�e�&`��X<h6]>
�j5���I����gs3�G�X�p���%������4>����
����}����j�T�r�5EM� ��2�1oi�2���}���/�������&�H��/��wYNrk�%X���8��9�����f7�o}8=T�B����g������F �jP.��l7��|�>3���B��	���N�2��������Q��|�S^�"=�d~���E�L�A��)m� ���P��y-Z����j�w�n��4;(�*��A+��d���@��w�h���/���Y	Hv�F�<��
Rh�x�����\TiB��O\4�P,�������I��t@��K�l�d@C��+`/�=F"����Hj�9����g<m"�w�s��k����r�(/��!2^?�j����^:~�@t�� :���G@�
�9���M)'!��h;�)K#j�m���:2�I��B[���}�����A��J�����h?@'h0�A�q�����	��D'�DSlJ�,h
B���p'5���x�}�,I�F�o]�
�I��W����r8.Wa��.�Ee�|�� 5)~o�����@C6�������sk%�E�Tq���t-�Q�J���ppm$�DR�Up�l�E;��hZ�B���P�z
~zk��-���O.�0�E+t�p�p_�w7X��{w!�N��t����uS,;r�~�w���}/���Y�>�H��7^�������?h&mX�=3�`��}hT��$���T�_��h�~�?"PJ�
,HzR��.��qj	I����

�u`E��&A-(�"H2-z���N1�A�6/��Q$_�r�{���U������vU;��ySa

,�����I���	���r�9!z;�G�<�V\��������`m�$�;2��m���RW ���C�JJLaj'
������`'���gD8ft��Y=l6+�\���)���C���8@
Sq�h������G:
��j�����K��XR�jn]�\bb���~X���i�W��bJ,L�]%D���?�	�����NPkS��&�Zv���#��}�*:�d�s*������%� ��c���q���������!����s���0^�-bVX��!�WR����`�>2Y�����:P��q�)��A����,Rh`@C��&4�H�]��S���p��et�;U/�m��k�����ADS�N�����z��Y�9h���Ge��N�15�"B��x�����c��������

F�49���
��[�=`�Z��E��-V3����L�S|�.��������a`�,3{����
_g0;i��6�V��70��cC>
�
�N�����u4P�	vg�D��`�Wy�fw��2�"�N��T����5N�@�3���Z��?�����MzN����>���f��~t��BL���������I�`���
����q���F|�ha�1X{�(b)�<�+f���QhQ|�G���S�%�<��E�E�>M
���n�O���D�#n��
��~�>�C��?��AnbO��
V�h!#&����'����@M����ZGeh�S��x�BX��kR�}��jcI�aC,�����O�I:q�G��{S�&;�{Ej7����p�
�y[Y�L�i�������S���3��<C�z�i���}I�/p�J��%����r�SxH� �*�P����7o�J�KhHws'�e��i�C��^ ��S�p�H�=qm�6��ztF*),(�2C���I5A�>K<v����#�{Q��
[?RhP#5���S(�r��4g���]����Y�
U�Hy*�C��*�/]C��e�4�t�P�����Q��/^A�_�cU��OA@C���h~J�Q��<��

���H�M���w
m�>>�����p,1��^����5���C������r����C��.�.��<��T�{��)?��%%�Oy�
�"��C�:rf�����W���!��HE�BW���cidi
L���6�����K������@���-�5�������)��PL��%40h�m�3����x��N�B�5L���y�q�/��p��9w#����D7S;`!-RH��'�^�����b}3�"*>�d��K�a_�5.<�������?���J�)"dL0��B>o�O�� ��Us�q����>S��NJ�ot���'��_�+�X_���BV��p���N0�����)A\'���
�����?W�P���[N��a4�
�)��.�N&m���#	l�qN��__4i3����� ��c����q�v�T�5Ft���=�C,����� r"1%�BL��q�����+m�����q��*4����g��uaa/�$����n�������aK�}��\�����h ��5	�����{Pc�3�h����-��������w"�3q�hp!��.0@e�M�P?����UO�s(���9���`�i�UXb@���y	�iL`��#�����V~A�qX��0E�@�w3
�F�c�F�qiI�FcfR�~XI!!�(D
+1��@L���#������o�cHun��X������dTn�'^^��z��#��1T�1��&��4` F(����6}Y?P	��C�c�,�Dm�&��$k3�BSu`j�W���B��x��T
w�J�����6��	k��`��\����(*4h������x��������N>O��_9Y9lh��B��$R�ds���)�Qh*�<����@�.MsU�
V���GsO6gcsB3tZmGj]�hng��|�!�4��������A���{>���IF� �c@��=�8��T$�a��
��0�	6g�t^W�BSJxH����I4�
)th��yz��w&�r�F���`UU@3�����������P�s���k�ey=C�����TR�&`���}�����44rP�}��x��fNJpu��>��$D�����B���t�h`*���3���4 5!1�``\
��������uk�#��,�||P�	�\S�4���RG8�CDh��3�~��`�'X�
VG���[s��B���& ���N�.��`u}
4����ahbKa)����&���w^40�"��e�7/�Ja4�x���T���A�an�u����)���c�f� �-)!��;M ��T
�S�~c�/-����_*h`a%_]������a�4 h`�<���ByP8S�o5��\.�F��syL����?�0������O</C�I!cC�a�r�\��������?��4��>�s����7?�!3;��F���4
R&E�q�zbI.�p����S������z�($�8}�wX���?6������\����ce�w�_l0��P�������ANaQ����� ��N���N\-��S�;p�I�A4�iTm���)-=q��o��M���vO�p
�i��U�n�- ����go���-�)$��m]�}PTW�B�)�����
��?����^�@�����r�Ak��hmS��~E�v4�0�l
�����F�(�9��u���0��9,�������-�Sx
��Ur��������YMm�:lE����`Zc�B:�0F3szO��?���B��#$1����ci��<�YE�x�$
����4T0�a����������@�c������G+z��a�����W$)�,������/��}G�q�`��}�"i�L��zuiKy�|CN����b]���,��j
����c7�<]:|��+��7GHB�n`��j��!��-T��I���v:?���:��p	@C������BCN�g�������/��B-
h�P�)���!'J�������W��
���^Q!'��M_���BN|m�
j_����^����(IyV�I3�����F$U\�0��,���6
����T�0��"��([��E�+��
�������P��UR{��i(i�SAH'E����a��)���!�����l����)��H�^i��� ����#)�Pm�:��_�>�����I��
)\EY�����h����rBm4H����C���l)�v���(����_�P�6H�VA!'$)[y
9Q���FA@���'�v
9Q6
@Cix��:���
e3,�V�/@C���Y#
�P�UJ����Nh���@���**�4|�!h(j�|���40��Qlx�?w%�����@��z�������^J���RR��8�a�^T 5	�\�i�@����������������L�d���*QI��eh(���f	h(���P��)
�L�?�JRB��$�F(#x�L= 
e��/jL���P���4�Z���,@�4��4H���:��s_
@����P�����;"*�PWHJ��B����A��x��,�+� �k)
����g}�B�t����P2?


%�[y.%
�P���`���h�8A��4F�4��W�w�� ����}UTNh��������< 
��eY�$
%��4��wBI����4H���_�@C���4�g���4H��@C��(
%�[y.%
�P���`������� ?����Sjj��QT)V��VVPST(�Lvv6"""`bbR���2@C�<��":)���UNN���Ujm���������������x�edd���������8E�V)�����x}���R�W\�n�2�g�J�_\iff&��������uI�����MUYGi�wUy8*��vYdH�W��l�|�JJJ���
����e��\f�M,7������!)U:7��x�����}Y�wM9�~���$���LUd$��vYy�8���$�
�eeZ��S�������kd��]K��������I�lb��SQ���/o�9I��F�����U�u�����t�t�]�g���CM]�������<�%}�G�B IDAT�%�GlD�$��0yJ{>�by��r���o�eh=��gN#�x/����9(�w�/y�Y��C����kr���Jb��I<���99Y��{/�Z�W]Q�7UM]d���,���"�LK~!�KHH���!++[�+7m@�4���("x� 4�G�	@�z�mr���-���>P+�xg�^�@j���e����������@�JGJPie��U������2?�*�xg�ua>W��la>W~��LMJ\�2?���\�[����]��U��.��*�;a>'��J<)��+�|�����a�5�s25����-�}~���t������},����7����S��_k)�{���SY_���r<���&��*���2�wa>W���0���'����0���w��V^��U���0����7a��r>�*���0��v�
4xyyU���`����x����`rO**�g�iUL2���U������X����5b2W,U69ri���4������/�������PY�;�V�����Q)�h�z���Q�y����4��y�W��[y���[�����<����e9�+�q,i��u�W��\���0��|��|����$����|E��J��k���>���\���}�q.n_�����*�������9���oXR;��x$�:B>�y< (4T�� �^qF�t,�X!��tFR�����wvu*���kH���_Ce>�TY�;{���Ge���W��[e�b�E!V�b.���=�'��������>��Ga�Z ������q_�5a���,F�4����6��< 
��
/L�S����T�@
H����QKe����^1~���R��	�9����QSe}�	@C�|�U��.��*�x����0��sc&=++��M��U���0���h��=�I���B�w(hx����D��IR�z�e3�]�BM�2��h^��+�{y�@����o#��c���WGh��2�Y�����@__������90�*�m7RF###����f%�H�V(���^3�DKjjj_�j9S>LV�,Szz:��umm��l�\���x��(�L9h�*�[�mD\\TUUyX���*�xW����/NI�oRl��VU^�{�R�dR�����&/'���i����T�*S�E#�ifQ��r�T�9�������o_��Rk�<��R�\W����}TZ�=M&Y��6W��I������lYM�dfI�6iV�������*+�x/��&���rt��U���1�%��8���<Lr��[L��+��MZ�]���*,��[�_�f*�xg�������:r�����J���g�����zVtM_CAU��.B��y�0�!�F�n���k����YFH��oj8�J���h(��*���O#��g�jV���#:�ti��da����V�]�j��!_w����H���k�fuB]_����������������*x�\���%�T(%�����a�$������*bcC�U4k�����%�i��#j���A����Sr���

��������������T:�5,���u��s�{_-��UD��)M�M���hz�����c���i�Bc�< ]h�V�F{�V*����lI�AJW��ry@*��$�����4|���4�����l�]Tk�P����K��P���:u@���{~�
@C���%������\h�����|*
��I�%x@������h(�WGPh(��E�J��g���3(�A$�������
�i�W<<�`f���$�<�4�j�����0��6��-��z�����uW�U.o��}tr�5��E�:*8�"
9��Si
U����z=��GASI�<]���
����Kx�F��8��Z��JM�����#V���w��Q����%�`�sm�Y���4��o\��kce�N��'sJ��rw��vUMU`��o��*��1sE�Ki
�3���/L����o�w_�7R����������������W!���&���[��*B����k�L��?���e���}�*�V�;�X���Y�

cF����+���O��cZq��������6���]�����jhX�?_[�����tk)6��O������e�C��HJO@�����F.�>mU=8Y���~�}����r���������+��~��5.V+Y�8�x3�q.��������{��J7t��@��C�a���<f�&���^/�����u�r=��7����Q1~��b��4���7v�6Ww,k��IoIjF��JhP�6EU��H������*�������'�&z�)nr��.���D�2F�~K���������KhX��3�:��;��
��e[�&�RW���%{��k��^�,��^�V����MJ���_�%
���_=�ZSe
U�YU���Q����z����[��(����d-��KDv�HeO�&�6�|���;4��7q����\p�T�j�P0�G��tL�B��q_��*�"_�<N/Q=2*2%�Co��w'B��R_e �� �V��PN
	@C9���Q����k�a������@���p���cG/]���[���������Q�t��]����p�9h�����������.AEI	::Z=�������,��}� ##�fN����SqM�W2@C���� 
����2��������c�B�`�Cw[[XJbn��Hh��5�1�4����$5J�@C{Ux�d�7�d/���'o�Khl��#a�����Z4����?�(�%�,���i���YEY8���g^!/X ���j|c��'1�s/���4����E����Ui~_�@��-�����%�H�i
ZC����t���%�����=�i��y�
4X[�G��
p���J4XZ���U���T������s+f�L*"�����p�h�������z����.�O��jv��^��!��[�,���?B^NA�*�������J��43	@C��]�c9�8??t���hP����&��������U��9G��3��U��@��i]���������y~T����jz�_C����a����e�cdf}Y�6h(�!)����@�3j�J_hP��}��
H�R<�"�#��� �����#?�D������m��|j���y�
�������M�[�(��-����T�TW*
e�p	��p@����1���?�����.F����0���#�(��%����a�AL/����M��8��>�(*(`��C����������~'&�5U���?�e�w������
'��i����c;
���_���2B>j:'!�G�}v�-�����M
��PI#_���������I����P>�]5h����!��k��)�T����Xv��a�oZ��WA��z`�������,�����X����RA?I��c���I@�f.A
�<@xB��`���]..`�s��u��Z5���AJF:����{��da�^^H����\O;;��c��������]��|�;9ZL��C��u+��5��8[� C��m�
Y:����w���I����4(+����^$e�}��������P����^�X�O�Y��#G�
���D�Fj0��G��H��\O}�3��
�TDgq��C��mM��{%4�V�,e�E6�4Q��OD��3#��=����8�!,>��XxL�R8��&�S;��JhRC�NN�@���r3��5��:�&.���������(f���	�X�M��~�3�s�Y&�r��T�i���3��mL6�b��;�IK����" 1�]��F��m�������{Q��Xx�,:X����-�33����%/�BS�[@M^�>��|��
��UA�)��\��m�BC'��x�[A^�����G��=������%D�����2���w�2�����ST�)443��������yKM}�|���B0��9�x������@�~�?Q=���kT>��9�a;�'�`���������yy\�u'����u}<
���@O|k��~28��}�_�gX��?l������4�\�L}A�D�'� �&�6��!�^��@r`*�[��������&�}�j������8�L�Mk�������t�X6(�;��,���\��}�'���W5��YW���eo��������)A�p[�]m��l�$�dh�h�����G
�����K�u1�i'c�E�CV^������l�I���m�6�*����O~��S�a�Hn�EvJ6l&�@�_24������rO��o^���M�ZE������c�A�~��k=��������L��������;Q������UAC��b�{(���������:P�V@�[<���
����1�v$�����.�����`���#?�d����u�}��'�?�fb��O��@���jANGY����L}A��;���	%9����6G�y���4�6��}�t9�� �M"�T��i/��3���i�I�%|���`6]wJ��H<��7��`n-��v�jS=ht$���C��^P���zG#~/�IC��w��&t��B&�{���+:Eg��6�����Poo���z�� r�[(X�Bo�(vq��n��S�4��E,z�	VPq�F�o��fS��H���*B&=�����LG�����&��7*��n��������������~gYs��r?�����
��7�������0l�7K>���P�;���G4����+�]�#<��������?�����nMj�������1��U�l�Cs�5[������A�����?��+4�������A�zm��qozv�a��_`S�!Z4���t <*;�Zl�������C��tNO�����G0k�1����)0�l9��������M�����s6n������oDh�X=�v�@bR���}��0�A8[��������t���eZ���N4��A�4����l�I��{�iQ*����>�����.U��Y���"%;���s���������v�m�E��HS�!>%;�����,4�l��5�`��)�U�G�q��q
�i�|��m6�o�~�mmz��H��XS-$��a|�9P�W���� 9=V����a�����{�����F��7�-Wh��6��cT��8�t"��\v,�	�\��+Q��hS�[���{!=+��m]�Whp
|���8Wo�����FJFj�C������.�����
F�L���U�^U^�>�`�U�+M\q?�m�T����*:�����`�eF��,*�Y4&-����n��:�)�n��jy������}R\H�J%Ha4�s�����Gu���@���6����8�~���LEH�!?3�;Y����Z�y���Es���xk	ft�r0���:P�����P�S$������1��_8�������6=�\��g}�;X��):)n.F5D%�Q�f�k*Vh8�l'��|�}kB��������e�jm?��z�g�mDtR8�9���T=�s��o���S�� ���U��������\��i=������M�m1�_/��p���Ut0�����fu^HcC��o<��G�A�Z���T����<��c:��jz����\l������7b��e���L'�q��n�E�`i�5����f���!I*H����rnm%ED��a��s0�c5U������<Z��������nNLF33c��(��o 6wm
��8Xji`�sw�EDc�}mT�����{,����+I*J�A��������<��Czr���AR�?^�^�z���f#}�uk�[��`Z�3���!3=9���'B]�6��@^I
>�!��.l;��"��M��Z���gp�3������P����>����www�����MM#k^&#%�E�j[����\��v�i�{|��a�Ll��
������D������gq6^�]
9z������+���W�zJ7~��0�AOS��u���.���Z���)XI
��YC������6
�h����g��o�w����T��"5=�q���^�Dc����Mj
���|C���L�!<&-��`������L���8�����7��������
o�}Hs!����	������t����m���f��1����'o#����b�J��.�fV�����D�I����`(�v���|����bK!��?�L��{��BB�+A��c���=����9h�S���.� �et���kR4n��'��������������A�Q��6��K���:�n�E3y^&�!H�����NN�L�A��n�@u�r���7��P���KMg�� �P�C4kK��I��n��=���A�
�n��u�����f�y=Y$�NC&�u�P�@�%\ME�{�������c�|x��Q����U�A�O&����^79]��le�RqP�~K~���Y�;E(V�GvBN�������R��

��
�C�h~�Eo�Gv����]�Wez�?��T����B�A��"�Su`�Gn��UhPmHc��2�y4�h(�R����O��>�7T��Y���\�����c�������_�B��=��!{S_|���Og]J�����T������$-V8�a����p2��m���HKK���Cp��hki����m����Z|�2nT��0�Z����s�f�x�Wh8s�&�IU�Ckgl�w)4�N�����8C��T���|����������cx{C�w���Vo��1C�@SCt�����Y�a'fL��>@�pn�K�*�\3!O%�@q���O���z��Na:��Z�	����������J���x�%G��p�$
�Fh(�@�bsk(4�D���Pj[��^z7)h�?�>�Q��m���
�����X5;H�;��@��#G�k�.�����]]��fM���b�����=z��x��7�JRg�������hhM`BU]]0e�%����B�2=/�=~�6��������!q��d,hP���hc��X4���G�i�Li������B;,�� 0'H��g�3h��z	�x���%'c��&��l&����Up�u*�m��3�������$!�@\}������VOh\6~�M����}UE�'�4�p�i
~���_��bjGMV":1�)?��XK����$s�A����/S1� ��/R�����&#8�`��od��^:X{9�1qd��B��G����m��E
�[
��H��#49� ���y�z��GJV.���$��<�Eu-t���m��s��XM�s�:���3�)�#��`����8���'�W��`��~`���n�h
�C�������Z]�(t��
��
��G	N�)������
���!�`��KQ�1���8�0�@�
�oq�����0��>��0��3��v�H�5=8��O�R{�	�h`T��hc^��b��)��f}r��`@�	�������B��1��XHP�QqSI�My4^���?�0@mz��M��Ka�~�;�pg�#4�YC�gC`O��W{"+)-�6��1��l��a�g���������������Z�V��:O�Ge�P�o���xv�����9��"j��1jn�ZbP5S��
(��4�������R�|;��!�i������J������6�m�n�?��X��_$�$�����3��mm��3�s�!5,
������`p��u����6��lS1RF�q�8�P�{k����Q3���E����g�dH�)!���j���81���LU�����K�T��r�w\j������jpU�X��U�@������1�m"�	�p�pU�q�������|-�$)� �!�u2��� �z$��'��6�����t3�v���)$]�9����^G����h��r�6����=L�p"��m�'*
������K��\��7�:-� �oT����Ug](�� 
_���[����,���Jd���t#}6����@��b��q�A�`��CA0���B������A
�MT�;WTY���y�,�)A�1'��������sq��d�<��tFZpe
��VHyC��!����wI����}&N*�u��e�3�*/�%�0�AMUs�l������a��
� IDAT<xr��tW�w�4,�s����U��07��;�c��5X�U$+���@��F�k����v�����=�<�o������'V .>���n���A����#K�����j�~�6�2�C�D�,p��Z�>������.(h�W�-jZ7��3��Cg<~r�g���5C`�o�V-����_���/�C<�#G�������b�6���+)����}��)��uhW�9u��Z�u�����B�~t���|���Pzo�����he�v����}FQh	]z���{c��RgWm(�~�hhMy�j���g���7��"M��5����@�c����8_|v2�tZ���P\{s
#����s�j��-w��F�\�p� �`
m����g�A��&�R�'F,��l������O!	�c����4����� 6%
g��s��#O���Y#<��E�EK
�	�XK���p���n6�6�����
v�_��B�6�����,�j��sSy���
s���6�)$�F�!(c����i��"X�m�o�Uh`��u]��Wx��
L��Kq��"�2����?bF�e���L"",!� �]���m^��{_��r��|3���H�����[���f�mG�{�t�7U�-B����m��?�BCJFr.� �������
#�L#;gcJ��g��@�:Ywc~h���}����q��J
��I�� _���O���f���.u�6}� ��wW������������>�/(���q�|���o-c;�������A��]�a-
&���W�/�.�-A�F���1��{����_�xs�&"1��Tl��=������9�p��Y�|���a��A��`0��8����Tw?$V\XH��7ogV��p�/
Uq��<�u�{lCLr�^�e�`n�����q��q.�:K��d��
4���3�_�y��n�cj#;\����(�'��R�����h
��Of�:�&��3���KkL�|�**�P�T��[
K�������������$��uE
`@B8���H�!�a��
����E�B��x\_US���������P�2��]���u9e
�P��F�Q��������R��w��X8�AZb��t)t�
�;�E V���p�/\�LA�1[�`�Z7�6�i]:��A��p�/��F@C���
��E!{�����[GAM�����]�a�b,����D�_rt�,��&u���74�q��jmC�:����Y���^���:�D���'Jx�o������LtU�������6�^EI��an��;na���
��k���_EX�j������6����wa����z�b�V�8�������9.>
�o(�=RS(�Q�k���p�6@'��
�[VCpt2��@��;�x���vq|%
���t�2  �'AY������G@@��h�QAN�{$?H���xPo����l����@��>�%�m��M~VGVT6��C���/pO�D�`�*2��V*#dC��F�7���=�M�9�[��6�U��
=9��O}��{i0�A�;)�D<A�I��_:lD�%"������'���<�~C����d��/j������X�v*�n�n�����y�]����	=!.���ea.�]�id��X�9)���������@~d`��|�.������I7S�G6�I���h`�Cl�r
Q���C<Z��*~t]���mK}�����)40�!��4p���b�?�br>��;�C��O�U�%��G�wq��V�_7��qw�CH[6��'��q6�a�/��{gWU�����FJDA�������{?]{m]{���nQ1�0��@���w/"��/{�����|g�9sf�������$7h���.t@��K7aaVq�	�����/1�g��q}����s�P��v4�}��/^�E�6M0d�,�]<��L��E������hOyx"&&5����-a8t��#���@1}�P��*���L�k	
tQ��:��U�;c�.1��~<kV0���!��dfI�������,4L���%T�W��h`��W_ �S��:@���P�4d>V�A6�v�S�wu(�[ z�$>�>�h��������J��G6�����L��,����hxCJ'{<��kz�S�
�����*b���X��
�f#D�Bl�������'��
^0�<f�=�Em��
��K Sk���E;�y�>O�(rr9Q�Z
5��q�����c�B���1�
I����Xp��J�*5�wM:�C�,�\N��>�{�Fe5`EPB	�a�C/���t(-��^�����N��F/��	��wG,�n��T�d�	L E�$�@q��;�#�ajk},:��GTnkWMx|���h�ap���x�#�B�ft=l�A���oU^~��p�!�j'B4�2�P]��!�S0'�A_M�j@���X0�|�V0��:����	D�m�3�o��K��y�e)n�3� ��)>0��3�_���[��;�|@P���+>�z�}���	��b�i�R��?���C.�!���
L�:��F���lW�D�}y��p�������4��XZ�
)D<@Y#�����jX��z�W���v��TD@���q���`@�����vDx|,_�W�2��)����
�ml��Xk�^�����\��))D�JA����=�AZ)�+�i�=<f����\N07UW��e��J��#X��gp�Tw�x��s�Pw_5D�D��lQ���Z��'�u8T�T�~���wx56T��ay>�r�:���|3�
�4���p/�+�����R<����	\��5"�|�|� ��`�^����2D�Pv�"h��� �n!��l?�Jt
{�6���b�(��$�DWTV�j� �q5	�p����Lk�s����+�J{�����)R��+D�&��VNF;zP������m��N������~����_\�����W:�Mu-��'0������������V
d���0?��������%N�	t;%(Aj��6�Y��4�b�������y��`c��@�������D��:iD2����b�#<`���c�"����\}�o!�;�
�4��!���	��MMc:����@���J��B���(�9�`��|�?��QYL�����M'�Hu��K���J�) %B$���(����_xT�1�?S2���4'�U+4G�jq��Y\�}0���*m"N�s�����KU��L���yS���BEE
SGn��e��@_��t �k��C�������t�2�����M?_��Rt�'�W��A��B��?|z�� ��
� �9�0f.�L.�?���Y
L�q�!��r������#LwK�uD����v���?$�mm*����+40��}�)��u����8}v��5��m�v�EJ7�����Vu���pl������_i�h��x��>����=K�����47�<�`����w���8����qv����]NL����N��F'�s
���������M;q��&��/����.������S�
h�~�6�<���
�J���s���B��������T�+�����;m���z��Z����1<��U�&{C����;������F�m�.����C����i�r��bm�3�����#p�G��X{}��S��3�	VXA��q��E�2��tf��Xqe:���q��E4��x�c't��	�
����CHL�<�G�\��)!��k+S`ue��� �q,�P��2�,�C�	6R���8R[`�����P��'����������x�r"=� ����x����J�8���������Z��Efm[uuf��,��;���D"Rh������������:�S_2��!�q&���tL=��&ei�O�;6h��3�K$O�g4�kx2��	^p!�=R�8�`V������:���6�1���,��������U�))����e[�R�!�H��s�G�y\�����<v<�U?��Lv~��6��Hw������<�l0	���%��q��������Y
,qZ'mjc�>_p��Wh8I@�'��0����2�HYmt�rXt'U}I�rB�H���c��[hog
[ l
�=��R�O><'��)'��
%z������a�h4���u�"�\K��a���Iu�&�������S�!���0�m�>\A���O +�7�7�����j�g�BB���`X��:"X��.���~<������><@�;wT���@���2�$[Rh8���1`+O�D�^��K���nX:q�B���C
���M�>��oo��*�����p7��=�Jb��Wx��}����K��h���9�,�X�J���h������F5��@�Mg^bT;':����eL�a��S�_K�v���	\p������ �*TL�Z����������Z�����|xu�Y����j����(KumC
��$�����O(vL�Oe^����AX��A��%���:����H����W'�EZ����ls2�u<���m*3���D�)�����X�x�4O&���(	P`�y@P�%E��?6����&)���C��X����rU�
"��}������=SL�}Eu!��)1��eR�`
WT`@�ww	�y�ZR�D��mL�v�J=���S-A�O'�y'�����P@u
����00���I0����H������>���	�� ��Uhz������T�u����~>�o�3��I�R�����0[����Y��������E�@��PX.0�q@{�d�x�n��

9
L�#�xL"�Q0��?R�A#���0�����G�e$���
��P����B4|�	���O������M���F���U[�j�������8s)"���f�t.Su��yx���������&�����k"�31���x�V�5aWh����`��]$����w��>������}3� �1q�r?��$A���oB<9��$@�����xcl�:�2�%Q��B��hH uU%(h#b����q"D��4dnVh�M�A��
)q	H�
��d����Bv@C�&�xz'
��J��6���7�a����R����`f�G�?��sNP�:��"	�����{��%��!��f+�"��'O0�AZ<N���"��R&���de���C���%Wf���>V��>&�)4X��Q�0���g!�Bsq�~WjXM. �B��(�&����\A�s��e1����h���K�
L	b)A�e	GT$�"#�0��.Wt��<�)4��M��0�A�$���2�*�)3�,���T���Lq��(��DgM�A�~	xK?=jhc��p��2Q��B)9�2$
9
L5��NE�r�����
�J� ���}�Dw�J�G�����,dTh``C';W8�����U���=t e�E����e)|�8p���;���N��cx9j�������p� �6�����%^�oQ�,`#�*���c���P�zS�;^�%����M

L��DS�����~,�"r�1��q��
&=����O*�����c�S7|%hCTOI�#7@S0 	{�+�����&z�� ��6�km'U�>����

r��D��,|%����

�����`��Oz��w|@)���sQ�c1�^��

����E'���Wh �va0�����/@S(x��k
��L�A�n���
V`e��q��6���[���xI�F@a��
oI��qli��!�i(����OPq)4��F������q7
�`6`�*<�x�:2�)#�P���JFx����x�������d�R�h�t�+w�Q�����S[���2]�,=S����.*�OU��1�^�	a�1�o�R�`�%����,� �MB4��gp
k�M��?�_���������Hu@��.���^p�
,m�3ue350��������uC������4O���T���qWL�A�G1R����([D��2Sa u�A�	l��2���4��r@�����	,>Sm��n���+4�B���0�N��|`��v�B���40B��%�c��5b	��}N��mR�L��l��Ds�U ��@�`���ox$���@*��	�D��V�S�`�CJ���#e�|��Q�6�����	������4|�X�;�(�-h+Rg06�D�2�	������{�O

m'�{�Rtm7���

'/�G�f`�1�����{����\����Ez/�'�s%���:�9�#��o�o@��D0��6d#/��40p�n�����(����y�f���te�Ha��5M:�2
=*:b��]��}���7��)�h8�s
�Zb���(�c�P��7o[�����+4�������+
���IU^eYPh`��47"e���>S5m�
~�]N��p�������^g���#w��BC����b�w�2mH%��h���6��+2����]"T.Y�6�
�6�Y9L.��!��
]���i��6���\��m^2��J�,M
�F���\����Fru���0�"W��������_��O��:�I!a)4%��4W�`�	�D@��WSV�e��f���D����������J�S�`�v#0�mj�X9��#e�SO��s���@���x��7r��:�)%Lj��+4dl_f

�
��/x���A2k�(�����=���)-�>a��"��������Z1�+40H&'�!�qv��Z��r�����<�������T������+�0U�y�4�"�90�������)��6+.���)4l�w��w%�����2�|~Dj#=��B�F0x�������`2� $���?t�|����c�4��Z�CC��bE�Z���;���4x������)��`��_\��^�+4,��-t��~��q�+4������T�������I��A"��x�NH"w4����M����SDxt�O^��

l(Y���o���T�����
%+w!w�`V�w#a]�)#�'w��������rH���Q�>aiEp�hH�#�3&�+*T�Jj#����ZO������`�)4�m�-#+�������P�?)4L�j�f���$�?&����!E�>_
�
P�%J�k )����D@CiK=�lX���hX�o��D�z6�z�5�Cc~Qh�TW&w@I`��p����8��Nk�ns/��ga�m
����Bg�� (�������H�Zz��'���AK������-�����������,��[H�!�H����$@�$��n\���4�C����.��)p��8Rh ��M5I� �7sI��/

A�6��0D
�
�#Wag�SU�G@�U�\W$,���A{-���V������=�M��j��Z�L�LLQ�dmX���nM0������2`��vm��@�b�0w��~��^DR�l�=��L����h}����B�?�jAz��)����
VOEr5����G��0I�ki=��&:S�P ����I�av��uM&��-�10����VeR������BC���,�!-L]"}�0��)e07�O�=�a�U�\H�
�1E4�l�������r"M�����4�Q��o�;��d�����K�{�/.'�G������S�����]���)
�UH�YRh�B

S�j�� ����	@�F�
Q
��I�����H0WA4!>w��B0zHO,\��G
��dq�t0�����!�f�^��0'��:�+b����Z���-��2
�$SMiL��$�x�^w�?���/Y�����frs�B����$sS�M�y!���
{����p:-FAc���{ ��V����hcI~>���_�C���hH
�@�1:�I�Tl��!�4d��yo	@�l
������Jx�1�I��NF����NH	�A���Hx�����TE
��Sf8�7~�����~��pjWz�5��=A�%��S�% IDAT;��-�B��{�������`|���Ej
Lm���������?�Z;9���wY��A�Bv@��W�p�~�Z��k�HJ�N��i��kc����66��'0�\X������������i6!;���b`]]Z�%��^
7\
GRT
�H��BI5�b��H�4�w���� �������"���n�O���4g<�i1;�C������Dj
"E��-�8�P��
*���1��D�glLUP�D�7X��`��p��P��G���P�N�|o&�)kK,�^]�j��3��}��ek���l��p-�R;N?�F$Iv���������!d^FR�`�D)@Deff������%�&>�����3�+4���s�L��+�7>��OQ�~�4�%P�m�D���o�s�Ek[g����T�O���H����c�k=�x����jP�XE�	�e"I����4l'8��a��&�)��P������(���IOx�����FX��W_D��t
y����B��4�b}~]<��D��C4)��]R��v�����
7�s���h(ch���Z���1�'XLP�:�<���>D�fr4(���2�,�5����G3��yJ�B�H����B���������~�Bm�Pss%�H'�Kr���0u�������$���H"?��`� ��SS)"T[S���S`�|��Wq���`����(:Io@�����&x���`�Nm�>&����Gt��^��'r��TX^��������0�7��a	�Y��G��i�=
���eH�A�������ua���`��`.'�R�R��ln��-���*�M<��4�;������?g@K��-�`�=X=4I��)_������F���-\���cR�(���';�����d����d��~��&���I
c�������C� .�s&S��@c.�����W0������f��E~�i�.�"e���w
��X�X���9���B���x3RBH&�����	��"���>���3����9���wP+�MC������U2*40�B�����@�L��@��B��*�0�A����J��A���P)�	���|�D]D�9�*H����_#)8���q�I4^�����
������GiP+�x,)u���/h�7���Igzw�1���<&)���T1��WS}t�X ��U�����`�.h�;������D��"��5���9;���ah�EtzQ�q���0��"��n�N���J�m�?�Z��������5� >}�������BRW���ax^,�	�����)���������:��7�f���yplJ8��ksRQ��9R0&�"�B��^�q��j�>�����
�9���
Y)4C��3��//w\��9
h`yu���,B��	l��u����a@C�>�9�M���s}=ST���*�
Z`�����������~��P���?�;�F������3���E�2������S��
{?��6��������X��:�-v8L��)hi����c�mh(�J�3�!1%	qA�j���E�`����j�����s��x��������Th`�!�F9L1�m�������������������X`��IU�X�`0:5>���S\����^��%e��p�N�����l��������m~3��u����(-)��G�JCq���+4�S�[�������(RVh�U!�WNs���-h�M�����P��
W�` s����&K���R���Ps"WQ���2X�_���U�\X�i�����#��^F����B=��A0�^�|�7��k�'������z�_�W:a�
+��w0�����Rif�������|?R	y�F�\,��>?�`#��k���n�0���6�z6r��)Y�6�4�syN����P�X�_��@���1�~_A��*s2����L���c���`�/L�������g�q�7���7
h��u���$7{�g���F����1fk�.��0�-�Y
�lj�s�^T�v��D�q�`o^�k����������	�}��*1����	}��}���.",
�h�����+/[0��4z�1�n<�������A��r7~�������7K���ny]�h`�V���I����D����A�������B�2�'Us%55��!X�)*��������f��P�j��Y���S�(k�����]Zo%A�"P\O��Wp���By%�����P�`�0r?\���z�>�e88�1���P��:�<�M�����������O>�}{�o�����6X`@��}�,J$ ����\��\JD���
�M�c���^����	g�����G������p~�[OCRBc#���@���G��=���8|q�8r���D�����B
0E��{��`Wo4?�:>#BE]e�O��HL����}lxyi�:7��D������Bv@�%�����_��G�	���NX~���
c]����[�cV�J���./�)4,Z
_��������@�"��/�L���Z�"CW��������lm=mUr)���#kb�7��\FTN���}�m��������
l�bK�J"m(�B�[Rt`��������U�Oy_���H��_����]El<��'�9�Y�i�Ms��I���&>[��
a��A������� �wv�>92�_h^��
4+������'h�����(�'�%mz���q���4�'��������5�g@�#d$�g�A2��077�#(�Q]zI"u;U���AmnL��2��
q�m�6���X����6���lL�)!�:��N�@��g���b��W�$h�@e�TK(C��(��S��"n����g*)d0�
�z�)O(�`�[�s��:���!��I�6\�{��K]�K�:��]x��L1�A4`.'D���6�Z)C�r��"c=��D��Y������L]"�a*�v61O~( �l�
j��a���������ua(2LL)B��*8�B�gE��D�6T��R���Bq����]N0���������E(.�k-������<�������+q�(4���	S�B�[@
����X����e4������������v�`����X��%����G<y�
���Dz��������!����=����]�T�n��p���_���JR`�:f��`�&L=�CLB�N�2��9��-d�F�9���;�zA�@v�h����
��!
�[IdhgL���� i^��h�FY�GN.'
�>�U^z��-����ZdU���z?��7���q�)�DD^��I�$�I-b�G<!0����O�JZVn�I�����]N���J����
�������6r�gf�����f��3/����YI)����Dn�f.5��<�0w���my������$y��Y
��
�I��� i��/M�A���<����m�b��8��\)�%w����mV���J� �D�h_n��b�(0�(��Hn�+rEr�����-��r%
Y	Y
�R?i�#;��*#���4�5YJ/� ��N�
�]vA����Dn����XMH����8��2LU!����z�L�}���~^���V]��s#��Q`�"�q������!��oZ@d�_%����pv,���\�U����[6$���J� Vo�UU�����:�(�h����C�9��r�n"3��@��4����o2u9q��=���%�A���2�~��������]m-��Z��<�4�;��@�*��#=�!B�d�� 3]�cE�Ar$A���l���`c���.�tMH)����/�� �8M�����E��yw���V�j�	@�y���d=�#6Sn��]J�����s�U���!_�Z��JhPs��~�b$���pr}�We�o����wY��r�Av�"?j"�
�B���Rp�&��`./�#&�!c��B��
G~��w�)
��~�/
��h��� ���XY[@Z�s��H*L��). U�Q�AZu�j���H�� #�C�h�;Y
�y@��wQZ�A��� ���8�X@��q�����;����/����B����AvzXd�/���U@����<
euy�jOh�������������@d�_�Z	���Px�4@�8�U���G@�8V*�8�Pp�J������ ;}*
��BM���AvzF��� �M�A<;	�, ����h��~j%X@
��hg�
@�8V��ch�JG
��BI� c@d���Av�B��`Y��4�N�@���B���4�g'!�`��d�� ��#
��/B�H4�D$"9"!�V��G���~��kAY�|qe������s������@Bh��!�7����\����6|#T��@��r������qNQ��WUN��^��&v!1  FFFPTL��A�I*T��+&**������*A%'(� %%�q*�J����M"�����m��+�x�Xi�%�����HZ���PhjjBU������Q�����$��l����&��kV�2�����S��������@���9��M�(���JEh~��H���!A��h
��rz���j�[��0���q9d\��o��Q~��X�(�'~�vu���4�oz�HR�EtB�T�&��t�������<����o��=4�Q���=@�]\���i**�<Y]�dR�/��7i�w�wHe�_���~������&������JP����J���/	����g���7�^m
6'h(X{�	���s9��L�1�4hC]�����cg���>P�y������W����
=�~Wy�:�����w�s�r�u�3;�+�'��]��o�:���.��7y��|NX��yVA�C����z�0���EV��s�w�N��	�9Y��T=�u>'������P�\�L����YPc](G�@���4�.��o),�@C��CI���� (�/L�%�
�t�����<?����0���W`��@^�o���|>��u��9���|N�P�O�G����wm��[J����|Nx)��\�@�����\B=��<^}�K��2U��*���ccc�����:3	{&V�k7�����������������y��P���x/T�NW���h.C_PAV��:�Y?��rBB���
��e����2�p��,?���� ��]��o�<���� ��7y�lL���M^��<�����u��~����0����\~�?�#���{~�C�G{$�S^�o�|�`��$��W��������&��9i����.�#��1�����I!����������>�#b����2"V�YVx��y����wf9y}���"�<?��u��k]^O|��x�s�����\��o�|N�N���x����0�����<�wa>'�]��	��y_�,\9����4�1"�VF, 
2�bTCxa��	���$L ��5�����	��PX�ee,D=���&����\A\c�T��>�������ETV�XV���|N��_@Up9!o���|N>�o���p�� �Z�PV���Y ;��}t$�EG����������|XL�%""zzzy�O������-,������ ���*��O����E*�]T��Q1��S��	

�mWPP�SmR���~y�� ��7�V�2�keA]]� �-�2,����������������v��R2�EJJ�T��E�Oui������4��eP�@����������4����T�����{���3���K�x�����\���G���|�l��BM���'�,�������5�T�s��8�d�6���9�x������4��Sl>����os����>%�4b���������A�:��JG���j��x��XB+.�kA�4DA����{<q!�S��y�#�����y���l��?�������}D��uVA���r�&�CV�oy�N�I+�x�V7%7�:�d-�8�
�HLJ]K�V=��j��>����+��P�R+n~D����_&�����AZ�'�#W�h8��G�}��=V�A�y�G���s����������A6���o<0���|���;[��M�c��e��
QI���j��13Ez{��^>� ����6F��(�d&����a���<�L�N(R����H��*�zG��N��J8�ElR��y���F��C�a���j�_B��?�V�BW���Z ���Cr�hX�^�������&!�	cw+���-����E�
�
qrWu���������Y��R��3
!znW`>�TY�7��FQ>5'��
SID;�������[@MY�E�d��2T����x�&�k�2��<U�L�_�B���<&�i��4��JZ��-4 _�����nn
�%��2�����ih���h(��'
ae�����A
���%�/h(#��:
@�l��4�F?HRh��Z�W��G��{;
@C�m'�,�����o��Z@��W�n�4�Wg�Zh�|@��6���K!
��[�T� ;J��,��HZ���/t

Wn��Qx��l�������NII���l�����&Vl����yH�]��g/���~�jQ�R9|����s�����^���f�z�/f�VM�"����;q�^��Vh����U���
#�p��3�ih��{o�,��RELs�k�BC���[��U~�9��t:T@����\G�1���N��A���D�$�,m��C�Z!�7
��b���x�#�_�

��tP��=��C]_OvH&5_ov-<���O��!��0�E[��rk��E��k%�0����F�1�������k���r���c�JXq����Ih�{v�����z5��P6+&Q�����U:I
��BC���������A��I����D]��6$J�Udi
m�������w�&�[�Q�:�X�y�)��y�D�D��w�k�v8y`6��<���/��*?IIh�(VE��G��OP����$��g���}W���g�U�f�������\�����H��z�4��?�����Z���6�M%���7����luJH�.���������jH����j%s#����$���(M���.C�iU(�j���������^�������h����CW����T��@C���qg�BT4�O�F��d����O�����q�_

�V�������p7��W�������A�)�qa�i���"q2�]{��u�d��1!1���>W�t"i
�z9}8�i���X��$�I�����B�n5�� m�����az�Nqp#�t$Q��"B����j�Y�t��������'U�9���+��k�J����O�� ��6e�"$&����>���IT���L�A��x��%Q:Q���a�����$IX
K�����3r���%b�Yq}�b�s]��j�h���0�/ZW����7�qf�M�yq�Di�G]s>�?\����~Q}�������'�6����H,8�S����-�)���X�\�hc�u���Y������Jm�:��7�}�Z����b�J�@���]���Il?mg-�,����_�v�:�j��f�O+�X#t�W�����D��P�X
�j�`��O�A�A,3�IPh�,y��'���K�c��!��������}����/�p��>zu���/�@CRR�n����z���.����%k�aX�.�������0}�P�f�-���7l�y]9�������uu�l�v����-�y#B�L,P���NaB�fX}��4�����u��]N$�@<������a��a��e#f��-�@���r�|�+J�	@C�P~��PUR�_��a���H�{Kh�S�||�_?�[��x�"On�V����x0W`BaR�y�_�4��]S�S@���*�u��C;&a��C�h��g1���II	�sIHh(>�9B�_A���oU��0o �O�WR��_�@��O���g�/1��
h�9v���{���
I����jU�����E�+`���3$�E���L
J*�h0i.���]~ IDAT6��`�b��x���L

�4������;�\�Z����g;��\��x�&���9	_?%���J�<�}���O��RM&����`B��P����������g�I���hp�p�
v'l��?�f��g�n��0c�3���
f5�������"�h�4��6�����c;�`c��R�N8�z_�l%J,M����-\K��9w����)�7 !)Ql[IhP%(�w��
;�,�2�7k���������U;����^����M<?���V��"�"
@�4�5P�)O@��w`h�T�v��3������p��������-�
������PW���WB[KM����+n\����kP'��Fu�a��#���ExD�������`�$�P�irl\Vn��I#�c��m?�/����T��J�C��b�.��^l`@�1&���G9u�:JZ�u�`��, 	��B
"�4��#"�d�}�#�	+��
�4�a�x��z�aj������>}��D�V-a�����B��ttA
�R����������Gt|<��1�D�;�T�:iq����[#��G��a���4��&��uB��������y��uZA��;���y=����&x�����fN���J
�X�p+�t���}+���=v��ov@CRX�w�FJR2�+��f�R��4�5�C���t��F@�o
((+!��h�+�>B��ktRP���B�M(��H�w$��r	#��rA�mo�z�K���t����\������zUG���H
����"t���}������Hh���F���>Bv

�5A'g}��kQ�\9�i���?�e����=��=�����#��`l���s���u
��<���'�z�<�U���5jCK]7o��@�}�e��P��9*
s������C����,��7?����������U���V4����`��������D\�x���1�
T�U�h�S|���:��C�0�G��IW��5�BC�6��*������:PTV���@<�����S����@�F�[U(h�#9,�����^�N(���O>a���H�Vk���N�N9v��0�U�l��	h`}?�u{hj�?"sOS_� ����C��{��8B����?�O!A�[��~��������&Xu��|����P��I�L�tx/J��cX�\����{x�����t�Zw���;P��Z8�@QQ�9��V%����Lm���N��Xq����aof�n����/��
�������/��������m������j�e����u�N�����Z��������tR�c�khT���W���.}��%}cD]8���n����@����P6��)<�\�STu��*�!��(�S��t����$d����@���Q}���c��CVX�U��"��"q^��I>������9���#9.��u�c"T�l��Z���bi���{�@���_u[���? ��U7��lDm,����B��5�k�'d��&������&b7/K��o�CK���~8��/0�}#<�����;�r���D�<����)�i���	��|�?>���
.�X��o�a�10+j�dZ4��e,��A�Q�/�������B��c����|�X7e��E�J��J8�&��T�K����)8���A�:�`G��b��4�
x�'�����+�@��m�9E�l���d~�������������������#�	�����ePrx���Z���ap�<	Q�}�b�F8��������w+����W���Q�`��:,��BbD��x<��/�l,`;��u4�q�^����^P5����OZ�2�o��`��&"^~����JPPQB��x��*��H�/�)c���7 ��3���:T��y���P��+��5�{���	}�
�RE�v�Q�=����N^��5���m��F�=�x[{M�b��/i��B���$&'��I5�8a�������X�AXIj
,��D���{����p��
��n@SIj���h?���`��}�N�A�b�Q���]���4�H�`�^8��4Wh��w6��Q��/'!9�tJ�k��b�-�

q�/���+/G�]m$yF���P�-
�R��1�f.��Y�}��3�=���bN��h~Ds,��P������@
)�	�hE�0u��x���C�Ny0�@�OsD�����
�qW�>U��Ec=D�B�2�D�B�[#��% ��M@C�~!����+4�^��Jeh^��J�T��I�C�5�M����=��U����� ��7��|��E��(�`����jUG���F�1*���������q79,����2����T��3�YU����'X�IPq�&�8���{�����E��N���goy>
:t����mR���(�OA*4��8�+�����3�O���%��������o<�������"�k4�
��|}�T�t���������f��)o{:i�B��K�#.2�'����������n��U3�w5O���<(����h>g�i�WC��'�B=�%	9*4�����P�yg��H���2:��(�H�Yxf�(����D��y��1�&���������z���7���27�>��Jc�������\s�e�QqT5��������\��������1�:���J�4���}c�e�W,��m���
��[���l//����A�\�A�@�FW���WP{6����������9��d�{wL}��~A/���<�j�����C��y
iN��+�A�L���@��`�����h���;���D��5�c���v���$�;�d!+�!*��u"����9���U�7F@[W�����x�DQy�gM�h@IY�/����*���}�0*����dz�jBEE����s5�J��U��xx�J���:����kWh��U�{�$4n%���������'��v�h�bL��v`�{p�Fx��	����,UdX�&��7��
m�*�LWC��3��(>���p�(��w��]�����#�~�����}��c�1�y���\>��-����.��?������}}p��S��(�\�#k7�5/w���Z�j����

|���5��4�\;�|#i�������D.)�P���l��������EqCKt����2�a�����t"/�m������0���������l��qQ�K����samTc��6���������g����f����<�7�6�Z�mB�?����:f5�E�L^c������_x����-�GiB�C1�@
�Q�>�oWh_o8�><���L������3�r�Q��y��m~Xxy��1��T(+*����|,�����s(��j�j�PQ��ggi}�E��p��I|���
��Ww�?����cN�)d}����K��JSE��;�S���WO���5�;s]�_���U�TM�8�B2���D��q��p6O[ko���E54*�	O����/���������cx��t����������$���UO}�����dY5K6���&A���^>��S��5��}.�5X����a|�%���^vg�a���_���U�o�VGUK����0�"">V�����h�����\�:L9��)7x�@-*g�g������`L���=��xQ��Gwp��5�8�B���z�i#����=q�����;v�����~�����g��5��u�9]�C������������"�As�D9"�B�/�Q�����I������[R0a�Z�����M�(jX{n]��n�]�1��-���XF�q�Cm�j�3��5�{3�h���j;9��F�����[�(�w�6�i-�qg����<��?��;A���}'gM"��#l-����)���:�@K~��v+_O��_W���_�q�+4,��tG���Q��#�V�D�(`����X��jT�{g
|1��+����N����?�[����<��#���5[��T�[W���p�Z*b����^�!g��:����Y���`���������aX5��b1{�;��G��{�o6����^0�S6z�]tV@CU;g�lAk�4�[ph�B�c�\�#�o��T���BEtsk�k4����5z������_��O{h������P�R�y=>Oz���>��TT����	�M%�����"����Y�s9q��MX�A���M�GO_b`�X���vm�������=�lK��+o�x���4�����v�t~�f

-���G�0�G{��11q�Q�<�C�p��G��2-0�b���(A Bz8�Afpr��������0%��w?s�!�������B�*�!�YY@�!9*A���h� �<|
M������Bv@��C�0�Y[�	�^4_�}���0��T���N`@��������71�F=�z�A/�z�hU�

J;��%���u���T�������[#��5+�;�L��C�P����p0��Z�(m�m�
�E���+G�u�`����s�hUq���W�;�h�D�:f��D�
�����'>Hx��v��}�U�4�&4ER@
�8�Et��-
�O��[�H������Q
��)q�P�7'0!je-9a�g-8����������I��O���P�
�K���:�z�hc�\X��-J���V�8���q@B�d���
��7CW�s|
���-�������j�,<������#�������KPn�x����w�p��k��k6Z��=�5������R���z�,�8!;����*�����m3-��k���k���-�&��q/��\���C��.��.��+p�A�dv����:x���L��%�W����x��	$�L����C��������&�����v�E���W���5��=M�I�4���4(h�B{p]D��D����6vi�6��h���K8������b���e��aa��]u��?'�A���U��`���h�����O1�i+�{�����?�������N>}��Z����giQ/{�@�m�a������������?���m;a��kR�V�;�@�t^�!��w�����YJXr�-�`G���K����C*�3-l30��W���K� �K;� ������;
���9����������
QtOS)Z�E�"��m�!t�A�-h��:�1������zjG �-(�A�$m����P��l�}R�K���s5�����EI�]�v��{zJ&���<�b���<���S������[���6C���n�Q��H���Lu�$d4$��=�����2q���V��.o��}M�sDS`�1�~�������8�Y�7i17t�$�u��dr�ukt��D����(�gVB�J{D�>��S(�}m�k�6�e�6y5i^���������,�
I��Y�����
h���C�a���x���GO��������N8��t�����4�E[Rg8{d!�4n'������o�F�������T��o�F���p�����|$�_�A��-G����T�4ZXQ��#�Hv2~?6,�F*u`^�� �O04�����1l�a�[�#�����P�`'�*V����/�Y���mN��lE�^p��f�m2�/l���Wj[�v���{h��1�FX�/&�
�
�&wE��[D��1`j�:��0o�[�
�D����PjJ7x/9�n��u
�]q�
������g�y������Km��N�X�Fx9m�X9�]����P��������X�o�}��N��>P��<�6��\�na������I�;S6r#��X]�,����*Gf���h7����x��8�G����k��AP��,$	Y
w�i�'�Yw��wR^(�o6a����rJ�hhV���A�������2�.��
��@X�z�m���P���}`��9�	e�a������,xG~���Ox�CU�������p�����������w��P�MqBn������A�����@�@����*��#��Z�i�=��#�7���G��>��*0@��� �S��
�^A���~_�d�TU�����j�]�����A���N6�!PA����=r���#��-h�l��sw�Ra��"�,����Sa	_bI-B�=��:`�B���6[S�
��Z�1��x�Dn�,�@��uJd��"���{�YL!ATXy�-�����?!�[0��G_j��������G�D�!P)e��M'�6����
a�����J4�OkKJ,m����Nk�����0(n�Hzv�6ohS���]4��n���&�?����&8an���xz2����c�J�]����!-���7<O�C���n�	�J�M�W���i��~:�=�/��������S�������M��3����Ih0y1����:c�<q�<	z� �4������68�� l[����k�?�
G��G���v��N�`�h���x}�
�5������G����2�F�q5py�9�wq���OPqS<��*�Q�Kn!: ���wy��t�	��=�:B������<��%al_�C�V�x��.:�[�������8�v7�l���@�}������n>hxy�9��q(�p�=�~G���~5����a'�n���$��
�S�4��F+[�}����+�Ww^#��wz%�QaDU>T�T>�������[Y
����C"j6P��88�b��Ht�����x��C�V�J(b�cSE�=�4��K�����O�O���2=W�Q��
#z���������`�$$3�3�o�d���U�@����i��`i�>�J��^)G�$H�����N��7aAD^�������M�T`��,n ]_[d���-�x>���JXp�(m����{�i���Q��F�U�q��57��������6G���s���1|
F��u1��F��:'�k���3��{{r�����0����.44�/O�<����)H
40 �Ao���E�OQ=���]]�!*>'��'���<�G;����
w>��@���f7�L�!�h�K�/��������p@b���hK��k*��K���F�wn���C'���j�;�{�C�]��Mu���r���G����.K0���#������g��M��Fa�����DJ����(f�q��iXQ��+�7��uF�D

eLJ�GE:�pf���1�3�����>B���ww�8	��63�����d���f
p����NU+aX��-p��;����.�~�4����'u�IX|e
og^�8@�����������[R<`@�q�m^m<����c��5�k������~�9�p��y�x���6��h`����"������hT�#��_�Z:��z��{�������s��L���;��`�Q}66�_������B/�q�Me��3;!
7����:���`��� �6k�����))F���[SQ��%�*a��|Y

���jiG,>���W���n8>i�,�����A��m�P��/>x��#���1�V���s�D�u���1��~+Zs������O��q��q�8Z����;���5��t�� ������������W��]�]�]�km]����P����� * @�g�sY��f��93�y��9rq�G������f��n$�4hI�a~h��io�I��,.�	��v���K��n��9�+W�0�ZA
�*r�����Q�&�
�~�t�^�&;�x�����}�.��l��Qh��L'@P�gY�x>�;��m��^��=e,�N������	F.Y��5*a��3���+�9�J<�
d��	��s�u���N���������-��4J�S�`CQ����D��Y1w�A��<�'��EC{c:�J����mG����o�
�y9x������+��*�/�������G$H!����Y�HiHh�V��
�b����]�7`b�|2�m�gCPh�_�����0� @N+=4t���{b�������	m��������)�-���;wL�1]f�/%��8I
:��(?�4������xs������!wx]�A�UN8
�AM IDAT��2��M`jg��{cA��hH���?NF:I��%�c���x��<�
A�V�������=����R5AA�	�@�wB7c'���� n��$�������0���f&�0���"?_�����g��4f ��B�V
a)^�|	$�V�@�L�HgR�a��^�H
hJ�9|��W��DPh�
��BB���89��$$4<|��
W/��������c��Ve1r�Lo��{[�������u�j$9N��I�R(�����{�6��S��(��
)���'#M�I
E�s�/��ssd��=�[�I|#��r+����
s�����|b@���8v�7^[��`�g�����[r@���t�."�y��^Q��e�����e|#�����������s������H�A���#���L~�����[�<�wq���&�]p������KOx��:oZ��C�}72-kSn8�3o{f��A����j���`1��J39��x����9�z�c��mhT���<7����'�����^�on���l���@���������}��p*d��+#���TtX{<���
���8�����8?�2�b����Eu�
#���e7�<��c��@G<����w8�^u������(7u�t4qo�lJ[��������KU���[*>��iH���A�w�"?�`����(4�$�R������^"������@�/o`������^�
I�^@?7.���>4��-���q��]��yM*4%��T��O��������S�k|�f�yw,��rB�c;�@�5����
S����pK1�����������-��I�R�5��ac������6��!����!6\>/��^��bE����n��q���R�\�!UR��rB�u1��	\�)�$�L�'�����I�!������w�A������M��
���B��;S����,���V�����I|�E���w�_�7���h�=K�1TP3��!-�[�!��S�?��Q�qR@��D(���y�X�"�K��

�T.�����L,�b"�xt9����Wq.'����r`N��DJ�	y�n�C~
�sA�?��
-�0e�b3�g�B���R�lya�����$�Aq��(]�$���mR�A()�c��vX1�[|1:��h��g�x/�rB��R����bNWT$�a��9r���h��'�3��xKN3����<�xF��o�Db���Tw�m:�yy_B�F��pr��V-��.���m��@��-%����Ll]���C
qi�6���K����D$o
v���6N��Eu�^,���y��J�-�t,Ma7�
�x����f	��I*0�>�}�}�9��;~���cn��k��������P�y��^("i�h����0/S�D���E~�IP�O�m���'�hKX��|��?�U��K-����`Z4/��>�Y);	R����@����"��K�A�mSd-��/�h$�^0weo�i���p��6%&������<A��M`������b����f�4/G�6����w���L�J�! "�s6���[P��0�d����Z�=�*����?&��1�j��n�s�Vh���=���~.0�1�W�7�K�DLIH-���������q#�"����N
W��B}��q!D�	�;H
B�A�&���J
�/�q�*TV���Ct`0ah����x���a�z|��Z{��cA�DDB�A	?�=vU���_Si�������d���q���J���4T��zCu*�)� ��]�K�H�w�	�GF�(M��x�!��������@�h�&�%�l�V�l�s�$� ���swX�'���L�=�N�a,G�EU�A���&��8��z���i\[�6�`U�8�u
_n2��j�����h5gv����}�{S[�5x�N(/����D�9�����Cy��
�<@yBE�,����%��J���B�UI����yC�����������yj�$T�L���G���P%|hyhX�[��C�x��9�����������[���)g�,�VR�@�V�
�6����J��lE�n���H6X���Ixa_�����1��v{�����)b�n�|����|<�����x�@���@���d�V%���E%�PgfCY��C
�6Q��[ll���w1MS�F�u+��f��3Jp���:�"�7(_V�um��7�%�vx�^�&qx�>�V��J�����zfz�E����
�����q����pxP5�l%]�����������E�
�K�����Y���$�p�p(EC<{��/��T��u�C9�/	Jt�k���B���k���w�	�"W^m���JHh��t���.�P��aL`��P>G�m�_��������B��A\�0�m��g=�n����U�G� ~�������.�{T���i�T{ ����m�<�7�pW�����F,��U������1��f����8���~#x�c�r�K
��Q��#������TrC�*�`ihN��>�Y�����P�T���U�������'���g�!�����@�� ��6\{y����T�,T ��%��/L�?5�*I���T>T�'��r�w��+��9	��!�@���5�������J����TV�V�m�@��Z�^g��������^~~C�������4N�~]�w{����jw���J���t�����^�=<�I�A�I��p����K�7��Q������FM	jv��}�5.�sm<�Z_5�(�di��i�������X�]��"��)�ZF�����;���S��T�0�������yr�R���
$����/rm%���wJ0a|��RI�p�R����Td
��P(kIl���{yZ��<�7�������)~�1������.����Ltt���&��� ��P�����&A
�� "���Z��J�!.MI�
(`Y;�����3)�A<��R����#{p��G�F���s��/�2�a��������	%�����%�0�e]9��������1�q[
_��B��h:�X>`,���-����V����c�-FE�c>���0�
��S��G�b���T�����1x�l��e�T����(�0��*G,��bUBr@�����3�w���~���
'�Qa�+G�r����2����nm���XE�8�z��Y5z :2n���QT�����Q�r��#�9��4��������B���r)���/��@�����<aaLU�#�;�D���`��a���|��E��;�Y}����}�
�!.��6Mq��F�l����Y2�/&��O���@)	�
d���A�D�����'#[���T`�,']K��������������R������� cZv��m��x���C��b�����s�JR�A�M����,��z���7R����Wx�
sK�|��s���I�whP�Z�7#���_�R�S���������p5������������w�@�@������	
�I����*=7��B���Bm!.��c�A�,���+�D��3 0+(���s_��:��{��������e�!�f�f]E��
!�����'�.��^Sb��T�||)u�g�r�f/�EJB�d�\Hh��:o��.�Eg��h��y��~=��+V�,����$��`���\��,RQh������g�	5)��;o	��xc������)��8�A(4�=������tu����C����&vup��e��^e�K���a�
P�����g��XE�����(�

�x��7�Mz���C1J�~�� \Dh�iS
�7�k��4����

B�����a�h�D��I7�����(':<R�G(?|)��o�FXvp?&�����"#��?�a��!��u�Th�\�v_��A��a������N&a���hS����J/�A�&@!Gk������C
%;Sf:8�w<D����D�����	>Qh Q�G	�ZKx%$�����
������(P/���8.�]Qi��;���!28R����E��}47#���J��dh]�<��+�\�h8��
�����|������� �J���c����G_����� ���BC*4�:�
A�q$�������P�aX��Xp��t1f��������Rs��

m�8��g��p��rR�A�+%�n+KKG�)R�������o��������w���
B5A��u"_Q����s��v��{��S�2�&o���A���0��&��B��?���*4�����v��Ot&u��$lv��Tv �q��>��0E3����	�1������(O���f�?�d0i6�j4�%���[��<�7������V��A�J"|��pf=��t����0m>V*4��-����;

#��:���K�];'��.�H%�N��8�
D�0$4��=F�|�p�&%�G��* �5�=��g��:CaX���eR6��YrB��z�����z�Fc���R�A�$4���fJ���U;0�a��p��QXd��c����'*I���4,��	6,����u$��'.�|u?���!#�S3+Yf��3�2����#�xX��Fm�J�k���c+��n/^>����}J
Cr@�PMxw�����P�W��ru��H����8����Hu��K�@�O#O�Tj��v@��O��F������l�����+���n{��n%���������(G��i���8�A�1gG�*�i��K�k����Vb�����m'�0�5�Q������

�"{C'�� ����1����p���t�]�
������F�
�_�;	��P��������Hw"|���,G=�|}�����E��g;0���x��gTg��������	n�3�s�W��'�	�
c��?[�����^��.Kw
�;l�F7�t�@�]D^��[,�_�~�4tb

A�v��'U�BC���

a�n���t`���,S@BeAO(AX�p��C
���$T�7�UE�J�x��"�K�h8H���Th���GX�%���Y�-k��Tz(Y��|�M�"���Y7��Sh�B�&��P"h�F U(�z6���GP�j\�i
b��0H��E�C-�|��y��@�!�-B�v�J�q�5�-_h(��?�o�����
B.���{=��J������

��uA T�C���^���:,?��Ts)���Tg��#�?�e:
dYK�n�n�6U�L�PC�I�Y�t��y!��~i�����m$��|};�H�pIs	)�X������<����*��&�

�����s(� n.��2���A�u,)����#��df�+s.�*A���u��j�_�=d ����6KQ/Q��tOq}�%8�w���'e]�����.0b���Pw���_X���u�B�C�2���*T���&�b��������i,]g���b���a���qr�YG=�&$4@A��05���
A��
�
���p�J�t	�z?��I��s=e+�I�+4�S�A�C�Q�2�.�L��

�� @�h�xA�t'�.
���Pu)��R��R^�%��(�Q;V�MB[���$��P9a^��x�gJ�7����T%d���(4\8��t;�������Thq�_;C��Z��2���uT)`/*���T�7z��%� �R�A<�B���M4�l��
+e����p��]*T���9�qh �"��z����

TuX���J��*� �O>:/��S�����xH�c�Vt��]w�����z���D���u�X�a��m�V��B	����.�C�2m0��t�)\��=EW��w�]l����P��	�����}E�jB�@�?�	�
�L�*>�,��
��		L�7�}=�
T�c#�e��;���=���aQ�7\_/j7C*'��%�[t-�VB	������S����F�S��(e[�.3Nbu���c"U�c�eT�0��a�-=���?���1������7��\�1������}'x�K
������G�0�j	�o-�_�j����Q4-�5�MDb

���S��%L��6��C���G+����tG���)T�D(b*:9��PY�r{	]L����tk�1����*Fa�R�aT�R���}g�{�^*H��[���u��,�oP�wz*4@A��*+� ��{����p	Q��\�^�c�:Xvl/��|��`�y6�y	WkN�<<�����Pg���J�
���^���-�r�������r�E>^	�	������t��hJ(b����_��tc�jHh����8N7-�6����@�3�wL������t!��n(p �/�/��,M����A�����	�_)��?��<�
�[v��0�q�c��Th8�K���e��
q�	���hP��'@�\�r��q'�y�!���8w�.h�nn���aV�nR�a`��X��\^�a���h?mN�J4a�G��������%��@C����=���
�u�o�Us7!�����r]%�W��E�9�,=�-������(i��oQyY9\K���H���%UW����T��3�Ax�N�K^hP��M����%}Z��\2� �6�@�g��&�1_��hI��M���c1����������hK�	�����kF�������#���/^����#�?���.]������9�1nx�xk��/���gb!�B���������4VIUC�(R�b��,�
�C���c1��/M������B������G��@.<,?��
����G�~dDct�<~4<��������f%�. y)��`�[6G
�0}�C���/����<���T��at,]�����������y���4�&4�����9)�����)�^.O�x���M^�
f�A���g�����0��qMJT�?7o�&��g>�����J9��cQ�1��5w� ��E<��S��t=�	�*�����$���]Q$��I��b2t��`DX!h���xI����I�
 h`�;�����V��0D����(�	#hg3�.+,F�C���<�{)NL��C�3��A�0�����YW*=D��m��q����h0Z�.�[�A����f�N~+J���w"!9��!M���������?�P��H<�P2_~�h�J��Ys�rXf���\��R� �������u�:��.��7[v�J���`����b#ZU�"��+�����G!9��<�s�T�r�����0�2����P��j����{�x|����+�Q� ���)[O��G~8��D�E$������C�����0�"����N��D��n��7�O�vu��"��J��tCQ������jN���KnH���r?n�'

���:U����$h����F)o���P4
K���Y}4\|�;n�V+7�;��^����?��F�r0��3:���MC_tqz/K�9�!i8�Yk����F^8~����F�������f��^�����ZC���m�U=�s�������!	A�n�U�]��U�Os3"�������+)����ua,��E�{�oB
�lr�N��r�c��*+4����*W�+�7����_��@��E��L���P�hR�Q�x���X����g;xc,�����X�gb�6�P��*��@C��3���$�����IwZYs@'wAY����#�����."��p�A�	����_���+��F�� ��V�� T���~Yn|����6��^��'@��v���VtMa��{WaD7R�!���BC���T(.#�.�B��2�e)�nT��MT���[��w��y���
��:�����s:���&N-�2C���!�~��|w�E����'F��T���#��J/�t�TU����P�S�&��a�����o[ ��)p�� �>��B_�z�<���5?�Y���@C���Q�d�b��_��a�TF�����Fm��9d���n%���"XS�N�p�2D�n��vB����M��vA#�l�� IDATWC�!+����
-N��LB�k��CB�4����r����!�����t%!\c� ��4�����l���.��?��=B7.�$`1�7CK��O;�O@��y������8O��n<����k|��Vw@�����3J��vx�B�P_(2�|�8?��#WaU��t� �(�E��X���a��&����
��������^���y��y�R���6�.o��<\~[�b���l{8"�)5O7
O'��F�A�BS�!k�x0e
�x�-B�]S�>��)��������*�	�|62��!x/�O����nR�����&~�()��-���.
J�E�l���/�qY.���yQ)kY\����yZ�z
��,�T��k}M=�-2�<������md�^��O���UD�������>���
�����tY�Mb���m�A{`���������D�\����a|�	�Ej���37M�mRY�	�
��>�4o����IW
B�@4P�����rIU�""��	��m�B[����x�C���T���"�p_�E���S,G_�� �Q1+�'@���/D�����S��UuY4�A�eF��%��pc9�ib8���bD��DUJd���B;_�M�������z|0�T	����A�t�)[D�%��D!a���>�j\SD T��gB��0�J�������^�%H�JX�z��YBg���h��V)�0���b_	eUBn�E������q�r]���Xi�.::},�����;�|�QR�����(P����:,��@�&!G�l�xz�n���pan�W*.��x�+�T�w��$.���vK�`3�_����od�
�F#���n��Je����<B�Ryy�{���{���������s

�T��G=���X��S�������C�:�>-���$�
�����T-6����,����^D��
7���� ����U���LW^��CM�i%�NX��F*%D�DH�ZU3��4��k��<���#o���7�c�>�A�XW�{~���'_};iS\��+s/���-Jr�n&49���E]��^G�F�0����"���������QF��kJp�Q1�����bZ��@D�aph��d�fR@�/�C�8;����E��x�A�c��p~����]F���D(����Vh��-X��A���Tn(,�h�T4�F#<���.���y���p�Dhp��v��5�!�n	A�:��w+��:
�<i!O�OA�����~���
�0�����r"h8x��=y ��T�G��y��:�n�������>���B�Qa�!���wj�HwK|��\��"���+��T`Xr�0~����� �u�
����
�t�K8�����(4�j���^���6�M��yX�(����h
c�`T�[H�H��u"�0��>t$����]�VK��U����e��o�������M��.���>!~T�x*�/� ���A�lA\��o�o�]=�sl�x���bF`�'�z$����������5�p�z`Au:�_���A]�	7
��K��(�e_��#F��v���	H`�?8��H����O������yI#'�@Ld}D?^������ #����J�V�D������� DB���6�R���*
�^�e�`*�m���\��o�4Y�B�Q����ts���5�����ar��%4r�����K�:�Om<��k5&5�e��I��$%!%@C���a��p��V\�E�9�
�,��Uq~�p}u�u!��Hx�.�PZ
Z�0�PcJ	�EDv��RqA(7�',!@3}K�.d����X{�S�������sW���i���.��>�	����	z;��������>=��
����&Du]�/<�q����tCa���mH��1���b��X�6s]�THJ�!��&��!�a�\�a��}�������=`�[�B���bZ�~�z�,F(4��1T����G�^ A��t������
B��nI�d�z��-���=n�_�{���n��Q���������5���'@�pQ:_!����#�������=���-��Q��#V�<��
[c��Y��$9�A�8���CM�[�C�7��V��z��+�2y�f���oHX����	#���;
�Z��.�{�K��L�A�Y��(����{v����/���%�-1�����|N�������z0�]s�4l,->D����'���x���-]�yIX4��Z~t���<���aM7�i�h�z��]��}:�4�uo��{�L���y|l��l����y�;�*��^�����1�/w����2'nz���V��u�P(�!W������	�D�r��u�S8&4��\��nK� ���.J���:s�����u(��e��a��
����4	1���Ji����\��J��Uh@Cn*7X��&�fw��O�?m�jl��!�
�n*n��������q�+@CJ���'#������1S
�WQ��X!T��P��g/C�&u�����|��u�B���Pq��(��~�>��b����L��&^��^�}�a�.'N�P�)31��^	�JPJ�a_�b��7�{�P�!��h������[X7]��K����Y@�!��LhHm���N���_'��4�&4|	K$4���������Q�'4d�:'4d�z��.���HM^
��#.�������=�Mh���X�s9������������'t9�����������A�YvR@Cz��-�J-��-��%�L�r"-�ACO��6��:�R~k;��&t9��4i��9�!-yg���2r�U�[B������m�C�J	F�hH0#�]Ej�K,]R@Cz��5������Q��QFB��)OU�!5ed�4	�8��~FTU"�0�z?\%�q�i,8��!���T�R4�g{�e^	]N��I
i�33�Mh���JX��.'��M�
��wr�$4�G����H���C��e��7#��|mdJ��kI)O�@F��4�����#�:xzz����������&Th��O���S����g
��1�A�Z(@�*���q�!}�HRoGhH��2r����d T���PzPU	!��Q���Z*m��A5�e/e�R}x3�`��57���3�2HAlhH��2PhH]g�$ \SXZHu��{~������I�KT�1h��f
���)�!uv�8�4��U�%#���Z���W���ZPI�X�+Y@��+
�4��&ThHSW~��
��M��I�
��1�A�Z(@�*���q�h���.@����4|	�*yfd(

�w��n
��^���

�����V�����wh����4���I��4��U�!}��j.��E���5�4���Jz�_�
��
_i�����4�*@C����$V��ob�O
U������BT�V���
��G
��z;*@C�m����P����o�c���{�����
�����VT
�����A�1$R(@C���q*hH;��KF:Q��i��
i���^��W��4(@�Wji*&#M�
�����&�������B�!c��*�P�U����*@C���4���
��z�))3��!s���Xkh�{5�6)@�z�wb�U����4|h3hP}�
��:�}�J��������_T�{Z�+@CZ-��W,��,������R1QQQx��-lllTJ�=D������1��������u�P�y�����X[[CSSS����#��x��-�e���x�W��M���:�o�:�������:�we=���f���W��:�o�zN��+�y��������o~S������o�+�s�~�W�p� }���F!�*1������b��2��!��IR5R>��o�|0)����J��~�d��<��(��x�GQ��A��7e=���2���>5U��M]e\=�_@5Y�fM��f&�EY��������;hP��e=���9�������\]]3��P��b��g�����}��W`K��������������-��L����������L�N���|�B�:�����fB�El}-����^P��.�ihh�Ti������6�����=��	3���%��<��y~����<�d����:�w1�u~S�������ku����u~S�si������/����������Q%Ou��������SeL~���9�3�{A��7u]���x�������[�wE��K����wo����#�j���������bR0������]L*"���
u�������L����Z�yu���#""�v��:�w�vu���y�������=��SY����F6VY����@u���u�+�9��~Q�s���:�j�y�+�9���V����huz����
�6�����2��H�)�v�2�3I&�<�E)����L���K5�u�����:�XQ��M]��x��U�R�����S$��e���2Q�s��_����S�_Y�������	�L�I��������9u�^���
��.�*%u��4d�W>����3Z����R�g$e�\�u�+@�����Q�u�T�s�z.�<�_��:�)��9���xW�s�9�����<
����������:��Z�'�+G]�s����]�)@���D���������'�+0����OM;X�&[����|0}����B������xU��� 


SU�ov<�KU���(88j�r"<<�������0#�Qz�!22����^F�Q]��h�p�"�)iii������}��nah��Pd�1@�I@��AZ����VJ���q�%���Gd����#;<M��S������t<S8Z2O��V9��h��u~���=��BB��mUqG�GR�����RTx:E��Pn&�*��=��Z��jP��-�m����T_�D�!���$����S��1������)���e�G�eC�F��.K�}���������j�����^���K�����!,Z�y6%
�in���r��_��72��V6������)P��R��S�����,	�!FS�(���e�Y��
�*�Z7�
reI��V������w�X��<���l�{��Gh���RA��(H?����x�\��xn�2�2VrR,���i�#?/S}��C.��k��\��'B�|���e�N��(8�[VA)�#h\��[��t������{�p����3z5lnk�����"�����9g�"�U2�r��z�������"�C`����6������+����
9Xh#24P������3�#�o���&��s��c	t��
f��}"n!������Xw&����(�4(@C�J#)@C
�$WO(@C��wE�8�H|)@C�yn��*P,�X@�,�
�����
��i�(@C���[��!m=�
i�������4|�����[@T�hP�^
��2{)@�������D.'��]������`�FT(��2E���i��a��~���?������y�6�_�y(��~
xz�`�������]��h��F��&L������������VCI�FP�����
���
�;��S;g"4�7]���������Ml������Z5���u<p�P����D�����&a���m-����#�;�R~�r���CI�~�P��5e|_�9��(�iD����m@9�F�������\x�1n�������&$�me��\�&��'m��������~��lL���U2|�������9�TJ9p��,M3}�������MU^-���~C{h~�[F����IO�A��n;	���z�}���k~fQhhX� �����.��������J6[�2v�{��^iW��

���6��y�>�Z8Y��R��|���;�U)]\��W�r�"L�u��?kC�p�T���et���ED����#��{!�U�.��������5=���'��P�����'Tj3G�:����s�P����%�|~�p���

���zt>�U��%7bR��*����9��&m��UJ���'8���U�.u���LP>w�T����g[�5�`�e�w,B����9��Jf����i���Y<^�tq�u��a����0C�J+�-��@����/#%Ji[��O���?`�r B�^@���45#���Q��T`J�%��]�?����3��X5W��#($uS�f��{$���@���������@�t�lyhH�	��BC��;\":$���t�\U�o����_�tr�����Z�(4|�B���4d"�a��K0qt��3���lY-��Cs�|������k���	i^�q����P�T1	4,\�	��4���	f.\�=���@��z|������n���M3\��+�(@C��Fh�>�-m]4�6{W����Q���_-C]--Lj�w��8���@C�Jp��s8�qS��~k���{��tur@C������w��T�/9a���������=��?w?��f����,���������?�=�9�������_�@�{���������0&"
h0���^Y~�|�h�z���<�S$�4����jV�����f�|�%���)�_<�Q�:h���L[u��v��������� �}9'�������������5��w
4DE�����p�3���?�W����#��pE�|�2����ES�/t�R�|��H��:�mIX�o
4p�������r2Rs��@�q�.s���g���)�?��
�il��c��$���\[��i�!�
4P%��D�P_hx��Gn�(k��!��e������4�<~�!�&�@���=0i�a�(@C��&S�T��L4�Z����k���

���q�������������#�1�Og��a���062B�Z�q��9	�9��#TU�[�"V���`�K�A�����#�yy#&:�yt�` �Y��+���� ���Cb	���O!_n[Y����4qK+\�)�0���b��
�������55p��.����Nx�����aL���4����L�z��R)s��np���<Q���o����&]���2Q��L4hh�Q�i04�D������`�%n��]}cr�MMM��7��{;����7����(^����$���k1?w�<M�!�
*���F�����������k�Ds3l�~o|}1�Fu��>.�z�����7.��^
�\W�j<��16Pe�N{�|`�������
���6��?~����NC(,��g
�wj�?��jq���tO<=1�]�f����~���*!�{{���5:.[!��h�
c�nG����dqp�W>>�����f�������C�*������CPx���B��:�`kn���hL����s�O�*�>s���7od=����������������%�P��n�XJ����$\�Z�k��0`<sCla�3���A�pCR����u�f�o�[\!��k�j��W�F5�����o�����~�'��'��5��|o��1u����`*��
Q1��a�D��"Xs
9�][�~�
������'�����$l1��1����%x���a}m�Y-s����E��j���=��E��<��?�/`������9�.���'}&�N-���]4��a����Q�6;x�v���>S���xl��1������y�,��!��B���(����]�V6c�s@�E��6�A�������`�����B��W������&�:�F�G����"%d�S4;�v�AL`88�a��!;�J���k/�ek��6��1&2ZTm0�S�s��2�����})n�!x�
�H�o`���Th������ei(�h��@�G ���N�,��o��1n���2�7���h����t��B�<�^�������>��t���]bz�)t��A��
B<�������"x�mD�A����%?��`��r�����^�"D�#p�Uh�f]�s\�"��	�29v�����~10lV&��6b������$����0h��@�o0b��`��,"��}�E;����F�A�i�����u�q�yE���W���l{BR@Ct`0Bw�c;�86���B\��� �8 IDAT�zu�"��}�������*��$��[�>O����A��1�!d���'���.0M4m�r�9"��+"]x�[�S='heI�HR

�������}<X��\�����.��u�_�,���	G�G�J����&q�����M�����56sn��j
"<���
���n�]�4�>{�����pA�����/'N!��������`��;8��%FV���.HLe����BC�Bvp���'O1�zUM�p������ID��BC�-�;��9	�sb�����wh�Z��aKD<��{�{�_&��@;k6���
5�m�^����<�|��z����Gv#��58���CoD���A�>�&��@'G.��`��%������ �.��P�>&T^�x���}�����eV�6m��'��7�����1�

Q�2o����s�\���C��0"��|!Wc}��m&�:w���_���"`�����m�#���G�@�*;"����}/����vg�y��8������)�k�[@��1� ��	m�q-���~����9�Z�����/��3,�"��<F���c��>�������]�j�`��.����������6<���w�����k����F��=ig�����m�[{���!K���4�'��Q��=���?��k���������(�x^��N��vT;>�Zx�� B�A�������M�����]����B�X��=9�!~�7���5����!8���6Ddx0��rp=X�r?������{���qv�P�g����
�����ri5�����	�z��; D0����E�I��J�q��,�m<��_���'8eG�X���qw�k��\?r�3�F������,�62����cTn�gJ��

�.�^�XYbD����'�s�
����7
�k�������x
L:4y,r2���=d�9�J*0�g+��e[���
k����^��5�{�����(���[]��]���w��y��wv�����5-Vu
Vf]������2���T*4�������������5�@�Y	��hY��<��.��Z��S[����A{{�k�_��GdL$�7�]g�n�������1~��2����yz%"�"Q�*/:�n�m����;�kD�M�gN?�L%��	��}acj��!;&�hv;<�y�����M������\�t����'r�7������q�����gvAC��5���o�,D�{}�j�00D�������	�m�!`�"�[o��9�RN;���Y2:�
��.y4b�_�J����`�c"����^���W�w���?�kW
��9��������`T����h�x����X�� �
��"���h�e�~��2m#TF�&u����Q���+^Q��o�����3�|VL���LZD��s������~�:a�_o��m>A�f�
�<9E|];��<�����B��ya�z0me���x�x6�[����I�����u��"�����������:n9����������x��?^�!��)�{N�s�hg�������E7q�P�!��tr����`��G���U�0�=E�IC�������w�B
a�����K��!m$���bD�|�i=X��u�m��f�KV���t�N���{6T������h�<�}�8�E����eC,L4���>��G��\��^,4����v�����{8�d��p4�60�{Tk�� 04���������q�1��M�j�x�%,�5p�yz��~��Px�E�Q�@��X"�1���F����h���7�p�i�`�F1��

��]������{4\�����p��jHh�x���W[ ��'���m'q����[���g���>������"�E[h#��J��o����,���W���y��~Oq~�$T��������\�e�}g�O��IJ���y���#���
�/U���,�x&Em������\���0jTQ�>9{��`P������V0�W�k� >�V�z�B�A�������SS>�^�G%��pTw�^Q��w��?X��&� p���z�.tl�C�8�B,'&2�j��0�S)Em����BC ��=�"�3T��6�}
(*.'>ofh�D@���g��j7��������Kk,Y�=:����'�X�
�����Gpvy�v�����)X8�'��A�z�p������y�CHH*�w�����>,��_�	�����������$���
�����zB����?K,M\�
���T�k��
���[�7��rA�����Z���U�a���*��4nR7�&�+7p]���hH�J
����}C3�����"��������'���/^F�q����v����l���h�u*Nl�����O����/7�n�\�x�����p{���ehH�����Y��;Fo���<���{P�� (�>�?Z���c���u� �����Pg�y�(�JJ�����<�X��:/_�ve�`'��{���uH����b��B�)T����%��9w�� ��MKL��Sx���kX�n�E��$\��:�����D�,���}��Sh����%������V-��*������=�}�*����.G�<�Q�h	a��VE*N��A�3�p��k<d��S�J��s�p�t��*���}�SO/����o������
*i1����zt(W?S��/{^x���ZGm�~������g�*����D�>>�C�
N��h�<�!�W�E���d��$��[���W�aj�fXq����h�����o��n�l�AT�����7z��!��^=�����"`��p~�&�q��Jei�M��|`[�,��	c�l��������l-��+����b����S���������s�}<������>J��(��Z 5@���ZJx@�kZr���;����^�\�s����,A����(�`	 m�	�*�d��*��#��( �����^����*�C�TO�F�J"�7�8~�9�/8�0������o�K�,d4�u���K/�����	7b7��Q�2����O�dXY���.��]aG]�������r����~�M�q

Q��b���C9hY�C�h�Q_�q�M��,�r	W���|K#p�e��C�7$ly-�M��K/	[�E!	�Zv��ZY
�r�q�r���A��[0 �a�#����Hb���
>b2?��u���+��C�B���P�%�������s��?��:��0`�~��I���"���	���>�[�B9XGcoc��tJ�XN
h�py����{������%	�-�
��
���+�i��J��n	���y�j� 8!����'���Hh��A{@�`N	F�i�>��^����6�B�����5,)��~�9|����(�VZ���Cm<Z��oQfR@�`�w	m?"X����V�rp�[E����A��<�9l0����S|t������h�61��x	��8#+�p�"�v#���^k�_�>�FtU!�i^��A����!��&�Su�	�-��`�����b����
�T&�]��}F�p�*��{�X�M]=x-���"��Kn���~)'E*����7���6�x�����x0U~[V��z�G��9�L�$,`X���l��������^,���h����H�Wb��z�����2��k9h�!��u	4_>�(K�,*�����m����e��������"`�Xt(�gFwQ�o	 Y�p�i�B����|�2����0�����zX��HO:��p`�tq���������4�h����0p��u���[�X>�(�-��0V|.$4�0	����~�w��1�7��Vp_�������E�;_�F���M�����x"��]	4x�=���.(��n$����j�k�)di��#��(L��l�vd~�Q��x ��tU����L���T���E��C����=�/���&v���s���s���{b@CDh���N-����r��{g���f�-I���z��=B��s����;'�F�=#��2Z���A/<��%�����A�)�����e����Mh����S��h#�oLt����27�o������g�	+<�!!�`?7,�Y�!�Z\?8�{��$�o�*_h`���3�w��8��j�U���S0��D����N
����!����%7
�
���0��`�����?� ��29�1�;�p�`�����=��&L�����n��<�|����0��p������.��5��>���'_B�N�m�����/�G����w�]p�����;��&YQ6W		44����V�0h�$Y��m�0��O,������>i��'��]`��ZN�/C
b��6xpJ�����]�����0f����.7^����8l����������p5q�=����h���S��W_��	u}���d"���ah�,�f�s�gu	��Y���|��#������<����C��}0�:����\�"���<���w��<\���U[ ��V���,�M���?�A���y?�G���Q�P�zj�l�?����+QI�% -+[�]A���~�	��������-H��l	4hg�-���]K%��ij��#��~��u0n���p{��?� �K$  ��(ow��	���� ���	wx ���Xn	m�m���C�^R�"NA��
rWBZ�����^������7���H��@`B��A[>� �'���^	�M�'��e	U,�mjIp���C�O���_� ��I)4h�*c%����I���B�3��}������3��i3�1D{/�A5�s��
{�g�D�[C�_���p)��]���I�����
��D������JEt1eC ��5$�C�!=�J(!����jb��hh/��	�ji$�.�����	,F�$�?0bR'L��	����m^{E~/��+�<��|c��rACl&,Q2�.?�@�B����"���M
d�&u4��7���)��Sw���T���H��j1����_72.�V5$4�q��I��1�
:6������j<^?�7�����
�:��rE��xpeW��Nh�Y�&l
;���Y�[�<\��b�)8:�
W#�'���L�1��8�JIH
hV���u��1�Z�[��+.�KI�2�����=�	���������|g�;��u*#��-z:|�K@�3jT�W���c���$���'���%�MS�
>~�5������zC�O�	|eC���|���$���K���w�!��`���$R\�D���h�������P�^Rj����!
�^���k��N���\ @�1�{��y+���X"\�B=A�wBp`������$��]������2�&�!7�K��y��v��3��C/	K$4����d^I���
���GV=��h��FW��+��s�O?��*#x�o7j+�e�o�-��T
�����!�
���4D�J����A��?{g������
*"���������s��M7gl����9gLg;��gw��b������0��A����.��=w�����=�E*4\;��|�a�u��'?h,��5{W~��l�w~���Wx�~��N�F�A������>��6
���A(���cq �����=���Z$���{@?|��D�v������0��"�t9�t@_��P��m��`�����a�5��H
���	o��v����~}���8p��
������0no$���?�@�P���Px��t��������%�`n`�.\�`� *@,e����3���0��!�0x�$�E*_��<�7��1��g���oh�����J���#����X�$��)o�
U��6n�p� �a���H%�JE�H�"��D1k+	R���F���A�j�i
o����
�x&�<q���Je�������zS����P|��m'��PJ4$�����v���J)�o�����Q������]xW�(�0��E*'h�g�	�����
��4�|f�������J��b^��Y�����'���:����V��$0�����{/^q-��k��
��?b?U�J���I��^0�_]���)a����
�BuA��
h���~��2�b<��4B���<�O�Duj�#������"e���TQ(�E�!|,!YM*��GJ!t�E�"��s��P_���d]�
 t�E�V�a!7b���+.�M��A��5,��s�M�"�q����!��otB���PqHJ��q���y�S*@H��uC��M7]yC*��1TQ��!�2��7�"e�<�@*L���������y
4��q4��8��DI�S�B������0����4!��/\~hp�P����Y���2~$��)T��D�\�?N�x87�Y����Tw����&������!������q;>��M��u�S��<���O�#�������.7b�J�m�I�A�5vmL(��!����O ���������Q?���DH
h�5�D�!�������@X�����mQ������0�F59'.�p	U8���g�$!Xv���8o&��M��,�9]
IqS����s	3�#H'.^�����o��T2J
�8��p=!vq���R�@�IDL>t�\7��D7.#��9�Wp�A���n$����j!,�I.*��=�� �Dx��X���x�e���q����cTex�B���	h��J��@��7�SX��	���=�I���5��m�7��}�B�?������G��rN
A���myW
5�������%��_���G�3���w�,_�����T��Y�1<
���*�fN�A�I���<x��Z6���8\�@@

�s9����V������}�%��*�A�U�OOh0(��BC; �����[a!TQ����� J��C~������G����|qh��rC��R+��J
�����=-M��"�������(��'*��c��R������
��s���.��X�	��p���C�?�R�E��>�A������Q�D=�� ����C\�;�:��\D�n�\�JMx����r".6
w��#��!��<�[
��*\	���c�p9qj���P��/�f��5�`a[��N4L�Kh���J+u��-_�������f��AK[/��.2�� �)����N�]H `��)���4\�R�m��*I����z"������<������z9�����o4�y��������3�s���}�~K�o@���$�p��m��o�FHT:3�����-�l	uL?�����������]*>��
�a���@HA���D�R��8��b�L+�� T�Vx��I.'��i����|�4$�Q(A�b��M�f����$(���.	2���9���<a�#��H��:�U��|�d;&�8<:S��oJR�E���V<u
���M�r�o�E��]R�A*)�<"�0������hp����8��A�,���L��s��c�P@�)B%��N����X��3��J�L#\N�LY+�H!���?m������pw �������~	�����u���m%� �#�������@�k0A(D�q�Je������9�r����8l�A��'����^��tV_/����+�'�-�o�uC���-F&�I�Q	&����O�������
�S��{L��R���I!%8 a��#a���m� � �1�[�(VN���
n)������xB��hkj@�^�ZI*Kp��yo��~����nig~���"�4��!����,#��x^��2�n��2�����;�-��g�vU���2���q�|��h<��C�j�(e�� L�i�[�b�Z"��������<}/����d$F�5�-����C��z�v6�*�T#(1�������.�_��w����e�86����1�'��/�D&�}���
+����
b{�Y��T�����u��i�	4,��O_+G�A�)J�������e�d�
EZ.'JVi�25;���A���&n���@��;�� IDAT��.��?���>��
b���r0��V���#���������_�J��	8\������/5����4��mH�@R�A(6�$�p���e�4����'�w�Q�|7�5�_���	�;�|��%��v'U����(4$�y���XKW:��I2���Q�� ��o��+G����	��.b;p��X26��
��H�O�(���h��;t�r,|^����6
��n�(4�gY��P�VS��=��"����Lk^D���Q�r��b�����d���+�	�j�U@�9���0zX�7�D���� ��}5
����-	'�:b��}�]��*")��m����6�<K�N�,W(5���(?��	A�sJ��N-M������!��]�/'3@CU�����o��P��f"	h(��}=�8�Gn�6._�V!��*A���4��	u��q���;���v%����A��z-�-�z���@��'w���MX�S7�38��n(�t(����^N������x3[W���f='����y��Gcj=GTyr&N�:����9�m�7x��V1�d�����}�����`_�C<8�}

�V?���]��+��m�.����j�=�j	�F��-�c$���X��&<�x� �Sf<"�*�"0 � ��M���h�NUq���+>@�UX��@	CT&l��by��*��
�
���� �W��D
�c�
����������\(T�_���)�]�6XL��z~�A�h�Pw��B�O�B�S(�:DJ����e�r����.'��C�jU�x&�)�]��G���<�jI�E--�9]y������O	4|���T�P�&�����CI�7	hm^M���r�X�
;	�#��F�b��m��I�mS
�E����6��D�u�
���D_*]7��%��(C���>=�2GR�A���V�
����<{E�!g���J�� Tt���Cb=x{�@�y��t'!�����PD���Qh��q�_��#7^���r�B@��G�}E4��i��E�Pp���1���^+A��|M]�=������ZC]����yu�,����BU
����8|O*GD
��>U%x�@�-{�
��"�(������e	� �}

����5����B�$t�G�M��e����5�@I�K����}t� X�7�*�	���^����[�*"��#���UB�
�P��*Tr.<��/<�� �x�n94@A���a�IE�$�!��?Q�����G��6G�Uw���J����� ���[������HG� �a�	B�4:��M�z�R��6��3������t�R� TN?~�Jt�T��-�pNM�:�/�[����9��N����J%��|#��

��AQ�-��A���zC7����


9�>��(��}O�Y��������E�-U��\ 
���&��M��>p�"	)�  ��@u�j!��;7V�ss�\��m����y+v�
�J�W�����QS�&;����B�~����	��JTR����D����`>�KJ������(�_�Q�V;q���%�1h�Z��B����(*4U�������0\�1j�\�
:�T���|<]W�k��,����ThHbrX��s_	p�!3�m����.oN��-���xa�}�>��Z�������{a7�7UT��L��M(*���M�&���B�!���D�O������s*�\)9Ou���
���S(8����2����7�QdBB
���o#�l�FD?��@��Z�h��C��
w���sK��J����$����y6����||���N��C�S*4��[�Z�!���j�Th(����7	�J��+	N��]��(X���}����T���y��rP�����
��,���	9|��.'^������_�:��5�j_`2�4xR�{����%�p�P������;���,�Qh�k}~#�Cz�
-�J���?J����K3�q��a`B7nAt���J�����t'!� �p[�'$
B!A	�^�}����Y�q����vc�K?��D�N����8���EThu���{�K��Q��������F�J��
�PNHR�H	4��}�LD�T�m�xm�Wi�Eg�AY��hX�V�+?�y���{�v"��)�Q��+��b��^��m����vu
Z	dV�a�1X�[$�L:M$Ju��B��t��#�Jo*4��8�8Q�a�7�

TI0i;��y��%U{:������k�	E����$����2��$��������!�4$�hu@����,S�G��R����B��

�f=vp-o)��
%�	H����#�������B�_R9!	h60&��j����V��E�n�j^?+�Q	���#���*�
g�\��|*4�������D<����`������7�)����o+4���W>�$�"��2hQ������S*m���F���m��a�g|�r]H��T�i7�$+4��]P�T���
������`�����+��3�1iGWNK&K�F�Q�y���8�M���xR��� �&B���&U
���'~qTU��.!.S%L�oF�U5=���|G�A��y���K��TI���?���  ����%��?�*:03�k\���D�&p?BC�-��r5���$h�A��s�1hWC{/G�w���"�K9]��B(4L���Au��R����cx�8���Vb�����j�^>s�B�:*4��:Ci��(�G��U�Q�h(X�.�'�Q�������1�@�S�^tQ��;P����s��8YThhW�����bgO�������4���%	J=E���8P��5�~�2UQt��TD��s�s.��T"�������R
'/I�
B��NQ�6�	�wo����tai%���a����qAG��o8M��f$�h�z��:�P��u�"1�GbL�!}++@C���E����D������K7�m�b��}��\%�9�������nt9�H����b��~p������6���{�xhH��R*4,X���aanJ�b>��'_��L-M���!�T��h��
v�
6�������^�07��������aE�B�t:�j;P7���.�`�����4��x;(@C��Rr?���#m����!�)=�g���=5h�����4�1Z7u�|&�����o�>,���OnV���G6��s���G�
�5}d%\Ho[8���Gr�H/T*�p_�
NSw����y#R��*�yX�����xM�8�g��x�SOjk������Ap<��-����t?q�n�H����^�bH:(7���O�#���u������w�c9n�WOy�!�����F��^r2Q��}@CQ++|I7��q{���t{!�@T�/"�2��pq�.T	,���O�_�D9���#�G�#�V5�44-[�q�������������j<l�����	g=HW�<�	a[��w�@��K��(.�^������9�3I��@�����d�"S�d����L
�*S�4Z<Z��7��7	����wx�V����e�t��������mp�x��M]y�����jh�}�Mr9!\�E�9�c]��h�J��	F��[S������/�M��s�	6���HD�)��R����'�����=o]��If��h* D�_�4B%@��0h7�����EE]������D@���/uKu��
A�
��RB�.H����[o">��(����`C�-5���(��`��<]V�[sD�nA�/���

ztk&�h���Ps0T����gs���q�jx �"�2!\-��]*IW�n��jS�����!\`�p�n%"��?9���

�TR��+�H@��dz�	l�FC�J�����t�O�	M������"]J��x�K���p	BW�E�y�!���
��*�|D���X���hJ�g!��[�,�zgF���u�w�s��;

�m�m�x~�o�y�'?������{��}���CJ���hp���B��3r�Y�F��@z��"�r����$�@)zM3���������I7���-�6�2C���-�M��t�A  �U-G���)�B������~}Sl��Xw�Va�=�C����*}c	�U����%<W����{]Q���P�sfw"���n��� h0�R���;�{T:
��&����E@C��<0��l��TnhY�:�-�G�'�����?KCC^�����c����z��chAWG���.+���9M�����.���:f5���� �`���g���� D��1�:@�dH".�A��m���MW������{�C����|�[	���f�-=�F�b#5�<8��jH���������������^���t�]E\P�@�pk~��?�x����,��.h���c���"����r�PP�d��������i;�v@(������	���^�v}��P���)"��3��Y���~��	A
^h#��-��h�M��0�;,�W�m�A�������y���
��	����vr��[�N�bps;LX��F�i)4�Ft3�AE)��KaB�(	h0�P��\�,�	�C��c��S*.$d	����B��W���p�G���A����(:����������mp�@�=���n,b��B��(�y�R�8��h��^yh.1b9F�5����vdg<�|�{��>�(�8:ByAK�������&
O���C�_tQ��p	P�>�����g�����(B������py�tB�����sW��n*��kjS�`Cs�hpn�-U&�l]�@/�����T�s���H�o+4=�+��B���N7sX�Ytk��u���U)�N8�d�^��?�

1�u~�w	��tq�������Ip@�y�VJ�@( |Uf�\���&��

BU@�|"�-�H7��b�w����<��UT7�wq�����.f�^�L����R�@|����n�����k�	�v� �1�me@�	���*.+�#��0~�G���C�"!@�*B�d�_��,��i��o���_l�H��p��e��6CJ�A�y���\.���{B!b-]e����t'�N"��Y�>���*<#�`�g�R6EQ��B���of(X���Iw��Q���";�$1�_�c���S�[��.�A�}��5����p:p���k����=��9�����;��O��	��I���9���Z�/�yr�J
����Z!t?���}1n
w�O=`�}�����#�6�je�RB����������[�kEBo� =��6�Aj@�����rC|X0�P5�m�f�L�R���B��y��W�������r��|��$�zV�]���c7/��"Y��eu
��A�t�pn�)�����A�ZS�}�T0j��q�!�X3��T��b�PB���n��(*LD�#\��-�&��	���O��4^L�N��� ����D�+_>7�w�w��e	l�BY���"�2c*H�R
C�Xy�*��N���e��F��\�z���n��}G<���	��Wm�gD�!;�7��L:q�e[D]�b�~E�w��p=�����W���6�!�+�q��MD����+�j����t���3s(SD���'
"�5�]PX<�Q
h�O�Fw"8A($"$"C["(<A��.�"0��� ����T3�~L���������p��|�.|������������8��0�q���'#8%C_W�	X��b��_D�\g�F&�2]^��e�">�b��H���>�h_��5x�S�^j�^?r���lK8��
�NJ��rE���r4�qb�����S�"\�}��U��������]wq�����V�?�=�t#�u��_+4��}��{��^=q���Q�.�o�[�Z��q`	
�p�
���!5���YU��+/��]�%)4|����?��M[c��3�����Ez

Qw<$p �����4�!d/�����+�1����5�D0\
Q��~���!�^\�\�E�3��V����
pE���2_�
�!t�a*2R��*�Q�C!Y���-f�����E���z����X���
�������C��S�����P�����4�?�)@C���J�K�n�*���4g	:�k�������]���\���}@��s?���G������V�����t��Mp��=���W�_�x�&����p��RBI�W���_P%F�24d���!m�*@C�����l�
��Y�)���)]N�'G%��[ 3@C����I�Y�q|$o����I
Y��}i����u��[�K
h�-�K��
��wj@�:���y�4|������.'2��p�!\c�C�I�*2�������DV�Oh�J��5mj.'rk}�Y��
�,�C����Df�"�#��|�J��I����*�tI.'�%����
h��J�p�)]Nd�h
��@<l��[������Z��\;���F]�W*�E�����A��A����1�B��8_���<�	`D�NT�J+�Ru<���������wnK���Df��������^��
�����S2�_�t�
�(�C��>�A�:)@C�VR��<4��H��>>(@C�y�
��
��
��Q�)���
��^{*��fhHtS�� �9$�F��p0�Y%Q�\�A�lP5f�
7�4d�f1�"�$]l	)����_�b�2P!�4�`�4�(@C���WS�h�}�(����H�r������
��-fM7Su��P���e_�p��JQ7���
!���l�2U��������J�uu<���C2f=h���R�V���m�
��+hP���{�C����4|�����A2�]dTh������(����@C��O��w����������h��R����OI�qX@Qh�8����o��4���
��y+*@�4d����]p�;SS�Y�g!"�n���!�=v��y�
��w��4��	u��q��p��<
����RA����
��v�*f�
�����!��II�a(@C�M�Fh���������x�J+>��!c�@2f����!u�)

��+hP���{�C���@z@��M��C�9f�pFA3�4������/`kk�U�Ue(@C�N����w������@���������TV�%Z�r0���h����t��h�e��8'����%�s�]���!�hkk�����~���C�qNSSS��O!�������d)3�����&����+�b��S/�a���d�������j�����M?Z��~��7.�Y���X��EK�y��+�_������j!($������9�	�]8�R����T*\M�|]����p�s��{�� )�����������{j�:qkM�]AY�������_���W�$�c}2:����99�EiX����9�~SM�FE�Sfv���8�B��}?u7��uA89����Y�����[����~u3���T{,L�UJ����B�
��=*hP��^%�b�i����Y����
���O��m�L���j~����(HE�K�G^�#��w�|�+��!$�r���������E�S�s��V�s�����??�o�z.��W�������_W�s������S�s9���
e���\~�^}�C��4JW��^�������(uP,�+-�
�����R�x�[@��
��)������-�@~�`R���%�sK��������[~���z.��we=�?o�)�9e=�[��9Ue=���7e=�?�7��7�o�uN��9������Y���Z@)�(�����B�2E��M��rG�^����M����"��`hh==��Tm��5��\����Z��+��������]O�^���:�$�r���_��x������������6��������fC��<�e�����{~��rs�����,���������u~���=?��R��k�=��o�z.��s�����������
���H������ IDATu~S�s9�?��>��q�������������Sg���2;���]Qh��'����[@Qh�;�X!�<��V��T!b���Iy#��������������-oC~���_���{���G~�������-��w������_������}�z��[@Y�)�s��l
�����������we?:'FXh�	++e|tP����H�&��)��V��TY@*H�����K~���x�� ����zNY���YI}�������?�������\����z������0�HN�u~���]T�����*.V�����j~ [��������!�<me<�- �&e�wF(���C, �S����l���
������������\�g���C~��������?�_�A������*�9e=��^��rP�s�����c�V[��+�=k=H��
�����X���@z@���?�/�7KV�bRa����GR������BGG'��Z:}�����Rfn�D�`�L/.>��y���-������T�y�����(.���I7��!&&&�w='��Zc'�B�s�(Y�8�AKK+������T�������/���������T�TD'��-���(;��u��.}�]Uo��uGB�j�Q�������17���>�nS����[h.����f�m��[���v�[��������|������b�6��K���[�~��[�afj=��Rr6A1������R��9��T�I�w�0�����j���Z�[" �����c~������'���,����w�|u@/M��k=�wDxj�����G������U���-G~7�3���=��,����\��k�9����n#����M����\�&�p��q�����g��:��{/89�:�s��j�_�d�6Y�j-�;v9�}����ruq1*<M�����������L�^	/��?gp_L���NMP���:���y(@�4�D�S�����R�Gg��������7�i�����	�a��GF���?����h�\_r����S����AUZ�I��nM��j��a�����/�����X���������y��3�FE�h�W*������-~��"Z�����E��#.���rT1�U�����_��J��pzb�3g��=�-�b��?;�h�;��G��x�x�i�qNd�!9[��c���9��vf5��U �Z��j6�6���-|sFn���^~�s�->��Y%���u�9��5�6����)+/�x�x�'W�����w`��4^A��89!;���yWs����� �\��n����~�5���m�>G�n����;N�h����Ku\q8�/��Y����G����
8Z�-����������>h�3S�4(@Cf�MF�(@CF-��W,@(@C��
��
��VhP�J��
�WZ��A}��HN
��ke=�4d��
��h3h�x���
�����A���
��I�X
�����/�4d�m3��4d�r9�N���4(@C���i��
���!�m���y9�B,K@�/����/>�������v���V�i��o�|���t���s�����yd6�_���F�����GN�����:~D�Y�Ls����:$���9��K������.�X /
��G�l=��/I�(4|\87M��B��~)�D"(,
e����[�:������`���<��|�N<mP=��x��QY�W�@C�Q?���_�|�\��>��9?l�.,��}���2�E!To��V����2�P]@��];c���*�n����w�i`����RZ�
�T��Ha+��h`��I9|�.��hMc����@��#s��� ���-����r��"N[?*S�2�^�@��qa�)���mE�j�c��IjU�0�3�I�MJ��a�����5�#�G]k���k����j�2~+Qv
�8��X����X2&cc���Z��M����
��+��f��}�[�A���0�Y:��d�M���r���I��

e&���WQ�sg<�|!w3�����T�����d�P���T��'�ynb`����f�n����#�6����J��M��}��nS�����>���'����lM��kug�����L����jU7���A2}�j��l���Y�%�@�����;1�V'|{ty��[��"S�R+�cPh�3��k���|�3}#�������4���7����Y��ER�>U�/4�%�4�-8�A�iK`g��,$��@C����42B�7��	;�Y�����bd�����r5L:u�����cZ�����t~I	�	4X�k�������pmf�e[3U?u*4�����~�.���-A�f�e�N=�"*2e*t�P���wnn���K4�?:�T�>z���ZU7��l��[�+j�����3���d��76����2e�bQ��+N��.�������<��o����
4��:���^-�a���2]��	��B�S�W�������9;�����Q��X\]1.�:��P�Z�������s�k��A~�������F{D����I���W���M&������L\��������+�����*�BT2S�����_r�(���C@��3c��a�N��_�����#�<����/�_��7��
4<�����[P�Jy	4�<wm��u��TA����D�b<�-� ��rx?����,\Nw2�<�X �
q�	��5U���phP�Ly&Rn�P������������M�?f{��07������g���uF�oT;�V���jk��!�1~���&I5�:�-]t��Wl�9l��@C�.����Y<������A@CEnBV�/�����T]u
;�C�msD�W�x�r9��Gfch�	�,���tI��hzu
�����������@��������I��TgP7� ������� 3`��4$�� d�&�v�
6�u�ASWe�����NC�
����@�y|����hpt�A��z�v3"W
�{Z`���eQ�W�@C���X��>��)0A����Uk��O����t��1�YW| �2�Y,R���2��nL�uA��]h��z�//6���e�:�����p�+!aq�h�}c3
�V�������q��<�4�Z���N��@��(X�*^<�+��������"����u
%�TB){g\�s0�
�^��}�F��>
u
�E+��Xe�\?�+���}g����H�S�_�E�AKK-�~������SFP�}���ZB��\���A%3��H���%��������Va����N�l�K�)
#?������������PB���AtL4F
�}=L��<��m����������B_O�����[���0��E�~�����<z��\�.^��u�C@
hH
i�o���v���I�X���v��/g|�t'S�S�2
4D>�G�	.x�i�LzE������	�a�+��}k$��x��i�r'����x8��ELT|n��,�V��Z��#n����
���%��4��4�@��u�o�����0=�CV={�5-��y#C�qc�,���-�UZ���Q�7�F�&�al��������Y��;:CKK3�_@�Bf���<N�x�U�oa�������c�eX����.�0}�i4rv@9Gk<y���JA����n��9_4���&��c�P�8hjj`�����T(��� ����'�a���������^A�b��<>l8rG�x���5agc�x������l�
O?4�VF�:�y�#��8-��N�OQ�j���M�}�'��@\��_<E�>c!*i��=ej����1��mk
z�&006��������Q��
��u��#l�3�a!��y�?������Y
K�uF�i+�����w�~C�j�<��x��w!���Zb��~(\��T�x��lKT���md�b����R#WTj�!/���u�W��/����68�|��NYg������������?���k���@��P�;��6���[w���5�3d��`��#�Y�:,G����}'bx��e��X�|�T����.^A��D���
q��u�t�;B�d1D�<'�J:�K >,Q����eD�����h�GFB�xQ�������C���h�m
�#���kY[A�~��~��q;��&�����9��C��34�,�u74�M����d~��x��k��/a�����
���k��c6���0.b�����w�h�r� ({��=�R��lj@���[q���,oX���|z^?G��m�����n��w��P��W<� ":.e���>Cq�_���.u?��]El9�O^>d������� D��r�k������l����������=���8h�9�y����23[�k4�?�������}v{`Z�*����}K���45��xp�>0��l�{a��o�Z�K�[��{�����������$����~�o�����3SI��qR����m��5��AE��v4���\8X�������b������X���x�	�������6�v�JWq3��$��g�L{��6��P�H}�k���R�A�c���	<��S�6�M���1u��n<�3�E��6Kh`9��#3+������@�/�,�+k��Z�n+9�_<�>���z���qk��}��Xe�P��
����h��k,V�S6�<B��q������5�}pG*4�{:~9�L��5��RW�Z����p(_���Y������o�d8���&k_���d��E�X�jHO�!��	D�O��o��/U� .��5�p��@����pA�\�F����H8W�@C����p��.C���u�W."����]zBC�!�'�v�B0j�B��b�(�\����S(�
������`���\
���&�B���0(l�g[�#�;�?�,��������S�4*-#��y(�mc������gx��]h��%�m���S�"6$e'����y���

�>9��M���E�\��D���BCY���Tw�����w6�^ab���y���~������<}��-�����;�n�.���A���nGa��oP��z5�zF�s~%�z����ajh)�.��4�(�Wh�����~C�L���6��a��%��
���C',�=I�?�����5����\��V��f�����$Z����������=�h�bcc*�q�]�!����7���?�����<&�ZX����	���FF�x�8����NmZ$��=}>��/R�A�Q��>�mD�6������������9/{h��B������4`]*����OBB��B�1�i��D�[�+�ch�	�Q8�:f$�4h@�����^���3���X��v�w�[���7��0��Z�p�U�6���v���<����	���
�<X���
f�/�������(ce�!U[����~�^=� ��;Xvo�=�>���&��NS���s��!5�g[;p��wA/�F3st+_��z���C�V�5"�|���U�*.'�)�A���?N������:^�~�~h#�#, �������A������D����8�]�����;������>���z�X}�8N=t��F�hs#�v
�����B��m������#71�kym���>�e�`y�����/J�����e�S[�����
��p�PhhX�<u��������#�*�%��:�=�nk������l���S��6�����8�9/=��	{V����8�����sI��{�z8����~Ul/��4���	�:%d6>�n��M�ck���W���
����
���S��5�6��������<��{�e>��z ��;�O����t��A�����`�Z�/_q��;x��;!x�69���st*
���y�&"/_I��w���%��H���z������a1b���q�v����\��9�s�V�o���m�#��3��9���
CC������7B�!d���+^I1�����`��e���&���`�1�/�n�-p�v$�>�����x�����0��k���������9�o���&�v���_,D>�8���>&������'fs���T<(\�*���S�5j�=.�^ o�9�n������#�C��QE���i07/����4��K�O����`X�8�r���t?�����uh�:C���]*4Y���E�i0W.,Ch��\3�%�p���DG 4�9���X�1�����HDE��t�6R����Y�G�RMU��"Rj@���5
���G������Mp��a�q�
�������y�����s<nZ#�n��B<�����c�O���L��^x^��m������5��pg��@�U�BC��*7����C��`bm'��c���^�)�����?�st<��D���J#DG�!"��Th�7�@��_���i�?p:�����|�/$�Q#�4�Yap���q��>��S�l�B�sl84�j�����|��l��<���|,_��0��|<{��8VX�u��m8�������|z����M��BC�O��p����S���]�
p��'n�����4�g��r">8�����q��^��u�k|]�s�>�/��X9~�*
mM����^����?�Ih�5�B�^���~)������R��R��(�+z�cbo����(�a�Nn������"��z����o�
���}#��&�X�"5;�`���[���� ��������
���~4-sO4��LB�.��g(�uz�/�E�����k#s<>�Y�W�
T�Z���S}�`�u�d���X�����3w�i9�i�	G��W����>K��W35�����F�Z�'�������'sm:�&��q{;��TS��P>r
\�j����(Q��t�p�n���4�=z�=/��r/W����B��G�.i�Z�����&�Y���U@"7]�~���59��
����rE��t����s@���'Q��
��c����nX�j#���]���s��p*�H�A�v�D��-1l�4,�mr�"B�
p��M|��3�����(��r�`6�<(���C�p��mB�R����S��������b�_k0v���~�Jyy��DC�^:5� ���?�
4D�'���0�l�1������#�����qbA(�f� �8�<��}U]��P��>��
M?(@C�6�K1r���6��k��F6����P�uQx��B|L���
������u85��'Q�BS�Z6�����N�(r����oT
�{�����q��?
Y� �!,�p�U�n^a1�q�>D�Y.��_����go
M�'��?tB����R�a����=m'V�G��DRZ�^�}{������e_�'�?��]�e�6��D�~���6s�Wg��0�WM��D�#e.������=���hUM�j����!�o��CaS��^zC(�8�����m�������������������(n�
�������}�g���/��f�����N����b�#���n�p��?c������������:9'6/@h�zLX�����u�oX�]o����&�%�" Q�Ec����8*5���k~�@�1o����D�wj�"4��9Nn�S�Cg��_c;I`�	7Y}��kj]H�3#�m��a�R�Y�sE�re���-��).[	n

����{��r%�{�����SWL����!-�!l�����[4L	�<�A|P0�\j!b�^~��@���'�B�I}D_���q`@�N9'h��!l�:���+��S�<bn�v�������X�GO@���Wo��Ch��n�2��}��5#D��������zuA��c�a�X�K�p�N��[�U��r9�v�P��J� �;�����7�{��m��]��|aX8�7�U
�
?l�Q�T�
xK��wy#j;5F�"�	|��{�����x��z�Z`��Y�Y(��1e�	&��"l�L�6���M+w�_~A������t��9���K����i��U��MI�)��7|�I������x��)!����T���)�S��g��k�Q�yZo�7�R���C�B����TvhB��kT<����~	[�������"��	,T+��o,�@C�Z���W��6��sV&�i��� IDATq�����s��/Z.��C`g�[�����C���yq,?N����W�D�,�s	7��p.�L/Vt�9�`���W�+����f�e�S	4t�5���AP!L
�=w��+7Y�0�W�5����� ����Q�� -���������	�P�A�&`�z�t9�yq<k'�~�A���u���X{��X;t�^,��&<jJ�`���Q�U/\��
�_���
�����8"�k5!�pa�J�1
Z<:�d:^>����v�|J�h�B<t
 �`i[���C��t/��	�&���v���X2���6����Y��{�����'�A��3t��D���0�k	-SS������u#����&A4�W�
��<����_"��i�W�I�!2J������@���0j����N1B��aP�Z����P}e+�{F����
C����|�#\z�
?����+�~��#��c��3���Y��MT
�{"���\���E���������4�5��P��j��{�L���?��{����4�n�<�ops��V���3m=?m��U{�
��[����X��w
���A�M'��@��ia	 m3M���0����2�<��Tgv�_���zc��i�:�1�iZ��m�~��@�J���������wf�J�a5���
`����������L&�1��h04���A����U+����e��^��J���X�%P�xx��g>1��+�	�e�{v1���_����j��~�-���%�����a`o���=�8�%� �(b��=m,Y��}-�jf"A����G�.��.�_��2�Z����0�(QL��=b�S��q�\4����Oc���H�Ih0%P2��P|��4/����bi�/1t�\1��@���7�m���������7�������D����"�{m]\��;$�}�&��Ov����c���x�a�v�D���;������K�a��i'�HX���;���:��0��n?���?�����S��+�^��&�����K�UC������*A�at���K������S��Fq}��R]���e/��������3��.S���@�;� ��z������� aP�&XE����g�����~>�L��eX0,
����	�i���v�<�v�[����0d��#<W����p?�r]L#d�i��x�R
B�a����*"���h�_7��VJHo��#\�����6��%�h0��/)����*I"I�A0��RO�Ie��������f$�4����7C��
����P!�o#��
���� }
�����D�U������a���^p47G���0j�Ak���UK��&=p&�� ���f*]Z
���9�C�p#1z"���<X��`�W�����HE�����]�![�v.m;���U�a7�7�1�Y�	]�o�B�o0���,�
����I��Fu,�[��&&�Z�Y�^��s7��C����q�T
�
J����.v
�3�-�`���a����F��X�7�8�=#<���
�{"T
=��a!�N�{]
��B������Y<��������I��p��\4m=�q��N�%�`A�OK[=���C	4u�������������j`��/��u�m�Vg���^`����	�<B�f��7���*�����:�rE�����=]J�GE�^�wg7���p��:���@��k�Z�9'%�L�������</W6���5[�>�����a����%D�'�M�P���w��
M?��#>[&�0�~,��g����_������6�:M��������<,��&����`i_���E�B��qA��liK�j��{��)�80�3t�a;�|�
���Q�Vk	4�i�!/�����h@�����e�b'5�����ekb����Y�����iC7a���(`Y�k���]SQ�J'<�u�c����W,�2V\�|�n*~_;L�^|�~p�|ox��`��%=T�"RZn��������`�\����9��y�h����8�`�A: ��+�V�A��Qt��2�@�/;�@�^B)l�?�_��~���i
�7�U�p�=�*7'8�.c�����0�v ���6� ���g����*�~��Uy��*v����G��k6x�~��E��vZ��g�A�1�pfN�)�R���L��$.�M��� Jr]$@�2�����)vnI`� B_<$ 1	��/�#�rc��l>a/�H����+"y�r3�4�w��j���w�i�*����o����Q�������WO�-2-��w����{,���������A��_A�V?���2���RgN��M�^�rL��V����������n��������DB`8ty�%��#�eis�D<	<����g�k��n��"(@����s��KN$�
�?���7��p�;���p��9����?$�((@��B�J��qSg"�4���L��P7�8@��1o�tf�ulhh ]J/��-�8Rg����Q�$,�
��^�����^�7���N���7,�Q�!.,�Gc�@������Bz�m�A�v#O������X�BC�����5paU���Bo���	�����*AT�R����&����ph����J���������aS�����
�q�c7~pV��_�e��t�L��Q���Tc���-=-Q��
I�"Fw��������'�L�������f���3}��������n82�'.��rCDn^���ypr)�}.���L=m�*W������������`/Q��6V��K?��I���p���m���O\����*�-��i
B��!oP�z�G������%����&���
7*;� 6�}��T^!���A?m�J
�j�r��0���Pt0�,@h�<<���p�����&����������(oW����E��������p���[��tM��#����u&�^*-�sC���	4�Z���eh����m��+���[��=y)v��������8Y�!����3����;�7�*p�p9oW]{�k��K��N���������H.�ZQ�*P����jHh��y����i�����K��*k	���5���������EE���x ����U���2.�b�<C���RYA�$�y+L�m�.V49��%�x,�=:A��a�l��'�7�"!&�-K����"��$<��X�Hh�� E��]2���+T���^�����=�-���� �W�������T5��R=��]�� ��z�Z��iT�-l��4{�$L��{r>Q������<Q�5�����<�7r�����W�I(�����p��q8Qv������"o=�u��,w��(U�<by����~
FgW	/|�m~�<�;��ox���H
h��M���������Y���/��H8����M%�����*i�����$�Q1���k�^��Xs�n�v����nTDQ�������5��^����g/�N�����3���{�����g0�w�-���r��m���qc:l��R�
.��	�������6p��3}0����<27���8����C��R�jhWm�b�(���9H�tZ��1D&�G���x������o�
���xA��X�6a	r`�
,�������:��]0��bi����c�V��v
s9�@�OL���6��\����N)��$���S�]�d}m���p|yv_��rB�6�{����S��f��%8�� ������4���_3����������/��z���� y|x��� H2�N���~s�['vD�E������{\]4��B�������*�'��:��F"j�h�B}��n����;u��r"z�Zh��4��H�|D'J�`_���8!o�����H�&Z��@��P�{�"4��k��G$��z�S�L���F���fx2����!QiE�M�	�?n��?w9QmsS<~���a���tJ-�zt�^���{��U��HHM����D?��X��
L9�s��H�D����J)�M �����W���B+�	��^���49���m^=Fx�{����I�;�V����oUp�������3�l]�H������Xw��UC���R��eO��3���@CyC{Rn��>�)ZV�����b�����B���$������ag�K�h;s����kK"�i\R?`@C:Y�uWliS����&�Usu7T�R���a5To��~<;����6�||S��Tl�x>^P����o&��A��&"�N)����;����
03���e@C�%A�*4�4�^����#����0�l��	����7����8�?�5MlQI����{�������q�>wQ��U-���%qnEJ:��o�.����-��s�I�!�P,�����a8)����bC�|���<����QC~@�&AT�I9F����n�
)6h������X���9{��n%�40��a���H���[g9X0�^�V0�Vs<�>�~`��~�F�
R�yM�Y4h�Z�R�'7$.}]rD�@�4T6.�
�Ww`y0�����.�A�]��*A��I	�SU�*{�9}���@���	^����8R�t����XxP=&7��!�w��(���m|��J�OS��1�{�D_��*���W��C��lQ����2��s�E�=����`g�u�Fp|�{�Ml��R_}����x?b�GE��
����x�*W>Sm��C3��������)R���=�����3�A����}]���\I!����LYA��j���j���yD.%ez?`y���	���^E��l�Uk�	`k�����g!O���_�Xj�A���;y���H���\�6r���z��� �6��LQ�O~@UMk���XI�&&�_7v��Z��>�������j��z�1�
��c+)��R\���V���6�z��"�_�b�NP!`���M��d�'<B�GoRY���=�	L�j@[��
�q���/8V��;�?N�	[uXM*���U��!��W�"��Qe�i8�����2�{�v��
v�PU7�����sl����8H�M����u`j^�+H0��(!?���N��f�,��yj��<F�Y�ptV':�R�6�xx���#���6���hp�>�����cx���������5qhz;����S��[]��m9���W}`@E�S���.�-���C�� 4�
V�Fj�)����p"��\���Djh`i"�y���=�L��!J�h���Ak���$%��7��M��1hfo�G������kks��5wA9Rh������&b��q�hY���p��ftl4��EJL^���"J�h�v4��pwz�������R����O��UV^@�'ZcK�����74"�J�+��6��� c�@�%Z���.��VB���&�zZA@k�VM�C��"�.��h���������m-r-Q�`�lu1���A��)4��@�}��x�m"�u��eU�]�6-G���A���������vpn�Z��"C���x�g�������9%u��5���H��0�p����wC����]��HA"�
�` �$���;{��M�@ ��g�F�YL���+��9?����}R�q���1A�}oQ_���Q|$�������Q��e�)��;F���]�+J�_��h��H��RO��Vy�2�"'
��iA���k	�Z��������!C��D
� ��$#�$����EJ�� ��o�n$�����X��|��=������p;��K�������!�fs�������}G���Z%�73��?���^�����$}�A'b�RCRx�q�������##4,�[6*��.�W
-PT�!�I�ld����Lh�,���@CrI�f� ����S>�S9��i,���P��:sC��A�H���R�e��h(����*K���5��l��*z������c�u�D�-��s��
���A��G�4���t��������lp��80�
`�r���L�!%�\A��n!N�R�������;�R>w9�5���j	u%l'��g�#����X���f5,�:5��2��`���y����#X>�1W�'J�[cW����7�iw�+5�h��������*��#�>1����:���#8@����$��d}��.��pq�~�������)���-C��B���g�a|[8��Sg`��<�$�[�a���C�4��ec�>h&v��y�\������F&��5�P�u��2���CHm��A���`ua@���n^��Vre��#�����di->���;�
��2���,�d��
�������(��&~)Y���
=6m�l���Fu�>y�IB�-������m�� ��J��]N�}H�.H��A'h���s���c��H�
�=�Rf���A�Wl����BC���P��k�BSg��^�+40pB�f5Rs�G���x��H9q��js�"�lA�����	�nB��>�U�8�hpX^�o���'���Vh���Uh`���#1�^jE
�
g@K�.���V�v��E*4����9��0��#�����4.aY�&��_(4����N�G���+4�W����h1��f8�`Z�w,�A�'Q��1����{`4fta��R������7������!�	����0���g�� ?��A������
�b��������5�l;s�N�p���qw,|���@��2Sh�T7	J����������������!�Th�T���$��S���.�Y���A��'�
�HA�V��8t:�Bt")����.��X�~����=�fs�����'4Up�%�~-4��Dw9�jf�����L�!�q������B����/oMrC!K�(��od��_+4\���Im���!\���!R���������k��_�FShxE�MZ��tu��l%����s��{r�5��i�Z�G}�@Rt`�
E	�
�W�R�!���\9s��%�ar/!gl���;h��T��r�)8�BuA����*����f����v;�)>s���_&9��rb%4:�@���A��������_��6��WC��ph�4�����'H%���6H	cR�R�x1�MP^

5�����ga����2U7R�KJG�I?��������/����<A���v���0���&0@���**�����s��f���Br�t
��k�Bbd����_+4����{�����0P����\�a��Y�a�����zo��>���Gb�����T��f�0 �`s���h`ul\������"V���#X���E�ZC����~:h06�%���%DeGEZ��@]��~�z<b���QhP ���f�"<n%�J�>����=�p�+4d���]���
d��3�N�e�~��r����8!hX�)2�`�eP����h�P
�Od�.,����x����he���%;ZA@�I%;�[�j�S�o5S.o��&�8����.�����}h`^	�t���]����B�7

�t�SH������m������k�?:E��xzVSh����9\��DW:�����yg��Q9F�hhInmn�+����p���;<,h���)4��:%�=����\4�e�
L5�
l#���5A�s����D��������v=��|���_+4�'��;��_6We��?��+���]:�F�N�:�zT��s>��;���w������]���O��	9@�
���X�^>��J�D&�-������Sh��o5�HAm@�&\U�)4L;�MH��)=x�\��������{�J�r���}�V�{U�/T �h������w�;�	RH�O�6Ar��t��2H�A�S5��z�(� �!�@g��O�LM���s���]{���R���B�
U*!��u��{;�Rh�Z�Z�
�v;Ay��/�d���B�%d���G�
]�T�IRT ��,��h���,>�5�����G	XV���]U���\��P���A" IDAT�]Op��c'���WRK����K�����J�����Z�|8:R0��>������P�V�hUO���`�k��{<�q������.��In&��B
Q�~�y�� ���>���M���B�`y1W���2)4��g��BC[r�D�	�� #=	�I��%"��BIY�� ��r2hl�����v�hp���_����(xy���-18���'(�(!?��
���T�'l��
9@�v9[86�����pi�����o�
OOoFR��o�ED��#���t$���3��B�ARh`dl���1m�A�\Th[���i$�F�����2����r����������*�k����������g����a��e+4!5QC~@�j� ���=�qE����Mk���3�B�����Z�!7�1��Qh`��X^����vc�����![	S���`?�)^n��i������d�40@A�Ik+ a�+��s�2��K��at(����H�Qiw>B��1��E[+/h`�s�B��C2E��
\(O.'�K�J�O�f�;���v�����@�$�K��ePB��{psIwRh @bEo����mYr��\T�������H���]�4��Y���y�@����R�N'R���F}�*C��#�1�q7E
y
 ec�r	���>?�����#W������x�x7��FH��Iy&hhM*67�J$���N����#w���F4�������N�?2(d�<�?����4���	)��P����[��&���g��M������!Y�K��KI[��
�@�h��P��"X��`
w3��%�j>r�^p+���������W�L.'>�
r>�Y�c����7����C�&��0Z�>}������#�BC~i�	�����
�S��\(��Z��@C��L$��
��k���S�@�Sz���"J����L������}�1�|
40@���d����0-NU��L
�

h|���t*�[+���48�U���lwO%���<�O�u}yD���M#Z��,@C)m��T[����i9i���Y%Yd$e����Qs�+�6<G��5�b�I����sB~@CM��.��5u���r��4�{|�������wi�77w������EUh`n  �6�6�����r.l� ����5z������G��t`� ���H���XZ��N'w���Vrjv]x#�<��r��3��b�\X�:�4l���[Gg��i7���$3����U%Z����w�h���5��K��n��X�kH}�}�	f���
'<�lc�]j�
��A9:!%M�~�������4�T����r��w��v8�B���3����(��-���>��p��?�E���J"���R���h7r��F����]�����d�cIR7�N
7"���t�+��#��b_
��@]����`jS�WO��ks\�����
�M;�r3ia���1�+W�����ro���$�6.�P����`���h�:r�����p���\^LD
�%��5�`B���������4��}�Qh`�������f��l�e��mkL9r�g����d��K���������Nm���������[���	�k� ����\�!3�Rn�IZ�M��>�%@�����h�}/[�N�T�."2�c���d��,��H9C����4)9(�uE�6����)�oq���n�
��(��	���@/�_)4�Sh�
�4I�f�d�A�y�J3� Ge�������_�d�;7����������bF�R�9���� h���f��7i��}��T*��=I���JJT",�T�4G�F��_�������������Z�������������9<~{��3����z����M�l��y��D�!���\g��������J���Lu�c��e�����	�F"G��0-v��	&����
Z�RD�J�Er�_+4�:�" B�N��%)�?�����K��zl����[t��Po�#?�_���mUc�r������q�Q]`y�B�1W
���y���I-\����g@C��s.�M�&p��
�
s	��j�u�~�3��p4��}~}�f�_O��D��)�(�qUE-~��'>Wh�pe��N����!������+�<\�7VY`@���2T�5���n�>DjC��n��1"�\Sj�'�����;m$�" �����76+h`n��]
yZ�e��1�Z
��4T%��vt����g���[��8�������#f���Y���+t��i)��G��C���r���f����h����8��P�������Me8�m���{'�Q�m�
�����]��%�S�������e����Y����M��Ba@C������_�"���\�!=8	���7�_��.R_<�Z[R�!��4�>+36
v����Wp��$�n�����~�������	T7'���S��g ���}�K�� ���(��+���+[���P�`1�	�N�����u��r���:�Z�N�J!h����gm�%g��h`��
UAjA{}`;�:�������WQ����Lr�H�U������.w<�uV#*���$�Zt
t��"p�KX��gc�Vx*h�b�w�^|w��V��&J�B�������P����e�Th���7��a@CM�f\	���NM#w�	<���?�����8�m�;C��g�zr���d\�<5R�`�+v\Z�!-��g5�N�27_
Gom�n-��sAq��B����ck�(��j;�c#��)qy����+��_���#��=�;�KM�D��G.'��B��P#� �N"�=�������M�����������Q*�zG-�Gf@WG�� E�����7H�A�����'s)1�����B�V�PS����PhI�)>Wh`@C=:�lA�L, 55�%	v_���phP��U�%����U$zv��������8���+4����G3s�D�ks<vcs��h`aB�N��M�tz���	�i$�<��M����5��PZl��
�?�{�����&?��e��3k`M>�VmA��4��s]��(���0����,-�_v��>�WFLJj����/�Qz��'��y����Z\uq����]�����4���c�sM>?>���`�{;��w��K�s^a�x����(@C��&>[5�N
e���!G�A���i�������{\}��-s�/0��1����D�{���U:�K	�(2h���HEA�����c��_����#���nOjI��cf�.|3$�|�37_
��]�n-���P]'I����-];F0Dv���c�V�$�x���\}a8�O�k����P'%����an,����wI1��l�A�����:�arW�4|z��Xy�4�G��3���Q~!?�mc�L�/�F��S���4(,�3��{R�9��������HV�d��Z��!�_f�;��� �!����f����w��t?�\�!=(����y�r-W�bi>ny+K�=�8H 5Sc`J	�EDFDWKc�
��8z����s�66D���Q#�p�<d����D*GJ�\���C���7@Sr`n(d�-F��h��x�<���VMb@�LMy=���O��.��
YRp��g&��)/_�>��Sh��~���P��7�R��eJ.����L��Q����+��@�7�	c�
};h���L�����Tk4�����pR�IH�B��J�s:�)���)4�������������.�r��Z��6/�w����G��h�qe�!R�cP��dr���P�k� >.�+3��^C��;�62�Rk("�t3Sb0���]�Cq��cr5��`c���?{����I�?q��r��4/����K��� ���������|�������������~~������T�?�x�}��n�X�:��$�@���0�������.[�)44���J����b�5�P�\D���#��\Q����O���s���@�\���{����S��f�I��.�S��5.���B��
�����3_H�ys�����r�z���
r�����y^�*���'>����''7p�����u�����e�_[�I{�����8{{[.�����r4Tu���c��?0��lr71���)4����l^��gq���aQ��^��������0�u*W��ww�}��XE*}_�����ZB��L�5�;Sv���
^���F�F��_G`��&Rc���->���P@^

�t0*�p�G�Z�C�`��V�����O���J�i}��?�����f���hn��ii�E����� g��I���%8v�V���}��;r����S8|�8p��u&<wN�e3����.@rT(�U���
j��ED��`�'�2�q5w8��$)��8���N�W�@����6`9��=vm�@��a����"���h��~����Cc�������z���iV�3������lZ���y+��4S�i�����o�%�g�������l��L���x����]����*X��_�.hp��FF�4?����<r}6 h04p@���S����*X7���K���8u��01����G�R��� r_��<|�2^�!����5�:V�0��4|JJC�IZ���di����>a�Y�f*�i08�X�L%�B������/h��vH�����R�F*�@��mP��
jW�>���
�#��	l�i� y�5[��\6;���U��J^@ChX8v:�]U������L������y�.V�a��U4�T��-Xpsu�s%����By��E����r9�=�%�4�Z�W���\N���
E�'��E�Q�=��������r�8��k��8���� ��$���2
��~�
�U�$��� Iu���|�r�G�b�s9!�2JC�
��>�ca@Ci������v=?R�����W��~�r�{�V�����S���4GE�����g�#�+��kg0����y����
�
��_A�
�������.'��������O����wi�#?���]GA����DQ�+?����g���q��� �|�� �����������
�Q^^y�4�D��PV_���"��-�R	4�viB,��-@C���tr@�N*+�I��$i@�����h�=����(9	@CQ���q���6��l�	@C��NI����-
��<h�N���Q��e��
�s�f��DF}���4������Ss�����4��h�}%�t��[s@C�7Ah(~��I��u���4�b%!�`	��4H�M�
�����h���&
�g[I��,
%e{h()KY�4����� n�
@C�E�A�-K��	@���,+@��� h�Q����
���xr���Q��

�����*@��XM��G����
@��,�>�P�6g	��]]]q�����l*����%���Qb�
,P�, 
���	@�4��Z��X�hq��h�*(�4���E�I�b��+
E��4d�L��vJ2�4�kmh��	@�hv%�4�b���#
�g���Y��r%�N
��4@C�<��"
����m,��A������
�������*������(����>}��QVV.0��:����X���L�A2���h����f!e���U���������2R���w�y��IIIPRR����O�n����LO&������h����D/Uq^[�!5+O��_GFF�_��u4L��Ic����l����lN���	���O���He���@NN222"���H�I�*�����-TB"|=�i�+"9�d���2EA�]JY�ju�YU{�
�@����������\�V�Rd;}�|����p=��H�5����D��O�����R2Bt���*r*HJU������d���oR�W�}%�W��
d���l�F�|�n++�(J��=����Ei}��F���8_�o���F2J������)��+f�#����!�i�1�+_��Gx"!9Vb��.��^�aA��9����W�~�^�<�P����2����[���U�}G{7���a�_����{���,��(A�[�r��R3(J�7$$����������T%�AJ��	��n4|w���033?~���Q1� ��
@�d
%�B�r{gv&�?��JI�wV���YV���_ye��3{����,���<���������@R���0�+{�/�|�l.����]�����<�	���7����.���^{�ses>WV��V{\NH��V�G���4���%�0��	���$L KO%����
^hP�2�xZd��R��{Y����0�+��E�r/���� X67x�j{�������\�{��y�N���������7��:��_Jv>W ����Iy�z,�`_			PSS��\�%����&��C�!1��b���K=��(��"55��IAAA��V�W{/�:g����PUU-1���/�������c�~��*�v���.�����3�r%y|+�~�,���<�Ir{/�~���oe���6UV�������|���BYm������M�����\q�?�#���{q�C��%��:�	���]�+J�,���l���_(��[Y������sYy���.(4�����[@Ph(=�X8�W����|��=�+��(==������wf��:�	

e��SYm��Y/�'>�����������CY���\�;�^��{Y�����>W�F��mY����k1ey|������f�9@C�6b���Pz���$�0���*��
Ha)��T:r)��]JV�NR�a��m�@C�x@�����e��s�|NR��%Ua}���oe��E�����.����|NxJv>'
%5k��OY@J��^���Rxa&����OM���D*k���oe��������wh���6�	�%� ()s'P-{��0�+���0���$e�)�z���M��	���z�$����l{�Ih�BJ�
b�F�����45l�����(��#��CEA�������&�xaz���)���eQ�m�+vT,j�<�W������WY����l�$g�'/{h�<o���k3����3b)_9��n$��$)���p�l�$U�����l%�<x�S�.�B
�!�������$5��=up1.NR�'���[`�N9���������O�I��"$��]���}tt����Z0[���W>�o��i��������������g�S$%~,-�/��I.}p��'����o�!��P"�VR�������%U�D��W��*�m�kC����K�%�~BeH�������o����	��\��4����2�s���[*
���%���n+�Y;h(>�
@C����l	@C�mE�!9������@�������A|��/�$
�yW�A2�KN��A$��
�,�}��o�&
��}OS�R	@C��%�,�- 
�
A$���A�AZ�4�]���m+
�6�����Cr, 
�s/��5����]�5	@��l�_�I$��
@�d���Z	@�4Hvj'X��, 
��M��������!�a��-�<j/q���pu��j������\�	��.�6Vn����y|oX�y���M�x���O^���,,�L��M�<��<��oO���}]����{�"�+#(m@CRt(��������`Q��X��4������h0>�;W"3�pIVIv9��c
����}s\�O����X������<v)]Nd��}���O��������S+��T�]�Z�����}k`�����	�)�teK�r�P��^��E��<�������&8;���u�d���x�x���Lpj�����"��kCISO��)]^��h�h:v�^����b��^E����!���E�')]Ndkr����-6^��H��
4T�m)����������TE#����������WHq���ie���th��#�h�|�&5��O-x��S$}���
&J�k_�k_w~�!aI
��JhW�G���F0���"��YECh(�����"�������Rq�e�jRs;���q)����$%rw4Blrn����jA�@���[���f<_���s�t�S6��n IDAT"���nL�8�H�Xdq��`�7�.l���m���q�l��Hu���!��D�R�~���D~�1H�|�['���W���RAMs���+J��4��u��u\���i����	�q
���He�H��r�e�r��g*�������M�����&�O��>�h�����r#�5[�F�������+��D�&Tk���/aI��|�hR��.8�J������I�.'6��;���m�8��h}���������~���h���C����1����(���>H�.'t�[!#)��n�wI!>E�������h����{/�����'�{�8���=����e�2j3v��=f%�:��w��)�����rb����S�;����QX�Z��E�+I.'z^��{�]���qq���D���H��:��S[)���?O�k`��Mz�����w���p��u��lX��4j5�_������p��C+��V�>����204~V��Q,��:Sh���� 
%����0o�L?��s���F�n�����z��]�z
?
4�|�����R�"�"�bA2��`y��

�_���4+7����=!--�U�v�_��PSU)��B��k��4��=m�JH�z/
e�����)9y��m���.�]�d��r�~�}�����4����^�������
����k����v|��+����O�}3MR�#'WV��K1�9�ANF#����������2	4hXU��MU�;��L
��+��s��w��@�a/�?�B����g���(7�o�z�u���Kh�Q�Oc�����9iLu���S��mD�1�uX�w�!��3�T�_g���)Y'�4�e�c����`7��(�@�wX�?�����D
]��	
�CNF������6i�{o|���h��8�Y=�� ���@��l+C��!��I��<n1<W�������	4�I�`r�v�w�66\���7n�;.���.��)�@C�����2Dfx��
�]g���<��_���n���<��:	Er��M����4�e��|c�7F��
�u�A���z
]�m�G�{7��	44m;�o��{����$��t���LlZ���3�EgX�����o�n�����g��V��Zh(��	@�4�X@��_J��INNFbb"tuuK�������}����9r))�1�;.]�M
uT��SB���CZz~#h@IQ��\U�hT����

'�_����6����� )9q����#�#�#��)���%e�r�.���)0����7p����������:�����:��?.^�#��u�`��,PT�AJK�����H����3�/.���a{�v�T!%!
�N/��!F���gQ
��O�
����r����iTu�a���~|t>�;L�{�+~N
&
�`/U�NFBD ^^����$X����"�xA�AdS����4�>�V�h���~�^�p����[2�}�@^���AFYZ��Z�	����A����tZ+��)�����)+Ig�"+)2jPvM��z��X�g�Jj:h�s>Aq��xp��n���
�	���-�Q���PR����D�-�e��I����0�ZFh>h
�C})�������d����������������C�`��GB�|%���@*f��c�L�l;j�&�����;��n�i�SP���1�o����ST�?�;%(P�/o��

�N
!O�����\))i�+�#��!^�����GCS����	�}��*�&I~@���f��F��4�?	��;��{BC|�I&/t�g	-�����m�daL;G�����>a��Z�
����"~��)i���*4T��< 
��B�fhX�� G),>�N���BC�Q����}��m+�X[���	�w>D&�5D
�)4(�*�����>����xq������D�Zt�{W���/�����J�B�I5�l���$�Z<����WO� )1���h�:����rD����h�:�h>�<]�s>^�"�s��?��)0T��em9��qnf]�'�c������+��6��������d���fP����D����m�a�H����-	���
Wh�K�E]u\��Q&P7��s��3@�Q�P�B���u�,�+i!2�#�]�����n�^��$�W�F��gb����
B
�P����:�e=����(�c�]�V�;�	z�s�
�9\|f������0z��p��!���p���7V`d���{|$�[���]+^��+���*��&�e�Cl06^[�VU��xIi��I��B������W�B
�d|������?�����B�%��y�k!��a�m</�EJD\�D��s��X������y�N#�Z���Q&���r���8�����D|�+�����8h�,�*�aT�5/���y<oQCQ��C�V����O�YG���{717>�d�5US���oYM9���-������Q����b��#l�;h52�n+�(����������}�/�/!�|�^��e.\���f:�R2R���R`��*�s��������P�W��0�&B�V�}�������{��	��"�+
�J���Y�Y���P��S��WPs��q?:�E��y
���P���K|+�5����hFc���0`
C%����iaL���-z���,X�t���y1'�so�����}d5��@u
��+���3��
���Ok�@��.���}�(,�Z�"�0����Mm�Ec����z�7���w$U/�+bQ�J�O�g��HI���v\��EH,���GK'#���Bij'+/������c\
j[����/1��5�4��2��7&4���D�w��{\x�����;��(}��*�R�"���;��)��3(�ch}+�i+�|��{����[�CSI���8����" "�+Mt!U�ZV:�&X#1-����s5S�����{����rd+���~'���i�����^�O���?��,a�����4F>Vn����m���m�>k�u
�4K/�����M�X|�A �G����"�u����aH=�/lV�@�Zr#������6�y����c�g�(:*�d7���#�T��")3��"��l�&��������.F>�5K&���
�v��	A�o��0��)�!���o�b�f���B���X�j#f9M������]tA

Y4�]z}�	�S����]0���yp��8��b��m'7���������7���kR�xLmB�Cd���� �R�`�o�>���C�
;�����������h~y?�%�7��MwN�C\���1�qO��q����B��u��������/�"�M:U�X�����z����j�YHHM���:T��~Oq��=2�'���
�4���z��p�\R������g�Q�������0�ES~hf��S�������?�#�����=:�[���N���W
��Q[���n����w�4�Q�Q�H�p�"�}��J- M}���W{�.��VG
�EY���)4uQu�_��������x�����^l[��� �A}�MOVL���C�I�?�������#��k�|/����������&�}��g��k�F�M�<�k������X���s�t8��e�f���Ip:���P�7A����~U�,���Q���q�6���1���A%*����T5����u�6!?��n����&�S�'�a���`���L��{e������W���{Z��kle�����67�W��Q^C�]���w��V���N�����>�wlH�))��1�B����1�FL���z�5��� �&���:�h~|��0�uu#x=?y�[Y7�����!6&�V� '��Wg����}����Wly�	��Ci��Y�\�;�;}����H������"��p��[7VS�3p��8d�'�z)�K�!�7I�h��-�V.�)!n���i@�[]$����5��r���s���P��)��"��H�,%'������S����8B���H�+H���N7h���|���M�:������ ��
��������e�=���_�S C�M���c}� ��>hQ������W�����LI@�_�-$��!��&0�������r��^�0m1��=|�<R>���B�F�@����:2��` EFb��*�g�H�(4�4���n�'7�C���c��7@�������!���GLx �+7���
^�;����"��9t���qt9�i������������R���;[=)"�
n�\�A�������M�L��[�b����/���
.�o����Z���saj]
���E�f�>���=���p,�4�7���Iv��-`�7>rPAOA������FMQK�:�D>@RF�7�s��}��H��VU�7m���wp)�:�3�1�v8TdT������J9�2���),�BC��P�j^����}����3��K{��]��/R�IJ�^D��������G8��H�e
�xr�6���M��01��u�l^>���9d!�?$��,��������f��X�222�rz3>�b��M��UZ�[3���g�a!~������y�������P�
����������cahZ���N�>�����j���HZ����]�v�n�q�C���4Wj�}���&���8e��D�����TnE*�>��<���T�:b��������hhb���h�QI
�Nn��G�*}�UW������m��j�u�������#0U��m[=
nM{q{���)4���;�z�T�K��P��\`�z
����k�.�R�/���(�x��e�v�����V��6�
�������DN�av�����~,(4�����B���P�M�g�C@��K7`l����tzh���Kl�q}����s�P��=l����+_��y�.��c����{��\�V��������������S�*�bbq��Gh��v�<<�|A�C�t��.�
9!=#�Hya���"��y�1���Y�l�=��`��,PT�A��%���C���P�_��^j�����r��
�#��
��s���+P����gYy%�:5��+�`[�������+����
I�a�P�;�a��)	�P�0�����}��fR�u�� 
"���D�t��n�.��kM�J���Qg����w����P����yD^9sRg����@+J�hHNB��P�9i/�A��_�+,4����q��r9,�4C��G\������6���[x�����H��� `���xxf
������C��6�	u�r�E������h?n�-�]Z�6��RZ�5��6-(��L������|(WY``C��
X9�s`��n]��`DE���=�Q����������=�i�����Ww� <���}�����Q�z]<���0s}�{~@C}GCT���Utz�i�&�����
���������������C$����`���]�b����w%Y���S��M!F�\r;��������T����lm�������������]1�-���f��"l��4X42���1n/����9�����C��C�\�{9����b��W�������E�m^@CJ�'����}h��E:*T��S���,�k���n�z�&Zxy&
=��a?h�S�@��y�J���>�h���L����<�N7���|��r����^4Lp+���{�B�������vJ��V��	��}����c�B�@5��n�M�+�E�
T�1��j�~h�lZ������d-_��W�C,��������=��X����\���e$`i���r�tT����H,??
�;�����|���n�C���*�P�@�Z�q��>^����x,���,�������u�,;1j���{���nL���{���=�	vpF�fbdiq�y�Z<������p�j������
�T�`�g��Zy���M-�T��@�l��s������G���i�`
LvB��}p��Ol�U�ax�9�b"`��7]���S!E&>�!)��������Rj�v�;���&��{Q���������U��!�N�(#d�[X��� r���
����^;S����@C��$xFsH�����X�'�C�%m�S�"�)31�gCPn�-�����{���q��
�Bw��r��WA��^"8�g��M��e����>����\����tZ��F_4������'R���3�����9TN��v#Cb��&��AE��$�*4�w1#�/���^��U(����T ����Y��%�*�^�C�E�_���3'��1w�w"���lC�����@C]k]T3��������>�1�B�c�{�JO�h3!m�3(��c����M7�8�0���q<��Jr2x@psI��-}�c��`���v<���,)�LZp����)��A� �~u�s��
�q��-4�7���;��del�MV���_�O���N�@���+�T`@��g!xI�+{�� �?&hA��6�������`Mxc���*4l��+��Dc�
�i�s���&���q�3�zU�(���p��~��XF��{��X`�H[��<�����'�C"9��o ����ni[�� �nCo���A�9&��1���Fc�9�7)��m���	�_�EDB�����A2������qOfa��h'�����B}����i�1�gby���M�kOB�zXI�-{@EV��jO���L�� ���8z
mL�b��u�j����Xhb���o���Q#l����X>f*&"?6
q)������~�U�'hh]#�������c�k�
�_����	�h����;1�i,'�`A����d:�R����E��F��<�.n�����Ci���|����P�n>�����za#�
5��q��R��
�����9-����4�C�p���
��o��6\��q����+l��a�����a������X�}�&����^���.0�&whO�wx�>��������]�o���W�t�������K[,!����h[�V��v�&J�h�R�����;��Z ��?4�j��i� c����������2�y������_~M�bs�4��M�J4m_�:-|��/?��{@��4<];�C	q�>���j�����qP�3B�sqw�@�;�
�=oC��>>��`����p[�7&v����������������!l���������G�a�����~T���]�V�H�a*l�CB�;��y��H�B���@2b�<�-�(��hP�5�En=1��V46s�� /������3<���P�L��w?KZ{9@��K[�%!�6�67���7C�6�Wj�yw��A?��1��/����������ED\>��1���������5��_4�+?�AAQm�-���Cac��}.�~�����~�.������������K��h��w��X�4�w�A��BUU��'��?P��=�?=�f-f���m��:�n�%��
k�3���Ge�A}��
DG�+�m�hH8qr����G�&A�%��!��|�%�hR�^�O�U5dF�#�@�jh����r�*��wJn��K���*_7K��j=��T����a���k2���<�T��(�B����<�[�tRt4i:�gWC�=R)^�{4Dz�G��8��
�k�B��#����s��y)�335���k9���@e��=��*��^�E������.h�����E������@L����^�<�����*R��+���dZ�X�t�,G�G�f����^�G�)�sA*�`�;G	N������g���#���;��p��������O��F���p��z����k/�G�N�q��R������!����TV�)��kawX9��~9����g�[�����c���a�j\;����^��a;}'j�h�9
����|#���8L}�^�oT������|h+hag�~��M���4O�M�
44��K��=F?��U�p*�<A�
q9��6
�2�$M,������'�N'�h�8�86,D�V�"h�Y�axp�8�x����bA� IDAT1k�+����h�u"�����C����H&��m^�Mn_'/8�%����Z�:�}G���#�aK�@
���<��_g��&�;�U��|x�m�/��ck�c�a����5|	V������pM�
����:��y���00����'�/�@�AgL���w��z��e$.]C �kL��Ok�7��hc��;ohj4�������{P�s����,�L�@�R�w���s#S�ql��p���9��Jd0H���)Z�����!�5��^�-+F����h`��&��9

r�h(��L3;4p���&�A���(��~�F�~o��z�������O ��/���X���76���k9�����y�h(�A/���A���e�ol*���(����B�|����!1)=~i�?3���F����[1id���[
���n&&�Z���X�pw�p��y��BE%�D���*����K	Ks��:e����m��[K|
4l!���uk)
���U[1�W�S�B,���
4��m�=kp���}��U����������~�����fg(���������6��k	]����������a`�����8XTo���6u�2m��R~�bfU��.;/
���H:��`��������l���;�dZ����7|��5��m����U3D6z~.'R��!����9B�r5��+h`4���G��� �\�O$�q0��
C��xxvmn9&|q
��}8�����������fTo5��$EJZ��C����������w��9]$2H$v1b�V�6��F�U�*Z�]��j�F�V���M�j�j���D��1�,A�=���$�-m��D�{�9�s������9�C B��K'��������	/��.�4y�V����
�/��;��A>�x���)���@���+�7�R��r�"@��s��14�9����y��s���/[[��-;0:�Avjv�nY���0���8�����VG�1Q�Q%-1���,�w�
���h��f1|4}'*��R��:}�It���=w����
-G���]+����"�����=	.�<�g\�q���s���N\����-�b[�dg��]K��b��g�~\�{-7��f���rNFK�`������uE����CC\Jt���������W�EJ=�]��
i��r]����]3���� ��]���@�
���#��p9����
� 
4T������c�Jq���������r��������xO,��QG���Q�����w��p�TT��7�����5��������J�����R���U��>�'���84����3�h/y7�����Z���5��DNH����0xqg�/��
0Ab)�T���������9����[�2�� �a����q%����������h�����X�F������3�{����E&� }z��k�Q�M\����0���_�ch+X��v���#�d*��q_�];����cmx�G?`�W��N[%8q���?A���`��.����=�8+~E7�+�Rt0s�*cW��Xq���s�qz��X]_����z��N��N���o��]�`\��@f:,��+��-�\'z��#:XJ�/J��g�Uk4�sC��;(4���I!C�L���&�n���,v�w��Rt^%X;�`�w�����xp�;(	XY��s42��A����?�.@��O�v�g�8!Rt�8N8xe�vV'n��]��#�0D�>S��=��&���m���9���[��9�"t��A^c�O�/����Hcke^�����C^8q6@F��[����
n]�E��8@j����1]��
���}�<tMp�l����������[A9��(N�m*�!�"0����n��rlY���$0{�Y.���=���%:��� �p���:���N����n�BT���g�H�d���U��f �7.�t)(Jg)Z���k�������]A )��#8������S�P���-��n�Ac��/G�w�F��(���Ea/��
�!}���Qy�����s���H~��&�7�
t!�H������th(@xC^�O���S;h l(�������}F�#�:$��������~>&���k4�pC��[���m�<�E�!rb�������`������o�s���Y�Y9������`d�A5�
��S3��`�}�%r"���C����������Hx���Rl�����23������������a�{@lKL@��!����P5_	�^�<�/��M�`p�\9q1��|�|��%�~ @��5y�#v�7�A�R�b��?�����1�� ���{=�L�"S�����m(�^>4�zrv `��uo�C�7����������lc����8���kN�4@������BZ���A�����������;�s�),�	M{?�z;r"��#z7��9�
�,_i\74m�Sg����[����T��:b����"'l_��=���mg���
��
p{���)���3�L�R�qAZ~�CC\JL@�|����������)�yl/�~���5G�R���pi���}DsY������q?��������b%d)R�K~B�������j�����MT�#��QG�j
�p��6�� @E�w"����
N8�b6�/5q�t�<���|�������#_�����
e��!�1�� ��>}�G����d�9�t.�����P��6^8�?��,
�}v4�F��-��8#���qwo����W�;K��-���=6LG���+�@K����}7q�Y�_����7����%�������!�G������k��W}��^��G~7
�.#hp
�����<�8?�^��}�����DNHE������P�dK��s�5�?# ����@�?����i7����R���e�F	4<���_?�+c��1��:���������dAk����6nY��(�.�U�B�*����3d8���{#�mN�����1
�sD�q��/.x�L�����W�.@�.?���3������~����pm�2&�2�8)d�s�,���=�	�����)+/�!c)E{�7�R�]�3(�y"3��N V6�8��7��FO����u?0��"q�cY@
�v���u�
+T��
�t���W[��������h��O�?���q�g#uZ�3��WZ�#��;H�S1L;����PB!��^��(�r]G�=�5��NCW��������M���+����cl�|���N��L�g�,����m����qo��������bu��������X��9�]9�h�}fD�H��?_[���������o����#EN||`(>/:�o�z�-�}�6�gy7C�
Q*S�X�SL*�A�e���s�����E����n�g�������6�6�{�-7��|g8fO�c�?r�D��'����"���Y���E�����}t;�|��c��u�8�	_��������oq���MD�}X���O����:["+�6�a�.�=j����6L{�.!P�����4��i7=4.���^�9�%rB^��/�>���-q}�b�V��	�c�o�x����{��j�O<~������N�:r>&���D�WYKg�����hp$�~H��KTC>>'X�`LD����I}�c���=v�\��W�a�W����E��������U���3��'����F���9��X
4(���P�M� ��I3M��DM��������o��g��L��=����o&N7Bd��k�a<p���DG��l*�)���'�9<
4>v
�~[����q���SC':<H�����^�����N����([��,c����)oQ����ql�������rg�����-|! ��p������������Q��������'!
�
� ���4qR�vhp���Z�2�L���U��y�_���4���m\]69;�C���p*Q�
�����7�p�_�� 1��&6t������D4<�s.�����L�C�6�r����b\�{���� �_��d���+R0
��2�%^e��^~�7!�Y����.�D�<M�-������a>Z����xF[��tK������BwnX��Nk�0>��	�a�ocQ�RlY0%j��������z��;��9'�`���p����>F���a���t�x��u��
����:�P�����p2��+�Q�4�����	Q��<}�C�Y�����$�q���
���F����7�`^��h��z��C@b�FB�r��#r$�"/w���N�w#���"�=����D4�p�V��pJ],h�,h�Jp�D��X7h3�����S�(��0�N=� ��;^c��������)��|��b�� �m��_������ ��}Z���tM��4�
�A��R���H�����~����a����v�Y�����~��V������0�
f����	�� ���p��Y<�qb�?��?@�6��X��aDR�cAb�:��P�����_5���+��x,�!�=!��dW���k����U���['�]�1je?���l�L4/����;4�^�9�����>�����M2N/ho���x%��O
u���L|��[(�ZU�K4���;1�������(;x&����L4@�����������C��9���<���NZ?��'Z�������?��m���
��{���}
�j��U�%
~{�#]���Y2!�	����������|(�����;��=�E��<t����A.L>�{�C��In�T�������jE���5���
Y��w)a!thXy	.�<pe��U`$�!��U'	A�#$!��^��@+���
�����w��^j�
�7!m���_x���l�s����`�o�/r���]"�y8��d&�Ypy�"qv��Qth�K�:LDvh�@���c����K���M��8VW�	q��&�pu�9x�|G�?~p�����
�@�����C�b�'KE@
���L.	Q�`6���]����	)O;4�'w�q@�S����mBt�q|p����;YQ��X�?�^5.� �X�+8�4L����t ����*�1N$v����������,
�0���b0�?b���#C17g��0�-��B'�8����HX�";4X��&�s"�1�_f�#��[:��y�hv���@Rr����z>b���0�q��i����M�����������.���#��K:,m�k�>��Xq{xZ3qr���� �!Z-�����9�
���@���MD�����<3�G84��;��P�x�|fW�n��a��h���DV��e������Ho�b���Q%[9�V��ep9������������-�>�'`h����S
�����2rB"!$�!�u+����$w����i��`:��4��������Z|d"�a�CfB�����y�?m���_Eu:B����l���E8�4�"���q�_G����JmK��/���{�p;o9�N�r&����c�����m���(��4}���#x����JT����E����BYl8D`)�A������@�[�*��e;v�K����n#�u��t�&����+:��%�{�.'�_��;_����W
�`Mp!]=~���l�YFW�:���w��mN� �Bw��]D��S���hp!o�v&��b�Jy��nk�Z:��U~Q848�����4�qz���1�|�[��0��!a����OY[���5����A{��e�`�,@������V80i<��k�+���o���"���[
���Pm�bl�{�x9?:�!;���aO`�	5��`Z�w��a�o:f������d�$�B�����3Gvh�Z�6�Zg�>���84�;�7���8�?q�n�+�M���-�!�cfL��������/���a�
h��G��{!@�5F�Y��,tg�
���|ZJd��W*wg��x�2]�V0
{v�A�r���Ith�������m�C��S����������c[�������n��p��UH�D:�DX�����rfc�mA�0g������C�=�n>���
a4���4������� �C�4-@C���qa�$�#���c@�\�w���������Y8:�c'$��;�9��tc�J�Tko�*�����]�7NN��|�$.���P>H�9��C�g���.�x��Q�����X�]6"Q��ru���5���0����;7��p��(�
\��#M1B��.@��R�V��Ye�Qd��j��`���2��/~��C���c�4�b|�=�~qw(������g�������f��X8�3�Z�=���"��J������qX�h$�!D�#��!�%*�a��r4���s��(�T���C@���th�h�L����Zd�c���T�c���>��cK7��� �������o����0}���S�
hx�aW����h�~�x�A�bU"��wzO2��P�N;F/�{����>��0��1S�t1
k�O�g�
&�a��E�������#~'����j q&X>�3>���A����4T{�m,�3��?|D'�Q������$�L�)qfx��x�^6�k~��K�T�GW��C��\��� �������*a
����0��M�7��w4�1$���h�6,.r
m8��x�1M7������xKw�
�l"k�h������V����u�s5������0��~w��%������
���C�#��C�#�D�z�0g�G�����������u=��qt���be^5c�4����D.��q��|]�P��y�����
4$��=A@�T0�@��s!e��	&f�q�Z�e�*�\�����9����9#'"
���d����������h����>qX�v�3@Cdq";4\#L1{�o���c�;*!#�3l�$���D�5��^�&l;K�������/U �@���32��i&����p2����9;��w-����9<[�@�Kt@C��e^�����%w	�(\-h��C|k)�����@%\�����p:Q����7�<.k��/q��:�����1�
e�|�8�1�|�5��{�����F����CC��)hpm��E��;��~?9Zv����+�4q���N]p�����n���\^����)./�
�����O>��2r�;W�V,��b���~3��X�W�#x�r�Wd>���|X�0�Rb2d���t9���%��8�ou� �Wj6��;"������H�]�Wju���L���f�7�VeD�m�p���83xr�{�Z&;���_!�{qf	:����:��1��|��&B���KG�����phX9�]Tk����u��������pe�7��`H���9y�|�v��&�2e��D�������!��n�^��}�(�w���*mS/��1����%=r��d�����Y�qf���������9w�i]�T�
#;��e�`dr��@fgu�S�P�r�*'��L���\��Q�����0j���[g:1��w�:W@W�7����@��t4������u�w��bJ����4.�EQ��r�Q`hej�w\��i#�����Jp��a�0l�5�*V�	)�����_�����p��]\�w�?��/*�!��#�[B��_���_���X�{�T����wQ��-��>D��O��hpv�E�����wW������5��C����5��C�!y��'g�k��7Fz�E�Li�����U�P��
ed�u9	qd�������0�.E�.�5N��G������7��rC��iM���}��VF�?@����;�������w^[.WL@��>��3��5����o�|�n5>�jyq�`���v���h^�3~�8��d��h1�7|�+3a�����q|��[.���k,�3��L(!�n��am�&�^?��U�b����Y��������1�fZq`�qq��� @C���	_����>-��1u�h}s"f�55
���;8q��>��y�6M[Yv=�Un���>}�Kf��
��IDATc�n�qT(����!G���^��=i������l�>MzMU�����^��z3V���c(��{��T>�����c��
<Ovx��9��'�e�|�e���]�_�)�^b^j?�|�����\+5d��y>���8�z82uw�=���A\�:�oV83��q�84��@������6�#4�qq:��/H�A��v�	����o�ya�����L$���/�c !i���`�O���8"��b�s���ti�����&Xqq��}^=8$8;�02U}�DcH����2:~������~xb��J������x�U�hry���(����KE�������H�/N���� }H#�%zP������Q���:A\��
~[�Q������"�B0�r����w��c/����tw�P"SD���@����
�����y���?���.H�������"��f1�R�E�+�!2�>1����LD��k���/n�y����>��K�[{��&$ 0�q'���;��L�C�(��{��U�>�����1����"�Y�B�����������R��H,�s]����N9o�����Oh7���E0��/W1�u�������5�P����=b �
���xc��0��!JdH��-:8l�����'!�sv�C0���v���=���FCydu�d�D��������w>��C":S��4(q���,����%x�!�Eq������]$�uc	D����$&�=i��?u��u�k�h�n��9e��{���\�
k�l���t�c<D�|���r9���`"$���7�9�9q>�":z�D>B�{+{�������;1����Q�`�
�����F��|m�����f�.fk7��s��aH�����������~�a>���|�q-��3rB�)��,6���O���c	
��V�qH�����o��v;�����M�F��K������q����5!s�FE����;����YCO|��;~���O��I�^�	f���
��g����$��t���p'hW���Rh��]!��q�c���f�c�����s��_�y>��~�y]���E��m^L��Z8���*S'�a�P��0��Q��:��f��]�2:���mZ���#��v�!�%�b��p��pN7�Y�e��v
7�P��R�d���s��%Z�G��� 
����~��#��A�C����g��7'o��{U������~u�g�'��I�!]k�������Z�>�4�)�wb��\?�>�~���b]�����������(�����������G�B���)3�����YMDD���H������C\*�j����d*P���3�9��4[?}��
�a���u��tx�pl��	��mC:�����P�l9p���m���w�"�>?�!m:����6��=F���I(��y/��8N�\�STt@�
������~0!����������w�Wq+l���\\8a����}M�&��� ����;�7%V�$�����!�4-�����$�sq)w����{��1���.VOd�D���`��M��r�a|a���1���(�{t@��������#�q�,kW�C����W��W�\�M�1p�F�|����Y�x�8��Y<+1��N�~C��������g�l��P����}|�Q��y�r��X�r 5�1v�T�6���g��{�L�B����D4����-G�Bu���a��)hxH���O������`W����p<2bB�
��1@�D8�����O����~)#�E�v5pg�84(k��&aF\��!���\kv"4\�<9��K���D
�����yv��m1l	����6�Rhh������~[��{>?���87H��G�O�*���&E�O����V�����t��], ���n���B���t�1����$A�^��1|��B9���qc_O��:��:�I�����R��{p�[�|GX5k*��=h(V�)
������9^���So���?�/y#���������
� ;�������B�v_����?#���B�F�L��C��
�y��8B�g�l81��i��c�����5_�z7Q�:���?&�����m����������y�Q
��-��o��8�x���%@���S�{v!���9^���;8�x'b�!@���^e\������4\b\V����_x0~����x�:�9�E�<�1��D������E�7q,�Z�~�i"��q9�(P����L��z�zE
y�$�F�>��56�o�Y_0m���Rd�Z>k2�?�{-����8!��{�5����u2�O2�b���<]dG�h��#�3�B� ��F���8sr�Z���� ��@��0���(^�5�Z����
j�@0����9�\����`3���X����TM�|����XM�A`�>tf����I�G�S\&F~\�	��"�/U�
���-��Zun\N���+��A��Um�*����te����c��g��O�u6���9����_�D7�_�|���7���q�6�}�������[�>��F�.-��gA	y�9kbo��t�*�h���^7�n]2j7�����7�Dd�D����
��3:-�=��55����=8q��(�!���:4<��
4�����4�0c!�{�+e�'~#���&�_EAO�����i�`K��?�����HQ
��^���+MT��)s9�
���>����GO�h4|<W!1R�T(����<�Id����%�����N����5����zl�R �@C|��h�O]Iu�
I�l�������y���]�D|��	h�O})�������������E���\}�.r">�G4����t��"'RR_��/�
I�fr��!�����D��HH[�0$�9�����;%��
)���������S�%t�@p�xNg���Y�+�uG>�9�u%G�
��vb������j�E�9r"����m�9���4$G���F�����S�D|�{���9�"�����SOR������:�Rb_�OQ
��Fb��T@Cb��E�9�!�}���@9v�D����1����s�����kL���h`K������E@	��L�W.�`#���
4(����
��ImCHi
(�~EhHi#���(��s��91�
�WQ���k��3hx�B�
�)�����o:"1�kg��/B{a�������!%��@C�C���/����x_�F%�P�����)B"��(����\�
I��
I�mJ�Y���WA����
4
4�>.1yFe��(����	x�/����A��c8�/nQA���������S�����@�
����@Cr��m��P�!��*�����
4���@C�]���
�)�����G�hH9����uh�/^��{M
4$�������!e^UuhH����+hH�#T{�
�O��M���n��Y
4�M/=Z0
(�>hH�ohH	#T����

4<_[�5R���cE�H9
(��r���'
4��j��&O��bM
4����@C��.�^)��@C���;U ~
(���n
4(��wS��R�!nz����Q�y@��-��004Aj=�M���=T����"  ����R����n�Hk��U&ze��_���#������^aJn�[�G�&�d��O/�drK�63<D�kG�������[���&M��n*V���*�{��/w��5�I��z��G������X��Av9���e�������.�%MP�O�{N|����7��2�����Su�?'00vvv���yn_]���)�����x"��x��W�B����Y]R��R�����m��3�e����������[B���'�x/le��!)����f����C�W����o]B��{��KY8#��������{6A�����	>�y��7�H���	�t��T[x5/���'�i���[�K��/��B��p��!Q�KbUV��U���DuIuK�>'v=A�6��B�{b��������<�2�������|��)\
:�������6����r���}�	)}�'��M��e�4~����!k�������hH��@Cr��m��x���^pXX������������Q�prJ]7��<��
���5����&XY�?(JM%���R�xO����:��3-%���������R����]�������3�E���9}>���`r������<Z�s:�K�����>�����1hH�����
4�{.�>O}H}�:���<u�w����������g�8=M��7�����[j�:�K��]�s�skj�����/
����/
4����:�K��9�������oo��y
����1�?�����k^��G��%��m��e�������nkk�T�{W�(K����Jb���f���K�{=.�=�|.���.�J>����&z .���plr����IJ��%��Bj�������{R.���[j�2�R��-����8��<WH��]�{j���|.����z���?o�'�w��x=q�3���t>�����2&����������|K�����I��L��_�xW�����Z�*�
���*�
���*�
���*�
���*�
���*�
���*�
���*�
$H$���
���*�
���*�
���*�
���*�
���*�
���*�
���*�
�I��
I����
���*�
���*�
���*�
���*�
���*�
���*�
���*�
�	R@����'���*�
���*�
���*�
���*�
���*�
���*�
���*�
��@R(�@CR��u���*�
���*�
���*�
���*�
���*�
���*�
���*�
��@�P�!A�����*�
���*�
���*�
���*�
���*�
���*�
���*�
���*�
(���j���*�
���*�
���*�
���*�
���*�
���*�
���*�
���*� hH�|z�*�
���*�
���*�
���*�
���*�
���*�
���*�
���*�
$�
4$��Z�*�
���*�
���*�
���*�
���*�
���*�
���*�
���*�
$H$���
���*�
���*�
���*�
���*�
���*�
���*�
���*�
�I��
I����
���*�
���*�
���*�
���*�
���*�
���*�
���*�
�	R@����'���*�
���*�
���*�
���*�
���*�
���*�
���*�
��@R(�@CR��u���*�
���*�
���*�
���*�
���*�
���*�
���*�
��@�P�!A�����*�
���*�
���*�
���*�
���*�
���*�
���*�
���*�
(���j���*�
���*�
���*�
���*�
���*�
���*�
���*�
���*� hH�|z�*�
���*�
���*�
���*�
���*�
���*�
���*�
���*�
$����>���IEND�B`�
#264Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#263)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-09-02 09:35:15 -0700, Andres Freund wrote:

Part of that is due to some ugly dependencies of src/common on backend headers
that IMO probably shouldn't exist (e.g. src/common/relpath.c includes
catalog/pg_tablespace_d.h). Looks like it'd not be hard to get at least the
_shlib version of src/common and libpq build without waiting for that. But for
all the backend code I don't really see a way, so it'd be nice to make genbki
faster at some point.

This reminded me of a question I had. Requires a bit of an intro...

Because ninja's build specification ends up as a fairly clean DAG, and because
it also collects compiler generated dependencies as a DAG, it's possible to
check whether the build specification contains sufficient dependencies.

Before ninja 1.11 there was
https://github.com/llvm/llvm-project/blob/main/llvm/utils/check_ninja_deps.py
and ninja 1.11 has "ninja -t missingdeps" built in.

Intentionally removing some of the dependencies to show the output:

$ ninja -t missingdeps
Missing dep: src/interfaces/ecpg/preproc/ecpg.p/.._ecpglib_typename.c.o uses src/include/catalog/pg_type_d.h (generated by CUSTOM_COMMAND)
...
Missing dep: src/bin/scripts/reindexdb.p/reindexdb.c.o uses src/include/catalog/pg_class_d.h (generated by CUSTOM_COMMAND)
Missing dep: contrib/oid2name/oid2name.p/oid2name.c.o uses src/include/catalog/pg_class_d.h (generated by CUSTOM_COMMAND)
Missing dep: contrib/vacuumlo/vacuumlo.p/vacuumlo.c.o uses src/include/catalog/pg_class_d.h (generated by CUSTOM_COMMAND)
Missing dep: src/test/modules/libpq_pipeline/libpq_pipeline.p/libpq_pipeline.c.o uses src/include/catalog/pg_type_d.h (generated by CUSTOM_COMMAND)
Processed 2299 nodes.
Error: There are 62 missing dependency paths.
62 targets had depfile dependencies on 25 distinct generated inputs (from 1 rules) without a non-depfile dep path to the generator.
There might be build flakiness if any of the targets listed above are built alone, or not late enough, in a clean output directory.

Obviously that can only work after building, as the compiler generated
dependencies are needed.

I find this exceedingly helpful, because it supplies a very high guarantee
that the build specification will not fail on a different machine due to
different performance characteristics.

The question:

Is it worth running ninja -t missingdeps as a test? At the time we run tests
we'll obviously have built and thus collected "real" dependencies, so we would
have the necessary information to determine whether dependencies are missing.
I think it'd be fine to do so only for ninja >= 1.11, rather than falling back
to the llvm python implementation, which is much slower (0.068s vs
3.760s). And also because it's not as obvious how to include the python script.

Alternatively, we could just document that ninja -t missingdeps is worth
running. Perhaps at the top of the toplevel build.meson file?

Greetings,

Andres Freund

#265Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#263)
Re: [RFC] building postgres with meson - v12

Andres Freund <andres@anarazel.de> writes:

On 2022-09-02 14:17:26 +0700, John Naylor wrote:

+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?

Since we've retired some buildfarm animals recently, it seems the
oldest perl there is 5.14? ... which came out in 2011, so it seems
later on we could just set that as the minimum.

At the moment we document 5.8.3 as our minimum, supposedly based on some
buildfarm animal - but that's probably outdated.

Yeah, definitely. prairiedog was the only animal running such an old
version, and it's gone. I don't think we have anything testing ancient
bison or flex anymore, either. I'm a fan of actually testing whatever
we claim as the minimum supported version of any tool, so there's some
work to be done here, on buildfarm config or docs or both.

regards, tom lane

#266samay sharma
smilingsamay@gmail.com
In reply to: samay sharma (#261)
Re: [RFC] building postgres with meson - v11

On Thu, Sep 1, 2022 at 4:12 PM samay sharma <smilingsamay@gmail.com> wrote:

Hi,

On Wed, Aug 31, 2022 at 1:42 AM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:

On 24.08.22 17:30, Andres Freund wrote:

0545eec895 meson: Add docs

We should think more about how to arrange the documentation. We
probably don't want to copy-and-paste all the introductory and
requirements information. I think we can make this initially much
briefer, like the Windows installation chapter. For example, instead
of documenting each setup option again, just mention which ones exist
and then point (link) to the configure chapter for details.

The current docs, including the windows ones, are already hard to

follow. I

think we should take some care to not make the meson bits even more
confusing. Cross referencing left and right seems problematic from that

angle.

If you look at the current structure of the installation chapter

17.1. Short Version
17.2. Requirements
17.3. Getting the Source
17.4. Installation Procedure
17.5. Post-Installation Setup
17.6. Supported Platforms
17.7. Platform-Specific Notes

only 17.1, small parts of 12.2, and 17.4 should differ between make and
meson. There is no conceivable reason why the meson installation
chapter should have a different "Getting the Source" section. And some
of the post-installation and platform-specific information doesn't
appear at all on the meson chapter.

I think we can try to be a bit more ingenious in how we weave this
together in the best way. What I really wouldn't want is two separate
chapters that duplicate the entire process. I think we could do one
chapter, like

- Short Version
- Requirements
- Getting the Source
- Installation Procedure
- Installation Procedure using Meson
- Post-Installation Setup
- Supported Platforms
- Platform-Specific Notes

I spent some more time thinking about the structure of the docs. The
getting the source, supported platforms, post installation setup and
platform specific notes sections are going to be mostly common. We do
expect some differences in supported platforms and platform specific notes
but I think they should be manageable without confusing readers.

The others; short version, requirements, and installation procedure are
pretty different and I feel combining them will end up confusing readers or
require creating autoconf / make and meson versions of many things at many
different places. Also, if we keep it separate, it'll be easier to remove
make / autoconf specific sections if (when?) we want to do that.

So, I was thinking of the following structure:
- Supported Platforms
- Getting the Source
- Building with make and autoconf
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Building with Meson
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Post-installation Setup
- Platform specific notes

It has the disadvantage of short version moving to a bit later in the
chapter but I think it's a good structure to reduce duplication and also
keep sections which are different separate. Thoughts on this approach? If
this looks good, I can submit a patch rearranging things this way.

Another thing I'd like input on. A common question I've heard from people
who've tried out the docs is How do we do the equivalent of X in make with
meson. As meson will be new for a bunch of people who are fluent with make,
I won't be surprised if this is a common ask. To address that, I was
planning to add a page to specify the key things one needs to keep in mind
while "migrating" from make to meson and having a translation table of
commonly used commands.

I was planning to add it in the meson section, but if we go ahead with the
structure proposed above, it doesn't fit it into one as cleanly. Maybe, it
still goes in the meson section? Thoughts?

Regards,
Samay

Show quoted text

As a follow up patch, we could also try to fit the Windows part into this
model. We could add a Building with visual C++ or Microsoft windows SDK
section. It doesn't have a short version but follows the remaining template
of requirements and installation procedure subsections (Building, Cleaning
and Installing and Running Regression tests) well.

Regards,
Samay

Alternatively, if people prefer two separate chapters, let's think about
some source-code level techniques to share the common contents.

#267Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#265)
minimum perl version

Hi,

Split off from the meson thread at /messages/by-id/990067.1662138678@sss.pgh.pa.us

On 2022-09-02 13:11:18 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2022-09-02 14:17:26 +0700, John Naylor wrote:

+  # FIXME: -output option is only available in perl 5.9.3 - but that's
+  # probably a fine minimum requirement?

Since we've retired some buildfarm animals recently, it seems the
oldest perl there is 5.14? ... which came out in 2011, so it seems
later on we could just set that as the minimum.

At the moment we document 5.8.3 as our minimum, supposedly based on some
buildfarm animal - but that's probably outdated.

Yeah, definitely. prairiedog was the only animal running such an old
version, and it's gone. I don't think we have anything testing ancient
bison or flex anymore, either. I'm a fan of actually testing whatever
we claim as the minimum supported version of any tool, so there's some
work to be done here, on buildfarm config or docs or both.

5.8.3 is from 2004-Jan-14, that's impressive :). I don't see any benefit in
setting up a buildfarm animal running that old a version.

For the meson stuff it'd suffice to set 5.9.3. as the minimum version for
plperl (or I could try to work around it). However, supporting a perl version
from 2006-Jan-28 doesn't strike me as particularly useful either.

Relevent somewhat recent discussion / work:
/messages/by-id/87y278s6iq.fsf@wibble.ilmari.org
/messages/by-id/E1mYY6Z-0006OL-QN@gemulon.postgresql.org

I looked at which buildfarm animals currently use 5.14 (mentioned by John),
and it's frogfish, snapper and skate. The latter two do build with plperl.

I started a query on the buildfarm machine to collect the perl versions, but
it's just awfully slow...

Greetings,

Andres Freund

#268Andres Freund
andres@anarazel.de
In reply to: John Naylor (#242)
Re: build remaining Flex files standalone

Hi John,

Are you planning to press ahead with these?

Subject: [PATCH v4 01/11] Preparatory refactoring for compiling guc-file.c
standalone
Subject: [PATCH v4 02/11] Move private declarations shared between guc.c and
guc-file.l to new header
Subject: [PATCH v4 03/11] Build guc-file.c standalone

01-03 are a bit more complicated, but still look not far off. There's a FIXME
about failing headercheck.

Subject: [PATCH v4 04/11] Build bootscanner.c standalone
Subject: [PATCH v4 05/11] Build repl_scanner.c standalone
Subject: [PATCH v4 06/11] Build syncrep_scanner.c standalone
Subject: [PATCH v4 07/11] Build specscanner.c standalone
Subject: [PATCH v4 08/11] Build exprscan.c standalone

LGTM

Subject: [PATCH v4 09/11] Build cubescan.c standalone

Pass scanbuflen as a parameter to yyparse rather than
resorting to a global variable.

Nice.

Subject: [PATCH v4 10/11] Build segscan.c standalone
Subject: [PATCH v4 11/11] Build jsonpath_scan.c standalone

LGTM.

Greetings,

Andres Freund

#269Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#267)
1 attachment(s)
Re: minimum perl version

Andres Freund <andres@anarazel.de> writes:

I started a query on the buildfarm machine to collect the perl versions, but
it's just awfully slow...

This is from March, but it's probably still accurate enough.

regards, tom lane

Attachments:

perlversionstext/plain; charset=us-ascii; name=perlversionsDownload
#270Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#269)
Re: minimum perl version

Hi,

On 2022-09-02 14:31:57 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

I started a query on the buildfarm machine to collect the perl versions, but
it's just awfully slow...

This is from March, but it's probably still accurate enough.

Thanks.

Mine did just finish. Over the last month there were the following perl
version on HEAD:

perl_version | last_report | array_agg
--------------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{5,8,3} | 2022-08-04 09:38:04 | {prairiedog}
{5,14,2} | 2022-09-02 16:40:12 | {skate,lapwing,snapper,frogfish}
{5,16,3} | 2022-09-02 16:52:17 | {prion,dhole,buri,parula,mantid,chub,clam,snakefly,rhinoceros,quokka}
{5,18,2} | 2022-09-02 06:42:13 | {shelduck}
{5,20,2} | 2022-09-02 16:15:34 | {curculio,chipmunk,topminnow}
{5,22,1} | 2022-09-02 16:02:11 | {spurfowl,cuon,batfish}
{5,24,1} | 2022-09-02 17:00:17 | {urocryon,grison,mussurana,butterflyfish,ayu,chimaera,tadarida}
{5,24,3} | 2022-09-02 09:04:12 | {fairywren}
{5,26,1} | 2022-09-02 18:40:18 | {elasmobranch,avocet,bichir,blossomcrown,trilobite,cavefish,cotinga,demoiselle,perch,hippopotamus,jay}
{5,26,2} | 2022-09-02 09:02:03 | {vulpes,wobbegong}
{5,26,3} | 2022-09-02 12:04:01 | {jacana}
{5,28,0} | 2022-09-02 17:00:17 | {myna}
{5,28,1} | 2022-09-02 16:02:01 | {sungazer,hornet,hoverfly,ibisbill,kittiwake,mandrill,tern}
{5,28,2} | 2022-09-01 23:39:33 | {bonito}
{5,30,0} | 2022-09-02 14:16:16 | {branta,moonjelly,urutau,seawasp}
{5,30,1} | 2022-09-02 02:59:06 | {wrasse}
{5,30,2} | 2022-09-02 16:05:24 | {massasauga}
{5,30,3} | 2022-09-02 17:00:06 | {longfin,sifaka,gombessa}
{5,32,0} | 2022-09-02 16:00:05 | {margay}
{5,32,1} | 2022-09-02 17:49:36 | {lorikeet,alabio,guaibasaurus,eelpout,tayra,peripatus,plover,gull,mereswine,warbler,morepork,mule,loach,boomslang,florican,copperhead,conchuela}
{5,34,0} | 2022-09-02 16:30:04 | {culicidae,komodoensis,grassquit,mamba,francolin,mylodon,olingo,flaviventris,petalura,phycodurus,piculet,pogona,dragonet,devario,desmoxytes,rorqual,serinus,kestrel,crake,skink,chickadee,cardinalfish,tamandua,xenodermus,thorntail,calliphoridae,idiacanthus}
{5,34,1} | 2022-09-02 16:05:33 | {sidewinder,malleefowl,pollock}
{5,36,0} | 2022-09-02 03:01:08 | {dangomushi,caiman}
(23 rows)

5.14 would be a trivial lift as far as the buildfarm is concerned. The Debian
7 animals couldn't trivially be updated to a newer perl. It's from 2013-05-04,
so I wouldn't feel bad about dropping support for it - but probably wouldn't
personally bother just for this.

Greetings,

Andres Freund

#271Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#270)
Re: minimum perl version

Andres Freund <andres@anarazel.de> writes:

5.14 would be a trivial lift as far as the buildfarm is concerned.

Yeah, that seems like a reasonable new minimum for Perl. I might
see about setting up an animal running 5.14.0, just so we can say
"5.14" in the docs without fine print.

regards, tom lane

#272Daniel Gustafsson
daniel@yesql.se
In reply to: Tom Lane (#271)
Re: minimum perl version

On 2 Sep 2022, at 21:11, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Andres Freund <andres@anarazel.de> writes:

5.14 would be a trivial lift as far as the buildfarm is concerned.

Yeah, that seems like a reasonable new minimum for Perl. I might
see about setting up an animal running 5.14.0, just so we can say
"5.14" in the docs without fine print.

Maybe perlbrew can be used, as per the instructions in src/test/perl/README?

--
Daniel Gustafsson https://vmware.com/

#273John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#268)
Re: build remaining Flex files standalone

On Sat, Sep 3, 2022 at 1:29 AM Andres Freund <andres@anarazel.de> wrote:

Hi John,

Are you planning to press ahead with these?

I was waiting for feedback on the latest set, so tomorrow I'll see
about the FIXME and remove the leftover bogus include. I was thinking
of applying the guc-file patches separately and then squashing the
rest since they're *mostly* mechanical:

Subject: [PATCH v4 01/11] Preparatory refactoring for compiling guc-file.c
standalone
Subject: [PATCH v4 02/11] Move private declarations shared between guc.c and
guc-file.l to new header
Subject: [PATCH v4 03/11] Build guc-file.c standalone

01-03 are a bit more complicated, but still look not far off. There's a FIXME
about failing headercheck.

--
John Naylor
EDB: http://www.enterprisedb.com

#274John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#268)
Re: build remaining Flex files standalone

On Sat, Sep 3, 2022 at 1:29 AM Andres Freund <andres@anarazel.de> wrote:

Subject: [PATCH v4 01/11] Preparatory refactoring for compiling guc-file.c
standalone
Subject: [PATCH v4 02/11] Move private declarations shared between guc.c and
guc-file.l to new header
Subject: [PATCH v4 03/11] Build guc-file.c standalone

01-03 are a bit more complicated, but still look not far off. There's a FIXME
about failing headercheck.

Fixed by adding utils/guc.h to the new internal header, which now
lives in the same directory as guc.c and guc-file.l, similar to how I
did json path in the last patch. Also removed the bogus include from
v4 to . Pushed 01 and 02 separately, then squashed and pushed the
rest.

--
John Naylor
EDB: http://www.enterprisedb.com

#275John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#263)
1 attachment(s)
Re: [RFC] building postgres with meson - v12

On Fri, Sep 2, 2022 at 11:35 PM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-02 14:17:26 +0700, John Naylor wrote:

On Thu, Sep 1, 2022 at 1:12 AM Andres Freund <andres@anarazel.de> wrote:

[v12]

+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...

It's not obvious whether this is intended to be a Meson-only
optimization or a workaround for something awkward to specify.

It is an optimization. The parser generation is by far the slowest part of a
build. If other files can only be compiled once gram.h is generated, there's a
long initial period where little can happen. So instead of having all .c files
have a dependency on gram.h having been generated, the above makes only
scan.c, gram.c compilation depend on gram.h. It only matters for the first
compilation, because such dependencies are added as order-only dependencies,
supplanted by more precise compiler generated dependencies after.

Okay, I think the comment could include some of this info for clarity.

It's still pretty annoying that so much of the build is initially idle,
waiting for genbki.pl to finish.

Part of that is due to some ugly dependencies of src/common on backend headers
that IMO probably shouldn't exist (e.g. src/common/relpath.c includes
catalog/pg_tablespace_d.h).

Technically, *_d.h headers are not backend, that's why it's safe to
include them anywhere. relpath.c in its current form has to know the
tablespace OIDs, which I guess is what you think is ugly. (I agree
it's not great)

Looks like it'd not be hard to get at least the
_shlib version of src/common and libpq build without waiting for that. But for
all the backend code I don't really see a way, so it'd be nice to make genbki
faster at some point.

The attached gets me a ~15% reduction in clock time by having
Catalog.pm parse the .dat files in one sweep, when we don't care about
formatting, i.e. most of the time:

master:
User time (seconds): 0.48
Maximum resident set size (kbytes): 36112

patch:
User time (seconds): 0.41
Maximum resident set size (kbytes): 35808

That's pretty simple -- I think going beyond that would require some
perl profiling.

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

read-full-dat-file-at-once.patchtext/x-patch; charset=US-ASCII; name=read-full-dat-file-at-once.patchDownload
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index e91a8e10a8..9dd932e30a 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -287,6 +287,8 @@ sub ParseData
 	my $catname = $1;
 	my $data    = [];
 
+	if ($preserve_formatting)
+	{
 	# Scan the input file.
 	while (<$ifd>)
 	{
@@ -346,11 +348,24 @@ sub ParseData
 		{
 			push @$data, $hash_ref if !$hash_ref->{autogenerated};
 		}
-		elsif ($preserve_formatting)
+		else
 		{
 			push @$data, $_;
 		}
 	}
+	}
+	else
+	{
+		# When we only care about the contents, it's faster to read and eval
+		# the whole file at once.
+		my $full_file = do { local(@ARGV, $/) = $input_file; <> };
+		eval '$data = ' . $full_file;
+		foreach my $hash_ref (@{$data})
+		{
+			AddDefaultValues($hash_ref, $schema, $catname);
+		}
+	}
+
 	close $ifd;
 
 	# If this is pg_type, auto-generate array types too.
#276Andres Freund
andres@anarazel.de
In reply to: John Naylor (#274)
Re: build remaining Flex files standalone

Hi,

On 2022-09-04 12:16:10 +0700, John Naylor wrote:

Pushed 01 and 02 separately, then squashed and pushed the rest.

Thanks a lot! It does look a good bit cleaner to me now.

I think, as a followup improvement, we should move gramparse.h to
src/backend/parser, and stop installing gram.h, gramparse.h. gramparse.h
already had this note:

* NOTE: this file is only meant to be included in the core parsing files,
* i.e., parser.c, gram.y, and scan.l.
* Definitions that are needed outside the core parser should be in parser.h.

What do you think?

I looked for projects including gramparse.h ([1]https://codesearch.debian.net/search?q=gramparse.h&amp;literal=1&amp;perpkg=1, and found libpg-query, pgpool,
slony1 and oracfe:
- libpg-query, pgpool are partial copies of our code so will catch up when
they sync up,
- slony1's [2]https://git.postgresql.org/gitweb/?p=slony1-engine.git;a=blob;f=config/acx_libpq.m4;h=7653357c0a731e36ec637df5ab378832d9279c19;hb=HEAD#l530 is a configure check, one that long seems outdated, because it's
grepping for standard_conforming strings, which was moved out in 6566e37e027
in 2009.
- As far as I can tell oracfe's include in sqlscan.l is vistigial, it compiles
without it. And the include in parse_keywords.c is just required because it
needs to include parser/scanner.h.

Greetings,

Andres Freund

[1]: https://codesearch.debian.net/search?q=gramparse.h&amp;literal=1&amp;perpkg=1
[2]: https://git.postgresql.org/gitweb/?p=slony1-engine.git;a=blob;f=config/acx_libpq.m4;h=7653357c0a731e36ec637df5ab378832d9279c19;hb=HEAD#l530

#277Andres Freund
andres@anarazel.de
In reply to: John Naylor (#275)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-09-04 13:12:52 +0700, John Naylor wrote:

On Fri, Sep 2, 2022 at 11:35 PM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-02 14:17:26 +0700, John Naylor wrote:

On Thu, Sep 1, 2022 at 1:12 AM Andres Freund <andres@anarazel.de> wrote:

[v12]

+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...

It's not obvious whether this is intended to be a Meson-only
optimization or a workaround for something awkward to specify.

It is an optimization. The parser generation is by far the slowest part of a
build. If other files can only be compiled once gram.h is generated, there's a
long initial period where little can happen. So instead of having all .c files
have a dependency on gram.h having been generated, the above makes only
scan.c, gram.c compilation depend on gram.h. It only matters for the first
compilation, because such dependencies are added as order-only dependencies,
supplanted by more precise compiler generated dependencies after.

Okay, I think the comment could include some of this info for clarity.

Working on that.

It's still pretty annoying that so much of the build is initially idle,
waiting for genbki.pl to finish.

Part of that is due to some ugly dependencies of src/common on backend headers
that IMO probably shouldn't exist (e.g. src/common/relpath.c includes
catalog/pg_tablespace_d.h).

Technically, *_d.h headers are not backend, that's why it's safe to
include them anywhere. relpath.c in its current form has to know the
tablespace OIDs, which I guess is what you think is ugly. (I agree
it's not great)

Yea, I'm not saying it's unsafe in a produces-wrong-results way, just that it
seems architecturally dubious / circular.

Looks like it'd not be hard to get at least the
_shlib version of src/common and libpq build without waiting for that. But for
all the backend code I don't really see a way, so it'd be nice to make genbki
faster at some point.

The attached gets me a ~15% reduction in clock time by having
Catalog.pm parse the .dat files in one sweep, when we don't care about
formatting, i.e. most of the time:

Cool. Seems worthwhile.

Greetings,

Andres Freund

#278John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#277)
1 attachment(s)
Re: [RFC] building postgres with meson - v12

On Mon, Sep 5, 2022 at 4:11 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-04 13:12:52 +0700, John Naylor wrote:

On Fri, Sep 2, 2022 at 11:35 PM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-02 14:17:26 +0700, John Naylor wrote:

On Thu, Sep 1, 2022 at 1:12 AM Andres Freund <andres@anarazel.de> wrote:

[v12]

+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...

It's not obvious whether this is intended to be a Meson-only
optimization or a workaround for something awkward to specify.

It is an optimization. The parser generation is by far the slowest part of a
build. If other files can only be compiled once gram.h is generated, there's a
long initial period where little can happen. So instead of having all .c files
have a dependency on gram.h having been generated, the above makes only
scan.c, gram.c compilation depend on gram.h. It only matters for the first
compilation, because such dependencies are added as order-only dependencies,
supplanted by more precise compiler generated dependencies after.

Okay, I think the comment could include some of this info for clarity.

Working on that.

It's still pretty annoying that so much of the build is initially idle,
waiting for genbki.pl to finish.

Part of that is due to some ugly dependencies of src/common on backend headers
that IMO probably shouldn't exist (e.g. src/common/relpath.c includes
catalog/pg_tablespace_d.h).

Technically, *_d.h headers are not backend, that's why it's safe to
include them anywhere. relpath.c in its current form has to know the
tablespace OIDs, which I guess is what you think is ugly. (I agree
it's not great)

Yea, I'm not saying it's unsafe in a produces-wrong-results way, just that it
seems architecturally dubious / circular.

Looks like it'd not be hard to get at least the
_shlib version of src/common and libpq build without waiting for that. But for
all the backend code I don't really see a way, so it'd be nice to make genbki
faster at some point.

The attached gets me a ~15% reduction in clock time by having
Catalog.pm parse the .dat files in one sweep, when we don't care about
formatting, i.e. most of the time:

Cool. Seems worthwhile.

Okay, here's a cleaned up version with more idiomatic style and a new
copy of the perlcritic exception.

Note that the indentation hasn't changed. My thought there: perltidy
will be run again next year, at which time it will be part of a listed
whitespace-only commit. Any objections, since that could confuse
someone before then?

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v2-read-full-dat-file-at-once.patchtext/x-patch; charset=US-ASCII; name=v2-read-full-dat-file-at-once.patchDownload
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index e91a8e10a8..a71f5b05a8 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -287,6 +287,8 @@ sub ParseData
 	my $catname = $1;
 	my $data    = [];
 
+	if ($preserve_formatting)
+	{
 	# Scan the input file.
 	while (<$ifd>)
 	{
@@ -346,11 +348,25 @@ sub ParseData
 		{
 			push @$data, $hash_ref if !$hash_ref->{autogenerated};
 		}
-		elsif ($preserve_formatting)
+		else
 		{
 			push @$data, $_;
 		}
 	}
+	}
+	else
+	{
+		# When we only care about the contents, it's faster to read and eval
+		# the whole file at once.
+		local $/;
+		my $full_file = <$ifd>;
+		eval '$data = ' . $full_file;    ## no critic (ProhibitStringyEval)
+		foreach my $hash_ref (@{$data})
+		{
+			AddDefaultValues($hash_ref, $schema, $catname);
+		}
+	}
+
 	close $ifd;
 
 	# If this is pg_type, auto-generate array types too.
#279John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#276)
Re: build remaining Flex files standalone

On Mon, Sep 5, 2022 at 1:18 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-04 12:16:10 +0700, John Naylor wrote:

Pushed 01 and 02 separately, then squashed and pushed the rest.

Thanks a lot! It does look a good bit cleaner to me now.

I think, as a followup improvement, we should move gramparse.h to
src/backend/parser, and stop installing gram.h, gramparse.h. gramparse.h
already had this note:

* NOTE: this file is only meant to be included in the core parsing files,
* i.e., parser.c, gram.y, and scan.l.
* Definitions that are needed outside the core parser should be in parser.h.

What do you think?

+1 for the concept, but haven't looked at the details.

--
John Naylor
EDB: http://www.enterprisedb.com

#280Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: samay sharma (#261)
Re: [RFC] building postgres with meson - v11

On 02.09.22 01:12, samay sharma wrote:

So, I was thinking of the following structure:
- Supported Platforms
- Getting the Source
- Building with make and autoconf
  -- Short version
  -- Requirements
  -- Installation Procedure and it's subsections
- Building with Meson
  -- Short version
  -- Requirements
  -- Installation Procedure and it's subsections
- Post-installation Setup
- Platform specific notes

I like that.

As a follow up patch, we could also try to fit the Windows part into
this model. We could add a Building with visual C++ or Microsoft windows
SDK section. It doesn't have a short version but follows the remaining
template of requirements and installation procedure subsections
(Building, Cleaning and Installing and Running Regression tests) well.

We were thinking about removing the old Windows build system for PG 16.
Let's see how that goes. Otherwise, yes, that would be good as well.

#281Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: samay sharma (#266)
Re: [RFC] building postgres with meson - v11

On 02.09.22 19:16, samay sharma wrote:

Another thing I'd like input on. A common question I've heard from
people who've tried out the docs is How do we do the equivalent of X in
make with meson. As meson will be new for a bunch of people who are
fluent with make, I won't be surprised if this is a common ask. To
address that, I was planning to add a page to specify the key things one
needs to keep in mind while "migrating" from make to meson and having a
translation table of commonly used commands.

I was planning to add it in the meson section, but if we go ahead with
the structure proposed above, it doesn't fit it into one as cleanly.
Maybe, it still goes in the meson section? Thoughts?

This could go into the wiki.

For example, we have
<https://wiki.postgresql.org/wiki/Working_with_Git&gt;, which was added
during the CVS->Git transition.

This avoids that we make the PostgreSQL documentation a substitute
manual for a third-party product.

#282Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#260)
Re: [RFC] building postgres with meson - v12

On 31.08.22 20:11, Andres Freund wrote:

src/port/win32ver.rc.in: This is redundant with src/port/win32ver.rc.
(Note that the latter is also used as an input file for text
substitution. So having another file named *.in next to it would be
super confusing.)

Yea, this stuff isn't great. I think the better solution, both for meson and
for configure, would be to move to do all the substitution to the C
preprocessor.

Yeah, I think if we can get rid of the evil date-based versioning, then
this could be done like

diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32
index 17d6819644..609156382f 100644
--- a/src/makefiles/Makefile.win32
+++ b/src/makefiles/Makefile.win32
@@ -65,21 +65,12 @@ endif
  # win32ver.rc or furnish a rule for generating one.  Set $(PGFILEDESC) to
  # signal win32ver.rc availability to the dll build rule below.
  ifndef PGXS
-win32ver.rc: $(top_srcdir)/src/port/win32ver.rc
-   sed -e 's;FILEDESC;$(PGFILEDESC);' \
-       -e 's;VFT_APP;$(PGFTYPE);' \
-       -e 's;_ICO_;$(PGICOSTR);' \
-       -e 's;\(VERSION.*\),0 *$$;\1,'`date '+%y%j' | sed 's/^0*//'`';' \
-       -e '/_INTERNAL_NAME_/$(if $(shlib),s;_INTERNAL_NAME_;"$(basename $(shlib))";,d)' \
-       -e '/_ORIGINAL_NAME_/$(if $(shlib),s;_ORIGINAL_NAME_;"$(shlib)";,d)' \
-     $< >$@
-
  # Depend on Makefile.global to force rebuild on re-run of configure.
  win32ver.rc: $(top_builddir)/src/Makefile.global
  endif
-win32ver.o: win32ver.rc
-   $(WINDRES) -i $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(srcdir)
+win32ver.o: $(top_srcdir)/src/port/win32ver.rc
+   $(WINDRES) -i $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(srcdir) -D FILEDESC=$(PGFILEDESC) -D VFT_APP=$(PGFTYPE) -D_ICO_=$(PGICOSTR) -D_INTERNAL_NAME_=$(if $(shlib),s;_INTERNAL_NAME_;"$(basename $(shlib))";,d) -D_ORIGINAL_NAME_=$(if $(shlib),s;_ORIGINAL_NAME_;"$(shlib)";,d)

Probably needs some careful checking of the quoting. But that should be
the right thing in principle.

#283Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#264)
Re: [RFC] building postgres with meson - v12

On 02.09.22 18:57, Andres Freund wrote:

Is it worth running ninja -t missingdeps as a test? At the time we run tests
we'll obviously have built and thus collected "real" dependencies, so we would
have the necessary information to determine whether dependencies are missing.
I think it'd be fine to do so only for ninja >= 1.11, rather than falling back
to the llvm python implementation, which is much slower (0.068s vs
3.760s). And also because it's not as obvious how to include the python script.

Alternatively, we could just document that ninja -t missingdeps is worth
running. Perhaps at the top of the toplevel build.meson file?

In the GNU/make world there is a distinction between "check" and
"maintainer-check" for this kind of thing.

I think here if we put these kinds of things into a different, what's
the term, "suite", then that would be a clear way to collect them and be
able to run them all easily.

#284Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#260)
Re: [RFC] building postgres with meson - v12

On 31.08.22 20:11, Andres Freund wrote:

doc/src/sgml/resolv.xsl: I don't understand what this is doing. Maybe
at least add a comment in the file.

It's only used for building epubs. Perhaps I should extract that into a
separate patch as well? The relevant section is:

#
# epub
#

# This was previously implemented using dbtoepub - but that doesn't seem to
# support running in build != source directory (i.e. VPATH builds already
# weren't supported).
if pandoc.found() and xsltproc.found()
# XXX: Wasn't able to make pandoc successfully resolve entities
# XXX: Perhaps we should just make all targets use this, to avoid repeatedly
# building whole thing? It's comparatively fast though.
postgres_full_xml = custom_target('postgres-full.xml',
input: ['resolv.xsl', 'postgres.sgml'],
output: ['postgres-full.xml'],
depends: doc_generated + [postgres_sgml_valid],
command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_flags,
'-o', '@OUTPUT@', '@INPUT@'],
build_by_default: false,
)

A noted, I couldn't make pandoc resolve our entities, so I used resolv.xsl
them, before calling pandoc.

I'll rename it to resolve-entities.xsl and add a comment.

We can have xmllint do this. The following gets the epub build working
with vpath:

diff --git a/doc/src/sgml/Makefile b/doc/src/sgml/Makefile
index 4ae7ca2be7..33b72d03db 100644
--- a/doc/src/sgml/Makefile
+++ b/doc/src/sgml/Makefile
@@ -184,8 +184,12 @@ XSLTPROC_FO_FLAGS += --stringparam img.src.path 
'$(srcdir)/'
  epub: postgres.epub
  postgres.epub: postgres.sgml $(ALLSGML) $(ALL_IMAGES)
-   $(XMLLINT) --noout --valid $<
-   $(DBTOEPUB) -o $@ $<
+   $(XMLLINT) $(XMLINCLUDE) --output tmp.sgml --noent --valid $<
+ifeq ($(vpath_build),yes)
+   $(MKDIR_P) images
+   cp $(ALL_IMAGES) images/
+endif
+   $(DBTOEPUB) -o $@ tmp.sgml

This could also be combined with the idea of the postgres.sgml.valid
thing you have in the meson patch set.

I'll finish this up and produce a proper patch.

#285Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#284)
1 attachment(s)
Re: [RFC] building postgres with meson - v12

On 07.09.22 09:19, Peter Eisentraut wrote:

This could also be combined with the idea of the postgres.sgml.valid
thing you have in the meson patch set.

I'll finish this up and produce a proper patch.

Something like this.

This does make the rules more straightforward and avoids repeated
xmllint calls. I suppose this also helps writing the meson rules in a
simpler way.

A possible drawback is that the intermediate postgres-full.xml file is

10MB, but I guess we're past the point where we are worrying about

that kind of thing.

I don't know if there is any performance difference between xsltproc
reading one big file versus many smaller files.

Attachments:

0001-Run-xmllint-validation-only-once.patchtext/plain; charset=UTF-8; name=0001-Run-xmllint-validation-only-once.patchDownload
From 6aa880a6c27de3bce412f24ed3de0c3926e7be04 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 7 Sep 2022 09:50:27 +0200
Subject: [PATCH] Run xmllint validation only once

---
 doc/src/sgml/Makefile | 44 +++++++++++++++++++++++--------------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/doc/src/sgml/Makefile b/doc/src/sgml/Makefile
index 4ae7ca2be7..b739a20b6b 100644
--- a/doc/src/sgml/Makefile
+++ b/doc/src/sgml/Makefile
@@ -61,15 +61,22 @@ ALLSGML := $(wildcard $(srcdir)/*.sgml $(srcdir)/ref/*.sgml) $(GENERATED_SGML)
 ALL_IMAGES := $(wildcard $(srcdir)/images/*.svg)
 
 
+# Run validation only once, common to all subsequent targets.  While
+# we're at it, also resolve all entities (that is, copy all included
+# files into one big file).  This helps tools that don't understand
+# vpath builds (such as dbtoepub).
+postgres-full.xml: postgres.sgml $(ALLSGML)
+	$(XMLLINT) $(XMLINCLUDE) --output $@ --noent --valid $<
+
+
 ##
 ## Man pages
 ##
 
 man distprep-man: man-stamp
 
-man-stamp: stylesheet-man.xsl postgres.sgml $(ALLSGML)
-	$(XMLLINT) $(XMLINCLUDE) --noout --valid $(word 2,$^)
-	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_MAN_FLAGS) $(wordlist 1,2,$^)
+man-stamp: stylesheet-man.xsl postgres-full.xml
+	$(XSLTPROC) $(XSLTPROCFLAGS) $(XSLTPROC_MAN_FLAGS) $^
 	touch $@
 
 
@@ -117,7 +124,7 @@ INSTALL.html: %.html : stylesheet-text.xsl %.xml
 	$(XMLLINT) --noout --valid $*.xml
 	$(XSLTPROC) $(XSLTPROCFLAGS) $(XSLTPROC_HTML_FLAGS) $^ >$@
 
-INSTALL.xml: standalone-profile.xsl standalone-install.xml postgres.sgml $(ALLSGML)
+INSTALL.xml: standalone-profile.xsl standalone-install.xml postgres-full.xml
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) --xinclude $(wordlist 1,2,$^) >$@
 
 
@@ -131,8 +138,7 @@ endif
 
 html: html-stamp
 
-html-stamp: stylesheet.xsl postgres.sgml $(ALLSGML) $(ALL_IMAGES)
-	$(XMLLINT) $(XMLINCLUDE) --noout --valid $(word 2,$^)
+html-stamp: stylesheet.xsl postgres-full.xml $(ALL_IMAGES)
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_HTML_FLAGS) $(wordlist 1,2,$^)
 	cp $(ALL_IMAGES) html/
 	cp $(srcdir)/stylesheet.css html/
@@ -140,16 +146,14 @@ html-stamp: stylesheet.xsl postgres.sgml $(ALLSGML) $(ALL_IMAGES)
 
 htmlhelp: htmlhelp-stamp
 
-htmlhelp-stamp: stylesheet-hh.xsl postgres.sgml $(ALLSGML) $(ALL_IMAGES)
-	$(XMLLINT) $(XMLINCLUDE) --noout --valid $(word 2,$^)
+htmlhelp-stamp: stylesheet-hh.xsl postgres-full.xml $(ALL_IMAGES)
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(wordlist 1,2,$^)
 	cp $(ALL_IMAGES) htmlhelp/
 	cp $(srcdir)/stylesheet.css htmlhelp/
 	touch $@
 
 # single-page HTML
-postgres.html: stylesheet-html-nochunk.xsl postgres.sgml $(ALLSGML) $(ALL_IMAGES)
-	$(XMLLINT) $(XMLINCLUDE) --noout --valid $(word 2,$^)
+postgres.html: stylesheet-html-nochunk.xsl postgres-full.xml $(ALL_IMAGES)
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_HTML_FLAGS) -o $@ $(wordlist 1,2,$^)
 
 # single-page text
@@ -166,13 +170,11 @@ postgres.pdf:
 
 XSLTPROC_FO_FLAGS += --stringparam img.src.path '$(srcdir)/'
 
-%-A4.fo: stylesheet-fo.xsl %.sgml $(ALLSGML)
-	$(XMLLINT) $(XMLINCLUDE) --noout --valid $(word 2,$^)
-	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_FO_FLAGS) --stringparam paper.type A4 -o $@ $(wordlist 1,2,$^)
+%-A4.fo: stylesheet-fo.xsl %-full.xml
+	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_FO_FLAGS) --stringparam paper.type A4 -o $@ $^
 
-%-US.fo: stylesheet-fo.xsl %.sgml $(ALLSGML)
-	$(XMLLINT) $(XMLINCLUDE) --noout --valid $(word 2,$^)
-	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_FO_FLAGS) --stringparam paper.type USletter -o $@ $(wordlist 1,2,$^)
+%-US.fo: stylesheet-fo.xsl %-full.xml
+	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_FO_FLAGS) --stringparam paper.type USletter -o $@ $^
 
 %.pdf: %.fo $(ALL_IMAGES)
 	$(FOP) -fo $< -pdf $@
@@ -183,8 +185,11 @@ XSLTPROC_FO_FLAGS += --stringparam img.src.path '$(srcdir)/'
 ##
 
 epub: postgres.epub
-postgres.epub: postgres.sgml $(ALLSGML) $(ALL_IMAGES)
-	$(XMLLINT) --noout --valid $<
+postgres.epub: postgres-full.xml $(ALL_IMAGES)
+ifeq ($(vpath_build),yes)
+	$(MKDIR_P) images
+	cp $(ALL_IMAGES) images/
+endif
 	$(DBTOEPUB) -o $@ $<
 
 
@@ -196,8 +201,7 @@ DB2X_TEXIXML = db2x_texixml
 DB2X_XSLTPROC = db2x_xsltproc
 MAKEINFO = makeinfo
 
-%.texixml: %.sgml $(ALLSGML)
-	$(XMLLINT) --noout --valid $<
+%.texixml: %-full.xml
 	$(DB2X_XSLTPROC) -s texi -g output-file=$(basename $@) $< -o $@
 
 %.texi: %.texixml
-- 
2.37.3

#286Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: John Naylor (#278)
Re: [RFC] building postgres with meson - v12

On 2022-Sep-06, John Naylor wrote:

Note that the indentation hasn't changed. My thought there: perltidy
will be run again next year, at which time it will be part of a listed
whitespace-only commit. Any objections, since that could confuse
someone before then?

I think a good plan is to commit the fix without tidy, then commit the
tidy separately, then add the latter commit to .git-blame-ignore-revs.
That avoids leaving the code untidy for a year.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
Are you not unsure you want to delete Firefox?
[Not unsure] [Not not unsure] [Cancel]
http://smylers.hates-software.com/2008/01/03/566e45b2.html

#287Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#276)
Re: build remaining Flex files standalone

On 04.09.22 20:17, Andres Freund wrote:

I think, as a followup improvement, we should move gramparse.h to
src/backend/parser, and stop installing gram.h, gramparse.h. gramparse.h
already had this note:

* NOTE: this file is only meant to be included in the core parsing files,
* i.e., parser.c, gram.y, and scan.l.
* Definitions that are needed outside the core parser should be in parser.h.

What do you think?

I found in my notes:

* maybe gram.h and gramparse.h should not be installed

So, yeah. ;-)

#288John Naylor
john.naylor@enterprisedb.com
In reply to: Alvaro Herrera (#286)
Re: [RFC] building postgres with meson - v12

On Wed, Sep 7, 2022 at 3:36 PM Alvaro Herrera <alvherre@alvh.no-ip.org> wrote:

On 2022-Sep-06, John Naylor wrote:

Note that the indentation hasn't changed. My thought there: perltidy
will be run again next year, at which time it will be part of a listed
whitespace-only commit. Any objections, since that could confuse
someone before then?

I think a good plan is to commit the fix without tidy, then commit the
tidy separately, then add the latter commit to .git-blame-ignore-revs.
That avoids leaving the code untidy for a year.

Okay, done that way. I also made sure we got the same info for error
reporting. It's not identical, but arguably better, going from:

Bareword found where operator expected at (eval 4480) line 3, near "'btree' xxx"
(Missing operator before xxx?)
../../../src/include/catalog/pg_amop.dat: error parsing line 20:

to:

Bareword found where operator expected at (eval 12) line 20, near "'btree' xxx"
(Missing operator before xxx?)
error parsing ../../../src/include/catalog/pg_amop.dat

--
John Naylor
EDB: http://www.enterprisedb.com

#289samay sharma
smilingsamay@gmail.com
In reply to: Peter Eisentraut (#281)
Re: [RFC] building postgres with meson - v11

Hi,

On Tue, Sep 6, 2022 at 9:48 PM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:

On 02.09.22 19:16, samay sharma wrote:

Another thing I'd like input on. A common question I've heard from
people who've tried out the docs is How do we do the equivalent of X in
make with meson. As meson will be new for a bunch of people who are
fluent with make, I won't be surprised if this is a common ask. To
address that, I was planning to add a page to specify the key things one
needs to keep in mind while "migrating" from make to meson and having a
translation table of commonly used commands.

I was planning to add it in the meson section, but if we go ahead with
the structure proposed above, it doesn't fit it into one as cleanly.
Maybe, it still goes in the meson section? Thoughts?

This could go into the wiki.

For example, we have
<https://wiki.postgresql.org/wiki/Working_with_Git&gt;, which was added
during the CVS->Git transition.

That's a good idea. I'll add a page to the wiki about this topic and share
it on the list for review.

This avoids that we make the PostgreSQL documentation a substitute
manual for a third-party product.

Regards,
Samay

#290Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Peter Eisentraut (#285)
Re: [RFC] building postgres with meson - v12

On 2022-Sep-07, Peter Eisentraut wrote:

A possible drawback is that the intermediate postgres-full.xml file is

10MB, but I guess we're past the point where we are worrying about that

kind of thing.

I think we are, but maybe mark it .PRECIOUS? IIUC that would prevent it
from being removed if there's a problem in the other recipes.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"¿Cómo puedes confiar en algo que pagas y que no ves,
y no confiar en algo que te dan y te lo muestran?" (Germán Poo)

#291Andres Freund
andres@anarazel.de
In reply to: John Naylor (#288)
Re: [RFC] building postgres with meson - v12

On 2022-09-08 14:10:45 +0700, John Naylor wrote:

Okay, done that way.

Thanks!

#292samay sharma
smilingsamay@gmail.com
In reply to: Peter Eisentraut (#280)
1 attachment(s)
Re: [RFC] building postgres with meson - v11

On Tue, Sep 6, 2022 at 9:46 PM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:

On 02.09.22 01:12, samay sharma wrote:

So, I was thinking of the following structure:
- Supported Platforms
- Getting the Source
- Building with make and autoconf
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Building with Meson
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Post-installation Setup
- Platform specific notes

I like that.

Attached is a docs-only patch with that structure. We need to update the
platform specific notes section to add meson specific nuances. Also, in
terms of supported platforms, if there are platforms which work with make
but not with meson, we have to add that too.

Regards,
Samay

Show quoted text

As a follow up patch, we could also try to fit the Windows part into
this model. We could add a Building with visual C++ or Microsoft windows
SDK section. It doesn't have a short version but follows the remaining
template of requirements and installation procedure subsections
(Building, Cleaning and Installing and Running Regression tests) well.

We were thinking about removing the old Windows build system for PG 16.
Let's see how that goes. Otherwise, yes, that would be good as well.

Attachments:

v1-0001-Add-meson-docs-to-existing-build-from-source.patchapplication/octet-stream; name=v1-0001-Add-meson-docs-to-existing-build-from-source.patchDownload
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 70d188e2bc..e9c56178e3 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -31,7 +31,144 @@ documentation.  See standalone-profile.xsl for details.
   C++</productname>, see <xref linkend="install-windows"/> instead.
  </para>
 
- <sect1 id="install-short">
+ <sect1 id="supported-platforms">
+  <title>Supported Platforms</title>
+
+  <para>
+   A platform (that is, a CPU architecture and operating system combination)
+   is considered supported by the <productname>PostgreSQL</productname> development
+   community if the code contains provisions to work on that platform and
+   it has recently been verified to build and pass its regression tests
+   on that platform.  Currently, most testing of platform compatibility
+   is done automatically by test machines in the
+   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
+   If you are interested in using <productname>PostgreSQL</productname> on a platform
+   that is not represented in the build farm, but on which the code works
+   or can be made to work, you are strongly encouraged to set up a build
+   farm member machine so that continued compatibility can be assured.
+  </para>
+
+  <para>
+   In general, <productname>PostgreSQL</productname> can be expected to work on
+   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
+   and PA-RISC, including
+   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
+   It is often
+   possible to build on an unsupported CPU type by configuring with
+   <option>--disable-spinlocks</option>, but performance will be poor.
+  </para>
+
+  <para>
+   <productname>PostgreSQL</productname> can be expected to work on current
+   versions of these operating systems: Linux, Windows,
+   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
+   Other Unix-like systems may also work but are not currently
+   being tested.  In most cases, all CPU architectures supported by
+   a given operating system will work.  Look in
+   <xref linkend="installation-platform-notes"/> below to see if
+   there is information
+   specific to your operating system, particularly if using an older system.
+  </para>
+
+  <para>
+   If you have installation problems on a platform that is known
+   to be supported according to recent build farm results, please report
+   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
+   in porting <productname>PostgreSQL</productname> to a new platform,
+   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
+   to discuss that.
+  </para>
+
+  <para>
+   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
+   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
+   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
+   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
+   Tru64 UNIX, and ULTRIX.
+  </para>
+ </sect1>
+
+ <sect1 id="get-source">
+  <title>Getting the Source</title>
+
+   <para>
+   You can download the source code in two ways - via git or the source code
+   tarballs.
+   </para>
+
+  <sect2 id="get-source-git">
+   <title>Getting the Source via <productname>Git</productname></title>
+  <para>
+   With <productname>Git</productname>, you can make a copy of the entire code repository
+   on your local machine, so you will have access to all history and branches
+   offline. This is the fastest and most flexible way to develop or test
+   patches.
+  </para>
+
+  <procedure>
+   <step>
+    <para>
+     To begin using the Git repository, make a clone of the official mirror:
+
+<programlisting>
+git clone https://git.postgresql.org/git/postgresql.git
+</programlisting>
+
+     This will copy the full repository to your local machine, so it may take
+     a while to complete, especially if you have a slow Internet connection.
+     The files will be placed in a new subdirectory <filename>postgresql</filename> of
+     your current directory.
+    </para>
+
+   </step>
+
+   <step>
+    <para>
+     Whenever you want to get the latest updates in the system, <command>cd</command>
+     into the repository, and run:
+
+<programlisting>
+git pull
+</programlisting>
+    </para>
+   </step>
+  </procedure>
+
+  <para>
+   <productname>Git</productname> can do a lot more things than just fetch the source.
+   Our wiki, <ulink
+   url="https://wiki.postgresql.org/wiki/Working_with_Git"></ulink>,
+   has some discussion on working with Git. For more information, consult the
+   <productname>Git</productname> man pages, or see the website at
+   <ulink url="https://git-scm.com"></ulink>.
+  </para>
+  </sect2>
+  <sect2 id="get-source-tarball">
+   <title>Getting the Source via Tarballs</title>
+
+  <para>
+   The <productname>PostgreSQL</productname> source code for released versions
+   can also be obtained from the download section of our website:
+   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
+   Download the
+   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
+   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
+   file you're interested in, then unpack it:
+<screen>
+<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
+</screen>
+   This will create a directory
+   <filename>postgresql-<replaceable>version</replaceable></filename> under
+   the current directory with the <productname>PostgreSQL</productname> sources.
+   Change into that directory for the rest of the installation procedure.
+  </para>
+  </sect2>
+ </sect1>
+
+<sect1 id="install-make">
+  <title>Building and Installation with autoconf and make</title>
+
+ <sect2 id="install-short-make">
   <title>Short Version</title>
 
   <para>
@@ -50,12 +187,12 @@ su - postgres
 /usr/local/pgsql/bin/psql test
 </synopsis>
    The long version is the rest of this
-   <phrase>chapter</phrase>.
+   <phrase>section</phrase>.
   </para>
- </sect1>
+ </sect2>
 
 
- <sect1 id="install-requirements">
+ <sect2 id="install-requirements-make">
   <title>Requirements</title>
 
   <para>
@@ -343,45 +480,9 @@ su - postgres
    url="ftp://ftp.gnu.org/gnu/"></ulink>.
   </para>
 
-  <para>
-   Also check that you have sufficient disk space. You will need about
-   350 MB for the source tree during compilation and about 60 MB for
-   the installation directory. An empty database cluster takes about
-   40 MB; databases take about five times the amount of space that a
-   flat text file with the same data would take. If you are going to
-   run the regression tests you will temporarily need up to an extra
-   300 MB. Use the <command>df</command> command to check free disk
-   space.
-  </para>
- </sect1>
-
- <sect1 id="install-getsource">
-  <title>Getting the Source</title>
-
-  <para>
-   The <productname>PostgreSQL</productname> source code for released versions
-   can be obtained from the download section of our website:
-   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
-   Download the
-   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
-   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
-   file you're interested in, then unpack it:
-<screen>
-<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
-</screen>
-   This will create a directory
-   <filename>postgresql-<replaceable>version</replaceable></filename> under
-   the current directory with the <productname>PostgreSQL</productname> sources.
-   Change into that directory for the rest of the installation procedure.
-  </para>
-
-  <para>
-   Alternatively, you can use the Git version control system; see
-   <xref linkend="git"/> for more information.
-  </para>
- </sect1>
+ </sect2>
 
- <sect1 id="install-procedure">
+ <sect2 id="install-procedure-make">
   <title>Installation Procedure</title>
 
   <procedure>
@@ -630,6 +731,7 @@ build-postgresql:
    rebuilding.  Without this, your changes in configuration choices
    might not propagate everywhere they need to.
   </para>
+  </sect2>
 
   <sect2 id="configure-options">
    <title><filename>configure</filename> Options</title>
@@ -844,7 +946,7 @@ build-postgresql:
      various <productname>PostgreSQL</productname> features that are not
      built by default.  Most of these are non-default only because they
      require additional software, as described in
-     <xref linkend="install-requirements"/>.
+     <xref linkend="install-requirements-make"/>.
     </para>
 
      <variablelist>
@@ -1672,9 +1774,7 @@ build-postgresql:
 
    </sect3>
 
-  </sect2>
-
-  <sect2 id="configure-envvars">
+  <sect3 id="configure-envvars">
    <title><filename>configure</filename> Environment Variables</title>
 
    <indexterm zone="configure-envvars">
@@ -1955,130 +2055,1721 @@ build-postgresql:
       adjustments, while <envar>COPT</envar> might be kept set all the time.
      </para>
     </note>
+   </sect3>
   </sect2>
  </sect1>
 
- <sect1 id="install-post">
-  <title>Post-Installation Setup</title>
+ <sect1 id="install-meson">
+  <title>Building and Installation with meson</title>
 
-  <sect2 id="install-post-shlibs">
-   <title>Shared Libraries</title>
+ <sect2 id="install-short-meson">
+  <title>Short Version</title>
 
-   <indexterm>
-    <primary>shared library</primary>
-   </indexterm>
+  <para>
+<synopsis>
 
-   <para>
-    On some systems with shared libraries
-    you need to tell the system how to find the newly installed
-    shared libraries.  The systems on which this is
-    <emphasis>not</emphasis> necessary include
-    <systemitem class="osname">FreeBSD</systemitem>,
-    <systemitem class="osname">Linux</systemitem>,
-    <systemitem class="osname">NetBSD</systemitem>, <systemitem
-    class="osname">OpenBSD</systemitem>, and
-    <systemitem class="osname">Solaris</systemitem>.
-   </para>
+# create working directory
+mkdir postgres
+cd postgres
 
-   <para>
-    The method to set the shared library search path varies between
-    platforms, but the most widely-used method is to set the
-    environment variable <envar>LD_LIBRARY_PATH</envar> like so: In Bourne
-    shells (<command>sh</command>, <command>ksh</command>, <command>bash</command>, <command>zsh</command>):
-<programlisting>
-LD_LIBRARY_PATH=/usr/local/pgsql/lib
-export LD_LIBRARY_PATH
-</programlisting>
-    or in <command>csh</command> or <command>tcsh</command>:
-<programlisting>
-setenv LD_LIBRARY_PATH /usr/local/pgsql/lib
-</programlisting>
-    Replace <literal>/usr/local/pgsql/lib</literal> with whatever you set
-    <option><literal>--libdir</literal></option> to in <xref linkend="configure"/>.
-    You should put these commands into a shell start-up file such as
-    <filename>/etc/profile</filename> or <filename>~/.bash_profile</filename>.  Some
-    good information about the caveats associated with this method can
-    be found at <ulink
-    url="http://xahlee.info/UnixResource_dir/_/ldpath.html"></ulink>.
-   </para>
+# fetch source code
+# git clone https://git.postgresql.org/git/postgresql.git src
 
-   <para>
-    On some systems it might be preferable to set the environment
-    variable <envar>LD_RUN_PATH</envar> <emphasis>before</emphasis>
-    building.
-   </para>
+# current instructions for testing (to be removed when merging)
+git clone -b meson https://github.com/anarazel/postgres.git src
 
-   <para>
-    On <systemitem class="osname">Cygwin</systemitem>, put the library
-    directory in the <envar>PATH</envar> or move the
-    <filename>.dll</filename> files into the <filename>bin</filename>
-    directory.
-   </para>
+# setup and enter build directory (done only first time)
+meson setup build src --prefix=$PWD/install
+cd build
 
-   <para>
-    If in doubt, refer to the manual pages of your system (perhaps
-    <command>ld.so</command> or <command>rld</command>). If you later
-    get a message like:
-<screen>
-psql: error in loading shared libraries
-libpq.so.2.1: cannot open shared object file: No such file or directory
-</screen>
-    then this step was necessary.  Simply take care of it then.
-   </para>
+# Compile source
+ninja
 
-   <para>
-    <indexterm>
-     <primary>ldconfig</primary>
-    </indexterm>
-    If you are on <systemitem class="osname">Linux</systemitem> and you have root
-    access, you can run:
-<programlisting>
-/sbin/ldconfig /usr/local/pgsql/lib
-</programlisting>
-    (or equivalent directory) after installation to enable the
-    run-time linker to find the shared libraries faster.  Refer to the
-    manual page of <command>ldconfig</command> for more information.  On
-    <systemitem class="osname">FreeBSD</systemitem>, <systemitem
-    class="osname">NetBSD</systemitem>, and <systemitem
-    class="osname">OpenBSD</systemitem> the command is:
-<programlisting>
-/sbin/ldconfig -m /usr/local/pgsql/lib
-</programlisting>
-    instead.  Other systems are not known to have an equivalent
-    command.
-   </para>
-  </sect2>
+# Install to the prefix directory specified above
+ninja install
 
-  <sect2>
-   <title>Environment Variables</title>
+# Run all tests (optional, takes time)
+meson test
 
-   <indexterm>
-    <primary><envar>PATH</envar></primary>
-   </indexterm>
+# Initialize a new database
+../install/bin/initdb -D ../data
 
-   <para>
-    If you installed into <filename>/usr/local/pgsql</filename> or some other
-    location that is not searched for programs by default, you should
-    add <filename>/usr/local/pgsql/bin</filename> (or whatever you set
-    <option><literal>--bindir</literal></option> to in <xref linkend="configure"/>)
-    into your <envar>PATH</envar>.  Strictly speaking, this is not
-    necessary, but it will make the use of <productname>PostgreSQL</productname>
-    much more convenient.
-   </para>
+# Start database
+../install/bin/pg_ctl -D ../data/ -l logfile start
 
-   <para>
-    To do this, add the following to your shell start-up file, such as
-    <filename>~/.bash_profile</filename> (or <filename>/etc/profile</filename>, if you
-    want it to affect all users):
-<programlisting>
-PATH=/usr/local/pgsql/bin:$PATH
-export PATH
-</programlisting>
-    If you are using <command>csh</command> or <command>tcsh</command>, then use this command:
-<programlisting>
-set path = ( /usr/local/pgsql/bin $path )
-</programlisting>
-   </para>
+# Connect to the database
+../install/bin/psql -d postgres
+
+</synopsis>
+   The long version is the rest of this
+   <phrase>section</phrase>.
+  </para>
+ </sect2>
+
+ <sect2 id="install-requirements-meson">
+  <title>Requirements</title>
+
+  <para>
+   In general, a modern Unix-compatible platform or Windows should be able
+   to build <productname>PostgreSQL</productname> with meson and run it.
+   The platforms which have received specific testing at the time of release are:
+
+  <itemizedlist spacing="compact">
+   <listitem><simpara>Linux</simpara></listitem>
+   <listitem><simpara>Windows</simpara></listitem>
+   <listitem><simpara>OpenBSD</simpara></listitem>
+   <listitem><simpara>NetBSD</simpara></listitem>
+   <listitem><simpara>FreeBSD</simpara></listitem>
+   <listitem><simpara>macOS</simpara></listitem>
+  </itemizedlist>
+  </para>
+
+  <sect3 id="required-packages">
+   <title>Required packages</title>
+
+   <para>
+    The following software packages are required for building
+    <productname>PostgreSQL</productname>:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You can download the source code in two ways - via git or by downloading
+      the source code tarballs. For the former, you will need an installed version of
+      <productname>Git</productname>, which you can get from
+      <ulink url="https://git-scm.com"></ulink>. Many systems already
+      have a recent version of <productname>Git</productname>
+      installed by default, or available in their package distribution system.
+      If you download the source code tarballs, you will need
+      <application>tar</application> in addition to
+      <application>gzip</application> or <application>bzip2</application>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>meson</primary>
+      </indexterm>
+      You need to install <application>
+      <ulink url="https://mesonbuild.com/">meson</ulink></application> version
+      0.54 or later to be able to build <productname>PostgreSQL</productname>
+      with it. If your operating system provides a package manager, you can install
+      <application>meson</application> with that. If not, you
+      can download a <ulink url="https://github.com/mesonbuild/meson">meson release</ulink>
+      from github and run <literal>./meson.py</literal> from the git repository
+      itself. Lastly, Meson is also available in the python package index and can
+      be installed with <literal>pip</literal>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least
+      C99-compliant). Recent
+      versions of <productname>GCC</productname> are recommended, but
+      <productname>PostgreSQL</productname> is known to build using a wide variety
+      of compilers from different vendors.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>flex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>lex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>bison</primary>
+      </indexterm>
+      <indexterm>
+       <primary>yacc</primary>
+      </indexterm>
+
+      <application>Flex</application> and <application>Bison</application>
+      are needed to build <productname>PostgreSQL</productname> using
+      <application>meson</application>. Be sure to get
+      <application>Flex</application> 2.5.31 or later and
+      <application>Bison</application> 1.875 or later from your package manager.
+      Other <application>lex</application> and <application>yacc</application>
+      programs cannot be used.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>perl</primary>
+      </indexterm>
+      <application>Perl</application> 5.8.3 or later is needed to build PostgreSQL
+      using <application>meson</application> and to run some test suites.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+  <sect3 id="recommended-packages">
+   <title>Recommended packages</title>
+
+   <para>
+   The following packages are not required to build
+   <application>PostgreSQL</application> but are strongly recommended:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>readline</primary>
+      </indexterm>
+      <indexterm>
+       <primary>libedit</primary>
+      </indexterm>
+
+      The <acronym>GNU</acronym> <productname>Readline</productname> library
+      allows <application>psql</application> (the PostgreSQL command line
+      SQL interpreter) to remember each command you type, and allows you to
+      use arrow keys to recall and edit previous commands.  This is very
+      helpful and is strongly recommended. As an alternative, you can often
+      use the BSD-licensed <filename>libedit</filename> library, originally
+      developed on <productname>NetBSD</productname>. The
+      <filename>libedit</filename> library is GNU
+      <productname>Readline</productname>-compatible and is used if
+      <filename>libreadline</filename> is not found, or if
+      <option>libedit_preferred</option> is enabled as an
+      option to <filename>meson configure</filename>. If you are using a
+      package-based Linux distribution, be aware that you need both the
+      <literal>readline</literal> and <literal>readline-devel</literal> packages, if
+      those are separate in your distribution.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>zlib</primary>
+      </indexterm>
+
+      The <productname>zlib</productname> compression library is
+      used to provide support for compressed archives in
+      <application>pg_dump</application> and
+      <application>pg_restore</application> and is recommended.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Various tests, particularly the client program tests under
+      <filename>src/bin</filename>, use the Perl TAP tools. Running
+      these tests is recommended for development. These TAP tests
+      require the Perl module <literal>IPC::Run</literal> which is
+      available from CPAN or an operating system package.
+     </para>
+    </listitem>
+   </itemizedlist>
+  </para>
+  </sect3>
+
+  <sect3 id="optional-packages">
+   <title>Optional packages</title>
+
+   <para>
+   The following packages are optional.  They are not required in the
+   default configuration, but they are needed when certain build
+   options are enabled, as explained below:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You need <productname>OpenSSL</productname>, if you want to support
+      encrypted client connections.  <productname>OpenSSL</productname> is
+      also required for random number generation on platforms that do not
+      have <filename>/dev/urandom</filename> (except Windows).  The minimum
+      required version is 1.0.1.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>LZ4</productname>, if you want to support
+      compression of data with that method; see
+      <xref linkend="guc-default-toast-compression"/> and
+      <xref linkend="guc-wal-compression"/>.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>Zstandard</productname>, if you want to support
+      compression of data or backups with that method; see
+      <xref linkend="guc-wal-compression"/>.
+      The minimum required version is 1.4.0.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <application>Kerberos</application>, <productname>OpenLDAP</productname>,
+      and/or <application>PAM</application>, if you want to support authentication
+      using those services.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the server programming language
+      <application>PL/Perl</application> you need a full
+      <productname>Perl</productname> installation, including the
+      <filename>libperl</filename> library and the header files.
+      The minimum required version is <productname>Perl</productname> 5.8.3.
+      Since <application>PL/Perl</application> will be a shared
+      library, the <indexterm><primary>libperl</primary></indexterm>
+      <filename>libperl</filename> library must be a shared library
+      also on most platforms.  This appears to be the default in
+      recent <productname>Perl</productname> versions, but it was not
+      in earlier versions, and in any case it is the choice of whomever
+      installed Perl at your site.  <filename>configure</filename> will fail
+      if building <application>PL/Perl</application> is selected but it cannot
+      find a shared <filename>libperl</filename>.  In that case, you will have
+      to rebuild and install <productname>Perl</productname> manually to be
+      able to build <application>PL/Perl</application>.  During the
+      configuration process for <productname>Perl</productname>, request a
+      shared library.
+     </para>
+
+     <para>
+      If you intend to make more than incidental use of
+      <application>PL/Perl</application>, you should ensure that the
+      <productname>Perl</productname> installation was built with the
+      <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal>
+      will show whether this is the case).
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Python</application> server programming
+      language, you need a <productname>Python</productname>
+      installation with the header files and
+      the <application>sysconfig</application> module.  The minimum
+      required version is <productname>Python</productname> 3.2.
+     </para>
+
+     <para>
+      Since <application>PL/Python</application> will be a shared
+      library, the <indexterm><primary>libpython</primary></indexterm>
+      <filename>libpython</filename> library must be a shared library
+      also on most platforms.  This is not the case in a default
+      <productname>Python</productname> installation built from source, but a
+      shared library is available in many operating system
+      distributions.  <filename>configure</filename> will fail if
+      building <application>PL/Python</application> is selected but it cannot
+      find a shared <filename>libpython</filename>.  That might mean that you
+      either have to install additional packages or rebuild (part of) your
+      <productname>Python</productname> installation to provide this shared
+      library.  When building from source, run <productname>Python</productname>'s
+      configure with the <literal>--enable-shared</literal> flag.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Tcl</application>
+      procedural language, you of course need a <productname>Tcl</productname>
+      installation.  The minimum required version is
+      <productname>Tcl</productname> 8.4.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To enable Native Language Support (<acronym>NLS</acronym>), that
+      is, the ability to display a program's messages in a language
+      other than English, you need an implementation of the
+      <application>Gettext</application> <acronym>API</acronym>.  Some operating
+      systems have this built-in (e.g., <systemitem
+      class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>,
+      <systemitem class="osname">Solaris</systemitem>), for other systems you
+      can download an add-on package from <ulink
+      url="https://www.gnu.org/software/gettext/"></ulink>.
+      If you are using the <application>Gettext</application> implementation in
+      the <acronym>GNU</acronym> C library then you will additionally
+      need the <productname>GNU Gettext</productname> package for some
+      utility programs.  For any of the other implementations you will
+      not need it.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <productname>PostgreSQL</productname> documentation,
+      there is a separate set of requirements; see
+      <xref linkend="docguide-toolsets"/>.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+ </sect2>
+
+ <sect2 id="configure-meson">
+  <title>Configuring the build</title>
+
+   <para>
+    The first step of the installation procedure is to configure the
+    source tree for your system and choose the options you would like. To
+    create and configure the build directory, you can start with the
+    <literal>meson setup</literal> command.
+   </para>
+
+<screen>
+<userinput>meson setup build</userinput>
+</screen>
+
+   <para>
+    The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal>
+    argument. If no <literal>srcdir</literal> is given Meson will deduce the
+    <literal>srcdir</literal> based on the current directory and the location
+    of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory.
+   </para>
+
+   <para>
+    Meson then loads the build configuration file and sets up the build directory.
+    Additionally, the invocation can pass options to Meson. The list of commonly
+    used options is in subsequent sections. A few examples of specifying different
+    build options are:
+
+<screen>
+#Setup build directory with a different installation prefix
+meson setup build --prefix=/home/user/pg-install
+
+#Setup build directory to generate a debug build
+meson setup build --buildtype=debug
+
+#Setup build directory with ssl (Use -D for project specific options)
+meson setup build -Dssl=openssl
+</screen>
+
+    Setting up the build directory is a one-time step. To reconfigure before a
+    new build, you can simply use the <literal>meson configure</literal> command
+   </para>
+
+<para>
+<screen>
+meson configure -Dcassert=true
+</screen>
+</para>
+
+<para>
+    <command>meson configure</command>'s commonly used command line options
+    are explained below. This list is not exhaustive (use
+    <literal>meson configure --help</literal> to get one that is).
+    The options not covered here are meant for advanced use-cases, and are
+    documented in the standard meson
+    <ulink url="https://mesonbuild.com/Commands.html#configure">documentation</ulink>.
+    These arguments can be used with <command>meson setup</command> as well.
+</para>
+
+   <sect3 id="configure-install-locations">
+    <title>Installation Locations</title>
+
+     <para>
+      These options control where <literal>ninja install (or meson install)</literal> will put
+      the files.  The <option>--prefix</option> option is sufficient for
+      most cases.  If you have special needs, you can customize the
+      installation subdirectories with the other options described in this
+      section.  Beware however that changing the relative locations of the
+      different subdirectories may render the installation non-relocatable,
+      meaning you won't be able to move it after installation.
+      (The <literal>man</literal> and <literal>doc</literal> locations are
+      not affected by this restriction.)
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term>
+       <listitem>
+        <para>
+         Install all files under the directory <replaceable>PREFIX</replaceable>
+         instead of <filename>/usr/local/pgsql</filename>. The actual
+         files will be installed into various subdirectories; no files
+         will ever be installed directly into the
+         <replaceable>PREFIX</replaceable> directory.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the directory for executable programs. The default
+         is <filename><replaceable>PREFIX</replaceable>/bin</filename>, which
+         normally means <filename>/usr/local/pgsql/bin</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for various configuration files,
+         <filename><replaceable>PREFIX</replaceable>/etc</filename> by default.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the location to install libraries and dynamically loadable
+         modules. The default is
+         <filename><replaceable>PREFIX</replaceable>/lib</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing C and C++ header files. The
+         default is <filename><replaceable>PREFIX</replaceable>/include</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for read-only data files used by the
+         installed programs. The default is
+         <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has
+         nothing to do with where your database files will be placed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing locale data, in particular
+         message translation catalog files.  The default is
+         <filename><replaceable>DATADIR</replaceable>/locale</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         The man pages that come with <productname>PostgreSQL</productname> will be installed under
+         this directory, in their respective
+         <filename>man<replaceable>x</replaceable></filename> subdirectories.
+         The default is <filename><replaceable>DATADIR</replaceable>/man</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+
+  <note>
+      <para>
+       Care has been taken to make it possible to install
+       <productname>PostgreSQL</productname> into shared installation locations
+       (such as <filename>/usr/local/include</filename>) without
+       interfering with the namespace of the rest of the system. First,
+       the string <quote><literal>/postgresql</literal></quote> is
+       automatically appended to <varname>datadir</varname>,
+       <varname>sysconfdir</varname>, and <varname>docdir</varname>,
+       unless the fully expanded directory name already contains the
+       string <quote><literal>postgres</literal></quote> or
+       <quote><literal>pgsql</literal></quote>. For example, if you choose
+       <filename>/usr/local</filename> as prefix, the documentation will
+       be installed in <filename>/usr/local/doc/postgresql</filename>,
+       but if the prefix is <filename>/opt/postgres</filename>, then it
+       will be in <filename>/opt/postgres/doc</filename>. The public C
+       header files of the client interfaces are installed into
+       <varname>includedir</varname> and are namespace-clean. The
+       internal header files and the server header files are installed
+       into private directories under <varname>includedir</varname>. See
+       the documentation of each interface for information about how to
+       access its header files. Finally, a private subdirectory will
+       also be created, if appropriate, under <varname>libdir</varname>
+       for dynamically loadable modules.
+      </para>
+     </note>
+    </sect3>
+
+    <sect3 id="configure-pg-features">
+    <title><productname>PostgreSQL</productname> Features</title>
+
+    <para>
+     The options described in this section enable building of
+     various <productname>PostgreSQL</productname> features that are not
+     built by default.  Most of these are non-default only because they
+     require additional software, as described in
+     <xref linkend="install-requirements-meson"/>. To specify PostgreSQL
+     specific options, the name of the option should be prefixed by -D.
+    </para>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>-Dnls=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Enables or disables Native Language Support (<acronym>NLS</acronym>),
+         that is, the ability to display a program's messages in a
+         language other than English. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To use this option, you will need an implementation of the
+         <application>Gettext</application> API.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplperl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Perl</application> server-side language. It
+         defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplpython=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Python</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpltcl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Tcl</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the TCL version to use when building PL/Tcl.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dicu=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for
+         the <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm>
+         library, enabling use of ICU collation
+         features<phrase condition="standalone-ignore"> (see
+         <xref linkend="collation"/>)</phrase>.
+         This requires the <productname>ICU4C</productname> package
+         to be installed.  The minimum required version
+         of <productname>ICU4C</productname> is currently 4.2.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+
+        <para>
+         By default,
+         <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm>
+         will be used to find the required compilation options.  This is
+         supported for <productname>ICU4C</productname> version 4.6 and later.
+         <!-- Add description for older ICU4C versions and when pkg-config isn't available-->
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="configure-with-llvm-meson">
+       <term><option>-Dllvm=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for <productname>LLVM</productname> based
+         <acronym>JIT</acronym> compilation<phrase
+         condition="standalone-ignore"> (see <xref
+         linkend="jit"/>)</phrase>.  This
+         requires the <productname>LLVM</productname> library to be installed.
+         The minimum required version of <productname>LLVM</productname> is
+         currently 3.9. It is set to disabled by default.
+        </para>
+        <para>
+         <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
+         will be used to find the required compilation options.
+         <command>llvm-config</command>, and then
+         <command>llvm-config-$major-$minor</command> for all supported
+         versions, will be searched for in your <envar>PATH</envar>.
+         <!--Add substitute fo LLVM_CONFIG when llvm-config is not in PATH-->
+        </para>
+
+        <para>
+         <productname>LLVM</productname> support requires a compatible
+         <command>clang</command> compiler (specified, if necessary, using the
+         <envar>CLANG</envar> environment variable), and a working C++
+         compiler (specified, if necessary, using the <envar>CXX</envar>
+         environment variable).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlz4=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>LZ4</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzstd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>Zstandard</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dssl=<replaceable>LIBRARY</replaceable></option>
+       <indexterm>
+        <primary>OpenSSL</primary>
+        <seealso>SSL</seealso>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Build with support for <acronym>SSL</acronym> (encrypted)
+         connections. The only <replaceable>LIBRARY</replaceable>
+         supported is <option>openssl</option>. This requires the
+         <productname>OpenSSL</productname> package to be installed.
+         <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenSSL</productname> installation is sufficient
+         before proceeding. The default for this option is none.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dgssapi=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for GSSAPI authentication. On many systems, the
+         GSSAPI system (usually a part of the Kerberos installation) is not
+         installed in a location
+         that is searched by default (e.g., <filename>/usr/include</filename>,
+         <filename>/usr/lib</filename>), so you must use the options
+         <option>-Dextra_include_dirs</option> and <option>-Dextra_lib_dirs</option> in
+         addition to this option.  <filename>meson configure</filename> will check
+         for the required header files and libraries to make sure that
+         your GSSAPI installation is sufficient before proceeding.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dldap=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm>
+         support for authentication and connection parameter lookup (see
+         <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and
+         <xref linkend="auth-ldap"/></phrase> for more information). On Unix,
+         this requires the <productname>OpenLDAP</productname> package to be
+         installed. On Windows, the default <productname>WinLDAP</productname>
+         library is used.  <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenLDAP</productname> installation is sufficient before
+         proceeding. It defaults to auto, meaning that it will be enabled automatically
+         if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpam=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm>
+         (Pluggable Authentication Modules) support. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbsd_auth=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with BSD Authentication support. (The BSD Authentication framework is
+         currently only available on OpenBSD.) It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystemd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support
+         for <application>systemd</application><indexterm><primary>systemd</primary></indexterm>
+         service notifications.  This improves integration if the server
+         is started under <application>systemd</application> but has no impact
+         otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more
+         information</phrase>.  <application>libsystemd</application> and the
+         associated header files need to be installed to use this option.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbonjour=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for Bonjour automatic service discovery.
+         This requires Bonjour support in your operating system.
+         Recommended on macOS. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <xref linkend="uuid-ossp"/> module
+         (which provides functions to generate UUIDs), using the specified
+         UUID library.<indexterm><primary>UUID</primary></indexterm>
+         <replaceable>LIBRARY</replaceable> must be one of:
+        </para>
+        <itemizedlist>
+         <listitem>
+          <para>
+           <option>none</option> to not build the ussp module. This is the default.
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>bsd</option> to use the UUID functions found in FreeBSD, NetBSD,
+           and some other BSD-derived systems
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>e2fs</option> to use the UUID library created by
+           the <literal>e2fsprogs</literal> project; this library is present in most
+           Linux systems and in macOS, and can be obtained for other
+           platforms as well
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>ossp</option> to use the <ulink
+           url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
+          </para>
+         </listitem>
+        </itemizedlist>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxml=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxml2, enabling SQL/XML support.  Libxml2 version 2.6.23 or
+         later is required for this feature. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To detect the required compiler and linker options, PostgreSQL will
+         query <command>pkg-config</command>, if that is installed and knows
+         about libxml2.  Otherwise the program <command>xml2-config</command>,
+         which is installed by libxml2, will be used if it is found.  Use
+         of <command>pkg-config</command> is preferred, because it can deal
+         with multi-architecture installations better.
+        </para>
+
+        <para>
+         To use a libxml2 installation that is in an unusual location, you
+         can set <command>pkg-config</command>-related environment
+         variables (see its documentation).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxslt=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxslt, enabling the
+         <xref linkend="xml2"/>
+         module to perform XSL transformations of XML.
+         <option>-Dlibxml</option> must be specified as well.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dreadline=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Allows use of the <application>Readline</application> library
+         (and <application>libedit</application> as well).  This option enables
+         command-line editing and history in
+         <application>psql</application> and is strongly recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibedit_preferred=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this to true favors the use of the BSD-licensed <application>libedit</application> library
+         rather than GPL-licensed <application>Readline</application>.  This option
+         is significant only if you have both libraries installed; the
+         default is false that is to use <application>Readline</application>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzlib=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>zlib</primary>
+         </indexterm>
+         Enabls use of the <application>Zlib</application> library.
+         This enables
+         support for compressed archives in <application>pg_dump</application>
+         and <application>pg_restore</application> and is recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dspinlocks=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true by default and
+         setting it to false will allow the build to succeed even if <productname>PostgreSQL</productname>
+         has no CPU spinlock support for the platform.  The lack of
+         spinlock support will result in very poor performance; therefore,
+         this option should only be changed if the build aborts and
+         informs you that the platform lacks spinlock support. If setting this
+         option to false is required to build <productname>PostgreSQL</productname> on
+         your platform, please report the problem to the
+         <productname>PostgreSQL</productname> developers.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Datomics=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true and setting it to false will
+         disable use of CPU atomic operations.  The option does nothing on
+         platforms that lack such operations.  On platforms that do have
+         them, disabling atomics will result in poor performance.  Changing
+         this option is only useful for debugging or making performance comparisons.
+        </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-build-process">
+    <title>Build Process Details</title>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>--auto_features=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this option allows you to override value of all 'auto' features.
+         This can be useful when you want to disable or enable all the "optional"
+         features at once without having to set each of them manually. The default
+         value for this parameter is auto.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--backend=<replaceable>BACKEND</replaceable></option></term>
+       <listitem>
+        <para>
+         The default backend meson uses is ninja and that should suffice for most use cases.
+         However, if you'd like to fully integrate with visual studio, you can set the
+         BACKEND to <command>vs</command>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C compiler.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C linker.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories that will be added to the list the compiler
+         searches for header files. If you have optional packages
+         (such as GNU <application>Readline</application>) installed in a non-standard
+         location,
+         you have to use this option and probably also the corresponding
+         <option>-Dextra_lib_dirs</option> option.
+        </para>
+        <para>
+         Example: <literal>-Dextra_include_dirs=/opt/gnu/include:/usr/sup/include</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories to search for libraries. You will probably have
+         to use this option (and the corresponding
+         <option>-Dextra_include_dirs</option> option) if you have packages
+         installed in non-standard locations.
+        </para>
+        <para>
+         Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib:/usr/sup/lib</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option>
+       <indexterm>
+        <primary>time zone data</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <productname>PostgreSQL</productname> includes its own time zone database,
+         which it requires for date and time operations.  This time zone
+         database is in fact compatible with the IANA time zone
+         database provided by many operating systems such as FreeBSD,
+         Linux, and Solaris, so it would be redundant to install it again.
+         When this option is used, the system-supplied time zone database
+         in <replaceable>DIRECTORY</replaceable> is used instead of the one
+         included in the PostgreSQL source distribution.
+         <replaceable>DIRECTORY</replaceable> must be specified as an
+         absolute path.  <filename>/usr/share/zoneinfo</filename> is a
+         likely directory on some operating systems.  Note that the
+         installation routine will not detect mismatching or erroneous time
+         zone data.  If you use this option, you are advised to run the
+         regression tests to verify that the time zone data you have
+         pointed to works correctly with <productname>PostgreSQL</productname>.
+        </para>
+
+        <indexterm><primary>cross compilation</primary></indexterm>
+
+        <para>
+         This option is mainly aimed at binary package distributors
+         who know their target operating system well.  The main
+         advantage of using this option is that the PostgreSQL package
+         won't need to be upgraded whenever any of the many local
+         daylight-saving time rules change.  Another advantage is that
+         PostgreSQL can be cross-compiled more straightforwardly if the
+         time zone database files do not need to be built during the
+         installation.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term>
+       <listitem>
+        <para>
+         Append <replaceable>STRING</replaceable> to the PostgreSQL version number.  You
+         can use this, for example, to mark binaries built from unreleased Git
+         snapshots or containing custom patches with an extra version string,
+         such as a <command>git describe</command> identifier or a
+         distribution package release number.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term>
+       <listitem>
+        <para>
+         If you have the binaries for certain by programs required to build
+         Postgres (with or without optional flags) stored at non-standard
+         paths, you could specify them manually to meson configure. The complete
+         list of programs for whom this is supported can be found by running
+         <literal>meson configure</literal>. An example is included below.
+<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting>
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-layout">
+    <title>Data layout</title>
+
+    <para>
+     These options affect how PostgreSQL lays out data on disk.
+     Note that changing these breaks on-disk database compatibility,
+     meaning you cannot use <command>pg_upgrade</command> to upgrade to
+     a build with a different value of these options.
+    </para>
+
+    <variablelist>
+
+      <varlistentry>
+       <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>segment size</firstterm>, in gigabytes.  Large tables are
+         divided into multiple operating-system files, each of size equal
+         to the segment size.  This avoids problems with file size limits
+         that exist on many platforms.  The default segment size, 1 gigabyte,
+         is safe on all supported platforms.  If your operating system has
+         <quote>largefile</quote> support (which most do, nowadays), you can use
+         a larger segment size.  This can be helpful to reduce the number of
+         file descriptors consumed when working with very large tables.
+         But be careful not to select a value larger than is supported
+         by your platform and the file systems you intend to use.  Other
+         tools you might wish to use, such as <application>tar</application>, could
+         also set limits on the usable file size.
+         It is recommended, though not absolutely required, that this value
+         be a power of 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within tables.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 32 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>WAL block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within the WAL log.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 64 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-devel">
+    <title>Developer Options</title>
+
+    <para>
+     Most of the options in this section are only of interest for
+     developing or debugging <productname>PostgreSQL</productname>.
+     They are not recommended for production builds, except
+     for <option>--debug</option>, which can be useful to enable
+     detailed bug reports in the unlucky event that you encounter a bug.
+     On platforms supporting DTrace, <option>-Ddtrace</option>
+     may also be reasonable to use in production.
+    </para>
+
+    <para>
+     When building an installation that will be used to develop code inside
+     the server, it is recommended to use atleast the <option>--buildtype=debug</option>
+     and <option>-Dcassert</option> options.
+    </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term>
+       <listitem>
+        <para>
+         This option can be used to specify the buildtype to use; defaults
+         to release. If you'd like finer control on the debug symbols
+         and optimization levels than what this option provides, you can
+         refer to the --debug and --optimization flags.
+
+         The following build types are generally used:
+         <variablelist>
+          <varlistentry>
+           <term><literal>plain</literal></term>
+           <listitem>
+            <para>
+            No extra build flags are used, even for compiler warnings,
+            useful for distro packagers and other cases where you need to
+            specify all arguments by yourself.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debug</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated but the result is not optimized.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debugoptimized</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated and the code is optimized (on most compilers
+            this means <literal>-g -O2</literal>)
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>release</literal></term>
+           <listitem>
+            <para>
+            This enables full optimization and no debug info is generated. This is
+            the default.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--debug</option></term>
+       <listitem>
+        <para>
+         Compiles all programs and libraries with debugging symbols.
+         This means that you can run the programs in a debugger
+         to analyze problems. This enlarges the size of the installed
+         executables considerably, and on non-GCC compilers it usually
+         also disables compiler optimization, causing slowdowns. However,
+         having the symbols available is extremely helpful for dealing
+         with any problems that might arise.  Currently, this option is
+         recommended for production installations only if you use GCC.
+         But you should always have it on if you are doing development work
+         or running a beta version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term>
+       <listitem>
+        <para>
+         Specify the optimization level. LEVEL can be set to any of {0,g,1,2,3,s}.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--werror</option></term>
+       <listitem>
+        <para>
+         Setting this option asks the compiler to treat warnings as errors. This can
+         be useful for code development purposes.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dcassert</option></term>
+       <listitem>
+        <para>
+         Enables <firstterm>assertion</firstterm> checks in the server, which test for
+         many <quote>cannot happen</quote> conditions.  This is invaluable for
+         code development purposes, but the tests can slow down the
+         server significantly.
+         Also, having the tests turned on won't necessarily enhance the
+         stability of your server!  The assertion checks are not categorized
+         for severity, and so what might be a relatively harmless bug will
+         still lead to server restarts if it triggers an assertion
+         failure.  This option is not recommended for production use, but
+         you should have it on for development work or when running a beta
+         version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtap-tests</option></term>
+       <listitem>
+        <para>
+         Enable tests using the Perl TAP tools.  This requires a Perl
+         installation and the Perl module <literal>IPC::Run</literal>.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term>
+       <listitem>
+        <para>
+         Enable test suites which require special software to run. This option
+         accepts arguments via a whitespace-separated list. The following values
+         are currently supported:
+         <variablelist>
+          <varlistentry>
+           <term><literal>kerberos</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/kerberos</filename>.  This
+            requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ldap</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ldap</filename>.  This
+            requires an <productname>OpenLDAP</productname> installation and opens
+            TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ssl</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ssl</filename>.  This opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>wal_consistency_checking</literal></term>
+           <listitem>
+            <para>
+            Uses <literal>wal_consistency_checking=all</literal> while running
+            certain tests under <filename>src/test/recovery</filename>.  Not
+            enabled by default because it is resource intensive.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+         Tests for features that are not supported by the current build
+         configuration are not run even if they are mentioned in
+         <varname>PG_TEST_EXTRA</varname>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--errorlogs</option></term>
+       <listitem>
+        <para>
+        This option can be used to print the logs from the failing tests
+        making debugging easier.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Db_coverage</option></term>
+       <listitem>
+        <para>
+         If using GCC, all programs and libraries are compiled with
+         code coverage testing instrumentation.  When run, they
+         generate files in the build directory with code coverage
+         metrics.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/>
+         for more information.</phrase> This option is for use only with GCC
+         and when doing development work.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Ddtrace=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>DTrace</primary>
+         </indexterm>
+         Enabling this compiles <productname>PostgreSQL</productname> with support for the
+         dynamic tracing tool DTrace.
+         <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/>
+         for more information.</phrase>
+        </para>
+
+        <para>
+         To point to the <command>dtrace</command> program, the
+         environment variable <envar>DTRACE</envar> can be set.  This
+         will often be necessary because <command>dtrace</command> is
+         typically installed under <filename>/usr/sbin</filename>,
+         which might not be in your <envar>PATH</envar>.
+        </para>
+
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-misc">
+    <title>Miscellaneous</title>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term>
+       <listitem>
+        <para>
+         Set <replaceable>NUMBER</replaceable> as the default port number for
+         server and clients. The default is 5432. The port can always
+         be changed later on, but if you specify it here then both
+         server and clients will have the same default compiled in,
+         which can be very convenient.  Usually the only good reason
+         to select a non-default value is if you intend to run multiple
+         <productname>PostgreSQL</productname> servers on the same machine.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term>
+       <listitem>
+        <para>
+         The default name of the Kerberos service principal used
+         by GSSAPI.
+         <literal>postgres</literal> is the default. There's usually no
+         reason to change this unless you are building for a Windows
+         environment, in which case it must be set to upper case
+         <literal>POSTGRES</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+ </sect2>
+
+ <sect2 id="build-meson">
+  <title>Building the source</title>
+   <para>
+    By default, <productname>Meson</productname> uses the
+    <ulink url="https://ninja-build.org/"> Ninja build system</ulink>.
+    To build <productname>PostgreSQL</productname> from source using meson, you can
+    simply use the <literal>ninja</literal> command in the build directory.
+<screen>
+ninja
+</screen>
+     Ninja will automatically detect the number of CPUs in your computer and
+     parallelize itself accordingly. You can override the amount of parallel
+     processes used with the command line argument <literal>-j</literal>.
+   </para>
+
+   <para>
+     It should be noted that after the initial configure step
+     <command>ninja</command> is the only command you ever need to type to
+     compile. No matter how you alter your source tree (short of moving it to
+     a completely new location), Meson will detect the changes and regenerate
+     itself accordingly. This is especially handy if you have multiple build
+     directories. Often one of them is used for development (the "debug" build)
+     and others only every now and then (such as a "static analysis" build).
+     Any configuration can be built just by cd'ing to the corresponding directory
+     and running Ninja.
+   </para>
+
+   <para>
+     If you'd like to build with a backend other that ninja, you can use configure
+     with the <option>--backend</option> option to select the one you want to use and then
+     build using <literal>meson compile</literal>. To learn more about these
+     backends and other arguments you can provide to ninja, you can refer to the
+     meson <ulink url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
+     documentation</ulink>.
+   </para>
+ </sect2>
+
+ <sect2 id="install-files-meson">
+  <title>Installing the files</title>
+   <para>
+    Once Postgres is built, you can install it by simply running the
+    <literal>ninja install</literal> command.
+
+<screen>
+ninja install
+</screen>
+   </para>
+
+   <para>
+    This will install files into the directories that were specified
+    in <xref linkend="configure-meson"/>. Make sure that you have appropriate
+    permissions to write into that area. You might need to do this
+    step as root. Alternatively, you can create the target directories
+    in advance and arrange for appropriate permissions to be granted.
+    The standard installation provides all the header files needed for client
+    application development as well as for server-side program
+    development, such as custom functions or data types written in C.
+   </para>
+
+   <para>
+    <literal>ninja install</literal> should work for most cases
+    but if you'd like to use more options, you could also use
+    <literal>meson install</literal> instead. You can learn more about
+    <ulink url="https://mesonbuild.com/Commands.html#install">meson install</ulink>
+    and it's options in the meson documentation.
+   </para>
+
+   <para>
+    Depending on your platform and setup, you might have to perform a
+    few steps after installation. Those are outlined in
+    <xref linkend="install-post"/>.
+   </para>
+
+  <formalpara>
+   <title>Uninstallation:</title>
+   <para>
+    To undo the installation, you can use the <command>ninja
+    uninstall</command> command.
+   </para>
+  </formalpara>
+
+  <formalpara>
+   <title>Cleaning:</title>
+   <para>
+    After the installation you can free disk space by removing the built
+    files from the source tree with the <command>ninja clean</command>
+    command.
+   </para>
+  </formalpara>
+
+ </sect2>
+
+ <sect2 id="running-tests">
+  <title>Running tests</title>
+   <para>
+    If you want to test the newly built server, you can run the regression
+    tests. The regression tests are a collection of test suites to verify
+    that <productname>PostgreSQL</productname> runs on your machine in
+    the way the developers expected it to. To run them, simply type:
+<screen>
+<userinput>meson test</userinput>
+</screen>
+    You can repeat this at any later time by issuing the same command.
+   </para>
+
+   <para>Meson also allows you to list tests and run specific tests or suites.
+<screen>
+# List all tests
+<userinput>meson test --list</userinput>
+
+# Run a specific test
+<userinput>meson test recovery/001_stream_rep</userinput>
+
+# Run the main pg_regress and isolation tests
+<userinput>meson test --suite main</userinput>
+</screen>
+   </para>
+
+   <para>
+    To learn more about running the tests and how to interpret the results
+    you can refer to the documentation for interpreting test results.
+     <literal>meson test</literal> also provides a number of additional
+    options you can use which can be found in the
+    <ulink url="https://mesonbuild.com/Unit-tests.html#testing-tool">meson test documentation</ulink>.
+   </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="install-post">
+  <title>Post-Installation Setup</title>
+
+  <sect2 id="install-post-shlibs">
+   <title>Shared Libraries</title>
+
+   <indexterm>
+    <primary>shared library</primary>
+   </indexterm>
+
+   <para>
+    On some systems with shared libraries
+    you need to tell the system how to find the newly installed
+    shared libraries.  The systems on which this is
+    <emphasis>not</emphasis> necessary include
+    <systemitem class="osname">FreeBSD</systemitem>,
+    <systemitem class="osname">Linux</systemitem>,
+    <systemitem class="osname">NetBSD</systemitem>, <systemitem
+    class="osname">OpenBSD</systemitem>, and
+    <systemitem class="osname">Solaris</systemitem>.
+   </para>
+
+   <para>
+    The method to set the shared library search path varies between
+    platforms, but the most widely-used method is to set the
+    environment variable <envar>LD_LIBRARY_PATH</envar> like so: In Bourne
+    shells (<command>sh</command>, <command>ksh</command>, <command>bash</command>, <command>zsh</command>):
+<programlisting>
+LD_LIBRARY_PATH=/usr/local/pgsql/lib
+export LD_LIBRARY_PATH
+</programlisting>
+    or in <command>csh</command> or <command>tcsh</command>:
+<programlisting>
+setenv LD_LIBRARY_PATH /usr/local/pgsql/lib
+</programlisting>
+    Replace <literal>/usr/local/pgsql/lib</literal> with whatever you set
+    <option><literal>--libdir</literal></option> to in <xref linkend="configure"/>.
+    You should put these commands into a shell start-up file such as
+    <filename>/etc/profile</filename> or <filename>~/.bash_profile</filename>.  Some
+    good information about the caveats associated with this method can
+    be found at <ulink
+    url="http://xahlee.info/UnixResource_dir/_/ldpath.html"></ulink>.
+   </para>
+
+   <para>
+    On some systems it might be preferable to set the environment
+    variable <envar>LD_RUN_PATH</envar> <emphasis>before</emphasis>
+    building.
+   </para>
+
+   <para>
+    On <systemitem class="osname">Cygwin</systemitem>, put the library
+    directory in the <envar>PATH</envar> or move the
+    <filename>.dll</filename> files into the <filename>bin</filename>
+    directory.
+   </para>
+
+   <para>
+    If in doubt, refer to the manual pages of your system (perhaps
+    <command>ld.so</command> or <command>rld</command>). If you later
+    get a message like:
+<screen>
+psql: error in loading shared libraries
+libpq.so.2.1: cannot open shared object file: No such file or directory
+</screen>
+    then this step was necessary.  Simply take care of it then.
+   </para>
+
+   <para>
+    <indexterm>
+     <primary>ldconfig</primary>
+    </indexterm>
+    If you are on <systemitem class="osname">Linux</systemitem> and you have root
+    access, you can run:
+<programlisting>
+/sbin/ldconfig /usr/local/pgsql/lib
+</programlisting>
+    (or equivalent directory) after installation to enable the
+    run-time linker to find the shared libraries faster.  Refer to the
+    manual page of <command>ldconfig</command> for more information.  On
+    <systemitem class="osname">FreeBSD</systemitem>, <systemitem
+    class="osname">NetBSD</systemitem>, and <systemitem
+    class="osname">OpenBSD</systemitem> the command is:
+<programlisting>
+/sbin/ldconfig -m /usr/local/pgsql/lib
+</programlisting>
+    instead.  Other systems are not known to have an equivalent
+    command.
+   </para>
+  </sect2>
+
+  <sect2>
+   <title>Environment Variables</title>
+
+   <indexterm>
+    <primary><envar>PATH</envar></primary>
+   </indexterm>
+
+   <para>
+    If you installed into <filename>/usr/local/pgsql</filename> or some other
+    location that is not searched for programs by default, you should
+    add <filename>/usr/local/pgsql/bin</filename> (or whatever you set
+    <option><literal>--bindir</literal></option> to in <xref linkend="configure"/>)
+    into your <envar>PATH</envar>.  Strictly speaking, this is not
+    necessary, but it will make the use of <productname>PostgreSQL</productname>
+    much more convenient.
+   </para>
+
+   <para>
+    To do this, add the following to your shell start-up file, such as
+    <filename>~/.bash_profile</filename> (or <filename>/etc/profile</filename>, if you
+    want it to affect all users):
+<programlisting>
+PATH=/usr/local/pgsql/bin:$PATH
+export PATH
+</programlisting>
+    If you are using <command>csh</command> or <command>tcsh</command>, then use this command:
+<programlisting>
+set path = ( /usr/local/pgsql/bin $path )
+</programlisting>
+   </para>
 
    <para>
     <indexterm>
@@ -2106,62 +3797,6 @@ export MANPATH
   </sect2>
  </sect1>
 
- <sect1 id="supported-platforms">
-  <title>Supported Platforms</title>
-
-  <para>
-   A platform (that is, a CPU architecture and operating system combination)
-   is considered supported by the <productname>PostgreSQL</productname> development
-   community if the code contains provisions to work on that platform and
-   it has recently been verified to build and pass its regression tests
-   on that platform.  Currently, most testing of platform compatibility
-   is done automatically by test machines in the
-   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
-   If you are interested in using <productname>PostgreSQL</productname> on a platform
-   that is not represented in the build farm, but on which the code works
-   or can be made to work, you are strongly encouraged to set up a build
-   farm member machine so that continued compatibility can be assured.
-  </para>
-
-  <para>
-   In general, <productname>PostgreSQL</productname> can be expected to work on
-   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
-   and PA-RISC, including
-   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
-   It is often
-   possible to build on an unsupported CPU type by configuring with
-   <option>--disable-spinlocks</option>, but performance will be poor.
-  </para>
-
-  <para>
-   <productname>PostgreSQL</productname> can be expected to work on current
-   versions of these operating systems: Linux, Windows,
-   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
-   Other Unix-like systems may also work but are not currently
-   being tested.  In most cases, all CPU architectures supported by
-   a given operating system will work.  Look in
-   <xref linkend="installation-platform-notes"/> below to see if
-   there is information
-   specific to your operating system, particularly if using an older system.
-  </para>
-
-  <para>
-   If you have installation problems on a platform that is known
-   to be supported according to recent build farm results, please report
-   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
-   in porting <productname>PostgreSQL</productname> to a new platform,
-   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
-   to discuss that.
-  </para>
-
-  <para>
-   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
-   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
-   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
-   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
-   Tru64 UNIX, and ULTRIX.
-  </para>
- </sect1>
 
  <sect1 id="installation-platform-notes">
   <title>Platform-Specific Notes</title>
@@ -2170,7 +3805,7 @@ export MANPATH
    This section documents additional platform-specific issues
    regarding the installation and setup of PostgreSQL.  Be sure to
    read the installation instructions, and in
-   particular <xref linkend="install-requirements"/> as well.  Also,
+   particular <xref linkend="install-requirements-make"/> as well.  Also,
    check <xref linkend="regress"/> regarding the
    interpretation of regression test results.
   </para>
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 1d9509a2f6..214e1b1d55 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -7072,7 +7072,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
    explicitly tell the configure script to make the probes available
    in <productname>PostgreSQL</productname>. To include DTrace support
    specify <option>--enable-dtrace</option> to configure.  See <xref
-   linkend="install-procedure"/> for further information.
+   linkend="configure-options-devel"/> for further information.
   </para>
   </sect2>
 
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index c802c0c5f5..3d860550d7 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1855,7 +1855,7 @@ $ <userinput>kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</userinput
     <step>
      <para>
       Install the new version of <productname>PostgreSQL</productname> as
-      outlined in <xref linkend="install-procedure"/>.
+      outlined in <xref linkend="installation"/>.
      </para>
     </step>
 
diff --git a/doc/src/sgml/sourcerepo.sgml b/doc/src/sgml/sourcerepo.sgml
index 0ed7f8a3fe..f16be29a61 100644
--- a/doc/src/sgml/sourcerepo.sgml
+++ b/doc/src/sgml/sourcerepo.sgml
@@ -20,9 +20,10 @@
    Note that building <productname>PostgreSQL</productname> from the source
    repository requires reasonably up-to-date versions of <application>bison</application>,
    <application>flex</application>, and <application>Perl</application>. These tools are not needed
-   to build from a distribution tarball, because the files that these tools
+   to build from a distribution tarball if building via make, because the files that these tools
    are used to build are included in the tarball.  Other tool requirements
-   are the same as shown in <xref linkend="install-requirements"/>.
+   are the same as shown in <xref linkend="install-requirements-make"/> and
+   <xref linkend="install-requirements-meson"/>.
   </para>
 
  <sect1 id="git">
#293John Naylor
john.naylor@enterprisedb.com
In reply to: Peter Eisentraut (#287)
1 attachment(s)
Re: build remaining Flex files standalone

On Wed, Sep 7, 2022 at 4:27 PM Peter Eisentraut
<peter.eisentraut@enterprisedb.com> wrote:

On 04.09.22 20:17, Andres Freund wrote:

I think, as a followup improvement, we should move gramparse.h to
src/backend/parser, and stop installing gram.h, gramparse.h. gramparse.h
already had this note:

* NOTE: this file is only meant to be included in the core parsing files,
* i.e., parser.c, gram.y, and scan.l.
* Definitions that are needed outside the core parser should be in parser.h.

What do you think?

I found in my notes:

* maybe gram.h and gramparse.h should not be installed

So, yeah. ;-)

It seems gramparse.h isn't installed now? In any case, here's a patch
to move gramparse to the backend dir and stop symlinking/ installing
gram.h. Confusingly, MSVC didn't seem to copy gram.h to src/include,
so I'm not yet sure how it still managed to build...

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v1-0001-Move-gramparse.h-to-src-backend-parser.patchtext/x-patch; charset=US-ASCII; name=v1-0001-Move-gramparse.h-to-src-backend-parser.patchDownload
From ff89180d7b0fe4c95a470a657ee465c5384d6ecc Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 9 Sep 2022 11:57:39 +0700
Subject: [PATCH v1] Move gramparse.h to src/backend/parser

This allows removal of makefile rules that symlink gram.h to
src/include/parser. While at it, stop installing gram.h. This
seems unnecessary at present time.

Idea from Andres Freund and Peter Eisentraut
Discussion: https://www.postgresql.org/message-id/20220904181759.px6uosll6zbxcum5%40awork3.anarazel.de
---
 src/backend/Makefile                        | 7 +------
 src/backend/parser/gram.y                   | 2 +-
 src/{include => backend}/parser/gramparse.h | 4 ++--
 src/backend/parser/parser.c                 | 2 +-
 src/backend/parser/scan.l                   | 2 +-
 src/include/Makefile                        | 4 ++--
 src/include/parser/.gitignore               | 1 -
 src/tools/msvc/Install.pm                   | 4 ----
 src/tools/pginclude/cpluspluscheck          | 1 -
 src/tools/pginclude/headerscheck            | 1 -
 10 files changed, 8 insertions(+), 20 deletions(-)
 rename src/{include => backend}/parser/gramparse.h (97%)
 delete mode 100644 src/include/parser/.gitignore

diff --git a/src/backend/Makefile b/src/backend/Makefile
index 5c4772298d..42cc3bda1d 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -153,12 +153,7 @@ submake-utils-headers:
 
 .PHONY: generated-headers
 
-generated-headers: $(top_builddir)/src/include/parser/gram.h $(top_builddir)/src/include/storage/lwlocknames.h submake-catalog-headers submake-nodes-headers submake-utils-headers
-
-$(top_builddir)/src/include/parser/gram.h: parser/gram.h
-	prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \
-	  cd '$(dir $@)' && rm -f $(notdir $@) && \
-	  $(LN_S) "$$prereqdir/$(notdir $<)" .
+generated-headers: $(top_builddir)/src/include/storage/lwlocknames.h submake-catalog-headers submake-nodes-headers submake-utils-headers
 
 $(top_builddir)/src/include/storage/lwlocknames.h: storage/lmgr/lwlocknames.h
 	prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 0492ff9a66..668ad3fa8e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -55,9 +55,9 @@
 #include "catalog/pg_trigger.h"
 #include "commands/defrem.h"
 #include "commands/trigger.h"
+#include "gramparse.h"
 #include "nodes/makefuncs.h"
 #include "nodes/nodeFuncs.h"
-#include "parser/gramparse.h"
 #include "parser/parser.h"
 #include "storage/lmgr.h"
 #include "utils/date.h"
diff --git a/src/include/parser/gramparse.h b/src/backend/parser/gramparse.h
similarity index 97%
rename from src/include/parser/gramparse.h
rename to src/backend/parser/gramparse.h
index 41b753a96c..c4726c618d 100644
--- a/src/include/parser/gramparse.h
+++ b/src/backend/parser/gramparse.h
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * src/include/parser/gramparse.h
+ * src/backend/parser/gramparse.h
  *
  *-------------------------------------------------------------------------
  */
@@ -26,7 +26,7 @@
  * NB: include gram.h only AFTER including scanner.h, because scanner.h
  * is what #defines YYLTYPE.
  */
-#include "parser/gram.h"
+#include "gram.h"
 
 /*
  * The YY_EXTRA data that a flex scanner allows us to pass around.  Private
diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c
index 50227cc098..ef85d3bb68 100644
--- a/src/backend/parser/parser.c
+++ b/src/backend/parser/parser.c
@@ -22,7 +22,7 @@
 #include "postgres.h"
 
 #include "mb/pg_wchar.h"
-#include "parser/gramparse.h"
+#include "gramparse.h"
 #include "parser/parser.h"
 #include "parser/scansup.h"
 
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 882e081aae..db8b0fe8eb 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -36,7 +36,7 @@
 #include <unistd.h>
 
 #include "common/string.h"
-#include "parser/gramparse.h"
+#include "gramparse.h"
 #include "parser/parser.h"		/* only needed for GUC variables */
 #include "parser/scansup.h"
 #include "port/pg_bitutils.h"
diff --git a/src/include/Makefile b/src/include/Makefile
index 0b4cab9bb1..2858fdb4c8 100644
--- a/src/include/Makefile
+++ b/src/include/Makefile
@@ -55,7 +55,7 @@ install: all installdirs
 	  cp $(srcdir)/$$dir/*.h '$(DESTDIR)$(includedir_server)'/$$dir/ || exit; \
 	done
 ifeq ($(vpath_build),yes)
-	for file in catalog/schemapg.h catalog/system_fk_info.h catalog/pg_*_d.h parser/gram.h storage/lwlocknames.h utils/probes.h; do \
+	for file in catalog/schemapg.h catalog/system_fk_info.h catalog/pg_*_d.h storage/lwlocknames.h utils/probes.h; do \
 	  cp $$file '$(DESTDIR)$(includedir_server)'/$$file || exit; \
 	done
 endif
@@ -79,7 +79,7 @@ uninstall:
 
 clean:
 	rm -f utils/fmgroids.h utils/fmgrprotos.h utils/errcodes.h utils/header-stamp
-	rm -f parser/gram.h storage/lwlocknames.h utils/probes.h
+	rm -f storage/lwlocknames.h utils/probes.h
 	rm -f catalog/schemapg.h catalog/system_fk_info.h
 	rm -f catalog/pg_*_d.h catalog/header-stamp
 	rm -f nodes/nodetags.h nodes/header-stamp
diff --git a/src/include/parser/.gitignore b/src/include/parser/.gitignore
deleted file mode 100644
index 19ea9554a0..0000000000
--- a/src/include/parser/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/gram.h
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index 5da299476e..e20661ba6e 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -618,10 +618,6 @@ sub CopyIncludeFiles
 		'Server headers',
 		$target . '/include/server/',
 		'src/include/', 'pg_config.h', 'pg_config_ext.h', 'pg_config_os.h');
-	CopyFiles(
-		'Grammar header',
-		$target . '/include/server/parser/',
-		'src/backend/parser/', 'gram.h');
 	CopySetOfFiles(
 		'',
 		[ glob("src\\include\\*.h") ],
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index 547f9dc5c4..78253cfbae 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -125,7 +125,6 @@ do
 	test "$f" = contrib/cube/cubeparse.h && continue
 	test "$f" = contrib/seg/segparse.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 158c99d6af..1addc52002 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -120,7 +120,6 @@ do
 	test "$f" = contrib/cube/cubeparse.h && continue
 	test "$f" = contrib/seg/segparse.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
-- 
2.36.1

#294Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#260)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-08-31 11:11:54 -0700, Andres Freund wrote:

If the above are addressed, I think this will be just about at the
point where the above patches can be committed.

Woo!

There was a lot less progress over the last ~week than I had hoped. The reason
is that I was trying to figure out the reason for the occasional failures of
ecpg tests getting compiled when building on windows in CI, with msbuild.

I went into many layers of rabbitholes while investigating. Wasting an absurd
amount of time.

The problem:

Occasionally ecpg test files would fail to compile, exiting with -1073741819:
C:\BuildTools\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(241,5): error MSB8066: Custom build for 'C:\cirrus\build\meson-private\custom_target.rule' exited with code -1073741819. [c:\cirrus\build\src\interfaces\ecpg\test\sql\3701597@@twophase.c@cus.vcxproj]

-1073741819 is 0xc0000005, which in turn is STATUS_ACCESS_VIOLATION, i.e. a
segfault. This happens in roughly 1/3 of the builds, but with "streaks" of not
happening and more frequently happening.

However, despite our CI images having a JIT debugger configured (~coredump
handler), no crash report was triggered. The problem never occurs in my
windows VM.

At first I thought that might be because it's an assertion failure or such,
which only causes a dump when a bunch of magic is done (see main.c). But
despite adding all the necessary magic to ecpg.exe, no dump.

Unfortunately, adding debug output reduces the frequency of the issue
substantially.

Eventually I figured out that it's not actually ecpg.exe that is crashing. It
is meson's python wrapper around built binaries as part of the build (for
setting PATH, working directory, without running into cmd.exe issues). A
modified meson wrapper showed that ecpg.exe completes successfully.

The only thing the meson wrapper does after running the command is to call
sys.exit(returncode), and I had printed out the returncode, which is 0.

I looked through a lot of the python code, to see why no crashdump and no
details are forthcoming. There weren't any relevant
SetErrorMode(SEM_NOGPFAULTERRORBOX) calls. I tried to set PYTHONFAULTHANDLER,
but still no stack trace.

Next I suspected that cmd.exe might be crashing and causing the
problem. Modified meson to add 'echo %ERRORLEVEL%' to the msbuild
custombuild. Which indeed shows the STATUS_ACCESS_VIOLATION returncode after
running python. So it's not cmd.exe.

The problem even persisted when replacing meson's sys.exit() with os._exit(),
which indeed just calls _exit().

I tried to reproduce the problem using a python with debugging enabled. The
problem doesn't occur despite quite a few runs.

I found scattered other reports of this problem happening on windows. Went
down a few more rabbitholes. Too boring to repeat here.

At this point I finally figured out that the reason the crash reports don't
happen is that everythin started by cirrus-ci on windows has an errormode of
SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX.

A good bit later I figured out that while cirrus-ci isn't intentionally
setting that, golang does so *unconditionally* on windows:
https://github.com/golang/go/blob/54182ff54a687272dd7632c3a963e036ce03cb7c/src/runtime/signal_windows.go#L14
https://github.com/golang/go/blob/54182ff54a687272dd7632c3a963e036ce03cb7c/src/runtime/os_windows.go#L553
Argh. I should have checked what the error mode is earlier, but this is just
very sneaky.

So I modified meson to change the errormode and tried to reproduce the issue
again, to finally get a stackdump. And tried again. And again. Without a
single relevant failure (I saw tests fail in ways that are discussed on the
list, but that's irrelevant here).

I've run this through enough attempts by now that I'm quite confident that the
problem does not occur when the errormode does not include
SEM_NOOPENFILEERRORBOX. I'll want a few more runs to be certain, but...

Given that the problem appears to happen after _exit() is called, and only
when SEM_NOOPENFILEERRORBOX is not set, it seems likely to be an OS / C
runtime bug. Presumably it's related to something that python does first, but
I don't see how anything could justify crashing only if SEM_NOOPENFILEERRORBOX
is set (rather than the opposite).

I have no idea how to debug this further, given that the problem is quite rare
(can't attach a debugger and wait), only happens when crashdumps are prevented
from happening (so no idea where it crashes) and is made less common by debug
printfs.

So for now the best way forward I can see is to change the error mode for CI
runs. Which is likely a good idea anyway, so we can see crashdumps for
binaries other than postgres.exe (which does SetErrorMode() internally). I
managed to do so by setting CIRRUS_SHELL to a python wrapper around cmd.exe
that does SetErrorMode(). I'm sure there's easier ways, but I couldn't figure
out any.

I'd like to reclaim my time. But I'm afraid nobody will be listening to that
plea...

Greetings,

Andres Freund

#295John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#293)
1 attachment(s)
Re: build remaining Flex files standalone

On Fri, Sep 9, 2022 at 12:18 PM John Naylor
<john.naylor@enterprisedb.com> wrote:

It seems gramparse.h isn't installed now? In any case, here's a patch
to move gramparse to the backend dir and stop symlinking/ installing
gram.h.

Looking more closely at src/include/Makefile, this is incorrect -- all
files in SUBDIRS are copied over. So moving gramparse.h to the backend
will automatically not install it. The explicit install rule for
gram.h was for vpath builds.

CI builds fine. For v2 I only adjusted the commit message. I'll push
in a couple days unless there are objections.
--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v2-0001-Move-gramparse.h-to-src-backend-parser.patchtext/x-patch; charset=US-ASCII; name=v2-0001-Move-gramparse.h-to-src-backend-parser.patchDownload
From dcfe0976e6118a2c385b4473ceab76a742a6f1ff Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 9 Sep 2022 11:57:39 +0700
Subject: [PATCH v2] Move gramparse.h to src/backend/parser

This header is semi-private, being used only in files related to
raw parsing, so move to the backend directory where those files
live. This allows removal of makefile rules that symlink gram.h to
src/include/parser, since gramparse.h can now include gram.h from within
the same directory. While at it, stop installing gram.h.

Per suggestion from Andres Freund and Peter Eisentraut
Discussion: https://www.postgresql.org/message-id/20220904181759.px6uosll6zbxcum5%40awork3.anarazel.de
---
 src/backend/Makefile                        | 7 +------
 src/backend/parser/gram.y                   | 2 +-
 src/{include => backend}/parser/gramparse.h | 4 ++--
 src/backend/parser/parser.c                 | 2 +-
 src/backend/parser/scan.l                   | 2 +-
 src/include/Makefile                        | 4 ++--
 src/include/parser/.gitignore               | 1 -
 src/tools/msvc/Install.pm                   | 4 ----
 src/tools/pginclude/cpluspluscheck          | 1 -
 src/tools/pginclude/headerscheck            | 1 -
 10 files changed, 8 insertions(+), 20 deletions(-)
 rename src/{include => backend}/parser/gramparse.h (97%)
 delete mode 100644 src/include/parser/.gitignore

diff --git a/src/backend/Makefile b/src/backend/Makefile
index d0d34821d5..181c217fae 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -153,12 +153,7 @@ submake-utils-headers:
 
 .PHONY: generated-headers
 
-generated-headers: $(top_builddir)/src/include/parser/gram.h $(top_builddir)/src/include/storage/lwlocknames.h submake-catalog-headers submake-nodes-headers submake-utils-headers
-
-$(top_builddir)/src/include/parser/gram.h: parser/gram.h
-	prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \
-	  cd '$(dir $@)' && rm -f $(notdir $@) && \
-	  $(LN_S) "$$prereqdir/$(notdir $<)" .
+generated-headers: $(top_builddir)/src/include/storage/lwlocknames.h submake-catalog-headers submake-nodes-headers submake-utils-headers
 
 $(top_builddir)/src/include/storage/lwlocknames.h: storage/lmgr/lwlocknames.h
 	prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index ea33784316..82f03fc9c9 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -55,9 +55,9 @@
 #include "catalog/pg_trigger.h"
 #include "commands/defrem.h"
 #include "commands/trigger.h"
+#include "gramparse.h"
 #include "nodes/makefuncs.h"
 #include "nodes/nodeFuncs.h"
-#include "parser/gramparse.h"
 #include "parser/parser.h"
 #include "storage/lmgr.h"
 #include "utils/date.h"
diff --git a/src/include/parser/gramparse.h b/src/backend/parser/gramparse.h
similarity index 97%
rename from src/include/parser/gramparse.h
rename to src/backend/parser/gramparse.h
index 41b753a96c..c4726c618d 100644
--- a/src/include/parser/gramparse.h
+++ b/src/backend/parser/gramparse.h
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * src/include/parser/gramparse.h
+ * src/backend/parser/gramparse.h
  *
  *-------------------------------------------------------------------------
  */
@@ -26,7 +26,7 @@
  * NB: include gram.h only AFTER including scanner.h, because scanner.h
  * is what #defines YYLTYPE.
  */
-#include "parser/gram.h"
+#include "gram.h"
 
 /*
  * The YY_EXTRA data that a flex scanner allows us to pass around.  Private
diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c
index 50227cc098..ef85d3bb68 100644
--- a/src/backend/parser/parser.c
+++ b/src/backend/parser/parser.c
@@ -22,7 +22,7 @@
 #include "postgres.h"
 
 #include "mb/pg_wchar.h"
-#include "parser/gramparse.h"
+#include "gramparse.h"
 #include "parser/parser.h"
 #include "parser/scansup.h"
 
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 882e081aae..db8b0fe8eb 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -36,7 +36,7 @@
 #include <unistd.h>
 
 #include "common/string.h"
-#include "parser/gramparse.h"
+#include "gramparse.h"
 #include "parser/parser.h"		/* only needed for GUC variables */
 #include "parser/scansup.h"
 #include "port/pg_bitutils.h"
diff --git a/src/include/Makefile b/src/include/Makefile
index 0b4cab9bb1..2858fdb4c8 100644
--- a/src/include/Makefile
+++ b/src/include/Makefile
@@ -55,7 +55,7 @@ install: all installdirs
 	  cp $(srcdir)/$$dir/*.h '$(DESTDIR)$(includedir_server)'/$$dir/ || exit; \
 	done
 ifeq ($(vpath_build),yes)
-	for file in catalog/schemapg.h catalog/system_fk_info.h catalog/pg_*_d.h parser/gram.h storage/lwlocknames.h utils/probes.h; do \
+	for file in catalog/schemapg.h catalog/system_fk_info.h catalog/pg_*_d.h storage/lwlocknames.h utils/probes.h; do \
 	  cp $$file '$(DESTDIR)$(includedir_server)'/$$file || exit; \
 	done
 endif
@@ -79,7 +79,7 @@ uninstall:
 
 clean:
 	rm -f utils/fmgroids.h utils/fmgrprotos.h utils/errcodes.h utils/header-stamp
-	rm -f parser/gram.h storage/lwlocknames.h utils/probes.h
+	rm -f storage/lwlocknames.h utils/probes.h
 	rm -f catalog/schemapg.h catalog/system_fk_info.h
 	rm -f catalog/pg_*_d.h catalog/header-stamp
 	rm -f nodes/nodetags.h nodes/header-stamp
diff --git a/src/include/parser/.gitignore b/src/include/parser/.gitignore
deleted file mode 100644
index 19ea9554a0..0000000000
--- a/src/include/parser/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/gram.h
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index 5da299476e..e20661ba6e 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -618,10 +618,6 @@ sub CopyIncludeFiles
 		'Server headers',
 		$target . '/include/server/',
 		'src/include/', 'pg_config.h', 'pg_config_ext.h', 'pg_config_os.h');
-	CopyFiles(
-		'Grammar header',
-		$target . '/include/server/parser/',
-		'src/backend/parser/', 'gram.h');
 	CopySetOfFiles(
 		'',
 		[ glob("src\\include\\*.h") ],
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index 547f9dc5c4..78253cfbae 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -125,7 +125,6 @@ do
 	test "$f" = contrib/cube/cubeparse.h && continue
 	test "$f" = contrib/seg/segparse.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 158c99d6af..1addc52002 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -120,7 +120,6 @@ do
 	test "$f" = contrib/cube/cubeparse.h && continue
 	test "$f" = contrib/seg/segparse.h && continue
 	test "$f" = src/backend/bootstrap/bootparse.h && continue
-	test "$f" = src/include/parser/gram.h && continue
 	test "$f" = src/backend/parser/gram.h && continue
 	test "$f" = src/backend/replication/repl_gram.h && continue
 	test "$f" = src/backend/replication/syncrep_gram.h && continue
-- 
2.36.1

#296Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#282)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-09-07 07:00:17 +0200, Peter Eisentraut wrote:

On 31.08.22 20:11, Andres Freund wrote:

src/port/win32ver.rc.in: This is redundant with src/port/win32ver.rc.
(Note that the latter is also used as an input file for text
substitution. So having another file named *.in next to it would be
super confusing.)

Yea, this stuff isn't great. I think the better solution, both for meson and
for configure, would be to move to do all the substitution to the C
preprocessor.

Yeah, I think if we can get rid of the evil date-based versioning, then
this could be done like

-win32ver.o: win32ver.rc
-   $(WINDRES) -i $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(srcdir)
+win32ver.o: $(top_srcdir)/src/port/win32ver.rc
+   $(WINDRES) -i $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(srcdir) -D FILEDESC=$(PGFILEDESC) -D VFT_APP=$(PGFTYPE) -D_ICO_=$(PGICOSTR) -D_INTERNAL_NAME_=$(if $(shlib),s;_INTERNAL_NAME_;"$(basename $(shlib))";,d) -D_ORIGINAL_NAME_=$(if $(shlib),s;_ORIGINAL_NAME_;"$(shlib)";,d)

It tried this and while it works for some places, it doesn't work for all. It
looks like windres uses broken quoting when internally invoking cpp. It
escapes e.g. whitespaces, but it doesn't escape at least < and >. Which
doesn't work well with descriptions like

PGFILEDESC = "cyrillic <-> mic text conversions"

resulting in this:

strace --string-limit=2000 -f -e execve \
x86_64-w64-mingw32-windres -DPGFILEDESC="cyrillic <-> mic text conversions" -DPGFTYPE=VFT_DLL -DPGNAME=cyrillic_and_mic -DPGFILEENDING=dll -I../../../../../../src/include -I/home/andres/src/postgresql/src/include  -I/home/andres/src/postgresql/src/include/port/win32  "-I/home/andres/src/postgresql/src/include/port/win32" -DWIN32_STACK_RLIMIT=4194304 -i /home/andres/src/postgresql/src/port/win32ver.rc -o win32ver.o
...
[pid 1788987] execve("/bin/sh", ["sh", "-c", "x86_64-w64-mingw32-gcc -E -xc -DRC_INVOKED -DPGFILEDESC=cyrillic\\ <->\\ mic\\ text\\ conversions -DPGFTYPE=VFT_DLL -DPGNAME=cyrillic_and_mic -DPGFILEENDING=dll -I../../../../../../src/include -I/home/andres/src/postgresql/src/include -I/home/andres/src/postgresql/src/include/port/win32 -I/home/andres/src/postgresql/src/include/port/win32 -DWIN32_STACK_RLIMIT=4194304 /home/andres/src/postgresql/src/port/win32ver.rc"], 0x7ffd47edc790 /* 67 vars */) = 0
sh: 1: cannot open -: No such file
[pid 1788987] +++ exited with 2 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1788987, si_uid=1000, si_status=2, si_utime=0, si_stime=0} ---
x86_64-w64-mingw32-windres: preprocessing failed.

given this shoddy quoting, I think it's probably not wise to go down this
path?

We could invoke the preprocessor ourselves, but that requires feeding the
compiler via stdin (otherwise it'll just warn "linker input file unused
because linking not done") and defining -DRC_INVOKED (otherwise there'll be
syntax errors). That feels like too much magic?

Greetings,

Andres Freund

#297John Naylor
john.naylor@enterprisedb.com
In reply to: Tom Lane (#271)
1 attachment(s)
Re: minimum perl version

On Sat, Sep 3, 2022 at 2:11 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Andres Freund <andres@anarazel.de> writes:

5.14 would be a trivial lift as far as the buildfarm is concerned.

Yeah, that seems like a reasonable new minimum for Perl. I might
see about setting up an animal running 5.14.0, just so we can say
"5.14" in the docs without fine print.

Until such time as that happens, here is a draft to require 5.14.2.

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v1-minimum-perl-to-5-14-2.patchtext/x-patch; charset=US-ASCII; name=v1-minimum-perl-to-5-14-2.patchDownload
 config/perl.m4                           |  4 ++--
 configure                                |  6 +++---
 doc/src/sgml/install-windows.sgml        |  2 +-
 doc/src/sgml/installation.sgml           |  4 ++--
 src/pl/plperl/plc_perlboot.pl            |  1 -
 src/test/perl/PostgreSQL/Test/Cluster.pm |  2 +-
 src/test/perl/README                     | 10 +++-------
 src/tools/msvc/gendef.pl                 |  1 -
 src/tools/pgindent/pgindent              |  1 -
 9 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/config/perl.m4 b/config/perl.m4
index c9fd91397c..29f54bbb79 100644
--- a/config/perl.m4
+++ b/config/perl.m4
@@ -11,11 +11,11 @@ if test "$PERL"; then
   pgac_perl_version=`$PERL -v 2>/dev/null | sed -n ['s/This is perl.*v[a-z ]*\([0-9]\.[0-9][0-9.]*\).*$/\1/p']`
   AC_MSG_NOTICE([using perl $pgac_perl_version])
   if echo "$pgac_perl_version" | sed ['s/[.a-z_]/ /g'] | \
-    $AWK '{ if ([$]1 == 5 && ([$]2 > 8 || ($[2] == 8 && [$]3 >= 3))) exit 1; else exit 0;}'
+    $AWK '{ if ([$]1 == 5 && ([$]2 > 14 || ($[2] == 14 && [$]3 >= 2))) exit 1; else exit 0;}'
   then
     AC_MSG_WARN([
 *** The installed version of Perl, $PERL, is too old to use with PostgreSQL.
-*** Perl version 5.8.3 or later is required, but this is $pgac_perl_version.])
+*** Perl version 5.14.2 or later is required, but this is $pgac_perl_version.])
     PERL=""
   fi
 fi
diff --git a/configure b/configure
index fd2a782454..160c181441 100755
--- a/configure
+++ b/configure
@@ -10491,14 +10491,14 @@ if test "$PERL"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: using perl $pgac_perl_version" >&5
 $as_echo "$as_me: using perl $pgac_perl_version" >&6;}
   if echo "$pgac_perl_version" | sed 's/[.a-z_]/ /g' | \
-    $AWK '{ if ($1 == 5 && ($2 > 8 || ($2 == 8 && $3 >= 3))) exit 1; else exit 0;}'
+    $AWK '{ if ($1 == 5 && ($2 > 14 || ($2 == 14 && $3 >= 2))) exit 1; else exit 0;}'
   then
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
 *** The installed version of Perl, $PERL, is too old to use with PostgreSQL.
-*** Perl version 5.8.3 or later is required, but this is $pgac_perl_version." >&5
+*** Perl version 5.14.2 or later is required, but this is $pgac_perl_version." >&5
 $as_echo "$as_me: WARNING:
 *** The installed version of Perl, $PERL, is too old to use with PostgreSQL.
-*** Perl version 5.8.3 or later is required, but this is $pgac_perl_version." >&2;}
+*** Perl version 5.14.2 or later is required, but this is $pgac_perl_version." >&2;}
     PERL=""
   fi
 fi
diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index c00ab2b4b2..2e41d75db0 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -190,7 +190,7 @@ $ENV{MSBFLAGS}="/m";
       or Cygwin Perl will not work. It must also be present in the PATH.
       Binaries can be downloaded from
       <ulink url="https://www.activestate.com"></ulink>
-      (Note: version 5.8.3 or later is required,
+      (Note: version 5.14.2 or later is required,
       the free Standard Distribution is sufficient).
      </para></listitem>
     </varlistentry>
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 7c79608e55..5d7c573729 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -165,7 +165,7 @@ su - postgres
       <application>PL/Perl</application> you need a full
       <productname>Perl</productname> installation, including the
       <filename>libperl</filename> library and the header files.
-      The minimum required version is <productname>Perl</productname> 5.8.3.
+      The minimum required version is <productname>Perl</productname> 5.14.2.
       Since <application>PL/Perl</application> will be a shared
       library, the <indexterm><primary>libperl</primary></indexterm>
       <filename>libperl</filename> library must be a shared library
@@ -325,7 +325,7 @@ su - postgres
        <primary>perl</primary>
       </indexterm>
 
-      <application>Perl</application> 5.8.3 or later is needed to build from a Git checkout,
+      <application>Perl</application> 5.14.2 or later is needed to build from a Git checkout,
       or if you changed the input files for any of the build steps that
       use Perl scripts.  If building on Windows you will need
       <application>Perl</application> in any case.  <application>Perl</application> is
diff --git a/src/pl/plperl/plc_perlboot.pl b/src/pl/plperl/plc_perlboot.pl
index 8fd7f998bc..72cb53f6e3 100644
--- a/src/pl/plperl/plc_perlboot.pl
+++ b/src/pl/plperl/plc_perlboot.pl
@@ -6,7 +6,6 @@
 use strict;
 use warnings;
 
-use 5.008001;
 use vars qw(%_SHARED $_TD);
 
 PostgreSQL::InServer::Util::bootstrap();
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index 27fa607da4..d678f65d88 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -2780,7 +2780,7 @@ all values '' if not found. Does not differentiate between null and empty string
 for fields, no field is ever undef.
 
 The restart_lsn and confirmed_flush_lsn fields are returned verbatim, and also
-as a 2-list of [highword, lowword] integer. Since we rely on Perl 5.8.8 we can't
+as a 2-list of [highword, lowword] integer. Since we rely on Perl 5.14.2 we can't
 "use bigint", it's from 5.20, and we can't assume we have Math::Bigint from CPAN
 either.
 
diff --git a/src/test/perl/README b/src/test/perl/README
index 4b160cce36..26e4b41221 100644
--- a/src/test/perl/README
+++ b/src/test/perl/README
@@ -78,10 +78,6 @@ Each test script should end with:
 
 	done_testing();
 
-Test::More::like entails use of the qr// operator.  Avoid Perl 5.8.8 bug
-#39185 by not using the "$" regular expression metacharacter in qr// when also
-using the "/m" modifier.  Instead of "$", use "\n" or "(?=\n|\z)".
-
 Test::Builder::Level controls how far up in the call stack a test will look
 at when reporting a failure.  This should be incremented by any subroutine
 which directly or indirectly calls test routines from Test::More, such as
@@ -103,7 +99,7 @@ Portability
 -----------
 
 Avoid using any bleeding-edge Perl features.  We have buildfarm animals
-running Perl versions as old as 5.8.3, so your tests will be expected
+running Perl versions as old as 5.14.2, so your tests will be expected
 to pass on that.
 
 Also, do not use any non-core Perl modules except IPC::Run.  Or, if you
@@ -116,8 +112,8 @@ One way to test for compatibility with old Perl versions is to use
 perlbrew; see http://perlbrew.pl .  After installing that, do
 
     export PERLBREW_CONFIGURE_FLAGS='-de -Duseshrplib'
-    perlbrew --force install 5.8.3
-    perlbrew use 5.8.3
+    perlbrew --force install 5.14.2
+    perlbrew use 5.14.2
     perlbrew install-cpanm
     cpanm install Test::Simple@0.98
     cpanm install IPC::Run@0.79
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index b8c514a831..b4af3dea81 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -3,7 +3,6 @@
 
 use strict;
 use warnings;
-use 5.8.0;
 use List::Util qw(max);
 
 my @def;
diff --git a/src/tools/pgindent/pgindent b/src/tools/pgindent/pgindent
index 2ef07bb9fd..47d2790ef6 100755
--- a/src/tools/pgindent/pgindent
+++ b/src/tools/pgindent/pgindent
@@ -4,7 +4,6 @@
 
 use strict;
 use warnings;
-use 5.008001;
 
 use Cwd qw(abs_path getcwd);
 use File::Find;
#298John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#297)
Re: minimum perl version

On Tue, Sep 13, 2022 at 5:53 PM John Naylor
<john.naylor@enterprisedb.com> wrote:

Until such time as that happens, here is a draft to require 5.14.2.

As soon as I hit send, it occurred to me that we don't check the perl
version on Windows, since (I seem to recall) 5.8.3 was too old to be
an option on that platform. We'll have to add a new check somewhere.

--
John Naylor
EDB: http://www.enterprisedb.com

#299Andres Freund
andres@anarazel.de
In reply to: John Naylor (#295)
Re: build remaining Flex files standalone

On 2022-09-12 14:49:50 +0700, John Naylor wrote:

CI builds fine. For v2 I only adjusted the commit message. I'll push
in a couple days unless there are objections.

Makes sense to me. Thanks for working on it!

#300Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#297)
Re: minimum perl version

John Naylor <john.naylor@enterprisedb.com> writes:

On Sat, Sep 3, 2022 at 2:11 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Yeah, that seems like a reasonable new minimum for Perl. I might
see about setting up an animal running 5.14.0, just so we can say
"5.14" in the docs without fine print.

Until such time as that happens, here is a draft to require 5.14.2.

I've just switched longfin to use built-from-source perl 5.14.0.

regards, tom lane

#301John Naylor
john.naylor@enterprisedb.com
In reply to: Tom Lane (#300)
1 attachment(s)
Re: minimum perl version

On Wed, Sep 14, 2022 at 6:47 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

I've just switched longfin to use built-from-source perl 5.14.0.

In that case, here is a quick update with commit message. Not yet any
change for MSVC, but I can put together something later.

Since we're much less willing to support older Windows and Visual
Studio versions, maybe it's low-enough risk defer the check to the
Meson conversion? I understand our MSVC process will then go away much
more quickly than autoconf...

--
John Naylor
EDB: http://www.enterprisedb.com

Attachments:

v2-0001-Bump-minimum-Perl-version-to-5.14.patchtext/x-patch; charset=US-ASCII; name=v2-0001-Bump-minimum-Perl-version-to-5.14.patchDownload
From d8e241968395c552d667c1eb393cbaea12f0df6c Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Wed, 14 Sep 2022 09:58:13 +0700
Subject: [PATCH v2] Bump minimum Perl version to 5.14

The oldest vendor-shipped Perl in the buildfarm is 5.14.2, which is the
last version that Debian Wheezy shipped. That OS is EOL, but we keep
it running because there is no other convenient way to test certain
non-mainstream 32-bit platforms. There is no bugfix in the .2 release
that is required, and yet it's also not the latest minor release --
that would be 5.14.4. To clarify the situation, we also have arranged the
buildfarm to test 5.14.0. That allows configure scripts and documentation
to state 5.14 without fine print.

Discussion: https://www.postgresql.org/message-id/20220902181553.ev4pgzhubhdkguuv@awork3.anarazel.de
---
 config/perl.m4                           |  4 ++--
 configure                                |  6 +++---
 doc/src/sgml/install-windows.sgml        |  2 +-
 doc/src/sgml/installation.sgml           |  4 ++--
 src/pl/plperl/plc_perlboot.pl            |  1 -
 src/test/perl/PostgreSQL/Test/Cluster.pm |  2 +-
 src/test/perl/README                     | 10 +++-------
 src/tools/msvc/gendef.pl                 |  1 -
 src/tools/pgindent/pgindent              |  1 -
 9 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/config/perl.m4 b/config/perl.m4
index c9fd91397c..8126e79f67 100644
--- a/config/perl.m4
+++ b/config/perl.m4
@@ -11,11 +11,11 @@ if test "$PERL"; then
   pgac_perl_version=`$PERL -v 2>/dev/null | sed -n ['s/This is perl.*v[a-z ]*\([0-9]\.[0-9][0-9.]*\).*$/\1/p']`
   AC_MSG_NOTICE([using perl $pgac_perl_version])
   if echo "$pgac_perl_version" | sed ['s/[.a-z_]/ /g'] | \
-    $AWK '{ if ([$]1 == 5 && ([$]2 > 8 || ($[2] == 8 && [$]3 >= 3))) exit 1; else exit 0;}'
+    $AWK '{ if ([$]1 == 5 && ([$]2 >= 14)) exit 1; else exit 0;}'
   then
     AC_MSG_WARN([
 *** The installed version of Perl, $PERL, is too old to use with PostgreSQL.
-*** Perl version 5.8.3 or later is required, but this is $pgac_perl_version.])
+*** Perl version 5.14 or later is required, but this is $pgac_perl_version.])
     PERL=""
   fi
 fi
diff --git a/configure b/configure
index fd2a782454..f325bd85b8 100755
--- a/configure
+++ b/configure
@@ -10491,14 +10491,14 @@ if test "$PERL"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: using perl $pgac_perl_version" >&5
 $as_echo "$as_me: using perl $pgac_perl_version" >&6;}
   if echo "$pgac_perl_version" | sed 's/[.a-z_]/ /g' | \
-    $AWK '{ if ($1 == 5 && ($2 > 8 || ($2 == 8 && $3 >= 3))) exit 1; else exit 0;}'
+    $AWK '{ if ($1 == 5 && ($2 >= 14)) exit 1; else exit 0;}'
   then
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
 *** The installed version of Perl, $PERL, is too old to use with PostgreSQL.
-*** Perl version 5.8.3 or later is required, but this is $pgac_perl_version." >&5
+*** Perl version 5.14 or later is required, but this is $pgac_perl_version." >&5
 $as_echo "$as_me: WARNING:
 *** The installed version of Perl, $PERL, is too old to use with PostgreSQL.
-*** Perl version 5.8.3 or later is required, but this is $pgac_perl_version." >&2;}
+*** Perl version 5.14 or later is required, but this is $pgac_perl_version." >&2;}
     PERL=""
   fi
 fi
diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index c00ab2b4b2..29d3294dc8 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -190,7 +190,7 @@ $ENV{MSBFLAGS}="/m";
       or Cygwin Perl will not work. It must also be present in the PATH.
       Binaries can be downloaded from
       <ulink url="https://www.activestate.com"></ulink>
-      (Note: version 5.8.3 or later is required,
+      (Note: version 5.14 or later is required,
       the free Standard Distribution is sufficient).
      </para></listitem>
     </varlistentry>
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 7c79608e55..319c7e6966 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -165,7 +165,7 @@ su - postgres
       <application>PL/Perl</application> you need a full
       <productname>Perl</productname> installation, including the
       <filename>libperl</filename> library and the header files.
-      The minimum required version is <productname>Perl</productname> 5.8.3.
+      The minimum required version is <productname>Perl</productname> 5.14.
       Since <application>PL/Perl</application> will be a shared
       library, the <indexterm><primary>libperl</primary></indexterm>
       <filename>libperl</filename> library must be a shared library
@@ -325,7 +325,7 @@ su - postgres
        <primary>perl</primary>
       </indexterm>
 
-      <application>Perl</application> 5.8.3 or later is needed to build from a Git checkout,
+      <application>Perl</application> 5.14 or later is needed to build from a Git checkout,
       or if you changed the input files for any of the build steps that
       use Perl scripts.  If building on Windows you will need
       <application>Perl</application> in any case.  <application>Perl</application> is
diff --git a/src/pl/plperl/plc_perlboot.pl b/src/pl/plperl/plc_perlboot.pl
index 8fd7f998bc..72cb53f6e3 100644
--- a/src/pl/plperl/plc_perlboot.pl
+++ b/src/pl/plperl/plc_perlboot.pl
@@ -6,7 +6,6 @@
 use strict;
 use warnings;
 
-use 5.008001;
 use vars qw(%_SHARED $_TD);
 
 PostgreSQL::InServer::Util::bootstrap();
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index 27fa607da4..4fef9c12e6 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -2780,7 +2780,7 @@ all values '' if not found. Does not differentiate between null and empty string
 for fields, no field is ever undef.
 
 The restart_lsn and confirmed_flush_lsn fields are returned verbatim, and also
-as a 2-list of [highword, lowword] integer. Since we rely on Perl 5.8.8 we can't
+as a 2-list of [highword, lowword] integer. Since we rely on Perl 5.14 we can't
 "use bigint", it's from 5.20, and we can't assume we have Math::Bigint from CPAN
 either.
 
diff --git a/src/test/perl/README b/src/test/perl/README
index 4b160cce36..6ddee42a10 100644
--- a/src/test/perl/README
+++ b/src/test/perl/README
@@ -78,10 +78,6 @@ Each test script should end with:
 
 	done_testing();
 
-Test::More::like entails use of the qr// operator.  Avoid Perl 5.8.8 bug
-#39185 by not using the "$" regular expression metacharacter in qr// when also
-using the "/m" modifier.  Instead of "$", use "\n" or "(?=\n|\z)".
-
 Test::Builder::Level controls how far up in the call stack a test will look
 at when reporting a failure.  This should be incremented by any subroutine
 which directly or indirectly calls test routines from Test::More, such as
@@ -103,7 +99,7 @@ Portability
 -----------
 
 Avoid using any bleeding-edge Perl features.  We have buildfarm animals
-running Perl versions as old as 5.8.3, so your tests will be expected
+running Perl versions as old as 5.14, so your tests will be expected
 to pass on that.
 
 Also, do not use any non-core Perl modules except IPC::Run.  Or, if you
@@ -116,8 +112,8 @@ One way to test for compatibility with old Perl versions is to use
 perlbrew; see http://perlbrew.pl .  After installing that, do
 
     export PERLBREW_CONFIGURE_FLAGS='-de -Duseshrplib'
-    perlbrew --force install 5.8.3
-    perlbrew use 5.8.3
+    perlbrew --force install 5.14.0
+    perlbrew use 5.14.0
     perlbrew install-cpanm
     cpanm install Test::Simple@0.98
     cpanm install IPC::Run@0.79
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index b8c514a831..b4af3dea81 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -3,7 +3,6 @@
 
 use strict;
 use warnings;
-use 5.8.0;
 use List::Util qw(max);
 
 my @def;
diff --git a/src/tools/pgindent/pgindent b/src/tools/pgindent/pgindent
index 2ef07bb9fd..47d2790ef6 100755
--- a/src/tools/pgindent/pgindent
+++ b/src/tools/pgindent/pgindent
@@ -4,7 +4,6 @@
 
 use strict;
 use warnings;
-use 5.008001;
 
 use Cwd qw(abs_path getcwd);
 use File::Find;
-- 
2.36.1

#302Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#301)
Re: minimum perl version

John Naylor <john.naylor@enterprisedb.com> writes:

On Wed, Sep 14, 2022 at 6:47 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

I've just switched longfin to use built-from-source perl 5.14.0.

In that case, here is a quick update with commit message. Not yet any
change for MSVC, but I can put together something later.

Looks reasonable just by eyeball, did not test.

Since we're much less willing to support older Windows and Visual
Studio versions, maybe it's low-enough risk defer the check to the
Meson conversion? I understand our MSVC process will then go away much
more quickly than autoconf...

Agreed --- the MSVC scripts are on a pretty short leash now.
Not clear it's worth fixing them for this point. If we've
failed to get rid of them by the time v16 release approaches,
maybe it'd be worth doing something then.

regards, tom lane

#303John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#299)
Re: build remaining Flex files standalone

On Wed, Sep 14, 2022 at 6:10 AM Andres Freund <andres@anarazel.de> wrote:

On 2022-09-12 14:49:50 +0700, John Naylor wrote:

CI builds fine. For v2 I only adjusted the commit message. I'll push
in a couple days unless there are objections.

Makes sense to me. Thanks for working on it!

This is done.

--
John Naylor
EDB: http://www.enterprisedb.com

#304John Naylor
john.naylor@enterprisedb.com
In reply to: Tom Lane (#302)
Re: minimum perl version

On Wed, Sep 14, 2022 at 10:46 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

John Naylor <john.naylor@enterprisedb.com> writes:

On Wed, Sep 14, 2022 at 6:47 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

I've just switched longfin to use built-from-source perl 5.14.0.

In that case, here is a quick update with commit message. Not yet any
change for MSVC, but I can put together something later.

Looks reasonable just by eyeball, did not test.

Since we're much less willing to support older Windows and Visual
Studio versions, maybe it's low-enough risk defer the check to the
Meson conversion? I understand our MSVC process will then go away much
more quickly than autoconf...

Agreed --- the MSVC scripts are on a pretty short leash now.
Not clear it's worth fixing them for this point. If we've
failed to get rid of them by the time v16 release approaches,
maybe it'd be worth doing something then.

Okay, pushed with no further MSVC changes, after doing a round on CI.

--
John Naylor
EDB: http://www.enterprisedb.com

#305Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Peter Eisentraut (#285)
Re: [RFC] building postgres with meson - v12

On 07.09.22 09:53, Peter Eisentraut wrote:

On 07.09.22 09:19, Peter Eisentraut wrote:

This could also be combined with the idea of the postgres.sgml.valid
thing you have in the meson patch set.

I'll finish this up and produce a proper patch.

Something like this.

This does make the rules more straightforward and avoids repeated
xmllint calls.  I suppose this also helps writing the meson rules in a
simpler way.

committed this

#306Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Alvaro Herrera (#290)
Re: [RFC] building postgres with meson - v12

On 08.09.22 09:42, Alvaro Herrera wrote:

On 2022-Sep-07, Peter Eisentraut wrote:

A possible drawback is that the intermediate postgres-full.xml file is

10MB, but I guess we're past the point where we are worrying about that

kind of thing.

I think we are, but maybe mark it .PRECIOUS? IIUC that would prevent it
from being removed if there's a problem in the other recipes.

I don't think .PRECIOUS is the right tool here. There are existing uses
of .SECONDARY in doc/src/sgml/Makefile; I integrated my patch there.

#307Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
19 attachment(s)
Re: [RFC] building postgres with meson - v13

Hi,

Attached is v13 of the meson patchset. The biggest changes are:

- fix for the occasional ecpg.c crashes - which turned out to be crashes of
python, which in turn likely are due to a bug in the windows CRT

- split out and improved the patch to add resource files on windows. This
doesn't yet add them to all binaries, but I think the infrastructure looks
better now, and there's no duplicated win32ver.rc anymore.

- several rebasing adjustments, most notably the parser stuff and the
introduction of postgresql-full.xml

- improved structure of docs, based on Peter's review (Samay)

- generation of proper dependencies for xmllint/xsltproc, by parsing xsltproc
--load-trace. Previously the meson build didn't rebuild docs properly (meson
doesn't have "glob-style" dependencies). (Bilal)

- numerous small improvements and fixes

- added a patch to drop DLLTOOL/DLLWRAP from configure.ac / Makefile.global.in
- we've removed the use of them in 2014. This way the pgxs emulation doesn't
need to care.

- noticed that libpgport.a had and needed a dependency on errcodes.h - that
seemed wrong. The dependency is due to src/port/*p{read,write}v?.c including
postgres.h - which seems wrong. So I added a patch changing them to include
c.h.

One thing I just realized is that the existing autoconf/make and
src/tools/msvc buildsystems don't generate static libraries for e.g. libpq. So
far the meson build generates both static and shared libraries on windows
too.

Meson solves the naming conflict that presumably lead to us not generating
static libraries on windows by naming the link library for dlls's differently
than static libraries.

I'm inclined to build the static lib on windows as long as we do it on other
platforms.

Greetings,

Andres Freund

Attachments:

v13-0010-meson-ci-Build-both-with-meson-and-as-before.patchtext/x-diff; charset=us-asciiDownload
From f0f906d56347ab56735a4159b7a55f1b4fbd7a60 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Apr 2022 12:08:09 -0700
Subject: [PATCH v13 10/20] meson: ci: Build both with meson and as before

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Justin Pryzby <pryzby@telsasoft.com>
---
 .cirrus.yml                                   | 843 +++++++++++++++++-
 src/tools/ci/docker/linux_centos7             |  57 ++
 src/tools/ci/docker/linux_centos8             |  54 ++
 src/tools/ci/docker/linux_fedora_rawhide      |  49 +
 src/tools/ci/docker/linux_opensuse_tumbleweed |  56 ++
 5 files changed, 1013 insertions(+), 46 deletions(-)
 create mode 100644 src/tools/ci/docker/linux_centos7
 create mode 100644 src/tools/ci/docker/linux_centos8
 create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
 create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed

diff --git a/.cirrus.yml b/.cirrus.yml
index 7034352c487..5a7a93baf4c 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -22,13 +22,14 @@ env:
   CHECK: check-world PROVE_FLAGS=$PROVE_FLAGS
   CHECKFLAGS: -Otarget
   PROVE_FLAGS: --timer
+  MTEST_ARGS: --print-errorlogs --no-rebuild -C build
   PGCTLTIMEOUT: 120 # avoids spurious failures during parallel tests
   TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/src/tools/ci/pg_ci_base.conf
   PG_TEST_EXTRA: kerberos ldap ssl
 
 
 # What files to preserve in case tests fail
-on_failure: &on_failure
+on_failure_ac: &on_failure_ac
   log_artifacts:
     paths:
       - "**/*.log"
@@ -36,9 +37,41 @@ on_failure: &on_failure
       - "**/regress_log_*"
     type: text/plain
 
-task:
-  name: FreeBSD - 13
+on_failure_meson: &on_failure_meson
+  testrun_artifacts:
+    paths:
+      - "build/testrun/**/*.log"
+      - "build/testrun/**/*.diffs"
+      - "build/testrun/**/regress_log_*"
+    type: text/plain
 
+  # In theory it'd be nice to upload the junit files meson generates, so that
+  # cirrus will nicely annotate the commit. Unfortunately the files don't
+  # contain identifyable file + line numbers right now, so the annotations
+  # don't end up useful. We could probably improve on that with a some custom
+  # conversion script, but ...
+  meson_log_artifacts:
+    path: "build/meson-logs/*.txt"
+    type: text/plain
+
+
+# configure feature flags, shared between the task running the BSD tests
+# these feature flags don't include --with-gssapi and --with-uuid=bsd
+# since these are not working on openBSD and netBSD
+BSD_CONFIGURE_FEATURES: &BSD_CONFIGURE_FEATURES >-
+  --with-icu
+  --with-ldap
+  --with-libxml
+  --with-libxslt
+  --with-lz4
+  --with-pam
+  --with-perl
+  --with-python
+  --with-ssl=openssl
+  --with-tcl --with-tclconfig=${TCL_CONFIG_PATH}
+
+
+freebsd_template: &freebsd_template
   env:
     # FreeBSD on GCP is slow when running with larger number of CPUS /
     # jobs. Using one more job than cpus seems to work best.
@@ -48,6 +81,12 @@ task:
 
     CCACHE_DIR: /tmp/ccache_dir
 
+    TCL_CONFIG_PATH: /usr/local/lib/tcl8.6/
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
 
   compute_engine_instance:
@@ -80,6 +119,13 @@ task:
   setup_additional_packages_script: |
     #pkg install -y ...
 
+
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Autoconf
+  trigger_type: manual
+
   # NB: Intentionally build without --with-llvm. The freebsd image size is
   # already large enough to make VM startup slow, and even without llvm
   # freebsd already takes longer than other platforms except for windows.
@@ -90,16 +136,7 @@ task:
         --enable-nls \
         \
         --with-gssapi \
-        --with-icu \
-        --with-ldap \
-        --with-libxml \
-        --with-libxslt \
-        --with-lz4 \
-        --with-pam \
-        --with-perl \
-        --with-python \
-        --with-ssl=openssl \
-        --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+        ${BSD_CONFIGURE_FEATURES} \
         --with-uuid=bsd \
         --with-zstd \
         \
@@ -107,8 +144,7 @@ task:
         --with-libs=/usr/local/lib \
         \
         CC="ccache cc" \
-        CXX="ccache c++" \
-        CFLAGS="-Og -ggdb"
+        CXX="ccache c++"
     EOF
   build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
   upload_caches: ccache
@@ -117,14 +153,274 @@ task:
   # platforms without support for locking pipes. See also
   # https://savannah.gnu.org/bugs/?60774
   # script uses pseudo-ttys, which do support locking.
-  test_world_script:
-    - su postgres -c "time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}"
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
+    EOF
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
 
 
+task:
+  <<: *freebsd_template
+
+  name: FreeBSD - 13 - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=bsd -Dtcl_version=tcl86 -Ddtrace=auto build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+    cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
+
+
+netbsd_template: &netbsd_template
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+    TCL_CONFIG_PATH: /usr/pkg/lib
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/pg-ci-netbsd-9-postgres
+    platform: netbsd
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:users /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:users ${CCACHE_DIR}
+
+
+task:
+  <<: *netbsd_template
+
+  name: NetBSD - 9 - Autoconf
+  trigger_type: manual
+
+  # --with-uuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+        --enable-cassert --enable-debug --enable-tap-tests \
+        --enable-nls \
+        \
+        ${BSD_CONFIGURE_FEATURES} \
+        \
+        --with-includes=/usr/pkg/include --with-libs=/usr/pgk/lib \
+        CC="ccache cc" \
+        CXX="ccache c++" \
+        LDFLAGS="-Wl,-R/usr/pkg/lib" \
+        \
+        PYTHON=python3.9
+    EOF
+  build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *netbsd_template
+
+  name: NetBSD - 9 - Meson
+
+  # -Duuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres  <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl \
+        -Dextra_lib_dirs=/usr/pkg/lib -Dextra_include_dirs=/usr/pkg/include \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+openbsd_template: &openbsd_template
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+    TCL_CONFIG_PATH: /usr/local/lib/tcl/tcl8.6/
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+    CFLAGS: "-Og -ggdb"
+
+    BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/pg-ci-openbsd-7-postgres
+    platform: openbsd
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:postgres /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+
+
+task:
+  <<: *openbsd_template
+
+  name: OpenBSD - 7 - Autoconf
+  trigger_type: manual
+
+  # --with-uuid option is set to 'e2fs' since 'bsd' uuid option
+  # is not working on openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # (same error applies for openBSD)
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+        --enable-cassert --enable-debug --enable-tap-tests \
+        --enable-nls \
+        \
+        ${BSD_CONFIGURE_FEATURES} \
+        --with-uuid=e2fs \
+        \
+        --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+        CC="ccache cc" \
+        CXX="ccache c++" \
+        LDFLAGS="-Wl,-R/usr/local/lib"
+    EOF
+  build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *openbsd_template
+
+  name: OpenBSD - 7 - Meson
+
+  # -Duuid option is set to 'e2fs' since 'bsd' uuid option
+  # is not working on openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # (same error applies for openBSD)
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl -Duuid=e2fs \
+        -Dextra_include_dirs=/usr/local/include -Dextra_lib_dirs=/usr/local/lib \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 # configure feature flags, shared between the task running the linux tests and
 # the CompilerWarnings task
 LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -141,14 +437,28 @@ LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
   --with-selinux
   --with-ssl=openssl
   --with-systemd
-  --with-tcl --with-tclconfig=/usr/lib/tcl8.6/
-  --with-uuid=ossp
+  --with-tcl --with-tclconfig=${TCL_DIR:/usr/lib/tcl8.6/}
+  --with-uuid=${UUID:ossp}
   --with-zstd
 
 
-task:
-  name: Linux - Debian Bullseye
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+  sysinfo_script: |
+    id
+    uname -a
+    cat /proc/cmdline
+    ulimit -a -H && ulimit -a -S
+    export
+  create_user_script: |
+    useradd -m -U postgres
+    chown -R postgres:postgres .
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+    su postgres -c "ulimit -l -H && ulimit -l -S"
 
+
+linux_debian_template: &linux_debian_template
   env:
     CPUS: 4
     BUILD_JOBS: 4
@@ -157,6 +467,9 @@ task:
     CCACHE_DIR: /tmp/ccache_dir
     DEBUGINFOD_URLS: "https://debuginfod.debian.net"
 
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
     LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
 
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
@@ -171,19 +484,9 @@ task:
   ccache_cache:
     folder: ${CCACHE_DIR}
 
-  sysinfo_script: |
-    id
-    uname -a
-    cat /proc/cmdline
-    ulimit -a -H && ulimit -a -S
-    export
-  create_user_script: |
-    useradd -m postgres
-    chown -R postgres:postgres .
-    mkdir -p ${CCACHE_DIR}
-    chown -R postgres:postgres ${CCACHE_DIR}
+  set_limits_script: |
     echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
-    su postgres -c "ulimit -l -H && ulimit -l -S"
+  <<: *linux_preparation_scripts_template
   setup_core_files_script: |
     mkdir -m 770 /tmp/cores
     chown root:postgres /tmp/cores
@@ -192,6 +495,12 @@ task:
     #apt-get update
     #DEBIAN_FRONTEND=noninteractive apt-get -y install ...
 
+
+task:
+  <<: *linux_debian_template
+
+  name: Linux - Debian Bullseye - Autoconf
+
   configure_script: |
     su postgres <<-EOF
       ./configure \
@@ -202,9 +511,7 @@ task:
         \
         CC="ccache gcc" \
         CXX="ccache g++" \
-        CLANG="ccache clang" \
-        CFLAGS="-Og -ggdb" \
-        CXXFLAGS="-Og -ggdb"
+        CLANG="ccache clang"
     EOF
   build_script: su postgres -c "make -s -j${BUILD_JOBS} world-bin"
   upload_caches: ccache
@@ -216,13 +523,353 @@ task:
     EOF
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
+    cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
+
+
+task: &linux_debian_bullseye_meson
+  <<: *linux_debian_template
+
+  name: Linux - Debian Bullseye - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Ddtrace=enabled build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
     cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
 
 
 task:
-  name: macOS - Monterey
+  <<: *linux_debian_bullseye_meson
 
+  name: Linux - Debian Sid - Meson
+  trigger_type: manual
+
+  compute_engine_instance:
+    image: family/pg-ci-sid
+
+
+linux_opensuse_template: &linux_opensuse_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: "https://debuginfod.opensuse.org/"
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: src/tools/ci/docker/linux_opensuse_tumbleweed
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" && \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  <<: *linux_opensuse_template
+
+  name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Dllvm=enabled build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+linux_rhel_template: &linux_rhel_template
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: ${DEBUGINFO}
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: ${DOCKERFILE_PATH}
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+    DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Fedora Rawhide - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      ${LINUX_CONFIGURE_FEATURES}
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 8 - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Autoconf
+  trigger_type: manual
+
+  configure_script: |
+    su postgres <<-EOF
+      PYTHON=python3 \
+      ./configure \
+      --enable-cassert --enable-debug --enable-tap-tests \
+      --enable-nls \
+      \
+      --with-gssapi \
+      --with-icu \
+      --with-ldap \
+      --with-libxml \
+      --with-libxslt \
+      --with-lz4 \
+      --with-pam \
+      --with-perl \
+      --with-python \
+      --with-selinux \
+      --with-ssl=openssl \
+      --with-systemd \
+      --with-tcl --with-tclconfig=/usr/lib64/ \
+      --with-uuid=e2fs \
+      \
+      CC="ccache gcc"  \
+      CXX="ccache g++" \
+      CLANG="ccache clang"
+    EOF
+  build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_ac
+
+
+task:
+  env:
+    DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+    DEBUGINFO: "http://debuginfo.centos.org/"
+
+  <<: *linux_rhel_template
+
+  name: Linux - Centos 7 - Meson
+  trigger_type: manual
+
+  configure_script:
+    - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
+macos_template: &macos_template
   env:
     CPUS: 12 # always get that much for cirrusci macOS instances
     BUILD_JOBS: $CPUS
@@ -233,6 +880,9 @@ task:
     HOMEBREW_CACHE: ${HOME}/homebrew-cache
     PERL5LIB: ${HOME}/perl5/lib/perl5
 
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
 
   osx_instance:
@@ -269,6 +919,7 @@ task:
       llvm \
       lz4 \
       make \
+      meson \
       openldap \
       openssl \
       python \
@@ -280,6 +931,14 @@ task:
 
   ccache_cache:
     folder: $CCACHE_DIR
+
+
+task:
+  <<: *macos_template
+
+  name: macOS - Monterey - Autoconf
+  trigger_type: manual
+
   configure_script: |
     brewpath="/usr/local"
     INCLUDES="${brewpath}/include:${INCLUDES}"
@@ -319,8 +978,6 @@ task:
       CC="ccache cc" \
       CXX="ccache c++" \
       CLANG="ccache ${brewpath}/llvm/bin/ccache" \
-      CFLAGS="-Og -ggdb" \
-      CXXFLAGS="-Og -ggdb" \
       \
       LLVM_CONFIG=${brewpath}/llvm/bin/llvm-config \
       PYTHON=python3
@@ -334,13 +991,48 @@ task:
     script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
     cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
 
 
 task:
-  name: Windows - Server 2019, VS 2019
+  <<: *macos_template
 
+  name: macOS - Monterey - Meson
+
+  configure_script: |
+    brewpath="/usr/local"
+    PKG_CONFIG_PATH="${brewpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+
+    for pkg in icu4c krb5 openldap openssl ; do
+      pkgpath="${brewpath}/opt/${pkg}"
+      PKG_CONFIG_PATH="${pkgpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+    done
+
+    export PKG_CONFIG_PATH
+
+    meson setup \
+      --buildtype debug \
+      -Dextra_include_dirs=${brewpath}/include \
+      -Dextra_lib_dirs=${brewpath}/lib \
+      -Dcassert=true \
+      -Dssl=openssl -Duuid=e2fs  -Ddtrace=auto \
+      build
+
+  build_script: ninja -C build -j${BUILD_JOBS}
+  upload_caches: ccache
+
+  tests_world_script:
+    - ulimit -c unlimited
+    - ulimit -n 1024
+    - meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+
+  on_failure:
+    <<: *on_failure_meson
+    cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
+
+
+windows_template: &windows_template
   env:
     # Half the allowed per-user CPU cores
     CPUS: 4
@@ -412,6 +1104,11 @@ task:
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
 
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Homegrown
+
   configure_script:
     # copy errors out when using forward slashes
     - copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl
@@ -461,10 +1158,63 @@ task:
     %T_C% perl vcregress.pl ecpgcheck
 
   on_failure:
-    <<: *on_failure
+    <<: *on_failure_ac
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+  meson_install_wraps_script:
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+
+  configure_script:
+    - vcvarsall x64
+    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - ninja -C build
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test %MTEST_ARGS% --num-processes 10
+
+  on_failure:
+    <<: *on_failure_meson
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+  meson_install_wraps_script:
+    - mkdir subprojects
+    - meson wrap install lz4
+    - meson wrap install zlib
+
+  configure_script:
+    - vcvarsall x64
+    - meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+  build_script:
+    - vcvarsall x64
+    - msbuild %MSBFLAGS% build\postgresql.sln
+
+  check_world_script:
+    - vcvarsall x64
+    - meson test %MTEST_ARGS% --num-processes 10
+
+  on_failure:
+    <<: *on_failure_meson
     crashlog_artifacts:
       path: "crashlog-*.txt"
-      type: text/plain
 
 
 task:
@@ -472,7 +1222,8 @@ task:
 
   # To limit unnecessary work only run this once the normal linux test succeeds
   depends_on:
-    - Linux - Debian Bullseye
+    - Linux - Debian Bullseye - Meson
+  trigger_type: manual
 
   env:
     CPUS: 4
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+  yum -y install dnf-plugins-core \
+  epel-release \
+  centos-release-scl-rh && \
+  \
+  yum -y update && \
+  yum -y install \
+  \
+  git \
+  perl \
+  perl-ExtUtils-Embed \
+  perl-IPC-Run \
+  perl-Test-Harness \
+  perl-Test-Simple \
+  \
+  bison \
+  ccache \
+  clang \
+  devtoolset-7-make \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  && \
+  pip3 install meson && \
+  pip3 install ninja && \
+  yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+  dnf -y install dnf-plugins-core && \
+  dnf config-manager --set-enabled powertools && \
+  dnf -y install epel-release && \
+  dnf -y update && \
+  dnf -y install \
+  \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  diffutils \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  glibc-langpack-en \
+  \
+  && \
+  pip3 install ninja && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+  dnf -y update && \
+  dnf -y install \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gettext \
+  ninja-build \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  langpacks-en \
+  glibc-langpack-en \
+  \
+  && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+  zypper -n clean -a && \
+  zypper -n ref && \
+  zypper -n dup && \
+  zypper -n update && \
+  zypper -n install \
+  diffutils \
+  git \
+  icu \
+  make \
+  meson \
+  perl-IPC-Run \
+  shadow \
+  systemd-devel \
+  util-linux \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gcc-c++ \
+  gettext-runtime \
+  ninja \
+  \
+  krb5-devel \
+  libicu-devel \
+  libldapcpp-devel \
+  liblz4-devel \
+  libopenssl-devel \
+  libselinux-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  pam-devel \
+  python38-devel \
+  readline-devel \
+  tcl-devel \
+  \
+  openldap2 \
+  openldap2-client \
+  \
+  krb5-client \
+  krb5-plugin-kdb-ldap \
+  krb5-server \
+  lz4 \
+  zstd \
+  \
+  && \
+  zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
-- 
2.37.3.542.gdd3f6c4cae

v13-0011-meson-prereq-De-special-case-pgevent-s-rc-file-h.patchtext/x-diff; charset=us-asciiDownload
From f149aba14ecd0bff9371df791a8c6538b54be574 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 13 Sep 2022 10:07:18 -0700
Subject: [PATCH v13 11/20] meson: prereq: De-special-case pgevent's rc file
 handling

There's really no need to build win32ver.rc as part of building pgmsgevent.rc.
---
 src/bin/pgevent/Makefile      | 5 +++--
 src/bin/pgevent/pgmsgevent.rc | 2 --
 src/tools/msvc/Mkvcbuild.pm   | 1 -
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/bin/pgevent/Makefile b/src/bin/pgevent/Makefile
index dea79d3f137..04d49711d8d 100644
--- a/src/bin/pgevent/Makefile
+++ b/src/bin/pgevent/Makefile
@@ -17,7 +17,8 @@ ifeq ($(PORTNAME), win32)
 
 OBJS = \
 	pgevent.o \
-	pgmsgevent.o
+	pgmsgevent.o \
+	$(WIN32RES)
 NAME=pgevent
 
 SHLIB_LINK =
@@ -29,7 +30,7 @@ install: all install-lib
 
 include $(top_srcdir)/src/Makefile.shlib
 
-pgmsgevent.o: pgmsgevent.rc win32ver.rc
+pgmsgevent.o: pgmsgevent.rc
 	$(WINDRES) $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(top_srcdir)/src/include --include-dir=$(srcdir) --include-dir=.
 
 clean distclean: clean-lib
diff --git a/src/bin/pgevent/pgmsgevent.rc b/src/bin/pgevent/pgmsgevent.rc
index e69862e882c..0885a897e6f 100644
--- a/src/bin/pgevent/pgmsgevent.rc
+++ b/src/bin/pgevent/pgmsgevent.rc
@@ -1,4 +1,2 @@
 LANGUAGE 0x9,0x1
 1 11 MSG00001.bin
-
-#include "win32ver.rc"
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 098bc3f1b09..ddb4f25eb12 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -425,7 +425,6 @@ sub mkvcbuild
 	$pgevent->AddFiles('src/bin/pgevent', 'pgevent.c', 'pgmsgevent.rc');
 	$pgevent->AddResourceFile('src/bin/pgevent', 'Eventlog message formatter',
 		'win32');
-	$pgevent->RemoveFile('src/bin/pgevent/win32ver.rc');
 	$pgevent->UseDef('src/bin/pgevent/pgevent.def');
 	$pgevent->DisableLinkerWarnings('4104');
 
-- 
2.37.3.542.gdd3f6c4cae

v13-0001-Remove-DLLTOOL-DLLWRAP-from-configure-Makefile.g.patchtext/x-diff; charset=us-asciiDownload
From b7d7fe009731b5cfd6b6f97c6774dd4f7841e345 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 30 Aug 2022 15:33:43 -0700
Subject: [PATCH v13 01/20] Remove DLLTOOL, DLLWRAP from configure /
 Makefile.global.in

We got rid of the need for them in 4f5f485d10c and 846e91e0223.
---
 configure              | 186 -----------------------------------------
 configure.ac           |   2 -
 src/Makefile.global.in |   2 -
 3 files changed, 190 deletions(-)

diff --git a/configure b/configure
index f325bd85b88..aee8a0d3579 100755
--- a/configure
+++ b/configure
@@ -688,8 +688,6 @@ INSTALL_DATA
 INSTALL_SCRIPT
 INSTALL_PROGRAM
 WINDRES
-DLLWRAP
-DLLTOOL
 AR
 STRIP_SHARED_LIB
 STRIP_STATIC_LIB
@@ -9769,190 +9767,6 @@ else
 fi
 
 if test "$PORTNAME" = "win32"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DLLTOOL"; then
-  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
-  ac_ct_DLLTOOL=$DLLTOOL
-  # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DLLTOOL"; then
-  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DLLTOOL" = x; then
-    DLLTOOL="dlltool"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DLLTOOL=$ac_ct_DLLTOOL
-  fi
-else
-  DLLTOOL="$ac_cv_prog_DLLTOOL"
-fi
-
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dllwrap", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dllwrap; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLWRAP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DLLWRAP"; then
-  ac_cv_prog_DLLWRAP="$DLLWRAP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DLLWRAP="${ac_tool_prefix}dllwrap"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DLLWRAP=$ac_cv_prog_DLLWRAP
-if test -n "$DLLWRAP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLWRAP" >&5
-$as_echo "$DLLWRAP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DLLWRAP"; then
-  ac_ct_DLLWRAP=$DLLWRAP
-  # Extract the first word of "dllwrap", so it can be a program name with args.
-set dummy dllwrap; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLWRAP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DLLWRAP"; then
-  ac_cv_prog_ac_ct_DLLWRAP="$ac_ct_DLLWRAP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DLLWRAP="dllwrap"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DLLWRAP=$ac_cv_prog_ac_ct_DLLWRAP
-if test -n "$ac_ct_DLLWRAP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLWRAP" >&5
-$as_echo "$ac_ct_DLLWRAP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DLLWRAP" = x; then
-    DLLWRAP="dllwrap"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DLLWRAP=$ac_ct_DLLWRAP
-  fi
-else
-  DLLWRAP="$ac_cv_prog_DLLWRAP"
-fi
-
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
 set dummy ${ac_tool_prefix}windres; ac_word=$2
diff --git a/configure.ac b/configure.ac
index 7792ae5bad3..33634ccad9d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1128,8 +1128,6 @@ AC_PROG_RANLIB
 PGAC_CHECK_STRIP
 AC_CHECK_TOOL(AR, ar, ar)
 if test "$PORTNAME" = "win32"; then
-  AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool)
-  AC_CHECK_TOOL(DLLWRAP, dllwrap, dllwrap)
   AC_CHECK_TOOL(WINDRES, windres, windres)
 fi
 
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 5664c645f82..0963c6d6395 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -284,8 +284,6 @@ ZIC = @ZIC@
 # Linking
 
 AR = @AR@
-DLLTOOL = @DLLTOOL@
-DLLWRAP = @DLLWRAP@
 LIBS = @LIBS@
 LDAP_LIBS_FE = @LDAP_LIBS_FE@
 LDAP_LIBS_BE = @LDAP_LIBS_BE@
-- 
2.37.3.542.gdd3f6c4cae

v13-0002-Don-t-hardcode-tmp_check-as-test-directory-for-t.patchtext/x-diff; charset=us-asciiDownload
From 979f2688954477c235cdca5e669b8a95c5597318 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 11 Aug 2022 08:57:58 -0700
Subject: [PATCH v13 02/20] Don't hardcode tmp_check/ as test directory for tap
 tests

This is motivated by the meson patchset, which wants to put the log / data for
tests in a different place than the autoconf build. Right now log files for
tap tests have to be inside $TESTDIR/tmp_check, whereas log files for
pg_regress/isolationtester are outside of tmp_check. This change doesn't fix
the latter, but is a prerequisite.

The only test that needs adjustment is 010_tab_completion.pl, as it hardcoded
the tmp_check/ directory. Instead create a dedicated directory for the test
files.  It's also a bit cleaner independently, because it doesn't intermingle
the test files with more important things like the log/ directory.

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/1131990.1660661896@sss.pgh.pa.us
---
 src/bin/psql/t/010_tab_completion.pl   | 33 +++++++++++++-------------
 src/test/perl/PostgreSQL/Test/Utils.pm |  2 +-
 src/Makefile.global.in                 |  6 ++---
 src/tools/msvc/vcregress.pl            |  2 +-
 4 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 2eea515e871..cb36e8e4811 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -68,7 +68,7 @@ delete $ENV{LS_COLORS};
 
 # In a VPATH build, we'll be started in the source directory, but we want
 # to run in the build directory so that we can use relative paths to
-# access the tmp_check subdirectory; otherwise the output from filename
+# access the tab_comp_dir subdirectory; otherwise the output from filename
 # completion tests is too variable.
 if ($ENV{TESTDIR})
 {
@@ -76,17 +76,18 @@ if ($ENV{TESTDIR})
 }
 
 # Create some junk files for filename completion testing.
+mkdir "tab_comp_dir";
 my $FH;
-open $FH, ">", "tmp_check/somefile"
-  or die("could not create file \"tmp_check/somefile\": $!");
+open $FH, ">", "tab_comp_dir/somefile"
+  or die("could not create file \"tab_comp_dir/somefile\": $!");
 print $FH "some stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile123"
-  or die("could not create file \"tmp_check/afile123\": $!");
+open $FH, ">", "tab_comp_dir/afile123"
+  or die("could not create file \"tab_comp_dir/afile123\": $!");
 print $FH "more stuff\n";
 close $FH;
-open $FH, ">", "tmp_check/afile456"
-  or die("could not create file \"tmp_check/afile456\": $!");
+open $FH, ">", "tab_comp_dir/afile456"
+  or die("could not create file \"tab_comp_dir/afile456\": $!");
 print $FH "other stuff\n";
 close $FH;
 
@@ -272,16 +273,16 @@ clear_query();
 
 # check filename completion
 check_completion(
-	"\\lo_import tmp_check/some\t",
-	qr|tmp_check/somefile |,
+	"\\lo_import tab_comp_dir/some\t",
+	qr|tab_comp_dir/somefile |,
 	"filename completion with one possibility");
 
 clear_query();
 
 # note: readline might print a bell before the completion
 check_completion(
-	"\\lo_import tmp_check/af\t",
-	qr|tmp_check/af\a?ile|,
+	"\\lo_import tab_comp_dir/af\t",
+	qr|tab_comp_dir/af\a?ile|,
 	"filename completion with multiple possibilities");
 
 # broken versions of libedit require clear_line not clear_query here
@@ -291,15 +292,15 @@ clear_line();
 # note: broken versions of libedit want to backslash the closing quote;
 # not much we can do about that
 check_completion(
-	"COPY foo FROM tmp_check/some\t",
-	qr|'tmp_check/somefile\\?' |,
+	"COPY foo FROM tab_comp_dir/some\t",
+	qr|'tab_comp_dir/somefile\\?' |,
 	"quoted filename completion with one possibility");
 
 clear_line();
 
 check_completion(
-	"COPY foo FROM tmp_check/af\t",
-	qr|'tmp_check/afile|,
+	"COPY foo FROM tab_comp_dir/af\t",
+	qr|'tab_comp_dir/afile|,
 	"quoted filename completion with multiple possibilities");
 
 # some versions of readline/libedit require two tabs here, some only need one
@@ -307,7 +308,7 @@ check_completion(
 # the quotes might appear, too
 check_completion(
 	"\t\t",
-	qr|afile123'? +'?(tmp_check/)?afile456|,
+	qr|afile123'? +'?(tab_comp_dir/)?afile456|,
 	"offer multiple file choices");
 
 clear_line();
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 1ca2cc59170..88a472f2442 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -192,7 +192,7 @@ INIT
 	# Determine output directories, and create them.  The base path is the
 	# TESTDIR environment variable, which is normally set by the invoking
 	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check";
+	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}" : "tmp_check";
 	$log_path = "$tmp_check/log";
 
 	mkdir $tmp_check;
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 0963c6d6395..606a2a6f172 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -451,7 +451,7 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -462,7 +462,7 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -474,7 +474,7 @@ echo "+++ tap check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
+   TESTDIR='$(CURDIR)/tmp_check' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
 endef
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index c3729f6be5e..da152da8e5f 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -291,7 +291,7 @@ sub tap_check
 	$ENV{PG_REGRESS}    = "$topdir/$Config/pg_regress/pg_regress";
 	$ENV{REGRESS_SHLIB} = "$topdir/src/test/regress/regress.dll";
 
-	$ENV{TESTDIR} = "$dir";
+	$ENV{TESTDIR} = "$dir/tmp_check";
 	my $module = basename $dir;
 	# add the module build dir as the second element in the PATH
 	$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
-- 
2.37.3.542.gdd3f6c4cae

v13-0003-Split-TESTDIR-into-TESTLOGDIR-and-TESTDATADIR.patchtext/x-diff; charset=us-asciiDownload
From 9fc657fbb7e2970d4fdee668fc878ad8f47d60bb Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 15 Aug 2022 19:49:44 -0700
Subject: [PATCH v13 03/20] Split TESTDIR into TESTLOGDIR and TESTDATADIR

The motivation for this is twofold. For one the meson patchset would like to
have more control over the logfiles. For another, the log file location for
tap tests (tmp_check/log) is not symmetric to the log location for
pg_regress/isolation tests (log/).

This commit does not change the default location for log files for tap tests,
as that'd break the buildfarm log collection, it just provides the
infrastructure for doing so.
---
 src/bin/psql/t/010_tab_completion.pl   |  4 ++--
 src/test/perl/PostgreSQL/Test/Utils.pm | 10 +++++-----
 src/Makefile.global.in                 | 13 ++++++++++---
 src/tools/msvc/vcregress.pl            |  4 +++-
 4 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index cb36e8e4811..4aa6dd5fe13 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -70,9 +70,9 @@ delete $ENV{LS_COLORS};
 # to run in the build directory so that we can use relative paths to
 # access the tab_comp_dir subdirectory; otherwise the output from filename
 # completion tests is too variable.
-if ($ENV{TESTDIR})
+if ($ENV{TESTDATADIR})
 {
-	chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+	chdir $ENV{TESTDATADIR} or die "could not chdir to \"$ENV{TESTDATADIR}\": $!";
 }
 
 # Create some junk files for filename completion testing.
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 88a472f2442..99d33451064 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -189,11 +189,11 @@ INIT
 	# test may still fail, but it's more likely to report useful facts.
 	$SIG{PIPE} = 'IGNORE';
 
-	# Determine output directories, and create them.  The base path is the
-	# TESTDIR environment variable, which is normally set by the invoking
-	# Makefile.
-	$tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}" : "tmp_check";
-	$log_path = "$tmp_check/log";
+	# Determine output directories, and create them.  The base paths are the
+	# TESTDATADIR / TESTLOGDIR environment variables, which are normally set
+	# by the invoking Makefile.
+	$tmp_check = $ENV{TESTDATADIR} ? "$ENV{TESTDATADIR}" : "tmp_check";
+	$log_path = $ENV{TESTLOGDIR} ? "$ENV{TESTLOGDIR}" : "log";
 
 	mkdir $tmp_check;
 	mkdir $log_path;
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 606a2a6f172..f6adf566403 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -451,7 +451,9 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' \
+   TESTDATADIR='$(CURDIR)/tmp_check' \
+   PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -462,7 +464,9 @@ echo "+++ tap install-check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)/tmp_check' PATH="$(bindir):$(CURDIR):$$PATH" \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' \
+   TESTDATADIR='$(CURDIR)/tmp_check' \
+   PATH="$(bindir):$(CURDIR):$$PATH" \
    PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
    PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -474,7 +478,10 @@ echo "+++ tap check in $(subdir) +++" && \
 rm -rf '$(CURDIR)'/tmp_check && \
 $(MKDIR_P) '$(CURDIR)'/tmp_check && \
 cd $(srcdir) && \
-   TESTDIR='$(CURDIR)/tmp_check' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
+   TESTLOGDIR='$(CURDIR)/tmp_check/log' \
+   TESTDATADIR='$(CURDIR)/tmp_check' \
+   $(with_temp_install) \
+   PGPORT='6$(DEF_PGPORT)' \
    PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
    $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
 endef
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index da152da8e5f..5182721eb79 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -291,7 +291,9 @@ sub tap_check
 	$ENV{PG_REGRESS}    = "$topdir/$Config/pg_regress/pg_regress";
 	$ENV{REGRESS_SHLIB} = "$topdir/src/test/regress/regress.dll";
 
-	$ENV{TESTDIR} = "$dir/tmp_check";
+	$ENV{TESTDATADIR} = "$dir/tmp_check";
+	$ENV{TESTLOGDIR} = "$dir/tmp_check/log";
+
 	my $module = basename $dir;
 	# add the module build dir as the second element in the PATH
 	$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
-- 
2.37.3.542.gdd3f6c4cae

v13-0004-meson-prereq-Extend-gendef.pl-in-preparation-for.patchtext/x-diff; charset=us-asciiDownload
From 6de8f1de0ffa48f5543b899a4ab939b3c5b02d07 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 9 Aug 2022 00:29:57 -0700
Subject: [PATCH v13 04/20] meson: prereq: Extend gendef.pl in preparation for
 meson

The main issue with using gendef.pl as is for meson is that with meson the
filenames are a bit longer, exceeding the max commandline length when calling
dumpbin with all objects. It's easier to pass a library in anyway.

The .def file location, input and temporary file location need to be tunable
as well.

This also fixes a bug in gendef.pl: The logic when to regenerate was broken
and never avoid regenerating.

Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Discussion: https://postgr.es/m/20220809071055.rgikv3qn74ypnnbb@awork3.anarazel.de
Discussion: https://postgr.es/m/7dae5979-c6c0-cec5-7a36-76a85aa8053d@enterprisedb.com
---
 src/tools/msvc/MSBuildProject.pm |  4 +-
 src/tools/msvc/gendef.pl         | 67 ++++++++++++++++++++++----------
 2 files changed, 49 insertions(+), 22 deletions(-)

diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 594729ceb7d..58590fdac29 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -312,6 +312,8 @@ sub WriteItemDefinitionGroup
 
 	my $targetmachine =
 	  $self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64';
+	my $arch =
+	  $self->{platform} eq 'Win32' ? 'x86' : 'x86_64';
 
 	my $includes = join ';', @{ $self->{includes} }, "";
 
@@ -380,7 +382,7 @@ EOF
 		print $f <<EOF;
     <PreLinkEvent>
       <Message>Generate DEF file</Message>
-      <Command>perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name} $self->{platform}</Command>
+      <Command>perl src\\tools\\msvc\\gendef.pl --arch $arch --deffile $cfgname\\$self->{name}\\$self->{name}.def $cfgname\\$self->{name}</Command>
     </PreLinkEvent>
 EOF
 	}
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index b4af3dea81b..d6bed1ce151 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -3,7 +3,8 @@
 
 use strict;
 use warnings;
-use List::Util qw(max);
+use List::Util qw(min);
+use Getopt::Long;
 
 my @def;
 
@@ -112,7 +113,7 @@ sub extract_syms
 
 sub writedef
 {
-	my ($deffile, $platform, $def) = @_;
+	my ($deffile, $arch, $def) = @_;
 	open(my $fh, '>', $deffile) || die "Could not write to $deffile\n";
 	print $fh "EXPORTS\n";
 	foreach my $f (sort keys %{$def})
@@ -121,7 +122,7 @@ sub writedef
 
 		# Strip the leading underscore for win32, but not x64
 		$f =~ s/^_//
-		  unless ($platform eq "x64");
+		  unless ($arch eq "x86_64");
 
 		# Emit just the name if it's a function symbol, or emit the name
 		# decorated with the DATA option for variables.
@@ -141,40 +142,64 @@ sub writedef
 
 sub usage
 {
-	die(    "Usage: gendef.pl <modulepath> <platform>\n"
-		  . "    modulepath: path to dir with obj files, no trailing slash"
-		  . "    platform: Win32 | x64");
+	die("Usage: gendef.pl --arch <arch> --deffile <deffile> --tempdir <tempdir> files-or-directories\n"
+		  . "    arch: x86 | x86_64\n"
+		  . "    deffile: path of the generated file\n"
+		  . "    tempdir: directory for temporary files\n"
+		  . "    files or directories: object files or directory containing object files\n"
+	);
 }
 
-usage()
-  unless scalar(@ARGV) == 2
-  && ( ($ARGV[0] =~ /\\([^\\]+$)/)
-	&& ($ARGV[1] eq 'Win32' || $ARGV[1] eq 'x64'));
-my $defname  = uc $1;
-my $deffile  = "$ARGV[0]/$defname.def";
-my $platform = $ARGV[1];
+my $arch;
+my $deffile;
+my $tempdir = '.';
+
+GetOptions(
+	'arch:s'    => \$arch,
+	'deffile:s' => \$deffile,
+	'tempdir:s' => \$tempdir,) or usage();
+
+usage("arch: $arch")
+  unless ($arch eq 'x86' || $arch eq 'x86_64');
+
+my @files;
+
+foreach my $in (@ARGV)
+{
+	if (-d $in)
+	{
+		push @files, glob "$in/*.obj";
+	}
+	else
+	{
+		push @files, $in;
+	}
+}
 
 # if the def file exists and is newer than all input object files, skip
 # its creation
 if (-f $deffile
-	&& (-M $deffile > max(map { -M } <$ARGV[0]/*.obj>)))
+	&& (-M $deffile < min(map { -M } @files)))
 {
-	print "Not re-generating $defname.DEF, file already exists.\n";
+	print "Not re-generating $deffile, file already exists.\n";
 	exit(0);
 }
 
-print "Generating $defname.DEF from directory $ARGV[0], platform $platform\n";
+print "Generating $deffile in tempdir $tempdir\n";
 
 my %def = ();
 
-my $symfile = "$ARGV[0]/all.sym";
-my $tmpfile = "$ARGV[0]/tmp.sym";
-system("dumpbin /symbols /out:$tmpfile $ARGV[0]/*.obj >NUL")
-  && die "Could not call dumpbin";
+my $symfile = "$tempdir/all.sym";
+my $tmpfile = "$tempdir/tmp.sym";
+mkdir($tempdir) unless -d $tempdir;
+
+my $cmd = "dumpbin /nologo /symbols /out:$tmpfile " . join(' ', @files);
+
+system($cmd) && die "Could not call dumpbin";
 rename($tmpfile, $symfile);
 extract_syms($symfile, \%def);
 print "\n";
 
-writedef($deffile, $platform, \%def);
+writedef($deffile, $arch, \%def);
 
 print "Generated " . scalar(keys(%def)) . " symbols\n";
-- 
2.37.3.542.gdd3f6c4cae

v13-0005-meson-prereq-Add-src-tools-gen_export.pl.patchtext/x-diff; charset=us-asciiDownload
From 7054861f0fef88b76a10a1cad4db08abafde8721 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v13 05/20] meson: prereq: Add src/tools/gen_export.pl

Currently the logic is all in src/Makefile.shlib. This adds a sketch of a
generation script that can be used from meson.

Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Discussion: https://postgr.es/m/7dae5979-c6c0-cec5-7a36-76a85aa8053d@enterprisedb.com
---
 src/tools/gen_export.pl | 81 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)
 create mode 100644 src/tools/gen_export.pl

diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
new file mode 100644
index 00000000000..68b3ab86614
--- /dev/null
+++ b/src/tools/gen_export.pl
@@ -0,0 +1,81 @@
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $format;
+my $libname;
+my $input;
+my $output;
+
+GetOptions(
+	'format:s'   => \$format,
+	'libname:s'    => \$libname,
+	'input:s' => \$input,
+	'output:s'  => \$output) or die "wrong arguments";
+
+if (not ($format eq 'aix' or $format eq 'darwin' or $format eq 'gnu' or $format eq 'win'))
+{
+	die "$0: $format is not yet handled (only aix, darwin, gnu, win are)\n";
+}
+
+open(my $input_handle, '<', $input)
+  or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+  or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+	print $output_handle "{
+  global:
+";
+}
+elsif ($format eq 'win')
+{
+	# XXX: Looks like specifying LIBRARY $libname is optional, which makes it
+	# easier to build a generic command for generating export files...
+	if ($libname)
+	{
+		print $output_handle "LIBRARY $libname\n";
+	}
+	print $output_handle "EXPORTS\n";
+}
+
+while (<$input_handle>)
+{
+	if (/^#/)
+	{
+		# don't do anything with a comment
+	}
+	elsif (/^(\S+)\s+(\S+)/)
+	{
+		if ($format eq 'aix')
+		{
+			print $output_handle "$1\n";
+		}
+		elsif ($format eq 'darwin')
+		{
+			print $output_handle "_$1\n";
+		}
+		elsif ($format eq 'gnu')
+		{
+			print $output_handle "    $1;\n";
+		}
+		elsif ($format eq 'win')
+		{
+			print $output_handle "$1 @ $2\n";
+		}
+	}
+	else
+	{
+		die "$0: unexpected line $_\n";
+	}
+}
+
+if ($format eq 'gnu')
+{
+	print $output_handle "  local: *;
+};
+";
+}
-- 
2.37.3.542.gdd3f6c4cae

v13-0006-meson-prereq-Refactor-PG_TEST_EXTRA-logic-in-aut.patchtext/x-diff; charset=us-asciiDownload
From 1aa586f2921cf58c3d74b1c7344663876cf2f693 Mon Sep 17 00:00:00 2001
From: nbyavuz <byavuz81@gmail.com>
Date: Fri, 25 Mar 2022 10:55:08 +0300
Subject: [PATCH v13 06/20] meson: prereq: Refactor PG_TEST_EXTRA logic in
 autoconf build

---
 src/test/Makefile               | 15 +++++----------
 src/test/kerberos/t/001_auth.pl |  4 ++++
 src/test/ldap/t/001_auth.pl     |  4 ++++
 src/test/ssl/t/001_ssltests.pl  |  4 ++++
 src/test/ssl/t/002_scram.pl     |  4 ++++
 src/test/ssl/t/003_sslinfo.pl   |  4 ++++
 6 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/test/Makefile b/src/test/Makefile
index 69ef074d75e..dbd3192874d 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -17,25 +17,20 @@ SUBDIRS = perl regress isolation modules authentication recovery subscription
 ifeq ($(with_icu),yes)
 SUBDIRS += icu
 endif
-
-# Test suites that are not safe by default but can be run if selected
-# by the user via the whitespace-separated list in variable
-# PG_TEST_EXTRA:
 ifeq ($(with_gssapi),yes)
-ifneq (,$(filter kerberos,$(PG_TEST_EXTRA)))
 SUBDIRS += kerberos
 endif
-endif
 ifeq ($(with_ldap),yes)
-ifneq (,$(filter ldap,$(PG_TEST_EXTRA)))
 SUBDIRS += ldap
 endif
-endif
 ifeq ($(with_ssl),openssl)
-ifneq (,$(filter ssl,$(PG_TEST_EXTRA)))
 SUBDIRS += ssl
 endif
-endif
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA to check it in individual tap tests.
+export PG_TEST_EXTRA
 
 # We don't build or execute these by default, but we do want "make
 # clean" etc to recurse into them.  (We must filter out those that we
diff --git a/src/test/kerberos/t/001_auth.pl b/src/test/kerberos/t/001_auth.pl
index 62e05426393..e403d24c0c2 100644
--- a/src/test/kerberos/t/001_auth.pl
+++ b/src/test/kerberos/t/001_auth.pl
@@ -25,6 +25,10 @@ if ($ENV{with_gssapi} ne 'yes')
 {
 	plan skip_all => 'GSSAPI/Kerberos not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /kerberos/)
+{
+	plan skip_all => 'Potentially unsafe test GSSAPI/Kerberos not enabled in PG_TEST_EXTRA';
+}
 
 my ($krb5_bin_dir, $krb5_sbin_dir);
 
diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index 86dff8bd1f3..a5afddc5272 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -16,6 +16,10 @@ if ($ENV{with_ldap} ne 'yes')
 {
 	plan skip_all => 'LDAP not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ldap/)
+{
+	plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA';
+}
 elsif ($^O eq 'darwin' && -d '/usr/local/opt/openldap')
 {
 	# typical paths for Homebrew
diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl
index efab2ac194c..c77bc9ef500 100644
--- a/src/test/ssl/t/001_ssltests.pl
+++ b/src/test/ssl/t/001_ssltests.pl
@@ -17,6 +17,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl
index 588f47a39b9..15d45c88e50 100644
--- a/src/test/ssl/t/002_scram.pl
+++ b/src/test/ssl/t/002_scram.pl
@@ -20,6 +20,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 my $ssl_server = SSL::Server->new();
 
diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl
index 87fb18a31e0..acd0ba8e828 100644
--- a/src/test/ssl/t/003_sslinfo.pl
+++ b/src/test/ssl/t/003_sslinfo.pl
@@ -18,6 +18,10 @@ if ($ENV{with_ssl} ne 'openssl')
 {
 	plan skip_all => 'OpenSSL not supported by this build';
 }
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+	plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
 
 #### Some configuration
 my $ssl_server = SSL::Server->new();
-- 
2.37.3.542.gdd3f6c4cae

v13-0007-meson-prereq-port-Include-c.h-instead-of-postgre.patchtext/x-diff; charset=us-asciiDownload
From 5a9731dcc2e6fb8afaf856e674e587a0edb731ad Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 6 Sep 2022 12:13:49 -0700
Subject: [PATCH v13 07/20] meson: prereq: port: Include c.h instead of
 postgres.h in *p{read,write}*.c

This is part of the meson series as otherwise these files need an unnecessary
dependency on errcodes.h.
---
 src/port/preadv.c      | 2 +-
 src/port/pwritev.c     | 2 +-
 src/port/win32pread.c  | 2 +-
 src/port/win32pwrite.c | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/port/preadv.c b/src/port/preadv.c
index 48b64d4593d..188e10f0652 100644
--- a/src/port/preadv.c
+++ b/src/port/preadv.c
@@ -12,7 +12,7 @@
  */
 
 
-#include "postgres.h"
+#include "c.h"
 
 #include <unistd.h>
 
diff --git a/src/port/pwritev.c b/src/port/pwritev.c
index 8b303fcbcdc..de9b7e4e3d3 100644
--- a/src/port/pwritev.c
+++ b/src/port/pwritev.c
@@ -12,7 +12,7 @@
  */
 
 
-#include "postgres.h"
+#include "c.h"
 
 #include <unistd.h>
 
diff --git a/src/port/win32pread.c b/src/port/win32pread.c
index 7058c3460b5..ebcdd337569 100644
--- a/src/port/win32pread.c
+++ b/src/port/win32pread.c
@@ -12,7 +12,7 @@
  */
 
 
-#include "postgres.h"
+#include "c.h"
 
 #include <windows.h>
 
diff --git a/src/port/win32pwrite.c b/src/port/win32pwrite.c
index 455cec4a747..7f2e62e8a78 100644
--- a/src/port/win32pwrite.c
+++ b/src/port/win32pwrite.c
@@ -12,7 +12,7 @@
  */
 
 
-#include "postgres.h"
+#include "c.h"
 
 #include <windows.h>
 
-- 
2.37.3.542.gdd3f6c4cae

v13-0008-meson-Add-meson-based-buildsystem.patchtext/x-diff; charset=us-asciiDownload
From 1939bdcfbfeaaf053b6a8e8a7e9f5c257b38fdfb Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 12 Sep 2022 17:05:05 -0700
Subject: [PATCH v13 08/20] meson: Add meson based buildsystem

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Peter Eisentraut <peter@eisentraut.org>
Author: Thomas Munro <thomas.munro@gmail.com>
Author: John Naylor <john.naylor@enterprisedb.com>
Author: Stone Tickle <lattis@mochiro.moe>
---
 src/include/catalog/meson.build               |  142 +
 src/include/meson.build                       |  173 +
 src/include/nodes/meson.build                 |   58 +
 src/include/pg_config_ext.h.meson             |    7 +
 src/include/storage/meson.build               |   19 +
 src/include/utils/meson.build                 |   57 +
 src/common/meson.build                        |  174 +
 src/common/unicode/meson.build                |  106 +
 src/port/meson.build                          |  184 +
 config/meson.build                            |    4 +
 src/backend/access/brin/meson.build           |   12 +
 src/backend/access/common/meson.build         |   18 +
 src/backend/access/gin/meson.build            |   17 +
 src/backend/access/gist/meson.build           |   13 +
 src/backend/access/hash/meson.build           |   12 +
 src/backend/access/heap/meson.build           |   11 +
 src/backend/access/index/meson.build          |    6 +
 src/backend/access/meson.build                |   13 +
 src/backend/access/nbtree/meson.build         |   13 +
 src/backend/access/rmgrdesc/meson.build       |   26 +
 src/backend/access/spgist/meson.build         |   13 +
 src/backend/access/table/meson.build          |    6 +
 src/backend/access/tablesample/meson.build    |    5 +
 src/backend/access/transam/meson.build        |   31 +
 src/backend/backup/meson.build                |   13 +
 src/backend/bootstrap/meson.build             |   28 +
 src/backend/catalog/meson.build               |   44 +
 src/backend/commands/meson.build              |   51 +
 src/backend/executor/meson.build              |   67 +
 src/backend/foreign/meson.build               |    3 +
 src/backend/jit/llvm/meson.build              |   73 +
 src/backend/jit/meson.build                   |    3 +
 src/backend/lib/meson.build                   |   12 +
 src/backend/libpq/meson.build                 |   32 +
 src/backend/main/meson.build                  |    2 +
 src/backend/meson.build                       |  190 ++
 src/backend/nodes/meson.build                 |   29 +
 src/backend/optimizer/geqo/meson.build        |   17 +
 src/backend/optimizer/meson.build             |    5 +
 src/backend/optimizer/path/meson.build        |   11 +
 src/backend/optimizer/plan/meson.build        |   10 +
 src/backend/optimizer/prep/meson.build        |    7 +
 src/backend/optimizer/util/meson.build        |   16 +
 src/backend/parser/meson.build                |   48 +
 src/backend/partitioning/meson.build          |    5 +
 src/backend/po/meson.build                    |    1 +
 src/backend/port/meson.build                  |   31 +
 src/backend/port/win32/meson.build            |    6 +
 src/backend/postmaster/meson.build            |   15 +
 src/backend/regex/meson.build                 |    8 +
 .../replication/libpqwalreceiver/meson.build  |   13 +
 src/backend/replication/logical/meson.build   |   14 +
 src/backend/replication/meson.build           |   51 +
 src/backend/replication/pgoutput/meson.build  |   11 +
 src/backend/rewrite/meson.build               |    9 +
 src/backend/snowball/meson.build              |   88 +
 src/backend/statistics/meson.build            |    6 +
 src/backend/storage/buffer/meson.build        |    7 +
 src/backend/storage/file/meson.build          |    8 +
 src/backend/storage/freespace/meson.build     |    5 +
 src/backend/storage/ipc/meson.build           |   20 +
 src/backend/storage/large_object/meson.build  |    3 +
 src/backend/storage/lmgr/meson.build          |   13 +
 src/backend/storage/meson.build               |    9 +
 src/backend/storage/page/meson.build          |    5 +
 src/backend/storage/smgr/meson.build          |    4 +
 src/backend/storage/sync/meson.build          |    4 +
 src/backend/tcop/meson.build                  |    8 +
 src/backend/tsearch/meson.build               |   21 +
 src/backend/utils/activity/meson.build        |   18 +
 src/backend/utils/adt/meson.build             |  131 +
 src/backend/utils/cache/meson.build           |   16 +
 src/backend/utils/error/meson.build           |    6 +
 src/backend/utils/fmgr/meson.build            |    8 +
 src/backend/utils/hash/meson.build            |    4 +
 src/backend/utils/init/meson.build            |    4 +
 .../utils/mb/conversion_procs/meson.build     |   36 +
 src/backend/utils/mb/meson.build              |    9 +
 src/backend/utils/meson.build                 |   17 +
 src/backend/utils/misc/meson.build            |   35 +
 src/backend/utils/mmgr/meson.build            |   10 +
 src/backend/utils/resowner/meson.build        |    3 +
 src/backend/utils/sort/meson.build            |    9 +
 src/backend/utils/time/meson.build            |    4 +
 src/fe_utils/meson.build                      |   29 +
 src/bin/initdb/meson.build                    |   30 +
 src/bin/initdb/po/meson.build                 |    1 +
 src/bin/meson.build                           |   20 +
 src/bin/pg_amcheck/meson.build                |   27 +
 src/bin/pg_amcheck/po/meson.build             |    1 +
 src/bin/pg_archivecleanup/meson.build         |   19 +
 src/bin/pg_archivecleanup/po/meson.build      |    1 +
 src/bin/pg_basebackup/meson.build             |   61 +
 src/bin/pg_basebackup/po/meson.build          |    1 +
 src/bin/pg_checksums/meson.build              |   21 +
 src/bin/pg_checksums/po/meson.build           |    1 +
 src/bin/pg_config/meson.build                 |   19 +
 src/bin/pg_config/po/meson.build              |    1 +
 src/bin/pg_controldata/meson.build            |   19 +
 src/bin/pg_controldata/po/meson.build         |    1 +
 src/bin/pg_ctl/meson.build                    |   22 +
 src/bin/pg_ctl/po/meson.build                 |    1 +
 src/bin/pg_dump/meson.build                   |   75 +
 src/bin/pg_dump/po/meson.build                |    1 +
 src/bin/pg_resetwal/meson.build               |   20 +
 src/bin/pg_resetwal/po/meson.build            |    1 +
 src/bin/pg_rewind/meson.build                 |   42 +
 src/bin/pg_rewind/po/meson.build              |    1 +
 src/bin/pg_test_fsync/meson.build             |   21 +
 src/bin/pg_test_fsync/po/meson.build          |    1 +
 src/bin/pg_test_timing/meson.build            |   19 +
 src/bin/pg_test_timing/po/meson.build         |    1 +
 src/bin/pg_upgrade/meson.build                |   40 +
 src/bin/pg_upgrade/po/meson.build             |    1 +
 src/bin/pg_verifybackup/meson.build           |   33 +
 src/bin/pg_verifybackup/po/meson.build        |    1 +
 src/bin/pg_waldump/meson.build                |   30 +
 src/bin/pg_waldump/po/meson.build             |    1 +
 src/bin/pgbench/meson.build                   |   38 +
 src/bin/pgevent/meson.build                   |   26 +
 src/bin/psql/meson.build                      |   67 +
 src/bin/psql/po/meson.build                   |    1 +
 src/bin/scripts/meson.build                   |   51 +
 src/bin/scripts/po/meson.build                |    1 +
 src/interfaces/libpq/meson.build              |  108 +
 src/interfaces/libpq/po/meson.build           |    1 +
 src/interfaces/libpq/test/meson.build         |   15 +
 src/pl/meson.build                            |    5 +
 src/pl/plperl/meson.build                     |   90 +
 src/pl/plperl/po/meson.build                  |    1 +
 src/pl/plpgsql/meson.build                    |    1 +
 src/pl/plpgsql/src/meson.build                |   84 +
 src/pl/plpgsql/src/po/meson.build             |    1 +
 src/pl/plpython/meson.build                   |   99 +
 src/pl/plpython/po/meson.build                |    1 +
 src/pl/tcl/meson.build                        |   55 +
 src/pl/tcl/po/meson.build                     |    1 +
 contrib/adminpack/meson.build                 |   23 +
 contrib/amcheck/meson.build                   |   37 +
 contrib/auth_delay/meson.build                |    5 +
 contrib/auto_explain/meson.build              |   16 +
 contrib/basebackup_to_shell/meson.build       |   22 +
 contrib/basic_archive/meson.build             |   23 +
 contrib/bloom/meson.build                     |   36 +
 contrib/bool_plperl/meson.build               |   42 +
 contrib/btree_gin/meson.build                 |   54 +
 contrib/btree_gist/meson.build                |   84 +
 contrib/citext/meson.build                    |   34 +
 contrib/cube/meson.build                      |   53 +
 contrib/dblink/meson.build                    |   31 +
 contrib/dict_int/meson.build                  |   22 +
 contrib/dict_xsyn/meson.build                 |   29 +
 contrib/earthdistance/meson.build             |   23 +
 contrib/file_fdw/meson.build                  |   22 +
 contrib/fuzzystrmatch/meson.build             |   26 +
 contrib/hstore/meson.build                    |   44 +
 contrib/hstore_plperl/meson.build             |   43 +
 contrib/hstore_plpython/meson.build           |   37 +
 contrib/intagg/meson.build                    |    6 +
 contrib/intarray/meson.build                  |   37 +
 contrib/isn/meson.build                       |   33 +
 contrib/jsonb_plperl/meson.build              |   43 +
 contrib/jsonb_plpython/meson.build            |   36 +
 contrib/lo/meson.build                        |   27 +
 contrib/ltree/meson.build                     |   44 +
 contrib/ltree_plpython/meson.build            |   37 +
 contrib/meson.build                           |   66 +
 contrib/oid2name/meson.build                  |   17 +
 contrib/old_snapshot/meson.build              |   15 +
 contrib/pageinspect/meson.build               |   50 +
 contrib/passwordcheck/meson.build             |   30 +
 contrib/pg_buffercache/meson.build            |   27 +
 contrib/pg_freespacemap/meson.build           |   29 +
 contrib/pg_prewarm/meson.build                |   27 +
 contrib/pg_stat_statements/meson.build        |   35 +
 contrib/pg_surgery/meson.build                |   25 +
 contrib/pg_trgm/meson.build                   |   35 +
 contrib/pg_visibility/meson.build             |   26 +
 contrib/pg_walinspect/meson.build             |   27 +
 contrib/pgcrypto/meson.build                  |  100 +
 contrib/pgrowlocks/meson.build                |   27 +
 contrib/pgstattuple/meson.build               |   31 +
 contrib/postgres_fdw/meson.build              |   34 +
 contrib/seg/meson.build                       |   51 +
 contrib/sepgsql/meson.build                   |   34 +
 contrib/spi/meson.build                       |   50 +
 contrib/sslinfo/meson.build                   |   21 +
 contrib/tablefunc/meson.build                 |   24 +
 contrib/tcn/meson.build                       |   25 +
 contrib/test_decoding/meson.build             |   63 +
 contrib/tsm_system_rows/meson.build           |   24 +
 contrib/tsm_system_time/meson.build           |   24 +
 contrib/unaccent/meson.build                  |   32 +
 contrib/uuid-ossp/meson.build                 |   31 +
 contrib/vacuumlo/meson.build                  |   17 +
 contrib/xml2/meson.build                      |   32 +
 src/interfaces/ecpg/compatlib/meson.build     |   22 +
 src/interfaces/ecpg/ecpglib/meson.build       |   37 +
 src/interfaces/ecpg/ecpglib/po/meson.build    |    1 +
 src/interfaces/ecpg/include/meson.build       |   51 +
 src/interfaces/ecpg/meson.build               |    9 +
 src/interfaces/ecpg/pgtypeslib/meson.build    |   30 +
 src/interfaces/ecpg/preproc/meson.build       |  103 +
 src/interfaces/ecpg/preproc/po/meson.build    |    1 +
 .../ecpg/test/compat_informix/meson.build     |   31 +
 .../ecpg/test/compat_oracle/meson.build       |   20 +
 src/interfaces/ecpg/test/connect/meson.build  |   20 +
 src/interfaces/ecpg/test/meson.build          |   79 +
 .../ecpg/test/pgtypeslib/meson.build          |   21 +
 src/interfaces/ecpg/test/preproc/meson.build  |   37 +
 src/interfaces/ecpg/test/sql/meson.build      |   46 +
 src/interfaces/ecpg/test/thread/meson.build   |   21 +
 src/interfaces/meson.build                    |    2 +
 doc/src/sgml/meson.build                      |  252 ++
 doc/src/sgml/version.sgml.in                  |    2 +
 src/test/authentication/meson.build           |   11 +
 src/test/icu/meson.build                      |   11 +
 src/test/isolation/meson.build                |   58 +
 src/test/kerberos/meson.build                 |   15 +
 src/test/ldap/meson.build                     |   11 +
 src/test/meson.build                          |   25 +
 src/test/modules/brin/meson.build             |   16 +
 src/test/modules/commit_ts/meson.build        |   18 +
 src/test/modules/delay_execution/meson.build  |   18 +
 src/test/modules/dummy_index_am/meson.build   |   23 +
 src/test/modules/dummy_seclabel/meson.build   |   23 +
 src/test/modules/libpq_pipeline/meson.build   |   21 +
 src/test/modules/meson.build                  |   27 +
 src/test/modules/plsample/meson.build         |   23 +
 src/test/modules/snapshot_too_old/meson.build |   14 +
 src/test/modules/spgist_name_ops/meson.build  |   23 +
 .../ssl_passphrase_callback/meson.build       |   48 +
 src/test/modules/test_bloomfilter/meson.build |   23 +
 src/test/modules/test_ddl_deparse/meson.build |   43 +
 src/test/modules/test_extensions/meson.build  |   45 +
 .../modules/test_ginpostinglist/meson.build   |   23 +
 src/test/modules/test_integerset/meson.build  |   23 +
 src/test/modules/test_lfind/meson.build       |   23 +
 src/test/modules/test_misc/meson.build        |   12 +
 src/test/modules/test_oat_hooks/meson.build   |   18 +
 src/test/modules/test_parser/meson.build      |   23 +
 src/test/modules/test_pg_dump/meson.build     |   22 +
 src/test/modules/test_predtest/meson.build    |   23 +
 src/test/modules/test_rbtree/meson.build      |   23 +
 src/test/modules/test_regex/meson.build       |   24 +
 src/test/modules/test_rls_hooks/meson.build   |   17 +
 src/test/modules/test_shm_mq/meson.build      |   27 +
 src/test/modules/unsafe_tests/meson.build     |   11 +
 src/test/modules/worker_spi/meson.build       |   26 +
 src/test/perl/meson.build                     |   12 +
 src/test/recovery/meson.build                 |   43 +
 src/test/regress/meson.build                  |   62 +
 src/test/ssl/meson.build                      |   13 +
 src/test/subscription/meson.build             |   42 +
 configure                                     |    6 +
 configure.ac                                  |    6 +
 meson.build                                   | 3027 +++++++++++++++++
 meson_options.txt                             |  185 +
 src/meson.build                               |   12 +
 src/timezone/meson.build                      |   56 +
 src/timezone/tznames/meson.build              |   21 +
 src/tools/find_meson                          |   30 +
 src/tools/pgflex                              |   85 +
 src/tools/testwrap                            |   47 +
 264 files changed, 10886 insertions(+)
 create mode 100644 src/include/catalog/meson.build
 create mode 100644 src/include/meson.build
 create mode 100644 src/include/nodes/meson.build
 create mode 100644 src/include/pg_config_ext.h.meson
 create mode 100644 src/include/storage/meson.build
 create mode 100644 src/include/utils/meson.build
 create mode 100644 src/common/meson.build
 create mode 100644 src/common/unicode/meson.build
 create mode 100644 src/port/meson.build
 create mode 100644 config/meson.build
 create mode 100644 src/backend/access/brin/meson.build
 create mode 100644 src/backend/access/common/meson.build
 create mode 100644 src/backend/access/gin/meson.build
 create mode 100644 src/backend/access/gist/meson.build
 create mode 100644 src/backend/access/hash/meson.build
 create mode 100644 src/backend/access/heap/meson.build
 create mode 100644 src/backend/access/index/meson.build
 create mode 100644 src/backend/access/meson.build
 create mode 100644 src/backend/access/nbtree/meson.build
 create mode 100644 src/backend/access/rmgrdesc/meson.build
 create mode 100644 src/backend/access/spgist/meson.build
 create mode 100644 src/backend/access/table/meson.build
 create mode 100644 src/backend/access/tablesample/meson.build
 create mode 100644 src/backend/access/transam/meson.build
 create mode 100644 src/backend/backup/meson.build
 create mode 100644 src/backend/bootstrap/meson.build
 create mode 100644 src/backend/catalog/meson.build
 create mode 100644 src/backend/commands/meson.build
 create mode 100644 src/backend/executor/meson.build
 create mode 100644 src/backend/foreign/meson.build
 create mode 100644 src/backend/jit/llvm/meson.build
 create mode 100644 src/backend/jit/meson.build
 create mode 100644 src/backend/lib/meson.build
 create mode 100644 src/backend/libpq/meson.build
 create mode 100644 src/backend/main/meson.build
 create mode 100644 src/backend/meson.build
 create mode 100644 src/backend/nodes/meson.build
 create mode 100644 src/backend/optimizer/geqo/meson.build
 create mode 100644 src/backend/optimizer/meson.build
 create mode 100644 src/backend/optimizer/path/meson.build
 create mode 100644 src/backend/optimizer/plan/meson.build
 create mode 100644 src/backend/optimizer/prep/meson.build
 create mode 100644 src/backend/optimizer/util/meson.build
 create mode 100644 src/backend/parser/meson.build
 create mode 100644 src/backend/partitioning/meson.build
 create mode 100644 src/backend/po/meson.build
 create mode 100644 src/backend/port/meson.build
 create mode 100644 src/backend/port/win32/meson.build
 create mode 100644 src/backend/postmaster/meson.build
 create mode 100644 src/backend/regex/meson.build
 create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
 create mode 100644 src/backend/replication/logical/meson.build
 create mode 100644 src/backend/replication/meson.build
 create mode 100644 src/backend/replication/pgoutput/meson.build
 create mode 100644 src/backend/rewrite/meson.build
 create mode 100644 src/backend/snowball/meson.build
 create mode 100644 src/backend/statistics/meson.build
 create mode 100644 src/backend/storage/buffer/meson.build
 create mode 100644 src/backend/storage/file/meson.build
 create mode 100644 src/backend/storage/freespace/meson.build
 create mode 100644 src/backend/storage/ipc/meson.build
 create mode 100644 src/backend/storage/large_object/meson.build
 create mode 100644 src/backend/storage/lmgr/meson.build
 create mode 100644 src/backend/storage/meson.build
 create mode 100644 src/backend/storage/page/meson.build
 create mode 100644 src/backend/storage/smgr/meson.build
 create mode 100644 src/backend/storage/sync/meson.build
 create mode 100644 src/backend/tcop/meson.build
 create mode 100644 src/backend/tsearch/meson.build
 create mode 100644 src/backend/utils/activity/meson.build
 create mode 100644 src/backend/utils/adt/meson.build
 create mode 100644 src/backend/utils/cache/meson.build
 create mode 100644 src/backend/utils/error/meson.build
 create mode 100644 src/backend/utils/fmgr/meson.build
 create mode 100644 src/backend/utils/hash/meson.build
 create mode 100644 src/backend/utils/init/meson.build
 create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
 create mode 100644 src/backend/utils/mb/meson.build
 create mode 100644 src/backend/utils/meson.build
 create mode 100644 src/backend/utils/misc/meson.build
 create mode 100644 src/backend/utils/mmgr/meson.build
 create mode 100644 src/backend/utils/resowner/meson.build
 create mode 100644 src/backend/utils/sort/meson.build
 create mode 100644 src/backend/utils/time/meson.build
 create mode 100644 src/fe_utils/meson.build
 create mode 100644 src/bin/initdb/meson.build
 create mode 100644 src/bin/initdb/po/meson.build
 create mode 100644 src/bin/meson.build
 create mode 100644 src/bin/pg_amcheck/meson.build
 create mode 100644 src/bin/pg_amcheck/po/meson.build
 create mode 100644 src/bin/pg_archivecleanup/meson.build
 create mode 100644 src/bin/pg_archivecleanup/po/meson.build
 create mode 100644 src/bin/pg_basebackup/meson.build
 create mode 100644 src/bin/pg_basebackup/po/meson.build
 create mode 100644 src/bin/pg_checksums/meson.build
 create mode 100644 src/bin/pg_checksums/po/meson.build
 create mode 100644 src/bin/pg_config/meson.build
 create mode 100644 src/bin/pg_config/po/meson.build
 create mode 100644 src/bin/pg_controldata/meson.build
 create mode 100644 src/bin/pg_controldata/po/meson.build
 create mode 100644 src/bin/pg_ctl/meson.build
 create mode 100644 src/bin/pg_ctl/po/meson.build
 create mode 100644 src/bin/pg_dump/meson.build
 create mode 100644 src/bin/pg_dump/po/meson.build
 create mode 100644 src/bin/pg_resetwal/meson.build
 create mode 100644 src/bin/pg_resetwal/po/meson.build
 create mode 100644 src/bin/pg_rewind/meson.build
 create mode 100644 src/bin/pg_rewind/po/meson.build
 create mode 100644 src/bin/pg_test_fsync/meson.build
 create mode 100644 src/bin/pg_test_fsync/po/meson.build
 create mode 100644 src/bin/pg_test_timing/meson.build
 create mode 100644 src/bin/pg_test_timing/po/meson.build
 create mode 100644 src/bin/pg_upgrade/meson.build
 create mode 100644 src/bin/pg_upgrade/po/meson.build
 create mode 100644 src/bin/pg_verifybackup/meson.build
 create mode 100644 src/bin/pg_verifybackup/po/meson.build
 create mode 100644 src/bin/pg_waldump/meson.build
 create mode 100644 src/bin/pg_waldump/po/meson.build
 create mode 100644 src/bin/pgbench/meson.build
 create mode 100644 src/bin/pgevent/meson.build
 create mode 100644 src/bin/psql/meson.build
 create mode 100644 src/bin/psql/po/meson.build
 create mode 100644 src/bin/scripts/meson.build
 create mode 100644 src/bin/scripts/po/meson.build
 create mode 100644 src/interfaces/libpq/meson.build
 create mode 100644 src/interfaces/libpq/po/meson.build
 create mode 100644 src/interfaces/libpq/test/meson.build
 create mode 100644 src/pl/meson.build
 create mode 100644 src/pl/plperl/meson.build
 create mode 100644 src/pl/plperl/po/meson.build
 create mode 100644 src/pl/plpgsql/meson.build
 create mode 100644 src/pl/plpgsql/src/meson.build
 create mode 100644 src/pl/plpgsql/src/po/meson.build
 create mode 100644 src/pl/plpython/meson.build
 create mode 100644 src/pl/plpython/po/meson.build
 create mode 100644 src/pl/tcl/meson.build
 create mode 100644 src/pl/tcl/po/meson.build
 create mode 100644 contrib/adminpack/meson.build
 create mode 100644 contrib/amcheck/meson.build
 create mode 100644 contrib/auth_delay/meson.build
 create mode 100644 contrib/auto_explain/meson.build
 create mode 100644 contrib/basebackup_to_shell/meson.build
 create mode 100644 contrib/basic_archive/meson.build
 create mode 100644 contrib/bloom/meson.build
 create mode 100644 contrib/bool_plperl/meson.build
 create mode 100644 contrib/btree_gin/meson.build
 create mode 100644 contrib/btree_gist/meson.build
 create mode 100644 contrib/citext/meson.build
 create mode 100644 contrib/cube/meson.build
 create mode 100644 contrib/dblink/meson.build
 create mode 100644 contrib/dict_int/meson.build
 create mode 100644 contrib/dict_xsyn/meson.build
 create mode 100644 contrib/earthdistance/meson.build
 create mode 100644 contrib/file_fdw/meson.build
 create mode 100644 contrib/fuzzystrmatch/meson.build
 create mode 100644 contrib/hstore/meson.build
 create mode 100644 contrib/hstore_plperl/meson.build
 create mode 100644 contrib/hstore_plpython/meson.build
 create mode 100644 contrib/intagg/meson.build
 create mode 100644 contrib/intarray/meson.build
 create mode 100644 contrib/isn/meson.build
 create mode 100644 contrib/jsonb_plperl/meson.build
 create mode 100644 contrib/jsonb_plpython/meson.build
 create mode 100644 contrib/lo/meson.build
 create mode 100644 contrib/ltree/meson.build
 create mode 100644 contrib/ltree_plpython/meson.build
 create mode 100644 contrib/meson.build
 create mode 100644 contrib/oid2name/meson.build
 create mode 100644 contrib/old_snapshot/meson.build
 create mode 100644 contrib/pageinspect/meson.build
 create mode 100644 contrib/passwordcheck/meson.build
 create mode 100644 contrib/pg_buffercache/meson.build
 create mode 100644 contrib/pg_freespacemap/meson.build
 create mode 100644 contrib/pg_prewarm/meson.build
 create mode 100644 contrib/pg_stat_statements/meson.build
 create mode 100644 contrib/pg_surgery/meson.build
 create mode 100644 contrib/pg_trgm/meson.build
 create mode 100644 contrib/pg_visibility/meson.build
 create mode 100644 contrib/pg_walinspect/meson.build
 create mode 100644 contrib/pgcrypto/meson.build
 create mode 100644 contrib/pgrowlocks/meson.build
 create mode 100644 contrib/pgstattuple/meson.build
 create mode 100644 contrib/postgres_fdw/meson.build
 create mode 100644 contrib/seg/meson.build
 create mode 100644 contrib/sepgsql/meson.build
 create mode 100644 contrib/spi/meson.build
 create mode 100644 contrib/sslinfo/meson.build
 create mode 100644 contrib/tablefunc/meson.build
 create mode 100644 contrib/tcn/meson.build
 create mode 100644 contrib/test_decoding/meson.build
 create mode 100644 contrib/tsm_system_rows/meson.build
 create mode 100644 contrib/tsm_system_time/meson.build
 create mode 100644 contrib/unaccent/meson.build
 create mode 100644 contrib/uuid-ossp/meson.build
 create mode 100644 contrib/vacuumlo/meson.build
 create mode 100644 contrib/xml2/meson.build
 create mode 100644 src/interfaces/ecpg/compatlib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/po/meson.build
 create mode 100644 src/interfaces/ecpg/include/meson.build
 create mode 100644 src/interfaces/ecpg/meson.build
 create mode 100644 src/interfaces/ecpg/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/po/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_informix/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_oracle/meson.build
 create mode 100644 src/interfaces/ecpg/test/connect/meson.build
 create mode 100644 src/interfaces/ecpg/test/meson.build
 create mode 100644 src/interfaces/ecpg/test/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/test/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/test/sql/meson.build
 create mode 100644 src/interfaces/ecpg/test/thread/meson.build
 create mode 100644 src/interfaces/meson.build
 create mode 100644 doc/src/sgml/meson.build
 create mode 100644 doc/src/sgml/version.sgml.in
 create mode 100644 src/test/authentication/meson.build
 create mode 100644 src/test/icu/meson.build
 create mode 100644 src/test/isolation/meson.build
 create mode 100644 src/test/kerberos/meson.build
 create mode 100644 src/test/ldap/meson.build
 create mode 100644 src/test/meson.build
 create mode 100644 src/test/modules/brin/meson.build
 create mode 100644 src/test/modules/commit_ts/meson.build
 create mode 100644 src/test/modules/delay_execution/meson.build
 create mode 100644 src/test/modules/dummy_index_am/meson.build
 create mode 100644 src/test/modules/dummy_seclabel/meson.build
 create mode 100644 src/test/modules/libpq_pipeline/meson.build
 create mode 100644 src/test/modules/meson.build
 create mode 100644 src/test/modules/plsample/meson.build
 create mode 100644 src/test/modules/snapshot_too_old/meson.build
 create mode 100644 src/test/modules/spgist_name_ops/meson.build
 create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
 create mode 100644 src/test/modules/test_bloomfilter/meson.build
 create mode 100644 src/test/modules/test_ddl_deparse/meson.build
 create mode 100644 src/test/modules/test_extensions/meson.build
 create mode 100644 src/test/modules/test_ginpostinglist/meson.build
 create mode 100644 src/test/modules/test_integerset/meson.build
 create mode 100644 src/test/modules/test_lfind/meson.build
 create mode 100644 src/test/modules/test_misc/meson.build
 create mode 100644 src/test/modules/test_oat_hooks/meson.build
 create mode 100644 src/test/modules/test_parser/meson.build
 create mode 100644 src/test/modules/test_pg_dump/meson.build
 create mode 100644 src/test/modules/test_predtest/meson.build
 create mode 100644 src/test/modules/test_rbtree/meson.build
 create mode 100644 src/test/modules/test_regex/meson.build
 create mode 100644 src/test/modules/test_rls_hooks/meson.build
 create mode 100644 src/test/modules/test_shm_mq/meson.build
 create mode 100644 src/test/modules/unsafe_tests/meson.build
 create mode 100644 src/test/modules/worker_spi/meson.build
 create mode 100644 src/test/perl/meson.build
 create mode 100644 src/test/recovery/meson.build
 create mode 100644 src/test/regress/meson.build
 create mode 100644 src/test/ssl/meson.build
 create mode 100644 src/test/subscription/meson.build
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 src/meson.build
 create mode 100644 src/timezone/meson.build
 create mode 100644 src/timezone/tznames/meson.build
 create mode 100755 src/tools/find_meson
 create mode 100755 src/tools/pgflex
 create mode 100755 src/tools/testwrap

diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..45ffa99692e
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,142 @@
+catalog_headers = [
+  'pg_proc.h',
+  'pg_type.h',
+  'pg_attribute.h',
+  'pg_class.h',
+  'pg_attrdef.h',
+  'pg_constraint.h',
+  'pg_inherits.h',
+  'pg_index.h',
+  'pg_operator.h',
+  'pg_opfamily.h',
+  'pg_opclass.h',
+  'pg_am.h',
+  'pg_amop.h',
+  'pg_amproc.h',
+  'pg_language.h',
+  'pg_largeobject_metadata.h',
+  'pg_largeobject.h',
+  'pg_aggregate.h',
+  'pg_statistic.h',
+  'pg_statistic_ext.h',
+  'pg_statistic_ext_data.h',
+  'pg_rewrite.h',
+  'pg_trigger.h',
+  'pg_event_trigger.h',
+  'pg_description.h',
+  'pg_cast.h',
+  'pg_enum.h',
+  'pg_namespace.h',
+  'pg_conversion.h',
+  'pg_depend.h',
+  'pg_database.h',
+  'pg_db_role_setting.h',
+  'pg_tablespace.h',
+  'pg_authid.h',
+  'pg_auth_members.h',
+  'pg_shdepend.h',
+  'pg_shdescription.h',
+  'pg_ts_config.h',
+  'pg_ts_config_map.h',
+  'pg_ts_dict.h',
+  'pg_ts_parser.h',
+  'pg_ts_template.h',
+  'pg_extension.h',
+  'pg_foreign_data_wrapper.h',
+  'pg_foreign_server.h',
+  'pg_user_mapping.h',
+  'pg_foreign_table.h',
+  'pg_policy.h',
+  'pg_replication_origin.h',
+  'pg_default_acl.h',
+  'pg_init_privs.h',
+  'pg_seclabel.h',
+  'pg_shseclabel.h',
+  'pg_collation.h',
+  'pg_parameter_acl.h',
+  'pg_partitioned_table.h',
+  'pg_range.h',
+  'pg_transform.h',
+  'pg_sequence.h',
+  'pg_publication.h',
+  'pg_publication_namespace.h',
+  'pg_publication_rel.h',
+  'pg_subscription.h',
+  'pg_subscription_rel.h',
+]
+
+bki_data = [
+  'pg_aggregate.dat',
+  'pg_am.dat',
+  'pg_amop.dat',
+  'pg_amproc.dat',
+  'pg_authid.dat',
+  'pg_cast.dat',
+  'pg_class.dat',
+  'pg_collation.dat',
+  'pg_conversion.dat',
+  'pg_database.dat',
+  'pg_language.dat',
+  'pg_namespace.dat',
+  'pg_opclass.dat',
+  'pg_operator.dat',
+  'pg_opfamily.dat',
+  'pg_proc.dat',
+  'pg_range.dat',
+  'pg_tablespace.dat',
+  'pg_ts_config.dat',
+  'pg_ts_config_map.dat',
+  'pg_ts_dict.dat',
+  'pg_ts_parser.dat',
+  'pg_ts_template.dat',
+  'pg_type.dat',
+]
+bki_data_f = files(bki_data)
+
+
+input = []
+output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
+output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+
+foreach h : catalog_headers
+  fname = h.split('.h')[0] + '_d.h'
+  input += files(h)
+  output_files += fname
+  output_install += dir_include_server / 'catalog'
+endforeach
+
+generated_catalog_headers = custom_target('generated_catalog_headers',
+  output: output_files,
+  install_dir: output_install,
+  input: input,
+  depend_files: bki_data_f,
+  build_by_default: true,
+  install: true,
+  command: [
+    perl,
+    files('../../backend/catalog/genbki.pl'),
+    '--include-path=@SOURCE_ROOT@/src/include',
+    '--set-version=' + pg_version_major.to_string(),
+    '--output=@OUTDIR@', '@INPUT@'
+  ],
+)
+
+generated_headers += generated_catalog_headers.to_list()
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/catalog': output_files + ['bki-stamp']}
+generated_sources_ac += {'src/include/catalog': ['header-stamp']}
+
+# 'reformat-dat-files' is a convenience target for rewriting the
+# catalog data files in our standard format.  This includes collapsing
+# out any entries that are redundant with a BKI_DEFAULT annotation.
+run_target('reformat-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f],
+)
+
+# 'expand-dat-files' is a convenience target for expanding out all
+# default values in the catalog data files.  This should be run before
+# altering or removing any BKI_DEFAULT annotation.
+run_target('expand-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f, '--full-tuples'],
+)
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..e5390df0584
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,173 @@
+pg_config_ext = configure_file(
+  input: 'pg_config_ext.h.meson',
+  output: 'pg_config_ext.h',
+  configuration: cdata,
+  install: true,
+  install_dir: dir_include,
+)
+configure_files += pg_config_ext
+
+pg_config_os = configure_file(
+  output: 'pg_config_os.h',
+  input: files('port/@0@.h'.format(portname)),
+  install: true,
+  install_dir: dir_include,
+  copy: true,
+)
+configure_files += pg_config_os
+
+pg_config = configure_file(
+  output: 'pg_config.h',
+  install: true,
+  install_dir: dir_include,
+  configuration: cdata,
+)
+configure_files += pg_config
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', dir_prefix / dir_bin)
+config_paths_data.set_quoted('PGSHAREDIR', dir_prefix / dir_data)
+config_paths_data.set_quoted('SYSCONFDIR', dir_prefix / dir_sysconf)
+config_paths_data.set_quoted('INCLUDEDIR', dir_prefix / dir_include)
+config_paths_data.set_quoted('PKGINCLUDEDIR', dir_prefix / dir_include_pkg)
+config_paths_data.set_quoted('INCLUDEDIRSERVER', dir_prefix / dir_include_server)
+config_paths_data.set_quoted('LIBDIR', dir_prefix / dir_lib)
+config_paths_data.set_quoted('PKGLIBDIR', dir_prefix / dir_lib_pkg)
+config_paths_data.set_quoted('LOCALEDIR', dir_prefix / dir_locale)
+config_paths_data.set_quoted('DOCDIR', dir_prefix / dir_doc)
+config_paths_data.set_quoted('HTMLDIR', dir_prefix / dir_doc_html)
+config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
+
+
+var_cc = ' '.join(cc.cmd_array())
+var_cpp = ' '.join(cc.cmd_array() + ['-E'])
+var_cflags = ' '.join(cflags + cflags_warn)
+var_cxxflags = ' '.join(cxxflags + cxxflags_warn)
+var_cppflags = ' '.join(cppflags)
+var_cflags_sl = '-fPIC' #FIXME
+var_ldflags = ' '.join(ldflags)
+var_ldflags_sl = ''.join(ldflags_sl)
+var_ldflags_ex = '' # FIXME
+# FIXME - some extensions might directly use symbols from one of libs. If
+# that symbol isn't used by postgres, and statically linked, it'll cause an
+# undefined symbol at runtime. And obviously it'll cause problems for
+# executables, although those are probably less common.
+var_libs = ''
+
+
+pg_config_paths = configure_file(
+  output: 'pg_config_paths.h',
+  configuration: config_paths_data,
+  install: false,
+)
+configure_files += pg_config_paths
+
+install_headers(
+  'pg_config_manual.h',
+  'postgres_ext.h',
+)
+
+install_headers(
+  'libpq/libpq-fs.h',
+  install_dir: dir_include / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'port.h',
+  'postgres_fe.h',
+  install_dir: dir_include_internal
+)
+
+install_headers(
+  'libpq/pqcomm.h',
+  install_dir: dir_include_internal / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'fmgr.h',
+  'funcapi.h',
+  'getopt_long.h',
+  'miscadmin.h',
+  'pg_config_manual.h',
+  'pg_getopt.h',
+  'pg_trace.h',
+  'pgstat.h',
+  'pgtar.h',
+  'pgtime.h',
+  'port.h',
+  'postgres.h',
+  'postgres_ext.h',
+  'postgres_fe.h',
+  'windowapi.h',
+  pg_config_ext,
+  pg_config_os,
+  pg_config,
+  install_dir: dir_include_server,
+)
+
+subdir('catalog')
+subdir('nodes')
+subdir('storage')
+subdir('utils')
+
+header_subdirs = [
+  'access',
+  'catalog',
+  'bootstrap',
+  'commands',
+  'common',
+  'datatype',
+  'executor',
+  'fe_utils',
+  'foreign',
+  'jit',
+  'lib',
+  'libpq',
+  'mb',
+  'nodes',
+  'optimizer',
+  'parser',
+  'partitioning',
+  'postmaster',
+  'regex',
+  'replication',
+  'rewrite',
+  'statistics',
+  'storage',
+  'tcop',
+  'snowball',
+  'tsearch',
+  'utils',
+  'port',
+  'portability',
+]
+
+# XXX: installing headers this way has the danger of installing editor files
+# etc, unfortunately install_subdir() doesn't allow including / excluding by
+# pattern currently.
+foreach d : header_subdirs
+  if d == 'catalog'
+    continue
+  endif
+  install_subdir(d, install_dir: dir_include_server,
+                 exclude_files: ['.gitignore', 'meson.build'])
+endforeach
+
+install_subdir('catalog',
+  install_dir: dir_include_server,
+  exclude_files: [
+    '.gitignore',
+    'Makefile',
+    'duplicate_oids',
+    'meson.build',
+    'reformat_dat_file.pl',
+    'renumber_oids.pl',
+    'unused_oids',
+  ] + bki_data,
+)
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/include': ['stamp-h', 'stamp-ext-h']}
diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build
new file mode 100644
index 00000000000..b7df232081f
--- /dev/null
+++ b/src/include/nodes/meson.build
@@ -0,0 +1,58 @@
+node_support_input_i = [
+  'nodes/nodes.h',
+  'nodes/primnodes.h',
+  'nodes/parsenodes.h',
+  'nodes/pathnodes.h',
+  'nodes/plannodes.h',
+  'nodes/execnodes.h',
+  'access/amapi.h',
+  'access/sdir.h',
+  'access/tableam.h',
+  'access/tsmapi.h',
+  'commands/event_trigger.h',
+  'commands/trigger.h',
+  'executor/tuptable.h',
+  'foreign/fdwapi.h',
+  'nodes/extensible.h',
+  'nodes/lockoptions.h',
+  'nodes/replnodes.h',
+  'nodes/supportnodes.h',
+  'nodes/value.h',
+  'utils/rel.h',
+]
+
+node_support_input = []
+foreach i : node_support_input_i
+  node_support_input += meson.source_root() / 'src' / 'include' / i
+endforeach
+
+node_support_output = [
+  'nodetags.h',
+  'outfuncs.funcs.c', 'outfuncs.switch.c',
+  'readfuncs.funcs.c', 'readfuncs.switch.c',
+  'copyfuncs.funcs.c', 'copyfuncs.switch.c',
+  'equalfuncs.funcs.c', 'equalfuncs.switch.c',
+]
+node_support_install = [
+  dir_include_server / 'nodes',
+  false, false,
+  false, false,
+  false, false,
+  false, false,
+]
+
+generated_nodes = custom_target('nodetags.h',
+  input: node_support_input,
+  output: node_support_output,
+  command: [
+    perl, files('../../backend/nodes/gen_node_support.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'],
+  install: true,
+  install_dir: node_support_install,
+)
+generated_headers += generated_nodes[0]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/nodes': node_support_output + ['node-support-stamp']}
+generated_sources_ac += {'src/include/nodes': ['header-stamp']}
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in.  This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..eae9f98920e
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,19 @@
+lwlocknames = custom_target('lwlocknames',
+  input: files('../../backend/storage/lmgr/lwlocknames.txt'),
+  output: ['lwlocknames.h', 'lwlocknames.c'],
+  command: [
+    perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'
+  ],
+  build_by_default: true,
+  install: true,
+  install_dir: [dir_include_server / 'storage', false],
+)
+
+lwlocknames_h = lwlocknames[0]
+
+generated_backend_headers += lwlocknames_h
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.c', 'lwlocknames.h']}
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..bded105f7ea
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,57 @@
+errcodes = custom_target('errcodes',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: ['errcodes.h'],
+  command: [
+    perl, files('../../backend/utils/generate-errcodes.pl'),
+    '--outfile', '@OUTPUT@',
+    '@INPUT@',
+  ],
+  install: true,
+  install_dir: dir_include_server / 'utils',
+)
+generated_headers += errcodes
+
+if dtrace.found()
+  probes_tmp = custom_target('probes.h.tmp',
+    input: files('../../backend/utils/probes.d'),
+    output: 'probes.h.tmp',
+    command: [dtrace, '-C', '-h', '-s', '@INPUT@', '-o', '@OUTPUT@'],
+  )
+  probes = custom_target('probes.h',
+    input: probes_tmp,
+    output: 'probes.h',
+    capture: true,
+    command: [sed, '-f', files('../../backend/utils/postprocess_dtrace.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server / 'utils',
+  )
+else
+  probes = custom_target('probes.h',
+    input: files('../../backend/utils/probes.d'),
+    output: 'probes.h',
+    capture: true,
+    command: [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server / 'utils',
+  )
+endif
+
+generated_backend_headers += probes
+
+fmgrtab_output = ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c']
+fmgrtab_target = custom_target('fmgrtab',
+  input: '../catalog/pg_proc.dat',
+  output : fmgrtab_output,
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'],
+  install: true,
+  install_dir: [dir_include_server / 'utils', dir_include_server / 'utils', false],
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {
+  'src/backend/utils': fmgrtab_output + ['errcodes.h', 'probes.h', 'fmgr-stamp'],
+  'src/include/utils': ['header-stamp'],
+}
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..23842e1ffef
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,174 @@
+common_sources = files(
+  'archive.c',
+  'base64.c',
+  'checksum_helper.c',
+  'compression.c',
+  'controldata_utils.c',
+  'encnames.c',
+  'exec.c',
+  'file_perm.c',
+  'file_utils.c',
+  'hashfn.c',
+  'ip.c',
+  'jsonapi.c',
+  'keywords.c',
+  'kwlookup.c',
+  'link-canary.c',
+  'md5_common.c',
+  'pg_get_line.c',
+  'pg_lzcompress.c',
+  'pg_prng.c',
+  'pgfnames.c',
+  'psprintf.c',
+  'relpath.c',
+  'rmtree.c',
+  'saslprep.c',
+  'scram-common.c',
+  'string.c',
+  'stringinfo.c',
+  'unicode_norm.c',
+  'username.c',
+  'wait_error.c',
+  'wchar.c',
+)
+
+if ssl.found()
+  common_sources += files(
+    'cryptohash_openssl.c',
+    'hmac_openssl.c',
+    'protocol_openssl.c',
+  )
+else
+  common_sources += files(
+    'cryptohash.c',
+    'hmac.c',
+    'md5.c',
+    'sha1.c',
+    'sha2.c',
+  )
+endif
+
+common_kwlist = custom_target('kwlist',
+  input: files('../include/parser/kwlist.h'),
+  output: 'kwlist_d.h',
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+      '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+generated_sources += common_kwlist
+common_sources += common_kwlist
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+  'd2s.c',
+  'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+  ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+config_info_sources = files('config_info.c',)
+config_info_cflags = [
+  '-DVAL_CC="@0@"'.format(var_cc),
+  '-DVAL_CPPFLAGS="@0@"'.format(var_cppflags),
+  '-DVAL_CFLAGS="@0@"'.format(var_cflags),
+  '-DVAL_CFLAGS_SL="@0@"'.format(var_cflags_sl),
+  '-DVAL_LDFLAGS="@0@"'.format(var_ldflags),
+  '-DVAL_LDFLAGS_EX="@0@"'.format(var_ldflags_ex),
+  '-DVAL_LDFLAGS_SL="@0@"'.format(var_ldflags_sl),
+  '-DVAL_LIBS="@0@"'.format(var_libs),
+]
+
+# Some files need to be built with different cflags. The different sets are
+# defined here.
+common_cflags = {
+  'ryu': ryu_cflags,
+  'config_info': config_info_cflags,
+}
+common_sources_cflags = {
+  'ryu': ryu_sources,
+  'config_info': config_info_sources
+}
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+  'fe_memutils.c',
+  'restricted_token.c',
+  'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+  'logging.c',
+)
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+#
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+#
+# For the server build of pgcommon, depend on lwlocknames_h, because at least
+# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a
+# layering violation, but ...
+pgcommon = {}
+pgcommon_variants = {
+  '_srv': internal_lib_args + {
+    'sources': common_sources + [lwlocknames_h],
+    'dependencies': [backend_common_code],
+  },
+  '': default_lib_args + {
+    'sources': common_sources_frontend_static,
+    'dependencies': [frontend_common_code],
+  },
+  '_shlib': default_lib_args + {
+    'pic': true,
+    'sources': common_sources_frontend_shlib,
+    'dependencies': [frontend_common_code],
+  },
+}
+
+foreach name, opts : pgcommon_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources : common_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + common_cflags[cflagname]
+    cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'sources': sources,
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgcommon@0@'.format(name),
+      link_with: cflag_libs,
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgcommon += {name: lib}
+endforeach
+
+common_srv = pgcommon['_srv']
+common_shlib = pgcommon['_shlib']
+common_static = pgcommon['']
+
+subdir('unicode')
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
new file mode 100644
index 00000000000..43f0edd83e0
--- /dev/null
+++ b/src/common/unicode/meson.build
@@ -0,0 +1,106 @@
+UNICODE_VERSION = '14.0.0'
+
+unicode_data = {}
+unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
+
+if not wget.found()
+  subdir_done()
+endif
+
+# These files are part of the Unicode Character Database. Download them on
+# demand.
+foreach f : ['UnicodeData.txt', 'EastAsianWidth.txt', 'DerivedNormalizationProps.txt', 'CompositionExclusions.txt', 'NormalizationTest.txt']
+  url = unicode_baseurl.format(UNICODE_VERSION, f)
+  target = custom_target(f,
+    output: f,
+    command: [wget, wget_flags, url],
+    build_by_default: false,
+  )
+  unicode_data += {f: target}
+endforeach
+
+
+update_unicode_targets = []
+
+update_unicode_targets += \
+  custom_target('unicode_norm_table.h',
+    input: [unicode_data['UnicodeData.txt'], unicode_data['CompositionExclusions.txt']],
+    output: ['unicode_norm_table.h', 'unicode_norm_hashfunc.h'],
+    command: [
+      perl, files('generate-unicode_norm_table.pl'),
+      '--outdir', '@OUTDIR@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_nonspacing_table.h',
+    input: [unicode_data['UnicodeData.txt']],
+    output: ['unicode_nonspacing_table.h'],
+    command: [perl, files('generate-unicode_nonspacing_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_east_asian_fw_table.h',
+    input: [unicode_data['EastAsianWidth.txt']],
+    output: ['unicode_east_asian_fw_table.h'],
+    command: [perl, files('generate-unicode_east_asian_fw_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_normprops_table.h',
+    input: [unicode_data['DerivedNormalizationProps.txt']],
+    output: ['unicode_normprops_table.h'],
+    command: [perl, files('generate-unicode_normprops_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+norm_test_table = custom_target('norm_test_table.h',
+    input: [unicode_data['NormalizationTest.txt']],
+    output: ['norm_test_table.h'],
+    command: [perl, files('generate-norm_test_table.pl'), '@INPUT@', '@OUTPUT@'],
+    build_by_default: false,
+  )
+
+inc = include_directories('.')
+
+norm_test = executable('norm_test',
+  ['norm_test.c', norm_test_table],
+  dependencies: [frontend_port_code],
+  include_directories: inc,
+  link_with: [common_static, pgport_static],
+  build_by_default: false,
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+update_unicode_dep = []
+
+if not meson.is_cross_build()
+  update_unicode_dep += custom_target('norm_test.run',
+    output: 'norm_test.run',
+    input: update_unicode_targets,
+    command: [norm_test],
+    build_by_default: false,
+    build_always_stale: true,
+  )
+endif
+
+
+# Use a custom target, as run targets serialize the output, making this harder
+# to debug, and don't deal well with targets with multiple outputs.
+update_unicode = custom_target('update-unicode',
+  depends: update_unicode_dep,
+  output: ['dont-exist'],
+  input: update_unicode_targets,
+  command: ['cp', '@INPUT@', '@SOURCE_ROOT@/src/include/common/'],
+  build_by_default: false,
+  build_always_stale: true,
+)
+
+alias_target('update-unicode', update_unicode)
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..ced2e014db8
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,184 @@
+pgport_sources = [
+  'bsearch_arg.c',
+  'chklocale.c',
+  'inet_net_ntop.c',
+  'noblock.c',
+  'path.c',
+  'pg_bitutils.c',
+  'pg_strong_random.c',
+  'pgcheckdir.c',
+  'pgmkdirp.c',
+  'pgsleep.c',
+  'pgstrcasecmp.c',
+  'pgstrsignal.c',
+  'pqsignal.c',
+  'qsort.c',
+  'qsort_arg.c',
+  'quotes.c',
+  'snprintf.c',
+  'strerror.c',
+  'tar.c',
+  'thread.c',
+]
+
+if host_system == 'windows'
+  pgport_sources += files(
+    'dirmod.c',
+    'kill.c',
+    'open.c',
+    'system.c',
+    'win32dlopen.c',
+    'win32env.c',
+    'win32error.c',
+    'win32fdatasync.c',
+    'win32getrusage.c',
+    'win32link.c',
+    'win32ntdll.c',
+    'win32pread.c',
+    'win32pwrite.c',
+    'win32security.c',
+    'win32setlocale.c',
+    'win32stat.c',
+  )
+endif
+
+if cc.get_id() == 'msvc'
+  pgport_sources += files(
+    'dirent.c',
+    'win32gettimeofday.c',
+  )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+  ['explicit_bzero'],
+  ['getopt'],
+  ['getopt_long'],
+  ['getpeereid'],
+  ['inet_aton'],
+  ['mkdtemp'],
+  ['preadv', 'HAVE_DECL_PREADV'],
+  ['pwritev', 'HAVE_DECL_PWRITEV'],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+]
+
+if host_system != 'windows'
+  replace_funcs_neg += [['pthread_barrier_wait']]
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+  # x86/x64
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # arm / aarch64
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # generic fallback
+  ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
+]
+
+pgport_cflags = {'crc': cflags_crc}
+pgport_sources_cflags = {'crc': []}
+
+foreach f : replace_funcs_neg
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'false' or val == '0'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+foreach f : replace_funcs_pos
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'true' or val == '1'
+    src = files(filename)
+    if f.length() > 2
+      pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
+    else
+      pgport_sources += src
+    endif
+  endif
+endforeach
+
+
+if (host_system == 'windows' or host_system == 'cygwin') and \
+  (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+  # Cygwin and (apparently, based on test results) Mingw both
+  # have a broken strtof(), so substitute its implementation.
+  # That's not a perfect fix, since it doesn't avoid double-rounding,
+  # but we have no better options.
+  pgport_sources += files('strtof.c')
+  message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+    host_system, cc.get_id(), cc.version()))
+endif
+
+
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+pgport = {}
+pgport_variants = {
+  '_srv': internal_lib_args + {
+    'dependencies': [backend_port_code],
+  },
+  '': default_lib_args + {
+    'dependencies': [frontend_port_code],
+  },
+  '_shlib': default_lib_args + {
+    'pic': true,
+    'dependencies': [frontend_port_code],
+  },
+}
+
+foreach name, opts : pgport_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources : pgport_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
+    cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
+      sources,
+      kwargs: opts + {
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgport@0@'.format(name),
+      pgport_sources,
+      link_with: cflag_libs,
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgport += {name: lib}
+endforeach
+
+pgport_srv = pgport['_srv']
+pgport_static = pgport['']
+pgport_shlib = pgport['_shlib']
diff --git a/config/meson.build b/config/meson.build
new file mode 100644
index 00000000000..ab19c380bd2
--- /dev/null
+++ b/config/meson.build
@@ -0,0 +1,4 @@
+install_data(
+  'install-sh', 'missing',
+  install_dir: dir_pgxs / 'config'
+)
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'brin.c',
+  'brin_bloom.c',
+  'brin_inclusion.c',
+  'brin_minmax.c',
+  'brin_minmax_multi.c',
+  'brin_pageops.c',
+  'brin_revmap.c',
+  'brin_tuple.c',
+  'brin_validate.c',
+  'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'attmap.c',
+  'bufmask.c',
+  'detoast.c',
+  'heaptuple.c',
+  'indextuple.c',
+  'printsimple.c',
+  'printtup.c',
+  'relation.c',
+  'reloptions.c',
+  'scankey.c',
+  'session.c',
+  'syncscan.c',
+  'toast_compression.c',
+  'toast_internals.c',
+  'tupconvert.c',
+  'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'ginarrayproc.c',
+  'ginbtree.c',
+  'ginbulk.c',
+  'gindatapage.c',
+  'ginentrypage.c',
+  'ginfast.c',
+  'ginget.c',
+  'gininsert.c',
+  'ginlogic.c',
+  'ginpostinglist.c',
+  'ginscan.c',
+  'ginutil.c',
+  'ginvacuum.c',
+  'ginvalidate.c',
+  'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'gist.c',
+  'gistbuild.c',
+  'gistbuildbuffers.c',
+  'gistget.c',
+  'gistproc.c',
+  'gistscan.c',
+  'gistsplit.c',
+  'gistutil.c',
+  'gistvacuum.c',
+  'gistvalidate.c',
+  'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'hash.c',
+  'hash_xlog.c',
+  'hashfunc.c',
+  'hashinsert.c',
+  'hashovfl.c',
+  'hashpage.c',
+  'hashsearch.c',
+  'hashsort.c',
+  'hashutil.c',
+  'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'heapam.c',
+  'heapam_handler.c',
+  'heapam_visibility.c',
+  'heaptoast.c',
+  'hio.c',
+  'pruneheap.c',
+  'rewriteheap.c',
+  'vacuumlazy.c',
+  'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'amapi.c',
+  'amvalidate.c',
+  'genam.c',
+  'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'nbtcompare.c',
+  'nbtdedup.c',
+  'nbtinsert.c',
+  'nbtpage.c',
+  'nbtree.c',
+  'nbtsearch.c',
+  'nbtsort.c',
+  'nbtsplitloc.c',
+  'nbtutils.c',
+  'nbtvalidate.c',
+  'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+  'brindesc.c',
+  'clogdesc.c',
+  'committsdesc.c',
+  'dbasedesc.c',
+  'genericdesc.c',
+  'gindesc.c',
+  'gistdesc.c',
+  'hashdesc.c',
+  'heapdesc.c',
+  'logicalmsgdesc.c',
+  'mxactdesc.c',
+  'nbtdesc.c',
+  'relmapdesc.c',
+  'replorigindesc.c',
+  'seqdesc.c',
+  'smgrdesc.c',
+  'spgdesc.c',
+  'standbydesc.c',
+  'tblspcdesc.c',
+  'xactdesc.c',
+  'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'spgdoinsert.c',
+  'spginsert.c',
+  'spgkdtreeproc.c',
+  'spgproc.c',
+  'spgquadtreeproc.c',
+  'spgscan.c',
+  'spgtextproc.c',
+  'spgutils.c',
+  'spgvacuum.c',
+  'spgvalidate.c',
+  'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'table.c',
+  'tableam.c',
+  'tableamapi.c',
+  'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bernoulli.c',
+  'system.c',
+  'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..c32169bd2c6
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'clog.c',
+  'commit_ts.c',
+  'generic_xlog.c',
+  'multixact.c',
+  'parallel.c',
+  'rmgr.c',
+  'slru.c',
+  'subtrans.c',
+  'timeline.c',
+  'transam.c',
+  'twophase.c',
+  'twophase_rmgr.c',
+  'varsup.c',
+  'xact.c',
+  'xlog.c',
+  'xlogarchive.c',
+  'xlogfuncs.c',
+  'xloginsert.c',
+  'xlogprefetcher.c',
+  'xlogrecovery.c',
+  'xlogstats.c',
+  'xlogutils.c',
+)
+
+# used by frontend programs to build a frontend xlogreader
+xlogreader_sources = files(
+  'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/backup/meson.build b/src/backend/backup/meson.build
new file mode 100644
index 00000000000..a09305cadfa
--- /dev/null
+++ b/src/backend/backup/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'backup_manifest.c',
+  'basebackup.c',
+  'basebackup_copy.c',
+  'basebackup_gzip.c',
+  'basebackup_lz4.c',
+  'basebackup_progress.c',
+  'basebackup_server.c',
+  'basebackup_sink.c',
+  'basebackup_target.c',
+  'basebackup_throttle.c',
+  'basebackup_zstd.c',
+)
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..55c33dd21c3
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+# see ../parser/meson.build
+boot_parser_sources = []
+
+bootscanner = custom_target('bootscanner',
+  input: 'bootscanner.l',
+  output: 'bootscanner.c',
+  command: flex_cmd,
+)
+generated_sources += bootscanner
+boot_parser_sources += bootscanner
+
+bootparse = custom_target('bootparse',
+  input: 'bootparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += bootparse.to_list()
+boot_parser_sources += bootparse
+
+boot_parser = static_library('boot_parser',
+  boot_parser_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += boot_parser
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..08747914516
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,44 @@
+backend_sources += files(
+  'aclchk.c',
+  'catalog.c',
+  'dependency.c',
+  'heap.c',
+  'index.c',
+  'indexing.c',
+  'namespace.c',
+  'objectaccess.c',
+  'objectaddress.c',
+  'partition.c',
+  'pg_aggregate.c',
+  'pg_attrdef.c',
+  'pg_cast.c',
+  'pg_class.c',
+  'pg_collation.c',
+  'pg_constraint.c',
+  'pg_conversion.c',
+  'pg_db_role_setting.c',
+  'pg_depend.c',
+  'pg_enum.c',
+  'pg_inherits.c',
+  'pg_largeobject.c',
+  'pg_namespace.c',
+  'pg_operator.c',
+  'pg_parameter_acl.c',
+  'pg_proc.c',
+  'pg_publication.c',
+  'pg_range.c',
+  'pg_shdepend.c',
+  'pg_subscription.c',
+  'pg_type.c',
+  'storage.c',
+  'toasting.c',
+)
+
+
+install_data(
+  'information_schema.sql',
+  'sql_features.txt',
+  'system_functions.sql',
+  'system_views.sql',
+  install_dir: dir_data,
+)
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..9b350d025ff
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'aggregatecmds.c',
+  'alter.c',
+  'amcmds.c',
+  'analyze.c',
+  'async.c',
+  'cluster.c',
+  'collationcmds.c',
+  'comment.c',
+  'constraint.c',
+  'conversioncmds.c',
+  'copy.c',
+  'copyfrom.c',
+  'copyfromparse.c',
+  'copyto.c',
+  'createas.c',
+  'dbcommands.c',
+  'define.c',
+  'discard.c',
+  'dropcmds.c',
+  'event_trigger.c',
+  'explain.c',
+  'extension.c',
+  'foreigncmds.c',
+  'functioncmds.c',
+  'indexcmds.c',
+  'lockcmds.c',
+  'matview.c',
+  'opclasscmds.c',
+  'operatorcmds.c',
+  'policy.c',
+  'portalcmds.c',
+  'prepare.c',
+  'proclang.c',
+  'publicationcmds.c',
+  'schemacmds.c',
+  'seclabel.c',
+  'sequence.c',
+  'statscmds.c',
+  'subscriptioncmds.c',
+  'tablecmds.c',
+  'tablespace.c',
+  'trigger.c',
+  'tsearchcmds.c',
+  'typecmds.c',
+  'user.c',
+  'vacuum.c',
+  'vacuumparallel.c',
+  'variable.c',
+  'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+  'execAmi.c',
+  'execAsync.c',
+  'execCurrent.c',
+  'execExpr.c',
+  'execExprInterp.c',
+  'execGrouping.c',
+  'execIndexing.c',
+  'execJunk.c',
+  'execMain.c',
+  'execParallel.c',
+  'execPartition.c',
+  'execProcnode.c',
+  'execReplication.c',
+  'execSRF.c',
+  'execScan.c',
+  'execTuples.c',
+  'execUtils.c',
+  'functions.c',
+  'instrument.c',
+  'nodeAgg.c',
+  'nodeAppend.c',
+  'nodeBitmapAnd.c',
+  'nodeBitmapHeapscan.c',
+  'nodeBitmapIndexscan.c',
+  'nodeBitmapOr.c',
+  'nodeCtescan.c',
+  'nodeCustom.c',
+  'nodeForeignscan.c',
+  'nodeFunctionscan.c',
+  'nodeGather.c',
+  'nodeGatherMerge.c',
+  'nodeGroup.c',
+  'nodeHash.c',
+  'nodeHashjoin.c',
+  'nodeIncrementalSort.c',
+  'nodeIndexonlyscan.c',
+  'nodeIndexscan.c',
+  'nodeLimit.c',
+  'nodeLockRows.c',
+  'nodeMaterial.c',
+  'nodeMemoize.c',
+  'nodeMergeAppend.c',
+  'nodeMergejoin.c',
+  'nodeModifyTable.c',
+  'nodeNamedtuplestorescan.c',
+  'nodeNestloop.c',
+  'nodeProjectSet.c',
+  'nodeRecursiveunion.c',
+  'nodeResult.c',
+  'nodeSamplescan.c',
+  'nodeSeqscan.c',
+  'nodeSetOp.c',
+  'nodeSort.c',
+  'nodeSubplan.c',
+  'nodeSubqueryscan.c',
+  'nodeTableFuncscan.c',
+  'nodeTidrangescan.c',
+  'nodeTidscan.c',
+  'nodeUnique.c',
+  'nodeValuesscan.c',
+  'nodeWindowAgg.c',
+  'nodeWorktablescan.c',
+  'spi.c',
+  'tqueue.c',
+  'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..de2e624ab58
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,73 @@
+if not llvm.found()
+  subdir_done()
+endif
+
+# Build LLVM JIT backend module
+
+llvmjit_sources = []
+
+# Infrastructure
+llvmjit_sources += files(
+  'llvmjit.c',
+  'llvmjit_error.cpp',
+  'llvmjit_inline.cpp',
+  'llvmjit_wrap.cpp',
+)
+
+# Code generation
+llvmjit_sources += files(
+  'llvmjit_deform.c',
+  'llvmjit_expr.c',
+)
+
+llvmjit = shared_module('llvmjit',
+  llvmjit_sources,
+  kwargs: pg_mod_args + {
+    'dependencies': pg_mod_args['dependencies'] + [llvm],
+  }
+)
+
+backend_targets += llvmjit
+
+
+# Define a few bits and pieces used here and elsewhere to generate bitcode
+
+llvm_irgen_args = [
+  '-c', '-o', '@OUTPUT@', '@INPUT@',
+  '-flto=thin', '-emit-llvm',
+  '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+  '-O2',
+  '-Wno-ignored-attributes',
+  '-Wno-empty-body',
+]
+
+if ccache.found()
+  llvm_irgen_command = ccache
+  llvm_irgen_args = [clang.path()] + llvm_irgen_args
+else
+  llvm_irgen_command = clang
+endif
+
+
+# XXX: Need to determine proper version of the function cflags for clang
+bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
+bitcode_cflags += cppflags
+
+# XXX: Worth improving on the logic to find directories here
+bitcode_cflags += '-I@BUILD_ROOT@/src/include'
+bitcode_cflags += '-I@BUILD_ROOT@/src/backend/utils/misc'
+bitcode_cflags += '-I@SOURCE_ROOT@/src/include'
+
+
+# Note this is intentionally not installed to bitcodedir, as it's not for
+# inlining
+llvmjit_types = custom_target('llvmjit_types.bc',
+  command: [llvm_irgen_command] + llvm_irgen_args + bitcode_cflags,
+  input: 'llvmjit_types.c',
+  output: 'llvmjit_types.bc',
+  depends: [postgres],
+  install: true,
+  install_dir: dir_lib_pkg,
+  depfile: '@BASENAME@.c.bc.d',
+)
+backend_targets += llvmjit_types
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..48da1bddce7
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'binaryheap.c',
+  'bipartite_match.c',
+  'bloomfilter.c',
+  'dshash.c',
+  'hyperloglog.c',
+  'ilist.c',
+  'integerset.c',
+  'knapsack.c',
+  'pairingheap.c',
+  'rbtree.c',
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..6061269ef13
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,32 @@
+backend_sources += files(
+  'auth-sasl.c',
+  'auth-scram.c',
+  'auth.c',
+  'be-fsstubs.c',
+  'be-secure-common.c',
+  'be-secure.c',
+  'crypt.c',
+  'hba.c',
+  'ifaddr.c',
+  'pqcomm.c',
+  'pqformat.c',
+  'pqmq.c',
+  'pqsignal.c',
+)
+
+if ssl.found()
+  backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+  backend_sources += files(
+    'be-secure-gssapi.c',
+    'be-gssapi-common.c'
+  )
+endif
+
+install_data(
+  'pg_hba.conf.sample',
+  'pg_ident.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..fefa40ddb64
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,190 @@
+backend_build_deps = [backend_code]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('backup')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+subdir('po', if_found: libintl)
+
+
+backend_link_args = []
+backend_link_depends = []
+
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+# For dtrace probes we need to invoke dtrace on all input files, before
+# linking the final executable (see more below).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+# We could do that only if either dtrace or msvc is in use, but it seems
+# easier to just always do so.
+#
+# Can't name the static library 'postgres', because msbuild ends up with a
+# conflict for the .pdb file otherwise.
+
+postgres_lib = static_library('postgres_lib',
+  backend_sources + timezone_sources + generated_backend_sources,
+  link_whole: backend_link_with,
+  dependencies: backend_build_deps,
+  kwargs: internal_lib_args,
+)
+
+if cc.get_id() == 'msvc'
+  postgres_def = custom_target('postgres.def',
+    command: [perl, files('../tools/msvc/gendef.pl'),
+              '--arch', host_cpu,
+              '--tempdir', '@PRIVATE_DIR@',
+              '--deffile', '@OUTPUT@',
+              '@INPUT@'],
+    input: [postgres_lib, common_srv, pgport_srv],
+    output: 'postgres.def',
+    depends: [postgres_lib, common_srv, pgport_srv],
+    install: false,
+    build_by_default: false,
+  )
+
+  backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+  backend_link_depends += postgres_def
+
+elif host_system == 'aix'
+  # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
+  # main executable, allowing extension libraries to resolve their undefined
+  # symbols to symbols in the postgres binary.
+  postgres_imp = custom_target('postgres.imp',
+    command: [files('port/aix/mkldexport.sh'), '@INPUT@', '.'],
+    input: postgres_lib,
+    output: 'postgres.imp',
+    capture: true,
+    install: true,
+    install_dir: dir_lib,
+    build_by_default: false,
+  )
+  backend_link_args += '-Wl,-bE:@0@'.format(postgres_imp.full_path())
+  backend_link_depends += postgres_imp
+endif
+
+backend_input = []
+backend_objs = [postgres_lib.extract_all_objects(recursive: false)]
+
+# As of 1/2010:
+# The probes.o file is necessary for dtrace support on Solaris, and on recent
+# versions of systemtap.  (Older systemtap releases just produce an empty
+# file, but that's okay.)  However, macOS's dtrace doesn't use it and doesn't
+# even recognize the -G option.  So, build probes.o except on macOS.
+# This might need adjustment as other platforms add dtrace support.
+#
+# On at least linux we don't actually need to pass in all the objects, but
+# at least on FreeBSD and Solaris we have to.
+#
+# XXX: The reason we don't use the objects for generated sources is that
+# hits a meson bug. Luckily we don't don't have probes in generated
+# sources...
+if dtrace.found() and host_system != 'darwin'
+  backend_input += custom_target(
+    'probes.o',
+    input: ['utils/probes.d', postgres_lib.extract_objects(backend_sources, timezone_sources)],
+    output: 'probes.o',
+    command: [dtrace, '-C', '-G', '-o', '@OUTPUT@', '-s', '@INPUT@'],
+    install: false,
+  )
+endif
+
+postgres = executable('postgres',
+  backend_input,
+  objects: backend_objs,
+  link_args: backend_link_args,
+  link_with: backend_link_with,
+  link_depends: backend_link_depends,
+  export_dynamic: true,
+  implib: true,
+  dependencies: backend_build_deps,
+  kwargs: default_bin_args,
+)
+
+backend_targets += postgres
+
+pg_mod_c_args = cflags_mod
+pg_mod_cpp_args = cxxflags_mod
+pg_mod_link_args = ldflags_sl + ldflags_mod
+pg_mod_link_depend = []
+
+# A few platforms like MacOS and Windows link shared modules against postgres,
+# or a [import] library derived from it. Set up the link flags for that.
+if mod_link_args_fmt.length() > 0
+  # To avoid unnecessary build-time dependencies on other operating systems,
+  # only the dependency when it when necessary.
+  pg_mod_link_depend += postgres
+
+  name = mod_link_with_name.format('postgres')
+  link_with_uninst = meson.current_build_dir() / name
+  link_with_inst = '${@0@}/@1@'.format(mod_link_with_dir, name)
+
+  foreach el : mod_link_args_fmt
+    pg_mod_link_args += el.format(link_with_uninst)
+  endforeach
+endif
+
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+  compile_args: pg_mod_c_args,
+  include_directories: postgres_inc,
+  link_args: pg_mod_link_args,
+  sources: generated_headers + generated_backend_headers,
+  dependencies: backend_mod_deps,
+)
+
+pg_mod_args = default_mod_args + {
+  'dependencies': [backend_mod_code],
+  'cpp_args': pg_mod_cpp_args,
+  'link_depends': pg_mod_link_depend,
+}
+
+
+
+# Shared modules that, on some system, link against the server binary. Only
+# enter these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..8e0d4039f24
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,29 @@
+backend_sources += files(
+  'bitmapset.c',
+  'extensible.c',
+  'list.c',
+  'makefuncs.c',
+  'nodeFuncs.c',
+  'nodes.c',
+  'params.c',
+  'print.c',
+  'read.c',
+  'tidbitmap.c',
+  'value.c',
+)
+
+# these include .c files generated in ../../include/nodes, seems nicer to not
+# add that as an include path for the whole backend
+nodefunc_sources = files(
+  'copyfuncs.c',
+  'equalfuncs.c',
+  'outfuncs.c',
+  'readfuncs.c',
+)
+nodefuncs = static_library('nodefuncs',
+  nodefunc_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('../../include/nodes'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += nodefuncs
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'geqo_copy.c',
+  'geqo_cx.c',
+  'geqo_erx.c',
+  'geqo_eval.c',
+  'geqo_main.c',
+  'geqo_misc.c',
+  'geqo_mutation.c',
+  'geqo_ox1.c',
+  'geqo_ox2.c',
+  'geqo_pmx.c',
+  'geqo_pool.c',
+  'geqo_px.c',
+  'geqo_random.c',
+  'geqo_recombination.c',
+  'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'allpaths.c',
+  'clausesel.c',
+  'costsize.c',
+  'equivclass.c',
+  'indxpath.c',
+  'joinpath.c',
+  'joinrels.c',
+  'pathkeys.c',
+  'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'analyzejoins.c',
+  'createplan.c',
+  'initsplan.c',
+  'planagg.c',
+  'planmain.c',
+  'planner.c',
+  'setrefs.c',
+  'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'prepagg.c',
+  'prepjointree.c',
+  'prepqual.c',
+  'preptlist.c',
+  'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'appendinfo.c',
+  'clauses.c',
+  'inherit.c',
+  'joininfo.c',
+  'orclauses.c',
+  'paramassign.c',
+  'pathnode.c',
+  'placeholder.c',
+  'plancat.c',
+  'predtest.c',
+  'relnode.c',
+  'restrictinfo.c',
+  'tlist.c',
+  'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..15d5a349eeb
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,48 @@
+backend_sources += files(
+  'analyze.c',
+  'parse_agg.c',
+  'parse_clause.c',
+  'parse_coerce.c',
+  'parse_collate.c',
+  'parse_cte.c',
+  'parse_enr.c',
+  'parse_expr.c',
+  'parse_func.c',
+  'parse_merge.c',
+  'parse_node.c',
+  'parse_oper.c',
+  'parse_param.c',
+  'parse_relation.c',
+  'parse_target.c',
+  'parse_type.c',
+  'parse_utilcmd.c',
+  'scansup.c',
+)
+
+# Build a small utility static lib for the parser. The generation of the
+# parser is slow, and building this separately avoids other parts of the
+# backend having to wait till gram.h is generated.
+parser_sources = files('parser.c')
+
+backend_scanner = custom_target('scan',
+  input: 'scan.l',
+  output: 'scan.c',
+  command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-CF', '-p', '-p'],
+)
+generated_sources += backend_scanner
+parser_sources += backend_scanner
+
+backend_parser = custom_target('gram',
+  input: 'gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += backend_parser.to_list()
+parser_sources += backend_parser
+
+parser = static_library('parser',
+  parser_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'partbounds.c',
+  'partdesc.c',
+  'partprune.c',
+)
diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build
new file mode 100644
index 00000000000..4ace0554680
--- /dev/null
+++ b/src/backend/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('postgres-' + pg_version_major.to_string())
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..a22c25dd952
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+  backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+  backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+  backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+  backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+  backend_sources += files('win32_shmem.c')
+endif
+
+if host_system == 'windows'
+  subdir('win32')
+endif
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/port': ['pg_sema.c', 'pg_shmem.c', 'tas.s']}
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..68fe4cc3cd0
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'crashdump.c',
+  'signal.c',
+  'socket.c',
+  'timer.c',
+)
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..293a44ca295
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'autovacuum.c',
+  'auxprocess.c',
+  'bgworker.c',
+  'bgwriter.c',
+  'checkpointer.c',
+  'fork_process.c',
+  'interrupt.c',
+  'pgarch.c',
+  'postmaster.c',
+  'shell_archive.c',
+  'startup.c',
+  'syslogger.c',
+  'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..c84e57fdba5
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'regcomp.c',
+  'regerror.c',
+  'regexec.c',
+  'regexport.c',
+  'regfree.c',
+  'regprefix.c',
+)
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+  'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+  libpqwalreceiver_sources,
+  kwargs: pg_mod_args + {
+    'name_prefix': 'lib',
+    'dependencies': pg_mod_args['dependencies'] + [libpq],
+  }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+  'decode.c',
+  'launcher.c',
+  'logical.c',
+  'logicalfuncs.c',
+  'message.c',
+  'origin.c',
+  'proto.c',
+  'relation.c',
+  'reorderbuffer.c',
+  'snapbuild.c',
+  'tablesync.c',
+  'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..27b9bf13182
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'slot.c',
+  'slotfuncs.c',
+  'syncrep.c',
+  'walreceiver.c',
+  'walreceiverfuncs.c',
+  'walsender.c',
+)
+
+# see ../parser/meson.build
+repl_parser_sources = []
+
+repl_scanner = custom_target('repl_scanner',
+  input: 'repl_scanner.l',
+  output: 'repl_scanner.c',
+  command: flex_cmd,
+)
+generated_sources += repl_scanner
+repl_parser_sources += repl_scanner
+
+repl_gram = custom_target('repl_gram',
+  input: 'repl_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += repl_gram.to_list()
+repl_parser_sources += repl_gram
+
+syncrep_scanner = custom_target('syncrep_scanner',
+  input: 'syncrep_scanner.l',
+  output: 'syncrep_scanner.c',
+  command: flex_cmd,
+)
+generated_sources += syncrep_scanner
+repl_parser_sources += syncrep_scanner
+
+syncrep_gram = custom_target('syncrep_gram',
+  input: 'syncrep_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += syncrep_gram.to_list()
+repl_parser_sources += syncrep_gram
+
+repl_parser = static_library('repl_parser',
+  repl_parser_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += repl_parser
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..8ff0a0c6133
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,11 @@
+pgoutput_sources = files(
+  'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+  pgoutput_sources,
+  kwargs: pg_mod_args + {
+  }
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..21fa0e230b0
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'rewriteDefine.c',
+  'rewriteHandler.c',
+  'rewriteManip.c',
+  'rewriteRemove.c',
+  'rewriteSearchCycle.c',
+  'rewriteSupport.c',
+  'rowsecurity.c',
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..8c6f685cb32
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,88 @@
+dict_snowball_sources = files(
+  'libstemmer/api.c',
+  'libstemmer/utilities.c',
+  'dict_snowball.c',
+)
+
+dict_snowball_sources += files(
+  'libstemmer/stem_ISO_8859_1_basque.c',
+  'libstemmer/stem_ISO_8859_1_catalan.c',
+  'libstemmer/stem_ISO_8859_1_danish.c',
+  'libstemmer/stem_ISO_8859_1_dutch.c',
+  'libstemmer/stem_ISO_8859_1_english.c',
+  'libstemmer/stem_ISO_8859_1_finnish.c',
+  'libstemmer/stem_ISO_8859_1_french.c',
+  'libstemmer/stem_ISO_8859_1_german.c',
+  'libstemmer/stem_ISO_8859_1_indonesian.c',
+  'libstemmer/stem_ISO_8859_1_irish.c',
+  'libstemmer/stem_ISO_8859_1_italian.c',
+  'libstemmer/stem_ISO_8859_1_norwegian.c',
+  'libstemmer/stem_ISO_8859_1_porter.c',
+  'libstemmer/stem_ISO_8859_1_portuguese.c',
+  'libstemmer/stem_ISO_8859_1_spanish.c',
+  'libstemmer/stem_ISO_8859_1_swedish.c',
+  'libstemmer/stem_ISO_8859_2_hungarian.c',
+  'libstemmer/stem_ISO_8859_2_romanian.c',
+  'libstemmer/stem_KOI8_R_russian.c',
+  'libstemmer/stem_UTF_8_arabic.c',
+  'libstemmer/stem_UTF_8_armenian.c',
+  'libstemmer/stem_UTF_8_basque.c',
+  'libstemmer/stem_UTF_8_catalan.c',
+  'libstemmer/stem_UTF_8_danish.c',
+  'libstemmer/stem_UTF_8_dutch.c',
+  'libstemmer/stem_UTF_8_english.c',
+  'libstemmer/stem_UTF_8_finnish.c',
+  'libstemmer/stem_UTF_8_french.c',
+  'libstemmer/stem_UTF_8_german.c',
+  'libstemmer/stem_UTF_8_greek.c',
+  'libstemmer/stem_UTF_8_hindi.c',
+  'libstemmer/stem_UTF_8_hungarian.c',
+  'libstemmer/stem_UTF_8_indonesian.c',
+  'libstemmer/stem_UTF_8_irish.c',
+  'libstemmer/stem_UTF_8_italian.c',
+  'libstemmer/stem_UTF_8_lithuanian.c',
+  'libstemmer/stem_UTF_8_nepali.c',
+  'libstemmer/stem_UTF_8_norwegian.c',
+  'libstemmer/stem_UTF_8_porter.c',
+  'libstemmer/stem_UTF_8_portuguese.c',
+  'libstemmer/stem_UTF_8_romanian.c',
+  'libstemmer/stem_UTF_8_russian.c',
+  'libstemmer/stem_UTF_8_serbian.c',
+  'libstemmer/stem_UTF_8_spanish.c',
+  'libstemmer/stem_UTF_8_swedish.c',
+  'libstemmer/stem_UTF_8_tamil.c',
+  'libstemmer/stem_UTF_8_turkish.c',
+  'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+  dict_snowball_sources,
+  kwargs: pg_mod_args + {
+    'include_directories': [stemmer_inc],
+  }
+)
+
+snowball_create = custom_target('snowball_create',
+  output: ['snowball_create.sql'],
+  depfile: 'snowball_create.dep',
+  command: [
+    perl, files('snowball_create.pl'),
+    '--depfile',
+    '--input', '@CURRENT_SOURCE_DIR@',
+    '--outdir', '@OUTDIR@',
+  ],
+  install: true,
+  install_dir: dir_data,
+)
+generated_sources += snowball_create
+
+install_subdir('stopwords',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true,
+)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'dependencies.c',
+  'extended_stats.c',
+  'mcv.c',
+  'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'buf_init.c',
+  'buf_table.c',
+  'bufmgr.c',
+  'freelist.c',
+  'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'buffile.c',
+  'copydir.c',
+  'fd.c',
+  'fileset.c',
+  'reinit.c',
+  'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'freespace.c',
+  'fsmpage.c',
+  'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+  'barrier.c',
+  'dsm.c',
+  'dsm_impl.c',
+  'ipc.c',
+  'ipci.c',
+  'latch.c',
+  'pmsignal.c',
+  'procarray.c',
+  'procsignal.c',
+  'shm_mq.c',
+  'shm_toc.c',
+  'shmem.c',
+  'shmqueue.c',
+  'signalfuncs.c',
+  'sinval.c',
+  'sinvaladt.c',
+  'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..68237c8a2e8
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'condition_variable.c',
+  'deadlock.c',
+  'lmgr.c',
+  'lock.c',
+  'lwlock.c',
+  'predicate.c',
+  'proc.c',
+  's_lock.c',
+  'spin.c',
+)
+
+generated_backend_sources += lwlocknames[1]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bufpage.c',
+  'checksum.c',
+  'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'md.c',
+  'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'cmdtag.c',
+  'dest.c',
+  'fastpath.c',
+  'postgres.c',
+  'pquery.c',
+  'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..4144e9befc5
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+  'dict.c',
+  'dict_ispell.c',
+  'dict_simple.c',
+  'dict_synonym.c',
+  'dict_thesaurus.c',
+  'regis.c',
+  'spell.c',
+  'to_tsany.c',
+  'ts_locale.c',
+  'ts_parse.c',
+  'ts_selfuncs.c',
+  'ts_typanalyze.c',
+  'ts_utils.c',
+  'wparser.c',
+  'wparser_def.c',
+)
+
+install_subdir('dicts',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..5b3b558a67d
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'backend_progress.c',
+  'backend_status.c',
+  'pgstat.c',
+  'pgstat_archiver.c',
+  'pgstat_bgwriter.c',
+  'pgstat_checkpointer.c',
+  'pgstat_database.c',
+  'pgstat_function.c',
+  'pgstat_relation.c',
+  'pgstat_replslot.c',
+  'pgstat_shmem.c',
+  'pgstat_slru.c',
+  'pgstat_subscription.c',
+  'pgstat_wal.c',
+  'pgstat_xact.c',
+  'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..ed9ceadfef0
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,131 @@
+backend_sources += files(
+  'acl.c',
+  'amutils.c',
+  'array_expanded.c',
+  'array_selfuncs.c',
+  'array_typanalyze.c',
+  'array_userfuncs.c',
+  'arrayfuncs.c',
+  'arraysubs.c',
+  'arrayutils.c',
+  'ascii.c',
+  'bool.c',
+  'cash.c',
+  'char.c',
+  'cryptohashfuncs.c',
+  'date.c',
+  'datetime.c',
+  'datum.c',
+  'dbsize.c',
+  'domains.c',
+  'encode.c',
+  'enum.c',
+  'expandeddatum.c',
+  'expandedrecord.c',
+  'float.c',
+  'format_type.c',
+  'formatting.c',
+  'genfile.c',
+  'geo_ops.c',
+  'geo_selfuncs.c',
+  'geo_spgist.c',
+  'hbafuncs.c',
+  'inet_cidr_ntop.c',
+  'inet_net_pton.c',
+  'int.c',
+  'int8.c',
+  'json.c',
+  'jsonb.c',
+  'jsonb_gin.c',
+  'jsonb_op.c',
+  'jsonb_util.c',
+  'jsonbsubs.c',
+  'jsonfuncs.c',
+  'jsonpath.c',
+  'jsonpath_exec.c',
+  'like.c',
+  'like_support.c',
+  'lockfuncs.c',
+  'mac.c',
+  'mac8.c',
+  'mcxtfuncs.c',
+  'misc.c',
+  'multirangetypes.c',
+  'multirangetypes_selfuncs.c',
+  'name.c',
+  'network.c',
+  'network_gist.c',
+  'network_selfuncs.c',
+  'network_spgist.c',
+  'numeric.c',
+  'numutils.c',
+  'oid.c',
+  'oracle_compat.c',
+  'orderedsetaggs.c',
+  'partitionfuncs.c',
+  'pg_locale.c',
+  'pg_lsn.c',
+  'pg_upgrade_support.c',
+  'pgstatfuncs.c',
+  'pseudotypes.c',
+  'quote.c',
+  'rangetypes.c',
+  'rangetypes_gist.c',
+  'rangetypes_selfuncs.c',
+  'rangetypes_spgist.c',
+  'rangetypes_typanalyze.c',
+  'regexp.c',
+  'regproc.c',
+  'ri_triggers.c',
+  'rowtypes.c',
+  'ruleutils.c',
+  'selfuncs.c',
+  'tid.c',
+  'timestamp.c',
+  'trigfuncs.c',
+  'tsginidx.c',
+  'tsgistidx.c',
+  'tsquery.c',
+  'tsquery_cleanup.c',
+  'tsquery_gist.c',
+  'tsquery_op.c',
+  'tsquery_rewrite.c',
+  'tsquery_util.c',
+  'tsrank.c',
+  'tsvector.c',
+  'tsvector_op.c',
+  'tsvector_parser.c',
+  'uuid.c',
+  'varbit.c',
+  'varchar.c',
+  'varlena.c',
+  'version.c',
+  'windowfuncs.c',
+  'xid.c',
+  'xid8funcs.c',
+  'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+  input: 'jsonpath_scan.l',
+  output: 'jsonpath_scan.c',
+  command: [flex_cmd, '--no-backup', '--', '-CF', '-p', '-p'],
+)
+generated_sources += jsonpath_scan
+
+jsonpath_gram = custom_target('jsonpath_parse',
+  input: 'jsonpath_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += jsonpath_gram.to_list()
+
+# so we don't need to add . as an include dir for the whole backend
+backend_link_with += static_library('jsonpath',
+  jsonpath_scan, jsonpath_gram,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+
+#generated_backend_sources += jsonpath_gram.to_list()
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..4fe6db6bda6
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'attoptcache.c',
+  'catcache.c',
+  'evtcache.c',
+  'inval.c',
+  'lsyscache.c',
+  'partcache.c',
+  'plancache.c',
+  'relcache.c',
+  'relfilenumbermap.c',
+  'relmapper.c',
+  'spccache.c',
+  'syscache.c',
+  'ts_cache.c',
+  'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..325446c8f93
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'assert.c',
+  'csvlog.c',
+  'elog.c',
+  'jsonlog.c',
+)
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'dfmgr.c',
+  'fmgr.c',
+  'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'dynahash.c',
+  'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'globals.c',
+  'miscinit.c',
+  'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..1bc971d1945
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,36 @@
+encodings = {
+  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+  'euc_tw_and_big5': [
+    'euc_tw_and_big5/euc_tw_and_big5.c',
+    'euc_tw_and_big5/big5.c',
+  ],
+  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+  backend_targets += shared_module(encoding,
+    sources,
+    kwargs: pg_mod_args,
+  )
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'conv.c',
+  'mbutils.c',
+  'stringinfo_mb.c',
+  'wstrcmp.c',
+  'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..3a916320bb3
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,17 @@
+install_data('errcodes.txt',
+  install_dir: dir_data,
+)
+
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..db4de225e18
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,35 @@
+backend_sources += files(
+  'guc.c',
+  'guc_funcs.c',
+  'guc_tables.c',
+  'help_config.c',
+  'pg_config.c',
+  'pg_controldata.c',
+  'pg_rusage.c',
+  'ps_status.c',
+  'queryenvironment.c',
+  'queryjumble.c',
+  'rls.c',
+  'sampling.c',
+  'superuser.c',
+  'timeout.c',
+  'tzparser.c',
+)
+
+guc_scan = custom_target('guc_scan',
+  input: 'guc-file.l',
+  output: 'guc-file.c',
+  command: flex_cmd)
+generated_sources += guc_scan
+
+# so we don't need to add . as an include dir for the whole backend
+backend_link_with += static_library('guc-file',
+  guc_scan,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+
+install_data('postgresql.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'aset.c',
+  'dsa.c',
+  'freepage.c',
+  'generation.c',
+  'mcxt.c',
+  'memdebug.c',
+  'portalmem.c',
+  'slab.c',
+)
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..1862ceae8c1
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'logtape.c',
+  'qsort_interruptible.c',
+  'sharedtuplestore.c',
+  'sortsupport.c',
+  'tuplesort.c',
+  'tuplesortvariants.c',
+  'tuplestore.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'combocid.c',
+  'snapmgr.c',
+)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..b6bf8e1ca21
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,29 @@
+fe_utils_sources = files(
+  'archive.c',
+  'cancel.c',
+  'conditional.c',
+  'connect_utils.c',
+  'mbprint.c',
+  'option_utils.c',
+  'parallel_slot.c',
+  'print.c',
+  'query_utils.c',
+  'recovery_gen.c',
+  'simple_list.c',
+  'string_utils.c',
+)
+
+psqlscan = custom_target('psqlscan',
+  input: 'psqlscan.l',
+  output: 'psqlscan.c',
+  command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-Cfe', '-p', '-p'],
+)
+generated_sources += psqlscan
+fe_utils_sources += psqlscan
+
+fe_utils = static_library('libpgfeutils',
+  fe_utils_sources + generated_headers,
+  include_directories: [postgres_inc, libpq_inc],
+  dependencies: frontend_common_code,
+  kwargs: default_lib_args,
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..9f213274d2f
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,30 @@
+initdb_sources = files(
+  'findtimezone.c',
+  'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+initdb = executable('initdb',
+  initdb_sources,
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code, libpq, icu, icu_i18n],
+  kwargs: default_bin_args,
+)
+bin_targets += initdb
+
+tests += {
+  'name': 'initdb',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_initdb.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 00000000000..8b8a9fd2ce1
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('initdb-' + pg_version_major.to_string())
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..5fd5a9d2f98
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..8e197eba5f3
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,27 @@
+pg_amcheck_sources = files(
+  'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+  pg_amcheck_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_amcheck
+
+tests += {
+  'name': 'pg_amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_nonesuch.pl',
+      't/003_check.pl',
+      't/004_verify_heapam.pl',
+      't/005_opclass_damage.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 00000000000..b255f552c94
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_amcheck-' + pg_version_major.to_string())
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..87a0d980c4f
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,19 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+  ['pg_archivecleanup.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_archivecleanup
+
+tests += {
+  'name': 'pg_archivecleanup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_pg_archivecleanup.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 00000000000..37935fcabc4
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..d26fed9cd8a
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,61 @@
+common_sources = files(
+  'bbstreamer_file.c',
+  'bbstreamer_gzip.c',
+  'bbstreamer_inject.c',
+  'bbstreamer_lz4.c',
+  'bbstreamer_tar.c',
+  'bbstreamer_zstd.c',
+  'receivelog.c',
+  'streamutil.c',
+  'walmethods.c',
+)
+
+pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_common = static_library('libpg_basebackup_common',
+  common_sources,
+  dependencies: pg_basebackup_deps,
+  kwargs: internal_lib_args,
+)
+
+pg_basebackup = executable('pg_basebackup',
+  'pg_basebackup.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+bin_targets += pg_basebackup
+
+pg_receivewal = executable('pg_receivewal',
+  'pg_receivewal.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+bin_targets += pg_receivewal
+
+pg_recvlogical = executable('pg_recvlogical',
+  'pg_recvlogical.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+bin_targets += pg_recvlogical
+
+tests += {
+  'name': 'pg_basebackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path(),
+            'LZ4': program_lz4.found() ? program_lz4.path() : '',
+            'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+    'tests': [
+      't/010_pg_basebackup.pl',
+      't/020_pg_receivewal.pl',
+      't/030_pg_recvlogical.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 00000000000..cab021153fe
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_basebackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..ee1f367bac3
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,21 @@
+pg_checksums = executable('pg_checksums',
+  ['pg_checksums.c'],
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_checksums
+
+tests += {
+  'name': 'pg_checksums',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_actions.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 00000000000..2c47c2338f6
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_checksums-' + pg_version_major.to_string())
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..0ecbf2f9d28
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,19 @@
+pg_config = executable('pg_config',
+  ['pg_config.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_config
+
+tests += {
+  'name': 'pg_config',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_config.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 00000000000..b6fb6db9213
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_config-' + pg_version_major.to_string())
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..557e672beb7
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,19 @@
+pg_controldata = executable('pg_controldata',
+  ['pg_controldata.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_controldata
+
+tests += {
+  'name': 'pg_controldata',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_controldata.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 00000000000..31b486d002c
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_controldata-' + pg_version_major.to_string())
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..6812e73e329
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,22 @@
+pg_ctl = executable('pg_ctl',
+  ['pg_ctl.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_ctl
+
+tests += {
+  'name': 'pg_ctl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_start_stop.pl',
+      't/002_status.pl',
+      't/003_promote.pl',
+      't/004_logrotate.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 00000000000..947b5108423
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_ctl-' + pg_version_major.to_string())
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..785ec094dbd
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,75 @@
+pg_dump_common_sources = files(
+  'compress_io.c',
+  'dumputils.c',
+  'parallel.c',
+  'pg_backup_archiver.c',
+  'pg_backup_custom.c',
+  'pg_backup_db.c',
+  'pg_backup_directory.c',
+  'pg_backup_null.c',
+  'pg_backup_tar.c',
+  'pg_backup_utils.c',
+)
+
+pg_dump_common = static_library('libpgdump_common',
+  pg_dump_common_sources,
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+
+pg_dump_sources = files(
+  'common.c',
+  'pg_dump.c',
+  'pg_dump_sort.c',
+)
+
+pg_dump = executable('pg_dump',
+  pg_dump_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_dump
+
+
+pg_dumpall_sources = files(
+  'pg_dumpall.c',
+)
+
+pg_dumpall = executable('pg_dumpall',
+  pg_dumpall_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_dumpall
+
+
+pg_restore_sources = files(
+  'pg_restore.c',
+)
+
+pg_restore = executable('pg_restore',
+  pg_restore_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_restore
+
+tests += {
+  'name': 'pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_dump.pl',
+      't/003_pg_dump_with_server.pl',
+      't/010_dump_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 00000000000..82e5e537ff4
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_dump-' + pg_version_major.to_string())
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..7c5de134ac0
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,20 @@
+pg_resetwal = executable('pg_resetwal',
+  files('pg_resetwal.c'),
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_resetwal
+
+tests += {
+  'name': 'pg_resetwal',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_corrupted.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 00000000000..d130d3b775f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_resetwal-' + pg_version_major.to_string())
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..d8ec9e482d5
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,42 @@
+pg_rewind_sources = files(
+  'datapagemap.c',
+  'file_ops.c',
+  'filemap.c',
+  'libpq_source.c',
+  'local_source.c',
+  'parsexlog.c',
+  'pg_rewind.c',
+  'timeline.c',
+)
+
+pg_rewind_sources += xlogreader_sources
+
+pg_rewind = executable('pg_rewind',
+  pg_rewind_sources,
+  dependencies: [frontend_code, libpq, lz4, zstd],
+  c_args: ['-DFRONTEND'], # needed for xlogreader et al
+  kwargs: default_bin_args,
+)
+bin_targets += pg_rewind
+
+
+tests += {
+  'name': 'pg_rewind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_databases.pl',
+      't/003_extrafiles.pl',
+      't/004_pg_xlog_symlink.pl',
+      't/005_same_timeline.pl',
+      't/006_options.pl',
+      't/007_standby_source.pl',
+      't/008_min_recovery_point.pl',
+      't/009_growing_files.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 00000000000..a105600b348
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_rewind-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..2c01831e11f
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,21 @@
+test_fsync_sources = files('pg_test_fsync.c')
+
+pg_test_fsync = executable('pg_test_fsync',
+  test_fsync_sources,
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_test_fsync
+
+tests += {
+  'name': 'pg_test_fsync',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 00000000000..2ee1125282d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..0a3068f1657
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,19 @@
+pg_test_timing = executable('pg_test_timing',
+  ['pg_test_timing.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_test_timing
+
+tests += {
+  'name': 'pg_test_timing',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 00000000000..cda8615165b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_timing-' + pg_version_major.to_string())
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..02f030e0ccf
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,40 @@
+pg_upgrade_sources = files(
+  'check.c',
+  'controldata.c',
+  'dump.c',
+  'exec.c',
+  'file.c',
+  'function.c',
+  'info.c',
+  'option.c',
+  'parallel.c',
+  'pg_upgrade.c',
+  'relfilenumber.c',
+  'server.c',
+  'tablespace.c',
+  'util.c',
+  'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+  pg_upgrade_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_upgrade
+
+
+tests += {
+  'name': 'pg_upgrade',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_upgrade.pl',
+    ],
+    'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 00000000000..39301cbede8
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_upgrade-' + pg_version_major.to_string())
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..4c3b2bb5f97
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,33 @@
+pg_verifybackup_sources = files(
+  'parse_manifest.c',
+  'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+  pg_verifybackup_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_verifybackup
+
+tests += {
+  'name': 'pg_verifybackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_algorithm.pl',
+      't/003_corruption.pl',
+      't/004_options.pl',
+      't/005_bad_manifest.pl',
+      't/006_encoding.pl',
+      't/007_wal.pl',
+      't/008_untar.pl',
+      't/009_extract.pl',
+      't/010_client_untar.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 00000000000..b583f1958ba
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..95872652ffd
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,30 @@
+pg_waldump_sources = files(
+  'compat.c',
+  'pg_waldump.c',
+  'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
+
+pg_waldump = executable('pg_waldump',
+  pg_waldump_sources,
+  dependencies: [frontend_code, lz4, zstd],
+  c_args: ['-DFRONTEND'], # needed for xlogreader et al
+  kwargs: default_bin_args,
+)
+bin_targets += pg_waldump
+
+tests += {
+  'name': 'pg_waldump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 00000000000..f335aa4b360
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_waldump-' + pg_version_major.to_string())
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..6564e54029c
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,38 @@
+pgbench_sources = files(
+  'pgbench.c',
+)
+
+exprscan = custom_target('exprscan',
+  input: 'exprscan.l',
+  output: 'exprscan.c',
+  command: flex_cmd,
+)
+generated_sources += exprscan
+pgbench_sources += exprscan
+
+exprparse = custom_target('exprparse',
+  input: 'exprparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += exprparse.to_list()
+pgbench_sources += exprparse
+
+pgbench = executable('pgbench',
+  pgbench_sources,
+  dependencies: [frontend_code, libpq, thread_dep],
+  include_directories: include_directories('.'),
+  kwargs: default_bin_args,
+)
+bin_targets += pgbench
+
+tests += {
+  'name': 'pgbench',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pgbench_with_server.pl',
+      't/002_pgbench_no_server.pl',
+    ],
+  },
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..5852bca4d87
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,26 @@
+if host_system != 'windows'
+  subdir_done()
+endif
+
+pgevent_sources = files(
+  'pgevent.c',
+)
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
+# FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
+pgevent_link_args = []
+if cc.get_id() == 'msvc'
+  pgevent_link_args += '/ignore:4104'
+endif
+
+pgevent = shared_library('pgevent',
+  pgevent_sources,
+  dependencies: [frontend_code],
+  link_args: pgevent_link_args,
+  vs_module_defs: 'pgevent.def',
+  kwargs: default_lib_args + {
+    'name_prefix': '',
+  },
+)
+bin_targets += pgevent
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..ea850c8fdf5
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,67 @@
+psql_sources = files(
+  'command.c',
+  'common.c',
+  'copy.c',
+  'crosstabview.c',
+  'describe.c',
+  'help.c',
+  'input.c',
+  'large_obj.c',
+  'mainloop.c',
+  'prompt.c',
+  'startup.c',
+  'stringutils.c',
+  'tab-complete.c',
+  'variables.c',
+)
+
+psqlscanslash = custom_target('psqlscanslash',
+  input: 'psqlscanslash.l',
+  output: 'psqlscanslash.c',
+  command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-Cfe', '-p', '-p'])
+generated_sources += psqlscanslash
+psql_sources += psqlscanslash
+bin_targets += psqlscanslash
+
+sql_help = custom_target('psql_help',
+  output: ['sql_help.c', 'sql_help.h'],
+  depfile: 'sql_help.dep',
+  command: [
+    perl, files('create_help.pl'),
+    '--docdir', '@SOURCE_ROOT@/doc/src/sgml/ref',
+    '--depfile', '@DEPFILE@',
+    '--outdir', '@OUTDIR@',
+    '--basename', 'sql_help',
+  ],
+)
+generated_sources += sql_help.to_list()
+psql_sources += sql_help
+bin_targets += sql_help
+
+psql = executable('psql',
+  psql_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq, readline],
+  kwargs: default_bin_args,
+)
+bin_targets += psql
+
+install_data('psqlrc.sample',
+  install_dir: dir_data,
+)
+
+tests += {
+  'name': 'psql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_basic.pl',
+      't/010_tab_completion.pl',
+      't/020_cancel.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 00000000000..45fe425298d
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('psql-' + pg_version_major.to_string())
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..eaf250c7f73
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,51 @@
+scripts_common = static_library('libscripts_common',
+  files('common.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: internal_lib_args,
+)
+
+binaries = [
+  'createdb',
+  'dropdb',
+  'createuser',
+  'dropuser',
+  'clusterdb',
+  'vacuumdb',
+  'reindexdb',
+  'pg_isready',
+]
+
+foreach binary : binaries
+  binary = executable(binary,
+    files(binary + '.c'),
+    link_with: [scripts_common],
+    dependencies: [frontend_code, libpq],
+    kwargs: default_bin_args,
+  )
+  bin_targets += binary
+endforeach
+
+tests += {
+  'name': 'scripts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_clusterdb.pl',
+      't/011_clusterdb_all.pl',
+      't/020_createdb.pl',
+      't/040_createuser.pl',
+      't/050_dropdb.pl',
+      't/070_dropuser.pl',
+      't/080_pg_isready.pl',
+      't/090_reindexdb.pl',
+      't/091_reindexdb_all.pl',
+      't/100_vacuumdb.pl',
+      't/101_vacuumdb_all.pl',
+      't/102_vacuumdb_stages.pl',
+      't/200_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 00000000000..3c531459c2d
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pgscripts-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..bc047e00d62
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,108 @@
+# test/ is entered via top-level meson.build, that way it can use the default
+# args for executables (which depend on libpq).
+
+libpq_sources = files(
+  'fe-auth-scram.c',
+  'fe-auth.c',
+  'fe-connect.c',
+  'fe-exec.c',
+  'fe-lobj.c',
+  'fe-misc.c',
+  'fe-print.c',
+  'fe-protocol3.c',
+  'fe-secure.c',
+  'fe-trace.c',
+  'legacy-pqsignal.c',
+  'libpq-events.c',
+  'pqexpbuffer.c',
+)
+
+if host_system == 'windows'
+  libpq_sources += files('pthread-win32.c', 'win32.c')
+endif
+
+if ssl.found()
+  libpq_sources += files('fe-secure-common.c')
+  libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+  libpq_sources += files(
+    'fe-gssapi-common.c',
+    'fe-secure-gssapi.c',
+  )
+endif
+
+export_file = custom_target('libpq.exports',
+  kwargs: gen_export_kwargs,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+
+libpq_st = static_library('libpq',
+  libpq_sources,
+  pic: true,
+  include_directories: [libpq_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=5'],
+  dependencies: libpq_deps,
+  kwargs: default_lib_args,
+)
+
+# not using both_libraries here, causes problems with precompiled headers and
+# resource files with msbuild
+libpq_so = shared_library('libpq',
+  dependencies: libpq_deps,
+  include_directories: [libpq_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=5'],
+  link_whole: libpq_st,
+  version: '5.' + pg_version_major.to_string(),
+  soversion: host_system != 'windows' ? '5' : '',
+  darwin_versions: ['5', '5.' + pg_version_major.to_string()],
+  link_depends: export_file,
+  link_args: export_fmt.format(export_file.full_path()),
+  kwargs: default_lib_args,
+)
+
+libpq = declare_dependency(
+  link_with: [libpq_so],
+  include_directories: [include_directories('.')]
+)
+
+pkgconfig.generate(
+  libpq_so,
+  name: 'libpq',
+  description: 'PostgreSQL libpq library',
+  url: pg_url,
+)
+
+install_headers(
+  'libpq-fe.h',
+  'libpq-events.h',
+)
+
+install_headers(
+  'libpq-int.h',
+  'pqexpbuffer.h',
+  'fe-auth-sasl.h',
+  install_dir: dir_include_internal,
+)
+install_data('pg_service.conf.sample',
+  install_dir: dir_data,
+)
+
+
+tests += {
+  'name': 'libpq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_uri.pl',
+      't/002_api.pl',
+    ],
+    'env': {'with_ssl': get_option('ssl')},
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build
new file mode 100644
index 00000000000..eed91110fd6
--- /dev/null
+++ b/src/interfaces/libpq/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
new file mode 100644
index 00000000000..16f94c1ed8b
--- /dev/null
+++ b/src/interfaces/libpq/test/meson.build
@@ -0,0 +1,15 @@
+executable('libpq_uri_regress',
+  files('libpq_uri_regress.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+executable('libpq_testclient',
+  files('libpq_testclient.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..d9a57465441
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,5 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
+subdir('tcl')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..73b733dd50b
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,90 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+plperl_sources = files(
+  'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+  check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(privlibexp)
+
+plperl_sources += custom_target('perlchunks.h',
+  input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+  output: 'perlchunks.h',
+  capture: true,
+  command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+  input: files('plperl_opmask.pl'),
+  output: 'plperl_opmask.h',
+  command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+  xs = files(n + '.xs')
+  xs_c_name = n + '.c'
+  xs_c = custom_target(xs_c_name,
+    input: xs,
+    output: xs_c_name,
+    command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+  )
+  plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+plperl = shared_module('plperl',
+  plperl_sources,
+  include_directories: [plperl_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, pg_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+pl_targets += plperl
+
+install_data(
+  'plperl.control',
+  'plperl--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_data(
+  'plperlu.control',
+  'plperlu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plperl.h',
+  'ppport.h',
+  install_dir: dir_include_server,
+)
+
+tests += {
+  'name': 'plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plperl_setup',
+      'plperl',
+      'plperl_lc',
+      'plperl_trigger',
+      'plperl_shared',
+      'plperl_elog',
+      'plperl_util',
+      'plperl_init',
+      'plperlu',
+      'plperl_array',
+      'plperl_call',
+      'plperl_transaction',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build
new file mode 100644
index 00000000000..fe0a715bdf0
--- /dev/null
+++ b/src/pl/plperl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plperl-' + pg_version_major.to_string())
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..dd499fdd151
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,84 @@
+plpgsql_sources = files(
+  'pl_comp.c',
+  'pl_exec.c',
+  'pl_funcs.c',
+  'pl_handler.c',
+  'pl_scanner.c',
+)
+
+pl_gram = custom_target('gram',
+  input: 'pl_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += pl_gram.to_list()
+plpgsql_sources += pl_gram
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+pl_errcodes = custom_target('plerrcodes',
+  input: ['../../../../src/backend/utils/errcodes.txt'],
+  output: ['plerrcodes.h'],
+  command: [perl, gen_plerrcodes, '@INPUT0@'],
+  capture: true,
+)
+generated_sources += pl_errcodes
+plpgsql_sources += pl_errcodes
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+pl_reserved = custom_target('pl_reserved_kwlist',
+  input: ['pl_reserved_kwlist.h'],
+  output: ['pl_reserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_reserved
+plpgsql_sources += pl_reserved
+
+pl_unreserved = custom_target('pl_unreserved_kwlist',
+  input: ['pl_unreserved_kwlist.h'],
+  output: ['pl_unreserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_unreserved
+plpgsql_sources += pl_unreserved
+
+plpgsql = shared_module('plpgsql',
+  plpgsql_sources,
+  include_directories: include_directories('.'),
+  kwargs: pg_mod_args,
+)
+pl_targets += plpgsql
+
+install_data(
+  'plpgsql.control',
+  'plpgsql--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpgsql.h',
+  install_dir: dir_include_server
+)
+
+
+tests += {
+  'name': 'plpgsql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plpgsql_array',
+      'plpgsql_call',
+      'plpgsql_control',
+      'plpgsql_copy',
+      'plpgsql_domain',
+      'plpgsql_record',
+      'plpgsql_cache',
+      'plpgsql_simple',
+      'plpgsql_transaction',
+      'plpgsql_trap',
+      'plpgsql_trigger',
+      'plpgsql_varprops',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build
new file mode 100644
index 00000000000..29e0b74488f
--- /dev/null
+++ b/src/pl/plpgsql/src/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpgsql-' + pg_version_major.to_string())
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..366b3b171ac
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,99 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+plpython_sources = files(
+  'plpy_cursorobject.c',
+  'plpy_elog.c',
+  'plpy_exec.c',
+  'plpy_main.c',
+  'plpy_planobject.c',
+  'plpy_plpymodule.c',
+  'plpy_procedure.c',
+  'plpy_resultobject.c',
+  'plpy_spi.c',
+  'plpy_subxactobject.c',
+  'plpy_typeio.c',
+  'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'spiexceptions.h',
+  command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+  capture: true,
+)
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+plpython = shared_module('plpython3',
+  plpython_sources,
+  include_directories: [plpython_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [python3_dep, pg_mod_args['dependencies']],
+  },
+)
+pl_targets += plpython
+
+# FIXME: Only install the relevant versions
+install_data(
+  'plpython3u.control',
+  'plpython3u--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpy_cursorobject.h',
+  'plpy_elog.h',
+  'plpy_exec.h',
+  'plpy_main.h',
+  'plpy_planobject.h',
+  'plpy_plpymodule.h',
+  'plpy_procedure.h',
+  'plpy_resultobject.h',
+  'plpy_spi.h',
+  'plpy_subxactobject.h',
+  'plpy_typeio.h',
+  'plpy_util.h',
+  'plpython.h',
+  install_dir: dir_include_server,
+)
+
+plpython_regress = [
+  'plpython_schema',
+  'plpython_populate',
+  'plpython_test',
+  'plpython_do',
+  'plpython_global',
+  'plpython_import',
+  'plpython_spi',
+  'plpython_newline',
+  'plpython_void',
+  'plpython_call',
+  'plpython_params',
+  'plpython_setof',
+  'plpython_record',
+  'plpython_trigger',
+  'plpython_types',
+  'plpython_error',
+  'plpython_ereport',
+  'plpython_unicode',
+  'plpython_quote',
+  'plpython_composite',
+  'plpython_subtransaction',
+  'plpython_transaction',
+  'plpython_drop',
+]
+
+tests += {
+  'name': 'plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': plpython_regress,
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build
new file mode 100644
index 00000000000..542e27fbe1f
--- /dev/null
+++ b/src/pl/plpython/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpython-' + pg_version_major.to_string())
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
new file mode 100644
index 00000000000..9b6addd7fd5
--- /dev/null
+++ b/src/pl/tcl/meson.build
@@ -0,0 +1,55 @@
+if not tcl_dep.found()
+  subdir_done()
+endif
+
+pltcl_sources = files(
+  'pltcl.c',
+)
+
+gen_pltclerrcodes = files('generate-pltclerrcodes.pl')
+pltcl_sources += custom_target('pltclerrcodes.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'pltclerrcodes.h',
+  capture: true,
+  command: [perl, gen_pltclerrcodes, '@INPUT@']
+)
+
+pltcl = shared_module('pltcl',
+  pltcl_sources,
+  include_directories: [include_directories('.'), postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [tcl_dep, pg_mod_args['dependencies']],
+  },
+)
+pl_targets += pltcl
+
+install_data(
+  'pltcl.control',
+  'pltcl--1.0.sql',
+  'pltclu.control',
+  'pltclu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+pltcl_regress = [
+  'pltcl_setup',
+  'pltcl_queries',
+  'pltcl_trigger',
+  'pltcl_call',
+  'pltcl_start_proc',
+  'pltcl_subxact',
+  'pltcl_unicode',
+  'pltcl_transaction',
+]
+
+tests += {
+  'name': 'pltcl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': pltcl_regress,
+    'regress_args': ['--load-extension=pltcl'],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build
new file mode 100644
index 00000000000..cc23ef1eb3b
--- /dev/null
+++ b/src/pl/tcl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pltcl-' + pg_version_major.to_string())
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..fc2368d02cf
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,23 @@
+adminpack = shared_module('adminpack',
+  ['adminpack.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += adminpack
+
+install_data(
+  'adminpack.control',
+  'adminpack--1.0.sql',
+  'adminpack--1.0--1.1.sql',
+  'adminpack--1.1--2.0.sql',
+  'adminpack--2.0--2.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'adminpack',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ['adminpack'],
+  },
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..1db3d20349e
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,37 @@
+amcheck = shared_module('amcheck', [
+    'verify_heapam.c',
+    'verify_nbtree.c',
+  ],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += amcheck
+
+install_data(
+  'amcheck.control',
+  'amcheck--1.0.sql',
+  'amcheck--1.0--1.1.sql',
+  'amcheck--1.1--1.2.sql',
+  'amcheck--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'check',
+      'check_btree',
+      'check_heap',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_verify_heapam.pl',
+      't/002_cic.pl',
+      't/003_cic_2pc.pl',
+    ],
+  },
+}
+
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..d2e01968f54
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,5 @@
+autoinc = shared_module('auth_delay',
+  ['auth_delay.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += autoinc
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..249a8376faa
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,16 @@
+auto_explain = shared_module('auto_explain',
+  files('auto_explain.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += auto_explain
+
+tests += {
+  'name': 'auto_explain',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auto_explain.pl',
+    ],
+  },
+}
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
new file mode 100644
index 00000000000..9f0517f1701
--- /dev/null
+++ b/contrib/basebackup_to_shell/meson.build
@@ -0,0 +1,22 @@
+basebackup_to_shell_sources = files(
+  'basebackup_to_shell.c',
+)
+
+basebackup_to_shell = shared_module('basebackup_to_shell',
+  basebackup_to_shell_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += basebackup_to_shell
+
+tests += {
+  'name': 'basebackup_to_shell',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path()},
+  },
+}
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
new file mode 100644
index 00000000000..b67cbef60bd
--- /dev/null
+++ b/contrib/basic_archive/meson.build
@@ -0,0 +1,23 @@
+basic_archive_sources = files(
+  'basic_archive.c',
+)
+
+basic_archive = shared_module('basic_archive',
+  basic_archive_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += basic_archive
+
+tests += {
+  'name': 'basic_archive',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'basic_archive',
+    ],
+    'regress_args': [
+      '--temp-config', files('basic_archive.conf'),
+    ],
+  },
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..1fe7632bdbe
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,36 @@
+bloom_sources = files(
+  'blcost.c',
+  'blinsert.c',
+  'blscan.c',
+  'blutils.c',
+  'blvacuum.c',
+  'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+  bloom_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += bloom
+
+install_data(
+  'bloom.control',
+  'bloom--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bloom',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_wal.pl',
+    ],
+  },
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..c20b667d75f
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,42 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+bool_plperl_sources = files(
+  'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+  bool_plperl_sources,
+  include_directories: [plperl_inc, include_directories('.')],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+contrib_targets += bool_plperl
+
+install_data(
+  'bool_plperl.control',
+  'bool_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'bool_plperlu.control',
+  'bool_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bool_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bool_plperl',
+      'bool_plperlu',
+    ],
+  },
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..15d6d31a6ee
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,54 @@
+btree_gin = shared_module('btree_gin',
+  files('btree_gin.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += btree_gin
+
+install_data(
+  'btree_gin.control',
+  'btree_gin--1.0.sql',
+  'btree_gin--1.0--1.1.sql',
+  'btree_gin--1.1--1.2.sql',
+  'btree_gin--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'install_btree_gin',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'money',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'enum',
+      'uuid',
+      'name',
+      'bool',
+      'bpchar',
+    ],
+  },
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..c0a8d238540
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,84 @@
+btree_gist_sources = files(
+  'btree_bit.c',
+  'btree_bool.c',
+  'btree_bytea.c',
+  'btree_cash.c',
+  'btree_date.c',
+  'btree_enum.c',
+  'btree_float4.c',
+  'btree_float8.c',
+  'btree_gist.c',
+  'btree_inet.c',
+  'btree_int2.c',
+  'btree_int4.c',
+  'btree_int8.c',
+  'btree_interval.c',
+  'btree_macaddr.c',
+  'btree_macaddr8.c',
+  'btree_numeric.c',
+  'btree_oid.c',
+  'btree_text.c',
+  'btree_time.c',
+  'btree_ts.c',
+  'btree_utils_num.c',
+  'btree_utils_var.c',
+  'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+  btree_gist_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += btree_gist
+
+install_data(
+  'btree_gist.control',
+  'btree_gist--1.0--1.1.sql',
+  'btree_gist--1.1--1.2.sql',
+  'btree_gist--1.2.sql',
+  'btree_gist--1.2--1.3.sql',
+  'btree_gist--1.3--1.4.sql',
+  'btree_gist--1.4--1.5.sql',
+  'btree_gist--1.5--1.6.sql',
+  'btree_gist--1.6--1.7.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'init',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'cash',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'uuid',
+      'not_equal',
+      'enum',
+      'bool',
+    ],
+  },
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..ca60eded80b
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,34 @@
+citext_sources = files(
+  'citext.c',
+)
+
+citext = shared_module('citext',
+  citext_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += citext
+
+install_data(
+  'citext.control',
+  'citext--1.0--1.1.sql',
+  'citext--1.1--1.2.sql',
+  'citext--1.2--1.3.sql',
+  'citext--1.3--1.4.sql',
+  'citext--1.4.sql',
+  'citext--1.4--1.5.sql',
+  'citext--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'citext',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'create_index_acl',
+      'citext',
+      'citext_utf8',
+    ],
+  },
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..72342b0c82c
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,53 @@
+cube_sources = files(
+  'cube.c',
+)
+
+cube_scan = custom_target('cubescan',
+  input: 'cubescan.l',
+  output: 'cubescan.c',
+  command: flex_cmd,
+)
+generated_sources += cube_scan
+cube_sources += cube_scan
+
+cube_parse = custom_target('cubeparse',
+  input: 'cubeparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += cube_parse.to_list()
+cube_sources += cube_parse
+
+cube = shared_module('cube',
+  cube_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += cube
+
+install_data(
+  'cube.control',
+  'cube--1.0--1.1.sql',
+  'cube--1.1--1.2.sql',
+  'cube--1.2.sql',
+  'cube--1.2--1.3.sql',
+  'cube--1.3--1.4.sql',
+  'cube--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'cubedata.h',
+  install_dir: dir_include_extension / 'cube',
+)
+
+tests += {
+  'name': 'cube',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'cube',
+      'cube_sci',
+    ],
+  },
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..d35f7b5d49e
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,31 @@
+dblink_sources = files(
+  'dblink.c',
+)
+
+dblink = shared_module('dblink',
+  dblink_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'] + [libpq],
+  },
+)
+contrib_targets += dblink
+
+install_data(
+  'dblink.control',
+  'dblink--1.0--1.1.sql',
+  'dblink--1.1--1.2.sql',
+  'dblink--1.2.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dblink',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dblink',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..f00e8085619
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,22 @@
+dict_int = shared_module('dict_int',
+  files('dict_int.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += dict_int
+
+install_data(
+  'dict_int.control',
+  'dict_int--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dict_int',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_int',
+    ],
+  },
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..be53f55bb79
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,29 @@
+dict_xsyn = shared_module('dict_xsyn',
+  files('dict_xsyn.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += dict_xsyn
+
+install_data(
+  'dict_xsyn.control',
+  'dict_xsyn--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'xsyn_sample.rules',
+  kwargs: contrib_data_args + {
+    'install_dir': dir_data / 'tsearch_data'
+  }
+)
+
+tests += {
+  'name': 'dict_xsyn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_xsyn',
+    ],
+  },
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..807f5cb7de3
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,23 @@
+earthdistance = shared_module('earthdistance',
+  files('earthdistance.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += earthdistance
+
+install_data(
+  'earthdistance.control',
+  'earthdistance--1.0--1.1.sql',
+  'earthdistance--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'earthdistance',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'earthdistance',
+    ],
+  },
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..f13efb6e38e
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,22 @@
+file_fdw = shared_module('file_fdw',
+  files('file_fdw.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += file_fdw
+
+install_data(
+  'file_fdw.control',
+  'file_fdw--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'file_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'file_fdw',
+    ],
+  },
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..ec278a6211e
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,26 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+  files(
+    'fuzzystrmatch.c',
+    'dmetaphone.c'
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += fuzzystrmatch
+
+install_data(
+  'fuzzystrmatch.control',
+  'fuzzystrmatch--1.0--1.1.sql',
+  'fuzzystrmatch--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'fuzzystrmatch',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'fuzzystrmatch',
+    ],
+  },
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..07c59f40a97
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,44 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+  files(
+    'hstore_compat.c',
+    'hstore_gin.c',
+    'hstore_gist.c',
+    'hstore_io.c',
+    'hstore_op.c',
+    'hstore_subs.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += hstore
+
+install_data(
+  'hstore.control',
+  'hstore--1.1--1.2.sql',
+  'hstore--1.2--1.3.sql',
+  'hstore--1.3--1.4.sql',
+  'hstore--1.4.sql',
+  'hstore--1.4--1.5.sql',
+  'hstore--1.5--1.6.sql',
+  'hstore--1.6--1.7.sql',
+  'hstore--1.7--1.8.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'hstore.h',
+  install_dir: dir_include_extension / 'hstore',
+)
+
+tests += {
+  'name': 'hstore',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore',
+    ],
+  },
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..bbafa0221bd
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,43 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+hstore_plperl_sources = files(
+  'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+  hstore_plperl_sources,
+  include_directories: [plperl_inc, hstore_inc],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+contrib_targets += hstore_plperl
+
+install_data(
+  'hstore_plperl.control',
+  'hstore_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'hstore_plperlu.control',
+  'hstore_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'hstore_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore_plperl',
+      'hstore_plperlu',
+      'create_transform',
+    ],
+  },
+}
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..214b48519a9
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,37 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+hstore_plpython_sources = files(
+  'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+  hstore_plpython_sources,
+  include_directories: [plpython_inc, hstore_inc, ],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += hstore_plpython
+
+install_data(
+  'hstore_plpython3u--1.0.sql',
+  'hstore_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = [
+  'hstore_plpython'
+]
+
+tests += {
+  'name': 'hstore_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': hstore_plpython_regress,
+    'regress_args': ['--load-extension=hstore'],
+  },
+}
diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build
new file mode 100644
index 00000000000..a0f39366f47
--- /dev/null
+++ b/contrib/intagg/meson.build
@@ -0,0 +1,6 @@
+install_data(
+  'intagg.control',
+  'intagg--1.0--1.1.sql',
+  'intagg--1.1.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
new file mode 100644
index 00000000000..1655bcbb3fd
--- /dev/null
+++ b/contrib/intarray/meson.build
@@ -0,0 +1,37 @@
+intarray_sources = files(
+  '_int_bool.c',
+  '_int_gin.c',
+  '_int_gist.c',
+  '_int_op.c',
+  '_int_selfuncs.c',
+  '_int_tool.c',
+  '_intbig_gist.c',
+)
+
+intarray = shared_module('_int',
+  intarray_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += intarray
+
+install_data(
+  'intarray.control',
+  'intarray--1.0--1.1.sql',
+  'intarray--1.1--1.2.sql',
+  'intarray--1.2.sql',
+  'intarray--1.2--1.3.sql',
+  'intarray--1.3--1.4.sql',
+  'intarray--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'intarray',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      '_int',
+    ],
+  },
+}
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
new file mode 100644
index 00000000000..cc30bbeb55c
--- /dev/null
+++ b/contrib/isn/meson.build
@@ -0,0 +1,33 @@
+isn_sources = files(
+  'isn.c',
+)
+
+isn = shared_module('isn',
+  isn_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += isn
+
+install_data(
+  'isn.control',
+  'isn--1.0--1.1.sql',
+  'isn--1.1--1.2.sql',
+  'isn--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'isn.h',
+  install_dir: dir_include_extension / 'isn',
+)
+
+tests += {
+  'name': 'isn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'isn',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..5c915d8ed94
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,43 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+  'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+  jsonb_plperl_sources,
+  include_directories: [plperl_inc],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+contrib_targets += jsonb_plperl
+
+install_data(
+  'jsonb_plperl.control',
+  'jsonb_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'jsonb_plperlu.control',
+  'jsonb_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'jsonb_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'jsonb_plperl',
+      'jsonb_plperlu',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..de8e1105c6a
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+  'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+  jsonb_plpython_sources,
+  include_directories: [plpython_inc],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += jsonb_plpython
+
+install_data(
+  'jsonb_plpython3u.control',
+  'jsonb_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = [
+  'jsonb_plpython'
+]
+
+tests += {
+  'name': 'jsonb_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': jsonb_plpython_regress,
+  },
+}
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
new file mode 100644
index 00000000000..9082d5713c7
--- /dev/null
+++ b/contrib/lo/meson.build
@@ -0,0 +1,27 @@
+lo_sources = files(
+  'lo.c',
+)
+
+lo = shared_module('lo',
+  lo_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += lo
+
+install_data(
+  'lo.control',
+  'lo--1.0--1.1.sql',
+  'lo--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'lo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'lo',
+    ],
+  },
+}
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
new file mode 100644
index 00000000000..9463fc2c5e5
--- /dev/null
+++ b/contrib/ltree/meson.build
@@ -0,0 +1,44 @@
+ltree_sources = files(
+  '_ltree_gist.c',
+  '_ltree_op.c',
+  'crc32.c',
+  'lquery_op.c',
+  'ltree_gist.c',
+  'ltree_io.c',
+  'ltree_op.c',
+  'ltxtquery_io.c',
+  'ltxtquery_op.c',
+)
+
+# .. so that includes of ltree/ltree.h work
+ltree_inc = include_directories('.', '../')
+
+ltree = shared_module('ltree',
+  ltree_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += ltree
+
+install_data(
+  'ltree.control',
+  'ltree--1.0--1.1.sql',
+  'ltree--1.1--1.2.sql',
+  'ltree--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'ltree.h',
+  install_dir: dir_include_extension / 'ltree',
+)
+
+tests += {
+  'name': 'ltree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ltree',
+    ],
+  },
+}
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
new file mode 100644
index 00000000000..429d75006aa
--- /dev/null
+++ b/contrib/ltree_plpython/meson.build
@@ -0,0 +1,37 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+ltree_plpython_sources = files(
+  'ltree_plpython.c',
+)
+
+ltree_plpython = shared_module('ltree_plpython3',
+  ltree_plpython_sources,
+  include_directories: [plpython_inc, ltree_inc],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += ltree_plpython
+
+install_data(
+  'ltree_plpython3u--1.0.sql',
+  'ltree_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+ltree_plpython_regress = [
+  'ltree_plpython'
+]
+
+tests += {
+  'name': 'ltree_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ltree_plpython_regress,
+    'regress_args': ['--load-extension=ltree'],
+  },
+}
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..84752d4bd0f
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,66 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = dir_data_extension
+contrib_data_args = {
+  'install_dir': contrib_data_dir,
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('basic_archive')
+subdir('bloom')
+subdir('basebackup_to_shell')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+subdir('intagg')
+subdir('intarray')
+subdir('isn')
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+subdir('lo')
+subdir('ltree')
+subdir('ltree_plpython')
+subdir('oid2name')
+subdir('old_snapshot')
+subdir('pageinspect')
+subdir('passwordcheck')
+subdir('pg_buffercache')
+subdir('pgcrypto')
+subdir('pg_freespacemap')
+subdir('pg_prewarm')
+subdir('pgrowlocks')
+subdir('pg_stat_statements')
+subdir('pgstattuple')
+subdir('pg_surgery')
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('pg_walinspect')
+subdir('postgres_fdw')
+subdir('seg')
+subdir('sepgsql')
+subdir('spi')
+subdir('sslinfo')
+# start-scripts doesn't contain build products
+subdir('tablefunc')
+subdir('tcn')
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+subdir('uuid-ossp')
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..1dad5d8f6e7
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,17 @@
+oid2name = executable('oid2name',
+  ['oid2name.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+contrib_targets += oid2name
+
+tests += {
+  'name': 'oid2name',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
new file mode 100644
index 00000000000..8e7ee09a43a
--- /dev/null
+++ b/contrib/old_snapshot/meson.build
@@ -0,0 +1,15 @@
+old_snapshot_sources = files(
+  'time_mapping.c',
+)
+
+old_snapshot = shared_module('old_snapshot',
+  old_snapshot_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += old_snapshot
+
+install_data(
+  'old_snapshot.control',
+  'old_snapshot--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..4af8153e4fd
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,50 @@
+pageinspect_sources = files(
+  'brinfuncs.c',
+  'btreefuncs.c',
+  'fsmfuncs.c',
+  'ginfuncs.c',
+  'gistfuncs.c',
+  'hashfuncs.c',
+  'heapfuncs.c',
+  'rawpage.c',
+)
+
+pageinspect = shared_module('pageinspect',
+  pageinspect_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pageinspect
+
+install_data(
+  'pageinspect--1.0--1.1.sql',
+  'pageinspect--1.1--1.2.sql',
+  'pageinspect--1.2--1.3.sql',
+  'pageinspect--1.3--1.4.sql',
+  'pageinspect--1.4--1.5.sql',
+  'pageinspect--1.5--1.6.sql',
+  'pageinspect--1.5.sql',
+  'pageinspect--1.6--1.7.sql',
+  'pageinspect--1.7--1.8.sql',
+  'pageinspect--1.8--1.9.sql',
+  'pageinspect--1.9--1.10.sql',
+  'pageinspect.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pageinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'page',
+      'btree',
+      'brin',
+      'gin',
+      'gist',
+      'hash',
+      'checksum',
+      'oldextversions',
+    ],
+  },
+}
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
new file mode 100644
index 00000000000..7da47d02f1d
--- /dev/null
+++ b/contrib/passwordcheck/meson.build
@@ -0,0 +1,30 @@
+passwordcheck_sources = files(
+  'passwordcheck.c',
+)
+
+passwordcheck_c_args = []
+passwordcheck_deps = []
+
+# uncomment the following two lines to enable cracklib support
+# passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
+# passwordcheck_deps += [cc.find_library('crack')]
+
+passwordcheck = shared_module('passwordcheck',
+  passwordcheck_sources,
+  c_args: passwordcheck_c_args,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args.get('dependencies') + passwordcheck_deps,
+  }
+)
+contrib_targets += passwordcheck
+
+tests += {
+  'name': 'passwordcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'passwordcheck',
+    ],
+  },
+}
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
new file mode 100644
index 00000000000..2c69eae3ea2
--- /dev/null
+++ b/contrib/pg_buffercache/meson.build
@@ -0,0 +1,27 @@
+pg_buffercache = shared_module('pg_buffercache',
+  files(
+    'pg_buffercache_pages.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_buffercache
+
+install_data(
+  'pg_buffercache--1.0--1.1.sql',
+  'pg_buffercache--1.1--1.2.sql',
+  'pg_buffercache--1.2--1.3.sql',
+  'pg_buffercache--1.2.sql',
+  'pg_buffercache.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_buffercache',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_buffercache',
+    ],
+  },
+}
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
new file mode 100644
index 00000000000..f795014d7ca
--- /dev/null
+++ b/contrib/pg_freespacemap/meson.build
@@ -0,0 +1,29 @@
+pg_freespacemap = shared_module('pg_freespacemap',
+  files(
+    'pg_freespacemap.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_freespacemap
+
+install_data(
+  'pg_freespacemap--1.0--1.1.sql',
+  'pg_freespacemap--1.1--1.2.sql',
+  'pg_freespacemap--1.1.sql',
+  'pg_freespacemap.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_freespacemap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_freespacemap',
+    ],
+    'regress_args': [
+      '--temp-config', files('pg_freespacemap.conf')
+    ],
+  },
+}
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..bdca9af4f27
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,27 @@
+pg_prewarm = shared_module('pg_prewarm',
+  files(
+    'autoprewarm.c',
+    'pg_prewarm.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_prewarm
+
+install_data(
+  'pg_prewarm--1.0--1.1.sql',
+  'pg_prewarm--1.1--1.2.sql',
+  'pg_prewarm--1.1.sql',
+  'pg_prewarm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_prewarm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..ac117d2fc1d
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,35 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+  files('pg_stat_statements.c'),
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+contrib_targets += pg_stat_statements
+
+install_data(
+  'pg_stat_statements.control',
+  'pg_stat_statements--1.4.sql',
+  'pg_stat_statements--1.9--1.10.sql',
+  'pg_stat_statements--1.8--1.9.sql',
+  'pg_stat_statements--1.7--1.8.sql',
+  'pg_stat_statements--1.6--1.7.sql',
+  'pg_stat_statements--1.5--1.6.sql',
+  'pg_stat_statements--1.4--1.5.sql',
+  'pg_stat_statements--1.3--1.4.sql',
+  'pg_stat_statements--1.2--1.3.sql',
+  'pg_stat_statements--1.1--1.2.sql',
+  'pg_stat_statements--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_stat_statements',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_stat_statements',
+    ],
+    'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+  },
+}
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
new file mode 100644
index 00000000000..ac71caa5276
--- /dev/null
+++ b/contrib/pg_surgery/meson.build
@@ -0,0 +1,25 @@
+pg_surgery = shared_module('pg_surgery',
+  files(
+    'heap_surgery.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_surgery
+
+install_data(
+  'pg_surgery--1.0.sql',
+  'pg_surgery.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_surgery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'heap_surgery',
+    ],
+  },
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..a90628d23c6
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,35 @@
+pg_trgm = shared_module('pg_trgm',
+  files(
+    'trgm_gin.c',
+    'trgm_gist.c',
+    'trgm_op.c',
+    'trgm_regexp.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_trgm
+
+install_data(
+  'pg_trgm--1.0--1.1.sql',
+  'pg_trgm--1.1--1.2.sql',
+  'pg_trgm--1.2--1.3.sql',
+  'pg_trgm--1.3--1.4.sql',
+  'pg_trgm--1.3.sql',
+  'pg_trgm--1.4--1.5.sql',
+  'pg_trgm--1.5--1.6.sql',
+  'pg_trgm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_trgm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_trgm',
+      'pg_word_trgm',
+      'pg_strict_word_trgm',
+    ],
+  },
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..933dc99ac4d
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,26 @@
+pg_visibility = shared_module('pg_visibility',
+  files(
+    'pg_visibility.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_visibility
+
+install_data(
+  'pg_visibility--1.0--1.1.sql',
+  'pg_visibility--1.1--1.2.sql',
+  'pg_visibility--1.1.sql',
+  'pg_visibility.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_visibility',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_visibility',
+    ],
+  },
+}
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
new file mode 100644
index 00000000000..d6b27877dd0
--- /dev/null
+++ b/contrib/pg_walinspect/meson.build
@@ -0,0 +1,27 @@
+pg_walinspect_sources = files('pg_walinspect.c')
+
+pg_walinspect = shared_module('pg_walinspect',
+  pg_walinspect_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+contrib_targets += pg_walinspect
+
+install_data(
+  'pg_walinspect.control',
+  'pg_walinspect--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_walinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_walinspect',
+    ],
+    'regress_args': ['--temp-config', files('walinspect.conf')],
+  },
+}
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
new file mode 100644
index 00000000000..fe0851bf8e8
--- /dev/null
+++ b/contrib/pgcrypto/meson.build
@@ -0,0 +1,100 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+pgcrypto_sources = files(
+  'crypt-blowfish.c',
+  'crypt-des.c',
+  'crypt-gensalt.c',
+  'crypt-md5.c',
+  'mbuf.c',
+  'pgcrypto.c',
+  'pgp-armor.c',
+  'pgp-cfb.c',
+  'pgp-compress.c',
+  'pgp-decrypt.c',
+  'pgp-encrypt.c',
+  'pgp-info.c',
+  'pgp-mpi.c',
+  'pgp-pgsql.c',
+  'pgp-pubdec.c',
+  'pgp-pubenc.c',
+  'pgp-pubkey.c',
+  'pgp-s2k.c',
+  'pgp.c',
+  'px-crypt.c',
+  'px-hmac.c',
+  'px.c',
+)
+
+pgcrypto_regress = [
+  'init',
+  'md5',
+  'sha1',
+  'hmac-md5',
+  'hmac-sha1',
+  'blowfish',
+  'rijndael',
+  'sha2',
+  'des',
+  '3des',
+  'cast5',
+  'crypt-des',
+  'crypt-md5',
+  'crypt-blowfish',
+  'crypt-xdes',
+  'pgp-armor',
+  'pgp-decrypt',
+  'pgp-encrypt',
+  'pgp-pubkey-decrypt',
+  'pgp-pubkey-encrypt',
+  'pgp-info',
+]
+
+pgcrypto_openssl_sources = files(
+  'openssl.c',
+  'pgp-mpi-openssl.c',
+)
+
+pgcrypto_deps = []
+pgcrypto_link_with = []
+
+pgcrypto_deps += ssl
+pgcrypto_sources += pgcrypto_openssl_sources
+
+if zlib.found()
+  pgcrypto_deps += zlib
+  pgcrypto_regress += 'pgp-compression'
+else
+  pgcrypto_regress += 'pgp-zlib-DISABLED'
+endif
+
+pgcrypto = shared_module('pgcrypto',
+  pgcrypto_sources,
+  link_with: pgcrypto_link_with,
+  kwargs: contrib_mod_args + {
+    'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
+  },
+)
+contrib_targets += pgcrypto
+
+install_data(
+  'pgcrypto--1.0--1.1.sql',
+  'pgcrypto--1.1--1.2.sql',
+  'pgcrypto--1.2--1.3.sql',
+  'pgcrypto--1.3.sql',
+  'pgcrypto.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgcrypto',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      pgcrypto_regress,
+    ],
+  },
+}
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
new file mode 100644
index 00000000000..1b41691a2a3
--- /dev/null
+++ b/contrib/pgrowlocks/meson.build
@@ -0,0 +1,27 @@
+pgrowlocks = shared_module('pgrowlocks',
+  files(
+    'pgrowlocks.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pgrowlocks
+
+install_data(
+  'pgrowlocks--1.0--1.1.sql',
+  'pgrowlocks--1.1--1.2.sql',
+  'pgrowlocks--1.2.sql',
+  'pgrowlocks.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pgrowlocks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'pgrowlocks',
+    ],
+    'regress_args': ['--load-extension=pgrowlocks'],
+  },
+}
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
new file mode 100644
index 00000000000..8e828692d5c
--- /dev/null
+++ b/contrib/pgstattuple/meson.build
@@ -0,0 +1,31 @@
+pgstattuple = shared_module('pgstattuple',
+  files(
+    'pgstatapprox.c',
+    'pgstatindex.c',
+    'pgstattuple.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pgstattuple
+
+install_data(
+  'pgstattuple--1.0--1.1.sql',
+  'pgstattuple--1.1--1.2.sql',
+  'pgstattuple--1.2--1.3.sql',
+  'pgstattuple--1.3--1.4.sql',
+  'pgstattuple--1.4--1.5.sql',
+  'pgstattuple--1.4.sql',
+  'pgstattuple.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pgstattuple',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pgstattuple',
+    ],
+  },
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..378885ec93b
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,34 @@
+postgres_fdw_sources = files(
+  'connection.c',
+  'deparse.c',
+  'option.c',
+  'postgres_fdw.c',
+  'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'] + [libpq],
+  },
+)
+contrib_targets += postgres_fdw
+
+install_data(
+  'postgres_fdw.control',
+  'postgres_fdw--1.0.sql',
+  'postgres_fdw--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'postgres_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'postgres_fdw',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
new file mode 100644
index 00000000000..e476eab2a77
--- /dev/null
+++ b/contrib/seg/meson.build
@@ -0,0 +1,51 @@
+seg_sources = files(
+  'seg.c',
+)
+
+seg_scan = custom_target('segscan',
+  input: 'segscan.l',
+  output: 'segscan.c',
+  command: flex_cmd,
+)
+generated_sources += seg_scan
+seg_sources += seg_scan
+
+seg_parse = custom_target('segparse',
+  input: 'segparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += seg_parse.to_list()
+seg_sources += seg_parse
+
+seg = shared_module('seg',
+  seg_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += seg
+
+install_data(
+  'seg.control',
+  'seg--1.0--1.1.sql',
+  'seg--1.1--1.2.sql',
+  'seg--1.1.sql',
+  'seg--1.2--1.3.sql',
+  'seg--1.3--1.4.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'segdata.h',
+  install_dir: dir_include_extension / 'seg',
+)
+
+tests += {
+  'name': 'seg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'seg',
+    ],
+  },
+}
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
new file mode 100644
index 00000000000..60a95e17c2f
--- /dev/null
+++ b/contrib/sepgsql/meson.build
@@ -0,0 +1,34 @@
+if not selinux.found()
+  subdir_done()
+endif
+
+sepgsql_sources = files(
+  'database.c',
+  'dml.c',
+  'hooks.c',
+  'label.c',
+  'proc.c',
+  'relation.c',
+  'schema.c',
+  'selinux.c',
+  'uavc.c',
+)
+
+sepgsql = shared_module('sepgsql',
+  sepgsql_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': [selinux, contrib_mod_args['dependencies']],
+  }
+)
+contrib_targets += sepgsql
+
+custom_target('sepgsql.sql',
+  input: 'sepgsql.sql.in',
+  output: 'sepgsql.sql',
+  command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'],
+  capture: true,
+  install: true,
+  install_dir: contrib_data_args['install_dir'],
+)
+
+# TODO: implement sepgsql tests
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..98008980ec2
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,50 @@
+autoinc = shared_module('autoinc',
+  ['autoinc.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += autoinc
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+  ['insert_username.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += insert_username
+
+install_data(
+  'insert_username.control',
+  'insert_username--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+moddatetime = shared_module('moddatetime',
+  ['moddatetime.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += moddatetime
+
+install_data(
+  'moddatetime.control',
+  'moddatetime--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+  ['refint.c'],
+  c_args: refint_cflags,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += refint
+
+install_data('refint.control', 'refint--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
new file mode 100644
index 00000000000..53f752a08ac
--- /dev/null
+++ b/contrib/sslinfo/meson.build
@@ -0,0 +1,21 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+sslinfo = shared_module('sslinfo',
+  files(
+    'sslinfo.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [ssl, contrib_mod_args['dependencies']],
+  }
+)
+contrib_targets += sslinfo
+
+install_data(
+  'sslinfo--1.0--1.1.sql',
+  'sslinfo--1.1--1.2.sql',
+  'sslinfo--1.2.sql',
+  'sslinfo.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
new file mode 100644
index 00000000000..f4230096c0c
--- /dev/null
+++ b/contrib/tablefunc/meson.build
@@ -0,0 +1,24 @@
+tablefunc = shared_module('tablefunc',
+  files(
+    'tablefunc.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tablefunc
+
+install_data(
+  'tablefunc--1.0.sql',
+  'tablefunc.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tablefunc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tablefunc',
+    ],
+  },
+}
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
new file mode 100644
index 00000000000..c3a025247d4
--- /dev/null
+++ b/contrib/tcn/meson.build
@@ -0,0 +1,25 @@
+tcn = shared_module('tcn',
+  files(
+    'tcn.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tcn
+
+install_data(
+  'tcn--1.0.sql',
+  'tcn.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tcn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'tcn',
+    ],
+    'regress_args': ['--load-extension=tcn'],
+  },
+}
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..dd7cb0101ad
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,63 @@
+test_decoding_sources = files(
+  'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+  test_decoding_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += test_decoding
+
+tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ddl',
+      'xact',
+      'rewrite',
+      'toast',
+      'permissions',
+      'decoding_in_xact',
+      'decoding_into_rel',
+      'binary',
+      'prepared',
+      'replorigin',
+      'time',
+      'messages',
+      'spill',
+      'slot',
+      'truncate',
+      'stream',
+      'stats',
+      'twophase',
+      'twophase_stream',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'isolation': {
+    'specs': [
+      'mxact',
+      'delayed_startup',
+      'ondisk_startup',
+      'concurrent_ddl_dml',
+      'oldest_xmin',
+      'snapshot_transfer',
+      'subxact_without_top',
+      'concurrent_stream',
+      'twophase_snapshot',
+      'slot_creation_error',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_repl_stats.pl',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..b9cd42115a8
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,24 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+  files(
+    'tsm_system_rows.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tsm_system_rows
+
+install_data(
+  'tsm_system_rows--1.0.sql',
+  'tsm_system_rows.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_rows',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_rows',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..18015912ffb
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,24 @@
+tsm_system_time = shared_module('tsm_system_time',
+  files(
+    'tsm_system_time.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tsm_system_time
+
+install_data(
+  'tsm_system_time--1.0.sql',
+  'tsm_system_time.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_time',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_time',
+    ],
+  },
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..872b76e3223
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,32 @@
+unaccent = shared_module('unaccent',
+  files(
+    'unaccent.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += unaccent
+
+install_data(
+  'unaccent--1.0--1.1.sql',
+  'unaccent--1.1.sql',
+  'unaccent.control',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'unaccent.rules',
+  install_dir: dir_data / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+tests += {
+  'name': 'unaccent',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'unaccent',
+    ],
+    'regress_args': ['--encoding=UTF8'],
+  },
+}
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
new file mode 100644
index 00000000000..da6d1d75c12
--- /dev/null
+++ b/contrib/uuid-ossp/meson.build
@@ -0,0 +1,31 @@
+if not uuid.found()
+  subdir_done()
+endif
+
+uuid_ossp = shared_module('uuid-ossp',
+  files(
+    'uuid-ossp.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [uuid, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += uuid_ossp
+
+install_data(
+  'uuid-ossp--1.0--1.1.sql',
+  'uuid-ossp--1.1.sql',
+  'uuid-ossp.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'uuid-ossp',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'uuid_ossp',
+    ],
+  },
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..7a632b87d1b
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,17 @@
+vacuumlo = executable('vacuumlo',
+  ['vacuumlo.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+contrib_targets += vacuumlo
+
+tests += {
+  'name': 'vacuumlo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..9c0b56f01f6
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,32 @@
+if not libxml.found()
+  subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+  files(
+    'xpath.c',
+    'xslt_proc.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += xml2
+
+install_data(
+  'xml2--1.0--1.1.sql',
+  'xml2--1.1.sql',
+  'xml2.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'xml2',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'xml2',
+    ],
+  },
+}
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
new file mode 100644
index 00000000000..5887cb92b52
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -0,0 +1,22 @@
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_compat = both_libraries('libecpg_compat',
+  'informix.c',
+  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
+  dependencies: [frontend_code, thread_dep],
+  link_with: [ecpglib, ecpg_pgtypes],
+  soversion: host_system != 'windows' ? '3' : '',
+  darwin_versions: ['3', '3.' + pg_version_major.to_string()],
+  version: '3.' + pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+ecpg_targets += [ecpg_compat.get_shared_lib(), ecpg_compat.get_static_lib()]
+
+pkgconfig.generate(
+  ecpg_compat.get_shared_lib(),
+  description: 'PostgreSQL libecpg_compat library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
new file mode 100644
index 00000000000..2da029ec8ea
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -0,0 +1,37 @@
+ecpglib_sources = files(
+  'connect.c',
+  'data.c',
+  'descriptor.c',
+  'error.c',
+  'execute.c',
+  'memory.c',
+  'misc.c',
+  'prepare.c',
+  'sqlda.c',
+  'typename.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpglib = both_libraries('libecpg',
+  ecpglib_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=6'],
+  dependencies: [frontend_code, libpq, thread_dep],
+  link_with: [ecpg_pgtypes],
+  soversion: host_system != 'windows' ? '6' : '',
+  darwin_versions: ['6', '6.' + pg_version_major.to_string()],
+  version: '6.' + pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+ecpg_targets += [ecpglib.get_shared_lib(), ecpglib.get_static_lib()]
+
+pkgconfig.generate(
+  ecpglib.get_shared_lib(),
+  description: 'PostgreSQL libecpg library',
+  url: pg_url,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build
new file mode 100644
index 00000000000..246e399ebd3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build
new file mode 100644
index 00000000000..c95d0455b9a
--- /dev/null
+++ b/src/interfaces/ecpg/include/meson.build
@@ -0,0 +1,51 @@
+ecpg_inc = include_directories('.')
+
+ecpg_conf_keys = [
+  'ENABLE_THREAD_SAFETY',
+  'HAVE_INT64',
+  'HAVE_LONG_INT_64',
+  'HAVE_LONG_LONG_INT_64',
+  'PG_USE_STDBOOL',
+]
+
+ecpg_conf_data = configuration_data()
+
+foreach key : ecpg_conf_keys
+  if cdata.has(key)
+    ecpg_conf_data.set(key, cdata.get(key))
+  endif
+endforeach
+
+ecpg_config_h = configure_file(
+  output: 'ecpg_config.h',
+  configuration: ecpg_conf_data,
+  install_dir: dir_include,
+)
+configure_files += ecpg_config_h
+
+generated_sources_ac += {'src/interfaces/ecpg/include': ['stamp-h']}
+
+install_headers(
+  'ecpg_informix.h',
+  'ecpgerrno.h',
+  'ecpglib.h',
+  'ecpgtype.h',
+  'pgtypes.h',
+  'pgtypes_date.h',
+  'pgtypes_error.h',
+  'pgtypes_interval.h',
+  'pgtypes_numeric.h',
+  'pgtypes_timestamp.h',
+  'sql3types.h',
+  'sqlca.h',
+  'sqlda.h',
+  'sqlda-compat.h',
+  'sqlda-native.h',
+)
+
+install_headers(
+  'datetime.h',
+  'decimal.h',
+  'sqltypes.h',
+  install_dir: dir_include_pkg / 'informix' / 'esql',
+)
diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build
new file mode 100644
index 00000000000..f079b42269f
--- /dev/null
+++ b/src/interfaces/ecpg/meson.build
@@ -0,0 +1,9 @@
+ecpg_targets = []
+
+subdir('include')
+subdir('pgtypeslib')
+subdir('ecpglib')
+subdir('compatlib')
+subdir('preproc')
+
+alias_target('ecpg', ecpg_targets)
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
new file mode 100644
index 00000000000..96489d9f1d7
--- /dev/null
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -0,0 +1,30 @@
+ecpg_pgtypes_sources = files(
+  'common.c',
+  'datetime.c',
+  'dt_common.c',
+  'interval.c',
+  'numeric.c',
+  'timestamp.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_pgtypes = both_libraries('libpgtypes',
+  ecpg_pgtypes_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
+  dependencies: [frontend_code],
+  version: '3.' + pg_version_major.to_string(),
+  soversion: host_system != 'windows' ? '3' : '',
+  darwin_versions: ['3', '3.' + pg_version_major.to_string()],
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+ecpg_targets += [ecpg_pgtypes.get_shared_lib(), ecpg_pgtypes.get_static_lib()]
+
+pkgconfig.generate(
+  ecpg_pgtypes.get_shared_lib(),
+  description: 'PostgreSQL libpgtypes library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
new file mode 100644
index 00000000000..08956bbdbb6
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -0,0 +1,103 @@
+ecpg_sources = files(
+  '../ecpglib/typename.c',
+  'c_keywords.c',
+  'descriptor.c',
+  'ecpg.c',
+  'ecpg_keywords.c',
+  'keywords.c',
+  'output.c',
+  'parser.c',
+  'type.c',
+  'variable.c',
+)
+
+pgc = custom_target('pgc.c',
+  input: 'pgc.l',
+  output: 'pgc.c',
+  command: flex_cmd,
+)
+generated_sources += pgc
+ecpg_sources += pgc
+
+ecpg_files = [
+  'ecpg.addons',
+  'ecpg.header',
+  'ecpg.tokens',
+  'ecpg.trailer',
+  'ecpg.type',
+]
+
+preproc_y = custom_target('preproc.y',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: ['preproc.y'],
+  command: [
+    perl, files('parse.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--output', '@OUTPUT0@',
+  ],
+)
+generated_sources += preproc_y
+
+check_rules = custom_target('preproc.y.check_rules',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: 'preproc.y.check_rules',
+  command: [
+    perl, files('check_rules.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--stamp', '@OUTPUT0@',
+  ],
+)
+
+preproc = custom_target('preproc.c',
+  input: preproc_y,
+  kwargs: bison_kw,
+)
+generated_sources += preproc.to_list()
+ecpg_sources += preproc
+
+c_kwlist = custom_target('c_kwlist_d.h',
+  input: ['c_kwlist.h'],
+  output: ['c_kwlist_d.h'],
+  command: [
+    perl,
+    '-I', '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanCKeywords',
+    '--no-case-fold', '@INPUT0@',
+  ],
+)
+generated_sources += c_kwlist
+ecpg_sources += c_kwlist
+
+ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
+  input: ['ecpg_kwlist.h'],
+  output: ['ecpg_kwlist_d.h'],
+  command: [
+    perl, '-I',
+    '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanECPGKeywords', '@INPUT0@',
+  ]
+)
+generated_sources += ecpg_kwlist
+ecpg_sources += ecpg_kwlist
+
+ecpg_exe = executable('ecpg',
+  ecpg_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+ecpg_targets += ecpg_exe
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build
new file mode 100644
index 00000000000..d73b05afd5e
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpg-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/test/compat_informix/meson.build b/src/interfaces/ecpg/test/compat_informix/meson.build
new file mode 100644
index 00000000000..6bb0d980761
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_informix/meson.build
@@ -0,0 +1,31 @@
+pgc_files = [
+  'charfuncs',
+  'dec_test',
+  'describe',
+  'rfmtdate',
+  'rfmtlong',
+  'rnull',
+  'sqlda',
+  'test_informix',
+  'test_informix2',
+]
+
+pgc_extra_flags = {
+  'rnull': ['-r', 'no_indicator',],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'INFORMIX',] +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/compat_oracle/meson.build b/src/interfaces/ecpg/test/compat_oracle/meson.build
new file mode 100644
index 00000000000..2e8794ba386
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_oracle/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+  'char_array',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'ORACLE',] +
+      ecpg_preproc_test_command_end,
+    install: false,
+    build_by_default: false,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/connect/meson.build b/src/interfaces/ecpg/test/connect/meson.build
new file mode 100644
index 00000000000..0b1c3593146
--- /dev/null
+++ b/src/interfaces/ecpg/test/connect/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+  'test1',
+  'test2',
+  'test3',
+  'test4',
+  'test5',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start + ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
new file mode 100644
index 00000000000..bd2489f2bb1
--- /dev/null
+++ b/src/interfaces/ecpg/test/meson.build
@@ -0,0 +1,79 @@
+pg_regress_ecpg_sources = pg_regress_c + files(
+  'pg_regress_ecpg.c',
+)
+
+pg_regress_ecpg = executable('pg_regress_ecpg',
+  pg_regress_ecpg_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc, include_directories('.')],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+testprep_targets += pg_regress_ecpg
+
+# create .c files and executables from .pgc files
+ecpg_test_exec_kw = {
+  'dependencies': [frontend_code, libpq],
+  'include_directories': [ecpg_inc],
+  'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+  'build_by_default': false,
+  'install': false,
+}
+
+ecpg_preproc_kw = {
+  'output': '@BASENAME@.c',
+  'install': false,
+  'build_by_default': false,
+}
+
+ecpg_preproc_test_command_start = [
+  ecpg_exe,
+  '--regression',
+  '-I@CURRENT_SOURCE_DIR@',
+  '-I@SOURCE_ROOT@' + '/src/interfaces/ecpg/include/',
+]
+ecpg_preproc_test_command_end = [
+  '-o', '@OUTPUT@', '@INPUT@'
+]
+
+ecpg_test_dependencies = []
+
+subdir('compat_informix')
+subdir('compat_oracle')
+subdir('connect')
+subdir('pgtypeslib')
+subdir('preproc')
+subdir('sql')
+subdir('thread')
+
+testprep_targets += ecpg_test_dependencies
+
+ecpg_test_files = files(
+  'ecpg_schedule',
+)
+
+ecpg_regress_args = [
+  '--dbname=ecpg1_regression,ecpg2_regression',
+  '--create-role=regress_ecpg_user1,regress_ecpg_user2',
+  '--encoding=SQL_ASCII',
+]
+
+tests += {
+  'name': 'ecpg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'ecpg': {
+    'expecteddir': meson.current_source_dir(),
+    'inputdir': meson.current_build_dir(),
+    'schedule': ecpg_test_files,
+    'sql': [
+      'sql/twophase',
+    ],
+    'test_kwargs': {
+      'depends': meson.is_cross_build() ? [] : ecpg_test_dependencies,
+    },
+    'regress_args': ecpg_regress_args,
+  },
+}
diff --git a/src/interfaces/ecpg/test/pgtypeslib/meson.build b/src/interfaces/ecpg/test/pgtypeslib/meson.build
new file mode 100644
index 00000000000..2957f12abfc
--- /dev/null
+++ b/src/interfaces/ecpg/test/pgtypeslib/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'dt_test',
+  'dt_test2',
+  'num_test',
+  'num_test2',
+  'nan_test',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/preproc/meson.build b/src/interfaces/ecpg/test/preproc/meson.build
new file mode 100644
index 00000000000..0608df2f2a2
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/meson.build
@@ -0,0 +1,37 @@
+pgc_files = [
+  'array_of_struct',
+  'autoprep',
+  'comment',
+  'cursor',
+  'define',
+  'init',
+  'outofscope',
+  'pointer_to_struct',
+  'strings',
+  'type',
+  'variable',
+  'whenever',
+  'whenever_do_continue',
+]
+
+pgc_extra_flags = {
+  'array_of_struct': ['-c'],
+  'pointer_to_struct': ['-c'],
+  'autoprep': ['-r', 'prepare'],
+  'strings': ['-i'],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/sql/meson.build b/src/interfaces/ecpg/test/sql/meson.build
new file mode 100644
index 00000000000..bec7d4ed8f6
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/meson.build
@@ -0,0 +1,46 @@
+pgc_files = [
+  'array',
+  'binary',
+  'bytea',
+  'code100',
+  'copystdout',
+  'createtableas',
+  'declare',
+  'define',
+  'desc',
+  'describe',
+  'dynalloc',
+  'dynalloc2',
+  'dyntest',
+  'execute',
+  'fetch',
+  'func',
+  'indicators',
+  'insupd',
+  'oldexec',
+  'parser',
+  'prepareas',
+  'quote',
+  'show',
+  'sqlda',
+  'twophase',
+]
+
+pgc_extra_flags = {
+  'oldexec': ['-r', 'questionmarks'],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/thread/meson.build b/src/interfaces/ecpg/test/thread/meson.build
new file mode 100644
index 00000000000..2f1629e266b
--- /dev/null
+++ b/src/interfaces/ecpg/test/thread/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'thread_implicit',
+  'thread',
+  'prep',
+  'descriptor',
+  'alloc',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw + {'dependencies': [frontend_code, libpq, thread_dep,]},
+  )
+endforeach
diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build
new file mode 100644
index 00000000000..73fffbee394
--- /dev/null
+++ b/src/interfaces/meson.build
@@ -0,0 +1,2 @@
+# NB: libpq is entered directly from the toplevel meson file
+subdir('ecpg')
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
new file mode 100644
index 00000000000..32b90f4f8c6
--- /dev/null
+++ b/doc/src/sgml/meson.build
@@ -0,0 +1,252 @@
+docs = []
+alldocs = []
+doc_generated = []
+
+xmllint = find_program(get_option('XMLLINT'), native: true, required: false)
+
+
+version_sgml = configure_file(
+  input: 'version.sgml.in',
+  output: 'version.sgml',
+  configuration: cdata,
+)
+configure_files += version_sgml
+
+doc_generated += custom_target('features-supported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt',
+  ),
+  output: 'features-supported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'YES', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+doc_generated += custom_target('features-unsupported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt',
+  ),
+  output: 'features-unsupported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'NO', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+doc_generated += custom_target('errcodes-table.sgml',
+  input: files(
+    '../../../src/backend/utils/errcodes.txt'),
+  output: 'errcodes-table.sgml',
+  command: [perl, files('generate-errcodes-table.pl'), '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+# FIXME: this actually has further inputs, adding depfile support to
+# generate-keywords-table.pl is probably the best way to address that
+# robustly.
+doc_generated += custom_target('keywords-table.sgml',
+  input: files(
+    '../../../src/include/parser/kwlist.h'),
+  output: 'keywords-table.sgml',
+  command: [perl, files('generate-keywords-table.pl'), '@CURRENT_SOURCE_DIR@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+# For everything else we need at least xmllint
+if not xmllint.found()
+  subdir_done()
+endif
+
+pandoc = find_program('pandoc', native: true, required: false)
+xsltproc = find_program(get_option('XSLTPROC'), native: true, required: false)
+fop = find_program('fop', native: true, required: false)
+
+# Compute validity just once
+# Run validation only once, common to all subsequent targets.  While
+# we're at it, also resolve all entities (that is, copy all included
+# files into one big file).  This helps tools that don't understand
+# vpath builds (such as dbtoepub).
+postgres_full_xml = custom_target('postgres-full.xml',
+  input: 'postgres.sgml',
+  output: 'postgres-full.xml',
+  command: [xmllint, '--noent', '--valid', '--path', '@OUTDIR@', '-o', '@OUTPUT@', '@INPUT@'],
+  depends: doc_generated,
+  build_by_default: true,
+)
+
+#
+# Full documentation as html, text
+#
+if xsltproc.found()
+  xsltproc_flags = [
+    '--stringparam', 'pg.version', pg_version,
+    '--param', 'website.stylesheet', '1'
+  ]
+
+
+  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
+  # depfile
+  html = custom_target('html',
+    input: ['stylesheet.xsl', postgres_full_xml],
+    output: 'html',
+    depends: doc_generated,
+    command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html
+
+  # build multi-page html docs as part of docs target
+  docs += html
+
+  html_help = custom_target('html_help',
+    input: ['stylesheet-hh.xsl', postgres_full_xml],
+    output: 'htmlhelp',
+    depends: doc_generated,
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html_help
+
+
+  # single-page HTML
+  postgres_html = custom_target('postgres.html',
+    input: ['stylesheet-html-nochunk.xsl', postgres_full_xml],
+    output: 'postgres.html',
+    depends: doc_generated,
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_html
+
+  # single-page text
+  if pandoc.found()
+    postgres_txt = custom_target('postgres.txt',
+      input: [postgres_html],
+      output: 'postgres.txt',
+      depends: doc_generated,
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+endif
+
+
+#
+# INSTALL in html, text
+#
+if xsltproc.found()
+  install_xml = custom_target('INSTALL.xml',
+    input: ['standalone-profile.xsl', 'standalone-install.xml'],
+    output: 'INSTALL.xml',
+    depends: doc_generated + [postgres_full_xml],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+    build_by_default: false,
+  )
+  install_html = custom_target('INSTALL.html',
+    input: ['stylesheet-text.xsl', install_xml],
+    output: 'INSTALL.html',
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += install_html
+
+  if pandoc.found()
+    # XXX: Makefile does an iconv translit here, but unclear why?
+    install = custom_target('INSTALL',
+      input: [install_html],
+      output: 'INSTALL',
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += install
+  endif
+
+endif
+
+
+#
+# Man pages
+#
+if xsltproc.found()
+  # FIXME: implement / consider sqlmansectnum logic
+  man = custom_target('man',
+    input: ['stylesheet-man.xsl', postgres_full_xml],
+    output: ['man1', 'man3', 'man7'],
+    depends: doc_generated,
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+
+  # build by default as part of docs target
+  docs += man
+endif
+
+
+#
+# Full documentation as PDF
+#
+if fop.found() and xsltproc.found()
+  xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
+
+  foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
+    postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+    postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
+
+    postgres_x_fo = custom_target(postgres_x_fo_f,
+      input: ['stylesheet-fo.xsl', postgres_full_xml],
+      output: [postgres_x_fo_f],
+      depends: doc_generated,
+      command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
+                '--stringparam', 'paper.type', detail,
+                '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+
+    postgres_x_pdf = custom_target(postgres_x_pdf_f,
+      input: [postgres_x_fo],
+      output: [postgres_x_pdf_f],
+      command: [fop, '-fo', '@INPUT@', '-pdf', '@OUTPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_x_pdf
+  endforeach
+endif
+
+
+#
+# epub
+#
+
+# This was previously implemented using dbtoepub - but that doesn't seem to
+# support running in build != source directory (i.e. VPATH builds already
+# weren't supported).
+if pandoc.found() and xsltproc.found()
+  postgres_epub = custom_target('postgres.epub',
+    input: postgres_full_xml,
+    output: 'postgres.epub',
+    command: [pandoc, '-f', 'docbook', '-t', 'epub', '-o', '@OUTPUT@', '--resource-path=@CURRENT_SOURCE_DIR@',
+              '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_epub
+endif
+
+if docs.length() == 0
+  run_target('docs', command: [missing, 'xsltproc'])
+else
+  alias_target('docs', docs)
+endif
+
+if alldocs.length() == 0
+  run_target('alldocs', command: [missing, 'xsltproc'])
+else
+  alias_target('alldocs', alldocs)
+endif
diff --git a/doc/src/sgml/version.sgml.in b/doc/src/sgml/version.sgml.in
new file mode 100644
index 00000000000..fa5ff343f40
--- /dev/null
+++ b/doc/src/sgml/version.sgml.in
@@ -0,0 +1,2 @@
+<!ENTITY version @PG_VERSION@>
+<!ENTITY majorversion @PG_MAJORVERSION@>
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..2374028cbda
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'authentication',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_password.pl',
+      't/002_saslprep.pl',
+    ],
+  },
+}
diff --git a/src/test/icu/meson.build b/src/test/icu/meson.build
new file mode 100644
index 00000000000..5a4f53f37ff
--- /dev/null
+++ b/src/test/icu/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'icu',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_database.pl',
+    ],
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..c7656fd4609
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,58 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+  'isolation_main.c',
+)
+
+isolationtester_sources = files(
+  'isolationtester.c',
+)
+
+spec_scanner = custom_target('specscanner',
+  input: 'specscanner.l',
+  output: 'specscanner.c',
+  command: flex_cmd,
+)
+isolationtester_sources += spec_scanner
+generated_sources += spec_scanner
+
+spec_parser = custom_target('specparse',
+  input: 'specparse.y',
+  kwargs: bison_kw,
+)
+isolationtester_sources += spec_parser
+generated_sources += spec_parser.to_list()
+
+pg_isolation_regress = executable('pg_isolation_regress',
+  isolation_sources,
+  c_args: pg_regress_cflags,
+  include_directories: pg_regress_inc,
+  dependencies: frontend_code,
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+bin_targets += pg_isolation_regress
+
+isolationtester = executable('isolationtester',
+  isolationtester_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+bin_targets += isolationtester
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'schedule': files('isolation_schedule'),
+    'test_kwargs': {
+      'priority': 40,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..7e2b6733fcc
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,15 @@
+tests += {
+  'name': 'kerberos',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # kerberos tests are slow, start early
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env': {
+      'with_gssapi': gssapi.found() ? 'yes' : 'no',
+      'with_krb_srvnam': 'postgres',
+    },
+  },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..2211bd5e3ec
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'ldap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env': {'with_ldap': ldap.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..241d9d48aa5
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,25 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+  subdir('ssl')
+endif
+
+if ldap.found()
+  subdir('ldap')
+endif
+
+if gssapi.found()
+  subdir('kerberos')
+endif
+
+if icu.found()
+  subdir('icu')
+endif
+
+subdir('perl')
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..58254d093a4
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,16 @@
+tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'summarization-and-inprogress-insertion',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/01_workitems.pl',
+      't/02_wal_consistency.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..60cb12164d2
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,18 @@
+tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'commit_timestamp',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+      't/002_standby.pl',
+      't/003_standby_2.pl',
+      't/004_restart.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..cf4bdaba637
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,18 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+  ['delay_execution.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += delay_execution
+
+tests += {
+  'name': 'delay_execution',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'partition-addition',
+      'partition-removal-1',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..56ff5f48001
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+  ['dummy_index_am.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += dummy_index_am
+
+install_data(
+  'dummy_index_am.control',
+  'dummy_index_am--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_index_am',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'reloptions',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..21b7cf8f353
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+  ['dummy_seclabel.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += dummy_seclabel
+
+install_data(
+  'dummy_seclabel.control',
+  'dummy_seclabel--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_seclabel',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dummy_seclabel',
+    ],
+  },
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..8384b6e3b2a
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,21 @@
+libpq_pipeline = executable('libpq_pipeline',
+  files(
+    'libpq_pipeline.c',
+  ),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  },
+)
+testprep_targets += libpq_pipeline
+
+tests += {
+  'name': 'libpq_pipeline',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_libpq_pipeline.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..a80e6e2ce29
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,27 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_lfind')
+subdir('test_misc')
+subdir('test_oat_hooks')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..45de3f1990d
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+  ['plsample.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += plsample
+
+install_data(
+  'plsample.control',
+  'plsample--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'plsample',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plsample',
+    ],
+  },
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..efd3f1f113b
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,14 @@
+tests += {
+  'name': 'snapshot_too_old',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'test_kwargs': {'priority': 40}, # sto tests are slow, start early
+    'specs': [
+      'sto_using_cursor',
+      'sto_using_select',
+      'sto_using_hash_index',
+    ],
+    'regress_args': ['--temp-config', files('sto.conf')],
+  },
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..857fc7e140e
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+  ['spgist_name_ops.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += spgist_name_ops
+
+install_data(
+  'spgist_name_ops.control',
+  'spgist_name_ops--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'spgist_name_ops',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'spgist_name_ops',
+    ],
+  },
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..62d2c276513
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,48 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+  ['ssl_passphrase_func.c'],
+  kwargs: pg_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  },
+)
+testprep_targets += ssl_passphrase_callback
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+  cert = custom_target('server.crt',
+    output: ['server.crt', 'server.ckey'],
+    command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+      '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+    build_by_default: false,
+    install: false,
+  )
+
+  # needs to agree with what's in the test script
+  pass = 'FooBaR1'
+
+  enccert = custom_target('server.key',
+    input: [cert[1]],
+    output: ['server.key'],
+    command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+  )
+endif
+
+tests += {
+  'name': 'ssl_passphrase_callback',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_testfunc.pl',
+    ],
+    'env': {'with_ssl': 'openssl'},
+  },
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..945eb5a70c4
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+  ['test_bloomfilter.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_bloomfilter
+
+install_data(
+  'test_bloomfilter.control',
+  'test_bloomfilter--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_bloomfilter',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_bloomfilter',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..81ad5adc526
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,43 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+  ['test_ddl_deparse.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_ddl_deparse
+
+install_data(
+  'test_ddl_deparse.control',
+  'test_ddl_deparse--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ddl_deparse',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ddl_deparse',
+      'create_extension',
+      'create_schema',
+      'create_type',
+      'create_conversion',
+      'create_domain',
+      'create_sequence_1',
+      'create_table',
+      'create_transform',
+      'alter_table',
+      'create_view',
+      'create_trigger',
+      'create_rule',
+      'comment_on',
+      'alter_function',
+      'alter_sequence',
+      'alter_ts_config',
+      'alter_type_enum',
+      'opfamily',
+      'defprivs',
+      'matviews',
+    ],
+  },
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..e95a9f2e7eb
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,45 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_ext1--1.0.sql',
+  'test_ext1.control',
+  'test_ext2--1.0.sql',
+  'test_ext2.control',
+  'test_ext3--1.0.sql',
+  'test_ext3.control',
+  'test_ext4--1.0.sql',
+  'test_ext4.control',
+  'test_ext5--1.0.sql',
+  'test_ext5.control',
+  'test_ext6--1.0.sql',
+  'test_ext6.control',
+  'test_ext7--1.0--2.0.sql',
+  'test_ext7--1.0.sql',
+  'test_ext7.control',
+  'test_ext8--1.0.sql',
+  'test_ext8.control',
+  'test_ext_cine--1.0.sql',
+  'test_ext_cine--1.0--1.1.sql',
+  'test_ext_cine.control',
+  'test_ext_cor--1.0.sql',
+  'test_ext_cor.control',
+  'test_ext_cyclic1--1.0.sql',
+  'test_ext_cyclic1.control',
+  'test_ext_cyclic2--1.0.sql',
+  'test_ext_cyclic2.control',
+  'test_ext_evttrig--1.0--2.0.sql',
+  'test_ext_evttrig--1.0.sql',
+  'test_ext_evttrig.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_extensions',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_extensions',
+      'test_extdepend',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..abf0a3b0430
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+  ['test_ginpostinglist.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_ginpostinglist
+
+install_data(
+  'test_ginpostinglist.control',
+  'test_ginpostinglist--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ginpostinglist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ginpostinglist',
+    ],
+  },
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..c32c469c69a
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+  ['test_integerset.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_integerset
+
+install_data(
+  'test_integerset.control',
+  'test_integerset--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_integerset',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_integerset',
+    ],
+  },
+}
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
new file mode 100644
index 00000000000..a388de1156a
--- /dev/null
+++ b/src/test/modules/test_lfind/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_lfind = shared_module('test_lfind',
+  ['test_lfind.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_lfind
+
+install_data(
+  'test_lfind.control',
+  'test_lfind--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_lfind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_lfind',
+    ],
+  },
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..cfc830ff399
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,12 @@
+tests += {
+  'name': 'test_misc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_constraint_validation.pl',
+      't/002_tablespace.pl',
+      't/003_check_guc.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
new file mode 100644
index 00000000000..5faf0459777
--- /dev/null
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -0,0 +1,18 @@
+# FIXME: prevent install during main install, but not during test :/
+test_oat_hooks = shared_module('test_oat_hooks',
+  ['test_oat_hooks.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_oat_hooks
+
+tests += {
+  'name': 'test_oat_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_oat_hooks',
+    ],
+    'regress_args': ['--no-locale', '--encoding=UTF8'],
+  },
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..b59960f615e
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+  ['test_parser.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_parser
+
+install_data(
+  'test_parser.control',
+  'test_parser--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_parser',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_parser',
+    ],
+  },
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..41021829f3a
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_pg_dump.control',
+  'test_pg_dump--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_pg_dump',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..1cfa84b3609
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+  ['test_predtest.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_predtest
+
+install_data(
+  'test_predtest.control',
+  'test_predtest--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_predtest',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_predtest',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..34cbc3e1624
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+  ['test_rbtree.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_rbtree
+
+install_data(
+  'test_rbtree.control',
+  'test_rbtree--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_rbtree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rbtree',
+    ],
+  },
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..867a64e57c3
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,24 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+  ['test_regex.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_regex
+
+install_data(
+  'test_regex.control',
+  'test_regex--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_regex',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_regex',
+      'test_regex_utf8',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..80d8adda332
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+  ['test_rls_hooks.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_rls_hooks
+
+tests += {
+  'name': 'test_rls_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rls_hooks',
+    ],
+  },
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..b663543d616
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,27 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+  files(
+    'setup.c',
+    'test.c',
+    'worker.c',
+  ),
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_shm_mq
+
+install_data(
+  'test_shm_mq.control',
+  'test_shm_mq--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_shm_mq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_shm_mq',
+    ],
+  },
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..d69b0e7ce44
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'unsafe_tests',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'rolenames',
+      'alter_system_table',
+    ],
+  },
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..32acad883b2
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,26 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+  files(
+    'worker_spi.c',
+  ),
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_worker_spi
+
+install_data(
+  'worker_spi.control',
+  'worker_spi--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'worker_spi',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'worker_spi',
+    ],
+    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+  },
+}
diff --git a/src/test/perl/meson.build b/src/test/perl/meson.build
new file mode 100644
index 00000000000..901bae7a564
--- /dev/null
+++ b/src/test/perl/meson.build
@@ -0,0 +1,12 @@
+# could use install_data's preserve_path option in >=0.64.0
+
+install_data(
+  'PostgreSQL/Version.pm',
+  install_dir: dir_pgxs / 'src/test/perl/PostgreSQL')
+
+install_data(
+  'PostgreSQL/Test/Utils.pm',
+  'PostgreSQL/Test/SimpleTee.pm',
+  'PostgreSQL/Test/RecursiveCopy.pm',
+  'PostgreSQL/Test/Cluster.pm',
+  install_dir: dir_pgxs / 'src/test/perl/PostgreSQL/Test')
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..b0e398363f7
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,43 @@
+tests += {
+  'name': 'recovery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # recovery tests are slow, start early
+    'tests': [
+      't/001_stream_rep.pl',
+      't/002_archiving.pl',
+      't/003_recovery_targets.pl',
+      't/004_timeline_switch.pl',
+      't/005_replay_delay.pl',
+      't/006_logical_decoding.pl',
+      't/007_sync_rep.pl',
+      't/008_fsm_truncation.pl',
+      't/009_twophase.pl',
+      't/010_logical_decoding_timelines.pl',
+      't/011_crash_recovery.pl',
+      't/012_subtransactions.pl',
+      't/013_crash_restart.pl',
+      't/014_unlogged_reinit.pl',
+      't/015_promotion_pages.pl',
+      't/016_min_consistency.pl',
+      't/017_shm.pl',
+      't/018_wal_optimize.pl',
+      't/019_replslot_limit.pl',
+      't/020_archive_status.pl',
+      't/021_row_visibility.pl',
+      't/022_crash_temp_files.pl',
+      't/023_pitr_prepared_xact.pl',
+      't/024_archive_recovery.pl',
+      't/025_stuck_on_old_timeline.pl',
+      't/026_overwrite_contrecord.pl',
+      't/027_stream_regress.pl',
+      't/028_pitr_timelines.pl',
+      't/029_stats_restart.pl',
+      't/030_stats_cleanup_replica.pl',
+      't/031_recovery_conflict.pl',
+      't/032_relfilenode_reuse.pl',
+      't/033_replay_tsp_drops.pl',
+    ],
+  },
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..fd8ee995b79
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,62 @@
+# also used by isolationtester and ecpg tests
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+  'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+  regress_sources,
+  c_args: pg_regress_cflags,
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/regress',
+  },
+)
+bin_targets += pg_regress
+
+regress_module = shared_module('regress',
+  ['regress.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+testprep_targets += regress_module
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+autoinc_regress = shared_module('autoinc',
+  ['../../../contrib/spi/autoinc.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+testprep_targets += autoinc_regress
+
+refint_regress = shared_module('refint',
+  ['../../../contrib/spi/refint.c'],
+  c_args: refint_cflags,
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+testprep_targets += refint_regress
+
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'schedule': files('parallel_schedule'),
+    'test_kwargs': {
+      'priority': 50,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..e2f021d884a
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,13 @@
+tests += {
+  'name': 'ssl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_ssl': get_option('ssl')},
+    'tests': [
+      't/001_ssltests.pl',
+      't/002_scram.pl',
+      't/003_sslinfo.pl',
+    ],
+  },
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..85d1dd92951
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,42 @@
+tests += {
+  'name': 'subscription',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_rep_changes.pl',
+      't/002_types.pl',
+      't/003_constraints.pl',
+      't/004_sync.pl',
+      't/005_encoding.pl',
+      't/006_rewrite.pl',
+      't/007_ddl.pl',
+      't/008_diff_schema.pl',
+      't/009_matviews.pl',
+      't/010_truncate.pl',
+      't/011_generated.pl',
+      't/012_collation.pl',
+      't/013_partition.pl',
+      't/014_binary.pl',
+      't/015_stream.pl',
+      't/016_stream_subxact.pl',
+      't/017_stream_ddl.pl',
+      't/018_stream_subxact_abort.pl',
+      't/019_stream_subxact_ddl_abort.pl',
+      't/020_messages.pl',
+      't/021_twophase.pl',
+      't/022_twophase_cascade.pl',
+      't/023_twophase_stream.pl',
+      't/024_add_drop_pub.pl',
+      't/025_rep_changes_for_schema.pl',
+      't/026_stats.pl',
+      't/027_nosuperuser.pl',
+      't/028_row_filter.pl',
+      't/029_on_error.pl',
+      't/030_origin.pl',
+      't/031_column_list.pl',
+      't/100_bugs.pl',
+    ],
+  },
+}
diff --git a/configure b/configure
index aee8a0d3579..d509c264a0b 100755
--- a/configure
+++ b/configure
@@ -20651,3 +20651,9 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/configure.ac b/configure.ac
index 33634ccad9d..b2a93b259f1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2467,3 +2467,9 @@ AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
                   [echo >src/interfaces/ecpg/include/stamp-h])
 
 AC_OUTPUT
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..d5411831e82
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,3027 @@
+# Entry point for building PostgreSQL with meson
+#
+# Good starting points for writing meson.build files are:
+#  - https://mesonbuild.com/Syntax.html
+#  - https://mesonbuild.com/Reference-manual.html
+
+project('postgresql',
+  ['c'],
+  version: '16devel',
+  license: 'PostgreSQL',
+
+  # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for
+  # RHEL 7 has 0.55. < 0.54 would require replacing some uses of the fs
+  # module, < 0.53 all uses of fs. So far there's no need to go to >=0.56.
+  meson_version: '>=0.54',
+  default_options: [
+    'warning_level=1', #-Wall equivalent
+    'buildtype=release',
+  ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+fs = import('fs')
+pkgconfig = import('pkgconfig')
+
+host_system = host_machine.system()
+host_cpu = host_machine.cpu_family()
+
+cc = meson.get_compiler('c')
+
+not_found_dep = dependency('', required: false)
+thread_dep = dependency('threads')
+
+
+
+###############################################################
+# Safety first
+###############################################################
+
+# It's very easy to get into confusing states when the source directory
+# contains an in-place build. E.g. the wrong pg_config.h will be used. So just
+# refuse to build in that case.
+#
+# There's a more elaborate check later, that checks for conflicts around all
+# generated files. But we can only do that much further down the line, so this
+# quick check seems worth it. Adhering to this advice should clean up the
+# conflict, but won't protect against somebody doing make distclean or just
+# removing pg_config.h
+errmsg_nonclean_base = '''
+****
+Non-clean source code directory detected.
+
+To build with meson the source tree may not have an in-place, ./configure
+style, build configured. You can have both meson and ./configure style builds
+for the same source tree by building out-of-source / VPATH with
+configure. Alternatively use a separate check out for meson based builds.
+
+@0@
+****'''
+if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h')
+  errmsg_cleanup = 'To clean up, run make maintainer-clean in the source tree.'
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Variables to be determined
+###############################################################
+
+postgres_inc_d = ['src/include']
+postgres_inc_d += get_option('extra_include_dirs')
+
+postgres_lib_d = get_option('extra_lib_dirs')
+
+cppflags = []
+
+cflags = []
+cxxflags = []
+cflags_warn = []
+cxxflags_warn = []
+cflags_mod = []
+cxxflags_mod = []
+
+ldflags = []
+ldflags_be = []
+ldflags_sl = []
+ldflags_mod = []
+
+test_c_args = []
+
+os_deps = []
+backend_both_deps = []
+backend_deps = []
+libpq_deps = []
+
+pg_sysroot = ''
+
+# source of data for pg_config.h etc
+cdata = configuration_data()
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+  pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+  pg_version_arr = [pg_version.split('beta')[0], '0']
+elif pg_version.contains('rc')
+  pg_version_arr = [pg_version.split('rc')[0], '0']
+else
+  pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+pg_version_num = (pg_version_major * 10000) + pg_version_minor
+
+pg_url = 'https://www.postgresql.org/'
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', pg_url)
+cdata.set_quoted('PACKAGE_VERSION', pg_version)
+cdata.set_quoted('PACKAGE_STRING', 'PostgreSQL @0@'.format(pg_version))
+cdata.set_quoted('PACKAGE_TARNAME', 'postgresql')
+
+pg_version += get_option('extra_version')
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+  pg_version, build_machine.cpu_family(), cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
+cdata.set('PG_VERSION_NUM', pg_version_num)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Basic platform specific configuration
+###############################################################
+
+# meson's system names don't quite map to our "traditional" names. In some
+# places we need the "traditional" name, e.g., for mapping
+# src/include/port/$os.h to src/include/pg_config_os.h. Define portname for
+# that purpose.
+portname = host_system
+
+exesuffix = '' # overridden below where necessary
+dlsuffix = '.so' # overridden below where necessary
+library_path_var = 'LD_LIBRARY_PATH'
+
+# Format of file to control exports from libraries, and how to pass them to
+# the compiler. For export_fmt @0@ is the path to the file export file.
+export_file_format = 'gnu'
+export_file_suffix = 'list'
+export_fmt = '-Wl,--version-script=@0@'
+
+# Flags to add when linking a postgres extension, @0@ is path to
+# the relevant object on the platform.
+mod_link_args_fmt = []
+
+memset_loop_limit = 1024
+
+# Choice of shared memory and semaphore implementation
+shmem_kind = 'sysv'
+sema_kind = 'sysv'
+
+# We implement support for some operating systems by pretending they're
+# another. Map here, before determining system properties below
+if host_system == 'dragonfly'
+  # apparently the most similar
+  host_system = 'netbsd'
+endif
+
+if host_system == 'aix'
+  ld_library_path_var = 'LIBPATH'
+
+  export_file_format = 'aix'
+  export_fmt = '-Wl,-bE:@0@'
+  mod_link_args_fmt = ['-Wl,-bI:@0@']
+  mod_link_with_dir = 'libdir'
+  mod_link_with_name = '@0@.imp'
+
+  # M:SRE sets a flag indicating that an object is a shared library. Seems to
+  # work in some circumstances without, but required in others.
+  ldflags_sl += '-Wl,-bM:SRE'
+  ldflags_be += '-Wl,-brtllib'
+
+  # Native memset() is faster, tested on:
+  # - AIX 5.1 and 5.2, XLC 6.0 (IBM's cc)
+  # - AIX 5.3 ML3, gcc 4.0.1
+  memset_loop_limit = 0
+
+elif host_system == 'cygwin'
+  cppflags += '-D_GNU_SOURCE'
+
+elif host_system == 'darwin'
+  dlsuffix = '.dylib'
+  ld_library_path_var = 'DYLD_LIBRARY_PATH'
+
+  export_file_format = 'darwin'
+  export_fmt = '-exported_symbols_list=@0@'
+
+  mod_link_args_fmt = ['-bundle_loader', '@0@']
+  mod_link_with_dir = 'bindir'
+  mod_link_with_name = '@0@'
+
+  sysroot_args = [files('src/tools/darwin_sysroot'), get_option('darwin_sysroot')]
+  pg_sysroot = run_command(sysroot_args, check:true).stdout().strip()
+  message('darwin sysroot: @0@'.format(pg_sysroot))
+  cflags += ['-isysroot', pg_sysroot]
+  ldflags += ['-isysroot', pg_sysroot]
+
+elif host_system == 'freebsd'
+  sema_kind = 'unnamed_posix'
+
+elif host_system == 'linux'
+  sema_kind = 'unnamed_posix'
+  cppflags += '-D_GNU_SOURCE'
+
+elif host_system == 'netbsd'
+  # We must resolve all dynamic linking in the core server at program start.
+  # Otherwise the postmaster can self-deadlock due to signals interrupting
+  # resolution of calls, since NetBSD's linker takes a lock while doing that
+  # and some postmaster signal handlers do things that will also acquire that
+  # lock.  As long as we need "-z now", might as well specify "-z relro" too.
+  # While there's not a hard reason to adopt these settings for our other
+  # executables, there's also little reason not to, so just add them to
+  # LDFLAGS.
+  ldflags += ['-Wl,-z,now', '-Wl,-z,relro']
+
+elif host_system == 'openbsd'
+  # you're ok
+
+elif host_system == 'sunos'
+  portname = 'solaris'
+  export_fmt = '-Wl,-M@0@'
+  cppflags += '-D_POSIX_PTHREAD_SEMANTICS'
+
+elif host_system == 'windows'
+  portname = 'win32'
+  exesuffix = '.exe'
+  dlsuffix = '.dll'
+  ld_library_path_var = ''
+
+  export_file_format = 'win'
+  export_file_suffix = 'def'
+  if cc.get_id() == 'msvc'
+    export_fmt = '/DEF:@0@'
+    mod_link_with_name = '@0@.exe.lib'
+  else
+    export_fmt = '@0@'
+    mod_link_with_name = 'lib@0@.exe.a'
+  endif
+  mod_link_args_fmt = ['@0@']
+  mod_link_with_dir = 'libdir'
+
+  shmem_kind = 'win32'
+  sema_kind = 'win32'
+
+  cdata.set('WIN32_STACK_RLIMIT', 4194304)
+  if cc.get_id() == 'msvc'
+    ldflags += '/INCREMENTAL:NO'
+    ldflags += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+    # ldflags += '/nxcompat' # generated by msbuild, should have it for ninja?
+  else
+    ldflags += '-Wl,--stack,@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  endif
+
+  os_deps += cc.find_library('ws2_32', required: true)
+  secur32_dep = cc.find_library('secur32', required: true)
+  backend_deps += secur32_dep
+  libpq_deps += secur32_dep
+
+  postgres_inc_d += 'src/include/port/win32'
+  if cc.get_id() == 'msvc'
+    postgres_inc_d += 'src/include/port/win32_msvc'
+  endif
+
+  windows = import('windows')
+
+else
+  # XXX: Should we add an option to override the host_system as an escape
+  # hatch?
+  error('unknown host system: @0@'.format(host_system))
+endif
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true, native: true)
+python = find_program(get_option('PYTHON'), required: true, native: true)
+flex = find_program(get_option('FLEX'), native: true, version: '>= 2.5.31')
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'), native: true)
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
+touch = find_program('touch', native: true)
+program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
+dtrace = find_program(get_option('DTRACE'), native: true, required: get_option('dtrace'))
+missing = find_program('config/missing', native: true)
+
+# used by PGXS
+install_sh = find_program('config/install-sh', native: true)
+
+bison_flags = []
+if bison.found()
+  bison_version_c = run_command(bison, '--version', check: true)
+  # bison version string helpfully is something like
+  # >>bison (GNU bison) 3.8.1<<
+  bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+  if bison_version.version_compare('>=3.0')
+    bison_flags += ['-Wno-deprecated']
+  endif
+endif
+bison_cmd = [bison, bison_flags, '-o', '@OUTPUT0@', '-d', '@INPUT@']
+bison_kw = {
+  'output': ['@BASENAME@.c', '@BASENAME@.h'],
+  'command': bison_cmd,
+}
+
+flex_flags = []
+flex_wrapper = files('src/tools/pgflex')
+flex_cmd = [python, flex_wrapper,
+  '--builddir', '@BUILD_ROOT@',
+  '--srcdir', '@SOURCE_ROOT@',
+  '--privatedir', '@PRIVATE_DIR@',
+  '--flex', flex, '--perl', perl,
+  '-i', '@INPUT@', '-o', '@OUTPUT0@',
+]
+
+wget = find_program('wget', required: false, native: true)
+wget_flags = ['-O', '@OUTPUT0@', '--no-use-server-timestamps']
+
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# NB: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(python, 'src/tools/find_meson', check: true)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+  error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+    meson_binpath_r.returncode(),
+    meson_binpath_r.stdout(),
+    meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+  error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_impl = ''
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+  if i == 0
+    meson_impl = e
+  elif i == 1
+    meson_binpath = e
+  else
+    meson_args += e
+  endif
+  i += 1
+endforeach
+
+if meson_impl not in ['muon', 'meson']
+  error('unknown meson implementation "@0@"'.format(meson_impl))
+endif
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
+
+cdata.set('BLCKSZ', get_option('blocksize').to_int() * 1024, description:
+'''Size of a disk block --- this also limits the size of a tuple. You can set
+   it bigger if you need bigger tuples (although TOAST should reduce the need
+   to have large tuples, since fields can be spread across multiple tuples).
+   BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is
+   currently 2^15 (32768). This is determined by the 15-bit widths of the
+   lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).
+   Changing BLCKSZ requires an initdb.''')
+
+cdata.set('XLOG_BLCKSZ', get_option('wal_blocksize').to_int() * 1024)
+cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
+cdata.set('DEF_PGPORT', get_option('pgport'))
+cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport').to_string())
+cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb_srvnam'))
+if get_option('system_tzdata') != ''
+  cdata.set_quoted('SYSTEMTZDIR', get_option('system_tzdata'))
+endif
+
+
+
+###############################################################
+# Directories
+###############################################################
+
+# These are set by the equivalent --xxxdir configure options.  We
+# append "postgresql" to some of them, if the string does not already
+# contain "pgsql" or "postgres", in order to avoid directory clutter.
+
+pkg = 'postgresql'
+
+dir_prefix = get_option('prefix')
+
+dir_bin = get_option('bindir')
+
+dir_data = get_option('datadir')
+if not (dir_data.contains('pgsql') or dir_data.contains('postgres'))
+  dir_data = dir_data / pkg
+endif
+
+dir_sysconf = get_option('sysconfdir')
+if not (dir_sysconf.contains('pgsql') or dir_sysconf.contains('postgres'))
+  dir_sysconf = dir_sysconf / pkg
+endif
+
+dir_lib = get_option('libdir')
+
+dir_lib_pkg = dir_lib
+if not (dir_lib_pkg.contains('pgsql') or dir_lib_pkg.contains('postgres'))
+  dir_lib_pkg = dir_lib_pkg / pkg
+endif
+
+dir_pgxs = dir_lib_pkg / 'pgxs'
+
+dir_include = get_option('includedir')
+
+dir_include_pkg = dir_include
+dir_include_pkg_rel = ''
+if not (dir_include_pkg.contains('pgsql') or dir_include_pkg.contains('postgres'))
+  dir_include_pkg = dir_include_pkg / pkg
+  dir_include_pkg_rel = pkg
+endif
+
+dir_man = get_option('mandir')
+
+# FIXME: These used to be separately configurable - worth adding?
+dir_doc = get_option('datadir') / 'doc' / 'postgresql'
+dir_doc_html = dir_doc
+
+dir_locale = get_option('localedir')
+
+
+# Derived values
+dir_bitcode = dir_lib_pkg / 'bitcode'
+dir_include_internal = dir_include_pkg / 'internal'
+dir_include_server = dir_include_pkg / 'server'
+dir_include_extension = dir_include_server / 'extension'
+dir_data_extension = dir_data / 'extension'
+
+
+
+###############################################################
+# Search paths, preparation for compiler tests
+#
+# NB: Arguments added later are not automatically used for subsequent
+# configuration-time checks (so they are more isolated). If they should be
+# used, they need to be added to test_c_args as well.
+###############################################################
+
+postgres_inc = [include_directories(postgres_inc_d)]
+test_lib_d = postgres_lib_d
+test_c_args = cppflags + cflags
+
+
+
+###############################################################
+# Library: bsd-auth
+###############################################################
+
+bsd_authopt = get_option('bsd_auth')
+bsd_auth = not_found_dep
+if cc.check_header('bsd_auth.h', required: bsd_authopt,
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('USE_BSD_AUTH', 1)
+  bsd_auth = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: bonjour
+#
+# For now don't search for DNSServiceRegister in a library - only Apple's
+# Bonjour implementation, which is always linked, works.
+###############################################################
+
+bonjouropt = get_option('bonjour')
+bonjour = dependency('', required : false)
+if cc.check_header('dns_sd.h', required: bonjouropt,
+    args: test_c_args, include_directories: postgres_inc) and \
+   cc.has_function('DNSServiceRegister',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('USE_BONJOUR', 1)
+  bonjour = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+krb_srvtab = ''
+have_gssapi = false
+if not gssapiopt.disabled()
+  gssapi = dependency('krb5-gssapi', required: gssapiopt)
+  have_gssapi = gssapi.found()
+
+  if not have_gssapi
+  elif cc.check_header('gssapi/gssapi.h', dependencies: gssapi, required: false,
+      args: test_c_args, include_directories: postgres_inc)
+    cdata.set('HAVE_GSSAPI_GSSAPI_H', 1)
+  elif cc.check_header('gssapi.h', args: test_c_args, dependencies: gssapi, required: gssapiopt)
+    cdata.set('HAVE_GSSAPI_H', 1)
+  else
+    have_gssapi = false
+  endif
+
+  if not have_gssapi
+  elif cc.has_function('gss_init_sec_context', dependencies: gssapi,
+      args: test_c_args, include_directories: postgres_inc)
+    cdata.set('ENABLE_GSS', 1)
+
+    krb_srvtab = 'FILE:/@0@/krb5.keytab)'.format(get_option('sysconfdir'))
+    cdata.set_quoted('PG_KRB_SRVTAB', krb_srvtab)
+  elif gssapiopt.enabled()
+    error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+  else
+    have_gssapi = false
+  endif
+endif
+if not have_gssapi
+  gssapi = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if host_system == 'windows'
+  ldap = cc.find_library('wldap32', required: ldapopt)
+  ldap_r = ldap
+else
+  # macos framework dependency is buggy for ldap (one can argue whether it's
+  # Apple's or meson's fault), leading to an endless recursion with ldap.h
+  # including itself. See https://github.com/mesonbuild/meson/issues/10002
+  # Luckily we only need pkg-config support, so the workaround isn't
+  # complicated.
+  ldap = dependency('ldap', method: 'pkg-config', required: false)
+  ldap_r = ldap
+
+  # Before 2.5 openldap didn't have a pkg-config file, and it might not be
+  # installed
+  if not ldap.found()
+    ldap = cc.find_library('ldap', required: ldapopt, dirs: test_lib_d,
+      has_headers: 'ldap.h', header_include_directories: postgres_inc)
+
+    # The separate ldap_r library only exists in OpenLDAP < 2.5, and if we
+    # have 2.5 or later, we shouldn't even probe for ldap_r (we might find a
+    # library from a separate OpenLDAP installation).  The most reliable
+    # way to check that is to check for a function introduced in 2.5.
+    if not ldap.found()
+      # don't have ldap, we shouldn't check for ldap_r
+    elif cc.has_function('ldap_verify_credentials',
+        dependencies: ldap, args: test_c_args)
+      ldap_r = ldap # ldap >= 2.5, no need for ldap_r
+    else
+
+      # Use ldap_r for FE if available, else assume ldap is thread-safe.
+      ldap_r = cc.find_library('ldap_r', required: false, dirs: test_lib_d,
+        has_headers: 'ldap.h', header_include_directories: postgres_inc)
+      if not ldap_r.found()
+        ldap_r = ldap
+      else
+        # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+        ldap_r = declare_dependency(dependencies: [ldap_r, thread_dep])
+      endif
+
+      # PostgreSQL sometimes loads libldap_r and plain libldap into the same
+      # process.  Check for OpenLDAP versions known not to tolerate doing so;
+      # assume non-OpenLDAP implementations are safe.  The dblink test suite
+      # exercises the hazardous interaction directly.
+      compat_test_code = '''
+#include <ldap.h>
+#if !defined(LDAP_VENDOR_VERSION) || \
+     (defined(LDAP_API_FEATURE_X_OPENLDAP) && \
+      LDAP_VENDOR_VERSION >= 20424 && LDAP_VENDOR_VERSION <= 20431)
+choke me
+#endif
+'''
+      if not cc.compiles(compat_test_code,
+          name: 'LDAP implementation compatible',
+          dependencies: ldap, args: test_c_args)
+        warning('''
+*** With OpenLDAP versions 2.4.24 through 2.4.31, inclusive, each backend
+*** process that loads libpq (via WAL receiver, dblink, or postgres_fdw) and
+*** also uses LDAP will crash on exit.''')
+      endif
+    endif
+  endif
+
+  # XXX: this shouldn't be tested in the windows case, but should be tested in
+  # the dependency() success case
+  if ldap.found() and cc.has_function('ldap_initialize',
+      dependencies: ldap, args: test_c_args)
+    cdata.set('HAVE_LDAP_INITIALIZE', 1)
+  endif
+endif
+
+if ldap.found()
+  assert(ldap_r.found())
+  cdata.set('USE_LDAP', 1)
+else
+  assert(not ldap_r.found())
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+  add_languages('cpp', required: true, native: false)
+  llvm = dependency('llvm', version: '>=3.9', method: 'config-tool', required: llvmopt)
+
+  if llvm.found()
+
+    cdata.set('USE_LLVM', 1)
+
+    cpp = meson.get_compiler('cpp')
+
+    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+    ccache = find_program('ccache', native: true, required: false)
+    clang = find_program(llvm_binpath / 'clang', required: true)
+  endif
+else
+  llvm = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+icuopt = get_option('icu')
+if not icuopt.disabled()
+  icu = dependency('icu-uc', required: icuopt.enabled())
+  icu_i18n = dependency('icu-i18n', required: icuopt.enabled())
+
+  if icu.found()
+    cdata.set('USE_ICU', 1)
+  endif
+
+else
+  icu = not_found_dep
+  icu_i18n = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+  libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+  if libxml.found()
+    cdata.set('USE_LIBXML', 1)
+  endif
+else
+  libxml = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+  libxslt = dependency('libxslt', required: libxsltopt)
+
+  if libxslt.found()
+    cdata.set('USE_LIBXSLT', 1)
+  endif
+else
+  libxslt = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+  lz4 = dependency('liblz4', required: lz4opt)
+
+  if lz4.found()
+    cdata.set('USE_LZ4', 1)
+    cdata.set('HAVE_LIBLZ4', 1)
+  endif
+
+else
+  lz4 = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Tcl (for pltcl)
+#
+# NB: tclConfig.sh is used in autoconf build for getting
+# TCL_SHARED_BUILD, TCL_INCLUDE_SPEC, TCL_LIBS and TCL_LIB_SPEC
+# variables. For now we have not seen a need to copy
+# that behaviour to the meson build.
+###############################################################
+
+tclopt = get_option('pltcl')
+tcl_version = get_option('tcl_version')
+tcl_dep = not_found_dep
+if not tclopt.disabled()
+
+  # via pkg-config
+  tcl_dep = dependency(tcl_version, required: false)
+
+  if not tcl_dep.found()
+    tcl_dep = cc.find_library(tcl_version,
+      required: tclopt,
+      dirs: test_lib_d)
+  endif
+
+  if not cc.has_header('tcl.h', dependencies: tcl_dep, required: tclopt)
+    tcl_dep = not_found_dep
+  endif
+endif
+
+
+
+###############################################################
+# Library: pam
+###############################################################
+
+pamopt = get_option('pam')
+if not pamopt.disabled()
+  pam = dependency('pam', required: false)
+
+  if not pam.found()
+    pam = cc.find_library('pam', required: pamopt, dirs: test_lib_d)
+  endif
+
+  if pam.found()
+    pam_header_found = false
+
+    # header file <security/pam_appl.h> or <pam/pam_appl.h> is required for PAM.
+    if cc.check_header('security/pam_appl.h', dependencies: pam, required: false,
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_SECURITY_PAM_APPL_H', 1)
+      pam_header_found = true
+    elif cc.check_header('pam/pam_appl.h', dependencies: pam, required: pamopt,
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_PAM_PAM_APPL_H', 1)
+      pam_header_found = true
+    endif
+
+    if pam_header_found
+      cdata.set('USE_PAM', 1)
+    else
+      pam = not_found_dep
+    endif
+  endif
+else
+  pam = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('plperl')
+perl_dep = not_found_dep
+if not perlopt.disabled()
+  perl_may_work = true
+
+  # First verify that perl has the necessary dependencies installed
+  perl_mods = run_command(
+    [perl,
+     '-MConfig', '-MOpcode', '-MExtUtils::Embed', '-MExtUtils::ParseXS',
+     '-e', ''],
+    check: false)
+  if perl_mods.returncode() != 0
+    perl_may_work = false
+    perl_msg = 'perl installation does not have the required modules'
+  endif
+
+  # Then inquire perl about its configuration
+  if perl_may_work
+    perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+    perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+    archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+    privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+    useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+
+    perl_inc_dir = '@0@/CORE'.format(archlibexp)
+
+    if useshrplib != 'true'
+      perl_may_work = false
+      perl_msg = 'need a shared perl'
+    endif
+  endif
+
+  if perl_may_work
+    # On most platforms, archlibexp is also where the Perl include files live ...
+    perl_ccflags = ['-I@0@'.format(perl_inc_dir)]
+    # ... but on newer macOS versions, we must use -iwithsysroot to look
+    # under sysroot
+    if not fs.is_file('@0@/perl.h'.format(perl_inc_dir)) and \
+       fs.is_file('@0@@1@/perl.h'.format(pg_sysroot, perl_inc_dir))
+      perl_ccflags = ['-iwithsysroot', perl_inc_dir]
+    endif
+
+    # check compiler finds header
+    if not cc.has_header('perl.h', required: false,
+        args: test_c_args + perl_ccflags, include_directories: postgres_inc)
+      perl_may_work = false
+      perl_msg = 'missing perl.h'
+    endif
+  endif
+
+  if perl_may_work
+    perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+
+    # See comments for PGAC_CHECK_PERL_EMBED_CCFLAGS in perl.m4
+    foreach flag : perl_ccflags_r.split(' ')
+      if flag.startswith('-D') and \
+          (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+        perl_ccflags += flag
+      endif
+    endforeach
+
+    if host_system == 'windows'
+      perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+    endif
+
+    message('CCFLAGS recommended by perl: @0@'.format(perl_ccflags_r))
+    message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+    # We are after Embed's ldopts, but without the subset mentioned in
+    # Config's ccdlflags and ldflags.  (Those are the choices of those who
+    # built the Perl installation, which are not necessarily appropriate
+    # for building PostgreSQL.)
+    ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+    undesired = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().split()
+    undesired += run_command(perl_conf_cmd, 'ldflags', check: true).stdout().split()
+
+    perl_ldopts = []
+    foreach ldopt : ldopts.split(' ')
+      if ldopt == '' or ldopt in undesired
+        continue
+      endif
+
+      perl_ldopts += ldopt.strip('"')
+    endforeach
+
+    message('LDFLAGS recommended by perl: "@0@"'.format(ldopts))
+    message('LDFLAGS for embedding perl: "@0@"'.format(' '.join(perl_ldopts)))
+
+    perl_dep_int = declare_dependency(
+      compile_args: perl_ccflags,
+      link_args: perl_ldopts,
+      version: perlversion,
+    )
+
+    # While we're at it, check that we can link to libperl.
+    # On most platforms, if perl.h is there then libperl.so will be too, but
+    # at this writing Debian packages them separately.  This doesn't work on
+    # old meson versions, but that's ok, it's just nicer to test here.
+    perl_link_test = '''
+/* see plperl.h */
+#ifdef _MSC_VER
+#define __inline__ inline
+#endif
+#include <EXTERN.h>
+#include <perl.h>
+int main(void)
+{
+perl_alloc();
+}'''
+    if meson.version().version_compare('>=0.57') and not \
+        cc.links(perl_link_test, name: 'libperl',
+          args: test_c_args + perl_ccflags + perl_ldopts,
+          include_directories: postgres_inc)
+      perl_may_work = false
+      perl_msg = 'missing libperl'
+    endif
+
+  endif # perl_may_work
+
+  if perl_may_work
+    perl_dep = perl_dep_int
+  else
+    if perlopt.enabled()
+      error('dependency plperl failed: @0@'.format(perl_msg))
+    else
+      message('disabling optional dependency plperl: @0@'.format(perl_msg))
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('plpython')
+if not pyopt.disabled()
+  pm = import('python')
+  python3_inst = pm.find_installation(required: pyopt.enabled())
+  python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled())
+  if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt.enabled())
+    python3_dep = not_found_dep
+  endif
+else
+  python3_dep = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Readline
+###############################################################
+
+if not get_option('readline').disabled()
+  libedit_preferred = get_option('libedit_preferred')
+  # Set the order of readline dependencies
+  check_readline_deps = libedit_preferred ? \
+    ['libedit', 'readline'] : ['readline', 'libedit']
+
+  foreach readline_dep : check_readline_deps
+    readline = dependency(readline_dep, required: false)
+    if not readline.found()
+      readline = cc.find_library(readline_dep,
+        required: get_option('readline').enabled(),
+        dirs: test_lib_d)
+    endif
+    if readline.found()
+      break
+    endif
+  endforeach
+
+  if readline.found()
+    cdata.set('HAVE_LIBREADLINE', 1)
+
+    editline_prefix = {
+      'header_prefix': 'editline/',
+      'flag_prefix': 'EDITLINE_',
+    }
+    readline_prefix = {
+      'header_prefix': 'readline/',
+      'flag_prefix': 'READLINE_',
+    }
+    default_prefix = {
+      'header_prefix': '',
+      'flag_prefix': '',
+    }
+
+    # Set the order of prefixes
+    prefixes = libedit_preferred ? \
+      [editline_prefix, default_prefix, readline_prefix] : \
+      [readline_prefix, default_prefix, editline_prefix]
+
+    at_least_one_header_found = false
+    foreach header : ['history', 'readline']
+      is_found = false
+      foreach prefix : prefixes
+        header_file = '@0@@1@.h'.format(prefix['header_prefix'], header)
+        # Check history.h and readline.h
+        if not is_found and cc.has_header(header_file,
+            args: test_c_args, include_directories: postgres_inc,
+            dependencies: [readline], required: false)
+          if header == 'readline'
+            readline_h = header_file
+          endif
+          cdata.set('HAVE_@0@@1@_H'.format(prefix['flag_prefix'], header).to_upper(), 1)
+          is_found = true
+          at_least_one_header_found = true
+        endif
+      endforeach
+    endforeach
+
+    if not at_least_one_header_found
+      error('''readline header not found
+If you have @0@ already installed, see see meson-log/meson-log.txt for details on the
+failure. It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.'''.format(readline_dep))
+    endif
+
+    check_funcs = [
+      'append_history',
+      'history_truncate_file',
+      'rl_completion_matches',
+      'rl_filename_completion_function',
+      'rl_reset_screen_size',
+      'rl_variable_bind',
+    ]
+
+    foreach func : check_funcs
+      found = cc.has_function(func, dependencies: [readline],
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_'+func.to_upper(), found ? 1 : false)
+    endforeach
+
+    check_vars = [
+      'rl_completion_suppress_quote',
+      'rl_filename_quote_characters',
+      'rl_filename_quoting_function',
+    ]
+
+    foreach var : check_vars
+      cdata.set('HAVE_'+var.to_upper(),
+        cc.has_header_symbol(readline_h, var,
+          args: test_c_args, include_directories: postgres_inc,
+          prefix: '#include <stdio.h>',
+          dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if readline.type_name() == 'library'
+      readline = declare_dependency(dependencies: readline,
+        include_directories: postgres_inc)
+    endif
+  endif
+
+  # XXX: Figure out whether to implement mingw warning equivalent
+else
+  readline = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: selinux
+###############################################################
+
+selinux = not_found_dep
+selinuxopt = get_option('selinux')
+if meson.version().version_compare('>=0.59')
+  selinuxopt = selinuxopt.disable_auto_if(host_system != 'linux')
+endif
+selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
+cdata.set('HAVE_LIBSELINUX',
+  selinux.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: systemd
+###############################################################
+
+systemd = not_found_dep
+systemdopt = get_option('systemd')
+if meson.version().version_compare('>=0.59')
+  systemdopt = systemdopt.disable_auto_if(host_system != 'linux')
+endif
+systemd = dependency('libsystemd', required: systemdopt)
+cdata.set('USE_SYSTEMD', systemd.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+  # Try to find openssl via pkg-config et al, if that doesn't work
+  # (e.g. because it's provided as part of the OS, like on FreeBSD), look for
+  # the library names that we know about.
+
+  # via pkg-config et al
+  ssl = dependency('openssl', required: false)
+
+  # via library + headers
+  if not ssl.found()
+    ssl_lib = cc.find_library('ssl',
+      dirs: test_lib_d,
+      header_include_directories: postgres_inc,
+      has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+    crypto_lib = cc.find_library('crypto',
+      dirs: test_lib_d,
+      header_include_directories: postgres_inc)
+    ssl_int = [ssl_lib, crypto_lib]
+
+    ssl = declare_dependency(dependencies: ssl_int,
+                             include_directories: postgres_inc)
+  else
+    cc.has_header('openssl/ssl.h', args: test_c_args, dependencies: ssl, required: true)
+    cc.has_header('openssl/err.h', args: test_c_args, dependencies: ssl, required: true)
+
+    ssl_int = [ssl]
+  endif
+
+  check_funcs = [
+    ['CRYPTO_new_ex_data', {'required': true}],
+    ['SSL_new', {'required': true}],
+
+    # Function introduced in OpenSSL 1.0.2.
+    ['X509_get_signature_nid'],
+
+    # Functions introduced in OpenSSL 1.1.0. We used to check for
+    # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+    # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+    # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+    # functions.
+    ['OPENSSL_init_ssl'],
+    ['BIO_get_data'],
+    ['BIO_meth_new'],
+    ['ASN1_STRING_get0_data'],
+    ['HMAC_CTX_new'],
+    ['HMAC_CTX_free'],
+
+    # OpenSSL versions before 1.1.0 required setting callback functions, for
+    # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+    # function was removed.
+    ['CRYPTO_lock'],
+  ]
+
+  foreach c : check_funcs
+    func = c.get(0)
+    val = cc.has_function(func, args: test_c_args, dependencies: ssl_int)
+    required = c.get(1, {}).get('required', false)
+    if required and not val
+      error('openssl function @0@ is required'.format(func))
+    elif not required
+      cdata.set('HAVE_' + func.to_upper(), val ? 1 : false)
+    endif
+  endforeach
+
+  cdata.set('USE_OPENSSL', 1,
+            description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+  cdata.set('OPENSSL_API_COMPAT', '0x10001000L',
+            description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.''')
+else
+  ssl = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: uuid
+###############################################################
+
+uuidopt = get_option('uuid')
+if uuidopt != 'none'
+  uuidname = uuidopt.to_upper()
+  if uuidopt == 'e2fs'
+    uuid = dependency('uuid', required: true)
+    uuidfunc = 'uuid_generate'
+    uuidheader = 'uuid/uuid.h'
+  elif uuidopt == 'bsd'
+    # libc should have uuid function
+    uuid = declare_dependency()
+    uuidfunc = 'uuid_to_string'
+    uuidheader = 'uuid.h'
+  elif uuidopt == 'ossp'
+    uuid = dependency('ossp-uuid', required: true)
+    uuidfunc = 'uuid_export'
+    uuidheader = 'ossp/uuid.h'
+  else
+    error('huh')
+  endif
+
+  if not cc.has_header_symbol(uuidheader, uuidfunc, args: test_c_args, dependencies: uuid)
+    error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc))
+  endif
+  cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1)
+
+  cdata.set('HAVE_UUID_@0@'.format(uuidname), 1,
+           description: 'Define to 1 if you have @0@ UUID support.'.format(uuidname))
+else
+  uuid = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = not_found_dep
+if not zlibopt.disabled()
+  zlib_t = dependency('zlib', required: zlibopt)
+
+  if zlib_t.type_name() == 'internal'
+    # if fallback was used, we don't need to test if headers are present (they
+    # aren't built yet, so we can't test)
+    zlib = zlib_t
+  elif not zlib_t.found()
+    warning('did not find zlib')
+  elif not cc.has_header('zlib.h',
+      args: test_c_args, include_directories: postgres_inc,
+      dependencies: [zlib_t], required: zlibopt.enabled())
+    warning('zlib header not found')
+  elif not cc.has_type('z_streamp',
+      dependencies: [zlib_t], prefix: '#include <zlib.h>',
+      args: test_c_args, include_directories: postgres_inc)
+    if zlibopt.enabled()
+      error('zlib version is too old')
+    else
+      warning('zlib version is too old')
+    endif
+  else
+    zlib = zlib_t
+  endif
+
+  if zlib.found()
+    cdata.set('HAVE_LIBZ', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Library: tap test dependencies
+###############################################################
+
+# Check whether tap tests are enabled or not
+tap_tests_enabled = false
+tapopt = get_option('tap_tests')
+if not tapopt.disabled()
+  # Checking for perl modules for tap tests
+  perl_ipc_run_check = run_command(perl, 'config/check_modules.pl', check: false)
+  if perl_ipc_run_check.returncode() != 0
+    message(perl_ipc_run_check.stderr().strip())
+    if tapopt.enabled()
+      error('Additional Perl modules are required to run TAP tests.')
+    else
+      warning('Additional Perl modules are required to run TAP tests.')
+    endif
+  else
+    tap_tests_enabled = true
+  endif
+endif
+
+
+
+###############################################################
+# Library: zstd
+###############################################################
+
+zstdopt = get_option('zstd')
+if not zstdopt.disabled()
+  zstd = dependency('libzstd', required: zstdopt, version: '>=1.4.0')
+
+  if zstd.found()
+    cdata.set('USE_ZSTD', 1)
+    cdata.set('HAVE_LIBZSTD', 1)
+  endif
+
+else
+  zstd = not_found_dep
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+# Do we need -std=c99 to compile C99 code? We don't want to add -std=c99
+# unnecessarily, because we optionally rely on newer features.
+c99_test = '''
+#include <stdbool.h>
+#include <complex.h>
+#include <tgmath.h>
+#include <inttypes.h>
+
+struct named_init_test {
+  int a;
+  int b;
+};
+
+extern void structfunc(struct named_init_test);
+
+int main(int argc, char **argv)
+{
+  struct named_init_test nit = {
+    .a = 3,
+    .b = 5,
+  };
+
+  for (int loop_var = 0; loop_var < 3; loop_var++)
+  {
+    nit.a += nit.b;
+  }
+
+  structfunc((struct named_init_test){1, 0});
+
+  return nit.a != 0;
+}
+'''
+
+if not cc.compiles(c99_test, name: 'c99', args: test_c_args)
+  if cc.compiles(c99_test, name: 'c99 with -std=c99',
+        args: test_c_args + ['-std=c99'])
+    test_c_args += '-std=c99'
+    cflags += '-std=c99'
+  else
+    error('C compiler does not support C99')
+  endif
+endif
+
+sizeof_long = cc.sizeof('long', args: test_c_args)
+cdata.set('SIZEOF_LONG', sizeof_long)
+if sizeof_long == 8
+  cdata.set('HAVE_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long int')
+  cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: test_c_args) == 8
+  cdata.set('HAVE_LONG_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long long int')
+  cdata.set_quoted('INT64_MODIFIER', 'll')
+else
+  error('do not know how to get a 64bit int')
+endif
+
+if host_machine.endian() == 'big'
+  cdata.set('WORDS_BIGENDIAN', 1)
+endif
+
+alignof_types = ['short', 'int', 'long', 'double']
+maxalign = 0
+foreach t : alignof_types
+  align = cc.alignment(t, args: test_c_args)
+  if maxalign < align
+    maxalign = align
+  endif
+  cdata.set('ALIGNOF_@0@'.format(t.to_upper()), align)
+endforeach
+cdata.set('MAXIMUM_ALIGNOF', maxalign)
+
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: test_c_args))
+cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: test_c_args))
+
+
+# Check if __int128 is a working 128 bit integer type, and if so
+# define PG_INT128_TYPE to that typename.
+#
+# This currently only detects a GCC/clang extension, but support for other
+# environments may be added in the future.
+#
+# For the moment we only test for support for 128bit math; support for
+# 128bit literals and snprintf is not required.
+if cc.links('''
+  /*
+   * We don't actually run this test, just link it to verify that any support
+   * functions needed for __int128 are present.
+   *
+   * These are globals to discourage the compiler from folding all the
+   * arithmetic tests down to compile-time constants.  We do not have
+   * convenient support for 128bit literals at this point...
+   */
+  __int128 a = 48828125;
+  __int128 b = 97656250;
+
+  int main(void)
+  {
+      __int128 c,d;
+      a = (a << 12) + 1; /* 200000000001 */
+      b = (b << 12) + 5; /* 400000000005 */
+      /* try the most relevant arithmetic ops */
+      c = a * b;
+      d = (c + b) / b;
+      /* must use the results, else compiler may optimize arithmetic away */
+      return d != a+1;
+  }''',
+  name: '__int128',
+  args: test_c_args)
+
+  buggy_int128 = false
+
+  # Use of non-default alignment with __int128 tickles bugs in some compilers.
+  # If not cross-compiling, we can test for bugs and disable use of __int128
+  # with buggy compilers.  If cross-compiling, hope for the best.
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83925
+  if not meson.is_cross_build()
+    r = cc.run('''
+    /* This must match the corresponding code in c.h: */
+    #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
+    #define pg_attribute_aligned(a) __attribute__((aligned(a)))
+    #endif
+    typedef __int128 int128a
+    #if defined(pg_attribute_aligned)
+    pg_attribute_aligned(8)
+    #endif
+    ;
+
+    int128a holder;
+    void pass_by_val(void *buffer, int128a par) { holder = par; }
+
+    int main(void)
+    {
+        long int i64 = 97656225L << 12;
+        int128a q;
+        pass_by_val(main, (int128a) i64);
+        q = (int128a) i64;
+        return q != holder;
+    }''',
+    name: '__int128 alignment bug',
+    args: test_c_args)
+    assert(r.compiled())
+    if r.returncode() != 0
+      buggy_int128 = true
+      message('__int128 support present but buggy and thus disabled')
+    endif
+  endif
+
+  if not buggy_int128
+    cdata.set('PG_INT128_TYPE', '__int128')
+    cdata.set('ALIGNOF_PG_INT128_TYPE', cc.
+      alignment('__int128', args: test_c_args))
+  endif
+endif
+
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang).  If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+    static inline int foo(void)
+    {
+      void *labeladdrs[] = {&&my_label};
+      goto *labeladdrs[0];
+      my_label:
+      return 1;
+    }''',
+    args: test_c_args)
+  cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+    int main(int arg, char **argv)
+    {
+        ({ _Static_assert(1, "foo"); });
+    }
+    ''',
+    args: test_c_args)
+  cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: test_c_args) \
+  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: test_c_args) \
+  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: test_c_args) == 1
+  cdata.set('HAVE__BOOL', 1)
+  cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+# Need to check a call with %m because netbsd supports gnu_printf but emits a
+# warning for each use of %m.
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = '''
+extern void emit_log(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));
+static void call_log(void)
+{
+    emit_log(0, "error: %s: %m", "foo");
+}
+'''
+attrib_error_args = cc.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
+foreach a : printf_attributes
+  if cc.compiles(testsrc.format(a),
+      args: test_c_args + attrib_error_args, name: 'format ' + a)
+    cdata.set('PG_PRINTF_ATTRIBUTE', a)
+    break
+  endif
+endforeach
+
+
+if cc.has_function_attribute('visibility:default') and \
+  cc.has_function_attribute('visibility:hidden')
+  cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+
+  # Only newer versions of meson know not to apply gnu_symbol_visibility =
+  # inlineshidden to C code as well... Any either way, we want to put these
+  # flags into exported files (pgxs, .pc files).
+  cflags_mod += '-fvisibility=hidden'
+  cxxflags_mod += ['-fvisibility=hidden', '-fvisibility-inlines-hidden']
+  ldflags_mod += '-fvisibility=hidden'
+endif
+
+
+# Check if various builtins exist. Some builtins are tested separately,
+# because we want to test something more complicated than the generic case.
+builtins = [
+  'bswap16',
+  'bswap32',
+  'bswap64',
+  'clz',
+  'ctz',
+  'constant_p',
+  'frame_address',
+  'popcount',
+  'unreachable',
+]
+
+foreach builtin : builtins
+  fname = '__builtin_@0@'.format(builtin)
+  if cc.has_function(fname, args: test_c_args)
+    cdata.set('HAVE@0@'.format(fname.to_upper()), 1)
+  endif
+endforeach
+
+
+# Check if the C compiler understands __builtin_types_compatible_p,
+# and define HAVE__BUILTIN_TYPES_COMPATIBLE_P if so.
+#
+# We check usage with __typeof__, though it's unlikely any compiler would
+# have the former and not the latter.
+if cc.compiles('''
+    static int x;
+    static int y[__builtin_types_compatible_p(__typeof__(x), int)];
+    ''',
+    name: '__builtin_types_compatible_p',
+    args: test_c_args)
+  cdata.set('HAVE__BUILTIN_TYPES_COMPATIBLE_P', 1)
+endif
+
+
+# Check if the C compiler understands __builtin_$op_overflow(),
+# and define HAVE__BUILTIN_OP_OVERFLOW if so.
+#
+# Check for the most complicated case, 64 bit multiplication, as a
+# proxy for all of the operations.  To detect the case where the compiler
+# knows the function but library support is missing, we must link not just
+# compile, and store the results in global variables so the compiler doesn't
+# optimize away the call.
+if cc.links('''
+    INT64 a = 1;
+    INT64 b = 1;
+    INT64 result;
+
+    int main(void)
+    {
+        return __builtin_mul_overflow(a, b, &result);
+    }''',
+    name: '__builtin_mul_overflow',
+    args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))],
+    )
+  cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1)
+endif
+
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+    #include <cpuid.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+    }
+    ''', name: '__get_cpuid',
+    args: test_c_args)
+  cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+    #include <intrin.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __cpuid(exx, 1);
+    }
+    ''', name: '__cpuid',
+    args: test_c_args)
+  cdata.set('HAVE__CPUID', 1)
+endif
+
+
+# Defend against clang being used on x86-32 without SSE2 enabled.  As current
+# versions of clang do not understand -fexcess-precision=standard, the use of
+# x87 floating point operations leads to problems like isinf possibly returning
+# false for a value that is infinite when converted from the 80bit register to
+# the 8byte memory representation.
+#
+# Only perform the test if the compiler doesn't understand
+# -fexcess-precision=standard, that way a potentially fixed compiler will work
+# automatically.
+if '-fexcess-precision=standard' not in cflags
+  if not cc.compiles('''
+#if defined(__clang__) && defined(__i386__) && !defined(__SSE2_MATH__)
+choke me
+#endif''',
+      name: '', args: test_c_args)
+    error('Compiling PostgreSQL with clang, on 32bit x86, requires SSE2 support. Use -msse2 or use gcc.')
+  endif
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+  # Disable strict-aliasing rules; needed for gcc 3.3+
+  '-fno-strict-aliasing',
+  # Disable optimizations that assume no overflow; needed for gcc 4.3+
+  '-fwrapv',
+  '-fexcess-precision=standard',
+]
+
+cflags += cc.get_supported_arguments(common_functional_flags)
+if llvm.found()
+  cxxflags += cpp.get_supported_arguments(common_functional_flags)
+endif
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+common_warning_flags = [
+  '-Wmissing-prototypes',
+  '-Wpointer-arith',
+  # Really don't want VLAs to be used in our dialect of C
+  '-Werror=vla',
+  # On macOS, complain about usage of symbols newer than the deployment target
+  '-Werror=unguarded-availability-new',
+  '-Wendif-labels',
+  '-Wmissing-format-attribute',
+  '-Wimplicit-fallthrough=3',
+  '-Wcast-function-type',
+  # This was included in -Wall/-Wformat in older GCC versions
+  '-Wformat-security',
+]
+
+cflags_warn += cc.get_supported_arguments(common_warning_flags)
+if llvm.found()
+  cxxflags_warn += cpp.get_supported_arguments(common_warning_flags)
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+  cflags_warn += '-Wdeclaration-after-statement'
+  using_declaration_after_statement_warning = true
+else
+  using_declaration_after_statement_warning = false
+endif
+
+
+# The following tests want to suppress various unhelpful warnings by adding
+# -Wno-foo switches.  But gcc won't complain about unrecognized -Wno-foo
+# switches, so we have to test for the positive form and if that works,
+# add the negative form.
+
+negative_warning_flags = [
+  # Suppress clang's unhelpful unused-command-line-argument warnings.
+  'unused-command-line-argument',
+
+  # Remove clang 12+'s compound-token-split-by-macro, as this causes a lot
+  # of warnings when building plperl because of usages in the Perl headers.
+  'compound-token-split-by-macro',
+
+  # Similarly disable useless truncation warnings from gcc 8+
+  'format-truncation',
+  'stringop-truncation',
+
+  # To make warning_level=2 / -Wextra work, we'd need at least the following
+  # 'clobbered',
+  # 'missing-field-initializers',
+  # 'sign-compare',
+  # 'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+  if cc.has_argument('-W' + w)
+    cflags_warn += '-Wno-' + w
+  endif
+  if llvm.found() and cpp.has_argument('-W' + w)
+    cxxflags_warn += '-Wno-' + w
+  endif
+endforeach
+
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+  cflags_warn += [
+    '/wd4018', # signed/unsigned mismatch
+    '/wd4244', # conversion from 'type1' to 'type2', possible loss of data
+    '/wd4273', # inconsistent DLL linkage
+    '/wd4101', # unreferenced local variable
+    '/wd4102', # unreferenced label
+    '/wd4090', # different 'modifier' qualifiers
+    '/wd4267', # conversion from 'size_t' to 'type', possible loss of data
+  ]
+
+  cppflags += [
+    '/DWIN32',
+    '/DWINDOWS',
+    '/D__WINDOWS__',
+    '/D__WIN32__',
+    '/D_CRT_SECURE_NO_DEPRECATE',
+    '/D_CRT_NONSTDC_NO_DEPRECATE',
+  ]
+
+  # We never need export libraries. As link.exe reports their creation, they
+  # are unnecessarily noisy. Similarly, we don't need import library for
+  # modules, we only import them dynamically, and they're also noisy.
+  ldflags += '/NOEXP'
+  ldflags_mod += '/NOIMPLIB'
+endif
+
+
+
+###############################################################
+# Atomics
+###############################################################
+
+if not get_option('spinlocks')
+  warning('Not using spinlocks will cause poor performance')
+else
+  cdata.set('HAVE_SPINLOCKS', 1)
+endif
+
+if not get_option('atomics')
+  warning('Not using atomics will cause poor performance')
+else
+  # XXX: perhaps we should require some atomics support in this case these
+  # days?
+  cdata.set('HAVE_ATOMICS', 1)
+
+  atomic_checks = [
+    {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+     'desc': '__sync_lock_test_and_set(char)',
+     'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+     'desc': '__sync_lock_test_and_set(int32)',
+     'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+     'desc': '__sync_val_compare_and_swap(int32)',
+     'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+     'desc': '__sync_val_compare_and_swap(int64)',
+     'test': '''
+INT64 val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+     'desc': ' __atomic_compare_exchange_n(int32)',
+     'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+     'desc': ' __atomic_compare_exchange_n(int64)',
+     'test': '''
+INT64 val = 0;
+INT64 expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+  ]
+
+  foreach check : atomic_checks
+    test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+    cdata.set(check['name'],
+      cc.links(test,
+        name: check['desc'],
+        args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false
+    )
+  endforeach
+
+endif
+
+
+
+###############################################################
+# Select CRC-32C implementation.
+#
+# If we are targeting a processor that has Intel SSE 4.2 instructions, we can
+# use the special CRC instructions for calculating CRC-32C. If we're not
+# targeting such a processor, but we can nevertheless produce code that uses
+# the SSE intrinsics, perhaps with some extra CFLAGS, compile both
+# implementations and select which one to use at runtime, depending on whether
+# SSE 4.2 is supported by the processor we're running on.
+#
+# Similarly, if we are targeting an ARM processor that has the CRC
+# instructions that are part of the ARMv8 CRC Extension, use them. And if
+# we're not targeting such a processor, but can nevertheless produce code that
+# uses the CRC instructions, compile both, and select at runtime.
+###############################################################
+
+have_optimized_crc = false
+cflags_crc = []
+if host_cpu == 'x86' or host_cpu == 'x86_64'
+
+  if cc.get_id() == 'msvc'
+    cdata.set('USE_SSE42_CRC32C', false)
+    cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  else
+
+    prog = '''
+#include <nmmintrin.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = _mm_crc32_u8(crc, 0);
+    crc = _mm_crc32_u32(crc, 0);
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+    if cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 without -msse4.2',
+          args: test_c_args)
+      # Use Intel SSE 4.2 unconditionally.
+      cdata.set('USE_SSE42_CRC32C', 1)
+      have_optimized_crc = true
+    elif cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 with -msse4.2',
+          args: test_c_args + ['-msse4.2'])
+      # Use Intel SSE 4.2, with runtime check. The CPUID instruction is needed for
+      # the runtime check.
+      cflags_crc += '-msse4.2'
+      cdata.set('USE_SSE42_CRC32C', false)
+      cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+      have_optimized_crc = true
+    endif
+
+  endif
+
+elif host_cpu == 'arm' or host_cpu == 'aarch64'
+
+  prog = '''
+#include <arm_acle.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = __crc32cb(crc, 0);
+    crc = __crc32ch(crc, 0);
+    crc = __crc32cw(crc, 0);
+    crc = __crc32cd(crc, 0);
+
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+  if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc',
+      args: test_c_args)
+    # Use ARM CRC Extension unconditionally
+    cdata.set('USE_ARMV8_CRC32C', 1)
+    have_optimized_crc = true
+  elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc',
+      args: test_c_args + ['-march=armv8-a+crc'])
+    # Use ARM CRC Extension, with runtime check
+    cflags_crc += '-march=armv8-a+crc'
+    cdata.set('USE_ARMV8_CRC32C', false)
+    cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  endif
+endif
+
+if not have_optimized_crc
+  # fall back to slicing-by-8 algorithm, which doesn't require any special CPU
+  # support.
+  cdata.set('USE_SLICING_BY_8_CRC32C', 1)
+endif
+
+
+
+###############################################################
+# Other CPU specific stuff
+###############################################################
+
+if host_cpu == 'x86_64'
+
+  if cc.compiles('''
+      void main(void)
+      {
+          long long x = 1; long long r;
+          __asm__ __volatile__ (" popcntq %1,%0\n" : "=q"(r) : "rm"(x));
+      }''',
+      name: '@0@: popcntq instruction'.format(host_cpu),
+      args: test_c_args)
+    cdata.set('HAVE_X86_64_POPCNTQ', 1)
+  endif
+
+elif host_cpu == 'ppc' or host_cpu == 'ppc64'
+  # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+  if cdata.has('HAVE__BUILTIN_CONSTANT_P')
+    if cc.compiles('''
+      static inline int
+      addi(int ra, int si)
+      {
+          int res = 0;
+          if (__builtin_constant_p(si))
+              __asm__ __volatile__(
+                  " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+          return res;
+      }
+      int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+      ''',
+      args: test_c_args)
+      cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+# XXX: Might be worth conditioning some checks on the OS, to avoid doing
+# unnecessary checks over and over, particularly on windows.
+header_checks = [
+  'atomic.h',
+  'copyfile.h',
+  'crtdefs.h',
+  'execinfo.h',
+  'getopt.h',
+  'ifaddrs.h',
+  'langinfo.h',
+  'mbarrier.h',
+  'stdbool.h',
+  'strings.h',
+  'sys/epoll.h',
+  'sys/event.h',
+  'sys/personality.h',
+  'sys/prctl.h',
+  'sys/procctl.h',
+  'sys/signalfd.h',
+  'sys/ucred.h',
+  'termios.h',
+  'ucred.h',
+]
+
+foreach header : header_checks
+  varname = 'HAVE_' + header.underscorify().to_upper()
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  found = cc.has_header(header,
+    include_directories: postgres_inc, args: test_c_args)
+  cdata.set(varname, found ? 1 : false,
+            description: 'Define to 1 if you have the <@0@> header file.'.format(header))
+endforeach
+
+
+decl_checks = [
+  ['F_FULLFSYNC', 'fcntl.h'],
+  ['fdatasync', 'unistd.h'],
+  ['posix_fadvise', 'fcntl.h'],
+  ['strlcat', 'string.h'],
+  ['strlcpy', 'string.h'],
+  ['strnlen', 'string.h'],
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+  ['preadv', 'sys/uio.h'],
+  ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+  func = c.get(0)
+  header = c.get(1)
+  args = c.get(2, {})
+  varname = 'HAVE_DECL_' + func.underscorify().to_upper()
+
+  found = cc.has_header_symbol(header, func,
+    args: test_c_args, include_directories: postgres_inc,
+    kwargs: args)
+  cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@', and to 0 if you
+   don't.'''.format(func))
+endforeach
+
+
+if cc.has_type('struct cmsgcred',
+    args: test_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '' : '-DHAVE_SYS_UCRED_H'],
+    include_directories: postgres_inc,
+    prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+  cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+  cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_type('struct option',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '@0@'.format(cdata.get('HAVE_GETOPT_H')) == '1' ? '#include <getopt.h>' : '')
+  cdata.set('HAVE_STRUCT_OPTION', 1)
+endif
+
+
+foreach c : ['opterr', 'optreset']
+  varname = 'HAVE_INT_' + c.underscorify().to_upper()
+
+  if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+    extern int @0@;
+    @0@ = 1;
+}
+'''.format(c), name: c, args: test_c_args)
+    cdata.set(varname, 1)
+  else
+    cdata.set(varname, false)
+  endif
+endforeach
+
+if cc.has_type('socklen_t',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/socket.h>''')
+  cdata.set('HAVE_SOCKLEN_T', 1)
+endif
+
+if cc.has_member('struct sockaddr', 'sa_len',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
+endif
+
+if cc.has_member('struct tm', 'tm_zone',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+  cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+    return timezone / 60;
+}
+''',
+    name: 'global variable `timezone\' exists',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+  cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+if cc.has_type('union semun',
+    args: test_c_args,
+    include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+''')
+  cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+  char buf[100];
+  switch (strerror_r(1, buf, sizeof(buf)))
+  { case 0: break; default: break; }
+}''',
+    name: 'strerror_r',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('STRERROR_R_INT', 1)
+else
+  cdata.set('STRERROR_R_INT', false)
+endif
+
+# Check for the locale_t type and find the right header file.  macOS
+# needs xlocale.h; standard is locale.h, but glibc also has an
+# xlocale.h file that we should not use.
+if cc.has_type('locale_t', prefix: '#include <locale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+elif cc.has_type('locale_t', prefix: '#include <xlocale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+  cdata.set('LOCALE_T_IN_XLOCALE', 1)
+endif
+
+# Check if the C compiler understands typeof or a variant.  Define
+# HAVE_TYPEOF if so, and define 'typeof' to the actual key word.
+foreach kw : ['typeof', '__typeof__', 'decltype']
+  if cc.compiles('''
+int main(void)
+{
+    int x = 0;
+    @0@(x) y;
+    y = x;
+    return y;
+}
+'''.format(kw),
+    name: 'typeof()',
+    args: test_c_args, include_directories: postgres_inc)
+
+    cdata.set('HAVE_TYPEOF', 1)
+    if kw != 'typeof'
+      cdata.set('typeof', kw)
+    endif
+
+    break
+  endif
+endforeach
+
+
+# Try to find a declaration for wcstombs_l().  It might be in stdlib.h
+# (following the POSIX requirement for wcstombs()), or in locale.h, or in
+# xlocale.h.  If it's in the latter, define WCSTOMBS_L_IN_XLOCALE.
+wcstombs_l_test = '''
+#include <stdlib.h>
+#include <locale.h>
+@0@
+
+void main(void)
+{
+#ifndef wcstombs_l
+    (void) wcstombs_l;
+#endif
+}
+'''
+if (not cc.compiles(wcstombs_l_test.format(''),
+      name: 'wcstombs_l') and
+    cc.compiles(wcstombs_l_test.format('#include <xlocale.h>'),
+      name: 'wcstombs_l in xlocale.h'))
+    cdata.set('WCSTOMBS_L_IN_XLOCALE', 1)
+endif
+
+
+# MSVC doesn't cope well with defining restrict to __restrict, the spelling it
+# understands, because it conflicts with __declspec(restrict). Therefore we
+# define pg_restrict to the appropriate definition, which presumably won't
+# conflict.
+#
+# We assume C99 support, so we don't need to make this conditional.
+#
+# XXX: Historically we allowed platforms to disable restrict in template
+# files, but that was only added for AIX when building with XLC, which we
+# don't support yet.
+cdata.set('pg_restrict', '__restrict')
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+    PS_STRINGS->ps_nargvstr = 1;
+    PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+  name: 'PS_STRINGS', args: test_c_args)
+  cdata.set('HAVE_PS_STRINGS', 1)
+else
+  cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps += cc.find_library('m', required: false)
+
+rt_dep = cc.find_library('rt', required: false)
+
+dl_dep = cc.find_library('dl', required: false)
+
+util_dep = cc.find_library('util', required: false)
+posix4_dep = cc.find_library('posix4', required: false)
+
+getopt_dep = cc.find_library('getopt', required: false)
+gnugetopt_dep = cc.find_library('gnugetopt', required: false)
+
+# Required on BSDs
+execinfo_dep = cc.find_library('execinfo', required: false)
+
+if host_system == 'cygwin'
+  cygipc_dep = cc.find_library('cygipc', required: false)
+else
+  cygipc_dep = not_found_dep
+endif
+
+if host_system == 'sunos'
+  socket_dep = cc.find_library('socket', required: false)
+else
+  socket_dep = not_found_dep
+endif
+
+# XXX: Might be worth conditioning some checks on the OS, to avoid doing
+# unnecessary checks over and over, particularly on windows.
+func_checks = [
+  ['_configthreadlocale', {'skip': host_system != 'windows'}],
+  ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+  ['clock_gettime', {'dependencies': [rt_dep, posix4_dep], 'define': false}],
+  ['copyfile'],
+  # gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus
+  # when enabling asan the dlopen check doesn't notice that -ldl is actually
+  # required. Just checking for dlsym() ought to suffice.
+  ['dlsym', {'dependencies': [dl_dep], 'define': false}],
+  ['explicit_bzero'],
+  ['fdatasync', {'dependencies': [rt_dep, posix4_dep], 'define': false}], # Solaris
+  ['getifaddrs'],
+  ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getopt_long', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getpeereid'],
+  ['getpeerucred'],
+  ['inet_aton'],
+  ['inet_pton'],
+  ['kqueue'],
+  ['mbstowcs_l'],
+  ['memset_s'],
+  ['mkdtemp'],
+  ['posix_fadvise'],
+  ['posix_fallocate'],
+  ['ppoll'],
+  ['pstat'],
+  ['pthread_barrier_wait', {'dependencies': [thread_dep]}],
+  ['pthread_is_threaded_np', {'dependencies': [thread_dep]}],
+  ['sem_init', {'dependencies': [rt_dep, thread_dep], 'skip': sema_kind != 'unnamed_posix', 'define': false}],
+  ['setproctitle', {'dependencies': [util_dep]}],
+  ['setproctitle_fast'],
+  ['shm_open', {'dependencies': [rt_dep], 'define': false}],
+  ['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
+  ['shmget', {'dependencies': [cygipc_dep], 'define': false}],
+  ['socket', {'dependencies': [socket_dep], 'define': false}],
+  ['strchrnul'],
+  ['strerror_r', {'dependencies': [thread_dep]}],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+  ['strsignal'],
+  ['sync_file_range'],
+  ['syncfs'],
+  ['uselocale'],
+  ['wcstombs_l'],
+]
+
+func_check_results = {}
+foreach c : func_checks
+  func = c.get(0)
+  kwargs = c.get(1, {})
+  deps = kwargs.get('dependencies', [])
+
+  if kwargs.get('skip', false)
+    continue
+  endif
+
+  found = cc.has_function(func, args: test_c_args)
+
+  if not found
+    foreach dep : deps
+      if not dep.found()
+        continue
+      endif
+      found = cc.has_function(func, args: test_c_args,
+                              dependencies: [dep])
+      if found
+        os_deps += dep
+        break
+      endif
+    endforeach
+  endif
+
+  func_check_results += {func: found}
+
+  if kwargs.get('define', true)
+    # Emulate autoconf behaviour of not-found->undef, found->1
+    cdata.set('HAVE_' + func.underscorify().to_upper(),
+              found  ? 1 : false,
+              description: 'Define to 1 if you have the `@0@\' function.'.format(func))
+  endif
+endforeach
+
+
+if cc.has_function('syslog', args: test_c_args) and \
+    cc.check_header('syslog.h', args: test_c_args)
+  cdata.set('HAVE_SYSLOG', 1)
+endif
+
+
+# if prerequisites for unnamed posix semas aren't fulfilled, fall back to sysv
+# semaphores
+if sema_kind == 'unnamed_posix' and \
+   not func_check_results.get('sem_init', false)
+  sema_kind = 'sysv'
+endif
+
+cdata.set('USE_@0@_SHARED_MEMORY'.format(shmem_kind.to_upper()), 1)
+cdata.set('USE_@0@_SEMAPHORES'.format(sema_kind.to_upper()), 1)
+
+cdata.set('MEMSET_LOOP_LIMIT', memset_loop_limit)
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+
+
+###############################################################
+# Threading
+###############################################################
+
+# XXX: About to rely on thread safety in the autoconf build, so not worth
+# implementing a fallback.
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+
+
+###############################################################
+# NLS / Gettext
+###############################################################
+
+nlsopt = get_option('nls')
+libintl = not_found_dep
+
+if not nlsopt.disabled()
+  # otherwise there'd be lots of
+  # "Gettext not found, all translation (po) targets will be ignored."
+  # warnings if not found.
+  msgfmt = find_program('msgfmt', required: nlsopt.enabled(), native: true)
+
+  # meson 0.59 has this wrapped in dependency('int')
+  if (msgfmt.found() and
+      cc.check_header('libintl.h', required: nlsopt,
+        args: test_c_args, include_directories: postgres_inc))
+
+    # in libc
+    if cc.has_function('ngettext')
+      libintl = declare_dependency()
+    else
+      libintl = cc.find_library('intl',
+        has_headers: ['libintl.h'], required: nlsopt,
+        header_include_directories: postgres_inc,
+        dirs: test_lib_d)
+    endif
+  endif
+
+  if libintl.found()
+    i18n = import('i18n')
+    cdata.set('ENABLE_NLS', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Build
+###############################################################
+
+# Set up compiler / linker arguments to be used everywhere, individual targets
+# can add further args directly, or indirectly via dependencies
+add_project_arguments(cflags, language: ['c'])
+add_project_arguments(cppflags, language: ['c'])
+add_project_arguments(cflags_warn, language: ['c'])
+add_project_arguments(cxxflags, language: ['cpp'])
+add_project_arguments(cppflags, language: ['cpp'])
+add_project_arguments(cxxflags_warn, language: ['cpp'])
+add_project_link_arguments(ldflags, language: ['c', 'cpp'])
+
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+# list of targets for various alias targets
+backend_targets = []
+bin_targets = []
+pl_targets = []
+contrib_targets = []
+testprep_targets = []
+
+
+# Define the tests to distribute them to the correct test styles later
+test_deps = []
+tests = []
+
+
+# Default options for targets
+
+# First identify rpaths
+bin_install_rpaths = []
+lib_install_rpaths = []
+mod_install_rpaths = []
+
+# Add extra_lib_dirs to rpath. Not needed on darwin, as the install_name of
+# libraries in extra_lib_dirs will be used anyway.
+if host_system != 'darwin'
+  bin_install_rpaths += postgres_lib_d
+  lib_install_rpaths += postgres_lib_d
+  mod_install_rpaths += postgres_lib_d
+endif
+
+
+# Define arguments for default targets
+
+default_target_args = {
+  'implicit_include_directories': false,
+  'install': true,
+}
+
+default_lib_args = default_target_args + {
+  'name_prefix': '',
+  'install_rpath': ':'.join(lib_install_rpaths),
+}
+
+internal_lib_args = default_lib_args + {
+  'build_by_default': false,
+  'install': false,
+}
+
+default_mod_args = default_lib_args + {
+  'name_prefix': '',
+  'install_dir': dir_lib_pkg,
+  'install_rpath': ':'.join(mod_install_rpaths),
+}
+
+default_bin_args = default_target_args + {
+  'install_dir': dir_bin,
+  'install_rpath': ':'.join(bin_install_rpaths),
+}
+
+
+
+# Helper for exporting a limited number of symbols
+gen_export_kwargs = {
+  'input': 'exports.txt',
+  'output': '@BASENAME@.'+export_file_suffix,
+  'command': [perl, files('src/tools/gen_export.pl'),
+   '--format', export_file_format,
+   '--input', '@INPUT0@', '--output', '@OUTPUT0@'],
+  'build_by_default': false,
+  'install': false,
+}
+
+
+
+# headers that the whole build tree depends on
+generated_headers = []
+# headers that the backend build depends on
+generated_backend_headers = []
+# configure_files() output, needs a way of converting to file names
+configure_files = []
+
+# generated files that might conflict with a partial in-tree autoconf build
+generated_sources = []
+# same, for paths that differ between autoconf / meson builds
+# elements are [dir, [files]]
+generated_sources_ac = {}
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+subdir('src/include')
+
+subdir('config')
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: [errcodes], # errcodes.h is needed due to use of ereport
+  dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: [os_deps, zlib, zstd],
+)
+
+backend_common_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: [os_deps, zlib, zstd],
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_args: ldflags_sl,
+  link_with: [pgport_shlib, common_shlib],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+libpq_deps += [
+  frontend_shlib_code,
+  thread_dep,
+
+  gssapi,
+  ldap_r,
+  libintl,
+  ssl,
+]
+
+subdir('src/interfaces/libpq')
+# fe_utils depends on libpq
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+  include_directories: [postgres_inc],
+  link_with: [fe_utils, common_static, pgport_static],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+backend_both_deps += [
+  thread_dep,
+  bsd_auth,
+  gssapi,
+  icu,
+  icu_i18n,
+  ldap,
+  libintl,
+  libxml,
+  lz4,
+  pam,
+  ssl,
+  systemd,
+  zlib,
+  zstd,
+]
+
+backend_mod_deps = backend_both_deps + os_deps
+
+backend_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  link_args: ldflags_be,
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: os_deps + backend_both_deps + backend_deps,
+)
+
+# src/backend/meson.build defines backend_mod_code used for extension
+# libraries.
+
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+subdir('src/interfaces/libpq/test')
+subdir('src/interfaces/ecpg/test')
+
+subdir('doc/src/sgml')
+
+generated_sources_ac += {'': ['GNUmakefile']}
+
+
+# If there are any files in the source directory that we also generate in the
+# build directory, they might get preferred over the newly generated files,
+# e.g. because of a #include "file", which always will search in the current
+# directory first.
+message('checking for file conflicts between source and build directory')
+conflicting_files = []
+potentially_conflicting_files_t = []
+potentially_conflicting_files_t += generated_headers
+potentially_conflicting_files_t += generated_backend_headers
+potentially_conflicting_files_t += generated_backend_sources
+potentially_conflicting_files_t += generated_sources
+
+potentially_conflicting_files = []
+
+# convert all sources of potentially conflicting files into uniform shape
+foreach t : potentially_conflicting_files_t
+  potentially_conflicting_files += t.full_path()
+endforeach
+foreach t : configure_files
+  t = '@0@'.format(t)
+  potentially_conflicting_files += meson.current_build_dir() / t
+endforeach
+foreach sub, fnames : generated_sources_ac
+  sub = meson.build_root() / sub
+  foreach fname : fnames
+    potentially_conflicting_files += sub / fname
+  endforeach
+endforeach
+
+# find and report conflicting files
+foreach build_path : potentially_conflicting_files
+  build_path = host_system == 'windows' ? fs.as_posix(build_path) : build_path
+  # str.replace is in 0.56
+  src_path = meson.current_source_dir() / build_path.split(meson.current_build_dir() / '')[1]
+  if fs.exists(src_path) or fs.is_symlink(src_path)
+    conflicting_files += src_path
+  endif
+endforeach
+# XXX: Perhaps we should generate a file that would clean these up? The list
+# can be long.
+if conflicting_files.length() > 0
+  errmsg_cleanup = '''
+Conflicting files in source directory:
+  @0@
+
+The conflicting files need to be removed, either by removing the files listed
+above, or by running configure and then make maintainer-clean.
+'''
+  errmsg_cleanup = errmsg_cleanup.format(' '.join(conflicting_files))
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+  if host_system == 'windows'
+    if prefix.split(':\\').length() == 1
+      # just a drive
+      test_prefix = ''
+    else
+      test_prefix = prefix.split(':\\')[1]
+    endif
+  else
+    assert(prefix.startswith('/'))
+    test_prefix = './@0@'.format(prefix)
+  endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+meson_install_args = meson_args + ['install'] + {
+    'meson': ['--quiet', '--only-changed', '--no-rebuild'],
+    'muon': []
+}[meson_impl]
+
+test('tmp_install',
+    meson_bin, args: meson_install_args ,
+    env: {'DESTDIR':test_install_destdir},
+    priority: 100,
+    timeout: 300,
+    is_parallel: false,
+    suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport = 40000
+
+test_env = environment()
+
+temp_install_bindir = test_install_location / get_option('bindir')
+test_env.set('PG_REGRESS', pg_regress.full_path())
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA so it can be checked in individual tap tests.
+test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
+
+# Add the temporary installation to the library search path on platforms where
+# that works (everything but windows, basically). On windows everything
+# library-like gets installed into bindir, solving that issue.
+if library_path_var != ''
+  test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
+endif
+
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+testwrap = files('src/tools/testwrap')
+
+foreach test_dir : tests
+  testwrap_base = [
+    testwrap,
+    '--basedir', meson.build_root(),
+    '--srcdir', test_dir['sd'],
+    '--testgroup', test_dir['name'],
+  ]
+
+  foreach kind, v : test_dir
+    if kind in ['sd', 'bd', 'name']
+      continue
+    endif
+
+    t = test_dir[kind]
+
+    if kind in ['regress', 'isolation', 'ecpg']
+      if kind == 'regress'
+        runner = pg_regress
+      elif kind == 'isolation'
+        runner = pg_isolation_regress
+      elif kind == 'ecpg'
+        runner = pg_regress_ecpg
+      endif
+
+      test_output = test_result_dir / test_dir['name'] / kind
+
+      test_command = [
+        runner.full_path(),
+        '--inputdir', t.get('inputdir', test_dir['sd']),
+        '--expecteddir', t.get('expecteddir', test_dir['sd']),
+        '--outputdir', test_output,
+        '--temp-instance', test_output / 'tmp_check',
+        '--bindir', '',
+        '--dlpath', test_dir['bd'],
+        '--max-concurrent-tests=20',
+        '--port', testport.to_string(),
+      ] + t.get('regress_args', [])
+
+      if t.has_key('schedule')
+        test_command += ['--schedule', t['schedule'],]
+      endif
+
+      if kind == 'isolation'
+        test_command += t.get('specs', [])
+      else
+        test_command += t.get('sql', [])
+      endif
+
+      env = test_env
+      env.prepend('PATH', temp_install_bindir, test_dir['bd'])
+
+      test_kwargs = {
+        'suite': [test_dir['name']],
+        'priority': 10,
+        'timeout': 1000,
+        'depends': test_deps + t.get('deps', []),
+        'env': env,
+      } + t.get('test_kwargs', {})
+
+      test(test_dir['name'] / kind,
+        python,
+        args: testwrap_base + [
+          '--testname', kind,
+          '--', test_command,
+        ],
+        kwargs: test_kwargs,
+      )
+
+      testport += 1
+    elif kind == 'tap'
+      if not tap_tests_enabled
+        continue
+      endif
+
+      test_command = [
+        perl.path(),
+        '-I', meson.source_root() / 'src/test/perl',
+        '-I', test_dir['sd'],
+      ]
+
+      # Add temporary install, the build directory for non-installed binaries and
+      # also test/ for non-installed test binaries built separately.
+      env = test_env
+      env.prepend('PATH', temp_install_bindir, test_dir['bd'], test_dir['bd'] / 'test')
+
+      foreach name, value : t.get('env', {})
+        env.set(name, value)
+      endforeach
+
+      test_kwargs = {
+        'protocol': 'tap',
+        'suite': [test_dir['name']],
+        'timeout': 1000,
+        'depends': test_deps + t.get('deps', []),
+        'env': env,
+      } + t.get('test_kwargs', {})
+
+      foreach onetap : t['tests']
+        # Make tap test names prettier, remove t/ and .pl
+        onetap_p = onetap
+        if onetap_p.startswith('t/')
+          onetap_p = onetap.split('t/')[1]
+        endif
+        if onetap_p.endswith('.pl')
+          onetap_p = fs.stem(onetap_p)
+        endif
+
+        test(test_dir['name'] / onetap_p,
+          python,
+          kwargs: test_kwargs,
+          args: testwrap_base + [
+            '--testname', onetap_p,
+            '--', test_command,
+            test_dir['sd'] / onetap,
+          ],
+        )
+      endforeach
+    else
+      error('unknown kind @0@ of test in @1@'.format(kind, test_dir['sd']))
+    endif
+
+  endforeach # kinds of tests
+
+endforeach # directories with tests
+
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+alias_target('bin', bin_targets + [libpq_st])
+alias_target('pl', pl_targets)
+alias_target('contrib', contrib_targets)
+alias_target('testprep', testprep_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+  summary(
+    {
+      'data block size': cdata.get('BLCKSZ'),
+      'WAL block size': cdata.get('XLOG_BLCKSZ') / 1024,
+      'segment size': cdata.get('RELSEG_SIZE') / 131072,
+    },
+    section: 'Data layout',
+  )
+
+  summary(
+    {
+      'host system': '@0@ @1@'.format(host_system, host_cpu),
+      'build system': '@0@ @1@'.format(build_machine.system(),
+                                       build_machine.cpu_family()),
+    },
+    section: 'System',
+  )
+
+  summary(
+    {
+      'linker': '@0@'.format(cc.get_linker_id()),
+      'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+    },
+    section: 'Compiler',
+  )
+
+  summary(
+    {
+      'CPP FLAGS': ' '.join(cppflags),
+      'C FLAGS, functional': ' '.join(cflags),
+      'C FLAGS, warnings': ' '.join(cflags_warn),
+    },
+    section: 'Compiler Flags',
+  )
+
+  if llvm.found()
+    summary(
+      {
+        'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version()),
+      },
+      section: 'Compiler',
+    )
+
+    summary(
+      {
+        'C++ FLAGS, functional': ' '.join(cxxflags),
+        'C++ FLAGS, warnings': ' '.join(cxxflags_warn),
+      },
+      section: 'Compiler Flags',
+    )
+  endif
+
+  summary(
+    {
+      'bison': '@0@ @1@'.format(bison.full_path(), bison_version),
+      'dtrace': dtrace,
+    },
+    section: 'Programs',
+  )
+
+  summary(
+    {
+      'bonjour': bonjour,
+      'bsd_auth': bsd_auth,
+      'gss': gssapi,
+      'icu': icu,
+      'ldap': ldap,
+      'libxml': libxml,
+      'libxslt': libxslt,
+      'llvm': llvm,
+      'lz4': lz4,
+      'nls': libintl,
+      'pam': pam,
+      'plperl': perl_dep,
+      'plpython': python3_dep,
+      'pltcl': tcl_dep,
+      'readline': readline,
+      'selinux': selinux,
+      'ssl': ssl,
+      'systemd': systemd,
+      'uuid': uuid,
+      'zlib': zlib,
+      'zstd': zstd,
+    },
+    section: 'External libraries',
+  )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..e847755caa4
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,185 @@
+# Data layout influencing options
+
+option('blocksize', type : 'combo',
+  choices : ['1', '2', '4', '8', '16', '32'],
+  value : '8',
+  description: 'set relation block size in kB')
+
+option('wal_blocksize', type : 'combo',
+  choices: ['1', '2', '4', '8', '16', '32', '64'],
+  value: '8',
+  description : '''WAL block size, in kilobytes''')
+
+option('segsize', type : 'integer', value : 1,
+  description : '''Segment size, in gigabytes''')
+
+
+# Miscellaneous options
+
+option('krb_srvnam', type : 'string', value : 'postgres',
+  description : '''Default Kerberos service principal for GSSAPI''')
+
+option('system_tzdata', type: 'string', value: '',
+  description: 'use system time zone data in specified directory')
+
+
+# Defaults
+
+option('pgport', type : 'integer', value : 5432,
+  min: 1, max: 65535,
+  description : '''Default port number for server and clients''')
+
+
+# Developer options
+
+option('cassert', type : 'boolean', value: false,
+  description: 'enable assertion checks (for debugging)')
+
+option('tap_tests', type : 'feature', value : 'auto',
+  description : 'Whether to enable tap tests')
+
+option('PG_TEST_EXTRA', type : 'string', value: 'kerberos ldap ssl',
+  description: 'Enable selected extra tests')
+
+option('atomics', type : 'boolean', value: true,
+  description: 'whether to use atomic operations')
+
+option('spinlocks', type : 'boolean', value: true,
+  description: 'whether to use spinlocks')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for headers')
+
+option('extra_lib_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for libs')
+
+option('extra_version', type : 'string', value: '',
+  description: 'append STRING to the PostgreSQL version number')
+
+option('darwin_sysroot', type : 'string', value: '',
+  description: 'select a non-default sysroot path')
+
+
+# External dependencies
+
+option('bonjour', type : 'feature', value: 'auto',
+  description: 'build with Bonjour support')
+
+option('bsd_auth', type : 'feature', value: 'auto',
+  description: 'build with BSD Authentication support')
+
+option('dtrace', type : 'feature', value: 'disabled',
+  description: 'DTrace support')
+
+option('gssapi', type : 'feature', value: 'auto',
+  description: 'GSSAPI support')
+
+option('icu', type : 'feature', value: 'auto',
+  description: 'ICU support')
+
+option('ldap', type : 'feature', value: 'auto',
+  description: 'LDAP support')
+
+option('libedit_preferred', type : 'boolean', value: false,
+  description: 'Prefer BSD Libedit over GNU Readline')
+
+option('libxml', type : 'feature', value: 'auto',
+  description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+  description: 'XSLT support in contrib/xml2')
+
+option('llvm', type : 'feature', value: 'disabled',
+  description: 'whether to use llvm')
+
+option('lz4', type : 'feature', value: 'auto',
+  description: 'LZ4 support')
+
+option('nls', type: 'feature', value: 'auto',
+  description: 'native language support')
+
+option('pam', type : 'feature', value: 'auto',
+  description: 'build with PAM support')
+
+option('plperl', type : 'feature', value: 'auto',
+  description: 'build Perl modules (PL/Perl)')
+
+option('plpython', type : 'feature', value: 'auto',
+  description: 'build Python modules (PL/Python)')
+
+option('pltcl', type : 'feature', value: 'auto',
+  description: 'build with TCL support')
+
+option('tcl_version', type : 'string', value : 'tcl',
+  description: 'specify TCL version')
+
+option('readline', type : 'feature', value : 'auto',
+  description: 'use GNU Readline or BSD Libedit for editing')
+
+option('selinux', type : 'feature', value : 'disabled',
+  description: 'build with SELinux support')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'],
+  value : 'none',
+  description: 'use LIB for SSL/TLS support (openssl)')
+
+option('systemd', type : 'feature', value: 'auto',
+  description: 'build with systemd support')
+
+option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'],
+  value : 'none',
+  description: 'build contrib/uuid-ossp using LIB')
+
+option('zlib', type : 'feature', value: 'auto',
+  description: 'whether to use zlib')
+
+option('zstd', type : 'feature', value: 'auto',
+  description: 'whether to use zstd')
+
+
+# Programs
+
+option('BISON', type : 'array', value: ['bison', 'win_bison'],
+  description: 'path to bison binary')
+
+option('DTRACE', type : 'string', value: 'dtrace',
+  description: 'path to dtrace binary')
+
+option('FLEX', type : 'array', value: ['flex', 'win_flex'],
+  description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+  description: 'path to gzip binary')
+
+option('LZ4', type : 'string', value: 'lz4',
+  description: 'path to lz4 binary')
+
+option('PERL', type : 'string', value: 'perl',
+  description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+  description: 'path to prove binary')
+
+option('PYTHON', type : 'array', value: ['python3', 'python'],
+  description: 'path to python binary')
+
+option('SED', type : 'string', value: 'gsed',
+  description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+  description: 'path to tar binary')
+
+option('XMLLINT', type : 'string', value: 'xmllint',
+  description: 'path to xmllint binary')
+
+option('XSLTPROC', type : 'string', value: 'xsltproc',
+  description: 'path to xsltproc binary')
+
+option('ZSTD', type : 'string', value: 'zstd',
+  description: 'path to zstd binary')
+
+option('ZIC', type : 'string', value: 'zic',
+  description: 'path to zic binary, when cross-compiling')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..a7fdd5a13ed
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,12 @@
+# libraries that other subsystems might depend uppon first, in their
+# respective dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
+
+subdir('interfaces')
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..daf8b4aa44f
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,56 @@
+# files to build into backend
+timezone_sources = files(
+  'localtime.c',
+  'pgtz.c',
+  'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+   'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+  'data/tzdata.zi'
+)
+
+
+if get_option('system_tzdata') == ''
+  # FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+  # build our zic. But for that we'd need to run a good chunk of the configure
+  # tests both natively and cross. Unclear if it's worth it.
+  if meson.is_cross_build()
+    zic = find_program(get_option('ZIC'), native: true, required: true)
+  else
+    zic = executable('zic', zic_sources,
+                     dependencies: [frontend_code],
+                     kwargs: default_bin_args + {'install': false}
+                    )
+  endif
+
+  tzdata = custom_target('tzdata',
+    input: tzdata,
+    output: ['timezone'],
+    command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+    install: true,
+    install_dir: dir_data,
+  )
+
+  bin_targets += tzdata
+
+  # FIXME: make sorts this - but the file isn't actually used, so ...
+  custom_target('abbrevs.txt',
+    input: tzdata,
+    output: ['abbrevs.txt'],
+    command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+    capture: true)
+
+endif
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..7e0a682bd9e
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,21 @@
+tznames = files(
+  'Africa.txt',
+  'America.txt',
+  'Antarctica.txt',
+  'Asia.txt',
+  'Atlantic.txt',
+  'Australia.txt',
+  'Etc.txt',
+  'Europe.txt',
+  'Indian.txt',
+  'Pacific.txt',
+)
+
+tznames_sets = files(
+  'Default',
+  'Australia',
+  'India')
+
+install_data(tznames, tznames_sets,
+  install_dir: dir_data / 'timezonesets',
+)
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..50e501a8011
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+#
+# Returns the path to the meson binary, for cases where we need to call it as
+# part of the build, e.g. to install into tmp_install/ for the tests.
+
+import os
+import shlex
+import sys
+
+to_print = []
+
+if 'MUON_PATH' in os.environ:
+    to_print += ['muon', os.environ['MUON_PATH']]
+else:
+    mesonintrospect = os.environ['MESONINTROSPECT']
+    components = shlex.split(mesonintrospect)
+
+    if len(components) < 2:
+        print('expected more than two components, got: %s' % components)
+        sys.exit(1)
+
+    if components[-1] != 'introspect':
+        print('expected introspection at the end')
+        sys.exit(1)
+
+    to_print += ['meson'] + components[:-1]
+
+print('\n'.join(to_print), end='')
+
+sys.exit(0)
diff --git a/src/tools/pgflex b/src/tools/pgflex
new file mode 100755
index 00000000000..baabe2df1c8
--- /dev/null
+++ b/src/tools/pgflex
@@ -0,0 +1,85 @@
+#!/usr/bin/env python3
+
+#
+# Wrapper around flex that:
+# - ensures lex.backup is created in a private directory
+# - can error out if lex.backup is created (--no-backup)
+# - can fix warnings (--fix-warnings)
+# - works around concurrency issues with win_flex.exe:
+#   https://github.com/lexxmark/winflexbison/issues/86
+
+import argparse
+import os
+import subprocess
+import sys
+from os.path import abspath
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--flex', type=abspath, required=True)
+parser.add_argument('--perl', type=abspath, required=True)
+parser.add_argument('--builddir', type=abspath, required=True)
+parser.add_argument('--srcdir', type=abspath, required=True)
+parser.add_argument('--privatedir', type=abspath, required=True,
+                    help='private directory for target')
+
+parser.add_argument('-o', dest='output_file', type=abspath, required=True,
+                    help='output file')
+parser.add_argument('-i', dest='input_file', type=abspath, help='input file')
+
+
+parser.add_argument('--fix-warnings', action='store_true',
+                    help='whether to fix warnings in generated file')
+parser.add_argument('--no-backup', action='store_true',
+                    help='whether no_backup is enabled or not')
+
+parser.add_argument('flex_flags', nargs='*', help='flags passed on to flex')
+
+args = parser.parse_args()
+
+# Since 'lex.backup' is always named that and ninja uses the top level build
+# directory as current directory for all commands, change directory to
+# temporary directory to avoid conflicts between concurrent flex
+# invocations. Only unreleased versions of flex have an argument to change
+# lex.filename to be named differently.
+if not os.path.isdir(args.privatedir):
+    os.mkdir(args.privatedir)
+os.chdir(args.privatedir)
+
+# win_flex.exe generates names in a racy way, sometimes leading to random
+# "error deleting file" failures and sometimes to intermingled file
+# contents. Set FLEX_TMP_DIR to the target private directory to avoid
+# that. That environment variable isn't consulted on other platforms, so we
+# don't even need to make this conditional.
+env = {'FLEX_TMP_DIR': args.privatedir}
+
+# build flex invocation
+command = [args.flex, '-o', args.output_file]
+if args.no_backup:
+    command += ['-b']
+command += args.flex_flags
+command += [args.input_file]
+
+# create .c file from .l file
+sp = subprocess.run(command, env=env)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# check lex.backup
+if args.no_backup:
+    with open('lex.backup') as lex:
+        if len(lex.readlines()) != 1:
+            sys.exit('Scanner requires backup; see lex.backup.')
+    os.remove('lex.backup')
+
+# fix warnings
+if args.fix_warnings:
+    fix_warning_script = os.path.join(args.srcdir,
+                                      'src/tools/fix-old-flex-code.pl')
+
+    command = [args.perl, fix_warning_script, args.output_file]
+    sp = subprocess.run(command)
+    if sp.returncode != 0:
+        sys.exit(sp.returncode)
+
+sys.exit(0)
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..7a64fe76a2d
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+
+import argparse
+import shutil
+import subprocess
+import os
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--srcdir', help='source directory of test', type=str)
+parser.add_argument('--basedir', help='base directory of test', type=str)
+parser.add_argument('--testgroup', help='test group', type=str)
+parser.add_argument('--testname', help='test name', type=str)
+parser.add_argument('test_command', nargs='*')
+
+args = parser.parse_args()
+
+testdir = '{}/testrun/{}/{}'.format(
+    args.basedir, args.testgroup, args.testname)
+
+print('# executing test in {} group {} test {}'.format(
+    testdir, args.testgroup, args.testname))
+sys.stdout.flush()
+
+if os.path.exists(testdir) and os.path.isdir(testdir):
+    shutil.rmtree(testdir)
+os.makedirs(testdir)
+
+os.chdir(args.srcdir)
+
+# mark test as having started
+open(os.path.join(testdir, 'test.start'), 'x')
+
+env_dict = {**os.environ,
+            'TESTDATADIR': os.path.join(testdir, 'data'),
+            'TESTLOGDIR': os.path.join(testdir, 'log')}
+
+sp = subprocess.run(args.test_command, env=env_dict)
+
+if sp.returncode == 0:
+    print('# test succeeded')
+    open(os.path.join(testdir, 'test.success'), 'x')
+else:
+    print('# test failed')
+    open(os.path.join(testdir, 'test.fail'), 'x')
+sys.exit(sp.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v13-0009-ci-windows-set-error-mode-to-not-include-SEM_NOG.patchtext/x-diff; charset=us-asciiDownload
From 4ea8b4291afc676e71713970186da5e112918a0e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 9 Sep 2022 14:52:00 -0700
Subject: [PATCH v13 09/20] ci: windows: set error mode to not include
 SEM_NOGPFAULTERRORBOX

This allows crashdumps to work and fixes an odd python crash.

Discussion: https://postgr.es/m/20220909235836.lz3igxtkcjb5w7zb%40awork3.anarazel.de
---
 .cirrus.yml | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/.cirrus.yml b/.cirrus.yml
index 81eb8a9996d..7034352c487 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -386,6 +386,15 @@ task:
     # currently have a tool for that...
     CIRRUS_ESCAPING_PROCESSES: 1
 
+    # Cirrus defaults to SetErrorMode(SEM_NOGPFAULTERRORBOX | ...). That
+    # prevents crash reporting from working unless binaries do SetErrorMode()
+    # themselves. Furthermore, it appears that either python or, more likely,
+    # the C runtime has a bug where SEM_NOGPFAULTERRORBOX can very
+    # occasionally *trigger* a crash on process exit - which is hard to debug,
+    # given that it explicitly prevents crash dumps from working...
+    # 0x8001 is SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX
+    CIRRUS_WINDOWS_ERROR_MODE: 0x8001
+
   only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*'
 
   windows_container:
@@ -398,6 +407,7 @@ task:
     systeminfo
     powershell -Command get-psdrive -psprovider filesystem
     set
+    python -c "import msvcrt; print(hex(msvcrt.GetErrorMode()))"
 
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
-- 
2.37.3.542.gdd3f6c4cae

v13-0012-meson-prereq-win-remove-date-from-version-number.patchtext/x-diff; charset=us-asciiDownload
From 506d219f1054bbac18034a1ca35788900010876a Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 14 Sep 2022 16:43:47 -0700
Subject: [PATCH v13 12/20] meson: prereq: win: remove date from version number
 in win32ver.rc

This may have served a purpose at some point, but these days it just
contributes to a non-reproducible build.

Discussion: https://postgr.es/m/1cef5b48-32bd-5cbf-fb62-fb648860f5ef@enterprisedb.com
---
 src/makefiles/Makefile.win32 | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32
index 17d68196442..d268b3ebafd 100644
--- a/src/makefiles/Makefile.win32
+++ b/src/makefiles/Makefile.win32
@@ -69,7 +69,6 @@ win32ver.rc: $(top_srcdir)/src/port/win32ver.rc
 	sed -e 's;FILEDESC;$(PGFILEDESC);' \
 	    -e 's;VFT_APP;$(PGFTYPE);' \
 	    -e 's;_ICO_;$(PGICOSTR);' \
-	    -e 's;\(VERSION.*\),0 *$$;\1,'`date '+%y%j' | sed 's/^0*//'`';' \
 	    -e '/_INTERNAL_NAME_/$(if $(shlib),s;_INTERNAL_NAME_;"$(basename $(shlib))";,d)' \
 	    -e '/_ORIGINAL_NAME_/$(if $(shlib),s;_ORIGINAL_NAME_;"$(shlib)";,d)' \
 	  $< >$@
-- 
2.37.3.542.gdd3f6c4cae

v13-0013-meson-WIP-Add-some-of-the-windows-resource-files.patchtext/x-diff; charset=us-asciiDownload
From b61df29fc04648608c728d760ac00225fb84c890 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 14 Sep 2022 17:14:22 -0700
Subject: [PATCH v13 13/20] meson: WIP: Add some of the windows resource files

---
 src/bin/initdb/meson.build        |  6 ++
 src/bin/pg_dump/meson.build       | 18 ++++++
 src/bin/pg_test_fsync/meson.build |  5 ++
 src/bin/pgevent/meson.build       |  4 ++
 src/bin/psql/meson.build          |  6 ++
 src/interfaces/libpq/meson.build  |  5 ++
 contrib/pageinspect/meson.build   |  5 ++
 contrib/pg_walinspect/meson.build |  5 ++
 meson.build                       | 61 +++++++++++++++++++
 src/tools/rcgen                   | 99 +++++++++++++++++++++++++++++++
 10 files changed, 214 insertions(+)
 create mode 100755 src/tools/rcgen

diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 9f213274d2f..6ced9a31b80 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -7,6 +7,12 @@ initdb_sources += timezone_localtime_source
 
 #fixme: reimplement libpq_pgport logic
 
+if host_system == 'windows'
+  initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'initdb',
+    '--FILEDESC', 'initdb - initialize a new database cluster',])
+endif
+
 initdb = executable('initdb',
   initdb_sources,
   include_directories: [timezone_inc],
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 785ec094dbd..3527a25c288 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -24,6 +24,12 @@ pg_dump_sources = files(
   'pg_dump_sort.c',
 )
 
+if host_system == 'windows'
+  pg_dump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dump',
+    '--FILEDESC', 'pg_dump - backup one PostgreSQL database',])
+endif
+
 pg_dump = executable('pg_dump',
   pg_dump_sources,
   link_with: [pg_dump_common],
@@ -37,6 +43,12 @@ pg_dumpall_sources = files(
   'pg_dumpall.c',
 )
 
+if host_system == 'windows'
+  pg_dumpall_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dumpall',
+    '--FILEDESC', 'pg_dumpall - backup PostgreSQL databases'])
+endif
+
 pg_dumpall = executable('pg_dumpall',
   pg_dumpall_sources,
   link_with: [pg_dump_common],
@@ -50,6 +62,12 @@ pg_restore_sources = files(
   'pg_restore.c',
 )
 
+if host_system == 'windows'
+  pg_restore_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_restore',
+    '--FILEDESC', 'pg_restore - restore PostgreSQL databases'])
+endif
+
 pg_restore = executable('pg_restore',
   pg_restore_sources,
   link_with: [pg_dump_common],
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index 2c01831e11f..2bbc3cb915d 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -1,5 +1,10 @@
 test_fsync_sources = files('pg_test_fsync.c')
 
+if host_system == 'windows'
+  test_fsync_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_fsync'])
+endif
+
 pg_test_fsync = executable('pg_test_fsync',
   test_fsync_sources,
   dependencies: [frontend_code],
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
index 5852bca4d87..2e9aea4b0e1 100644
--- a/src/bin/pgevent/meson.build
+++ b/src/bin/pgevent/meson.build
@@ -6,6 +6,10 @@ pgevent_sources = files(
   'pgevent.c',
 )
 
+pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+  '--NAME', 'pgevent',
+  '--FILEDESC', 'Eventlog message formatter',])
+
 pgevent_sources += windows.compile_resources('pgmsgevent.rc')
 
 # FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index ea850c8fdf5..3474389d3b6 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -38,6 +38,12 @@ generated_sources += sql_help.to_list()
 psql_sources += sql_help
 bin_targets += sql_help
 
+if host_system == 'windows'
+  psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'psql',
+    '--FILEDESC', 'psql - the PostgreSQL interactive terminal',])
+endif
+
 psql = executable('psql',
   psql_sources,
   include_directories: include_directories('.'),
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bc047e00d62..2c9edeaa088 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -16,9 +16,13 @@ libpq_sources = files(
   'libpq-events.c',
   'pqexpbuffer.c',
 )
+libpq_so_sources = [] # only for shared lib, in addition to above
 
 if host_system == 'windows'
   libpq_sources += files('pthread-win32.c', 'win32.c')
+  libpq_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq',
+    '--FILEDESC', 'PostgreSQL Access Library',])
 endif
 
 if ssl.found()
@@ -52,6 +56,7 @@ libpq_st = static_library('libpq',
 # not using both_libraries here, causes problems with precompiled headers and
 # resource files with msbuild
 libpq_so = shared_library('libpq',
+  libpq_so_sources,
   dependencies: libpq_deps,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
index 4af8153e4fd..050d60525c7 100644
--- a/contrib/pageinspect/meson.build
+++ b/contrib/pageinspect/meson.build
@@ -9,6 +9,11 @@ pageinspect_sources = files(
   'rawpage.c',
 )
 
+if host_system == 'windows'
+  initdb_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pageinspect',])
+endif
+
 pageinspect = shared_module('pageinspect',
   pageinspect_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index d6b27877dd0..aafd9a37f23 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -1,5 +1,10 @@
 pg_walinspect_sources = files('pg_walinspect.c')
 
+if host_system == 'windows'
+  pg_walinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_walinspect'])
+endif
+
 pg_walinspect = shared_module('pg_walinspect',
   pg_walinspect_sources,
   kwargs: contrib_mod_args + {
diff --git a/meson.build b/meson.build
index d5411831e82..11ce27c60ee 100644
--- a/meson.build
+++ b/meson.build
@@ -2525,6 +2525,67 @@ gen_export_kwargs = {
 
 
 
+###
+### windows resources related stuff
+###
+
+if host_system == 'windows'
+  pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+  win32ver_rc = files('src/port/win32ver.rc')
+  rcgen = find_program('src/tools/rcgen', native: true)
+
+  rcgen_base_args = [
+    '--srcdir', '@SOURCE_DIR@',
+    '--builddir', meson.build_root(),
+    '--rcout', '@OUTPUT0@',
+    '--out', '@OUTPUT1@',
+    '--input', '@INPUT@',
+    '@EXTRA_ARGS@',
+  ]
+
+  if cc.get_argument_syntax() == 'msvc'
+    rcgen_base_args += [
+      '--rc', find_program('rc', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.res']
+  else
+    rcgen_base_args += [
+      '--windres', find_program('windres', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.obj']
+  endif
+
+  # msbuild backend doesn't support this atm
+  if meson.backend() == 'ninja'
+    rcgen_base_args += ['--depfile', '@DEPFILE@']
+  endif
+
+  rcgen_bin_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_APP',
+    '--FILEENDING', 'exe',
+    '--ICO', pg_ico
+  ]
+
+  rcgen_lib_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_DLL',
+    '--FILEENDING', 'dll',
+  ]
+
+  rc_bin_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_bin_args,
+    output: rcgen_outputs,
+  )
+
+  rc_lib_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_lib_args,
+    output: rcgen_outputs,
+  )
+endif
+
+
+
 # headers that the whole build tree depends on
 generated_headers = []
 # headers that the backend build depends on
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..5b62bfe5410
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('--srcdir', type=os.path.abspath,
+                    required=True)
+parser.add_argument('--builddir', type=os.path.abspath,
+                    required=True)
+
+binaries = parser.add_argument_group('binaries')
+binaries.add_argument('--windres', type=os.path.abspath)
+binaries.add_argument('--rc', type=os.path.abspath)
+
+inout = parser.add_argument_group('inout')
+inout.add_argument('--depfile', type=argparse.FileType('w'))
+inout.add_argument('--input', type=argparse.FileType('r'),
+                   required=True)
+inout.add_argument('--rcout', type=argparse.FileType('w'),
+                   required=True)
+inout.add_argument('--out', type=str,
+                   required=True)
+
+replacements = parser.add_argument_group('replacements')
+replacements.add_argument('--FILEDESC', type=str)
+replacements.add_argument('--NAME', type=str, required=True)
+replacements.add_argument('--VFT_TYPE', type=str, required=True)
+replacements.add_argument('--FILEENDING', type=str, required=True)
+replacements.add_argument('--ICO', type=str)
+
+args = parser.parse_args()
+
+# determine replacement strings
+
+internal_name = '"{0}"'.format(args.NAME)
+original_name = '"{0}.{1}"'.format(args.NAME, args.FILEENDING)
+
+# if no description is passed in, generate one based on the name
+if args.FILEDESC:
+    filedesc = args.FILEDESC
+elif args.NAME:
+    if args.VFT_TYPE == 'VFT_DLL':
+        filedesc = 'PostgreSQL {0} library'.format(args.NAME)
+    else:
+        filedesc = 'PostgreSQL {0} binary'.format(args.NAME)
+filedesc = '"{0}"'.format(filedesc)
+
+
+if args.ICO:
+    ico = 'IDI_ICON ICON "{0}"'.format(args.ICO)
+    if args.depfile:
+        args.depfile.write("{0} : {1}\n".format(args.rcout.name, args.ICO))
+else:
+    ico = ''
+
+
+data = args.input.read()
+
+data = data.replace('VFT_APP', args.VFT_TYPE)
+data = data.replace('_INTERNAL_NAME_', internal_name)
+data = data.replace('_ORIGINAL_NAME_', original_name)
+data = data.replace('FILEDESC', filedesc)
+data = data.replace("_ICO_", ico)
+
+args.rcout.write(data)
+args.rcout.close()
+
+if args.windres:
+    cmd = [
+        args.windres,
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '-o', args.out, '-i', args.rcout.name,
+    ]
+elif args.rc:
+    cmd = [
+        args.rc, '/nologo',
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '/fo', args.out, args.rcout.name,
+    ]
+else:
+    sys.exit('either --windres or --rc needs to be specified')
+
+sp = subprocess.run(cmd)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# It'd be nicer if we could generate correct dependencies here, but 'rc'
+# doesn't support doing so. It's unlikely we'll ever need more, so...
+if args.depfile:
+    args.depfile.write("{0} : {1}\n".format(
+        args.rcout.name, args.input.name))
+    args.depfile.write("{0} : {1}/{2}\n".format(
+        args.out, args.builddir, 'src/include/pg_config.h'))
-- 
2.37.3.542.gdd3f6c4cae

v13-0014-meson-Add-support-for-relative-rpaths-fixing-tes.patchtext/x-diff; charset=us-asciiDownload
From fbee3715e97a09f2676e5b6bee4eb0637472010f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 30 Aug 2022 16:15:05 -0700
Subject: [PATCH v13 14/20] meson: Add support for relative rpaths, fixing
 tests on MacOS w/ SIP

---
 meson.build                                   | 47 ++++++++--
 .../relativize_shared_library_references      | 88 +++++++++++++++++++
 src/tools/relpath.py                          |  6 ++
 3 files changed, 136 insertions(+), 5 deletions(-)
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py

diff --git a/meson.build b/meson.build
index 11ce27c60ee..31c7dbe0ea0 100644
--- a/meson.build
+++ b/meson.build
@@ -159,6 +159,7 @@ portname = host_system
 
 exesuffix = '' # overridden below where necessary
 dlsuffix = '.so' # overridden below where necessary
+rpath_origin = '$ORIGIN'
 library_path_var = 'LD_LIBRARY_PATH'
 
 # Format of file to control exports from libraries, and how to pass them to
@@ -209,6 +210,7 @@ elif host_system == 'cygwin'
 elif host_system == 'darwin'
   dlsuffix = '.dylib'
   ld_library_path_var = 'DYLD_LIBRARY_PATH'
+  rpath_origin = '@loader_path'
 
   export_file_format = 'darwin'
   export_fmt = '-exported_symbols_list=@0@'
@@ -241,8 +243,16 @@ elif host_system == 'netbsd'
   # LDFLAGS.
   ldflags += ['-Wl,-z,now', '-Wl,-z,relro']
 
+  # netbsd patched their meson in a broken way:
+  # https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=56959
+  # until there's a way out of that, disable rpath_origin
+  rpath_origin = ''
+
 elif host_system == 'openbsd'
-  # you're ok
+  # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+  # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+  # when invoked via PATH search).
+  rpath_origin = ''
 
 elif host_system == 'sunos'
   portname = 'solaris'
@@ -254,6 +264,7 @@ elif host_system == 'windows'
   exesuffix = '.exe'
   dlsuffix = '.dll'
   ld_library_path_var = ''
+  rpath_origin = ''
 
   export_file_format = 'win'
   export_file_suffix = 'def'
@@ -2481,6 +2492,25 @@ if host_system != 'darwin'
   mod_install_rpaths += postgres_lib_d
 endif
 
+# If the host can form relative rpaths, use that to make the installation
+# properly relocatable
+if rpath_origin != ''
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_bin, dir_lib, check: true).stdout().strip()
+  bin_install_rpaths += rpath_origin / bin_to_lib
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_lib_pkg, dir_lib, check: true).stdout().strip()
+  mod_install_rpaths += rpath_origin / mod_to_lib
+
+  test_use_library_path_var = false
+else
+  test_use_library_path_var = true
+endif
+
 
 # Define arguments for default targets
 
@@ -2773,6 +2803,14 @@ above, or by running configure and then make maintainer-clean.
 endif
 
 
+# To make MacOS installation work without a prior make install, even with SIP
+# enabled, make rpaths relative after installation. This also makes the
+# installation relocatable.
+if host_system == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
 
 ###############################################################
 # Test prep
@@ -2838,10 +2876,9 @@ test_env.set('REGRESS_SHLIB', regress_module.full_path())
 # Export PG_TEST_EXTRA so it can be checked in individual tap tests.
 test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
 
-# Add the temporary installation to the library search path on platforms where
-# that works (everything but windows, basically). On windows everything
-# library-like gets installed into bindir, solving that issue.
-if library_path_var != ''
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if test_use_library_path_var and library_path_var != ''
   test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
 endif
 
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..280bd48fd32
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    meson_info_p = os.path.join(build_root, 'meson-info')
+    targets = json.load(
+        open(os.path.join(meson_info_p, 'intro-targets.json')))
+    installed = json.load(
+        open(os.path.join(meson_info_p, 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            # print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            cmd = install_name_tool + ['-change', lib, newref, patchpath]
+            subprocess.check_call(cmd)
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}',
+          file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
-- 
2.37.3.542.gdd3f6c4cae

v13-0015-meson-Add-docs-for-building-with-meson.patchtext/x-diff; charset=us-asciiDownload
From 054375bef37c93c921a5579928e7b4e1dafd13ea Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:55:20 -0700
Subject: [PATCH v13 15/20] meson: Add docs for building with meson

Author: Samay Sharma <smilingsamay@gmail.com>
---
 doc/src/sgml/installation.sgml | 1841 ++++++++++++++++++++++++++++++--
 doc/src/sgml/monitoring.sgml   |    2 +-
 doc/src/sgml/runtime.sgml      |    2 +-
 doc/src/sgml/sourcerepo.sgml   |    5 +-
 4 files changed, 1743 insertions(+), 107 deletions(-)

diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 319c7e69660..b2c0aa72ac3 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -31,7 +31,144 @@ documentation.  See standalone-profile.xsl for details.
   C++</productname>, see <xref linkend="install-windows"/> instead.
  </para>
 
- <sect1 id="install-short">
+ <sect1 id="supported-platforms">
+  <title>Supported Platforms</title>
+
+  <para>
+   A platform (that is, a CPU architecture and operating system combination)
+   is considered supported by the <productname>PostgreSQL</productname> development
+   community if the code contains provisions to work on that platform and
+   it has recently been verified to build and pass its regression tests
+   on that platform.  Currently, most testing of platform compatibility
+   is done automatically by test machines in the
+   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
+   If you are interested in using <productname>PostgreSQL</productname> on a platform
+   that is not represented in the build farm, but on which the code works
+   or can be made to work, you are strongly encouraged to set up a build
+   farm member machine so that continued compatibility can be assured.
+  </para>
+
+  <para>
+   In general, <productname>PostgreSQL</productname> can be expected to work on
+   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
+   and PA-RISC, including
+   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
+   It is often
+   possible to build on an unsupported CPU type by configuring with
+   <option>--disable-spinlocks</option>, but performance will be poor.
+  </para>
+
+  <para>
+   <productname>PostgreSQL</productname> can be expected to work on current
+   versions of these operating systems: Linux, Windows,
+   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
+   Other Unix-like systems may also work but are not currently
+   being tested.  In most cases, all CPU architectures supported by
+   a given operating system will work.  Look in
+   <xref linkend="installation-platform-notes"/> below to see if
+   there is information
+   specific to your operating system, particularly if using an older system.
+  </para>
+
+  <para>
+   If you have installation problems on a platform that is known
+   to be supported according to recent build farm results, please report
+   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
+   in porting <productname>PostgreSQL</productname> to a new platform,
+   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
+   to discuss that.
+  </para>
+
+  <para>
+   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
+   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
+   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
+   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
+   Tru64 UNIX, and ULTRIX.
+  </para>
+ </sect1>
+
+ <sect1 id="get-source">
+  <title>Getting the Source</title>
+
+   <para>
+   You can download the source code in two ways - via git or the source code
+   tarballs.
+   </para>
+
+  <sect2 id="get-source-git">
+   <title>Getting the Source via <productname>Git</productname></title>
+  <para>
+   With <productname>Git</productname>, you can make a copy of the entire code repository
+   on your local machine, so you will have access to all history and branches
+   offline. This is the fastest and most flexible way to develop or test
+   patches.
+  </para>
+
+  <procedure>
+   <step>
+    <para>
+     To begin using the Git repository, make a clone of the official mirror:
+
+<programlisting>
+git clone https://git.postgresql.org/git/postgresql.git
+</programlisting>
+
+     This will copy the full repository to your local machine, so it may take
+     a while to complete, especially if you have a slow Internet connection.
+     The files will be placed in a new subdirectory <filename>postgresql</filename> of
+     your current directory.
+    </para>
+
+   </step>
+
+   <step>
+    <para>
+     Whenever you want to get the latest updates in the system, <command>cd</command>
+     into the repository, and run:
+
+<programlisting>
+git pull
+</programlisting>
+    </para>
+   </step>
+  </procedure>
+
+  <para>
+   <productname>Git</productname> can do a lot more things than just fetch the source.
+   Our wiki, <ulink
+   url="https://wiki.postgresql.org/wiki/Working_with_Git"></ulink>,
+   has some discussion on working with Git. For more information, consult the
+   <productname>Git</productname> man pages, or see the website at
+   <ulink url="https://git-scm.com"></ulink>.
+  </para>
+  </sect2>
+  <sect2 id="get-source-tarball">
+   <title>Getting the Source via Tarballs</title>
+
+  <para>
+   The <productname>PostgreSQL</productname> source code for released versions
+   can also be obtained from the download section of our website:
+   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
+   Download the
+   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
+   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
+   file you're interested in, then unpack it:
+<screen>
+<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
+</screen>
+   This will create a directory
+   <filename>postgresql-<replaceable>version</replaceable></filename> under
+   the current directory with the <productname>PostgreSQL</productname> sources.
+   Change into that directory for the rest of the installation procedure.
+  </para>
+  </sect2>
+ </sect1>
+
+<sect1 id="install-make">
+  <title>Building and Installation with autoconf and make</title>
+
+ <sect2 id="install-short-make">
   <title>Short Version</title>
 
   <para>
@@ -50,12 +187,12 @@ su - postgres
 /usr/local/pgsql/bin/psql test
 </synopsis>
    The long version is the rest of this
-   <phrase>chapter</phrase>.
+   <phrase>section</phrase>.
   </para>
- </sect1>
+ </sect2>
 
 
- <sect1 id="install-requirements">
+ <sect2 id="install-requirements-make">
   <title>Requirements</title>
 
   <para>
@@ -343,45 +480,9 @@ su - postgres
    url="ftp://ftp.gnu.org/gnu/"></ulink>.
   </para>
 
-  <para>
-   Also check that you have sufficient disk space. You will need about
-   350 MB for the source tree during compilation and about 60 MB for
-   the installation directory. An empty database cluster takes about
-   40 MB; databases take about five times the amount of space that a
-   flat text file with the same data would take. If you are going to
-   run the regression tests you will temporarily need up to an extra
-   300 MB. Use the <command>df</command> command to check free disk
-   space.
-  </para>
- </sect1>
+ </sect2>
 
- <sect1 id="install-getsource">
-  <title>Getting the Source</title>
-
-  <para>
-   The <productname>PostgreSQL</productname> source code for released versions
-   can be obtained from the download section of our website:
-   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
-   Download the
-   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
-   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
-   file you're interested in, then unpack it:
-<screen>
-<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
-</screen>
-   This will create a directory
-   <filename>postgresql-<replaceable>version</replaceable></filename> under
-   the current directory with the <productname>PostgreSQL</productname> sources.
-   Change into that directory for the rest of the installation procedure.
-  </para>
-
-  <para>
-   Alternatively, you can use the Git version control system; see
-   <xref linkend="git"/> for more information.
-  </para>
- </sect1>
-
- <sect1 id="install-procedure">
+ <sect2 id="install-procedure-make">
   <title>Installation Procedure</title>
 
   <procedure>
@@ -630,6 +731,7 @@ build-postgresql:
    rebuilding.  Without this, your changes in configuration choices
    might not propagate everywhere they need to.
   </para>
+  </sect2>
 
   <sect2 id="configure-options">
    <title><filename>configure</filename> Options</title>
@@ -844,7 +946,7 @@ build-postgresql:
      various <productname>PostgreSQL</productname> features that are not
      built by default.  Most of these are non-default only because they
      require additional software, as described in
-     <xref linkend="install-requirements"/>.
+     <xref linkend="install-requirements-make"/>.
     </para>
 
      <variablelist>
@@ -1672,9 +1774,7 @@ build-postgresql:
 
    </sect3>
 
-  </sect2>
-
-  <sect2 id="configure-envvars">
+  <sect3 id="configure-envvars">
    <title><filename>configure</filename> Environment Variables</title>
 
    <indexterm zone="configure-envvars">
@@ -1955,9 +2055,1600 @@ build-postgresql:
       adjustments, while <envar>COPT</envar> might be kept set all the time.
      </para>
     </note>
+   </sect3>
   </sect2>
  </sect1>
 
+ <sect1 id="install-meson">
+  <title>Building and Installation with meson</title>
+
+ <sect2 id="install-short-meson">
+  <title>Short Version</title>
+
+  <para>
+<synopsis>
+
+# create working directory
+mkdir postgres
+cd postgres
+
+# fetch source code
+# git clone https://git.postgresql.org/git/postgresql.git src
+
+# current instructions for testing (to be removed when merging)
+git clone -b meson https://github.com/anarazel/postgres.git src
+
+# setup and enter build directory (done only first time)
+meson setup build src --prefix=$PWD/install
+cd build
+
+# Compile source
+ninja
+
+# Install to the prefix directory specified above
+ninja install
+
+# Run all tests (optional, takes time)
+meson test
+
+# Initialize a new database
+../install/bin/initdb -D ../data
+
+# Start database
+../install/bin/pg_ctl -D ../data/ -l logfile start
+
+# Connect to the database
+../install/bin/psql -d postgres
+
+</synopsis>
+   The long version is the rest of this
+   <phrase>section</phrase>.
+  </para>
+ </sect2>
+
+ <sect2 id="install-requirements-meson">
+  <title>Requirements</title>
+
+  <para>
+   In general, a modern Unix-compatible platform or Windows should be able
+   to build <productname>PostgreSQL</productname> with meson and run it.
+   The platforms which have received specific testing at the time of release are:
+
+  <itemizedlist spacing="compact">
+   <listitem><simpara>Linux</simpara></listitem>
+   <listitem><simpara>Windows</simpara></listitem>
+   <listitem><simpara>OpenBSD</simpara></listitem>
+   <listitem><simpara>NetBSD</simpara></listitem>
+   <listitem><simpara>FreeBSD</simpara></listitem>
+   <listitem><simpara>macOS</simpara></listitem>
+  </itemizedlist>
+  </para>
+
+  <sect3 id="required-packages">
+   <title>Required packages</title>
+
+   <para>
+    The following software packages are required for building
+    <productname>PostgreSQL</productname>:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You can download the source code in two ways - via git or by downloading
+      the source code tarballs. For the former, you will need an installed version of
+      <productname>Git</productname>, which you can get from
+      <ulink url="https://git-scm.com"></ulink>. Many systems already
+      have a recent version of <productname>Git</productname>
+      installed by default, or available in their package distribution system.
+      If you download the source code tarballs, you will need
+      <application>tar</application> in addition to
+      <application>gzip</application> or <application>bzip2</application>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>meson</primary>
+      </indexterm>
+      You need to install <application>
+      <ulink url="https://mesonbuild.com/">meson</ulink></application> version
+      0.54 or later to be able to build <productname>PostgreSQL</productname>
+      with it. If your operating system provides a package manager, you can install
+      <application>meson</application> with that. If not, you
+      can download a <ulink url="https://github.com/mesonbuild/meson">meson release</ulink>
+      from github and run <literal>./meson.py</literal> from the git repository
+      itself. Lastly, Meson is also available in the python package index and can
+      be installed with <literal>pip</literal>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least
+      C99-compliant). Recent
+      versions of <productname>GCC</productname> are recommended, but
+      <productname>PostgreSQL</productname> is known to build using a wide variety
+      of compilers from different vendors.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>flex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>lex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>bison</primary>
+      </indexterm>
+      <indexterm>
+       <primary>yacc</primary>
+      </indexterm>
+
+      <application>Flex</application> and <application>Bison</application>
+      are needed to build <productname>PostgreSQL</productname> using
+      <application>meson</application>. Be sure to get
+      <application>Flex</application> 2.5.31 or later and
+      <application>Bison</application> 1.875 or later from your package manager.
+      Other <application>lex</application> and <application>yacc</application>
+      programs cannot be used.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>perl</primary>
+      </indexterm>
+      <application>Perl</application> 5.8.3 or later is needed to build PostgreSQL
+      using <application>meson</application> and to run some test suites.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+  <sect3 id="recommended-packages">
+   <title>Recommended packages</title>
+
+   <para>
+   The following packages are not required to build
+   <application>PostgreSQL</application> but are strongly recommended:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>readline</primary>
+      </indexterm>
+      <indexterm>
+       <primary>libedit</primary>
+      </indexterm>
+
+      The <acronym>GNU</acronym> <productname>Readline</productname> library
+      allows <application>psql</application> (the PostgreSQL command line
+      SQL interpreter) to remember each command you type, and allows you to
+      use arrow keys to recall and edit previous commands.  This is very
+      helpful and is strongly recommended. As an alternative, you can often
+      use the BSD-licensed <filename>libedit</filename> library, originally
+      developed on <productname>NetBSD</productname>. The
+      <filename>libedit</filename> library is GNU
+      <productname>Readline</productname>-compatible and is used if
+      <filename>libreadline</filename> is not found, or if
+      <option>libedit_preferred</option> is enabled as an
+      option to <filename>meson configure</filename>. If you are using a
+      package-based Linux distribution, be aware that you need both the
+      <literal>readline</literal> and <literal>readline-devel</literal> packages, if
+      those are separate in your distribution.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>zlib</primary>
+      </indexterm>
+
+      The <productname>zlib</productname> compression library is
+      used to provide support for compressed archives in
+      <application>pg_dump</application> and
+      <application>pg_restore</application> and is recommended.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Various tests, particularly the client program tests under
+      <filename>src/bin</filename>, use the Perl TAP tools. Running
+      these tests is recommended for development. These TAP tests
+      require the Perl module <literal>IPC::Run</literal> which is
+      available from CPAN or an operating system package.
+     </para>
+    </listitem>
+   </itemizedlist>
+  </para>
+  </sect3>
+
+  <sect3 id="optional-packages">
+   <title>Optional packages</title>
+
+   <para>
+   The following packages are optional.  They are not required in the
+   default configuration, but they are needed when certain build
+   options are enabled, as explained below:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You need <productname>OpenSSL</productname>, if you want to support
+      encrypted client connections.  <productname>OpenSSL</productname> is
+      also required for random number generation on platforms that do not
+      have <filename>/dev/urandom</filename> (except Windows).  The minimum
+      required version is 1.0.1.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>LZ4</productname>, if you want to support
+      compression of data with that method; see
+      <xref linkend="guc-default-toast-compression"/> and
+      <xref linkend="guc-wal-compression"/>.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>Zstandard</productname>, if you want to support
+      compression of data or backups with that method; see
+      <xref linkend="guc-wal-compression"/>.
+      The minimum required version is 1.4.0.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <application>Kerberos</application>, <productname>OpenLDAP</productname>,
+      and/or <application>PAM</application>, if you want to support authentication
+      using those services.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the server programming language
+      <application>PL/Perl</application> you need a full
+      <productname>Perl</productname> installation, including the
+      <filename>libperl</filename> library and the header files.
+      The minimum required version is <productname>Perl</productname> 5.8.3.
+      Since <application>PL/Perl</application> will be a shared
+      library, the <indexterm><primary>libperl</primary></indexterm>
+      <filename>libperl</filename> library must be a shared library
+      also on most platforms.  This appears to be the default in
+      recent <productname>Perl</productname> versions, but it was not
+      in earlier versions, and in any case it is the choice of whomever
+      installed Perl at your site.  <filename>configure</filename> will fail
+      if building <application>PL/Perl</application> is selected but it cannot
+      find a shared <filename>libperl</filename>.  In that case, you will have
+      to rebuild and install <productname>Perl</productname> manually to be
+      able to build <application>PL/Perl</application>.  During the
+      configuration process for <productname>Perl</productname>, request a
+      shared library.
+     </para>
+
+     <para>
+      If you intend to make more than incidental use of
+      <application>PL/Perl</application>, you should ensure that the
+      <productname>Perl</productname> installation was built with the
+      <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal>
+      will show whether this is the case).
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Python</application> server programming
+      language, you need a <productname>Python</productname>
+      installation with the header files and
+      the <application>sysconfig</application> module.  The minimum
+      required version is <productname>Python</productname> 3.2.
+     </para>
+
+     <para>
+      Since <application>PL/Python</application> will be a shared
+      library, the <indexterm><primary>libpython</primary></indexterm>
+      <filename>libpython</filename> library must be a shared library
+      also on most platforms.  This is not the case in a default
+      <productname>Python</productname> installation built from source, but a
+      shared library is available in many operating system
+      distributions.  <filename>configure</filename> will fail if
+      building <application>PL/Python</application> is selected but it cannot
+      find a shared <filename>libpython</filename>.  That might mean that you
+      either have to install additional packages or rebuild (part of) your
+      <productname>Python</productname> installation to provide this shared
+      library.  When building from source, run <productname>Python</productname>'s
+      configure with the <literal>--enable-shared</literal> flag.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Tcl</application>
+      procedural language, you of course need a <productname>Tcl</productname>
+      installation.  The minimum required version is
+      <productname>Tcl</productname> 8.4.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To enable Native Language Support (<acronym>NLS</acronym>), that
+      is, the ability to display a program's messages in a language
+      other than English, you need an implementation of the
+      <application>Gettext</application> <acronym>API</acronym>.  Some operating
+      systems have this built-in (e.g., <systemitem
+      class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>,
+      <systemitem class="osname">Solaris</systemitem>), for other systems you
+      can download an add-on package from <ulink
+      url="https://www.gnu.org/software/gettext/"></ulink>.
+      If you are using the <application>Gettext</application> implementation in
+      the <acronym>GNU</acronym> C library then you will additionally
+      need the <productname>GNU Gettext</productname> package for some
+      utility programs.  For any of the other implementations you will
+      not need it.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <productname>PostgreSQL</productname> documentation,
+      there is a separate set of requirements; see
+      <xref linkend="docguide-toolsets"/>.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+ </sect2>
+
+ <sect2 id="configure-meson">
+  <title>Configuring the build</title>
+
+   <para>
+    The first step of the installation procedure is to configure the
+    source tree for your system and choose the options you would like. To
+    create and configure the build directory, you can start with the
+    <literal>meson setup</literal> command.
+   </para>
+
+<screen>
+<userinput>meson setup build</userinput>
+</screen>
+
+   <para>
+    The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal>
+    argument. If no <literal>srcdir</literal> is given Meson will deduce the
+    <literal>srcdir</literal> based on the current directory and the location
+    of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory.
+   </para>
+
+   <para>
+    Meson then loads the build configuration file and sets up the build directory.
+    Additionally, the invocation can pass options to Meson. The list of commonly
+    used options is in subsequent sections. A few examples of specifying different
+    build options are:
+
+<screen>
+#Setup build directory with a different installation prefix
+meson setup build --prefix=/home/user/pg-install
+
+#Setup build directory to generate a debug build
+meson setup build --buildtype=debug
+
+#Setup build directory with ssl (Use -D for project specific options)
+meson setup build -Dssl=openssl
+</screen>
+
+    Setting up the build directory is a one-time step. To reconfigure before a
+    new build, you can simply use the <literal>meson configure</literal> command
+   </para>
+
+<para>
+<screen>
+meson configure -Dcassert=true
+</screen>
+</para>
+
+<para>
+    <command>meson configure</command>'s commonly used command line options
+    are explained below. This list is not exhaustive (use
+    <literal>meson configure --help</literal> to get one that is).
+    The options not covered here are meant for advanced use-cases, and are
+    documented in the standard meson
+    <ulink url="https://mesonbuild.com/Commands.html#configure">documentation</ulink>.
+    These arguments can be used with <command>meson setup</command> as well.
+</para>
+
+   <sect3 id="configure-install-locations">
+    <title>Installation Locations</title>
+
+     <para>
+      These options control where <literal>ninja install (or meson install)</literal> will put
+      the files.  The <option>--prefix</option> option is sufficient for
+      most cases.  If you have special needs, you can customize the
+      installation subdirectories with the other options described in this
+      section.  Beware however that changing the relative locations of the
+      different subdirectories may render the installation non-relocatable,
+      meaning you won't be able to move it after installation.
+      (The <literal>man</literal> and <literal>doc</literal> locations are
+      not affected by this restriction.)
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term>
+       <listitem>
+        <para>
+         Install all files under the directory <replaceable>PREFIX</replaceable>
+         instead of <filename>/usr/local/pgsql</filename>. The actual
+         files will be installed into various subdirectories; no files
+         will ever be installed directly into the
+         <replaceable>PREFIX</replaceable> directory.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the directory for executable programs. The default
+         is <filename><replaceable>PREFIX</replaceable>/bin</filename>, which
+         normally means <filename>/usr/local/pgsql/bin</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for various configuration files,
+         <filename><replaceable>PREFIX</replaceable>/etc</filename> by default.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the location to install libraries and dynamically loadable
+         modules. The default is
+         <filename><replaceable>PREFIX</replaceable>/lib</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing C and C++ header files. The
+         default is <filename><replaceable>PREFIX</replaceable>/include</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for read-only data files used by the
+         installed programs. The default is
+         <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has
+         nothing to do with where your database files will be placed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing locale data, in particular
+         message translation catalog files.  The default is
+         <filename><replaceable>DATADIR</replaceable>/locale</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         The man pages that come with <productname>PostgreSQL</productname> will be installed under
+         this directory, in their respective
+         <filename>man<replaceable>x</replaceable></filename> subdirectories.
+         The default is <filename><replaceable>DATADIR</replaceable>/man</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+
+  <note>
+      <para>
+       Care has been taken to make it possible to install
+       <productname>PostgreSQL</productname> into shared installation locations
+       (such as <filename>/usr/local/include</filename>) without
+       interfering with the namespace of the rest of the system. First,
+       the string <quote><literal>/postgresql</literal></quote> is
+       automatically appended to <varname>datadir</varname>,
+       <varname>sysconfdir</varname>, and <varname>docdir</varname>,
+       unless the fully expanded directory name already contains the
+       string <quote><literal>postgres</literal></quote> or
+       <quote><literal>pgsql</literal></quote>. For example, if you choose
+       <filename>/usr/local</filename> as prefix, the documentation will
+       be installed in <filename>/usr/local/doc/postgresql</filename>,
+       but if the prefix is <filename>/opt/postgres</filename>, then it
+       will be in <filename>/opt/postgres/doc</filename>. The public C
+       header files of the client interfaces are installed into
+       <varname>includedir</varname> and are namespace-clean. The
+       internal header files and the server header files are installed
+       into private directories under <varname>includedir</varname>. See
+       the documentation of each interface for information about how to
+       access its header files. Finally, a private subdirectory will
+       also be created, if appropriate, under <varname>libdir</varname>
+       for dynamically loadable modules.
+      </para>
+     </note>
+    </sect3>
+
+    <sect3 id="configure-pg-features">
+    <title><productname>PostgreSQL</productname> Features</title>
+
+    <para>
+     The options described in this section enable building of
+     various <productname>PostgreSQL</productname> features that are not
+     built by default.  Most of these are non-default only because they
+     require additional software, as described in
+     <xref linkend="install-requirements-meson"/>. To specify PostgreSQL
+     specific options, the name of the option should be prefixed by -D.
+    </para>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>-Dnls=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Enables or disables Native Language Support (<acronym>NLS</acronym>),
+         that is, the ability to display a program's messages in a
+         language other than English. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To use this option, you will need an implementation of the
+         <application>Gettext</application> API.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplperl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Perl</application> server-side language. It
+         defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplpython=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Python</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpltcl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Tcl</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the TCL version to use when building PL/Tcl.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dicu=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for
+         the <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm>
+         library, enabling use of ICU collation
+         features<phrase condition="standalone-ignore"> (see
+         <xref linkend="collation"/>)</phrase>.
+         This requires the <productname>ICU4C</productname> package
+         to be installed.  The minimum required version
+         of <productname>ICU4C</productname> is currently 4.2.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+
+        <para>
+         By default,
+         <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm>
+         will be used to find the required compilation options.  This is
+         supported for <productname>ICU4C</productname> version 4.6 and later.
+         <!-- Add description for older ICU4C versions and when pkg-config isn't available-->
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="configure-with-llvm-meson">
+       <term><option>-Dllvm=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for <productname>LLVM</productname> based
+         <acronym>JIT</acronym> compilation<phrase
+         condition="standalone-ignore"> (see <xref
+         linkend="jit"/>)</phrase>.  This
+         requires the <productname>LLVM</productname> library to be installed.
+         The minimum required version of <productname>LLVM</productname> is
+         currently 3.9. It is set to disabled by default.
+        </para>
+        <para>
+         <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
+         will be used to find the required compilation options.
+         <command>llvm-config</command>, and then
+         <command>llvm-config-$major-$minor</command> for all supported
+         versions, will be searched for in your <envar>PATH</envar>.
+         <!--Add substitute fo LLVM_CONFIG when llvm-config is not in PATH-->
+        </para>
+
+        <para>
+         <productname>LLVM</productname> support requires a compatible
+         <command>clang</command> compiler (specified, if necessary, using the
+         <envar>CLANG</envar> environment variable), and a working C++
+         compiler (specified, if necessary, using the <envar>CXX</envar>
+         environment variable).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlz4=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>LZ4</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzstd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>Zstandard</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dssl=<replaceable>LIBRARY</replaceable></option>
+       <indexterm>
+        <primary>OpenSSL</primary>
+        <seealso>SSL</seealso>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Build with support for <acronym>SSL</acronym> (encrypted)
+         connections. The only <replaceable>LIBRARY</replaceable>
+         supported is <option>openssl</option>. This requires the
+         <productname>OpenSSL</productname> package to be installed.
+         <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenSSL</productname> installation is sufficient
+         before proceeding. The default for this option is none.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dgssapi=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for GSSAPI authentication. On many systems, the
+         GSSAPI system (usually a part of the Kerberos installation) is not
+         installed in a location
+         that is searched by default (e.g., <filename>/usr/include</filename>,
+         <filename>/usr/lib</filename>), so you must use the options
+         <option>-Dextra_include_dirs</option> and <option>-Dextra_lib_dirs</option> in
+         addition to this option.  <filename>meson configure</filename> will check
+         for the required header files and libraries to make sure that
+         your GSSAPI installation is sufficient before proceeding.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dldap=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm>
+         support for authentication and connection parameter lookup (see
+         <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and
+         <xref linkend="auth-ldap"/></phrase> for more information). On Unix,
+         this requires the <productname>OpenLDAP</productname> package to be
+         installed. On Windows, the default <productname>WinLDAP</productname>
+         library is used.  <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenLDAP</productname> installation is sufficient before
+         proceeding. It defaults to auto, meaning that it will be enabled automatically
+         if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpam=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm>
+         (Pluggable Authentication Modules) support. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbsd_auth=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with BSD Authentication support. (The BSD Authentication framework is
+         currently only available on OpenBSD.) It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystemd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support
+         for <application>systemd</application><indexterm><primary>systemd</primary></indexterm>
+         service notifications.  This improves integration if the server
+         is started under <application>systemd</application> but has no impact
+         otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more
+         information</phrase>.  <application>libsystemd</application> and the
+         associated header files need to be installed to use this option.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbonjour=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for Bonjour automatic service discovery.
+         This requires Bonjour support in your operating system.
+         Recommended on macOS. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <xref linkend="uuid-ossp"/> module
+         (which provides functions to generate UUIDs), using the specified
+         UUID library.<indexterm><primary>UUID</primary></indexterm>
+         <replaceable>LIBRARY</replaceable> must be one of:
+        </para>
+        <itemizedlist>
+         <listitem>
+          <para>
+           <option>none</option> to not build the ussp module. This is the default.
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>bsd</option> to use the UUID functions found in FreeBSD, NetBSD,
+           and some other BSD-derived systems
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>e2fs</option> to use the UUID library created by
+           the <literal>e2fsprogs</literal> project; this library is present in most
+           Linux systems and in macOS, and can be obtained for other
+           platforms as well
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>ossp</option> to use the <ulink
+           url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
+          </para>
+         </listitem>
+        </itemizedlist>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxml=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxml2, enabling SQL/XML support.  Libxml2 version 2.6.23 or
+         later is required for this feature. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To detect the required compiler and linker options, PostgreSQL will
+         query <command>pkg-config</command>, if that is installed and knows
+         about libxml2.  Otherwise the program <command>xml2-config</command>,
+         which is installed by libxml2, will be used if it is found.  Use
+         of <command>pkg-config</command> is preferred, because it can deal
+         with multi-architecture installations better.
+        </para>
+
+        <para>
+         To use a libxml2 installation that is in an unusual location, you
+         can set <command>pkg-config</command>-related environment
+         variables (see its documentation).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxslt=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxslt, enabling the
+         <xref linkend="xml2"/>
+         module to perform XSL transformations of XML.
+         <option>-Dlibxml</option> must be specified as well.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dreadline=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Allows use of the <application>Readline</application> library
+         (and <application>libedit</application> as well).  This option enables
+         command-line editing and history in
+         <application>psql</application> and is strongly recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibedit_preferred=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this to true favors the use of the BSD-licensed <application>libedit</application> library
+         rather than GPL-licensed <application>Readline</application>.  This option
+         is significant only if you have both libraries installed; the
+         default is false that is to use <application>Readline</application>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzlib=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>zlib</primary>
+         </indexterm>
+         Enabls use of the <application>Zlib</application> library.
+         This enables
+         support for compressed archives in <application>pg_dump</application>
+         and <application>pg_restore</application> and is recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dspinlocks=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true by default and
+         setting it to false will allow the build to succeed even if <productname>PostgreSQL</productname>
+         has no CPU spinlock support for the platform.  The lack of
+         spinlock support will result in very poor performance; therefore,
+         this option should only be changed if the build aborts and
+         informs you that the platform lacks spinlock support. If setting this
+         option to false is required to build <productname>PostgreSQL</productname> on
+         your platform, please report the problem to the
+         <productname>PostgreSQL</productname> developers.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Datomics=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true and setting it to false will
+         disable use of CPU atomic operations.  The option does nothing on
+         platforms that lack such operations.  On platforms that do have
+         them, disabling atomics will result in poor performance.  Changing
+         this option is only useful for debugging or making performance comparisons.
+        </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-build-process">
+    <title>Build Process Details</title>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>--auto_features=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this option allows you to override value of all 'auto' features.
+         This can be useful when you want to disable or enable all the "optional"
+         features at once without having to set each of them manually. The default
+         value for this parameter is auto.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--backend=<replaceable>BACKEND</replaceable></option></term>
+       <listitem>
+        <para>
+         The default backend meson uses is ninja and that should suffice for most use cases.
+         However, if you'd like to fully integrate with visual studio, you can set the
+         BACKEND to <command>vs</command>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C compiler.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C linker.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories that will be added to the list the compiler
+         searches for header files. If you have optional packages
+         (such as GNU <application>Readline</application>) installed in a non-standard
+         location,
+         you have to use this option and probably also the corresponding
+         <option>-Dextra_lib_dirs</option> option.
+        </para>
+        <para>
+         Example: <literal>-Dextra_include_dirs=/opt/gnu/include:/usr/sup/include</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories to search for libraries. You will probably have
+         to use this option (and the corresponding
+         <option>-Dextra_include_dirs</option> option) if you have packages
+         installed in non-standard locations.
+        </para>
+        <para>
+         Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib:/usr/sup/lib</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option>
+       <indexterm>
+        <primary>time zone data</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <productname>PostgreSQL</productname> includes its own time zone database,
+         which it requires for date and time operations.  This time zone
+         database is in fact compatible with the IANA time zone
+         database provided by many operating systems such as FreeBSD,
+         Linux, and Solaris, so it would be redundant to install it again.
+         When this option is used, the system-supplied time zone database
+         in <replaceable>DIRECTORY</replaceable> is used instead of the one
+         included in the PostgreSQL source distribution.
+         <replaceable>DIRECTORY</replaceable> must be specified as an
+         absolute path.  <filename>/usr/share/zoneinfo</filename> is a
+         likely directory on some operating systems.  Note that the
+         installation routine will not detect mismatching or erroneous time
+         zone data.  If you use this option, you are advised to run the
+         regression tests to verify that the time zone data you have
+         pointed to works correctly with <productname>PostgreSQL</productname>.
+        </para>
+
+        <indexterm><primary>cross compilation</primary></indexterm>
+
+        <para>
+         This option is mainly aimed at binary package distributors
+         who know their target operating system well.  The main
+         advantage of using this option is that the PostgreSQL package
+         won't need to be upgraded whenever any of the many local
+         daylight-saving time rules change.  Another advantage is that
+         PostgreSQL can be cross-compiled more straightforwardly if the
+         time zone database files do not need to be built during the
+         installation.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term>
+       <listitem>
+        <para>
+         Append <replaceable>STRING</replaceable> to the PostgreSQL version number.  You
+         can use this, for example, to mark binaries built from unreleased Git
+         snapshots or containing custom patches with an extra version string,
+         such as a <command>git describe</command> identifier or a
+         distribution package release number.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term>
+       <listitem>
+        <para>
+         If you have the binaries for certain by programs required to build
+         Postgres (with or without optional flags) stored at non-standard
+         paths, you could specify them manually to meson configure. The complete
+         list of programs for whom this is supported can be found by running
+         <literal>meson configure</literal>. An example is included below.
+<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting>
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-layout">
+    <title>Data layout</title>
+
+    <para>
+     These options affect how PostgreSQL lays out data on disk.
+     Note that changing these breaks on-disk database compatibility,
+     meaning you cannot use <command>pg_upgrade</command> to upgrade to
+     a build with a different value of these options.
+    </para>
+
+    <variablelist>
+
+      <varlistentry>
+       <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>segment size</firstterm>, in gigabytes.  Large tables are
+         divided into multiple operating-system files, each of size equal
+         to the segment size.  This avoids problems with file size limits
+         that exist on many platforms.  The default segment size, 1 gigabyte,
+         is safe on all supported platforms.  If your operating system has
+         <quote>largefile</quote> support (which most do, nowadays), you can use
+         a larger segment size.  This can be helpful to reduce the number of
+         file descriptors consumed when working with very large tables.
+         But be careful not to select a value larger than is supported
+         by your platform and the file systems you intend to use.  Other
+         tools you might wish to use, such as <application>tar</application>, could
+         also set limits on the usable file size.
+         It is recommended, though not absolutely required, that this value
+         be a power of 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within tables.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 32 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>WAL block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within the WAL log.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 64 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-devel">
+    <title>Developer Options</title>
+
+    <para>
+     Most of the options in this section are only of interest for
+     developing or debugging <productname>PostgreSQL</productname>.
+     They are not recommended for production builds, except
+     for <option>--debug</option>, which can be useful to enable
+     detailed bug reports in the unlucky event that you encounter a bug.
+     On platforms supporting DTrace, <option>-Ddtrace</option>
+     may also be reasonable to use in production.
+    </para>
+
+    <para>
+     When building an installation that will be used to develop code inside
+     the server, it is recommended to use atleast the <option>--buildtype=debug</option>
+     and <option>-Dcassert</option> options.
+    </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term>
+       <listitem>
+        <para>
+         This option can be used to specify the buildtype to use; defaults
+         to release. If you'd like finer control on the debug symbols
+         and optimization levels than what this option provides, you can
+         refer to the --debug and --optimization flags.
+
+         The following build types are generally used:
+         <variablelist>
+          <varlistentry>
+           <term><literal>plain</literal></term>
+           <listitem>
+            <para>
+            No extra build flags are used, even for compiler warnings,
+            useful for distro packagers and other cases where you need to
+            specify all arguments by yourself.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debug</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated but the result is not optimized.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debugoptimized</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated and the code is optimized (on most compilers
+            this means <literal>-g -O2</literal>)
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>release</literal></term>
+           <listitem>
+            <para>
+            This enables full optimization and no debug info is generated. This is
+            the default.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--debug</option></term>
+       <listitem>
+        <para>
+         Compiles all programs and libraries with debugging symbols.
+         This means that you can run the programs in a debugger
+         to analyze problems. This enlarges the size of the installed
+         executables considerably, and on non-GCC compilers it usually
+         also disables compiler optimization, causing slowdowns. However,
+         having the symbols available is extremely helpful for dealing
+         with any problems that might arise.  Currently, this option is
+         recommended for production installations only if you use GCC.
+         But you should always have it on if you are doing development work
+         or running a beta version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term>
+       <listitem>
+        <para>
+         Specify the optimization level. LEVEL can be set to any of {0,g,1,2,3,s}.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--werror</option></term>
+       <listitem>
+        <para>
+         Setting this option asks the compiler to treat warnings as errors. This can
+         be useful for code development purposes.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dcassert</option></term>
+       <listitem>
+        <para>
+         Enables <firstterm>assertion</firstterm> checks in the server, which test for
+         many <quote>cannot happen</quote> conditions.  This is invaluable for
+         code development purposes, but the tests can slow down the
+         server significantly.
+         Also, having the tests turned on won't necessarily enhance the
+         stability of your server!  The assertion checks are not categorized
+         for severity, and so what might be a relatively harmless bug will
+         still lead to server restarts if it triggers an assertion
+         failure.  This option is not recommended for production use, but
+         you should have it on for development work or when running a beta
+         version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtap-tests</option></term>
+       <listitem>
+        <para>
+         Enable tests using the Perl TAP tools.  This requires a Perl
+         installation and the Perl module <literal>IPC::Run</literal>.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term>
+       <listitem>
+        <para>
+         Enable test suites which require special software to run. This option
+         accepts arguments via a whitespace-separated list. The following values
+         are currently supported:
+         <variablelist>
+          <varlistentry>
+           <term><literal>kerberos</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/kerberos</filename>.  This
+            requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ldap</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ldap</filename>.  This
+            requires an <productname>OpenLDAP</productname> installation and opens
+            TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ssl</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ssl</filename>.  This opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>wal_consistency_checking</literal></term>
+           <listitem>
+            <para>
+            Uses <literal>wal_consistency_checking=all</literal> while running
+            certain tests under <filename>src/test/recovery</filename>.  Not
+            enabled by default because it is resource intensive.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+         Tests for features that are not supported by the current build
+         configuration are not run even if they are mentioned in
+         <varname>PG_TEST_EXTRA</varname>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--errorlogs</option></term>
+       <listitem>
+        <para>
+        This option can be used to print the logs from the failing tests
+        making debugging easier.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Db_coverage</option></term>
+       <listitem>
+        <para>
+         If using GCC, all programs and libraries are compiled with
+         code coverage testing instrumentation.  When run, they
+         generate files in the build directory with code coverage
+         metrics.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/>
+         for more information.</phrase> This option is for use only with GCC
+         and when doing development work.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Ddtrace=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>DTrace</primary>
+         </indexterm>
+         Enabling this compiles <productname>PostgreSQL</productname> with support for the
+         dynamic tracing tool DTrace.
+         <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/>
+         for more information.</phrase>
+        </para>
+
+        <para>
+         To point to the <command>dtrace</command> program, the
+         environment variable <envar>DTRACE</envar> can be set.  This
+         will often be necessary because <command>dtrace</command> is
+         typically installed under <filename>/usr/sbin</filename>,
+         which might not be in your <envar>PATH</envar>.
+        </para>
+
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-misc">
+    <title>Miscellaneous</title>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term>
+       <listitem>
+        <para>
+         Set <replaceable>NUMBER</replaceable> as the default port number for
+         server and clients. The default is 5432. The port can always
+         be changed later on, but if you specify it here then both
+         server and clients will have the same default compiled in,
+         which can be very convenient.  Usually the only good reason
+         to select a non-default value is if you intend to run multiple
+         <productname>PostgreSQL</productname> servers on the same machine.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term>
+       <listitem>
+        <para>
+         The default name of the Kerberos service principal used
+         by GSSAPI.
+         <literal>postgres</literal> is the default. There's usually no
+         reason to change this unless you are building for a Windows
+         environment, in which case it must be set to upper case
+         <literal>POSTGRES</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+ </sect2>
+
+ <sect2 id="build-meson">
+  <title>Building the source</title>
+   <para>
+    By default, <productname>Meson</productname> uses the
+    <ulink url="https://ninja-build.org/"> Ninja build system</ulink>.
+    To build <productname>PostgreSQL</productname> from source using meson, you can
+    simply use the <literal>ninja</literal> command in the build directory.
+<screen>
+ninja
+</screen>
+     Ninja will automatically detect the number of CPUs in your computer and
+     parallelize itself accordingly. You can override the amount of parallel
+     processes used with the command line argument <literal>-j</literal>.
+   </para>
+
+   <para>
+     It should be noted that after the initial configure step
+     <command>ninja</command> is the only command you ever need to type to
+     compile. No matter how you alter your source tree (short of moving it to
+     a completely new location), Meson will detect the changes and regenerate
+     itself accordingly. This is especially handy if you have multiple build
+     directories. Often one of them is used for development (the "debug" build)
+     and others only every now and then (such as a "static analysis" build).
+     Any configuration can be built just by cd'ing to the corresponding directory
+     and running Ninja.
+   </para>
+
+   <para>
+     If you'd like to build with a backend other that ninja, you can use configure
+     with the <option>--backend</option> option to select the one you want to use and then
+     build using <literal>meson compile</literal>. To learn more about these
+     backends and other arguments you can provide to ninja, you can refer to the
+     meson <ulink url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
+     documentation</ulink>.
+   </para>
+ </sect2>
+
+ <sect2 id="install-files-meson">
+  <title>Installing the files</title>
+   <para>
+    Once Postgres is built, you can install it by simply running the
+    <literal>ninja install</literal> command.
+
+<screen>
+ninja install
+</screen>
+   </para>
+
+   <para>
+    This will install files into the directories that were specified
+    in <xref linkend="configure-meson"/>. Make sure that you have appropriate
+    permissions to write into that area. You might need to do this
+    step as root. Alternatively, you can create the target directories
+    in advance and arrange for appropriate permissions to be granted.
+    The standard installation provides all the header files needed for client
+    application development as well as for server-side program
+    development, such as custom functions or data types written in C.
+   </para>
+
+   <para>
+    <literal>ninja install</literal> should work for most cases
+    but if you'd like to use more options, you could also use
+    <literal>meson install</literal> instead. You can learn more about
+    <ulink url="https://mesonbuild.com/Commands.html#install">meson install</ulink>
+    and it's options in the meson documentation.
+   </para>
+
+   <para>
+    Depending on your platform and setup, you might have to perform a
+    few steps after installation. Those are outlined in
+    <xref linkend="install-post"/>.
+   </para>
+
+  <formalpara>
+   <title>Uninstallation:</title>
+   <para>
+    To undo the installation, you can use the <command>ninja
+    uninstall</command> command.
+   </para>
+  </formalpara>
+
+  <formalpara>
+   <title>Cleaning:</title>
+   <para>
+    After the installation you can free disk space by removing the built
+    files from the source tree with the <command>ninja clean</command>
+    command.
+   </para>
+  </formalpara>
+
+ </sect2>
+
+ <sect2 id="running-tests">
+  <title>Running tests</title>
+   <para>
+    If you want to test the newly built server, you can run the regression
+    tests. The regression tests are a collection of test suites to verify
+    that <productname>PostgreSQL</productname> runs on your machine in
+    the way the developers expected it to. To run them, simply type:
+<screen>
+<userinput>meson test</userinput>
+</screen>
+    You can repeat this at any later time by issuing the same command.
+   </para>
+
+   <para>Meson also allows you to list tests and run specific tests or suites.
+<screen>
+# List all tests
+<userinput>meson test --list</userinput>
+
+# Run a specific test
+<userinput>meson test recovery/001_stream_rep</userinput>
+
+# Run the main pg_regress and isolation tests
+<userinput>meson test --suite main</userinput>
+</screen>
+   </para>
+
+   <para>
+    To learn more about running the tests and how to interpret the results
+    you can refer to the documentation for interpreting test results.
+     <literal>meson test</literal> also provides a number of additional
+    options you can use which can be found in the
+    <ulink url="https://mesonbuild.com/Unit-tests.html#testing-tool">meson test documentation</ulink>.
+   </para>
+
+ </sect2>
+
+ </sect1>
+
  <sect1 id="install-post">
   <title>Post-Installation Setup</title>
 
@@ -2106,62 +3797,6 @@ export MANPATH
   </sect2>
  </sect1>
 
- <sect1 id="supported-platforms">
-  <title>Supported Platforms</title>
-
-  <para>
-   A platform (that is, a CPU architecture and operating system combination)
-   is considered supported by the <productname>PostgreSQL</productname> development
-   community if the code contains provisions to work on that platform and
-   it has recently been verified to build and pass its regression tests
-   on that platform.  Currently, most testing of platform compatibility
-   is done automatically by test machines in the
-   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
-   If you are interested in using <productname>PostgreSQL</productname> on a platform
-   that is not represented in the build farm, but on which the code works
-   or can be made to work, you are strongly encouraged to set up a build
-   farm member machine so that continued compatibility can be assured.
-  </para>
-
-  <para>
-   In general, <productname>PostgreSQL</productname> can be expected to work on
-   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
-   and PA-RISC, including
-   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
-   It is often
-   possible to build on an unsupported CPU type by configuring with
-   <option>--disable-spinlocks</option>, but performance will be poor.
-  </para>
-
-  <para>
-   <productname>PostgreSQL</productname> can be expected to work on current
-   versions of these operating systems: Linux, Windows,
-   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
-   Other Unix-like systems may also work but are not currently
-   being tested.  In most cases, all CPU architectures supported by
-   a given operating system will work.  Look in
-   <xref linkend="installation-platform-notes"/> below to see if
-   there is information
-   specific to your operating system, particularly if using an older system.
-  </para>
-
-  <para>
-   If you have installation problems on a platform that is known
-   to be supported according to recent build farm results, please report
-   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
-   in porting <productname>PostgreSQL</productname> to a new platform,
-   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
-   to discuss that.
-  </para>
-
-  <para>
-   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
-   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
-   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
-   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
-   Tru64 UNIX, and ULTRIX.
-  </para>
- </sect1>
 
  <sect1 id="installation-platform-notes">
   <title>Platform-Specific Notes</title>
@@ -2170,7 +3805,7 @@ export MANPATH
    This section documents additional platform-specific issues
    regarding the installation and setup of PostgreSQL.  Be sure to
    read the installation instructions, and in
-   particular <xref linkend="install-requirements"/> as well.  Also,
+   particular <xref linkend="install-requirements-make"/> as well.  Also,
    check <xref linkend="regress"/> regarding the
    interpretation of regression test results.
   </para>
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 1d9509a2f66..214e1b1d551 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -7072,7 +7072,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
    explicitly tell the configure script to make the probes available
    in <productname>PostgreSQL</productname>. To include DTrace support
    specify <option>--enable-dtrace</option> to configure.  See <xref
-   linkend="install-procedure"/> for further information.
+   linkend="configure-options-devel"/> for further information.
   </para>
   </sect2>
 
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index c802c0c5f50..3d860550d7f 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1855,7 +1855,7 @@ $ <userinput>kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</userinput
     <step>
      <para>
       Install the new version of <productname>PostgreSQL</productname> as
-      outlined in <xref linkend="install-procedure"/>.
+      outlined in <xref linkend="installation"/>.
      </para>
     </step>
 
diff --git a/doc/src/sgml/sourcerepo.sgml b/doc/src/sgml/sourcerepo.sgml
index 0ed7f8a3fea..f16be29a61a 100644
--- a/doc/src/sgml/sourcerepo.sgml
+++ b/doc/src/sgml/sourcerepo.sgml
@@ -20,9 +20,10 @@
    Note that building <productname>PostgreSQL</productname> from the source
    repository requires reasonably up-to-date versions of <application>bison</application>,
    <application>flex</application>, and <application>Perl</application>. These tools are not needed
-   to build from a distribution tarball, because the files that these tools
+   to build from a distribution tarball if building via make, because the files that these tools
    are used to build are included in the tarball.  Other tool requirements
-   are the same as shown in <xref linkend="install-requirements"/>.
+   are the same as shown in <xref linkend="install-requirements-make"/> and
+   <xref linkend="install-requirements-meson"/>.
   </para>
 
  <sect1 id="git">
-- 
2.37.3.542.gdd3f6c4cae

v13-0016-meson-Add-PGXS-compatibility.patchtext/x-diff; charset=us-asciiDownload
From f262548df27ea01cf2a849268fec70282365126e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 20:27:17 -0700
Subject: [PATCH v13 16/20] meson: Add PGXS compatibility

This works for some extensions on some operating systems, but could use plenty
of cleanups.
---
 src/meson.build | 259 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 259 insertions(+)

diff --git a/src/meson.build b/src/meson.build
index a7fdd5a13ed..4c991a656d2 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,3 +10,262 @@ subdir('bin')
 subdir('pl')
 
 subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to only use a single
+# buildsystem across all the supported postgres versions. Once all supported
+# PG versions support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+  'PACKAGE_URL': pg_url,
+  'PACKAGE_VERSION': pg_version,
+  'PG_MAJORVERSION': pg_version_major,
+  'PG_VERSION_NUM': pg_version_num,
+  'configure_input': 'meson',
+
+  'vpath_build': 'yes',
+  'autodepend': 'no', # XXX: Should we just set this to true when possible?
+
+  'host_cpu': host_cpu,
+  'host': '@0@-@1@'.format(host_cpu, host_system),
+  'host_os': host_system,
+  'build_os': build_machine.system(),
+  'PORTNAME': portname,
+  'PG_SYSROOT': pg_sysroot,
+
+  'abs_top_builddir': meson.build_root(),
+  'abs_top_srcdir': meson.source_root(),
+
+  'enable_thread_safety': 'yes',
+  'enable_rpath': 'yes',
+  'enable_nls': libintl.found() ? 'yes' : 'no',
+  'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no',
+  'enable_debug': get_option('debug') ? 'yes' : 'no',
+  'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+  'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+  'DLSUFFIX': dlsuffix,
+  'EXEEXT': exesuffix,
+
+  'SUN_STUDIO_CC': 'no', # not supported so far
+
+  'default_port': get_option('pgport'),
+  'with_system_tzdata': get_option('system_tzdata'),
+
+  'with_krb_srvnam': get_option('krb_srvnam'),
+  'krb_srvtab': krb_srvtab,
+
+  # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+  'STRIP': 'strip',
+  'STRIP_STATIC_LIB': 'strip -x',
+  'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+  # Just always use the install_sh fallback that autoconf uses. Unlikely to
+  # matter performance-wise for extensions. If it turns out to do, we can
+  # improve that later.
+  'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+  'CC': var_cc,
+  'CPP': var_cpp,
+  'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld'] ? 'yes' : 'no'),
+
+  'CFLAGS': var_cflags,
+  'CPPFLAGS': var_cppflags,
+  'CXXFLAGS': var_cxxflags,
+  'CFLAGS_SL': var_cflags_sl,
+  'CFLAGS_SL_MODULE': ' '.join(cflags_mod),
+  'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod),
+  'CFLAGS_SSE42': ' '.join(cflags_crc),
+  'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+  'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+  # FIXME:
+  'CFLAGS_ARMV8_CRC32C': '',
+  'BITCODE_CFLAGS': '',
+  'BITCODE_CXXFLAGS': '',
+
+  'LDFLAGS': var_ldflags,
+  'LDFLAGS_EX': var_ldflags_ex,
+  'LDFLAGS_SL': var_ldflags_sl,
+
+  'BISONFLAGS': ' '.join(bison_flags),
+  'FLEXFLAGS': ' '.join(flex_flags),
+
+  'LIBS': var_libs,
+}
+
+if llvm.found()
+  pgxs_kv += {
+    'CLANG': clang.path(),
+    'CXX': ' '.join(cpp.cmd_array()),
+    'LLVM_BINPATH': llvm_binpath,
+  }
+else
+  pgxs_kv += {
+    'CLANG': '',
+    'CXX': '',
+    'LLVM_BINPATH': '',
+  }
+endif
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+  'BISON': bison,
+  'FLEX': flex,
+  'GZIP': gzip,
+  'LZ4': program_lz4,
+  'PERL': perl,
+  'PROVE': prove,
+  'PYTHON': python,
+  'TAR': tar,
+  'ZSTD': program_zstd,
+  'DTRACE': dtrace,
+  'LD': ld_program,
+  'install_bin': install_sh,
+}
+foreach b, p : pgxs_bins
+  pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+pgxs_empty = [
+  'PERMIT_DECLARATION_AFTER_STATEMENT',
+  'ICU_CFLAGS', # needs to be added, included by public server headers
+
+  # probably need most of these?
+  'RANLIB',
+  'WINDRES',
+  'LN_S',
+  'AR',
+  'AWK',
+
+  # hard to see why we'd need either?
+  'ZIC',
+  'TCLSH',
+
+  # docs don't seem to be supported by pgxs
+  'XMLLINT',
+  'XSLTPROC',
+  'DBTOEPUB',
+  'FOP',
+
+  # supporting coverage for pgxs-in-meson build doesn't seem worth it
+  'GENHTML',
+  'LCOV',
+  'GCOV',
+  'MSGFMT_FLAGS',
+
+  # translation doesn't appear to be supported by pgxs
+  'MSGFMT',
+  'XGETTEXT',
+  'MSGMERGE',
+  'WANTED_LANGUAGES',
+
+  # Not needed because we don't build the server / PLs with the generated makefile
+  'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+  'DTRACEFLAGS', # only server has dtrace probes
+
+  'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+  'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+  # possible that some of these are referenced explicitly in pgxs makefiles?
+  # For now not worth it.
+  'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD',
+
+  'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+  'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+  'UUID_LIBS',
+
+  'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+  'ICU_LIBS',
+]
+
+foreach pe : pgxs_empty
+  pgxs_cdata.set(pe, '')
+endforeach
+
+pgxs_dirs = {
+  'prefix': get_option('prefix'),
+
+  'bindir': '${exec_prefix}' / get_option('bindir'),
+  'datarootdir': '${prefix}' / get_option('datadir'),
+  'datadir': '${datarootdir}',
+  'docdir': '${prefix}' / dir_doc,
+  'exec_prefix': '${prefix}',
+  'htmldir': '${prefix}' / dir_doc_html, #?
+  'includedir': '${prefix}' / get_option('includedir'),
+  'libdir': '${exec_prefix}' / get_option('libdir'),
+  'localedir': '${prefix}' / get_option('localedir'),
+  'mandir': '${prefix}' / get_option('mandir'),
+  'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+foreach d, p : pgxs_dirs
+  pgxs_cdata.set(d, p)
+endforeach
+
+pgxs_deps = {
+  'bonjour': bonjour,
+  'bsd_auth': bsd_auth,
+  'gssapi': gssapi,
+  'icu': icu,
+  'ldap': ldap,
+  'libxml': libxml,
+  'libxslt': libxslt,
+  'llvm': llvm,
+  'lz4': lz4,
+  'nls': libintl,
+  'pam': pam,
+  'perl': perl_dep,
+  'python': python3_dep,
+  'readline': readline,
+  'selinux': selinux,
+  'systemd': systemd,
+  'tcl': tcl_dep,
+  'zlib': zlib,
+  'zstd': zstd,
+}
+foreach d, v : pgxs_deps
+  pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+pgxs_cdata.set('with_ssl', get_option('ssl'))
+pgxs_cdata.set('with_uuid', uuidopt)
+
+makefile_global = configure_file(
+  input: 'Makefile.global.in',
+  output: 'Makefile.global',
+  configuration: pgxs_cdata,
+  install: true,
+  install_dir: dir_pgxs / 'src',
+)
+configure_files += makefile_global
+
+# FIXME: check if exists
+makefile_port = configure_file(
+  input: 'makefiles' / 'Makefile.@0@'.format(portname),
+  output: 'Makefile.port',
+  copy: true,
+  install_dir: dir_pgxs / 'src')
+configure_files += makefile_port
+
+install_data(
+  'Makefile.shlib', 'nls-global.mk',
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'makefiles/pgxs.mk',
+  install_dir: dir_pgxs / 'src' / 'makefiles')
-- 
2.37.3.542.gdd3f6c4cae

v13-0017-meson-Add-postgresql-extension.pc-for-building-e.patchtext/x-diff; charset=us-asciiDownload
From 5663a3db376bf36d0c313eb642cc459c1fb18853 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:52:03 -0700
Subject: [PATCH v13 17/20] meson: Add postgresql-extension.pc for building
 extension libraries

This should work with several other buildsystems.

TODO: Docs and example
---
 src/backend/meson.build | 96 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/src/backend/meson.build b/src/backend/meson.build
index fefa40ddb64..0598085a240 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -180,6 +180,102 @@ pg_mod_args = default_mod_args + {
 
 
 
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = pg_mod_c_args
+pg_ext_libs = [backend_mod_code, thread_dep, ldflags, ldflags_mod]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+  if incdir.startswith('src/include')
+    subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+  else
+    subincdir = ''
+  endif
+  pg_ext_subdirs += subincdir
+
+  # Add directories in source / build dir containing headers to cflags for the
+  # -uninstalled.pc
+  pg_ext_vars_uninst += [
+    'build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+    'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir),
+  ]
+  pg_ext_cflags += [
+    '${build_inc@0@}'.format(i),
+    '${src_inc@0@}'.format(i)
+  ]
+
+  i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags += cflags
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'pkglibdir=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_mod=${pkglibdir}'
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+# referenced on some platforms, via mod_link_with_dir
+pg_ext_vars += 'bindir=${prefix}/@0@'.format(dir_bin)
+
+# XXX: Define variables making it easy to define tests, too
+
+# Some platforms need linker flags to link with binary, they are the same
+# between building with meson and .pc file, except that we have have to
+# reference a variable to make it work for both normal and -uninstalled .pc
+# files.
+if mod_link_args_fmt.length() != 0
+  assert(link_with_inst != '')
+  assert(link_with_uninst != '')
+
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format(link_with_inst)
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(link_with_uninst)
+
+  foreach el : mod_link_args_fmt
+    pg_ext_libs += el.format('${mod_link_with}')
+  endforeach
+endif
+
+# main .pc to build extensions
+pkgconfig.generate(
+  name: 'postgresql-extension',
+  description: 'PostgreSQL Extension Support',
+  url: pg_url,
+
+  subdirs: pg_ext_subdirs,
+  libraries: pg_ext_libs,
+  extra_cflags: pg_ext_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+  name: 'postgresql-extension-warnings',
+  description: 'PostgreSQL Extension Support - Compiler Warnings',
+  requires: 'postgresql-extension',
+  url: pg_url,
+  extra_cflags: cflags_warn,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+
 # Shared modules that, on some system, link against the server binary. Only
 # enter these after we defined the server build.
 
-- 
2.37.3.542.gdd3f6c4cae

v13-0018-meson-Add-LLVM-bitcode-emission.patchtext/x-diff; charset=us-asciiDownload
From 3e93a32d8b50435546654ea23a52b07bc13164dc Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 19:58:45 -0700
Subject: [PATCH v13 18/20] meson: Add LLVM bitcode emission

This needs a bit more love before being ready...
---
 src/backend/jit/llvm/meson.build | 21 +++++++++++++++
 src/backend/meson.build          | 46 ++++++++++++++++++++++++++++++++
 meson.build                      |  2 ++
 src/tools/irlink                 | 43 +++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+)
 create mode 100644 src/tools/irlink

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..ede51503377 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -48,6 +48,19 @@ else
   llvm_irgen_command = clang
 endif
 
+llvm_irlink_kw = {
+  'command': [
+    irlink,
+    '--name', 'postgres',
+    '--lto', llvm_lto,
+    '--outdir', '@OUTPUT0@',
+    '--privdir', '@PRIVATE_DIR@',
+    '@INPUT@',
+  ],
+  'install': true,
+  'install_dir': dir_lib_pkg,
+}
+
 
 # XXX: Need to determine proper version of the function cflags for clang
 bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
@@ -71,3 +84,11 @@ llvmjit_types = custom_target('llvmjit_types.bc',
   depfile: '@BASENAME@.c.bc.d',
 )
 backend_targets += llvmjit_types
+
+# Figure out -I's needed to build all postgres code, including all its
+# dependencies
+pkg_config = find_program(['pkg-config', 'pkgconf'], required: true)
+r = run_command(pkg_config,
+  ['--cflags-only-I', meson.build_root() / 'meson-uninstalled/postgresql-extension-uninstalled.pc'],
+  check: true)
+bitcode_cflags += r.stdout().split()
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 0598085a240..3f5e9883c0c 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -284,3 +284,49 @@ subdir('replication/libpqwalreceiver')
 subdir('replication/pgoutput')
 subdir('snowball')
 subdir('utils/mb/conversion_procs')
+
+
+
+###############################################################
+# emit LLVM bitcode of backend code for JIT inlining
+###############################################################
+
+if llvm.found()
+
+  # custom_target() insists on targetting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generators don't accept CustomTargetIndex as input or 'depends', nor do
+  # they like targets with more than one output. However, a custom target
+  # accepts them as input without a problem. So we have the below transitive
+  # target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args + bitcode_cflags,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: '@PLAINNAME@.bc',
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('bitcode',
+    output: ['bitcode'],
+    input: bc_backend_sources,
+    kwargs: llvm_irlink_kw,
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/meson.build b/meson.build
index 31c7dbe0ea0..a56af6ccb0e 100644
--- a/meson.build
+++ b/meson.build
@@ -684,6 +684,8 @@ if not llvmopt.disabled()
 
     ccache = find_program('ccache', native: true, required: false)
     clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+    irlink = find_program('src/tools/irlink', native: true)
   endif
 else
   llvm = not_found_dep
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..813bbf13398
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(
+    description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+    shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = []
+for input in args.INPUT:
+    file_names += [args.name + input.replace(args.privdir, '')]
+
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink',
+           '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v13-0019-meson-Add-support-for-building-with-precompiled-.patchtext/x-diff; charset=us-asciiDownload
From 779129f32124314ef8a3672be9f3ba1b5d29295b Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 30 Aug 2022 13:33:00 -0700
Subject: [PATCH v13 19/20] meson: Add support for building with precompiled
 headers

This substantially speeds up building for windows. A cross build with mingw
goes from

real	0m29.884s
user	15m41.900s
sys	1m58.257s

to

real	0m13.196s
user	6m52.330s
sys	1m15.140s

The wins on windows are similar-ish (but I don't have a system at hand just
now for actual numbers).
---
 src/include/meson.build           | 1 +
 src/include/pch/c_pch.h           | 1 +
 src/include/pch/meson.build       | 4 ++++
 src/include/pch/postgres_fe_pch.h | 1 +
 src/include/pch/postgres_pch.h    | 1 +
 src/common/meson.build            | 2 ++
 src/port/meson.build              | 2 ++
 src/backend/meson.build           | 5 +++++
 src/backend/snowball/meson.build  | 1 +
 src/fe_utils/meson.build          | 1 +
 src/bin/pg_dump/meson.build       | 1 +
 src/bin/pg_upgrade/meson.build    | 1 +
 src/bin/psql/meson.build          | 1 +
 src/interfaces/libpq/meson.build  | 1 +
 src/pl/plperl/meson.build         | 1 +
 src/pl/plpgsql/src/meson.build    | 1 +
 src/pl/plpython/meson.build       | 1 +
 src/pl/tcl/meson.build            | 1 +
 contrib/bloom/meson.build         | 1 +
 contrib/btree_gist/meson.build    | 1 +
 contrib/hstore/meson.build        | 1 +
 contrib/pg_trgm/meson.build       | 1 +
 contrib/pgcrypto/meson.build      | 1 +
 contrib/pgstattuple/meson.build   | 1 +
 contrib/sepgsql/meson.build       | 1 +
 contrib/xml2/meson.build          | 1 +
 .cirrus.yml                       | 4 ++--
 meson.build                       | 8 ++++++++
 28 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/meson.build
 create mode 100644 src/include/pch/postgres_fe_pch.h
 create mode 100644 src/include/pch/postgres_pch.h

diff --git a/src/include/meson.build b/src/include/meson.build
index e5390df0584..28ed9011c70 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -110,6 +110,7 @@ install_headers(
 
 subdir('catalog')
 subdir('nodes')
+subdir('pch')
 subdir('storage')
 subdir('utils')
 
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..2bcec49c3a2
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,4 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
+pch_postgres_fe_h = meson.source_root() / meson.current_source_dir() / 'postgres_fe_pch.h'
diff --git a/src/include/pch/postgres_fe_pch.h b/src/include/pch/postgres_fe_pch.h
new file mode 100644
index 00000000000..f3ea20912d3
--- /dev/null
+++ b/src/include/pch/postgres_fe_pch.h
@@ -0,0 +1 @@
+#include "postgres_fe.h"
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/common/meson.build b/src/common/meson.build
index 23842e1ffef..1c9b8a3a018 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -147,6 +147,7 @@ foreach name, opts : pgcommon_variants
     endif
     c_args = opts.get('c_args', []) + common_cflags[cflagname]
     cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'sources': sources,
@@ -159,6 +160,7 @@ foreach name, opts : pgcommon_variants
 
   lib = static_library('libpgcommon@0@'.format(name),
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
diff --git a/src/port/meson.build b/src/port/meson.build
index ced2e014db8..c2222696f1b 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -161,6 +161,7 @@ foreach name, opts : pgport_variants
     c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
     cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
       sources,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'c_args': c_args,
         'build_by_default': false,
@@ -172,6 +173,7 @@ foreach name, opts : pgport_variants
   lib = static_library('libpgport@0@'.format(name),
       pgport_sources,
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
       }
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 3f5e9883c0c..36d06c7ca6b 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -62,6 +62,7 @@ postgres_lib = static_library('postgres_lib',
   backend_sources + timezone_sources + generated_backend_sources,
   link_whole: backend_link_with,
   dependencies: backend_build_deps,
+  c_pch: pch_postgres_h,
   kwargs: internal_lib_args,
 )
 
@@ -81,6 +82,10 @@ if cc.get_id() == 'msvc'
 
   backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
   backend_link_depends += postgres_def
+  # Due to the way msvc and meson's precompiled headers implementation
+  # interact, we need to have symbols from the full library available. Could
+  # be restricted to b_pch=true.
+  backend_link_with += postgres_lib
 
 elif host_system == 'aix'
   # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 8c6f685cb32..2747026c729 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -60,6 +60,7 @@ stemmer_inc = include_directories('../../include/snowball')
 
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
+  c_pch: pch_postgres_h,
   kwargs: pg_mod_args + {
     'include_directories': [stemmer_inc],
   }
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index b6bf8e1ca21..f1ba5ac8c14 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -23,6 +23,7 @@ fe_utils_sources += psqlscan
 
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
+  c_pch: pch_postgres_fe_h,
   include_directories: [postgres_inc, libpq_inc],
   dependencies: frontend_common_code,
   kwargs: default_lib_args,
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 3527a25c288..e66f632b54e 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -13,6 +13,7 @@ pg_dump_common_sources = files(
 
 pg_dump_common = static_library('libpgdump_common',
   pg_dump_common_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq, zlib],
   kwargs: internal_lib_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 02f030e0ccf..372ab47ab92 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -18,6 +18,7 @@ pg_upgrade_sources = files(
 
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 3474389d3b6..8ec07260d1b 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -46,6 +46,7 @@ endif
 
 psql = executable('psql',
   psql_sources,
+  c_pch: pch_postgres_fe_h,
   include_directories: include_directories('.'),
   dependencies: [frontend_code, libpq, readline],
   kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 2c9edeaa088..72102521edc 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -49,6 +49,7 @@ libpq_st = static_library('libpq',
   pic: true,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
+  c_pch: pch_postgres_fe_h,
   dependencies: libpq_deps,
   kwargs: default_lib_args,
 )
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 73b733dd50b..9866737c913 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -38,6 +38,7 @@ endforeach
 plperl_inc = include_directories('.')
 plperl = shared_module('plperl',
   plperl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plperl_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [perl_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index dd499fdd151..eb0ddaac376 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -42,6 +42,7 @@ plpgsql_sources += pl_unreserved
 
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
+  c_pch: pch_postgres_h,
   include_directories: include_directories('.'),
   kwargs: pg_mod_args,
 )
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 366b3b171ac..5cecd9aeb0c 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -30,6 +30,7 @@ plpython_inc = include_directories('.')
 
 plpython = shared_module('plpython3',
   plpython_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plpython_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [python3_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index 9b6addd7fd5..9d31074f0eb 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -16,6 +16,7 @@ pltcl_sources += custom_target('pltclerrcodes.h',
 
 pltcl = shared_module('pltcl',
   pltcl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [include_directories('.'), postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [tcl_dep, pg_mod_args['dependencies']],
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 1fe7632bdbe..3d9fe8bf930 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -9,6 +9,7 @@ bloom_sources = files(
 
 bloom = shared_module('bloom',
   bloom_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += bloom
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index c0a8d238540..4aefe475573 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -27,6 +27,7 @@ btree_gist_sources = files(
 
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gist
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 07c59f40a97..d472c2591d8 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -10,6 +10,7 @@ hstore = shared_module('hstore',
     'hstore_op.c',
     'hstore_subs.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index a90628d23c6..6e9d5cabdbb 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -5,6 +5,7 @@ pg_trgm = shared_module('pg_trgm',
     'trgm_op.c',
     'trgm_regexp.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index fe0851bf8e8..8e08b2f5ae9 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -72,6 +72,7 @@ endif
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
   },
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 8e828692d5c..65318f27e11 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -4,6 +4,7 @@ pgstattuple = shared_module('pgstattuple',
     'pgstatindex.c',
     'pgstattuple.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 60a95e17c2f..fd88b14a3c5 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -16,6 +16,7 @@ sepgsql_sources = files(
 
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [selinux, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 9c0b56f01f6..8b041b4d4cb 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -7,6 +7,7 @@ xml2 = shared_module('pgxml',
     'xpath.c',
     'xslt_proc.c',
   ),
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/.cirrus.yml b/.cirrus.yml
index 5a7a93baf4c..cdd2f238c78 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -1174,7 +1174,7 @@ task:
 
   configure_script:
     - vcvarsall x64
-    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+    - meson setup --buildtype debug --backend ninja  -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
 
   build_script:
     - vcvarsall x64
@@ -1201,7 +1201,7 @@ task:
 
   configure_script:
     - vcvarsall x64
-    - meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+    - meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
 
   build_script:
     - vcvarsall x64
diff --git a/meson.build b/meson.build
index a56af6ccb0e..c4d3ce83954 100644
--- a/meson.build
+++ b/meson.build
@@ -15,6 +15,7 @@ project('postgresql',
   meson_version: '>=0.54',
   default_options: [
     'warning_level=1', #-Wall equivalent
+    'b_pch=false',
     'buildtype=release',
   ]
 )
@@ -1769,6 +1770,13 @@ if cc.get_id() == 'msvc'
     '/wd4267', # conversion from 'size_t' to 'type', possible loss of data
   ]
 
+  # Dirty hack to disable warnings due to some files defining
+  # UMDF_USING_NTSTATUS before including postgres.h. We need a better fix, but
+  # for now this allows us to see "real" warnings.
+  if get_option('b_pch')
+    cflags_warn += '/wd4005' # macro redefinition
+  endif
+
   cppflags += [
     '/DWIN32',
     '/DWINDOWS',
-- 
2.37.3.542.gdd3f6c4cae

#308Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#307)
Re: [RFC] building postgres with meson - v13

Andres Freund <andres@anarazel.de> writes:

I'm inclined to build the static lib on windows as long as we do it on other
platforms.

Maybe I spent too much time working for Red Hat, but I'm kind of
unhappy that we build static libraries at all. They are maintenance
hazards and therefore security hazards by definition, because if
you find a problem in $package_x you will have to find and rebuild
every other package that has statically-embedded code from $package_x.
So Red Hat has, or least had, a policy against packages exporting
such libraries.

I realize that there are people for whom other considerations outweigh
that, but I don't think that we should install static libraries by
default. Long ago it was pretty common for configure scripts to
offer --enable-shared and --enable-static options ... should we
resurrect that?

regards, tom lane

#309Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#308)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-15 01:10:16 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

I'm inclined to build the static lib on windows as long as we do it on other
platforms.

Maybe I spent too much time working for Red Hat, but I'm kind of
unhappy that we build static libraries at all.

Yea, I have been wondering about that too.

Oddly enough, given our current behaviour, the strongest case for static
libraries IMO is on windows, due to the lack of a) rpath b) a general library
search path.

Peter IIRC added the static libraries to the meson port just to keep the set
of installed files the same, which makes sense.

They are maintenance hazards and therefore security hazards by definition,
because if you find a problem in $package_x you will have to find and
rebuild every other package that has statically-embedded code from
$package_x. So Red Hat has, or least had, a policy against packages
exporting such libraries.

It obviously is a bad idea for widely used system packages. I think there are
a few situations, e.g. a downloadable self-contained and relocatable
application, where shared libraries provide less of a benefit.

I realize that there are people for whom other considerations outweigh
that, but I don't think that we should install static libraries by
default. Long ago it was pretty common for configure scripts to
offer --enable-shared and --enable-static options ... should we
resurrect that?

It'd be easy enough. I don't really have an opinion on whether it's worth
having the options. I think most packaging systems have ways of not including
files even if $software installs them.

Greetings,

Andres Freund

#310Thomas Munro
thomas.munro@gmail.com
In reply to: Andres Freund (#307)
Re: [RFC] building postgres with meson - v13

On Thu, Sep 15, 2022 at 2:26 PM Andres Freund <andres@anarazel.de> wrote:

- noticed that libpgport.a had and needed a dependency on errcodes.h - that
seemed wrong. The dependency is due to src/port/*p{read,write}v?.c including
postgres.h - which seems wrong. So I added a patch changing them to include
c.h.

Oops. +1

GCC 12 produces a bunch of warnings by default with meson, and that
turned out to be because the default optimisation level is -O3.
That's a change from the make build, which uses -O2. Should we set a
default of 2, or is there some meson-way-of-doing-things reason why
not?

#311Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#310)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-16 09:14:20 +1200, Thomas Munro wrote:

GCC 12 produces a bunch of warnings by default with meson, and that
turned out to be because the default optimisation level is -O3.
That's a change from the make build, which uses -O2. Should we set a
default of 2, or is there some meson-way-of-doing-things reason why
not?

We can change the defaults - the only downside is that there's a convenience
setting 'buildtype' (debug, debugoptimized, release, minsize, custom, plain)
that changes multiple settings (optimization level, amount of debugging
information) and that doesn't work as nicely if you change the default
compiler optimization setting.

They made a similar discovery as us, deriving the defaults of settings based
on other settings quickly can become confusing. I think they're looking at how
to make that UI a bit nicer.

I'd prefer to defer fine-tuning the default settings till a bunch of this has
gone in, but I won't insist on that course.

Their default warning flags passed to compilers trigger a bunch of warnings in
our build (irrespective of -O*), so I lowered the warning level. But I think
their set of settings likely is sensible, an we should just disable a bunch of
warnings we don't care about. But I haven't done that for now, to keep the set
of warning flags the same between meson and autoconf.

Greetings,

Andres Freund

#312Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#310)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-16 09:14:20 +1200, Thomas Munro wrote:

On Thu, Sep 15, 2022 at 2:26 PM Andres Freund <andres@anarazel.de> wrote:

- noticed that libpgport.a had and needed a dependency on errcodes.h - that
seemed wrong. The dependency is due to src/port/*p{read,write}v?.c including
postgres.h - which seems wrong. So I added a patch changing them to include
c.h.

Oops. +1

Looks like this has been the case since
0d56acfbaa799553c0c6ea350fd6e68d81025994 in 14. Any opinions on whether we
should backpatch the "fix"?

Greetings,

Andres Freund

#313Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#312)
Re: [RFC] building postgres with meson - v13

Andres Freund <andres@anarazel.de> writes:

On 2022-09-16 09:14:20 +1200, Thomas Munro wrote:

On Thu, Sep 15, 2022 at 2:26 PM Andres Freund <andres@anarazel.de> wrote:

- noticed that libpgport.a had and needed a dependency on errcodes.h - that
seemed wrong. The dependency is due to src/port/*p{read,write}v?.c including
postgres.h - which seems wrong. So I added a patch changing them to include
c.h.

Oops. +1

Looks like this has been the case since
0d56acfbaa799553c0c6ea350fd6e68d81025994 in 14. Any opinions on whether we
should backpatch the "fix"?

+1, those files have no business including all of postgres.h

regards, tom lane

#314Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#313)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-16 16:22:35 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2022-09-16 09:14:20 +1200, Thomas Munro wrote:

On Thu, Sep 15, 2022 at 2:26 PM Andres Freund <andres@anarazel.de> wrote:

- noticed that libpgport.a had and needed a dependency on errcodes.h - that
seemed wrong. The dependency is due to src/port/*p{read,write}v?.c including
postgres.h - which seems wrong. So I added a patch changing them to include
c.h.

Oops. +1

Looks like this has been the case since
0d56acfbaa799553c0c6ea350fd6e68d81025994 in 14. Any opinions on whether we
should backpatch the "fix"?

+1, those files have no business including all of postgres.h

Done.

I've been wondering whether we should protect against this kind of issue on
the buildsystem level. Whenever building frontend code, add something like
-DBUILDING_FRONTEND, and error out if postgres.h is included without going
through postgres_fe.h.

Greetings,

Andres Freund

#315Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#307)
Re: [RFC] building postgres with meson - v13

On 15.09.22 04:26, Andres Freund wrote:

Attached is v13 of the meson patchset. The biggest changes are:

Did something about warning flags change from the previous patch set? I
see it's building with -Wextra now, which combined with -Werror causes
the build to fail for me. I have never encountered that with any of the
previous patch sets.

#316Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#315)
Re: [RFC] building postgres with meson - v13

Hi,

On September 18, 2022 5:24:06 PM PDT, Peter Eisentraut <peter.eisentraut@enterprisedb.com> wrote:

On 15.09.22 04:26, Andres Freund wrote:

Attached is v13 of the meson patchset. The biggest changes are:

Did something about warning flags change from the previous patch set? I see it's building with -Wextra now, which combined with -Werror causes the build to fail for me. I have never encountered that with any of the previous patch sets.

In older versions of the patch the default warning level was set to include Wextra, and I had added my local flags to suppress uninteresting warnings. Comparing the warning flags I reduced the warning level and removed the suppressing flags - but changing default options only affects new build trees. To change existing ones do meson configure -Dwarning_level=1
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

#317Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#316)
Re: [RFC] building postgres with meson - v13

On 19.09.22 02:29, Andres Freund wrote:

Hi,

On September 18, 2022 5:24:06 PM PDT, Peter Eisentraut <peter.eisentraut@enterprisedb.com> wrote:

On 15.09.22 04:26, Andres Freund wrote:

Attached is v13 of the meson patchset. The biggest changes are:

Did something about warning flags change from the previous patch set? I see it's building with -Wextra now, which combined with -Werror causes the build to fail for me. I have never encountered that with any of the previous patch sets.

In older versions of the patch the default warning level was set to include Wextra, and I had added my local flags to suppress uninteresting warnings. Comparing the warning flags I reduced the warning level and removed the suppressing flags - but changing default options only affects new build trees. To change existing ones do meson configure -Dwarning_level=1

Ok that was the reason. It works now.

IMO, the following commits are ready to be pushed now:

b7d7fe009731 Remove DLLTOOL, DLLWRAP from configure / Makefile.global.in
979f26889544 Don't hardcode tmp_check/ as test directory for tap tests
9fc657fbb7e2 Split TESTDIR into TESTLOGDIR and TESTDATADIR
6de8f1de0ffa meson: prereq: Extend gendef.pl in preparation for meson
7054861f0fef meson: prereq: Add src/tools/gen_export.pl
1aa586f2921c meson: prereq: Refactor PG_TEST_EXTRA logic in autoconf build
5a9731dcc2e6 meson: prereq: port: Include c.h instead of postgres.h in *p{read,write}*.c
1939bdcfbfea meson: Add meson based buildsystem

#318Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#317)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-19 05:25:59 -0400, Peter Eisentraut wrote:

IMO, the following commits are ready to be pushed now:

Slowly working through them.

To have some initial "translation" for other developers I've started a wiki
page with a translation table. Still very WIP:
https://wiki.postgresql.org/wiki/Meson

For now, a bit of polishing aside, I'm just planning to add a minimal
explanation of what's happening, and a reference to this thread.

b7d7fe009731 Remove DLLTOOL, DLLWRAP from configure / Makefile.global.in
979f26889544 Don't hardcode tmp_check/ as test directory for tap tests
9fc657fbb7e2 Split TESTDIR into TESTLOGDIR and TESTDATADIR
6de8f1de0ffa meson: prereq: Extend gendef.pl in preparation for meson
5a9731dcc2e6 meson: prereq: port: Include c.h instead of postgres.h in *p{read,write}*.c

Done

7054861f0fef meson: prereq: Add src/tools/gen_export.pl

This one I'm planning to merge with the "main" commit, given there's no other user.

Greetings,

Andres Freund

#319Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#318)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-19 19:16:30 -0700, Andres Freund wrote:

To have some initial "translation" for other developers I've started a wiki
page with a translation table. Still very WIP:
https://wiki.postgresql.org/wiki/Meson

For now, a bit of polishing aside, I'm just planning to add a minimal
explanation of what's happening, and a reference to this thread.

I added installation instructions for meson for a bunch of platforms, but
failed to figure out how to do so in a rhel9 container. I don't have a rhel
subscription, and apparently the repos with developer tools now require a
subscription. Great way to make it easy for projects to test anything on RHEL.

Greetings,

Andres Freund

#320John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#319)
Re: [RFC] building postgres with meson - v13

On Wed, Sep 21, 2022 at 7:11 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-19 19:16:30 -0700, Andres Freund wrote:

To have some initial "translation" for other developers I've started a

wiki

page with a translation table. Still very WIP:
https://wiki.postgresql.org/wiki/Meson

For now, a bit of polishing aside, I'm just planning to add a minimal
explanation of what's happening, and a reference to this thread.

I added installation instructions for meson for a bunch of platforms, but

Small typo: The homebrew section is still labeled with "find MacPorts
libraries".

--
John Naylor
EDB: http://www.enterprisedb.com

#321Andres Freund
andres@anarazel.de
In reply to: John Naylor (#320)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-21 09:52:48 +0700, John Naylor wrote:

On Wed, Sep 21, 2022 at 7:11 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-19 19:16:30 -0700, Andres Freund wrote:

To have some initial "translation" for other developers I've started a

wiki

page with a translation table. Still very WIP:
https://wiki.postgresql.org/wiki/Meson

For now, a bit of polishing aside, I'm just planning to add a minimal
explanation of what's happening, and a reference to this thread.

I added installation instructions for meson for a bunch of platforms, but

Small typo: The homebrew section is still labeled with "find MacPorts
libraries".

Thanks, fixed. I wrote these blindly, so there's probably more wrong than this
- although Thomas was helpful enough to provide some information / testing.

Greetings,

Andres Freund

#322Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#318)
1 attachment(s)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-19 19:16:30 -0700, Andres Freund wrote:

On 2022-09-19 05:25:59 -0400, Peter Eisentraut wrote:

IMO, the following commits are ready to be pushed now:

Slowly working through them.

I've attached an updated version of the main meson commit (and pushed all of
them to my git tree obviously). Changes:

- Added a longer commit message
- Stopped building doc/src/sgml/postgres-full.xml by default - somehow I
thought we did so by default for the autoconf build, but that's not the
case. Thomas noticed that that was extremely slow on one of his machines,
which turns out to be because it's downloading the dtd's.
- Added a missing dependency on check_rules.pl's result, lost that in a
cleanup, oops
- Fixed a few typos, via codespell

I'm planning to commit this today, unless somebody wants to argue against
that.

After that I am planning to split the "ci" commit so that it converts a few of
the CI tasks to use meson, without adding all the other platforms I added for
development. I think that's important to get in soon, given that it'll
probably take a bit until the buildfarm grows meson coverage and because it
provides cfbot coverage which seems important for now as well.

I think we should:

- convert windows to build with ninja - it builds faster, runs all tests,
parallelizes tests. That means that msbuild based builds don't have coverage
via CI / cfbot, but we don't currently have the resources to test both.
- add a linux build using meson, we currently can afford building both with
autoconf and meson for linux

I'm less clear on whether we should convert macos / freebsd to meson at this
point?

Greetings,

Andres Freund

Attachments:

v14-0001-meson-Add-initial-version-of-meson-based-buildsy.patchtext/x-diff; charset=us-asciiDownload
From f4650ce105e37266309d8a17ce2c93b4d6e41da9 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v14 01/13] meson: Add initial version of meson based
 buildsystem

Autoconf is showing its age, fewer and fewer contributors know how to wrangle
it. Recursive make has a lot of hard to resolve dependency issues and slow
incremental rebuilds. Our home-grown MSVC buildsystem is hard to maintain for
developers not using windows and runs tests serially. While these and other
issues could individually be addressed with incremental improvements, together
they seem best addressed by moving to a more modern buildsystem.

After evaluating different buildsystem choices, we chose to use meson, to a
good degree based on the adoption by other open source projects.

We decided that it's more realistic to commit a relatively early version of
the new buildsystem and mature it in tree.

This commit adds an initial version of a meson based buildsystem. It supports
building postgres on at least aix, freebsd, linux, macos, netbsd, openbsd,
solaris and windows (however only gcc is supported on aix, solaris). For
windows/msvc postgres can now be built with ninja (faster, particularly for
incremental builds) and msbuild (supporting the visual studio GUI, but
building slower).

Several aspects (e.g. windows rc file generation, PGXS compatibility, LLVM
bitcode generation, documentation adjustments) are done in subsequent commits
requiring further review. Other aspects (e.g. not installing test-only
extensions) are not yet addressed.

When building on windows with msbuild, builds are slower when using a visual
studio version older than 2019, because those versions do not support
MultiToolTask, required by meson for intra-target parallelism.

The plan is to remove the msvc specific buildsystem in src/tools/msvc soon
after reaching feature parity. However, we're not planning to remove the
autoconf/make buildsystem in the near future. Likely we're going to keep at
least the parts required for PGXS to keep working around until all supported
versions build with meson.

Some initial help for postgres developers is at
https://wiki.postgresql.org/wiki/Meson

With contributions from Thomas Munro, John Naylor, Stone Tickle and others.

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Peter Eisentraut <peter@eisentraut.org>
Reviewed-By: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Discussion: https://postgr.es/m/20211012083721.hvixq4pnh2pixr3j@alap3.anarazel.de
---
 src/include/catalog/meson.build               |  142 +
 src/include/meson.build                       |  173 +
 src/include/nodes/meson.build                 |   58 +
 src/include/pg_config_ext.h.meson             |    7 +
 src/include/storage/meson.build               |   19 +
 src/include/utils/meson.build                 |   57 +
 src/common/meson.build                        |  174 +
 src/common/unicode/meson.build                |  106 +
 src/port/meson.build                          |  184 +
 config/meson.build                            |    4 +
 src/backend/access/brin/meson.build           |   12 +
 src/backend/access/common/meson.build         |   18 +
 src/backend/access/gin/meson.build            |   17 +
 src/backend/access/gist/meson.build           |   13 +
 src/backend/access/hash/meson.build           |   12 +
 src/backend/access/heap/meson.build           |   11 +
 src/backend/access/index/meson.build          |    6 +
 src/backend/access/meson.build                |   13 +
 src/backend/access/nbtree/meson.build         |   13 +
 src/backend/access/rmgrdesc/meson.build       |   26 +
 src/backend/access/spgist/meson.build         |   13 +
 src/backend/access/table/meson.build          |    6 +
 src/backend/access/tablesample/meson.build    |    5 +
 src/backend/access/transam/meson.build        |   31 +
 src/backend/backup/meson.build                |   13 +
 src/backend/bootstrap/meson.build             |   28 +
 src/backend/catalog/meson.build               |   44 +
 src/backend/commands/meson.build              |   51 +
 src/backend/executor/meson.build              |   67 +
 src/backend/foreign/meson.build               |    3 +
 src/backend/jit/llvm/meson.build              |   73 +
 src/backend/jit/meson.build                   |    3 +
 src/backend/lib/meson.build                   |   12 +
 src/backend/libpq/meson.build                 |   32 +
 src/backend/main/meson.build                  |    2 +
 src/backend/meson.build                       |  190 ++
 src/backend/nodes/meson.build                 |   29 +
 src/backend/optimizer/geqo/meson.build        |   17 +
 src/backend/optimizer/meson.build             |    5 +
 src/backend/optimizer/path/meson.build        |   11 +
 src/backend/optimizer/plan/meson.build        |   10 +
 src/backend/optimizer/prep/meson.build        |    7 +
 src/backend/optimizer/util/meson.build        |   16 +
 src/backend/parser/meson.build                |   48 +
 src/backend/partitioning/meson.build          |    5 +
 src/backend/po/meson.build                    |    1 +
 src/backend/port/meson.build                  |   31 +
 src/backend/port/win32/meson.build            |    6 +
 src/backend/postmaster/meson.build            |   15 +
 src/backend/regex/meson.build                 |    8 +
 .../replication/libpqwalreceiver/meson.build  |   13 +
 src/backend/replication/logical/meson.build   |   14 +
 src/backend/replication/meson.build           |   51 +
 src/backend/replication/pgoutput/meson.build  |   10 +
 src/backend/rewrite/meson.build               |    9 +
 src/backend/snowball/meson.build              |   88 +
 src/backend/statistics/meson.build            |    6 +
 src/backend/storage/buffer/meson.build        |    7 +
 src/backend/storage/file/meson.build          |    8 +
 src/backend/storage/freespace/meson.build     |    5 +
 src/backend/storage/ipc/meson.build           |   20 +
 src/backend/storage/large_object/meson.build  |    3 +
 src/backend/storage/lmgr/meson.build          |   13 +
 src/backend/storage/meson.build               |    9 +
 src/backend/storage/page/meson.build          |    5 +
 src/backend/storage/smgr/meson.build          |    4 +
 src/backend/storage/sync/meson.build          |    4 +
 src/backend/tcop/meson.build                  |    8 +
 src/backend/tsearch/meson.build               |   21 +
 src/backend/utils/activity/meson.build        |   18 +
 src/backend/utils/adt/meson.build             |  131 +
 src/backend/utils/cache/meson.build           |   16 +
 src/backend/utils/error/meson.build           |    6 +
 src/backend/utils/fmgr/meson.build            |    8 +
 src/backend/utils/hash/meson.build            |    4 +
 src/backend/utils/init/meson.build            |    4 +
 .../utils/mb/conversion_procs/meson.build     |   36 +
 src/backend/utils/mb/meson.build              |    9 +
 src/backend/utils/meson.build                 |   17 +
 src/backend/utils/misc/meson.build            |   35 +
 src/backend/utils/mmgr/meson.build            |   10 +
 src/backend/utils/resowner/meson.build        |    3 +
 src/backend/utils/sort/meson.build            |    9 +
 src/backend/utils/time/meson.build            |    4 +
 src/fe_utils/meson.build                      |   29 +
 src/bin/initdb/meson.build                    |   30 +
 src/bin/initdb/po/meson.build                 |    1 +
 src/bin/meson.build                           |   20 +
 src/bin/pg_amcheck/meson.build                |   27 +
 src/bin/pg_amcheck/po/meson.build             |    1 +
 src/bin/pg_archivecleanup/meson.build         |   19 +
 src/bin/pg_archivecleanup/po/meson.build      |    1 +
 src/bin/pg_basebackup/meson.build             |   61 +
 src/bin/pg_basebackup/po/meson.build          |    1 +
 src/bin/pg_checksums/meson.build              |   21 +
 src/bin/pg_checksums/po/meson.build           |    1 +
 src/bin/pg_config/meson.build                 |   19 +
 src/bin/pg_config/po/meson.build              |    1 +
 src/bin/pg_controldata/meson.build            |   19 +
 src/bin/pg_controldata/po/meson.build         |    1 +
 src/bin/pg_ctl/meson.build                    |   22 +
 src/bin/pg_ctl/po/meson.build                 |    1 +
 src/bin/pg_dump/meson.build                   |   75 +
 src/bin/pg_dump/po/meson.build                |    1 +
 src/bin/pg_resetwal/meson.build               |   20 +
 src/bin/pg_resetwal/po/meson.build            |    1 +
 src/bin/pg_rewind/meson.build                 |   42 +
 src/bin/pg_rewind/po/meson.build              |    1 +
 src/bin/pg_test_fsync/meson.build             |   21 +
 src/bin/pg_test_fsync/po/meson.build          |    1 +
 src/bin/pg_test_timing/meson.build            |   19 +
 src/bin/pg_test_timing/po/meson.build         |    1 +
 src/bin/pg_upgrade/meson.build                |   40 +
 src/bin/pg_upgrade/po/meson.build             |    1 +
 src/bin/pg_verifybackup/meson.build           |   33 +
 src/bin/pg_verifybackup/po/meson.build        |    1 +
 src/bin/pg_waldump/meson.build                |   30 +
 src/bin/pg_waldump/po/meson.build             |    1 +
 src/bin/pgbench/meson.build                   |   38 +
 src/bin/pgevent/meson.build                   |   26 +
 src/bin/psql/meson.build                      |   67 +
 src/bin/psql/po/meson.build                   |    1 +
 src/bin/scripts/meson.build                   |   51 +
 src/bin/scripts/po/meson.build                |    1 +
 src/interfaces/libpq/meson.build              |  108 +
 src/interfaces/libpq/po/meson.build           |    1 +
 src/interfaces/libpq/test/meson.build         |   15 +
 src/pl/meson.build                            |    5 +
 src/pl/plperl/meson.build                     |   90 +
 src/pl/plperl/po/meson.build                  |    1 +
 src/pl/plpgsql/meson.build                    |    1 +
 src/pl/plpgsql/src/meson.build                |   84 +
 src/pl/plpgsql/src/po/meson.build             |    1 +
 src/pl/plpython/meson.build                   |   99 +
 src/pl/plpython/po/meson.build                |    1 +
 src/pl/tcl/meson.build                        |   55 +
 src/pl/tcl/po/meson.build                     |    1 +
 contrib/adminpack/meson.build                 |   23 +
 contrib/amcheck/meson.build                   |   37 +
 contrib/auth_delay/meson.build                |    5 +
 contrib/auto_explain/meson.build              |   16 +
 contrib/basebackup_to_shell/meson.build       |   22 +
 contrib/basic_archive/meson.build             |   23 +
 contrib/bloom/meson.build                     |   36 +
 contrib/bool_plperl/meson.build               |   42 +
 contrib/btree_gin/meson.build                 |   54 +
 contrib/btree_gist/meson.build                |   84 +
 contrib/citext/meson.build                    |   34 +
 contrib/cube/meson.build                      |   53 +
 contrib/dblink/meson.build                    |   31 +
 contrib/dict_int/meson.build                  |   22 +
 contrib/dict_xsyn/meson.build                 |   29 +
 contrib/earthdistance/meson.build             |   23 +
 contrib/file_fdw/meson.build                  |   22 +
 contrib/fuzzystrmatch/meson.build             |   26 +
 contrib/hstore/meson.build                    |   44 +
 contrib/hstore_plperl/meson.build             |   43 +
 contrib/hstore_plpython/meson.build           |   37 +
 contrib/intagg/meson.build                    |    6 +
 contrib/intarray/meson.build                  |   37 +
 contrib/isn/meson.build                       |   33 +
 contrib/jsonb_plperl/meson.build              |   43 +
 contrib/jsonb_plpython/meson.build            |   36 +
 contrib/lo/meson.build                        |   27 +
 contrib/ltree/meson.build                     |   44 +
 contrib/ltree_plpython/meson.build            |   37 +
 contrib/meson.build                           |   66 +
 contrib/oid2name/meson.build                  |   17 +
 contrib/old_snapshot/meson.build              |   15 +
 contrib/pageinspect/meson.build               |   50 +
 contrib/passwordcheck/meson.build             |   30 +
 contrib/pg_buffercache/meson.build            |   27 +
 contrib/pg_freespacemap/meson.build           |   29 +
 contrib/pg_prewarm/meson.build                |   27 +
 contrib/pg_stat_statements/meson.build        |   35 +
 contrib/pg_surgery/meson.build                |   25 +
 contrib/pg_trgm/meson.build                   |   35 +
 contrib/pg_visibility/meson.build             |   26 +
 contrib/pg_walinspect/meson.build             |   27 +
 contrib/pgcrypto/meson.build                  |  100 +
 contrib/pgrowlocks/meson.build                |   27 +
 contrib/pgstattuple/meson.build               |   31 +
 contrib/postgres_fdw/meson.build              |   34 +
 contrib/seg/meson.build                       |   51 +
 contrib/sepgsql/meson.build                   |   34 +
 contrib/spi/meson.build                       |   50 +
 contrib/sslinfo/meson.build                   |   21 +
 contrib/tablefunc/meson.build                 |   24 +
 contrib/tcn/meson.build                       |   25 +
 contrib/test_decoding/meson.build             |   63 +
 contrib/tsm_system_rows/meson.build           |   24 +
 contrib/tsm_system_time/meson.build           |   24 +
 contrib/unaccent/meson.build                  |   32 +
 contrib/uuid-ossp/meson.build                 |   31 +
 contrib/vacuumlo/meson.build                  |   17 +
 contrib/xml2/meson.build                      |   32 +
 src/interfaces/ecpg/compatlib/meson.build     |   22 +
 src/interfaces/ecpg/ecpglib/meson.build       |   37 +
 src/interfaces/ecpg/ecpglib/po/meson.build    |    1 +
 src/interfaces/ecpg/include/meson.build       |   51 +
 src/interfaces/ecpg/meson.build               |    9 +
 src/interfaces/ecpg/pgtypeslib/meson.build    |   30 +
 src/interfaces/ecpg/preproc/meson.build       |  104 +
 src/interfaces/ecpg/preproc/po/meson.build    |    1 +
 .../ecpg/test/compat_informix/meson.build     |   31 +
 .../ecpg/test/compat_oracle/meson.build       |   20 +
 src/interfaces/ecpg/test/connect/meson.build  |   20 +
 src/interfaces/ecpg/test/meson.build          |   79 +
 .../ecpg/test/pgtypeslib/meson.build          |   21 +
 src/interfaces/ecpg/test/preproc/meson.build  |   37 +
 src/interfaces/ecpg/test/sql/meson.build      |   46 +
 src/interfaces/ecpg/test/thread/meson.build   |   21 +
 src/interfaces/meson.build                    |    2 +
 doc/src/sgml/meson.build                      |  254 ++
 doc/src/sgml/version.sgml.in                  |    2 +
 src/test/authentication/meson.build           |   11 +
 src/test/icu/meson.build                      |   11 +
 src/test/isolation/meson.build                |   58 +
 src/test/kerberos/meson.build                 |   15 +
 src/test/ldap/meson.build                     |   11 +
 src/test/meson.build                          |   25 +
 src/test/modules/brin/meson.build             |   16 +
 src/test/modules/commit_ts/meson.build        |   18 +
 src/test/modules/delay_execution/meson.build  |   18 +
 src/test/modules/dummy_index_am/meson.build   |   23 +
 src/test/modules/dummy_seclabel/meson.build   |   23 +
 src/test/modules/libpq_pipeline/meson.build   |   21 +
 src/test/modules/meson.build                  |   27 +
 src/test/modules/plsample/meson.build         |   23 +
 src/test/modules/snapshot_too_old/meson.build |   14 +
 src/test/modules/spgist_name_ops/meson.build  |   23 +
 .../ssl_passphrase_callback/meson.build       |   48 +
 src/test/modules/test_bloomfilter/meson.build |   23 +
 src/test/modules/test_ddl_deparse/meson.build |   43 +
 src/test/modules/test_extensions/meson.build  |   45 +
 .../modules/test_ginpostinglist/meson.build   |   23 +
 src/test/modules/test_integerset/meson.build  |   23 +
 src/test/modules/test_lfind/meson.build       |   23 +
 src/test/modules/test_misc/meson.build        |   12 +
 src/test/modules/test_oat_hooks/meson.build   |   18 +
 src/test/modules/test_parser/meson.build      |   23 +
 src/test/modules/test_pg_dump/meson.build     |   22 +
 src/test/modules/test_predtest/meson.build    |   23 +
 src/test/modules/test_rbtree/meson.build      |   23 +
 src/test/modules/test_regex/meson.build       |   24 +
 src/test/modules/test_rls_hooks/meson.build   |   17 +
 src/test/modules/test_shm_mq/meson.build      |   27 +
 src/test/modules/unsafe_tests/meson.build     |   11 +
 src/test/modules/worker_spi/meson.build       |   26 +
 src/test/perl/meson.build                     |   12 +
 src/test/recovery/meson.build                 |   43 +
 src/test/regress/meson.build                  |   62 +
 src/test/ssl/meson.build                      |   13 +
 src/test/subscription/meson.build             |   42 +
 configure                                     |    6 +
 configure.ac                                  |    6 +
 meson.build                                   | 3025 +++++++++++++++++
 meson_options.txt                             |  185 +
 src/meson.build                               |   12 +
 src/timezone/meson.build                      |   56 +
 src/timezone/tznames/meson.build              |   21 +
 src/tools/find_meson                          |   30 +
 src/tools/gen_export.pl                       |   81 +
 src/tools/pgflex                              |   85 +
 src/tools/testwrap                            |   47 +
 265 files changed, 10967 insertions(+)
 create mode 100644 src/include/catalog/meson.build
 create mode 100644 src/include/meson.build
 create mode 100644 src/include/nodes/meson.build
 create mode 100644 src/include/pg_config_ext.h.meson
 create mode 100644 src/include/storage/meson.build
 create mode 100644 src/include/utils/meson.build
 create mode 100644 src/common/meson.build
 create mode 100644 src/common/unicode/meson.build
 create mode 100644 src/port/meson.build
 create mode 100644 config/meson.build
 create mode 100644 src/backend/access/brin/meson.build
 create mode 100644 src/backend/access/common/meson.build
 create mode 100644 src/backend/access/gin/meson.build
 create mode 100644 src/backend/access/gist/meson.build
 create mode 100644 src/backend/access/hash/meson.build
 create mode 100644 src/backend/access/heap/meson.build
 create mode 100644 src/backend/access/index/meson.build
 create mode 100644 src/backend/access/meson.build
 create mode 100644 src/backend/access/nbtree/meson.build
 create mode 100644 src/backend/access/rmgrdesc/meson.build
 create mode 100644 src/backend/access/spgist/meson.build
 create mode 100644 src/backend/access/table/meson.build
 create mode 100644 src/backend/access/tablesample/meson.build
 create mode 100644 src/backend/access/transam/meson.build
 create mode 100644 src/backend/backup/meson.build
 create mode 100644 src/backend/bootstrap/meson.build
 create mode 100644 src/backend/catalog/meson.build
 create mode 100644 src/backend/commands/meson.build
 create mode 100644 src/backend/executor/meson.build
 create mode 100644 src/backend/foreign/meson.build
 create mode 100644 src/backend/jit/llvm/meson.build
 create mode 100644 src/backend/jit/meson.build
 create mode 100644 src/backend/lib/meson.build
 create mode 100644 src/backend/libpq/meson.build
 create mode 100644 src/backend/main/meson.build
 create mode 100644 src/backend/meson.build
 create mode 100644 src/backend/nodes/meson.build
 create mode 100644 src/backend/optimizer/geqo/meson.build
 create mode 100644 src/backend/optimizer/meson.build
 create mode 100644 src/backend/optimizer/path/meson.build
 create mode 100644 src/backend/optimizer/plan/meson.build
 create mode 100644 src/backend/optimizer/prep/meson.build
 create mode 100644 src/backend/optimizer/util/meson.build
 create mode 100644 src/backend/parser/meson.build
 create mode 100644 src/backend/partitioning/meson.build
 create mode 100644 src/backend/po/meson.build
 create mode 100644 src/backend/port/meson.build
 create mode 100644 src/backend/port/win32/meson.build
 create mode 100644 src/backend/postmaster/meson.build
 create mode 100644 src/backend/regex/meson.build
 create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
 create mode 100644 src/backend/replication/logical/meson.build
 create mode 100644 src/backend/replication/meson.build
 create mode 100644 src/backend/replication/pgoutput/meson.build
 create mode 100644 src/backend/rewrite/meson.build
 create mode 100644 src/backend/snowball/meson.build
 create mode 100644 src/backend/statistics/meson.build
 create mode 100644 src/backend/storage/buffer/meson.build
 create mode 100644 src/backend/storage/file/meson.build
 create mode 100644 src/backend/storage/freespace/meson.build
 create mode 100644 src/backend/storage/ipc/meson.build
 create mode 100644 src/backend/storage/large_object/meson.build
 create mode 100644 src/backend/storage/lmgr/meson.build
 create mode 100644 src/backend/storage/meson.build
 create mode 100644 src/backend/storage/page/meson.build
 create mode 100644 src/backend/storage/smgr/meson.build
 create mode 100644 src/backend/storage/sync/meson.build
 create mode 100644 src/backend/tcop/meson.build
 create mode 100644 src/backend/tsearch/meson.build
 create mode 100644 src/backend/utils/activity/meson.build
 create mode 100644 src/backend/utils/adt/meson.build
 create mode 100644 src/backend/utils/cache/meson.build
 create mode 100644 src/backend/utils/error/meson.build
 create mode 100644 src/backend/utils/fmgr/meson.build
 create mode 100644 src/backend/utils/hash/meson.build
 create mode 100644 src/backend/utils/init/meson.build
 create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
 create mode 100644 src/backend/utils/mb/meson.build
 create mode 100644 src/backend/utils/meson.build
 create mode 100644 src/backend/utils/misc/meson.build
 create mode 100644 src/backend/utils/mmgr/meson.build
 create mode 100644 src/backend/utils/resowner/meson.build
 create mode 100644 src/backend/utils/sort/meson.build
 create mode 100644 src/backend/utils/time/meson.build
 create mode 100644 src/fe_utils/meson.build
 create mode 100644 src/bin/initdb/meson.build
 create mode 100644 src/bin/initdb/po/meson.build
 create mode 100644 src/bin/meson.build
 create mode 100644 src/bin/pg_amcheck/meson.build
 create mode 100644 src/bin/pg_amcheck/po/meson.build
 create mode 100644 src/bin/pg_archivecleanup/meson.build
 create mode 100644 src/bin/pg_archivecleanup/po/meson.build
 create mode 100644 src/bin/pg_basebackup/meson.build
 create mode 100644 src/bin/pg_basebackup/po/meson.build
 create mode 100644 src/bin/pg_checksums/meson.build
 create mode 100644 src/bin/pg_checksums/po/meson.build
 create mode 100644 src/bin/pg_config/meson.build
 create mode 100644 src/bin/pg_config/po/meson.build
 create mode 100644 src/bin/pg_controldata/meson.build
 create mode 100644 src/bin/pg_controldata/po/meson.build
 create mode 100644 src/bin/pg_ctl/meson.build
 create mode 100644 src/bin/pg_ctl/po/meson.build
 create mode 100644 src/bin/pg_dump/meson.build
 create mode 100644 src/bin/pg_dump/po/meson.build
 create mode 100644 src/bin/pg_resetwal/meson.build
 create mode 100644 src/bin/pg_resetwal/po/meson.build
 create mode 100644 src/bin/pg_rewind/meson.build
 create mode 100644 src/bin/pg_rewind/po/meson.build
 create mode 100644 src/bin/pg_test_fsync/meson.build
 create mode 100644 src/bin/pg_test_fsync/po/meson.build
 create mode 100644 src/bin/pg_test_timing/meson.build
 create mode 100644 src/bin/pg_test_timing/po/meson.build
 create mode 100644 src/bin/pg_upgrade/meson.build
 create mode 100644 src/bin/pg_upgrade/po/meson.build
 create mode 100644 src/bin/pg_verifybackup/meson.build
 create mode 100644 src/bin/pg_verifybackup/po/meson.build
 create mode 100644 src/bin/pg_waldump/meson.build
 create mode 100644 src/bin/pg_waldump/po/meson.build
 create mode 100644 src/bin/pgbench/meson.build
 create mode 100644 src/bin/pgevent/meson.build
 create mode 100644 src/bin/psql/meson.build
 create mode 100644 src/bin/psql/po/meson.build
 create mode 100644 src/bin/scripts/meson.build
 create mode 100644 src/bin/scripts/po/meson.build
 create mode 100644 src/interfaces/libpq/meson.build
 create mode 100644 src/interfaces/libpq/po/meson.build
 create mode 100644 src/interfaces/libpq/test/meson.build
 create mode 100644 src/pl/meson.build
 create mode 100644 src/pl/plperl/meson.build
 create mode 100644 src/pl/plperl/po/meson.build
 create mode 100644 src/pl/plpgsql/meson.build
 create mode 100644 src/pl/plpgsql/src/meson.build
 create mode 100644 src/pl/plpgsql/src/po/meson.build
 create mode 100644 src/pl/plpython/meson.build
 create mode 100644 src/pl/plpython/po/meson.build
 create mode 100644 src/pl/tcl/meson.build
 create mode 100644 src/pl/tcl/po/meson.build
 create mode 100644 contrib/adminpack/meson.build
 create mode 100644 contrib/amcheck/meson.build
 create mode 100644 contrib/auth_delay/meson.build
 create mode 100644 contrib/auto_explain/meson.build
 create mode 100644 contrib/basebackup_to_shell/meson.build
 create mode 100644 contrib/basic_archive/meson.build
 create mode 100644 contrib/bloom/meson.build
 create mode 100644 contrib/bool_plperl/meson.build
 create mode 100644 contrib/btree_gin/meson.build
 create mode 100644 contrib/btree_gist/meson.build
 create mode 100644 contrib/citext/meson.build
 create mode 100644 contrib/cube/meson.build
 create mode 100644 contrib/dblink/meson.build
 create mode 100644 contrib/dict_int/meson.build
 create mode 100644 contrib/dict_xsyn/meson.build
 create mode 100644 contrib/earthdistance/meson.build
 create mode 100644 contrib/file_fdw/meson.build
 create mode 100644 contrib/fuzzystrmatch/meson.build
 create mode 100644 contrib/hstore/meson.build
 create mode 100644 contrib/hstore_plperl/meson.build
 create mode 100644 contrib/hstore_plpython/meson.build
 create mode 100644 contrib/intagg/meson.build
 create mode 100644 contrib/intarray/meson.build
 create mode 100644 contrib/isn/meson.build
 create mode 100644 contrib/jsonb_plperl/meson.build
 create mode 100644 contrib/jsonb_plpython/meson.build
 create mode 100644 contrib/lo/meson.build
 create mode 100644 contrib/ltree/meson.build
 create mode 100644 contrib/ltree_plpython/meson.build
 create mode 100644 contrib/meson.build
 create mode 100644 contrib/oid2name/meson.build
 create mode 100644 contrib/old_snapshot/meson.build
 create mode 100644 contrib/pageinspect/meson.build
 create mode 100644 contrib/passwordcheck/meson.build
 create mode 100644 contrib/pg_buffercache/meson.build
 create mode 100644 contrib/pg_freespacemap/meson.build
 create mode 100644 contrib/pg_prewarm/meson.build
 create mode 100644 contrib/pg_stat_statements/meson.build
 create mode 100644 contrib/pg_surgery/meson.build
 create mode 100644 contrib/pg_trgm/meson.build
 create mode 100644 contrib/pg_visibility/meson.build
 create mode 100644 contrib/pg_walinspect/meson.build
 create mode 100644 contrib/pgcrypto/meson.build
 create mode 100644 contrib/pgrowlocks/meson.build
 create mode 100644 contrib/pgstattuple/meson.build
 create mode 100644 contrib/postgres_fdw/meson.build
 create mode 100644 contrib/seg/meson.build
 create mode 100644 contrib/sepgsql/meson.build
 create mode 100644 contrib/spi/meson.build
 create mode 100644 contrib/sslinfo/meson.build
 create mode 100644 contrib/tablefunc/meson.build
 create mode 100644 contrib/tcn/meson.build
 create mode 100644 contrib/test_decoding/meson.build
 create mode 100644 contrib/tsm_system_rows/meson.build
 create mode 100644 contrib/tsm_system_time/meson.build
 create mode 100644 contrib/unaccent/meson.build
 create mode 100644 contrib/uuid-ossp/meson.build
 create mode 100644 contrib/vacuumlo/meson.build
 create mode 100644 contrib/xml2/meson.build
 create mode 100644 src/interfaces/ecpg/compatlib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/meson.build
 create mode 100644 src/interfaces/ecpg/ecpglib/po/meson.build
 create mode 100644 src/interfaces/ecpg/include/meson.build
 create mode 100644 src/interfaces/ecpg/meson.build
 create mode 100644 src/interfaces/ecpg/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/preproc/po/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_informix/meson.build
 create mode 100644 src/interfaces/ecpg/test/compat_oracle/meson.build
 create mode 100644 src/interfaces/ecpg/test/connect/meson.build
 create mode 100644 src/interfaces/ecpg/test/meson.build
 create mode 100644 src/interfaces/ecpg/test/pgtypeslib/meson.build
 create mode 100644 src/interfaces/ecpg/test/preproc/meson.build
 create mode 100644 src/interfaces/ecpg/test/sql/meson.build
 create mode 100644 src/interfaces/ecpg/test/thread/meson.build
 create mode 100644 src/interfaces/meson.build
 create mode 100644 doc/src/sgml/meson.build
 create mode 100644 doc/src/sgml/version.sgml.in
 create mode 100644 src/test/authentication/meson.build
 create mode 100644 src/test/icu/meson.build
 create mode 100644 src/test/isolation/meson.build
 create mode 100644 src/test/kerberos/meson.build
 create mode 100644 src/test/ldap/meson.build
 create mode 100644 src/test/meson.build
 create mode 100644 src/test/modules/brin/meson.build
 create mode 100644 src/test/modules/commit_ts/meson.build
 create mode 100644 src/test/modules/delay_execution/meson.build
 create mode 100644 src/test/modules/dummy_index_am/meson.build
 create mode 100644 src/test/modules/dummy_seclabel/meson.build
 create mode 100644 src/test/modules/libpq_pipeline/meson.build
 create mode 100644 src/test/modules/meson.build
 create mode 100644 src/test/modules/plsample/meson.build
 create mode 100644 src/test/modules/snapshot_too_old/meson.build
 create mode 100644 src/test/modules/spgist_name_ops/meson.build
 create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
 create mode 100644 src/test/modules/test_bloomfilter/meson.build
 create mode 100644 src/test/modules/test_ddl_deparse/meson.build
 create mode 100644 src/test/modules/test_extensions/meson.build
 create mode 100644 src/test/modules/test_ginpostinglist/meson.build
 create mode 100644 src/test/modules/test_integerset/meson.build
 create mode 100644 src/test/modules/test_lfind/meson.build
 create mode 100644 src/test/modules/test_misc/meson.build
 create mode 100644 src/test/modules/test_oat_hooks/meson.build
 create mode 100644 src/test/modules/test_parser/meson.build
 create mode 100644 src/test/modules/test_pg_dump/meson.build
 create mode 100644 src/test/modules/test_predtest/meson.build
 create mode 100644 src/test/modules/test_rbtree/meson.build
 create mode 100644 src/test/modules/test_regex/meson.build
 create mode 100644 src/test/modules/test_rls_hooks/meson.build
 create mode 100644 src/test/modules/test_shm_mq/meson.build
 create mode 100644 src/test/modules/unsafe_tests/meson.build
 create mode 100644 src/test/modules/worker_spi/meson.build
 create mode 100644 src/test/perl/meson.build
 create mode 100644 src/test/recovery/meson.build
 create mode 100644 src/test/regress/meson.build
 create mode 100644 src/test/ssl/meson.build
 create mode 100644 src/test/subscription/meson.build
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 src/meson.build
 create mode 100644 src/timezone/meson.build
 create mode 100644 src/timezone/tznames/meson.build
 create mode 100755 src/tools/find_meson
 create mode 100644 src/tools/gen_export.pl
 create mode 100755 src/tools/pgflex
 create mode 100755 src/tools/testwrap

diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..45ffa99692e
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,142 @@
+catalog_headers = [
+  'pg_proc.h',
+  'pg_type.h',
+  'pg_attribute.h',
+  'pg_class.h',
+  'pg_attrdef.h',
+  'pg_constraint.h',
+  'pg_inherits.h',
+  'pg_index.h',
+  'pg_operator.h',
+  'pg_opfamily.h',
+  'pg_opclass.h',
+  'pg_am.h',
+  'pg_amop.h',
+  'pg_amproc.h',
+  'pg_language.h',
+  'pg_largeobject_metadata.h',
+  'pg_largeobject.h',
+  'pg_aggregate.h',
+  'pg_statistic.h',
+  'pg_statistic_ext.h',
+  'pg_statistic_ext_data.h',
+  'pg_rewrite.h',
+  'pg_trigger.h',
+  'pg_event_trigger.h',
+  'pg_description.h',
+  'pg_cast.h',
+  'pg_enum.h',
+  'pg_namespace.h',
+  'pg_conversion.h',
+  'pg_depend.h',
+  'pg_database.h',
+  'pg_db_role_setting.h',
+  'pg_tablespace.h',
+  'pg_authid.h',
+  'pg_auth_members.h',
+  'pg_shdepend.h',
+  'pg_shdescription.h',
+  'pg_ts_config.h',
+  'pg_ts_config_map.h',
+  'pg_ts_dict.h',
+  'pg_ts_parser.h',
+  'pg_ts_template.h',
+  'pg_extension.h',
+  'pg_foreign_data_wrapper.h',
+  'pg_foreign_server.h',
+  'pg_user_mapping.h',
+  'pg_foreign_table.h',
+  'pg_policy.h',
+  'pg_replication_origin.h',
+  'pg_default_acl.h',
+  'pg_init_privs.h',
+  'pg_seclabel.h',
+  'pg_shseclabel.h',
+  'pg_collation.h',
+  'pg_parameter_acl.h',
+  'pg_partitioned_table.h',
+  'pg_range.h',
+  'pg_transform.h',
+  'pg_sequence.h',
+  'pg_publication.h',
+  'pg_publication_namespace.h',
+  'pg_publication_rel.h',
+  'pg_subscription.h',
+  'pg_subscription_rel.h',
+]
+
+bki_data = [
+  'pg_aggregate.dat',
+  'pg_am.dat',
+  'pg_amop.dat',
+  'pg_amproc.dat',
+  'pg_authid.dat',
+  'pg_cast.dat',
+  'pg_class.dat',
+  'pg_collation.dat',
+  'pg_conversion.dat',
+  'pg_database.dat',
+  'pg_language.dat',
+  'pg_namespace.dat',
+  'pg_opclass.dat',
+  'pg_operator.dat',
+  'pg_opfamily.dat',
+  'pg_proc.dat',
+  'pg_range.dat',
+  'pg_tablespace.dat',
+  'pg_ts_config.dat',
+  'pg_ts_config_map.dat',
+  'pg_ts_dict.dat',
+  'pg_ts_parser.dat',
+  'pg_ts_template.dat',
+  'pg_type.dat',
+]
+bki_data_f = files(bki_data)
+
+
+input = []
+output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
+output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+
+foreach h : catalog_headers
+  fname = h.split('.h')[0] + '_d.h'
+  input += files(h)
+  output_files += fname
+  output_install += dir_include_server / 'catalog'
+endforeach
+
+generated_catalog_headers = custom_target('generated_catalog_headers',
+  output: output_files,
+  install_dir: output_install,
+  input: input,
+  depend_files: bki_data_f,
+  build_by_default: true,
+  install: true,
+  command: [
+    perl,
+    files('../../backend/catalog/genbki.pl'),
+    '--include-path=@SOURCE_ROOT@/src/include',
+    '--set-version=' + pg_version_major.to_string(),
+    '--output=@OUTDIR@', '@INPUT@'
+  ],
+)
+
+generated_headers += generated_catalog_headers.to_list()
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/catalog': output_files + ['bki-stamp']}
+generated_sources_ac += {'src/include/catalog': ['header-stamp']}
+
+# 'reformat-dat-files' is a convenience target for rewriting the
+# catalog data files in our standard format.  This includes collapsing
+# out any entries that are redundant with a BKI_DEFAULT annotation.
+run_target('reformat-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f],
+)
+
+# 'expand-dat-files' is a convenience target for expanding out all
+# default values in the catalog data files.  This should be run before
+# altering or removing any BKI_DEFAULT annotation.
+run_target('expand-dat-files',
+  command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f, '--full-tuples'],
+)
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..e5390df0584
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,173 @@
+pg_config_ext = configure_file(
+  input: 'pg_config_ext.h.meson',
+  output: 'pg_config_ext.h',
+  configuration: cdata,
+  install: true,
+  install_dir: dir_include,
+)
+configure_files += pg_config_ext
+
+pg_config_os = configure_file(
+  output: 'pg_config_os.h',
+  input: files('port/@0@.h'.format(portname)),
+  install: true,
+  install_dir: dir_include,
+  copy: true,
+)
+configure_files += pg_config_os
+
+pg_config = configure_file(
+  output: 'pg_config.h',
+  install: true,
+  install_dir: dir_include,
+  configuration: cdata,
+)
+configure_files += pg_config
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', dir_prefix / dir_bin)
+config_paths_data.set_quoted('PGSHAREDIR', dir_prefix / dir_data)
+config_paths_data.set_quoted('SYSCONFDIR', dir_prefix / dir_sysconf)
+config_paths_data.set_quoted('INCLUDEDIR', dir_prefix / dir_include)
+config_paths_data.set_quoted('PKGINCLUDEDIR', dir_prefix / dir_include_pkg)
+config_paths_data.set_quoted('INCLUDEDIRSERVER', dir_prefix / dir_include_server)
+config_paths_data.set_quoted('LIBDIR', dir_prefix / dir_lib)
+config_paths_data.set_quoted('PKGLIBDIR', dir_prefix / dir_lib_pkg)
+config_paths_data.set_quoted('LOCALEDIR', dir_prefix / dir_locale)
+config_paths_data.set_quoted('DOCDIR', dir_prefix / dir_doc)
+config_paths_data.set_quoted('HTMLDIR', dir_prefix / dir_doc_html)
+config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
+
+
+var_cc = ' '.join(cc.cmd_array())
+var_cpp = ' '.join(cc.cmd_array() + ['-E'])
+var_cflags = ' '.join(cflags + cflags_warn)
+var_cxxflags = ' '.join(cxxflags + cxxflags_warn)
+var_cppflags = ' '.join(cppflags)
+var_cflags_sl = '-fPIC' #FIXME
+var_ldflags = ' '.join(ldflags)
+var_ldflags_sl = ''.join(ldflags_sl)
+var_ldflags_ex = '' # FIXME
+# FIXME - some extensions might directly use symbols from one of libs. If
+# that symbol isn't used by postgres, and statically linked, it'll cause an
+# undefined symbol at runtime. And obviously it'll cause problems for
+# executables, although those are probably less common.
+var_libs = ''
+
+
+pg_config_paths = configure_file(
+  output: 'pg_config_paths.h',
+  configuration: config_paths_data,
+  install: false,
+)
+configure_files += pg_config_paths
+
+install_headers(
+  'pg_config_manual.h',
+  'postgres_ext.h',
+)
+
+install_headers(
+  'libpq/libpq-fs.h',
+  install_dir: dir_include / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'port.h',
+  'postgres_fe.h',
+  install_dir: dir_include_internal
+)
+
+install_headers(
+  'libpq/pqcomm.h',
+  install_dir: dir_include_internal / 'libpq',
+)
+
+install_headers(
+  'c.h',
+  'fmgr.h',
+  'funcapi.h',
+  'getopt_long.h',
+  'miscadmin.h',
+  'pg_config_manual.h',
+  'pg_getopt.h',
+  'pg_trace.h',
+  'pgstat.h',
+  'pgtar.h',
+  'pgtime.h',
+  'port.h',
+  'postgres.h',
+  'postgres_ext.h',
+  'postgres_fe.h',
+  'windowapi.h',
+  pg_config_ext,
+  pg_config_os,
+  pg_config,
+  install_dir: dir_include_server,
+)
+
+subdir('catalog')
+subdir('nodes')
+subdir('storage')
+subdir('utils')
+
+header_subdirs = [
+  'access',
+  'catalog',
+  'bootstrap',
+  'commands',
+  'common',
+  'datatype',
+  'executor',
+  'fe_utils',
+  'foreign',
+  'jit',
+  'lib',
+  'libpq',
+  'mb',
+  'nodes',
+  'optimizer',
+  'parser',
+  'partitioning',
+  'postmaster',
+  'regex',
+  'replication',
+  'rewrite',
+  'statistics',
+  'storage',
+  'tcop',
+  'snowball',
+  'tsearch',
+  'utils',
+  'port',
+  'portability',
+]
+
+# XXX: installing headers this way has the danger of installing editor files
+# etc, unfortunately install_subdir() doesn't allow including / excluding by
+# pattern currently.
+foreach d : header_subdirs
+  if d == 'catalog'
+    continue
+  endif
+  install_subdir(d, install_dir: dir_include_server,
+                 exclude_files: ['.gitignore', 'meson.build'])
+endforeach
+
+install_subdir('catalog',
+  install_dir: dir_include_server,
+  exclude_files: [
+    '.gitignore',
+    'Makefile',
+    'duplicate_oids',
+    'meson.build',
+    'reformat_dat_file.pl',
+    'renumber_oids.pl',
+    'unused_oids',
+  ] + bki_data,
+)
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/include': ['stamp-h', 'stamp-ext-h']}
diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build
new file mode 100644
index 00000000000..b7df232081f
--- /dev/null
+++ b/src/include/nodes/meson.build
@@ -0,0 +1,58 @@
+node_support_input_i = [
+  'nodes/nodes.h',
+  'nodes/primnodes.h',
+  'nodes/parsenodes.h',
+  'nodes/pathnodes.h',
+  'nodes/plannodes.h',
+  'nodes/execnodes.h',
+  'access/amapi.h',
+  'access/sdir.h',
+  'access/tableam.h',
+  'access/tsmapi.h',
+  'commands/event_trigger.h',
+  'commands/trigger.h',
+  'executor/tuptable.h',
+  'foreign/fdwapi.h',
+  'nodes/extensible.h',
+  'nodes/lockoptions.h',
+  'nodes/replnodes.h',
+  'nodes/supportnodes.h',
+  'nodes/value.h',
+  'utils/rel.h',
+]
+
+node_support_input = []
+foreach i : node_support_input_i
+  node_support_input += meson.source_root() / 'src' / 'include' / i
+endforeach
+
+node_support_output = [
+  'nodetags.h',
+  'outfuncs.funcs.c', 'outfuncs.switch.c',
+  'readfuncs.funcs.c', 'readfuncs.switch.c',
+  'copyfuncs.funcs.c', 'copyfuncs.switch.c',
+  'equalfuncs.funcs.c', 'equalfuncs.switch.c',
+]
+node_support_install = [
+  dir_include_server / 'nodes',
+  false, false,
+  false, false,
+  false, false,
+  false, false,
+]
+
+generated_nodes = custom_target('nodetags.h',
+  input: node_support_input,
+  output: node_support_output,
+  command: [
+    perl, files('../../backend/nodes/gen_node_support.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'],
+  install: true,
+  install_dir: node_support_install,
+)
+generated_headers += generated_nodes[0]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/nodes': node_support_output + ['node-support-stamp']}
+generated_sources_ac += {'src/include/nodes': ['header-stamp']}
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in.  This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..eae9f98920e
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,19 @@
+lwlocknames = custom_target('lwlocknames',
+  input: files('../../backend/storage/lmgr/lwlocknames.txt'),
+  output: ['lwlocknames.h', 'lwlocknames.c'],
+  command: [
+    perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'),
+    '-o', '@OUTDIR@',
+    '@INPUT@'
+  ],
+  build_by_default: true,
+  install: true,
+  install_dir: [dir_include_server / 'storage', false],
+)
+
+lwlocknames_h = lwlocknames[0]
+
+generated_backend_headers += lwlocknames_h
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.c', 'lwlocknames.h']}
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..bded105f7ea
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,57 @@
+errcodes = custom_target('errcodes',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: ['errcodes.h'],
+  command: [
+    perl, files('../../backend/utils/generate-errcodes.pl'),
+    '--outfile', '@OUTPUT@',
+    '@INPUT@',
+  ],
+  install: true,
+  install_dir: dir_include_server / 'utils',
+)
+generated_headers += errcodes
+
+if dtrace.found()
+  probes_tmp = custom_target('probes.h.tmp',
+    input: files('../../backend/utils/probes.d'),
+    output: 'probes.h.tmp',
+    command: [dtrace, '-C', '-h', '-s', '@INPUT@', '-o', '@OUTPUT@'],
+  )
+  probes = custom_target('probes.h',
+    input: probes_tmp,
+    output: 'probes.h',
+    capture: true,
+    command: [sed, '-f', files('../../backend/utils/postprocess_dtrace.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server / 'utils',
+  )
+else
+  probes = custom_target('probes.h',
+    input: files('../../backend/utils/probes.d'),
+    output: 'probes.h',
+    capture: true,
+    command: [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+    install: true,
+    install_dir: dir_include_server / 'utils',
+  )
+endif
+
+generated_backend_headers += probes
+
+fmgrtab_output = ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c']
+fmgrtab_target = custom_target('fmgrtab',
+  input: '../catalog/pg_proc.dat',
+  output : fmgrtab_output,
+  command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'],
+  install: true,
+  install_dir: [dir_include_server / 'utils', dir_include_server / 'utils', false],
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {
+  'src/backend/utils': fmgrtab_output + ['errcodes.h', 'probes.h', 'fmgr-stamp'],
+  'src/include/utils': ['header-stamp'],
+}
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..23842e1ffef
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,174 @@
+common_sources = files(
+  'archive.c',
+  'base64.c',
+  'checksum_helper.c',
+  'compression.c',
+  'controldata_utils.c',
+  'encnames.c',
+  'exec.c',
+  'file_perm.c',
+  'file_utils.c',
+  'hashfn.c',
+  'ip.c',
+  'jsonapi.c',
+  'keywords.c',
+  'kwlookup.c',
+  'link-canary.c',
+  'md5_common.c',
+  'pg_get_line.c',
+  'pg_lzcompress.c',
+  'pg_prng.c',
+  'pgfnames.c',
+  'psprintf.c',
+  'relpath.c',
+  'rmtree.c',
+  'saslprep.c',
+  'scram-common.c',
+  'string.c',
+  'stringinfo.c',
+  'unicode_norm.c',
+  'username.c',
+  'wait_error.c',
+  'wchar.c',
+)
+
+if ssl.found()
+  common_sources += files(
+    'cryptohash_openssl.c',
+    'hmac_openssl.c',
+    'protocol_openssl.c',
+  )
+else
+  common_sources += files(
+    'cryptohash.c',
+    'hmac.c',
+    'md5.c',
+    'sha1.c',
+    'sha2.c',
+  )
+endif
+
+common_kwlist = custom_target('kwlist',
+  input: files('../include/parser/kwlist.h'),
+  output: 'kwlist_d.h',
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+      '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+generated_sources += common_kwlist
+common_sources += common_kwlist
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+  'd2s.c',
+  'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+  ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+config_info_sources = files('config_info.c',)
+config_info_cflags = [
+  '-DVAL_CC="@0@"'.format(var_cc),
+  '-DVAL_CPPFLAGS="@0@"'.format(var_cppflags),
+  '-DVAL_CFLAGS="@0@"'.format(var_cflags),
+  '-DVAL_CFLAGS_SL="@0@"'.format(var_cflags_sl),
+  '-DVAL_LDFLAGS="@0@"'.format(var_ldflags),
+  '-DVAL_LDFLAGS_EX="@0@"'.format(var_ldflags_ex),
+  '-DVAL_LDFLAGS_SL="@0@"'.format(var_ldflags_sl),
+  '-DVAL_LIBS="@0@"'.format(var_libs),
+]
+
+# Some files need to be built with different cflags. The different sets are
+# defined here.
+common_cflags = {
+  'ryu': ryu_cflags,
+  'config_info': config_info_cflags,
+}
+common_sources_cflags = {
+  'ryu': ryu_sources,
+  'config_info': config_info_sources
+}
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too).  logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+  'fe_memutils.c',
+  'restricted_token.c',
+  'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+  'logging.c',
+)
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+#
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+#
+# For the server build of pgcommon, depend on lwlocknames_h, because at least
+# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a
+# layering violation, but ...
+pgcommon = {}
+pgcommon_variants = {
+  '_srv': internal_lib_args + {
+    'sources': common_sources + [lwlocknames_h],
+    'dependencies': [backend_common_code],
+  },
+  '': default_lib_args + {
+    'sources': common_sources_frontend_static,
+    'dependencies': [frontend_common_code],
+  },
+  '_shlib': default_lib_args + {
+    'pic': true,
+    'sources': common_sources_frontend_shlib,
+    'dependencies': [frontend_common_code],
+  },
+}
+
+foreach name, opts : pgcommon_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources : common_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + common_cflags[cflagname]
+    cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'sources': sources,
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgcommon@0@'.format(name),
+      link_with: cflag_libs,
+      include_directories: include_directories('.'),
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgcommon += {name: lib}
+endforeach
+
+common_srv = pgcommon['_srv']
+common_shlib = pgcommon['_shlib']
+common_static = pgcommon['']
+
+subdir('unicode')
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
new file mode 100644
index 00000000000..13965d59f49
--- /dev/null
+++ b/src/common/unicode/meson.build
@@ -0,0 +1,106 @@
+UNICODE_VERSION = '15.0.0'
+
+unicode_data = {}
+unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
+
+if not wget.found()
+  subdir_done()
+endif
+
+# These files are part of the Unicode Character Database. Download them on
+# demand.
+foreach f : ['UnicodeData.txt', 'EastAsianWidth.txt', 'DerivedNormalizationProps.txt', 'CompositionExclusions.txt', 'NormalizationTest.txt']
+  url = unicode_baseurl.format(UNICODE_VERSION, f)
+  target = custom_target(f,
+    output: f,
+    command: [wget, wget_flags, url],
+    build_by_default: false,
+  )
+  unicode_data += {f: target}
+endforeach
+
+
+update_unicode_targets = []
+
+update_unicode_targets += \
+  custom_target('unicode_norm_table.h',
+    input: [unicode_data['UnicodeData.txt'], unicode_data['CompositionExclusions.txt']],
+    output: ['unicode_norm_table.h', 'unicode_norm_hashfunc.h'],
+    command: [
+      perl, files('generate-unicode_norm_table.pl'),
+      '--outdir', '@OUTDIR@', '@INPUT@'],
+    build_by_default: false,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_nonspacing_table.h',
+    input: [unicode_data['UnicodeData.txt']],
+    output: ['unicode_nonspacing_table.h'],
+    command: [perl, files('generate-unicode_nonspacing_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_east_asian_fw_table.h',
+    input: [unicode_data['EastAsianWidth.txt']],
+    output: ['unicode_east_asian_fw_table.h'],
+    command: [perl, files('generate-unicode_east_asian_fw_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+update_unicode_targets += \
+  custom_target('unicode_normprops_table.h',
+    input: [unicode_data['DerivedNormalizationProps.txt']],
+    output: ['unicode_normprops_table.h'],
+    command: [perl, files('generate-unicode_normprops_table.pl'), '@INPUT@'],
+    build_by_default: false,
+    capture: true,
+  )
+
+norm_test_table = custom_target('norm_test_table.h',
+    input: [unicode_data['NormalizationTest.txt']],
+    output: ['norm_test_table.h'],
+    command: [perl, files('generate-norm_test_table.pl'), '@INPUT@', '@OUTPUT@'],
+    build_by_default: false,
+  )
+
+inc = include_directories('.')
+
+norm_test = executable('norm_test',
+  ['norm_test.c', norm_test_table],
+  dependencies: [frontend_port_code],
+  include_directories: inc,
+  link_with: [common_static, pgport_static],
+  build_by_default: false,
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+update_unicode_dep = []
+
+if not meson.is_cross_build()
+  update_unicode_dep += custom_target('norm_test.run',
+    output: 'norm_test.run',
+    input: update_unicode_targets,
+    command: [norm_test],
+    build_by_default: false,
+    build_always_stale: true,
+  )
+endif
+
+
+# Use a custom target, as run targets serialize the output, making this harder
+# to debug, and don't deal well with targets with multiple outputs.
+update_unicode = custom_target('update-unicode',
+  depends: update_unicode_dep,
+  output: ['dont-exist'],
+  input: update_unicode_targets,
+  command: ['cp', '@INPUT@', '@SOURCE_ROOT@/src/include/common/'],
+  build_by_default: false,
+  build_always_stale: true,
+)
+
+alias_target('update-unicode', update_unicode)
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..ced2e014db8
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,184 @@
+pgport_sources = [
+  'bsearch_arg.c',
+  'chklocale.c',
+  'inet_net_ntop.c',
+  'noblock.c',
+  'path.c',
+  'pg_bitutils.c',
+  'pg_strong_random.c',
+  'pgcheckdir.c',
+  'pgmkdirp.c',
+  'pgsleep.c',
+  'pgstrcasecmp.c',
+  'pgstrsignal.c',
+  'pqsignal.c',
+  'qsort.c',
+  'qsort_arg.c',
+  'quotes.c',
+  'snprintf.c',
+  'strerror.c',
+  'tar.c',
+  'thread.c',
+]
+
+if host_system == 'windows'
+  pgport_sources += files(
+    'dirmod.c',
+    'kill.c',
+    'open.c',
+    'system.c',
+    'win32dlopen.c',
+    'win32env.c',
+    'win32error.c',
+    'win32fdatasync.c',
+    'win32getrusage.c',
+    'win32link.c',
+    'win32ntdll.c',
+    'win32pread.c',
+    'win32pwrite.c',
+    'win32security.c',
+    'win32setlocale.c',
+    'win32stat.c',
+  )
+endif
+
+if cc.get_id() == 'msvc'
+  pgport_sources += files(
+    'dirent.c',
+    'win32gettimeofday.c',
+  )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+  ['explicit_bzero'],
+  ['getopt'],
+  ['getopt_long'],
+  ['getpeereid'],
+  ['inet_aton'],
+  ['mkdtemp'],
+  ['preadv', 'HAVE_DECL_PREADV'],
+  ['pwritev', 'HAVE_DECL_PWRITEV'],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+]
+
+if host_system != 'windows'
+  replace_funcs_neg += [['pthread_barrier_wait']]
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+  # x86/x64
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+  ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # arm / aarch64
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+  ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+  ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+  ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+
+  # generic fallback
+  ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
+]
+
+pgport_cflags = {'crc': cflags_crc}
+pgport_sources_cflags = {'crc': []}
+
+foreach f : replace_funcs_neg
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'false' or val == '0'
+    pgport_sources += files(filename)
+  endif
+endforeach
+
+foreach f : replace_funcs_pos
+  func = f.get(0)
+  varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+  filename = '@0@.c'.format(func)
+
+  val = '@0@'.format(cdata.get(varname, 'false'))
+  if val == 'true' or val == '1'
+    src = files(filename)
+    if f.length() > 2
+      pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
+    else
+      pgport_sources += src
+    endif
+  endif
+endforeach
+
+
+if (host_system == 'windows' or host_system == 'cygwin') and \
+  (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+  # Cygwin and (apparently, based on test results) Mingw both
+  # have a broken strtof(), so substitute its implementation.
+  # That's not a perfect fix, since it doesn't avoid double-rounding,
+  # but we have no better options.
+  pgport_sources += files('strtof.c')
+  message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+    host_system, cc.get_id(), cc.version()))
+endif
+
+
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+pgport = {}
+pgport_variants = {
+  '_srv': internal_lib_args + {
+    'dependencies': [backend_port_code],
+  },
+  '': default_lib_args + {
+    'dependencies': [frontend_port_code],
+  },
+  '_shlib': default_lib_args + {
+    'pic': true,
+    'dependencies': [frontend_port_code],
+  },
+}
+
+foreach name, opts : pgport_variants
+
+  # Build internal static libraries for sets of files that need to be built
+  # with different cflags
+  cflag_libs = []
+  foreach cflagname, sources : pgport_sources_cflags
+    if sources.length() == 0
+      continue
+    endif
+    c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
+    cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
+      sources,
+      kwargs: opts + {
+        'c_args': c_args,
+        'build_by_default': false,
+        'install': false,
+      },
+    )
+  endforeach
+
+  lib = static_library('libpgport@0@'.format(name),
+      pgport_sources,
+      link_with: cflag_libs,
+      kwargs: opts + {
+        'dependencies': opts['dependencies'] + [ssl],
+      }
+    )
+  pgport += {name: lib}
+endforeach
+
+pgport_srv = pgport['_srv']
+pgport_static = pgport['']
+pgport_shlib = pgport['_shlib']
diff --git a/config/meson.build b/config/meson.build
new file mode 100644
index 00000000000..ab19c380bd2
--- /dev/null
+++ b/config/meson.build
@@ -0,0 +1,4 @@
+install_data(
+  'install-sh', 'missing',
+  install_dir: dir_pgxs / 'config'
+)
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'brin.c',
+  'brin_bloom.c',
+  'brin_inclusion.c',
+  'brin_minmax.c',
+  'brin_minmax_multi.c',
+  'brin_pageops.c',
+  'brin_revmap.c',
+  'brin_tuple.c',
+  'brin_validate.c',
+  'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'attmap.c',
+  'bufmask.c',
+  'detoast.c',
+  'heaptuple.c',
+  'indextuple.c',
+  'printsimple.c',
+  'printtup.c',
+  'relation.c',
+  'reloptions.c',
+  'scankey.c',
+  'session.c',
+  'syncscan.c',
+  'toast_compression.c',
+  'toast_internals.c',
+  'tupconvert.c',
+  'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'ginarrayproc.c',
+  'ginbtree.c',
+  'ginbulk.c',
+  'gindatapage.c',
+  'ginentrypage.c',
+  'ginfast.c',
+  'ginget.c',
+  'gininsert.c',
+  'ginlogic.c',
+  'ginpostinglist.c',
+  'ginscan.c',
+  'ginutil.c',
+  'ginvacuum.c',
+  'ginvalidate.c',
+  'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'gist.c',
+  'gistbuild.c',
+  'gistbuildbuffers.c',
+  'gistget.c',
+  'gistproc.c',
+  'gistscan.c',
+  'gistsplit.c',
+  'gistutil.c',
+  'gistvacuum.c',
+  'gistvalidate.c',
+  'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'hash.c',
+  'hash_xlog.c',
+  'hashfunc.c',
+  'hashinsert.c',
+  'hashovfl.c',
+  'hashpage.c',
+  'hashsearch.c',
+  'hashsort.c',
+  'hashutil.c',
+  'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'heapam.c',
+  'heapam_handler.c',
+  'heapam_visibility.c',
+  'heaptoast.c',
+  'hio.c',
+  'pruneheap.c',
+  'rewriteheap.c',
+  'vacuumlazy.c',
+  'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'amapi.c',
+  'amvalidate.c',
+  'genam.c',
+  'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'nbtcompare.c',
+  'nbtdedup.c',
+  'nbtinsert.c',
+  'nbtpage.c',
+  'nbtree.c',
+  'nbtsearch.c',
+  'nbtsort.c',
+  'nbtsplitloc.c',
+  'nbtutils.c',
+  'nbtvalidate.c',
+  'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+  'brindesc.c',
+  'clogdesc.c',
+  'committsdesc.c',
+  'dbasedesc.c',
+  'genericdesc.c',
+  'gindesc.c',
+  'gistdesc.c',
+  'hashdesc.c',
+  'heapdesc.c',
+  'logicalmsgdesc.c',
+  'mxactdesc.c',
+  'nbtdesc.c',
+  'relmapdesc.c',
+  'replorigindesc.c',
+  'seqdesc.c',
+  'smgrdesc.c',
+  'spgdesc.c',
+  'standbydesc.c',
+  'tblspcdesc.c',
+  'xactdesc.c',
+  'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'spgdoinsert.c',
+  'spginsert.c',
+  'spgkdtreeproc.c',
+  'spgproc.c',
+  'spgquadtreeproc.c',
+  'spgscan.c',
+  'spgtextproc.c',
+  'spgutils.c',
+  'spgvacuum.c',
+  'spgvalidate.c',
+  'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'table.c',
+  'tableam.c',
+  'tableamapi.c',
+  'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bernoulli.c',
+  'system.c',
+  'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..c32169bd2c6
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'clog.c',
+  'commit_ts.c',
+  'generic_xlog.c',
+  'multixact.c',
+  'parallel.c',
+  'rmgr.c',
+  'slru.c',
+  'subtrans.c',
+  'timeline.c',
+  'transam.c',
+  'twophase.c',
+  'twophase_rmgr.c',
+  'varsup.c',
+  'xact.c',
+  'xlog.c',
+  'xlogarchive.c',
+  'xlogfuncs.c',
+  'xloginsert.c',
+  'xlogprefetcher.c',
+  'xlogrecovery.c',
+  'xlogstats.c',
+  'xlogutils.c',
+)
+
+# used by frontend programs to build a frontend xlogreader
+xlogreader_sources = files(
+  'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/backup/meson.build b/src/backend/backup/meson.build
new file mode 100644
index 00000000000..a09305cadfa
--- /dev/null
+++ b/src/backend/backup/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'backup_manifest.c',
+  'basebackup.c',
+  'basebackup_copy.c',
+  'basebackup_gzip.c',
+  'basebackup_lz4.c',
+  'basebackup_progress.c',
+  'basebackup_server.c',
+  'basebackup_sink.c',
+  'basebackup_target.c',
+  'basebackup_throttle.c',
+  'basebackup_zstd.c',
+)
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..55c33dd21c3
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,28 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+# see ../parser/meson.build
+boot_parser_sources = []
+
+bootscanner = custom_target('bootscanner',
+  input: 'bootscanner.l',
+  output: 'bootscanner.c',
+  command: flex_cmd,
+)
+generated_sources += bootscanner
+boot_parser_sources += bootscanner
+
+bootparse = custom_target('bootparse',
+  input: 'bootparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += bootparse.to_list()
+boot_parser_sources += bootparse
+
+boot_parser = static_library('boot_parser',
+  boot_parser_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += boot_parser
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..08747914516
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,44 @@
+backend_sources += files(
+  'aclchk.c',
+  'catalog.c',
+  'dependency.c',
+  'heap.c',
+  'index.c',
+  'indexing.c',
+  'namespace.c',
+  'objectaccess.c',
+  'objectaddress.c',
+  'partition.c',
+  'pg_aggregate.c',
+  'pg_attrdef.c',
+  'pg_cast.c',
+  'pg_class.c',
+  'pg_collation.c',
+  'pg_constraint.c',
+  'pg_conversion.c',
+  'pg_db_role_setting.c',
+  'pg_depend.c',
+  'pg_enum.c',
+  'pg_inherits.c',
+  'pg_largeobject.c',
+  'pg_namespace.c',
+  'pg_operator.c',
+  'pg_parameter_acl.c',
+  'pg_proc.c',
+  'pg_publication.c',
+  'pg_range.c',
+  'pg_shdepend.c',
+  'pg_subscription.c',
+  'pg_type.c',
+  'storage.c',
+  'toasting.c',
+)
+
+
+install_data(
+  'information_schema.sql',
+  'sql_features.txt',
+  'system_functions.sql',
+  'system_views.sql',
+  install_dir: dir_data,
+)
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..9b350d025ff
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'aggregatecmds.c',
+  'alter.c',
+  'amcmds.c',
+  'analyze.c',
+  'async.c',
+  'cluster.c',
+  'collationcmds.c',
+  'comment.c',
+  'constraint.c',
+  'conversioncmds.c',
+  'copy.c',
+  'copyfrom.c',
+  'copyfromparse.c',
+  'copyto.c',
+  'createas.c',
+  'dbcommands.c',
+  'define.c',
+  'discard.c',
+  'dropcmds.c',
+  'event_trigger.c',
+  'explain.c',
+  'extension.c',
+  'foreigncmds.c',
+  'functioncmds.c',
+  'indexcmds.c',
+  'lockcmds.c',
+  'matview.c',
+  'opclasscmds.c',
+  'operatorcmds.c',
+  'policy.c',
+  'portalcmds.c',
+  'prepare.c',
+  'proclang.c',
+  'publicationcmds.c',
+  'schemacmds.c',
+  'seclabel.c',
+  'sequence.c',
+  'statscmds.c',
+  'subscriptioncmds.c',
+  'tablecmds.c',
+  'tablespace.c',
+  'trigger.c',
+  'tsearchcmds.c',
+  'typecmds.c',
+  'user.c',
+  'vacuum.c',
+  'vacuumparallel.c',
+  'variable.c',
+  'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+  'execAmi.c',
+  'execAsync.c',
+  'execCurrent.c',
+  'execExpr.c',
+  'execExprInterp.c',
+  'execGrouping.c',
+  'execIndexing.c',
+  'execJunk.c',
+  'execMain.c',
+  'execParallel.c',
+  'execPartition.c',
+  'execProcnode.c',
+  'execReplication.c',
+  'execSRF.c',
+  'execScan.c',
+  'execTuples.c',
+  'execUtils.c',
+  'functions.c',
+  'instrument.c',
+  'nodeAgg.c',
+  'nodeAppend.c',
+  'nodeBitmapAnd.c',
+  'nodeBitmapHeapscan.c',
+  'nodeBitmapIndexscan.c',
+  'nodeBitmapOr.c',
+  'nodeCtescan.c',
+  'nodeCustom.c',
+  'nodeForeignscan.c',
+  'nodeFunctionscan.c',
+  'nodeGather.c',
+  'nodeGatherMerge.c',
+  'nodeGroup.c',
+  'nodeHash.c',
+  'nodeHashjoin.c',
+  'nodeIncrementalSort.c',
+  'nodeIndexonlyscan.c',
+  'nodeIndexscan.c',
+  'nodeLimit.c',
+  'nodeLockRows.c',
+  'nodeMaterial.c',
+  'nodeMemoize.c',
+  'nodeMergeAppend.c',
+  'nodeMergejoin.c',
+  'nodeModifyTable.c',
+  'nodeNamedtuplestorescan.c',
+  'nodeNestloop.c',
+  'nodeProjectSet.c',
+  'nodeRecursiveunion.c',
+  'nodeResult.c',
+  'nodeSamplescan.c',
+  'nodeSeqscan.c',
+  'nodeSetOp.c',
+  'nodeSort.c',
+  'nodeSubplan.c',
+  'nodeSubqueryscan.c',
+  'nodeTableFuncscan.c',
+  'nodeTidrangescan.c',
+  'nodeTidscan.c',
+  'nodeUnique.c',
+  'nodeValuesscan.c',
+  'nodeWindowAgg.c',
+  'nodeWorktablescan.c',
+  'spi.c',
+  'tqueue.c',
+  'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..de2e624ab58
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,73 @@
+if not llvm.found()
+  subdir_done()
+endif
+
+# Build LLVM JIT backend module
+
+llvmjit_sources = []
+
+# Infrastructure
+llvmjit_sources += files(
+  'llvmjit.c',
+  'llvmjit_error.cpp',
+  'llvmjit_inline.cpp',
+  'llvmjit_wrap.cpp',
+)
+
+# Code generation
+llvmjit_sources += files(
+  'llvmjit_deform.c',
+  'llvmjit_expr.c',
+)
+
+llvmjit = shared_module('llvmjit',
+  llvmjit_sources,
+  kwargs: pg_mod_args + {
+    'dependencies': pg_mod_args['dependencies'] + [llvm],
+  }
+)
+
+backend_targets += llvmjit
+
+
+# Define a few bits and pieces used here and elsewhere to generate bitcode
+
+llvm_irgen_args = [
+  '-c', '-o', '@OUTPUT@', '@INPUT@',
+  '-flto=thin', '-emit-llvm',
+  '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+  '-O2',
+  '-Wno-ignored-attributes',
+  '-Wno-empty-body',
+]
+
+if ccache.found()
+  llvm_irgen_command = ccache
+  llvm_irgen_args = [clang.path()] + llvm_irgen_args
+else
+  llvm_irgen_command = clang
+endif
+
+
+# XXX: Need to determine proper version of the function cflags for clang
+bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
+bitcode_cflags += cppflags
+
+# XXX: Worth improving on the logic to find directories here
+bitcode_cflags += '-I@BUILD_ROOT@/src/include'
+bitcode_cflags += '-I@BUILD_ROOT@/src/backend/utils/misc'
+bitcode_cflags += '-I@SOURCE_ROOT@/src/include'
+
+
+# Note this is intentionally not installed to bitcodedir, as it's not for
+# inlining
+llvmjit_types = custom_target('llvmjit_types.bc',
+  command: [llvm_irgen_command] + llvm_irgen_args + bitcode_cflags,
+  input: 'llvmjit_types.c',
+  output: 'llvmjit_types.bc',
+  depends: [postgres],
+  install: true,
+  install_dir: dir_lib_pkg,
+  depfile: '@BASENAME@.c.bc.d',
+)
+backend_targets += llvmjit_types
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..48da1bddce7
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+  'binaryheap.c',
+  'bipartite_match.c',
+  'bloomfilter.c',
+  'dshash.c',
+  'hyperloglog.c',
+  'ilist.c',
+  'integerset.c',
+  'knapsack.c',
+  'pairingheap.c',
+  'rbtree.c',
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..6061269ef13
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,32 @@
+backend_sources += files(
+  'auth-sasl.c',
+  'auth-scram.c',
+  'auth.c',
+  'be-fsstubs.c',
+  'be-secure-common.c',
+  'be-secure.c',
+  'crypt.c',
+  'hba.c',
+  'ifaddr.c',
+  'pqcomm.c',
+  'pqformat.c',
+  'pqmq.c',
+  'pqsignal.c',
+)
+
+if ssl.found()
+  backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+  backend_sources += files(
+    'be-secure-gssapi.c',
+    'be-gssapi-common.c'
+  )
+endif
+
+install_data(
+  'pg_hba.conf.sample',
+  'pg_ident.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..fefa40ddb64
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,190 @@
+backend_build_deps = [backend_code]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('backup')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+subdir('po', if_found: libintl)
+
+
+backend_link_args = []
+backend_link_depends = []
+
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+# For dtrace probes we need to invoke dtrace on all input files, before
+# linking the final executable (see more below).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+# We could do that only if either dtrace or msvc is in use, but it seems
+# easier to just always do so.
+#
+# Can't name the static library 'postgres', because msbuild ends up with a
+# conflict for the .pdb file otherwise.
+
+postgres_lib = static_library('postgres_lib',
+  backend_sources + timezone_sources + generated_backend_sources,
+  link_whole: backend_link_with,
+  dependencies: backend_build_deps,
+  kwargs: internal_lib_args,
+)
+
+if cc.get_id() == 'msvc'
+  postgres_def = custom_target('postgres.def',
+    command: [perl, files('../tools/msvc/gendef.pl'),
+              '--arch', host_cpu,
+              '--tempdir', '@PRIVATE_DIR@',
+              '--deffile', '@OUTPUT@',
+              '@INPUT@'],
+    input: [postgres_lib, common_srv, pgport_srv],
+    output: 'postgres.def',
+    depends: [postgres_lib, common_srv, pgport_srv],
+    install: false,
+    build_by_default: false,
+  )
+
+  backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+  backend_link_depends += postgres_def
+
+elif host_system == 'aix'
+  # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
+  # main executable, allowing extension libraries to resolve their undefined
+  # symbols to symbols in the postgres binary.
+  postgres_imp = custom_target('postgres.imp',
+    command: [files('port/aix/mkldexport.sh'), '@INPUT@', '.'],
+    input: postgres_lib,
+    output: 'postgres.imp',
+    capture: true,
+    install: true,
+    install_dir: dir_lib,
+    build_by_default: false,
+  )
+  backend_link_args += '-Wl,-bE:@0@'.format(postgres_imp.full_path())
+  backend_link_depends += postgres_imp
+endif
+
+backend_input = []
+backend_objs = [postgres_lib.extract_all_objects(recursive: false)]
+
+# As of 1/2010:
+# The probes.o file is necessary for dtrace support on Solaris, and on recent
+# versions of systemtap.  (Older systemtap releases just produce an empty
+# file, but that's okay.)  However, macOS's dtrace doesn't use it and doesn't
+# even recognize the -G option.  So, build probes.o except on macOS.
+# This might need adjustment as other platforms add dtrace support.
+#
+# On at least linux we don't actually need to pass in all the objects, but
+# at least on FreeBSD and Solaris we have to.
+#
+# XXX: The reason we don't use the objects for generated sources is that
+# hits a meson bug. Luckily we don't don't have probes in generated
+# sources...
+if dtrace.found() and host_system != 'darwin'
+  backend_input += custom_target(
+    'probes.o',
+    input: ['utils/probes.d', postgres_lib.extract_objects(backend_sources, timezone_sources)],
+    output: 'probes.o',
+    command: [dtrace, '-C', '-G', '-o', '@OUTPUT@', '-s', '@INPUT@'],
+    install: false,
+  )
+endif
+
+postgres = executable('postgres',
+  backend_input,
+  objects: backend_objs,
+  link_args: backend_link_args,
+  link_with: backend_link_with,
+  link_depends: backend_link_depends,
+  export_dynamic: true,
+  implib: true,
+  dependencies: backend_build_deps,
+  kwargs: default_bin_args,
+)
+
+backend_targets += postgres
+
+pg_mod_c_args = cflags_mod
+pg_mod_cpp_args = cxxflags_mod
+pg_mod_link_args = ldflags_sl + ldflags_mod
+pg_mod_link_depend = []
+
+# A few platforms like MacOS and Windows link shared modules against postgres,
+# or a [import] library derived from it. Set up the link flags for that.
+if mod_link_args_fmt.length() > 0
+  # To avoid unnecessary build-time dependencies on other operating systems,
+  # only the dependency when it when necessary.
+  pg_mod_link_depend += postgres
+
+  name = mod_link_with_name.format('postgres')
+  link_with_uninst = meson.current_build_dir() / name
+  link_with_inst = '${@0@}/@1@'.format(mod_link_with_dir, name)
+
+  foreach el : mod_link_args_fmt
+    pg_mod_link_args += el.format(link_with_uninst)
+  endforeach
+endif
+
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+  compile_args: pg_mod_c_args,
+  include_directories: postgres_inc,
+  link_args: pg_mod_link_args,
+  sources: generated_headers + generated_backend_headers,
+  dependencies: backend_mod_deps,
+)
+
+pg_mod_args = default_mod_args + {
+  'dependencies': [backend_mod_code],
+  'cpp_args': pg_mod_cpp_args,
+  'link_depends': pg_mod_link_depend,
+}
+
+
+
+# Shared modules that, on some system, link against the server binary. Only
+# enter these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..8e0d4039f24
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,29 @@
+backend_sources += files(
+  'bitmapset.c',
+  'extensible.c',
+  'list.c',
+  'makefuncs.c',
+  'nodeFuncs.c',
+  'nodes.c',
+  'params.c',
+  'print.c',
+  'read.c',
+  'tidbitmap.c',
+  'value.c',
+)
+
+# these include .c files generated in ../../include/nodes, seems nicer to not
+# add that as an include path for the whole backend
+nodefunc_sources = files(
+  'copyfuncs.c',
+  'equalfuncs.c',
+  'outfuncs.c',
+  'readfuncs.c',
+)
+nodefuncs = static_library('nodefuncs',
+  nodefunc_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('../../include/nodes'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += nodefuncs
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+  'geqo_copy.c',
+  'geqo_cx.c',
+  'geqo_erx.c',
+  'geqo_eval.c',
+  'geqo_main.c',
+  'geqo_misc.c',
+  'geqo_mutation.c',
+  'geqo_ox1.c',
+  'geqo_ox2.c',
+  'geqo_pmx.c',
+  'geqo_pool.c',
+  'geqo_px.c',
+  'geqo_random.c',
+  'geqo_recombination.c',
+  'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+  'allpaths.c',
+  'clausesel.c',
+  'costsize.c',
+  'equivclass.c',
+  'indxpath.c',
+  'joinpath.c',
+  'joinrels.c',
+  'pathkeys.c',
+  'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'analyzejoins.c',
+  'createplan.c',
+  'initsplan.c',
+  'planagg.c',
+  'planmain.c',
+  'planner.c',
+  'setrefs.c',
+  'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'prepagg.c',
+  'prepjointree.c',
+  'prepqual.c',
+  'preptlist.c',
+  'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'appendinfo.c',
+  'clauses.c',
+  'inherit.c',
+  'joininfo.c',
+  'orclauses.c',
+  'paramassign.c',
+  'pathnode.c',
+  'placeholder.c',
+  'plancat.c',
+  'predtest.c',
+  'relnode.c',
+  'restrictinfo.c',
+  'tlist.c',
+  'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..15d5a349eeb
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,48 @@
+backend_sources += files(
+  'analyze.c',
+  'parse_agg.c',
+  'parse_clause.c',
+  'parse_coerce.c',
+  'parse_collate.c',
+  'parse_cte.c',
+  'parse_enr.c',
+  'parse_expr.c',
+  'parse_func.c',
+  'parse_merge.c',
+  'parse_node.c',
+  'parse_oper.c',
+  'parse_param.c',
+  'parse_relation.c',
+  'parse_target.c',
+  'parse_type.c',
+  'parse_utilcmd.c',
+  'scansup.c',
+)
+
+# Build a small utility static lib for the parser. The generation of the
+# parser is slow, and building this separately avoids other parts of the
+# backend having to wait till gram.h is generated.
+parser_sources = files('parser.c')
+
+backend_scanner = custom_target('scan',
+  input: 'scan.l',
+  output: 'scan.c',
+  command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-CF', '-p', '-p'],
+)
+generated_sources += backend_scanner
+parser_sources += backend_scanner
+
+backend_parser = custom_target('gram',
+  input: 'gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += backend_parser.to_list()
+parser_sources += backend_parser
+
+parser = static_library('parser',
+  parser_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'partbounds.c',
+  'partdesc.c',
+  'partprune.c',
+)
diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build
new file mode 100644
index 00000000000..4ace0554680
--- /dev/null
+++ b/src/backend/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('postgres-' + pg_version_major.to_string())
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..a22c25dd952
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+  'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+  backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+  backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+  backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+  backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+  backend_sources += files('win32_shmem.c')
+endif
+
+if host_system == 'windows'
+  subdir('win32')
+endif
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/port': ['pg_sema.c', 'pg_shmem.c', 'tas.s']}
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..68fe4cc3cd0
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'crashdump.c',
+  'signal.c',
+  'socket.c',
+  'timer.c',
+)
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..293a44ca295
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+  'autovacuum.c',
+  'auxprocess.c',
+  'bgworker.c',
+  'bgwriter.c',
+  'checkpointer.c',
+  'fork_process.c',
+  'interrupt.c',
+  'pgarch.c',
+  'postmaster.c',
+  'shell_archive.c',
+  'startup.c',
+  'syslogger.c',
+  'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..c84e57fdba5
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'regcomp.c',
+  'regerror.c',
+  'regexec.c',
+  'regexport.c',
+  'regfree.c',
+  'regprefix.c',
+)
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+  'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+  libpqwalreceiver_sources,
+  kwargs: pg_mod_args + {
+    'name_prefix': 'lib',
+    'dependencies': pg_mod_args['dependencies'] + [libpq],
+  }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+  'decode.c',
+  'launcher.c',
+  'logical.c',
+  'logicalfuncs.c',
+  'message.c',
+  'origin.c',
+  'proto.c',
+  'relation.c',
+  'reorderbuffer.c',
+  'snapbuild.c',
+  'tablesync.c',
+  'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..27b9bf13182
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+  'slot.c',
+  'slotfuncs.c',
+  'syncrep.c',
+  'walreceiver.c',
+  'walreceiverfuncs.c',
+  'walsender.c',
+)
+
+# see ../parser/meson.build
+repl_parser_sources = []
+
+repl_scanner = custom_target('repl_scanner',
+  input: 'repl_scanner.l',
+  output: 'repl_scanner.c',
+  command: flex_cmd,
+)
+generated_sources += repl_scanner
+repl_parser_sources += repl_scanner
+
+repl_gram = custom_target('repl_gram',
+  input: 'repl_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += repl_gram.to_list()
+repl_parser_sources += repl_gram
+
+syncrep_scanner = custom_target('syncrep_scanner',
+  input: 'syncrep_scanner.l',
+  output: 'syncrep_scanner.c',
+  command: flex_cmd,
+)
+generated_sources += syncrep_scanner
+repl_parser_sources += syncrep_scanner
+
+syncrep_gram = custom_target('syncrep_gram',
+  input: 'syncrep_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += syncrep_gram.to_list()
+repl_parser_sources += syncrep_gram
+
+repl_parser = static_library('repl_parser',
+  repl_parser_sources,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+backend_link_with += repl_parser
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..ab956361a62
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,10 @@
+pgoutput_sources = files(
+  'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+  pgoutput_sources,
+  kwargs: pg_mod_args,
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..21fa0e230b0
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'rewriteDefine.c',
+  'rewriteHandler.c',
+  'rewriteManip.c',
+  'rewriteRemove.c',
+  'rewriteSearchCycle.c',
+  'rewriteSupport.c',
+  'rowsecurity.c',
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..8c6f685cb32
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,88 @@
+dict_snowball_sources = files(
+  'libstemmer/api.c',
+  'libstemmer/utilities.c',
+  'dict_snowball.c',
+)
+
+dict_snowball_sources += files(
+  'libstemmer/stem_ISO_8859_1_basque.c',
+  'libstemmer/stem_ISO_8859_1_catalan.c',
+  'libstemmer/stem_ISO_8859_1_danish.c',
+  'libstemmer/stem_ISO_8859_1_dutch.c',
+  'libstemmer/stem_ISO_8859_1_english.c',
+  'libstemmer/stem_ISO_8859_1_finnish.c',
+  'libstemmer/stem_ISO_8859_1_french.c',
+  'libstemmer/stem_ISO_8859_1_german.c',
+  'libstemmer/stem_ISO_8859_1_indonesian.c',
+  'libstemmer/stem_ISO_8859_1_irish.c',
+  'libstemmer/stem_ISO_8859_1_italian.c',
+  'libstemmer/stem_ISO_8859_1_norwegian.c',
+  'libstemmer/stem_ISO_8859_1_porter.c',
+  'libstemmer/stem_ISO_8859_1_portuguese.c',
+  'libstemmer/stem_ISO_8859_1_spanish.c',
+  'libstemmer/stem_ISO_8859_1_swedish.c',
+  'libstemmer/stem_ISO_8859_2_hungarian.c',
+  'libstemmer/stem_ISO_8859_2_romanian.c',
+  'libstemmer/stem_KOI8_R_russian.c',
+  'libstemmer/stem_UTF_8_arabic.c',
+  'libstemmer/stem_UTF_8_armenian.c',
+  'libstemmer/stem_UTF_8_basque.c',
+  'libstemmer/stem_UTF_8_catalan.c',
+  'libstemmer/stem_UTF_8_danish.c',
+  'libstemmer/stem_UTF_8_dutch.c',
+  'libstemmer/stem_UTF_8_english.c',
+  'libstemmer/stem_UTF_8_finnish.c',
+  'libstemmer/stem_UTF_8_french.c',
+  'libstemmer/stem_UTF_8_german.c',
+  'libstemmer/stem_UTF_8_greek.c',
+  'libstemmer/stem_UTF_8_hindi.c',
+  'libstemmer/stem_UTF_8_hungarian.c',
+  'libstemmer/stem_UTF_8_indonesian.c',
+  'libstemmer/stem_UTF_8_irish.c',
+  'libstemmer/stem_UTF_8_italian.c',
+  'libstemmer/stem_UTF_8_lithuanian.c',
+  'libstemmer/stem_UTF_8_nepali.c',
+  'libstemmer/stem_UTF_8_norwegian.c',
+  'libstemmer/stem_UTF_8_porter.c',
+  'libstemmer/stem_UTF_8_portuguese.c',
+  'libstemmer/stem_UTF_8_romanian.c',
+  'libstemmer/stem_UTF_8_russian.c',
+  'libstemmer/stem_UTF_8_serbian.c',
+  'libstemmer/stem_UTF_8_spanish.c',
+  'libstemmer/stem_UTF_8_swedish.c',
+  'libstemmer/stem_UTF_8_tamil.c',
+  'libstemmer/stem_UTF_8_turkish.c',
+  'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+  dict_snowball_sources,
+  kwargs: pg_mod_args + {
+    'include_directories': [stemmer_inc],
+  }
+)
+
+snowball_create = custom_target('snowball_create',
+  output: ['snowball_create.sql'],
+  depfile: 'snowball_create.dep',
+  command: [
+    perl, files('snowball_create.pl'),
+    '--depfile',
+    '--input', '@CURRENT_SOURCE_DIR@',
+    '--outdir', '@OUTDIR@',
+  ],
+  install: true,
+  install_dir: dir_data,
+)
+generated_sources += snowball_create
+
+install_subdir('stopwords',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true,
+)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'dependencies.c',
+  'extended_stats.c',
+  'mcv.c',
+  'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+  'buf_init.c',
+  'buf_table.c',
+  'bufmgr.c',
+  'freelist.c',
+  'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'buffile.c',
+  'copydir.c',
+  'fd.c',
+  'fileset.c',
+  'reinit.c',
+  'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'freespace.c',
+  'fsmpage.c',
+  'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+  'barrier.c',
+  'dsm.c',
+  'dsm_impl.c',
+  'ipc.c',
+  'ipci.c',
+  'latch.c',
+  'pmsignal.c',
+  'procarray.c',
+  'procsignal.c',
+  'shm_mq.c',
+  'shm_toc.c',
+  'shmem.c',
+  'shmqueue.c',
+  'signalfuncs.c',
+  'sinval.c',
+  'sinvaladt.c',
+  'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..68237c8a2e8
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+  'condition_variable.c',
+  'deadlock.c',
+  'lmgr.c',
+  'lock.c',
+  'lwlock.c',
+  'predicate.c',
+  'proc.c',
+  's_lock.c',
+  'spin.c',
+)
+
+generated_backend_sources += lwlocknames[1]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+  'bufpage.c',
+  'checksum.c',
+  'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'md.c',
+  'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'cmdtag.c',
+  'dest.c',
+  'fastpath.c',
+  'postgres.c',
+  'pquery.c',
+  'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..4144e9befc5
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+  'dict.c',
+  'dict_ispell.c',
+  'dict_simple.c',
+  'dict_synonym.c',
+  'dict_thesaurus.c',
+  'regis.c',
+  'spell.c',
+  'to_tsany.c',
+  'ts_locale.c',
+  'ts_parse.c',
+  'ts_selfuncs.c',
+  'ts_typanalyze.c',
+  'ts_utils.c',
+  'wparser.c',
+  'wparser_def.c',
+)
+
+install_subdir('dicts',
+  install_dir: dir_data / 'tsearch_data',
+  strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..5b3b558a67d
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+  'backend_progress.c',
+  'backend_status.c',
+  'pgstat.c',
+  'pgstat_archiver.c',
+  'pgstat_bgwriter.c',
+  'pgstat_checkpointer.c',
+  'pgstat_database.c',
+  'pgstat_function.c',
+  'pgstat_relation.c',
+  'pgstat_replslot.c',
+  'pgstat_shmem.c',
+  'pgstat_slru.c',
+  'pgstat_subscription.c',
+  'pgstat_wal.c',
+  'pgstat_xact.c',
+  'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..ed9ceadfef0
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,131 @@
+backend_sources += files(
+  'acl.c',
+  'amutils.c',
+  'array_expanded.c',
+  'array_selfuncs.c',
+  'array_typanalyze.c',
+  'array_userfuncs.c',
+  'arrayfuncs.c',
+  'arraysubs.c',
+  'arrayutils.c',
+  'ascii.c',
+  'bool.c',
+  'cash.c',
+  'char.c',
+  'cryptohashfuncs.c',
+  'date.c',
+  'datetime.c',
+  'datum.c',
+  'dbsize.c',
+  'domains.c',
+  'encode.c',
+  'enum.c',
+  'expandeddatum.c',
+  'expandedrecord.c',
+  'float.c',
+  'format_type.c',
+  'formatting.c',
+  'genfile.c',
+  'geo_ops.c',
+  'geo_selfuncs.c',
+  'geo_spgist.c',
+  'hbafuncs.c',
+  'inet_cidr_ntop.c',
+  'inet_net_pton.c',
+  'int.c',
+  'int8.c',
+  'json.c',
+  'jsonb.c',
+  'jsonb_gin.c',
+  'jsonb_op.c',
+  'jsonb_util.c',
+  'jsonbsubs.c',
+  'jsonfuncs.c',
+  'jsonpath.c',
+  'jsonpath_exec.c',
+  'like.c',
+  'like_support.c',
+  'lockfuncs.c',
+  'mac.c',
+  'mac8.c',
+  'mcxtfuncs.c',
+  'misc.c',
+  'multirangetypes.c',
+  'multirangetypes_selfuncs.c',
+  'name.c',
+  'network.c',
+  'network_gist.c',
+  'network_selfuncs.c',
+  'network_spgist.c',
+  'numeric.c',
+  'numutils.c',
+  'oid.c',
+  'oracle_compat.c',
+  'orderedsetaggs.c',
+  'partitionfuncs.c',
+  'pg_locale.c',
+  'pg_lsn.c',
+  'pg_upgrade_support.c',
+  'pgstatfuncs.c',
+  'pseudotypes.c',
+  'quote.c',
+  'rangetypes.c',
+  'rangetypes_gist.c',
+  'rangetypes_selfuncs.c',
+  'rangetypes_spgist.c',
+  'rangetypes_typanalyze.c',
+  'regexp.c',
+  'regproc.c',
+  'ri_triggers.c',
+  'rowtypes.c',
+  'ruleutils.c',
+  'selfuncs.c',
+  'tid.c',
+  'timestamp.c',
+  'trigfuncs.c',
+  'tsginidx.c',
+  'tsgistidx.c',
+  'tsquery.c',
+  'tsquery_cleanup.c',
+  'tsquery_gist.c',
+  'tsquery_op.c',
+  'tsquery_rewrite.c',
+  'tsquery_util.c',
+  'tsrank.c',
+  'tsvector.c',
+  'tsvector_op.c',
+  'tsvector_parser.c',
+  'uuid.c',
+  'varbit.c',
+  'varchar.c',
+  'varlena.c',
+  'version.c',
+  'windowfuncs.c',
+  'xid.c',
+  'xid8funcs.c',
+  'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+  input: 'jsonpath_scan.l',
+  output: 'jsonpath_scan.c',
+  command: [flex_cmd, '--no-backup', '--', '-CF', '-p', '-p'],
+)
+generated_sources += jsonpath_scan
+
+jsonpath_gram = custom_target('jsonpath_parse',
+  input: 'jsonpath_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += jsonpath_gram.to_list()
+
+# so we don't need to add . as an include dir for the whole backend
+backend_link_with += static_library('jsonpath',
+  jsonpath_scan, jsonpath_gram,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+
+#generated_backend_sources += jsonpath_gram.to_list()
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..4fe6db6bda6
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+  'attoptcache.c',
+  'catcache.c',
+  'evtcache.c',
+  'inval.c',
+  'lsyscache.c',
+  'partcache.c',
+  'plancache.c',
+  'relcache.c',
+  'relfilenumbermap.c',
+  'relmapper.c',
+  'spccache.c',
+  'syscache.c',
+  'ts_cache.c',
+  'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..325446c8f93
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+  'assert.c',
+  'csvlog.c',
+  'elog.c',
+  'jsonlog.c',
+)
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+  'dfmgr.c',
+  'fmgr.c',
+  'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'dynahash.c',
+  'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'globals.c',
+  'miscinit.c',
+  'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..1bc971d1945
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,36 @@
+encodings = {
+  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+  'euc_tw_and_big5': [
+    'euc_tw_and_big5/euc_tw_and_big5.c',
+    'euc_tw_and_big5/big5.c',
+  ],
+  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+  backend_targets += shared_module(encoding,
+    sources,
+    kwargs: pg_mod_args,
+  )
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'conv.c',
+  'mbutils.c',
+  'stringinfo_mb.c',
+  'wstrcmp.c',
+  'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..3a916320bb3
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,17 @@
+install_data('errcodes.txt',
+  install_dir: dir_data,
+)
+
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..db4de225e18
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,35 @@
+backend_sources += files(
+  'guc.c',
+  'guc_funcs.c',
+  'guc_tables.c',
+  'help_config.c',
+  'pg_config.c',
+  'pg_controldata.c',
+  'pg_rusage.c',
+  'ps_status.c',
+  'queryenvironment.c',
+  'queryjumble.c',
+  'rls.c',
+  'sampling.c',
+  'superuser.c',
+  'timeout.c',
+  'tzparser.c',
+)
+
+guc_scan = custom_target('guc_scan',
+  input: 'guc-file.l',
+  output: 'guc-file.c',
+  command: flex_cmd)
+generated_sources += guc_scan
+
+# so we don't need to add . as an include dir for the whole backend
+backend_link_with += static_library('guc-file',
+  guc_scan,
+  dependencies: [backend_code],
+  include_directories: include_directories('.'),
+  kwargs: internal_lib_args,
+)
+
+install_data('postgresql.conf.sample',
+  install_dir: dir_data,
+)
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+  'aset.c',
+  'dsa.c',
+  'freepage.c',
+  'generation.c',
+  'mcxt.c',
+  'memdebug.c',
+  'portalmem.c',
+  'slab.c',
+)
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+  'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..1862ceae8c1
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+  'logtape.c',
+  'qsort_interruptible.c',
+  'sharedtuplestore.c',
+  'sortsupport.c',
+  'tuplesort.c',
+  'tuplesortvariants.c',
+  'tuplestore.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+  'combocid.c',
+  'snapmgr.c',
+)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..b6bf8e1ca21
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,29 @@
+fe_utils_sources = files(
+  'archive.c',
+  'cancel.c',
+  'conditional.c',
+  'connect_utils.c',
+  'mbprint.c',
+  'option_utils.c',
+  'parallel_slot.c',
+  'print.c',
+  'query_utils.c',
+  'recovery_gen.c',
+  'simple_list.c',
+  'string_utils.c',
+)
+
+psqlscan = custom_target('psqlscan',
+  input: 'psqlscan.l',
+  output: 'psqlscan.c',
+  command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-Cfe', '-p', '-p'],
+)
+generated_sources += psqlscan
+fe_utils_sources += psqlscan
+
+fe_utils = static_library('libpgfeutils',
+  fe_utils_sources + generated_headers,
+  include_directories: [postgres_inc, libpq_inc],
+  dependencies: frontend_common_code,
+  kwargs: default_lib_args,
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..9f213274d2f
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,30 @@
+initdb_sources = files(
+  'findtimezone.c',
+  'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+initdb = executable('initdb',
+  initdb_sources,
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code, libpq, icu, icu_i18n],
+  kwargs: default_bin_args,
+)
+bin_targets += initdb
+
+tests += {
+  'name': 'initdb',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_initdb.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 00000000000..8b8a9fd2ce1
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('initdb-' + pg_version_major.to_string())
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..5fd5a9d2f98
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..8e197eba5f3
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,27 @@
+pg_amcheck_sources = files(
+  'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+  pg_amcheck_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_amcheck
+
+tests += {
+  'name': 'pg_amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_nonesuch.pl',
+      't/003_check.pl',
+      't/004_verify_heapam.pl',
+      't/005_opclass_damage.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 00000000000..b255f552c94
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_amcheck-' + pg_version_major.to_string())
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..87a0d980c4f
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,19 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+  ['pg_archivecleanup.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_archivecleanup
+
+tests += {
+  'name': 'pg_archivecleanup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_pg_archivecleanup.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 00000000000..37935fcabc4
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..d26fed9cd8a
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,61 @@
+common_sources = files(
+  'bbstreamer_file.c',
+  'bbstreamer_gzip.c',
+  'bbstreamer_inject.c',
+  'bbstreamer_lz4.c',
+  'bbstreamer_tar.c',
+  'bbstreamer_zstd.c',
+  'receivelog.c',
+  'streamutil.c',
+  'walmethods.c',
+)
+
+pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_common = static_library('libpg_basebackup_common',
+  common_sources,
+  dependencies: pg_basebackup_deps,
+  kwargs: internal_lib_args,
+)
+
+pg_basebackup = executable('pg_basebackup',
+  'pg_basebackup.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+bin_targets += pg_basebackup
+
+pg_receivewal = executable('pg_receivewal',
+  'pg_receivewal.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+bin_targets += pg_receivewal
+
+pg_recvlogical = executable('pg_recvlogical',
+  'pg_recvlogical.c',
+  link_with: [pg_basebackup_common],
+  dependencies: pg_basebackup_deps,
+  kwargs: default_bin_args,
+)
+bin_targets += pg_recvlogical
+
+tests += {
+  'name': 'pg_basebackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path(),
+            'LZ4': program_lz4.found() ? program_lz4.path() : '',
+            'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+    'tests': [
+      't/010_pg_basebackup.pl',
+      't/020_pg_receivewal.pl',
+      't/030_pg_recvlogical.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 00000000000..cab021153fe
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_basebackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..ee1f367bac3
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,21 @@
+pg_checksums = executable('pg_checksums',
+  ['pg_checksums.c'],
+  include_directories: [timezone_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_checksums
+
+tests += {
+  'name': 'pg_checksums',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_actions.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 00000000000..2c47c2338f6
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_checksums-' + pg_version_major.to_string())
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..0ecbf2f9d28
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,19 @@
+pg_config = executable('pg_config',
+  ['pg_config.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_config
+
+tests += {
+  'name': 'pg_config',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_config.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 00000000000..b6fb6db9213
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_config-' + pg_version_major.to_string())
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..557e672beb7
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,19 @@
+pg_controldata = executable('pg_controldata',
+  ['pg_controldata.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_controldata
+
+tests += {
+  'name': 'pg_controldata',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pg_controldata.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 00000000000..31b486d002c
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_controldata-' + pg_version_major.to_string())
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..6812e73e329
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,22 @@
+pg_ctl = executable('pg_ctl',
+  ['pg_ctl.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_ctl
+
+tests += {
+  'name': 'pg_ctl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_start_stop.pl',
+      't/002_status.pl',
+      't/003_promote.pl',
+      't/004_logrotate.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 00000000000..947b5108423
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_ctl-' + pg_version_major.to_string())
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..785ec094dbd
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,75 @@
+pg_dump_common_sources = files(
+  'compress_io.c',
+  'dumputils.c',
+  'parallel.c',
+  'pg_backup_archiver.c',
+  'pg_backup_custom.c',
+  'pg_backup_db.c',
+  'pg_backup_directory.c',
+  'pg_backup_null.c',
+  'pg_backup_tar.c',
+  'pg_backup_utils.c',
+)
+
+pg_dump_common = static_library('libpgdump_common',
+  pg_dump_common_sources,
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: internal_lib_args,
+)
+
+
+pg_dump_sources = files(
+  'common.c',
+  'pg_dump.c',
+  'pg_dump_sort.c',
+)
+
+pg_dump = executable('pg_dump',
+  pg_dump_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_dump
+
+
+pg_dumpall_sources = files(
+  'pg_dumpall.c',
+)
+
+pg_dumpall = executable('pg_dumpall',
+  pg_dumpall_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_dumpall
+
+
+pg_restore_sources = files(
+  'pg_restore.c',
+)
+
+pg_restore = executable('pg_restore',
+  pg_restore_sources,
+  link_with: [pg_dump_common],
+  dependencies: [frontend_code, libpq, zlib],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_restore
+
+tests += {
+  'name': 'pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_dump.pl',
+      't/003_pg_dump_with_server.pl',
+      't/010_dump_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 00000000000..82e5e537ff4
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_dump-' + pg_version_major.to_string())
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..7c5de134ac0
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,20 @@
+pg_resetwal = executable('pg_resetwal',
+  files('pg_resetwal.c'),
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_resetwal
+
+tests += {
+  'name': 'pg_resetwal',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_corrupted.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 00000000000..d130d3b775f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_resetwal-' + pg_version_major.to_string())
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..d8ec9e482d5
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,42 @@
+pg_rewind_sources = files(
+  'datapagemap.c',
+  'file_ops.c',
+  'filemap.c',
+  'libpq_source.c',
+  'local_source.c',
+  'parsexlog.c',
+  'pg_rewind.c',
+  'timeline.c',
+)
+
+pg_rewind_sources += xlogreader_sources
+
+pg_rewind = executable('pg_rewind',
+  pg_rewind_sources,
+  dependencies: [frontend_code, libpq, lz4, zstd],
+  c_args: ['-DFRONTEND'], # needed for xlogreader et al
+  kwargs: default_bin_args,
+)
+bin_targets += pg_rewind
+
+
+tests += {
+  'name': 'pg_rewind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_databases.pl',
+      't/003_extrafiles.pl',
+      't/004_pg_xlog_symlink.pl',
+      't/005_same_timeline.pl',
+      't/006_options.pl',
+      't/007_standby_source.pl',
+      't/008_min_recovery_point.pl',
+      't/009_growing_files.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 00000000000..a105600b348
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_rewind-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..2c01831e11f
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,21 @@
+test_fsync_sources = files('pg_test_fsync.c')
+
+pg_test_fsync = executable('pg_test_fsync',
+  test_fsync_sources,
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_test_fsync
+
+tests += {
+  'name': 'pg_test_fsync',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 00000000000..2ee1125282d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..0a3068f1657
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,19 @@
+pg_test_timing = executable('pg_test_timing',
+  ['pg_test_timing.c'],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_test_timing
+
+tests += {
+  'name': 'pg_test_timing',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 00000000000..cda8615165b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_timing-' + pg_version_major.to_string())
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..02f030e0ccf
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,40 @@
+pg_upgrade_sources = files(
+  'check.c',
+  'controldata.c',
+  'dump.c',
+  'exec.c',
+  'file.c',
+  'function.c',
+  'info.c',
+  'option.c',
+  'parallel.c',
+  'pg_upgrade.c',
+  'relfilenumber.c',
+  'server.c',
+  'tablespace.c',
+  'util.c',
+  'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+  pg_upgrade_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_upgrade
+
+
+tests += {
+  'name': 'pg_upgrade',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_pg_upgrade.pl',
+    ],
+    'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 00000000000..39301cbede8
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_upgrade-' + pg_version_major.to_string())
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..4c3b2bb5f97
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,33 @@
+pg_verifybackup_sources = files(
+  'parse_manifest.c',
+  'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+  pg_verifybackup_sources,
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+bin_targets += pg_verifybackup
+
+tests += {
+  'name': 'pg_verifybackup',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+      't/002_algorithm.pl',
+      't/003_corruption.pl',
+      't/004_options.pl',
+      't/005_bad_manifest.pl',
+      't/006_encoding.pl',
+      't/007_wal.pl',
+      't/008_untar.pl',
+      't/009_extract.pl',
+      't/010_client_untar.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 00000000000..b583f1958ba
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..95872652ffd
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,30 @@
+pg_waldump_sources = files(
+  'compat.c',
+  'pg_waldump.c',
+  'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
+
+pg_waldump = executable('pg_waldump',
+  pg_waldump_sources,
+  dependencies: [frontend_code, lz4, zstd],
+  c_args: ['-DFRONTEND'], # needed for xlogreader et al
+  kwargs: default_bin_args,
+)
+bin_targets += pg_waldump
+
+tests += {
+  'name': 'pg_waldump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 00000000000..f335aa4b360
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_waldump-' + pg_version_major.to_string())
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..6564e54029c
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,38 @@
+pgbench_sources = files(
+  'pgbench.c',
+)
+
+exprscan = custom_target('exprscan',
+  input: 'exprscan.l',
+  output: 'exprscan.c',
+  command: flex_cmd,
+)
+generated_sources += exprscan
+pgbench_sources += exprscan
+
+exprparse = custom_target('exprparse',
+  input: 'exprparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += exprparse.to_list()
+pgbench_sources += exprparse
+
+pgbench = executable('pgbench',
+  pgbench_sources,
+  dependencies: [frontend_code, libpq, thread_dep],
+  include_directories: include_directories('.'),
+  kwargs: default_bin_args,
+)
+bin_targets += pgbench
+
+tests += {
+  'name': 'pgbench',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_pgbench_with_server.pl',
+      't/002_pgbench_no_server.pl',
+    ],
+  },
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..5852bca4d87
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,26 @@
+if host_system != 'windows'
+  subdir_done()
+endif
+
+pgevent_sources = files(
+  'pgevent.c',
+)
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
+# FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
+pgevent_link_args = []
+if cc.get_id() == 'msvc'
+  pgevent_link_args += '/ignore:4104'
+endif
+
+pgevent = shared_library('pgevent',
+  pgevent_sources,
+  dependencies: [frontend_code],
+  link_args: pgevent_link_args,
+  vs_module_defs: 'pgevent.def',
+  kwargs: default_lib_args + {
+    'name_prefix': '',
+  },
+)
+bin_targets += pgevent
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..ea850c8fdf5
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,67 @@
+psql_sources = files(
+  'command.c',
+  'common.c',
+  'copy.c',
+  'crosstabview.c',
+  'describe.c',
+  'help.c',
+  'input.c',
+  'large_obj.c',
+  'mainloop.c',
+  'prompt.c',
+  'startup.c',
+  'stringutils.c',
+  'tab-complete.c',
+  'variables.c',
+)
+
+psqlscanslash = custom_target('psqlscanslash',
+  input: 'psqlscanslash.l',
+  output: 'psqlscanslash.c',
+  command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-Cfe', '-p', '-p'])
+generated_sources += psqlscanslash
+psql_sources += psqlscanslash
+bin_targets += psqlscanslash
+
+sql_help = custom_target('psql_help',
+  output: ['sql_help.c', 'sql_help.h'],
+  depfile: 'sql_help.dep',
+  command: [
+    perl, files('create_help.pl'),
+    '--docdir', '@SOURCE_ROOT@/doc/src/sgml/ref',
+    '--depfile', '@DEPFILE@',
+    '--outdir', '@OUTDIR@',
+    '--basename', 'sql_help',
+  ],
+)
+generated_sources += sql_help.to_list()
+psql_sources += sql_help
+bin_targets += sql_help
+
+psql = executable('psql',
+  psql_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq, readline],
+  kwargs: default_bin_args,
+)
+bin_targets += psql
+
+install_data('psqlrc.sample',
+  install_dir: dir_data,
+)
+
+tests += {
+  'name': 'psql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_basic.pl',
+      't/010_tab_completion.pl',
+      't/020_cancel.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 00000000000..45fe425298d
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('psql-' + pg_version_major.to_string())
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..eaf250c7f73
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,51 @@
+scripts_common = static_library('libscripts_common',
+  files('common.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: internal_lib_args,
+)
+
+binaries = [
+  'createdb',
+  'dropdb',
+  'createuser',
+  'dropuser',
+  'clusterdb',
+  'vacuumdb',
+  'reindexdb',
+  'pg_isready',
+]
+
+foreach binary : binaries
+  binary = executable(binary,
+    files(binary + '.c'),
+    link_with: [scripts_common],
+    dependencies: [frontend_code, libpq],
+    kwargs: default_bin_args,
+  )
+  bin_targets += binary
+endforeach
+
+tests += {
+  'name': 'scripts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_clusterdb.pl',
+      't/011_clusterdb_all.pl',
+      't/020_createdb.pl',
+      't/040_createuser.pl',
+      't/050_dropdb.pl',
+      't/070_dropuser.pl',
+      't/080_pg_isready.pl',
+      't/090_reindexdb.pl',
+      't/091_reindexdb_all.pl',
+      't/100_vacuumdb.pl',
+      't/101_vacuumdb_all.pl',
+      't/102_vacuumdb_stages.pl',
+      't/200_connstr.pl',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 00000000000..3c531459c2d
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pgscripts-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..bc047e00d62
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,108 @@
+# test/ is entered via top-level meson.build, that way it can use the default
+# args for executables (which depend on libpq).
+
+libpq_sources = files(
+  'fe-auth-scram.c',
+  'fe-auth.c',
+  'fe-connect.c',
+  'fe-exec.c',
+  'fe-lobj.c',
+  'fe-misc.c',
+  'fe-print.c',
+  'fe-protocol3.c',
+  'fe-secure.c',
+  'fe-trace.c',
+  'legacy-pqsignal.c',
+  'libpq-events.c',
+  'pqexpbuffer.c',
+)
+
+if host_system == 'windows'
+  libpq_sources += files('pthread-win32.c', 'win32.c')
+endif
+
+if ssl.found()
+  libpq_sources += files('fe-secure-common.c')
+  libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+  libpq_sources += files(
+    'fe-gssapi-common.c',
+    'fe-secure-gssapi.c',
+  )
+endif
+
+export_file = custom_target('libpq.exports',
+  kwargs: gen_export_kwargs,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+
+libpq_st = static_library('libpq',
+  libpq_sources,
+  pic: true,
+  include_directories: [libpq_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=5'],
+  dependencies: libpq_deps,
+  kwargs: default_lib_args,
+)
+
+# not using both_libraries here, causes problems with precompiled headers and
+# resource files with msbuild
+libpq_so = shared_library('libpq',
+  dependencies: libpq_deps,
+  include_directories: [libpq_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=5'],
+  link_whole: libpq_st,
+  version: '5.' + pg_version_major.to_string(),
+  soversion: host_system != 'windows' ? '5' : '',
+  darwin_versions: ['5', '5.' + pg_version_major.to_string()],
+  link_depends: export_file,
+  link_args: export_fmt.format(export_file.full_path()),
+  kwargs: default_lib_args,
+)
+
+libpq = declare_dependency(
+  link_with: [libpq_so],
+  include_directories: [include_directories('.')]
+)
+
+pkgconfig.generate(
+  libpq_so,
+  name: 'libpq',
+  description: 'PostgreSQL libpq library',
+  url: pg_url,
+)
+
+install_headers(
+  'libpq-fe.h',
+  'libpq-events.h',
+)
+
+install_headers(
+  'libpq-int.h',
+  'pqexpbuffer.h',
+  'fe-auth-sasl.h',
+  install_dir: dir_include_internal,
+)
+install_data('pg_service.conf.sample',
+  install_dir: dir_data,
+)
+
+
+tests += {
+  'name': 'libpq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_uri.pl',
+      't/002_api.pl',
+    ],
+    'env': {'with_ssl': get_option('ssl')},
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build
new file mode 100644
index 00000000000..eed91110fd6
--- /dev/null
+++ b/src/interfaces/libpq/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
new file mode 100644
index 00000000000..16f94c1ed8b
--- /dev/null
+++ b/src/interfaces/libpq/test/meson.build
@@ -0,0 +1,15 @@
+executable('libpq_uri_regress',
+  files('libpq_uri_regress.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
+
+executable('libpq_testclient',
+  files('libpq_testclient.c'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  }
+)
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..d9a57465441
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,5 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
+subdir('tcl')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..73b733dd50b
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,90 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+plperl_sources = files(
+  'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+  check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(privlibexp)
+
+plperl_sources += custom_target('perlchunks.h',
+  input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+  output: 'perlchunks.h',
+  capture: true,
+  command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+  input: files('plperl_opmask.pl'),
+  output: 'plperl_opmask.h',
+  command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+  xs = files(n + '.xs')
+  xs_c_name = n + '.c'
+  xs_c = custom_target(xs_c_name,
+    input: xs,
+    output: xs_c_name,
+    command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+  )
+  plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+plperl = shared_module('plperl',
+  plperl_sources,
+  include_directories: [plperl_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [perl_dep, pg_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+pl_targets += plperl
+
+install_data(
+  'plperl.control',
+  'plperl--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_data(
+  'plperlu.control',
+  'plperlu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plperl.h',
+  'ppport.h',
+  install_dir: dir_include_server,
+)
+
+tests += {
+  'name': 'plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plperl_setup',
+      'plperl',
+      'plperl_lc',
+      'plperl_trigger',
+      'plperl_shared',
+      'plperl_elog',
+      'plperl_util',
+      'plperl_init',
+      'plperlu',
+      'plperl_array',
+      'plperl_call',
+      'plperl_transaction',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build
new file mode 100644
index 00000000000..fe0a715bdf0
--- /dev/null
+++ b/src/pl/plperl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plperl-' + pg_version_major.to_string())
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..dd499fdd151
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,84 @@
+plpgsql_sources = files(
+  'pl_comp.c',
+  'pl_exec.c',
+  'pl_funcs.c',
+  'pl_handler.c',
+  'pl_scanner.c',
+)
+
+pl_gram = custom_target('gram',
+  input: 'pl_gram.y',
+  kwargs: bison_kw,
+)
+generated_sources += pl_gram.to_list()
+plpgsql_sources += pl_gram
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+pl_errcodes = custom_target('plerrcodes',
+  input: ['../../../../src/backend/utils/errcodes.txt'],
+  output: ['plerrcodes.h'],
+  command: [perl, gen_plerrcodes, '@INPUT0@'],
+  capture: true,
+)
+generated_sources += pl_errcodes
+plpgsql_sources += pl_errcodes
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+pl_reserved = custom_target('pl_reserved_kwlist',
+  input: ['pl_reserved_kwlist.h'],
+  output: ['pl_reserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_reserved
+plpgsql_sources += pl_reserved
+
+pl_unreserved = custom_target('pl_unreserved_kwlist',
+  input: ['pl_unreserved_kwlist.h'],
+  output: ['pl_unreserved_kwlist_d.h'],
+  command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_unreserved
+plpgsql_sources += pl_unreserved
+
+plpgsql = shared_module('plpgsql',
+  plpgsql_sources,
+  include_directories: include_directories('.'),
+  kwargs: pg_mod_args,
+)
+pl_targets += plpgsql
+
+install_data(
+  'plpgsql.control',
+  'plpgsql--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpgsql.h',
+  install_dir: dir_include_server
+)
+
+
+tests += {
+  'name': 'plpgsql',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plpgsql_array',
+      'plpgsql_call',
+      'plpgsql_control',
+      'plpgsql_copy',
+      'plpgsql_domain',
+      'plpgsql_record',
+      'plpgsql_cache',
+      'plpgsql_simple',
+      'plpgsql_transaction',
+      'plpgsql_trap',
+      'plpgsql_trigger',
+      'plpgsql_varprops',
+    ],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build
new file mode 100644
index 00000000000..29e0b74488f
--- /dev/null
+++ b/src/pl/plpgsql/src/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpgsql-' + pg_version_major.to_string())
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..366b3b171ac
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,99 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+plpython_sources = files(
+  'plpy_cursorobject.c',
+  'plpy_elog.c',
+  'plpy_exec.c',
+  'plpy_main.c',
+  'plpy_planobject.c',
+  'plpy_plpymodule.c',
+  'plpy_procedure.c',
+  'plpy_resultobject.c',
+  'plpy_spi.c',
+  'plpy_subxactobject.c',
+  'plpy_typeio.c',
+  'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'spiexceptions.h',
+  command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+  capture: true,
+)
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+plpython = shared_module('plpython3',
+  plpython_sources,
+  include_directories: [plpython_inc, postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [python3_dep, pg_mod_args['dependencies']],
+  },
+)
+pl_targets += plpython
+
+# FIXME: Only install the relevant versions
+install_data(
+  'plpython3u.control',
+  'plpython3u--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+install_headers(
+  'plpy_cursorobject.h',
+  'plpy_elog.h',
+  'plpy_exec.h',
+  'plpy_main.h',
+  'plpy_planobject.h',
+  'plpy_plpymodule.h',
+  'plpy_procedure.h',
+  'plpy_resultobject.h',
+  'plpy_spi.h',
+  'plpy_subxactobject.h',
+  'plpy_typeio.h',
+  'plpy_util.h',
+  'plpython.h',
+  install_dir: dir_include_server,
+)
+
+plpython_regress = [
+  'plpython_schema',
+  'plpython_populate',
+  'plpython_test',
+  'plpython_do',
+  'plpython_global',
+  'plpython_import',
+  'plpython_spi',
+  'plpython_newline',
+  'plpython_void',
+  'plpython_call',
+  'plpython_params',
+  'plpython_setof',
+  'plpython_record',
+  'plpython_trigger',
+  'plpython_types',
+  'plpython_error',
+  'plpython_ereport',
+  'plpython_unicode',
+  'plpython_quote',
+  'plpython_composite',
+  'plpython_subtransaction',
+  'plpython_transaction',
+  'plpython_drop',
+]
+
+tests += {
+  'name': 'plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': plpython_regress,
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build
new file mode 100644
index 00000000000..542e27fbe1f
--- /dev/null
+++ b/src/pl/plpython/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpython-' + pg_version_major.to_string())
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
new file mode 100644
index 00000000000..9b6addd7fd5
--- /dev/null
+++ b/src/pl/tcl/meson.build
@@ -0,0 +1,55 @@
+if not tcl_dep.found()
+  subdir_done()
+endif
+
+pltcl_sources = files(
+  'pltcl.c',
+)
+
+gen_pltclerrcodes = files('generate-pltclerrcodes.pl')
+pltcl_sources += custom_target('pltclerrcodes.h',
+  input: files('../../backend/utils/errcodes.txt'),
+  output: 'pltclerrcodes.h',
+  capture: true,
+  command: [perl, gen_pltclerrcodes, '@INPUT@']
+)
+
+pltcl = shared_module('pltcl',
+  pltcl_sources,
+  include_directories: [include_directories('.'), postgres_inc],
+  kwargs: pg_mod_args + {
+    'dependencies': [tcl_dep, pg_mod_args['dependencies']],
+  },
+)
+pl_targets += pltcl
+
+install_data(
+  'pltcl.control',
+  'pltcl--1.0.sql',
+  'pltclu.control',
+  'pltclu--1.0.sql',
+  install_dir: dir_data_extension,
+)
+
+pltcl_regress = [
+  'pltcl_setup',
+  'pltcl_queries',
+  'pltcl_trigger',
+  'pltcl_call',
+  'pltcl_start_proc',
+  'pltcl_subxact',
+  'pltcl_unicode',
+  'pltcl_transaction',
+]
+
+tests += {
+  'name': 'pltcl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': pltcl_regress,
+    'regress_args': ['--load-extension=pltcl'],
+  },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build
new file mode 100644
index 00000000000..cc23ef1eb3b
--- /dev/null
+++ b/src/pl/tcl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pltcl-' + pg_version_major.to_string())
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..fc2368d02cf
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,23 @@
+adminpack = shared_module('adminpack',
+  ['adminpack.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += adminpack
+
+install_data(
+  'adminpack.control',
+  'adminpack--1.0.sql',
+  'adminpack--1.0--1.1.sql',
+  'adminpack--1.1--2.0.sql',
+  'adminpack--2.0--2.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'adminpack',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ['adminpack'],
+  },
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..1db3d20349e
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,37 @@
+amcheck = shared_module('amcheck', [
+    'verify_heapam.c',
+    'verify_nbtree.c',
+  ],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += amcheck
+
+install_data(
+  'amcheck.control',
+  'amcheck--1.0.sql',
+  'amcheck--1.0--1.1.sql',
+  'amcheck--1.1--1.2.sql',
+  'amcheck--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'amcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'check',
+      'check_btree',
+      'check_heap',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_verify_heapam.pl',
+      't/002_cic.pl',
+      't/003_cic_2pc.pl',
+    ],
+  },
+}
+
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..d2e01968f54
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,5 @@
+autoinc = shared_module('auth_delay',
+  ['auth_delay.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += autoinc
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..249a8376faa
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,16 @@
+auto_explain = shared_module('auto_explain',
+  files('auto_explain.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += auto_explain
+
+tests += {
+  'name': 'auto_explain',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auto_explain.pl',
+    ],
+  },
+}
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
new file mode 100644
index 00000000000..9f0517f1701
--- /dev/null
+++ b/contrib/basebackup_to_shell/meson.build
@@ -0,0 +1,22 @@
+basebackup_to_shell_sources = files(
+  'basebackup_to_shell.c',
+)
+
+basebackup_to_shell = shared_module('basebackup_to_shell',
+  basebackup_to_shell_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += basebackup_to_shell
+
+tests += {
+  'name': 'basebackup_to_shell',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+    'env': {'GZIP_PROGRAM': gzip.path(),
+            'TAR': tar.path()},
+  },
+}
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
new file mode 100644
index 00000000000..b67cbef60bd
--- /dev/null
+++ b/contrib/basic_archive/meson.build
@@ -0,0 +1,23 @@
+basic_archive_sources = files(
+  'basic_archive.c',
+)
+
+basic_archive = shared_module('basic_archive',
+  basic_archive_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += basic_archive
+
+tests += {
+  'name': 'basic_archive',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'basic_archive',
+    ],
+    'regress_args': [
+      '--temp-config', files('basic_archive.conf'),
+    ],
+  },
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..1fe7632bdbe
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,36 @@
+bloom_sources = files(
+  'blcost.c',
+  'blinsert.c',
+  'blscan.c',
+  'blutils.c',
+  'blvacuum.c',
+  'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+  bloom_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += bloom
+
+install_data(
+  'bloom.control',
+  'bloom--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bloom',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bloom',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_wal.pl',
+    ],
+  },
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..c20b667d75f
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,42 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+bool_plperl_sources = files(
+  'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+  bool_plperl_sources,
+  include_directories: [plperl_inc, include_directories('.')],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+contrib_targets += bool_plperl
+
+install_data(
+  'bool_plperl.control',
+  'bool_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'bool_plperlu.control',
+  'bool_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'bool_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'bool_plperl',
+      'bool_plperlu',
+    ],
+  },
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..15d6d31a6ee
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,54 @@
+btree_gin = shared_module('btree_gin',
+  files('btree_gin.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += btree_gin
+
+install_data(
+  'btree_gin.control',
+  'btree_gin--1.0.sql',
+  'btree_gin--1.0--1.1.sql',
+  'btree_gin--1.1--1.2.sql',
+  'btree_gin--1.2--1.3.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'install_btree_gin',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'money',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'enum',
+      'uuid',
+      'name',
+      'bool',
+      'bpchar',
+    ],
+  },
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..c0a8d238540
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,84 @@
+btree_gist_sources = files(
+  'btree_bit.c',
+  'btree_bool.c',
+  'btree_bytea.c',
+  'btree_cash.c',
+  'btree_date.c',
+  'btree_enum.c',
+  'btree_float4.c',
+  'btree_float8.c',
+  'btree_gist.c',
+  'btree_inet.c',
+  'btree_int2.c',
+  'btree_int4.c',
+  'btree_int8.c',
+  'btree_interval.c',
+  'btree_macaddr.c',
+  'btree_macaddr8.c',
+  'btree_numeric.c',
+  'btree_oid.c',
+  'btree_text.c',
+  'btree_time.c',
+  'btree_ts.c',
+  'btree_utils_num.c',
+  'btree_utils_var.c',
+  'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+  btree_gist_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += btree_gist
+
+install_data(
+  'btree_gist.control',
+  'btree_gist--1.0--1.1.sql',
+  'btree_gist--1.1--1.2.sql',
+  'btree_gist--1.2.sql',
+  'btree_gist--1.2--1.3.sql',
+  'btree_gist--1.3--1.4.sql',
+  'btree_gist--1.4--1.5.sql',
+  'btree_gist--1.5--1.6.sql',
+  'btree_gist--1.6--1.7.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'btree_gist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'init',
+      'int2',
+      'int4',
+      'int8',
+      'float4',
+      'float8',
+      'cash',
+      'oid',
+      'timestamp',
+      'timestamptz',
+      'time',
+      'timetz',
+      'date',
+      'interval',
+      'macaddr',
+      'macaddr8',
+      'inet',
+      'cidr',
+      'text',
+      'varchar',
+      'char',
+      'bytea',
+      'bit',
+      'varbit',
+      'numeric',
+      'uuid',
+      'not_equal',
+      'enum',
+      'bool',
+    ],
+  },
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..ca60eded80b
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,34 @@
+citext_sources = files(
+  'citext.c',
+)
+
+citext = shared_module('citext',
+  citext_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += citext
+
+install_data(
+  'citext.control',
+  'citext--1.0--1.1.sql',
+  'citext--1.1--1.2.sql',
+  'citext--1.2--1.3.sql',
+  'citext--1.3--1.4.sql',
+  'citext--1.4.sql',
+  'citext--1.4--1.5.sql',
+  'citext--1.5--1.6.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'citext',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'create_index_acl',
+      'citext',
+      'citext_utf8',
+    ],
+  },
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..72342b0c82c
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,53 @@
+cube_sources = files(
+  'cube.c',
+)
+
+cube_scan = custom_target('cubescan',
+  input: 'cubescan.l',
+  output: 'cubescan.c',
+  command: flex_cmd,
+)
+generated_sources += cube_scan
+cube_sources += cube_scan
+
+cube_parse = custom_target('cubeparse',
+  input: 'cubeparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += cube_parse.to_list()
+cube_sources += cube_parse
+
+cube = shared_module('cube',
+  cube_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += cube
+
+install_data(
+  'cube.control',
+  'cube--1.0--1.1.sql',
+  'cube--1.1--1.2.sql',
+  'cube--1.2.sql',
+  'cube--1.2--1.3.sql',
+  'cube--1.3--1.4.sql',
+  'cube--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'cubedata.h',
+  install_dir: dir_include_extension / 'cube',
+)
+
+tests += {
+  'name': 'cube',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'cube',
+      'cube_sci',
+    ],
+  },
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..d35f7b5d49e
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,31 @@
+dblink_sources = files(
+  'dblink.c',
+)
+
+dblink = shared_module('dblink',
+  dblink_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'] + [libpq],
+  },
+)
+contrib_targets += dblink
+
+install_data(
+  'dblink.control',
+  'dblink--1.0--1.1.sql',
+  'dblink--1.1--1.2.sql',
+  'dblink--1.2.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dblink',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dblink',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..f00e8085619
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,22 @@
+dict_int = shared_module('dict_int',
+  files('dict_int.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += dict_int
+
+install_data(
+  'dict_int.control',
+  'dict_int--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dict_int',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_int',
+    ],
+  },
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..be53f55bb79
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,29 @@
+dict_xsyn = shared_module('dict_xsyn',
+  files('dict_xsyn.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += dict_xsyn
+
+install_data(
+  'dict_xsyn.control',
+  'dict_xsyn--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'xsyn_sample.rules',
+  kwargs: contrib_data_args + {
+    'install_dir': dir_data / 'tsearch_data'
+  }
+)
+
+tests += {
+  'name': 'dict_xsyn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dict_xsyn',
+    ],
+  },
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..807f5cb7de3
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,23 @@
+earthdistance = shared_module('earthdistance',
+  files('earthdistance.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += earthdistance
+
+install_data(
+  'earthdistance.control',
+  'earthdistance--1.0--1.1.sql',
+  'earthdistance--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'earthdistance',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'earthdistance',
+    ],
+  },
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..f13efb6e38e
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,22 @@
+file_fdw = shared_module('file_fdw',
+  files('file_fdw.c'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += file_fdw
+
+install_data(
+  'file_fdw.control',
+  'file_fdw--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'file_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'file_fdw',
+    ],
+  },
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..ec278a6211e
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,26 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+  files(
+    'fuzzystrmatch.c',
+    'dmetaphone.c'
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += fuzzystrmatch
+
+install_data(
+  'fuzzystrmatch.control',
+  'fuzzystrmatch--1.0--1.1.sql',
+  'fuzzystrmatch--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'fuzzystrmatch',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'fuzzystrmatch',
+    ],
+  },
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..07c59f40a97
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,44 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+  files(
+    'hstore_compat.c',
+    'hstore_gin.c',
+    'hstore_gist.c',
+    'hstore_io.c',
+    'hstore_op.c',
+    'hstore_subs.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += hstore
+
+install_data(
+  'hstore.control',
+  'hstore--1.1--1.2.sql',
+  'hstore--1.2--1.3.sql',
+  'hstore--1.3--1.4.sql',
+  'hstore--1.4.sql',
+  'hstore--1.4--1.5.sql',
+  'hstore--1.5--1.6.sql',
+  'hstore--1.6--1.7.sql',
+  'hstore--1.7--1.8.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'hstore.h',
+  install_dir: dir_include_extension / 'hstore',
+)
+
+tests += {
+  'name': 'hstore',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore',
+    ],
+  },
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..bbafa0221bd
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,43 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+hstore_plperl_sources = files(
+  'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+  hstore_plperl_sources,
+  include_directories: [plperl_inc, hstore_inc],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+contrib_targets += hstore_plperl
+
+install_data(
+  'hstore_plperl.control',
+  'hstore_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'hstore_plperlu.control',
+  'hstore_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'hstore_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'hstore_plperl',
+      'hstore_plperlu',
+      'create_transform',
+    ],
+  },
+}
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..214b48519a9
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,37 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+hstore_plpython_sources = files(
+  'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+  hstore_plpython_sources,
+  include_directories: [plpython_inc, hstore_inc, ],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += hstore_plpython
+
+install_data(
+  'hstore_plpython3u--1.0.sql',
+  'hstore_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = [
+  'hstore_plpython'
+]
+
+tests += {
+  'name': 'hstore_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': hstore_plpython_regress,
+    'regress_args': ['--load-extension=hstore'],
+  },
+}
diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build
new file mode 100644
index 00000000000..a0f39366f47
--- /dev/null
+++ b/contrib/intagg/meson.build
@@ -0,0 +1,6 @@
+install_data(
+  'intagg.control',
+  'intagg--1.0--1.1.sql',
+  'intagg--1.1.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
new file mode 100644
index 00000000000..1655bcbb3fd
--- /dev/null
+++ b/contrib/intarray/meson.build
@@ -0,0 +1,37 @@
+intarray_sources = files(
+  '_int_bool.c',
+  '_int_gin.c',
+  '_int_gist.c',
+  '_int_op.c',
+  '_int_selfuncs.c',
+  '_int_tool.c',
+  '_intbig_gist.c',
+)
+
+intarray = shared_module('_int',
+  intarray_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += intarray
+
+install_data(
+  'intarray.control',
+  'intarray--1.0--1.1.sql',
+  'intarray--1.1--1.2.sql',
+  'intarray--1.2.sql',
+  'intarray--1.2--1.3.sql',
+  'intarray--1.3--1.4.sql',
+  'intarray--1.4--1.5.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'intarray',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      '_int',
+    ],
+  },
+}
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
new file mode 100644
index 00000000000..cc30bbeb55c
--- /dev/null
+++ b/contrib/isn/meson.build
@@ -0,0 +1,33 @@
+isn_sources = files(
+  'isn.c',
+)
+
+isn = shared_module('isn',
+  isn_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += isn
+
+install_data(
+  'isn.control',
+  'isn--1.0--1.1.sql',
+  'isn--1.1--1.2.sql',
+  'isn--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'isn.h',
+  install_dir: dir_include_extension / 'isn',
+)
+
+tests += {
+  'name': 'isn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'isn',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..5c915d8ed94
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,43 @@
+if not perl_dep.found()
+  subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+  'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+  jsonb_plperl_sources,
+  include_directories: [plperl_inc],
+  kwargs: contrib_mod_args + {
+    'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+    'install_rpath': ':'.join(mod_install_rpaths + ['@0@/CORE'.format(archlibexp)]),
+    'build_rpath': '@0@/CORE'.format(archlibexp),
+  },
+)
+contrib_targets += jsonb_plperl
+
+install_data(
+  'jsonb_plperl.control',
+  'jsonb_plperl--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'jsonb_plperlu.control',
+  'jsonb_plperlu--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'jsonb_plperl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'jsonb_plperl',
+      'jsonb_plperlu',
+    ],
+  },
+}
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..de8e1105c6a
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+  'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+  jsonb_plpython_sources,
+  include_directories: [plpython_inc],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += jsonb_plpython
+
+install_data(
+  'jsonb_plpython3u.control',
+  'jsonb_plpython3u--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = [
+  'jsonb_plpython'
+]
+
+tests += {
+  'name': 'jsonb_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': jsonb_plpython_regress,
+  },
+}
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
new file mode 100644
index 00000000000..9082d5713c7
--- /dev/null
+++ b/contrib/lo/meson.build
@@ -0,0 +1,27 @@
+lo_sources = files(
+  'lo.c',
+)
+
+lo = shared_module('lo',
+  lo_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += lo
+
+install_data(
+  'lo.control',
+  'lo--1.0--1.1.sql',
+  'lo--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'lo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'lo',
+    ],
+  },
+}
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
new file mode 100644
index 00000000000..9463fc2c5e5
--- /dev/null
+++ b/contrib/ltree/meson.build
@@ -0,0 +1,44 @@
+ltree_sources = files(
+  '_ltree_gist.c',
+  '_ltree_op.c',
+  'crc32.c',
+  'lquery_op.c',
+  'ltree_gist.c',
+  'ltree_io.c',
+  'ltree_op.c',
+  'ltxtquery_io.c',
+  'ltxtquery_op.c',
+)
+
+# .. so that includes of ltree/ltree.h work
+ltree_inc = include_directories('.', '../')
+
+ltree = shared_module('ltree',
+  ltree_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += ltree
+
+install_data(
+  'ltree.control',
+  'ltree--1.0--1.1.sql',
+  'ltree--1.1--1.2.sql',
+  'ltree--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'ltree.h',
+  install_dir: dir_include_extension / 'ltree',
+)
+
+tests += {
+  'name': 'ltree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ltree',
+    ],
+  },
+}
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
new file mode 100644
index 00000000000..429d75006aa
--- /dev/null
+++ b/contrib/ltree_plpython/meson.build
@@ -0,0 +1,37 @@
+if not python3_dep.found()
+  subdir_done()
+endif
+
+ltree_plpython_sources = files(
+  'ltree_plpython.c',
+)
+
+ltree_plpython = shared_module('ltree_plpython3',
+  ltree_plpython_sources,
+  include_directories: [plpython_inc, ltree_inc],
+  c_args: ['-DPLPYTHON_LIBNAME="plpython3"'],
+  kwargs: contrib_mod_args + {
+    'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += ltree_plpython
+
+install_data(
+  'ltree_plpython3u--1.0.sql',
+  'ltree_plpython3u.control',
+  kwargs: contrib_data_args,
+)
+
+ltree_plpython_regress = [
+  'ltree_plpython'
+]
+
+tests += {
+  'name': 'ltree_plpython',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': ltree_plpython_regress,
+    'regress_args': ['--load-extension=ltree'],
+  },
+}
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..84752d4bd0f
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,66 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = dir_data_extension
+contrib_data_args = {
+  'install_dir': contrib_data_dir,
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('basic_archive')
+subdir('bloom')
+subdir('basebackup_to_shell')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+subdir('intagg')
+subdir('intarray')
+subdir('isn')
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+subdir('lo')
+subdir('ltree')
+subdir('ltree_plpython')
+subdir('oid2name')
+subdir('old_snapshot')
+subdir('pageinspect')
+subdir('passwordcheck')
+subdir('pg_buffercache')
+subdir('pgcrypto')
+subdir('pg_freespacemap')
+subdir('pg_prewarm')
+subdir('pgrowlocks')
+subdir('pg_stat_statements')
+subdir('pgstattuple')
+subdir('pg_surgery')
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('pg_walinspect')
+subdir('postgres_fdw')
+subdir('seg')
+subdir('sepgsql')
+subdir('spi')
+subdir('sslinfo')
+# start-scripts doesn't contain build products
+subdir('tablefunc')
+subdir('tcn')
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+subdir('uuid-ossp')
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..1dad5d8f6e7
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,17 @@
+oid2name = executable('oid2name',
+  ['oid2name.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+contrib_targets += oid2name
+
+tests += {
+  'name': 'oid2name',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
new file mode 100644
index 00000000000..8e7ee09a43a
--- /dev/null
+++ b/contrib/old_snapshot/meson.build
@@ -0,0 +1,15 @@
+old_snapshot_sources = files(
+  'time_mapping.c',
+)
+
+old_snapshot = shared_module('old_snapshot',
+  old_snapshot_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += old_snapshot
+
+install_data(
+  'old_snapshot.control',
+  'old_snapshot--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..4af8153e4fd
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,50 @@
+pageinspect_sources = files(
+  'brinfuncs.c',
+  'btreefuncs.c',
+  'fsmfuncs.c',
+  'ginfuncs.c',
+  'gistfuncs.c',
+  'hashfuncs.c',
+  'heapfuncs.c',
+  'rawpage.c',
+)
+
+pageinspect = shared_module('pageinspect',
+  pageinspect_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pageinspect
+
+install_data(
+  'pageinspect--1.0--1.1.sql',
+  'pageinspect--1.1--1.2.sql',
+  'pageinspect--1.2--1.3.sql',
+  'pageinspect--1.3--1.4.sql',
+  'pageinspect--1.4--1.5.sql',
+  'pageinspect--1.5--1.6.sql',
+  'pageinspect--1.5.sql',
+  'pageinspect--1.6--1.7.sql',
+  'pageinspect--1.7--1.8.sql',
+  'pageinspect--1.8--1.9.sql',
+  'pageinspect--1.9--1.10.sql',
+  'pageinspect.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pageinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'page',
+      'btree',
+      'brin',
+      'gin',
+      'gist',
+      'hash',
+      'checksum',
+      'oldextversions',
+    ],
+  },
+}
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
new file mode 100644
index 00000000000..7da47d02f1d
--- /dev/null
+++ b/contrib/passwordcheck/meson.build
@@ -0,0 +1,30 @@
+passwordcheck_sources = files(
+  'passwordcheck.c',
+)
+
+passwordcheck_c_args = []
+passwordcheck_deps = []
+
+# uncomment the following two lines to enable cracklib support
+# passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
+# passwordcheck_deps += [cc.find_library('crack')]
+
+passwordcheck = shared_module('passwordcheck',
+  passwordcheck_sources,
+  c_args: passwordcheck_c_args,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args.get('dependencies') + passwordcheck_deps,
+  }
+)
+contrib_targets += passwordcheck
+
+tests += {
+  'name': 'passwordcheck',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'passwordcheck',
+    ],
+  },
+}
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
new file mode 100644
index 00000000000..2c69eae3ea2
--- /dev/null
+++ b/contrib/pg_buffercache/meson.build
@@ -0,0 +1,27 @@
+pg_buffercache = shared_module('pg_buffercache',
+  files(
+    'pg_buffercache_pages.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_buffercache
+
+install_data(
+  'pg_buffercache--1.0--1.1.sql',
+  'pg_buffercache--1.1--1.2.sql',
+  'pg_buffercache--1.2--1.3.sql',
+  'pg_buffercache--1.2.sql',
+  'pg_buffercache.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_buffercache',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_buffercache',
+    ],
+  },
+}
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
new file mode 100644
index 00000000000..f795014d7ca
--- /dev/null
+++ b/contrib/pg_freespacemap/meson.build
@@ -0,0 +1,29 @@
+pg_freespacemap = shared_module('pg_freespacemap',
+  files(
+    'pg_freespacemap.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_freespacemap
+
+install_data(
+  'pg_freespacemap--1.0--1.1.sql',
+  'pg_freespacemap--1.1--1.2.sql',
+  'pg_freespacemap--1.1.sql',
+  'pg_freespacemap.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_freespacemap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_freespacemap',
+    ],
+    'regress_args': [
+      '--temp-config', files('pg_freespacemap.conf')
+    ],
+  },
+}
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..bdca9af4f27
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,27 @@
+pg_prewarm = shared_module('pg_prewarm',
+  files(
+    'autoprewarm.c',
+    'pg_prewarm.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_prewarm
+
+install_data(
+  'pg_prewarm--1.0--1.1.sql',
+  'pg_prewarm--1.1--1.2.sql',
+  'pg_prewarm--1.1.sql',
+  'pg_prewarm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_prewarm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..ac117d2fc1d
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,35 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+  files('pg_stat_statements.c'),
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+contrib_targets += pg_stat_statements
+
+install_data(
+  'pg_stat_statements.control',
+  'pg_stat_statements--1.4.sql',
+  'pg_stat_statements--1.9--1.10.sql',
+  'pg_stat_statements--1.8--1.9.sql',
+  'pg_stat_statements--1.7--1.8.sql',
+  'pg_stat_statements--1.6--1.7.sql',
+  'pg_stat_statements--1.5--1.6.sql',
+  'pg_stat_statements--1.4--1.5.sql',
+  'pg_stat_statements--1.3--1.4.sql',
+  'pg_stat_statements--1.2--1.3.sql',
+  'pg_stat_statements--1.1--1.2.sql',
+  'pg_stat_statements--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_stat_statements',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_stat_statements',
+    ],
+    'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+  },
+}
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
new file mode 100644
index 00000000000..ac71caa5276
--- /dev/null
+++ b/contrib/pg_surgery/meson.build
@@ -0,0 +1,25 @@
+pg_surgery = shared_module('pg_surgery',
+  files(
+    'heap_surgery.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_surgery
+
+install_data(
+  'pg_surgery--1.0.sql',
+  'pg_surgery.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pg_surgery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'heap_surgery',
+    ],
+  },
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..a90628d23c6
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,35 @@
+pg_trgm = shared_module('pg_trgm',
+  files(
+    'trgm_gin.c',
+    'trgm_gist.c',
+    'trgm_op.c',
+    'trgm_regexp.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_trgm
+
+install_data(
+  'pg_trgm--1.0--1.1.sql',
+  'pg_trgm--1.1--1.2.sql',
+  'pg_trgm--1.2--1.3.sql',
+  'pg_trgm--1.3--1.4.sql',
+  'pg_trgm--1.3.sql',
+  'pg_trgm--1.4--1.5.sql',
+  'pg_trgm--1.5--1.6.sql',
+  'pg_trgm.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_trgm',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_trgm',
+      'pg_word_trgm',
+      'pg_strict_word_trgm',
+    ],
+  },
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..933dc99ac4d
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,26 @@
+pg_visibility = shared_module('pg_visibility',
+  files(
+    'pg_visibility.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pg_visibility
+
+install_data(
+  'pg_visibility--1.0--1.1.sql',
+  'pg_visibility--1.1--1.2.sql',
+  'pg_visibility--1.1.sql',
+  'pg_visibility.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_visibility',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_visibility',
+    ],
+  },
+}
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
new file mode 100644
index 00000000000..d6b27877dd0
--- /dev/null
+++ b/contrib/pg_walinspect/meson.build
@@ -0,0 +1,27 @@
+pg_walinspect_sources = files('pg_walinspect.c')
+
+pg_walinspect = shared_module('pg_walinspect',
+  pg_walinspect_sources,
+  kwargs: contrib_mod_args + {
+      'dependencies': contrib_mod_args['dependencies'],
+  },
+)
+contrib_targets += pg_walinspect
+
+install_data(
+  'pg_walinspect.control',
+  'pg_walinspect--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pg_walinspect',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pg_walinspect',
+    ],
+    'regress_args': ['--temp-config', files('walinspect.conf')],
+  },
+}
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
new file mode 100644
index 00000000000..fe0851bf8e8
--- /dev/null
+++ b/contrib/pgcrypto/meson.build
@@ -0,0 +1,100 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+pgcrypto_sources = files(
+  'crypt-blowfish.c',
+  'crypt-des.c',
+  'crypt-gensalt.c',
+  'crypt-md5.c',
+  'mbuf.c',
+  'pgcrypto.c',
+  'pgp-armor.c',
+  'pgp-cfb.c',
+  'pgp-compress.c',
+  'pgp-decrypt.c',
+  'pgp-encrypt.c',
+  'pgp-info.c',
+  'pgp-mpi.c',
+  'pgp-pgsql.c',
+  'pgp-pubdec.c',
+  'pgp-pubenc.c',
+  'pgp-pubkey.c',
+  'pgp-s2k.c',
+  'pgp.c',
+  'px-crypt.c',
+  'px-hmac.c',
+  'px.c',
+)
+
+pgcrypto_regress = [
+  'init',
+  'md5',
+  'sha1',
+  'hmac-md5',
+  'hmac-sha1',
+  'blowfish',
+  'rijndael',
+  'sha2',
+  'des',
+  '3des',
+  'cast5',
+  'crypt-des',
+  'crypt-md5',
+  'crypt-blowfish',
+  'crypt-xdes',
+  'pgp-armor',
+  'pgp-decrypt',
+  'pgp-encrypt',
+  'pgp-pubkey-decrypt',
+  'pgp-pubkey-encrypt',
+  'pgp-info',
+]
+
+pgcrypto_openssl_sources = files(
+  'openssl.c',
+  'pgp-mpi-openssl.c',
+)
+
+pgcrypto_deps = []
+pgcrypto_link_with = []
+
+pgcrypto_deps += ssl
+pgcrypto_sources += pgcrypto_openssl_sources
+
+if zlib.found()
+  pgcrypto_deps += zlib
+  pgcrypto_regress += 'pgp-compression'
+else
+  pgcrypto_regress += 'pgp-zlib-DISABLED'
+endif
+
+pgcrypto = shared_module('pgcrypto',
+  pgcrypto_sources,
+  link_with: pgcrypto_link_with,
+  kwargs: contrib_mod_args + {
+    'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
+  },
+)
+contrib_targets += pgcrypto
+
+install_data(
+  'pgcrypto--1.0--1.1.sql',
+  'pgcrypto--1.1--1.2.sql',
+  'pgcrypto--1.2--1.3.sql',
+  'pgcrypto--1.3.sql',
+  'pgcrypto.control',
+  kwargs: contrib_data_args,
+)
+
+
+tests += {
+  'name': 'pgcrypto',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      pgcrypto_regress,
+    ],
+  },
+}
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
new file mode 100644
index 00000000000..1b41691a2a3
--- /dev/null
+++ b/contrib/pgrowlocks/meson.build
@@ -0,0 +1,27 @@
+pgrowlocks = shared_module('pgrowlocks',
+  files(
+    'pgrowlocks.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pgrowlocks
+
+install_data(
+  'pgrowlocks--1.0--1.1.sql',
+  'pgrowlocks--1.1--1.2.sql',
+  'pgrowlocks--1.2.sql',
+  'pgrowlocks.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pgrowlocks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'pgrowlocks',
+    ],
+    'regress_args': ['--load-extension=pgrowlocks'],
+  },
+}
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
new file mode 100644
index 00000000000..8e828692d5c
--- /dev/null
+++ b/contrib/pgstattuple/meson.build
@@ -0,0 +1,31 @@
+pgstattuple = shared_module('pgstattuple',
+  files(
+    'pgstatapprox.c',
+    'pgstatindex.c',
+    'pgstattuple.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += pgstattuple
+
+install_data(
+  'pgstattuple--1.0--1.1.sql',
+  'pgstattuple--1.1--1.2.sql',
+  'pgstattuple--1.2--1.3.sql',
+  'pgstattuple--1.3--1.4.sql',
+  'pgstattuple--1.4--1.5.sql',
+  'pgstattuple--1.4.sql',
+  'pgstattuple.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'pgstattuple',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'pgstattuple',
+    ],
+  },
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..378885ec93b
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,34 @@
+postgres_fdw_sources = files(
+  'connection.c',
+  'deparse.c',
+  'option.c',
+  'postgres_fdw.c',
+  'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': contrib_mod_args['dependencies'] + [libpq],
+  },
+)
+contrib_targets += postgres_fdw
+
+install_data(
+  'postgres_fdw.control',
+  'postgres_fdw--1.0.sql',
+  'postgres_fdw--1.0--1.1.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'postgres_fdw',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'postgres_fdw',
+    ],
+    'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+  },
+}
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
new file mode 100644
index 00000000000..e476eab2a77
--- /dev/null
+++ b/contrib/seg/meson.build
@@ -0,0 +1,51 @@
+seg_sources = files(
+  'seg.c',
+)
+
+seg_scan = custom_target('segscan',
+  input: 'segscan.l',
+  output: 'segscan.c',
+  command: flex_cmd,
+)
+generated_sources += seg_scan
+seg_sources += seg_scan
+
+seg_parse = custom_target('segparse',
+  input: 'segparse.y',
+  kwargs: bison_kw,
+)
+generated_sources += seg_parse.to_list()
+seg_sources += seg_parse
+
+seg = shared_module('seg',
+  seg_sources,
+  include_directories: include_directories('.'),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += seg
+
+install_data(
+  'seg.control',
+  'seg--1.0--1.1.sql',
+  'seg--1.1--1.2.sql',
+  'seg--1.1.sql',
+  'seg--1.2--1.3.sql',
+  'seg--1.3--1.4.sql',
+  kwargs: contrib_data_args,
+)
+
+install_headers(
+  'segdata.h',
+  install_dir: dir_include_extension / 'seg',
+)
+
+tests += {
+  'name': 'seg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'seg',
+    ],
+  },
+}
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
new file mode 100644
index 00000000000..60a95e17c2f
--- /dev/null
+++ b/contrib/sepgsql/meson.build
@@ -0,0 +1,34 @@
+if not selinux.found()
+  subdir_done()
+endif
+
+sepgsql_sources = files(
+  'database.c',
+  'dml.c',
+  'hooks.c',
+  'label.c',
+  'proc.c',
+  'relation.c',
+  'schema.c',
+  'selinux.c',
+  'uavc.c',
+)
+
+sepgsql = shared_module('sepgsql',
+  sepgsql_sources,
+  kwargs: contrib_mod_args + {
+    'dependencies': [selinux, contrib_mod_args['dependencies']],
+  }
+)
+contrib_targets += sepgsql
+
+custom_target('sepgsql.sql',
+  input: 'sepgsql.sql.in',
+  output: 'sepgsql.sql',
+  command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'],
+  capture: true,
+  install: true,
+  install_dir: contrib_data_args['install_dir'],
+)
+
+# TODO: implement sepgsql tests
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..98008980ec2
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,50 @@
+autoinc = shared_module('autoinc',
+  ['autoinc.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += autoinc
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+  ['insert_username.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += insert_username
+
+install_data(
+  'insert_username.control',
+  'insert_username--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+
+moddatetime = shared_module('moddatetime',
+  ['moddatetime.c'],
+  kwargs: contrib_mod_args,
+)
+contrib_targets += moddatetime
+
+install_data(
+  'moddatetime.control',
+  'moddatetime--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+  ['refint.c'],
+  c_args: refint_cflags,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += refint
+
+install_data('refint.control', 'refint--1.0.sql',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
new file mode 100644
index 00000000000..53f752a08ac
--- /dev/null
+++ b/contrib/sslinfo/meson.build
@@ -0,0 +1,21 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+sslinfo = shared_module('sslinfo',
+  files(
+    'sslinfo.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [ssl, contrib_mod_args['dependencies']],
+  }
+)
+contrib_targets += sslinfo
+
+install_data(
+  'sslinfo--1.0--1.1.sql',
+  'sslinfo--1.1--1.2.sql',
+  'sslinfo--1.2.sql',
+  'sslinfo.control',
+  kwargs: contrib_data_args,
+)
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
new file mode 100644
index 00000000000..f4230096c0c
--- /dev/null
+++ b/contrib/tablefunc/meson.build
@@ -0,0 +1,24 @@
+tablefunc = shared_module('tablefunc',
+  files(
+    'tablefunc.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tablefunc
+
+install_data(
+  'tablefunc--1.0.sql',
+  'tablefunc.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tablefunc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tablefunc',
+    ],
+  },
+}
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
new file mode 100644
index 00000000000..c3a025247d4
--- /dev/null
+++ b/contrib/tcn/meson.build
@@ -0,0 +1,25 @@
+tcn = shared_module('tcn',
+  files(
+    'tcn.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tcn
+
+install_data(
+  'tcn--1.0.sql',
+  'tcn.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tcn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'tcn',
+    ],
+    'regress_args': ['--load-extension=tcn'],
+  },
+}
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..dd7cb0101ad
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,63 @@
+test_decoding_sources = files(
+  'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+  test_decoding_sources,
+  kwargs: contrib_mod_args,
+)
+contrib_targets += test_decoding
+
+tests += {
+  'name': 'test_decoding',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'ddl',
+      'xact',
+      'rewrite',
+      'toast',
+      'permissions',
+      'decoding_in_xact',
+      'decoding_into_rel',
+      'binary',
+      'prepared',
+      'replorigin',
+      'time',
+      'messages',
+      'spill',
+      'slot',
+      'truncate',
+      'stream',
+      'stats',
+      'twophase',
+      'twophase_stream',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'isolation': {
+    'specs': [
+      'mxact',
+      'delayed_startup',
+      'ondisk_startup',
+      'concurrent_ddl_dml',
+      'oldest_xmin',
+      'snapshot_transfer',
+      'subxact_without_top',
+      'concurrent_stream',
+      'twophase_snapshot',
+      'slot_creation_error',
+    ],
+    'regress_args': [
+      '--temp-config', files('logical.conf'),
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_repl_stats.pl',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..b9cd42115a8
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,24 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+  files(
+    'tsm_system_rows.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tsm_system_rows
+
+install_data(
+  'tsm_system_rows--1.0.sql',
+  'tsm_system_rows.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_rows',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_rows',
+    ],
+  },
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..18015912ffb
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,24 @@
+tsm_system_time = shared_module('tsm_system_time',
+  files(
+    'tsm_system_time.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += tsm_system_time
+
+install_data(
+  'tsm_system_time--1.0.sql',
+  'tsm_system_time.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'tsm_system_time',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'tsm_system_time',
+    ],
+  },
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..872b76e3223
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,32 @@
+unaccent = shared_module('unaccent',
+  files(
+    'unaccent.c',
+  ),
+  kwargs: contrib_mod_args,
+)
+contrib_targets += unaccent
+
+install_data(
+  'unaccent--1.0--1.1.sql',
+  'unaccent--1.1.sql',
+  'unaccent.control',
+  kwargs: contrib_data_args,
+)
+
+install_data(
+  'unaccent.rules',
+  install_dir: dir_data / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+tests += {
+  'name': 'unaccent',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'unaccent',
+    ],
+    'regress_args': ['--encoding=UTF8'],
+  },
+}
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
new file mode 100644
index 00000000000..da6d1d75c12
--- /dev/null
+++ b/contrib/uuid-ossp/meson.build
@@ -0,0 +1,31 @@
+if not uuid.found()
+  subdir_done()
+endif
+
+uuid_ossp = shared_module('uuid-ossp',
+  files(
+    'uuid-ossp.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [uuid, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += uuid_ossp
+
+install_data(
+  'uuid-ossp--1.0--1.1.sql',
+  'uuid-ossp--1.1.sql',
+  'uuid-ossp.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'uuid-ossp',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'uuid_ossp',
+    ],
+  },
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..7a632b87d1b
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,17 @@
+vacuumlo = executable('vacuumlo',
+  ['vacuumlo.c'],
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args,
+)
+contrib_targets += vacuumlo
+
+tests += {
+  'name': 'vacuumlo',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_basic.pl',
+    ],
+  },
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..9c0b56f01f6
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,32 @@
+if not libxml.found()
+  subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+  files(
+    'xpath.c',
+    'xslt_proc.c',
+  ),
+  kwargs: contrib_mod_args + {
+    'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+  },
+)
+contrib_targets += xml2
+
+install_data(
+  'xml2--1.0--1.1.sql',
+  'xml2--1.1.sql',
+  'xml2.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'xml2',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'xml2',
+    ],
+  },
+}
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
new file mode 100644
index 00000000000..5887cb92b52
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -0,0 +1,22 @@
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_compat = both_libraries('libecpg_compat',
+  'informix.c',
+  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
+  dependencies: [frontend_code, thread_dep],
+  link_with: [ecpglib, ecpg_pgtypes],
+  soversion: host_system != 'windows' ? '3' : '',
+  darwin_versions: ['3', '3.' + pg_version_major.to_string()],
+  version: '3.' + pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+ecpg_targets += [ecpg_compat.get_shared_lib(), ecpg_compat.get_static_lib()]
+
+pkgconfig.generate(
+  ecpg_compat.get_shared_lib(),
+  description: 'PostgreSQL libecpg_compat library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
new file mode 100644
index 00000000000..2da029ec8ea
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -0,0 +1,37 @@
+ecpglib_sources = files(
+  'connect.c',
+  'data.c',
+  'descriptor.c',
+  'error.c',
+  'execute.c',
+  'memory.c',
+  'misc.c',
+  'prepare.c',
+  'sqlda.c',
+  'typename.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpglib = both_libraries('libecpg',
+  ecpglib_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=6'],
+  dependencies: [frontend_code, libpq, thread_dep],
+  link_with: [ecpg_pgtypes],
+  soversion: host_system != 'windows' ? '6' : '',
+  darwin_versions: ['6', '6.' + pg_version_major.to_string()],
+  version: '6.' + pg_version_major.to_string(),
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+ecpg_targets += [ecpglib.get_shared_lib(), ecpglib.get_static_lib()]
+
+pkgconfig.generate(
+  ecpglib.get_shared_lib(),
+  description: 'PostgreSQL libecpg library',
+  url: pg_url,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build
new file mode 100644
index 00000000000..246e399ebd3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build
new file mode 100644
index 00000000000..c95d0455b9a
--- /dev/null
+++ b/src/interfaces/ecpg/include/meson.build
@@ -0,0 +1,51 @@
+ecpg_inc = include_directories('.')
+
+ecpg_conf_keys = [
+  'ENABLE_THREAD_SAFETY',
+  'HAVE_INT64',
+  'HAVE_LONG_INT_64',
+  'HAVE_LONG_LONG_INT_64',
+  'PG_USE_STDBOOL',
+]
+
+ecpg_conf_data = configuration_data()
+
+foreach key : ecpg_conf_keys
+  if cdata.has(key)
+    ecpg_conf_data.set(key, cdata.get(key))
+  endif
+endforeach
+
+ecpg_config_h = configure_file(
+  output: 'ecpg_config.h',
+  configuration: ecpg_conf_data,
+  install_dir: dir_include,
+)
+configure_files += ecpg_config_h
+
+generated_sources_ac += {'src/interfaces/ecpg/include': ['stamp-h']}
+
+install_headers(
+  'ecpg_informix.h',
+  'ecpgerrno.h',
+  'ecpglib.h',
+  'ecpgtype.h',
+  'pgtypes.h',
+  'pgtypes_date.h',
+  'pgtypes_error.h',
+  'pgtypes_interval.h',
+  'pgtypes_numeric.h',
+  'pgtypes_timestamp.h',
+  'sql3types.h',
+  'sqlca.h',
+  'sqlda.h',
+  'sqlda-compat.h',
+  'sqlda-native.h',
+)
+
+install_headers(
+  'datetime.h',
+  'decimal.h',
+  'sqltypes.h',
+  install_dir: dir_include_pkg / 'informix' / 'esql',
+)
diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build
new file mode 100644
index 00000000000..f079b42269f
--- /dev/null
+++ b/src/interfaces/ecpg/meson.build
@@ -0,0 +1,9 @@
+ecpg_targets = []
+
+subdir('include')
+subdir('pgtypeslib')
+subdir('ecpglib')
+subdir('compatlib')
+subdir('preproc')
+
+alias_target('ecpg', ecpg_targets)
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
new file mode 100644
index 00000000000..96489d9f1d7
--- /dev/null
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -0,0 +1,30 @@
+ecpg_pgtypes_sources = files(
+  'common.c',
+  'datetime.c',
+  'dt_common.c',
+  'interval.c',
+  'numeric.c',
+  'timestamp.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_pgtypes = both_libraries('libpgtypes',
+  ecpg_pgtypes_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc],
+  c_args: ['-DSO_MAJOR_VERSION=3'],
+  dependencies: [frontend_code],
+  version: '3.' + pg_version_major.to_string(),
+  soversion: host_system != 'windows' ? '3' : '',
+  darwin_versions: ['3', '3.' + pg_version_major.to_string()],
+  link_args: export_fmt.format(export_file.full_path()),
+  link_depends: export_file,
+  kwargs: default_lib_args,
+)
+ecpg_targets += [ecpg_pgtypes.get_shared_lib(), ecpg_pgtypes.get_static_lib()]
+
+pkgconfig.generate(
+  ecpg_pgtypes.get_shared_lib(),
+  description: 'PostgreSQL libpgtypes library',
+  url: pg_url,
+)
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
new file mode 100644
index 00000000000..1be49c8c27f
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -0,0 +1,104 @@
+ecpg_sources = files(
+  '../ecpglib/typename.c',
+  'c_keywords.c',
+  'descriptor.c',
+  'ecpg.c',
+  'ecpg_keywords.c',
+  'keywords.c',
+  'output.c',
+  'parser.c',
+  'type.c',
+  'variable.c',
+)
+
+pgc = custom_target('pgc.c',
+  input: 'pgc.l',
+  output: 'pgc.c',
+  command: flex_cmd,
+)
+generated_sources += pgc
+ecpg_sources += pgc
+
+ecpg_files = [
+  'ecpg.addons',
+  'ecpg.header',
+  'ecpg.tokens',
+  'ecpg.trailer',
+  'ecpg.type',
+]
+
+preproc_y = custom_target('preproc.y',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: ['preproc.y'],
+  command: [
+    perl, files('parse.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--output', '@OUTPUT0@',
+  ],
+)
+generated_sources += preproc_y
+
+check_rules = custom_target('preproc.y.check_rules',
+  input: [
+    '../../../backend/parser/gram.y',
+    ecpg_files,
+  ],
+  output: 'preproc.y.check_rules',
+  command: [
+    perl, files('check_rules.pl'),
+    '--srcdir', '@CURRENT_SOURCE_DIR@',
+    '--parser', '@INPUT0@',
+    '--stamp', '@OUTPUT0@',
+  ],
+)
+
+preproc = custom_target('preproc.c',
+  input: preproc_y,
+  kwargs: bison_kw,
+)
+generated_sources += preproc.to_list()
+ecpg_sources += preproc
+
+c_kwlist = custom_target('c_kwlist_d.h',
+  input: ['c_kwlist.h'],
+  output: ['c_kwlist_d.h'],
+  depends: check_rules,
+  command: [
+    perl,
+    '-I', '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanCKeywords',
+    '--no-case-fold', '@INPUT0@',
+  ],
+)
+generated_sources += c_kwlist
+ecpg_sources += c_kwlist
+
+ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
+  input: ['ecpg_kwlist.h'],
+  output: ['ecpg_kwlist_d.h'],
+  command: [
+    perl, '-I',
+    '@SOURCE_ROOT@/src/tools',
+    '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+    '--output', '@OUTDIR@',
+    '--varname', 'ScanECPGKeywords', '@INPUT0@',
+  ]
+)
+generated_sources += ecpg_kwlist
+ecpg_sources += ecpg_kwlist
+
+ecpg_exe = executable('ecpg',
+  ecpg_sources,
+  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args,
+)
+ecpg_targets += ecpg_exe
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build
new file mode 100644
index 00000000000..d73b05afd5e
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpg-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/test/compat_informix/meson.build b/src/interfaces/ecpg/test/compat_informix/meson.build
new file mode 100644
index 00000000000..6bb0d980761
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_informix/meson.build
@@ -0,0 +1,31 @@
+pgc_files = [
+  'charfuncs',
+  'dec_test',
+  'describe',
+  'rfmtdate',
+  'rfmtlong',
+  'rnull',
+  'sqlda',
+  'test_informix',
+  'test_informix2',
+]
+
+pgc_extra_flags = {
+  'rnull': ['-r', 'no_indicator',],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'INFORMIX',] +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/compat_oracle/meson.build b/src/interfaces/ecpg/test/compat_oracle/meson.build
new file mode 100644
index 00000000000..2e8794ba386
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_oracle/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+  'char_array',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    output: '@BASENAME@.c',
+    command: ecpg_preproc_test_command_start +
+      ['-C', 'ORACLE',] +
+      ecpg_preproc_test_command_end,
+    install: false,
+    build_by_default: false,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/connect/meson.build b/src/interfaces/ecpg/test/connect/meson.build
new file mode 100644
index 00000000000..0b1c3593146
--- /dev/null
+++ b/src/interfaces/ecpg/test/connect/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+  'test1',
+  'test2',
+  'test3',
+  'test4',
+  'test5',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start + ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
new file mode 100644
index 00000000000..bd2489f2bb1
--- /dev/null
+++ b/src/interfaces/ecpg/test/meson.build
@@ -0,0 +1,79 @@
+pg_regress_ecpg_sources = pg_regress_c + files(
+  'pg_regress_ecpg.c',
+)
+
+pg_regress_ecpg = executable('pg_regress_ecpg',
+  pg_regress_ecpg_sources,
+  c_args: pg_regress_cflags,
+  include_directories: [pg_regress_inc, include_directories('.')],
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install': false
+  },
+)
+testprep_targets += pg_regress_ecpg
+
+# create .c files and executables from .pgc files
+ecpg_test_exec_kw = {
+  'dependencies': [frontend_code, libpq],
+  'include_directories': [ecpg_inc],
+  'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+  'build_by_default': false,
+  'install': false,
+}
+
+ecpg_preproc_kw = {
+  'output': '@BASENAME@.c',
+  'install': false,
+  'build_by_default': false,
+}
+
+ecpg_preproc_test_command_start = [
+  ecpg_exe,
+  '--regression',
+  '-I@CURRENT_SOURCE_DIR@',
+  '-I@SOURCE_ROOT@' + '/src/interfaces/ecpg/include/',
+]
+ecpg_preproc_test_command_end = [
+  '-o', '@OUTPUT@', '@INPUT@'
+]
+
+ecpg_test_dependencies = []
+
+subdir('compat_informix')
+subdir('compat_oracle')
+subdir('connect')
+subdir('pgtypeslib')
+subdir('preproc')
+subdir('sql')
+subdir('thread')
+
+testprep_targets += ecpg_test_dependencies
+
+ecpg_test_files = files(
+  'ecpg_schedule',
+)
+
+ecpg_regress_args = [
+  '--dbname=ecpg1_regression,ecpg2_regression',
+  '--create-role=regress_ecpg_user1,regress_ecpg_user2',
+  '--encoding=SQL_ASCII',
+]
+
+tests += {
+  'name': 'ecpg',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'ecpg': {
+    'expecteddir': meson.current_source_dir(),
+    'inputdir': meson.current_build_dir(),
+    'schedule': ecpg_test_files,
+    'sql': [
+      'sql/twophase',
+    ],
+    'test_kwargs': {
+      'depends': meson.is_cross_build() ? [] : ecpg_test_dependencies,
+    },
+    'regress_args': ecpg_regress_args,
+  },
+}
diff --git a/src/interfaces/ecpg/test/pgtypeslib/meson.build b/src/interfaces/ecpg/test/pgtypeslib/meson.build
new file mode 100644
index 00000000000..2957f12abfc
--- /dev/null
+++ b/src/interfaces/ecpg/test/pgtypeslib/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'dt_test',
+  'dt_test2',
+  'num_test',
+  'num_test2',
+  'nan_test',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/preproc/meson.build b/src/interfaces/ecpg/test/preproc/meson.build
new file mode 100644
index 00000000000..0608df2f2a2
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/meson.build
@@ -0,0 +1,37 @@
+pgc_files = [
+  'array_of_struct',
+  'autoprep',
+  'comment',
+  'cursor',
+  'define',
+  'init',
+  'outofscope',
+  'pointer_to_struct',
+  'strings',
+  'type',
+  'variable',
+  'whenever',
+  'whenever_do_continue',
+]
+
+pgc_extra_flags = {
+  'array_of_struct': ['-c'],
+  'pointer_to_struct': ['-c'],
+  'autoprep': ['-r', 'prepare'],
+  'strings': ['-i'],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/sql/meson.build b/src/interfaces/ecpg/test/sql/meson.build
new file mode 100644
index 00000000000..bec7d4ed8f6
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/meson.build
@@ -0,0 +1,46 @@
+pgc_files = [
+  'array',
+  'binary',
+  'bytea',
+  'code100',
+  'copystdout',
+  'createtableas',
+  'declare',
+  'define',
+  'desc',
+  'describe',
+  'dynalloc',
+  'dynalloc2',
+  'dyntest',
+  'execute',
+  'fetch',
+  'func',
+  'indicators',
+  'insupd',
+  'oldexec',
+  'parser',
+  'prepareas',
+  'quote',
+  'show',
+  'sqlda',
+  'twophase',
+]
+
+pgc_extra_flags = {
+  'oldexec': ['-r', 'questionmarks'],
+}
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      pgc_extra_flags.get(pgc_file, []) +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw,
+  )
+endforeach
diff --git a/src/interfaces/ecpg/test/thread/meson.build b/src/interfaces/ecpg/test/thread/meson.build
new file mode 100644
index 00000000000..2f1629e266b
--- /dev/null
+++ b/src/interfaces/ecpg/test/thread/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+  'thread_implicit',
+  'thread',
+  'prep',
+  'descriptor',
+  'alloc',
+]
+
+foreach pgc_file : pgc_files
+  exe_input = custom_target('@0@.c'.format(pgc_file),
+    input: '@0@.pgc'.format(pgc_file),
+    command: ecpg_preproc_test_command_start +
+      ecpg_preproc_test_command_end,
+    kwargs: ecpg_preproc_kw,
+  )
+
+  ecpg_test_dependencies += executable(pgc_file,
+    exe_input,
+    kwargs: ecpg_test_exec_kw + {'dependencies': [frontend_code, libpq, thread_dep,]},
+  )
+endforeach
diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build
new file mode 100644
index 00000000000..73fffbee394
--- /dev/null
+++ b/src/interfaces/meson.build
@@ -0,0 +1,2 @@
+# NB: libpq is entered directly from the toplevel meson file
+subdir('ecpg')
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
new file mode 100644
index 00000000000..ba2a261e7a4
--- /dev/null
+++ b/doc/src/sgml/meson.build
@@ -0,0 +1,254 @@
+docs = []
+alldocs = []
+doc_generated = []
+
+xmllint = find_program(get_option('XMLLINT'), native: true, required: false)
+
+
+version_sgml = configure_file(
+  input: 'version.sgml.in',
+  output: 'version.sgml',
+  configuration: cdata,
+)
+configure_files += version_sgml
+
+doc_generated += custom_target('features-supported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt',
+  ),
+  output: 'features-supported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'YES', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+doc_generated += custom_target('features-unsupported.sgml',
+  input: files(
+    '../../../src/backend/catalog/sql_feature_packages.txt',
+    '../../../src/backend/catalog/sql_features.txt',
+  ),
+  output: 'features-unsupported.sgml',
+  command: [perl, files('mk_feature_tables.pl'), 'NO', '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+doc_generated += custom_target('errcodes-table.sgml',
+  input: files(
+    '../../../src/backend/utils/errcodes.txt'),
+  output: 'errcodes-table.sgml',
+  command: [perl, files('generate-errcodes-table.pl'), '@INPUT@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+# FIXME: this actually has further inputs, adding depfile support to
+# generate-keywords-table.pl is probably the best way to address that
+# robustly.
+doc_generated += custom_target('keywords-table.sgml',
+  input: files(
+    '../../../src/include/parser/kwlist.h'),
+  output: 'keywords-table.sgml',
+  command: [perl, files('generate-keywords-table.pl'), '@CURRENT_SOURCE_DIR@'],
+  build_by_default: false,
+  install: false,
+  capture: true,
+)
+
+# For everything else we need at least xmllint
+if not xmllint.found()
+  subdir_done()
+endif
+
+pandoc = find_program('pandoc', native: true, required: false)
+xsltproc = find_program(get_option('XSLTPROC'), native: true, required: false)
+fop = find_program('fop', native: true, required: false)
+
+# Run validation only once, common to all subsequent targets.  While
+# we're at it, also resolve all entities (that is, copy all included
+# files into one big file).  This helps tools that don't understand
+# vpath builds (such as dbtoepub).
+postgres_full_xml = custom_target('postgres-full.xml',
+  input: 'postgres.sgml',
+  output: 'postgres-full.xml',
+  command: [xmllint, '--noent', '--valid', '--path', '@OUTDIR@', '-o', '@OUTPUT@', '@INPUT@'],
+  depends: doc_generated,
+  build_by_default: false,
+)
+docs += postgres_full_xml
+alldocs += postgres_full_xml
+
+
+#
+# Full documentation as html, text
+#
+if xsltproc.found()
+  xsltproc_flags = [
+    '--stringparam', 'pg.version', pg_version,
+    '--param', 'website.stylesheet', '1'
+  ]
+
+
+  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
+  # depfile
+  html = custom_target('html',
+    input: ['stylesheet.xsl', postgres_full_xml],
+    output: 'html',
+    depends: doc_generated,
+    command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html
+
+  # build multi-page html docs as part of docs target
+  docs += html
+
+  html_help = custom_target('html_help',
+    input: ['stylesheet-hh.xsl', postgres_full_xml],
+    output: 'htmlhelp',
+    depends: doc_generated,
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += html_help
+
+
+  # single-page HTML
+  postgres_html = custom_target('postgres.html',
+    input: ['stylesheet-html-nochunk.xsl', postgres_full_xml],
+    output: 'postgres.html',
+    depends: doc_generated,
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_html
+
+  # single-page text
+  if pandoc.found()
+    postgres_txt = custom_target('postgres.txt',
+      input: [postgres_html],
+      output: 'postgres.txt',
+      depends: doc_generated,
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_txt
+  endif
+endif
+
+
+#
+# INSTALL in html, text
+#
+if xsltproc.found()
+  install_xml = custom_target('INSTALL.xml',
+    input: ['standalone-profile.xsl', 'standalone-install.xml'],
+    output: 'INSTALL.xml',
+    depends: doc_generated + [postgres_full_xml],
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+    build_by_default: false,
+  )
+  install_html = custom_target('INSTALL.html',
+    input: ['stylesheet-text.xsl', install_xml],
+    output: 'INSTALL.html',
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += install_html
+
+  if pandoc.found()
+    # XXX: Makefile does an iconv translit here, but unclear why?
+    install = custom_target('INSTALL',
+      input: [install_html],
+      output: 'INSTALL',
+      command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+    alldocs += install
+  endif
+
+endif
+
+
+#
+# Man pages
+#
+if xsltproc.found()
+  # FIXME: implement / consider sqlmansectnum logic
+  man = custom_target('man',
+    input: ['stylesheet-man.xsl', postgres_full_xml],
+    output: ['man1', 'man3', 'man7'],
+    depends: doc_generated,
+    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    build_by_default: false,
+  )
+
+  # build by default as part of docs target
+  docs += man
+endif
+
+
+#
+# Full documentation as PDF
+#
+if fop.found() and xsltproc.found()
+  xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
+
+  foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
+    postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+    postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
+
+    postgres_x_fo = custom_target(postgres_x_fo_f,
+      input: ['stylesheet-fo.xsl', postgres_full_xml],
+      output: [postgres_x_fo_f],
+      depends: doc_generated,
+      command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
+                '--stringparam', 'paper.type', detail,
+                '-o', '@OUTPUT@', '@INPUT@'],
+      build_by_default: false,
+    )
+
+    postgres_x_pdf = custom_target(postgres_x_pdf_f,
+      input: [postgres_x_fo],
+      output: [postgres_x_pdf_f],
+      command: [fop, '-fo', '@INPUT@', '-pdf', '@OUTPUT@'],
+      build_by_default: false,
+    )
+    alldocs += postgres_x_pdf
+  endforeach
+endif
+
+
+#
+# epub
+#
+
+# This was previously implemented using dbtoepub - but that doesn't seem to
+# support running in build != source directory (i.e. VPATH builds already
+# weren't supported).
+if pandoc.found() and xsltproc.found()
+  postgres_epub = custom_target('postgres.epub',
+    input: postgres_full_xml,
+    output: 'postgres.epub',
+    command: [pandoc, '-f', 'docbook', '-t', 'epub', '-o', '@OUTPUT@', '--resource-path=@CURRENT_SOURCE_DIR@',
+              '@INPUT@'],
+    build_by_default: false,
+  )
+  alldocs += postgres_epub
+endif
+
+if docs.length() == 0
+  run_target('docs', command: [missing, 'xsltproc'])
+else
+  alias_target('docs', docs)
+endif
+
+if alldocs.length() == 0
+  run_target('alldocs', command: [missing, 'xsltproc'])
+else
+  alias_target('alldocs', alldocs)
+endif
diff --git a/doc/src/sgml/version.sgml.in b/doc/src/sgml/version.sgml.in
new file mode 100644
index 00000000000..fa5ff343f40
--- /dev/null
+++ b/doc/src/sgml/version.sgml.in
@@ -0,0 +1,2 @@
+<!ENTITY version @PG_VERSION@>
+<!ENTITY majorversion @PG_MAJORVERSION@>
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..2374028cbda
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'authentication',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_password.pl',
+      't/002_saslprep.pl',
+    ],
+  },
+}
diff --git a/src/test/icu/meson.build b/src/test/icu/meson.build
new file mode 100644
index 00000000000..5a4f53f37ff
--- /dev/null
+++ b/src/test/icu/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'icu',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/010_database.pl',
+    ],
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..c7656fd4609
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,58 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+  'isolation_main.c',
+)
+
+isolationtester_sources = files(
+  'isolationtester.c',
+)
+
+spec_scanner = custom_target('specscanner',
+  input: 'specscanner.l',
+  output: 'specscanner.c',
+  command: flex_cmd,
+)
+isolationtester_sources += spec_scanner
+generated_sources += spec_scanner
+
+spec_parser = custom_target('specparse',
+  input: 'specparse.y',
+  kwargs: bison_kw,
+)
+isolationtester_sources += spec_parser
+generated_sources += spec_parser.to_list()
+
+pg_isolation_regress = executable('pg_isolation_regress',
+  isolation_sources,
+  c_args: pg_regress_cflags,
+  include_directories: pg_regress_inc,
+  dependencies: frontend_code,
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+bin_targets += pg_isolation_regress
+
+isolationtester = executable('isolationtester',
+  isolationtester_sources,
+  include_directories: include_directories('.'),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/isolation',
+  },
+)
+bin_targets += isolationtester
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'schedule': files('isolation_schedule'),
+    'test_kwargs': {
+      'priority': 40,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..7e2b6733fcc
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,15 @@
+tests += {
+  'name': 'kerberos',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # kerberos tests are slow, start early
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env': {
+      'with_gssapi': gssapi.found() ? 'yes' : 'no',
+      'with_krb_srvnam': 'postgres',
+    },
+  },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..2211bd5e3ec
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'ldap',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_auth.pl',
+    ],
+    'env': {'with_ldap': ldap.found() ? 'yes' : 'no'},
+  },
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..241d9d48aa5
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,25 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+  subdir('ssl')
+endif
+
+if ldap.found()
+  subdir('ldap')
+endif
+
+if gssapi.found()
+  subdir('kerberos')
+endif
+
+if icu.found()
+  subdir('icu')
+endif
+
+subdir('perl')
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..58254d093a4
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,16 @@
+tests += {
+  'name': 'brin',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'summarization-and-inprogress-insertion',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/01_workitems.pl',
+      't/02_wal_consistency.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..60cb12164d2
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,18 @@
+tests += {
+  'name': 'commit_ts',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'commit_timestamp',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+      't/002_standby.pl',
+      't/003_standby_2.pl',
+      't/004_restart.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..cf4bdaba637
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,18 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+  ['delay_execution.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += delay_execution
+
+tests += {
+  'name': 'delay_execution',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'specs': [
+      'partition-addition',
+      'partition-removal-1',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..56ff5f48001
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+  ['dummy_index_am.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += dummy_index_am
+
+install_data(
+  'dummy_index_am.control',
+  'dummy_index_am--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_index_am',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'reloptions',
+    ],
+  },
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..21b7cf8f353
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+  ['dummy_seclabel.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += dummy_seclabel
+
+install_data(
+  'dummy_seclabel.control',
+  'dummy_seclabel--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'dummy_seclabel',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'dummy_seclabel',
+    ],
+  },
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..8384b6e3b2a
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,21 @@
+libpq_pipeline = executable('libpq_pipeline',
+  files(
+    'libpq_pipeline.c',
+  ),
+  dependencies: [frontend_code, libpq],
+  kwargs: default_bin_args + {
+    'install': false,
+  },
+)
+testprep_targets += libpq_pipeline
+
+tests += {
+  'name': 'libpq_pipeline',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_libpq_pipeline.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..a80e6e2ce29
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,27 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_lfind')
+subdir('test_misc')
+subdir('test_oat_hooks')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..45de3f1990d
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+  ['plsample.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += plsample
+
+install_data(
+  'plsample.control',
+  'plsample--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'plsample',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'plsample',
+    ],
+  },
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..efd3f1f113b
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,14 @@
+tests += {
+  'name': 'snapshot_too_old',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'isolation': {
+    'test_kwargs': {'priority': 40}, # sto tests are slow, start early
+    'specs': [
+      'sto_using_cursor',
+      'sto_using_select',
+      'sto_using_hash_index',
+    ],
+    'regress_args': ['--temp-config', files('sto.conf')],
+  },
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..857fc7e140e
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+  ['spgist_name_ops.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += spgist_name_ops
+
+install_data(
+  'spgist_name_ops.control',
+  'spgist_name_ops--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'spgist_name_ops',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'spgist_name_ops',
+    ],
+  },
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..a57bd0693a3
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,48 @@
+if not ssl.found()
+  subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+  ['ssl_passphrase_func.c'],
+  kwargs: pg_mod_args + {
+    'dependencies': [ssl, pg_mod_args['dependencies']],
+  },
+)
+testprep_targets += ssl_passphrase_callback
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+  cert = custom_target('server.crt',
+    output: ['server.crt', 'server.ckey'],
+    command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+      '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+    build_by_default: false,
+    install: false,
+  )
+
+  # needs to agree with what's in the test script
+  pass = 'FooBaR1'
+
+  custom_target('server.key',
+    input: [cert[1]],
+    output: ['server.key'],
+    command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+  )
+endif
+
+tests += {
+  'name': 'ssl_passphrase_callback',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_testfunc.pl',
+    ],
+    'env': {'with_ssl': 'openssl'},
+  },
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..945eb5a70c4
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+  ['test_bloomfilter.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_bloomfilter
+
+install_data(
+  'test_bloomfilter.control',
+  'test_bloomfilter--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_bloomfilter',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_bloomfilter',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..81ad5adc526
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,43 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+  ['test_ddl_deparse.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_ddl_deparse
+
+install_data(
+  'test_ddl_deparse.control',
+  'test_ddl_deparse--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ddl_deparse',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ddl_deparse',
+      'create_extension',
+      'create_schema',
+      'create_type',
+      'create_conversion',
+      'create_domain',
+      'create_sequence_1',
+      'create_table',
+      'create_transform',
+      'alter_table',
+      'create_view',
+      'create_trigger',
+      'create_rule',
+      'comment_on',
+      'alter_function',
+      'alter_sequence',
+      'alter_ts_config',
+      'alter_type_enum',
+      'opfamily',
+      'defprivs',
+      'matviews',
+    ],
+  },
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..e95a9f2e7eb
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,45 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_ext1--1.0.sql',
+  'test_ext1.control',
+  'test_ext2--1.0.sql',
+  'test_ext2.control',
+  'test_ext3--1.0.sql',
+  'test_ext3.control',
+  'test_ext4--1.0.sql',
+  'test_ext4.control',
+  'test_ext5--1.0.sql',
+  'test_ext5.control',
+  'test_ext6--1.0.sql',
+  'test_ext6.control',
+  'test_ext7--1.0--2.0.sql',
+  'test_ext7--1.0.sql',
+  'test_ext7.control',
+  'test_ext8--1.0.sql',
+  'test_ext8.control',
+  'test_ext_cine--1.0.sql',
+  'test_ext_cine--1.0--1.1.sql',
+  'test_ext_cine.control',
+  'test_ext_cor--1.0.sql',
+  'test_ext_cor.control',
+  'test_ext_cyclic1--1.0.sql',
+  'test_ext_cyclic1.control',
+  'test_ext_cyclic2--1.0.sql',
+  'test_ext_cyclic2.control',
+  'test_ext_evttrig--1.0--2.0.sql',
+  'test_ext_evttrig--1.0.sql',
+  'test_ext_evttrig.control',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_extensions',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_extensions',
+      'test_extdepend',
+    ],
+  },
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..abf0a3b0430
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+  ['test_ginpostinglist.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_ginpostinglist
+
+install_data(
+  'test_ginpostinglist.control',
+  'test_ginpostinglist--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_ginpostinglist',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_ginpostinglist',
+    ],
+  },
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..c32c469c69a
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+  ['test_integerset.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_integerset
+
+install_data(
+  'test_integerset.control',
+  'test_integerset--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_integerset',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_integerset',
+    ],
+  },
+}
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
new file mode 100644
index 00000000000..a388de1156a
--- /dev/null
+++ b/src/test/modules/test_lfind/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_lfind = shared_module('test_lfind',
+  ['test_lfind.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_lfind
+
+install_data(
+  'test_lfind.control',
+  'test_lfind--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_lfind',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_lfind',
+    ],
+  },
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..cfc830ff399
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,12 @@
+tests += {
+  'name': 'test_misc',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'tests': [
+      't/001_constraint_validation.pl',
+      't/002_tablespace.pl',
+      't/003_check_guc.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
new file mode 100644
index 00000000000..5faf0459777
--- /dev/null
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -0,0 +1,18 @@
+# FIXME: prevent install during main install, but not during test :/
+test_oat_hooks = shared_module('test_oat_hooks',
+  ['test_oat_hooks.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_oat_hooks
+
+tests += {
+  'name': 'test_oat_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_oat_hooks',
+    ],
+    'regress_args': ['--no-locale', '--encoding=UTF8'],
+  },
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..b59960f615e
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+  ['test_parser.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_parser
+
+install_data(
+  'test_parser.control',
+  'test_parser--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_parser',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_parser',
+    ],
+  },
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..41021829f3a
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+  'test_pg_dump.control',
+  'test_pg_dump--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_pg_dump',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_pg_dump',
+    ],
+  },
+  'tap': {
+    'tests': [
+      't/001_base.pl',
+    ],
+  },
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..1cfa84b3609
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+  ['test_predtest.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_predtest
+
+install_data(
+  'test_predtest.control',
+  'test_predtest--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_predtest',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_predtest',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..34cbc3e1624
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+  ['test_rbtree.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_rbtree
+
+install_data(
+  'test_rbtree.control',
+  'test_rbtree--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_rbtree',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rbtree',
+    ],
+  },
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..867a64e57c3
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,24 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+  ['test_regex.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_regex
+
+install_data(
+  'test_regex.control',
+  'test_regex--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_regex',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_regex',
+      'test_regex_utf8',
+    ],
+  },
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..80d8adda332
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+  ['test_rls_hooks.c'],
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_rls_hooks
+
+tests += {
+  'name': 'test_rls_hooks',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_rls_hooks',
+    ],
+  },
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..b663543d616
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,27 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+  files(
+    'setup.c',
+    'test.c',
+    'worker.c',
+  ),
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_shm_mq
+
+install_data(
+  'test_shm_mq.control',
+  'test_shm_mq--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'test_shm_mq',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'test_shm_mq',
+    ],
+  },
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..d69b0e7ce44
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,11 @@
+tests += {
+  'name': 'unsafe_tests',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'rolenames',
+      'alter_system_table',
+    ],
+  },
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..32acad883b2
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,26 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+  files(
+    'worker_spi.c',
+  ),
+  kwargs: pg_mod_args,
+)
+testprep_targets += test_worker_spi
+
+install_data(
+  'worker_spi.control',
+  'worker_spi--1.0.sql',
+  kwargs: contrib_data_args,
+)
+
+tests += {
+  'name': 'worker_spi',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'sql': [
+      'worker_spi',
+    ],
+    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+  },
+}
diff --git a/src/test/perl/meson.build b/src/test/perl/meson.build
new file mode 100644
index 00000000000..901bae7a564
--- /dev/null
+++ b/src/test/perl/meson.build
@@ -0,0 +1,12 @@
+# could use install_data's preserve_path option in >=0.64.0
+
+install_data(
+  'PostgreSQL/Version.pm',
+  install_dir: dir_pgxs / 'src/test/perl/PostgreSQL')
+
+install_data(
+  'PostgreSQL/Test/Utils.pm',
+  'PostgreSQL/Test/SimpleTee.pm',
+  'PostgreSQL/Test/RecursiveCopy.pm',
+  'PostgreSQL/Test/Cluster.pm',
+  install_dir: dir_pgxs / 'src/test/perl/PostgreSQL/Test')
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..b0e398363f7
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,43 @@
+tests += {
+  'name': 'recovery',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'test_kwargs': {'priority': 40}, # recovery tests are slow, start early
+    'tests': [
+      't/001_stream_rep.pl',
+      't/002_archiving.pl',
+      't/003_recovery_targets.pl',
+      't/004_timeline_switch.pl',
+      't/005_replay_delay.pl',
+      't/006_logical_decoding.pl',
+      't/007_sync_rep.pl',
+      't/008_fsm_truncation.pl',
+      't/009_twophase.pl',
+      't/010_logical_decoding_timelines.pl',
+      't/011_crash_recovery.pl',
+      't/012_subtransactions.pl',
+      't/013_crash_restart.pl',
+      't/014_unlogged_reinit.pl',
+      't/015_promotion_pages.pl',
+      't/016_min_consistency.pl',
+      't/017_shm.pl',
+      't/018_wal_optimize.pl',
+      't/019_replslot_limit.pl',
+      't/020_archive_status.pl',
+      't/021_row_visibility.pl',
+      't/022_crash_temp_files.pl',
+      't/023_pitr_prepared_xact.pl',
+      't/024_archive_recovery.pl',
+      't/025_stuck_on_old_timeline.pl',
+      't/026_overwrite_contrecord.pl',
+      't/027_stream_regress.pl',
+      't/028_pitr_timelines.pl',
+      't/029_stats_restart.pl',
+      't/030_stats_cleanup_replica.pl',
+      't/031_recovery_conflict.pl',
+      't/032_relfilenode_reuse.pl',
+      't/033_replay_tsp_drops.pl',
+    ],
+  },
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..fd8ee995b79
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,62 @@
+# also used by isolationtester and ecpg tests
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+  'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+  regress_sources,
+  c_args: pg_regress_cflags,
+  dependencies: [frontend_code],
+  kwargs: default_bin_args + {
+    'install_dir': dir_pgxs / 'src/test/regress',
+  },
+)
+bin_targets += pg_regress
+
+regress_module = shared_module('regress',
+  ['regress.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+testprep_targets += regress_module
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+autoinc_regress = shared_module('autoinc',
+  ['../../../contrib/spi/autoinc.c'],
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+testprep_targets += autoinc_regress
+
+refint_regress = shared_module('refint',
+  ['../../../contrib/spi/refint.c'],
+  c_args: refint_cflags,
+  kwargs: pg_mod_args + {
+    'install': false,
+  },
+)
+testprep_targets += refint_regress
+
+
+tests += {
+  'name': 'main',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'regress': {
+    'schedule': files('parallel_schedule'),
+    'test_kwargs': {
+      'priority': 50,
+      'timeout': 1000,
+    },
+  },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..e2f021d884a
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,13 @@
+tests += {
+  'name': 'ssl',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_ssl': get_option('ssl')},
+    'tests': [
+      't/001_ssltests.pl',
+      't/002_scram.pl',
+      't/003_sslinfo.pl',
+    ],
+  },
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..85d1dd92951
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,42 @@
+tests += {
+  'name': 'subscription',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+    'tests': [
+      't/001_rep_changes.pl',
+      't/002_types.pl',
+      't/003_constraints.pl',
+      't/004_sync.pl',
+      't/005_encoding.pl',
+      't/006_rewrite.pl',
+      't/007_ddl.pl',
+      't/008_diff_schema.pl',
+      't/009_matviews.pl',
+      't/010_truncate.pl',
+      't/011_generated.pl',
+      't/012_collation.pl',
+      't/013_partition.pl',
+      't/014_binary.pl',
+      't/015_stream.pl',
+      't/016_stream_subxact.pl',
+      't/017_stream_ddl.pl',
+      't/018_stream_subxact_abort.pl',
+      't/019_stream_subxact_ddl_abort.pl',
+      't/020_messages.pl',
+      't/021_twophase.pl',
+      't/022_twophase_cascade.pl',
+      't/023_twophase_stream.pl',
+      't/024_add_drop_pub.pl',
+      't/025_rep_changes_for_schema.pl',
+      't/026_stats.pl',
+      't/027_nosuperuser.pl',
+      't/028_row_filter.pl',
+      't/029_on_error.pl',
+      't/030_origin.pl',
+      't/031_column_list.pl',
+      't/100_bugs.pl',
+    ],
+  },
+}
diff --git a/configure b/configure
index 4efed743a1a..1caca21b625 100755
--- a/configure
+++ b/configure
@@ -20658,3 +20658,9 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/configure.ac b/configure.ac
index 967f7e72090..10fa55dd154 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2472,3 +2472,9 @@ AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
                   [echo >src/interfaces/ecpg/include/stamp-h])
 
 AC_OUTPUT
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+  touch meson.build
+fi
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..b1464ec7413
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,3025 @@
+# Entry point for building PostgreSQL with meson
+#
+# Good starting points for writing meson.build files are:
+#  - https://mesonbuild.com/Syntax.html
+#  - https://mesonbuild.com/Reference-manual.html
+
+project('postgresql',
+  ['c'],
+  version: '16devel',
+  license: 'PostgreSQL',
+
+  # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for
+  # RHEL 7 has 0.55. < 0.54 would require replacing some uses of the fs
+  # module, < 0.53 all uses of fs. So far there's no need to go to >=0.56.
+  meson_version: '>=0.54',
+  default_options: [
+    'warning_level=1', #-Wall equivalent
+    'buildtype=release',
+  ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+fs = import('fs')
+pkgconfig = import('pkgconfig')
+
+host_system = host_machine.system()
+host_cpu = host_machine.cpu_family()
+
+cc = meson.get_compiler('c')
+
+not_found_dep = dependency('', required: false)
+thread_dep = dependency('threads')
+
+
+
+###############################################################
+# Safety first
+###############################################################
+
+# It's very easy to get into confusing states when the source directory
+# contains an in-place build. E.g. the wrong pg_config.h will be used. So just
+# refuse to build in that case.
+#
+# There's a more elaborate check later, that checks for conflicts around all
+# generated files. But we can only do that much further down the line, so this
+# quick check seems worth it. Adhering to this advice should clean up the
+# conflict, but won't protect against somebody doing make distclean or just
+# removing pg_config.h
+errmsg_nonclean_base = '''
+****
+Non-clean source code directory detected.
+
+To build with meson the source tree may not have an in-place, ./configure
+style, build configured. You can have both meson and ./configure style builds
+for the same source tree by building out-of-source / VPATH with
+configure. Alternatively use a separate check out for meson based builds.
+
+@0@
+****'''
+if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h')
+  errmsg_cleanup = 'To clean up, run make maintainer-clean in the source tree.'
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Variables to be determined
+###############################################################
+
+postgres_inc_d = ['src/include']
+postgres_inc_d += get_option('extra_include_dirs')
+
+postgres_lib_d = get_option('extra_lib_dirs')
+
+cppflags = []
+
+cflags = []
+cxxflags = []
+cflags_warn = []
+cxxflags_warn = []
+cflags_mod = []
+cxxflags_mod = []
+
+ldflags = []
+ldflags_be = []
+ldflags_sl = []
+ldflags_mod = []
+
+test_c_args = []
+
+os_deps = []
+backend_both_deps = []
+backend_deps = []
+libpq_deps = []
+
+pg_sysroot = ''
+
+# source of data for pg_config.h etc
+cdata = configuration_data()
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+  pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+  pg_version_arr = [pg_version.split('beta')[0], '0']
+elif pg_version.contains('rc')
+  pg_version_arr = [pg_version.split('rc')[0], '0']
+else
+  pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+pg_version_num = (pg_version_major * 10000) + pg_version_minor
+
+pg_url = 'https://www.postgresql.org/'
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', pg_url)
+cdata.set_quoted('PACKAGE_VERSION', pg_version)
+cdata.set_quoted('PACKAGE_STRING', 'PostgreSQL @0@'.format(pg_version))
+cdata.set_quoted('PACKAGE_TARNAME', 'postgresql')
+
+pg_version += get_option('extra_version')
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+  pg_version, build_machine.cpu_family(), cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
+cdata.set('PG_VERSION_NUM', pg_version_num)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Basic platform specific configuration
+###############################################################
+
+# meson's system names don't quite map to our "traditional" names. In some
+# places we need the "traditional" name, e.g., for mapping
+# src/include/port/$os.h to src/include/pg_config_os.h. Define portname for
+# that purpose.
+portname = host_system
+
+exesuffix = '' # overridden below where necessary
+dlsuffix = '.so' # overridden below where necessary
+library_path_var = 'LD_LIBRARY_PATH'
+
+# Format of file to control exports from libraries, and how to pass them to
+# the compiler. For export_fmt @0@ is the path to the file export file.
+export_file_format = 'gnu'
+export_file_suffix = 'list'
+export_fmt = '-Wl,--version-script=@0@'
+
+# Flags to add when linking a postgres extension, @0@ is path to
+# the relevant object on the platform.
+mod_link_args_fmt = []
+
+memset_loop_limit = 1024
+
+# Choice of shared memory and semaphore implementation
+shmem_kind = 'sysv'
+sema_kind = 'sysv'
+
+# We implement support for some operating systems by pretending they're
+# another. Map here, before determining system properties below
+if host_system == 'dragonfly'
+  # apparently the most similar
+  host_system = 'netbsd'
+endif
+
+if host_system == 'aix'
+  ld_library_path_var = 'LIBPATH'
+
+  export_file_format = 'aix'
+  export_fmt = '-Wl,-bE:@0@'
+  mod_link_args_fmt = ['-Wl,-bI:@0@']
+  mod_link_with_dir = 'libdir'
+  mod_link_with_name = '@0@.imp'
+
+  # M:SRE sets a flag indicating that an object is a shared library. Seems to
+  # work in some circumstances without, but required in others.
+  ldflags_sl += '-Wl,-bM:SRE'
+  ldflags_be += '-Wl,-brtllib'
+
+  # Native memset() is faster, tested on:
+  # - AIX 5.1 and 5.2, XLC 6.0 (IBM's cc)
+  # - AIX 5.3 ML3, gcc 4.0.1
+  memset_loop_limit = 0
+
+elif host_system == 'cygwin'
+  cppflags += '-D_GNU_SOURCE'
+
+elif host_system == 'darwin'
+  dlsuffix = '.dylib'
+  ld_library_path_var = 'DYLD_LIBRARY_PATH'
+
+  export_file_format = 'darwin'
+  export_fmt = '-exported_symbols_list=@0@'
+
+  mod_link_args_fmt = ['-bundle_loader', '@0@']
+  mod_link_with_dir = 'bindir'
+  mod_link_with_name = '@0@'
+
+  sysroot_args = [files('src/tools/darwin_sysroot'), get_option('darwin_sysroot')]
+  pg_sysroot = run_command(sysroot_args, check:true).stdout().strip()
+  message('darwin sysroot: @0@'.format(pg_sysroot))
+  cflags += ['-isysroot', pg_sysroot]
+  ldflags += ['-isysroot', pg_sysroot]
+
+elif host_system == 'freebsd'
+  sema_kind = 'unnamed_posix'
+
+elif host_system == 'linux'
+  sema_kind = 'unnamed_posix'
+  cppflags += '-D_GNU_SOURCE'
+
+elif host_system == 'netbsd'
+  # We must resolve all dynamic linking in the core server at program start.
+  # Otherwise the postmaster can self-deadlock due to signals interrupting
+  # resolution of calls, since NetBSD's linker takes a lock while doing that
+  # and some postmaster signal handlers do things that will also acquire that
+  # lock.  As long as we need "-z now", might as well specify "-z relro" too.
+  # While there's not a hard reason to adopt these settings for our other
+  # executables, there's also little reason not to, so just add them to
+  # LDFLAGS.
+  ldflags += ['-Wl,-z,now', '-Wl,-z,relro']
+
+elif host_system == 'openbsd'
+  # you're ok
+
+elif host_system == 'sunos'
+  portname = 'solaris'
+  export_fmt = '-Wl,-M@0@'
+  cppflags += '-D_POSIX_PTHREAD_SEMANTICS'
+
+elif host_system == 'windows'
+  portname = 'win32'
+  exesuffix = '.exe'
+  dlsuffix = '.dll'
+  ld_library_path_var = ''
+
+  export_file_format = 'win'
+  export_file_suffix = 'def'
+  if cc.get_id() == 'msvc'
+    export_fmt = '/DEF:@0@'
+    mod_link_with_name = '@0@.exe.lib'
+  else
+    export_fmt = '@0@'
+    mod_link_with_name = 'lib@0@.exe.a'
+  endif
+  mod_link_args_fmt = ['@0@']
+  mod_link_with_dir = 'libdir'
+
+  shmem_kind = 'win32'
+  sema_kind = 'win32'
+
+  cdata.set('WIN32_STACK_RLIMIT', 4194304)
+  if cc.get_id() == 'msvc'
+    ldflags += '/INCREMENTAL:NO'
+    ldflags += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+    # ldflags += '/nxcompat' # generated by msbuild, should have it for ninja?
+  else
+    ldflags += '-Wl,--stack,@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+  endif
+
+  os_deps += cc.find_library('ws2_32', required: true)
+  secur32_dep = cc.find_library('secur32', required: true)
+  backend_deps += secur32_dep
+  libpq_deps += secur32_dep
+
+  postgres_inc_d += 'src/include/port/win32'
+  if cc.get_id() == 'msvc'
+    postgres_inc_d += 'src/include/port/win32_msvc'
+  endif
+
+  windows = import('windows')
+
+else
+  # XXX: Should we add an option to override the host_system as an escape
+  # hatch?
+  error('unknown host system: @0@'.format(host_system))
+endif
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true, native: true)
+python = find_program(get_option('PYTHON'), required: true, native: true)
+flex = find_program(get_option('FLEX'), native: true, version: '>= 2.5.31')
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'), native: true)
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
+touch = find_program('touch', native: true)
+program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
+dtrace = find_program(get_option('DTRACE'), native: true, required: get_option('dtrace'))
+missing = find_program('config/missing', native: true)
+
+# used by PGXS
+install_sh = find_program('config/install-sh', native: true)
+
+bison_flags = []
+if bison.found()
+  bison_version_c = run_command(bison, '--version', check: true)
+  # bison version string helpfully is something like
+  # >>bison (GNU bison) 3.8.1<<
+  bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+  if bison_version.version_compare('>=3.0')
+    bison_flags += ['-Wno-deprecated']
+  endif
+endif
+bison_cmd = [bison, bison_flags, '-o', '@OUTPUT0@', '-d', '@INPUT@']
+bison_kw = {
+  'output': ['@BASENAME@.c', '@BASENAME@.h'],
+  'command': bison_cmd,
+}
+
+flex_flags = []
+flex_wrapper = files('src/tools/pgflex')
+flex_cmd = [python, flex_wrapper,
+  '--builddir', '@BUILD_ROOT@',
+  '--srcdir', '@SOURCE_ROOT@',
+  '--privatedir', '@PRIVATE_DIR@',
+  '--flex', flex, '--perl', perl,
+  '-i', '@INPUT@', '-o', '@OUTPUT0@',
+]
+
+wget = find_program('wget', required: false, native: true)
+wget_flags = ['-O', '@OUTPUT0@', '--no-use-server-timestamps']
+
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# NB: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(python, 'src/tools/find_meson', check: true)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+  error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+    meson_binpath_r.returncode(),
+    meson_binpath_r.stdout(),
+    meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+  error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_impl = ''
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+  if i == 0
+    meson_impl = e
+  elif i == 1
+    meson_binpath = e
+  else
+    meson_args += e
+  endif
+  i += 1
+endforeach
+
+if meson_impl not in ['muon', 'meson']
+  error('unknown meson implementation "@0@"'.format(meson_impl))
+endif
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
+
+cdata.set('BLCKSZ', get_option('blocksize').to_int() * 1024, description:
+'''Size of a disk block --- this also limits the size of a tuple. You can set
+   it bigger if you need bigger tuples (although TOAST should reduce the need
+   to have large tuples, since fields can be spread across multiple tuples).
+   BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is
+   currently 2^15 (32768). This is determined by the 15-bit widths of the
+   lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).
+   Changing BLCKSZ requires an initdb.''')
+
+cdata.set('XLOG_BLCKSZ', get_option('wal_blocksize').to_int() * 1024)
+cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
+cdata.set('DEF_PGPORT', get_option('pgport'))
+cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport').to_string())
+cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb_srvnam'))
+if get_option('system_tzdata') != ''
+  cdata.set_quoted('SYSTEMTZDIR', get_option('system_tzdata'))
+endif
+
+
+
+###############################################################
+# Directories
+###############################################################
+
+# These are set by the equivalent --xxxdir configure options.  We
+# append "postgresql" to some of them, if the string does not already
+# contain "pgsql" or "postgres", in order to avoid directory clutter.
+
+pkg = 'postgresql'
+
+dir_prefix = get_option('prefix')
+
+dir_bin = get_option('bindir')
+
+dir_data = get_option('datadir')
+if not (dir_data.contains('pgsql') or dir_data.contains('postgres'))
+  dir_data = dir_data / pkg
+endif
+
+dir_sysconf = get_option('sysconfdir')
+if not (dir_sysconf.contains('pgsql') or dir_sysconf.contains('postgres'))
+  dir_sysconf = dir_sysconf / pkg
+endif
+
+dir_lib = get_option('libdir')
+
+dir_lib_pkg = dir_lib
+if not (dir_lib_pkg.contains('pgsql') or dir_lib_pkg.contains('postgres'))
+  dir_lib_pkg = dir_lib_pkg / pkg
+endif
+
+dir_pgxs = dir_lib_pkg / 'pgxs'
+
+dir_include = get_option('includedir')
+
+dir_include_pkg = dir_include
+dir_include_pkg_rel = ''
+if not (dir_include_pkg.contains('pgsql') or dir_include_pkg.contains('postgres'))
+  dir_include_pkg = dir_include_pkg / pkg
+  dir_include_pkg_rel = pkg
+endif
+
+dir_man = get_option('mandir')
+
+# FIXME: These used to be separately configurable - worth adding?
+dir_doc = get_option('datadir') / 'doc' / 'postgresql'
+dir_doc_html = dir_doc
+
+dir_locale = get_option('localedir')
+
+
+# Derived values
+dir_bitcode = dir_lib_pkg / 'bitcode'
+dir_include_internal = dir_include_pkg / 'internal'
+dir_include_server = dir_include_pkg / 'server'
+dir_include_extension = dir_include_server / 'extension'
+dir_data_extension = dir_data / 'extension'
+
+
+
+###############################################################
+# Search paths, preparation for compiler tests
+#
+# NB: Arguments added later are not automatically used for subsequent
+# configuration-time checks (so they are more isolated). If they should be
+# used, they need to be added to test_c_args as well.
+###############################################################
+
+postgres_inc = [include_directories(postgres_inc_d)]
+test_lib_d = postgres_lib_d
+test_c_args = cppflags + cflags
+
+
+
+###############################################################
+# Library: bsd-auth
+###############################################################
+
+bsd_authopt = get_option('bsd_auth')
+bsd_auth = not_found_dep
+if cc.check_header('bsd_auth.h', required: bsd_authopt,
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('USE_BSD_AUTH', 1)
+  bsd_auth = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: bonjour
+#
+# For now don't search for DNSServiceRegister in a library - only Apple's
+# Bonjour implementation, which is always linked, works.
+###############################################################
+
+bonjouropt = get_option('bonjour')
+bonjour = dependency('', required : false)
+if cc.check_header('dns_sd.h', required: bonjouropt,
+    args: test_c_args, include_directories: postgres_inc) and \
+   cc.has_function('DNSServiceRegister',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('USE_BONJOUR', 1)
+  bonjour = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+krb_srvtab = ''
+have_gssapi = false
+if not gssapiopt.disabled()
+  gssapi = dependency('krb5-gssapi', required: gssapiopt)
+  have_gssapi = gssapi.found()
+
+  if not have_gssapi
+  elif cc.check_header('gssapi/gssapi.h', dependencies: gssapi, required: false,
+      args: test_c_args, include_directories: postgres_inc)
+    cdata.set('HAVE_GSSAPI_GSSAPI_H', 1)
+  elif cc.check_header('gssapi.h', args: test_c_args, dependencies: gssapi, required: gssapiopt)
+    cdata.set('HAVE_GSSAPI_H', 1)
+  else
+    have_gssapi = false
+  endif
+
+  if not have_gssapi
+  elif cc.has_function('gss_init_sec_context', dependencies: gssapi,
+      args: test_c_args, include_directories: postgres_inc)
+    cdata.set('ENABLE_GSS', 1)
+
+    krb_srvtab = 'FILE:/@0@/krb5.keytab)'.format(get_option('sysconfdir'))
+    cdata.set_quoted('PG_KRB_SRVTAB', krb_srvtab)
+  elif gssapiopt.enabled()
+    error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+  else
+    have_gssapi = false
+  endif
+endif
+if not have_gssapi
+  gssapi = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if host_system == 'windows'
+  ldap = cc.find_library('wldap32', required: ldapopt)
+  ldap_r = ldap
+else
+  # macos framework dependency is buggy for ldap (one can argue whether it's
+  # Apple's or meson's fault), leading to an endless recursion with ldap.h
+  # including itself. See https://github.com/mesonbuild/meson/issues/10002
+  # Luckily we only need pkg-config support, so the workaround isn't
+  # complicated.
+  ldap = dependency('ldap', method: 'pkg-config', required: false)
+  ldap_r = ldap
+
+  # Before 2.5 openldap didn't have a pkg-config file, and it might not be
+  # installed
+  if not ldap.found()
+    ldap = cc.find_library('ldap', required: ldapopt, dirs: test_lib_d,
+      has_headers: 'ldap.h', header_include_directories: postgres_inc)
+
+    # The separate ldap_r library only exists in OpenLDAP < 2.5, and if we
+    # have 2.5 or later, we shouldn't even probe for ldap_r (we might find a
+    # library from a separate OpenLDAP installation).  The most reliable
+    # way to check that is to check for a function introduced in 2.5.
+    if not ldap.found()
+      # don't have ldap, we shouldn't check for ldap_r
+    elif cc.has_function('ldap_verify_credentials',
+        dependencies: ldap, args: test_c_args)
+      ldap_r = ldap # ldap >= 2.5, no need for ldap_r
+    else
+
+      # Use ldap_r for FE if available, else assume ldap is thread-safe.
+      ldap_r = cc.find_library('ldap_r', required: false, dirs: test_lib_d,
+        has_headers: 'ldap.h', header_include_directories: postgres_inc)
+      if not ldap_r.found()
+        ldap_r = ldap
+      else
+        # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+        ldap_r = declare_dependency(dependencies: [ldap_r, thread_dep])
+      endif
+
+      # PostgreSQL sometimes loads libldap_r and plain libldap into the same
+      # process.  Check for OpenLDAP versions known not to tolerate doing so;
+      # assume non-OpenLDAP implementations are safe.  The dblink test suite
+      # exercises the hazardous interaction directly.
+      compat_test_code = '''
+#include <ldap.h>
+#if !defined(LDAP_VENDOR_VERSION) || \
+     (defined(LDAP_API_FEATURE_X_OPENLDAP) && \
+      LDAP_VENDOR_VERSION >= 20424 && LDAP_VENDOR_VERSION <= 20431)
+choke me
+#endif
+'''
+      if not cc.compiles(compat_test_code,
+          name: 'LDAP implementation compatible',
+          dependencies: ldap, args: test_c_args)
+        warning('''
+*** With OpenLDAP versions 2.4.24 through 2.4.31, inclusive, each backend
+*** process that loads libpq (via WAL receiver, dblink, or postgres_fdw) and
+*** also uses LDAP will crash on exit.''')
+      endif
+    endif
+  endif
+
+  # XXX: this shouldn't be tested in the windows case, but should be tested in
+  # the dependency() success case
+  if ldap.found() and cc.has_function('ldap_initialize',
+      dependencies: ldap, args: test_c_args)
+    cdata.set('HAVE_LDAP_INITIALIZE', 1)
+  endif
+endif
+
+if ldap.found()
+  assert(ldap_r.found())
+  cdata.set('USE_LDAP', 1)
+else
+  assert(not ldap_r.found())
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+  add_languages('cpp', required: true, native: false)
+  llvm = dependency('llvm', version: '>=3.9', method: 'config-tool', required: llvmopt)
+
+  if llvm.found()
+
+    cdata.set('USE_LLVM', 1)
+
+    cpp = meson.get_compiler('cpp')
+
+    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+    ccache = find_program('ccache', native: true, required: false)
+    clang = find_program(llvm_binpath / 'clang', required: true)
+  endif
+else
+  llvm = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+icuopt = get_option('icu')
+if not icuopt.disabled()
+  icu = dependency('icu-uc', required: icuopt.enabled())
+  icu_i18n = dependency('icu-i18n', required: icuopt.enabled())
+
+  if icu.found()
+    cdata.set('USE_ICU', 1)
+  endif
+
+else
+  icu = not_found_dep
+  icu_i18n = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+  libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+  if libxml.found()
+    cdata.set('USE_LIBXML', 1)
+  endif
+else
+  libxml = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+  libxslt = dependency('libxslt', required: libxsltopt)
+
+  if libxslt.found()
+    cdata.set('USE_LIBXSLT', 1)
+  endif
+else
+  libxslt = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+  lz4 = dependency('liblz4', required: lz4opt)
+
+  if lz4.found()
+    cdata.set('USE_LZ4', 1)
+    cdata.set('HAVE_LIBLZ4', 1)
+  endif
+
+else
+  lz4 = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Tcl (for pltcl)
+#
+# NB: tclConfig.sh is used in autoconf build for getting
+# TCL_SHARED_BUILD, TCL_INCLUDE_SPEC, TCL_LIBS and TCL_LIB_SPEC
+# variables. For now we have not seen a need to copy
+# that behaviour to the meson build.
+###############################################################
+
+tclopt = get_option('pltcl')
+tcl_version = get_option('tcl_version')
+tcl_dep = not_found_dep
+if not tclopt.disabled()
+
+  # via pkg-config
+  tcl_dep = dependency(tcl_version, required: false)
+
+  if not tcl_dep.found()
+    tcl_dep = cc.find_library(tcl_version,
+      required: tclopt,
+      dirs: test_lib_d)
+  endif
+
+  if not cc.has_header('tcl.h', dependencies: tcl_dep, required: tclopt)
+    tcl_dep = not_found_dep
+  endif
+endif
+
+
+
+###############################################################
+# Library: pam
+###############################################################
+
+pamopt = get_option('pam')
+if not pamopt.disabled()
+  pam = dependency('pam', required: false)
+
+  if not pam.found()
+    pam = cc.find_library('pam', required: pamopt, dirs: test_lib_d)
+  endif
+
+  if pam.found()
+    pam_header_found = false
+
+    # header file <security/pam_appl.h> or <pam/pam_appl.h> is required for PAM.
+    if cc.check_header('security/pam_appl.h', dependencies: pam, required: false,
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_SECURITY_PAM_APPL_H', 1)
+      pam_header_found = true
+    elif cc.check_header('pam/pam_appl.h', dependencies: pam, required: pamopt,
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_PAM_PAM_APPL_H', 1)
+      pam_header_found = true
+    endif
+
+    if pam_header_found
+      cdata.set('USE_PAM', 1)
+    else
+      pam = not_found_dep
+    endif
+  endif
+else
+  pam = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('plperl')
+perl_dep = not_found_dep
+if not perlopt.disabled()
+  perl_may_work = true
+
+  # First verify that perl has the necessary dependencies installed
+  perl_mods = run_command(
+    [perl,
+     '-MConfig', '-MOpcode', '-MExtUtils::Embed', '-MExtUtils::ParseXS',
+     '-e', ''],
+    check: false)
+  if perl_mods.returncode() != 0
+    perl_may_work = false
+    perl_msg = 'perl installation does not have the required modules'
+  endif
+
+  # Then inquire perl about its configuration
+  if perl_may_work
+    perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+    perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+    archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+    privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+    useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+
+    perl_inc_dir = '@0@/CORE'.format(archlibexp)
+
+    if useshrplib != 'true'
+      perl_may_work = false
+      perl_msg = 'need a shared perl'
+    endif
+  endif
+
+  if perl_may_work
+    # On most platforms, archlibexp is also where the Perl include files live ...
+    perl_ccflags = ['-I@0@'.format(perl_inc_dir)]
+    # ... but on newer macOS versions, we must use -iwithsysroot to look
+    # under sysroot
+    if not fs.is_file('@0@/perl.h'.format(perl_inc_dir)) and \
+       fs.is_file('@0@@1@/perl.h'.format(pg_sysroot, perl_inc_dir))
+      perl_ccflags = ['-iwithsysroot', perl_inc_dir]
+    endif
+
+    # check compiler finds header
+    if not cc.has_header('perl.h', required: false,
+        args: test_c_args + perl_ccflags, include_directories: postgres_inc)
+      perl_may_work = false
+      perl_msg = 'missing perl.h'
+    endif
+  endif
+
+  if perl_may_work
+    perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+
+    # See comments for PGAC_CHECK_PERL_EMBED_CCFLAGS in perl.m4
+    foreach flag : perl_ccflags_r.split(' ')
+      if flag.startswith('-D') and \
+          (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+        perl_ccflags += flag
+      endif
+    endforeach
+
+    if host_system == 'windows'
+      perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+    endif
+
+    message('CCFLAGS recommended by perl: @0@'.format(perl_ccflags_r))
+    message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+    # We are after Embed's ldopts, but without the subset mentioned in
+    # Config's ccdlflags and ldflags.  (Those are the choices of those who
+    # built the Perl installation, which are not necessarily appropriate
+    # for building PostgreSQL.)
+    ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+    undesired = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().split()
+    undesired += run_command(perl_conf_cmd, 'ldflags', check: true).stdout().split()
+
+    perl_ldopts = []
+    foreach ldopt : ldopts.split(' ')
+      if ldopt == '' or ldopt in undesired
+        continue
+      endif
+
+      perl_ldopts += ldopt.strip('"')
+    endforeach
+
+    message('LDFLAGS recommended by perl: "@0@"'.format(ldopts))
+    message('LDFLAGS for embedding perl: "@0@"'.format(' '.join(perl_ldopts)))
+
+    perl_dep_int = declare_dependency(
+      compile_args: perl_ccflags,
+      link_args: perl_ldopts,
+      version: perlversion,
+    )
+
+    # While we're at it, check that we can link to libperl.
+    # On most platforms, if perl.h is there then libperl.so will be too, but
+    # at this writing Debian packages them separately.
+    perl_link_test = '''
+/* see plperl.h */
+#ifdef _MSC_VER
+#define __inline__ inline
+#endif
+#include <EXTERN.h>
+#include <perl.h>
+int main(void)
+{
+perl_alloc();
+}'''
+    if not cc.links(perl_link_test, name: 'libperl',
+          args: test_c_args + perl_ccflags + perl_ldopts,
+          include_directories: postgres_inc)
+      perl_may_work = false
+      perl_msg = 'missing libperl'
+    endif
+
+  endif # perl_may_work
+
+  if perl_may_work
+    perl_dep = perl_dep_int
+  else
+    if perlopt.enabled()
+      error('dependency plperl failed: @0@'.format(perl_msg))
+    else
+      message('disabling optional dependency plperl: @0@'.format(perl_msg))
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('plpython')
+if not pyopt.disabled()
+  pm = import('python')
+  python3_inst = pm.find_installation(required: pyopt.enabled())
+  python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled())
+  if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt.enabled())
+    python3_dep = not_found_dep
+  endif
+else
+  python3_dep = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: Readline
+###############################################################
+
+if not get_option('readline').disabled()
+  libedit_preferred = get_option('libedit_preferred')
+  # Set the order of readline dependencies
+  check_readline_deps = libedit_preferred ? \
+    ['libedit', 'readline'] : ['readline', 'libedit']
+
+  foreach readline_dep : check_readline_deps
+    readline = dependency(readline_dep, required: false)
+    if not readline.found()
+      readline = cc.find_library(readline_dep,
+        required: get_option('readline').enabled(),
+        dirs: test_lib_d)
+    endif
+    if readline.found()
+      break
+    endif
+  endforeach
+
+  if readline.found()
+    cdata.set('HAVE_LIBREADLINE', 1)
+
+    editline_prefix = {
+      'header_prefix': 'editline/',
+      'flag_prefix': 'EDITLINE_',
+    }
+    readline_prefix = {
+      'header_prefix': 'readline/',
+      'flag_prefix': 'READLINE_',
+    }
+    default_prefix = {
+      'header_prefix': '',
+      'flag_prefix': '',
+    }
+
+    # Set the order of prefixes
+    prefixes = libedit_preferred ? \
+      [editline_prefix, default_prefix, readline_prefix] : \
+      [readline_prefix, default_prefix, editline_prefix]
+
+    at_least_one_header_found = false
+    foreach header : ['history', 'readline']
+      is_found = false
+      foreach prefix : prefixes
+        header_file = '@0@@1@.h'.format(prefix['header_prefix'], header)
+        # Check history.h and readline.h
+        if not is_found and cc.has_header(header_file,
+            args: test_c_args, include_directories: postgres_inc,
+            dependencies: [readline], required: false)
+          if header == 'readline'
+            readline_h = header_file
+          endif
+          cdata.set('HAVE_@0@@1@_H'.format(prefix['flag_prefix'], header).to_upper(), 1)
+          is_found = true
+          at_least_one_header_found = true
+        endif
+      endforeach
+    endforeach
+
+    if not at_least_one_header_found
+      error('''readline header not found
+If you have @0@ already installed, see see meson-log/meson-log.txt for details on the
+failure. It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.'''.format(readline_dep))
+    endif
+
+    check_funcs = [
+      'append_history',
+      'history_truncate_file',
+      'rl_completion_matches',
+      'rl_filename_completion_function',
+      'rl_reset_screen_size',
+      'rl_variable_bind',
+    ]
+
+    foreach func : check_funcs
+      found = cc.has_function(func, dependencies: [readline],
+        args: test_c_args, include_directories: postgres_inc)
+      cdata.set('HAVE_'+func.to_upper(), found ? 1 : false)
+    endforeach
+
+    check_vars = [
+      'rl_completion_suppress_quote',
+      'rl_filename_quote_characters',
+      'rl_filename_quoting_function',
+    ]
+
+    foreach var : check_vars
+      cdata.set('HAVE_'+var.to_upper(),
+        cc.has_header_symbol(readline_h, var,
+          args: test_c_args, include_directories: postgres_inc,
+          prefix: '#include <stdio.h>',
+          dependencies: [readline]) ? 1 : false)
+    endforeach
+
+    # If found via cc.find_library() ensure headers are found when using the
+    # dependency. On meson < 0.57 one cannot do compiler checks using the
+    # dependency returned by declare_dependency(), so we can't do this above.
+    if readline.type_name() == 'library'
+      readline = declare_dependency(dependencies: readline,
+        include_directories: postgres_inc)
+    endif
+  endif
+
+  # XXX: Figure out whether to implement mingw warning equivalent
+else
+  readline = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: selinux
+###############################################################
+
+selinux = not_found_dep
+selinuxopt = get_option('selinux')
+if meson.version().version_compare('>=0.59')
+  selinuxopt = selinuxopt.disable_auto_if(host_system != 'linux')
+endif
+selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
+cdata.set('HAVE_LIBSELINUX',
+  selinux.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: systemd
+###############################################################
+
+systemd = not_found_dep
+systemdopt = get_option('systemd')
+if meson.version().version_compare('>=0.59')
+  systemdopt = systemdopt.disable_auto_if(host_system != 'linux')
+endif
+systemd = dependency('libsystemd', required: systemdopt)
+cdata.set('USE_SYSTEMD', systemd.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+  # Try to find openssl via pkg-config et al, if that doesn't work
+  # (e.g. because it's provided as part of the OS, like on FreeBSD), look for
+  # the library names that we know about.
+
+  # via pkg-config et al
+  ssl = dependency('openssl', required: false)
+
+  # via library + headers
+  if not ssl.found()
+    ssl_lib = cc.find_library('ssl',
+      dirs: test_lib_d,
+      header_include_directories: postgres_inc,
+      has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+    crypto_lib = cc.find_library('crypto',
+      dirs: test_lib_d,
+      header_include_directories: postgres_inc)
+    ssl_int = [ssl_lib, crypto_lib]
+
+    ssl = declare_dependency(dependencies: ssl_int,
+                             include_directories: postgres_inc)
+  else
+    cc.has_header('openssl/ssl.h', args: test_c_args, dependencies: ssl, required: true)
+    cc.has_header('openssl/err.h', args: test_c_args, dependencies: ssl, required: true)
+
+    ssl_int = [ssl]
+  endif
+
+  check_funcs = [
+    ['CRYPTO_new_ex_data', {'required': true}],
+    ['SSL_new', {'required': true}],
+
+    # Function introduced in OpenSSL 1.0.2.
+    ['X509_get_signature_nid'],
+
+    # Functions introduced in OpenSSL 1.1.0. We used to check for
+    # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+    # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+    # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+    # functions.
+    ['OPENSSL_init_ssl'],
+    ['BIO_get_data'],
+    ['BIO_meth_new'],
+    ['ASN1_STRING_get0_data'],
+    ['HMAC_CTX_new'],
+    ['HMAC_CTX_free'],
+
+    # OpenSSL versions before 1.1.0 required setting callback functions, for
+    # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+    # function was removed.
+    ['CRYPTO_lock'],
+  ]
+
+  foreach c : check_funcs
+    func = c.get(0)
+    val = cc.has_function(func, args: test_c_args, dependencies: ssl_int)
+    required = c.get(1, {}).get('required', false)
+    if required and not val
+      error('openssl function @0@ is required'.format(func))
+    elif not required
+      cdata.set('HAVE_' + func.to_upper(), val ? 1 : false)
+    endif
+  endforeach
+
+  cdata.set('USE_OPENSSL', 1,
+            description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+  cdata.set('OPENSSL_API_COMPAT', '0x10001000L',
+            description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.''')
+else
+  ssl = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: uuid
+###############################################################
+
+uuidopt = get_option('uuid')
+if uuidopt != 'none'
+  uuidname = uuidopt.to_upper()
+  if uuidopt == 'e2fs'
+    uuid = dependency('uuid', required: true)
+    uuidfunc = 'uuid_generate'
+    uuidheader = 'uuid/uuid.h'
+  elif uuidopt == 'bsd'
+    # libc should have uuid function
+    uuid = declare_dependency()
+    uuidfunc = 'uuid_to_string'
+    uuidheader = 'uuid.h'
+  elif uuidopt == 'ossp'
+    uuid = dependency('ossp-uuid', required: true)
+    uuidfunc = 'uuid_export'
+    uuidheader = 'ossp/uuid.h'
+  else
+    error('huh')
+  endif
+
+  if not cc.has_header_symbol(uuidheader, uuidfunc, args: test_c_args, dependencies: uuid)
+    error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc))
+  endif
+  cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1)
+
+  cdata.set('HAVE_UUID_@0@'.format(uuidname), 1,
+           description: 'Define to 1 if you have @0@ UUID support.'.format(uuidname))
+else
+  uuid = not_found_dep
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = not_found_dep
+if not zlibopt.disabled()
+  zlib_t = dependency('zlib', required: zlibopt)
+
+  if zlib_t.type_name() == 'internal'
+    # if fallback was used, we don't need to test if headers are present (they
+    # aren't built yet, so we can't test)
+    zlib = zlib_t
+  elif not zlib_t.found()
+    warning('did not find zlib')
+  elif not cc.has_header('zlib.h',
+      args: test_c_args, include_directories: postgres_inc,
+      dependencies: [zlib_t], required: zlibopt.enabled())
+    warning('zlib header not found')
+  elif not cc.has_type('z_streamp',
+      dependencies: [zlib_t], prefix: '#include <zlib.h>',
+      args: test_c_args, include_directories: postgres_inc)
+    if zlibopt.enabled()
+      error('zlib version is too old')
+    else
+      warning('zlib version is too old')
+    endif
+  else
+    zlib = zlib_t
+  endif
+
+  if zlib.found()
+    cdata.set('HAVE_LIBZ', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Library: tap test dependencies
+###############################################################
+
+# Check whether tap tests are enabled or not
+tap_tests_enabled = false
+tapopt = get_option('tap_tests')
+if not tapopt.disabled()
+  # Checking for perl modules for tap tests
+  perl_ipc_run_check = run_command(perl, 'config/check_modules.pl', check: false)
+  if perl_ipc_run_check.returncode() != 0
+    message(perl_ipc_run_check.stderr().strip())
+    if tapopt.enabled()
+      error('Additional Perl modules are required to run TAP tests.')
+    else
+      warning('Additional Perl modules are required to run TAP tests.')
+    endif
+  else
+    tap_tests_enabled = true
+  endif
+endif
+
+
+
+###############################################################
+# Library: zstd
+###############################################################
+
+zstdopt = get_option('zstd')
+if not zstdopt.disabled()
+  zstd = dependency('libzstd', required: zstdopt, version: '>=1.4.0')
+
+  if zstd.found()
+    cdata.set('USE_ZSTD', 1)
+    cdata.set('HAVE_LIBZSTD', 1)
+  endif
+
+else
+  zstd = not_found_dep
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+# Do we need -std=c99 to compile C99 code? We don't want to add -std=c99
+# unnecessarily, because we optionally rely on newer features.
+c99_test = '''
+#include <stdbool.h>
+#include <complex.h>
+#include <tgmath.h>
+#include <inttypes.h>
+
+struct named_init_test {
+  int a;
+  int b;
+};
+
+extern void structfunc(struct named_init_test);
+
+int main(int argc, char **argv)
+{
+  struct named_init_test nit = {
+    .a = 3,
+    .b = 5,
+  };
+
+  for (int loop_var = 0; loop_var < 3; loop_var++)
+  {
+    nit.a += nit.b;
+  }
+
+  structfunc((struct named_init_test){1, 0});
+
+  return nit.a != 0;
+}
+'''
+
+if not cc.compiles(c99_test, name: 'c99', args: test_c_args)
+  if cc.compiles(c99_test, name: 'c99 with -std=c99',
+        args: test_c_args + ['-std=c99'])
+    test_c_args += '-std=c99'
+    cflags += '-std=c99'
+  else
+    error('C compiler does not support C99')
+  endif
+endif
+
+sizeof_long = cc.sizeof('long', args: test_c_args)
+cdata.set('SIZEOF_LONG', sizeof_long)
+if sizeof_long == 8
+  cdata.set('HAVE_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long int')
+  cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: test_c_args) == 8
+  cdata.set('HAVE_LONG_LONG_INT_64', 1)
+  cdata.set('PG_INT64_TYPE', 'long long int')
+  cdata.set_quoted('INT64_MODIFIER', 'll')
+else
+  error('do not know how to get a 64bit int')
+endif
+
+if host_machine.endian() == 'big'
+  cdata.set('WORDS_BIGENDIAN', 1)
+endif
+
+alignof_types = ['short', 'int', 'long', 'double']
+maxalign = 0
+foreach t : alignof_types
+  align = cc.alignment(t, args: test_c_args)
+  if maxalign < align
+    maxalign = align
+  endif
+  cdata.set('ALIGNOF_@0@'.format(t.to_upper()), align)
+endforeach
+cdata.set('MAXIMUM_ALIGNOF', maxalign)
+
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: test_c_args))
+cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: test_c_args))
+
+
+# Check if __int128 is a working 128 bit integer type, and if so
+# define PG_INT128_TYPE to that typename.
+#
+# This currently only detects a GCC/clang extension, but support for other
+# environments may be added in the future.
+#
+# For the moment we only test for support for 128bit math; support for
+# 128bit literals and snprintf is not required.
+if cc.links('''
+  /*
+   * We don't actually run this test, just link it to verify that any support
+   * functions needed for __int128 are present.
+   *
+   * These are globals to discourage the compiler from folding all the
+   * arithmetic tests down to compile-time constants.  We do not have
+   * convenient support for 128bit literals at this point...
+   */
+  __int128 a = 48828125;
+  __int128 b = 97656250;
+
+  int main(void)
+  {
+      __int128 c,d;
+      a = (a << 12) + 1; /* 200000000001 */
+      b = (b << 12) + 5; /* 400000000005 */
+      /* try the most relevant arithmetic ops */
+      c = a * b;
+      d = (c + b) / b;
+      /* must use the results, else compiler may optimize arithmetic away */
+      return d != a+1;
+  }''',
+  name: '__int128',
+  args: test_c_args)
+
+  buggy_int128 = false
+
+  # Use of non-default alignment with __int128 tickles bugs in some compilers.
+  # If not cross-compiling, we can test for bugs and disable use of __int128
+  # with buggy compilers.  If cross-compiling, hope for the best.
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83925
+  if not meson.is_cross_build()
+    r = cc.run('''
+    /* This must match the corresponding code in c.h: */
+    #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
+    #define pg_attribute_aligned(a) __attribute__((aligned(a)))
+    #endif
+    typedef __int128 int128a
+    #if defined(pg_attribute_aligned)
+    pg_attribute_aligned(8)
+    #endif
+    ;
+
+    int128a holder;
+    void pass_by_val(void *buffer, int128a par) { holder = par; }
+
+    int main(void)
+    {
+        long int i64 = 97656225L << 12;
+        int128a q;
+        pass_by_val(main, (int128a) i64);
+        q = (int128a) i64;
+        return q != holder;
+    }''',
+    name: '__int128 alignment bug',
+    args: test_c_args)
+    assert(r.compiled())
+    if r.returncode() != 0
+      buggy_int128 = true
+      message('__int128 support present but buggy and thus disabled')
+    endif
+  endif
+
+  if not buggy_int128
+    cdata.set('PG_INT128_TYPE', '__int128')
+    cdata.set('ALIGNOF_PG_INT128_TYPE', cc.
+      alignment('__int128', args: test_c_args))
+  endif
+endif
+
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang).  If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+    static inline int foo(void)
+    {
+      void *labeladdrs[] = {&&my_label};
+      goto *labeladdrs[0];
+      my_label:
+      return 1;
+    }''',
+    args: test_c_args)
+  cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+    int main(int arg, char **argv)
+    {
+        ({ _Static_assert(1, "foo"); });
+    }
+    ''',
+    args: test_c_args)
+  cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: test_c_args) \
+  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: test_c_args) \
+  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: test_c_args) == 1
+  cdata.set('HAVE__BOOL', 1)
+  cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+# Need to check a call with %m because netbsd supports gnu_printf but emits a
+# warning for each use of %m.
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = '''
+extern void emit_log(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));
+static void call_log(void)
+{
+    emit_log(0, "error: %s: %m", "foo");
+}
+'''
+attrib_error_args = cc.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
+foreach a : printf_attributes
+  if cc.compiles(testsrc.format(a),
+      args: test_c_args + attrib_error_args, name: 'format ' + a)
+    cdata.set('PG_PRINTF_ATTRIBUTE', a)
+    break
+  endif
+endforeach
+
+
+if cc.has_function_attribute('visibility:default') and \
+  cc.has_function_attribute('visibility:hidden')
+  cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+
+  # Only newer versions of meson know not to apply gnu_symbol_visibility =
+  # inlineshidden to C code as well... Any either way, we want to put these
+  # flags into exported files (pgxs, .pc files).
+  cflags_mod += '-fvisibility=hidden'
+  cxxflags_mod += ['-fvisibility=hidden', '-fvisibility-inlines-hidden']
+  ldflags_mod += '-fvisibility=hidden'
+endif
+
+
+# Check if various builtins exist. Some builtins are tested separately,
+# because we want to test something more complicated than the generic case.
+builtins = [
+  'bswap16',
+  'bswap32',
+  'bswap64',
+  'clz',
+  'ctz',
+  'constant_p',
+  'frame_address',
+  'popcount',
+  'unreachable',
+]
+
+foreach builtin : builtins
+  fname = '__builtin_@0@'.format(builtin)
+  if cc.has_function(fname, args: test_c_args)
+    cdata.set('HAVE@0@'.format(fname.to_upper()), 1)
+  endif
+endforeach
+
+
+# Check if the C compiler understands __builtin_types_compatible_p,
+# and define HAVE__BUILTIN_TYPES_COMPATIBLE_P if so.
+#
+# We check usage with __typeof__, though it's unlikely any compiler would
+# have the former and not the latter.
+if cc.compiles('''
+    static int x;
+    static int y[__builtin_types_compatible_p(__typeof__(x), int)];
+    ''',
+    name: '__builtin_types_compatible_p',
+    args: test_c_args)
+  cdata.set('HAVE__BUILTIN_TYPES_COMPATIBLE_P', 1)
+endif
+
+
+# Check if the C compiler understands __builtin_$op_overflow(),
+# and define HAVE__BUILTIN_OP_OVERFLOW if so.
+#
+# Check for the most complicated case, 64 bit multiplication, as a
+# proxy for all of the operations.  To detect the case where the compiler
+# knows the function but library support is missing, we must link not just
+# compile, and store the results in global variables so the compiler doesn't
+# optimize away the call.
+if cc.links('''
+    INT64 a = 1;
+    INT64 b = 1;
+    INT64 result;
+
+    int main(void)
+    {
+        return __builtin_mul_overflow(a, b, &result);
+    }''',
+    name: '__builtin_mul_overflow',
+    args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))],
+    )
+  cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1)
+endif
+
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+    #include <cpuid.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+    }
+    ''', name: '__get_cpuid',
+    args: test_c_args)
+  cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+    #include <intrin.h>
+    int main(int arg, char **argv)
+    {
+        unsigned int exx[4] = {0, 0, 0, 0};
+        __cpuid(exx, 1);
+    }
+    ''', name: '__cpuid',
+    args: test_c_args)
+  cdata.set('HAVE__CPUID', 1)
+endif
+
+
+# Defend against clang being used on x86-32 without SSE2 enabled.  As current
+# versions of clang do not understand -fexcess-precision=standard, the use of
+# x87 floating point operations leads to problems like isinf possibly returning
+# false for a value that is infinite when converted from the 80bit register to
+# the 8byte memory representation.
+#
+# Only perform the test if the compiler doesn't understand
+# -fexcess-precision=standard, that way a potentially fixed compiler will work
+# automatically.
+if '-fexcess-precision=standard' not in cflags
+  if not cc.compiles('''
+#if defined(__clang__) && defined(__i386__) && !defined(__SSE2_MATH__)
+choke me
+#endif''',
+      name: '', args: test_c_args)
+    error('Compiling PostgreSQL with clang, on 32bit x86, requires SSE2 support. Use -msse2 or use gcc.')
+  endif
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+  # Disable strict-aliasing rules; needed for gcc 3.3+
+  '-fno-strict-aliasing',
+  # Disable optimizations that assume no overflow; needed for gcc 4.3+
+  '-fwrapv',
+  '-fexcess-precision=standard',
+]
+
+cflags += cc.get_supported_arguments(common_functional_flags)
+if llvm.found()
+  cxxflags += cpp.get_supported_arguments(common_functional_flags)
+endif
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+common_warning_flags = [
+  '-Wmissing-prototypes',
+  '-Wpointer-arith',
+  # Really don't want VLAs to be used in our dialect of C
+  '-Werror=vla',
+  # On macOS, complain about usage of symbols newer than the deployment target
+  '-Werror=unguarded-availability-new',
+  '-Wendif-labels',
+  '-Wmissing-format-attribute',
+  '-Wimplicit-fallthrough=3',
+  '-Wcast-function-type',
+  # This was included in -Wall/-Wformat in older GCC versions
+  '-Wformat-security',
+]
+
+cflags_warn += cc.get_supported_arguments(common_warning_flags)
+if llvm.found()
+  cxxflags_warn += cpp.get_supported_arguments(common_warning_flags)
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+  cflags_warn += '-Wdeclaration-after-statement'
+  using_declaration_after_statement_warning = true
+else
+  using_declaration_after_statement_warning = false
+endif
+
+
+# The following tests want to suppress various unhelpful warnings by adding
+# -Wno-foo switches.  But gcc won't complain about unrecognized -Wno-foo
+# switches, so we have to test for the positive form and if that works,
+# add the negative form.
+
+negative_warning_flags = [
+  # Suppress clang's unhelpful unused-command-line-argument warnings.
+  'unused-command-line-argument',
+
+  # Remove clang 12+'s compound-token-split-by-macro, as this causes a lot
+  # of warnings when building plperl because of usages in the Perl headers.
+  'compound-token-split-by-macro',
+
+  # Similarly disable useless truncation warnings from gcc 8+
+  'format-truncation',
+  'stringop-truncation',
+
+  # To make warning_level=2 / -Wextra work, we'd need at least the following
+  # 'clobbered',
+  # 'missing-field-initializers',
+  # 'sign-compare',
+  # 'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+  if cc.has_argument('-W' + w)
+    cflags_warn += '-Wno-' + w
+  endif
+  if llvm.found() and cpp.has_argument('-W' + w)
+    cxxflags_warn += '-Wno-' + w
+  endif
+endforeach
+
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+  cflags_warn += [
+    '/wd4018', # signed/unsigned mismatch
+    '/wd4244', # conversion from 'type1' to 'type2', possible loss of data
+    '/wd4273', # inconsistent DLL linkage
+    '/wd4101', # unreferenced local variable
+    '/wd4102', # unreferenced label
+    '/wd4090', # different 'modifier' qualifiers
+    '/wd4267', # conversion from 'size_t' to 'type', possible loss of data
+  ]
+
+  cppflags += [
+    '/DWIN32',
+    '/DWINDOWS',
+    '/D__WINDOWS__',
+    '/D__WIN32__',
+    '/D_CRT_SECURE_NO_DEPRECATE',
+    '/D_CRT_NONSTDC_NO_DEPRECATE',
+  ]
+
+  # We never need export libraries. As link.exe reports their creation, they
+  # are unnecessarily noisy. Similarly, we don't need import library for
+  # modules, we only import them dynamically, and they're also noisy.
+  ldflags += '/NOEXP'
+  ldflags_mod += '/NOIMPLIB'
+endif
+
+
+
+###############################################################
+# Atomics
+###############################################################
+
+if not get_option('spinlocks')
+  warning('Not using spinlocks will cause poor performance')
+else
+  cdata.set('HAVE_SPINLOCKS', 1)
+endif
+
+if not get_option('atomics')
+  warning('Not using atomics will cause poor performance')
+else
+  # XXX: perhaps we should require some atomics support in this case these
+  # days?
+  cdata.set('HAVE_ATOMICS', 1)
+
+  atomic_checks = [
+    {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+     'desc': '__sync_lock_test_and_set(char)',
+     'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+     'desc': '__sync_lock_test_and_set(int32)',
+     'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+     'desc': '__sync_val_compare_and_swap(int32)',
+     'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+     'desc': '__sync_val_compare_and_swap(int64)',
+     'test': '''
+INT64 val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+     'desc': ' __atomic_compare_exchange_n(int32)',
+     'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+    {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+     'desc': ' __atomic_compare_exchange_n(int64)',
+     'test': '''
+INT64 val = 0;
+INT64 expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+  ]
+
+  foreach check : atomic_checks
+    test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+    cdata.set(check['name'],
+      cc.links(test,
+        name: check['desc'],
+        args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false
+    )
+  endforeach
+
+endif
+
+
+
+###############################################################
+# Select CRC-32C implementation.
+#
+# If we are targeting a processor that has Intel SSE 4.2 instructions, we can
+# use the special CRC instructions for calculating CRC-32C. If we're not
+# targeting such a processor, but we can nevertheless produce code that uses
+# the SSE intrinsics, perhaps with some extra CFLAGS, compile both
+# implementations and select which one to use at runtime, depending on whether
+# SSE 4.2 is supported by the processor we're running on.
+#
+# Similarly, if we are targeting an ARM processor that has the CRC
+# instructions that are part of the ARMv8 CRC Extension, use them. And if
+# we're not targeting such a processor, but can nevertheless produce code that
+# uses the CRC instructions, compile both, and select at runtime.
+###############################################################
+
+have_optimized_crc = false
+cflags_crc = []
+if host_cpu == 'x86' or host_cpu == 'x86_64'
+
+  if cc.get_id() == 'msvc'
+    cdata.set('USE_SSE42_CRC32C', false)
+    cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  else
+
+    prog = '''
+#include <nmmintrin.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = _mm_crc32_u8(crc, 0);
+    crc = _mm_crc32_u32(crc, 0);
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+    if cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 without -msse4.2',
+          args: test_c_args)
+      # Use Intel SSE 4.2 unconditionally.
+      cdata.set('USE_SSE42_CRC32C', 1)
+      have_optimized_crc = true
+    elif cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 with -msse4.2',
+          args: test_c_args + ['-msse4.2'])
+      # Use Intel SSE 4.2, with runtime check. The CPUID instruction is needed for
+      # the runtime check.
+      cflags_crc += '-msse4.2'
+      cdata.set('USE_SSE42_CRC32C', false)
+      cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+      have_optimized_crc = true
+    endif
+
+  endif
+
+elif host_cpu == 'arm' or host_cpu == 'aarch64'
+
+  prog = '''
+#include <arm_acle.h>
+
+int main(void)
+{
+    unsigned int crc = 0;
+    crc = __crc32cb(crc, 0);
+    crc = __crc32ch(crc, 0);
+    crc = __crc32cw(crc, 0);
+    crc = __crc32cd(crc, 0);
+
+    /* return computed value, to prevent the above being optimized away */
+    return crc == 0;
+}
+'''
+
+  if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc',
+      args: test_c_args)
+    # Use ARM CRC Extension unconditionally
+    cdata.set('USE_ARMV8_CRC32C', 1)
+    have_optimized_crc = true
+  elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc',
+      args: test_c_args + ['-march=armv8-a+crc'])
+    # Use ARM CRC Extension, with runtime check
+    cflags_crc += '-march=armv8-a+crc'
+    cdata.set('USE_ARMV8_CRC32C', false)
+    cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1)
+    have_optimized_crc = true
+  endif
+endif
+
+if not have_optimized_crc
+  # fall back to slicing-by-8 algorithm, which doesn't require any special CPU
+  # support.
+  cdata.set('USE_SLICING_BY_8_CRC32C', 1)
+endif
+
+
+
+###############################################################
+# Other CPU specific stuff
+###############################################################
+
+if host_cpu == 'x86_64'
+
+  if cc.compiles('''
+      void main(void)
+      {
+          long long x = 1; long long r;
+          __asm__ __volatile__ (" popcntq %1,%0\n" : "=q"(r) : "rm"(x));
+      }''',
+      name: '@0@: popcntq instruction'.format(host_cpu),
+      args: test_c_args)
+    cdata.set('HAVE_X86_64_POPCNTQ', 1)
+  endif
+
+elif host_cpu == 'ppc' or host_cpu == 'ppc64'
+  # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+  if cdata.has('HAVE__BUILTIN_CONSTANT_P')
+    if cc.compiles('''
+      static inline int
+      addi(int ra, int si)
+      {
+          int res = 0;
+          if (__builtin_constant_p(si))
+              __asm__ __volatile__(
+                  " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+          return res;
+      }
+      int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+      ''',
+      args: test_c_args)
+      cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+    endif
+  endif
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+# XXX: Might be worth conditioning some checks on the OS, to avoid doing
+# unnecessary checks over and over, particularly on windows.
+header_checks = [
+  'atomic.h',
+  'copyfile.h',
+  'crtdefs.h',
+  'execinfo.h',
+  'getopt.h',
+  'ifaddrs.h',
+  'langinfo.h',
+  'mbarrier.h',
+  'stdbool.h',
+  'strings.h',
+  'sys/epoll.h',
+  'sys/event.h',
+  'sys/personality.h',
+  'sys/prctl.h',
+  'sys/procctl.h',
+  'sys/signalfd.h',
+  'sys/ucred.h',
+  'termios.h',
+  'ucred.h',
+]
+
+foreach header : header_checks
+  varname = 'HAVE_' + header.underscorify().to_upper()
+
+  # Emulate autoconf behaviour of not-found->undef, found->1
+  found = cc.has_header(header,
+    include_directories: postgres_inc, args: test_c_args)
+  cdata.set(varname, found ? 1 : false,
+            description: 'Define to 1 if you have the <@0@> header file.'.format(header))
+endforeach
+
+
+decl_checks = [
+  ['F_FULLFSYNC', 'fcntl.h'],
+  ['fdatasync', 'unistd.h'],
+  ['posix_fadvise', 'fcntl.h'],
+  ['strlcat', 'string.h'],
+  ['strlcpy', 'string.h'],
+  ['strnlen', 'string.h'],
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+  ['preadv', 'sys/uio.h'],
+  ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+  func = c.get(0)
+  header = c.get(1)
+  args = c.get(2, {})
+  varname = 'HAVE_DECL_' + func.underscorify().to_upper()
+
+  found = cc.has_header_symbol(header, func,
+    args: test_c_args, include_directories: postgres_inc,
+    kwargs: args)
+  cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@', and to 0 if you
+   don't.'''.format(func))
+endforeach
+
+
+if cc.has_type('struct cmsgcred',
+    args: test_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '' : '-DHAVE_SYS_UCRED_H'],
+    include_directories: postgres_inc,
+    prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+  cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+  cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_type('struct option',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '@0@'.format(cdata.get('HAVE_GETOPT_H')) == '1' ? '#include <getopt.h>' : '')
+  cdata.set('HAVE_STRUCT_OPTION', 1)
+endif
+
+
+foreach c : ['opterr', 'optreset']
+  varname = 'HAVE_INT_' + c.underscorify().to_upper()
+
+  if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+    extern int @0@;
+    @0@ = 1;
+}
+'''.format(c), name: c, args: test_c_args)
+    cdata.set(varname, 1)
+  else
+    cdata.set(varname, false)
+  endif
+endforeach
+
+if cc.has_type('socklen_t',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/socket.h>''')
+  cdata.set('HAVE_SOCKLEN_T', 1)
+endif
+
+if cc.has_member('struct sockaddr', 'sa_len',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+  cdata.set('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
+endif
+
+if cc.has_member('struct tm', 'tm_zone',
+    args: test_c_args, include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+  cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+    return timezone / 60;
+}
+''',
+    name: 'global variable `timezone\' exists',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+  cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+if cc.has_type('union semun',
+    args: test_c_args,
+    include_directories: postgres_inc,
+    prefix: '''
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+''')
+  cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+  char buf[100];
+  switch (strerror_r(1, buf, sizeof(buf)))
+  { case 0: break; default: break; }
+}''',
+    name: 'strerror_r',
+    args: test_c_args, include_directories: postgres_inc)
+  cdata.set('STRERROR_R_INT', 1)
+else
+  cdata.set('STRERROR_R_INT', false)
+endif
+
+# Check for the locale_t type and find the right header file.  macOS
+# needs xlocale.h; standard is locale.h, but glibc also has an
+# xlocale.h file that we should not use.
+if cc.has_type('locale_t', prefix: '#include <locale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+elif cc.has_type('locale_t', prefix: '#include <xlocale.h>')
+  cdata.set('HAVE_LOCALE_T', 1)
+  cdata.set('LOCALE_T_IN_XLOCALE', 1)
+endif
+
+# Check if the C compiler understands typeof or a variant.  Define
+# HAVE_TYPEOF if so, and define 'typeof' to the actual key word.
+foreach kw : ['typeof', '__typeof__', 'decltype']
+  if cc.compiles('''
+int main(void)
+{
+    int x = 0;
+    @0@(x) y;
+    y = x;
+    return y;
+}
+'''.format(kw),
+    name: 'typeof()',
+    args: test_c_args, include_directories: postgres_inc)
+
+    cdata.set('HAVE_TYPEOF', 1)
+    if kw != 'typeof'
+      cdata.set('typeof', kw)
+    endif
+
+    break
+  endif
+endforeach
+
+
+# Try to find a declaration for wcstombs_l().  It might be in stdlib.h
+# (following the POSIX requirement for wcstombs()), or in locale.h, or in
+# xlocale.h.  If it's in the latter, define WCSTOMBS_L_IN_XLOCALE.
+wcstombs_l_test = '''
+#include <stdlib.h>
+#include <locale.h>
+@0@
+
+void main(void)
+{
+#ifndef wcstombs_l
+    (void) wcstombs_l;
+#endif
+}
+'''
+if (not cc.compiles(wcstombs_l_test.format(''),
+      name: 'wcstombs_l') and
+    cc.compiles(wcstombs_l_test.format('#include <xlocale.h>'),
+      name: 'wcstombs_l in xlocale.h'))
+    cdata.set('WCSTOMBS_L_IN_XLOCALE', 1)
+endif
+
+
+# MSVC doesn't cope well with defining restrict to __restrict, the spelling it
+# understands, because it conflicts with __declspec(restrict). Therefore we
+# define pg_restrict to the appropriate definition, which presumably won't
+# conflict.
+#
+# We assume C99 support, so we don't need to make this conditional.
+#
+# XXX: Historically we allowed platforms to disable restrict in template
+# files, but that was only added for AIX when building with XLC, which we
+# don't support yet.
+cdata.set('pg_restrict', '__restrict')
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+    PS_STRINGS->ps_nargvstr = 1;
+    PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+  name: 'PS_STRINGS', args: test_c_args)
+  cdata.set('HAVE_PS_STRINGS', 1)
+else
+  cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps += cc.find_library('m', required: false)
+
+rt_dep = cc.find_library('rt', required: false)
+
+dl_dep = cc.find_library('dl', required: false)
+
+util_dep = cc.find_library('util', required: false)
+posix4_dep = cc.find_library('posix4', required: false)
+
+getopt_dep = cc.find_library('getopt', required: false)
+gnugetopt_dep = cc.find_library('gnugetopt', required: false)
+
+# Required on BSDs
+execinfo_dep = cc.find_library('execinfo', required: false)
+
+if host_system == 'cygwin'
+  cygipc_dep = cc.find_library('cygipc', required: false)
+else
+  cygipc_dep = not_found_dep
+endif
+
+if host_system == 'sunos'
+  socket_dep = cc.find_library('socket', required: false)
+else
+  socket_dep = not_found_dep
+endif
+
+# XXX: Might be worth conditioning some checks on the OS, to avoid doing
+# unnecessary checks over and over, particularly on windows.
+func_checks = [
+  ['_configthreadlocale', {'skip': host_system != 'windows'}],
+  ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+  ['clock_gettime', {'dependencies': [rt_dep, posix4_dep], 'define': false}],
+  ['copyfile'],
+  # gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus
+  # when enabling asan the dlopen check doesn't notice that -ldl is actually
+  # required. Just checking for dlsym() ought to suffice.
+  ['dlsym', {'dependencies': [dl_dep], 'define': false}],
+  ['explicit_bzero'],
+  ['fdatasync', {'dependencies': [rt_dep, posix4_dep], 'define': false}], # Solaris
+  ['getifaddrs'],
+  ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getopt_long', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+  ['getpeereid'],
+  ['getpeerucred'],
+  ['inet_aton'],
+  ['inet_pton'],
+  ['kqueue'],
+  ['mbstowcs_l'],
+  ['memset_s'],
+  ['mkdtemp'],
+  ['posix_fadvise'],
+  ['posix_fallocate'],
+  ['ppoll'],
+  ['pstat'],
+  ['pthread_barrier_wait', {'dependencies': [thread_dep]}],
+  ['pthread_is_threaded_np', {'dependencies': [thread_dep]}],
+  ['sem_init', {'dependencies': [rt_dep, thread_dep], 'skip': sema_kind != 'unnamed_posix', 'define': false}],
+  ['setproctitle', {'dependencies': [util_dep]}],
+  ['setproctitle_fast'],
+  ['shm_open', {'dependencies': [rt_dep], 'define': false}],
+  ['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
+  ['shmget', {'dependencies': [cygipc_dep], 'define': false}],
+  ['socket', {'dependencies': [socket_dep], 'define': false}],
+  ['strchrnul'],
+  ['strerror_r', {'dependencies': [thread_dep]}],
+  ['strlcat'],
+  ['strlcpy'],
+  ['strnlen'],
+  ['strsignal'],
+  ['sync_file_range'],
+  ['syncfs'],
+  ['uselocale'],
+  ['wcstombs_l'],
+]
+
+func_check_results = {}
+foreach c : func_checks
+  func = c.get(0)
+  kwargs = c.get(1, {})
+  deps = kwargs.get('dependencies', [])
+
+  if kwargs.get('skip', false)
+    continue
+  endif
+
+  found = cc.has_function(func, args: test_c_args)
+
+  if not found
+    foreach dep : deps
+      if not dep.found()
+        continue
+      endif
+      found = cc.has_function(func, args: test_c_args,
+                              dependencies: [dep])
+      if found
+        os_deps += dep
+        break
+      endif
+    endforeach
+  endif
+
+  func_check_results += {func: found}
+
+  if kwargs.get('define', true)
+    # Emulate autoconf behaviour of not-found->undef, found->1
+    cdata.set('HAVE_' + func.underscorify().to_upper(),
+              found  ? 1 : false,
+              description: 'Define to 1 if you have the `@0@\' function.'.format(func))
+  endif
+endforeach
+
+
+if cc.has_function('syslog', args: test_c_args) and \
+    cc.check_header('syslog.h', args: test_c_args)
+  cdata.set('HAVE_SYSLOG', 1)
+endif
+
+
+# if prerequisites for unnamed posix semas aren't fulfilled, fall back to sysv
+# semaphores
+if sema_kind == 'unnamed_posix' and \
+   not func_check_results.get('sem_init', false)
+  sema_kind = 'sysv'
+endif
+
+cdata.set('USE_@0@_SHARED_MEMORY'.format(shmem_kind.to_upper()), 1)
+cdata.set('USE_@0@_SEMAPHORES'.format(sema_kind.to_upper()), 1)
+
+cdata.set('MEMSET_LOOP_LIMIT', memset_loop_limit)
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+
+
+###############################################################
+# Threading
+###############################################################
+
+# XXX: About to rely on thread safety in the autoconf build, so not worth
+# implementing a fallback.
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+
+
+###############################################################
+# NLS / Gettext
+###############################################################
+
+nlsopt = get_option('nls')
+libintl = not_found_dep
+
+if not nlsopt.disabled()
+  # otherwise there'd be lots of
+  # "Gettext not found, all translation (po) targets will be ignored."
+  # warnings if not found.
+  msgfmt = find_program('msgfmt', required: nlsopt.enabled(), native: true)
+
+  # meson 0.59 has this wrapped in dependency('int')
+  if (msgfmt.found() and
+      cc.check_header('libintl.h', required: nlsopt,
+        args: test_c_args, include_directories: postgres_inc))
+
+    # in libc
+    if cc.has_function('ngettext')
+      libintl = declare_dependency()
+    else
+      libintl = cc.find_library('intl',
+        has_headers: ['libintl.h'], required: nlsopt,
+        header_include_directories: postgres_inc,
+        dirs: test_lib_d)
+    endif
+  endif
+
+  if libintl.found()
+    i18n = import('i18n')
+    cdata.set('ENABLE_NLS', 1)
+  endif
+endif
+
+
+
+###############################################################
+# Build
+###############################################################
+
+# Set up compiler / linker arguments to be used everywhere, individual targets
+# can add further args directly, or indirectly via dependencies
+add_project_arguments(cflags, language: ['c'])
+add_project_arguments(cppflags, language: ['c'])
+add_project_arguments(cflags_warn, language: ['c'])
+add_project_arguments(cxxflags, language: ['cpp'])
+add_project_arguments(cppflags, language: ['cpp'])
+add_project_arguments(cxxflags_warn, language: ['cpp'])
+add_project_link_arguments(ldflags, language: ['c', 'cpp'])
+
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+# list of targets for various alias targets
+backend_targets = []
+bin_targets = []
+pl_targets = []
+contrib_targets = []
+testprep_targets = []
+
+
+# Define the tests to distribute them to the correct test styles later
+test_deps = []
+tests = []
+
+
+# Default options for targets
+
+# First identify rpaths
+bin_install_rpaths = []
+lib_install_rpaths = []
+mod_install_rpaths = []
+
+# Add extra_lib_dirs to rpath. Not needed on darwin, as the install_name of
+# libraries in extra_lib_dirs will be used anyway.
+if host_system != 'darwin'
+  bin_install_rpaths += postgres_lib_d
+  lib_install_rpaths += postgres_lib_d
+  mod_install_rpaths += postgres_lib_d
+endif
+
+
+# Define arguments for default targets
+
+default_target_args = {
+  'implicit_include_directories': false,
+  'install': true,
+}
+
+default_lib_args = default_target_args + {
+  'name_prefix': '',
+  'install_rpath': ':'.join(lib_install_rpaths),
+}
+
+internal_lib_args = default_lib_args + {
+  'build_by_default': false,
+  'install': false,
+}
+
+default_mod_args = default_lib_args + {
+  'name_prefix': '',
+  'install_dir': dir_lib_pkg,
+  'install_rpath': ':'.join(mod_install_rpaths),
+}
+
+default_bin_args = default_target_args + {
+  'install_dir': dir_bin,
+  'install_rpath': ':'.join(bin_install_rpaths),
+}
+
+
+
+# Helper for exporting a limited number of symbols
+gen_export_kwargs = {
+  'input': 'exports.txt',
+  'output': '@BASENAME@.'+export_file_suffix,
+  'command': [perl, files('src/tools/gen_export.pl'),
+   '--format', export_file_format,
+   '--input', '@INPUT0@', '--output', '@OUTPUT0@'],
+  'build_by_default': false,
+  'install': false,
+}
+
+
+
+# headers that the whole build tree depends on
+generated_headers = []
+# headers that the backend build depends on
+generated_backend_headers = []
+# configure_files() output, needs a way of converting to file names
+configure_files = []
+
+# generated files that might conflict with a partial in-tree autoconf build
+generated_sources = []
+# same, for paths that differ between autoconf / meson builds
+# elements are [dir, [files]]
+generated_sources_ac = {}
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+subdir('src/include')
+
+subdir('config')
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: [errcodes], # errcodes.h is needed due to use of ereport
+  dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: [os_deps, zlib, zstd],
+)
+
+backend_common_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  sources: generated_headers,
+  dependencies: [os_deps, zlib, zstd],
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+  compile_args: ['-DFRONTEND'],
+  include_directories: [postgres_inc],
+  link_args: ldflags_sl,
+  link_with: [pgport_shlib, common_shlib],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+libpq_deps += [
+  frontend_shlib_code,
+  thread_dep,
+
+  gssapi,
+  ldap_r,
+  libintl,
+  ssl,
+]
+
+subdir('src/interfaces/libpq')
+# fe_utils depends on libpq
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+  include_directories: [postgres_inc],
+  link_with: [fe_utils, common_static, pgport_static],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
+backend_both_deps += [
+  thread_dep,
+  bsd_auth,
+  gssapi,
+  icu,
+  icu_i18n,
+  ldap,
+  libintl,
+  libxml,
+  lz4,
+  pam,
+  ssl,
+  systemd,
+  zlib,
+  zstd,
+]
+
+backend_mod_deps = backend_both_deps + os_deps
+
+backend_code = declare_dependency(
+  compile_args: ['-DBUILDING_DLL'],
+  include_directories: [postgres_inc],
+  link_args: ldflags_be,
+  link_with: [],
+  sources: generated_headers + generated_backend_headers,
+  dependencies: os_deps + backend_both_deps + backend_deps,
+)
+
+# src/backend/meson.build defines backend_mod_code used for extension
+# libraries.
+
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+subdir('src/interfaces/libpq/test')
+subdir('src/interfaces/ecpg/test')
+
+subdir('doc/src/sgml')
+
+generated_sources_ac += {'': ['GNUmakefile']}
+
+
+# If there are any files in the source directory that we also generate in the
+# build directory, they might get preferred over the newly generated files,
+# e.g. because of a #include "file", which always will search in the current
+# directory first.
+message('checking for file conflicts between source and build directory')
+conflicting_files = []
+potentially_conflicting_files_t = []
+potentially_conflicting_files_t += generated_headers
+potentially_conflicting_files_t += generated_backend_headers
+potentially_conflicting_files_t += generated_backend_sources
+potentially_conflicting_files_t += generated_sources
+
+potentially_conflicting_files = []
+
+# convert all sources of potentially conflicting files into uniform shape
+foreach t : potentially_conflicting_files_t
+  potentially_conflicting_files += t.full_path()
+endforeach
+foreach t : configure_files
+  t = '@0@'.format(t)
+  potentially_conflicting_files += meson.current_build_dir() / t
+endforeach
+foreach sub, fnames : generated_sources_ac
+  sub = meson.build_root() / sub
+  foreach fname : fnames
+    potentially_conflicting_files += sub / fname
+  endforeach
+endforeach
+
+# find and report conflicting files
+foreach build_path : potentially_conflicting_files
+  build_path = host_system == 'windows' ? fs.as_posix(build_path) : build_path
+  # str.replace is in 0.56
+  src_path = meson.current_source_dir() / build_path.split(meson.current_build_dir() / '')[1]
+  if fs.exists(src_path) or fs.is_symlink(src_path)
+    conflicting_files += src_path
+  endif
+endforeach
+# XXX: Perhaps we should generate a file that would clean these up? The list
+# can be long.
+if conflicting_files.length() > 0
+  errmsg_cleanup = '''
+Conflicting files in source directory:
+  @0@
+
+The conflicting files need to be removed, either by removing the files listed
+above, or by running configure and then make maintainer-clean.
+'''
+  errmsg_cleanup = errmsg_cleanup.format(' '.join(conflicting_files))
+  error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+  if host_system == 'windows'
+    if prefix.split(':\\').length() == 1
+      # just a drive
+      test_prefix = ''
+    else
+      test_prefix = prefix.split(':\\')[1]
+    endif
+  else
+    assert(prefix.startswith('/'))
+    test_prefix = './@0@'.format(prefix)
+  endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+meson_install_args = meson_args + ['install'] + {
+    'meson': ['--quiet', '--only-changed', '--no-rebuild'],
+    'muon': []
+}[meson_impl]
+
+test('tmp_install',
+    meson_bin, args: meson_install_args ,
+    env: {'DESTDIR':test_install_destdir},
+    priority: 100,
+    timeout: 300,
+    is_parallel: false,
+    suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport = 40000
+
+test_env = environment()
+
+temp_install_bindir = test_install_location / get_option('bindir')
+test_env.set('PG_REGRESS', pg_regress.full_path())
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA so it can be checked in individual tap tests.
+test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
+
+# Add the temporary installation to the library search path on platforms where
+# that works (everything but windows, basically). On windows everything
+# library-like gets installed into bindir, solving that issue.
+if library_path_var != ''
+  test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
+endif
+
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+testwrap = files('src/tools/testwrap')
+
+foreach test_dir : tests
+  testwrap_base = [
+    testwrap,
+    '--basedir', meson.build_root(),
+    '--srcdir', test_dir['sd'],
+    '--testgroup', test_dir['name'],
+  ]
+
+  foreach kind, v : test_dir
+    if kind in ['sd', 'bd', 'name']
+      continue
+    endif
+
+    t = test_dir[kind]
+
+    if kind in ['regress', 'isolation', 'ecpg']
+      if kind == 'regress'
+        runner = pg_regress
+      elif kind == 'isolation'
+        runner = pg_isolation_regress
+      elif kind == 'ecpg'
+        runner = pg_regress_ecpg
+      endif
+
+      test_output = test_result_dir / test_dir['name'] / kind
+
+      test_command = [
+        runner.full_path(),
+        '--inputdir', t.get('inputdir', test_dir['sd']),
+        '--expecteddir', t.get('expecteddir', test_dir['sd']),
+        '--outputdir', test_output,
+        '--temp-instance', test_output / 'tmp_check',
+        '--bindir', '',
+        '--dlpath', test_dir['bd'],
+        '--max-concurrent-tests=20',
+        '--port', testport.to_string(),
+      ] + t.get('regress_args', [])
+
+      if t.has_key('schedule')
+        test_command += ['--schedule', t['schedule'],]
+      endif
+
+      if kind == 'isolation'
+        test_command += t.get('specs', [])
+      else
+        test_command += t.get('sql', [])
+      endif
+
+      env = test_env
+      env.prepend('PATH', temp_install_bindir, test_dir['bd'])
+
+      test_kwargs = {
+        'suite': [test_dir['name']],
+        'priority': 10,
+        'timeout': 1000,
+        'depends': test_deps + t.get('deps', []),
+        'env': env,
+      } + t.get('test_kwargs', {})
+
+      test(test_dir['name'] / kind,
+        python,
+        args: testwrap_base + [
+          '--testname', kind,
+          '--', test_command,
+        ],
+        kwargs: test_kwargs,
+      )
+
+      testport += 1
+    elif kind == 'tap'
+      if not tap_tests_enabled
+        continue
+      endif
+
+      test_command = [
+        perl.path(),
+        '-I', meson.source_root() / 'src/test/perl',
+        '-I', test_dir['sd'],
+      ]
+
+      # Add temporary install, the build directory for non-installed binaries and
+      # also test/ for non-installed test binaries built separately.
+      env = test_env
+      env.prepend('PATH', temp_install_bindir, test_dir['bd'], test_dir['bd'] / 'test')
+
+      foreach name, value : t.get('env', {})
+        env.set(name, value)
+      endforeach
+
+      test_kwargs = {
+        'protocol': 'tap',
+        'suite': [test_dir['name']],
+        'timeout': 1000,
+        'depends': test_deps + t.get('deps', []),
+        'env': env,
+      } + t.get('test_kwargs', {})
+
+      foreach onetap : t['tests']
+        # Make tap test names prettier, remove t/ and .pl
+        onetap_p = onetap
+        if onetap_p.startswith('t/')
+          onetap_p = onetap.split('t/')[1]
+        endif
+        if onetap_p.endswith('.pl')
+          onetap_p = fs.stem(onetap_p)
+        endif
+
+        test(test_dir['name'] / onetap_p,
+          python,
+          kwargs: test_kwargs,
+          args: testwrap_base + [
+            '--testname', onetap_p,
+            '--', test_command,
+            test_dir['sd'] / onetap,
+          ],
+        )
+      endforeach
+    else
+      error('unknown kind @0@ of test in @1@'.format(kind, test_dir['sd']))
+    endif
+
+  endforeach # kinds of tests
+
+endforeach # directories with tests
+
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+alias_target('bin', bin_targets + [libpq_st])
+alias_target('pl', pl_targets)
+alias_target('contrib', contrib_targets)
+alias_target('testprep', testprep_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+  summary(
+    {
+      'data block size': cdata.get('BLCKSZ'),
+      'WAL block size': cdata.get('XLOG_BLCKSZ') / 1024,
+      'segment size': cdata.get('RELSEG_SIZE') / 131072,
+    },
+    section: 'Data layout',
+  )
+
+  summary(
+    {
+      'host system': '@0@ @1@'.format(host_system, host_cpu),
+      'build system': '@0@ @1@'.format(build_machine.system(),
+                                       build_machine.cpu_family()),
+    },
+    section: 'System',
+  )
+
+  summary(
+    {
+      'linker': '@0@'.format(cc.get_linker_id()),
+      'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+    },
+    section: 'Compiler',
+  )
+
+  summary(
+    {
+      'CPP FLAGS': ' '.join(cppflags),
+      'C FLAGS, functional': ' '.join(cflags),
+      'C FLAGS, warnings': ' '.join(cflags_warn),
+    },
+    section: 'Compiler Flags',
+  )
+
+  if llvm.found()
+    summary(
+      {
+        'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version()),
+      },
+      section: 'Compiler',
+    )
+
+    summary(
+      {
+        'C++ FLAGS, functional': ' '.join(cxxflags),
+        'C++ FLAGS, warnings': ' '.join(cxxflags_warn),
+      },
+      section: 'Compiler Flags',
+    )
+  endif
+
+  summary(
+    {
+      'bison': '@0@ @1@'.format(bison.full_path(), bison_version),
+      'dtrace': dtrace,
+    },
+    section: 'Programs',
+  )
+
+  summary(
+    {
+      'bonjour': bonjour,
+      'bsd_auth': bsd_auth,
+      'gss': gssapi,
+      'icu': icu,
+      'ldap': ldap,
+      'libxml': libxml,
+      'libxslt': libxslt,
+      'llvm': llvm,
+      'lz4': lz4,
+      'nls': libintl,
+      'pam': pam,
+      'plperl': perl_dep,
+      'plpython': python3_dep,
+      'pltcl': tcl_dep,
+      'readline': readline,
+      'selinux': selinux,
+      'ssl': ssl,
+      'systemd': systemd,
+      'uuid': uuid,
+      'zlib': zlib,
+      'zstd': zstd,
+    },
+    section: 'External libraries',
+  )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..b629cd8d689
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,185 @@
+# Data layout influencing options
+
+option('blocksize', type : 'combo',
+  choices : ['1', '2', '4', '8', '16', '32'],
+  value : '8',
+  description: 'set relation block size in kB')
+
+option('wal_blocksize', type : 'combo',
+  choices: ['1', '2', '4', '8', '16', '32', '64'],
+  value: '8',
+  description : '''WAL block size, in kilobytes''')
+
+option('segsize', type : 'integer', value : 1,
+  description : '''Segment size, in gigabytes''')
+
+
+# Miscellaneous options
+
+option('krb_srvnam', type : 'string', value : 'postgres',
+  description : '''Default Kerberos service principal for GSSAPI''')
+
+option('system_tzdata', type: 'string', value: '',
+  description: 'use system time zone data in specified directory')
+
+
+# Defaults
+
+option('pgport', type : 'integer', value : 5432,
+  min: 1, max: 65535,
+  description : '''Default port number for server and clients''')
+
+
+# Developer options
+
+option('cassert', type : 'boolean', value: false,
+  description: 'enable assertion checks (for debugging)')
+
+option('tap_tests', type : 'feature', value : 'auto',
+  description : 'Whether to enable tap tests')
+
+option('PG_TEST_EXTRA', type : 'string', value: '',
+  description: 'Enable selected extra tests')
+
+option('atomics', type : 'boolean', value: true,
+  description: 'whether to use atomic operations')
+
+option('spinlocks', type : 'boolean', value: true,
+  description: 'whether to use spinlocks')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for headers')
+
+option('extra_lib_dirs', type : 'array', value: [],
+  description: 'non-default directories to be searched for libs')
+
+option('extra_version', type : 'string', value: '',
+  description: 'append STRING to the PostgreSQL version number')
+
+option('darwin_sysroot', type : 'string', value: '',
+  description: 'select a non-default sysroot path')
+
+
+# External dependencies
+
+option('bonjour', type : 'feature', value: 'auto',
+  description: 'build with Bonjour support')
+
+option('bsd_auth', type : 'feature', value: 'auto',
+  description: 'build with BSD Authentication support')
+
+option('dtrace', type : 'feature', value: 'disabled',
+  description: 'DTrace support')
+
+option('gssapi', type : 'feature', value: 'auto',
+  description: 'GSSAPI support')
+
+option('icu', type : 'feature', value: 'auto',
+  description: 'ICU support')
+
+option('ldap', type : 'feature', value: 'auto',
+  description: 'LDAP support')
+
+option('libedit_preferred', type : 'boolean', value: false,
+  description: 'Prefer BSD Libedit over GNU Readline')
+
+option('libxml', type : 'feature', value: 'auto',
+  description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+  description: 'XSLT support in contrib/xml2')
+
+option('llvm', type : 'feature', value: 'disabled',
+  description: 'whether to use llvm')
+
+option('lz4', type : 'feature', value: 'auto',
+  description: 'LZ4 support')
+
+option('nls', type: 'feature', value: 'auto',
+  description: 'native language support')
+
+option('pam', type : 'feature', value: 'auto',
+  description: 'build with PAM support')
+
+option('plperl', type : 'feature', value: 'auto',
+  description: 'build Perl modules (PL/Perl)')
+
+option('plpython', type : 'feature', value: 'auto',
+  description: 'build Python modules (PL/Python)')
+
+option('pltcl', type : 'feature', value: 'auto',
+  description: 'build with TCL support')
+
+option('tcl_version', type : 'string', value : 'tcl',
+  description: 'specify TCL version')
+
+option('readline', type : 'feature', value : 'auto',
+  description: 'use GNU Readline or BSD Libedit for editing')
+
+option('selinux', type : 'feature', value : 'disabled',
+  description: 'build with SELinux support')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'],
+  value : 'none',
+  description: 'use LIB for SSL/TLS support (openssl)')
+
+option('systemd', type : 'feature', value: 'auto',
+  description: 'build with systemd support')
+
+option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'],
+  value : 'none',
+  description: 'build contrib/uuid-ossp using LIB')
+
+option('zlib', type : 'feature', value: 'auto',
+  description: 'whether to use zlib')
+
+option('zstd', type : 'feature', value: 'auto',
+  description: 'whether to use zstd')
+
+
+# Programs
+
+option('BISON', type : 'array', value: ['bison', 'win_bison'],
+  description: 'path to bison binary')
+
+option('DTRACE', type : 'string', value: 'dtrace',
+  description: 'path to dtrace binary')
+
+option('FLEX', type : 'array', value: ['flex', 'win_flex'],
+  description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+  description: 'path to gzip binary')
+
+option('LZ4', type : 'string', value: 'lz4',
+  description: 'path to lz4 binary')
+
+option('PERL', type : 'string', value: 'perl',
+  description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+  description: 'path to prove binary')
+
+option('PYTHON', type : 'array', value: ['python3', 'python'],
+  description: 'path to python binary')
+
+option('SED', type : 'string', value: 'gsed',
+  description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+  description: 'path to tar binary')
+
+option('XMLLINT', type : 'string', value: 'xmllint',
+  description: 'path to xmllint binary')
+
+option('XSLTPROC', type : 'string', value: 'xsltproc',
+  description: 'path to xsltproc binary')
+
+option('ZSTD', type : 'string', value: 'zstd',
+  description: 'path to zstd binary')
+
+option('ZIC', type : 'string', value: 'zic',
+  description: 'path to zic binary, when cross-compiling')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..b515af15bfa
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,12 @@
+# libraries that other subsystems might depend upon first, in their respective
+# dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
+
+subdir('interfaces')
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..daf8b4aa44f
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,56 @@
+# files to build into backend
+timezone_sources = files(
+  'localtime.c',
+  'pgtz.c',
+  'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+   'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+  'data/tzdata.zi'
+)
+
+
+if get_option('system_tzdata') == ''
+  # FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+  # build our zic. But for that we'd need to run a good chunk of the configure
+  # tests both natively and cross. Unclear if it's worth it.
+  if meson.is_cross_build()
+    zic = find_program(get_option('ZIC'), native: true, required: true)
+  else
+    zic = executable('zic', zic_sources,
+                     dependencies: [frontend_code],
+                     kwargs: default_bin_args + {'install': false}
+                    )
+  endif
+
+  tzdata = custom_target('tzdata',
+    input: tzdata,
+    output: ['timezone'],
+    command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+    install: true,
+    install_dir: dir_data,
+  )
+
+  bin_targets += tzdata
+
+  # FIXME: make sorts this - but the file isn't actually used, so ...
+  custom_target('abbrevs.txt',
+    input: tzdata,
+    output: ['abbrevs.txt'],
+    command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+    capture: true)
+
+endif
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..7e0a682bd9e
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,21 @@
+tznames = files(
+  'Africa.txt',
+  'America.txt',
+  'Antarctica.txt',
+  'Asia.txt',
+  'Atlantic.txt',
+  'Australia.txt',
+  'Etc.txt',
+  'Europe.txt',
+  'Indian.txt',
+  'Pacific.txt',
+)
+
+tznames_sets = files(
+  'Default',
+  'Australia',
+  'India')
+
+install_data(tznames, tznames_sets,
+  install_dir: dir_data / 'timezonesets',
+)
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..50e501a8011
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+#
+# Returns the path to the meson binary, for cases where we need to call it as
+# part of the build, e.g. to install into tmp_install/ for the tests.
+
+import os
+import shlex
+import sys
+
+to_print = []
+
+if 'MUON_PATH' in os.environ:
+    to_print += ['muon', os.environ['MUON_PATH']]
+else:
+    mesonintrospect = os.environ['MESONINTROSPECT']
+    components = shlex.split(mesonintrospect)
+
+    if len(components) < 2:
+        print('expected more than two components, got: %s' % components)
+        sys.exit(1)
+
+    if components[-1] != 'introspect':
+        print('expected introspection at the end')
+        sys.exit(1)
+
+    to_print += ['meson'] + components[:-1]
+
+print('\n'.join(to_print), end='')
+
+sys.exit(0)
diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
new file mode 100644
index 00000000000..68b3ab86614
--- /dev/null
+++ b/src/tools/gen_export.pl
@@ -0,0 +1,81 @@
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $format;
+my $libname;
+my $input;
+my $output;
+
+GetOptions(
+	'format:s'   => \$format,
+	'libname:s'    => \$libname,
+	'input:s' => \$input,
+	'output:s'  => \$output) or die "wrong arguments";
+
+if (not ($format eq 'aix' or $format eq 'darwin' or $format eq 'gnu' or $format eq 'win'))
+{
+	die "$0: $format is not yet handled (only aix, darwin, gnu, win are)\n";
+}
+
+open(my $input_handle, '<', $input)
+  or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+  or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+	print $output_handle "{
+  global:
+";
+}
+elsif ($format eq 'win')
+{
+	# XXX: Looks like specifying LIBRARY $libname is optional, which makes it
+	# easier to build a generic command for generating export files...
+	if ($libname)
+	{
+		print $output_handle "LIBRARY $libname\n";
+	}
+	print $output_handle "EXPORTS\n";
+}
+
+while (<$input_handle>)
+{
+	if (/^#/)
+	{
+		# don't do anything with a comment
+	}
+	elsif (/^(\S+)\s+(\S+)/)
+	{
+		if ($format eq 'aix')
+		{
+			print $output_handle "$1\n";
+		}
+		elsif ($format eq 'darwin')
+		{
+			print $output_handle "_$1\n";
+		}
+		elsif ($format eq 'gnu')
+		{
+			print $output_handle "    $1;\n";
+		}
+		elsif ($format eq 'win')
+		{
+			print $output_handle "$1 @ $2\n";
+		}
+	}
+	else
+	{
+		die "$0: unexpected line $_\n";
+	}
+}
+
+if ($format eq 'gnu')
+{
+	print $output_handle "  local: *;
+};
+";
+}
diff --git a/src/tools/pgflex b/src/tools/pgflex
new file mode 100755
index 00000000000..baabe2df1c8
--- /dev/null
+++ b/src/tools/pgflex
@@ -0,0 +1,85 @@
+#!/usr/bin/env python3
+
+#
+# Wrapper around flex that:
+# - ensures lex.backup is created in a private directory
+# - can error out if lex.backup is created (--no-backup)
+# - can fix warnings (--fix-warnings)
+# - works around concurrency issues with win_flex.exe:
+#   https://github.com/lexxmark/winflexbison/issues/86
+
+import argparse
+import os
+import subprocess
+import sys
+from os.path import abspath
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--flex', type=abspath, required=True)
+parser.add_argument('--perl', type=abspath, required=True)
+parser.add_argument('--builddir', type=abspath, required=True)
+parser.add_argument('--srcdir', type=abspath, required=True)
+parser.add_argument('--privatedir', type=abspath, required=True,
+                    help='private directory for target')
+
+parser.add_argument('-o', dest='output_file', type=abspath, required=True,
+                    help='output file')
+parser.add_argument('-i', dest='input_file', type=abspath, help='input file')
+
+
+parser.add_argument('--fix-warnings', action='store_true',
+                    help='whether to fix warnings in generated file')
+parser.add_argument('--no-backup', action='store_true',
+                    help='whether no_backup is enabled or not')
+
+parser.add_argument('flex_flags', nargs='*', help='flags passed on to flex')
+
+args = parser.parse_args()
+
+# Since 'lex.backup' is always named that and ninja uses the top level build
+# directory as current directory for all commands, change directory to
+# temporary directory to avoid conflicts between concurrent flex
+# invocations. Only unreleased versions of flex have an argument to change
+# lex.filename to be named differently.
+if not os.path.isdir(args.privatedir):
+    os.mkdir(args.privatedir)
+os.chdir(args.privatedir)
+
+# win_flex.exe generates names in a racy way, sometimes leading to random
+# "error deleting file" failures and sometimes to intermingled file
+# contents. Set FLEX_TMP_DIR to the target private directory to avoid
+# that. That environment variable isn't consulted on other platforms, so we
+# don't even need to make this conditional.
+env = {'FLEX_TMP_DIR': args.privatedir}
+
+# build flex invocation
+command = [args.flex, '-o', args.output_file]
+if args.no_backup:
+    command += ['-b']
+command += args.flex_flags
+command += [args.input_file]
+
+# create .c file from .l file
+sp = subprocess.run(command, env=env)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# check lex.backup
+if args.no_backup:
+    with open('lex.backup') as lex:
+        if len(lex.readlines()) != 1:
+            sys.exit('Scanner requires backup; see lex.backup.')
+    os.remove('lex.backup')
+
+# fix warnings
+if args.fix_warnings:
+    fix_warning_script = os.path.join(args.srcdir,
+                                      'src/tools/fix-old-flex-code.pl')
+
+    command = [args.perl, fix_warning_script, args.output_file]
+    sp = subprocess.run(command)
+    if sp.returncode != 0:
+        sys.exit(sp.returncode)
+
+sys.exit(0)
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..7a64fe76a2d
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+
+import argparse
+import shutil
+import subprocess
+import os
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--srcdir', help='source directory of test', type=str)
+parser.add_argument('--basedir', help='base directory of test', type=str)
+parser.add_argument('--testgroup', help='test group', type=str)
+parser.add_argument('--testname', help='test name', type=str)
+parser.add_argument('test_command', nargs='*')
+
+args = parser.parse_args()
+
+testdir = '{}/testrun/{}/{}'.format(
+    args.basedir, args.testgroup, args.testname)
+
+print('# executing test in {} group {} test {}'.format(
+    testdir, args.testgroup, args.testname))
+sys.stdout.flush()
+
+if os.path.exists(testdir) and os.path.isdir(testdir):
+    shutil.rmtree(testdir)
+os.makedirs(testdir)
+
+os.chdir(args.srcdir)
+
+# mark test as having started
+open(os.path.join(testdir, 'test.start'), 'x')
+
+env_dict = {**os.environ,
+            'TESTDATADIR': os.path.join(testdir, 'data'),
+            'TESTLOGDIR': os.path.join(testdir, 'log')}
+
+sp = subprocess.run(args.test_command, env=env_dict)
+
+if sp.returncode == 0:
+    print('# test succeeded')
+    open(os.path.join(testdir, 'test.success'), 'x')
+else:
+    print('# test failed')
+    open(os.path.join(testdir, 'test.fail'), 'x')
+sys.exit(sp.returncode)
-- 
2.37.3.542.gdd3f6c4cae

#323Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#322)
Re: [RFC] building postgres with meson - v13

Andres Freund <andres@anarazel.de> writes:

I think we should:

- convert windows to build with ninja - it builds faster, runs all tests,
parallelizes tests. That means that msbuild based builds don't have coverage
via CI / cfbot, but we don't currently have the resources to test both.

Check. The sooner we can get rid of the custom MSVC scripts, the better,
because now we'll be on the hook to maintain *three* build systems.

- add a linux build using meson, we currently can afford building both with
autoconf and meson for linux

Right.

I'm less clear on whether we should convert macos / freebsd to meson at this
point?

We certainly could debug/polish the meson stuff just on linux and windows
for now, but is there a reason to wait on the others?

regards, tom lane

#324Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#323)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-21 13:56:37 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

I think we should:

- convert windows to build with ninja - it builds faster, runs all tests,
parallelizes tests. That means that msbuild based builds don't have coverage
via CI / cfbot, but we don't currently have the resources to test both.

Check. The sooner we can get rid of the custom MSVC scripts, the better,
because now we'll be on the hook to maintain *three* build systems.

Agreed. I think the only "major" missing thing is the windows resource file
generation stuff, which is mostly done in one of the "later" commits. Also
need to test a few more of the optional dependencies (ICU, gettext, ...) on
windows (I did test zlib, lz4, zstd). And of course get a bit of wider
exposure than "just me and CI".

I'm less clear on whether we should convert macos / freebsd to meson at this
point?

We certainly could debug/polish the meson stuff just on linux and windows
for now, but is there a reason to wait on the others?

No - freebsd and macos have worked in CI for a long time. I was wondering
whether we want more coverage for autoconf in CI, but thinking about it
futher, it's more important to have the meson coverage.

Greetings,

Andres Freund

#325Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#322)
Re: [RFC] building postgres with meson - v13

On Wed, Sep 21, 2022 at 09:46:30AM -0700, Andres Freund wrote:

I think we should:

- convert windows to build with ninja - it builds faster, runs all tests,
parallelizes tests. That means that msbuild based builds don't have coverage
via CI / cfbot, but we don't currently have the resources to test both.

+1

If multiple Windows (or other) tasks are going to exist, I think they
should have separate "ci-os-only" conditions, like windows-msvc,
windows-ninja, ... It should be possible to run only one.

#326Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#322)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-21 09:46:30 -0700, Andres Freund wrote:

After that I am planning to split the "ci" commit so that it converts a few of
the CI tasks to use meson, without adding all the other platforms I added for
development. I think that's important to get in soon, given that it'll
probably take a bit until the buildfarm grows meson coverage and because it
provides cfbot coverage which seems important for now as well.

I think we should:

- convert windows to build with ninja - it builds faster, runs all tests,
parallelizes tests. That means that msbuild based builds don't have coverage
via CI / cfbot, but we don't currently have the resources to test both.

I was working on that and hit an issue that took me a while to resolve: Once I
tested only the "main" meson commit plus CI the windows task was running out
of memory. There was an outage of the CI provider at the same time, so I first
blamed it on that. But it turns out to be "legitimately" high memory usage
related to debug symbols - the only reason CI didn't show that before was that
it's incidentally fixed as a indirect consequence of using precompiled
headers, in a later commit. Argh. It can also be fixed by the option required
to use ccache at some point, so I'll do that for now.

Greetings,

Andres Freund

#327Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#322)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-21 09:46:30 -0700, Andres Freund wrote:

I'm planning to commit this today, unless somebody wants to argue against
that.

And done!

Changes:
- fixed a few typos (thanks Thomas)
- less duplication in the CI tasks
- removed an incomplete implementation of the target for abbrevs.txt - do we
even want to have that?
- plenty hand wringing on my part

I also rebased my meson git tree, which still has plenty additional test
platforms (netbsd, openbsd, debian sid, fedora rawhide, centos 8, centos 7,
opensuse tumbleweed), but without the autoconf versions of those targets. I
also added a commit that translates most of the CompilerWarnings task to
meson. Still need to add a headerscheck / cpluspluscheck target.

Greetings,

Andres Freund

#328Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#327)
Re: [RFC] building postgres with meson - v13

On 2022-09-22 Th 01:57, Andres Freund wrote:

Hi,

On 2022-09-21 09:46:30 -0700, Andres Freund wrote:

I'm planning to commit this today, unless somebody wants to argue against
that.

And done!

Changes:
- fixed a few typos (thanks Thomas)
- less duplication in the CI tasks
- removed an incomplete implementation of the target for abbrevs.txt - do we
even want to have that?
- plenty hand wringing on my part

I also rebased my meson git tree, which still has plenty additional test
platforms (netbsd, openbsd, debian sid, fedora rawhide, centos 8, centos 7,
opensuse tumbleweed), but without the autoconf versions of those targets. I
also added a commit that translates most of the CompilerWarnings task to
meson. Still need to add a headerscheck / cpluspluscheck target.

Great. Now I'll start on buildfarm support. Given my current
commitments, this will take me a while, but I hope to have a working
client by about the beginning of November.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#329Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#327)
Re: [RFC] building postgres with meson - v13

Andres Freund <andres@anarazel.de> writes:

On 2022-09-21 09:46:30 -0700, Andres Freund wrote:

I'm planning to commit this today, unless somebody wants to argue against
that.

And done!

Yay!

Initial reports from the cfbot are mostly promising, but there are a few
patches where all the meson builds fail while all the autoconf ones pass,
so there's something for you to look at. So far CF entries 3464, 3733,
3771, 3808 look that way.

regards, tom lane

#330Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Tom Lane (#329)
Re: [RFC] building postgres with meson - v13

On 2022-Sep-22, Tom Lane wrote:

Initial reports from the cfbot are mostly promising, but there are a few
patches where all the meson builds fail while all the autoconf ones pass,
so there's something for you to look at. So far CF entries 3464, 3733,
3771, 3808 look that way.

Hmm, but those patches add files, which means they're now outdated: they
need to add these files to the respective meson.build file.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"La experiencia nos dice que el hombre peló millones de veces las patatas,
pero era forzoso admitir la posibilidad de que en un caso entre millones,
las patatas pelarían al hombre" (Ijon Tichy)

#331Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#330)
Re: [RFC] building postgres with meson - v13

Alvaro Herrera <alvherre@alvh.no-ip.org> writes:

On 2022-Sep-22, Tom Lane wrote:

Initial reports from the cfbot are mostly promising, but there are a few
patches where all the meson builds fail while all the autoconf ones pass,
so there's something for you to look at. So far CF entries 3464, 3733,
3771, 3808 look that way.

Hmm, but those patches add files, which means they're now outdated: they
need to add these files to the respective meson.build file.

Ah, right, the joys of maintaining multiple build systems. I wonder
if there's any way to avoid that by scraping file lists from one
group to the other. We got a little spoiled perhaps by the MSVC
scripts managing to do that in most cases.

regards, tom lane

#332Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#330)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-22 16:56:57 +0200, Alvaro Herrera wrote:

On 2022-Sep-22, Tom Lane wrote:

Initial reports from the cfbot are mostly promising, but there are a few
patches where all the meson builds fail while all the autoconf ones pass,
so there's something for you to look at. So far CF entries 3464, 3733,
3771, 3808 look that way.

Hmm, but those patches add files, which means they're now outdated: they
need to add these files to the respective meson.build file.

Yea, I looked through all of these and they all need need a simple addition of
a file to be built or installed.

Greetings,

Andres Freund

#333Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#328)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-22 04:29:15 -0400, Andrew Dunstan wrote:

Great. Now I'll start on buildfarm support. Given my current
commitments, this will take me a while, but I hope to have a working
client by about the beginning of November.

Great! Let me know if there's something I can do to help.

Greetings,

Andres Freund

#334Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Tom Lane (#331)
Re: [RFC] building postgres with meson - v13

On 2022-Sep-22, Tom Lane wrote:

Ah, right, the joys of maintaining multiple build systems. I wonder
if there's any way to avoid that by scraping file lists from one
group to the other.

Or maybe we could have a file common to both, say OBJS, which both
scrape in their own way. That could be easier than one scraping the
other.

We got a little spoiled perhaps by the MSVC scripts managing to do
that in most cases.

Right ... and it was so annoying in the cases it couldn't.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"Aprender sin pensar es inútil; pensar sin aprender, peligroso" (Confucio)

#335Nathan Bossart
nathandbossart@gmail.com
In reply to: Andres Freund (#333)
Re: [RFC] building postgres with meson - v13

I gave the meson build system a try, and it seems to work nicely. It
didn't take long at all to adapt my workflow.

A few notes from my experience:

* I'm using an Ubuntu-based distribution, and the version of meson that apt
installed was not new enough for Postgres. I ended up cloning meson [0]https://github.com/mesonbuild/meson
and using the newest tag. This is no big deal.

* The installed binaries were unable to locate libraries like libpq. I
ended up setting the extra_lib_dirs option to the directory where these
libraries were installed to fix this. This one is probably worth
investigating further.

* meson really doesn't like it when there are things leftover from
configure/make. Whenever I switch from make to meson, I have to run 'make
maintainer-clean'.

Otherwise, all of my usual build options, ccache, etc. are working just
like before. Nice work!

[0]: https://github.com/mesonbuild/meson

--
Nathan Bossart
Amazon Web Services: https://aws.amazon.com

In reply to: Nathan Bossart (#335)
Re: [RFC] building postgres with meson - v13

On Thu, Sep 22, 2022 at 1:05 PM Nathan Bossart <nathandbossart@gmail.com> wrote:

Otherwise, all of my usual build options, ccache, etc. are working just
like before. Nice work!

+1

Is it generally recommended that individual hackers mostly switch over
to Meson for their day to day work soon? I'm guessing that this
question doesn't really have a clear answer yet, but thought I'd ask,
just in case.

--
Peter Geoghegan

#337Andres Freund
andres@anarazel.de
In reply to: Nathan Bossart (#335)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-22 13:05:33 -0700, Nathan Bossart wrote:

I gave the meson build system a try, and it seems to work nicely. It
didn't take long at all to adapt my workflow.

A few notes from my experience:

* I'm using an Ubuntu-based distribution, and the version of meson that apt
installed was not new enough for Postgres. I ended up cloning meson [0]
and using the newest tag. This is no big deal.

I assume this is 20.04 LTS? If so, we're missing it by one version of meson
currently. There's unfortunately a few features that'd be a bit painful to not
have.

* The installed binaries were unable to locate libraries like libpq. I
ended up setting the extra_lib_dirs option to the directory where these
libraries were installed to fix this. This one is probably worth
investigating further.

I think that should be "fixed" in a later commit in the meson tree - any
chance you could try that?

https://github.com/anarazel/postgres/tree/meson

* meson really doesn't like it when there are things leftover from
configure/make. Whenever I switch from make to meson, I have to run 'make
maintainer-clean'.

Yes. I recommend building out-of-tree with autoconf as well.

Otherwise, all of my usual build options, ccache, etc. are working just
like before. Nice work!

Cool!

Thanks for testing,

Andres Freund

#338Andres Freund
andres@anarazel.de
In reply to: Peter Geoghegan (#336)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-22 13:21:28 -0700, Peter Geoghegan wrote:

Is it generally recommended that individual hackers mostly switch over
to Meson for their day to day work soon? I'm guessing that this
question doesn't really have a clear answer yet, but thought I'd ask,
just in case.

It'll probably depend on who you ask ;)

I'm likely the most biased person on this, but for me the reliable incremental
builds and the readability of the test output are big enough wins that the
answer is pretty clear... Doesn't hurt that running all tests is faster too.

The currently existing limitations are imo mostly around making it usable for
production, particularly on windows.

time to run all tests (cassert, -Og), in a fully built tree:

make:

time make -j48 -s -Otarget check-world
real 2m44.206s
user 6m29.121s
sys 1m54.069s

time make -j48 -s -Otarget check-world PROVE_FLAGS='-j4'
real 1m1.577s
user 7m32.579s
sys 2m17.767s

meson:

time meson test
real 0m42.178s
user 7m8.533s
sys 2m17.711s

FWIW, I just rebased my older patch to cache and copy initdb during the
tests. The %user saved is impressive enough to pursue it again...

time make -j48 -s -Otarget check-world PROVE_FLAGS='-j4'
real 0m52.655s
user 2m19.504s
sys 1m26.264s

time meson test:

real 0m36.370s
user 2m14.748s
sys 1m36.741s

Greetings,

Andres Freund

In reply to: Andres Freund (#338)
Re: [RFC] building postgres with meson - v13

On Thu, Sep 22, 2022 at 2:50 PM Andres Freund <andres@anarazel.de> wrote:

I'm likely the most biased person on this, but for me the reliable incremental
builds and the readability of the test output are big enough wins that the
answer is pretty clear... Doesn't hurt that running all tests is faster too.

It's nice that things are much more discoverable now. For example, if
you want to run some random test on its own then you just...do it in
the obvious, discoverable way. It took me about 2 minutes to figure
out how to do that, without reading any documentation.

OTOH doing the same thing with the old autoconf-based build system
requires the user to know the exact magical incantation for Postgres
tests. You just have to know to run the 2 or 3 tests that are
undocumented (or poorly documented) dependencies first. That seems
like an enormous usability improvement, especially for those of us
that haven't been working on Postgres for years.

time to run all tests (cassert, -Og), in a fully built tree:

time make -j48 -s -Otarget check-world PROVE_FLAGS='-j4'
real 1m1.577s
user 7m32.579s
sys 2m17.767s

time meson test
real 0m42.178s
user 7m8.533s
sys 2m17.711s

Sold!

--
Peter Geoghegan

#340Nathan Bossart
nathandbossart@gmail.com
In reply to: Andres Freund (#337)
Re: [RFC] building postgres with meson - v13

On Thu, Sep 22, 2022 at 01:28:09PM -0700, Andres Freund wrote:

On 2022-09-22 13:05:33 -0700, Nathan Bossart wrote:

* I'm using an Ubuntu-based distribution, and the version of meson that apt
installed was not new enough for Postgres. I ended up cloning meson [0]
and using the newest tag. This is no big deal.

I assume this is 20.04 LTS? If so, we're missing it by one version of meson
currently. There's unfortunately a few features that'd be a bit painful to not
have.

Yes. I imagine I'll upgrade to 22.04 LTS soon, which appears to provide a
new enough version of meson.

* The installed binaries were unable to locate libraries like libpq. I
ended up setting the extra_lib_dirs option to the directory where these
libraries were installed to fix this. This one is probably worth
investigating further.

I think that should be "fixed" in a later commit in the meson tree - any
chance you could try that?

Yup, after cherry-picking 9bc60bc, this is fixed.

--
Nathan Bossart
Amazon Web Services: https://aws.amazon.com

#341Tom Lane
tgl@sss.pgh.pa.us
In reply to: Nathan Bossart (#340)
Re: [RFC] building postgres with meson - v13

... btw, shouldn't the CF entry [1]https://commitfest.postgresql.org/39/3395/ get closed now?
The cfbot's unhappy that the last patch no longer applies.

regards, tom lane

[1]: https://commitfest.postgresql.org/39/3395/

#342Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#341)
14 attachment(s)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-24 13:52:29 -0400, Tom Lane wrote:

... btw, shouldn't the CF entry [1] get closed now?

Unfortunately not - there's quite a few followup patches that haven't been
[fully] reviewed and thus not applied yet.

The cfbot's unhappy that the last patch no longer applies.

Rebased patches attached.

Several patches here are quite trivial (e.g. 0003) or just part of the series
to increase cfbot/ci coverage (0002).

Greetings,

Andres Freund

Attachments:

v15-0001-meson-ci-wip-move-compilerwarnings-task-to-meson.patchtext/x-diff; charset=us-asciiDownload
From 7cd0ecdc3085e8d5c02411194eebf24ed4fcd682 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 20:36:36 -0700
Subject: [PATCH v15 01/14] meson: ci: wip: move compilerwarnings task to meson

---
 .cirrus.yml                            | 92 +++++++++++++-------------
 src/tools/ci/linux-mingw-w64-64bit.txt | 13 ++++
 2 files changed, 59 insertions(+), 46 deletions(-)
 create mode 100644 src/tools/ci/linux-mingw-w64-64bit.txt

diff --git a/.cirrus.yml b/.cirrus.yml
index 0e3b2d42681..3b14563ae27 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -465,6 +465,10 @@ task:
   ccache_cache:
     folder: $CCACHE_DIR
 
+  ccache_stats_start_script:
+    ccache -s
+    ccache -z
+
   setup_additional_packages_script: |
     #apt-get update
     #DEBIAN_FRONTEND=noninteractive apt-get -y install ...
@@ -473,8 +477,6 @@ task:
   # Test that code can be built with gcc/clang without warnings
   ###
 
-  setup_script: echo "COPT=-Werror" > src/Makefile.custom
-
   # Trace probes have a history of getting accidentally broken. Use the
   # different compilers to build with different combinations of dtrace on/off
   # and cassert on/off.
@@ -482,57 +484,58 @@ task:
   # gcc, cassert off, dtrace on
   always:
     gcc_warning_script: |
-      time ./configure \
-        --cache gcc.cache \
-        --enable-dtrace \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      mkdir build && cd build
+      CC="ccache gcc" CXX="ccache g++" \
+        meson setup \
+          -Dwerror=true \
+          -Dcassert=false \
+          -Ddtrace=enabled \
+          ${LINUX_MESON_FEATURES} \
+          ..
+      time ninja -j${BUILD_JOBS}
 
   # gcc, cassert on, dtrace off
   always:
     gcc_a_warning_script: |
-      time ./configure \
-        --cache gcc.cache \
-        --enable-cassert \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      cd build
+      meson configure \
+        -Dcassert=true \
+        -Ddtrace=disabled
+      time ninja -j${BUILD_JOBS}
 
   # clang, cassert off, dtrace off
   always:
     clang_warning_script: |
-      time ./configure \
-        --cache clang.cache \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      rm -rf build
+      mkdir build && cd build
+      CC="ccache clang" CXX="ccache clang++" \
+        meson setup \
+          -Dwerror=true \
+          -Dcassert=false \
+          -Ddtrace=disabled \
+          ${LINUX_MESON_FEATURES} \
+          ..
+      time ninja -j${BUILD_JOBS}
 
   # clang, cassert on, dtrace on
   always:
     clang_a_warning_script: |
-      time ./configure \
-        --cache clang.cache \
-        --enable-cassert \
-        --enable-dtrace \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      cd build
+      meson configure \
+        -Dcassert=true \
+        -Ddtrace=enabled
+      time ninja -j${BUILD_JOBS}
 
   # cross-compile to windows
   always:
     mingw_cross_warning_script: |
-      time ./configure \
-        --host=x86_64-w64-mingw32 \
-        --enable-cassert \
-        CC="ccache x86_64-w64-mingw32-gcc" \
-        CXX="ccache x86_64-w64-mingw32-g++"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      mkdir build-w64 && cd build-w64
+      meson setup \
+        --cross-file=../src/tools/ci/linux-mingw-w64-64bit.txt \
+        -Dwerror=true \
+        -Dcassert=true \
+        ..
+      time ninja -j${BUILD_JOBS}
 
   ###
   # Verify docs can be built
@@ -540,13 +543,8 @@ task:
   # XXX: Only do this if there have been changes in doc/ since last build
   always:
     docs_build_script: |
-      time ./configure \
-        --cache gcc.cache \
-        CC="ccache gcc" \
-        CXX="ccache g++" \
-        CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} -C doc
+      cd build
+      time ninja docs
 
   ###
   # Verify headerscheck / cpluspluscheck succeed
@@ -565,11 +563,13 @@ task:
         ${LINUX_CONFIGURE_FEATURES} \
         --without-icu \
         --quiet \
-        CC="gcc" CXX"=g++" CLANG="clang"
-      make -s -j${BUILD_JOBS} clean
+        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
+      make -s -j${BUILD_JOBS} world-bin
       time make -s headerscheck EXTRAFLAGS='-fmax-errors=10'
     headers_cpluspluscheck_script: |
       time make -s cpluspluscheck EXTRAFLAGS='-Wno-register -fmax-errors=10'
 
   always:
+    ccache_stats_end_script:
+      ccache -s
     upload_caches: ccache
diff --git a/src/tools/ci/linux-mingw-w64-64bit.txt b/src/tools/ci/linux-mingw-w64-64bit.txt
new file mode 100644
index 00000000000..9d43b6dcfbc
--- /dev/null
+++ b/src/tools/ci/linux-mingw-w64-64bit.txt
@@ -0,0 +1,13 @@
+[binaries]
+c = ['ccache', '/usr/bin/x86_64-w64-mingw32-gcc']
+cpp = ['ccache', '/usr/bin/x86_64-w64-mingw32-g++']
+ar = '/usr/bin/x86_64-w64-mingw32-ar'
+strip = '/usr/bin/x86_64-w64-mingw32-strip'
+pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
+windres = '/usr/bin/x86_64-w64-mingw32-windres'
+
+[host_machine]
+system = 'windows'
+cpu_family = 'x86_64'
+cpu = 'x86_64'
+endian = 'little'
-- 
2.37.3.542.gdd3f6c4cae

v15-0002-meson-ci-dontmerge-Add-additional-CI-coverage.patchtext/x-diff; charset=us-asciiDownload
From eb6475e0284426f7c02b3380578ff5c64d8bdae2 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 22:08:00 -0700
Subject: [PATCH v15 02/14] meson: ci: dontmerge: Add additional CI coverage

This is part of the series to be able to test meson on more platforms than
normally part of CI.

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Justin Pryzby <pryzby@telsasoft.com>
---
 .cirrus.yml                                   | 253 ++++++++++++++++--
 src/tools/ci/docker/linux_centos7             |  57 ++++
 src/tools/ci/docker/linux_centos8             |  54 ++++
 src/tools/ci/docker/linux_fedora_rawhide      |  49 ++++
 src/tools/ci/docker/linux_opensuse_tumbleweed |  56 ++++
 5 files changed, 453 insertions(+), 16 deletions(-)
 create mode 100644 src/tools/ci/docker/linux_centos7
 create mode 100644 src/tools/ci/docker/linux_centos8
 create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
 create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed

diff --git a/.cirrus.yml b/.cirrus.yml
index 3b14563ae27..965483550d1 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -126,6 +126,90 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
 
 
+task:
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+  matrix:
+    - name: NetBSD - 9 - Meson
+      only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
+      env:
+        IMAGE_NAME: pg-ci-netbsd-9-postgres
+        PLATFORM: netbsd
+        INCLUDE_DIRS: -Dextra_lib_dirs=/usr/pkg/lib -Dextra_include_dirs=/usr/pkg/include
+
+    - name: OpenBSD - 7 - Meson
+      only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
+      env:
+        IMAGE_NAME: pg-ci-openbsd-7-postgres
+        PLATFORM: openbsd
+        INCLUDE_DIRS: -Dextra_include_dirs=/usr/local/include -Dextra_lib_dirs=/usr/local/lib
+        UUID: -Duuid=e2fs
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/${IMAGE_NAME}
+    platform: ${PLATFORM}
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:users /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:users ${CCACHE_DIR}
+
+  # -Duuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD & openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl ${UUID} \
+        -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \
+        ${INCLUDE_DIRS} \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 # configure feature flags, shared between the task running the linux tests and
 # the CompilerWarnings task
 LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -152,6 +236,22 @@ LINUX_MESON_FEATURES: &LINUX_MESON_FEATURES >-
   -Duuid=e2fs
 
 
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+  sysinfo_script: |
+    id
+    uname -a
+    cat /proc/cmdline
+    ulimit -a -H && ulimit -a -S
+    export
+  create_user_script: |
+    useradd -m -U postgres
+    chown -R postgres:postgres .
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+    su postgres -c "ulimit -l -H && ulimit -l -S"
+
+
 task:
   env:
     CPUS: 4
@@ -181,19 +281,9 @@ task:
   ccache_cache:
     folder: ${CCACHE_DIR}
 
-  sysinfo_script: |
-    id
-    uname -a
-    cat /proc/cmdline
-    ulimit -a -H && ulimit -a -S
-    export
-  create_user_script: |
-    useradd -m postgres
-    chown -R postgres:postgres .
-    mkdir -p ${CCACHE_DIR}
-    chown -R postgres:postgres ${CCACHE_DIR}
+  set_limits_script: |
     echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
-    su postgres -c "ulimit -l -H && ulimit -l -S"
+  <<: *linux_preparation_scripts_template
   setup_core_files_script: |
     mkdir -m 770 /tmp/cores
     chown root:postgres /tmp/cores
@@ -227,7 +317,13 @@ task:
       on_failure:
         <<: *on_failure_ac
 
-    - name: Linux - Debian Bullseye - Meson
+    - matrix:
+        - name: Linux - Debian Bullseye - Meson
+        - name: Linux - Debian Sid - Meson
+          trigger_type: manual
+
+          compute_engine_instance:
+            image: family/pg-ci-sid
 
       configure_script: |
         su postgres <<-EOF
@@ -255,6 +351,81 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
 
 
+task:
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: ${DEBUGINFO}
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: ${DOCKERFILE_PATH}
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+  matrix:
+    - name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+      env:
+        DOCKERFILE_PATH: src/tools/ci/docker/linux_opensuse_tumbleweed
+        DEBUGINFO: "https://debuginfod.opensuse.org/"
+        LLVM: -Dllvm=enabled
+
+    - trigger_type: manual
+      matrix:
+        - name: Linux - Fedora Rawhide - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+            DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+        - name: Linux - Centos 8 - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+            DEBUGINFO: "http://debuginfo.centos.org/"
+
+        - name: Linux - Centos 7 - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+            DEBUGINFO: "http://debuginfo.centos.org/"
+
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl -Duuid=e2fs ${LLVM} \
+        -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 task:
   name: macOS - Monterey - Meson
 
@@ -355,9 +526,7 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
 
 
-task:
-  name: Windows - Server 2019, VS 2019 - Meson & ninja
-
+windows_template: &windows_template
   env:
     # Half the allowed per-user CPU cores
     CPUS: 4
@@ -373,6 +542,20 @@ task:
     # Avoids port conflicts between concurrent tap test runs
     PG_TEST_USE_UNIX_SOCKETS: 1
     PG_REGRESS_SOCK_DIR: "c:/cirrus/"
+    # -m enables parallelism
+    # verbosity:minimal + Summary reduce verbosity, while keeping a summary of
+    #   errors/warnings
+    # ForceNoAlign prevents msbuild from introducing line-breaks for long lines
+    # disable file tracker, we're never going to rebuild, and it slows down the
+    #   build
+    MSBFLAGS: -m -verbosity:minimal "-consoleLoggerParameters:Summary;ForceNoAlign" /p:TrackFileAccess=false -nologo
+
+    # If tests hang forever, cirrus eventually times out. In that case log
+    # output etc is not uploaded, making the problem hard to debug. Of course
+    # tests internally should have shorter timeouts, but that's proven to not
+    # be sufficient. 15min currently is fast enough to finish individual test
+    # "suites".
+    T_C: "\"C:/Program Files/Git/usr/bin/timeout.exe\" -v -k60s 15m"
 
     # startcreate_script starts a postgres instance that we don't want to get
     # killed at the end of that script (it's stopped in stop_script). Can't
@@ -406,6 +589,16 @@ task:
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
 
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+  meson_install_wraps_script: |
+    mkdir subprojects
+    meson wrap install lz4
+    meson wrap install zlib
+
   # Use /DEBUG:FASTLINK to avoid high memory usage during linking
   configure_script: |
     vcvarsall x64
@@ -426,6 +619,34 @@ task:
       type: text/plain
 
 
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+  meson_install_wraps_script: |
+    mkdir subprojects
+    meson wrap install lz4
+    meson wrap install zlib
+
+  configure_script: |
+    vcvarsall x64
+    meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+
+  build_script: |
+    vcvarsall x64
+    msbuild %MSBFLAGS% build\postgresql.sln
+
+  check_world_script: |
+    vcvarsall x64
+    meson test %MTEST_ARGS% --num-processes %TEST_JOBS%
+
+  on_failure:
+    <<: *on_failure_meson
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+      type: text/plain
+
+
 task:
   name: CompilerWarnings
 
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+  yum -y install dnf-plugins-core \
+  epel-release \
+  centos-release-scl-rh && \
+  \
+  yum -y update && \
+  yum -y install \
+  \
+  git \
+  perl \
+  perl-ExtUtils-Embed \
+  perl-IPC-Run \
+  perl-Test-Harness \
+  perl-Test-Simple \
+  \
+  bison \
+  ccache \
+  clang \
+  devtoolset-7-make \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  && \
+  pip3 install meson && \
+  pip3 install ninja && \
+  yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+  dnf -y install dnf-plugins-core && \
+  dnf config-manager --set-enabled powertools && \
+  dnf -y install epel-release && \
+  dnf -y update && \
+  dnf -y install \
+  \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  diffutils \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  glibc-langpack-en \
+  \
+  && \
+  pip3 install ninja && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+  dnf -y update && \
+  dnf -y install \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gettext \
+  ninja-build \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  langpacks-en \
+  glibc-langpack-en \
+  \
+  && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+  zypper -n clean -a && \
+  zypper -n ref && \
+  zypper -n dup && \
+  zypper -n update && \
+  zypper -n install \
+  diffutils \
+  git \
+  icu \
+  make \
+  meson \
+  perl-IPC-Run \
+  shadow \
+  systemd-devel \
+  util-linux \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gcc-c++ \
+  gettext-runtime \
+  ninja \
+  \
+  krb5-devel \
+  libicu-devel \
+  libldapcpp-devel \
+  liblz4-devel \
+  libopenssl-devel \
+  libselinux-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  pam-devel \
+  python38-devel \
+  readline-devel \
+  tcl-devel \
+  \
+  openldap2 \
+  openldap2-client \
+  \
+  krb5-client \
+  krb5-plugin-kdb-ldap \
+  krb5-server \
+  lz4 \
+  zstd \
+  \
+  && \
+  zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
-- 
2.37.3.542.gdd3f6c4cae

v15-0003-meson-prereq-De-special-case-pgevent-s-rc-file-h.patchtext/x-diff; charset=us-asciiDownload
From 06a8962dc47979071641028b3bda5ae21bab09c9 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 13 Sep 2022 10:07:18 -0700
Subject: [PATCH v15 03/14] meson: prereq: De-special-case pgevent's rc file
 handling

There's really no need to build win32ver.rc as part of building pgmsgevent.rc.
---
 src/bin/pgevent/Makefile      | 5 +++--
 src/bin/pgevent/pgmsgevent.rc | 2 --
 src/tools/msvc/Mkvcbuild.pm   | 1 -
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/bin/pgevent/Makefile b/src/bin/pgevent/Makefile
index dea79d3f137..04d49711d8d 100644
--- a/src/bin/pgevent/Makefile
+++ b/src/bin/pgevent/Makefile
@@ -17,7 +17,8 @@ ifeq ($(PORTNAME), win32)
 
 OBJS = \
 	pgevent.o \
-	pgmsgevent.o
+	pgmsgevent.o \
+	$(WIN32RES)
 NAME=pgevent
 
 SHLIB_LINK =
@@ -29,7 +30,7 @@ install: all install-lib
 
 include $(top_srcdir)/src/Makefile.shlib
 
-pgmsgevent.o: pgmsgevent.rc win32ver.rc
+pgmsgevent.o: pgmsgevent.rc
 	$(WINDRES) $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(top_srcdir)/src/include --include-dir=$(srcdir) --include-dir=.
 
 clean distclean: clean-lib
diff --git a/src/bin/pgevent/pgmsgevent.rc b/src/bin/pgevent/pgmsgevent.rc
index e69862e882c..0885a897e6f 100644
--- a/src/bin/pgevent/pgmsgevent.rc
+++ b/src/bin/pgevent/pgmsgevent.rc
@@ -1,4 +1,2 @@
 LANGUAGE 0x9,0x1
 1 11 MSG00001.bin
-
-#include "win32ver.rc"
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 098bc3f1b09..ddb4f25eb12 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -425,7 +425,6 @@ sub mkvcbuild
 	$pgevent->AddFiles('src/bin/pgevent', 'pgevent.c', 'pgmsgevent.rc');
 	$pgevent->AddResourceFile('src/bin/pgevent', 'Eventlog message formatter',
 		'win32');
-	$pgevent->RemoveFile('src/bin/pgevent/win32ver.rc');
 	$pgevent->UseDef('src/bin/pgevent/pgevent.def');
 	$pgevent->DisableLinkerWarnings('4104');
 
-- 
2.37.3.542.gdd3f6c4cae

v15-0004-meson-prereq-win-remove-date-from-version-number.patchtext/x-diff; charset=us-asciiDownload
From 7593fd13d95b4f7aafa84ae31ee86cbe182a637e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 14 Sep 2022 16:43:47 -0700
Subject: [PATCH v15 04/14] meson: prereq: win: remove date from version number
 in win32ver.rc

This may have served a purpose at some point, but these days it just
contributes to a non-reproducible build.

Discussion: https://postgr.es/m/1cef5b48-32bd-5cbf-fb62-fb648860f5ef@enterprisedb.com
---
 src/makefiles/Makefile.win32 | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32
index 17d68196442..d268b3ebafd 100644
--- a/src/makefiles/Makefile.win32
+++ b/src/makefiles/Makefile.win32
@@ -69,7 +69,6 @@ win32ver.rc: $(top_srcdir)/src/port/win32ver.rc
 	sed -e 's;FILEDESC;$(PGFILEDESC);' \
 	    -e 's;VFT_APP;$(PGFTYPE);' \
 	    -e 's;_ICO_;$(PGICOSTR);' \
-	    -e 's;\(VERSION.*\),0 *$$;\1,'`date '+%y%j' | sed 's/^0*//'`';' \
 	    -e '/_INTERNAL_NAME_/$(if $(shlib),s;_INTERNAL_NAME_;"$(basename $(shlib))";,d)' \
 	    -e '/_ORIGINAL_NAME_/$(if $(shlib),s;_ORIGINAL_NAME_;"$(shlib)";,d)' \
 	  $< >$@
-- 
2.37.3.542.gdd3f6c4cae

v15-0005-meson-Add-windows-resource-files.patchtext/x-diff; charset=us-asciiDownload
From 523551f8117d2db1a607e29d94704a52cd5679aa Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 11:03:07 -0700
Subject: [PATCH v15 05/14] meson: Add windows resource files

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
---
 src/backend/jit/llvm/meson.build              |   6 +
 .../replication/libpqwalreceiver/meson.build  |   6 +
 src/backend/replication/pgoutput/meson.build  |   6 +
 src/backend/snowball/meson.build              |   6 +
 .../utils/mb/conversion_procs/meson.build     | 144 ++++++++++++++----
 src/bin/initdb/meson.build                    |   6 +
 src/bin/pg_amcheck/meson.build                |   8 +-
 src/bin/pg_archivecleanup/meson.build         |  12 +-
 src/bin/pg_basebackup/meson.build             |  38 ++++-
 src/bin/pg_checksums/meson.build              |  12 +-
 src/bin/pg_config/meson.build                 |  12 +-
 src/bin/pg_controldata/meson.build            |  12 +-
 src/bin/pg_ctl/meson.build                    |  12 +-
 src/bin/pg_dump/meson.build                   |  18 +++
 src/bin/pg_resetwal/meson.build               |  12 +-
 src/bin/pg_rewind/meson.build                 |   6 +
 src/bin/pg_test_fsync/meson.build             |  10 +-
 src/bin/pg_test_timing/meson.build            |  12 +-
 src/bin/pg_upgrade/meson.build                |   6 +
 src/bin/pg_verifybackup/meson.build           |   6 +
 src/bin/pg_waldump/meson.build                |   6 +
 src/bin/pgbench/meson.build                   |   6 +
 src/bin/pgevent/meson.build                   |   6 +
 src/bin/psql/meson.build                      |   6 +
 src/bin/scripts/meson.build                   |  10 +-
 src/interfaces/libpq/meson.build              |   5 +
 src/interfaces/libpq/test/meson.build         |  25 ++-
 src/pl/plperl/meson.build                     |   7 +
 src/pl/plpgsql/src/meson.build                |   6 +
 src/pl/plpython/meson.build                   |   6 +
 src/pl/tcl/meson.build                        |   6 +
 contrib/adminpack/meson.build                 |  12 +-
 contrib/amcheck/meson.build                   |  17 ++-
 contrib/auth_delay/meson.build                |  12 +-
 contrib/auto_explain/meson.build              |  12 +-
 contrib/basebackup_to_shell/meson.build       |   6 +
 contrib/basic_archive/meson.build             |   6 +
 contrib/bloom/meson.build                     |   6 +
 contrib/bool_plperl/meson.build               |   6 +
 contrib/btree_gin/meson.build                 |  12 +-
 contrib/btree_gist/meson.build                |   6 +
 contrib/citext/meson.build                    |   6 +
 contrib/cube/meson.build                      |   6 +
 contrib/dblink/meson.build                    |   6 +
 contrib/dict_int/meson.build                  |  12 +-
 contrib/dict_xsyn/meson.build                 |  12 +-
 contrib/earthdistance/meson.build             |  12 +-
 contrib/file_fdw/meson.build                  |  12 +-
 contrib/fuzzystrmatch/meson.build             |  16 +-
 contrib/hstore/meson.build                    |  24 ++-
 contrib/hstore_plperl/meson.build             |   6 +
 contrib/hstore_plpython/meson.build           |   6 +
 contrib/intarray/meson.build                  |   6 +
 contrib/isn/meson.build                       |   6 +
 contrib/jsonb_plperl/meson.build              |   6 +
 contrib/jsonb_plpython/meson.build            |   6 +
 contrib/lo/meson.build                        |   6 +
 contrib/ltree/meson.build                     |   6 +
 contrib/ltree_plpython/meson.build            |   6 +
 contrib/oid2name/meson.build                  |  12 +-
 contrib/old_snapshot/meson.build              |   6 +
 contrib/pageinspect/meson.build               |   6 +
 contrib/passwordcheck/meson.build             |   6 +
 contrib/pg_buffercache/meson.build            |  14 +-
 contrib/pg_freespacemap/meson.build           |  14 +-
 contrib/pg_prewarm/meson.build                |  16 +-
 contrib/pg_stat_statements/meson.build        |  12 +-
 contrib/pg_surgery/meson.build                |  14 +-
 contrib/pg_trgm/meson.build                   |  20 ++-
 contrib/pg_visibility/meson.build             |  14 +-
 contrib/pg_walinspect/meson.build             |   6 +
 contrib/pgcrypto/meson.build                  |   6 +
 contrib/pgrowlocks/meson.build                |  14 +-
 contrib/pgstattuple/meson.build               |  18 ++-
 contrib/postgres_fdw/meson.build              |   6 +
 contrib/seg/meson.build                       |   6 +
 contrib/sepgsql/meson.build                   |   6 +
 contrib/spi/meson.build                       |  48 +++++-
 contrib/sslinfo/meson.build                   |  14 +-
 contrib/tablefunc/meson.build                 |  14 +-
 contrib/tcn/meson.build                       |  14 +-
 contrib/test_decoding/meson.build             |   6 +
 contrib/tsm_system_rows/meson.build           |  14 +-
 contrib/tsm_system_time/meson.build           |  14 +-
 contrib/unaccent/meson.build                  |  14 +-
 contrib/uuid-ossp/meson.build                 |  14 +-
 contrib/vacuumlo/meson.build                  |  12 +-
 contrib/xml2/meson.build                      |  16 +-
 src/interfaces/ecpg/compatlib/meson.build     |   6 +-
 src/interfaces/ecpg/preproc/meson.build       |   6 +
 src/interfaces/ecpg/test/meson.build          |   6 +
 src/test/isolation/meson.build                |  13 ++
 src/test/modules/delay_execution/meson.build  |  13 +-
 src/test/modules/dummy_index_am/meson.build   |  13 +-
 src/test/modules/dummy_seclabel/meson.build   |  13 +-
 src/test/modules/libpq_pipeline/meson.build   |  14 +-
 src/test/modules/plsample/meson.build         |  13 +-
 src/test/modules/spgist_name_ops/meson.build  |  13 +-
 .../ssl_passphrase_callback/meson.build       |  13 +-
 src/test/modules/test_bloomfilter/meson.build |  13 +-
 src/test/modules/test_ddl_deparse/meson.build |  13 +-
 .../modules/test_ginpostinglist/meson.build   |  13 +-
 src/test/modules/test_integerset/meson.build  |  13 +-
 src/test/modules/test_lfind/meson.build       |  13 +-
 src/test/modules/test_oat_hooks/meson.build   |  13 +-
 src/test/modules/test_parser/meson.build      |  13 +-
 src/test/modules/test_predtest/meson.build    |  13 +-
 src/test/modules/test_rbtree/meson.build      |  13 +-
 src/test/modules/test_regex/meson.build       |  13 +-
 src/test/modules/test_rls_hooks/meson.build   |  13 +-
 src/test/modules/test_shm_mq/meson.build      |  19 ++-
 src/test/modules/worker_spi/meson.build       |  15 +-
 src/test/regress/meson.build                  |   6 +
 meson.build                                   |  61 ++++++++
 src/timezone/meson.build                      |   6 +
 src/tools/rcgen                               |  99 ++++++++++++
 116 files changed, 1383 insertions(+), 159 deletions(-)
 create mode 100755 src/tools/rcgen

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..5fb63768358 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -20,6 +20,12 @@ llvmjit_sources += files(
   'llvmjit_expr.c',
 )
 
+if host_system == 'windows'
+  llvmjit_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'llvmjit',
+    '--FILEDESC', 'llvmjit - JIT using LLVM',])
+endif
+
 llvmjit = shared_module('llvmjit',
   llvmjit_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
index 3fc786c80a0..4c653a05d36 100644
--- a/src/backend/replication/libpqwalreceiver/meson.build
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -2,6 +2,12 @@ libpqwalreceiver_sources = files(
   'libpqwalreceiver.c',
 )
 
+if host_system == 'windows'
+  libpqwalreceiver_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pqwalreceiver',
+    '--FILEDESC', 'libpqwalreceiver - receive WAL during streaming replication',])
+endif
+
 libpqwalreceiver = shared_module('pqwalreceiver',
   libpqwalreceiver_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
index ab956361a62..5df27d7b764 100644
--- a/src/backend/replication/pgoutput/meson.build
+++ b/src/backend/replication/pgoutput/meson.build
@@ -2,6 +2,12 @@ pgoutput_sources = files(
   'pgoutput.c',
 )
 
+if host_system == 'windows'
+  pgoutput_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgoutput',
+    '--FILEDESC', 'pgoutput - standard logical replication output plugin',])
+endif
+
 pgoutput = shared_module('pgoutput',
   pgoutput_sources,
   kwargs: pg_mod_args,
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 8c6f685cb32..974401d187e 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -58,6 +58,12 @@ dict_snowball_sources += files(
 # see comment in src/include/snowball/header.h
 stemmer_inc = include_directories('../../include/snowball')
 
+if host_system == 'windows'
+  dict_snowball_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_snowball',
+    '--FILEDESC', 'snowball - natural language stemmers',])
+endif
+
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
index 1bc971d1945..00e721a2453 100644
--- a/src/backend/utils/mb/conversion_procs/meson.build
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -1,36 +1,122 @@
 encodings = {
-  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
-  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
-  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
-  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
-  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
-  'euc_tw_and_big5': [
-    'euc_tw_and_big5/euc_tw_and_big5.c',
-    'euc_tw_and_big5/big5.c',
-  ],
-  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
-  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
-  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
-  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
-  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
-  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
-  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
-  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
-  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
-  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
-  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
-  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
-  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
-  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
-  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
-  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
-  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
-  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+  'cyrillic_and_mic': {
+    'sources': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+    'description': 'cyrillic <-> mic text conversions',
+  },
+  'euc2004_sjis2004': {
+    'sources': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+    'description': 'euc2004 <-> sjis2004 text conversions',
+  },
+  'euc_cn_and_mic': {
+    'sources': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+    'description': 'euc_cn <-> mic text conversions',
+  },
+  'euc_jp_and_sjis': {
+    'sources': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+    'description': 'euc_jp <-> sjis text conversions',
+  },
+  'euc_kr_and_mic': {
+    'sources': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+    'description': 'euc_kr <-> mic text conversions',
+  },
+  'euc_tw_and_big5': {
+    'sources': [
+      'euc_tw_and_big5/euc_tw_and_big5.c',
+      'euc_tw_and_big5/big5.c',
+    ],
+    'description': 'euc_tw <-> big5 text conversions',
+  },
+  'latin2_and_win1250': {
+    'sources': ['latin2_and_win1250/latin2_and_win1250.c'],
+    'description': 'latin2 <-> win1250 text conversions',
+  },
+  'latin_and_mic': {
+    'sources': ['latin_and_mic/latin_and_mic.c'],
+    'description': 'latin <-> mic text conversions',
+  },
+  'utf8_and_big5': {
+    'sources': ['utf8_and_big5/utf8_and_big5.c'],
+    'description': 'utf8 <-> big5 text conversions',
+  },
+  'utf8_and_cyrillic': {
+    'sources': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+    'description': 'utf8 <-> cyrillic text conversions',
+  },
+  'utf8_and_euc2004': {
+    'sources': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+    'description': 'utf8 <-> euc2004 text conversions',
+  },
+  'utf8_and_euc_cn': {
+    'sources': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+    'description': 'utf8 <-> euc_cn text conversions',
+  },
+  'utf8_and_euc_jp': {
+    'sources': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+    'description': 'utf8 <-> euc_jp text conversions',
+  },
+  'utf8_and_euc_kr': {
+    'sources': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+    'description': 'utf8 <-> euc_kr text conversions',
+  },
+  'utf8_and_euc_tw': {
+    'sources': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+    'description': 'utf8 <-> euc_tw text conversions',
+  },
+  'utf8_and_gb18030': {
+    'sources': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+    'description': 'utf8 <-> gb18030 text conversions',
+  },
+  'utf8_and_gbk': {
+    'sources': ['utf8_and_gbk/utf8_and_gbk.c'],
+    'description': 'utf8 <-> gbk text conversions',
+  },
+  'utf8_and_iso8859': {
+    'sources': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+    'description': 'utf8 <-> iso8859 text conversions',
+  },
+  'utf8_and_iso8859_1': {
+    'sources': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+    'description': 'utf8 <-> iso8859_1 text conversions',
+  },
+  'utf8_and_johab': {
+    'sources': ['utf8_and_johab/utf8_and_johab.c'],
+    'description': 'utf8 <-> johab text conversions',
+  },
+  'utf8_and_sjis': {
+    'sources': ['utf8_and_sjis/utf8_and_sjis.c'],
+    'description': 'utf8 <-> sjis text conversions',
+  },
+  'utf8_and_sjis2004': {
+    'sources': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+    'description': 'utf8 <-> sjis2004 text conversions',
+  },
+  'utf8_and_uhc': {
+    'sources': ['utf8_and_uhc/utf8_and_uhc.c'],
+    'description': 'utf8 <-> uhc text conversions',
+  },
+  'utf8_and_win': {
+    'sources': ['utf8_and_win/utf8_and_win.c'],
+    'description': 'utf8 <-> win text conversions',
+  },
 }
 
-foreach encoding, sources : encodings
+foreach encoding, values: encodings
+  sources = values['sources']
+  description = values['description']
+
+  source_files = files()
+  foreach source: sources
+    source_files += files(source)
+  endforeach
+
+  if host_system == 'windows'
+    source_files += rc_lib_gen.process(win32ver_rc, extra_args: [
+      '--NAME', encoding,
+      '--FILEDESC', description,])
+  endif
+
   backend_targets += shared_module(encoding,
-    sources,
+    source_files,
     kwargs: pg_mod_args,
   )
 endforeach
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 9f213274d2f..6ced9a31b80 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -7,6 +7,12 @@ initdb_sources += timezone_localtime_source
 
 #fixme: reimplement libpq_pgport logic
 
+if host_system == 'windows'
+  initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'initdb',
+    '--FILEDESC', 'initdb - initialize a new database cluster',])
+endif
+
 initdb = executable('initdb',
   initdb_sources,
   include_directories: [timezone_inc],
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
index 8e197eba5f3..25f5e7a0948 100644
--- a/src/bin/pg_amcheck/meson.build
+++ b/src/bin/pg_amcheck/meson.build
@@ -1,7 +1,13 @@
 pg_amcheck_sources = files(
-  'pg_amcheck.c'
+  'pg_amcheck.c',
 )
 
+if host_system == 'windows'
+  pg_amcheck_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_amcheck',
+    '--FILEDESC', 'pg_amcheck - detect corruption within database relations',])
+endif
+
 pg_amcheck = executable('pg_amcheck',
   pg_amcheck_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
index 87a0d980c4f..aaa2e76977f 100644
--- a/src/bin/pg_archivecleanup/meson.build
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -1,5 +1,15 @@
+pg_archivecleanup_sources = files(
+  'pg_archivecleanup.c',
+)
+
+if host_system == 'windows'
+  pg_archivecleanup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_archivecleanup',
+    '--FILEDESC', 'pg_archivecleanup - cleans archive when used with streaming replication',])
+endif
+
 pg_archivecleanup = executable('pg_archivecleanup',
-  ['pg_archivecleanup.c'],
+  pg_archivecleanup_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index d26fed9cd8a..2c934e0c26e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -17,24 +17,56 @@ pg_basebackup_common = static_library('libpg_basebackup_common',
   kwargs: internal_lib_args,
 )
 
-pg_basebackup = executable('pg_basebackup',
+pg_basebackup_sources = files(
   'pg_basebackup.c',
+)
+
+if host_system == 'windows'
+  pg_basebackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_basebackup',
+    '--FILEDESC', 'pg_basebackup - streaming WAL and backup receivers',])
+endif
+
+pg_basebackup = executable('pg_basebackup',
+  pg_basebackup_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_basebackup
 
-pg_receivewal = executable('pg_receivewal',
+
+pg_receivewal_sources = files(
   'pg_receivewal.c',
+)
+
+if host_system == 'windows'
+  pg_receivewal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_receivewal',
+    '--FILEDESC', 'pg_receivewal - streaming WAL and backup receivers',])
+endif
+
+pg_receivewal = executable('pg_receivewal',
+  pg_receivewal_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_receivewal
 
-pg_recvlogical = executable('pg_recvlogical',
+
+pg_recvlogical_sources = files(
   'pg_recvlogical.c',
+)
+
+if host_system == 'windows'
+  pg_recvlogical_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_recvlogical',
+    '--FILEDESC', 'pg_recvlogical - streaming WAL and backup receivers',])
+endif
+
+pg_recvlogical = executable('pg_recvlogical',
+  pg_recvlogical_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
index ee1f367bac3..d07ebc999b3 100644
--- a/src/bin/pg_checksums/meson.build
+++ b/src/bin/pg_checksums/meson.build
@@ -1,5 +1,15 @@
+pg_checksums_sources = files(
+  'pg_checksums.c',
+)
+
+if host_system == 'windows'
+  pg_checksums_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_checksums',
+    '--FILEDESC', 'pg_checksums - verify data checksums in an offline cluster',])
+endif
+
 pg_checksums = executable('pg_checksums',
-  ['pg_checksums.c'],
+  pg_checksums_sources,
   include_directories: [timezone_inc],
   dependencies: [frontend_code],
   kwargs: default_bin_args,
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
index 0ecbf2f9d28..4be2fdc84ae 100644
--- a/src/bin/pg_config/meson.build
+++ b/src/bin/pg_config/meson.build
@@ -1,5 +1,15 @@
+pg_config_sources = files(
+  'pg_config.c',
+)
+
+if host_system == 'windows'
+  pg_config_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_config',
+    '--FILEDESC', 'pg_config - report configuration information',])
+endif
+
 pg_config = executable('pg_config',
-  ['pg_config.c'],
+  pg_config_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
index 557e672beb7..7fc239dbe65 100644
--- a/src/bin/pg_controldata/meson.build
+++ b/src/bin/pg_controldata/meson.build
@@ -1,5 +1,15 @@
+pg_controldata_sources = files(
+  'pg_controldata.c',
+)
+
+if host_system == 'windows'
+  pg_controldata_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_controldata',
+    '--FILEDESC', 'pg_controldata - reads the data from pg_control',])
+endif
+
 pg_controldata = executable('pg_controldata',
-  ['pg_controldata.c'],
+  pg_controldata_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
index 6812e73e329..96f962fa762 100644
--- a/src/bin/pg_ctl/meson.build
+++ b/src/bin/pg_ctl/meson.build
@@ -1,5 +1,15 @@
+pg_ctl_sources = files(
+  'pg_ctl.c',
+)
+
+if host_system == 'windows'
+  pg_ctl_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_ctl',
+    '--FILEDESC', 'pg_ctl - starts/stops/restarts the PostgreSQL server',])
+endif
+
 pg_ctl = executable('pg_ctl',
-  ['pg_ctl.c'],
+  pg_ctl_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 785ec094dbd..3527a25c288 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -24,6 +24,12 @@ pg_dump_sources = files(
   'pg_dump_sort.c',
 )
 
+if host_system == 'windows'
+  pg_dump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dump',
+    '--FILEDESC', 'pg_dump - backup one PostgreSQL database',])
+endif
+
 pg_dump = executable('pg_dump',
   pg_dump_sources,
   link_with: [pg_dump_common],
@@ -37,6 +43,12 @@ pg_dumpall_sources = files(
   'pg_dumpall.c',
 )
 
+if host_system == 'windows'
+  pg_dumpall_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dumpall',
+    '--FILEDESC', 'pg_dumpall - backup PostgreSQL databases'])
+endif
+
 pg_dumpall = executable('pg_dumpall',
   pg_dumpall_sources,
   link_with: [pg_dump_common],
@@ -50,6 +62,12 @@ pg_restore_sources = files(
   'pg_restore.c',
 )
 
+if host_system == 'windows'
+  pg_restore_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_restore',
+    '--FILEDESC', 'pg_restore - restore PostgreSQL databases'])
+endif
+
 pg_restore = executable('pg_restore',
   pg_restore_sources,
   link_with: [pg_dump_common],
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
index 7c5de134ac0..d503db97b71 100644
--- a/src/bin/pg_resetwal/meson.build
+++ b/src/bin/pg_resetwal/meson.build
@@ -1,5 +1,15 @@
+pg_resetwal_sources = files(
+  'pg_resetwal.c',
+)
+
+if host_system == 'windows'
+  pg_resetwal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_resetwal',
+    '--FILEDESC', 'pg_resetwal - reset PostgreSQL WAL log'])
+endif
+
 pg_resetwal = executable('pg_resetwal',
-  files('pg_resetwal.c'),
+  pg_resetwal_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index d8ec9e482d5..6cd970909a2 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -11,6 +11,12 @@ pg_rewind_sources = files(
 
 pg_rewind_sources += xlogreader_sources
 
+if host_system == 'windows'
+  pg_rewind_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_rewind',
+    '--FILEDESC', 'pg_rewind - synchronize a data directory with another one forked from'])
+endif
+
 pg_rewind = executable('pg_rewind',
   pg_rewind_sources,
   dependencies: [frontend_code, libpq, lz4, zstd],
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index 2c01831e11f..31d288ba6da 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -1,4 +1,12 @@
-test_fsync_sources = files('pg_test_fsync.c')
+test_fsync_sources = files(
+  'pg_test_fsync.c',
+)
+
+if host_system == 'windows'
+  test_fsync_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_fsync',
+    '--FILEDESC', 'pg_test_fsync - test various disk sync methods'])
+endif
 
 pg_test_fsync = executable('pg_test_fsync',
   test_fsync_sources,
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
index 0a3068f1657..0aed03ea32f 100644
--- a/src/bin/pg_test_timing/meson.build
+++ b/src/bin/pg_test_timing/meson.build
@@ -1,5 +1,15 @@
+pg_test_timing_sources = files(
+  'pg_test_timing.c'
+)
+
+if host_system == 'windows'
+  pg_test_timing_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_timing',
+    '--FILEDESC', 'pg_test_timing - test timing overhead'])
+endif
+
 pg_test_timing = executable('pg_test_timing',
-  ['pg_test_timing.c'],
+  pg_test_timing_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 02f030e0ccf..a7b927a45c7 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -16,6 +16,12 @@ pg_upgrade_sources = files(
   'version.c',
 )
 
+if host_system == 'windows'
+  pg_upgrade_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_upgrade',
+    '--FILEDESC', 'pg_upgrade - an in-place binary upgrade utility'])
+endif
+
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
index 4c3b2bb5f97..b934a408443 100644
--- a/src/bin/pg_verifybackup/meson.build
+++ b/src/bin/pg_verifybackup/meson.build
@@ -3,6 +3,12 @@ pg_verifybackup_sources = files(
   'pg_verifybackup.c'
 )
 
+if host_system == 'windows'
+  pg_verifybackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_verifybackup',
+    '--FILEDESC', 'pg_verifybackup - verify a backup against using a backup manifest'])
+endif
+
 pg_verifybackup = executable('pg_verifybackup',
   pg_verifybackup_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index 95872652ffd..9605976870d 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -8,6 +8,12 @@ pg_waldump_sources += rmgr_desc_sources
 pg_waldump_sources += xlogreader_sources
 pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
 
+if host_system == 'windows'
+  pg_waldump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_waldump',
+    '--FILEDESC', 'pg_waldump - decode and display WA'])
+endif
+
 pg_waldump = executable('pg_waldump',
   pg_waldump_sources,
   dependencies: [frontend_code, lz4, zstd],
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index 6564e54029c..a32eb51fe07 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -17,6 +17,12 @@ exprparse = custom_target('exprparse',
 generated_sources += exprparse.to_list()
 pgbench_sources += exprparse
 
+if host_system == 'windows'
+  pgbench_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgbench',
+    '--FILEDESC', 'pgbench - a simple program for running benchmark tests'])
+endif
+
 pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
index 7a468879fd2..2e9aea4b0e1 100644
--- a/src/bin/pgevent/meson.build
+++ b/src/bin/pgevent/meson.build
@@ -6,6 +6,12 @@ pgevent_sources = files(
   'pgevent.c',
 )
 
+pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+  '--NAME', 'pgevent',
+  '--FILEDESC', 'Eventlog message formatter',])
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
 # FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
 pgevent_link_args = []
 if cc.get_id() == 'msvc'
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index ea850c8fdf5..3474389d3b6 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -38,6 +38,12 @@ generated_sources += sql_help.to_list()
 psql_sources += sql_help
 bin_targets += sql_help
 
+if host_system == 'windows'
+  psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'psql',
+    '--FILEDESC', 'psql - the PostgreSQL interactive terminal',])
+endif
+
 psql = executable('psql',
   psql_sources,
   include_directories: include_directories('.'),
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index eaf250c7f73..837562c24e5 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -16,8 +16,16 @@ binaries = [
 ]
 
 foreach binary : binaries
+  binary_sources = files('@0@.c'.format(binary))
+
+  if host_system == 'windows'
+    binary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+      '--NAME', binary,
+      '--FILEDESC', '@0@ - PostgreSQL utility'.format(binary),])
+  endif
+
   binary = executable(binary,
-    files(binary + '.c'),
+    binary_sources,
     link_with: [scripts_common],
     dependencies: [frontend_code, libpq],
     kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bc047e00d62..2c9edeaa088 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -16,9 +16,13 @@ libpq_sources = files(
   'libpq-events.c',
   'pqexpbuffer.c',
 )
+libpq_so_sources = [] # only for shared lib, in addition to above
 
 if host_system == 'windows'
   libpq_sources += files('pthread-win32.c', 'win32.c')
+  libpq_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq',
+    '--FILEDESC', 'PostgreSQL Access Library',])
 endif
 
 if ssl.found()
@@ -52,6 +56,7 @@ libpq_st = static_library('libpq',
 # not using both_libraries here, causes problems with precompiled headers and
 # resource files with msbuild
 libpq_so = shared_library('libpq',
+  libpq_so_sources,
   dependencies: libpq_deps,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
index 16f94c1ed8b..017f729d435 100644
--- a/src/interfaces/libpq/test/meson.build
+++ b/src/interfaces/libpq/test/meson.build
@@ -1,13 +1,34 @@
+libpq_uri_regress_sources = files(
+  'libpq_uri_regress.c',
+)
+
+if host_system == 'windows'
+  libpq_uri_regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_uri_regress',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_uri_regress',
-  files('libpq_uri_regress.c'),
+  libpq_uri_regress_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
   }
 )
 
+
+libpq_testclient_sources = files(
+  'libpq_testclient.c',
+)
+
+if host_system == 'windows'
+  libpq_testclient_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_testclient',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_testclient',
-  files('libpq_testclient.c'),
+  libpq_testclient_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 73b733dd50b..535660085dd 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -36,6 +36,13 @@ foreach n : ['SPI', 'Util']
 endforeach
 
 plperl_inc = include_directories('.')
+
+if host_system == 'windows'
+  plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plperl',
+    '--FILEDESC', 'PL/Perl - procedural language',])
+endif
+
 plperl = shared_module('plperl',
   plperl_sources,
   include_directories: [plperl_inc, postgres_inc],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index dd499fdd151..c46c0a1da2a 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -40,6 +40,12 @@ pl_unreserved = custom_target('pl_unreserved_kwlist',
 generated_sources += pl_unreserved
 plpgsql_sources += pl_unreserved
 
+if host_system == 'windows'
+  plpgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpgsql',
+    '--FILEDESC', 'PL/pgSQL - procedural language',])
+endif
+
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
   include_directories: include_directories('.'),
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 366b3b171ac..40888386b5f 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -28,6 +28,12 @@ plpython_sources += custom_target('spiexceptions.h',
 # FIXME: need to duplicate import library ugliness?
 plpython_inc = include_directories('.')
 
+if host_system == 'windows'
+  plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpython3',
+    '--FILEDESC', 'PL/Python - procedural language',])
+endif
+
 plpython = shared_module('plpython3',
   plpython_sources,
   include_directories: [plpython_inc, postgres_inc],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index 9b6addd7fd5..f09bb14c950 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -14,6 +14,12 @@ pltcl_sources += custom_target('pltclerrcodes.h',
   command: [perl, gen_pltclerrcodes, '@INPUT@']
 )
 
+if host_system == 'windows'
+  pltcl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pltcl',
+    '--FILEDESC', 'PL/Tcl - procedural language',])
+endif
+
 pltcl = shared_module('pltcl',
   pltcl_sources,
   include_directories: [include_directories('.'), postgres_inc],
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
index fc2368d02cf..7efec0efbc0 100644
--- a/contrib/adminpack/meson.build
+++ b/contrib/adminpack/meson.build
@@ -1,5 +1,15 @@
+adminpack_sources = files(
+  'adminpack.c',
+)
+
+if host_system == 'windows'
+  adminpack_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'adminpack',
+    '--FILEDESC', 'adminpack - support functions for pgAdmin',])
+endif
+
 adminpack = shared_module('adminpack',
-  ['adminpack.c'],
+  adminpack_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += adminpack
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
index 1db3d20349e..fa807b72d98 100644
--- a/contrib/amcheck/meson.build
+++ b/contrib/amcheck/meson.build
@@ -1,7 +1,16 @@
-amcheck = shared_module('amcheck', [
-    'verify_heapam.c',
-    'verify_nbtree.c',
-  ],
+amcheck_sources = files(
+  'verify_heapam.c',
+  'verify_nbtree.c',
+)
+
+if host_system == 'windows'
+  amcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'amcheck',
+    '--FILEDESC', 'amcheck - function for verifying relation integrity',])
+endif
+
+amcheck = shared_module('amcheck',
+  amcheck_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += amcheck
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
index d2e01968f54..c4ffb0663bc 100644
--- a/contrib/auth_delay/meson.build
+++ b/contrib/auth_delay/meson.build
@@ -1,5 +1,15 @@
+auth_delay_sources = files(
+  'auth_delay.c',
+)
+
+if host_system == 'windows'
+  auth_delay_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auth_delay',
+    '--FILEDESC', 'auth_delay - delay authentication failure reports',])
+endif
+
 autoinc = shared_module('auth_delay',
-  ['auth_delay.c'],
+  auth_delay_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
index 249a8376faa..76f86617850 100644
--- a/contrib/auto_explain/meson.build
+++ b/contrib/auto_explain/meson.build
@@ -1,5 +1,15 @@
+auto_explain_sources = files(
+  'auto_explain.c',
+)
+
+if host_system == 'windows'
+  auto_explain_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auto_explain',
+    '--FILEDESC', 'auto_explain - logging facility for execution plans',])
+endif
+
 auto_explain = shared_module('auto_explain',
-  files('auto_explain.c'),
+  auto_explain_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += auto_explain
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
index 9f0517f1701..3a389de9175 100644
--- a/contrib/basebackup_to_shell/meson.build
+++ b/contrib/basebackup_to_shell/meson.build
@@ -2,6 +2,12 @@ basebackup_to_shell_sources = files(
   'basebackup_to_shell.c',
 )
 
+if host_system == 'windows'
+  basebackup_to_shell_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basebackup_to_shell',
+    '--FILEDESC', 'basebackup_to_shell - target basebackup to shell command',])
+endif
+
 basebackup_to_shell = shared_module('basebackup_to_shell',
   basebackup_to_shell_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index b67cbef60bd..c30dcfa5d41 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -2,6 +2,12 @@ basic_archive_sources = files(
   'basic_archive.c',
 )
 
+if host_system == 'windows'
+  basic_archive_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basic_archive',
+    '--FILEDESC', 'basic_archive - basic archive module',])
+endif
+
 basic_archive = shared_module('basic_archive',
   basic_archive_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 1fe7632bdbe..16f3b83e4d2 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -7,6 +7,12 @@ bloom_sources = files(
   'blvalidate.c',
 )
 
+if host_system == 'windows'
+  bloom_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bloom',
+    '--FILEDESC', 'bloom access method - signature file based index',])
+endif
+
 bloom = shared_module('bloom',
   bloom_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
index c20b667d75f..a68daab0dcd 100644
--- a/contrib/bool_plperl/meson.build
+++ b/contrib/bool_plperl/meson.build
@@ -6,6 +6,12 @@ bool_plperl_sources = files(
   'bool_plperl.c',
 )
 
+if host_system == 'windows'
+  bool_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bool_plperl',
+    '--FILEDESC', 'bool_plperl - bool transform for plperl',])
+endif
+
 bool_plperl = shared_module('bool_plperl',
   bool_plperl_sources,
   include_directories: [plperl_inc, include_directories('.')],
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
index 15d6d31a6ee..fd4c76767a7 100644
--- a/contrib/btree_gin/meson.build
+++ b/contrib/btree_gin/meson.build
@@ -1,5 +1,15 @@
+btree_gin_sources = files(
+  'btree_gin.c',
+)
+
+if host_system == 'windows'
+  btree_gin_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gin',
+    '--FILEDESC', 'btree_gin - B-tree equivalent GIN operator classes',])
+endif
+
 btree_gin = shared_module('btree_gin',
-  files('btree_gin.c'),
+  btree_gin_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gin
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index c0a8d238540..e98c91dacc8 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -25,6 +25,12 @@ btree_gist_sources = files(
   'btree_uuid.c',
 )
 
+if host_system == 'windows'
+  btree_gist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gist',
+    '--FILEDESC', 'btree_gist - B-tree equivalent GiST operator classes',])
+endif
+
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
index ca60eded80b..26a101a19bd 100644
--- a/contrib/citext/meson.build
+++ b/contrib/citext/meson.build
@@ -2,6 +2,12 @@ citext_sources = files(
   'citext.c',
 )
 
+if host_system == 'windows'
+  citext_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'citext',
+    '--FILEDESC', 'citext - case-insensitive character string data type',])
+endif
+
 citext = shared_module('citext',
   citext_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index 72342b0c82c..041acf95a90 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -17,6 +17,12 @@ cube_parse = custom_target('cubeparse',
 generated_sources += cube_parse.to_list()
 cube_sources += cube_parse
 
+if host_system == 'windows'
+  cube_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'cube',
+    '--FILEDESC', 'cube - multidimensional cube data type',])
+endif
+
 cube = shared_module('cube',
   cube_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
index d35f7b5d49e..66eeb03b736 100644
--- a/contrib/dblink/meson.build
+++ b/contrib/dblink/meson.build
@@ -2,6 +2,12 @@ dblink_sources = files(
   'dblink.c',
 )
 
+if host_system == 'windows'
+  dblink_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dblink',
+    '--FILEDESC', 'dblink - connect to other PostgreSQL databases',])
+endif
+
 dblink = shared_module('dblink',
   dblink_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
index f00e8085619..6fff921adda 100644
--- a/contrib/dict_int/meson.build
+++ b/contrib/dict_int/meson.build
@@ -1,5 +1,15 @@
+dict_int_sources = files(
+  'dict_int.c',
+)
+
+if host_system == 'windows'
+  dict_int_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_int',
+    '--FILEDESC', 'dict_int - add-on dictionary template for full-text search',])
+endif
+
 dict_int = shared_module('dict_int',
-  files('dict_int.c'),
+  dict_int_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_int
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
index be53f55bb79..fabd505a7df 100644
--- a/contrib/dict_xsyn/meson.build
+++ b/contrib/dict_xsyn/meson.build
@@ -1,5 +1,15 @@
+dict_xsyn_sources = files(
+  'dict_xsyn.c',
+)
+
+if host_system == 'windows'
+  dict_xsyn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_xsyn',
+    '--FILEDESC', 'dict_xsyn - add-on dictionary template for full-text search',])
+endif
+
 dict_xsyn = shared_module('dict_xsyn',
-  files('dict_xsyn.c'),
+  dict_xsyn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_xsyn
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
index 807f5cb7de3..78dc29c3da3 100644
--- a/contrib/earthdistance/meson.build
+++ b/contrib/earthdistance/meson.build
@@ -1,5 +1,15 @@
+earthdistance_sources = files(
+  'earthdistance.c',
+)
+
+if host_system == 'windows'
+  earthdistance_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'earthdistance',
+    '--FILEDESC', 'earthdistance - calculate distances on the surface of the Earth',])
+endif
+
 earthdistance = shared_module('earthdistance',
-  files('earthdistance.c'),
+  earthdistance_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += earthdistance
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
index f13efb6e38e..c4071faa669 100644
--- a/contrib/file_fdw/meson.build
+++ b/contrib/file_fdw/meson.build
@@ -1,5 +1,15 @@
+file_fdw_sources = files(
+  'file_fdw.c',
+)
+
+if host_system == 'windows'
+  file_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'file_fdw',
+    '--FILEDESC', 'file_fdw - foreign data wrapper for files',])
+endif
+
 file_fdw = shared_module('file_fdw',
-  files('file_fdw.c'),
+  file_fdw_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += file_fdw
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
index ec278a6211e..e6d06149cec 100644
--- a/contrib/fuzzystrmatch/meson.build
+++ b/contrib/fuzzystrmatch/meson.build
@@ -1,8 +1,16 @@
+fuzzystrmatch_sources = files(
+  'fuzzystrmatch.c',
+  'dmetaphone.c',
+)
+
+if host_system == 'windows'
+  fuzzystrmatch_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'fuzzystrmatch',
+    '--FILEDESC', 'fuzzystrmatch - similarities and distance between strings',])
+endif
+
 fuzzystrmatch = shared_module('fuzzystrmatch',
-  files(
-    'fuzzystrmatch.c',
-    'dmetaphone.c'
-  ),
+  fuzzystrmatch_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += fuzzystrmatch
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 07c59f40a97..2bb26bb772b 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -1,15 +1,23 @@
 # .. so that includes of hstore/hstore.h work
 hstore_inc = include_directories('.', '../')
 
+hstore_sources = files(
+  'hstore_compat.c',
+  'hstore_gin.c',
+  'hstore_gist.c',
+  'hstore_io.c',
+  'hstore_op.c',
+  'hstore_subs.c',
+)
+
+if host_system == 'windows'
+  hstore_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore',
+    '--FILEDESC', 'hstore - key/value pair data type',])
+endif
+
 hstore = shared_module('hstore',
-  files(
-    'hstore_compat.c',
-    'hstore_gin.c',
-    'hstore_gist.c',
-    'hstore_io.c',
-    'hstore_op.c',
-    'hstore_subs.c',
-  ),
+  hstore_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
index bbafa0221bd..a238fee6a26 100644
--- a/contrib/hstore_plperl/meson.build
+++ b/contrib/hstore_plperl/meson.build
@@ -6,6 +6,12 @@ hstore_plperl_sources = files(
   'hstore_plperl.c',
 )
 
+if host_system == 'windows'
+  hstore_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plperl',
+    '--FILEDESC', 'hstore_plperl - hstore transform for plperl',])
+endif
+
 hstore_plperl = shared_module('hstore_plperl',
   hstore_plperl_sources,
   include_directories: [plperl_inc, hstore_inc],
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
index 214b48519a9..6071aaeb4b3 100644
--- a/contrib/hstore_plpython/meson.build
+++ b/contrib/hstore_plpython/meson.build
@@ -6,6 +6,12 @@ hstore_plpython_sources = files(
   'hstore_plpython.c',
 )
 
+if host_system == 'windows'
+  hstore_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plpython3',
+    '--FILEDESC', 'hstore_plpython - hstore transform for plpython',])
+endif
+
 hstore_plpython = shared_module('hstore_plpython3',
   hstore_plpython_sources,
   include_directories: [plpython_inc, hstore_inc, ],
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
index 1655bcbb3fd..b7cf1ce0cad 100644
--- a/contrib/intarray/meson.build
+++ b/contrib/intarray/meson.build
@@ -8,6 +8,12 @@ intarray_sources = files(
   '_intbig_gist.c',
 )
 
+if host_system == 'windows'
+  intarray_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', '_int',
+    '--FILEDESC', 'intarray - functions and operators for arrays of integers',])
+endif
+
 intarray = shared_module('_int',
   intarray_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
index cc30bbeb55c..db68a718313 100644
--- a/contrib/isn/meson.build
+++ b/contrib/isn/meson.build
@@ -2,6 +2,12 @@ isn_sources = files(
   'isn.c',
 )
 
+if host_system == 'windows'
+  isn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isn',
+    '--FILEDESC', 'isn - data types for international product numbering standards',])
+endif
+
 isn = shared_module('isn',
   isn_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
index 5c915d8ed94..071a7a98d2c 100644
--- a/contrib/jsonb_plperl/meson.build
+++ b/contrib/jsonb_plperl/meson.build
@@ -6,6 +6,12 @@ jsonb_plperl_sources = files(
   'jsonb_plperl.c',
 )
 
+if host_system == 'windows'
+  jsonb_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plperl',
+    '--FILEDESC', 'jsonb_plperl - jsonb transform for plperl',])
+endif
+
 jsonb_plperl = shared_module('jsonb_plperl',
   jsonb_plperl_sources,
   include_directories: [plperl_inc],
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
index de8e1105c6a..84dc1161e8b 100644
--- a/contrib/jsonb_plpython/meson.build
+++ b/contrib/jsonb_plpython/meson.build
@@ -6,6 +6,12 @@ jsonb_plpython_sources = files(
   'jsonb_plpython.c',
 )
 
+if host_system == 'windows'
+  jsonb_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plpython3',
+    '--FILEDESC', 'jsonb_plpython - jsonb transform for plpython',])
+endif
+
 jsonb_plpython = shared_module('jsonb_plpython3',
   jsonb_plpython_sources,
   include_directories: [plpython_inc],
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
index 9082d5713c7..61ae131f1cc 100644
--- a/contrib/lo/meson.build
+++ b/contrib/lo/meson.build
@@ -2,6 +2,12 @@ lo_sources = files(
   'lo.c',
 )
 
+if host_system == 'windows'
+  lo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'lo',
+    '--FILEDESC', 'lo - management for large objects',])
+endif
+
 lo = shared_module('lo',
   lo_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
index 9463fc2c5e5..421292cea9d 100644
--- a/contrib/ltree/meson.build
+++ b/contrib/ltree/meson.build
@@ -13,6 +13,12 @@ ltree_sources = files(
 # .. so that includes of ltree/ltree.h work
 ltree_inc = include_directories('.', '../')
 
+if host_system == 'windows'
+  ltree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree',
+    '--FILEDESC', 'ltree - hierarchical label data type',])
+endif
+
 ltree = shared_module('ltree',
   ltree_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
index 429d75006aa..acf5e4a6fc8 100644
--- a/contrib/ltree_plpython/meson.build
+++ b/contrib/ltree_plpython/meson.build
@@ -6,6 +6,12 @@ ltree_plpython_sources = files(
   'ltree_plpython.c',
 )
 
+if host_system == 'windows'
+  ltree_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree_plpython3',
+    '--FILEDESC', 'ltree_plpython - ltree transform for plpython',])
+endif
+
 ltree_plpython = shared_module('ltree_plpython3',
   ltree_plpython_sources,
   include_directories: [plpython_inc, ltree_inc],
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
index 1dad5d8f6e7..1a248f19260 100644
--- a/contrib/oid2name/meson.build
+++ b/contrib/oid2name/meson.build
@@ -1,5 +1,15 @@
+oid2name_sources = files(
+  'oid2name.c',
+)
+
+if host_system == 'windows'
+  oid2name_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'oid2name',
+    '--FILEDESC', 'oid2name - examine the file structure',])
+endif
+
 oid2name = executable('oid2name',
-  ['oid2name.c'],
+  oid2name_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
index 8e7ee09a43a..77276c3715a 100644
--- a/contrib/old_snapshot/meson.build
+++ b/contrib/old_snapshot/meson.build
@@ -2,6 +2,12 @@ old_snapshot_sources = files(
   'time_mapping.c',
 )
 
+if host_system == 'windows'
+  old_snapshot_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'old_snapshot',
+    '--FILEDESC', 'old_snapshot - utilities in support of old_snapshot_threshold',])
+endif
+
 old_snapshot = shared_module('old_snapshot',
   old_snapshot_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
index 4af8153e4fd..3ec50b9445e 100644
--- a/contrib/pageinspect/meson.build
+++ b/contrib/pageinspect/meson.build
@@ -9,6 +9,12 @@ pageinspect_sources = files(
   'rawpage.c',
 )
 
+if host_system == 'windows'
+  pageinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pageinspect',
+    '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',])
+endif
+
 pageinspect = shared_module('pageinspect',
   pageinspect_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
index 7da47d02f1d..383d7df372a 100644
--- a/contrib/passwordcheck/meson.build
+++ b/contrib/passwordcheck/meson.build
@@ -9,6 +9,12 @@ passwordcheck_deps = []
 # passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
 # passwordcheck_deps += [cc.find_library('crack')]
 
+if host_system == 'windows'
+  passwordcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'passwordcheck',
+    '--FILEDESC', 'passwordcheck - strengthen user password checks',])
+endif
+
 passwordcheck = shared_module('passwordcheck',
   passwordcheck_sources,
   c_args: passwordcheck_c_args,
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
index 2c69eae3ea2..dd9948e5f0b 100644
--- a/contrib/pg_buffercache/meson.build
+++ b/contrib/pg_buffercache/meson.build
@@ -1,7 +1,15 @@
+pg_buffercache_sources = files(
+  'pg_buffercache_pages.c',
+)
+
+if host_system == 'windows'
+  pg_buffercache_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_buffercache',
+    '--FILEDESC', 'pg_buffercache - monitoring of shared buffer cache in real-time',])
+endif
+
 pg_buffercache = shared_module('pg_buffercache',
-  files(
-    'pg_buffercache_pages.c',
-  ),
+  pg_buffercache_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_buffercache
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index f795014d7ca..904b37b6e9b 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -1,7 +1,15 @@
+pg_freespacemap_sources = files(
+  'pg_freespacemap.c',
+)
+
+if host_system == 'windows'
+  pg_freespacemap_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_freespacemap',
+    '--FILEDESC', 'pg_freespacemap - monitoring of free space map',])
+endif
+
 pg_freespacemap = shared_module('pg_freespacemap',
-  files(
-    'pg_freespacemap.c',
-  ),
+  pg_freespacemap_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_freespacemap
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
index bdca9af4f27..b7140cee34b 100644
--- a/contrib/pg_prewarm/meson.build
+++ b/contrib/pg_prewarm/meson.build
@@ -1,8 +1,16 @@
+pg_prewarm_sources = files(
+  'autoprewarm.c',
+  'pg_prewarm.c',
+)
+
+if host_system == 'windows'
+  pg_prewarm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_prewarm',
+    '--FILEDESC', 'pg_prewarm - preload relation data into system buffer cache',])
+endif
+
 pg_prewarm = shared_module('pg_prewarm',
-  files(
-    'autoprewarm.c',
-    'pg_prewarm.c',
-  ),
+  pg_prewarm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_prewarm
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index ac117d2fc1d..854df138e76 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -1,5 +1,15 @@
+pg_stat_statements_sources = files(
+  'pg_stat_statements.c',
+)
+
+if host_system == 'windows'
+  pg_stat_statements_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_stat_statements',
+    '--FILEDESC', 'pg_stat_statements - execution statistics of SQL statements',])
+endif
+
 pg_stat_statements = shared_module('pg_stat_statements',
-  files('pg_stat_statements.c'),
+  pg_stat_statements_sources,
   kwargs: contrib_mod_args + {
     'dependencies': contrib_mod_args['dependencies'],
   },
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
index ac71caa5276..7b5c5999f4b 100644
--- a/contrib/pg_surgery/meson.build
+++ b/contrib/pg_surgery/meson.build
@@ -1,7 +1,15 @@
+pg_surgery_sources = files(
+  'heap_surgery.c',
+)
+
+if host_system == 'windows'
+  pg_surgery_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_surgery',
+    '--FILEDESC', 'pg_surgery - perform surgery on a damaged relation',])
+endif
+
 pg_surgery = shared_module('pg_surgery',
-  files(
-    'heap_surgery.c',
-  ),
+  pg_surgery_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_surgery
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index a90628d23c6..c8c7c07b308 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -1,10 +1,18 @@
+pg_trgm_sources = files(
+  'trgm_gin.c',
+  'trgm_gist.c',
+  'trgm_op.c',
+  'trgm_regexp.c',
+)
+
+if host_system == 'windows'
+  pg_trgm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_trgm',
+    '--FILEDESC', 'pg_trgm - trigram matching',])
+endif
+
 pg_trgm = shared_module('pg_trgm',
-  files(
-    'trgm_gin.c',
-    'trgm_gist.c',
-    'trgm_op.c',
-    'trgm_regexp.c',
-  ),
+  pg_trgm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
index 933dc99ac4d..263a0d08b82 100644
--- a/contrib/pg_visibility/meson.build
+++ b/contrib/pg_visibility/meson.build
@@ -1,7 +1,15 @@
+pg_visibility_sources = files(
+  'pg_visibility.c',
+)
+
+if host_system == 'windows'
+  pg_visibility_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_visibility',
+    '--FILEDESC', 'pg_visibility - page visibility information',])
+endif
+
 pg_visibility = shared_module('pg_visibility',
-  files(
-    'pg_visibility.c',
-  ),
+  pg_visibility_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_visibility
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index d6b27877dd0..4314a3182a2 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -1,5 +1,11 @@
 pg_walinspect_sources = files('pg_walinspect.c')
 
+if host_system == 'windows'
+  pg_walinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_walinspect',
+    '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',])
+endif
+
 pg_walinspect = shared_module('pg_walinspect',
   pg_walinspect_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index fe0851bf8e8..7fc7bbc7ca1 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -69,6 +69,12 @@ else
   pgcrypto_regress += 'pgp-zlib-DISABLED'
 endif
 
+if host_system == 'windows'
+  pgcrypto_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgcrypto',
+    '--FILEDESC', 'pgcrypto - cryptographic functions',])
+endif
+
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
index 1b41691a2a3..8092f0d4a64 100644
--- a/contrib/pgrowlocks/meson.build
+++ b/contrib/pgrowlocks/meson.build
@@ -1,7 +1,15 @@
+pgrowlocks_sources = files(
+  'pgrowlocks.c',
+)
+
+if host_system == 'windows'
+  pgrowlocks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgrowlocks',
+    '--FILEDESC', 'pgrowlocks - display row locking information',])
+endif
+
 pgrowlocks = shared_module('pgrowlocks',
-  files(
-    'pgrowlocks.c',
-  ),
+  pgrowlocks_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgrowlocks
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 8e828692d5c..05e4cd46a5c 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -1,9 +1,17 @@
+pgstattuple_sources = files(
+  'pgstatapprox.c',
+  'pgstatindex.c',
+  'pgstattuple.c',
+)
+
+if host_system == 'windows'
+  pgstattuple_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgstattuple',
+    '--FILEDESC', 'pgstattuple - tuple-level statistics',])
+endif
+
 pgstattuple = shared_module('pgstattuple',
-  files(
-    'pgstatapprox.c',
-    'pgstatindex.c',
-    'pgstattuple.c',
-  ),
+  pgstattuple_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
index 378885ec93b..d3746ff135c 100644
--- a/contrib/postgres_fdw/meson.build
+++ b/contrib/postgres_fdw/meson.build
@@ -6,6 +6,12 @@ postgres_fdw_sources = files(
   'shippable.c',
 )
 
+if host_system == 'windows'
+  postgres_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'postgres_fdw',
+    '--FILEDESC', 'postgres_fdw - foreign data wrapper for PostgreSQL',])
+endif
+
 postgres_fdw = shared_module('postgres_fdw',
   postgres_fdw_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
index e476eab2a77..c6fbb22999b 100644
--- a/contrib/seg/meson.build
+++ b/contrib/seg/meson.build
@@ -17,6 +17,12 @@ seg_parse = custom_target('segparse',
 generated_sources += seg_parse.to_list()
 seg_sources += seg_parse
 
+if host_system == 'windows'
+  seg_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'seg',
+    '--FILEDESC', 'seg - line segment data type',])
+endif
+
 seg = shared_module('seg',
   seg_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 60a95e17c2f..8bef239e3c2 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -14,6 +14,12 @@ sepgsql_sources = files(
   'uavc.c',
 )
 
+if host_system == 'windows'
+  sepgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sepgsql',
+    '--FILEDESC', 'sepgsql - SELinux integration',])
+endif
+
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
index 98008980ec2..e7d78189ef5 100644
--- a/contrib/spi/meson.build
+++ b/contrib/spi/meson.build
@@ -1,5 +1,15 @@
+autoinc_sources = files(
+  'autoinc.c',
+)
+
+if host_system == 'windows'
+  autoinc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'autoinc',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 autoinc = shared_module('autoinc',
-  ['autoinc.c'],
+  autoinc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
@@ -9,8 +19,18 @@ install_data('autoinc.control', 'autoinc--1.0.sql',
 )
 
 
+insert_username_sources = files(
+  'insert_username.c',
+)
+
+if host_system == 'windows'
+  insert_username_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'insert_username',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 insert_username = shared_module('insert_username',
-  ['insert_username.c'],
+  insert_username_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += insert_username
@@ -22,8 +42,18 @@ install_data(
 )
 
 
+moddatetime_sources = files(
+  'moddatetime.c',
+)
+
+if host_system == 'windows'
+  moddatetime_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'moddatetime',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 moddatetime = shared_module('moddatetime',
-  ['moddatetime.c'],
+  moddatetime_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += moddatetime
@@ -38,8 +68,18 @@ install_data(
 # comment out if you want a quieter refint package for other uses
 refint_cflags = ['-DREFINT_VERBOSE']
 
+refint_sources = files(
+  'refint.c',
+)
+
+if host_system == 'windows'
+  refint_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'refint',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 refint = shared_module('refint',
-  ['refint.c'],
+  refint_sources,
   c_args: refint_cflags,
   kwargs: contrib_mod_args,
 )
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
index 53f752a08ac..136983e783d 100644
--- a/contrib/sslinfo/meson.build
+++ b/contrib/sslinfo/meson.build
@@ -2,10 +2,18 @@ if not ssl.found()
   subdir_done()
 endif
 
+sslinfo_sources = files(
+  'sslinfo.c',
+)
+
+if host_system == 'windows'
+  sslinfo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sslinfo',
+    '--FILEDESC', 'sslinfo - information about client SSL certificate',])
+endif
+
 sslinfo = shared_module('sslinfo',
-  files(
-    'sslinfo.c',
-  ),
+  sslinfo_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [ssl, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
index f4230096c0c..d2ddc8d3b39 100644
--- a/contrib/tablefunc/meson.build
+++ b/contrib/tablefunc/meson.build
@@ -1,7 +1,15 @@
+tablefunc_sources = files(
+  'tablefunc.c',
+)
+
+if host_system == 'windows'
+  tablefunc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tablefunc',
+    '--FILEDESC', 'tablefunc - various functions that return tables',])
+endif
+
 tablefunc = shared_module('tablefunc',
-  files(
-    'tablefunc.c',
-  ),
+  tablefunc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tablefunc
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
index c3a025247d4..71261c3b0a2 100644
--- a/contrib/tcn/meson.build
+++ b/contrib/tcn/meson.build
@@ -1,7 +1,15 @@
+tcn_sources = files(
+  'tcn.c',
+)
+
+if host_system == 'windows'
+  tcn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tcn',
+    '--FILEDESC', 'tcn - trigger function notifying listeners',])
+endif
+
 tcn = shared_module('tcn',
-  files(
-    'tcn.c',
-  ),
+  tcn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tcn
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index dd7cb0101ad..6376103c689 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -2,6 +2,12 @@ test_decoding_sources = files(
   'test_decoding.c',
 )
 
+if host_system == 'windows'
+  test_decoding_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_decoding',
+    '--FILEDESC', 'test_decoding - example of a logical decoding output plugin',])
+endif
+
 test_decoding = shared_module('test_decoding',
   test_decoding_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
index b9cd42115a8..380abb49883 100644
--- a/contrib/tsm_system_rows/meson.build
+++ b/contrib/tsm_system_rows/meson.build
@@ -1,7 +1,15 @@
+tsm_system_rows_sources = files(
+  'tsm_system_rows.c',
+)
+
+if host_system == 'windows'
+  tsm_system_rows_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_rows',
+    '--FILEDESC', 'tsm_system_rows - TABLESAMPLE method which accepts number of rows as a limit',])
+endif
+
 tsm_system_rows = shared_module('tsm_system_rows',
-  files(
-    'tsm_system_rows.c',
-  ),
+  tsm_system_rows_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_rows
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
index 18015912ffb..e57a2702c60 100644
--- a/contrib/tsm_system_time/meson.build
+++ b/contrib/tsm_system_time/meson.build
@@ -1,7 +1,15 @@
+tsm_system_time_sources = files(
+  'tsm_system_time.c',
+)
+
+if host_system == 'windows'
+  tsm_system_time_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_time',
+    '--FILEDESC', 'tsm_system_time - TABLESAMPLE method which accepts time in milliseconds as a limit',])
+endif
+
 tsm_system_time = shared_module('tsm_system_time',
-  files(
-    'tsm_system_time.c',
-  ),
+  tsm_system_time_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_time
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
index 872b76e3223..438035132f8 100644
--- a/contrib/unaccent/meson.build
+++ b/contrib/unaccent/meson.build
@@ -1,7 +1,15 @@
+unaccent_sources = files(
+  'unaccent.c',
+)
+
+if host_system == 'windows'
+  unaccent_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'unaccent',
+    '--FILEDESC', 'unaccent - text search dictionary that removes accents',])
+endif
+
 unaccent = shared_module('unaccent',
-  files(
-    'unaccent.c',
-  ),
+  unaccent_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += unaccent
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
index da6d1d75c12..28730f398f0 100644
--- a/contrib/uuid-ossp/meson.build
+++ b/contrib/uuid-ossp/meson.build
@@ -2,10 +2,18 @@ if not uuid.found()
   subdir_done()
 endif
 
+uuid_ossp_sources = files(
+  'uuid-ossp.c',
+)
+
+if host_system == 'windows'
+  uuid_ossp_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'uuid-ossp',
+    '--FILEDESC', 'uuid-ossp - UUID generation',])
+endif
+
 uuid_ossp = shared_module('uuid-ossp',
-  files(
-    'uuid-ossp.c',
-  ),
+  uuid_ossp_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [uuid, contrib_mod_args['dependencies']],
   },
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
index 7a632b87d1b..846de47dbd1 100644
--- a/contrib/vacuumlo/meson.build
+++ b/contrib/vacuumlo/meson.build
@@ -1,5 +1,15 @@
+vacuumlo_sources = files(
+  'vacuumlo.c',
+)
+
+if host_system == 'windows'
+  vacuumlo_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'vacuumlo',
+    '--FILEDESC', 'vacuumlo - removes orphaned large objects',])
+endif
+
 vacuumlo = executable('vacuumlo',
-  ['vacuumlo.c'],
+  vacuumlo_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 9c0b56f01f6..89b0d677516 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -2,11 +2,19 @@ if not libxml.found()
   subdir_done()
 endif
 
+xml2_sources = files(
+  'xpath.c',
+  'xslt_proc.c',
+)
+
+if host_system == 'windows'
+  xml2_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgxml',
+    '--FILEDESC', 'xml2 - XPath querying and XSLT',])
+endif
+
 xml2 = shared_module('pgxml',
-  files(
-    'xpath.c',
-    'xslt_proc.c',
-  ),
+  xml2_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 5887cb92b52..e5dc0edc04b 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -1,7 +1,11 @@
 export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
 
-ecpg_compat = both_libraries('libecpg_compat',
+ecpg_compat_sources = files(
   'informix.c',
+)
+
+ecpg_compat = both_libraries('libecpg_compat',
+  ecpg_compat_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
   c_args: ['-DSO_MAJOR_VERSION=3'],
   dependencies: [frontend_code, thread_dep],
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 1be49c8c27f..74876f039c9 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -93,6 +93,12 @@ ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
 generated_sources += ecpg_kwlist
 ecpg_sources += ecpg_kwlist
 
+if host_system == 'windows'
+  ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ecpg',
+    '--FILEDESC', 'ecpg - embedded SQL precompiler for C',])
+endif
+
 ecpg_exe = executable('ecpg',
   ecpg_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index f0ace641f0c..f67f2dffb71 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -7,6 +7,12 @@ pg_regress_ecpg_sources = pg_regress_c + files(
   'pg_regress_ecpg.c',
 )
 
+if host_system == 'windows'
+  pg_regress_ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress_ecpg',
+    '--FILEDESC', 'ECPG Test - regression tests for ECPG',])
+endif
+
 pg_regress_ecpg = executable('pg_regress_ecpg',
   pg_regress_ecpg_sources,
   c_args: pg_regress_cflags,
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index c7656fd4609..ba27b8c1d44 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -23,6 +23,12 @@ spec_parser = custom_target('specparse',
 isolationtester_sources += spec_parser
 generated_sources += spec_parser.to_list()
 
+if host_system == 'windows'
+  isolation_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_isolation_regress',
+    '--FILEDESC', 'pg_isolation_regress - multi-client test driver',])
+endif
+
 pg_isolation_regress = executable('pg_isolation_regress',
   isolation_sources,
   c_args: pg_regress_cflags,
@@ -34,6 +40,13 @@ pg_isolation_regress = executable('pg_isolation_regress',
 )
 bin_targets += pg_isolation_regress
 
+
+if host_system == 'windows'
+  isolationtester_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isolationtester',
+    '--FILEDESC', 'isolationtester - multi-client test driver',])
+endif
+
 isolationtester = executable('isolationtester',
   isolationtester_sources,
   include_directories: include_directories('.'),
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
index cf4bdaba637..a0c3ab6afe7 100644
--- a/src/test/modules/delay_execution/meson.build
+++ b/src/test/modules/delay_execution/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+delay_execution_sources = files(
+  'delay_execution.c',
+)
+
+if host_system == 'windows'
+  delay_execution_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'delay_execution',
+    '--FILEDESC', 'delay_execution - allow delay between parsing and execution',])
+endif
+
 delay_execution = shared_module('delay_execution',
-  ['delay_execution.c'],
+  delay_execution_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += delay_execution
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
index 56ff5f48001..4ce82491135 100644
--- a/src/test/modules/dummy_index_am/meson.build
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_index_am_sources = files(
+  'dummy_index_am.c',
+)
+
+if host_system == 'windows'
+  dummy_index_am_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_index_am',
+    '--FILEDESC', 'dummy_index_am - index access method template',])
+endif
+
 dummy_index_am = shared_module('dummy_index_am',
-  ['dummy_index_am.c'],
+  dummy_index_am_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_index_am
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
index 21b7cf8f353..81b626e496c 100644
--- a/src/test/modules/dummy_seclabel/meson.build
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_seclabel_sources = files(
+  'dummy_seclabel.c',
+)
+
+if host_system == 'windows'
+  dummy_seclabel_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_seclabel',
+    '--FILEDESC', 'dummy_seclabel - regression testing of the SECURITY LABEL statement',])
+endif
+
 dummy_seclabel = shared_module('dummy_seclabel',
-  ['dummy_seclabel.c'],
+  dummy_seclabel_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_seclabel
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
index 8384b6e3b2a..de0e2d15626 100644
--- a/src/test/modules/libpq_pipeline/meson.build
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -1,7 +1,15 @@
+libpq_pipeline_sources = files(
+  'libpq_pipeline.c',
+)
+
+if host_system == 'windows'
+  libpq_pipeline_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_pipeline',
+    '--FILEDESC', 'libpq_pipeline - test program for pipeline execution',])
+endif
+
 libpq_pipeline = executable('libpq_pipeline',
-  files(
-    'libpq_pipeline.c',
-  ),
+  libpq_pipeline_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
index 45de3f1990d..e1ea2c7a16f 100644
--- a/src/test/modules/plsample/meson.build
+++ b/src/test/modules/plsample/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+plsample_sources = files(
+  'plsample.c',
+)
+
+if host_system == 'windows'
+  plsample_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plsample',
+    '--FILEDESC', 'PL/Sample - template for procedural language',])
+endif
+
 plsample = shared_module('plsample',
-  ['plsample.c'],
+  plsample_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += plsample
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
index 857fc7e140e..445296fee0b 100644
--- a/src/test/modules/spgist_name_ops/meson.build
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+spgist_name_ops_sources = files(
+  'spgist_name_ops.c',
+)
+
+if host_system == 'windows'
+  spgist_name_ops_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'spgist_name_ops',
+    '--FILEDESC', 'spgist_name_ops - test opclass for SP-GiST',])
+endif
+
 spgist_name_ops = shared_module('spgist_name_ops',
-  ['spgist_name_ops.c'],
+  spgist_name_ops_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += spgist_name_ops
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
index a57bd0693a3..a9eb4c564da 100644
--- a/src/test/modules/ssl_passphrase_callback/meson.build
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -3,8 +3,19 @@ if not ssl.found()
 endif
 
 # FIXME: prevent install during main install, but not during test :/
+
+ssl_passphrase_callback_sources = files(
+  'ssl_passphrase_func.c',
+)
+
+if host_system == 'windows'
+  ssl_passphrase_callback_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ssl_passphrase_func',
+    '--FILEDESC', 'callback function to provide a passphrase',])
+endif
+
 ssl_passphrase_callback = shared_module('ssl_passphrase_func',
-  ['ssl_passphrase_func.c'],
+  ssl_passphrase_callback_sources,
   kwargs: pg_mod_args + {
     'dependencies': [ssl, pg_mod_args['dependencies']],
   },
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
index 945eb5a70c4..3cf6b05754f 100644
--- a/src/test/modules/test_bloomfilter/meson.build
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_bloomfilter_sources = files(
+  'test_bloomfilter.c',
+)
+
+if host_system == 'windows'
+  test_bloomfilter_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_bloomfilter',
+    '--FILEDESC', 'test_bloomfilter - test code for Bloom filter library',])
+endif
+
 test_bloomfilter = shared_module('test_bloomfilter',
-  ['test_bloomfilter.c'],
+  test_bloomfilter_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_bloomfilter
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
index 81ad5adc526..54d44f9b2b4 100644
--- a/src/test/modules/test_ddl_deparse/meson.build
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ddl_deparse_sources = files(
+  'test_ddl_deparse.c',
+)
+
+if host_system == 'windows'
+  test_ddl_deparse_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ddl_deparse',
+    '--FILEDESC', 'test_ddl_deparse - regression testing for DDL deparsing',])
+endif
+
 test_ddl_deparse = shared_module('test_ddl_deparse',
-  ['test_ddl_deparse.c'],
+  test_ddl_deparse_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ddl_deparse
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
index abf0a3b0430..b3b49c56122 100644
--- a/src/test/modules/test_ginpostinglist/meson.build
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ginpostinglist_sources = files(
+  'test_ginpostinglist.c',
+)
+
+if host_system == 'windows'
+  test_ginpostinglist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ginpostinglist',
+    '--FILEDESC', 'test_ginpostinglist - test code for src/backend/access/gin//ginpostinglist.c',])
+endif
+
 test_ginpostinglist = shared_module('test_ginpostinglist',
-  ['test_ginpostinglist.c'],
+  test_ginpostinglist_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ginpostinglist
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
index c32c469c69a..4bd75af4b5e 100644
--- a/src/test/modules/test_integerset/meson.build
+++ b/src/test/modules/test_integerset/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_integerset_sources = files(
+  'test_integerset.c',
+)
+
+if host_system == 'windows'
+  test_integerset_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_integerset',
+    '--FILEDESC', 'test_integerset - test code for src/backend/lib/integerset.c',])
+endif
+
 test_integerset = shared_module('test_integerset',
-  ['test_integerset.c'],
+  test_integerset_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_integerset
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
index a388de1156a..c5405b8f878 100644
--- a/src/test/modules/test_lfind/meson.build
+++ b/src/test/modules/test_lfind/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_lfind_sources = files(
+  'test_lfind.c',
+)
+
+if host_system == 'windows'
+  test_lfind_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_lfind',
+    '--FILEDESC', 'test_lfind - test code for optimized linear search functions',])
+endif
+
 test_lfind = shared_module('test_lfind',
-  ['test_lfind.c'],
+  test_lfind_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_lfind
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 5faf0459777..8802bbbac55 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_oat_hooks_sources = files(
+  'test_oat_hooks.c',
+)
+
+if host_system == 'windows'
+  test_oat_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_oat_hooks',
+    '--FILEDESC', 'test_oat_hooks - example use of object access hooks',])
+endif
+
 test_oat_hooks = shared_module('test_oat_hooks',
-  ['test_oat_hooks.c'],
+  test_oat_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_oat_hooks
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
index b59960f615e..1c17113347f 100644
--- a/src/test/modules/test_parser/meson.build
+++ b/src/test/modules/test_parser/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_parser_sources = files(
+  'test_parser.c',
+)
+
+if host_system == 'windows'
+  test_parser_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_parser',
+    '--FILEDESC', 'test_parser - example of a custom parser for full-text search',])
+endif
+
 test_parser = shared_module('test_parser',
-  ['test_parser.c'],
+  test_parser_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_parser
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
index 1cfa84b3609..9a5be43c9c0 100644
--- a/src/test/modules/test_predtest/meson.build
+++ b/src/test/modules/test_predtest/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_predtest_sources = files(
+  'test_predtest.c',
+)
+
+if host_system == 'windows'
+  test_predtest_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_predtest',
+    '--FILEDESC', 'test_predtest - test code for optimizer/util/predtest.c',])
+endif
+
 test_predtest = shared_module('test_predtest',
-  ['test_predtest.c'],
+  test_predtest_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_predtest
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
index 34cbc3e1624..f067e08d321 100644
--- a/src/test/modules/test_rbtree/meson.build
+++ b/src/test/modules/test_rbtree/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rbtree_sources = files(
+  'test_rbtree.c',
+)
+
+if host_system == 'windows'
+  test_rbtree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rbtree',
+    '--FILEDESC', 'test_rbtree - test code for red-black tree library',])
+endif
+
 test_rbtree = shared_module('test_rbtree',
-  ['test_rbtree.c'],
+  test_rbtree_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rbtree
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
index 867a64e57c3..cfb938d9f1e 100644
--- a/src/test/modules/test_regex/meson.build
+++ b/src/test/modules/test_regex/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_regex_sources = files(
+  'test_regex.c',
+)
+
+if host_system == 'windows'
+  test_regex_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_regex',
+    '--FILEDESC', 'test_regex - test code for backend/regex/',])
+endif
+
 test_regex = shared_module('test_regex',
-  ['test_regex.c'],
+  test_regex_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_regex
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
index 80d8adda332..3fb273b2934 100644
--- a/src/test/modules/test_rls_hooks/meson.build
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rls_hooks_sources = files(
+  'test_rls_hooks.c',
+)
+
+if host_system == 'windows'
+  test_rls_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rls_hooks',
+    '--FILEDESC', 'test_rls_hooks - example use of RLS hooks',])
+endif
+
 test_rls_hooks = shared_module('test_rls_hooks',
-  ['test_rls_hooks.c'],
+  test_rls_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rls_hooks
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
index b663543d616..16c8fdb57f4 100644
--- a/src/test/modules/test_shm_mq/meson.build
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -1,10 +1,19 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_shm_mq_sources = files(
+  'setup.c',
+  'test.c',
+  'worker.c',
+)
+
+if host_system == 'windows'
+  test_shm_mq_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_shm_mq',
+    '--FILEDESC', 'test_shm_mq - example use of shared memory message queue',])
+endif
+
 test_shm_mq = shared_module('test_shm_mq',
-  files(
-    'setup.c',
-    'test.c',
-    'worker.c',
-  ),
+  test_shm_mq_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_shm_mq
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index 32acad883b2..a4a158c75b9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -1,8 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_worker_spi_sources = files(
+  'worker_spi.c',
+)
+
+if host_system == 'windows'
+  test_worker_spi_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'worker_spi',
+    '--FILEDESC', 'worker_spi - background worker example',])
+endif
+
 test_worker_spi = shared_module('worker_spi',
-  files(
-    'worker_spi.c',
-  ),
+  test_worker_spi_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_worker_spi
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index fd8ee995b79..963c0f64ed5 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -8,6 +8,12 @@ regress_sources = pg_regress_c + files(
 
 pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
 
+if host_system == 'windows'
+  regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress',
+    '--FILEDESC', 'pg_regress - test driver',])
+endif
+
 pg_regress = executable('pg_regress',
   regress_sources,
   c_args: pg_regress_cflags,
diff --git a/meson.build b/meson.build
index 6ffae59ba03..4ad06b25213 100644
--- a/meson.build
+++ b/meson.build
@@ -2523,6 +2523,67 @@ gen_export_kwargs = {
 
 
 
+###
+### windows resources related stuff
+###
+
+if host_system == 'windows'
+  pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+  win32ver_rc = files('src/port/win32ver.rc')
+  rcgen = find_program('src/tools/rcgen', native: true)
+
+  rcgen_base_args = [
+    '--srcdir', '@SOURCE_DIR@',
+    '--builddir', meson.build_root(),
+    '--rcout', '@OUTPUT0@',
+    '--out', '@OUTPUT1@',
+    '--input', '@INPUT@',
+    '@EXTRA_ARGS@',
+  ]
+
+  if cc.get_argument_syntax() == 'msvc'
+    rcgen_base_args += [
+      '--rc', find_program('rc', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.res']
+  else
+    rcgen_base_args += [
+      '--windres', find_program('windres', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.obj']
+  endif
+
+  # msbuild backend doesn't support this atm
+  if meson.backend() == 'ninja'
+    rcgen_base_args += ['--depfile', '@DEPFILE@']
+  endif
+
+  rcgen_bin_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_APP',
+    '--FILEENDING', 'exe',
+    '--ICO', pg_ico
+  ]
+
+  rcgen_lib_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_DLL',
+    '--FILEENDING', 'dll',
+  ]
+
+  rc_bin_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_bin_args,
+    output: rcgen_outputs,
+  )
+
+  rc_lib_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_lib_args,
+    output: rcgen_outputs,
+  )
+endif
+
+
+
 # headers that the whole build tree depends on
 generated_headers = []
 # headers that the backend build depends on
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
index 16f082ecfa8..9e0934c000b 100644
--- a/src/timezone/meson.build
+++ b/src/timezone/meson.build
@@ -28,6 +28,12 @@ if get_option('system_tzdata') == ''
   if meson.is_cross_build()
     zic = find_program(get_option('ZIC'), native: true, required: true)
   else
+    if host_system == 'windows'
+      zic_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+        '--NAME', 'zic',
+        '--FILEDESC', 'zic - time zone compiler',])
+    endif
+
     zic = executable('zic', zic_sources,
                      dependencies: [frontend_code],
                      kwargs: default_bin_args + {'install': false}
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..5b62bfe5410
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('--srcdir', type=os.path.abspath,
+                    required=True)
+parser.add_argument('--builddir', type=os.path.abspath,
+                    required=True)
+
+binaries = parser.add_argument_group('binaries')
+binaries.add_argument('--windres', type=os.path.abspath)
+binaries.add_argument('--rc', type=os.path.abspath)
+
+inout = parser.add_argument_group('inout')
+inout.add_argument('--depfile', type=argparse.FileType('w'))
+inout.add_argument('--input', type=argparse.FileType('r'),
+                   required=True)
+inout.add_argument('--rcout', type=argparse.FileType('w'),
+                   required=True)
+inout.add_argument('--out', type=str,
+                   required=True)
+
+replacements = parser.add_argument_group('replacements')
+replacements.add_argument('--FILEDESC', type=str)
+replacements.add_argument('--NAME', type=str, required=True)
+replacements.add_argument('--VFT_TYPE', type=str, required=True)
+replacements.add_argument('--FILEENDING', type=str, required=True)
+replacements.add_argument('--ICO', type=str)
+
+args = parser.parse_args()
+
+# determine replacement strings
+
+internal_name = '"{0}"'.format(args.NAME)
+original_name = '"{0}.{1}"'.format(args.NAME, args.FILEENDING)
+
+# if no description is passed in, generate one based on the name
+if args.FILEDESC:
+    filedesc = args.FILEDESC
+elif args.NAME:
+    if args.VFT_TYPE == 'VFT_DLL':
+        filedesc = 'PostgreSQL {0} library'.format(args.NAME)
+    else:
+        filedesc = 'PostgreSQL {0} binary'.format(args.NAME)
+filedesc = '"{0}"'.format(filedesc)
+
+
+if args.ICO:
+    ico = 'IDI_ICON ICON "{0}"'.format(args.ICO)
+    if args.depfile:
+        args.depfile.write("{0} : {1}\n".format(args.rcout.name, args.ICO))
+else:
+    ico = ''
+
+
+data = args.input.read()
+
+data = data.replace('VFT_APP', args.VFT_TYPE)
+data = data.replace('_INTERNAL_NAME_', internal_name)
+data = data.replace('_ORIGINAL_NAME_', original_name)
+data = data.replace('FILEDESC', filedesc)
+data = data.replace("_ICO_", ico)
+
+args.rcout.write(data)
+args.rcout.close()
+
+if args.windres:
+    cmd = [
+        args.windres,
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '-o', args.out, '-i', args.rcout.name,
+    ]
+elif args.rc:
+    cmd = [
+        args.rc, '/nologo',
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '/fo', args.out, args.rcout.name,
+    ]
+else:
+    sys.exit('either --windres or --rc needs to be specified')
+
+sp = subprocess.run(cmd)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# It'd be nicer if we could generate correct dependencies here, but 'rc'
+# doesn't support doing so. It's unlikely we'll ever need more, so...
+if args.depfile:
+    args.depfile.write("{0} : {1}\n".format(
+        args.rcout.name, args.input.name))
+    args.depfile.write("{0} : {1}/{2}\n".format(
+        args.out, args.builddir, 'src/include/pg_config.h'))
-- 
2.37.3.542.gdd3f6c4cae

v15-0006-meson-Add-support-for-relative-rpaths-fixing-tes.patchtext/x-diff; charset=us-asciiDownload
From a6d2f96ef0d46374d972fc95714bf71ee8f03f97 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 13:48:46 -0700
Subject: [PATCH v15 06/14] meson: Add support for relative rpaths, fixing
 tests on MacOS w/ SIP

---
 meson.build                                   | 47 ++++++++--
 .../relativize_shared_library_references      | 88 +++++++++++++++++++
 src/tools/relpath.py                          |  6 ++
 3 files changed, 136 insertions(+), 5 deletions(-)
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py

diff --git a/meson.build b/meson.build
index 4ad06b25213..8323adf772b 100644
--- a/meson.build
+++ b/meson.build
@@ -159,6 +159,7 @@ portname = host_system
 
 exesuffix = '' # overridden below where necessary
 dlsuffix = '.so' # overridden below where necessary
+rpath_origin = '$ORIGIN'
 library_path_var = 'LD_LIBRARY_PATH'
 
 # Format of file to control exports from libraries, and how to pass them to
@@ -209,6 +210,7 @@ elif host_system == 'cygwin'
 elif host_system == 'darwin'
   dlsuffix = '.dylib'
   library_path_var = 'DYLD_LIBRARY_PATH'
+  rpath_origin = '@loader_path'
 
   export_file_format = 'darwin'
   export_fmt = '-exported_symbols_list=@0@'
@@ -241,8 +243,16 @@ elif host_system == 'netbsd'
   # LDFLAGS.
   ldflags += ['-Wl,-z,now', '-Wl,-z,relro']
 
+  # netbsd patched their meson in a broken way:
+  # https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=56959
+  # until there's a way out of that, disable rpath_origin
+  rpath_origin = ''
+
 elif host_system == 'openbsd'
-  # you're ok
+  # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+  # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+  # when invoked via PATH search).
+  rpath_origin = ''
 
 elif host_system == 'sunos'
   portname = 'solaris'
@@ -254,6 +264,7 @@ elif host_system == 'windows'
   exesuffix = '.exe'
   dlsuffix = '.dll'
   library_path_var = ''
+  rpath_origin = ''
 
   export_file_format = 'win'
   export_file_suffix = 'def'
@@ -2479,6 +2490,25 @@ if host_system != 'darwin'
   mod_install_rpaths += postgres_lib_d
 endif
 
+# If the host can form relative rpaths, use that to make the installation
+# properly relocatable
+if rpath_origin != ''
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_bin, dir_lib, check: true).stdout().strip()
+  bin_install_rpaths += rpath_origin / bin_to_lib
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_lib_pkg, dir_lib, check: true).stdout().strip()
+  mod_install_rpaths += rpath_origin / mod_to_lib
+
+  test_use_library_path_var = false
+else
+  test_use_library_path_var = true
+endif
+
 
 # Define arguments for default targets
 
@@ -2771,6 +2801,14 @@ above, or by running configure and then make maintainer-clean.
 endif
 
 
+# To make MacOS installation work without a prior make install, even with SIP
+# enabled, make rpaths relative after installation. This also makes the
+# installation relocatable.
+if host_system == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
 
 ###############################################################
 # Test prep
@@ -2836,10 +2874,9 @@ test_env.set('REGRESS_SHLIB', regress_module.full_path())
 # Export PG_TEST_EXTRA so it can be checked in individual tap tests.
 test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
 
-# Add the temporary installation to the library search path on platforms where
-# that works (everything but windows, basically). On windows everything
-# library-like gets installed into bindir, solving that issue.
-if library_path_var != ''
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if test_use_library_path_var and library_path_var != ''
   test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
 endif
 
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..280bd48fd32
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    meson_info_p = os.path.join(build_root, 'meson-info')
+    targets = json.load(
+        open(os.path.join(meson_info_p, 'intro-targets.json')))
+    installed = json.load(
+        open(os.path.join(meson_info_p, 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            # print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            cmd = install_name_tool + ['-change', lib, newref, patchpath]
+            subprocess.check_call(cmd)
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}',
+          file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
-- 
2.37.3.542.gdd3f6c4cae

v15-0007-meson-Add-docs-for-building-with-meson.patchtext/x-diff; charset=us-asciiDownload
From 7e1b6e3396986236d03c83685d2728795c2a0560 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:55:20 -0700
Subject: [PATCH v15 07/14] meson: Add docs for building with meson

Author: Samay Sharma <smilingsamay@gmail.com>
---
 doc/src/sgml/installation.sgml | 1841 ++++++++++++++++++++++++++++++--
 doc/src/sgml/monitoring.sgml   |    2 +-
 doc/src/sgml/runtime.sgml      |    2 +-
 doc/src/sgml/sourcerepo.sgml   |    5 +-
 4 files changed, 1743 insertions(+), 107 deletions(-)

diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 319c7e69660..3d4018badd3 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -31,7 +31,144 @@ documentation.  See standalone-profile.xsl for details.
   C++</productname>, see <xref linkend="install-windows"/> instead.
  </para>
 
- <sect1 id="install-short">
+ <sect1 id="supported-platforms">
+  <title>Supported Platforms</title>
+
+  <para>
+   A platform (that is, a CPU architecture and operating system combination)
+   is considered supported by the <productname>PostgreSQL</productname> development
+   community if the code contains provisions to work on that platform and
+   it has recently been verified to build and pass its regression tests
+   on that platform.  Currently, most testing of platform compatibility
+   is done automatically by test machines in the
+   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
+   If you are interested in using <productname>PostgreSQL</productname> on a platform
+   that is not represented in the build farm, but on which the code works
+   or can be made to work, you are strongly encouraged to set up a build
+   farm member machine so that continued compatibility can be assured.
+  </para>
+
+  <para>
+   In general, <productname>PostgreSQL</productname> can be expected to work on
+   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
+   and PA-RISC, including
+   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
+   It is often
+   possible to build on an unsupported CPU type by configuring with
+   <option>--disable-spinlocks</option>, but performance will be poor.
+  </para>
+
+  <para>
+   <productname>PostgreSQL</productname> can be expected to work on current
+   versions of these operating systems: Linux, Windows,
+   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
+   Other Unix-like systems may also work but are not currently
+   being tested.  In most cases, all CPU architectures supported by
+   a given operating system will work.  Look in
+   <xref linkend="installation-platform-notes"/> below to see if
+   there is information
+   specific to your operating system, particularly if using an older system.
+  </para>
+
+  <para>
+   If you have installation problems on a platform that is known
+   to be supported according to recent build farm results, please report
+   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
+   in porting <productname>PostgreSQL</productname> to a new platform,
+   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
+   to discuss that.
+  </para>
+
+  <para>
+   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
+   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
+   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
+   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
+   Tru64 UNIX, and ULTRIX.
+  </para>
+ </sect1>
+
+ <sect1 id="get-source">
+  <title>Getting the Source</title>
+
+   <para>
+   You can download the source code in two ways - via git or the source code
+   tarballs.
+   </para>
+
+  <sect2 id="get-source-git">
+   <title>Getting the Source via <productname>Git</productname></title>
+  <para>
+   With <productname>Git</productname>, you can make a copy of the entire code repository
+   on your local machine, so you will have access to all history and branches
+   offline. This is the fastest and most flexible way to develop or test
+   patches.
+  </para>
+
+  <procedure>
+   <step>
+    <para>
+     To begin using the Git repository, make a clone of the official mirror:
+
+<programlisting>
+git clone https://git.postgresql.org/git/postgresql.git
+</programlisting>
+
+     This will copy the full repository to your local machine, so it may take
+     a while to complete, especially if you have a slow Internet connection.
+     The files will be placed in a new subdirectory <filename>postgresql</filename> of
+     your current directory.
+    </para>
+
+   </step>
+
+   <step>
+    <para>
+     Whenever you want to get the latest updates in the system, <command>cd</command>
+     into the repository, and run:
+
+<programlisting>
+git pull
+</programlisting>
+    </para>
+   </step>
+  </procedure>
+
+  <para>
+   <productname>Git</productname> can do a lot more things than just fetch the source.
+   Our wiki, <ulink
+   url="https://wiki.postgresql.org/wiki/Working_with_Git"></ulink>,
+   has some discussion on working with Git. For more information, consult the
+   <productname>Git</productname> man pages, or see the website at
+   <ulink url="https://git-scm.com"></ulink>.
+  </para>
+  </sect2>
+  <sect2 id="get-source-tarball">
+   <title>Getting the Source via Tarballs</title>
+
+  <para>
+   The <productname>PostgreSQL</productname> source code for released versions
+   can also be obtained from the download section of our website:
+   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
+   Download the
+   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
+   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
+   file you're interested in, then unpack it:
+<screen>
+<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
+</screen>
+   This will create a directory
+   <filename>postgresql-<replaceable>version</replaceable></filename> under
+   the current directory with the <productname>PostgreSQL</productname> sources.
+   Change into that directory for the rest of the installation procedure.
+  </para>
+  </sect2>
+ </sect1>
+
+<sect1 id="install-make">
+  <title>Building and Installation with autoconf and make</title>
+
+ <sect2 id="install-short-make">
   <title>Short Version</title>
 
   <para>
@@ -50,12 +187,12 @@ su - postgres
 /usr/local/pgsql/bin/psql test
 </synopsis>
    The long version is the rest of this
-   <phrase>chapter</phrase>.
+   <phrase>section</phrase>.
   </para>
- </sect1>
+ </sect2>
 
 
- <sect1 id="install-requirements">
+ <sect2 id="install-requirements-make">
   <title>Requirements</title>
 
   <para>
@@ -343,45 +480,9 @@ su - postgres
    url="ftp://ftp.gnu.org/gnu/"></ulink>.
   </para>
 
-  <para>
-   Also check that you have sufficient disk space. You will need about
-   350 MB for the source tree during compilation and about 60 MB for
-   the installation directory. An empty database cluster takes about
-   40 MB; databases take about five times the amount of space that a
-   flat text file with the same data would take. If you are going to
-   run the regression tests you will temporarily need up to an extra
-   300 MB. Use the <command>df</command> command to check free disk
-   space.
-  </para>
- </sect1>
+ </sect2>
 
- <sect1 id="install-getsource">
-  <title>Getting the Source</title>
-
-  <para>
-   The <productname>PostgreSQL</productname> source code for released versions
-   can be obtained from the download section of our website:
-   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
-   Download the
-   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
-   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
-   file you're interested in, then unpack it:
-<screen>
-<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
-</screen>
-   This will create a directory
-   <filename>postgresql-<replaceable>version</replaceable></filename> under
-   the current directory with the <productname>PostgreSQL</productname> sources.
-   Change into that directory for the rest of the installation procedure.
-  </para>
-
-  <para>
-   Alternatively, you can use the Git version control system; see
-   <xref linkend="git"/> for more information.
-  </para>
- </sect1>
-
- <sect1 id="install-procedure">
+ <sect2 id="install-procedure-make">
   <title>Installation Procedure</title>
 
   <procedure>
@@ -630,6 +731,7 @@ build-postgresql:
    rebuilding.  Without this, your changes in configuration choices
    might not propagate everywhere they need to.
   </para>
+  </sect2>
 
   <sect2 id="configure-options">
    <title><filename>configure</filename> Options</title>
@@ -844,7 +946,7 @@ build-postgresql:
      various <productname>PostgreSQL</productname> features that are not
      built by default.  Most of these are non-default only because they
      require additional software, as described in
-     <xref linkend="install-requirements"/>.
+     <xref linkend="install-requirements-make"/>.
     </para>
 
      <variablelist>
@@ -1672,9 +1774,7 @@ build-postgresql:
 
    </sect3>
 
-  </sect2>
-
-  <sect2 id="configure-envvars">
+  <sect3 id="configure-envvars">
    <title><filename>configure</filename> Environment Variables</title>
 
    <indexterm zone="configure-envvars">
@@ -1955,9 +2055,1600 @@ build-postgresql:
       adjustments, while <envar>COPT</envar> might be kept set all the time.
      </para>
     </note>
+   </sect3>
   </sect2>
  </sect1>
 
+ <sect1 id="install-meson">
+  <title>Building and Installation with meson</title>
+
+ <sect2 id="install-short-meson">
+  <title>Short Version</title>
+
+  <para>
+<synopsis>
+
+# create working directory
+mkdir postgres
+cd postgres
+
+# fetch source code
+# git clone https://git.postgresql.org/git/postgresql.git src
+
+# current instructions for testing (to be removed when merging)
+git clone -b meson https://github.com/anarazel/postgres.git src
+
+# setup and enter build directory (done only first time)
+meson setup build src --prefix=$PWD/install
+cd build
+
+# Compile source
+ninja
+
+# Install to the prefix directory specified above
+ninja install
+
+# Run all tests (optional, takes time)
+meson test
+
+# Initialize a new database
+../install/bin/initdb -D ../data
+
+# Start database
+../install/bin/pg_ctl -D ../data/ -l logfile start
+
+# Connect to the database
+../install/bin/psql -d postgres
+
+</synopsis>
+   The long version is the rest of this
+   <phrase>section</phrase>.
+  </para>
+ </sect2>
+
+ <sect2 id="install-requirements-meson">
+  <title>Requirements</title>
+
+  <para>
+   In general, a modern Unix-compatible platform or Windows should be able
+   to build <productname>PostgreSQL</productname> with meson and run it.
+   The platforms which have received specific testing at the time of release are:
+
+  <itemizedlist spacing="compact">
+   <listitem><simpara>Linux</simpara></listitem>
+   <listitem><simpara>Windows</simpara></listitem>
+   <listitem><simpara>OpenBSD</simpara></listitem>
+   <listitem><simpara>NetBSD</simpara></listitem>
+   <listitem><simpara>FreeBSD</simpara></listitem>
+   <listitem><simpara>macOS</simpara></listitem>
+  </itemizedlist>
+  </para>
+
+  <sect3 id="required-packages">
+   <title>Required packages</title>
+
+   <para>
+    The following software packages are required for building
+    <productname>PostgreSQL</productname>:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You can download the source code in two ways - via git or by downloading
+      the source code tarballs. For the former, you will need an installed version of
+      <productname>Git</productname>, which you can get from
+      <ulink url="https://git-scm.com"></ulink>. Many systems already
+      have a recent version of <productname>Git</productname>
+      installed by default, or available in their package distribution system.
+      If you download the source code tarballs, you will need
+      <application>tar</application> in addition to
+      <application>gzip</application> or <application>bzip2</application>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>meson</primary>
+      </indexterm>
+      You need to install <application>
+      <ulink url="https://mesonbuild.com/">meson</ulink></application> version
+      0.54 or later to be able to build <productname>PostgreSQL</productname>
+      with it. If your operating system provides a package manager, you can install
+      <application>meson</application> with that. If not, you
+      can download a <ulink url="https://github.com/mesonbuild/meson">meson release</ulink>
+      from github and run <literal>./meson.py</literal> from the git repository
+      itself. Lastly, Meson is also available in the python package index and can
+      be installed with <literal>pip</literal>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least
+      C99-compliant). Recent
+      versions of <productname>GCC</productname> are recommended, but
+      <productname>PostgreSQL</productname> is known to build using a wide variety
+      of compilers from different vendors.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>flex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>lex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>bison</primary>
+      </indexterm>
+      <indexterm>
+       <primary>yacc</primary>
+      </indexterm>
+
+      <application>Flex</application> and <application>Bison</application>
+      are needed to build <productname>PostgreSQL</productname> using
+      <application>meson</application>. Be sure to get
+      <application>Flex</application> 2.5.31 or later and
+      <application>Bison</application> 1.875 or later from your package manager.
+      Other <application>lex</application> and <application>yacc</application>
+      programs cannot be used.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>perl</primary>
+      </indexterm>
+      <application>Perl</application> 5.8.3 or later is needed to build PostgreSQL
+      using <application>meson</application> and to run some test suites.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+  <sect3 id="recommended-packages">
+   <title>Recommended packages</title>
+
+   <para>
+   The following packages are not required to build
+   <application>PostgreSQL</application> but are strongly recommended:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>readline</primary>
+      </indexterm>
+      <indexterm>
+       <primary>libedit</primary>
+      </indexterm>
+
+      The <acronym>GNU</acronym> <productname>Readline</productname> library
+      allows <application>psql</application> (the PostgreSQL command line
+      SQL interpreter) to remember each command you type, and allows you to
+      use arrow keys to recall and edit previous commands.  This is very
+      helpful and is strongly recommended. As an alternative, you can often
+      use the BSD-licensed <filename>libedit</filename> library, originally
+      developed on <productname>NetBSD</productname>. The
+      <filename>libedit</filename> library is GNU
+      <productname>Readline</productname>-compatible and is used if
+      <filename>libreadline</filename> is not found, or if
+      <option>libedit_preferred</option> is enabled as an
+      option to <filename>meson configure</filename>. If you are using a
+      package-based Linux distribution, be aware that you need both the
+      <literal>readline</literal> and <literal>readline-devel</literal> packages, if
+      those are separate in your distribution.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>zlib</primary>
+      </indexterm>
+
+      The <productname>zlib</productname> compression library is
+      used to provide support for compressed archives in
+      <application>pg_dump</application> and
+      <application>pg_restore</application> and is recommended.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Various tests, particularly the client program tests under
+      <filename>src/bin</filename>, use the Perl TAP tools. Running
+      these tests is recommended for development. These TAP tests
+      require the Perl module <literal>IPC::Run</literal> which is
+      available from CPAN or an operating system package.
+     </para>
+    </listitem>
+   </itemizedlist>
+  </para>
+  </sect3>
+
+  <sect3 id="optional-packages">
+   <title>Optional packages</title>
+
+   <para>
+   The following packages are optional.  They are not required in the
+   default configuration, but they are needed when certain build
+   options are enabled, as explained below:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You need <productname>OpenSSL</productname>, if you want to support
+      encrypted client connections.  <productname>OpenSSL</productname> is
+      also required for random number generation on platforms that do not
+      have <filename>/dev/urandom</filename> (except Windows).  The minimum
+      required version is 1.0.1.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>LZ4</productname>, if you want to support
+      compression of data with that method; see
+      <xref linkend="guc-default-toast-compression"/> and
+      <xref linkend="guc-wal-compression"/>.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>Zstandard</productname>, if you want to support
+      compression of data or backups with that method; see
+      <xref linkend="guc-wal-compression"/>.
+      The minimum required version is 1.4.0.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <application>Kerberos</application>, <productname>OpenLDAP</productname>,
+      and/or <application>PAM</application>, if you want to support authentication
+      using those services.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the server programming language
+      <application>PL/Perl</application> you need a full
+      <productname>Perl</productname> installation, including the
+      <filename>libperl</filename> library and the header files.
+      The minimum required version is <productname>Perl</productname> 5.8.3.
+      Since <application>PL/Perl</application> will be a shared
+      library, the <indexterm><primary>libperl</primary></indexterm>
+      <filename>libperl</filename> library must be a shared library
+      also on most platforms.  This appears to be the default in
+      recent <productname>Perl</productname> versions, but it was not
+      in earlier versions, and in any case it is the choice of whomever
+      installed Perl at your site.  <filename>configure</filename> will fail
+      if building <application>PL/Perl</application> is selected but it cannot
+      find a shared <filename>libperl</filename>.  In that case, you will have
+      to rebuild and install <productname>Perl</productname> manually to be
+      able to build <application>PL/Perl</application>.  During the
+      configuration process for <productname>Perl</productname>, request a
+      shared library.
+     </para>
+
+     <para>
+      If you intend to make more than incidental use of
+      <application>PL/Perl</application>, you should ensure that the
+      <productname>Perl</productname> installation was built with the
+      <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal>
+      will show whether this is the case).
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Python</application> server programming
+      language, you need a <productname>Python</productname>
+      installation with the header files and
+      the <application>sysconfig</application> module.  The minimum
+      required version is <productname>Python</productname> 3.2.
+     </para>
+
+     <para>
+      Since <application>PL/Python</application> will be a shared
+      library, the <indexterm><primary>libpython</primary></indexterm>
+      <filename>libpython</filename> library must be a shared library
+      also on most platforms.  This is not the case in a default
+      <productname>Python</productname> installation built from source, but a
+      shared library is available in many operating system
+      distributions.  <filename>configure</filename> will fail if
+      building <application>PL/Python</application> is selected but it cannot
+      find a shared <filename>libpython</filename>.  That might mean that you
+      either have to install additional packages or rebuild (part of) your
+      <productname>Python</productname> installation to provide this shared
+      library.  When building from source, run <productname>Python</productname>'s
+      configure with the <literal>--enable-shared</literal> flag.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Tcl</application>
+      procedural language, you of course need a <productname>Tcl</productname>
+      installation.  The minimum required version is
+      <productname>Tcl</productname> 8.4.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To enable Native Language Support (<acronym>NLS</acronym>), that
+      is, the ability to display a program's messages in a language
+      other than English, you need an implementation of the
+      <application>Gettext</application> <acronym>API</acronym>.  Some operating
+      systems have this built-in (e.g., <systemitem
+      class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>,
+      <systemitem class="osname">Solaris</systemitem>), for other systems you
+      can download an add-on package from <ulink
+      url="https://www.gnu.org/software/gettext/"></ulink>.
+      If you are using the <application>Gettext</application> implementation in
+      the <acronym>GNU</acronym> C library then you will additionally
+      need the <productname>GNU Gettext</productname> package for some
+      utility programs.  For any of the other implementations you will
+      not need it.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <productname>PostgreSQL</productname> documentation,
+      there is a separate set of requirements; see
+      <xref linkend="docguide-toolsets"/>.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+ </sect2>
+
+ <sect2 id="configure-meson">
+  <title>Configuring the build</title>
+
+   <para>
+    The first step of the installation procedure is to configure the
+    source tree for your system and choose the options you would like. To
+    create and configure the build directory, you can start with the
+    <literal>meson setup</literal> command.
+   </para>
+
+<screen>
+<userinput>meson setup build</userinput>
+</screen>
+
+   <para>
+    The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal>
+    argument. If no <literal>srcdir</literal> is given Meson will deduce the
+    <literal>srcdir</literal> based on the current directory and the location
+    of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory.
+   </para>
+
+   <para>
+    Meson then loads the build configuration file and sets up the build directory.
+    Additionally, the invocation can pass options to Meson. The list of commonly
+    used options is in subsequent sections. A few examples of specifying different
+    build options are:
+
+<screen>
+#Setup build directory with a different installation prefix
+meson setup build --prefix=/home/user/pg-install
+
+#Setup build directory to generate a debug build
+meson setup build --buildtype=debug
+
+#Setup build directory with ssl (Use -D for project specific options)
+meson setup build -Dssl=openssl
+</screen>
+
+    Setting up the build directory is a one-time step. To reconfigure before a
+    new build, you can simply use the <literal>meson configure</literal> command
+   </para>
+
+<para>
+<screen>
+meson configure -Dcassert=true
+</screen>
+</para>
+
+<para>
+    <command>meson configure</command>'s commonly used command line options
+    are explained below. This list is not exhaustive (use
+    <literal>meson configure --help</literal> to get one that is).
+    The options not covered here are meant for advanced use-cases, and are
+    documented in the standard meson
+    <ulink url="https://mesonbuild.com/Commands.html#configure">documentation</ulink>.
+    These arguments can be used with <command>meson setup</command> as well.
+</para>
+
+   <sect3 id="configure-install-locations">
+    <title>Installation Locations</title>
+
+     <para>
+      These options control where <literal>ninja install (or meson install)</literal> will put
+      the files.  The <option>--prefix</option> option is sufficient for
+      most cases.  If you have special needs, you can customize the
+      installation subdirectories with the other options described in this
+      section.  Beware however that changing the relative locations of the
+      different subdirectories may render the installation non-relocatable,
+      meaning you won't be able to move it after installation.
+      (The <literal>man</literal> and <literal>doc</literal> locations are
+      not affected by this restriction.)
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term>
+       <listitem>
+        <para>
+         Install all files under the directory <replaceable>PREFIX</replaceable>
+         instead of <filename>/usr/local/pgsql</filename>. The actual
+         files will be installed into various subdirectories; no files
+         will ever be installed directly into the
+         <replaceable>PREFIX</replaceable> directory.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the directory for executable programs. The default
+         is <filename><replaceable>PREFIX</replaceable>/bin</filename>, which
+         normally means <filename>/usr/local/pgsql/bin</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for various configuration files,
+         <filename><replaceable>PREFIX</replaceable>/etc</filename> by default.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the location to install libraries and dynamically loadable
+         modules. The default is
+         <filename><replaceable>PREFIX</replaceable>/lib</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing C and C++ header files. The
+         default is <filename><replaceable>PREFIX</replaceable>/include</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for read-only data files used by the
+         installed programs. The default is
+         <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has
+         nothing to do with where your database files will be placed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing locale data, in particular
+         message translation catalog files.  The default is
+         <filename><replaceable>DATADIR</replaceable>/locale</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         The man pages that come with <productname>PostgreSQL</productname> will be installed under
+         this directory, in their respective
+         <filename>man<replaceable>x</replaceable></filename> subdirectories.
+         The default is <filename><replaceable>DATADIR</replaceable>/man</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+
+  <note>
+      <para>
+       Care has been taken to make it possible to install
+       <productname>PostgreSQL</productname> into shared installation locations
+       (such as <filename>/usr/local/include</filename>) without
+       interfering with the namespace of the rest of the system. First,
+       the string <quote><literal>/postgresql</literal></quote> is
+       automatically appended to <varname>datadir</varname>,
+       <varname>sysconfdir</varname>, and <varname>docdir</varname>,
+       unless the fully expanded directory name already contains the
+       string <quote><literal>postgres</literal></quote> or
+       <quote><literal>pgsql</literal></quote>. For example, if you choose
+       <filename>/usr/local</filename> as prefix, the documentation will
+       be installed in <filename>/usr/local/doc/postgresql</filename>,
+       but if the prefix is <filename>/opt/postgres</filename>, then it
+       will be in <filename>/opt/postgres/doc</filename>. The public C
+       header files of the client interfaces are installed into
+       <varname>includedir</varname> and are namespace-clean. The
+       internal header files and the server header files are installed
+       into private directories under <varname>includedir</varname>. See
+       the documentation of each interface for information about how to
+       access its header files. Finally, a private subdirectory will
+       also be created, if appropriate, under <varname>libdir</varname>
+       for dynamically loadable modules.
+      </para>
+     </note>
+    </sect3>
+
+    <sect3 id="configure-pg-features">
+    <title><productname>PostgreSQL</productname> Features</title>
+
+    <para>
+     The options described in this section enable building of
+     various <productname>PostgreSQL</productname> features that are not
+     built by default.  Most of these are non-default only because they
+     require additional software, as described in
+     <xref linkend="install-requirements-meson"/>. To specify PostgreSQL
+     specific options, the name of the option should be prefixed by -D.
+    </para>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>-Dnls=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Enables or disables Native Language Support (<acronym>NLS</acronym>),
+         that is, the ability to display a program's messages in a
+         language other than English. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To use this option, you will need an implementation of the
+         <application>Gettext</application> API.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplperl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Perl</application> server-side language. It
+         defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplpython=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Python</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpltcl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Tcl</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the TCL version to use when building PL/Tcl.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dicu=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for
+         the <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm>
+         library, enabling use of ICU collation
+         features<phrase condition="standalone-ignore"> (see
+         <xref linkend="collation"/>)</phrase>.
+         This requires the <productname>ICU4C</productname> package
+         to be installed.  The minimum required version
+         of <productname>ICU4C</productname> is currently 4.2.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+
+        <para>
+         By default,
+         <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm>
+         will be used to find the required compilation options.  This is
+         supported for <productname>ICU4C</productname> version 4.6 and later.
+         <!-- Add description for older ICU4C versions and when pkg-config isn't available-->
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="configure-with-llvm-meson">
+       <term><option>-Dllvm=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for <productname>LLVM</productname> based
+         <acronym>JIT</acronym> compilation<phrase
+         condition="standalone-ignore"> (see <xref
+         linkend="jit"/>)</phrase>.  This
+         requires the <productname>LLVM</productname> library to be installed.
+         The minimum required version of <productname>LLVM</productname> is
+         currently 3.9. It is set to disabled by default.
+        </para>
+        <para>
+         <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
+         will be used to find the required compilation options.
+         <command>llvm-config</command>, and then
+         <command>llvm-config-$major-$minor</command> for all supported
+         versions, will be searched for in your <envar>PATH</envar>.
+         <!--Add substitute for LLVM_CONFIG when llvm-config is not in PATH-->
+        </para>
+
+        <para>
+         <productname>LLVM</productname> support requires a compatible
+         <command>clang</command> compiler (specified, if necessary, using the
+         <envar>CLANG</envar> environment variable), and a working C++
+         compiler (specified, if necessary, using the <envar>CXX</envar>
+         environment variable).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlz4=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>LZ4</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzstd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>Zstandard</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dssl=<replaceable>LIBRARY</replaceable></option>
+       <indexterm>
+        <primary>OpenSSL</primary>
+        <seealso>SSL</seealso>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Build with support for <acronym>SSL</acronym> (encrypted)
+         connections. The only <replaceable>LIBRARY</replaceable>
+         supported is <option>openssl</option>. This requires the
+         <productname>OpenSSL</productname> package to be installed.
+         <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenSSL</productname> installation is sufficient
+         before proceeding. The default for this option is none.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dgssapi=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for GSSAPI authentication. On many systems, the
+         GSSAPI system (usually a part of the Kerberos installation) is not
+         installed in a location
+         that is searched by default (e.g., <filename>/usr/include</filename>,
+         <filename>/usr/lib</filename>), so you must use the options
+         <option>-Dextra_include_dirs</option> and <option>-Dextra_lib_dirs</option> in
+         addition to this option.  <filename>meson configure</filename> will check
+         for the required header files and libraries to make sure that
+         your GSSAPI installation is sufficient before proceeding.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dldap=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm>
+         support for authentication and connection parameter lookup (see
+         <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and
+         <xref linkend="auth-ldap"/></phrase> for more information). On Unix,
+         this requires the <productname>OpenLDAP</productname> package to be
+         installed. On Windows, the default <productname>WinLDAP</productname>
+         library is used.  <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenLDAP</productname> installation is sufficient before
+         proceeding. It defaults to auto, meaning that it will be enabled automatically
+         if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpam=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm>
+         (Pluggable Authentication Modules) support. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbsd_auth=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with BSD Authentication support. (The BSD Authentication framework is
+         currently only available on OpenBSD.) It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystemd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support
+         for <application>systemd</application><indexterm><primary>systemd</primary></indexterm>
+         service notifications.  This improves integration if the server
+         is started under <application>systemd</application> but has no impact
+         otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more
+         information</phrase>.  <application>libsystemd</application> and the
+         associated header files need to be installed to use this option.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbonjour=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for Bonjour automatic service discovery.
+         This requires Bonjour support in your operating system.
+         Recommended on macOS. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <xref linkend="uuid-ossp"/> module
+         (which provides functions to generate UUIDs), using the specified
+         UUID library.<indexterm><primary>UUID</primary></indexterm>
+         <replaceable>LIBRARY</replaceable> must be one of:
+        </para>
+        <itemizedlist>
+         <listitem>
+          <para>
+           <option>none</option> to not build the ussp module. This is the default.
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>bsd</option> to use the UUID functions found in FreeBSD, NetBSD,
+           and some other BSD-derived systems
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>e2fs</option> to use the UUID library created by
+           the <literal>e2fsprogs</literal> project; this library is present in most
+           Linux systems and in macOS, and can be obtained for other
+           platforms as well
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>ossp</option> to use the <ulink
+           url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
+          </para>
+         </listitem>
+        </itemizedlist>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxml=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxml2, enabling SQL/XML support.  Libxml2 version 2.6.23 or
+         later is required for this feature. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To detect the required compiler and linker options, PostgreSQL will
+         query <command>pkg-config</command>, if that is installed and knows
+         about libxml2.  Otherwise the program <command>xml2-config</command>,
+         which is installed by libxml2, will be used if it is found.  Use
+         of <command>pkg-config</command> is preferred, because it can deal
+         with multi-architecture installations better.
+        </para>
+
+        <para>
+         To use a libxml2 installation that is in an unusual location, you
+         can set <command>pkg-config</command>-related environment
+         variables (see its documentation).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxslt=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxslt, enabling the
+         <xref linkend="xml2"/>
+         module to perform XSL transformations of XML.
+         <option>-Dlibxml</option> must be specified as well.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dreadline=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Allows use of the <application>Readline</application> library
+         (and <application>libedit</application> as well).  This option enables
+         command-line editing and history in
+         <application>psql</application> and is strongly recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibedit_preferred=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this to true favors the use of the BSD-licensed <application>libedit</application> library
+         rather than GPL-licensed <application>Readline</application>.  This option
+         is significant only if you have both libraries installed; the
+         default is false that is to use <application>Readline</application>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzlib=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>zlib</primary>
+         </indexterm>
+         Enabls use of the <application>Zlib</application> library.
+         This enables
+         support for compressed archives in <application>pg_dump</application>
+         and <application>pg_restore</application> and is recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dspinlocks=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true by default and
+         setting it to false will allow the build to succeed even if <productname>PostgreSQL</productname>
+         has no CPU spinlock support for the platform.  The lack of
+         spinlock support will result in very poor performance; therefore,
+         this option should only be changed if the build aborts and
+         informs you that the platform lacks spinlock support. If setting this
+         option to false is required to build <productname>PostgreSQL</productname> on
+         your platform, please report the problem to the
+         <productname>PostgreSQL</productname> developers.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Datomics=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true and setting it to false will
+         disable use of CPU atomic operations.  The option does nothing on
+         platforms that lack such operations.  On platforms that do have
+         them, disabling atomics will result in poor performance.  Changing
+         this option is only useful for debugging or making performance comparisons.
+        </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-build-process">
+    <title>Build Process Details</title>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>--auto_features=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this option allows you to override value of all 'auto' features.
+         This can be useful when you want to disable or enable all the "optional"
+         features at once without having to set each of them manually. The default
+         value for this parameter is auto.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--backend=<replaceable>BACKEND</replaceable></option></term>
+       <listitem>
+        <para>
+         The default backend meson uses is ninja and that should suffice for most use cases.
+         However, if you'd like to fully integrate with visual studio, you can set the
+         BACKEND to <command>vs</command>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C compiler.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C linker.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories that will be added to the list the compiler
+         searches for header files. If you have optional packages
+         (such as GNU <application>Readline</application>) installed in a non-standard
+         location,
+         you have to use this option and probably also the corresponding
+         <option>-Dextra_lib_dirs</option> option.
+        </para>
+        <para>
+         Example: <literal>-Dextra_include_dirs=/opt/gnu/include:/usr/sup/include</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories to search for libraries. You will probably have
+         to use this option (and the corresponding
+         <option>-Dextra_include_dirs</option> option) if you have packages
+         installed in non-standard locations.
+        </para>
+        <para>
+         Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib:/usr/sup/lib</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option>
+       <indexterm>
+        <primary>time zone data</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <productname>PostgreSQL</productname> includes its own time zone database,
+         which it requires for date and time operations.  This time zone
+         database is in fact compatible with the IANA time zone
+         database provided by many operating systems such as FreeBSD,
+         Linux, and Solaris, so it would be redundant to install it again.
+         When this option is used, the system-supplied time zone database
+         in <replaceable>DIRECTORY</replaceable> is used instead of the one
+         included in the PostgreSQL source distribution.
+         <replaceable>DIRECTORY</replaceable> must be specified as an
+         absolute path.  <filename>/usr/share/zoneinfo</filename> is a
+         likely directory on some operating systems.  Note that the
+         installation routine will not detect mismatching or erroneous time
+         zone data.  If you use this option, you are advised to run the
+         regression tests to verify that the time zone data you have
+         pointed to works correctly with <productname>PostgreSQL</productname>.
+        </para>
+
+        <indexterm><primary>cross compilation</primary></indexterm>
+
+        <para>
+         This option is mainly aimed at binary package distributors
+         who know their target operating system well.  The main
+         advantage of using this option is that the PostgreSQL package
+         won't need to be upgraded whenever any of the many local
+         daylight-saving time rules change.  Another advantage is that
+         PostgreSQL can be cross-compiled more straightforwardly if the
+         time zone database files do not need to be built during the
+         installation.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term>
+       <listitem>
+        <para>
+         Append <replaceable>STRING</replaceable> to the PostgreSQL version number.  You
+         can use this, for example, to mark binaries built from unreleased Git
+         snapshots or containing custom patches with an extra version string,
+         such as a <command>git describe</command> identifier or a
+         distribution package release number.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term>
+       <listitem>
+        <para>
+         If you have the binaries for certain by programs required to build
+         Postgres (with or without optional flags) stored at non-standard
+         paths, you could specify them manually to meson configure. The complete
+         list of programs for whom this is supported can be found by running
+         <literal>meson configure</literal>. An example is included below.
+<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting>
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-layout">
+    <title>Data layout</title>
+
+    <para>
+     These options affect how PostgreSQL lays out data on disk.
+     Note that changing these breaks on-disk database compatibility,
+     meaning you cannot use <command>pg_upgrade</command> to upgrade to
+     a build with a different value of these options.
+    </para>
+
+    <variablelist>
+
+      <varlistentry>
+       <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>segment size</firstterm>, in gigabytes.  Large tables are
+         divided into multiple operating-system files, each of size equal
+         to the segment size.  This avoids problems with file size limits
+         that exist on many platforms.  The default segment size, 1 gigabyte,
+         is safe on all supported platforms.  If your operating system has
+         <quote>largefile</quote> support (which most do, nowadays), you can use
+         a larger segment size.  This can be helpful to reduce the number of
+         file descriptors consumed when working with very large tables.
+         But be careful not to select a value larger than is supported
+         by your platform and the file systems you intend to use.  Other
+         tools you might wish to use, such as <application>tar</application>, could
+         also set limits on the usable file size.
+         It is recommended, though not absolutely required, that this value
+         be a power of 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within tables.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 32 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>WAL block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within the WAL log.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 64 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-devel">
+    <title>Developer Options</title>
+
+    <para>
+     Most of the options in this section are only of interest for
+     developing or debugging <productname>PostgreSQL</productname>.
+     They are not recommended for production builds, except
+     for <option>--debug</option>, which can be useful to enable
+     detailed bug reports in the unlucky event that you encounter a bug.
+     On platforms supporting DTrace, <option>-Ddtrace</option>
+     may also be reasonable to use in production.
+    </para>
+
+    <para>
+     When building an installation that will be used to develop code inside
+     the server, it is recommended to use at least the <option>--buildtype=debug</option>
+     and <option>-Dcassert</option> options.
+    </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term>
+       <listitem>
+        <para>
+         This option can be used to specify the buildtype to use; defaults
+         to release. If you'd like finer control on the debug symbols
+         and optimization levels than what this option provides, you can
+         refer to the --debug and --optimization flags.
+
+         The following build types are generally used:
+         <variablelist>
+          <varlistentry>
+           <term><literal>plain</literal></term>
+           <listitem>
+            <para>
+            No extra build flags are used, even for compiler warnings,
+            useful for distro packagers and other cases where you need to
+            specify all arguments by yourself.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debug</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated but the result is not optimized.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debugoptimized</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated and the code is optimized (on most compilers
+            this means <literal>-g -O2</literal>)
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>release</literal></term>
+           <listitem>
+            <para>
+            This enables full optimization and no debug info is generated. This is
+            the default.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--debug</option></term>
+       <listitem>
+        <para>
+         Compiles all programs and libraries with debugging symbols.
+         This means that you can run the programs in a debugger
+         to analyze problems. This enlarges the size of the installed
+         executables considerably, and on non-GCC compilers it usually
+         also disables compiler optimization, causing slowdowns. However,
+         having the symbols available is extremely helpful for dealing
+         with any problems that might arise.  Currently, this option is
+         recommended for production installations only if you use GCC.
+         But you should always have it on if you are doing development work
+         or running a beta version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term>
+       <listitem>
+        <para>
+         Specify the optimization level. LEVEL can be set to any of {0,g,1,2,3,s}.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--werror</option></term>
+       <listitem>
+        <para>
+         Setting this option asks the compiler to treat warnings as errors. This can
+         be useful for code development purposes.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dcassert</option></term>
+       <listitem>
+        <para>
+         Enables <firstterm>assertion</firstterm> checks in the server, which test for
+         many <quote>cannot happen</quote> conditions.  This is invaluable for
+         code development purposes, but the tests can slow down the
+         server significantly.
+         Also, having the tests turned on won't necessarily enhance the
+         stability of your server!  The assertion checks are not categorized
+         for severity, and so what might be a relatively harmless bug will
+         still lead to server restarts if it triggers an assertion
+         failure.  This option is not recommended for production use, but
+         you should have it on for development work or when running a beta
+         version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtap-tests</option></term>
+       <listitem>
+        <para>
+         Enable tests using the Perl TAP tools.  This requires a Perl
+         installation and the Perl module <literal>IPC::Run</literal>.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term>
+       <listitem>
+        <para>
+         Enable test suites which require special software to run. This option
+         accepts arguments via a whitespace-separated list. The following values
+         are currently supported:
+         <variablelist>
+          <varlistentry>
+           <term><literal>kerberos</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/kerberos</filename>.  This
+            requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ldap</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ldap</filename>.  This
+            requires an <productname>OpenLDAP</productname> installation and opens
+            TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ssl</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ssl</filename>.  This opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>wal_consistency_checking</literal></term>
+           <listitem>
+            <para>
+            Uses <literal>wal_consistency_checking=all</literal> while running
+            certain tests under <filename>src/test/recovery</filename>.  Not
+            enabled by default because it is resource intensive.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+         Tests for features that are not supported by the current build
+         configuration are not run even if they are mentioned in
+         <varname>PG_TEST_EXTRA</varname>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--errorlogs</option></term>
+       <listitem>
+        <para>
+        This option can be used to print the logs from the failing tests
+        making debugging easier.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Db_coverage</option></term>
+       <listitem>
+        <para>
+         If using GCC, all programs and libraries are compiled with
+         code coverage testing instrumentation.  When run, they
+         generate files in the build directory with code coverage
+         metrics.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/>
+         for more information.</phrase> This option is for use only with GCC
+         and when doing development work.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Ddtrace=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>DTrace</primary>
+         </indexterm>
+         Enabling this compiles <productname>PostgreSQL</productname> with support for the
+         dynamic tracing tool DTrace.
+         <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/>
+         for more information.</phrase>
+        </para>
+
+        <para>
+         To point to the <command>dtrace</command> program, the
+         environment variable <envar>DTRACE</envar> can be set.  This
+         will often be necessary because <command>dtrace</command> is
+         typically installed under <filename>/usr/sbin</filename>,
+         which might not be in your <envar>PATH</envar>.
+        </para>
+
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-misc">
+    <title>Miscellaneous</title>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term>
+       <listitem>
+        <para>
+         Set <replaceable>NUMBER</replaceable> as the default port number for
+         server and clients. The default is 5432. The port can always
+         be changed later on, but if you specify it here then both
+         server and clients will have the same default compiled in,
+         which can be very convenient.  Usually the only good reason
+         to select a non-default value is if you intend to run multiple
+         <productname>PostgreSQL</productname> servers on the same machine.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term>
+       <listitem>
+        <para>
+         The default name of the Kerberos service principal used
+         by GSSAPI.
+         <literal>postgres</literal> is the default. There's usually no
+         reason to change this unless you are building for a Windows
+         environment, in which case it must be set to upper case
+         <literal>POSTGRES</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+ </sect2>
+
+ <sect2 id="build-meson">
+  <title>Building the source</title>
+   <para>
+    By default, <productname>Meson</productname> uses the
+    <ulink url="https://ninja-build.org/"> Ninja build system</ulink>.
+    To build <productname>PostgreSQL</productname> from source using meson, you can
+    simply use the <literal>ninja</literal> command in the build directory.
+<screen>
+ninja
+</screen>
+     Ninja will automatically detect the number of CPUs in your computer and
+     parallelize itself accordingly. You can override the amount of parallel
+     processes used with the command line argument <literal>-j</literal>.
+   </para>
+
+   <para>
+     It should be noted that after the initial configure step
+     <command>ninja</command> is the only command you ever need to type to
+     compile. No matter how you alter your source tree (short of moving it to
+     a completely new location), Meson will detect the changes and regenerate
+     itself accordingly. This is especially handy if you have multiple build
+     directories. Often one of them is used for development (the "debug" build)
+     and others only every now and then (such as a "static analysis" build).
+     Any configuration can be built just by cd'ing to the corresponding directory
+     and running Ninja.
+   </para>
+
+   <para>
+     If you'd like to build with a backend other that ninja, you can use configure
+     with the <option>--backend</option> option to select the one you want to use and then
+     build using <literal>meson compile</literal>. To learn more about these
+     backends and other arguments you can provide to ninja, you can refer to the
+     meson <ulink url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
+     documentation</ulink>.
+   </para>
+ </sect2>
+
+ <sect2 id="install-files-meson">
+  <title>Installing the files</title>
+   <para>
+    Once Postgres is built, you can install it by simply running the
+    <literal>ninja install</literal> command.
+
+<screen>
+ninja install
+</screen>
+   </para>
+
+   <para>
+    This will install files into the directories that were specified
+    in <xref linkend="configure-meson"/>. Make sure that you have appropriate
+    permissions to write into that area. You might need to do this
+    step as root. Alternatively, you can create the target directories
+    in advance and arrange for appropriate permissions to be granted.
+    The standard installation provides all the header files needed for client
+    application development as well as for server-side program
+    development, such as custom functions or data types written in C.
+   </para>
+
+   <para>
+    <literal>ninja install</literal> should work for most cases
+    but if you'd like to use more options, you could also use
+    <literal>meson install</literal> instead. You can learn more about
+    <ulink url="https://mesonbuild.com/Commands.html#install">meson install</ulink>
+    and it's options in the meson documentation.
+   </para>
+
+   <para>
+    Depending on your platform and setup, you might have to perform a
+    few steps after installation. Those are outlined in
+    <xref linkend="install-post"/>.
+   </para>
+
+  <formalpara>
+   <title>Uninstallation:</title>
+   <para>
+    To undo the installation, you can use the <command>ninja
+    uninstall</command> command.
+   </para>
+  </formalpara>
+
+  <formalpara>
+   <title>Cleaning:</title>
+   <para>
+    After the installation you can free disk space by removing the built
+    files from the source tree with the <command>ninja clean</command>
+    command.
+   </para>
+  </formalpara>
+
+ </sect2>
+
+ <sect2 id="running-tests">
+  <title>Running tests</title>
+   <para>
+    If you want to test the newly built server, you can run the regression
+    tests. The regression tests are a collection of test suites to verify
+    that <productname>PostgreSQL</productname> runs on your machine in
+    the way the developers expected it to. To run them, simply type:
+<screen>
+<userinput>meson test</userinput>
+</screen>
+    You can repeat this at any later time by issuing the same command.
+   </para>
+
+   <para>Meson also allows you to list tests and run specific tests or suites.
+<screen>
+# List all tests
+<userinput>meson test --list</userinput>
+
+# Run a specific test
+<userinput>meson test recovery/001_stream_rep</userinput>
+
+# Run the main pg_regress and isolation tests
+<userinput>meson test --suite main</userinput>
+</screen>
+   </para>
+
+   <para>
+    To learn more about running the tests and how to interpret the results
+    you can refer to the documentation for interpreting test results.
+     <literal>meson test</literal> also provides a number of additional
+    options you can use which can be found in the
+    <ulink url="https://mesonbuild.com/Unit-tests.html#testing-tool">meson test documentation</ulink>.
+   </para>
+
+ </sect2>
+
+ </sect1>
+
  <sect1 id="install-post">
   <title>Post-Installation Setup</title>
 
@@ -2106,62 +3797,6 @@ export MANPATH
   </sect2>
  </sect1>
 
- <sect1 id="supported-platforms">
-  <title>Supported Platforms</title>
-
-  <para>
-   A platform (that is, a CPU architecture and operating system combination)
-   is considered supported by the <productname>PostgreSQL</productname> development
-   community if the code contains provisions to work on that platform and
-   it has recently been verified to build and pass its regression tests
-   on that platform.  Currently, most testing of platform compatibility
-   is done automatically by test machines in the
-   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
-   If you are interested in using <productname>PostgreSQL</productname> on a platform
-   that is not represented in the build farm, but on which the code works
-   or can be made to work, you are strongly encouraged to set up a build
-   farm member machine so that continued compatibility can be assured.
-  </para>
-
-  <para>
-   In general, <productname>PostgreSQL</productname> can be expected to work on
-   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
-   and PA-RISC, including
-   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
-   It is often
-   possible to build on an unsupported CPU type by configuring with
-   <option>--disable-spinlocks</option>, but performance will be poor.
-  </para>
-
-  <para>
-   <productname>PostgreSQL</productname> can be expected to work on current
-   versions of these operating systems: Linux, Windows,
-   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
-   Other Unix-like systems may also work but are not currently
-   being tested.  In most cases, all CPU architectures supported by
-   a given operating system will work.  Look in
-   <xref linkend="installation-platform-notes"/> below to see if
-   there is information
-   specific to your operating system, particularly if using an older system.
-  </para>
-
-  <para>
-   If you have installation problems on a platform that is known
-   to be supported according to recent build farm results, please report
-   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
-   in porting <productname>PostgreSQL</productname> to a new platform,
-   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
-   to discuss that.
-  </para>
-
-  <para>
-   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
-   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
-   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
-   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
-   Tru64 UNIX, and ULTRIX.
-  </para>
- </sect1>
 
  <sect1 id="installation-platform-notes">
   <title>Platform-Specific Notes</title>
@@ -2170,7 +3805,7 @@ export MANPATH
    This section documents additional platform-specific issues
    regarding the installation and setup of PostgreSQL.  Be sure to
    read the installation instructions, and in
-   particular <xref linkend="install-requirements"/> as well.  Also,
+   particular <xref linkend="install-requirements-make"/> as well.  Also,
    check <xref linkend="regress"/> regarding the
    interpretation of regression test results.
   </para>
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 1d9509a2f66..214e1b1d551 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -7072,7 +7072,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
    explicitly tell the configure script to make the probes available
    in <productname>PostgreSQL</productname>. To include DTrace support
    specify <option>--enable-dtrace</option> to configure.  See <xref
-   linkend="install-procedure"/> for further information.
+   linkend="configure-options-devel"/> for further information.
   </para>
   </sect2>
 
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index f268265a838..7a1d220175b 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1855,7 +1855,7 @@ $ <userinput>kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</userinput
     <step>
      <para>
       Install the new version of <productname>PostgreSQL</productname> as
-      outlined in <xref linkend="install-procedure"/>.
+      outlined in <xref linkend="installation"/>.
      </para>
     </step>
 
diff --git a/doc/src/sgml/sourcerepo.sgml b/doc/src/sgml/sourcerepo.sgml
index 0ed7f8a3fea..f16be29a61a 100644
--- a/doc/src/sgml/sourcerepo.sgml
+++ b/doc/src/sgml/sourcerepo.sgml
@@ -20,9 +20,10 @@
    Note that building <productname>PostgreSQL</productname> from the source
    repository requires reasonably up-to-date versions of <application>bison</application>,
    <application>flex</application>, and <application>Perl</application>. These tools are not needed
-   to build from a distribution tarball, because the files that these tools
+   to build from a distribution tarball if building via make, because the files that these tools
    are used to build are included in the tarball.  Other tool requirements
-   are the same as shown in <xref linkend="install-requirements"/>.
+   are the same as shown in <xref linkend="install-requirements-make"/> and
+   <xref linkend="install-requirements-meson"/>.
   </para>
 
  <sect1 id="git">
-- 
2.37.3.542.gdd3f6c4cae

v15-0008-meson-Add-PGXS-compatibility.patchtext/x-diff; charset=us-asciiDownload
From 5935b41b7f3fc01e786e63de8834e099ca534a9d Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 20:27:17 -0700
Subject: [PATCH v15 08/14] meson: Add PGXS compatibility

This works for some extensions on some operating systems, but could use plenty
of cleanups.
---
 src/meson.build | 259 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 259 insertions(+)

diff --git a/src/meson.build b/src/meson.build
index b515af15bfa..ca99db42baa 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,3 +10,262 @@ subdir('bin')
 subdir('pl')
 
 subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to only use a single
+# buildsystem across all the supported postgres versions. Once all supported
+# PG versions support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+  'PACKAGE_URL': pg_url,
+  'PACKAGE_VERSION': pg_version,
+  'PG_MAJORVERSION': pg_version_major,
+  'PG_VERSION_NUM': pg_version_num,
+  'configure_input': 'meson',
+
+  'vpath_build': 'yes',
+  'autodepend': 'no', # XXX: Should we just set this to true when possible?
+
+  'host_cpu': host_cpu,
+  'host': '@0@-@1@'.format(host_cpu, host_system),
+  'host_os': host_system,
+  'build_os': build_machine.system(),
+  'PORTNAME': portname,
+  'PG_SYSROOT': pg_sysroot,
+
+  'abs_top_builddir': meson.build_root(),
+  'abs_top_srcdir': meson.source_root(),
+
+  'enable_thread_safety': 'yes',
+  'enable_rpath': 'yes',
+  'enable_nls': libintl.found() ? 'yes' : 'no',
+  'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no',
+  'enable_debug': get_option('debug') ? 'yes' : 'no',
+  'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+  'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+  'DLSUFFIX': dlsuffix,
+  'EXEEXT': exesuffix,
+
+  'SUN_STUDIO_CC': 'no', # not supported so far
+
+  'default_port': get_option('pgport'),
+  'with_system_tzdata': get_option('system_tzdata'),
+
+  'with_krb_srvnam': get_option('krb_srvnam'),
+  'krb_srvtab': krb_srvtab,
+
+  # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+  'STRIP': 'strip',
+  'STRIP_STATIC_LIB': 'strip -x',
+  'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+  # Just always use the install_sh fallback that autoconf uses. Unlikely to
+  # matter performance-wise for extensions. If it turns out to do, we can
+  # improve that later.
+  'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+  'CC': var_cc,
+  'CPP': var_cpp,
+  'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld'] ? 'yes' : 'no'),
+
+  'CFLAGS': var_cflags,
+  'CPPFLAGS': var_cppflags,
+  'CXXFLAGS': var_cxxflags,
+  'CFLAGS_SL': var_cflags_sl,
+  'CFLAGS_SL_MODULE': ' '.join(cflags_mod),
+  'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod),
+  'CFLAGS_SSE42': ' '.join(cflags_crc),
+  'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+  'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+  # FIXME:
+  'CFLAGS_ARMV8_CRC32C': '',
+  'BITCODE_CFLAGS': '',
+  'BITCODE_CXXFLAGS': '',
+
+  'LDFLAGS': var_ldflags,
+  'LDFLAGS_EX': var_ldflags_ex,
+  'LDFLAGS_SL': var_ldflags_sl,
+
+  'BISONFLAGS': ' '.join(bison_flags),
+  'FLEXFLAGS': ' '.join(flex_flags),
+
+  'LIBS': var_libs,
+}
+
+if llvm.found()
+  pgxs_kv += {
+    'CLANG': clang.path(),
+    'CXX': ' '.join(cpp.cmd_array()),
+    'LLVM_BINPATH': llvm_binpath,
+  }
+else
+  pgxs_kv += {
+    'CLANG': '',
+    'CXX': '',
+    'LLVM_BINPATH': '',
+  }
+endif
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+  'BISON': bison,
+  'FLEX': flex,
+  'GZIP': gzip,
+  'LZ4': program_lz4,
+  'PERL': perl,
+  'PROVE': prove,
+  'PYTHON': python,
+  'TAR': tar,
+  'ZSTD': program_zstd,
+  'DTRACE': dtrace,
+  'LD': ld_program,
+  'install_bin': install_sh,
+}
+foreach b, p : pgxs_bins
+  pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+pgxs_empty = [
+  'PERMIT_DECLARATION_AFTER_STATEMENT',
+  'ICU_CFLAGS', # needs to be added, included by public server headers
+
+  # probably need most of these?
+  'RANLIB',
+  'WINDRES',
+  'LN_S',
+  'AR',
+  'AWK',
+
+  # hard to see why we'd need either?
+  'ZIC',
+  'TCLSH',
+
+  # docs don't seem to be supported by pgxs
+  'XMLLINT',
+  'XSLTPROC',
+  'DBTOEPUB',
+  'FOP',
+
+  # supporting coverage for pgxs-in-meson build doesn't seem worth it
+  'GENHTML',
+  'LCOV',
+  'GCOV',
+  'MSGFMT_FLAGS',
+
+  # translation doesn't appear to be supported by pgxs
+  'MSGFMT',
+  'XGETTEXT',
+  'MSGMERGE',
+  'WANTED_LANGUAGES',
+
+  # Not needed because we don't build the server / PLs with the generated makefile
+  'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+  'DTRACEFLAGS', # only server has dtrace probes
+
+  'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+  'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+  # possible that some of these are referenced explicitly in pgxs makefiles?
+  # For now not worth it.
+  'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD',
+
+  'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+  'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+  'UUID_LIBS',
+
+  'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+  'ICU_LIBS',
+]
+
+foreach pe : pgxs_empty
+  pgxs_cdata.set(pe, '')
+endforeach
+
+pgxs_dirs = {
+  'prefix': get_option('prefix'),
+
+  'bindir': '${exec_prefix}' / get_option('bindir'),
+  'datarootdir': '${prefix}' / get_option('datadir'),
+  'datadir': '${datarootdir}',
+  'docdir': '${prefix}' / dir_doc,
+  'exec_prefix': '${prefix}',
+  'htmldir': '${prefix}' / dir_doc_html, #?
+  'includedir': '${prefix}' / get_option('includedir'),
+  'libdir': '${exec_prefix}' / get_option('libdir'),
+  'localedir': '${prefix}' / get_option('localedir'),
+  'mandir': '${prefix}' / get_option('mandir'),
+  'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+foreach d, p : pgxs_dirs
+  pgxs_cdata.set(d, p)
+endforeach
+
+pgxs_deps = {
+  'bonjour': bonjour,
+  'bsd_auth': bsd_auth,
+  'gssapi': gssapi,
+  'icu': icu,
+  'ldap': ldap,
+  'libxml': libxml,
+  'libxslt': libxslt,
+  'llvm': llvm,
+  'lz4': lz4,
+  'nls': libintl,
+  'pam': pam,
+  'perl': perl_dep,
+  'python': python3_dep,
+  'readline': readline,
+  'selinux': selinux,
+  'systemd': systemd,
+  'tcl': tcl_dep,
+  'zlib': zlib,
+  'zstd': zstd,
+}
+foreach d, v : pgxs_deps
+  pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+pgxs_cdata.set('with_ssl', get_option('ssl'))
+pgxs_cdata.set('with_uuid', uuidopt)
+
+makefile_global = configure_file(
+  input: 'Makefile.global.in',
+  output: 'Makefile.global',
+  configuration: pgxs_cdata,
+  install: true,
+  install_dir: dir_pgxs / 'src',
+)
+configure_files += makefile_global
+
+# FIXME: check if exists
+makefile_port = configure_file(
+  input: 'makefiles' / 'Makefile.@0@'.format(portname),
+  output: 'Makefile.port',
+  copy: true,
+  install_dir: dir_pgxs / 'src')
+configure_files += makefile_port
+
+install_data(
+  'Makefile.shlib', 'nls-global.mk',
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'makefiles/pgxs.mk',
+  install_dir: dir_pgxs / 'src' / 'makefiles')
-- 
2.37.3.542.gdd3f6c4cae

v15-0009-meson-Add-postgresql-extension.pc-for-building-e.patchtext/x-diff; charset=us-asciiDownload
From 3cd5f97d7ab63b5ecf6a8aedfa67afc285714269 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:52:03 -0700
Subject: [PATCH v15 09/14] meson: Add postgresql-extension.pc for building
 extension libraries

This should work with several other buildsystems.

TODO: Docs and example
---
 src/backend/meson.build | 96 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/src/backend/meson.build b/src/backend/meson.build
index fefa40ddb64..0598085a240 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -180,6 +180,102 @@ pg_mod_args = default_mod_args + {
 
 
 
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = pg_mod_c_args
+pg_ext_libs = [backend_mod_code, thread_dep, ldflags, ldflags_mod]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+  if incdir.startswith('src/include')
+    subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+  else
+    subincdir = ''
+  endif
+  pg_ext_subdirs += subincdir
+
+  # Add directories in source / build dir containing headers to cflags for the
+  # -uninstalled.pc
+  pg_ext_vars_uninst += [
+    'build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+    'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir),
+  ]
+  pg_ext_cflags += [
+    '${build_inc@0@}'.format(i),
+    '${src_inc@0@}'.format(i)
+  ]
+
+  i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags += cflags
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'pkglibdir=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_mod=${pkglibdir}'
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+# referenced on some platforms, via mod_link_with_dir
+pg_ext_vars += 'bindir=${prefix}/@0@'.format(dir_bin)
+
+# XXX: Define variables making it easy to define tests, too
+
+# Some platforms need linker flags to link with binary, they are the same
+# between building with meson and .pc file, except that we have have to
+# reference a variable to make it work for both normal and -uninstalled .pc
+# files.
+if mod_link_args_fmt.length() != 0
+  assert(link_with_inst != '')
+  assert(link_with_uninst != '')
+
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format(link_with_inst)
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(link_with_uninst)
+
+  foreach el : mod_link_args_fmt
+    pg_ext_libs += el.format('${mod_link_with}')
+  endforeach
+endif
+
+# main .pc to build extensions
+pkgconfig.generate(
+  name: 'postgresql-extension',
+  description: 'PostgreSQL Extension Support',
+  url: pg_url,
+
+  subdirs: pg_ext_subdirs,
+  libraries: pg_ext_libs,
+  extra_cflags: pg_ext_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+  name: 'postgresql-extension-warnings',
+  description: 'PostgreSQL Extension Support - Compiler Warnings',
+  requires: 'postgresql-extension',
+  url: pg_url,
+  extra_cflags: cflags_warn,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+
 # Shared modules that, on some system, link against the server binary. Only
 # enter these after we defined the server build.
 
-- 
2.37.3.542.gdd3f6c4cae

v15-0010-meson-Add-LLVM-bitcode-emission.patchtext/x-diff; charset=us-asciiDownload
From 59120464e1c497eb4c8faf11a69b5a8ea7523304 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 19:58:45 -0700
Subject: [PATCH v15 10/14] meson: Add LLVM bitcode emission

This needs a bit more love before being ready...
---
 src/backend/jit/llvm/meson.build | 21 +++++++++++++++
 src/backend/meson.build          | 46 ++++++++++++++++++++++++++++++++
 meson.build                      |  2 ++
 src/tools/irlink                 | 43 +++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+)
 create mode 100644 src/tools/irlink

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index 5fb63768358..5b339e33934 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -54,6 +54,19 @@ else
   llvm_irgen_command = clang
 endif
 
+llvm_irlink_kw = {
+  'command': [
+    irlink,
+    '--name', 'postgres',
+    '--lto', llvm_lto,
+    '--outdir', '@OUTPUT0@',
+    '--privdir', '@PRIVATE_DIR@',
+    '@INPUT@',
+  ],
+  'install': true,
+  'install_dir': dir_lib_pkg,
+}
+
 
 # XXX: Need to determine proper version of the function cflags for clang
 bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
@@ -77,3 +90,11 @@ llvmjit_types = custom_target('llvmjit_types.bc',
   depfile: '@BASENAME@.c.bc.d',
 )
 backend_targets += llvmjit_types
+
+# Figure out -I's needed to build all postgres code, including all its
+# dependencies
+pkg_config = find_program(['pkg-config', 'pkgconf'], required: true)
+r = run_command(pkg_config,
+  ['--cflags-only-I', meson.build_root() / 'meson-uninstalled/postgresql-extension-uninstalled.pc'],
+  check: true)
+bitcode_cflags += r.stdout().split()
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 0598085a240..1cb4cd3431f 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -284,3 +284,49 @@ subdir('replication/libpqwalreceiver')
 subdir('replication/pgoutput')
 subdir('snowball')
 subdir('utils/mb/conversion_procs')
+
+
+
+###############################################################
+# emit LLVM bitcode of backend code for JIT inlining
+###############################################################
+
+if llvm.found()
+
+  # custom_target() insists on targeting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generators don't accept CustomTargetIndex as input or 'depends', nor do
+  # they like targets with more than one output. However, a custom target
+  # accepts them as input without a problem. So we have the below transitive
+  # target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args + bitcode_cflags,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: '@PLAINNAME@.bc',
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('bitcode',
+    output: ['bitcode'],
+    input: bc_backend_sources,
+    kwargs: llvm_irlink_kw,
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/meson.build b/meson.build
index 8323adf772b..2b0cbb9a5a7 100644
--- a/meson.build
+++ b/meson.build
@@ -684,6 +684,8 @@ if not llvmopt.disabled()
 
     ccache = find_program('ccache', native: true, required: false)
     clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+    irlink = find_program('src/tools/irlink', native: true)
   endif
 else
   llvm = not_found_dep
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..813bbf13398
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(
+    description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+    shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = []
+for input in args.INPUT:
+    file_names += [args.name + input.replace(args.privdir, '')]
+
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink',
+           '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v15-0011-meson-Add-support-for-building-with-precompiled-.patchtext/x-diff; charset=us-asciiDownload
From e3d1e4a4ef68d50fd1ae9a31e0f7eed96b387972 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 23 Sep 2022 12:19:17 -0700
Subject: [PATCH v15 11/14] meson: Add support for building with precompiled
 headers

This substantially speeds up building for windows. A cross build with mingw
goes from

real	0m29.884s
user	15m41.900s
sys	1m58.257s

to

real	0m13.196s
user	6m52.330s
sys	1m15.140s

The wins on windows are similar-ish (but I don't have a system at hand just
now for actual numbers).
---
 src/include/meson.build           | 1 +
 src/include/pch/c_pch.h           | 1 +
 src/include/pch/meson.build       | 4 ++++
 src/include/pch/postgres_fe_pch.h | 1 +
 src/include/pch/postgres_pch.h    | 1 +
 src/common/meson.build            | 2 ++
 src/port/meson.build              | 2 ++
 src/backend/meson.build           | 5 +++++
 src/backend/snowball/meson.build  | 1 +
 src/fe_utils/meson.build          | 1 +
 src/bin/pg_dump/meson.build       | 1 +
 src/bin/pg_upgrade/meson.build    | 1 +
 src/bin/psql/meson.build          | 1 +
 src/interfaces/libpq/meson.build  | 1 +
 src/pl/plperl/meson.build         | 1 +
 src/pl/plpgsql/src/meson.build    | 1 +
 src/pl/plpython/meson.build       | 1 +
 src/pl/tcl/meson.build            | 1 +
 contrib/bloom/meson.build         | 1 +
 contrib/btree_gist/meson.build    | 1 +
 contrib/hstore/meson.build        | 1 +
 contrib/pg_trgm/meson.build       | 1 +
 contrib/pgcrypto/meson.build      | 1 +
 contrib/pgstattuple/meson.build   | 1 +
 contrib/sepgsql/meson.build       | 1 +
 contrib/xml2/meson.build          | 1 +
 .cirrus.yml                       | 4 ++--
 meson.build                       | 8 ++++++++
 28 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/meson.build
 create mode 100644 src/include/pch/postgres_fe_pch.h
 create mode 100644 src/include/pch/postgres_pch.h

diff --git a/src/include/meson.build b/src/include/meson.build
index e5390df0584..28ed9011c70 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -110,6 +110,7 @@ install_headers(
 
 subdir('catalog')
 subdir('nodes')
+subdir('pch')
 subdir('storage')
 subdir('utils')
 
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..2bcec49c3a2
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,4 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
+pch_postgres_fe_h = meson.source_root() / meson.current_source_dir() / 'postgres_fe_pch.h'
diff --git a/src/include/pch/postgres_fe_pch.h b/src/include/pch/postgres_fe_pch.h
new file mode 100644
index 00000000000..f3ea20912d3
--- /dev/null
+++ b/src/include/pch/postgres_fe_pch.h
@@ -0,0 +1 @@
+#include "postgres_fe.h"
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/common/meson.build b/src/common/meson.build
index 23842e1ffef..1c9b8a3a018 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -147,6 +147,7 @@ foreach name, opts : pgcommon_variants
     endif
     c_args = opts.get('c_args', []) + common_cflags[cflagname]
     cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'sources': sources,
@@ -159,6 +160,7 @@ foreach name, opts : pgcommon_variants
 
   lib = static_library('libpgcommon@0@'.format(name),
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
diff --git a/src/port/meson.build b/src/port/meson.build
index ced2e014db8..c2222696f1b 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -161,6 +161,7 @@ foreach name, opts : pgport_variants
     c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
     cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
       sources,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'c_args': c_args,
         'build_by_default': false,
@@ -172,6 +173,7 @@ foreach name, opts : pgport_variants
   lib = static_library('libpgport@0@'.format(name),
       pgport_sources,
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
       }
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 1cb4cd3431f..a535543ee9e 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -62,6 +62,7 @@ postgres_lib = static_library('postgres_lib',
   backend_sources + timezone_sources + generated_backend_sources,
   link_whole: backend_link_with,
   dependencies: backend_build_deps,
+  c_pch: pch_postgres_h,
   kwargs: internal_lib_args,
 )
 
@@ -81,6 +82,10 @@ if cc.get_id() == 'msvc'
 
   backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
   backend_link_depends += postgres_def
+  # Due to the way msvc and meson's precompiled headers implementation
+  # interact, we need to have symbols from the full library available. Could
+  # be restricted to b_pch=true.
+  backend_link_with += postgres_lib
 
 elif host_system == 'aix'
   # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 974401d187e..72959fa29d6 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -66,6 +66,7 @@ endif
 
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
+  c_pch: pch_postgres_h,
   kwargs: pg_mod_args + {
     'include_directories': [stemmer_inc],
   }
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index b6bf8e1ca21..f1ba5ac8c14 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -23,6 +23,7 @@ fe_utils_sources += psqlscan
 
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
+  c_pch: pch_postgres_fe_h,
   include_directories: [postgres_inc, libpq_inc],
   dependencies: frontend_common_code,
   kwargs: default_lib_args,
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 3527a25c288..e66f632b54e 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -13,6 +13,7 @@ pg_dump_common_sources = files(
 
 pg_dump_common = static_library('libpgdump_common',
   pg_dump_common_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq, zlib],
   kwargs: internal_lib_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index a7b927a45c7..212bc9ce6ef 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -24,6 +24,7 @@ endif
 
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 3474389d3b6..8ec07260d1b 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -46,6 +46,7 @@ endif
 
 psql = executable('psql',
   psql_sources,
+  c_pch: pch_postgres_fe_h,
   include_directories: include_directories('.'),
   dependencies: [frontend_code, libpq, readline],
   kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 2c9edeaa088..72102521edc 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -49,6 +49,7 @@ libpq_st = static_library('libpq',
   pic: true,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
+  c_pch: pch_postgres_fe_h,
   dependencies: libpq_deps,
   kwargs: default_lib_args,
 )
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 535660085dd..cd3894e6a73 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -45,6 +45,7 @@ endif
 
 plperl = shared_module('plperl',
   plperl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plperl_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [perl_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index c46c0a1da2a..27b2f5ef529 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -48,6 +48,7 @@ endif
 
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
+  c_pch: pch_postgres_h,
   include_directories: include_directories('.'),
   kwargs: pg_mod_args,
 )
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 40888386b5f..7bd683580e8 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -36,6 +36,7 @@ endif
 
 plpython = shared_module('plpython3',
   plpython_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plpython_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [python3_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index f09bb14c950..7a708776c99 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -22,6 +22,7 @@ endif
 
 pltcl = shared_module('pltcl',
   pltcl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [include_directories('.'), postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [tcl_dep, pg_mod_args['dependencies']],
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 16f3b83e4d2..163a93c98fb 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -15,6 +15,7 @@ endif
 
 bloom = shared_module('bloom',
   bloom_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += bloom
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index e98c91dacc8..bfb7865d213 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -33,6 +33,7 @@ endif
 
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gist
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 2bb26bb772b..a2a4ec36cb0 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -18,6 +18,7 @@ endif
 
 hstore = shared_module('hstore',
   hstore_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index c8c7c07b308..839d6c4a7f6 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -13,6 +13,7 @@ endif
 
 pg_trgm = shared_module('pg_trgm',
   pg_trgm_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index 7fc7bbc7ca1..cc782578b49 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -78,6 +78,7 @@ endif
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
   },
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 05e4cd46a5c..42d0b0e6ce9 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -12,6 +12,7 @@ endif
 
 pgstattuple = shared_module('pgstattuple',
   pgstattuple_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 8bef239e3c2..1ac0fa388ab 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -22,6 +22,7 @@ endif
 
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [selinux, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 89b0d677516..92ab3368428 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -15,6 +15,7 @@ endif
 
 xml2 = shared_module('pgxml',
   xml2_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/.cirrus.yml b/.cirrus.yml
index 965483550d1..a0e7acf5ec9 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -602,7 +602,7 @@ task:
   # Use /DEBUG:FASTLINK to avoid high memory usage during linking
   configure_script: |
     vcvarsall x64
-    meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+    meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Db_pch=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
 
   build_script: |
     vcvarsall x64
@@ -630,7 +630,7 @@ task:
 
   configure_script: |
     vcvarsall x64
-    meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+    meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
 
   build_script: |
     vcvarsall x64
diff --git a/meson.build b/meson.build
index 2b0cbb9a5a7..6ee9bbb3f46 100644
--- a/meson.build
+++ b/meson.build
@@ -15,6 +15,7 @@ project('postgresql',
   meson_version: '>=0.54',
   default_options: [
     'warning_level=1', #-Wall equivalent
+    'b_pch=false',
     'buildtype=release',
   ]
 )
@@ -1767,6 +1768,13 @@ if cc.get_id() == 'msvc'
     '/wd4267', # conversion from 'size_t' to 'type', possible loss of data
   ]
 
+  # Dirty hack to disable warnings due to some files defining
+  # UMDF_USING_NTSTATUS before including postgres.h. We need a better fix, but
+  # for now this allows us to see "real" warnings.
+  if get_option('b_pch')
+    cflags_warn += '/wd4005' # macro redefinition
+  endif
+
   cppflags += [
     '/DWIN32',
     '/DWINDOWS',
-- 
2.37.3.542.gdd3f6c4cae

v15-0012-meson-Add-xmllint-xsltproc-wrapper-script-to-han.patchtext/x-diff; charset=us-asciiDownload
From cdd31870ecfb682ff1a405e1fcef3af4e13cb733 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 08:49:45 -0700
Subject: [PATCH v15 12/14] meson: Add xmllint/xsltproc wrapper script to
 handle dependencies automatically

---
 doc/src/sgml/meson.build          | 38 ++++++++++++++------
 doc/src/sgml/xmltools_dep_wrapper | 60 +++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 10 deletions(-)
 create mode 100644 doc/src/sgml/xmltools_dep_wrapper

diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
index ba2a261e7a4..e6781d0deae 100644
--- a/doc/src/sgml/meson.build
+++ b/doc/src/sgml/meson.build
@@ -2,7 +2,7 @@ docs = []
 alldocs = []
 doc_generated = []
 
-xmllint = find_program(get_option('XMLLINT'), native: true, required: false)
+xmllint_bin = find_program(get_option('XMLLINT'), native: true, required: false)
 
 
 version_sgml = configure_file(
@@ -60,14 +60,23 @@ doc_generated += custom_target('keywords-table.sgml',
 )
 
 # For everything else we need at least xmllint
-if not xmllint.found()
+if not xmllint_bin.found()
   subdir_done()
 endif
 
 pandoc = find_program('pandoc', native: true, required: false)
-xsltproc = find_program(get_option('XSLTPROC'), native: true, required: false)
+xsltproc_bin = find_program(get_option('XSLTPROC'), native: true, required: false)
 fop = find_program('fop', native: true, required: false)
 
+xmltools_wrapper = [
+  python, files('xmltools_dep_wrapper'),
+  '--targetname', '@OUTPUT@', '--depfile', '@DEPFILE@'
+]
+
+xmllint = xmltools_wrapper + [
+  '--tool', xmllint_bin, '--',
+]
+
 # Run validation only once, common to all subsequent targets.  While
 # we're at it, also resolve all entities (that is, copy all included
 # files into one big file).  This helps tools that don't understand
@@ -75,6 +84,7 @@ fop = find_program('fop', native: true, required: false)
 postgres_full_xml = custom_target('postgres-full.xml',
   input: 'postgres.sgml',
   output: 'postgres-full.xml',
+  depfile: 'postgres-full.xml.d',
   command: [xmllint, '--noent', '--valid', '--path', '@OUTDIR@', '-o', '@OUTPUT@', '@INPUT@'],
   depends: doc_generated,
   build_by_default: false,
@@ -86,18 +96,20 @@ alldocs += postgres_full_xml
 #
 # Full documentation as html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   xsltproc_flags = [
     '--stringparam', 'pg.version', pg_version,
     '--param', 'website.stylesheet', '1'
   ]
 
+  xsltproc = xmltools_wrapper + [
+    '--tool', xsltproc_bin, '--',
+  ]
 
-  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
-  # depfile
   html = custom_target('html',
     input: ['stylesheet.xsl', postgres_full_xml],
     output: 'html',
+    depfile: 'html.d',
     depends: doc_generated,
     command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -110,6 +122,7 @@ if xsltproc.found()
   html_help = custom_target('html_help',
     input: ['stylesheet-hh.xsl', postgres_full_xml],
     output: 'htmlhelp',
+    depfile: 'htmlhelp.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -121,6 +134,7 @@ if xsltproc.found()
   postgres_html = custom_target('postgres.html',
     input: ['stylesheet-html-nochunk.xsl', postgres_full_xml],
     output: 'postgres.html',
+    depfile: 'postgres.html.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -144,10 +158,11 @@ endif
 #
 # INSTALL in html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   install_xml = custom_target('INSTALL.xml',
     input: ['standalone-profile.xsl', 'standalone-install.xml'],
     output: 'INSTALL.xml',
+    depfile: 'INSTALL.xml.d',
     depends: doc_generated + [postgres_full_xml],
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
     build_by_default: false,
@@ -155,6 +170,7 @@ if xsltproc.found()
   install_html = custom_target('INSTALL.html',
     input: ['stylesheet-text.xsl', install_xml],
     output: 'INSTALL.html',
+    depfile: 'INSTALL.html.d',
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
@@ -177,11 +193,12 @@ endif
 #
 # Man pages
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   # FIXME: implement / consider sqlmansectnum logic
   man = custom_target('man',
     input: ['stylesheet-man.xsl', postgres_full_xml],
     output: ['man1', 'man3', 'man7'],
+    depfile: 'man.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -195,7 +212,7 @@ endif
 #
 # Full documentation as PDF
 #
-if fop.found() and xsltproc.found()
+if fop.found() and xsltproc_bin.found()
   xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
 
   foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
@@ -206,6 +223,7 @@ if fop.found() and xsltproc.found()
       input: ['stylesheet-fo.xsl', postgres_full_xml],
       output: [postgres_x_fo_f],
       depends: doc_generated,
+      depfile: postgres_x_fo_f + '.d',
       command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
                 '--stringparam', 'paper.type', detail,
                 '-o', '@OUTPUT@', '@INPUT@'],
@@ -230,7 +248,7 @@ endif
 # This was previously implemented using dbtoepub - but that doesn't seem to
 # support running in build != source directory (i.e. VPATH builds already
 # weren't supported).
-if pandoc.found() and xsltproc.found()
+if pandoc.found() and xsltproc_bin.found()
   postgres_epub = custom_target('postgres.epub',
     input: postgres_full_xml,
     output: 'postgres.epub',
diff --git a/doc/src/sgml/xmltools_dep_wrapper b/doc/src/sgml/xmltools_dep_wrapper
new file mode 100644
index 00000000000..52b94e3fcaf
--- /dev/null
+++ b/doc/src/sgml/xmltools_dep_wrapper
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+import argparse
+import re
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(
+    description='generate dependency file for docs')
+
+parser.add_argument('--targetname', type=str, required=False, nargs='+')
+parser.add_argument('--depfile', type=str, required=False)
+parser.add_argument('--tool', type=str, required=True)
+
+parser.add_argument('flags', nargs='*')
+
+args = parser.parse_args()
+
+if args.depfile:
+    depfile_result_list = []
+
+    command = [args.tool, '--load-trace'] + args.flags
+    # --load-trace flag displays all the documents
+    # loaded during the processing to stderr
+    res = subprocess.run(command, stderr=subprocess.PIPE,
+                         universal_newlines=True)
+    # if exit code is different than 0, exit
+    if res.returncode:
+        exit(res.returncode)
+
+    # get line start from targetname
+    line_start = ''
+    for name in args.targetname:
+        line_start = line_start + name + ' '
+    line_start = line_start.strip() + ': '
+
+    # collect only file paths
+    line_re = re.compile('^Loaded URL="([^"]+)"')
+    with open(args.depfile, 'w') as f:
+        for line in res.stderr.split('\n'):
+            if line == '':
+                continue
+            m = re.match(line_re, line)
+
+            # continue to show errors
+            if m is None:
+                print(line, file=sys.stderr)
+                continue
+
+            fname = m.group(1)
+            if fname.startswith('http:'):
+                continue
+            if fname.startswith('file://'):
+                fname = fname.split('file://')[1]
+            f.write(line_start + fname + '\n')
+
+else:
+    command = [args.tool] + args.flags
+    res = subprocess.run(command)
+    exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v15-0013-meson-Remove-non-binary-targets-added-to-bin_tar.patchtext/x-diff; charset=us-asciiDownload
From 0daba6f4cf617d777f27be47861e670eff5b6db4 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 24 Sep 2022 11:01:41 -0700
Subject: [PATCH v15 13/14] meson: Remove non-binary targets added to
 bin_targets.

---
 src/bin/psql/meson.build | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 8ec07260d1b..a4c46bf5385 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -21,7 +21,6 @@ psqlscanslash = custom_target('psqlscanslash',
   command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-Cfe', '-p', '-p'])
 generated_sources += psqlscanslash
 psql_sources += psqlscanslash
-bin_targets += psqlscanslash
 
 sql_help = custom_target('psql_help',
   output: ['sql_help.c', 'sql_help.h'],
@@ -36,7 +35,6 @@ sql_help = custom_target('psql_help',
 )
 generated_sources += sql_help.to_list()
 psql_sources += sql_help
-bin_targets += sql_help
 
 if host_system == 'windows'
   psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
-- 
2.37.3.542.gdd3f6c4cae

v15-0014-meson-wip-headerchecks-cpluspluschecks.patchtext/x-diff; charset=us-asciiDownload
From 8d5e8b15b85ae47f203ce8224414e75dae52437b Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 24 Sep 2022 11:02:21 -0700
Subject: [PATCH v15 14/14] meson: wip: headerchecks cpluspluschecks

---
 src/include/meson.build            | 4 ++--
 src/meson.build                    | 7 +++++++
 src/tools/pginclude/cpluspluscheck | 5 +++--
 src/tools/pginclude/headerscheck   | 4 ++--
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/include/meson.build b/src/include/meson.build
index 28ed9011c70..0f4ac9fdf68 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -42,8 +42,8 @@ config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
 
 var_cc = ' '.join(cc.cmd_array())
 var_cpp = ' '.join(cc.cmd_array() + ['-E'])
-var_cflags = ' '.join(cflags + cflags_warn)
-var_cxxflags = ' '.join(cxxflags + cxxflags_warn)
+var_cflags = ' '.join([cflags, cflags_warn, '-Wall'])
+var_cxxflags = ' '.join([cxxflags, cxxflags_warn, '-Wall'])
 var_cppflags = ' '.join(cppflags)
 var_cflags_sl = '-fPIC' #FIXME
 var_ldflags = ' '.join(ldflags)
diff --git a/src/meson.build b/src/meson.build
index ca99db42baa..1891e11cb26 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -269,3 +269,10 @@ install_data(
 install_data(
   'makefiles/pgxs.mk',
   install_dir: dir_pgxs / 'src' / 'makefiles')
+
+
+run_target('headerscheck',
+  command: [files('tools/pginclude/headerscheck'), '@SOURCE_ROOT@', '@BUILD_ROOT@'])
+
+run_target('cpluspluscheck',
+  command: [files('tools/pginclude/cpluspluscheck'), '@SOURCE_ROOT@', '@BUILD_ROOT@'])
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index b393f2a2eaa..37f3bfcaaf1 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -31,6 +31,7 @@ me=`basename $0`
 
 # These switches are g++ specific, you may override if necessary.
 CXXFLAGS=${CXXFLAGS:- -fsyntax-only -Wall}
+CXXFLAGS="$CXXFLAGS -Wno-register"
 
 # Pull some info from configure's results.
 MGLOB="$builddir/src/Makefile.global"
@@ -166,9 +167,9 @@ do
 	# Some subdirectories need extra -I switches.
 	case "$f" in
 	    src/pl/plperl/*)
-		EXTRAINCLUDES="$perl_includespec" ;;
+		EXTRAINCLUDES="$perl_includespec"; continue; ;;
 	    src/pl/plpython/*)
-		EXTRAINCLUDES="$python_includespec" ;;
+		EXTRAINCLUDES="$python_includespec"; continue; ;;
 	    src/interfaces/ecpg/*)
 		EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;;
 		src/backend/parser/*)
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 2a39856f88c..cc195ccc88f 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -149,9 +149,9 @@ do
 	# Some subdirectories need extra -I switches.
 	case "$f" in
 	    src/pl/plperl/*)
-		EXTRAINCLUDES="$perl_includespec" ;;
+		EXTRAINCLUDES="$perl_includespec"; continue; ;;
 	    src/pl/plpython/*)
-		EXTRAINCLUDES="$python_includespec" ;;
+		EXTRAINCLUDES="$python_includespec"; continue; ;;
 	    src/interfaces/ecpg/*)
 		EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;;
 	    src/backend/parser/*)
-- 
2.37.3.542.gdd3f6c4cae

In reply to: Andres Freund (#338)
Re: [RFC] building postgres with meson - v13

On Thu, Sep 22, 2022 at 2:50 PM Andres Freund <andres@anarazel.de> wrote:

meson:

time meson test
real 0m42.178s
user 7m8.533s
sys 2m17.711s

I find that a more or less comparable test run on my workstation
(which has a Ryzen 9 5950X) takes just over 38 seconds. I think that
the improvement is far more pronounced on that machine compared to a
much older workstation.

One more question about this, that wasn't covered by the Wiki page: is
there some equivalent to "make installcheck" with meson builds?

--
Peter Geoghegan

#344Andres Freund
andres@anarazel.de
In reply to: Peter Geoghegan (#343)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-24 16:56:20 -0700, Peter Geoghegan wrote:

On Thu, Sep 22, 2022 at 2:50 PM Andres Freund <andres@anarazel.de> wrote:

meson:

time meson test
real 0m42.178s
user 7m8.533s
sys 2m17.711s

I find that a more or less comparable test run on my workstation
(which has a Ryzen 9 5950X) takes just over 38 seconds. I think that
the improvement is far more pronounced on that machine compared to a
much older workstation.

Cool!

One more question about this, that wasn't covered by the Wiki page: is
there some equivalent to "make installcheck" with meson builds?

Not yet. Nothing impossible, just not done yet. Partially because installcheck
is so poorly defined (run against an already running server for pg_regress vs
using "system" installed binaries for tap tests).

Greetings,

Andres Freund

In reply to: Andres Freund (#344)
Re: [RFC] building postgres with meson - v13

On Sat, Sep 24, 2022 at 5:13 PM Andres Freund <andres@anarazel.de> wrote:

One more question about this, that wasn't covered by the Wiki page: is
there some equivalent to "make installcheck" with meson builds?

Not yet. Nothing impossible, just not done yet. Partially because installcheck
is so poorly defined (run against an already running server for pg_regress vs
using "system" installed binaries for tap tests).

Got it. I can work around that by just having an old autoconf-based
vpath build directory. I'll need to do this when I run Valgrind.

My workaround would be annoying if I needed to run "installcheck"
anywhere near as frequently as I run "make check-world". But that
isn't the case. meson delivers a significant improvement in the metric
that really matters to me, so I can't really complain.

--
Peter Geoghegan

#346Andres Freund
andres@anarazel.de
In reply to: Peter Geoghegan (#345)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-24 17:33:49 -0700, Peter Geoghegan wrote:

On Sat, Sep 24, 2022 at 5:13 PM Andres Freund <andres@anarazel.de> wrote:

One more question about this, that wasn't covered by the Wiki page: is
there some equivalent to "make installcheck" with meson builds?

Not yet. Nothing impossible, just not done yet. Partially because installcheck
is so poorly defined (run against an already running server for pg_regress vs
using "system" installed binaries for tap tests).

Got it. I can work around that by just having an old autoconf-based
vpath build directory. I'll need to do this when I run Valgrind.

My workaround would be annoying if I needed to run "installcheck"
anywhere near as frequently as I run "make check-world". But that
isn't the case. meson delivers a significant improvement in the metric
that really matters to me, so I can't really complain.

My gut feeling is that we should use this opportunity to split 'installcheck'
into two. "test a running server" and "test installed binaries".

I think the cleanest way to do this with meson would be to utilize meson
tests's "setups".
$ meson test --setup 'running-server'
would run all [selected] tests compatible with running against a running
server. And
$ meson test --setup 'installed'
would test installed binaries.

Greetings,

Andres Freund

#347Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#346)
16 attachment(s)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-25 12:38:06 -0700, Andres Freund wrote:

On 2022-09-24 17:33:49 -0700, Peter Geoghegan wrote:

On Sat, Sep 24, 2022 at 5:13 PM Andres Freund <andres@anarazel.de> wrote:

One more question about this, that wasn't covered by the Wiki page: is
there some equivalent to "make installcheck" with meson builds?

Not yet. Nothing impossible, just not done yet. Partially because installcheck
is so poorly defined (run against an already running server for pg_regress vs
using "system" installed binaries for tap tests).

Got it. I can work around that by just having an old autoconf-based
vpath build directory. I'll need to do this when I run Valgrind.

My workaround would be annoying if I needed to run "installcheck"
anywhere near as frequently as I run "make check-world". But that
isn't the case. meson delivers a significant improvement in the metric
that really matters to me, so I can't really complain.

My gut feeling is that we should use this opportunity to split 'installcheck'
into two. "test a running server" and "test installed binaries".

I think the cleanest way to do this with meson would be to utilize meson
tests's "setups".
$ meson test --setup 'running-server'
would run all [selected] tests compatible with running against a running
server. And
$ meson test --setup 'installed'
would test installed binaries.

I've added support for a 'running' setup in the attached rebased series. A
bunch of preparatory changes were necessary - as it turns out we've introduced
a bunch of role name conflicts between tests.

I had to set it up so that the main regress and isolationtester tests don't
run in parallel with other tests, because they don't pass reliably due to
checking pg_locks etc.

I also found a problem independent of meson [1]/messages/by-id/20220925232237.p6uskba2dw6fnwj2@awork3.anarazel.de / installcheck.

# run all tests that support running against existing server
meson test --setup running

# run just the main pg_regress tests against existing server
meson test --setup running main/regress-running

I've also worked some more on cleaning up other patches in the series,
particularly the precompiled headers one (interesting because it reduces
windows compile times noticably).

Peter, would this address your use case?

I think it'd make sense to add a few toplevel targets to run tests in certain
ways, but I've not done that here.

Greetings,

Andres Freund

[1]: /messages/by-id/20220925232237.p6uskba2dw6fnwj2@awork3.anarazel.de

Attachments:

v16-0001-meson-ci-wip-move-compilerwarnings-task-to-meson.patchtext/x-diff; charset=us-asciiDownload
From 30d9c004dc001790e3df871805b6c9943e948f46 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 20:36:36 -0700
Subject: [PATCH v16 01/16] meson: ci: wip: move compilerwarnings task to meson

---
 .cirrus.yml                            | 92 +++++++++++++-------------
 src/tools/ci/linux-mingw-w64-64bit.txt | 13 ++++
 2 files changed, 59 insertions(+), 46 deletions(-)
 create mode 100644 src/tools/ci/linux-mingw-w64-64bit.txt

diff --git a/.cirrus.yml b/.cirrus.yml
index 7b5cb021027..eb33fdc4855 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -465,6 +465,10 @@ task:
   ccache_cache:
     folder: $CCACHE_DIR
 
+  ccache_stats_start_script:
+    ccache -s
+    ccache -z
+
   setup_additional_packages_script: |
     #apt-get update
     #DEBIAN_FRONTEND=noninteractive apt-get -y install ...
@@ -473,8 +477,6 @@ task:
   # Test that code can be built with gcc/clang without warnings
   ###
 
-  setup_script: echo "COPT=-Werror" > src/Makefile.custom
-
   # Trace probes have a history of getting accidentally broken. Use the
   # different compilers to build with different combinations of dtrace on/off
   # and cassert on/off.
@@ -482,57 +484,58 @@ task:
   # gcc, cassert off, dtrace on
   always:
     gcc_warning_script: |
-      time ./configure \
-        --cache gcc.cache \
-        --enable-dtrace \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      mkdir build && cd build
+      CC="ccache gcc" CXX="ccache g++" \
+        meson setup \
+          -Dwerror=true \
+          -Dcassert=false \
+          -Ddtrace=enabled \
+          ${LINUX_MESON_FEATURES} \
+          ..
+      time ninja -j${BUILD_JOBS}
 
   # gcc, cassert on, dtrace off
   always:
     gcc_a_warning_script: |
-      time ./configure \
-        --cache gcc.cache \
-        --enable-cassert \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      cd build
+      meson configure \
+        -Dcassert=true \
+        -Ddtrace=disabled
+      time ninja -j${BUILD_JOBS}
 
   # clang, cassert off, dtrace off
   always:
     clang_warning_script: |
-      time ./configure \
-        --cache clang.cache \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      rm -rf build
+      mkdir build && cd build
+      CC="ccache clang" CXX="ccache clang++" \
+        meson setup \
+          -Dwerror=true \
+          -Dcassert=false \
+          -Ddtrace=disabled \
+          ${LINUX_MESON_FEATURES} \
+          ..
+      time ninja -j${BUILD_JOBS}
 
   # clang, cassert on, dtrace on
   always:
     clang_a_warning_script: |
-      time ./configure \
-        --cache clang.cache \
-        --enable-cassert \
-        --enable-dtrace \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      cd build
+      meson configure \
+        -Dcassert=true \
+        -Ddtrace=enabled
+      time ninja -j${BUILD_JOBS}
 
   # cross-compile to windows
   always:
     mingw_cross_warning_script: |
-      time ./configure \
-        --host=x86_64-w64-mingw32 \
-        --enable-cassert \
-        CC="ccache x86_64-w64-mingw32-gcc" \
-        CXX="ccache x86_64-w64-mingw32-g++"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      mkdir build-w64 && cd build-w64
+      meson setup \
+        --cross-file=../src/tools/ci/linux-mingw-w64-64bit.txt \
+        -Dwerror=true \
+        -Dcassert=true \
+        ..
+      time ninja -j${BUILD_JOBS}
 
   ###
   # Verify docs can be built
@@ -540,13 +543,8 @@ task:
   # XXX: Only do this if there have been changes in doc/ since last build
   always:
     docs_build_script: |
-      time ./configure \
-        --cache gcc.cache \
-        CC="ccache gcc" \
-        CXX="ccache g++" \
-        CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} -C doc
+      cd build
+      time ninja docs
 
   ###
   # Verify headerscheck / cpluspluscheck succeed
@@ -563,11 +561,13 @@ task:
         ${LINUX_CONFIGURE_FEATURES} \
         --without-icu \
         --quiet \
-        CC="gcc" CXX"=g++" CLANG="clang"
-      make -s -j${BUILD_JOBS} clean
+        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
+      make -s -j${BUILD_JOBS} world-bin
       time make -s headerscheck EXTRAFLAGS='-fmax-errors=10'
     headers_cpluspluscheck_script: |
       time make -s cpluspluscheck EXTRAFLAGS='-fmax-errors=10'
 
   always:
+    ccache_stats_end_script:
+      ccache -s
     upload_caches: ccache
diff --git a/src/tools/ci/linux-mingw-w64-64bit.txt b/src/tools/ci/linux-mingw-w64-64bit.txt
new file mode 100644
index 00000000000..9d43b6dcfbc
--- /dev/null
+++ b/src/tools/ci/linux-mingw-w64-64bit.txt
@@ -0,0 +1,13 @@
+[binaries]
+c = ['ccache', '/usr/bin/x86_64-w64-mingw32-gcc']
+cpp = ['ccache', '/usr/bin/x86_64-w64-mingw32-g++']
+ar = '/usr/bin/x86_64-w64-mingw32-ar'
+strip = '/usr/bin/x86_64-w64-mingw32-strip'
+pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
+windres = '/usr/bin/x86_64-w64-mingw32-windres'
+
+[host_machine]
+system = 'windows'
+cpu_family = 'x86_64'
+cpu = 'x86_64'
+endian = 'little'
-- 
2.37.3.542.gdd3f6c4cae

v16-0002-meson-ci-dontmerge-Add-additional-CI-coverage.patchtext/x-diff; charset=us-asciiDownload
From 24ee6cfac5af51983da53ca8ee720974eba8d5b3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 22:08:00 -0700
Subject: [PATCH v16 02/16] meson: ci: dontmerge: Add additional CI coverage

This is part of the series to be able to test meson on more platforms than
normally part of CI.

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Justin Pryzby <pryzby@telsasoft.com>
---
 .cirrus.yml                                   | 322 +++++++++++++++++-
 src/tools/ci/docker/linux_centos7             |  57 ++++
 src/tools/ci/docker/linux_centos8             |  54 +++
 src/tools/ci/docker/linux_fedora_rawhide      |  49 +++
 src/tools/ci/docker/linux_opensuse_tumbleweed |  56 +++
 5 files changed, 522 insertions(+), 16 deletions(-)
 create mode 100644 src/tools/ci/docker/linux_centos7
 create mode 100644 src/tools/ci/docker/linux_centos8
 create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
 create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed

diff --git a/.cirrus.yml b/.cirrus.yml
index eb33fdc4855..efb2d2c4832 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -126,6 +126,90 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
 
 
+task:
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+  matrix:
+    - name: NetBSD - 9 - Meson
+      only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
+      env:
+        IMAGE_NAME: pg-ci-netbsd-9-postgres
+        PLATFORM: netbsd
+        INCLUDE_DIRS: -Dextra_lib_dirs=/usr/pkg/lib -Dextra_include_dirs=/usr/pkg/include
+
+    - name: OpenBSD - 7 - Meson
+      only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
+      env:
+        IMAGE_NAME: pg-ci-openbsd-7-postgres
+        PLATFORM: openbsd
+        INCLUDE_DIRS: -Dextra_include_dirs=/usr/local/include -Dextra_lib_dirs=/usr/local/lib
+        UUID: -Duuid=e2fs
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/${IMAGE_NAME}
+    platform: ${PLATFORM}
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:users /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:users ${CCACHE_DIR}
+
+  # -Duuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD & openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl ${UUID} \
+        -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \
+        ${INCLUDE_DIRS} \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 # configure feature flags, shared between the task running the linux tests and
 # the CompilerWarnings task
 LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -152,6 +236,22 @@ LINUX_MESON_FEATURES: &LINUX_MESON_FEATURES >-
   -Duuid=e2fs
 
 
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+  sysinfo_script: |
+    id
+    uname -a
+    cat /proc/cmdline
+    ulimit -a -H && ulimit -a -S
+    export
+  create_user_script: |
+    useradd -m -U postgres
+    chown -R postgres:postgres .
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+    su postgres -c "ulimit -l -H && ulimit -l -S"
+
+
 task:
   env:
     CPUS: 4
@@ -181,19 +281,9 @@ task:
   ccache_cache:
     folder: ${CCACHE_DIR}
 
-  sysinfo_script: |
-    id
-    uname -a
-    cat /proc/cmdline
-    ulimit -a -H && ulimit -a -S
-    export
-  create_user_script: |
-    useradd -m postgres
-    chown -R postgres:postgres .
-    mkdir -p ${CCACHE_DIR}
-    chown -R postgres:postgres ${CCACHE_DIR}
+  set_limits_script: |
     echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
-    su postgres -c "ulimit -l -H && ulimit -l -S"
+  <<: *linux_preparation_scripts_template
   setup_core_files_script: |
     mkdir -m 770 /tmp/cores
     chown root:postgres /tmp/cores
@@ -227,7 +317,13 @@ task:
       on_failure:
         <<: *on_failure_ac
 
-    - name: Linux - Debian Bullseye - Meson
+    - matrix:
+        - name: Linux - Debian Bullseye - Meson
+        - name: Linux - Debian Sid - Meson
+          trigger_type: manual
+
+          compute_engine_instance:
+            image: family/pg-ci-sid
 
       configure_script: |
         su postgres <<-EOF
@@ -255,6 +351,81 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
 
 
+task:
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: ${DEBUGINFO}
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: ${DOCKERFILE_PATH}
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+  matrix:
+    - name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+      env:
+        DOCKERFILE_PATH: src/tools/ci/docker/linux_opensuse_tumbleweed
+        DEBUGINFO: "https://debuginfod.opensuse.org/"
+        LLVM: -Dllvm=enabled
+
+    - trigger_type: manual
+      matrix:
+        - name: Linux - Fedora Rawhide - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+            DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+        - name: Linux - Centos 8 - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+            DEBUGINFO: "http://debuginfo.centos.org/"
+
+        - name: Linux - Centos 7 - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+            DEBUGINFO: "http://debuginfo.centos.org/"
+
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl -Duuid=e2fs ${LLVM} \
+        -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 task:
   name: macOS - Monterey - Meson
 
@@ -355,9 +526,7 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
 
 
-task:
-  name: Windows - Server 2019, VS 2019 - Meson & ninja
-
+windows_template: &windows_template
   env:
     # Half the allowed per-user CPU cores
     CPUS: 4
@@ -373,6 +542,20 @@ task:
     # Avoids port conflicts between concurrent tap test runs
     PG_TEST_USE_UNIX_SOCKETS: 1
     PG_REGRESS_SOCK_DIR: "c:/cirrus/"
+    # -m enables parallelism
+    # verbosity:minimal + Summary reduce verbosity, while keeping a summary of
+    #   errors/warnings
+    # ForceNoAlign prevents msbuild from introducing line-breaks for long lines
+    # disable file tracker, we're never going to rebuild, and it slows down the
+    #   build
+    MSBFLAGS: -m -verbosity:minimal "-consoleLoggerParameters:Summary;ForceNoAlign" /p:TrackFileAccess=false -nologo
+
+    # If tests hang forever, cirrus eventually times out. In that case log
+    # output etc is not uploaded, making the problem hard to debug. Of course
+    # tests internally should have shorter timeouts, but that's proven to not
+    # be sufficient. 15min currently is fast enough to finish individual test
+    # "suites".
+    T_C: "\"C:/Program Files/Git/usr/bin/timeout.exe\" -v -k60s 15m"
 
     # startcreate_script starts a postgres instance that we don't want to get
     # killed at the end of that script (it's stopped in stop_script). Can't
@@ -406,6 +589,16 @@ task:
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
 
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+  meson_install_wraps_script: |
+    mkdir subprojects
+    meson wrap install lz4
+    meson wrap install zlib
+
   # Use /DEBUG:FASTLINK to avoid high memory usage during linking
   configure_script: |
     vcvarsall x64
@@ -426,6 +619,103 @@ task:
       type: text/plain
 
 
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+  meson_install_wraps_script: |
+    mkdir subprojects
+    meson wrap install lz4
+    meson wrap install zlib
+
+  configure_script: |
+    vcvarsall x64
+    meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+
+  build_script: |
+    vcvarsall x64
+    msbuild %MSBFLAGS% build\postgresql.sln
+
+  check_world_script: |
+    vcvarsall x64
+    meson test %MTEST_ARGS% --num-processes %TEST_JOBS%
+
+  on_failure:
+    <<: *on_failure_meson
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+      type: text/plain
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Homegrown
+
+  env:
+    # Our windows infrastructure doesn't have test concurrency above the level
+    # of a single vcregress test target. Due to that, it's useful to run prove
+    # with multiple jobs. For the other tasks it isn't, because two sources
+    # (make and prove) of concurrency can overload machines.
+    #
+    # The concrete choice of 10 is based on a small bit of experimentation and
+    # likely can be improved upon further.
+    PROVE_FLAGS: -j10 --timer
+
+  configure_script:
+    # copy errors out when using forward slashes
+    - copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl
+    - vcvarsall x64
+    - perl src/tools/msvc/mkvcbuild.pl
+  build_script:
+    - vcvarsall x64
+    - msbuild %MSBFLAGS% pgsql.sln
+  tempinstall_script:
+    # Installation on windows currently only completely works from src/tools/msvc
+    - cd src/tools/msvc && perl install.pl %CIRRUS_WORKING_DIR%/tmp_install
+
+  test_regress_parallel_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl check parallel
+  startcreate_script: |
+    rem paths to binaries need backslashes
+    tmp_install\bin\pg_ctl.exe initdb -D tmp_check/db -l tmp_check/initdb.log --options=--no-sync
+    echo include '%TEMP_CONFIG%' >> tmp_check/db/postgresql.conf
+    tmp_install\bin\pg_ctl.exe start -D tmp_check/db -l tmp_check/postmaster.log
+
+  test_pl_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl plcheck
+  test_isolation_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl isolationcheck
+  test_modules_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl modulescheck
+  test_contrib_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl contribcheck
+  stop_script: |
+    tmp_install\bin\pg_ctl.exe stop -D tmp_check/db -l tmp_check/postmaster.log
+  test_ssl_script: |
+    set with_ssl=openssl
+    %T_C% perl src/tools/msvc/vcregress.pl taptest ./src/test/ssl/
+  test_subscription_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl taptest ./src/test/subscription/
+  test_authentication_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl taptest ./src/test/authentication/
+  test_recovery_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl recoverycheck
+  test_bin_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl bincheck
+  test_ecpg_script: |
+    rem tries to build additional stuff
+    vcvarsall x64
+    rem References ecpg_regression.proj in the current dir
+    cd src/tools/msvc
+    %T_C% perl vcregress.pl ecpgcheck
+
+  on_failure:
+    <<: *on_failure_ac
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+      type: text/plain
+
+
 task:
   name: CompilerWarnings
 
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+  yum -y install dnf-plugins-core \
+  epel-release \
+  centos-release-scl-rh && \
+  \
+  yum -y update && \
+  yum -y install \
+  \
+  git \
+  perl \
+  perl-ExtUtils-Embed \
+  perl-IPC-Run \
+  perl-Test-Harness \
+  perl-Test-Simple \
+  \
+  bison \
+  ccache \
+  clang \
+  devtoolset-7-make \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  && \
+  pip3 install meson && \
+  pip3 install ninja && \
+  yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+  dnf -y install dnf-plugins-core && \
+  dnf config-manager --set-enabled powertools && \
+  dnf -y install epel-release && \
+  dnf -y update && \
+  dnf -y install \
+  \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  diffutils \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  glibc-langpack-en \
+  \
+  && \
+  pip3 install ninja && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+  dnf -y update && \
+  dnf -y install \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gettext \
+  ninja-build \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  langpacks-en \
+  glibc-langpack-en \
+  \
+  && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+  zypper -n clean -a && \
+  zypper -n ref && \
+  zypper -n dup && \
+  zypper -n update && \
+  zypper -n install \
+  diffutils \
+  git \
+  icu \
+  make \
+  meson \
+  perl-IPC-Run \
+  shadow \
+  systemd-devel \
+  util-linux \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gcc-c++ \
+  gettext-runtime \
+  ninja \
+  \
+  krb5-devel \
+  libicu-devel \
+  libldapcpp-devel \
+  liblz4-devel \
+  libopenssl-devel \
+  libselinux-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  pam-devel \
+  python38-devel \
+  readline-devel \
+  tcl-devel \
+  \
+  openldap2 \
+  openldap2-client \
+  \
+  krb5-client \
+  krb5-plugin-kdb-ldap \
+  krb5-server \
+  lz4 \
+  zstd \
+  \
+  && \
+  zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
-- 
2.37.3.542.gdd3f6c4cae

v16-0003-meson-prereq-win-remove-date-from-version-number.patchtext/x-diff; charset=us-asciiDownload
From 3f3442a76e2b628f7d2feec6419dded7a84bebf7 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 14 Sep 2022 16:43:47 -0700
Subject: [PATCH v16 03/16] meson: prereq: win: remove date from version number
 in win32ver.rc

This may have served a purpose at some point, but these days it just
contributes to a non-reproducible build.

Discussion: https://postgr.es/m/1cef5b48-32bd-5cbf-fb62-fb648860f5ef@enterprisedb.com
---
 src/makefiles/Makefile.win32 | 1 -
 src/tools/msvc/Project.pm    | 5 -----
 2 files changed, 6 deletions(-)

diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32
index 17d68196442..d268b3ebafd 100644
--- a/src/makefiles/Makefile.win32
+++ b/src/makefiles/Makefile.win32
@@ -69,7 +69,6 @@ win32ver.rc: $(top_srcdir)/src/port/win32ver.rc
 	sed -e 's;FILEDESC;$(PGFILEDESC);' \
 	    -e 's;VFT_APP;$(PGFTYPE);' \
 	    -e 's;_ICO_;$(PGICOSTR);' \
-	    -e 's;\(VERSION.*\),0 *$$;\1,'`date '+%y%j' | sed 's/^0*//'`';' \
 	    -e '/_INTERNAL_NAME_/$(if $(shlib),s;_INTERNAL_NAME_;"$(basename $(shlib))";,d)' \
 	    -e '/_ORIGINAL_NAME_/$(if $(shlib),s;_ORIGINAL_NAME_;"$(shlib)";,d)' \
 	  $< >$@
diff --git a/src/tools/msvc/Project.pm b/src/tools/msvc/Project.pm
index b24a2a98155..ec449c864c1 100644
--- a/src/tools/msvc/Project.pm
+++ b/src/tools/msvc/Project.pm
@@ -367,10 +367,6 @@ sub AddResourceFile
 {
 	my ($self, $dir, $desc, $ico) = @_;
 
-	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
-	  localtime(time);
-	my $d = sprintf("%02d%03d", ($year - 100), $yday);
-
 	if (Solution::IsNewer("$dir/win32ver.rc", 'src/port/win32ver.rc'))
 	{
 		print "Generating win32ver.rc for $dir\n";
@@ -383,7 +379,6 @@ sub AddResourceFile
 		{
 			s/FILEDESC/"$desc"/gm;
 			s/_ICO_/$icostr/gm;
-			s/(VERSION.*),0/$1,$d/;
 			if ($self->{type} eq "dll")
 			{
 				s/VFT_APP/VFT_DLL/gm;
-- 
2.37.3.542.gdd3f6c4cae

v16-0004-meson-Add-windows-resource-files.patchtext/x-diff; charset=us-asciiDownload
From 3eb0ca196084da314d94d1e51c7b775012a4773c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 11:03:07 -0700
Subject: [PATCH v16 04/16] meson: Add windows resource files

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
---
 src/backend/jit/llvm/meson.build              |   6 +
 .../replication/libpqwalreceiver/meson.build  |   6 +
 src/backend/replication/pgoutput/meson.build  |   6 +
 src/backend/snowball/meson.build              |   6 +
 .../utils/mb/conversion_procs/meson.build     | 144 ++++++++++++++----
 src/bin/initdb/meson.build                    |   6 +
 src/bin/pg_amcheck/meson.build                |   8 +-
 src/bin/pg_archivecleanup/meson.build         |  12 +-
 src/bin/pg_basebackup/meson.build             |  38 ++++-
 src/bin/pg_checksums/meson.build              |  12 +-
 src/bin/pg_config/meson.build                 |  12 +-
 src/bin/pg_controldata/meson.build            |  12 +-
 src/bin/pg_ctl/meson.build                    |  12 +-
 src/bin/pg_dump/meson.build                   |  18 +++
 src/bin/pg_resetwal/meson.build               |  12 +-
 src/bin/pg_rewind/meson.build                 |   6 +
 src/bin/pg_test_fsync/meson.build             |  10 +-
 src/bin/pg_test_timing/meson.build            |  12 +-
 src/bin/pg_upgrade/meson.build                |   6 +
 src/bin/pg_verifybackup/meson.build           |   6 +
 src/bin/pg_waldump/meson.build                |   6 +
 src/bin/pgbench/meson.build                   |   6 +
 src/bin/pgevent/meson.build                   |   6 +
 src/bin/psql/meson.build                      |   6 +
 src/bin/scripts/meson.build                   |  10 +-
 src/interfaces/libpq/meson.build              |   5 +
 src/interfaces/libpq/test/meson.build         |  25 ++-
 src/pl/plperl/meson.build                     |   7 +
 src/pl/plpgsql/src/meson.build                |   6 +
 src/pl/plpython/meson.build                   |   6 +
 src/pl/tcl/meson.build                        |   6 +
 contrib/adminpack/meson.build                 |  12 +-
 contrib/amcheck/meson.build                   |  17 ++-
 contrib/auth_delay/meson.build                |  12 +-
 contrib/auto_explain/meson.build              |  12 +-
 contrib/basebackup_to_shell/meson.build       |   6 +
 contrib/basic_archive/meson.build             |   6 +
 contrib/bloom/meson.build                     |   6 +
 contrib/bool_plperl/meson.build               |   6 +
 contrib/btree_gin/meson.build                 |  12 +-
 contrib/btree_gist/meson.build                |   6 +
 contrib/citext/meson.build                    |   6 +
 contrib/cube/meson.build                      |   6 +
 contrib/dblink/meson.build                    |   6 +
 contrib/dict_int/meson.build                  |  12 +-
 contrib/dict_xsyn/meson.build                 |  12 +-
 contrib/earthdistance/meson.build             |  12 +-
 contrib/file_fdw/meson.build                  |  12 +-
 contrib/fuzzystrmatch/meson.build             |  16 +-
 contrib/hstore/meson.build                    |  24 ++-
 contrib/hstore_plperl/meson.build             |   6 +
 contrib/hstore_plpython/meson.build           |   6 +
 contrib/intarray/meson.build                  |   6 +
 contrib/isn/meson.build                       |   6 +
 contrib/jsonb_plperl/meson.build              |   6 +
 contrib/jsonb_plpython/meson.build            |   6 +
 contrib/lo/meson.build                        |   6 +
 contrib/ltree/meson.build                     |   6 +
 contrib/ltree_plpython/meson.build            |   6 +
 contrib/oid2name/meson.build                  |  12 +-
 contrib/old_snapshot/meson.build              |   6 +
 contrib/pageinspect/meson.build               |   6 +
 contrib/passwordcheck/meson.build             |   6 +
 contrib/pg_buffercache/meson.build            |  14 +-
 contrib/pg_freespacemap/meson.build           |  14 +-
 contrib/pg_prewarm/meson.build                |  16 +-
 contrib/pg_stat_statements/meson.build        |  12 +-
 contrib/pg_surgery/meson.build                |  14 +-
 contrib/pg_trgm/meson.build                   |  20 ++-
 contrib/pg_visibility/meson.build             |  14 +-
 contrib/pg_walinspect/meson.build             |   6 +
 contrib/pgcrypto/meson.build                  |   6 +
 contrib/pgrowlocks/meson.build                |  14 +-
 contrib/pgstattuple/meson.build               |  18 ++-
 contrib/postgres_fdw/meson.build              |   6 +
 contrib/seg/meson.build                       |   6 +
 contrib/sepgsql/meson.build                   |   6 +
 contrib/spi/meson.build                       |  48 +++++-
 contrib/sslinfo/meson.build                   |  14 +-
 contrib/tablefunc/meson.build                 |  14 +-
 contrib/tcn/meson.build                       |  14 +-
 contrib/test_decoding/meson.build             |   6 +
 contrib/tsm_system_rows/meson.build           |  14 +-
 contrib/tsm_system_time/meson.build           |  14 +-
 contrib/unaccent/meson.build                  |  14 +-
 contrib/uuid-ossp/meson.build                 |  14 +-
 contrib/vacuumlo/meson.build                  |  12 +-
 contrib/xml2/meson.build                      |  16 +-
 src/interfaces/ecpg/compatlib/meson.build     |   6 +-
 src/interfaces/ecpg/preproc/meson.build       |   6 +
 src/interfaces/ecpg/test/meson.build          |   6 +
 src/test/isolation/meson.build                |  13 ++
 src/test/modules/delay_execution/meson.build  |  13 +-
 src/test/modules/dummy_index_am/meson.build   |  13 +-
 src/test/modules/dummy_seclabel/meson.build   |  13 +-
 src/test/modules/libpq_pipeline/meson.build   |  14 +-
 src/test/modules/plsample/meson.build         |  13 +-
 src/test/modules/spgist_name_ops/meson.build  |  13 +-
 .../ssl_passphrase_callback/meson.build       |  13 +-
 src/test/modules/test_bloomfilter/meson.build |  13 +-
 src/test/modules/test_ddl_deparse/meson.build |  13 +-
 .../modules/test_ginpostinglist/meson.build   |  13 +-
 src/test/modules/test_integerset/meson.build  |  13 +-
 src/test/modules/test_lfind/meson.build       |  13 +-
 src/test/modules/test_oat_hooks/meson.build   |  13 +-
 src/test/modules/test_parser/meson.build      |  13 +-
 src/test/modules/test_predtest/meson.build    |  13 +-
 src/test/modules/test_rbtree/meson.build      |  13 +-
 src/test/modules/test_regex/meson.build       |  13 +-
 src/test/modules/test_rls_hooks/meson.build   |  13 +-
 src/test/modules/test_shm_mq/meson.build      |  19 ++-
 src/test/modules/worker_spi/meson.build       |  15 +-
 src/test/regress/meson.build                  |   6 +
 meson.build                                   |  61 ++++++++
 src/timezone/meson.build                      |   6 +
 src/tools/rcgen                               |  99 ++++++++++++
 116 files changed, 1383 insertions(+), 159 deletions(-)
 create mode 100755 src/tools/rcgen

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..5fb63768358 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -20,6 +20,12 @@ llvmjit_sources += files(
   'llvmjit_expr.c',
 )
 
+if host_system == 'windows'
+  llvmjit_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'llvmjit',
+    '--FILEDESC', 'llvmjit - JIT using LLVM',])
+endif
+
 llvmjit = shared_module('llvmjit',
   llvmjit_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
index 3fc786c80a0..4c653a05d36 100644
--- a/src/backend/replication/libpqwalreceiver/meson.build
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -2,6 +2,12 @@ libpqwalreceiver_sources = files(
   'libpqwalreceiver.c',
 )
 
+if host_system == 'windows'
+  libpqwalreceiver_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pqwalreceiver',
+    '--FILEDESC', 'libpqwalreceiver - receive WAL during streaming replication',])
+endif
+
 libpqwalreceiver = shared_module('pqwalreceiver',
   libpqwalreceiver_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
index ab956361a62..5df27d7b764 100644
--- a/src/backend/replication/pgoutput/meson.build
+++ b/src/backend/replication/pgoutput/meson.build
@@ -2,6 +2,12 @@ pgoutput_sources = files(
   'pgoutput.c',
 )
 
+if host_system == 'windows'
+  pgoutput_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgoutput',
+    '--FILEDESC', 'pgoutput - standard logical replication output plugin',])
+endif
+
 pgoutput = shared_module('pgoutput',
   pgoutput_sources,
   kwargs: pg_mod_args,
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 8c6f685cb32..974401d187e 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -58,6 +58,12 @@ dict_snowball_sources += files(
 # see comment in src/include/snowball/header.h
 stemmer_inc = include_directories('../../include/snowball')
 
+if host_system == 'windows'
+  dict_snowball_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_snowball',
+    '--FILEDESC', 'snowball - natural language stemmers',])
+endif
+
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
index 1bc971d1945..00e721a2453 100644
--- a/src/backend/utils/mb/conversion_procs/meson.build
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -1,36 +1,122 @@
 encodings = {
-  'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
-  'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
-  'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
-  'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
-  'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
-  'euc_tw_and_big5': [
-    'euc_tw_and_big5/euc_tw_and_big5.c',
-    'euc_tw_and_big5/big5.c',
-  ],
-  'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
-  'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
-  'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
-  'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
-  'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
-  'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
-  'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
-  'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
-  'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
-  'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
-  'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
-  'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
-  'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
-  'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
-  'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
-  'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
-  'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
-  'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+  'cyrillic_and_mic': {
+    'sources': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+    'description': 'cyrillic <-> mic text conversions',
+  },
+  'euc2004_sjis2004': {
+    'sources': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+    'description': 'euc2004 <-> sjis2004 text conversions',
+  },
+  'euc_cn_and_mic': {
+    'sources': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+    'description': 'euc_cn <-> mic text conversions',
+  },
+  'euc_jp_and_sjis': {
+    'sources': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+    'description': 'euc_jp <-> sjis text conversions',
+  },
+  'euc_kr_and_mic': {
+    'sources': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+    'description': 'euc_kr <-> mic text conversions',
+  },
+  'euc_tw_and_big5': {
+    'sources': [
+      'euc_tw_and_big5/euc_tw_and_big5.c',
+      'euc_tw_and_big5/big5.c',
+    ],
+    'description': 'euc_tw <-> big5 text conversions',
+  },
+  'latin2_and_win1250': {
+    'sources': ['latin2_and_win1250/latin2_and_win1250.c'],
+    'description': 'latin2 <-> win1250 text conversions',
+  },
+  'latin_and_mic': {
+    'sources': ['latin_and_mic/latin_and_mic.c'],
+    'description': 'latin <-> mic text conversions',
+  },
+  'utf8_and_big5': {
+    'sources': ['utf8_and_big5/utf8_and_big5.c'],
+    'description': 'utf8 <-> big5 text conversions',
+  },
+  'utf8_and_cyrillic': {
+    'sources': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+    'description': 'utf8 <-> cyrillic text conversions',
+  },
+  'utf8_and_euc2004': {
+    'sources': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+    'description': 'utf8 <-> euc2004 text conversions',
+  },
+  'utf8_and_euc_cn': {
+    'sources': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+    'description': 'utf8 <-> euc_cn text conversions',
+  },
+  'utf8_and_euc_jp': {
+    'sources': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+    'description': 'utf8 <-> euc_jp text conversions',
+  },
+  'utf8_and_euc_kr': {
+    'sources': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+    'description': 'utf8 <-> euc_kr text conversions',
+  },
+  'utf8_and_euc_tw': {
+    'sources': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+    'description': 'utf8 <-> euc_tw text conversions',
+  },
+  'utf8_and_gb18030': {
+    'sources': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+    'description': 'utf8 <-> gb18030 text conversions',
+  },
+  'utf8_and_gbk': {
+    'sources': ['utf8_and_gbk/utf8_and_gbk.c'],
+    'description': 'utf8 <-> gbk text conversions',
+  },
+  'utf8_and_iso8859': {
+    'sources': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+    'description': 'utf8 <-> iso8859 text conversions',
+  },
+  'utf8_and_iso8859_1': {
+    'sources': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+    'description': 'utf8 <-> iso8859_1 text conversions',
+  },
+  'utf8_and_johab': {
+    'sources': ['utf8_and_johab/utf8_and_johab.c'],
+    'description': 'utf8 <-> johab text conversions',
+  },
+  'utf8_and_sjis': {
+    'sources': ['utf8_and_sjis/utf8_and_sjis.c'],
+    'description': 'utf8 <-> sjis text conversions',
+  },
+  'utf8_and_sjis2004': {
+    'sources': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+    'description': 'utf8 <-> sjis2004 text conversions',
+  },
+  'utf8_and_uhc': {
+    'sources': ['utf8_and_uhc/utf8_and_uhc.c'],
+    'description': 'utf8 <-> uhc text conversions',
+  },
+  'utf8_and_win': {
+    'sources': ['utf8_and_win/utf8_and_win.c'],
+    'description': 'utf8 <-> win text conversions',
+  },
 }
 
-foreach encoding, sources : encodings
+foreach encoding, values: encodings
+  sources = values['sources']
+  description = values['description']
+
+  source_files = files()
+  foreach source: sources
+    source_files += files(source)
+  endforeach
+
+  if host_system == 'windows'
+    source_files += rc_lib_gen.process(win32ver_rc, extra_args: [
+      '--NAME', encoding,
+      '--FILEDESC', description,])
+  endif
+
   backend_targets += shared_module(encoding,
-    sources,
+    source_files,
     kwargs: pg_mod_args,
   )
 endforeach
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 9f213274d2f..6ced9a31b80 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -7,6 +7,12 @@ initdb_sources += timezone_localtime_source
 
 #fixme: reimplement libpq_pgport logic
 
+if host_system == 'windows'
+  initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'initdb',
+    '--FILEDESC', 'initdb - initialize a new database cluster',])
+endif
+
 initdb = executable('initdb',
   initdb_sources,
   include_directories: [timezone_inc],
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
index 8e197eba5f3..25f5e7a0948 100644
--- a/src/bin/pg_amcheck/meson.build
+++ b/src/bin/pg_amcheck/meson.build
@@ -1,7 +1,13 @@
 pg_amcheck_sources = files(
-  'pg_amcheck.c'
+  'pg_amcheck.c',
 )
 
+if host_system == 'windows'
+  pg_amcheck_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_amcheck',
+    '--FILEDESC', 'pg_amcheck - detect corruption within database relations',])
+endif
+
 pg_amcheck = executable('pg_amcheck',
   pg_amcheck_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
index 87a0d980c4f..aaa2e76977f 100644
--- a/src/bin/pg_archivecleanup/meson.build
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -1,5 +1,15 @@
+pg_archivecleanup_sources = files(
+  'pg_archivecleanup.c',
+)
+
+if host_system == 'windows'
+  pg_archivecleanup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_archivecleanup',
+    '--FILEDESC', 'pg_archivecleanup - cleans archive when used with streaming replication',])
+endif
+
 pg_archivecleanup = executable('pg_archivecleanup',
-  ['pg_archivecleanup.c'],
+  pg_archivecleanup_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index d26fed9cd8a..2c934e0c26e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -17,24 +17,56 @@ pg_basebackup_common = static_library('libpg_basebackup_common',
   kwargs: internal_lib_args,
 )
 
-pg_basebackup = executable('pg_basebackup',
+pg_basebackup_sources = files(
   'pg_basebackup.c',
+)
+
+if host_system == 'windows'
+  pg_basebackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_basebackup',
+    '--FILEDESC', 'pg_basebackup - streaming WAL and backup receivers',])
+endif
+
+pg_basebackup = executable('pg_basebackup',
+  pg_basebackup_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_basebackup
 
-pg_receivewal = executable('pg_receivewal',
+
+pg_receivewal_sources = files(
   'pg_receivewal.c',
+)
+
+if host_system == 'windows'
+  pg_receivewal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_receivewal',
+    '--FILEDESC', 'pg_receivewal - streaming WAL and backup receivers',])
+endif
+
+pg_receivewal = executable('pg_receivewal',
+  pg_receivewal_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_receivewal
 
-pg_recvlogical = executable('pg_recvlogical',
+
+pg_recvlogical_sources = files(
   'pg_recvlogical.c',
+)
+
+if host_system == 'windows'
+  pg_recvlogical_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_recvlogical',
+    '--FILEDESC', 'pg_recvlogical - streaming WAL and backup receivers',])
+endif
+
+pg_recvlogical = executable('pg_recvlogical',
+  pg_recvlogical_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
index ee1f367bac3..d07ebc999b3 100644
--- a/src/bin/pg_checksums/meson.build
+++ b/src/bin/pg_checksums/meson.build
@@ -1,5 +1,15 @@
+pg_checksums_sources = files(
+  'pg_checksums.c',
+)
+
+if host_system == 'windows'
+  pg_checksums_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_checksums',
+    '--FILEDESC', 'pg_checksums - verify data checksums in an offline cluster',])
+endif
+
 pg_checksums = executable('pg_checksums',
-  ['pg_checksums.c'],
+  pg_checksums_sources,
   include_directories: [timezone_inc],
   dependencies: [frontend_code],
   kwargs: default_bin_args,
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
index 0ecbf2f9d28..4be2fdc84ae 100644
--- a/src/bin/pg_config/meson.build
+++ b/src/bin/pg_config/meson.build
@@ -1,5 +1,15 @@
+pg_config_sources = files(
+  'pg_config.c',
+)
+
+if host_system == 'windows'
+  pg_config_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_config',
+    '--FILEDESC', 'pg_config - report configuration information',])
+endif
+
 pg_config = executable('pg_config',
-  ['pg_config.c'],
+  pg_config_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
index 557e672beb7..7fc239dbe65 100644
--- a/src/bin/pg_controldata/meson.build
+++ b/src/bin/pg_controldata/meson.build
@@ -1,5 +1,15 @@
+pg_controldata_sources = files(
+  'pg_controldata.c',
+)
+
+if host_system == 'windows'
+  pg_controldata_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_controldata',
+    '--FILEDESC', 'pg_controldata - reads the data from pg_control',])
+endif
+
 pg_controldata = executable('pg_controldata',
-  ['pg_controldata.c'],
+  pg_controldata_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
index 6812e73e329..96f962fa762 100644
--- a/src/bin/pg_ctl/meson.build
+++ b/src/bin/pg_ctl/meson.build
@@ -1,5 +1,15 @@
+pg_ctl_sources = files(
+  'pg_ctl.c',
+)
+
+if host_system == 'windows'
+  pg_ctl_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_ctl',
+    '--FILEDESC', 'pg_ctl - starts/stops/restarts the PostgreSQL server',])
+endif
+
 pg_ctl = executable('pg_ctl',
-  ['pg_ctl.c'],
+  pg_ctl_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 785ec094dbd..3527a25c288 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -24,6 +24,12 @@ pg_dump_sources = files(
   'pg_dump_sort.c',
 )
 
+if host_system == 'windows'
+  pg_dump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dump',
+    '--FILEDESC', 'pg_dump - backup one PostgreSQL database',])
+endif
+
 pg_dump = executable('pg_dump',
   pg_dump_sources,
   link_with: [pg_dump_common],
@@ -37,6 +43,12 @@ pg_dumpall_sources = files(
   'pg_dumpall.c',
 )
 
+if host_system == 'windows'
+  pg_dumpall_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dumpall',
+    '--FILEDESC', 'pg_dumpall - backup PostgreSQL databases'])
+endif
+
 pg_dumpall = executable('pg_dumpall',
   pg_dumpall_sources,
   link_with: [pg_dump_common],
@@ -50,6 +62,12 @@ pg_restore_sources = files(
   'pg_restore.c',
 )
 
+if host_system == 'windows'
+  pg_restore_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_restore',
+    '--FILEDESC', 'pg_restore - restore PostgreSQL databases'])
+endif
+
 pg_restore = executable('pg_restore',
   pg_restore_sources,
   link_with: [pg_dump_common],
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
index 7c5de134ac0..d503db97b71 100644
--- a/src/bin/pg_resetwal/meson.build
+++ b/src/bin/pg_resetwal/meson.build
@@ -1,5 +1,15 @@
+pg_resetwal_sources = files(
+  'pg_resetwal.c',
+)
+
+if host_system == 'windows'
+  pg_resetwal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_resetwal',
+    '--FILEDESC', 'pg_resetwal - reset PostgreSQL WAL log'])
+endif
+
 pg_resetwal = executable('pg_resetwal',
-  files('pg_resetwal.c'),
+  pg_resetwal_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index d8ec9e482d5..6cd970909a2 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -11,6 +11,12 @@ pg_rewind_sources = files(
 
 pg_rewind_sources += xlogreader_sources
 
+if host_system == 'windows'
+  pg_rewind_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_rewind',
+    '--FILEDESC', 'pg_rewind - synchronize a data directory with another one forked from'])
+endif
+
 pg_rewind = executable('pg_rewind',
   pg_rewind_sources,
   dependencies: [frontend_code, libpq, lz4, zstd],
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index 2c01831e11f..31d288ba6da 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -1,4 +1,12 @@
-test_fsync_sources = files('pg_test_fsync.c')
+test_fsync_sources = files(
+  'pg_test_fsync.c',
+)
+
+if host_system == 'windows'
+  test_fsync_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_fsync',
+    '--FILEDESC', 'pg_test_fsync - test various disk sync methods'])
+endif
 
 pg_test_fsync = executable('pg_test_fsync',
   test_fsync_sources,
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
index 0a3068f1657..0aed03ea32f 100644
--- a/src/bin/pg_test_timing/meson.build
+++ b/src/bin/pg_test_timing/meson.build
@@ -1,5 +1,15 @@
+pg_test_timing_sources = files(
+  'pg_test_timing.c'
+)
+
+if host_system == 'windows'
+  pg_test_timing_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_timing',
+    '--FILEDESC', 'pg_test_timing - test timing overhead'])
+endif
+
 pg_test_timing = executable('pg_test_timing',
-  ['pg_test_timing.c'],
+  pg_test_timing_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 02f030e0ccf..a7b927a45c7 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -16,6 +16,12 @@ pg_upgrade_sources = files(
   'version.c',
 )
 
+if host_system == 'windows'
+  pg_upgrade_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_upgrade',
+    '--FILEDESC', 'pg_upgrade - an in-place binary upgrade utility'])
+endif
+
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
index 4c3b2bb5f97..b934a408443 100644
--- a/src/bin/pg_verifybackup/meson.build
+++ b/src/bin/pg_verifybackup/meson.build
@@ -3,6 +3,12 @@ pg_verifybackup_sources = files(
   'pg_verifybackup.c'
 )
 
+if host_system == 'windows'
+  pg_verifybackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_verifybackup',
+    '--FILEDESC', 'pg_verifybackup - verify a backup against using a backup manifest'])
+endif
+
 pg_verifybackup = executable('pg_verifybackup',
   pg_verifybackup_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index 95872652ffd..9605976870d 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -8,6 +8,12 @@ pg_waldump_sources += rmgr_desc_sources
 pg_waldump_sources += xlogreader_sources
 pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
 
+if host_system == 'windows'
+  pg_waldump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_waldump',
+    '--FILEDESC', 'pg_waldump - decode and display WA'])
+endif
+
 pg_waldump = executable('pg_waldump',
   pg_waldump_sources,
   dependencies: [frontend_code, lz4, zstd],
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index 6564e54029c..a32eb51fe07 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -17,6 +17,12 @@ exprparse = custom_target('exprparse',
 generated_sources += exprparse.to_list()
 pgbench_sources += exprparse
 
+if host_system == 'windows'
+  pgbench_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgbench',
+    '--FILEDESC', 'pgbench - a simple program for running benchmark tests'])
+endif
+
 pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
index 7a468879fd2..2e9aea4b0e1 100644
--- a/src/bin/pgevent/meson.build
+++ b/src/bin/pgevent/meson.build
@@ -6,6 +6,12 @@ pgevent_sources = files(
   'pgevent.c',
 )
 
+pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+  '--NAME', 'pgevent',
+  '--FILEDESC', 'Eventlog message formatter',])
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
 # FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
 pgevent_link_args = []
 if cc.get_id() == 'msvc'
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 410788e4767..1264fc19fbd 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -36,6 +36,12 @@ sql_help = custom_target('psql_help',
 generated_sources += sql_help.to_list()
 psql_sources += sql_help
 
+if host_system == 'windows'
+  psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'psql',
+    '--FILEDESC', 'psql - the PostgreSQL interactive terminal',])
+endif
+
 psql = executable('psql',
   psql_sources,
   include_directories: include_directories('.'),
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index eaf250c7f73..837562c24e5 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -16,8 +16,16 @@ binaries = [
 ]
 
 foreach binary : binaries
+  binary_sources = files('@0@.c'.format(binary))
+
+  if host_system == 'windows'
+    binary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+      '--NAME', binary,
+      '--FILEDESC', '@0@ - PostgreSQL utility'.format(binary),])
+  endif
+
   binary = executable(binary,
-    files(binary + '.c'),
+    binary_sources,
     link_with: [scripts_common],
     dependencies: [frontend_code, libpq],
     kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bc047e00d62..2c9edeaa088 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -16,9 +16,13 @@ libpq_sources = files(
   'libpq-events.c',
   'pqexpbuffer.c',
 )
+libpq_so_sources = [] # only for shared lib, in addition to above
 
 if host_system == 'windows'
   libpq_sources += files('pthread-win32.c', 'win32.c')
+  libpq_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq',
+    '--FILEDESC', 'PostgreSQL Access Library',])
 endif
 
 if ssl.found()
@@ -52,6 +56,7 @@ libpq_st = static_library('libpq',
 # not using both_libraries here, causes problems with precompiled headers and
 # resource files with msbuild
 libpq_so = shared_library('libpq',
+  libpq_so_sources,
   dependencies: libpq_deps,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
index 16f94c1ed8b..017f729d435 100644
--- a/src/interfaces/libpq/test/meson.build
+++ b/src/interfaces/libpq/test/meson.build
@@ -1,13 +1,34 @@
+libpq_uri_regress_sources = files(
+  'libpq_uri_regress.c',
+)
+
+if host_system == 'windows'
+  libpq_uri_regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_uri_regress',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_uri_regress',
-  files('libpq_uri_regress.c'),
+  libpq_uri_regress_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
   }
 )
 
+
+libpq_testclient_sources = files(
+  'libpq_testclient.c',
+)
+
+if host_system == 'windows'
+  libpq_testclient_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_testclient',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_testclient',
-  files('libpq_testclient.c'),
+  libpq_testclient_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 73b733dd50b..535660085dd 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -36,6 +36,13 @@ foreach n : ['SPI', 'Util']
 endforeach
 
 plperl_inc = include_directories('.')
+
+if host_system == 'windows'
+  plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plperl',
+    '--FILEDESC', 'PL/Perl - procedural language',])
+endif
+
 plperl = shared_module('plperl',
   plperl_sources,
   include_directories: [plperl_inc, postgres_inc],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index dd499fdd151..c46c0a1da2a 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -40,6 +40,12 @@ pl_unreserved = custom_target('pl_unreserved_kwlist',
 generated_sources += pl_unreserved
 plpgsql_sources += pl_unreserved
 
+if host_system == 'windows'
+  plpgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpgsql',
+    '--FILEDESC', 'PL/pgSQL - procedural language',])
+endif
+
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
   include_directories: include_directories('.'),
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 366b3b171ac..40888386b5f 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -28,6 +28,12 @@ plpython_sources += custom_target('spiexceptions.h',
 # FIXME: need to duplicate import library ugliness?
 plpython_inc = include_directories('.')
 
+if host_system == 'windows'
+  plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpython3',
+    '--FILEDESC', 'PL/Python - procedural language',])
+endif
+
 plpython = shared_module('plpython3',
   plpython_sources,
   include_directories: [plpython_inc, postgres_inc],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index 9b6addd7fd5..f09bb14c950 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -14,6 +14,12 @@ pltcl_sources += custom_target('pltclerrcodes.h',
   command: [perl, gen_pltclerrcodes, '@INPUT@']
 )
 
+if host_system == 'windows'
+  pltcl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pltcl',
+    '--FILEDESC', 'PL/Tcl - procedural language',])
+endif
+
 pltcl = shared_module('pltcl',
   pltcl_sources,
   include_directories: [include_directories('.'), postgres_inc],
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
index fc2368d02cf..7efec0efbc0 100644
--- a/contrib/adminpack/meson.build
+++ b/contrib/adminpack/meson.build
@@ -1,5 +1,15 @@
+adminpack_sources = files(
+  'adminpack.c',
+)
+
+if host_system == 'windows'
+  adminpack_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'adminpack',
+    '--FILEDESC', 'adminpack - support functions for pgAdmin',])
+endif
+
 adminpack = shared_module('adminpack',
-  ['adminpack.c'],
+  adminpack_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += adminpack
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
index 1db3d20349e..fa807b72d98 100644
--- a/contrib/amcheck/meson.build
+++ b/contrib/amcheck/meson.build
@@ -1,7 +1,16 @@
-amcheck = shared_module('amcheck', [
-    'verify_heapam.c',
-    'verify_nbtree.c',
-  ],
+amcheck_sources = files(
+  'verify_heapam.c',
+  'verify_nbtree.c',
+)
+
+if host_system == 'windows'
+  amcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'amcheck',
+    '--FILEDESC', 'amcheck - function for verifying relation integrity',])
+endif
+
+amcheck = shared_module('amcheck',
+  amcheck_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += amcheck
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
index d2e01968f54..c4ffb0663bc 100644
--- a/contrib/auth_delay/meson.build
+++ b/contrib/auth_delay/meson.build
@@ -1,5 +1,15 @@
+auth_delay_sources = files(
+  'auth_delay.c',
+)
+
+if host_system == 'windows'
+  auth_delay_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auth_delay',
+    '--FILEDESC', 'auth_delay - delay authentication failure reports',])
+endif
+
 autoinc = shared_module('auth_delay',
-  ['auth_delay.c'],
+  auth_delay_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
index 249a8376faa..76f86617850 100644
--- a/contrib/auto_explain/meson.build
+++ b/contrib/auto_explain/meson.build
@@ -1,5 +1,15 @@
+auto_explain_sources = files(
+  'auto_explain.c',
+)
+
+if host_system == 'windows'
+  auto_explain_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auto_explain',
+    '--FILEDESC', 'auto_explain - logging facility for execution plans',])
+endif
+
 auto_explain = shared_module('auto_explain',
-  files('auto_explain.c'),
+  auto_explain_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += auto_explain
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
index 9f0517f1701..3a389de9175 100644
--- a/contrib/basebackup_to_shell/meson.build
+++ b/contrib/basebackup_to_shell/meson.build
@@ -2,6 +2,12 @@ basebackup_to_shell_sources = files(
   'basebackup_to_shell.c',
 )
 
+if host_system == 'windows'
+  basebackup_to_shell_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basebackup_to_shell',
+    '--FILEDESC', 'basebackup_to_shell - target basebackup to shell command',])
+endif
+
 basebackup_to_shell = shared_module('basebackup_to_shell',
   basebackup_to_shell_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index b67cbef60bd..c30dcfa5d41 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -2,6 +2,12 @@ basic_archive_sources = files(
   'basic_archive.c',
 )
 
+if host_system == 'windows'
+  basic_archive_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basic_archive',
+    '--FILEDESC', 'basic_archive - basic archive module',])
+endif
+
 basic_archive = shared_module('basic_archive',
   basic_archive_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 1fe7632bdbe..16f3b83e4d2 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -7,6 +7,12 @@ bloom_sources = files(
   'blvalidate.c',
 )
 
+if host_system == 'windows'
+  bloom_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bloom',
+    '--FILEDESC', 'bloom access method - signature file based index',])
+endif
+
 bloom = shared_module('bloom',
   bloom_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
index c20b667d75f..a68daab0dcd 100644
--- a/contrib/bool_plperl/meson.build
+++ b/contrib/bool_plperl/meson.build
@@ -6,6 +6,12 @@ bool_plperl_sources = files(
   'bool_plperl.c',
 )
 
+if host_system == 'windows'
+  bool_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bool_plperl',
+    '--FILEDESC', 'bool_plperl - bool transform for plperl',])
+endif
+
 bool_plperl = shared_module('bool_plperl',
   bool_plperl_sources,
   include_directories: [plperl_inc, include_directories('.')],
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
index 15d6d31a6ee..fd4c76767a7 100644
--- a/contrib/btree_gin/meson.build
+++ b/contrib/btree_gin/meson.build
@@ -1,5 +1,15 @@
+btree_gin_sources = files(
+  'btree_gin.c',
+)
+
+if host_system == 'windows'
+  btree_gin_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gin',
+    '--FILEDESC', 'btree_gin - B-tree equivalent GIN operator classes',])
+endif
+
 btree_gin = shared_module('btree_gin',
-  files('btree_gin.c'),
+  btree_gin_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gin
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index c0a8d238540..e98c91dacc8 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -25,6 +25,12 @@ btree_gist_sources = files(
   'btree_uuid.c',
 )
 
+if host_system == 'windows'
+  btree_gist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gist',
+    '--FILEDESC', 'btree_gist - B-tree equivalent GiST operator classes',])
+endif
+
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
index ca60eded80b..26a101a19bd 100644
--- a/contrib/citext/meson.build
+++ b/contrib/citext/meson.build
@@ -2,6 +2,12 @@ citext_sources = files(
   'citext.c',
 )
 
+if host_system == 'windows'
+  citext_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'citext',
+    '--FILEDESC', 'citext - case-insensitive character string data type',])
+endif
+
 citext = shared_module('citext',
   citext_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index 72342b0c82c..041acf95a90 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -17,6 +17,12 @@ cube_parse = custom_target('cubeparse',
 generated_sources += cube_parse.to_list()
 cube_sources += cube_parse
 
+if host_system == 'windows'
+  cube_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'cube',
+    '--FILEDESC', 'cube - multidimensional cube data type',])
+endif
+
 cube = shared_module('cube',
   cube_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
index d35f7b5d49e..66eeb03b736 100644
--- a/contrib/dblink/meson.build
+++ b/contrib/dblink/meson.build
@@ -2,6 +2,12 @@ dblink_sources = files(
   'dblink.c',
 )
 
+if host_system == 'windows'
+  dblink_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dblink',
+    '--FILEDESC', 'dblink - connect to other PostgreSQL databases',])
+endif
+
 dblink = shared_module('dblink',
   dblink_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
index f00e8085619..6fff921adda 100644
--- a/contrib/dict_int/meson.build
+++ b/contrib/dict_int/meson.build
@@ -1,5 +1,15 @@
+dict_int_sources = files(
+  'dict_int.c',
+)
+
+if host_system == 'windows'
+  dict_int_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_int',
+    '--FILEDESC', 'dict_int - add-on dictionary template for full-text search',])
+endif
+
 dict_int = shared_module('dict_int',
-  files('dict_int.c'),
+  dict_int_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_int
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
index be53f55bb79..fabd505a7df 100644
--- a/contrib/dict_xsyn/meson.build
+++ b/contrib/dict_xsyn/meson.build
@@ -1,5 +1,15 @@
+dict_xsyn_sources = files(
+  'dict_xsyn.c',
+)
+
+if host_system == 'windows'
+  dict_xsyn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_xsyn',
+    '--FILEDESC', 'dict_xsyn - add-on dictionary template for full-text search',])
+endif
+
 dict_xsyn = shared_module('dict_xsyn',
-  files('dict_xsyn.c'),
+  dict_xsyn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_xsyn
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
index 807f5cb7de3..78dc29c3da3 100644
--- a/contrib/earthdistance/meson.build
+++ b/contrib/earthdistance/meson.build
@@ -1,5 +1,15 @@
+earthdistance_sources = files(
+  'earthdistance.c',
+)
+
+if host_system == 'windows'
+  earthdistance_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'earthdistance',
+    '--FILEDESC', 'earthdistance - calculate distances on the surface of the Earth',])
+endif
+
 earthdistance = shared_module('earthdistance',
-  files('earthdistance.c'),
+  earthdistance_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += earthdistance
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
index f13efb6e38e..c4071faa669 100644
--- a/contrib/file_fdw/meson.build
+++ b/contrib/file_fdw/meson.build
@@ -1,5 +1,15 @@
+file_fdw_sources = files(
+  'file_fdw.c',
+)
+
+if host_system == 'windows'
+  file_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'file_fdw',
+    '--FILEDESC', 'file_fdw - foreign data wrapper for files',])
+endif
+
 file_fdw = shared_module('file_fdw',
-  files('file_fdw.c'),
+  file_fdw_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += file_fdw
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
index ec278a6211e..e6d06149cec 100644
--- a/contrib/fuzzystrmatch/meson.build
+++ b/contrib/fuzzystrmatch/meson.build
@@ -1,8 +1,16 @@
+fuzzystrmatch_sources = files(
+  'fuzzystrmatch.c',
+  'dmetaphone.c',
+)
+
+if host_system == 'windows'
+  fuzzystrmatch_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'fuzzystrmatch',
+    '--FILEDESC', 'fuzzystrmatch - similarities and distance between strings',])
+endif
+
 fuzzystrmatch = shared_module('fuzzystrmatch',
-  files(
-    'fuzzystrmatch.c',
-    'dmetaphone.c'
-  ),
+  fuzzystrmatch_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += fuzzystrmatch
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 07c59f40a97..2bb26bb772b 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -1,15 +1,23 @@
 # .. so that includes of hstore/hstore.h work
 hstore_inc = include_directories('.', '../')
 
+hstore_sources = files(
+  'hstore_compat.c',
+  'hstore_gin.c',
+  'hstore_gist.c',
+  'hstore_io.c',
+  'hstore_op.c',
+  'hstore_subs.c',
+)
+
+if host_system == 'windows'
+  hstore_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore',
+    '--FILEDESC', 'hstore - key/value pair data type',])
+endif
+
 hstore = shared_module('hstore',
-  files(
-    'hstore_compat.c',
-    'hstore_gin.c',
-    'hstore_gist.c',
-    'hstore_io.c',
-    'hstore_op.c',
-    'hstore_subs.c',
-  ),
+  hstore_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
index bbafa0221bd..a238fee6a26 100644
--- a/contrib/hstore_plperl/meson.build
+++ b/contrib/hstore_plperl/meson.build
@@ -6,6 +6,12 @@ hstore_plperl_sources = files(
   'hstore_plperl.c',
 )
 
+if host_system == 'windows'
+  hstore_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plperl',
+    '--FILEDESC', 'hstore_plperl - hstore transform for plperl',])
+endif
+
 hstore_plperl = shared_module('hstore_plperl',
   hstore_plperl_sources,
   include_directories: [plperl_inc, hstore_inc],
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
index 214b48519a9..6071aaeb4b3 100644
--- a/contrib/hstore_plpython/meson.build
+++ b/contrib/hstore_plpython/meson.build
@@ -6,6 +6,12 @@ hstore_plpython_sources = files(
   'hstore_plpython.c',
 )
 
+if host_system == 'windows'
+  hstore_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plpython3',
+    '--FILEDESC', 'hstore_plpython - hstore transform for plpython',])
+endif
+
 hstore_plpython = shared_module('hstore_plpython3',
   hstore_plpython_sources,
   include_directories: [plpython_inc, hstore_inc, ],
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
index 1655bcbb3fd..b7cf1ce0cad 100644
--- a/contrib/intarray/meson.build
+++ b/contrib/intarray/meson.build
@@ -8,6 +8,12 @@ intarray_sources = files(
   '_intbig_gist.c',
 )
 
+if host_system == 'windows'
+  intarray_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', '_int',
+    '--FILEDESC', 'intarray - functions and operators for arrays of integers',])
+endif
+
 intarray = shared_module('_int',
   intarray_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
index cc30bbeb55c..db68a718313 100644
--- a/contrib/isn/meson.build
+++ b/contrib/isn/meson.build
@@ -2,6 +2,12 @@ isn_sources = files(
   'isn.c',
 )
 
+if host_system == 'windows'
+  isn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isn',
+    '--FILEDESC', 'isn - data types for international product numbering standards',])
+endif
+
 isn = shared_module('isn',
   isn_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
index 5c915d8ed94..071a7a98d2c 100644
--- a/contrib/jsonb_plperl/meson.build
+++ b/contrib/jsonb_plperl/meson.build
@@ -6,6 +6,12 @@ jsonb_plperl_sources = files(
   'jsonb_plperl.c',
 )
 
+if host_system == 'windows'
+  jsonb_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plperl',
+    '--FILEDESC', 'jsonb_plperl - jsonb transform for plperl',])
+endif
+
 jsonb_plperl = shared_module('jsonb_plperl',
   jsonb_plperl_sources,
   include_directories: [plperl_inc],
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
index de8e1105c6a..84dc1161e8b 100644
--- a/contrib/jsonb_plpython/meson.build
+++ b/contrib/jsonb_plpython/meson.build
@@ -6,6 +6,12 @@ jsonb_plpython_sources = files(
   'jsonb_plpython.c',
 )
 
+if host_system == 'windows'
+  jsonb_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plpython3',
+    '--FILEDESC', 'jsonb_plpython - jsonb transform for plpython',])
+endif
+
 jsonb_plpython = shared_module('jsonb_plpython3',
   jsonb_plpython_sources,
   include_directories: [plpython_inc],
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
index 9082d5713c7..61ae131f1cc 100644
--- a/contrib/lo/meson.build
+++ b/contrib/lo/meson.build
@@ -2,6 +2,12 @@ lo_sources = files(
   'lo.c',
 )
 
+if host_system == 'windows'
+  lo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'lo',
+    '--FILEDESC', 'lo - management for large objects',])
+endif
+
 lo = shared_module('lo',
   lo_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
index 9463fc2c5e5..421292cea9d 100644
--- a/contrib/ltree/meson.build
+++ b/contrib/ltree/meson.build
@@ -13,6 +13,12 @@ ltree_sources = files(
 # .. so that includes of ltree/ltree.h work
 ltree_inc = include_directories('.', '../')
 
+if host_system == 'windows'
+  ltree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree',
+    '--FILEDESC', 'ltree - hierarchical label data type',])
+endif
+
 ltree = shared_module('ltree',
   ltree_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
index 429d75006aa..acf5e4a6fc8 100644
--- a/contrib/ltree_plpython/meson.build
+++ b/contrib/ltree_plpython/meson.build
@@ -6,6 +6,12 @@ ltree_plpython_sources = files(
   'ltree_plpython.c',
 )
 
+if host_system == 'windows'
+  ltree_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree_plpython3',
+    '--FILEDESC', 'ltree_plpython - ltree transform for plpython',])
+endif
+
 ltree_plpython = shared_module('ltree_plpython3',
   ltree_plpython_sources,
   include_directories: [plpython_inc, ltree_inc],
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
index 1dad5d8f6e7..1a248f19260 100644
--- a/contrib/oid2name/meson.build
+++ b/contrib/oid2name/meson.build
@@ -1,5 +1,15 @@
+oid2name_sources = files(
+  'oid2name.c',
+)
+
+if host_system == 'windows'
+  oid2name_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'oid2name',
+    '--FILEDESC', 'oid2name - examine the file structure',])
+endif
+
 oid2name = executable('oid2name',
-  ['oid2name.c'],
+  oid2name_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
index 8e7ee09a43a..77276c3715a 100644
--- a/contrib/old_snapshot/meson.build
+++ b/contrib/old_snapshot/meson.build
@@ -2,6 +2,12 @@ old_snapshot_sources = files(
   'time_mapping.c',
 )
 
+if host_system == 'windows'
+  old_snapshot_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'old_snapshot',
+    '--FILEDESC', 'old_snapshot - utilities in support of old_snapshot_threshold',])
+endif
+
 old_snapshot = shared_module('old_snapshot',
   old_snapshot_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
index 4af8153e4fd..3ec50b9445e 100644
--- a/contrib/pageinspect/meson.build
+++ b/contrib/pageinspect/meson.build
@@ -9,6 +9,12 @@ pageinspect_sources = files(
   'rawpage.c',
 )
 
+if host_system == 'windows'
+  pageinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pageinspect',
+    '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',])
+endif
+
 pageinspect = shared_module('pageinspect',
   pageinspect_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
index 7da47d02f1d..383d7df372a 100644
--- a/contrib/passwordcheck/meson.build
+++ b/contrib/passwordcheck/meson.build
@@ -9,6 +9,12 @@ passwordcheck_deps = []
 # passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
 # passwordcheck_deps += [cc.find_library('crack')]
 
+if host_system == 'windows'
+  passwordcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'passwordcheck',
+    '--FILEDESC', 'passwordcheck - strengthen user password checks',])
+endif
+
 passwordcheck = shared_module('passwordcheck',
   passwordcheck_sources,
   c_args: passwordcheck_c_args,
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
index 2c69eae3ea2..dd9948e5f0b 100644
--- a/contrib/pg_buffercache/meson.build
+++ b/contrib/pg_buffercache/meson.build
@@ -1,7 +1,15 @@
+pg_buffercache_sources = files(
+  'pg_buffercache_pages.c',
+)
+
+if host_system == 'windows'
+  pg_buffercache_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_buffercache',
+    '--FILEDESC', 'pg_buffercache - monitoring of shared buffer cache in real-time',])
+endif
+
 pg_buffercache = shared_module('pg_buffercache',
-  files(
-    'pg_buffercache_pages.c',
-  ),
+  pg_buffercache_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_buffercache
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index f795014d7ca..904b37b6e9b 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -1,7 +1,15 @@
+pg_freespacemap_sources = files(
+  'pg_freespacemap.c',
+)
+
+if host_system == 'windows'
+  pg_freespacemap_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_freespacemap',
+    '--FILEDESC', 'pg_freespacemap - monitoring of free space map',])
+endif
+
 pg_freespacemap = shared_module('pg_freespacemap',
-  files(
-    'pg_freespacemap.c',
-  ),
+  pg_freespacemap_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_freespacemap
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
index bdca9af4f27..b7140cee34b 100644
--- a/contrib/pg_prewarm/meson.build
+++ b/contrib/pg_prewarm/meson.build
@@ -1,8 +1,16 @@
+pg_prewarm_sources = files(
+  'autoprewarm.c',
+  'pg_prewarm.c',
+)
+
+if host_system == 'windows'
+  pg_prewarm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_prewarm',
+    '--FILEDESC', 'pg_prewarm - preload relation data into system buffer cache',])
+endif
+
 pg_prewarm = shared_module('pg_prewarm',
-  files(
-    'autoprewarm.c',
-    'pg_prewarm.c',
-  ),
+  pg_prewarm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_prewarm
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index ac117d2fc1d..854df138e76 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -1,5 +1,15 @@
+pg_stat_statements_sources = files(
+  'pg_stat_statements.c',
+)
+
+if host_system == 'windows'
+  pg_stat_statements_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_stat_statements',
+    '--FILEDESC', 'pg_stat_statements - execution statistics of SQL statements',])
+endif
+
 pg_stat_statements = shared_module('pg_stat_statements',
-  files('pg_stat_statements.c'),
+  pg_stat_statements_sources,
   kwargs: contrib_mod_args + {
     'dependencies': contrib_mod_args['dependencies'],
   },
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
index ac71caa5276..7b5c5999f4b 100644
--- a/contrib/pg_surgery/meson.build
+++ b/contrib/pg_surgery/meson.build
@@ -1,7 +1,15 @@
+pg_surgery_sources = files(
+  'heap_surgery.c',
+)
+
+if host_system == 'windows'
+  pg_surgery_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_surgery',
+    '--FILEDESC', 'pg_surgery - perform surgery on a damaged relation',])
+endif
+
 pg_surgery = shared_module('pg_surgery',
-  files(
-    'heap_surgery.c',
-  ),
+  pg_surgery_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_surgery
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index a90628d23c6..c8c7c07b308 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -1,10 +1,18 @@
+pg_trgm_sources = files(
+  'trgm_gin.c',
+  'trgm_gist.c',
+  'trgm_op.c',
+  'trgm_regexp.c',
+)
+
+if host_system == 'windows'
+  pg_trgm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_trgm',
+    '--FILEDESC', 'pg_trgm - trigram matching',])
+endif
+
 pg_trgm = shared_module('pg_trgm',
-  files(
-    'trgm_gin.c',
-    'trgm_gist.c',
-    'trgm_op.c',
-    'trgm_regexp.c',
-  ),
+  pg_trgm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
index 933dc99ac4d..263a0d08b82 100644
--- a/contrib/pg_visibility/meson.build
+++ b/contrib/pg_visibility/meson.build
@@ -1,7 +1,15 @@
+pg_visibility_sources = files(
+  'pg_visibility.c',
+)
+
+if host_system == 'windows'
+  pg_visibility_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_visibility',
+    '--FILEDESC', 'pg_visibility - page visibility information',])
+endif
+
 pg_visibility = shared_module('pg_visibility',
-  files(
-    'pg_visibility.c',
-  ),
+  pg_visibility_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_visibility
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index d6b27877dd0..4314a3182a2 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -1,5 +1,11 @@
 pg_walinspect_sources = files('pg_walinspect.c')
 
+if host_system == 'windows'
+  pg_walinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_walinspect',
+    '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',])
+endif
+
 pg_walinspect = shared_module('pg_walinspect',
   pg_walinspect_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index fe0851bf8e8..7fc7bbc7ca1 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -69,6 +69,12 @@ else
   pgcrypto_regress += 'pgp-zlib-DISABLED'
 endif
 
+if host_system == 'windows'
+  pgcrypto_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgcrypto',
+    '--FILEDESC', 'pgcrypto - cryptographic functions',])
+endif
+
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
index 1b41691a2a3..8092f0d4a64 100644
--- a/contrib/pgrowlocks/meson.build
+++ b/contrib/pgrowlocks/meson.build
@@ -1,7 +1,15 @@
+pgrowlocks_sources = files(
+  'pgrowlocks.c',
+)
+
+if host_system == 'windows'
+  pgrowlocks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgrowlocks',
+    '--FILEDESC', 'pgrowlocks - display row locking information',])
+endif
+
 pgrowlocks = shared_module('pgrowlocks',
-  files(
-    'pgrowlocks.c',
-  ),
+  pgrowlocks_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgrowlocks
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 8e828692d5c..05e4cd46a5c 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -1,9 +1,17 @@
+pgstattuple_sources = files(
+  'pgstatapprox.c',
+  'pgstatindex.c',
+  'pgstattuple.c',
+)
+
+if host_system == 'windows'
+  pgstattuple_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgstattuple',
+    '--FILEDESC', 'pgstattuple - tuple-level statistics',])
+endif
+
 pgstattuple = shared_module('pgstattuple',
-  files(
-    'pgstatapprox.c',
-    'pgstatindex.c',
-    'pgstattuple.c',
-  ),
+  pgstattuple_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
index 378885ec93b..d3746ff135c 100644
--- a/contrib/postgres_fdw/meson.build
+++ b/contrib/postgres_fdw/meson.build
@@ -6,6 +6,12 @@ postgres_fdw_sources = files(
   'shippable.c',
 )
 
+if host_system == 'windows'
+  postgres_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'postgres_fdw',
+    '--FILEDESC', 'postgres_fdw - foreign data wrapper for PostgreSQL',])
+endif
+
 postgres_fdw = shared_module('postgres_fdw',
   postgres_fdw_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
index e476eab2a77..c6fbb22999b 100644
--- a/contrib/seg/meson.build
+++ b/contrib/seg/meson.build
@@ -17,6 +17,12 @@ seg_parse = custom_target('segparse',
 generated_sources += seg_parse.to_list()
 seg_sources += seg_parse
 
+if host_system == 'windows'
+  seg_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'seg',
+    '--FILEDESC', 'seg - line segment data type',])
+endif
+
 seg = shared_module('seg',
   seg_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 60a95e17c2f..8bef239e3c2 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -14,6 +14,12 @@ sepgsql_sources = files(
   'uavc.c',
 )
 
+if host_system == 'windows'
+  sepgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sepgsql',
+    '--FILEDESC', 'sepgsql - SELinux integration',])
+endif
+
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
index 98008980ec2..e7d78189ef5 100644
--- a/contrib/spi/meson.build
+++ b/contrib/spi/meson.build
@@ -1,5 +1,15 @@
+autoinc_sources = files(
+  'autoinc.c',
+)
+
+if host_system == 'windows'
+  autoinc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'autoinc',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 autoinc = shared_module('autoinc',
-  ['autoinc.c'],
+  autoinc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
@@ -9,8 +19,18 @@ install_data('autoinc.control', 'autoinc--1.0.sql',
 )
 
 
+insert_username_sources = files(
+  'insert_username.c',
+)
+
+if host_system == 'windows'
+  insert_username_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'insert_username',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 insert_username = shared_module('insert_username',
-  ['insert_username.c'],
+  insert_username_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += insert_username
@@ -22,8 +42,18 @@ install_data(
 )
 
 
+moddatetime_sources = files(
+  'moddatetime.c',
+)
+
+if host_system == 'windows'
+  moddatetime_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'moddatetime',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 moddatetime = shared_module('moddatetime',
-  ['moddatetime.c'],
+  moddatetime_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += moddatetime
@@ -38,8 +68,18 @@ install_data(
 # comment out if you want a quieter refint package for other uses
 refint_cflags = ['-DREFINT_VERBOSE']
 
+refint_sources = files(
+  'refint.c',
+)
+
+if host_system == 'windows'
+  refint_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'refint',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 refint = shared_module('refint',
-  ['refint.c'],
+  refint_sources,
   c_args: refint_cflags,
   kwargs: contrib_mod_args,
 )
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
index 53f752a08ac..136983e783d 100644
--- a/contrib/sslinfo/meson.build
+++ b/contrib/sslinfo/meson.build
@@ -2,10 +2,18 @@ if not ssl.found()
   subdir_done()
 endif
 
+sslinfo_sources = files(
+  'sslinfo.c',
+)
+
+if host_system == 'windows'
+  sslinfo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sslinfo',
+    '--FILEDESC', 'sslinfo - information about client SSL certificate',])
+endif
+
 sslinfo = shared_module('sslinfo',
-  files(
-    'sslinfo.c',
-  ),
+  sslinfo_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [ssl, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
index f4230096c0c..d2ddc8d3b39 100644
--- a/contrib/tablefunc/meson.build
+++ b/contrib/tablefunc/meson.build
@@ -1,7 +1,15 @@
+tablefunc_sources = files(
+  'tablefunc.c',
+)
+
+if host_system == 'windows'
+  tablefunc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tablefunc',
+    '--FILEDESC', 'tablefunc - various functions that return tables',])
+endif
+
 tablefunc = shared_module('tablefunc',
-  files(
-    'tablefunc.c',
-  ),
+  tablefunc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tablefunc
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
index c3a025247d4..71261c3b0a2 100644
--- a/contrib/tcn/meson.build
+++ b/contrib/tcn/meson.build
@@ -1,7 +1,15 @@
+tcn_sources = files(
+  'tcn.c',
+)
+
+if host_system == 'windows'
+  tcn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tcn',
+    '--FILEDESC', 'tcn - trigger function notifying listeners',])
+endif
+
 tcn = shared_module('tcn',
-  files(
-    'tcn.c',
-  ),
+  tcn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tcn
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index dd7cb0101ad..6376103c689 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -2,6 +2,12 @@ test_decoding_sources = files(
   'test_decoding.c',
 )
 
+if host_system == 'windows'
+  test_decoding_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_decoding',
+    '--FILEDESC', 'test_decoding - example of a logical decoding output plugin',])
+endif
+
 test_decoding = shared_module('test_decoding',
   test_decoding_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
index b9cd42115a8..380abb49883 100644
--- a/contrib/tsm_system_rows/meson.build
+++ b/contrib/tsm_system_rows/meson.build
@@ -1,7 +1,15 @@
+tsm_system_rows_sources = files(
+  'tsm_system_rows.c',
+)
+
+if host_system == 'windows'
+  tsm_system_rows_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_rows',
+    '--FILEDESC', 'tsm_system_rows - TABLESAMPLE method which accepts number of rows as a limit',])
+endif
+
 tsm_system_rows = shared_module('tsm_system_rows',
-  files(
-    'tsm_system_rows.c',
-  ),
+  tsm_system_rows_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_rows
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
index 18015912ffb..e57a2702c60 100644
--- a/contrib/tsm_system_time/meson.build
+++ b/contrib/tsm_system_time/meson.build
@@ -1,7 +1,15 @@
+tsm_system_time_sources = files(
+  'tsm_system_time.c',
+)
+
+if host_system == 'windows'
+  tsm_system_time_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_time',
+    '--FILEDESC', 'tsm_system_time - TABLESAMPLE method which accepts time in milliseconds as a limit',])
+endif
+
 tsm_system_time = shared_module('tsm_system_time',
-  files(
-    'tsm_system_time.c',
-  ),
+  tsm_system_time_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_time
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
index 872b76e3223..438035132f8 100644
--- a/contrib/unaccent/meson.build
+++ b/contrib/unaccent/meson.build
@@ -1,7 +1,15 @@
+unaccent_sources = files(
+  'unaccent.c',
+)
+
+if host_system == 'windows'
+  unaccent_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'unaccent',
+    '--FILEDESC', 'unaccent - text search dictionary that removes accents',])
+endif
+
 unaccent = shared_module('unaccent',
-  files(
-    'unaccent.c',
-  ),
+  unaccent_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += unaccent
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
index da6d1d75c12..28730f398f0 100644
--- a/contrib/uuid-ossp/meson.build
+++ b/contrib/uuid-ossp/meson.build
@@ -2,10 +2,18 @@ if not uuid.found()
   subdir_done()
 endif
 
+uuid_ossp_sources = files(
+  'uuid-ossp.c',
+)
+
+if host_system == 'windows'
+  uuid_ossp_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'uuid-ossp',
+    '--FILEDESC', 'uuid-ossp - UUID generation',])
+endif
+
 uuid_ossp = shared_module('uuid-ossp',
-  files(
-    'uuid-ossp.c',
-  ),
+  uuid_ossp_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [uuid, contrib_mod_args['dependencies']],
   },
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
index 7a632b87d1b..846de47dbd1 100644
--- a/contrib/vacuumlo/meson.build
+++ b/contrib/vacuumlo/meson.build
@@ -1,5 +1,15 @@
+vacuumlo_sources = files(
+  'vacuumlo.c',
+)
+
+if host_system == 'windows'
+  vacuumlo_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'vacuumlo',
+    '--FILEDESC', 'vacuumlo - removes orphaned large objects',])
+endif
+
 vacuumlo = executable('vacuumlo',
-  ['vacuumlo.c'],
+  vacuumlo_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 9c0b56f01f6..89b0d677516 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -2,11 +2,19 @@ if not libxml.found()
   subdir_done()
 endif
 
+xml2_sources = files(
+  'xpath.c',
+  'xslt_proc.c',
+)
+
+if host_system == 'windows'
+  xml2_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgxml',
+    '--FILEDESC', 'xml2 - XPath querying and XSLT',])
+endif
+
 xml2 = shared_module('pgxml',
-  files(
-    'xpath.c',
-    'xslt_proc.c',
-  ),
+  xml2_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 5887cb92b52..e5dc0edc04b 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -1,7 +1,11 @@
 export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
 
-ecpg_compat = both_libraries('libecpg_compat',
+ecpg_compat_sources = files(
   'informix.c',
+)
+
+ecpg_compat = both_libraries('libecpg_compat',
+  ecpg_compat_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
   c_args: ['-DSO_MAJOR_VERSION=3'],
   dependencies: [frontend_code, thread_dep],
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 1be49c8c27f..74876f039c9 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -93,6 +93,12 @@ ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
 generated_sources += ecpg_kwlist
 ecpg_sources += ecpg_kwlist
 
+if host_system == 'windows'
+  ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ecpg',
+    '--FILEDESC', 'ecpg - embedded SQL precompiler for C',])
+endif
+
 ecpg_exe = executable('ecpg',
   ecpg_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index f0ace641f0c..f67f2dffb71 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -7,6 +7,12 @@ pg_regress_ecpg_sources = pg_regress_c + files(
   'pg_regress_ecpg.c',
 )
 
+if host_system == 'windows'
+  pg_regress_ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress_ecpg',
+    '--FILEDESC', 'ECPG Test - regression tests for ECPG',])
+endif
+
 pg_regress_ecpg = executable('pg_regress_ecpg',
   pg_regress_ecpg_sources,
   c_args: pg_regress_cflags,
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index c7656fd4609..ba27b8c1d44 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -23,6 +23,12 @@ spec_parser = custom_target('specparse',
 isolationtester_sources += spec_parser
 generated_sources += spec_parser.to_list()
 
+if host_system == 'windows'
+  isolation_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_isolation_regress',
+    '--FILEDESC', 'pg_isolation_regress - multi-client test driver',])
+endif
+
 pg_isolation_regress = executable('pg_isolation_regress',
   isolation_sources,
   c_args: pg_regress_cflags,
@@ -34,6 +40,13 @@ pg_isolation_regress = executable('pg_isolation_regress',
 )
 bin_targets += pg_isolation_regress
 
+
+if host_system == 'windows'
+  isolationtester_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isolationtester',
+    '--FILEDESC', 'isolationtester - multi-client test driver',])
+endif
+
 isolationtester = executable('isolationtester',
   isolationtester_sources,
   include_directories: include_directories('.'),
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
index cf4bdaba637..a0c3ab6afe7 100644
--- a/src/test/modules/delay_execution/meson.build
+++ b/src/test/modules/delay_execution/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+delay_execution_sources = files(
+  'delay_execution.c',
+)
+
+if host_system == 'windows'
+  delay_execution_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'delay_execution',
+    '--FILEDESC', 'delay_execution - allow delay between parsing and execution',])
+endif
+
 delay_execution = shared_module('delay_execution',
-  ['delay_execution.c'],
+  delay_execution_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += delay_execution
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
index 56ff5f48001..4ce82491135 100644
--- a/src/test/modules/dummy_index_am/meson.build
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_index_am_sources = files(
+  'dummy_index_am.c',
+)
+
+if host_system == 'windows'
+  dummy_index_am_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_index_am',
+    '--FILEDESC', 'dummy_index_am - index access method template',])
+endif
+
 dummy_index_am = shared_module('dummy_index_am',
-  ['dummy_index_am.c'],
+  dummy_index_am_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_index_am
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
index 21b7cf8f353..81b626e496c 100644
--- a/src/test/modules/dummy_seclabel/meson.build
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_seclabel_sources = files(
+  'dummy_seclabel.c',
+)
+
+if host_system == 'windows'
+  dummy_seclabel_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_seclabel',
+    '--FILEDESC', 'dummy_seclabel - regression testing of the SECURITY LABEL statement',])
+endif
+
 dummy_seclabel = shared_module('dummy_seclabel',
-  ['dummy_seclabel.c'],
+  dummy_seclabel_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_seclabel
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
index 8384b6e3b2a..de0e2d15626 100644
--- a/src/test/modules/libpq_pipeline/meson.build
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -1,7 +1,15 @@
+libpq_pipeline_sources = files(
+  'libpq_pipeline.c',
+)
+
+if host_system == 'windows'
+  libpq_pipeline_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_pipeline',
+    '--FILEDESC', 'libpq_pipeline - test program for pipeline execution',])
+endif
+
 libpq_pipeline = executable('libpq_pipeline',
-  files(
-    'libpq_pipeline.c',
-  ),
+  libpq_pipeline_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
index 45de3f1990d..e1ea2c7a16f 100644
--- a/src/test/modules/plsample/meson.build
+++ b/src/test/modules/plsample/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+plsample_sources = files(
+  'plsample.c',
+)
+
+if host_system == 'windows'
+  plsample_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plsample',
+    '--FILEDESC', 'PL/Sample - template for procedural language',])
+endif
+
 plsample = shared_module('plsample',
-  ['plsample.c'],
+  plsample_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += plsample
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
index 857fc7e140e..445296fee0b 100644
--- a/src/test/modules/spgist_name_ops/meson.build
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+spgist_name_ops_sources = files(
+  'spgist_name_ops.c',
+)
+
+if host_system == 'windows'
+  spgist_name_ops_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'spgist_name_ops',
+    '--FILEDESC', 'spgist_name_ops - test opclass for SP-GiST',])
+endif
+
 spgist_name_ops = shared_module('spgist_name_ops',
-  ['spgist_name_ops.c'],
+  spgist_name_ops_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += spgist_name_ops
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
index a57bd0693a3..a9eb4c564da 100644
--- a/src/test/modules/ssl_passphrase_callback/meson.build
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -3,8 +3,19 @@ if not ssl.found()
 endif
 
 # FIXME: prevent install during main install, but not during test :/
+
+ssl_passphrase_callback_sources = files(
+  'ssl_passphrase_func.c',
+)
+
+if host_system == 'windows'
+  ssl_passphrase_callback_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ssl_passphrase_func',
+    '--FILEDESC', 'callback function to provide a passphrase',])
+endif
+
 ssl_passphrase_callback = shared_module('ssl_passphrase_func',
-  ['ssl_passphrase_func.c'],
+  ssl_passphrase_callback_sources,
   kwargs: pg_mod_args + {
     'dependencies': [ssl, pg_mod_args['dependencies']],
   },
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
index 945eb5a70c4..3cf6b05754f 100644
--- a/src/test/modules/test_bloomfilter/meson.build
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_bloomfilter_sources = files(
+  'test_bloomfilter.c',
+)
+
+if host_system == 'windows'
+  test_bloomfilter_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_bloomfilter',
+    '--FILEDESC', 'test_bloomfilter - test code for Bloom filter library',])
+endif
+
 test_bloomfilter = shared_module('test_bloomfilter',
-  ['test_bloomfilter.c'],
+  test_bloomfilter_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_bloomfilter
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
index 81ad5adc526..54d44f9b2b4 100644
--- a/src/test/modules/test_ddl_deparse/meson.build
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ddl_deparse_sources = files(
+  'test_ddl_deparse.c',
+)
+
+if host_system == 'windows'
+  test_ddl_deparse_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ddl_deparse',
+    '--FILEDESC', 'test_ddl_deparse - regression testing for DDL deparsing',])
+endif
+
 test_ddl_deparse = shared_module('test_ddl_deparse',
-  ['test_ddl_deparse.c'],
+  test_ddl_deparse_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ddl_deparse
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
index abf0a3b0430..b3b49c56122 100644
--- a/src/test/modules/test_ginpostinglist/meson.build
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ginpostinglist_sources = files(
+  'test_ginpostinglist.c',
+)
+
+if host_system == 'windows'
+  test_ginpostinglist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ginpostinglist',
+    '--FILEDESC', 'test_ginpostinglist - test code for src/backend/access/gin//ginpostinglist.c',])
+endif
+
 test_ginpostinglist = shared_module('test_ginpostinglist',
-  ['test_ginpostinglist.c'],
+  test_ginpostinglist_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ginpostinglist
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
index c32c469c69a..4bd75af4b5e 100644
--- a/src/test/modules/test_integerset/meson.build
+++ b/src/test/modules/test_integerset/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_integerset_sources = files(
+  'test_integerset.c',
+)
+
+if host_system == 'windows'
+  test_integerset_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_integerset',
+    '--FILEDESC', 'test_integerset - test code for src/backend/lib/integerset.c',])
+endif
+
 test_integerset = shared_module('test_integerset',
-  ['test_integerset.c'],
+  test_integerset_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_integerset
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
index a388de1156a..c5405b8f878 100644
--- a/src/test/modules/test_lfind/meson.build
+++ b/src/test/modules/test_lfind/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_lfind_sources = files(
+  'test_lfind.c',
+)
+
+if host_system == 'windows'
+  test_lfind_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_lfind',
+    '--FILEDESC', 'test_lfind - test code for optimized linear search functions',])
+endif
+
 test_lfind = shared_module('test_lfind',
-  ['test_lfind.c'],
+  test_lfind_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_lfind
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 5faf0459777..8802bbbac55 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_oat_hooks_sources = files(
+  'test_oat_hooks.c',
+)
+
+if host_system == 'windows'
+  test_oat_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_oat_hooks',
+    '--FILEDESC', 'test_oat_hooks - example use of object access hooks',])
+endif
+
 test_oat_hooks = shared_module('test_oat_hooks',
-  ['test_oat_hooks.c'],
+  test_oat_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_oat_hooks
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
index b59960f615e..1c17113347f 100644
--- a/src/test/modules/test_parser/meson.build
+++ b/src/test/modules/test_parser/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_parser_sources = files(
+  'test_parser.c',
+)
+
+if host_system == 'windows'
+  test_parser_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_parser',
+    '--FILEDESC', 'test_parser - example of a custom parser for full-text search',])
+endif
+
 test_parser = shared_module('test_parser',
-  ['test_parser.c'],
+  test_parser_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_parser
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
index 1cfa84b3609..9a5be43c9c0 100644
--- a/src/test/modules/test_predtest/meson.build
+++ b/src/test/modules/test_predtest/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_predtest_sources = files(
+  'test_predtest.c',
+)
+
+if host_system == 'windows'
+  test_predtest_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_predtest',
+    '--FILEDESC', 'test_predtest - test code for optimizer/util/predtest.c',])
+endif
+
 test_predtest = shared_module('test_predtest',
-  ['test_predtest.c'],
+  test_predtest_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_predtest
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
index 34cbc3e1624..f067e08d321 100644
--- a/src/test/modules/test_rbtree/meson.build
+++ b/src/test/modules/test_rbtree/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rbtree_sources = files(
+  'test_rbtree.c',
+)
+
+if host_system == 'windows'
+  test_rbtree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rbtree',
+    '--FILEDESC', 'test_rbtree - test code for red-black tree library',])
+endif
+
 test_rbtree = shared_module('test_rbtree',
-  ['test_rbtree.c'],
+  test_rbtree_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rbtree
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
index 867a64e57c3..cfb938d9f1e 100644
--- a/src/test/modules/test_regex/meson.build
+++ b/src/test/modules/test_regex/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_regex_sources = files(
+  'test_regex.c',
+)
+
+if host_system == 'windows'
+  test_regex_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_regex',
+    '--FILEDESC', 'test_regex - test code for backend/regex/',])
+endif
+
 test_regex = shared_module('test_regex',
-  ['test_regex.c'],
+  test_regex_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_regex
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
index 80d8adda332..3fb273b2934 100644
--- a/src/test/modules/test_rls_hooks/meson.build
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rls_hooks_sources = files(
+  'test_rls_hooks.c',
+)
+
+if host_system == 'windows'
+  test_rls_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rls_hooks',
+    '--FILEDESC', 'test_rls_hooks - example use of RLS hooks',])
+endif
+
 test_rls_hooks = shared_module('test_rls_hooks',
-  ['test_rls_hooks.c'],
+  test_rls_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rls_hooks
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
index b663543d616..16c8fdb57f4 100644
--- a/src/test/modules/test_shm_mq/meson.build
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -1,10 +1,19 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_shm_mq_sources = files(
+  'setup.c',
+  'test.c',
+  'worker.c',
+)
+
+if host_system == 'windows'
+  test_shm_mq_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_shm_mq',
+    '--FILEDESC', 'test_shm_mq - example use of shared memory message queue',])
+endif
+
 test_shm_mq = shared_module('test_shm_mq',
-  files(
-    'setup.c',
-    'test.c',
-    'worker.c',
-  ),
+  test_shm_mq_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_shm_mq
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index 32acad883b2..a4a158c75b9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -1,8 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_worker_spi_sources = files(
+  'worker_spi.c',
+)
+
+if host_system == 'windows'
+  test_worker_spi_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'worker_spi',
+    '--FILEDESC', 'worker_spi - background worker example',])
+endif
+
 test_worker_spi = shared_module('worker_spi',
-  files(
-    'worker_spi.c',
-  ),
+  test_worker_spi_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_worker_spi
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index fd8ee995b79..963c0f64ed5 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -8,6 +8,12 @@ regress_sources = pg_regress_c + files(
 
 pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
 
+if host_system == 'windows'
+  regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress',
+    '--FILEDESC', 'pg_regress - test driver',])
+endif
+
 pg_regress = executable('pg_regress',
   regress_sources,
   c_args: pg_regress_cflags,
diff --git a/meson.build b/meson.build
index 6ffae59ba03..4ad06b25213 100644
--- a/meson.build
+++ b/meson.build
@@ -2523,6 +2523,67 @@ gen_export_kwargs = {
 
 
 
+###
+### windows resources related stuff
+###
+
+if host_system == 'windows'
+  pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+  win32ver_rc = files('src/port/win32ver.rc')
+  rcgen = find_program('src/tools/rcgen', native: true)
+
+  rcgen_base_args = [
+    '--srcdir', '@SOURCE_DIR@',
+    '--builddir', meson.build_root(),
+    '--rcout', '@OUTPUT0@',
+    '--out', '@OUTPUT1@',
+    '--input', '@INPUT@',
+    '@EXTRA_ARGS@',
+  ]
+
+  if cc.get_argument_syntax() == 'msvc'
+    rcgen_base_args += [
+      '--rc', find_program('rc', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.res']
+  else
+    rcgen_base_args += [
+      '--windres', find_program('windres', required: true).path(),
+    ]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.obj']
+  endif
+
+  # msbuild backend doesn't support this atm
+  if meson.backend() == 'ninja'
+    rcgen_base_args += ['--depfile', '@DEPFILE@']
+  endif
+
+  rcgen_bin_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_APP',
+    '--FILEENDING', 'exe',
+    '--ICO', pg_ico
+  ]
+
+  rcgen_lib_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_DLL',
+    '--FILEENDING', 'dll',
+  ]
+
+  rc_bin_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_bin_args,
+    output: rcgen_outputs,
+  )
+
+  rc_lib_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_lib_args,
+    output: rcgen_outputs,
+  )
+endif
+
+
+
 # headers that the whole build tree depends on
 generated_headers = []
 # headers that the backend build depends on
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
index 16f082ecfa8..9e0934c000b 100644
--- a/src/timezone/meson.build
+++ b/src/timezone/meson.build
@@ -28,6 +28,12 @@ if get_option('system_tzdata') == ''
   if meson.is_cross_build()
     zic = find_program(get_option('ZIC'), native: true, required: true)
   else
+    if host_system == 'windows'
+      zic_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+        '--NAME', 'zic',
+        '--FILEDESC', 'zic - time zone compiler',])
+    endif
+
     zic = executable('zic', zic_sources,
                      dependencies: [frontend_code],
                      kwargs: default_bin_args + {'install': false}
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..5b62bfe5410
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('--srcdir', type=os.path.abspath,
+                    required=True)
+parser.add_argument('--builddir', type=os.path.abspath,
+                    required=True)
+
+binaries = parser.add_argument_group('binaries')
+binaries.add_argument('--windres', type=os.path.abspath)
+binaries.add_argument('--rc', type=os.path.abspath)
+
+inout = parser.add_argument_group('inout')
+inout.add_argument('--depfile', type=argparse.FileType('w'))
+inout.add_argument('--input', type=argparse.FileType('r'),
+                   required=True)
+inout.add_argument('--rcout', type=argparse.FileType('w'),
+                   required=True)
+inout.add_argument('--out', type=str,
+                   required=True)
+
+replacements = parser.add_argument_group('replacements')
+replacements.add_argument('--FILEDESC', type=str)
+replacements.add_argument('--NAME', type=str, required=True)
+replacements.add_argument('--VFT_TYPE', type=str, required=True)
+replacements.add_argument('--FILEENDING', type=str, required=True)
+replacements.add_argument('--ICO', type=str)
+
+args = parser.parse_args()
+
+# determine replacement strings
+
+internal_name = '"{0}"'.format(args.NAME)
+original_name = '"{0}.{1}"'.format(args.NAME, args.FILEENDING)
+
+# if no description is passed in, generate one based on the name
+if args.FILEDESC:
+    filedesc = args.FILEDESC
+elif args.NAME:
+    if args.VFT_TYPE == 'VFT_DLL':
+        filedesc = 'PostgreSQL {0} library'.format(args.NAME)
+    else:
+        filedesc = 'PostgreSQL {0} binary'.format(args.NAME)
+filedesc = '"{0}"'.format(filedesc)
+
+
+if args.ICO:
+    ico = 'IDI_ICON ICON "{0}"'.format(args.ICO)
+    if args.depfile:
+        args.depfile.write("{0} : {1}\n".format(args.rcout.name, args.ICO))
+else:
+    ico = ''
+
+
+data = args.input.read()
+
+data = data.replace('VFT_APP', args.VFT_TYPE)
+data = data.replace('_INTERNAL_NAME_', internal_name)
+data = data.replace('_ORIGINAL_NAME_', original_name)
+data = data.replace('FILEDESC', filedesc)
+data = data.replace("_ICO_", ico)
+
+args.rcout.write(data)
+args.rcout.close()
+
+if args.windres:
+    cmd = [
+        args.windres,
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '-o', args.out, '-i', args.rcout.name,
+    ]
+elif args.rc:
+    cmd = [
+        args.rc, '/nologo',
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '/fo', args.out, args.rcout.name,
+    ]
+else:
+    sys.exit('either --windres or --rc needs to be specified')
+
+sp = subprocess.run(cmd)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# It'd be nicer if we could generate correct dependencies here, but 'rc'
+# doesn't support doing so. It's unlikely we'll ever need more, so...
+if args.depfile:
+    args.depfile.write("{0} : {1}\n".format(
+        args.rcout.name, args.input.name))
+    args.depfile.write("{0} : {1}/{2}\n".format(
+        args.out, args.builddir, 'src/include/pg_config.h'))
-- 
2.37.3.542.gdd3f6c4cae

v16-0005-meson-Add-support-for-relative-rpaths-fixing-tes.patchtext/x-diff; charset=us-asciiDownload
From f9be71eb3f6e74a8a83723e1f96ac487426af88f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 13:48:46 -0700
Subject: [PATCH v16 05/16] meson: Add support for relative rpaths, fixing
 tests on MacOS w/ SIP

---
 meson.build                                   | 47 ++++++++--
 .../relativize_shared_library_references      | 88 +++++++++++++++++++
 src/tools/relpath.py                          |  6 ++
 3 files changed, 136 insertions(+), 5 deletions(-)
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py

diff --git a/meson.build b/meson.build
index 4ad06b25213..8323adf772b 100644
--- a/meson.build
+++ b/meson.build
@@ -159,6 +159,7 @@ portname = host_system
 
 exesuffix = '' # overridden below where necessary
 dlsuffix = '.so' # overridden below where necessary
+rpath_origin = '$ORIGIN'
 library_path_var = 'LD_LIBRARY_PATH'
 
 # Format of file to control exports from libraries, and how to pass them to
@@ -209,6 +210,7 @@ elif host_system == 'cygwin'
 elif host_system == 'darwin'
   dlsuffix = '.dylib'
   library_path_var = 'DYLD_LIBRARY_PATH'
+  rpath_origin = '@loader_path'
 
   export_file_format = 'darwin'
   export_fmt = '-exported_symbols_list=@0@'
@@ -241,8 +243,16 @@ elif host_system == 'netbsd'
   # LDFLAGS.
   ldflags += ['-Wl,-z,now', '-Wl,-z,relro']
 
+  # netbsd patched their meson in a broken way:
+  # https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=56959
+  # until there's a way out of that, disable rpath_origin
+  rpath_origin = ''
+
 elif host_system == 'openbsd'
-  # you're ok
+  # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+  # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+  # when invoked via PATH search).
+  rpath_origin = ''
 
 elif host_system == 'sunos'
   portname = 'solaris'
@@ -254,6 +264,7 @@ elif host_system == 'windows'
   exesuffix = '.exe'
   dlsuffix = '.dll'
   library_path_var = ''
+  rpath_origin = ''
 
   export_file_format = 'win'
   export_file_suffix = 'def'
@@ -2479,6 +2490,25 @@ if host_system != 'darwin'
   mod_install_rpaths += postgres_lib_d
 endif
 
+# If the host can form relative rpaths, use that to make the installation
+# properly relocatable
+if rpath_origin != ''
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_bin, dir_lib, check: true).stdout().strip()
+  bin_install_rpaths += rpath_origin / bin_to_lib
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_lib_pkg, dir_lib, check: true).stdout().strip()
+  mod_install_rpaths += rpath_origin / mod_to_lib
+
+  test_use_library_path_var = false
+else
+  test_use_library_path_var = true
+endif
+
 
 # Define arguments for default targets
 
@@ -2771,6 +2801,14 @@ above, or by running configure and then make maintainer-clean.
 endif
 
 
+# To make MacOS installation work without a prior make install, even with SIP
+# enabled, make rpaths relative after installation. This also makes the
+# installation relocatable.
+if host_system == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
 
 ###############################################################
 # Test prep
@@ -2836,10 +2874,9 @@ test_env.set('REGRESS_SHLIB', regress_module.full_path())
 # Export PG_TEST_EXTRA so it can be checked in individual tap tests.
 test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
 
-# Add the temporary installation to the library search path on platforms where
-# that works (everything but windows, basically). On windows everything
-# library-like gets installed into bindir, solving that issue.
-if library_path_var != ''
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if test_use_library_path_var and library_path_var != ''
   test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
 endif
 
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..280bd48fd32
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    meson_info_p = os.path.join(build_root, 'meson-info')
+    targets = json.load(
+        open(os.path.join(meson_info_p, 'intro-targets.json')))
+    installed = json.load(
+        open(os.path.join(meson_info_p, 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            # print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            cmd = install_name_tool + ['-change', lib, newref, patchpath]
+            subprocess.check_call(cmd)
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}',
+          file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
-- 
2.37.3.542.gdd3f6c4cae

v16-0006-meson-Add-docs-for-building-with-meson.patchtext/x-diff; charset=us-asciiDownload
From 103e073de719f19d4f31201d5b4e740957506ed3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:55:20 -0700
Subject: [PATCH v16 06/16] meson: Add docs for building with meson

Author: Samay Sharma <smilingsamay@gmail.com>
---
 doc/src/sgml/installation.sgml | 1841 ++++++++++++++++++++++++++++++--
 doc/src/sgml/monitoring.sgml   |    2 +-
 doc/src/sgml/runtime.sgml      |    2 +-
 doc/src/sgml/sourcerepo.sgml   |    5 +-
 4 files changed, 1743 insertions(+), 107 deletions(-)

diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 319c7e69660..3d4018badd3 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -31,7 +31,144 @@ documentation.  See standalone-profile.xsl for details.
   C++</productname>, see <xref linkend="install-windows"/> instead.
  </para>
 
- <sect1 id="install-short">
+ <sect1 id="supported-platforms">
+  <title>Supported Platforms</title>
+
+  <para>
+   A platform (that is, a CPU architecture and operating system combination)
+   is considered supported by the <productname>PostgreSQL</productname> development
+   community if the code contains provisions to work on that platform and
+   it has recently been verified to build and pass its regression tests
+   on that platform.  Currently, most testing of platform compatibility
+   is done automatically by test machines in the
+   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
+   If you are interested in using <productname>PostgreSQL</productname> on a platform
+   that is not represented in the build farm, but on which the code works
+   or can be made to work, you are strongly encouraged to set up a build
+   farm member machine so that continued compatibility can be assured.
+  </para>
+
+  <para>
+   In general, <productname>PostgreSQL</productname> can be expected to work on
+   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
+   and PA-RISC, including
+   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
+   It is often
+   possible to build on an unsupported CPU type by configuring with
+   <option>--disable-spinlocks</option>, but performance will be poor.
+  </para>
+
+  <para>
+   <productname>PostgreSQL</productname> can be expected to work on current
+   versions of these operating systems: Linux, Windows,
+   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
+   Other Unix-like systems may also work but are not currently
+   being tested.  In most cases, all CPU architectures supported by
+   a given operating system will work.  Look in
+   <xref linkend="installation-platform-notes"/> below to see if
+   there is information
+   specific to your operating system, particularly if using an older system.
+  </para>
+
+  <para>
+   If you have installation problems on a platform that is known
+   to be supported according to recent build farm results, please report
+   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
+   in porting <productname>PostgreSQL</productname> to a new platform,
+   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
+   to discuss that.
+  </para>
+
+  <para>
+   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
+   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
+   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
+   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
+   Tru64 UNIX, and ULTRIX.
+  </para>
+ </sect1>
+
+ <sect1 id="get-source">
+  <title>Getting the Source</title>
+
+   <para>
+   You can download the source code in two ways - via git or the source code
+   tarballs.
+   </para>
+
+  <sect2 id="get-source-git">
+   <title>Getting the Source via <productname>Git</productname></title>
+  <para>
+   With <productname>Git</productname>, you can make a copy of the entire code repository
+   on your local machine, so you will have access to all history and branches
+   offline. This is the fastest and most flexible way to develop or test
+   patches.
+  </para>
+
+  <procedure>
+   <step>
+    <para>
+     To begin using the Git repository, make a clone of the official mirror:
+
+<programlisting>
+git clone https://git.postgresql.org/git/postgresql.git
+</programlisting>
+
+     This will copy the full repository to your local machine, so it may take
+     a while to complete, especially if you have a slow Internet connection.
+     The files will be placed in a new subdirectory <filename>postgresql</filename> of
+     your current directory.
+    </para>
+
+   </step>
+
+   <step>
+    <para>
+     Whenever you want to get the latest updates in the system, <command>cd</command>
+     into the repository, and run:
+
+<programlisting>
+git pull
+</programlisting>
+    </para>
+   </step>
+  </procedure>
+
+  <para>
+   <productname>Git</productname> can do a lot more things than just fetch the source.
+   Our wiki, <ulink
+   url="https://wiki.postgresql.org/wiki/Working_with_Git"></ulink>,
+   has some discussion on working with Git. For more information, consult the
+   <productname>Git</productname> man pages, or see the website at
+   <ulink url="https://git-scm.com"></ulink>.
+  </para>
+  </sect2>
+  <sect2 id="get-source-tarball">
+   <title>Getting the Source via Tarballs</title>
+
+  <para>
+   The <productname>PostgreSQL</productname> source code for released versions
+   can also be obtained from the download section of our website:
+   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
+   Download the
+   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
+   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
+   file you're interested in, then unpack it:
+<screen>
+<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
+</screen>
+   This will create a directory
+   <filename>postgresql-<replaceable>version</replaceable></filename> under
+   the current directory with the <productname>PostgreSQL</productname> sources.
+   Change into that directory for the rest of the installation procedure.
+  </para>
+  </sect2>
+ </sect1>
+
+<sect1 id="install-make">
+  <title>Building and Installation with autoconf and make</title>
+
+ <sect2 id="install-short-make">
   <title>Short Version</title>
 
   <para>
@@ -50,12 +187,12 @@ su - postgres
 /usr/local/pgsql/bin/psql test
 </synopsis>
    The long version is the rest of this
-   <phrase>chapter</phrase>.
+   <phrase>section</phrase>.
   </para>
- </sect1>
+ </sect2>
 
 
- <sect1 id="install-requirements">
+ <sect2 id="install-requirements-make">
   <title>Requirements</title>
 
   <para>
@@ -343,45 +480,9 @@ su - postgres
    url="ftp://ftp.gnu.org/gnu/"></ulink>.
   </para>
 
-  <para>
-   Also check that you have sufficient disk space. You will need about
-   350 MB for the source tree during compilation and about 60 MB for
-   the installation directory. An empty database cluster takes about
-   40 MB; databases take about five times the amount of space that a
-   flat text file with the same data would take. If you are going to
-   run the regression tests you will temporarily need up to an extra
-   300 MB. Use the <command>df</command> command to check free disk
-   space.
-  </para>
- </sect1>
+ </sect2>
 
- <sect1 id="install-getsource">
-  <title>Getting the Source</title>
-
-  <para>
-   The <productname>PostgreSQL</productname> source code for released versions
-   can be obtained from the download section of our website:
-   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
-   Download the
-   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
-   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
-   file you're interested in, then unpack it:
-<screen>
-<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
-</screen>
-   This will create a directory
-   <filename>postgresql-<replaceable>version</replaceable></filename> under
-   the current directory with the <productname>PostgreSQL</productname> sources.
-   Change into that directory for the rest of the installation procedure.
-  </para>
-
-  <para>
-   Alternatively, you can use the Git version control system; see
-   <xref linkend="git"/> for more information.
-  </para>
- </sect1>
-
- <sect1 id="install-procedure">
+ <sect2 id="install-procedure-make">
   <title>Installation Procedure</title>
 
   <procedure>
@@ -630,6 +731,7 @@ build-postgresql:
    rebuilding.  Without this, your changes in configuration choices
    might not propagate everywhere they need to.
   </para>
+  </sect2>
 
   <sect2 id="configure-options">
    <title><filename>configure</filename> Options</title>
@@ -844,7 +946,7 @@ build-postgresql:
      various <productname>PostgreSQL</productname> features that are not
      built by default.  Most of these are non-default only because they
      require additional software, as described in
-     <xref linkend="install-requirements"/>.
+     <xref linkend="install-requirements-make"/>.
     </para>
 
      <variablelist>
@@ -1672,9 +1774,7 @@ build-postgresql:
 
    </sect3>
 
-  </sect2>
-
-  <sect2 id="configure-envvars">
+  <sect3 id="configure-envvars">
    <title><filename>configure</filename> Environment Variables</title>
 
    <indexterm zone="configure-envvars">
@@ -1955,9 +2055,1600 @@ build-postgresql:
       adjustments, while <envar>COPT</envar> might be kept set all the time.
      </para>
     </note>
+   </sect3>
   </sect2>
  </sect1>
 
+ <sect1 id="install-meson">
+  <title>Building and Installation with meson</title>
+
+ <sect2 id="install-short-meson">
+  <title>Short Version</title>
+
+  <para>
+<synopsis>
+
+# create working directory
+mkdir postgres
+cd postgres
+
+# fetch source code
+# git clone https://git.postgresql.org/git/postgresql.git src
+
+# current instructions for testing (to be removed when merging)
+git clone -b meson https://github.com/anarazel/postgres.git src
+
+# setup and enter build directory (done only first time)
+meson setup build src --prefix=$PWD/install
+cd build
+
+# Compile source
+ninja
+
+# Install to the prefix directory specified above
+ninja install
+
+# Run all tests (optional, takes time)
+meson test
+
+# Initialize a new database
+../install/bin/initdb -D ../data
+
+# Start database
+../install/bin/pg_ctl -D ../data/ -l logfile start
+
+# Connect to the database
+../install/bin/psql -d postgres
+
+</synopsis>
+   The long version is the rest of this
+   <phrase>section</phrase>.
+  </para>
+ </sect2>
+
+ <sect2 id="install-requirements-meson">
+  <title>Requirements</title>
+
+  <para>
+   In general, a modern Unix-compatible platform or Windows should be able
+   to build <productname>PostgreSQL</productname> with meson and run it.
+   The platforms which have received specific testing at the time of release are:
+
+  <itemizedlist spacing="compact">
+   <listitem><simpara>Linux</simpara></listitem>
+   <listitem><simpara>Windows</simpara></listitem>
+   <listitem><simpara>OpenBSD</simpara></listitem>
+   <listitem><simpara>NetBSD</simpara></listitem>
+   <listitem><simpara>FreeBSD</simpara></listitem>
+   <listitem><simpara>macOS</simpara></listitem>
+  </itemizedlist>
+  </para>
+
+  <sect3 id="required-packages">
+   <title>Required packages</title>
+
+   <para>
+    The following software packages are required for building
+    <productname>PostgreSQL</productname>:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You can download the source code in two ways - via git or by downloading
+      the source code tarballs. For the former, you will need an installed version of
+      <productname>Git</productname>, which you can get from
+      <ulink url="https://git-scm.com"></ulink>. Many systems already
+      have a recent version of <productname>Git</productname>
+      installed by default, or available in their package distribution system.
+      If you download the source code tarballs, you will need
+      <application>tar</application> in addition to
+      <application>gzip</application> or <application>bzip2</application>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>meson</primary>
+      </indexterm>
+      You need to install <application>
+      <ulink url="https://mesonbuild.com/">meson</ulink></application> version
+      0.54 or later to be able to build <productname>PostgreSQL</productname>
+      with it. If your operating system provides a package manager, you can install
+      <application>meson</application> with that. If not, you
+      can download a <ulink url="https://github.com/mesonbuild/meson">meson release</ulink>
+      from github and run <literal>./meson.py</literal> from the git repository
+      itself. Lastly, Meson is also available in the python package index and can
+      be installed with <literal>pip</literal>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least
+      C99-compliant). Recent
+      versions of <productname>GCC</productname> are recommended, but
+      <productname>PostgreSQL</productname> is known to build using a wide variety
+      of compilers from different vendors.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>flex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>lex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>bison</primary>
+      </indexterm>
+      <indexterm>
+       <primary>yacc</primary>
+      </indexterm>
+
+      <application>Flex</application> and <application>Bison</application>
+      are needed to build <productname>PostgreSQL</productname> using
+      <application>meson</application>. Be sure to get
+      <application>Flex</application> 2.5.31 or later and
+      <application>Bison</application> 1.875 or later from your package manager.
+      Other <application>lex</application> and <application>yacc</application>
+      programs cannot be used.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>perl</primary>
+      </indexterm>
+      <application>Perl</application> 5.8.3 or later is needed to build PostgreSQL
+      using <application>meson</application> and to run some test suites.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+  <sect3 id="recommended-packages">
+   <title>Recommended packages</title>
+
+   <para>
+   The following packages are not required to build
+   <application>PostgreSQL</application> but are strongly recommended:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>readline</primary>
+      </indexterm>
+      <indexterm>
+       <primary>libedit</primary>
+      </indexterm>
+
+      The <acronym>GNU</acronym> <productname>Readline</productname> library
+      allows <application>psql</application> (the PostgreSQL command line
+      SQL interpreter) to remember each command you type, and allows you to
+      use arrow keys to recall and edit previous commands.  This is very
+      helpful and is strongly recommended. As an alternative, you can often
+      use the BSD-licensed <filename>libedit</filename> library, originally
+      developed on <productname>NetBSD</productname>. The
+      <filename>libedit</filename> library is GNU
+      <productname>Readline</productname>-compatible and is used if
+      <filename>libreadline</filename> is not found, or if
+      <option>libedit_preferred</option> is enabled as an
+      option to <filename>meson configure</filename>. If you are using a
+      package-based Linux distribution, be aware that you need both the
+      <literal>readline</literal> and <literal>readline-devel</literal> packages, if
+      those are separate in your distribution.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>zlib</primary>
+      </indexterm>
+
+      The <productname>zlib</productname> compression library is
+      used to provide support for compressed archives in
+      <application>pg_dump</application> and
+      <application>pg_restore</application> and is recommended.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Various tests, particularly the client program tests under
+      <filename>src/bin</filename>, use the Perl TAP tools. Running
+      these tests is recommended for development. These TAP tests
+      require the Perl module <literal>IPC::Run</literal> which is
+      available from CPAN or an operating system package.
+     </para>
+    </listitem>
+   </itemizedlist>
+  </para>
+  </sect3>
+
+  <sect3 id="optional-packages">
+   <title>Optional packages</title>
+
+   <para>
+   The following packages are optional.  They are not required in the
+   default configuration, but they are needed when certain build
+   options are enabled, as explained below:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You need <productname>OpenSSL</productname>, if you want to support
+      encrypted client connections.  <productname>OpenSSL</productname> is
+      also required for random number generation on platforms that do not
+      have <filename>/dev/urandom</filename> (except Windows).  The minimum
+      required version is 1.0.1.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>LZ4</productname>, if you want to support
+      compression of data with that method; see
+      <xref linkend="guc-default-toast-compression"/> and
+      <xref linkend="guc-wal-compression"/>.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>Zstandard</productname>, if you want to support
+      compression of data or backups with that method; see
+      <xref linkend="guc-wal-compression"/>.
+      The minimum required version is 1.4.0.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <application>Kerberos</application>, <productname>OpenLDAP</productname>,
+      and/or <application>PAM</application>, if you want to support authentication
+      using those services.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the server programming language
+      <application>PL/Perl</application> you need a full
+      <productname>Perl</productname> installation, including the
+      <filename>libperl</filename> library and the header files.
+      The minimum required version is <productname>Perl</productname> 5.8.3.
+      Since <application>PL/Perl</application> will be a shared
+      library, the <indexterm><primary>libperl</primary></indexterm>
+      <filename>libperl</filename> library must be a shared library
+      also on most platforms.  This appears to be the default in
+      recent <productname>Perl</productname> versions, but it was not
+      in earlier versions, and in any case it is the choice of whomever
+      installed Perl at your site.  <filename>configure</filename> will fail
+      if building <application>PL/Perl</application> is selected but it cannot
+      find a shared <filename>libperl</filename>.  In that case, you will have
+      to rebuild and install <productname>Perl</productname> manually to be
+      able to build <application>PL/Perl</application>.  During the
+      configuration process for <productname>Perl</productname>, request a
+      shared library.
+     </para>
+
+     <para>
+      If you intend to make more than incidental use of
+      <application>PL/Perl</application>, you should ensure that the
+      <productname>Perl</productname> installation was built with the
+      <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal>
+      will show whether this is the case).
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Python</application> server programming
+      language, you need a <productname>Python</productname>
+      installation with the header files and
+      the <application>sysconfig</application> module.  The minimum
+      required version is <productname>Python</productname> 3.2.
+     </para>
+
+     <para>
+      Since <application>PL/Python</application> will be a shared
+      library, the <indexterm><primary>libpython</primary></indexterm>
+      <filename>libpython</filename> library must be a shared library
+      also on most platforms.  This is not the case in a default
+      <productname>Python</productname> installation built from source, but a
+      shared library is available in many operating system
+      distributions.  <filename>configure</filename> will fail if
+      building <application>PL/Python</application> is selected but it cannot
+      find a shared <filename>libpython</filename>.  That might mean that you
+      either have to install additional packages or rebuild (part of) your
+      <productname>Python</productname> installation to provide this shared
+      library.  When building from source, run <productname>Python</productname>'s
+      configure with the <literal>--enable-shared</literal> flag.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Tcl</application>
+      procedural language, you of course need a <productname>Tcl</productname>
+      installation.  The minimum required version is
+      <productname>Tcl</productname> 8.4.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To enable Native Language Support (<acronym>NLS</acronym>), that
+      is, the ability to display a program's messages in a language
+      other than English, you need an implementation of the
+      <application>Gettext</application> <acronym>API</acronym>.  Some operating
+      systems have this built-in (e.g., <systemitem
+      class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>,
+      <systemitem class="osname">Solaris</systemitem>), for other systems you
+      can download an add-on package from <ulink
+      url="https://www.gnu.org/software/gettext/"></ulink>.
+      If you are using the <application>Gettext</application> implementation in
+      the <acronym>GNU</acronym> C library then you will additionally
+      need the <productname>GNU Gettext</productname> package for some
+      utility programs.  For any of the other implementations you will
+      not need it.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <productname>PostgreSQL</productname> documentation,
+      there is a separate set of requirements; see
+      <xref linkend="docguide-toolsets"/>.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+ </sect2>
+
+ <sect2 id="configure-meson">
+  <title>Configuring the build</title>
+
+   <para>
+    The first step of the installation procedure is to configure the
+    source tree for your system and choose the options you would like. To
+    create and configure the build directory, you can start with the
+    <literal>meson setup</literal> command.
+   </para>
+
+<screen>
+<userinput>meson setup build</userinput>
+</screen>
+
+   <para>
+    The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal>
+    argument. If no <literal>srcdir</literal> is given Meson will deduce the
+    <literal>srcdir</literal> based on the current directory and the location
+    of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory.
+   </para>
+
+   <para>
+    Meson then loads the build configuration file and sets up the build directory.
+    Additionally, the invocation can pass options to Meson. The list of commonly
+    used options is in subsequent sections. A few examples of specifying different
+    build options are:
+
+<screen>
+#Setup build directory with a different installation prefix
+meson setup build --prefix=/home/user/pg-install
+
+#Setup build directory to generate a debug build
+meson setup build --buildtype=debug
+
+#Setup build directory with ssl (Use -D for project specific options)
+meson setup build -Dssl=openssl
+</screen>
+
+    Setting up the build directory is a one-time step. To reconfigure before a
+    new build, you can simply use the <literal>meson configure</literal> command
+   </para>
+
+<para>
+<screen>
+meson configure -Dcassert=true
+</screen>
+</para>
+
+<para>
+    <command>meson configure</command>'s commonly used command line options
+    are explained below. This list is not exhaustive (use
+    <literal>meson configure --help</literal> to get one that is).
+    The options not covered here are meant for advanced use-cases, and are
+    documented in the standard meson
+    <ulink url="https://mesonbuild.com/Commands.html#configure">documentation</ulink>.
+    These arguments can be used with <command>meson setup</command> as well.
+</para>
+
+   <sect3 id="configure-install-locations">
+    <title>Installation Locations</title>
+
+     <para>
+      These options control where <literal>ninja install (or meson install)</literal> will put
+      the files.  The <option>--prefix</option> option is sufficient for
+      most cases.  If you have special needs, you can customize the
+      installation subdirectories with the other options described in this
+      section.  Beware however that changing the relative locations of the
+      different subdirectories may render the installation non-relocatable,
+      meaning you won't be able to move it after installation.
+      (The <literal>man</literal> and <literal>doc</literal> locations are
+      not affected by this restriction.)
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term>
+       <listitem>
+        <para>
+         Install all files under the directory <replaceable>PREFIX</replaceable>
+         instead of <filename>/usr/local/pgsql</filename>. The actual
+         files will be installed into various subdirectories; no files
+         will ever be installed directly into the
+         <replaceable>PREFIX</replaceable> directory.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the directory for executable programs. The default
+         is <filename><replaceable>PREFIX</replaceable>/bin</filename>, which
+         normally means <filename>/usr/local/pgsql/bin</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for various configuration files,
+         <filename><replaceable>PREFIX</replaceable>/etc</filename> by default.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the location to install libraries and dynamically loadable
+         modules. The default is
+         <filename><replaceable>PREFIX</replaceable>/lib</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing C and C++ header files. The
+         default is <filename><replaceable>PREFIX</replaceable>/include</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for read-only data files used by the
+         installed programs. The default is
+         <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has
+         nothing to do with where your database files will be placed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing locale data, in particular
+         message translation catalog files.  The default is
+         <filename><replaceable>DATADIR</replaceable>/locale</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         The man pages that come with <productname>PostgreSQL</productname> will be installed under
+         this directory, in their respective
+         <filename>man<replaceable>x</replaceable></filename> subdirectories.
+         The default is <filename><replaceable>DATADIR</replaceable>/man</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+
+  <note>
+      <para>
+       Care has been taken to make it possible to install
+       <productname>PostgreSQL</productname> into shared installation locations
+       (such as <filename>/usr/local/include</filename>) without
+       interfering with the namespace of the rest of the system. First,
+       the string <quote><literal>/postgresql</literal></quote> is
+       automatically appended to <varname>datadir</varname>,
+       <varname>sysconfdir</varname>, and <varname>docdir</varname>,
+       unless the fully expanded directory name already contains the
+       string <quote><literal>postgres</literal></quote> or
+       <quote><literal>pgsql</literal></quote>. For example, if you choose
+       <filename>/usr/local</filename> as prefix, the documentation will
+       be installed in <filename>/usr/local/doc/postgresql</filename>,
+       but if the prefix is <filename>/opt/postgres</filename>, then it
+       will be in <filename>/opt/postgres/doc</filename>. The public C
+       header files of the client interfaces are installed into
+       <varname>includedir</varname> and are namespace-clean. The
+       internal header files and the server header files are installed
+       into private directories under <varname>includedir</varname>. See
+       the documentation of each interface for information about how to
+       access its header files. Finally, a private subdirectory will
+       also be created, if appropriate, under <varname>libdir</varname>
+       for dynamically loadable modules.
+      </para>
+     </note>
+    </sect3>
+
+    <sect3 id="configure-pg-features">
+    <title><productname>PostgreSQL</productname> Features</title>
+
+    <para>
+     The options described in this section enable building of
+     various <productname>PostgreSQL</productname> features that are not
+     built by default.  Most of these are non-default only because they
+     require additional software, as described in
+     <xref linkend="install-requirements-meson"/>. To specify PostgreSQL
+     specific options, the name of the option should be prefixed by -D.
+    </para>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>-Dnls=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Enables or disables Native Language Support (<acronym>NLS</acronym>),
+         that is, the ability to display a program's messages in a
+         language other than English. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To use this option, you will need an implementation of the
+         <application>Gettext</application> API.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplperl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Perl</application> server-side language. It
+         defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplpython=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Python</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpltcl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Tcl</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the TCL version to use when building PL/Tcl.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dicu=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for
+         the <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm>
+         library, enabling use of ICU collation
+         features<phrase condition="standalone-ignore"> (see
+         <xref linkend="collation"/>)</phrase>.
+         This requires the <productname>ICU4C</productname> package
+         to be installed.  The minimum required version
+         of <productname>ICU4C</productname> is currently 4.2.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+
+        <para>
+         By default,
+         <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm>
+         will be used to find the required compilation options.  This is
+         supported for <productname>ICU4C</productname> version 4.6 and later.
+         <!-- Add description for older ICU4C versions and when pkg-config isn't available-->
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="configure-with-llvm-meson">
+       <term><option>-Dllvm=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for <productname>LLVM</productname> based
+         <acronym>JIT</acronym> compilation<phrase
+         condition="standalone-ignore"> (see <xref
+         linkend="jit"/>)</phrase>.  This
+         requires the <productname>LLVM</productname> library to be installed.
+         The minimum required version of <productname>LLVM</productname> is
+         currently 3.9. It is set to disabled by default.
+        </para>
+        <para>
+         <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
+         will be used to find the required compilation options.
+         <command>llvm-config</command>, and then
+         <command>llvm-config-$major-$minor</command> for all supported
+         versions, will be searched for in your <envar>PATH</envar>.
+         <!--Add substitute for LLVM_CONFIG when llvm-config is not in PATH-->
+        </para>
+
+        <para>
+         <productname>LLVM</productname> support requires a compatible
+         <command>clang</command> compiler (specified, if necessary, using the
+         <envar>CLANG</envar> environment variable), and a working C++
+         compiler (specified, if necessary, using the <envar>CXX</envar>
+         environment variable).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlz4=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>LZ4</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzstd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>Zstandard</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dssl=<replaceable>LIBRARY</replaceable></option>
+       <indexterm>
+        <primary>OpenSSL</primary>
+        <seealso>SSL</seealso>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Build with support for <acronym>SSL</acronym> (encrypted)
+         connections. The only <replaceable>LIBRARY</replaceable>
+         supported is <option>openssl</option>. This requires the
+         <productname>OpenSSL</productname> package to be installed.
+         <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenSSL</productname> installation is sufficient
+         before proceeding. The default for this option is none.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dgssapi=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for GSSAPI authentication. On many systems, the
+         GSSAPI system (usually a part of the Kerberos installation) is not
+         installed in a location
+         that is searched by default (e.g., <filename>/usr/include</filename>,
+         <filename>/usr/lib</filename>), so you must use the options
+         <option>-Dextra_include_dirs</option> and <option>-Dextra_lib_dirs</option> in
+         addition to this option.  <filename>meson configure</filename> will check
+         for the required header files and libraries to make sure that
+         your GSSAPI installation is sufficient before proceeding.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dldap=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm>
+         support for authentication and connection parameter lookup (see
+         <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and
+         <xref linkend="auth-ldap"/></phrase> for more information). On Unix,
+         this requires the <productname>OpenLDAP</productname> package to be
+         installed. On Windows, the default <productname>WinLDAP</productname>
+         library is used.  <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenLDAP</productname> installation is sufficient before
+         proceeding. It defaults to auto, meaning that it will be enabled automatically
+         if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpam=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm>
+         (Pluggable Authentication Modules) support. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbsd_auth=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with BSD Authentication support. (The BSD Authentication framework is
+         currently only available on OpenBSD.) It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystemd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support
+         for <application>systemd</application><indexterm><primary>systemd</primary></indexterm>
+         service notifications.  This improves integration if the server
+         is started under <application>systemd</application> but has no impact
+         otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more
+         information</phrase>.  <application>libsystemd</application> and the
+         associated header files need to be installed to use this option.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbonjour=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for Bonjour automatic service discovery.
+         This requires Bonjour support in your operating system.
+         Recommended on macOS. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <xref linkend="uuid-ossp"/> module
+         (which provides functions to generate UUIDs), using the specified
+         UUID library.<indexterm><primary>UUID</primary></indexterm>
+         <replaceable>LIBRARY</replaceable> must be one of:
+        </para>
+        <itemizedlist>
+         <listitem>
+          <para>
+           <option>none</option> to not build the ussp module. This is the default.
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>bsd</option> to use the UUID functions found in FreeBSD, NetBSD,
+           and some other BSD-derived systems
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>e2fs</option> to use the UUID library created by
+           the <literal>e2fsprogs</literal> project; this library is present in most
+           Linux systems and in macOS, and can be obtained for other
+           platforms as well
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>ossp</option> to use the <ulink
+           url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
+          </para>
+         </listitem>
+        </itemizedlist>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxml=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxml2, enabling SQL/XML support.  Libxml2 version 2.6.23 or
+         later is required for this feature. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To detect the required compiler and linker options, PostgreSQL will
+         query <command>pkg-config</command>, if that is installed and knows
+         about libxml2.  Otherwise the program <command>xml2-config</command>,
+         which is installed by libxml2, will be used if it is found.  Use
+         of <command>pkg-config</command> is preferred, because it can deal
+         with multi-architecture installations better.
+        </para>
+
+        <para>
+         To use a libxml2 installation that is in an unusual location, you
+         can set <command>pkg-config</command>-related environment
+         variables (see its documentation).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxslt=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxslt, enabling the
+         <xref linkend="xml2"/>
+         module to perform XSL transformations of XML.
+         <option>-Dlibxml</option> must be specified as well.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dreadline=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Allows use of the <application>Readline</application> library
+         (and <application>libedit</application> as well).  This option enables
+         command-line editing and history in
+         <application>psql</application> and is strongly recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibedit_preferred=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this to true favors the use of the BSD-licensed <application>libedit</application> library
+         rather than GPL-licensed <application>Readline</application>.  This option
+         is significant only if you have both libraries installed; the
+         default is false that is to use <application>Readline</application>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzlib=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>zlib</primary>
+         </indexterm>
+         Enabls use of the <application>Zlib</application> library.
+         This enables
+         support for compressed archives in <application>pg_dump</application>
+         and <application>pg_restore</application> and is recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dspinlocks=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true by default and
+         setting it to false will allow the build to succeed even if <productname>PostgreSQL</productname>
+         has no CPU spinlock support for the platform.  The lack of
+         spinlock support will result in very poor performance; therefore,
+         this option should only be changed if the build aborts and
+         informs you that the platform lacks spinlock support. If setting this
+         option to false is required to build <productname>PostgreSQL</productname> on
+         your platform, please report the problem to the
+         <productname>PostgreSQL</productname> developers.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Datomics=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true and setting it to false will
+         disable use of CPU atomic operations.  The option does nothing on
+         platforms that lack such operations.  On platforms that do have
+         them, disabling atomics will result in poor performance.  Changing
+         this option is only useful for debugging or making performance comparisons.
+        </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-build-process">
+    <title>Build Process Details</title>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>--auto_features=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this option allows you to override value of all 'auto' features.
+         This can be useful when you want to disable or enable all the "optional"
+         features at once without having to set each of them manually. The default
+         value for this parameter is auto.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--backend=<replaceable>BACKEND</replaceable></option></term>
+       <listitem>
+        <para>
+         The default backend meson uses is ninja and that should suffice for most use cases.
+         However, if you'd like to fully integrate with visual studio, you can set the
+         BACKEND to <command>vs</command>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C compiler.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C linker.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories that will be added to the list the compiler
+         searches for header files. If you have optional packages
+         (such as GNU <application>Readline</application>) installed in a non-standard
+         location,
+         you have to use this option and probably also the corresponding
+         <option>-Dextra_lib_dirs</option> option.
+        </para>
+        <para>
+         Example: <literal>-Dextra_include_dirs=/opt/gnu/include:/usr/sup/include</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories to search for libraries. You will probably have
+         to use this option (and the corresponding
+         <option>-Dextra_include_dirs</option> option) if you have packages
+         installed in non-standard locations.
+        </para>
+        <para>
+         Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib:/usr/sup/lib</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option>
+       <indexterm>
+        <primary>time zone data</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <productname>PostgreSQL</productname> includes its own time zone database,
+         which it requires for date and time operations.  This time zone
+         database is in fact compatible with the IANA time zone
+         database provided by many operating systems such as FreeBSD,
+         Linux, and Solaris, so it would be redundant to install it again.
+         When this option is used, the system-supplied time zone database
+         in <replaceable>DIRECTORY</replaceable> is used instead of the one
+         included in the PostgreSQL source distribution.
+         <replaceable>DIRECTORY</replaceable> must be specified as an
+         absolute path.  <filename>/usr/share/zoneinfo</filename> is a
+         likely directory on some operating systems.  Note that the
+         installation routine will not detect mismatching or erroneous time
+         zone data.  If you use this option, you are advised to run the
+         regression tests to verify that the time zone data you have
+         pointed to works correctly with <productname>PostgreSQL</productname>.
+        </para>
+
+        <indexterm><primary>cross compilation</primary></indexterm>
+
+        <para>
+         This option is mainly aimed at binary package distributors
+         who know their target operating system well.  The main
+         advantage of using this option is that the PostgreSQL package
+         won't need to be upgraded whenever any of the many local
+         daylight-saving time rules change.  Another advantage is that
+         PostgreSQL can be cross-compiled more straightforwardly if the
+         time zone database files do not need to be built during the
+         installation.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term>
+       <listitem>
+        <para>
+         Append <replaceable>STRING</replaceable> to the PostgreSQL version number.  You
+         can use this, for example, to mark binaries built from unreleased Git
+         snapshots or containing custom patches with an extra version string,
+         such as a <command>git describe</command> identifier or a
+         distribution package release number.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term>
+       <listitem>
+        <para>
+         If you have the binaries for certain by programs required to build
+         Postgres (with or without optional flags) stored at non-standard
+         paths, you could specify them manually to meson configure. The complete
+         list of programs for whom this is supported can be found by running
+         <literal>meson configure</literal>. An example is included below.
+<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting>
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-layout">
+    <title>Data layout</title>
+
+    <para>
+     These options affect how PostgreSQL lays out data on disk.
+     Note that changing these breaks on-disk database compatibility,
+     meaning you cannot use <command>pg_upgrade</command> to upgrade to
+     a build with a different value of these options.
+    </para>
+
+    <variablelist>
+
+      <varlistentry>
+       <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>segment size</firstterm>, in gigabytes.  Large tables are
+         divided into multiple operating-system files, each of size equal
+         to the segment size.  This avoids problems with file size limits
+         that exist on many platforms.  The default segment size, 1 gigabyte,
+         is safe on all supported platforms.  If your operating system has
+         <quote>largefile</quote> support (which most do, nowadays), you can use
+         a larger segment size.  This can be helpful to reduce the number of
+         file descriptors consumed when working with very large tables.
+         But be careful not to select a value larger than is supported
+         by your platform and the file systems you intend to use.  Other
+         tools you might wish to use, such as <application>tar</application>, could
+         also set limits on the usable file size.
+         It is recommended, though not absolutely required, that this value
+         be a power of 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within tables.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 32 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>WAL block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within the WAL log.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 64 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-devel">
+    <title>Developer Options</title>
+
+    <para>
+     Most of the options in this section are only of interest for
+     developing or debugging <productname>PostgreSQL</productname>.
+     They are not recommended for production builds, except
+     for <option>--debug</option>, which can be useful to enable
+     detailed bug reports in the unlucky event that you encounter a bug.
+     On platforms supporting DTrace, <option>-Ddtrace</option>
+     may also be reasonable to use in production.
+    </para>
+
+    <para>
+     When building an installation that will be used to develop code inside
+     the server, it is recommended to use at least the <option>--buildtype=debug</option>
+     and <option>-Dcassert</option> options.
+    </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term>
+       <listitem>
+        <para>
+         This option can be used to specify the buildtype to use; defaults
+         to release. If you'd like finer control on the debug symbols
+         and optimization levels than what this option provides, you can
+         refer to the --debug and --optimization flags.
+
+         The following build types are generally used:
+         <variablelist>
+          <varlistentry>
+           <term><literal>plain</literal></term>
+           <listitem>
+            <para>
+            No extra build flags are used, even for compiler warnings,
+            useful for distro packagers and other cases where you need to
+            specify all arguments by yourself.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debug</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated but the result is not optimized.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debugoptimized</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated and the code is optimized (on most compilers
+            this means <literal>-g -O2</literal>)
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>release</literal></term>
+           <listitem>
+            <para>
+            This enables full optimization and no debug info is generated. This is
+            the default.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--debug</option></term>
+       <listitem>
+        <para>
+         Compiles all programs and libraries with debugging symbols.
+         This means that you can run the programs in a debugger
+         to analyze problems. This enlarges the size of the installed
+         executables considerably, and on non-GCC compilers it usually
+         also disables compiler optimization, causing slowdowns. However,
+         having the symbols available is extremely helpful for dealing
+         with any problems that might arise.  Currently, this option is
+         recommended for production installations only if you use GCC.
+         But you should always have it on if you are doing development work
+         or running a beta version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term>
+       <listitem>
+        <para>
+         Specify the optimization level. LEVEL can be set to any of {0,g,1,2,3,s}.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--werror</option></term>
+       <listitem>
+        <para>
+         Setting this option asks the compiler to treat warnings as errors. This can
+         be useful for code development purposes.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dcassert</option></term>
+       <listitem>
+        <para>
+         Enables <firstterm>assertion</firstterm> checks in the server, which test for
+         many <quote>cannot happen</quote> conditions.  This is invaluable for
+         code development purposes, but the tests can slow down the
+         server significantly.
+         Also, having the tests turned on won't necessarily enhance the
+         stability of your server!  The assertion checks are not categorized
+         for severity, and so what might be a relatively harmless bug will
+         still lead to server restarts if it triggers an assertion
+         failure.  This option is not recommended for production use, but
+         you should have it on for development work or when running a beta
+         version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtap-tests</option></term>
+       <listitem>
+        <para>
+         Enable tests using the Perl TAP tools.  This requires a Perl
+         installation and the Perl module <literal>IPC::Run</literal>.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term>
+       <listitem>
+        <para>
+         Enable test suites which require special software to run. This option
+         accepts arguments via a whitespace-separated list. The following values
+         are currently supported:
+         <variablelist>
+          <varlistentry>
+           <term><literal>kerberos</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/kerberos</filename>.  This
+            requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ldap</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ldap</filename>.  This
+            requires an <productname>OpenLDAP</productname> installation and opens
+            TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ssl</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ssl</filename>.  This opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>wal_consistency_checking</literal></term>
+           <listitem>
+            <para>
+            Uses <literal>wal_consistency_checking=all</literal> while running
+            certain tests under <filename>src/test/recovery</filename>.  Not
+            enabled by default because it is resource intensive.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+         Tests for features that are not supported by the current build
+         configuration are not run even if they are mentioned in
+         <varname>PG_TEST_EXTRA</varname>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--errorlogs</option></term>
+       <listitem>
+        <para>
+        This option can be used to print the logs from the failing tests
+        making debugging easier.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Db_coverage</option></term>
+       <listitem>
+        <para>
+         If using GCC, all programs and libraries are compiled with
+         code coverage testing instrumentation.  When run, they
+         generate files in the build directory with code coverage
+         metrics.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/>
+         for more information.</phrase> This option is for use only with GCC
+         and when doing development work.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Ddtrace=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>DTrace</primary>
+         </indexterm>
+         Enabling this compiles <productname>PostgreSQL</productname> with support for the
+         dynamic tracing tool DTrace.
+         <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/>
+         for more information.</phrase>
+        </para>
+
+        <para>
+         To point to the <command>dtrace</command> program, the
+         environment variable <envar>DTRACE</envar> can be set.  This
+         will often be necessary because <command>dtrace</command> is
+         typically installed under <filename>/usr/sbin</filename>,
+         which might not be in your <envar>PATH</envar>.
+        </para>
+
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-misc">
+    <title>Miscellaneous</title>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term>
+       <listitem>
+        <para>
+         Set <replaceable>NUMBER</replaceable> as the default port number for
+         server and clients. The default is 5432. The port can always
+         be changed later on, but if you specify it here then both
+         server and clients will have the same default compiled in,
+         which can be very convenient.  Usually the only good reason
+         to select a non-default value is if you intend to run multiple
+         <productname>PostgreSQL</productname> servers on the same machine.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term>
+       <listitem>
+        <para>
+         The default name of the Kerberos service principal used
+         by GSSAPI.
+         <literal>postgres</literal> is the default. There's usually no
+         reason to change this unless you are building for a Windows
+         environment, in which case it must be set to upper case
+         <literal>POSTGRES</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+ </sect2>
+
+ <sect2 id="build-meson">
+  <title>Building the source</title>
+   <para>
+    By default, <productname>Meson</productname> uses the
+    <ulink url="https://ninja-build.org/"> Ninja build system</ulink>.
+    To build <productname>PostgreSQL</productname> from source using meson, you can
+    simply use the <literal>ninja</literal> command in the build directory.
+<screen>
+ninja
+</screen>
+     Ninja will automatically detect the number of CPUs in your computer and
+     parallelize itself accordingly. You can override the amount of parallel
+     processes used with the command line argument <literal>-j</literal>.
+   </para>
+
+   <para>
+     It should be noted that after the initial configure step
+     <command>ninja</command> is the only command you ever need to type to
+     compile. No matter how you alter your source tree (short of moving it to
+     a completely new location), Meson will detect the changes and regenerate
+     itself accordingly. This is especially handy if you have multiple build
+     directories. Often one of them is used for development (the "debug" build)
+     and others only every now and then (such as a "static analysis" build).
+     Any configuration can be built just by cd'ing to the corresponding directory
+     and running Ninja.
+   </para>
+
+   <para>
+     If you'd like to build with a backend other that ninja, you can use configure
+     with the <option>--backend</option> option to select the one you want to use and then
+     build using <literal>meson compile</literal>. To learn more about these
+     backends and other arguments you can provide to ninja, you can refer to the
+     meson <ulink url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
+     documentation</ulink>.
+   </para>
+ </sect2>
+
+ <sect2 id="install-files-meson">
+  <title>Installing the files</title>
+   <para>
+    Once Postgres is built, you can install it by simply running the
+    <literal>ninja install</literal> command.
+
+<screen>
+ninja install
+</screen>
+   </para>
+
+   <para>
+    This will install files into the directories that were specified
+    in <xref linkend="configure-meson"/>. Make sure that you have appropriate
+    permissions to write into that area. You might need to do this
+    step as root. Alternatively, you can create the target directories
+    in advance and arrange for appropriate permissions to be granted.
+    The standard installation provides all the header files needed for client
+    application development as well as for server-side program
+    development, such as custom functions or data types written in C.
+   </para>
+
+   <para>
+    <literal>ninja install</literal> should work for most cases
+    but if you'd like to use more options, you could also use
+    <literal>meson install</literal> instead. You can learn more about
+    <ulink url="https://mesonbuild.com/Commands.html#install">meson install</ulink>
+    and it's options in the meson documentation.
+   </para>
+
+   <para>
+    Depending on your platform and setup, you might have to perform a
+    few steps after installation. Those are outlined in
+    <xref linkend="install-post"/>.
+   </para>
+
+  <formalpara>
+   <title>Uninstallation:</title>
+   <para>
+    To undo the installation, you can use the <command>ninja
+    uninstall</command> command.
+   </para>
+  </formalpara>
+
+  <formalpara>
+   <title>Cleaning:</title>
+   <para>
+    After the installation you can free disk space by removing the built
+    files from the source tree with the <command>ninja clean</command>
+    command.
+   </para>
+  </formalpara>
+
+ </sect2>
+
+ <sect2 id="running-tests">
+  <title>Running tests</title>
+   <para>
+    If you want to test the newly built server, you can run the regression
+    tests. The regression tests are a collection of test suites to verify
+    that <productname>PostgreSQL</productname> runs on your machine in
+    the way the developers expected it to. To run them, simply type:
+<screen>
+<userinput>meson test</userinput>
+</screen>
+    You can repeat this at any later time by issuing the same command.
+   </para>
+
+   <para>Meson also allows you to list tests and run specific tests or suites.
+<screen>
+# List all tests
+<userinput>meson test --list</userinput>
+
+# Run a specific test
+<userinput>meson test recovery/001_stream_rep</userinput>
+
+# Run the main pg_regress and isolation tests
+<userinput>meson test --suite main</userinput>
+</screen>
+   </para>
+
+   <para>
+    To learn more about running the tests and how to interpret the results
+    you can refer to the documentation for interpreting test results.
+     <literal>meson test</literal> also provides a number of additional
+    options you can use which can be found in the
+    <ulink url="https://mesonbuild.com/Unit-tests.html#testing-tool">meson test documentation</ulink>.
+   </para>
+
+ </sect2>
+
+ </sect1>
+
  <sect1 id="install-post">
   <title>Post-Installation Setup</title>
 
@@ -2106,62 +3797,6 @@ export MANPATH
   </sect2>
  </sect1>
 
- <sect1 id="supported-platforms">
-  <title>Supported Platforms</title>
-
-  <para>
-   A platform (that is, a CPU architecture and operating system combination)
-   is considered supported by the <productname>PostgreSQL</productname> development
-   community if the code contains provisions to work on that platform and
-   it has recently been verified to build and pass its regression tests
-   on that platform.  Currently, most testing of platform compatibility
-   is done automatically by test machines in the
-   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
-   If you are interested in using <productname>PostgreSQL</productname> on a platform
-   that is not represented in the build farm, but on which the code works
-   or can be made to work, you are strongly encouraged to set up a build
-   farm member machine so that continued compatibility can be assured.
-  </para>
-
-  <para>
-   In general, <productname>PostgreSQL</productname> can be expected to work on
-   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
-   and PA-RISC, including
-   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
-   It is often
-   possible to build on an unsupported CPU type by configuring with
-   <option>--disable-spinlocks</option>, but performance will be poor.
-  </para>
-
-  <para>
-   <productname>PostgreSQL</productname> can be expected to work on current
-   versions of these operating systems: Linux, Windows,
-   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
-   Other Unix-like systems may also work but are not currently
-   being tested.  In most cases, all CPU architectures supported by
-   a given operating system will work.  Look in
-   <xref linkend="installation-platform-notes"/> below to see if
-   there is information
-   specific to your operating system, particularly if using an older system.
-  </para>
-
-  <para>
-   If you have installation problems on a platform that is known
-   to be supported according to recent build farm results, please report
-   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
-   in porting <productname>PostgreSQL</productname> to a new platform,
-   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
-   to discuss that.
-  </para>
-
-  <para>
-   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
-   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
-   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
-   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
-   Tru64 UNIX, and ULTRIX.
-  </para>
- </sect1>
 
  <sect1 id="installation-platform-notes">
   <title>Platform-Specific Notes</title>
@@ -2170,7 +3805,7 @@ export MANPATH
    This section documents additional platform-specific issues
    regarding the installation and setup of PostgreSQL.  Be sure to
    read the installation instructions, and in
-   particular <xref linkend="install-requirements"/> as well.  Also,
+   particular <xref linkend="install-requirements-make"/> as well.  Also,
    check <xref linkend="regress"/> regarding the
    interpretation of regression test results.
   </para>
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 1d9509a2f66..214e1b1d551 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -7072,7 +7072,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
    explicitly tell the configure script to make the probes available
    in <productname>PostgreSQL</productname>. To include DTrace support
    specify <option>--enable-dtrace</option> to configure.  See <xref
-   linkend="install-procedure"/> for further information.
+   linkend="configure-options-devel"/> for further information.
   </para>
   </sect2>
 
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index f268265a838..7a1d220175b 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1855,7 +1855,7 @@ $ <userinput>kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</userinput
     <step>
      <para>
       Install the new version of <productname>PostgreSQL</productname> as
-      outlined in <xref linkend="install-procedure"/>.
+      outlined in <xref linkend="installation"/>.
      </para>
     </step>
 
diff --git a/doc/src/sgml/sourcerepo.sgml b/doc/src/sgml/sourcerepo.sgml
index 0ed7f8a3fea..f16be29a61a 100644
--- a/doc/src/sgml/sourcerepo.sgml
+++ b/doc/src/sgml/sourcerepo.sgml
@@ -20,9 +20,10 @@
    Note that building <productname>PostgreSQL</productname> from the source
    repository requires reasonably up-to-date versions of <application>bison</application>,
    <application>flex</application>, and <application>Perl</application>. These tools are not needed
-   to build from a distribution tarball, because the files that these tools
+   to build from a distribution tarball if building via make, because the files that these tools
    are used to build are included in the tarball.  Other tool requirements
-   are the same as shown in <xref linkend="install-requirements"/>.
+   are the same as shown in <xref linkend="install-requirements-make"/> and
+   <xref linkend="install-requirements-meson"/>.
   </para>
 
  <sect1 id="git">
-- 
2.37.3.542.gdd3f6c4cae

v16-0007-meson-Add-PGXS-compatibility.patchtext/x-diff; charset=us-asciiDownload
From 6d2a49f68340acaf4974ed5e9c35d9261a5be9cf Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 20:27:17 -0700
Subject: [PATCH v16 07/16] meson: Add PGXS compatibility

This works for some extensions on some operating systems, but could use plenty
of cleanups.
---
 src/meson.build | 259 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 259 insertions(+)

diff --git a/src/meson.build b/src/meson.build
index b515af15bfa..ca99db42baa 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,3 +10,262 @@ subdir('bin')
 subdir('pl')
 
 subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to only use a single
+# buildsystem across all the supported postgres versions. Once all supported
+# PG versions support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+  'PACKAGE_URL': pg_url,
+  'PACKAGE_VERSION': pg_version,
+  'PG_MAJORVERSION': pg_version_major,
+  'PG_VERSION_NUM': pg_version_num,
+  'configure_input': 'meson',
+
+  'vpath_build': 'yes',
+  'autodepend': 'no', # XXX: Should we just set this to true when possible?
+
+  'host_cpu': host_cpu,
+  'host': '@0@-@1@'.format(host_cpu, host_system),
+  'host_os': host_system,
+  'build_os': build_machine.system(),
+  'PORTNAME': portname,
+  'PG_SYSROOT': pg_sysroot,
+
+  'abs_top_builddir': meson.build_root(),
+  'abs_top_srcdir': meson.source_root(),
+
+  'enable_thread_safety': 'yes',
+  'enable_rpath': 'yes',
+  'enable_nls': libintl.found() ? 'yes' : 'no',
+  'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no',
+  'enable_debug': get_option('debug') ? 'yes' : 'no',
+  'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+  'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+  'DLSUFFIX': dlsuffix,
+  'EXEEXT': exesuffix,
+
+  'SUN_STUDIO_CC': 'no', # not supported so far
+
+  'default_port': get_option('pgport'),
+  'with_system_tzdata': get_option('system_tzdata'),
+
+  'with_krb_srvnam': get_option('krb_srvnam'),
+  'krb_srvtab': krb_srvtab,
+
+  # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+  'STRIP': 'strip',
+  'STRIP_STATIC_LIB': 'strip -x',
+  'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+  # Just always use the install_sh fallback that autoconf uses. Unlikely to
+  # matter performance-wise for extensions. If it turns out to do, we can
+  # improve that later.
+  'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+  'CC': var_cc,
+  'CPP': var_cpp,
+  'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld'] ? 'yes' : 'no'),
+
+  'CFLAGS': var_cflags,
+  'CPPFLAGS': var_cppflags,
+  'CXXFLAGS': var_cxxflags,
+  'CFLAGS_SL': var_cflags_sl,
+  'CFLAGS_SL_MODULE': ' '.join(cflags_mod),
+  'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod),
+  'CFLAGS_SSE42': ' '.join(cflags_crc),
+  'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+  'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+  # FIXME:
+  'CFLAGS_ARMV8_CRC32C': '',
+  'BITCODE_CFLAGS': '',
+  'BITCODE_CXXFLAGS': '',
+
+  'LDFLAGS': var_ldflags,
+  'LDFLAGS_EX': var_ldflags_ex,
+  'LDFLAGS_SL': var_ldflags_sl,
+
+  'BISONFLAGS': ' '.join(bison_flags),
+  'FLEXFLAGS': ' '.join(flex_flags),
+
+  'LIBS': var_libs,
+}
+
+if llvm.found()
+  pgxs_kv += {
+    'CLANG': clang.path(),
+    'CXX': ' '.join(cpp.cmd_array()),
+    'LLVM_BINPATH': llvm_binpath,
+  }
+else
+  pgxs_kv += {
+    'CLANG': '',
+    'CXX': '',
+    'LLVM_BINPATH': '',
+  }
+endif
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+  'BISON': bison,
+  'FLEX': flex,
+  'GZIP': gzip,
+  'LZ4': program_lz4,
+  'PERL': perl,
+  'PROVE': prove,
+  'PYTHON': python,
+  'TAR': tar,
+  'ZSTD': program_zstd,
+  'DTRACE': dtrace,
+  'LD': ld_program,
+  'install_bin': install_sh,
+}
+foreach b, p : pgxs_bins
+  pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+pgxs_empty = [
+  'PERMIT_DECLARATION_AFTER_STATEMENT',
+  'ICU_CFLAGS', # needs to be added, included by public server headers
+
+  # probably need most of these?
+  'RANLIB',
+  'WINDRES',
+  'LN_S',
+  'AR',
+  'AWK',
+
+  # hard to see why we'd need either?
+  'ZIC',
+  'TCLSH',
+
+  # docs don't seem to be supported by pgxs
+  'XMLLINT',
+  'XSLTPROC',
+  'DBTOEPUB',
+  'FOP',
+
+  # supporting coverage for pgxs-in-meson build doesn't seem worth it
+  'GENHTML',
+  'LCOV',
+  'GCOV',
+  'MSGFMT_FLAGS',
+
+  # translation doesn't appear to be supported by pgxs
+  'MSGFMT',
+  'XGETTEXT',
+  'MSGMERGE',
+  'WANTED_LANGUAGES',
+
+  # Not needed because we don't build the server / PLs with the generated makefile
+  'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+  'DTRACEFLAGS', # only server has dtrace probes
+
+  'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+  'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+  # possible that some of these are referenced explicitly in pgxs makefiles?
+  # For now not worth it.
+  'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD',
+
+  'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+  'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+  'UUID_LIBS',
+
+  'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+  'ICU_LIBS',
+]
+
+foreach pe : pgxs_empty
+  pgxs_cdata.set(pe, '')
+endforeach
+
+pgxs_dirs = {
+  'prefix': get_option('prefix'),
+
+  'bindir': '${exec_prefix}' / get_option('bindir'),
+  'datarootdir': '${prefix}' / get_option('datadir'),
+  'datadir': '${datarootdir}',
+  'docdir': '${prefix}' / dir_doc,
+  'exec_prefix': '${prefix}',
+  'htmldir': '${prefix}' / dir_doc_html, #?
+  'includedir': '${prefix}' / get_option('includedir'),
+  'libdir': '${exec_prefix}' / get_option('libdir'),
+  'localedir': '${prefix}' / get_option('localedir'),
+  'mandir': '${prefix}' / get_option('mandir'),
+  'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+foreach d, p : pgxs_dirs
+  pgxs_cdata.set(d, p)
+endforeach
+
+pgxs_deps = {
+  'bonjour': bonjour,
+  'bsd_auth': bsd_auth,
+  'gssapi': gssapi,
+  'icu': icu,
+  'ldap': ldap,
+  'libxml': libxml,
+  'libxslt': libxslt,
+  'llvm': llvm,
+  'lz4': lz4,
+  'nls': libintl,
+  'pam': pam,
+  'perl': perl_dep,
+  'python': python3_dep,
+  'readline': readline,
+  'selinux': selinux,
+  'systemd': systemd,
+  'tcl': tcl_dep,
+  'zlib': zlib,
+  'zstd': zstd,
+}
+foreach d, v : pgxs_deps
+  pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+pgxs_cdata.set('with_ssl', get_option('ssl'))
+pgxs_cdata.set('with_uuid', uuidopt)
+
+makefile_global = configure_file(
+  input: 'Makefile.global.in',
+  output: 'Makefile.global',
+  configuration: pgxs_cdata,
+  install: true,
+  install_dir: dir_pgxs / 'src',
+)
+configure_files += makefile_global
+
+# FIXME: check if exists
+makefile_port = configure_file(
+  input: 'makefiles' / 'Makefile.@0@'.format(portname),
+  output: 'Makefile.port',
+  copy: true,
+  install_dir: dir_pgxs / 'src')
+configure_files += makefile_port
+
+install_data(
+  'Makefile.shlib', 'nls-global.mk',
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'makefiles/pgxs.mk',
+  install_dir: dir_pgxs / 'src' / 'makefiles')
-- 
2.37.3.542.gdd3f6c4cae

v16-0008-meson-Add-postgresql-extension.pc-for-building-e.patchtext/x-diff; charset=us-asciiDownload
From 28d7143ad8d35c097d1d22609d838c19b5b5b984 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:52:03 -0700
Subject: [PATCH v16 08/16] meson: Add postgresql-extension.pc for building
 extension libraries

This should work with several other buildsystems.

TODO: Docs and example
---
 src/backend/meson.build | 96 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/src/backend/meson.build b/src/backend/meson.build
index fefa40ddb64..0598085a240 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -180,6 +180,102 @@ pg_mod_args = default_mod_args + {
 
 
 
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = pg_mod_c_args
+pg_ext_libs = [backend_mod_code, thread_dep, ldflags, ldflags_mod]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+  if incdir.startswith('src/include')
+    subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+  else
+    subincdir = ''
+  endif
+  pg_ext_subdirs += subincdir
+
+  # Add directories in source / build dir containing headers to cflags for the
+  # -uninstalled.pc
+  pg_ext_vars_uninst += [
+    'build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+    'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir),
+  ]
+  pg_ext_cflags += [
+    '${build_inc@0@}'.format(i),
+    '${src_inc@0@}'.format(i)
+  ]
+
+  i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags += cflags
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'pkglibdir=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_mod=${pkglibdir}'
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+# referenced on some platforms, via mod_link_with_dir
+pg_ext_vars += 'bindir=${prefix}/@0@'.format(dir_bin)
+
+# XXX: Define variables making it easy to define tests, too
+
+# Some platforms need linker flags to link with binary, they are the same
+# between building with meson and .pc file, except that we have have to
+# reference a variable to make it work for both normal and -uninstalled .pc
+# files.
+if mod_link_args_fmt.length() != 0
+  assert(link_with_inst != '')
+  assert(link_with_uninst != '')
+
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format(link_with_inst)
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(link_with_uninst)
+
+  foreach el : mod_link_args_fmt
+    pg_ext_libs += el.format('${mod_link_with}')
+  endforeach
+endif
+
+# main .pc to build extensions
+pkgconfig.generate(
+  name: 'postgresql-extension',
+  description: 'PostgreSQL Extension Support',
+  url: pg_url,
+
+  subdirs: pg_ext_subdirs,
+  libraries: pg_ext_libs,
+  extra_cflags: pg_ext_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+  name: 'postgresql-extension-warnings',
+  description: 'PostgreSQL Extension Support - Compiler Warnings',
+  requires: 'postgresql-extension',
+  url: pg_url,
+  extra_cflags: cflags_warn,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+
 # Shared modules that, on some system, link against the server binary. Only
 # enter these after we defined the server build.
 
-- 
2.37.3.542.gdd3f6c4cae

v16-0009-meson-Add-LLVM-bitcode-emission.patchtext/x-diff; charset=us-asciiDownload
From d769f2afca679643e1b7f63358fceee23fb46491 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 19:58:45 -0700
Subject: [PATCH v16 09/16] meson: Add LLVM bitcode emission

This needs a bit more love before being ready...
---
 src/backend/jit/llvm/meson.build | 21 +++++++++++++++
 src/backend/meson.build          | 46 ++++++++++++++++++++++++++++++++
 meson.build                      |  2 ++
 src/tools/irlink                 | 43 +++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+)
 create mode 100644 src/tools/irlink

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index 5fb63768358..5b339e33934 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -54,6 +54,19 @@ else
   llvm_irgen_command = clang
 endif
 
+llvm_irlink_kw = {
+  'command': [
+    irlink,
+    '--name', 'postgres',
+    '--lto', llvm_lto,
+    '--outdir', '@OUTPUT0@',
+    '--privdir', '@PRIVATE_DIR@',
+    '@INPUT@',
+  ],
+  'install': true,
+  'install_dir': dir_lib_pkg,
+}
+
 
 # XXX: Need to determine proper version of the function cflags for clang
 bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
@@ -77,3 +90,11 @@ llvmjit_types = custom_target('llvmjit_types.bc',
   depfile: '@BASENAME@.c.bc.d',
 )
 backend_targets += llvmjit_types
+
+# Figure out -I's needed to build all postgres code, including all its
+# dependencies
+pkg_config = find_program(['pkg-config', 'pkgconf'], required: true)
+r = run_command(pkg_config,
+  ['--cflags-only-I', meson.build_root() / 'meson-uninstalled/postgresql-extension-uninstalled.pc'],
+  check: true)
+bitcode_cflags += r.stdout().split()
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 0598085a240..1cb4cd3431f 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -284,3 +284,49 @@ subdir('replication/libpqwalreceiver')
 subdir('replication/pgoutput')
 subdir('snowball')
 subdir('utils/mb/conversion_procs')
+
+
+
+###############################################################
+# emit LLVM bitcode of backend code for JIT inlining
+###############################################################
+
+if llvm.found()
+
+  # custom_target() insists on targeting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generators don't accept CustomTargetIndex as input or 'depends', nor do
+  # they like targets with more than one output. However, a custom target
+  # accepts them as input without a problem. So we have the below transitive
+  # target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args + bitcode_cflags,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: '@PLAINNAME@.bc',
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('bitcode',
+    output: ['bitcode'],
+    input: bc_backend_sources,
+    kwargs: llvm_irlink_kw,
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/meson.build b/meson.build
index 8323adf772b..2b0cbb9a5a7 100644
--- a/meson.build
+++ b/meson.build
@@ -684,6 +684,8 @@ if not llvmopt.disabled()
 
     ccache = find_program('ccache', native: true, required: false)
     clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+    irlink = find_program('src/tools/irlink', native: true)
   endif
 else
   llvm = not_found_dep
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..813bbf13398
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(
+    description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+    shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = []
+for input in args.INPUT:
+    file_names += [args.name + input.replace(args.privdir, '')]
+
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink',
+           '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v16-0010-windows-Set-UMDF_USING_NTSTATUS-globally-include.patchtext/x-diff; charset=us-asciiDownload
From 6eaef1813979d0d6da7a949765327077559bf939 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 11:06:20 -0700
Subject: [PATCH v16 10/16] windows: Set UMDF_USING_NTSTATUS globally, include
 ntstatus.h

We'd like to use precompiled headers on windows to reduce compile times. Right
now we rely on defining WIN32_NO_STATUS before including postgres.h in a few
select places - which doesn't work with precompiled headers.  Instead define
it globally.

When UMDF_USING_NTSTATUS is defined we need to explicitly include ntstatus.h,
winternl.h to get a comparable set of symbols. Right now these includes would
be required in a number of non-platform-specific .c files - to avoid that,
include them in win32_port.h. Based on my measurements that doesn't increase
compile times measurably.
---
 src/include/port/win32_port.h | 9 +++++++++
 src/include/port/win32ntdll.h | 6 ------
 src/port/open.c               | 2 --
 src/port/win32fdatasync.c     | 2 --
 src/port/win32ntdll.c         | 2 --
 src/port/win32stat.c          | 2 --
 6 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h
index 707f8760cab..67382245504 100644
--- a/src/include/port/win32_port.h
+++ b/src/include/port/win32_port.h
@@ -48,12 +48,21 @@
  * significantly.  WIN32_LEAN_AND_MEAN reduces that a bit. It'd be better to
  * remove the include of windows.h (as well as indirect inclusions of it) from
  * such a central place, but until then...
+ *
+ * To be able to include ntstatus.h tell windows.h to not declare NTSTATUS by
+ * temporarily defining UMDF_USING_NTSTATUS, otherwise we'll get warning about
+ * macro redefinitions, as windows.h also defines NTSTATUS (yuck). That in
+ * turn requires including ntstatus.h, winternl.h to get common symbols.
  */
 #define WIN32_LEAN_AND_MEAN
+#define UMDF_USING_NTSTATUS
 
 #include <winsock2.h>
 #include <ws2tcpip.h>
 #include <windows.h>
+#include <ntstatus.h>
+#include <winternl.h>
+
 #undef small
 #include <process.h>
 #include <signal.h>
diff --git a/src/include/port/win32ntdll.h b/src/include/port/win32ntdll.h
index 34cebddd542..6d13a18b395 100644
--- a/src/include/port/win32ntdll.h
+++ b/src/include/port/win32ntdll.h
@@ -14,12 +14,6 @@
 #ifndef WIN32NTDLL_H
 #define WIN32NTDLL_H
 
-/*
- * Because this includes NT headers that normally conflict with Win32 headers,
- * any translation unit that includes it should #define UMDF_USING_NTSTATUS
- * before including <windows.h>.
- */
-
 #include <ntstatus.h>
 #include <winternl.h>
 
diff --git a/src/port/open.c b/src/port/open.c
index 8c09c7c1f77..fd4faf604ea 100644
--- a/src/port/open.c
+++ b/src/port/open.c
@@ -13,8 +13,6 @@
 
 #ifdef WIN32
 
-#define UMDF_USING_NTSTATUS
-
 #ifndef FRONTEND
 #include "postgres.h"
 #else
diff --git a/src/port/win32fdatasync.c b/src/port/win32fdatasync.c
index 31d631c6962..a5431615ab2 100644
--- a/src/port/win32fdatasync.c
+++ b/src/port/win32fdatasync.c
@@ -11,8 +11,6 @@
  *-------------------------------------------------------------------------
  */
 
-#define UMDF_USING_NTSTATUS
-
 #ifdef FRONTEND
 #include "postgres_fe.h"
 #else
diff --git a/src/port/win32ntdll.c b/src/port/win32ntdll.c
index eb614077543..db3e5fa251f 100644
--- a/src/port/win32ntdll.c
+++ b/src/port/win32ntdll.c
@@ -13,8 +13,6 @@
  *-------------------------------------------------------------------------
  */
 
-#define UMDF_USING_NTSTATUS
-
 #include "c.h"
 
 #include "port/win32ntdll.h"
diff --git a/src/port/win32stat.c b/src/port/win32stat.c
index 26443293d78..5f3d0d22ff4 100644
--- a/src/port/win32stat.c
+++ b/src/port/win32stat.c
@@ -15,8 +15,6 @@
 
 #ifdef WIN32
 
-#define UMDF_USING_NTSTATUS
-
 #include "c.h"
 #include "port/win32ntdll.h"
 
-- 
2.37.3.542.gdd3f6c4cae

v16-0011-windows-adjust-FD_SETSIZE-via-commandline-define.patchtext/x-diff; charset=us-asciiDownload
From 03df45cc055bb3adbc3882e0036a7e3537f8af0c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 12:07:29 -0700
Subject: [PATCH v16 11/16] windows: adjust FD_SETSIZE via commandline define

This is a prerequisite to using precompiled headers.
---
 src/fe_utils/Makefile        |  4 ++++
 src/fe_utils/meson.build     |  1 +
 src/fe_utils/parallel_slot.c |  4 ++--
 src/bin/pgbench/Makefile     |  2 ++
 src/bin/pgbench/meson.build  |  2 ++
 src/bin/pgbench/pgbench.c    |  4 ++--
 src/tools/msvc/Mkvcbuild.pm  | 17 +++++++++++++++--
 7 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/fe_utils/Makefile b/src/fe_utils/Makefile
index 44bc7a1215d..40d4b1d8698 100644
--- a/src/fe_utils/Makefile
+++ b/src/fe_utils/Makefile
@@ -34,6 +34,10 @@ OBJS = \
 	simple_list.o \
 	string_utils.o
 
+ifeq ($(PORTNAME), win32)
+override CFLAGS += -DFD_SETSIZE=1024
+endif
+
 all: libpgfeutils.a
 
 libpgfeutils.a: $(OBJS)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index b6bf8e1ca21..3e226c260ac 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -24,6 +24,7 @@ fe_utils_sources += psqlscan
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
   include_directories: [postgres_inc, libpq_inc],
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   dependencies: frontend_common_code,
   kwargs: default_lib_args,
 )
diff --git a/src/fe_utils/parallel_slot.c b/src/fe_utils/parallel_slot.c
index 2be2903c9c6..767256757f2 100644
--- a/src/fe_utils/parallel_slot.c
+++ b/src/fe_utils/parallel_slot.c
@@ -12,8 +12,8 @@
  *-------------------------------------------------------------------------
  */
 
-#ifdef WIN32
-#define FD_SETSIZE 1024			/* must set before winsock2.h is included */
+#if defined(WIN32) && FD_SETSIZE < 1024
+#error FD_SETSIZE needs to have been increased
 #endif
 
 #include "postgres_fe.h"
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
index 6647c9fe97d..68e9f03e79f 100644
--- a/src/bin/pgbench/Makefile
+++ b/src/bin/pgbench/Makefile
@@ -18,6 +18,8 @@ LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
 
 ifneq ($(PORTNAME), win32)
 override CFLAGS += $(PTHREAD_CFLAGS)
+else
+override CFLAGS += -DFD_SETSIZE=1024
 endif
 LIBS += $(PTHREAD_LIBS)
 
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index a32eb51fe07..1a3ec5d1295 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -27,6 +27,8 @@ pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
   include_directories: include_directories('.'),
+  c_pch: pch_postgres_fe_h,
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   kwargs: default_bin_args,
 )
 bin_targets += pgbench
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index aa1a3541fe6..7da7c36fbe6 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -27,8 +27,8 @@
  *
  */
 
-#ifdef WIN32
-#define FD_SETSIZE 1024			/* must set before winsock2.h is included */
+#if defined(WIN32) && FD_SETSIZE < 1024
+#error FD_SETSIZE needs to have been increased
 #endif
 
 #include "postgres_fe.h"
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index ddb4f25eb12..4d1e4f4e4d4 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -35,6 +35,7 @@ my $libpq;
 my @unlink_on_exit;
 
 # Set of variables for modules in contrib/ and src/test/modules/
+my $contrib_defines        = {};
 my @contrib_uselibpq       = ();
 my @contrib_uselibpgport   = ();
 my @contrib_uselibpgcommon = ();
@@ -52,6 +53,7 @@ my @contrib_excludes       = (
 	'unsafe_tests');
 
 # Set of variables for frontend modules
+my $frontend_defines = { 'pgbench' => 'FD_SETSIZE=1024' };
 my @frontend_uselibpq =
   ('pg_amcheck', 'pg_ctl', 'pg_upgrade', 'pgbench', 'psql', 'initdb');
 my @frontend_uselibpgport = (
@@ -175,6 +177,7 @@ sub mkvcbuild
 
 	$libpgfeutils = $solution->AddProject('libpgfeutils', 'lib', 'misc');
 	$libpgfeutils->AddDefine('FRONTEND');
+	$libpgfeutils->AddDefine('FD_SETSIZE=1024');
 	$libpgfeutils->AddIncludeDir('src/interfaces/libpq');
 	$libpgfeutils->AddFiles('src/fe_utils', @pgfeutilsfiles);
 
@@ -1120,7 +1123,8 @@ sub AdjustContribProj
 {
 	my $proj = shift;
 	AdjustModule(
-		$proj,                  \@contrib_uselibpq,
+		$proj,                  $contrib_defines,
+		\@contrib_uselibpq,
 		\@contrib_uselibpgport, \@contrib_uselibpgcommon,
 		$contrib_extralibs,     $contrib_extrasource,
 		$contrib_extraincludes);
@@ -1131,7 +1135,8 @@ sub AdjustFrontendProj
 {
 	my $proj = shift;
 	AdjustModule(
-		$proj,                   \@frontend_uselibpq,
+		$proj,                   $frontend_defines,
+		\@frontend_uselibpq,
 		\@frontend_uselibpgport, \@frontend_uselibpgcommon,
 		$frontend_extralibs,     $frontend_extrasource,
 		$frontend_extraincludes);
@@ -1141,6 +1146,7 @@ sub AdjustFrontendProj
 sub AdjustModule
 {
 	my $proj                  = shift;
+	my $module_defines        = shift;
 	my $module_uselibpq       = shift;
 	my $module_uselibpgport   = shift;
 	my $module_uselibpgcommon = shift;
@@ -1149,6 +1155,13 @@ sub AdjustModule
 	my $module_extraincludes  = shift;
 	my $n                     = $proj->{name};
 
+    if ($module_defines->{$n})
+    {
+        foreach my $d ($module_defines->{$n})
+        {
+            $proj->AddDefine($d);
+        }
+    }
 	if (grep { /^$n$/ } @{$module_uselibpq})
 	{
 		$proj->AddIncludeDir('src\interfaces\libpq');
-- 
2.37.3.542.gdd3f6c4cae

v16-0012-meson-Add-support-for-building-with-precompiled-.patchtext/x-diff; charset=us-asciiDownload
From e2c068a251ddd37850bfa2ffc3133abfcd08235c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 23 Sep 2022 12:19:17 -0700
Subject: [PATCH v16 12/16] meson: Add support for building with precompiled
 headers

This substantially speeds up building for windows. A cross build with mingw
goes from

real	0m29.884s
user	15m41.900s
sys	1m58.257s

to

real	0m13.196s
user	6m52.330s
sys	1m15.140s

The wins on windows are similar-ish (but I don't have a system at hand just
now for actual numbers).
---
 src/include/meson.build           | 1 +
 src/include/pch/c_pch.h           | 1 +
 src/include/pch/meson.build       | 4 ++++
 src/include/pch/postgres_fe_pch.h | 1 +
 src/include/pch/postgres_pch.h    | 1 +
 src/common/meson.build            | 2 ++
 src/port/meson.build              | 2 ++
 src/backend/meson.build           | 5 +++++
 src/backend/snowball/meson.build  | 1 +
 src/fe_utils/meson.build          | 1 +
 src/bin/pg_dump/meson.build       | 1 +
 src/bin/pg_upgrade/meson.build    | 1 +
 src/bin/psql/meson.build          | 1 +
 src/interfaces/libpq/meson.build  | 1 +
 src/pl/plperl/meson.build         | 1 +
 src/pl/plpgsql/src/meson.build    | 1 +
 src/pl/plpython/meson.build       | 1 +
 src/pl/tcl/meson.build            | 1 +
 contrib/bloom/meson.build         | 1 +
 contrib/btree_gist/meson.build    | 1 +
 contrib/hstore/meson.build        | 1 +
 contrib/pg_trgm/meson.build       | 1 +
 contrib/pgcrypto/meson.build      | 1 +
 contrib/pgstattuple/meson.build   | 1 +
 contrib/sepgsql/meson.build       | 1 +
 contrib/xml2/meson.build          | 1 +
 .cirrus.yml                       | 4 ++--
 meson.build                       | 1 +
 28 files changed, 38 insertions(+), 2 deletions(-)
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/meson.build
 create mode 100644 src/include/pch/postgres_fe_pch.h
 create mode 100644 src/include/pch/postgres_pch.h

diff --git a/src/include/meson.build b/src/include/meson.build
index e5390df0584..28ed9011c70 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -110,6 +110,7 @@ install_headers(
 
 subdir('catalog')
 subdir('nodes')
+subdir('pch')
 subdir('storage')
 subdir('utils')
 
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..2bcec49c3a2
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,4 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
+pch_postgres_fe_h = meson.source_root() / meson.current_source_dir() / 'postgres_fe_pch.h'
diff --git a/src/include/pch/postgres_fe_pch.h b/src/include/pch/postgres_fe_pch.h
new file mode 100644
index 00000000000..f3ea20912d3
--- /dev/null
+++ b/src/include/pch/postgres_fe_pch.h
@@ -0,0 +1 @@
+#include "postgres_fe.h"
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/common/meson.build b/src/common/meson.build
index 23842e1ffef..1c9b8a3a018 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -147,6 +147,7 @@ foreach name, opts : pgcommon_variants
     endif
     c_args = opts.get('c_args', []) + common_cflags[cflagname]
     cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'sources': sources,
@@ -159,6 +160,7 @@ foreach name, opts : pgcommon_variants
 
   lib = static_library('libpgcommon@0@'.format(name),
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
diff --git a/src/port/meson.build b/src/port/meson.build
index ced2e014db8..c2222696f1b 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -161,6 +161,7 @@ foreach name, opts : pgport_variants
     c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
     cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
       sources,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'c_args': c_args,
         'build_by_default': false,
@@ -172,6 +173,7 @@ foreach name, opts : pgport_variants
   lib = static_library('libpgport@0@'.format(name),
       pgport_sources,
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
       }
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 1cb4cd3431f..a535543ee9e 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -62,6 +62,7 @@ postgres_lib = static_library('postgres_lib',
   backend_sources + timezone_sources + generated_backend_sources,
   link_whole: backend_link_with,
   dependencies: backend_build_deps,
+  c_pch: pch_postgres_h,
   kwargs: internal_lib_args,
 )
 
@@ -81,6 +82,10 @@ if cc.get_id() == 'msvc'
 
   backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
   backend_link_depends += postgres_def
+  # Due to the way msvc and meson's precompiled headers implementation
+  # interact, we need to have symbols from the full library available. Could
+  # be restricted to b_pch=true.
+  backend_link_with += postgres_lib
 
 elif host_system == 'aix'
   # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 974401d187e..72959fa29d6 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -66,6 +66,7 @@ endif
 
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
+  c_pch: pch_postgres_h,
   kwargs: pg_mod_args + {
     'include_directories': [stemmer_inc],
   }
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index 3e226c260ac..fe0b801387c 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -23,6 +23,7 @@ fe_utils_sources += psqlscan
 
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
+  c_pch: pch_postgres_fe_h,
   include_directories: [postgres_inc, libpq_inc],
   c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   dependencies: frontend_common_code,
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 3527a25c288..e66f632b54e 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -13,6 +13,7 @@ pg_dump_common_sources = files(
 
 pg_dump_common = static_library('libpgdump_common',
   pg_dump_common_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq, zlib],
   kwargs: internal_lib_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index a7b927a45c7..212bc9ce6ef 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -24,6 +24,7 @@ endif
 
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 1264fc19fbd..a4c46bf5385 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -44,6 +44,7 @@ endif
 
 psql = executable('psql',
   psql_sources,
+  c_pch: pch_postgres_fe_h,
   include_directories: include_directories('.'),
   dependencies: [frontend_code, libpq, readline],
   kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 2c9edeaa088..72102521edc 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -49,6 +49,7 @@ libpq_st = static_library('libpq',
   pic: true,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
+  c_pch: pch_postgres_fe_h,
   dependencies: libpq_deps,
   kwargs: default_lib_args,
 )
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 535660085dd..cd3894e6a73 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -45,6 +45,7 @@ endif
 
 plperl = shared_module('plperl',
   plperl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plperl_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [perl_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index c46c0a1da2a..27b2f5ef529 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -48,6 +48,7 @@ endif
 
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
+  c_pch: pch_postgres_h,
   include_directories: include_directories('.'),
   kwargs: pg_mod_args,
 )
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 40888386b5f..7bd683580e8 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -36,6 +36,7 @@ endif
 
 plpython = shared_module('plpython3',
   plpython_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plpython_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [python3_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index f09bb14c950..7a708776c99 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -22,6 +22,7 @@ endif
 
 pltcl = shared_module('pltcl',
   pltcl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [include_directories('.'), postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [tcl_dep, pg_mod_args['dependencies']],
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 16f3b83e4d2..163a93c98fb 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -15,6 +15,7 @@ endif
 
 bloom = shared_module('bloom',
   bloom_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += bloom
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index e98c91dacc8..bfb7865d213 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -33,6 +33,7 @@ endif
 
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gist
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 2bb26bb772b..a2a4ec36cb0 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -18,6 +18,7 @@ endif
 
 hstore = shared_module('hstore',
   hstore_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index c8c7c07b308..839d6c4a7f6 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -13,6 +13,7 @@ endif
 
 pg_trgm = shared_module('pg_trgm',
   pg_trgm_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index 7fc7bbc7ca1..cc782578b49 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -78,6 +78,7 @@ endif
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
   },
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 05e4cd46a5c..42d0b0e6ce9 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -12,6 +12,7 @@ endif
 
 pgstattuple = shared_module('pgstattuple',
   pgstattuple_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 8bef239e3c2..1ac0fa388ab 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -22,6 +22,7 @@ endif
 
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [selinux, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 89b0d677516..92ab3368428 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -15,6 +15,7 @@ endif
 
 xml2 = shared_module('pgxml',
   xml2_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/.cirrus.yml b/.cirrus.yml
index efb2d2c4832..aea25fd7525 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -602,7 +602,7 @@ task:
   # Use /DEBUG:FASTLINK to avoid high memory usage during linking
   configure_script: |
     vcvarsall x64
-    meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+    meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Db_pch=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
 
   build_script: |
     vcvarsall x64
@@ -630,7 +630,7 @@ task:
 
   configure_script: |
     vcvarsall x64
-    meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+    meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
 
   build_script: |
     vcvarsall x64
diff --git a/meson.build b/meson.build
index 2b0cbb9a5a7..c50a414628d 100644
--- a/meson.build
+++ b/meson.build
@@ -15,6 +15,7 @@ project('postgresql',
   meson_version: '>=0.54',
   default_options: [
     'warning_level=1', #-Wall equivalent
+    'b_pch=false',
     'buildtype=release',
   ]
 )
-- 
2.37.3.542.gdd3f6c4cae

v16-0013-meson-Add-xmllint-xsltproc-wrapper-script-to-han.patchtext/x-diff; charset=us-asciiDownload
From ba346385c066b62fc952a8a8c2c760a19df8bb8a Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 08:49:45 -0700
Subject: [PATCH v16 13/16] meson: Add xmllint/xsltproc wrapper script to
 handle dependencies automatically

---
 doc/src/sgml/meson.build          | 38 ++++++++++++++------
 doc/src/sgml/xmltools_dep_wrapper | 60 +++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 10 deletions(-)
 create mode 100644 doc/src/sgml/xmltools_dep_wrapper

diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
index ba2a261e7a4..e6781d0deae 100644
--- a/doc/src/sgml/meson.build
+++ b/doc/src/sgml/meson.build
@@ -2,7 +2,7 @@ docs = []
 alldocs = []
 doc_generated = []
 
-xmllint = find_program(get_option('XMLLINT'), native: true, required: false)
+xmllint_bin = find_program(get_option('XMLLINT'), native: true, required: false)
 
 
 version_sgml = configure_file(
@@ -60,14 +60,23 @@ doc_generated += custom_target('keywords-table.sgml',
 )
 
 # For everything else we need at least xmllint
-if not xmllint.found()
+if not xmllint_bin.found()
   subdir_done()
 endif
 
 pandoc = find_program('pandoc', native: true, required: false)
-xsltproc = find_program(get_option('XSLTPROC'), native: true, required: false)
+xsltproc_bin = find_program(get_option('XSLTPROC'), native: true, required: false)
 fop = find_program('fop', native: true, required: false)
 
+xmltools_wrapper = [
+  python, files('xmltools_dep_wrapper'),
+  '--targetname', '@OUTPUT@', '--depfile', '@DEPFILE@'
+]
+
+xmllint = xmltools_wrapper + [
+  '--tool', xmllint_bin, '--',
+]
+
 # Run validation only once, common to all subsequent targets.  While
 # we're at it, also resolve all entities (that is, copy all included
 # files into one big file).  This helps tools that don't understand
@@ -75,6 +84,7 @@ fop = find_program('fop', native: true, required: false)
 postgres_full_xml = custom_target('postgres-full.xml',
   input: 'postgres.sgml',
   output: 'postgres-full.xml',
+  depfile: 'postgres-full.xml.d',
   command: [xmllint, '--noent', '--valid', '--path', '@OUTDIR@', '-o', '@OUTPUT@', '@INPUT@'],
   depends: doc_generated,
   build_by_default: false,
@@ -86,18 +96,20 @@ alldocs += postgres_full_xml
 #
 # Full documentation as html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   xsltproc_flags = [
     '--stringparam', 'pg.version', pg_version,
     '--param', 'website.stylesheet', '1'
   ]
 
+  xsltproc = xmltools_wrapper + [
+    '--tool', xsltproc_bin, '--',
+  ]
 
-  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
-  # depfile
   html = custom_target('html',
     input: ['stylesheet.xsl', postgres_full_xml],
     output: 'html',
+    depfile: 'html.d',
     depends: doc_generated,
     command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -110,6 +122,7 @@ if xsltproc.found()
   html_help = custom_target('html_help',
     input: ['stylesheet-hh.xsl', postgres_full_xml],
     output: 'htmlhelp',
+    depfile: 'htmlhelp.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -121,6 +134,7 @@ if xsltproc.found()
   postgres_html = custom_target('postgres.html',
     input: ['stylesheet-html-nochunk.xsl', postgres_full_xml],
     output: 'postgres.html',
+    depfile: 'postgres.html.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -144,10 +158,11 @@ endif
 #
 # INSTALL in html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   install_xml = custom_target('INSTALL.xml',
     input: ['standalone-profile.xsl', 'standalone-install.xml'],
     output: 'INSTALL.xml',
+    depfile: 'INSTALL.xml.d',
     depends: doc_generated + [postgres_full_xml],
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
     build_by_default: false,
@@ -155,6 +170,7 @@ if xsltproc.found()
   install_html = custom_target('INSTALL.html',
     input: ['stylesheet-text.xsl', install_xml],
     output: 'INSTALL.html',
+    depfile: 'INSTALL.html.d',
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
@@ -177,11 +193,12 @@ endif
 #
 # Man pages
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   # FIXME: implement / consider sqlmansectnum logic
   man = custom_target('man',
     input: ['stylesheet-man.xsl', postgres_full_xml],
     output: ['man1', 'man3', 'man7'],
+    depfile: 'man.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -195,7 +212,7 @@ endif
 #
 # Full documentation as PDF
 #
-if fop.found() and xsltproc.found()
+if fop.found() and xsltproc_bin.found()
   xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
 
   foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
@@ -206,6 +223,7 @@ if fop.found() and xsltproc.found()
       input: ['stylesheet-fo.xsl', postgres_full_xml],
       output: [postgres_x_fo_f],
       depends: doc_generated,
+      depfile: postgres_x_fo_f + '.d',
       command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
                 '--stringparam', 'paper.type', detail,
                 '-o', '@OUTPUT@', '@INPUT@'],
@@ -230,7 +248,7 @@ endif
 # This was previously implemented using dbtoepub - but that doesn't seem to
 # support running in build != source directory (i.e. VPATH builds already
 # weren't supported).
-if pandoc.found() and xsltproc.found()
+if pandoc.found() and xsltproc_bin.found()
   postgres_epub = custom_target('postgres.epub',
     input: postgres_full_xml,
     output: 'postgres.epub',
diff --git a/doc/src/sgml/xmltools_dep_wrapper b/doc/src/sgml/xmltools_dep_wrapper
new file mode 100644
index 00000000000..52b94e3fcaf
--- /dev/null
+++ b/doc/src/sgml/xmltools_dep_wrapper
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+import argparse
+import re
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(
+    description='generate dependency file for docs')
+
+parser.add_argument('--targetname', type=str, required=False, nargs='+')
+parser.add_argument('--depfile', type=str, required=False)
+parser.add_argument('--tool', type=str, required=True)
+
+parser.add_argument('flags', nargs='*')
+
+args = parser.parse_args()
+
+if args.depfile:
+    depfile_result_list = []
+
+    command = [args.tool, '--load-trace'] + args.flags
+    # --load-trace flag displays all the documents
+    # loaded during the processing to stderr
+    res = subprocess.run(command, stderr=subprocess.PIPE,
+                         universal_newlines=True)
+    # if exit code is different than 0, exit
+    if res.returncode:
+        exit(res.returncode)
+
+    # get line start from targetname
+    line_start = ''
+    for name in args.targetname:
+        line_start = line_start + name + ' '
+    line_start = line_start.strip() + ': '
+
+    # collect only file paths
+    line_re = re.compile('^Loaded URL="([^"]+)"')
+    with open(args.depfile, 'w') as f:
+        for line in res.stderr.split('\n'):
+            if line == '':
+                continue
+            m = re.match(line_re, line)
+
+            # continue to show errors
+            if m is None:
+                print(line, file=sys.stderr)
+                continue
+
+            fname = m.group(1)
+            if fname.startswith('http:'):
+                continue
+            if fname.startswith('file://'):
+                fname = fname.split('file://')[1]
+            f.write(line_start + fname + '\n')
+
+else:
+    command = [args.tool] + args.flags
+    res = subprocess.run(command)
+    exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v16-0014-meson-wip-headerchecks-cpluspluschecks.patchtext/x-diff; charset=us-asciiDownload
From d6770d00c7d07717115b37d9708b1068bb6c0014 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 24 Sep 2022 11:02:21 -0700
Subject: [PATCH v16 14/16] meson: wip: headerchecks cpluspluschecks

---
 src/include/meson.build            | 4 ++--
 src/meson.build                    | 7 +++++++
 src/tools/pginclude/cpluspluscheck | 4 ++--
 src/tools/pginclude/headerscheck   | 4 ++--
 4 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/include/meson.build b/src/include/meson.build
index 28ed9011c70..41bae9b0a53 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -42,8 +42,8 @@ config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
 
 var_cc = ' '.join(cc.cmd_array())
 var_cpp = ' '.join(cc.cmd_array() + ['-E'])
-var_cflags = ' '.join(cflags + cflags_warn)
-var_cxxflags = ' '.join(cxxflags + cxxflags_warn)
+var_cflags = ' '.join(cflags + cflags_warn + ['-Wall'])
+var_cxxflags = ' '.join(cxxflags + cxxflags_warn + ['-Wall'])
 var_cppflags = ' '.join(cppflags)
 var_cflags_sl = '-fPIC' #FIXME
 var_ldflags = ' '.join(ldflags)
diff --git a/src/meson.build b/src/meson.build
index ca99db42baa..1891e11cb26 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -269,3 +269,10 @@ install_data(
 install_data(
   'makefiles/pgxs.mk',
   install_dir: dir_pgxs / 'src' / 'makefiles')
+
+
+run_target('headerscheck',
+  command: [files('tools/pginclude/headerscheck'), '@SOURCE_ROOT@', '@BUILD_ROOT@'])
+
+run_target('cpluspluscheck',
+  command: [files('tools/pginclude/cpluspluscheck'), '@SOURCE_ROOT@', '@BUILD_ROOT@'])
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index b393f2a2eaa..aeaaaa67479 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -166,9 +166,9 @@ do
 	# Some subdirectories need extra -I switches.
 	case "$f" in
 	    src/pl/plperl/*)
-		EXTRAINCLUDES="$perl_includespec" ;;
+		EXTRAINCLUDES="$perl_includespec"; continue; ;;
 	    src/pl/plpython/*)
-		EXTRAINCLUDES="$python_includespec" ;;
+		EXTRAINCLUDES="$python_includespec"; continue; ;;
 	    src/interfaces/ecpg/*)
 		EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;;
 		src/backend/parser/*)
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 2a39856f88c..cc195ccc88f 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -149,9 +149,9 @@ do
 	# Some subdirectories need extra -I switches.
 	case "$f" in
 	    src/pl/plperl/*)
-		EXTRAINCLUDES="$perl_includespec" ;;
+		EXTRAINCLUDES="$perl_includespec"; continue; ;;
 	    src/pl/plpython/*)
-		EXTRAINCLUDES="$python_includespec" ;;
+		EXTRAINCLUDES="$python_includespec"; continue; ;;
 	    src/interfaces/ecpg/*)
 		EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;;
 	    src/backend/parser/*)
-- 
2.37.3.542.gdd3f6c4cae

v16-0015-tests-Rename-conflicting-role-names.patchtext/x-diff; charset=us-asciiDownload
From 6ea1a4608aeb1b34b62289a6bc697c57e35e25f8 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 16:49:51 -0700
Subject: [PATCH v16 15/16] tests: Rename conflicting role names

These cause problems when running installcheck concurrently.
---
 src/pl/plperl/expected/plperl_setup.out       | 30 +++++++++----------
 src/pl/plperl/sql/plperl_setup.sql            | 30 +++++++++----------
 contrib/adminpack/expected/adminpack.out      | 20 ++++++-------
 contrib/adminpack/sql/adminpack.sql           | 20 ++++++-------
 .../passwordcheck/expected/passwordcheck.out  | 16 +++++-----
 contrib/passwordcheck/sql/passwordcheck.sql   | 16 +++++-----
 6 files changed, 66 insertions(+), 66 deletions(-)

diff --git a/src/pl/plperl/expected/plperl_setup.out b/src/pl/plperl/expected/plperl_setup.out
index 5234febefd6..5537a95ccc2 100644
--- a/src/pl/plperl/expected/plperl_setup.out
+++ b/src/pl/plperl/expected/plperl_setup.out
@@ -4,9 +4,9 @@
 -- Before going ahead with the to-be-tested installations, verify that
 -- a non-superuser is allowed to install plperl (but not plperlu) when
 -- suitable permissions have been granted.
-CREATE USER regress_user1;
-CREATE USER regress_user2;
-SET ROLE regress_user1;
+CREATE USER regress_plperl_user1;
+CREATE USER regress_plperl_user2;
+SET ROLE regress_plperl_user1;
 CREATE EXTENSION plperl;  -- fail
 ERROR:  permission denied to create extension "plperl"
 HINT:  Must have CREATE privilege on current database to create this extension.
@@ -16,18 +16,18 @@ HINT:  Must be superuser to create this extension.
 RESET ROLE;
 DO $$
 begin
-  execute format('grant create on database %I to regress_user1',
+  execute format('grant create on database %I to regress_plperl_user1',
                  current_database());
 end;
 $$;
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 CREATE EXTENSION plperl;
 CREATE EXTENSION plperlu;  -- fail
 ERROR:  permission denied to create extension "plperlu"
 HINT:  Must be superuser to create this extension.
 CREATE SCHEMA plperl_setup_scratch;
 SET search_path = plperl_setup_scratch;
-GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_user2;
+GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_plperl_user2;
 CREATE FUNCTION foo1() returns int language plperl as '1;';
 SELECT foo1();
  foo1 
@@ -38,15 +38,15 @@ SELECT foo1();
 -- Must reconnect to avoid failure with non-MULTIPLICITY Perl interpreters
 \c -
 SET search_path = plperl_setup_scratch;
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 -- Should be able to change privileges on the language
 revoke all on language plperl from public;
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user2;
 CREATE FUNCTION foo2() returns int language plperl as '2;';  -- fail
 ERROR:  permission denied for language plperl
-SET ROLE regress_user1;
-grant usage on language plperl to regress_user2;
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user1;
+grant usage on language plperl to regress_plperl_user2;
+SET ROLE regress_plperl_user2;
 CREATE FUNCTION foo2() returns int language plperl as '2;';
 SELECT foo2();
  foo2 
@@ -54,7 +54,7 @@ SELECT foo2();
     2
 (1 row)
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 -- Should be able to drop the extension, but not the language per se
 DROP LANGUAGE plperl CASCADE;
 ERROR:  cannot drop language plperl because extension plperl requires it
@@ -65,9 +65,9 @@ DETAIL:  drop cascades to function foo1()
 drop cascades to function foo2()
 -- Clean up
 RESET ROLE;
-DROP OWNED BY regress_user1;
-DROP USER regress_user1;
-DROP USER regress_user2;
+DROP OWNED BY regress_plperl_user1;
+DROP USER regress_plperl_user1;
+DROP USER regress_plperl_user2;
 -- Now install the versions that will be used by subsequent test scripts.
 CREATE EXTENSION plperl;
 CREATE EXTENSION plperlu;
diff --git a/src/pl/plperl/sql/plperl_setup.sql b/src/pl/plperl/sql/plperl_setup.sql
index a89cf56617e..0eac9156294 100644
--- a/src/pl/plperl/sql/plperl_setup.sql
+++ b/src/pl/plperl/sql/plperl_setup.sql
@@ -6,10 +6,10 @@
 -- a non-superuser is allowed to install plperl (but not plperlu) when
 -- suitable permissions have been granted.
 
-CREATE USER regress_user1;
-CREATE USER regress_user2;
+CREATE USER regress_plperl_user1;
+CREATE USER regress_plperl_user2;
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 CREATE EXTENSION plperl;  -- fail
 CREATE EXTENSION plperlu;  -- fail
@@ -18,18 +18,18 @@ RESET ROLE;
 
 DO $$
 begin
-  execute format('grant create on database %I to regress_user1',
+  execute format('grant create on database %I to regress_plperl_user1',
                  current_database());
 end;
 $$;
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 CREATE EXTENSION plperl;
 CREATE EXTENSION plperlu;  -- fail
 CREATE SCHEMA plperl_setup_scratch;
 SET search_path = plperl_setup_scratch;
-GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_user2;
+GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_plperl_user2;
 
 CREATE FUNCTION foo1() returns int language plperl as '1;';
 SELECT foo1();
@@ -38,25 +38,25 @@ SELECT foo1();
 \c -
 SET search_path = plperl_setup_scratch;
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 -- Should be able to change privileges on the language
 revoke all on language plperl from public;
 
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user2;
 
 CREATE FUNCTION foo2() returns int language plperl as '2;';  -- fail
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
-grant usage on language plperl to regress_user2;
+grant usage on language plperl to regress_plperl_user2;
 
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user2;
 
 CREATE FUNCTION foo2() returns int language plperl as '2;';
 SELECT foo2();
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 -- Should be able to drop the extension, but not the language per se
 DROP LANGUAGE plperl CASCADE;
@@ -64,9 +64,9 @@ DROP EXTENSION plperl CASCADE;
 
 -- Clean up
 RESET ROLE;
-DROP OWNED BY regress_user1;
-DROP USER regress_user1;
-DROP USER regress_user2;
+DROP OWNED BY regress_plperl_user1;
+DROP USER regress_plperl_user1;
+DROP USER regress_plperl_user2;
 
 -- Now install the versions that will be used by subsequent test scripts.
 CREATE EXTENSION plperl;
diff --git a/contrib/adminpack/expected/adminpack.out b/contrib/adminpack/expected/adminpack.out
index 76aafe6316a..6bcf2217f25 100644
--- a/contrib/adminpack/expected/adminpack.out
+++ b/contrib/adminpack/expected/adminpack.out
@@ -36,10 +36,10 @@ SELECT pg_read_file('test_file1');
 
 -- disallowed file paths for non-superusers and users who are
 -- not members of pg_write_server_files
-CREATE ROLE regress_user1;
-GRANT pg_read_all_settings TO regress_user1;
-GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_user1;
-SET ROLE regress_user1;
+CREATE ROLE regress_adminpack_user1;
+GRANT pg_read_all_settings TO regress_adminpack_user1;
+GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_adminpack_user1;
+SET ROLE regress_adminpack_user1;
 SELECT pg_file_write('../test_file0', 'test0', false);
 ERROR:  path must be in or below the current directory
 SELECT pg_file_write('/tmp/test_file0', 'test0', false);
@@ -53,9 +53,9 @@ SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4'
 SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false);
 ERROR:  absolute path not allowed
 RESET ROLE;
-REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_user1;
-REVOKE pg_read_all_settings FROM regress_user1;
-DROP ROLE regress_user1;
+REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_adminpack_user1;
+REVOKE pg_read_all_settings FROM regress_adminpack_user1;
+DROP ROLE regress_adminpack_user1;
 -- sync
 SELECT pg_file_sync('test_file1'); -- sync file
  pg_file_sync 
@@ -153,8 +153,8 @@ SELECT pg_file_unlink('test_file4');
 (1 row)
 
 -- superuser checks
-CREATE USER regress_user1;
-SET ROLE regress_user1;
+CREATE USER regress_adminpack_user1;
+SET ROLE regress_adminpack_user1;
 SELECT pg_file_write('test_file0', 'test0', false);
 ERROR:  permission denied for function pg_file_write
 SELECT pg_file_sync('test_file0');
@@ -167,6 +167,6 @@ ERROR:  permission denied for function pg_file_unlink
 SELECT pg_logdir_ls();
 ERROR:  permission denied for function pg_logdir_ls
 RESET ROLE;
-DROP USER regress_user1;
+DROP USER regress_adminpack_user1;
 -- no further tests for pg_logdir_ls() because it depends on the
 -- server's logging setup
diff --git a/contrib/adminpack/sql/adminpack.sql b/contrib/adminpack/sql/adminpack.sql
index 918d0bdc65e..5776c9af0d1 100644
--- a/contrib/adminpack/sql/adminpack.sql
+++ b/contrib/adminpack/sql/adminpack.sql
@@ -14,20 +14,20 @@ SELECT pg_read_file('test_file1');
 
 -- disallowed file paths for non-superusers and users who are
 -- not members of pg_write_server_files
-CREATE ROLE regress_user1;
+CREATE ROLE regress_adminpack_user1;
 
-GRANT pg_read_all_settings TO regress_user1;
-GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_user1;
+GRANT pg_read_all_settings TO regress_adminpack_user1;
+GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_adminpack_user1;
 
-SET ROLE regress_user1;
+SET ROLE regress_adminpack_user1;
 SELECT pg_file_write('../test_file0', 'test0', false);
 SELECT pg_file_write('/tmp/test_file0', 'test0', false);
 SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4', false);
 SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false);
 RESET ROLE;
-REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_user1;
-REVOKE pg_read_all_settings FROM regress_user1;
-DROP ROLE regress_user1;
+REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_adminpack_user1;
+REVOKE pg_read_all_settings FROM regress_adminpack_user1;
+DROP ROLE regress_adminpack_user1;
 
 -- sync
 SELECT pg_file_sync('test_file1'); -- sync file
@@ -59,8 +59,8 @@ SELECT pg_file_unlink('test_file4');
 
 
 -- superuser checks
-CREATE USER regress_user1;
-SET ROLE regress_user1;
+CREATE USER regress_adminpack_user1;
+SET ROLE regress_adminpack_user1;
 
 SELECT pg_file_write('test_file0', 'test0', false);
 SELECT pg_file_sync('test_file0');
@@ -69,7 +69,7 @@ SELECT pg_file_unlink('test_file0');
 SELECT pg_logdir_ls();
 
 RESET ROLE;
-DROP USER regress_user1;
+DROP USER regress_adminpack_user1;
 
 
 -- no further tests for pg_logdir_ls() because it depends on the
diff --git a/contrib/passwordcheck/expected/passwordcheck.out b/contrib/passwordcheck/expected/passwordcheck.out
index e04cda6bd95..2f917169eb6 100644
--- a/contrib/passwordcheck/expected/passwordcheck.out
+++ b/contrib/passwordcheck/expected/passwordcheck.out
@@ -1,19 +1,19 @@
 LOAD 'passwordcheck';
-CREATE USER regress_user1;
+CREATE USER regress_passwordcheck_user1;
 -- ok
-ALTER USER regress_user1 PASSWORD 'a_nice_long_password';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'a_nice_long_password';
 -- error: too short
-ALTER USER regress_user1 PASSWORD 'tooshrt';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'tooshrt';
 ERROR:  password is too short
 -- error: contains user name
-ALTER USER regress_user1 PASSWORD 'xyzregress_user1';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'xyzregress_passwordcheck_user1';
 ERROR:  password must not contain user name
 -- error: contains only letters
-ALTER USER regress_user1 PASSWORD 'alessnicelongpassword';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'alessnicelongpassword';
 ERROR:  password must contain both letters and nonletters
 -- encrypted ok (password is "secret")
-ALTER USER regress_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
 -- error: password is user name
-ALTER USER regress_user1 PASSWORD 'md5e589150ae7d28f93333afae92b36ef48';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md507a112732ed9f2087fa90b192d44e358';
 ERROR:  password must not equal user name
-DROP USER regress_user1;
+DROP USER regress_passwordcheck_user1;
diff --git a/contrib/passwordcheck/sql/passwordcheck.sql b/contrib/passwordcheck/sql/passwordcheck.sql
index d98796ac494..df0f9ac0d39 100644
--- a/contrib/passwordcheck/sql/passwordcheck.sql
+++ b/contrib/passwordcheck/sql/passwordcheck.sql
@@ -1,23 +1,23 @@
 LOAD 'passwordcheck';
 
-CREATE USER regress_user1;
+CREATE USER regress_passwordcheck_user1;
 
 -- ok
-ALTER USER regress_user1 PASSWORD 'a_nice_long_password';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'a_nice_long_password';
 
 -- error: too short
-ALTER USER regress_user1 PASSWORD 'tooshrt';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'tooshrt';
 
 -- error: contains user name
-ALTER USER regress_user1 PASSWORD 'xyzregress_user1';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'xyzregress_passwordcheck_user1';
 
 -- error: contains only letters
-ALTER USER regress_user1 PASSWORD 'alessnicelongpassword';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'alessnicelongpassword';
 
 -- encrypted ok (password is "secret")
-ALTER USER regress_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
 
 -- error: password is user name
-ALTER USER regress_user1 PASSWORD 'md5e589150ae7d28f93333afae92b36ef48';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md507a112732ed9f2087fa90b192d44e358';
 
-DROP USER regress_user1;
+DROP USER regress_passwordcheck_user1;
-- 
2.37.3.542.gdd3f6c4cae

v16-0016-meson-Add-installcheck-equivalent.patchtext/x-diff; charset=us-asciiDownload
From f92a4bf5b7697f4496971b6ce975b4482bc6ef01 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 16:57:01 -0700
Subject: [PATCH v16 16/16] meson: Add installcheck equivalent

run all tests that support running against existing server:
$ meson test --setup running

run just the main pg_regress tests against existing server:
$ meson test --setup running main/regress-running
---
 contrib/basic_archive/meson.build             |  1 +
 contrib/pg_freespacemap/meson.build           |  3 ++
 contrib/pg_stat_statements/meson.build        |  4 ++
 contrib/pg_walinspect/meson.build             |  3 ++
 contrib/test_decoding/meson.build             |  5 ++
 src/interfaces/ecpg/test/meson.build          |  1 +
 src/test/isolation/meson.build                |  3 ++
 src/test/modules/commit_ts/meson.build        |  3 ++
 src/test/modules/snapshot_too_old/meson.build |  3 ++
 src/test/modules/test_oat_hooks/meson.build   |  1 +
 src/test/modules/test_pg_dump/meson.build     |  2 +
 src/test/modules/worker_spi/meson.build       |  4 +-
 src/test/regress/meson.build                  |  3 ++
 .cirrus.yml                                   | 15 ++++++
 meson.build                                   | 48 +++++++++++++++++--
 15 files changed, 93 insertions(+), 6 deletions(-)

diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index c30dcfa5d41..d4ecaec47b8 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -25,5 +25,6 @@ tests += {
     'regress_args': [
       '--temp-config', files('basic_archive.conf'),
     ],
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index 904b37b6e9b..f802e297b67 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -33,5 +33,8 @@ tests += {
     'regress_args': [
       '--temp-config', files('pg_freespacemap.conf')
     ],
+    # Disabled because these tests require "autovacuum=off", which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index 854df138e76..bd0e42331eb 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -41,5 +41,9 @@ tests += {
       'pg_stat_statements',
     ],
     'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+    # Disabled because these tests require
+    # "shared_preload_libraries=pg_stat_statements", which typical
+    # runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index 4314a3182a2..351f184de83 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -28,6 +28,9 @@ tests += {
     'sql': [
       'pg_walinspect',
     ],
+    # Disabled because these tests require "wal_level=replica", which
+    # some runningcheck users do not have (e.g. buildfarm clients).
     'regress_args': ['--temp-config', files('walinspect.conf')],
+    'runningcheck': false,
   },
 }
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index 6376103c689..a1aaae2dc3f 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -43,6 +43,9 @@ tests += {
     'regress_args': [
       '--temp-config', files('logical.conf'),
     ],
+    # Disabled because these tests require "wal_level=logical", which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
   'isolation': {
     'specs': [
@@ -60,6 +63,8 @@ tests += {
     'regress_args': [
       '--temp-config', files('logical.conf'),
     ],
+    # see above
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index f67f2dffb71..98343d41760 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -85,6 +85,7 @@ tests += {
     'test_kwargs': {
       'depends': ecpg_test_dependencies,
     },
+    'dbname': 'ecpg1_regression,ecpg2_regression',
     'regress_args': ecpg_regress_args,
   },
 }
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index ba27b8c1d44..8737392f23b 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -67,5 +67,8 @@ tests += {
       'priority': 40,
       'timeout': 1000,
     },
+    # checks pg_locks etc
+    'runningcheck-parallel': false,
+    'dbname': 'isolation',
   },
 }
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
index 60cb12164d2..fa86e70e880 100644
--- a/src/test/modules/commit_ts/meson.build
+++ b/src/test/modules/commit_ts/meson.build
@@ -6,6 +6,9 @@ tests += {
     'sql': [
       'commit_timestamp',
     ],
+    # Disabled because these tests require "track_commit_timestamp = on",
+    # which typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
index efd3f1f113b..5094b52949b 100644
--- a/src/test/modules/snapshot_too_old/meson.build
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -10,5 +10,8 @@ tests += {
       'sto_using_hash_index',
     ],
     'regress_args': ['--temp-config', files('sto.conf')],
+    # Disabled because these tests require "old_snapshot_threshold" >= 0, which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 8802bbbac55..e9d09d92c30 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -25,5 +25,6 @@ tests += {
       'test_oat_hooks',
     ],
     'regress_args': ['--no-locale', '--encoding=UTF8'],
+    'runningcheck': false,
   },
 }
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
index 41021829f3a..73f1fcf9428 100644
--- a/src/test/modules/test_pg_dump/meson.build
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -13,6 +13,8 @@ tests += {
     'sql': [
       'test_pg_dump',
     ],
+    # doesn't delete its user
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index a4a158c75b9..660d721eea9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -30,6 +30,8 @@ tests += {
     'sql': [
       'worker_spi',
     ],
-    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+    'dbname': 'contrib_regression',
+    'regress_args': ['--temp-config', files('dynamic.conf')],
+    'runningcheck': false,
   },
 }
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index 963c0f64ed5..a781fa2af1d 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -64,5 +64,8 @@ tests += {
       'priority': 50,
       'timeout': 1000,
     },
+    'dbname': 'regression',
+    # checks pg_locks etc
+    'runningcheck-parallel': false,
   },
 }
diff --git a/.cirrus.yml b/.cirrus.yml
index aea25fd7525..7a39e753a2e 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -121,6 +121,21 @@ task:
       meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
     EOF
 
+  # test runningcheck, freebsd chosen because it's currently fast enough
+  test_running_script: |
+    su postgres <<-EOF
+      set -e
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --quiet --suite setup
+      export LD_LIBRARY_PATH="$(pwd)/build/tmp_install/usr/local/lib/:$LD_LIBRARY_PATH"
+      mkdir build/testrun
+      build/tmp_install/usr/local/bin/initdb -N build/runningcheck --no-instructions -A trust
+      echo "include '$(pwd)/src/tools/ci/pg_ci_base.conf'" >> build/runningcheck/postgresql.conf
+      build/tmp_install/usr/local/bin/pg_ctl -c -o '-c fsync=off' -D build/runningcheck -l build/testrun/runningcheck.log start
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS} --setup running
+      build/tmp_install/usr/local/bin/pg_ctl -D build/runningcheck stop
+    EOF
+
   on_failure:
     <<: *on_failure_meson
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
diff --git a/meson.build b/meson.build
index c50a414628d..89f3ecbf662 100644
--- a/meson.build
+++ b/meson.build
@@ -2889,6 +2889,21 @@ endif
 # Test Generation
 ###############################################################
 
+# when using a meson version understanding exclude_suites, define a 'default'
+# test setup that excludes tests running against a pre-existing install and a
+# 'running' setup that conflicts with creation of the temporary installation
+# and tap tests (which don't support running against a running server).
+if meson.version().version_compare('>=0.57')
+  add_test_setup('default',
+    is_default: true,
+    exclude_suites: ['running'])
+  add_test_setup('running',
+    exclude_suites: ['temp-install', 'setup', 'tap'])
+  runningcheck = true
+else
+  runningcheck = false
+endif
+
 testwrap = files('src/tools/testwrap')
 
 foreach test_dir : tests
@@ -2917,18 +2932,27 @@ foreach test_dir : tests
 
       test_output = test_result_dir / test_dir['name'] / kind
 
+      # unless specified by the test, choose a non-conflicting database name,
+      # to avoid conflicts when running against existing server.
+      dbname = t.get('dbname',
+        'regression_@0@_@1@'.format(test_dir['name'], kind))
+
       test_command = [
         runner.full_path(),
         '--inputdir', t.get('inputdir', test_dir['sd']),
         '--expecteddir', t.get('expecteddir', test_dir['sd']),
         '--outputdir', test_output,
-        '--temp-instance', test_output / 'tmp_check',
         '--bindir', '',
         '--dlpath', test_dir['bd'],
         '--max-concurrent-tests=20',
-        '--port', testport.to_string(),
+        '--dbname', dbname,
       ] + t.get('regress_args', [])
 
+      test_command_tmp_install = test_command + [
+          '--temp-instance', test_output / 'tmp_check',
+          '--port', testport.to_string(),
+        ]
+
       if t.has_key('schedule')
         test_command += ['--schedule', t['schedule'],]
       endif
@@ -2943,7 +2967,6 @@ foreach test_dir : tests
       env.prepend('PATH', temp_install_bindir, test_dir['bd'])
 
       test_kwargs = {
-        'suite': [test_dir['name']],
         'priority': 10,
         'timeout': 1000,
         'depends': test_deps + t.get('deps', []),
@@ -2954,11 +2977,26 @@ foreach test_dir : tests
         python,
         args: testwrap_base + [
           '--testname', kind,
-          '--', test_command,
+          '--', test_command_tmp_install,
         ],
+        suite: [test_dir['name'], 'temp-install'],
         kwargs: test_kwargs,
       )
 
+      # some tests can't support running against running DB
+      if runningcheck and t.get('runningcheck', true)
+        test(test_dir['name'] / kind + '-running',
+          python,
+          args: testwrap_base + [
+            '--testname', kind,
+            '--', test_command,
+          ],
+          is_parallel: t.get('runningcheck-parallel', true),
+          suite: [test_dir['name'], 'running'],
+          kwargs: test_kwargs,
+        )
+      endif
+
       testport += 1
     elif kind == 'tap'
       if not tap_tests_enabled
@@ -2982,7 +3020,7 @@ foreach test_dir : tests
 
       test_kwargs = {
         'protocol': 'tap',
-        'suite': [test_dir['name']],
+        'suite': [test_dir['name'], 'tap'],
         'timeout': 1000,
         'depends': test_deps + t.get('deps', []),
         'env': env,
-- 
2.37.3.542.gdd3f6c4cae

#348wangw.fnst@fujitsu.com
wangw.fnst@fujitsu.com
In reply to: Andres Freund (#347)
RE: [RFC] building postgres with meson - v13

Hi,

I tried to use meson and ninja and they are really efficient.
But when I tried to specify "c_args", it did not take effect.

Attached my steps:
[In the HEAD (7d708093b7)]
$ meson setup build --prefix /home/wangw/install/parallel_apply/ -Dcassert=true -Dtap_tests=enabled -Dicu=enabled -Dc_args='-fno-omit-frame-pointer'

Log:
......
Compiler Flags
CPP FLAGS : -D_GNU_SOURCE
C FLAGS, functional: -fno-strict-aliasing -fwrapv -fexcess-precision=standard
C FLAGS, warnings : -Wmissing-prototypes -Wpointer-arith -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -Wdeclaration-after-statement -Wno-format-truncation -Wno-stringop-truncation
......

After I made the below modifications, the specified "c_args" took effect.
```
@@ -2439,6 +2439,10 @@ endif

# Set up compiler / linker arguments to be used everywhere, individual targets
# can add further args directly, or indirectly via dependencies
+
+tmp_c_args = get_option('c_args')
+cflags += tmp_c_args
+
add_project_arguments(cflags, language: ['c'])
add_project_arguments(cppflags, language: ['c'])
add_project_arguments(cflags_warn, language: ['c'])
```

I might missed something. Just to confirm is there another way to add CFLAG ?

Regards,
Wang wei

#349Andres Freund
andres@anarazel.de
In reply to: wangw.fnst@fujitsu.com (#348)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-26 06:24:42 +0000, wangw.fnst@fujitsu.com wrote:

I tried to use meson and ninja and they are really efficient.
But when I tried to specify "c_args", it did not take effect.

They should take effect, but won't be shown in the summary section
currently. That currently only shows the flags chosen by the configure step,
rather than user specified ones.

After I made the below modifications, the specified "c_args" took effect.
```
@@ -2439,6 +2439,10 @@ endif

# Set up compiler / linker arguments to be used everywhere, individual targets
# can add further args directly, or indirectly via dependencies
+
+tmp_c_args = get_option('c_args')
+cflags += tmp_c_args
+
add_project_arguments(cflags, language: ['c'])
add_project_arguments(cppflags, language: ['c'])
add_project_arguments(cflags_warn, language: ['c'])
```

That'll likely end up with the same cflags added multiple times. You should
see them when building with ninja -v.

How about adding c_args to the summary, in a separate line? I think that'd
clarify what's happening?

Greetings,

Andres Freund

#350wangw.fnst@fujitsu.com
wangw.fnst@fujitsu.com
In reply to: Andres Freund (#349)
RE: [RFC] building postgres with meson - v13

On Mon, Sep 26, 2022 at 14:47 PM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-09-26 06:24:42 +0000, wangw.fnst@fujitsu.com wrote:

I tried to use meson and ninja and they are really efficient.
But when I tried to specify "c_args", it did not take effect.

They should take effect, but won't be shown in the summary section
currently. That currently only shows the flags chosen by the configure step,
rather than user specified ones.

After I made the below modifications, the specified "c_args" took effect.
```
@@ -2439,6 +2439,10 @@ endif

# Set up compiler / linker arguments to be used everywhere, individual

targets

# can add further args directly, or indirectly via dependencies
+
+tmp_c_args = get_option('c_args')
+cflags += tmp_c_args
+
add_project_arguments(cflags, language: ['c'])
add_project_arguments(cppflags, language: ['c'])
add_project_arguments(cflags_warn, language: ['c'])
```

That'll likely end up with the same cflags added multiple times. You should
see them when building with ninja -v.

Thanks for sharing the information.
I saw the user specified CFLAG when building with `ninja -v`.

But, after installing PG with command `ninja -v install`, pg_config does not
show the user specified CFLAG. Should we print this information there?

How about adding c_args to the summary, in a separate line? I think that'd
clarify what's happening?

Yes, I think it might be better.

Regards,
Wang wei

#351John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#319)
Re: [RFC] building postgres with meson - v13

On Wed, Sep 21, 2022 at 7:11 AM Andres Freund <andres@anarazel.de> wrote:

I added installation instructions for meson for a bunch of platforms, but

A couple more things for the wiki:

1) /opt/homebrew/ seems to be an "Apple silicon" path? Either way it
doesn't exist on this machine. I was able to get a working build with

/usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig

(My homebrew install doesn't seem to have anything relevant for
extra_include_dirs or extra_lib_dirs.)

2) Also, "ninja -v install" has the same line count as "ninja install" --
are there versions that do something different?

--
John Naylor
EDB: http://www.enterprisedb.com

#352Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Andres Freund (#347)
Re: [RFC] building postgres with meson - v13

On 2022-Sep-25, Andres Freund wrote:

From 3eb0ca196084da314d94d1e51c7b775012a4773c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 11:03:07 -0700
Subject: [PATCH v16 04/16] meson: Add windows resource files

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..5fb63768358 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -20,6 +20,12 @@ llvmjit_sources += files(
'llvmjit_expr.c',
)
+if host_system == 'windows'
+  llvmjit_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'llvmjit',
+    '--FILEDESC', 'llvmjit - JIT using LLVM',])
+endif

This is tediously imperative. Isn't there a more declarative way to
have it?

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"Pensar que el espectro que vemos es ilusorio no lo despoja de espanto,
sólo le suma el nuevo terror de la locura" (Perelandra, C.S. Lewis)

#353Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#342)
Re: [RFC] building postgres with meson - v13

On 24.09.22 20:09, Andres Freund wrote:

On 2022-09-24 13:52:29 -0400, Tom Lane wrote:

... btw, shouldn't the CF entry [1] get closed now?

Unfortunately not - there's quite a few followup patches that haven't been
[fully] reviewed and thus not applied yet.

Here is some review of the remaining ones (might not match exactly what
you attached, I was working off your branch):

9f789350a7a7 meson: ci: wip: move compilerwarnings task to meson

This sounds reasonable to me in principle, but I haven't followed the
cirrus stuff too closely, and it doesn't say why it's "wip". Perhaps
others could take a closer look.

ccf20a68f874 meson: ci: Add additional CI coverage

IIUC, this is just for testing your branch, not meant for master?

02d84c21b227 meson: prereq: win: remove date from version number in
win32ver.rc

do it

5c42b3e7812e meson: WIP: Add some of the windows resource files

What is the thinking on this now? What does this change over the
current state?

9bc60bccfd10 meson: Add support for relative rpaths, fixing tests on
MacOS w/ SIP

I suggest a separate thread and/or CF entry for this. There have been
various attempts to deal with SIP before, with varying results. This
is not part of the meson transition as such.

9f5be26c1215 meson: Add docs for building with meson

I do like the overall layout of this.

The "Supported Platforms" section should be moved back to near the end
of the chapter. I don't see a reason to move it forward, at least
none that is related to the meson issue.

The changes to the "Getting the Source" section are also not
appropriate for this patch.

In the section "Building and Installation with meson":

- Remove the "git clone" stuff.

- The "Running tests" section should be moved to Chapter 33. Regression
Tests.

Some copy-editing will probably be suitable, but I haven't focused on
that yet.

9c00d355d0e9 meson: Add PGXS compatibility

This looks like a reasonable direction to me. How complete is it? It
says it works for some extensions but not others. How do we define
the target line here?

3fd5e13dcad3 meson: Add postgresql-extension.pc for building extension
libraries

Separate thread for this as well. This is good and important, but we
must also add it to the make build.

4b5bfa1c19aa meson: Add LLVM bitcode emission

still in progress

eb40f6e53104 meson: Add support for building with precompiled headers

Any reason not to enable this by default? The benefits on non-Windows
appear to be less dramatic, but they are not zero. Might be better to
enable it consistently so that for example any breakage is easier
caught.

377bfdea6042 meson: Add xmllint/xsltproc wrapper script to handle
dependencies automatically

Is this part of the initial transition, required for correctness, or
is it an optional optimization? Could use more explanation. Maybe
move to separate thread also?

#354Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#352)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-26 10:41:01 +0200, Alvaro Herrera wrote:

On 2022-Sep-25, Andres Freund wrote:

From 3eb0ca196084da314d94d1e51c7b775012a4773c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 11:03:07 -0700
Subject: [PATCH v16 04/16] meson: Add windows resource files

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..5fb63768358 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -20,6 +20,12 @@ llvmjit_sources += files(
'llvmjit_expr.c',
)
+if host_system == 'windows'
+  llvmjit_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'llvmjit',
+    '--FILEDESC', 'llvmjit - JIT using LLVM',])
+endif

This is tediously imperative. Isn't there a more declarative way to
have it?

I tried to come up with something better, without success. I think it's
acceptable, even if not great.

Greetings,

Andres Freund

#355Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#353)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-26 15:01:56 +0200, Peter Eisentraut wrote:

Here is some review of the remaining ones (might not match exactly what you
attached, I was working off your branch):

Thanks, and makes sense.

9f789350a7a7 meson: ci: wip: move compilerwarnings task to meson

This sounds reasonable to me in principle, but I haven't followed the
cirrus stuff too closely, and it doesn't say why it's "wip". Perhaps
others could take a closer look.

It's mostly WIP because it doesn't yet convert all the checks, specifically
headerscheck/cpluspluscheck isn't converted yet.

ccf20a68f874 meson: ci: Add additional CI coverage

IIUC, this is just for testing your branch, not meant for master?

Yes. I think we might want to add openbsd / netbsd at some point, but that'll
be a separate thread. Until then it just catches a bunch of mistakes more
easily.

02d84c21b227 meson: prereq: win: remove date from version number in
win32ver.rc

do it

The newest version has evolved a bit, changing Project.pm as well.

5c42b3e7812e meson: WIP: Add some of the windows resource files

What is the thinking on this now? What does this change over the
current state?

The newest commit has a lot more rc files added and has this summary:

meson: Add windows resource files

The generated resource files aren't exactly the same ones as the old
buildsystems generate. Previously "InternalName" and "OriginalFileName" were
mostly wrong / not set (despite being required), but that was hard to fix in
at least the make build. Additionally, the meson build falls back to a
"auto-generated" description when not set, and doesn't set it in a few cases -
unlikely that anybody looks at these descriptions in detail.

The only thing missing rc files is the various ecpg libraries. The issue is
that we shouldn't add resource file to static libraries, so we need to split
the definitions. I'll go and do that next.

9bc60bccfd10 meson: Add support for relative rpaths, fixing tests on MacOS
w/ SIP

I suggest a separate thread and/or CF entry for this. There have been
various attempts to deal with SIP before, with varying results. This
is not part of the meson transition as such.

I think I might need to split this one more time. We don't add all the rpaths
we add with autoconf before this commit, even not on macOS, which is not
great... Nor do we have a --disable-rpath equivalent yet - I suspect we'll
need that.

/messages/by-id/20220922223729.GA721620@nathanxps13

9f5be26c1215 meson: Add docs for building with meson

I do like the overall layout of this.

The "Supported Platforms" section should be moved back to near the end
of the chapter. I don't see a reason to move it forward, at least
none that is related to the meson issue.

The changes to the "Getting the Source" section are also not
appropriate for this patch.

We don't really support building from a tarball with meson yet (you'd need to
confiure, maintainer-clean, configure meson), so it does make some sense...

9c00d355d0e9 meson: Add PGXS compatibility

This looks like a reasonable direction to me. How complete is it? It
says it works for some extensions but not others. How do we define
the target line here?

Yea, those are good questions.

How complete is it?

It's a bit hard to know. I think the most important stuff is there. But
there's no clear "API" around pgxs. E.g. we don't (yet?) have an exactly
equivalent definition of 'host', because that's very config.guess specific.

There's lots of shortcuts - e.g. with meson we don't need an equivalent to
PGAC_CHECK_STRIP, so we need to make up something for Makefile.global.

Noah suggested using $(error something), but that only works if $variable is
only used in recursively expanded variables - the errors end up confusing.

It says it works for some extensions but not others.

I think that's slightly outdated - IIRC it was about pgbouncer, but after a
fix the remaining failure is shared between autoconf and meson builds.

3fd5e13dcad3 meson: Add postgresql-extension.pc for building extension
libraries

Separate thread for this as well. This is good and important, but we
must also add it to the make build.

Makes sense.

eb40f6e53104 meson: Add support for building with precompiled headers

Any reason not to enable this by default? The benefits on non-Windows
appear to be less dramatic, but they are not zero. Might be better to
enable it consistently so that for example any breakage is easier
caught.

There's no real reason not to - the wins are small on linux, so introducing
PCH didn't seem necessary. I'm also not sure how well pch works across random
compiler versions - it's so crucial on windows that it seems like a more well
worn path there.

linux, gcc 12:

b_pch=false:
real 0m16.233s
user 6m40.375s
sys 0m48.953s

b_pch=true:
real 0m15.983s
user 6m20.357s
sys 0m49.967s

freebsd VM, clang:

b_pch=false:

real 0m23.035s
user 3m11.241s
sys 0m31.171s

b_pch=true:

real 0m21.643s
user 2m57.143s
sys 0m30.246s

Somewhat confirming my suspicions from above, gcc11 ICEs on freebsd with PCH,
and gcc12 fails with an unhelpful:
<command-line>: sorry, unimplemented: PCH allocation failure

377bfdea6042 meson: Add xmllint/xsltproc wrapper script to handle
dependencies automatically

Is this part of the initial transition, required for correctness, or
is it an optional optimization? Could use more explanation. Maybe
move to separate thread also?

It's required for correctness - in master we don't rebuild the docs when a
file changes. meson and ninja don't support wildcards (for good reasons - it
makes scanning for changes much more expensive). By using "compiler" generated
dependencies this is solved in a reliably and notationally cheap way. So I
don't think it makes sense to split this one off into a separate thread?

Greetings,

Andres Freund

#356Andres Freund
andres@anarazel.de
In reply to: John Naylor (#351)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-26 15:18:29 +0700, John Naylor wrote:

On Wed, Sep 21, 2022 at 7:11 AM Andres Freund <andres@anarazel.de> wrote:

I added installation instructions for meson for a bunch of platforms, but

A couple more things for the wiki:

1) /opt/homebrew/ seems to be an "Apple silicon" path?

Yea, it's /usr/local on x86-64, based on what was required to make macos CI
work. I updated the wiki page, half-blindly - it'd be nice if you could
confirm that that works?

I needed something like the below to get (nearly?) all dependencies working:

brewpath="/usr/local"
PKG_CONFIG_PATH="${brewpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"

for pkg in icu4c krb5 openldap openssl zstd ; do
pkgpath="${brewpath}/opt/${pkg}"
PKG_CONFIG_PATH="${pkgpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
PATH="${pkgpath}/bin:${pkgpath}/sbin:$PATH"
done

export PKG_CONFIG_PATH PATH

meson setup \
--buildtype=debug \
-Dextra_include_dirs=${brewpath}/include \
-Dextra_lib_dirs=${brewpath}/lib \
-Dcassert=true \
-Dssl=openssl -Duuid=e2fs -Ddtrace=auto \
-DPG_TEST_EXTRA="$PG_TEST_EXTRA" \
build

the per-package stuff is needed because some libraries aren't installed into
/usr/local (or /opt/homebrew), but only in a subdirectory within that.

Either way it doesn't exist on this machine. I was able to get a working
build with

/usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig

Hm - what did you need this path for - I don't think that should be needed.

(My homebrew install doesn't seem to have anything relevant for
extra_include_dirs or extra_lib_dirs.)

I think libintl.h / libintl.dylib are only in there. With meson that's the
only need for extra_include_dirs / extra_lib_dirs I found on arm apple.

2) Also, "ninja -v install" has the same line count as "ninja install" --
are there versions that do something different?

Yea, that looks like a copy-and-pasto (not even from me :)). Think I fixed it.

Greetings,

Andres Freund

#357Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#355)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-26 09:35:16 -0700, Andres Freund wrote:

9c00d355d0e9 meson: Add PGXS compatibility

This looks like a reasonable direction to me. How complete is it? It
says it works for some extensions but not others. How do we define
the target line here?

Yea, those are good questions.

How complete is it?

It's a bit hard to know. I think the most important stuff is there. But
there's no clear "API" around pgxs. E.g. we don't (yet?) have an exactly
equivalent definition of 'host', because that's very config.guess specific.

There's lots of shortcuts - e.g. with meson we don't need an equivalent to
PGAC_CHECK_STRIP, so we need to make up something for Makefile.global.

Noah suggested using $(error something), but that only works if $variable is
only used in recursively expanded variables - the errors end up confusing.

Looking through a few of the not-nicely-replaced things, I think we can
simplify at least some away:

- RANLIB: most platforms use AROPT = crs, making ranlib unnecessary. {free,
net, open}bsd don't currently, but all support it from what I know

- with_gnu_ld: this is only used on solaris, to set export_dynamic = -Wl,-E
when using a gnu ld. How about moving this to configure instead, and just
checking if -Wl,-E links?

- FLEXFLAGS: As a configure input this is afaict unused and undocumented - and
it's not clear why it'd be useful? Not that an empty replacement is a
meaningful effort

I'm not sure what to do about:
- autodepend - I'm inclined to set it to true when using a gcc like
compiler. I think extension authors won't be happy if suddenly their
extensions don't rebuild reliably anymore. An --enable-depend like
setting doesn't make sense for meson, so we don't have anything to source it
from.
- {LDAP,UUID,ICU}_{LIBS,CFLAGS} - might some extension need them?

For some others I think it's ok to not have replacement. Would be good for
somebody to check my thinking though:

- LIBOBJS, PG_CRC32C_OBJS, TAS: Not needed because we don't build
the server / PLs with the generated makefile
- ZIC: only needed to build tzdata as part of server build
- MSGFMT et al: translation doesn't appear to be supported by pgxs, correct?
- XMLLINT et al: docs don't seem to be supported by pgxs
- GENHTML et al: supporting coverage for pgxs-in-meson build doesn't seem worth it
- WINDRES: I don't think extensions are bothering to generate rc files on windows

I'll include an updated pgxs-compat patch in the next post of the series (in a
few hours).

Greetings,

Andres Freund

In reply to: Andres Freund (#347)
Re: [RFC] building postgres with meson - v13

On Sun, Sep 25, 2022 at 5:38 PM Andres Freund <andres@anarazel.de> wrote:

# run just the main pg_regress tests against existing server
meson test --setup running main/regress-running

Peter, would this address your use case?

I tried out your v16 patchset, which seems to mostly work as I'd hoped
it would. Some feedback:

* I gather that "running" as it appears in commands like "meson test
--setup running" refers to a particular setup named "running", that
you invented as part of creating a meson-ish substitute for
installcheck. Can "running" be renamed to something that makes it
obvious that it's a Postgres thing, and not a generic meson thing?

Maybe some kind of consistent naming convention would work best here.
This setup could be "pg_against_running_server", or something along
those lines.

* It would be nice if failed tests told me exactly which "diffs" file
I needed to look at, without my having to look for the message through
the meson log (or running with -v). Is this possible?

To be fair I should probably just be running -v when I run tests
against an existing running server, anyway -- so maybe I'm asking for
the wrong thing. It would at least be slightly better if I always got
to see a path to a .diffs file for failed tests, even without -v. But
it's just a "nice to have" thing -- it's not worth going out of your
way to make it work like that

* Just FYI, there are considerations about the libpq that we link to
here (actually this isn't particularly related to the new installcheck
work, but thought I'd mention it in passing).

I'm using Debian Unstable here. Like Nathan, I found that I needed a
custom -Dextra_lib_dirs just so that binaries would link against the
installation's own libpq, rather than the system libpq. This is
important-ish because linking to the wrong libpq means that I get an
error about not being able to connect via trust authentication to a
unix socket from the directory /var/run/postgresql -- confusion over
where to look for sockets visibly breaks many things.

The workaround that I have is fine, but this still seems like
something that should "just work". I believe that there is a pending
patch for this already, so enough said here.

I think it'd make sense to add a few toplevel targets to run tests in certain
ways, but I've not done that here.

I usually run "installcheck-world" (not just installcheck) when I want
to do a generic smoke test with Vaglrind. Sometimes that will fail
relatively early for very silly reasons, for example because I don't
have exactly the expected plan in some harmless way (I try to account
for this by running Valgrind in a shellscript that tries to match
"make check", but that doesn't always work). It is nice that I won't
have to worry about such minor issues derailing everything for a long
running and unsupervised Valgrind test. (Maybe I could have worked
around this before now, but I guess I never tried.)

More generally, I think that we should be encouraging users to think
of the tests as something that you can run in any order. People should
be encouraged to think in terms of the meson abstractions, such as
test setups.

I found that "meson test --setup running --list" will show me what
tests I'll be running if I want to do "installcheck" style testing,
without having to run any tests at all -- another small but important
improvement. This seems worth drawing attention to on the meson Wiki
page as a non-obvious improvement over "installcheck". I might even
find it useful to hard-code some of these tests in a shellscript, that
runs only a subset of "--setup running" tests that happen to be
interesting for Valgrind testing right now.

BTW the meson wiki page iencourages users to think of "meson setup"
and "meson configure" as equivalent to autoconf configure. I get why
you explained it like that, but that confused me at first. What I
since figured out (which will be absurdly obvious to you) is that you
really need to decouple the generic from the specific -- very much
unlike autoconf. I found it useful to separate stuff that I know will
never change for a given build directory (such as the prefix install
path) from other things that are variable configuration settings
(things like the optimization level used by GCC). I now have a
scripted way of running "meson setup" for the former stuff (which is
generic), and a scripted way of running "meson configure" for the
latter set of stuff (with variations for "standard" release and debug
builds, building Valgrind, etc).

--
Peter Geoghegan

#359Andres Freund
andres@anarazel.de
In reply to: Peter Geoghegan (#358)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-26 12:47:14 -0700, Peter Geoghegan wrote:

On Sun, Sep 25, 2022 at 5:38 PM Andres Freund <andres@anarazel.de> wrote:

# run just the main pg_regress tests against existing server
meson test --setup running main/regress-running

Peter, would this address your use case?

I tried out your v16 patchset, which seems to mostly work as I'd hoped
it would.

Thanks & cool.

Some feedback:
* I gather that "running" as it appears in commands like "meson test
--setup running" refers to a particular setup named "running", that
you invented as part of creating a meson-ish substitute for
installcheck. Can "running" be renamed to something that makes it
obvious that it's a Postgres thing, and not a generic meson thing?

Yes. The only caveat is that it makes lines longer, because it's included in
the printed test line (there's no real requirement to have the test suite and
the setup named the same,b ut it seems confusing not to)

Maybe some kind of consistent naming convention would work best here.
This setup could be "pg_against_running_server", or something along
those lines.

* It would be nice if failed tests told me exactly which "diffs" file
I needed to look at, without my having to look for the message through
the meson log (or running with -v). Is this possible?

You can use --print-errorlogs to print the log output iff a test fails. It's a
bit painful that some tests have very verbose output :(. I don't really see a
way that meson can help us here, this is pretty much on "our" end.

BTW the meson wiki page iencourages users to think of "meson setup"
and "meson configure" as equivalent to autoconf configure. I get why
you explained it like that, but that confused me at first. What I
since figured out (which will be absurdly obvious to you) is that you
really need to decouple the generic from the specific -- very much
unlike autoconf. I found it useful to separate stuff that I know will
never change for a given build directory (such as the prefix install
path) from other things that are variable configuration settings
(things like the optimization level used by GCC). I now have a
scripted way of running "meson setup" for the former stuff (which is
generic), and a scripted way of running "meson configure" for the
latter set of stuff (with variations for "standard" release and debug
builds, building Valgrind, etc).

Hm. I'm not entirely sure what you mean here. The only thing that you can't
change in a existing build-dir with meson configure is the compiler.

I personally have different types of build dirs set up in parallel
(e.g. assert, optimize, assert-32, assert-w64). I'll occasionally
enable/disable

Greetings,

Andres Freund

In reply to: Andres Freund (#359)
Re: [RFC] building postgres with meson - v13

On Mon, Sep 26, 2022 at 1:27 PM Andres Freund <andres@anarazel.de> wrote:

Some feedback:
* I gather that "running" as it appears in commands like "meson test
--setup running" refers to a particular setup named "running", that
you invented as part of creating a meson-ish substitute for
installcheck. Can "running" be renamed to something that makes it
obvious that it's a Postgres thing, and not a generic meson thing?

Yes. The only caveat is that it makes lines longer, because it's included in
the printed test line (there's no real requirement to have the test suite and
the setup named the same,b ut it seems confusing not to)

Probably doesn't have to be too long. And I'm not sure of the details.
Just a small thing from my point of view.

* It would be nice if failed tests told me exactly which "diffs" file
I needed to look at, without my having to look for the message through
the meson log (or running with -v). Is this possible?

You can use --print-errorlogs to print the log output iff a test fails. It's a
bit painful that some tests have very verbose output :(. I don't really see a
way that meson can help us here, this is pretty much on "our" end.

Makes sense. Thanks.

Hm. I'm not entirely sure what you mean here. The only thing that you can't
change in a existing build-dir with meson configure is the compiler.

I do understand that it doesn't particularly matter to meson itself.
The point I was making was one about how I personally find it
convenient to set those things that I know will never change in
practice (because they're fundamentally things that I know that I
won't ever need to change) during "meson setup", while doing
everything else using "meson configure". I like to automate everything
using shell scripts. I will very occasionally have to run "meson
setup" via a zsh function anyway, so why not couple that process with
the process of setting "immutable for this build directory" settings?

With autoconf, I will run one of various zsh functions that run
configure in some specific way -- there are various "build types",
such as debug, release, and Valgrind. But with meson it makes sense to
split it in two -- have a generic zsh function for generic once-off
build directory setup (including even the mkdir), that also sets
generic, "immutable" settings, and a specialized zsh function that
changes things in a way that is particular to that kind of build (like
whether asserts are enabled, optimization level, and so on).

I personally have different types of build dirs set up in parallel
(e.g. assert, optimize, assert-32, assert-w64). I'll occasionally
enable/disable

I know that other experienced hackers do it that way. I have found
that ccache works well enough that I don't feel the need for multiple
build directories per branch.

Perhaps I've assumed more than I should about my approach being
broadly representative. It might ultimately be easier to just have
multiple build directories per branch/source directory -- one per
"build type" per branch. That has the advantage of not requiring each
"build type" zsh function to remember to reset anything that might
have been set by one of its sibling zsh functions for some other build
type (there is no need to "reset the setting to its default"). That
approach is more like scripting autoconf/configure would be, in that
you basically never change any settings for a given build directory in
practice (you maybe invent a new kind of build type instead, or you
update the definition of an existing standard build type based on a
new requirement for that build type).

It's really handy that meson lets you quickly change one setting
against an existing build directory. I'm slightly worried that that
will allow me to shoot myself in the foot, though. Perhaps I'll change
some exotic setting in an ad-hoc way, and then forget to unset it
afterwards, leading to (say) a mysterious performance degradation for
what is supposed to be one of my known standard build types. There is
no risk of that with my autoconf/configure workflow, because I'll
rerun the relevant configure zsh function before long anyway, making
it impossible for me to accidentally keep something that I never meant
to keep.

I like being able to throw everything away and quickly rebuild "from
scratch" (in reality rebuild using ccache and a cache for configure)
due to superstition/defensive paranoia/learned helplessness. This has
always worked well enough because ccache works fairly well. I'm not
sure how useful that kind of mindset will be with meson just yet, and
if I'm just thinking about it in the wrong way, so forgive me for
rambling like this.

--
Peter Geoghegan

#361Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#357)
23 attachment(s)
Re: [RFC] building postgres with meson - v13

Hi,

I'll include an updated pgxs-compat patch in the next post of the series (in a
few hours).

Attaches is version 17. Other changes:

- Added a new patch to fix the display of user provided CFLAGS in the meson
summary and to add them to pg_config output, addressing the report by Wang Wei
at [1]/messages/by-id/OS3PR01MB62751847BC9CD2DB7B29AC129E529@OS3PR01MB6275.jpnprd01.prod.outlook.com. Planning to apply this soon. We can fine tune this later, the
current situation is confusing.

- Added a new patch to set rpath to $libdir. I'd hoped we'd quickly go for
relative rpaths (so the install is relocatable, making it trivial to use
tmp_install), but I now think that might take a bit longer. I'm planning to
push this soon, as multiple people have been hit by this.

- Added a patch to separately define static / shared libraries for the ecpg
runtime libraries. This is a prerequisite patch for adding windows resource
files, since the resource files should only be defined for shared libraries.

- The patch adding windows resource files is, I think, now complete, including
adding resource files to the ecpg libs.

- A few more improvements for the PGXS compatibility. The pieces depending on
the changes discussed below are left in a separate patch for now, as I'm not
sure they'll survive as-is... There's a few more things needed, but I think
it's getting closer.

- Made some of the ecpg libraries use precompiled headers as well (gaining
maybe 500ms in a debug build)

One interesting question for this patch is where to add a note about when it
is sensible for a target to use a precompiled header, and when not. At the
moment meson generates a separate precompiled header "object" for each
target (as the flags can differ), so for a full build precompiled headers
can only be a win when a target has > 1 source file.

- Tweaked the patch adding tests against running instances a bit, mainly by
using a different suite name for the 'running' tests (otherwise meson test
--suite something does bad things) and removing the 'tmp-install', 'running'
suites. Haven't yet renamed 'running', as had been suggested by Peter
Geoghegan, his suggestion seemed a bit long.

- Reordered the series so that the patches that might take a while (including
being moved into a separate CF entry & thread) are last. I left the CI
patches at the start, because they make it easier to test parts of the
patchseries (e.g. [2]https://cirrus-ci.com/build/6353192312111104 just checks up to 0004)

On 2022-09-26 12:44:35 -0700, Andres Freund wrote:

Looking through a few of the not-nicely-replaced things, I think we can
simplify at least some away:

- RANLIB: most platforms use AROPT = crs, making ranlib unnecessary. {free,
net, open}bsd don't currently, but all support it from what I know

Done in the attached 0009.

- with_gnu_ld: this is only used on solaris, to set export_dynamic = -Wl,-E
when using a gnu ld. How about moving this to configure instead, and just
checking if -Wl,-E links?

Done in 0011. Together with 0010, which gets rid of the need for $(LD) on aix
by using $(CC) -r instead, this allows us to get rid of libtool.m4

Right now 0011 adds a PGAC_PROG_CC_LD_EXPORT_DYNAMIC() which tests for
-Wl,-E. It's used on solaris only. Based on its return value
SOLARIS_EXPORT_DYNAMIC is set in Makefile.global.

I'm not convinced by the precise structure I came up with in 0011, I'd welcome
feedback. But the idea as a whole seems promising to me.

0008 unifies CFLAGS_SSE42 and CFLAGS_ARMV8_CRC32C. We really don't need two
different variables for this - on the makefile level we really don't need to
care.

I'm wondering about moving the bulk of the pgxs compatibility stuff from
src/meson.build to src/makefiles/meson.build. Will look a bit uglier ('../'
references), but src/meson.build feels a bit too prominent somehow.

Greetings,

Andres Freund

[1]: /messages/by-id/OS3PR01MB62751847BC9CD2DB7B29AC129E529@OS3PR01MB6275.jpnprd01.prod.outlook.com
[2]: https://cirrus-ci.com/build/6353192312111104

Attachments:

v17-0001-meson-ci-wip-move-compilerwarnings-task-to-meson.patchtext/x-diff; charset=us-asciiDownload
From 680ff3f7b4da1dbf21d0c7cd87af9bb5ee8b230c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 20:36:36 -0700
Subject: [PATCH v17 01/23] meson: ci: wip: move compilerwarnings task to meson

---
 .cirrus.yml                            | 92 +++++++++++++-------------
 src/tools/ci/linux-mingw-w64-64bit.txt | 13 ++++
 2 files changed, 59 insertions(+), 46 deletions(-)
 create mode 100644 src/tools/ci/linux-mingw-w64-64bit.txt

diff --git a/.cirrus.yml b/.cirrus.yml
index 7b5cb021027..eb33fdc4855 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -465,6 +465,10 @@ task:
   ccache_cache:
     folder: $CCACHE_DIR
 
+  ccache_stats_start_script:
+    ccache -s
+    ccache -z
+
   setup_additional_packages_script: |
     #apt-get update
     #DEBIAN_FRONTEND=noninteractive apt-get -y install ...
@@ -473,8 +477,6 @@ task:
   # Test that code can be built with gcc/clang without warnings
   ###
 
-  setup_script: echo "COPT=-Werror" > src/Makefile.custom
-
   # Trace probes have a history of getting accidentally broken. Use the
   # different compilers to build with different combinations of dtrace on/off
   # and cassert on/off.
@@ -482,57 +484,58 @@ task:
   # gcc, cassert off, dtrace on
   always:
     gcc_warning_script: |
-      time ./configure \
-        --cache gcc.cache \
-        --enable-dtrace \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      mkdir build && cd build
+      CC="ccache gcc" CXX="ccache g++" \
+        meson setup \
+          -Dwerror=true \
+          -Dcassert=false \
+          -Ddtrace=enabled \
+          ${LINUX_MESON_FEATURES} \
+          ..
+      time ninja -j${BUILD_JOBS}
 
   # gcc, cassert on, dtrace off
   always:
     gcc_a_warning_script: |
-      time ./configure \
-        --cache gcc.cache \
-        --enable-cassert \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      cd build
+      meson configure \
+        -Dcassert=true \
+        -Ddtrace=disabled
+      time ninja -j${BUILD_JOBS}
 
   # clang, cassert off, dtrace off
   always:
     clang_warning_script: |
-      time ./configure \
-        --cache clang.cache \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      rm -rf build
+      mkdir build && cd build
+      CC="ccache clang" CXX="ccache clang++" \
+        meson setup \
+          -Dwerror=true \
+          -Dcassert=false \
+          -Ddtrace=disabled \
+          ${LINUX_MESON_FEATURES} \
+          ..
+      time ninja -j${BUILD_JOBS}
 
   # clang, cassert on, dtrace on
   always:
     clang_a_warning_script: |
-      time ./configure \
-        --cache clang.cache \
-        --enable-cassert \
-        --enable-dtrace \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      cd build
+      meson configure \
+        -Dcassert=true \
+        -Ddtrace=enabled
+      time ninja -j${BUILD_JOBS}
 
   # cross-compile to windows
   always:
     mingw_cross_warning_script: |
-      time ./configure \
-        --host=x86_64-w64-mingw32 \
-        --enable-cassert \
-        CC="ccache x86_64-w64-mingw32-gcc" \
-        CXX="ccache x86_64-w64-mingw32-g++"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      mkdir build-w64 && cd build-w64
+      meson setup \
+        --cross-file=../src/tools/ci/linux-mingw-w64-64bit.txt \
+        -Dwerror=true \
+        -Dcassert=true \
+        ..
+      time ninja -j${BUILD_JOBS}
 
   ###
   # Verify docs can be built
@@ -540,13 +543,8 @@ task:
   # XXX: Only do this if there have been changes in doc/ since last build
   always:
     docs_build_script: |
-      time ./configure \
-        --cache gcc.cache \
-        CC="ccache gcc" \
-        CXX="ccache g++" \
-        CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} -C doc
+      cd build
+      time ninja docs
 
   ###
   # Verify headerscheck / cpluspluscheck succeed
@@ -563,11 +561,13 @@ task:
         ${LINUX_CONFIGURE_FEATURES} \
         --without-icu \
         --quiet \
-        CC="gcc" CXX"=g++" CLANG="clang"
-      make -s -j${BUILD_JOBS} clean
+        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
+      make -s -j${BUILD_JOBS} world-bin
       time make -s headerscheck EXTRAFLAGS='-fmax-errors=10'
     headers_cpluspluscheck_script: |
       time make -s cpluspluscheck EXTRAFLAGS='-fmax-errors=10'
 
   always:
+    ccache_stats_end_script:
+      ccache -s
     upload_caches: ccache
diff --git a/src/tools/ci/linux-mingw-w64-64bit.txt b/src/tools/ci/linux-mingw-w64-64bit.txt
new file mode 100644
index 00000000000..9d43b6dcfbc
--- /dev/null
+++ b/src/tools/ci/linux-mingw-w64-64bit.txt
@@ -0,0 +1,13 @@
+[binaries]
+c = ['ccache', '/usr/bin/x86_64-w64-mingw32-gcc']
+cpp = ['ccache', '/usr/bin/x86_64-w64-mingw32-g++']
+ar = '/usr/bin/x86_64-w64-mingw32-ar'
+strip = '/usr/bin/x86_64-w64-mingw32-strip'
+pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
+windres = '/usr/bin/x86_64-w64-mingw32-windres'
+
+[host_machine]
+system = 'windows'
+cpu_family = 'x86_64'
+cpu = 'x86_64'
+endian = 'little'
-- 
2.37.3.542.gdd3f6c4cae

v17-0002-meson-ci-dontmerge-Add-additional-CI-coverage.patchtext/x-diff; charset=us-asciiDownload
From a0aadba866912e1328e114447dcde91052a816f2 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 22:08:00 -0700
Subject: [PATCH v17 02/23] meson: ci: dontmerge: Add additional CI coverage

This is part of the series to be able to test meson on more platforms than
normally part of CI.

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Justin Pryzby <pryzby@telsasoft.com>
---
 .cirrus.yml                                   | 322 +++++++++++++++++-
 src/tools/ci/docker/linux_centos7             |  57 ++++
 src/tools/ci/docker/linux_centos8             |  54 +++
 src/tools/ci/docker/linux_fedora_rawhide      |  49 +++
 src/tools/ci/docker/linux_opensuse_tumbleweed |  56 +++
 5 files changed, 522 insertions(+), 16 deletions(-)
 create mode 100644 src/tools/ci/docker/linux_centos7
 create mode 100644 src/tools/ci/docker/linux_centos8
 create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
 create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed

diff --git a/.cirrus.yml b/.cirrus.yml
index eb33fdc4855..efb2d2c4832 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -126,6 +126,90 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
 
 
+task:
+  env:
+    CPUS: 2
+    BUILD_JOBS: 3
+    TEST_JOBS: 3
+
+    CIRRUS_WORKING_DIR: /home/postgres/postgres
+    CCACHE_DIR: /tmp/ccache_dir
+
+    PATH: /usr/sbin:$PATH
+
+    # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+    # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+    # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+    LANG: "C"
+    LC_ALL: "C"
+
+  matrix:
+    - name: NetBSD - 9 - Meson
+      only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
+      env:
+        IMAGE_NAME: pg-ci-netbsd-9-postgres
+        PLATFORM: netbsd
+        INCLUDE_DIRS: -Dextra_lib_dirs=/usr/pkg/lib -Dextra_include_dirs=/usr/pkg/include
+
+    - name: OpenBSD - 7 - Meson
+      only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
+      env:
+        IMAGE_NAME: pg-ci-openbsd-7-postgres
+        PLATFORM: openbsd
+        INCLUDE_DIRS: -Dextra_include_dirs=/usr/local/include -Dextra_lib_dirs=/usr/local/lib
+        UUID: -Duuid=e2fs
+
+  compute_engine_instance:
+    image_project: $IMAGE_PROJECT
+    image: family/${IMAGE_NAME}
+    platform: ${PLATFORM}
+    cpu: $CPUS
+    memory: 4G
+    disk: 25
+
+  sysinfo_script: |
+    locale
+    id
+    uname -a
+    ulimit -a -H && ulimit -a -S
+    export
+
+  ccache_cache:
+    folder: $CCACHE_DIR
+
+  create_user_script: |
+    useradd postgres
+    chown -R postgres:users /home/postgres
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:users ${CCACHE_DIR}
+
+  # -Duuid=bsd is not set since 'bsd' uuid option
+  # is not working on netBSD & openBSD. See
+  # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+  # And other uuid options are not available on netBSD
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl ${UUID} \
+        -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \
+        ${INCLUDE_DIRS} \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 # configure feature flags, shared between the task running the linux tests and
 # the CompilerWarnings task
 LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -152,6 +236,22 @@ LINUX_MESON_FEATURES: &LINUX_MESON_FEATURES >-
   -Duuid=e2fs
 
 
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+  sysinfo_script: |
+    id
+    uname -a
+    cat /proc/cmdline
+    ulimit -a -H && ulimit -a -S
+    export
+  create_user_script: |
+    useradd -m -U postgres
+    chown -R postgres:postgres .
+    mkdir -p ${CCACHE_DIR}
+    chown -R postgres:postgres ${CCACHE_DIR}
+    su postgres -c "ulimit -l -H && ulimit -l -S"
+
+
 task:
   env:
     CPUS: 4
@@ -181,19 +281,9 @@ task:
   ccache_cache:
     folder: ${CCACHE_DIR}
 
-  sysinfo_script: |
-    id
-    uname -a
-    cat /proc/cmdline
-    ulimit -a -H && ulimit -a -S
-    export
-  create_user_script: |
-    useradd -m postgres
-    chown -R postgres:postgres .
-    mkdir -p ${CCACHE_DIR}
-    chown -R postgres:postgres ${CCACHE_DIR}
+  set_limits_script: |
     echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
-    su postgres -c "ulimit -l -H && ulimit -l -S"
+  <<: *linux_preparation_scripts_template
   setup_core_files_script: |
     mkdir -m 770 /tmp/cores
     chown root:postgres /tmp/cores
@@ -227,7 +317,13 @@ task:
       on_failure:
         <<: *on_failure_ac
 
-    - name: Linux - Debian Bullseye - Meson
+    - matrix:
+        - name: Linux - Debian Bullseye - Meson
+        - name: Linux - Debian Sid - Meson
+          trigger_type: manual
+
+          compute_engine_instance:
+            image: family/pg-ci-sid
 
       configure_script: |
         su postgres <<-EOF
@@ -255,6 +351,81 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
 
 
+task:
+  env:
+    CPUS: 4
+    BUILD_JOBS: 4
+    TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+    CCACHE_DIR: /tmp/ccache_dir
+    DEBUGINFOD_URLS: ${DEBUGINFO}
+
+    TCL_DIR: /usr/lib64/
+    UUID: e2fs
+
+    CFLAGS: "-Og -ggdb"
+    CXXFLAGS: "-Og -ggdb"
+
+    LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+  only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+  container:
+    dockerfile: ${DOCKERFILE_PATH}
+    cpu: $CPUS
+    memory: 4G
+
+  ccache_cache:
+    folder: ${CCACHE_DIR}
+
+  <<: *linux_preparation_scripts_template
+
+  matrix:
+    - name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+      env:
+        DOCKERFILE_PATH: src/tools/ci/docker/linux_opensuse_tumbleweed
+        DEBUGINFO: "https://debuginfod.opensuse.org/"
+        LLVM: -Dllvm=enabled
+
+    - trigger_type: manual
+      matrix:
+        - name: Linux - Fedora Rawhide - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+            DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+        - name: Linux - Centos 8 - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+            DEBUGINFO: "http://debuginfo.centos.org/"
+
+        - name: Linux - Centos 7 - Meson
+          env:
+            DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+            DEBUGINFO: "http://debuginfo.centos.org/"
+
+  configure_script: |
+    su postgres <<-EOF
+      meson setup \
+        --buildtype debug \
+        -Dcassert=true -Dssl=openssl -Duuid=e2fs ${LLVM} \
+        -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \
+        build
+    EOF
+
+  build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+  upload_caches: ccache
+
+  test_world_script: |
+    su postgres <<-EOF
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+    EOF
+
+  on_failure:
+    <<: *on_failure_meson
+
+
 task:
   name: macOS - Monterey - Meson
 
@@ -355,9 +526,7 @@ task:
     cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
 
 
-task:
-  name: Windows - Server 2019, VS 2019 - Meson & ninja
-
+windows_template: &windows_template
   env:
     # Half the allowed per-user CPU cores
     CPUS: 4
@@ -373,6 +542,20 @@ task:
     # Avoids port conflicts between concurrent tap test runs
     PG_TEST_USE_UNIX_SOCKETS: 1
     PG_REGRESS_SOCK_DIR: "c:/cirrus/"
+    # -m enables parallelism
+    # verbosity:minimal + Summary reduce verbosity, while keeping a summary of
+    #   errors/warnings
+    # ForceNoAlign prevents msbuild from introducing line-breaks for long lines
+    # disable file tracker, we're never going to rebuild, and it slows down the
+    #   build
+    MSBFLAGS: -m -verbosity:minimal "-consoleLoggerParameters:Summary;ForceNoAlign" /p:TrackFileAccess=false -nologo
+
+    # If tests hang forever, cirrus eventually times out. In that case log
+    # output etc is not uploaded, making the problem hard to debug. Of course
+    # tests internally should have shorter timeouts, but that's proven to not
+    # be sufficient. 15min currently is fast enough to finish individual test
+    # "suites".
+    T_C: "\"C:/Program Files/Git/usr/bin/timeout.exe\" -v -k60s 15m"
 
     # startcreate_script starts a postgres instance that we don't want to get
     # killed at the end of that script (it's stopped in stop_script). Can't
@@ -406,6 +589,16 @@ task:
   setup_additional_packages_script: |
     REM choco install -y --no-progress ...
 
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+  meson_install_wraps_script: |
+    mkdir subprojects
+    meson wrap install lz4
+    meson wrap install zlib
+
   # Use /DEBUG:FASTLINK to avoid high memory usage during linking
   configure_script: |
     vcvarsall x64
@@ -426,6 +619,103 @@ task:
       type: text/plain
 
 
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+  meson_install_wraps_script: |
+    mkdir subprojects
+    meson wrap install lz4
+    meson wrap install zlib
+
+  configure_script: |
+    vcvarsall x64
+    meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+
+  build_script: |
+    vcvarsall x64
+    msbuild %MSBFLAGS% build\postgresql.sln
+
+  check_world_script: |
+    vcvarsall x64
+    meson test %MTEST_ARGS% --num-processes %TEST_JOBS%
+
+  on_failure:
+    <<: *on_failure_meson
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+      type: text/plain
+
+
+task:
+  <<: *windows_template
+  name: Windows - Server 2019, VS 2019 - Homegrown
+
+  env:
+    # Our windows infrastructure doesn't have test concurrency above the level
+    # of a single vcregress test target. Due to that, it's useful to run prove
+    # with multiple jobs. For the other tasks it isn't, because two sources
+    # (make and prove) of concurrency can overload machines.
+    #
+    # The concrete choice of 10 is based on a small bit of experimentation and
+    # likely can be improved upon further.
+    PROVE_FLAGS: -j10 --timer
+
+  configure_script:
+    # copy errors out when using forward slashes
+    - copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl
+    - vcvarsall x64
+    - perl src/tools/msvc/mkvcbuild.pl
+  build_script:
+    - vcvarsall x64
+    - msbuild %MSBFLAGS% pgsql.sln
+  tempinstall_script:
+    # Installation on windows currently only completely works from src/tools/msvc
+    - cd src/tools/msvc && perl install.pl %CIRRUS_WORKING_DIR%/tmp_install
+
+  test_regress_parallel_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl check parallel
+  startcreate_script: |
+    rem paths to binaries need backslashes
+    tmp_install\bin\pg_ctl.exe initdb -D tmp_check/db -l tmp_check/initdb.log --options=--no-sync
+    echo include '%TEMP_CONFIG%' >> tmp_check/db/postgresql.conf
+    tmp_install\bin\pg_ctl.exe start -D tmp_check/db -l tmp_check/postmaster.log
+
+  test_pl_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl plcheck
+  test_isolation_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl isolationcheck
+  test_modules_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl modulescheck
+  test_contrib_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl contribcheck
+  stop_script: |
+    tmp_install\bin\pg_ctl.exe stop -D tmp_check/db -l tmp_check/postmaster.log
+  test_ssl_script: |
+    set with_ssl=openssl
+    %T_C% perl src/tools/msvc/vcregress.pl taptest ./src/test/ssl/
+  test_subscription_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl taptest ./src/test/subscription/
+  test_authentication_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl taptest ./src/test/authentication/
+  test_recovery_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl recoverycheck
+  test_bin_script: |
+    %T_C% perl src/tools/msvc/vcregress.pl bincheck
+  test_ecpg_script: |
+    rem tries to build additional stuff
+    vcvarsall x64
+    rem References ecpg_regression.proj in the current dir
+    cd src/tools/msvc
+    %T_C% perl vcregress.pl ecpgcheck
+
+  on_failure:
+    <<: *on_failure_ac
+    crashlog_artifacts:
+      path: "crashlog-*.txt"
+      type: text/plain
+
+
 task:
   name: CompilerWarnings
 
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+  yum -y install dnf-plugins-core \
+  epel-release \
+  centos-release-scl-rh && \
+  \
+  yum -y update && \
+  yum -y install \
+  \
+  git \
+  perl \
+  perl-ExtUtils-Embed \
+  perl-IPC-Run \
+  perl-Test-Harness \
+  perl-Test-Simple \
+  \
+  bison \
+  ccache \
+  clang \
+  devtoolset-7-make \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  && \
+  pip3 install meson && \
+  pip3 install ninja && \
+  yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+  dnf -y install dnf-plugins-core && \
+  dnf config-manager --set-enabled powertools && \
+  dnf -y install epel-release && \
+  dnf -y update && \
+  dnf -y install \
+  \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  diffutils \
+  flex \
+  gcc \
+  gettext \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  glibc-langpack-en \
+  \
+  && \
+  pip3 install ninja && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+  dnf -y update && \
+  dnf -y install \
+  git \
+  meson \
+  perl \
+  perl-IPC-Run \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gettext \
+  ninja-build \
+  \
+  krb5-devel \
+  libicu-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  lz4-devel \
+  openldap-devel \
+  openssl-devel \
+  pam-devel \
+  python3-devel \
+  readline-devel \
+  systemd-devel \
+  tcl-devel \
+  \
+  krb5-server \
+  krb5-server-ldap \
+  krb5-workstation \
+  lz4 \
+  openldap-clients \
+  openldap-servers \
+  openssl \
+  zstd \
+  \
+  langpacks-en \
+  glibc-langpack-en \
+  \
+  && \
+  yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+  zypper -n clean -a && \
+  zypper -n ref && \
+  zypper -n dup && \
+  zypper -n update && \
+  zypper -n install \
+  diffutils \
+  git \
+  icu \
+  make \
+  meson \
+  perl-IPC-Run \
+  shadow \
+  systemd-devel \
+  util-linux \
+  \
+  bison \
+  ccache \
+  clang \
+  flex \
+  gcc \
+  gcc-c++ \
+  gettext-runtime \
+  ninja \
+  \
+  krb5-devel \
+  libicu-devel \
+  libldapcpp-devel \
+  liblz4-devel \
+  libopenssl-devel \
+  libselinux-devel \
+  libuuid-devel \
+  libxml2-devel \
+  libxslt-devel \
+  libzstd-devel \
+  llvm-devel \
+  pam-devel \
+  python38-devel \
+  readline-devel \
+  tcl-devel \
+  \
+  openldap2 \
+  openldap2-client \
+  \
+  krb5-client \
+  krb5-plugin-kdb-ldap \
+  krb5-server \
+  lz4 \
+  zstd \
+  \
+  && \
+  zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
-- 
2.37.3.542.gdd3f6c4cae

v17-0003-meson-Include-CFLAGS-c_args-in-summary-and-pg_co.patchtext/x-diff; charset=us-asciiDownload
From 69cd023e061187de774df5cd4b8eed1e59d6de49 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 11:31:32 -0700
Subject: [PATCH v17 03/23] meson: Include CFLAGS/c_args in summary and
 pg_config output

Previously arguments passed in via CFLAGS/-Dc_args were neither displayed in
meson's summary, nor in pg_config's output.

Reported-by: "wangw.fnst@fujitsu.com" <wangw.fnst@fujitsu.com>
Discussion: https://postgr.es/m/OS3PR01MB62751847BC9CD2DB7B29AC129E529@OS3PR01MB6275.jpnprd01.prod.outlook.com
---
 src/include/meson.build | 10 +++++++---
 meson.build             |  4 ++++
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/include/meson.build b/src/include/meson.build
index e5390df0584..f2f7d03ff27 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -42,11 +42,15 @@ config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
 
 var_cc = ' '.join(cc.cmd_array())
 var_cpp = ' '.join(cc.cmd_array() + ['-E'])
-var_cflags = ' '.join(cflags + cflags_warn)
-var_cxxflags = ' '.join(cxxflags + cxxflags_warn)
+var_cflags = ' '.join(cflags + cflags_warn + get_option('c_args'))
+if llvm.found()
+  var_cxxflags = ' '.join(cxxflags + cxxflags_warn + get_option('cpp_args'))
+else
+  var_cxxflags = ''
+endif
 var_cppflags = ' '.join(cppflags)
 var_cflags_sl = '-fPIC' #FIXME
-var_ldflags = ' '.join(ldflags)
+var_ldflags = ' '.join(ldflags + get_option('c_link_args'))
 var_ldflags_sl = ''.join(ldflags_sl)
 var_ldflags_ex = '' # FIXME
 # FIXME - some extensions might directly use symbols from one of libs. If
diff --git a/meson.build b/meson.build
index 6ffae59ba03..474a42a2559 100644
--- a/meson.build
+++ b/meson.build
@@ -2966,6 +2966,9 @@ if meson.version().version_compare('>=0.57')
       'CPP FLAGS': ' '.join(cppflags),
       'C FLAGS, functional': ' '.join(cflags),
       'C FLAGS, warnings': ' '.join(cflags_warn),
+      'C FLAGS, modules': ' '.join(cflags_mod),
+      'C FLAGS, user specified': ' '.join(get_option('c_args')),
+      'LD FLAGS': ' '.join(ldflags + get_option('c_link_args')),
     },
     section: 'Compiler Flags',
   )
@@ -2982,6 +2985,7 @@ if meson.version().version_compare('>=0.57')
       {
         'C++ FLAGS, functional': ' '.join(cxxflags),
         'C++ FLAGS, warnings': ' '.join(cxxflags_warn),
+        'C++ FLAGS, user specified': ' '.join(get_option('cpp_args')),
       },
       section: 'Compiler Flags',
     )
-- 
2.37.3.542.gdd3f6c4cae

v17-0004-meson-Set-up-absolute-rpaths-to-libdir.patchtext/x-diff; charset=us-asciiDownload
From 910047de00884a566b9a674b886bc383eb02b91e Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 17:08:45 -0700
Subject: [PATCH v17 04/23] meson: Set up absolute rpaths to libdir

While I (Andres) had planned to use relative rpaths, it looks like agreeing on
the precise path might take a bit. So set up absolute rpaths for now.
---
 meson.build | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/meson.build b/meson.build
index 474a42a2559..38b2c3aae2e 100644
--- a/meson.build
+++ b/meson.build
@@ -2471,9 +2471,22 @@ bin_install_rpaths = []
 lib_install_rpaths = []
 mod_install_rpaths = []
 
-# Add extra_lib_dirs to rpath. Not needed on darwin, as the install_name of
-# libraries in extra_lib_dirs will be used anyway.
+
+# Don't add rpaths on darwin for now - as long as only absolute references to
+# libraries are needed, absolute LC_ID_DYLIB ensures libraries can be found in
+# their final destination.
 if host_system != 'darwin'
+  # Add absolute path to libdir to rpath. This ensures installed binaries /
+  # libraries find our libraries (mainly libpq).
+  bin_install_rpaths += dir_prefix / dir_lib
+  lib_install_rpaths += dir_prefix / dir_lib
+  mod_install_rpaths += dir_prefix / dir_lib
+
+  # Add extra_lib_dirs to rpath. This ensures we find libraries we depend on.
+  #
+  # Not needed on darwin even if we use relative rpaths for our own libraries,
+  # as the install_name of libraries in extra_lib_dirs will point to their
+  # location anyway.
   bin_install_rpaths += postgres_lib_d
   lib_install_rpaths += postgres_lib_d
   mod_install_rpaths += postgres_lib_d
-- 
2.37.3.542.gdd3f6c4cae

v17-0005-meson-ecpg-Split-definition-of-static-and-shared.patchtext/x-diff; charset=us-asciiDownload
From c55cd308dc9896e1487844e4c2edf27b68a08dc6 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 10:30:39 -0700
Subject: [PATCH v17 05/23] meson: ecpg: Split definition of static and shared
 libraries

Required for correct resource file generation, as the resource files should
only be added to the shared library.

This also fixes the copy-pasto of naming the target for the export files for
the ecpg libraries libpq.exports.

Only really makes sense with the subsequent commit, but is sufficiently
complicated to be worth keeping separate for easier review.
---
 src/interfaces/libpq/meson.build           |  4 +--
 src/interfaces/ecpg/compatlib/meson.build  | 37 +++++++++++++++++-----
 src/interfaces/ecpg/ecpglib/meson.build    | 32 +++++++++++++++----
 src/interfaces/ecpg/pgtypeslib/meson.build | 28 ++++++++++++----
 src/interfaces/ecpg/test/meson.build       |  2 +-
 5 files changed, 79 insertions(+), 24 deletions(-)

diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bc047e00d62..c203372a35b 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -49,8 +49,8 @@ libpq_st = static_library('libpq',
   kwargs: default_lib_args,
 )
 
-# not using both_libraries here, causes problems with precompiled headers and
-# resource files with msbuild
+# not using both_libraries() here as the resource file should only be in the
+# shared library
 libpq_so = shared_library('libpq',
   dependencies: libpq_deps,
   include_directories: [libpq_inc, postgres_inc],
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 5887cb92b52..7aeb627ee86 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -1,11 +1,31 @@
-export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
-
-ecpg_compat = both_libraries('libecpg_compat',
+ecpg_compat_sources = files(
   'informix.c',
-  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
-  c_args: ['-DSO_MAJOR_VERSION=3'],
+)
+ecpg_compat_so_sources = [] # only for shared lib, in addition to above
+
+ecpg_compat_inc = ['.', ecpg_inc, postgres_inc, libpq_inc]
+ecpg_compat_c_args = ['-DSO_MAJOR_VERSION=3']
+export_file = custom_target('libecpg_compat.exports', kwargs: gen_export_kwargs)
+
+# not using both_libraries(), as the resource file should only be in the
+# shared library
+ecpg_compat_st = static_library('libecpg_compat',
+  ecpg_compat_sources,
+  include_directories: ecpg_compat_inc,
+  c_args: ecpg_compat_c_args,
+  pic: true,
   dependencies: [frontend_code, thread_dep],
-  link_with: [ecpglib, ecpg_pgtypes],
+  kwargs: default_lib_args,
+)
+ecpg_targets += ecpg_compat_st
+
+ecpg_compat_so = shared_library('libecpg_compat',
+  ecpg_compat_so_sources,
+  include_directories: ecpg_compat_inc,
+  c_args: ecpg_compat_c_args,
+  dependencies: [frontend_code, thread_dep],
+  link_whole: ecpg_compat_st,
+  link_with: [ecpglib_so, ecpg_pgtypes_so],
   soversion: host_system != 'windows' ? '3' : '',
   darwin_versions: ['3', '3.' + pg_version_major.to_string()],
   version: '3.' + pg_version_major.to_string(),
@@ -13,10 +33,11 @@ ecpg_compat = both_libraries('libecpg_compat',
   link_depends: export_file,
   kwargs: default_lib_args,
 )
-ecpg_targets += [ecpg_compat.get_shared_lib(), ecpg_compat.get_static_lib()]
+ecpg_targets += ecpg_compat_so
 
 pkgconfig.generate(
-  ecpg_compat.get_shared_lib(),
+  ecpg_compat_so,
+  requires_private: 'libpgtypes',
   description: 'PostgreSQL libecpg_compat library',
   url: pg_url,
 )
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 2da029ec8ea..eb8dd616571 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -10,15 +10,32 @@ ecpglib_sources = files(
   'sqlda.c',
   'typename.c',
 )
+ecpglib_so_sources = [] # only for shared lib, in addition to above
 
-export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+ecpglib_inc = ['.', ecpg_inc, postgres_inc]
+ecpglib_c_args = ['-DSO_MAJOR_VERSION=6']
+export_file = custom_target('libecpg.exports', kwargs: gen_export_kwargs)
 
-ecpglib = both_libraries('libecpg',
+# not using both_libraries(), as the resource file should only be in the
+# shared library
+ecpglib_st = static_library('libecpg',
   ecpglib_sources,
-  include_directories: ['.', ecpg_inc, postgres_inc],
-  c_args: ['-DSO_MAJOR_VERSION=6'],
+  include_directories: ecpglib_inc,
+  c_args: ecpglib_c_args,
+  pic: true,
   dependencies: [frontend_code, libpq, thread_dep],
-  link_with: [ecpg_pgtypes],
+  link_with: [ecpg_pgtypes_so],
+  kwargs: default_lib_args,
+)
+ecpg_targets += ecpglib_st
+
+ecpglib_so = shared_library('libecpg',
+  ecpglib_so_sources,
+  include_directories: ecpglib_inc,
+  c_args: ecpglib_c_args,
+  dependencies: [frontend_code, libpq, thread_dep],
+  link_whole: ecpglib_st,
+  link_with: [ecpg_pgtypes_so],
   soversion: host_system != 'windows' ? '6' : '',
   darwin_versions: ['6', '6.' + pg_version_major.to_string()],
   version: '6.' + pg_version_major.to_string(),
@@ -26,10 +43,11 @@ ecpglib = both_libraries('libecpg',
   link_depends: export_file,
   kwargs: default_lib_args,
 )
-ecpg_targets += [ecpglib.get_shared_lib(), ecpglib.get_static_lib()]
+ecpg_targets += ecpglib_so
 
 pkgconfig.generate(
-  ecpglib.get_shared_lib(),
+  ecpglib_so,
+  requires_private: 'libpgtypes',
   description: 'PostgreSQL libecpg library',
   url: pg_url,
 )
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 96489d9f1d7..5254843f84d 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -6,13 +6,29 @@ ecpg_pgtypes_sources = files(
   'numeric.c',
   'timestamp.c',
 )
+ecpg_pgtypes_so_sources = []
 
-export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+export_file = custom_target('libpgtypes.exports', kwargs: gen_export_kwargs)
+ecpg_pgtypes_inc = ['.', ecpg_inc, postgres_inc]
+ecpg_pgtypes_c_args = ['-DSO_MAJOR_VERSION=3']
 
-ecpg_pgtypes = both_libraries('libpgtypes',
+# not using both_libraries(), as the resource file should only be in the
+# shared library
+ecpg_pgtypes_st = static_library('libpgtypes',
   ecpg_pgtypes_sources,
-  include_directories: ['.', ecpg_inc, postgres_inc],
-  c_args: ['-DSO_MAJOR_VERSION=3'],
+  include_directories: ecpg_pgtypes_inc,
+  c_args: ecpg_pgtypes_c_args,
+  pic: true,
+  dependencies: [frontend_code],
+  kwargs: default_lib_args,
+)
+ecpg_targets += ecpg_pgtypes_st
+
+ecpg_pgtypes_so = shared_library('libpgtypes',
+  ecpg_pgtypes_so_sources,
+  include_directories: ecpg_pgtypes_inc,
+  c_args: ecpg_pgtypes_c_args,
+  link_whole: ecpg_pgtypes_st,
   dependencies: [frontend_code],
   version: '3.' + pg_version_major.to_string(),
   soversion: host_system != 'windows' ? '3' : '',
@@ -21,10 +37,10 @@ ecpg_pgtypes = both_libraries('libpgtypes',
   link_depends: export_file,
   kwargs: default_lib_args,
 )
-ecpg_targets += [ecpg_pgtypes.get_shared_lib(), ecpg_pgtypes.get_static_lib()]
+ecpg_targets += ecpg_pgtypes_so
 
 pkgconfig.generate(
-  ecpg_pgtypes.get_shared_lib(),
+  ecpg_pgtypes_so,
   description: 'PostgreSQL libpgtypes library',
   url: pg_url,
 )
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index f0ace641f0c..8904aa7fd90 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -22,7 +22,7 @@ testprep_targets += pg_regress_ecpg
 ecpg_test_exec_kw = {
   'dependencies': [frontend_code, libpq],
   'include_directories': [ecpg_inc],
-  'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+  'link_with': [ecpglib_so, ecpg_compat_so, ecpg_pgtypes_so],
   'build_by_default': false,
   'install': false,
 }
-- 
2.37.3.542.gdd3f6c4cae

v17-0006-meson-Add-windows-resource-files.patchtext/x-diff; charset=us-asciiDownload
From b57f1fbd66a95b4b888fc060ffeeba85493696f9 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 10:32:45 -0700
Subject: [PATCH v17 06/23] meson: Add windows resource files

The generated resource files aren't exactly the same ones as the old
buildsystems generate. Previously "InternalName" and "OriginalFileName" were
mostly wrong / not set (despite being required), but that was hard to fix in
at least the make build. Additionally, the meson build falls back to a
"auto-generated" description when not set, and doesn't set it in a few cases -
unlikely that anybody looks at these descriptions in detail.

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
---
 src/backend/jit/llvm/meson.build              |  6 ++
 .../replication/libpqwalreceiver/meson.build  |  6 ++
 src/backend/replication/pgoutput/meson.build  |  6 ++
 src/backend/snowball/meson.build              |  6 ++
 .../utils/mb/conversion_procs/meson.build     |  9 +-
 src/bin/initdb/meson.build                    |  6 ++
 src/bin/pg_amcheck/meson.build                |  8 +-
 src/bin/pg_archivecleanup/meson.build         | 12 ++-
 src/bin/pg_basebackup/meson.build             | 38 ++++++-
 src/bin/pg_checksums/meson.build              | 12 ++-
 src/bin/pg_config/meson.build                 | 12 ++-
 src/bin/pg_controldata/meson.build            | 12 ++-
 src/bin/pg_ctl/meson.build                    | 12 ++-
 src/bin/pg_dump/meson.build                   | 18 ++++
 src/bin/pg_resetwal/meson.build               | 12 ++-
 src/bin/pg_rewind/meson.build                 |  6 ++
 src/bin/pg_test_fsync/meson.build             | 10 +-
 src/bin/pg_test_timing/meson.build            | 12 ++-
 src/bin/pg_upgrade/meson.build                |  6 ++
 src/bin/pg_verifybackup/meson.build           |  6 ++
 src/bin/pg_waldump/meson.build                |  6 ++
 src/bin/pgbench/meson.build                   |  6 ++
 src/bin/pgevent/meson.build                   |  6 ++
 src/bin/psql/meson.build                      |  6 ++
 src/bin/scripts/meson.build                   | 10 +-
 src/interfaces/libpq/meson.build              |  5 +
 src/interfaces/libpq/test/meson.build         | 25 ++++-
 src/pl/plperl/meson.build                     |  7 ++
 src/pl/plpgsql/src/meson.build                |  6 ++
 src/pl/plpython/meson.build                   |  6 ++
 src/pl/tcl/meson.build                        |  6 ++
 contrib/adminpack/meson.build                 | 12 ++-
 contrib/amcheck/meson.build                   | 17 +++-
 contrib/auth_delay/meson.build                | 12 ++-
 contrib/auto_explain/meson.build              | 12 ++-
 contrib/basebackup_to_shell/meson.build       |  6 ++
 contrib/basic_archive/meson.build             |  6 ++
 contrib/bloom/meson.build                     |  6 ++
 contrib/bool_plperl/meson.build               |  6 ++
 contrib/btree_gin/meson.build                 | 12 ++-
 contrib/btree_gist/meson.build                |  6 ++
 contrib/citext/meson.build                    |  6 ++
 contrib/cube/meson.build                      |  6 ++
 contrib/dblink/meson.build                    |  6 ++
 contrib/dict_int/meson.build                  | 12 ++-
 contrib/dict_xsyn/meson.build                 | 12 ++-
 contrib/earthdistance/meson.build             | 12 ++-
 contrib/file_fdw/meson.build                  | 12 ++-
 contrib/fuzzystrmatch/meson.build             | 16 ++-
 contrib/hstore/meson.build                    | 24 +++--
 contrib/hstore_plperl/meson.build             |  6 ++
 contrib/hstore_plpython/meson.build           |  6 ++
 contrib/intarray/meson.build                  |  6 ++
 contrib/isn/meson.build                       |  6 ++
 contrib/jsonb_plperl/meson.build              |  6 ++
 contrib/jsonb_plpython/meson.build            |  6 ++
 contrib/lo/meson.build                        |  6 ++
 contrib/ltree/meson.build                     |  6 ++
 contrib/ltree_plpython/meson.build            |  6 ++
 contrib/oid2name/meson.build                  | 12 ++-
 contrib/old_snapshot/meson.build              |  6 ++
 contrib/pageinspect/meson.build               |  6 ++
 contrib/passwordcheck/meson.build             |  6 ++
 contrib/pg_buffercache/meson.build            | 14 ++-
 contrib/pg_freespacemap/meson.build           | 14 ++-
 contrib/pg_prewarm/meson.build                | 16 ++-
 contrib/pg_stat_statements/meson.build        | 12 ++-
 contrib/pg_surgery/meson.build                | 14 ++-
 contrib/pg_trgm/meson.build                   | 20 ++--
 contrib/pg_visibility/meson.build             | 14 ++-
 contrib/pg_walinspect/meson.build             |  6 ++
 contrib/pgcrypto/meson.build                  |  6 ++
 contrib/pgrowlocks/meson.build                | 14 ++-
 contrib/pgstattuple/meson.build               | 18 +++-
 contrib/postgres_fdw/meson.build              |  6 ++
 contrib/seg/meson.build                       |  6 ++
 contrib/sepgsql/meson.build                   |  6 ++
 contrib/spi/meson.build                       | 48 ++++++++-
 contrib/sslinfo/meson.build                   | 14 ++-
 contrib/tablefunc/meson.build                 | 14 ++-
 contrib/tcn/meson.build                       | 14 ++-
 contrib/test_decoding/meson.build             |  6 ++
 contrib/tsm_system_rows/meson.build           | 14 ++-
 contrib/tsm_system_time/meson.build           | 14 ++-
 contrib/unaccent/meson.build                  | 14 ++-
 contrib/uuid-ossp/meson.build                 | 14 ++-
 contrib/vacuumlo/meson.build                  | 12 ++-
 contrib/xml2/meson.build                      | 16 ++-
 src/interfaces/ecpg/compatlib/meson.build     |  6 ++
 src/interfaces/ecpg/ecpglib/meson.build       |  6 ++
 src/interfaces/ecpg/pgtypeslib/meson.build    |  6 ++
 src/interfaces/ecpg/preproc/meson.build       |  6 ++
 src/interfaces/ecpg/test/meson.build          |  5 +
 src/test/isolation/meson.build                | 13 +++
 src/test/modules/delay_execution/meson.build  | 13 ++-
 src/test/modules/dummy_index_am/meson.build   | 13 ++-
 src/test/modules/dummy_seclabel/meson.build   | 13 ++-
 src/test/modules/libpq_pipeline/meson.build   | 14 ++-
 src/test/modules/plsample/meson.build         | 13 ++-
 src/test/modules/spgist_name_ops/meson.build  | 13 ++-
 .../ssl_passphrase_callback/meson.build       | 13 ++-
 src/test/modules/test_bloomfilter/meson.build | 13 ++-
 src/test/modules/test_ddl_deparse/meson.build | 13 ++-
 .../modules/test_ginpostinglist/meson.build   | 13 ++-
 src/test/modules/test_integerset/meson.build  | 13 ++-
 src/test/modules/test_lfind/meson.build       | 13 ++-
 src/test/modules/test_oat_hooks/meson.build   | 13 ++-
 src/test/modules/test_parser/meson.build      | 13 ++-
 src/test/modules/test_predtest/meson.build    | 13 ++-
 src/test/modules/test_rbtree/meson.build      | 13 ++-
 src/test/modules/test_regex/meson.build       | 13 ++-
 src/test/modules/test_rls_hooks/meson.build   | 13 ++-
 src/test/modules/test_shm_mq/meson.build      | 19 +++-
 src/test/modules/worker_spi/meson.build       | 15 ++-
 src/test/regress/meson.build                  |  6 ++
 meson.build                                   | 59 +++++++++++
 src/timezone/meson.build                      |  6 ++
 src/tools/rcgen                               | 99 +++++++++++++++++++
 118 files changed, 1286 insertions(+), 130 deletions(-)
 create mode 100755 src/tools/rcgen

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index de2e624ab58..5fb63768358 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -20,6 +20,12 @@ llvmjit_sources += files(
   'llvmjit_expr.c',
 )
 
+if host_system == 'windows'
+  llvmjit_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'llvmjit',
+    '--FILEDESC', 'llvmjit - JIT using LLVM',])
+endif
+
 llvmjit = shared_module('llvmjit',
   llvmjit_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
index 3fc786c80a0..4c653a05d36 100644
--- a/src/backend/replication/libpqwalreceiver/meson.build
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -2,6 +2,12 @@ libpqwalreceiver_sources = files(
   'libpqwalreceiver.c',
 )
 
+if host_system == 'windows'
+  libpqwalreceiver_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pqwalreceiver',
+    '--FILEDESC', 'libpqwalreceiver - receive WAL during streaming replication',])
+endif
+
 libpqwalreceiver = shared_module('pqwalreceiver',
   libpqwalreceiver_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
index ab956361a62..5df27d7b764 100644
--- a/src/backend/replication/pgoutput/meson.build
+++ b/src/backend/replication/pgoutput/meson.build
@@ -2,6 +2,12 @@ pgoutput_sources = files(
   'pgoutput.c',
 )
 
+if host_system == 'windows'
+  pgoutput_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgoutput',
+    '--FILEDESC', 'pgoutput - standard logical replication output plugin',])
+endif
+
 pgoutput = shared_module('pgoutput',
   pgoutput_sources,
   kwargs: pg_mod_args,
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 8c6f685cb32..974401d187e 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -58,6 +58,12 @@ dict_snowball_sources += files(
 # see comment in src/include/snowball/header.h
 stemmer_inc = include_directories('../../include/snowball')
 
+if host_system == 'windows'
+  dict_snowball_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_snowball',
+    '--FILEDESC', 'snowball - natural language stemmers',])
+endif
+
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
index 1bc971d1945..1c18f2ac85a 100644
--- a/src/backend/utils/mb/conversion_procs/meson.build
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -29,8 +29,15 @@ encodings = {
 }
 
 foreach encoding, sources : encodings
+  source_files = files(sources)
+
+  if host_system == 'windows'
+    source_files += rc_lib_gen.process(win32ver_rc, extra_args: [
+      '--NAME', encoding])
+  endif
+
   backend_targets += shared_module(encoding,
-    sources,
+    source_files,
     kwargs: pg_mod_args,
   )
 endforeach
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 9f213274d2f..6ced9a31b80 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -7,6 +7,12 @@ initdb_sources += timezone_localtime_source
 
 #fixme: reimplement libpq_pgport logic
 
+if host_system == 'windows'
+  initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'initdb',
+    '--FILEDESC', 'initdb - initialize a new database cluster',])
+endif
+
 initdb = executable('initdb',
   initdb_sources,
   include_directories: [timezone_inc],
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
index 8e197eba5f3..25f5e7a0948 100644
--- a/src/bin/pg_amcheck/meson.build
+++ b/src/bin/pg_amcheck/meson.build
@@ -1,7 +1,13 @@
 pg_amcheck_sources = files(
-  'pg_amcheck.c'
+  'pg_amcheck.c',
 )
 
+if host_system == 'windows'
+  pg_amcheck_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_amcheck',
+    '--FILEDESC', 'pg_amcheck - detect corruption within database relations',])
+endif
+
 pg_amcheck = executable('pg_amcheck',
   pg_amcheck_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
index 87a0d980c4f..aaa2e76977f 100644
--- a/src/bin/pg_archivecleanup/meson.build
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -1,5 +1,15 @@
+pg_archivecleanup_sources = files(
+  'pg_archivecleanup.c',
+)
+
+if host_system == 'windows'
+  pg_archivecleanup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_archivecleanup',
+    '--FILEDESC', 'pg_archivecleanup - cleans archive when used with streaming replication',])
+endif
+
 pg_archivecleanup = executable('pg_archivecleanup',
-  ['pg_archivecleanup.c'],
+  pg_archivecleanup_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index d26fed9cd8a..2c934e0c26e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -17,24 +17,56 @@ pg_basebackup_common = static_library('libpg_basebackup_common',
   kwargs: internal_lib_args,
 )
 
-pg_basebackup = executable('pg_basebackup',
+pg_basebackup_sources = files(
   'pg_basebackup.c',
+)
+
+if host_system == 'windows'
+  pg_basebackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_basebackup',
+    '--FILEDESC', 'pg_basebackup - streaming WAL and backup receivers',])
+endif
+
+pg_basebackup = executable('pg_basebackup',
+  pg_basebackup_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_basebackup
 
-pg_receivewal = executable('pg_receivewal',
+
+pg_receivewal_sources = files(
   'pg_receivewal.c',
+)
+
+if host_system == 'windows'
+  pg_receivewal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_receivewal',
+    '--FILEDESC', 'pg_receivewal - streaming WAL and backup receivers',])
+endif
+
+pg_receivewal = executable('pg_receivewal',
+  pg_receivewal_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_receivewal
 
-pg_recvlogical = executable('pg_recvlogical',
+
+pg_recvlogical_sources = files(
   'pg_recvlogical.c',
+)
+
+if host_system == 'windows'
+  pg_recvlogical_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_recvlogical',
+    '--FILEDESC', 'pg_recvlogical - streaming WAL and backup receivers',])
+endif
+
+pg_recvlogical = executable('pg_recvlogical',
+  pg_recvlogical_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
index ee1f367bac3..d07ebc999b3 100644
--- a/src/bin/pg_checksums/meson.build
+++ b/src/bin/pg_checksums/meson.build
@@ -1,5 +1,15 @@
+pg_checksums_sources = files(
+  'pg_checksums.c',
+)
+
+if host_system == 'windows'
+  pg_checksums_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_checksums',
+    '--FILEDESC', 'pg_checksums - verify data checksums in an offline cluster',])
+endif
+
 pg_checksums = executable('pg_checksums',
-  ['pg_checksums.c'],
+  pg_checksums_sources,
   include_directories: [timezone_inc],
   dependencies: [frontend_code],
   kwargs: default_bin_args,
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
index 0ecbf2f9d28..4be2fdc84ae 100644
--- a/src/bin/pg_config/meson.build
+++ b/src/bin/pg_config/meson.build
@@ -1,5 +1,15 @@
+pg_config_sources = files(
+  'pg_config.c',
+)
+
+if host_system == 'windows'
+  pg_config_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_config',
+    '--FILEDESC', 'pg_config - report configuration information',])
+endif
+
 pg_config = executable('pg_config',
-  ['pg_config.c'],
+  pg_config_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
index 557e672beb7..7fc239dbe65 100644
--- a/src/bin/pg_controldata/meson.build
+++ b/src/bin/pg_controldata/meson.build
@@ -1,5 +1,15 @@
+pg_controldata_sources = files(
+  'pg_controldata.c',
+)
+
+if host_system == 'windows'
+  pg_controldata_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_controldata',
+    '--FILEDESC', 'pg_controldata - reads the data from pg_control',])
+endif
+
 pg_controldata = executable('pg_controldata',
-  ['pg_controldata.c'],
+  pg_controldata_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
index 6812e73e329..96f962fa762 100644
--- a/src/bin/pg_ctl/meson.build
+++ b/src/bin/pg_ctl/meson.build
@@ -1,5 +1,15 @@
+pg_ctl_sources = files(
+  'pg_ctl.c',
+)
+
+if host_system == 'windows'
+  pg_ctl_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_ctl',
+    '--FILEDESC', 'pg_ctl - starts/stops/restarts the PostgreSQL server',])
+endif
+
 pg_ctl = executable('pg_ctl',
-  ['pg_ctl.c'],
+  pg_ctl_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 785ec094dbd..3527a25c288 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -24,6 +24,12 @@ pg_dump_sources = files(
   'pg_dump_sort.c',
 )
 
+if host_system == 'windows'
+  pg_dump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dump',
+    '--FILEDESC', 'pg_dump - backup one PostgreSQL database',])
+endif
+
 pg_dump = executable('pg_dump',
   pg_dump_sources,
   link_with: [pg_dump_common],
@@ -37,6 +43,12 @@ pg_dumpall_sources = files(
   'pg_dumpall.c',
 )
 
+if host_system == 'windows'
+  pg_dumpall_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dumpall',
+    '--FILEDESC', 'pg_dumpall - backup PostgreSQL databases'])
+endif
+
 pg_dumpall = executable('pg_dumpall',
   pg_dumpall_sources,
   link_with: [pg_dump_common],
@@ -50,6 +62,12 @@ pg_restore_sources = files(
   'pg_restore.c',
 )
 
+if host_system == 'windows'
+  pg_restore_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_restore',
+    '--FILEDESC', 'pg_restore - restore PostgreSQL databases'])
+endif
+
 pg_restore = executable('pg_restore',
   pg_restore_sources,
   link_with: [pg_dump_common],
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
index 7c5de134ac0..d503db97b71 100644
--- a/src/bin/pg_resetwal/meson.build
+++ b/src/bin/pg_resetwal/meson.build
@@ -1,5 +1,15 @@
+pg_resetwal_sources = files(
+  'pg_resetwal.c',
+)
+
+if host_system == 'windows'
+  pg_resetwal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_resetwal',
+    '--FILEDESC', 'pg_resetwal - reset PostgreSQL WAL log'])
+endif
+
 pg_resetwal = executable('pg_resetwal',
-  files('pg_resetwal.c'),
+  pg_resetwal_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index d8ec9e482d5..6cd970909a2 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -11,6 +11,12 @@ pg_rewind_sources = files(
 
 pg_rewind_sources += xlogreader_sources
 
+if host_system == 'windows'
+  pg_rewind_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_rewind',
+    '--FILEDESC', 'pg_rewind - synchronize a data directory with another one forked from'])
+endif
+
 pg_rewind = executable('pg_rewind',
   pg_rewind_sources,
   dependencies: [frontend_code, libpq, lz4, zstd],
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index 2c01831e11f..31d288ba6da 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -1,4 +1,12 @@
-test_fsync_sources = files('pg_test_fsync.c')
+test_fsync_sources = files(
+  'pg_test_fsync.c',
+)
+
+if host_system == 'windows'
+  test_fsync_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_fsync',
+    '--FILEDESC', 'pg_test_fsync - test various disk sync methods'])
+endif
 
 pg_test_fsync = executable('pg_test_fsync',
   test_fsync_sources,
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
index 0a3068f1657..0aed03ea32f 100644
--- a/src/bin/pg_test_timing/meson.build
+++ b/src/bin/pg_test_timing/meson.build
@@ -1,5 +1,15 @@
+pg_test_timing_sources = files(
+  'pg_test_timing.c'
+)
+
+if host_system == 'windows'
+  pg_test_timing_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_timing',
+    '--FILEDESC', 'pg_test_timing - test timing overhead'])
+endif
+
 pg_test_timing = executable('pg_test_timing',
-  ['pg_test_timing.c'],
+  pg_test_timing_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 02f030e0ccf..a7b927a45c7 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -16,6 +16,12 @@ pg_upgrade_sources = files(
   'version.c',
 )
 
+if host_system == 'windows'
+  pg_upgrade_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_upgrade',
+    '--FILEDESC', 'pg_upgrade - an in-place binary upgrade utility'])
+endif
+
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
index 4c3b2bb5f97..b934a408443 100644
--- a/src/bin/pg_verifybackup/meson.build
+++ b/src/bin/pg_verifybackup/meson.build
@@ -3,6 +3,12 @@ pg_verifybackup_sources = files(
   'pg_verifybackup.c'
 )
 
+if host_system == 'windows'
+  pg_verifybackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_verifybackup',
+    '--FILEDESC', 'pg_verifybackup - verify a backup against using a backup manifest'])
+endif
+
 pg_verifybackup = executable('pg_verifybackup',
   pg_verifybackup_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index 95872652ffd..9605976870d 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -8,6 +8,12 @@ pg_waldump_sources += rmgr_desc_sources
 pg_waldump_sources += xlogreader_sources
 pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
 
+if host_system == 'windows'
+  pg_waldump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_waldump',
+    '--FILEDESC', 'pg_waldump - decode and display WA'])
+endif
+
 pg_waldump = executable('pg_waldump',
   pg_waldump_sources,
   dependencies: [frontend_code, lz4, zstd],
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index 6564e54029c..a32eb51fe07 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -17,6 +17,12 @@ exprparse = custom_target('exprparse',
 generated_sources += exprparse.to_list()
 pgbench_sources += exprparse
 
+if host_system == 'windows'
+  pgbench_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgbench',
+    '--FILEDESC', 'pgbench - a simple program for running benchmark tests'])
+endif
+
 pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
index 7a468879fd2..2e9aea4b0e1 100644
--- a/src/bin/pgevent/meson.build
+++ b/src/bin/pgevent/meson.build
@@ -6,6 +6,12 @@ pgevent_sources = files(
   'pgevent.c',
 )
 
+pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+  '--NAME', 'pgevent',
+  '--FILEDESC', 'Eventlog message formatter',])
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
 # FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
 pgevent_link_args = []
 if cc.get_id() == 'msvc'
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 410788e4767..1264fc19fbd 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -36,6 +36,12 @@ sql_help = custom_target('psql_help',
 generated_sources += sql_help.to_list()
 psql_sources += sql_help
 
+if host_system == 'windows'
+  psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'psql',
+    '--FILEDESC', 'psql - the PostgreSQL interactive terminal',])
+endif
+
 psql = executable('psql',
   psql_sources,
   include_directories: include_directories('.'),
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index eaf250c7f73..837562c24e5 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -16,8 +16,16 @@ binaries = [
 ]
 
 foreach binary : binaries
+  binary_sources = files('@0@.c'.format(binary))
+
+  if host_system == 'windows'
+    binary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+      '--NAME', binary,
+      '--FILEDESC', '@0@ - PostgreSQL utility'.format(binary),])
+  endif
+
   binary = executable(binary,
-    files(binary + '.c'),
+    binary_sources,
     link_with: [scripts_common],
     dependencies: [frontend_code, libpq],
     kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index c203372a35b..63ab2fbacc2 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -16,9 +16,13 @@ libpq_sources = files(
   'libpq-events.c',
   'pqexpbuffer.c',
 )
+libpq_so_sources = [] # only for shared lib, in addition to above
 
 if host_system == 'windows'
   libpq_sources += files('pthread-win32.c', 'win32.c')
+  libpq_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq',
+    '--FILEDESC', 'PostgreSQL Access Library',])
 endif
 
 if ssl.found()
@@ -52,6 +56,7 @@ libpq_st = static_library('libpq',
 # not using both_libraries() here as the resource file should only be in the
 # shared library
 libpq_so = shared_library('libpq',
+  libpq_so_sources,
   dependencies: libpq_deps,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
index 16f94c1ed8b..017f729d435 100644
--- a/src/interfaces/libpq/test/meson.build
+++ b/src/interfaces/libpq/test/meson.build
@@ -1,13 +1,34 @@
+libpq_uri_regress_sources = files(
+  'libpq_uri_regress.c',
+)
+
+if host_system == 'windows'
+  libpq_uri_regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_uri_regress',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_uri_regress',
-  files('libpq_uri_regress.c'),
+  libpq_uri_regress_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
   }
 )
 
+
+libpq_testclient_sources = files(
+  'libpq_testclient.c',
+)
+
+if host_system == 'windows'
+  libpq_testclient_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_testclient',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_testclient',
-  files('libpq_testclient.c'),
+  libpq_testclient_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 73b733dd50b..535660085dd 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -36,6 +36,13 @@ foreach n : ['SPI', 'Util']
 endforeach
 
 plperl_inc = include_directories('.')
+
+if host_system == 'windows'
+  plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plperl',
+    '--FILEDESC', 'PL/Perl - procedural language',])
+endif
+
 plperl = shared_module('plperl',
   plperl_sources,
   include_directories: [plperl_inc, postgres_inc],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index dd499fdd151..c46c0a1da2a 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -40,6 +40,12 @@ pl_unreserved = custom_target('pl_unreserved_kwlist',
 generated_sources += pl_unreserved
 plpgsql_sources += pl_unreserved
 
+if host_system == 'windows'
+  plpgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpgsql',
+    '--FILEDESC', 'PL/pgSQL - procedural language',])
+endif
+
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
   include_directories: include_directories('.'),
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 366b3b171ac..40888386b5f 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -28,6 +28,12 @@ plpython_sources += custom_target('spiexceptions.h',
 # FIXME: need to duplicate import library ugliness?
 plpython_inc = include_directories('.')
 
+if host_system == 'windows'
+  plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpython3',
+    '--FILEDESC', 'PL/Python - procedural language',])
+endif
+
 plpython = shared_module('plpython3',
   plpython_sources,
   include_directories: [plpython_inc, postgres_inc],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index 9b6addd7fd5..f09bb14c950 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -14,6 +14,12 @@ pltcl_sources += custom_target('pltclerrcodes.h',
   command: [perl, gen_pltclerrcodes, '@INPUT@']
 )
 
+if host_system == 'windows'
+  pltcl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pltcl',
+    '--FILEDESC', 'PL/Tcl - procedural language',])
+endif
+
 pltcl = shared_module('pltcl',
   pltcl_sources,
   include_directories: [include_directories('.'), postgres_inc],
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
index fc2368d02cf..7efec0efbc0 100644
--- a/contrib/adminpack/meson.build
+++ b/contrib/adminpack/meson.build
@@ -1,5 +1,15 @@
+adminpack_sources = files(
+  'adminpack.c',
+)
+
+if host_system == 'windows'
+  adminpack_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'adminpack',
+    '--FILEDESC', 'adminpack - support functions for pgAdmin',])
+endif
+
 adminpack = shared_module('adminpack',
-  ['adminpack.c'],
+  adminpack_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += adminpack
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
index 1db3d20349e..fa807b72d98 100644
--- a/contrib/amcheck/meson.build
+++ b/contrib/amcheck/meson.build
@@ -1,7 +1,16 @@
-amcheck = shared_module('amcheck', [
-    'verify_heapam.c',
-    'verify_nbtree.c',
-  ],
+amcheck_sources = files(
+  'verify_heapam.c',
+  'verify_nbtree.c',
+)
+
+if host_system == 'windows'
+  amcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'amcheck',
+    '--FILEDESC', 'amcheck - function for verifying relation integrity',])
+endif
+
+amcheck = shared_module('amcheck',
+  amcheck_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += amcheck
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
index d2e01968f54..c4ffb0663bc 100644
--- a/contrib/auth_delay/meson.build
+++ b/contrib/auth_delay/meson.build
@@ -1,5 +1,15 @@
+auth_delay_sources = files(
+  'auth_delay.c',
+)
+
+if host_system == 'windows'
+  auth_delay_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auth_delay',
+    '--FILEDESC', 'auth_delay - delay authentication failure reports',])
+endif
+
 autoinc = shared_module('auth_delay',
-  ['auth_delay.c'],
+  auth_delay_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
index 249a8376faa..76f86617850 100644
--- a/contrib/auto_explain/meson.build
+++ b/contrib/auto_explain/meson.build
@@ -1,5 +1,15 @@
+auto_explain_sources = files(
+  'auto_explain.c',
+)
+
+if host_system == 'windows'
+  auto_explain_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auto_explain',
+    '--FILEDESC', 'auto_explain - logging facility for execution plans',])
+endif
+
 auto_explain = shared_module('auto_explain',
-  files('auto_explain.c'),
+  auto_explain_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += auto_explain
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
index 9f0517f1701..3a389de9175 100644
--- a/contrib/basebackup_to_shell/meson.build
+++ b/contrib/basebackup_to_shell/meson.build
@@ -2,6 +2,12 @@ basebackup_to_shell_sources = files(
   'basebackup_to_shell.c',
 )
 
+if host_system == 'windows'
+  basebackup_to_shell_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basebackup_to_shell',
+    '--FILEDESC', 'basebackup_to_shell - target basebackup to shell command',])
+endif
+
 basebackup_to_shell = shared_module('basebackup_to_shell',
   basebackup_to_shell_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index b67cbef60bd..c30dcfa5d41 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -2,6 +2,12 @@ basic_archive_sources = files(
   'basic_archive.c',
 )
 
+if host_system == 'windows'
+  basic_archive_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basic_archive',
+    '--FILEDESC', 'basic_archive - basic archive module',])
+endif
+
 basic_archive = shared_module('basic_archive',
   basic_archive_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 1fe7632bdbe..16f3b83e4d2 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -7,6 +7,12 @@ bloom_sources = files(
   'blvalidate.c',
 )
 
+if host_system == 'windows'
+  bloom_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bloom',
+    '--FILEDESC', 'bloom access method - signature file based index',])
+endif
+
 bloom = shared_module('bloom',
   bloom_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
index c20b667d75f..a68daab0dcd 100644
--- a/contrib/bool_plperl/meson.build
+++ b/contrib/bool_plperl/meson.build
@@ -6,6 +6,12 @@ bool_plperl_sources = files(
   'bool_plperl.c',
 )
 
+if host_system == 'windows'
+  bool_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bool_plperl',
+    '--FILEDESC', 'bool_plperl - bool transform for plperl',])
+endif
+
 bool_plperl = shared_module('bool_plperl',
   bool_plperl_sources,
   include_directories: [plperl_inc, include_directories('.')],
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
index 15d6d31a6ee..fd4c76767a7 100644
--- a/contrib/btree_gin/meson.build
+++ b/contrib/btree_gin/meson.build
@@ -1,5 +1,15 @@
+btree_gin_sources = files(
+  'btree_gin.c',
+)
+
+if host_system == 'windows'
+  btree_gin_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gin',
+    '--FILEDESC', 'btree_gin - B-tree equivalent GIN operator classes',])
+endif
+
 btree_gin = shared_module('btree_gin',
-  files('btree_gin.c'),
+  btree_gin_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gin
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index c0a8d238540..e98c91dacc8 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -25,6 +25,12 @@ btree_gist_sources = files(
   'btree_uuid.c',
 )
 
+if host_system == 'windows'
+  btree_gist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gist',
+    '--FILEDESC', 'btree_gist - B-tree equivalent GiST operator classes',])
+endif
+
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
index ca60eded80b..26a101a19bd 100644
--- a/contrib/citext/meson.build
+++ b/contrib/citext/meson.build
@@ -2,6 +2,12 @@ citext_sources = files(
   'citext.c',
 )
 
+if host_system == 'windows'
+  citext_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'citext',
+    '--FILEDESC', 'citext - case-insensitive character string data type',])
+endif
+
 citext = shared_module('citext',
   citext_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index 72342b0c82c..041acf95a90 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -17,6 +17,12 @@ cube_parse = custom_target('cubeparse',
 generated_sources += cube_parse.to_list()
 cube_sources += cube_parse
 
+if host_system == 'windows'
+  cube_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'cube',
+    '--FILEDESC', 'cube - multidimensional cube data type',])
+endif
+
 cube = shared_module('cube',
   cube_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
index d35f7b5d49e..66eeb03b736 100644
--- a/contrib/dblink/meson.build
+++ b/contrib/dblink/meson.build
@@ -2,6 +2,12 @@ dblink_sources = files(
   'dblink.c',
 )
 
+if host_system == 'windows'
+  dblink_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dblink',
+    '--FILEDESC', 'dblink - connect to other PostgreSQL databases',])
+endif
+
 dblink = shared_module('dblink',
   dblink_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
index f00e8085619..6fff921adda 100644
--- a/contrib/dict_int/meson.build
+++ b/contrib/dict_int/meson.build
@@ -1,5 +1,15 @@
+dict_int_sources = files(
+  'dict_int.c',
+)
+
+if host_system == 'windows'
+  dict_int_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_int',
+    '--FILEDESC', 'dict_int - add-on dictionary template for full-text search',])
+endif
+
 dict_int = shared_module('dict_int',
-  files('dict_int.c'),
+  dict_int_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_int
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
index be53f55bb79..fabd505a7df 100644
--- a/contrib/dict_xsyn/meson.build
+++ b/contrib/dict_xsyn/meson.build
@@ -1,5 +1,15 @@
+dict_xsyn_sources = files(
+  'dict_xsyn.c',
+)
+
+if host_system == 'windows'
+  dict_xsyn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_xsyn',
+    '--FILEDESC', 'dict_xsyn - add-on dictionary template for full-text search',])
+endif
+
 dict_xsyn = shared_module('dict_xsyn',
-  files('dict_xsyn.c'),
+  dict_xsyn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_xsyn
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
index 807f5cb7de3..78dc29c3da3 100644
--- a/contrib/earthdistance/meson.build
+++ b/contrib/earthdistance/meson.build
@@ -1,5 +1,15 @@
+earthdistance_sources = files(
+  'earthdistance.c',
+)
+
+if host_system == 'windows'
+  earthdistance_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'earthdistance',
+    '--FILEDESC', 'earthdistance - calculate distances on the surface of the Earth',])
+endif
+
 earthdistance = shared_module('earthdistance',
-  files('earthdistance.c'),
+  earthdistance_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += earthdistance
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
index f13efb6e38e..c4071faa669 100644
--- a/contrib/file_fdw/meson.build
+++ b/contrib/file_fdw/meson.build
@@ -1,5 +1,15 @@
+file_fdw_sources = files(
+  'file_fdw.c',
+)
+
+if host_system == 'windows'
+  file_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'file_fdw',
+    '--FILEDESC', 'file_fdw - foreign data wrapper for files',])
+endif
+
 file_fdw = shared_module('file_fdw',
-  files('file_fdw.c'),
+  file_fdw_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += file_fdw
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
index ec278a6211e..e6d06149cec 100644
--- a/contrib/fuzzystrmatch/meson.build
+++ b/contrib/fuzzystrmatch/meson.build
@@ -1,8 +1,16 @@
+fuzzystrmatch_sources = files(
+  'fuzzystrmatch.c',
+  'dmetaphone.c',
+)
+
+if host_system == 'windows'
+  fuzzystrmatch_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'fuzzystrmatch',
+    '--FILEDESC', 'fuzzystrmatch - similarities and distance between strings',])
+endif
+
 fuzzystrmatch = shared_module('fuzzystrmatch',
-  files(
-    'fuzzystrmatch.c',
-    'dmetaphone.c'
-  ),
+  fuzzystrmatch_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += fuzzystrmatch
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 07c59f40a97..2bb26bb772b 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -1,15 +1,23 @@
 # .. so that includes of hstore/hstore.h work
 hstore_inc = include_directories('.', '../')
 
+hstore_sources = files(
+  'hstore_compat.c',
+  'hstore_gin.c',
+  'hstore_gist.c',
+  'hstore_io.c',
+  'hstore_op.c',
+  'hstore_subs.c',
+)
+
+if host_system == 'windows'
+  hstore_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore',
+    '--FILEDESC', 'hstore - key/value pair data type',])
+endif
+
 hstore = shared_module('hstore',
-  files(
-    'hstore_compat.c',
-    'hstore_gin.c',
-    'hstore_gist.c',
-    'hstore_io.c',
-    'hstore_op.c',
-    'hstore_subs.c',
-  ),
+  hstore_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
index bbafa0221bd..a238fee6a26 100644
--- a/contrib/hstore_plperl/meson.build
+++ b/contrib/hstore_plperl/meson.build
@@ -6,6 +6,12 @@ hstore_plperl_sources = files(
   'hstore_plperl.c',
 )
 
+if host_system == 'windows'
+  hstore_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plperl',
+    '--FILEDESC', 'hstore_plperl - hstore transform for plperl',])
+endif
+
 hstore_plperl = shared_module('hstore_plperl',
   hstore_plperl_sources,
   include_directories: [plperl_inc, hstore_inc],
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
index 214b48519a9..6071aaeb4b3 100644
--- a/contrib/hstore_plpython/meson.build
+++ b/contrib/hstore_plpython/meson.build
@@ -6,6 +6,12 @@ hstore_plpython_sources = files(
   'hstore_plpython.c',
 )
 
+if host_system == 'windows'
+  hstore_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plpython3',
+    '--FILEDESC', 'hstore_plpython - hstore transform for plpython',])
+endif
+
 hstore_plpython = shared_module('hstore_plpython3',
   hstore_plpython_sources,
   include_directories: [plpython_inc, hstore_inc, ],
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
index 1655bcbb3fd..b7cf1ce0cad 100644
--- a/contrib/intarray/meson.build
+++ b/contrib/intarray/meson.build
@@ -8,6 +8,12 @@ intarray_sources = files(
   '_intbig_gist.c',
 )
 
+if host_system == 'windows'
+  intarray_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', '_int',
+    '--FILEDESC', 'intarray - functions and operators for arrays of integers',])
+endif
+
 intarray = shared_module('_int',
   intarray_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
index cc30bbeb55c..db68a718313 100644
--- a/contrib/isn/meson.build
+++ b/contrib/isn/meson.build
@@ -2,6 +2,12 @@ isn_sources = files(
   'isn.c',
 )
 
+if host_system == 'windows'
+  isn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isn',
+    '--FILEDESC', 'isn - data types for international product numbering standards',])
+endif
+
 isn = shared_module('isn',
   isn_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
index 5c915d8ed94..071a7a98d2c 100644
--- a/contrib/jsonb_plperl/meson.build
+++ b/contrib/jsonb_plperl/meson.build
@@ -6,6 +6,12 @@ jsonb_plperl_sources = files(
   'jsonb_plperl.c',
 )
 
+if host_system == 'windows'
+  jsonb_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plperl',
+    '--FILEDESC', 'jsonb_plperl - jsonb transform for plperl',])
+endif
+
 jsonb_plperl = shared_module('jsonb_plperl',
   jsonb_plperl_sources,
   include_directories: [plperl_inc],
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
index de8e1105c6a..84dc1161e8b 100644
--- a/contrib/jsonb_plpython/meson.build
+++ b/contrib/jsonb_plpython/meson.build
@@ -6,6 +6,12 @@ jsonb_plpython_sources = files(
   'jsonb_plpython.c',
 )
 
+if host_system == 'windows'
+  jsonb_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plpython3',
+    '--FILEDESC', 'jsonb_plpython - jsonb transform for plpython',])
+endif
+
 jsonb_plpython = shared_module('jsonb_plpython3',
   jsonb_plpython_sources,
   include_directories: [plpython_inc],
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
index 9082d5713c7..61ae131f1cc 100644
--- a/contrib/lo/meson.build
+++ b/contrib/lo/meson.build
@@ -2,6 +2,12 @@ lo_sources = files(
   'lo.c',
 )
 
+if host_system == 'windows'
+  lo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'lo',
+    '--FILEDESC', 'lo - management for large objects',])
+endif
+
 lo = shared_module('lo',
   lo_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
index 9463fc2c5e5..421292cea9d 100644
--- a/contrib/ltree/meson.build
+++ b/contrib/ltree/meson.build
@@ -13,6 +13,12 @@ ltree_sources = files(
 # .. so that includes of ltree/ltree.h work
 ltree_inc = include_directories('.', '../')
 
+if host_system == 'windows'
+  ltree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree',
+    '--FILEDESC', 'ltree - hierarchical label data type',])
+endif
+
 ltree = shared_module('ltree',
   ltree_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
index 429d75006aa..acf5e4a6fc8 100644
--- a/contrib/ltree_plpython/meson.build
+++ b/contrib/ltree_plpython/meson.build
@@ -6,6 +6,12 @@ ltree_plpython_sources = files(
   'ltree_plpython.c',
 )
 
+if host_system == 'windows'
+  ltree_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree_plpython3',
+    '--FILEDESC', 'ltree_plpython - ltree transform for plpython',])
+endif
+
 ltree_plpython = shared_module('ltree_plpython3',
   ltree_plpython_sources,
   include_directories: [plpython_inc, ltree_inc],
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
index 1dad5d8f6e7..1a248f19260 100644
--- a/contrib/oid2name/meson.build
+++ b/contrib/oid2name/meson.build
@@ -1,5 +1,15 @@
+oid2name_sources = files(
+  'oid2name.c',
+)
+
+if host_system == 'windows'
+  oid2name_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'oid2name',
+    '--FILEDESC', 'oid2name - examine the file structure',])
+endif
+
 oid2name = executable('oid2name',
-  ['oid2name.c'],
+  oid2name_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
index 8e7ee09a43a..77276c3715a 100644
--- a/contrib/old_snapshot/meson.build
+++ b/contrib/old_snapshot/meson.build
@@ -2,6 +2,12 @@ old_snapshot_sources = files(
   'time_mapping.c',
 )
 
+if host_system == 'windows'
+  old_snapshot_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'old_snapshot',
+    '--FILEDESC', 'old_snapshot - utilities in support of old_snapshot_threshold',])
+endif
+
 old_snapshot = shared_module('old_snapshot',
   old_snapshot_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
index 4af8153e4fd..3ec50b9445e 100644
--- a/contrib/pageinspect/meson.build
+++ b/contrib/pageinspect/meson.build
@@ -9,6 +9,12 @@ pageinspect_sources = files(
   'rawpage.c',
 )
 
+if host_system == 'windows'
+  pageinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pageinspect',
+    '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',])
+endif
+
 pageinspect = shared_module('pageinspect',
   pageinspect_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
index 7da47d02f1d..383d7df372a 100644
--- a/contrib/passwordcheck/meson.build
+++ b/contrib/passwordcheck/meson.build
@@ -9,6 +9,12 @@ passwordcheck_deps = []
 # passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
 # passwordcheck_deps += [cc.find_library('crack')]
 
+if host_system == 'windows'
+  passwordcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'passwordcheck',
+    '--FILEDESC', 'passwordcheck - strengthen user password checks',])
+endif
+
 passwordcheck = shared_module('passwordcheck',
   passwordcheck_sources,
   c_args: passwordcheck_c_args,
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
index 2c69eae3ea2..dd9948e5f0b 100644
--- a/contrib/pg_buffercache/meson.build
+++ b/contrib/pg_buffercache/meson.build
@@ -1,7 +1,15 @@
+pg_buffercache_sources = files(
+  'pg_buffercache_pages.c',
+)
+
+if host_system == 'windows'
+  pg_buffercache_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_buffercache',
+    '--FILEDESC', 'pg_buffercache - monitoring of shared buffer cache in real-time',])
+endif
+
 pg_buffercache = shared_module('pg_buffercache',
-  files(
-    'pg_buffercache_pages.c',
-  ),
+  pg_buffercache_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_buffercache
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index f795014d7ca..904b37b6e9b 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -1,7 +1,15 @@
+pg_freespacemap_sources = files(
+  'pg_freespacemap.c',
+)
+
+if host_system == 'windows'
+  pg_freespacemap_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_freespacemap',
+    '--FILEDESC', 'pg_freespacemap - monitoring of free space map',])
+endif
+
 pg_freespacemap = shared_module('pg_freespacemap',
-  files(
-    'pg_freespacemap.c',
-  ),
+  pg_freespacemap_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_freespacemap
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
index bdca9af4f27..b7140cee34b 100644
--- a/contrib/pg_prewarm/meson.build
+++ b/contrib/pg_prewarm/meson.build
@@ -1,8 +1,16 @@
+pg_prewarm_sources = files(
+  'autoprewarm.c',
+  'pg_prewarm.c',
+)
+
+if host_system == 'windows'
+  pg_prewarm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_prewarm',
+    '--FILEDESC', 'pg_prewarm - preload relation data into system buffer cache',])
+endif
+
 pg_prewarm = shared_module('pg_prewarm',
-  files(
-    'autoprewarm.c',
-    'pg_prewarm.c',
-  ),
+  pg_prewarm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_prewarm
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index ac117d2fc1d..854df138e76 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -1,5 +1,15 @@
+pg_stat_statements_sources = files(
+  'pg_stat_statements.c',
+)
+
+if host_system == 'windows'
+  pg_stat_statements_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_stat_statements',
+    '--FILEDESC', 'pg_stat_statements - execution statistics of SQL statements',])
+endif
+
 pg_stat_statements = shared_module('pg_stat_statements',
-  files('pg_stat_statements.c'),
+  pg_stat_statements_sources,
   kwargs: contrib_mod_args + {
     'dependencies': contrib_mod_args['dependencies'],
   },
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
index ac71caa5276..7b5c5999f4b 100644
--- a/contrib/pg_surgery/meson.build
+++ b/contrib/pg_surgery/meson.build
@@ -1,7 +1,15 @@
+pg_surgery_sources = files(
+  'heap_surgery.c',
+)
+
+if host_system == 'windows'
+  pg_surgery_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_surgery',
+    '--FILEDESC', 'pg_surgery - perform surgery on a damaged relation',])
+endif
+
 pg_surgery = shared_module('pg_surgery',
-  files(
-    'heap_surgery.c',
-  ),
+  pg_surgery_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_surgery
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index a90628d23c6..c8c7c07b308 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -1,10 +1,18 @@
+pg_trgm_sources = files(
+  'trgm_gin.c',
+  'trgm_gist.c',
+  'trgm_op.c',
+  'trgm_regexp.c',
+)
+
+if host_system == 'windows'
+  pg_trgm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_trgm',
+    '--FILEDESC', 'pg_trgm - trigram matching',])
+endif
+
 pg_trgm = shared_module('pg_trgm',
-  files(
-    'trgm_gin.c',
-    'trgm_gist.c',
-    'trgm_op.c',
-    'trgm_regexp.c',
-  ),
+  pg_trgm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
index 933dc99ac4d..263a0d08b82 100644
--- a/contrib/pg_visibility/meson.build
+++ b/contrib/pg_visibility/meson.build
@@ -1,7 +1,15 @@
+pg_visibility_sources = files(
+  'pg_visibility.c',
+)
+
+if host_system == 'windows'
+  pg_visibility_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_visibility',
+    '--FILEDESC', 'pg_visibility - page visibility information',])
+endif
+
 pg_visibility = shared_module('pg_visibility',
-  files(
-    'pg_visibility.c',
-  ),
+  pg_visibility_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_visibility
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index d6b27877dd0..4314a3182a2 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -1,5 +1,11 @@
 pg_walinspect_sources = files('pg_walinspect.c')
 
+if host_system == 'windows'
+  pg_walinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_walinspect',
+    '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',])
+endif
+
 pg_walinspect = shared_module('pg_walinspect',
   pg_walinspect_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index fe0851bf8e8..7fc7bbc7ca1 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -69,6 +69,12 @@ else
   pgcrypto_regress += 'pgp-zlib-DISABLED'
 endif
 
+if host_system == 'windows'
+  pgcrypto_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgcrypto',
+    '--FILEDESC', 'pgcrypto - cryptographic functions',])
+endif
+
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
index 1b41691a2a3..8092f0d4a64 100644
--- a/contrib/pgrowlocks/meson.build
+++ b/contrib/pgrowlocks/meson.build
@@ -1,7 +1,15 @@
+pgrowlocks_sources = files(
+  'pgrowlocks.c',
+)
+
+if host_system == 'windows'
+  pgrowlocks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgrowlocks',
+    '--FILEDESC', 'pgrowlocks - display row locking information',])
+endif
+
 pgrowlocks = shared_module('pgrowlocks',
-  files(
-    'pgrowlocks.c',
-  ),
+  pgrowlocks_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgrowlocks
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 8e828692d5c..05e4cd46a5c 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -1,9 +1,17 @@
+pgstattuple_sources = files(
+  'pgstatapprox.c',
+  'pgstatindex.c',
+  'pgstattuple.c',
+)
+
+if host_system == 'windows'
+  pgstattuple_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgstattuple',
+    '--FILEDESC', 'pgstattuple - tuple-level statistics',])
+endif
+
 pgstattuple = shared_module('pgstattuple',
-  files(
-    'pgstatapprox.c',
-    'pgstatindex.c',
-    'pgstattuple.c',
-  ),
+  pgstattuple_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
index 378885ec93b..d3746ff135c 100644
--- a/contrib/postgres_fdw/meson.build
+++ b/contrib/postgres_fdw/meson.build
@@ -6,6 +6,12 @@ postgres_fdw_sources = files(
   'shippable.c',
 )
 
+if host_system == 'windows'
+  postgres_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'postgres_fdw',
+    '--FILEDESC', 'postgres_fdw - foreign data wrapper for PostgreSQL',])
+endif
+
 postgres_fdw = shared_module('postgres_fdw',
   postgres_fdw_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
index e476eab2a77..c6fbb22999b 100644
--- a/contrib/seg/meson.build
+++ b/contrib/seg/meson.build
@@ -17,6 +17,12 @@ seg_parse = custom_target('segparse',
 generated_sources += seg_parse.to_list()
 seg_sources += seg_parse
 
+if host_system == 'windows'
+  seg_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'seg',
+    '--FILEDESC', 'seg - line segment data type',])
+endif
+
 seg = shared_module('seg',
   seg_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 60a95e17c2f..8bef239e3c2 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -14,6 +14,12 @@ sepgsql_sources = files(
   'uavc.c',
 )
 
+if host_system == 'windows'
+  sepgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sepgsql',
+    '--FILEDESC', 'sepgsql - SELinux integration',])
+endif
+
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
index 98008980ec2..e7d78189ef5 100644
--- a/contrib/spi/meson.build
+++ b/contrib/spi/meson.build
@@ -1,5 +1,15 @@
+autoinc_sources = files(
+  'autoinc.c',
+)
+
+if host_system == 'windows'
+  autoinc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'autoinc',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 autoinc = shared_module('autoinc',
-  ['autoinc.c'],
+  autoinc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
@@ -9,8 +19,18 @@ install_data('autoinc.control', 'autoinc--1.0.sql',
 )
 
 
+insert_username_sources = files(
+  'insert_username.c',
+)
+
+if host_system == 'windows'
+  insert_username_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'insert_username',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 insert_username = shared_module('insert_username',
-  ['insert_username.c'],
+  insert_username_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += insert_username
@@ -22,8 +42,18 @@ install_data(
 )
 
 
+moddatetime_sources = files(
+  'moddatetime.c',
+)
+
+if host_system == 'windows'
+  moddatetime_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'moddatetime',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 moddatetime = shared_module('moddatetime',
-  ['moddatetime.c'],
+  moddatetime_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += moddatetime
@@ -38,8 +68,18 @@ install_data(
 # comment out if you want a quieter refint package for other uses
 refint_cflags = ['-DREFINT_VERBOSE']
 
+refint_sources = files(
+  'refint.c',
+)
+
+if host_system == 'windows'
+  refint_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'refint',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 refint = shared_module('refint',
-  ['refint.c'],
+  refint_sources,
   c_args: refint_cflags,
   kwargs: contrib_mod_args,
 )
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
index 53f752a08ac..136983e783d 100644
--- a/contrib/sslinfo/meson.build
+++ b/contrib/sslinfo/meson.build
@@ -2,10 +2,18 @@ if not ssl.found()
   subdir_done()
 endif
 
+sslinfo_sources = files(
+  'sslinfo.c',
+)
+
+if host_system == 'windows'
+  sslinfo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sslinfo',
+    '--FILEDESC', 'sslinfo - information about client SSL certificate',])
+endif
+
 sslinfo = shared_module('sslinfo',
-  files(
-    'sslinfo.c',
-  ),
+  sslinfo_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [ssl, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
index f4230096c0c..d2ddc8d3b39 100644
--- a/contrib/tablefunc/meson.build
+++ b/contrib/tablefunc/meson.build
@@ -1,7 +1,15 @@
+tablefunc_sources = files(
+  'tablefunc.c',
+)
+
+if host_system == 'windows'
+  tablefunc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tablefunc',
+    '--FILEDESC', 'tablefunc - various functions that return tables',])
+endif
+
 tablefunc = shared_module('tablefunc',
-  files(
-    'tablefunc.c',
-  ),
+  tablefunc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tablefunc
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
index c3a025247d4..71261c3b0a2 100644
--- a/contrib/tcn/meson.build
+++ b/contrib/tcn/meson.build
@@ -1,7 +1,15 @@
+tcn_sources = files(
+  'tcn.c',
+)
+
+if host_system == 'windows'
+  tcn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tcn',
+    '--FILEDESC', 'tcn - trigger function notifying listeners',])
+endif
+
 tcn = shared_module('tcn',
-  files(
-    'tcn.c',
-  ),
+  tcn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tcn
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index dd7cb0101ad..6376103c689 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -2,6 +2,12 @@ test_decoding_sources = files(
   'test_decoding.c',
 )
 
+if host_system == 'windows'
+  test_decoding_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_decoding',
+    '--FILEDESC', 'test_decoding - example of a logical decoding output plugin',])
+endif
+
 test_decoding = shared_module('test_decoding',
   test_decoding_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
index b9cd42115a8..380abb49883 100644
--- a/contrib/tsm_system_rows/meson.build
+++ b/contrib/tsm_system_rows/meson.build
@@ -1,7 +1,15 @@
+tsm_system_rows_sources = files(
+  'tsm_system_rows.c',
+)
+
+if host_system == 'windows'
+  tsm_system_rows_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_rows',
+    '--FILEDESC', 'tsm_system_rows - TABLESAMPLE method which accepts number of rows as a limit',])
+endif
+
 tsm_system_rows = shared_module('tsm_system_rows',
-  files(
-    'tsm_system_rows.c',
-  ),
+  tsm_system_rows_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_rows
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
index 18015912ffb..e57a2702c60 100644
--- a/contrib/tsm_system_time/meson.build
+++ b/contrib/tsm_system_time/meson.build
@@ -1,7 +1,15 @@
+tsm_system_time_sources = files(
+  'tsm_system_time.c',
+)
+
+if host_system == 'windows'
+  tsm_system_time_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_time',
+    '--FILEDESC', 'tsm_system_time - TABLESAMPLE method which accepts time in milliseconds as a limit',])
+endif
+
 tsm_system_time = shared_module('tsm_system_time',
-  files(
-    'tsm_system_time.c',
-  ),
+  tsm_system_time_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_time
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
index 872b76e3223..438035132f8 100644
--- a/contrib/unaccent/meson.build
+++ b/contrib/unaccent/meson.build
@@ -1,7 +1,15 @@
+unaccent_sources = files(
+  'unaccent.c',
+)
+
+if host_system == 'windows'
+  unaccent_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'unaccent',
+    '--FILEDESC', 'unaccent - text search dictionary that removes accents',])
+endif
+
 unaccent = shared_module('unaccent',
-  files(
-    'unaccent.c',
-  ),
+  unaccent_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += unaccent
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
index da6d1d75c12..28730f398f0 100644
--- a/contrib/uuid-ossp/meson.build
+++ b/contrib/uuid-ossp/meson.build
@@ -2,10 +2,18 @@ if not uuid.found()
   subdir_done()
 endif
 
+uuid_ossp_sources = files(
+  'uuid-ossp.c',
+)
+
+if host_system == 'windows'
+  uuid_ossp_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'uuid-ossp',
+    '--FILEDESC', 'uuid-ossp - UUID generation',])
+endif
+
 uuid_ossp = shared_module('uuid-ossp',
-  files(
-    'uuid-ossp.c',
-  ),
+  uuid_ossp_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [uuid, contrib_mod_args['dependencies']],
   },
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
index 7a632b87d1b..846de47dbd1 100644
--- a/contrib/vacuumlo/meson.build
+++ b/contrib/vacuumlo/meson.build
@@ -1,5 +1,15 @@
+vacuumlo_sources = files(
+  'vacuumlo.c',
+)
+
+if host_system == 'windows'
+  vacuumlo_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'vacuumlo',
+    '--FILEDESC', 'vacuumlo - removes orphaned large objects',])
+endif
+
 vacuumlo = executable('vacuumlo',
-  ['vacuumlo.c'],
+  vacuumlo_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 9c0b56f01f6..89b0d677516 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -2,11 +2,19 @@ if not libxml.found()
   subdir_done()
 endif
 
+xml2_sources = files(
+  'xpath.c',
+  'xslt_proc.c',
+)
+
+if host_system == 'windows'
+  xml2_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgxml',
+    '--FILEDESC', 'xml2 - XPath querying and XSLT',])
+endif
+
 xml2 = shared_module('pgxml',
-  files(
-    'xpath.c',
-    'xslt_proc.c',
-  ),
+  xml2_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 7aeb627ee86..aa9ab497832 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -7,6 +7,12 @@ ecpg_compat_inc = ['.', ecpg_inc, postgres_inc, libpq_inc]
 ecpg_compat_c_args = ['-DSO_MAJOR_VERSION=3']
 export_file = custom_target('libecpg_compat.exports', kwargs: gen_export_kwargs)
 
+if host_system == 'windows'
+  ecpg_compat_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libecpg_compat',
+    '--FILEDESC', 'ECPG compat - compatibility library for ECPG',])
+endif
+
 # not using both_libraries(), as the resource file should only be in the
 # shared library
 ecpg_compat_st = static_library('libecpg_compat',
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index eb8dd616571..fd40ee86610 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -16,6 +16,12 @@ ecpglib_inc = ['.', ecpg_inc, postgres_inc]
 ecpglib_c_args = ['-DSO_MAJOR_VERSION=6']
 export_file = custom_target('libecpg.exports', kwargs: gen_export_kwargs)
 
+if host_system == 'windows'
+  ecpglib_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libecpg',
+    '--FILEDESC', 'ECPG - embedded SQL in C',])
+endif
+
 # not using both_libraries(), as the resource file should only be in the
 # shared library
 ecpglib_st = static_library('libecpg',
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 5254843f84d..53cdad36422 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -12,6 +12,12 @@ export_file = custom_target('libpgtypes.exports', kwargs: gen_export_kwargs)
 ecpg_pgtypes_inc = ['.', ecpg_inc, postgres_inc]
 ecpg_pgtypes_c_args = ['-DSO_MAJOR_VERSION=3']
 
+if host_system == 'windows'
+  ecpg_pgtypes_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgtypes',
+    '--FILEDESC', 'pgtypes - library for data type mapping',])
+endif
+
 # not using both_libraries(), as the resource file should only be in the
 # shared library
 ecpg_pgtypes_st = static_library('libpgtypes',
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 1be49c8c27f..74876f039c9 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -93,6 +93,12 @@ ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
 generated_sources += ecpg_kwlist
 ecpg_sources += ecpg_kwlist
 
+if host_system == 'windows'
+  ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ecpg',
+    '--FILEDESC', 'ecpg - embedded SQL precompiler for C',])
+endif
+
 ecpg_exe = executable('ecpg',
   ecpg_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index 8904aa7fd90..94b26d10314 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -7,6 +7,11 @@ pg_regress_ecpg_sources = pg_regress_c + files(
   'pg_regress_ecpg.c',
 )
 
+if host_system == 'windows'
+  pg_regress_ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress_ecpg',])
+endif
+
 pg_regress_ecpg = executable('pg_regress_ecpg',
   pg_regress_ecpg_sources,
   c_args: pg_regress_cflags,
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index c7656fd4609..ba27b8c1d44 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -23,6 +23,12 @@ spec_parser = custom_target('specparse',
 isolationtester_sources += spec_parser
 generated_sources += spec_parser.to_list()
 
+if host_system == 'windows'
+  isolation_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_isolation_regress',
+    '--FILEDESC', 'pg_isolation_regress - multi-client test driver',])
+endif
+
 pg_isolation_regress = executable('pg_isolation_regress',
   isolation_sources,
   c_args: pg_regress_cflags,
@@ -34,6 +40,13 @@ pg_isolation_regress = executable('pg_isolation_regress',
 )
 bin_targets += pg_isolation_regress
 
+
+if host_system == 'windows'
+  isolationtester_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isolationtester',
+    '--FILEDESC', 'isolationtester - multi-client test driver',])
+endif
+
 isolationtester = executable('isolationtester',
   isolationtester_sources,
   include_directories: include_directories('.'),
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
index cf4bdaba637..a0c3ab6afe7 100644
--- a/src/test/modules/delay_execution/meson.build
+++ b/src/test/modules/delay_execution/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+delay_execution_sources = files(
+  'delay_execution.c',
+)
+
+if host_system == 'windows'
+  delay_execution_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'delay_execution',
+    '--FILEDESC', 'delay_execution - allow delay between parsing and execution',])
+endif
+
 delay_execution = shared_module('delay_execution',
-  ['delay_execution.c'],
+  delay_execution_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += delay_execution
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
index 56ff5f48001..4ce82491135 100644
--- a/src/test/modules/dummy_index_am/meson.build
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_index_am_sources = files(
+  'dummy_index_am.c',
+)
+
+if host_system == 'windows'
+  dummy_index_am_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_index_am',
+    '--FILEDESC', 'dummy_index_am - index access method template',])
+endif
+
 dummy_index_am = shared_module('dummy_index_am',
-  ['dummy_index_am.c'],
+  dummy_index_am_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_index_am
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
index 21b7cf8f353..81b626e496c 100644
--- a/src/test/modules/dummy_seclabel/meson.build
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_seclabel_sources = files(
+  'dummy_seclabel.c',
+)
+
+if host_system == 'windows'
+  dummy_seclabel_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_seclabel',
+    '--FILEDESC', 'dummy_seclabel - regression testing of the SECURITY LABEL statement',])
+endif
+
 dummy_seclabel = shared_module('dummy_seclabel',
-  ['dummy_seclabel.c'],
+  dummy_seclabel_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_seclabel
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
index 8384b6e3b2a..de0e2d15626 100644
--- a/src/test/modules/libpq_pipeline/meson.build
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -1,7 +1,15 @@
+libpq_pipeline_sources = files(
+  'libpq_pipeline.c',
+)
+
+if host_system == 'windows'
+  libpq_pipeline_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_pipeline',
+    '--FILEDESC', 'libpq_pipeline - test program for pipeline execution',])
+endif
+
 libpq_pipeline = executable('libpq_pipeline',
-  files(
-    'libpq_pipeline.c',
-  ),
+  libpq_pipeline_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
index 45de3f1990d..e1ea2c7a16f 100644
--- a/src/test/modules/plsample/meson.build
+++ b/src/test/modules/plsample/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+plsample_sources = files(
+  'plsample.c',
+)
+
+if host_system == 'windows'
+  plsample_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plsample',
+    '--FILEDESC', 'PL/Sample - template for procedural language',])
+endif
+
 plsample = shared_module('plsample',
-  ['plsample.c'],
+  plsample_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += plsample
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
index 857fc7e140e..445296fee0b 100644
--- a/src/test/modules/spgist_name_ops/meson.build
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+spgist_name_ops_sources = files(
+  'spgist_name_ops.c',
+)
+
+if host_system == 'windows'
+  spgist_name_ops_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'spgist_name_ops',
+    '--FILEDESC', 'spgist_name_ops - test opclass for SP-GiST',])
+endif
+
 spgist_name_ops = shared_module('spgist_name_ops',
-  ['spgist_name_ops.c'],
+  spgist_name_ops_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += spgist_name_ops
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
index a57bd0693a3..a9eb4c564da 100644
--- a/src/test/modules/ssl_passphrase_callback/meson.build
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -3,8 +3,19 @@ if not ssl.found()
 endif
 
 # FIXME: prevent install during main install, but not during test :/
+
+ssl_passphrase_callback_sources = files(
+  'ssl_passphrase_func.c',
+)
+
+if host_system == 'windows'
+  ssl_passphrase_callback_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ssl_passphrase_func',
+    '--FILEDESC', 'callback function to provide a passphrase',])
+endif
+
 ssl_passphrase_callback = shared_module('ssl_passphrase_func',
-  ['ssl_passphrase_func.c'],
+  ssl_passphrase_callback_sources,
   kwargs: pg_mod_args + {
     'dependencies': [ssl, pg_mod_args['dependencies']],
   },
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
index 945eb5a70c4..3cf6b05754f 100644
--- a/src/test/modules/test_bloomfilter/meson.build
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_bloomfilter_sources = files(
+  'test_bloomfilter.c',
+)
+
+if host_system == 'windows'
+  test_bloomfilter_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_bloomfilter',
+    '--FILEDESC', 'test_bloomfilter - test code for Bloom filter library',])
+endif
+
 test_bloomfilter = shared_module('test_bloomfilter',
-  ['test_bloomfilter.c'],
+  test_bloomfilter_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_bloomfilter
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
index 81ad5adc526..54d44f9b2b4 100644
--- a/src/test/modules/test_ddl_deparse/meson.build
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ddl_deparse_sources = files(
+  'test_ddl_deparse.c',
+)
+
+if host_system == 'windows'
+  test_ddl_deparse_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ddl_deparse',
+    '--FILEDESC', 'test_ddl_deparse - regression testing for DDL deparsing',])
+endif
+
 test_ddl_deparse = shared_module('test_ddl_deparse',
-  ['test_ddl_deparse.c'],
+  test_ddl_deparse_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ddl_deparse
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
index abf0a3b0430..b3b49c56122 100644
--- a/src/test/modules/test_ginpostinglist/meson.build
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ginpostinglist_sources = files(
+  'test_ginpostinglist.c',
+)
+
+if host_system == 'windows'
+  test_ginpostinglist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ginpostinglist',
+    '--FILEDESC', 'test_ginpostinglist - test code for src/backend/access/gin//ginpostinglist.c',])
+endif
+
 test_ginpostinglist = shared_module('test_ginpostinglist',
-  ['test_ginpostinglist.c'],
+  test_ginpostinglist_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ginpostinglist
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
index c32c469c69a..4bd75af4b5e 100644
--- a/src/test/modules/test_integerset/meson.build
+++ b/src/test/modules/test_integerset/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_integerset_sources = files(
+  'test_integerset.c',
+)
+
+if host_system == 'windows'
+  test_integerset_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_integerset',
+    '--FILEDESC', 'test_integerset - test code for src/backend/lib/integerset.c',])
+endif
+
 test_integerset = shared_module('test_integerset',
-  ['test_integerset.c'],
+  test_integerset_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_integerset
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
index a388de1156a..c5405b8f878 100644
--- a/src/test/modules/test_lfind/meson.build
+++ b/src/test/modules/test_lfind/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_lfind_sources = files(
+  'test_lfind.c',
+)
+
+if host_system == 'windows'
+  test_lfind_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_lfind',
+    '--FILEDESC', 'test_lfind - test code for optimized linear search functions',])
+endif
+
 test_lfind = shared_module('test_lfind',
-  ['test_lfind.c'],
+  test_lfind_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_lfind
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 5faf0459777..8802bbbac55 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_oat_hooks_sources = files(
+  'test_oat_hooks.c',
+)
+
+if host_system == 'windows'
+  test_oat_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_oat_hooks',
+    '--FILEDESC', 'test_oat_hooks - example use of object access hooks',])
+endif
+
 test_oat_hooks = shared_module('test_oat_hooks',
-  ['test_oat_hooks.c'],
+  test_oat_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_oat_hooks
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
index b59960f615e..1c17113347f 100644
--- a/src/test/modules/test_parser/meson.build
+++ b/src/test/modules/test_parser/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_parser_sources = files(
+  'test_parser.c',
+)
+
+if host_system == 'windows'
+  test_parser_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_parser',
+    '--FILEDESC', 'test_parser - example of a custom parser for full-text search',])
+endif
+
 test_parser = shared_module('test_parser',
-  ['test_parser.c'],
+  test_parser_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_parser
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
index 1cfa84b3609..9a5be43c9c0 100644
--- a/src/test/modules/test_predtest/meson.build
+++ b/src/test/modules/test_predtest/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_predtest_sources = files(
+  'test_predtest.c',
+)
+
+if host_system == 'windows'
+  test_predtest_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_predtest',
+    '--FILEDESC', 'test_predtest - test code for optimizer/util/predtest.c',])
+endif
+
 test_predtest = shared_module('test_predtest',
-  ['test_predtest.c'],
+  test_predtest_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_predtest
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
index 34cbc3e1624..f067e08d321 100644
--- a/src/test/modules/test_rbtree/meson.build
+++ b/src/test/modules/test_rbtree/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rbtree_sources = files(
+  'test_rbtree.c',
+)
+
+if host_system == 'windows'
+  test_rbtree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rbtree',
+    '--FILEDESC', 'test_rbtree - test code for red-black tree library',])
+endif
+
 test_rbtree = shared_module('test_rbtree',
-  ['test_rbtree.c'],
+  test_rbtree_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rbtree
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
index 867a64e57c3..cfb938d9f1e 100644
--- a/src/test/modules/test_regex/meson.build
+++ b/src/test/modules/test_regex/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_regex_sources = files(
+  'test_regex.c',
+)
+
+if host_system == 'windows'
+  test_regex_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_regex',
+    '--FILEDESC', 'test_regex - test code for backend/regex/',])
+endif
+
 test_regex = shared_module('test_regex',
-  ['test_regex.c'],
+  test_regex_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_regex
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
index 80d8adda332..3fb273b2934 100644
--- a/src/test/modules/test_rls_hooks/meson.build
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rls_hooks_sources = files(
+  'test_rls_hooks.c',
+)
+
+if host_system == 'windows'
+  test_rls_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rls_hooks',
+    '--FILEDESC', 'test_rls_hooks - example use of RLS hooks',])
+endif
+
 test_rls_hooks = shared_module('test_rls_hooks',
-  ['test_rls_hooks.c'],
+  test_rls_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rls_hooks
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
index b663543d616..16c8fdb57f4 100644
--- a/src/test/modules/test_shm_mq/meson.build
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -1,10 +1,19 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_shm_mq_sources = files(
+  'setup.c',
+  'test.c',
+  'worker.c',
+)
+
+if host_system == 'windows'
+  test_shm_mq_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_shm_mq',
+    '--FILEDESC', 'test_shm_mq - example use of shared memory message queue',])
+endif
+
 test_shm_mq = shared_module('test_shm_mq',
-  files(
-    'setup.c',
-    'test.c',
-    'worker.c',
-  ),
+  test_shm_mq_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_shm_mq
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index 32acad883b2..a4a158c75b9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -1,8 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_worker_spi_sources = files(
+  'worker_spi.c',
+)
+
+if host_system == 'windows'
+  test_worker_spi_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'worker_spi',
+    '--FILEDESC', 'worker_spi - background worker example',])
+endif
+
 test_worker_spi = shared_module('worker_spi',
-  files(
-    'worker_spi.c',
-  ),
+  test_worker_spi_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_worker_spi
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index fd8ee995b79..963c0f64ed5 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -8,6 +8,12 @@ regress_sources = pg_regress_c + files(
 
 pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
 
+if host_system == 'windows'
+  regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress',
+    '--FILEDESC', 'pg_regress - test driver',])
+endif
+
 pg_regress = executable('pg_regress',
   regress_sources,
   c_args: pg_regress_cflags,
diff --git a/meson.build b/meson.build
index 38b2c3aae2e..774a8c2e05f 100644
--- a/meson.build
+++ b/meson.build
@@ -2536,6 +2536,65 @@ gen_export_kwargs = {
 
 
 
+###
+### windows resources related stuff
+###
+
+if host_system == 'windows'
+  pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+  win32ver_rc = files('src/port/win32ver.rc')
+  rcgen = find_program('src/tools/rcgen', native: true)
+
+  rcgen_base_args = [
+    '--srcdir', '@SOURCE_DIR@',
+    '--builddir', meson.build_root(),
+    '--rcout', '@OUTPUT0@',
+    '--out', '@OUTPUT1@',
+    '--input', '@INPUT@',
+    '@EXTRA_ARGS@',
+  ]
+
+  if cc.get_argument_syntax() == 'msvc'
+    rc = find_program('rc', required: true)
+    rcgen_base_args += ['--rc', rc.path()]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.res']
+  else
+    windres = find_program('windres', required: true)
+    rcgen_base_args += ['--windres', windres.path()]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.obj']
+  endif
+
+  # msbuild backend doesn't support this atm
+  if meson.backend() == 'ninja'
+    rcgen_base_args += ['--depfile', '@DEPFILE@']
+  endif
+
+  rcgen_bin_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_APP',
+    '--FILEENDING', 'exe',
+    '--ICO', pg_ico
+  ]
+
+  rcgen_lib_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_DLL',
+    '--FILEENDING', 'dll',
+  ]
+
+  rc_bin_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_bin_args,
+    output: rcgen_outputs,
+  )
+
+  rc_lib_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_lib_args,
+    output: rcgen_outputs,
+  )
+endif
+
+
+
 # headers that the whole build tree depends on
 generated_headers = []
 # headers that the backend build depends on
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
index 16f082ecfa8..9e0934c000b 100644
--- a/src/timezone/meson.build
+++ b/src/timezone/meson.build
@@ -28,6 +28,12 @@ if get_option('system_tzdata') == ''
   if meson.is_cross_build()
     zic = find_program(get_option('ZIC'), native: true, required: true)
   else
+    if host_system == 'windows'
+      zic_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+        '--NAME', 'zic',
+        '--FILEDESC', 'zic - time zone compiler',])
+    endif
+
     zic = executable('zic', zic_sources,
                      dependencies: [frontend_code],
                      kwargs: default_bin_args + {'install': false}
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..5b62bfe5410
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('--srcdir', type=os.path.abspath,
+                    required=True)
+parser.add_argument('--builddir', type=os.path.abspath,
+                    required=True)
+
+binaries = parser.add_argument_group('binaries')
+binaries.add_argument('--windres', type=os.path.abspath)
+binaries.add_argument('--rc', type=os.path.abspath)
+
+inout = parser.add_argument_group('inout')
+inout.add_argument('--depfile', type=argparse.FileType('w'))
+inout.add_argument('--input', type=argparse.FileType('r'),
+                   required=True)
+inout.add_argument('--rcout', type=argparse.FileType('w'),
+                   required=True)
+inout.add_argument('--out', type=str,
+                   required=True)
+
+replacements = parser.add_argument_group('replacements')
+replacements.add_argument('--FILEDESC', type=str)
+replacements.add_argument('--NAME', type=str, required=True)
+replacements.add_argument('--VFT_TYPE', type=str, required=True)
+replacements.add_argument('--FILEENDING', type=str, required=True)
+replacements.add_argument('--ICO', type=str)
+
+args = parser.parse_args()
+
+# determine replacement strings
+
+internal_name = '"{0}"'.format(args.NAME)
+original_name = '"{0}.{1}"'.format(args.NAME, args.FILEENDING)
+
+# if no description is passed in, generate one based on the name
+if args.FILEDESC:
+    filedesc = args.FILEDESC
+elif args.NAME:
+    if args.VFT_TYPE == 'VFT_DLL':
+        filedesc = 'PostgreSQL {0} library'.format(args.NAME)
+    else:
+        filedesc = 'PostgreSQL {0} binary'.format(args.NAME)
+filedesc = '"{0}"'.format(filedesc)
+
+
+if args.ICO:
+    ico = 'IDI_ICON ICON "{0}"'.format(args.ICO)
+    if args.depfile:
+        args.depfile.write("{0} : {1}\n".format(args.rcout.name, args.ICO))
+else:
+    ico = ''
+
+
+data = args.input.read()
+
+data = data.replace('VFT_APP', args.VFT_TYPE)
+data = data.replace('_INTERNAL_NAME_', internal_name)
+data = data.replace('_ORIGINAL_NAME_', original_name)
+data = data.replace('FILEDESC', filedesc)
+data = data.replace("_ICO_", ico)
+
+args.rcout.write(data)
+args.rcout.close()
+
+if args.windres:
+    cmd = [
+        args.windres,
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '-o', args.out, '-i', args.rcout.name,
+    ]
+elif args.rc:
+    cmd = [
+        args.rc, '/nologo',
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '/fo', args.out, args.rcout.name,
+    ]
+else:
+    sys.exit('either --windres or --rc needs to be specified')
+
+sp = subprocess.run(cmd)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# It'd be nicer if we could generate correct dependencies here, but 'rc'
+# doesn't support doing so. It's unlikely we'll ever need more, so...
+if args.depfile:
+    args.depfile.write("{0} : {1}\n".format(
+        args.rcout.name, args.input.name))
+    args.depfile.write("{0} : {1}/{2}\n".format(
+        args.out, args.builddir, 'src/include/pg_config.h'))
-- 
2.37.3.542.gdd3f6c4cae

v17-0007-meson-Add-docs-for-building-with-meson.patchtext/x-diff; charset=us-asciiDownload
From 3d84a0d177f33c66d409a09faf6c0e4c55e6a98a Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:55:20 -0700
Subject: [PATCH v17 07/23] meson: Add docs for building with meson

Author: Samay Sharma <smilingsamay@gmail.com>
---
 doc/src/sgml/installation.sgml | 1841 ++++++++++++++++++++++++++++++--
 doc/src/sgml/monitoring.sgml   |    2 +-
 doc/src/sgml/runtime.sgml      |    2 +-
 doc/src/sgml/sourcerepo.sgml   |    5 +-
 4 files changed, 1743 insertions(+), 107 deletions(-)

diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 319c7e69660..3d4018badd3 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -31,7 +31,144 @@ documentation.  See standalone-profile.xsl for details.
   C++</productname>, see <xref linkend="install-windows"/> instead.
  </para>
 
- <sect1 id="install-short">
+ <sect1 id="supported-platforms">
+  <title>Supported Platforms</title>
+
+  <para>
+   A platform (that is, a CPU architecture and operating system combination)
+   is considered supported by the <productname>PostgreSQL</productname> development
+   community if the code contains provisions to work on that platform and
+   it has recently been verified to build and pass its regression tests
+   on that platform.  Currently, most testing of platform compatibility
+   is done automatically by test machines in the
+   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
+   If you are interested in using <productname>PostgreSQL</productname> on a platform
+   that is not represented in the build farm, but on which the code works
+   or can be made to work, you are strongly encouraged to set up a build
+   farm member machine so that continued compatibility can be assured.
+  </para>
+
+  <para>
+   In general, <productname>PostgreSQL</productname> can be expected to work on
+   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
+   and PA-RISC, including
+   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
+   It is often
+   possible to build on an unsupported CPU type by configuring with
+   <option>--disable-spinlocks</option>, but performance will be poor.
+  </para>
+
+  <para>
+   <productname>PostgreSQL</productname> can be expected to work on current
+   versions of these operating systems: Linux, Windows,
+   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
+   Other Unix-like systems may also work but are not currently
+   being tested.  In most cases, all CPU architectures supported by
+   a given operating system will work.  Look in
+   <xref linkend="installation-platform-notes"/> below to see if
+   there is information
+   specific to your operating system, particularly if using an older system.
+  </para>
+
+  <para>
+   If you have installation problems on a platform that is known
+   to be supported according to recent build farm results, please report
+   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
+   in porting <productname>PostgreSQL</productname> to a new platform,
+   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
+   to discuss that.
+  </para>
+
+  <para>
+   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
+   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
+   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
+   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
+   Tru64 UNIX, and ULTRIX.
+  </para>
+ </sect1>
+
+ <sect1 id="get-source">
+  <title>Getting the Source</title>
+
+   <para>
+   You can download the source code in two ways - via git or the source code
+   tarballs.
+   </para>
+
+  <sect2 id="get-source-git">
+   <title>Getting the Source via <productname>Git</productname></title>
+  <para>
+   With <productname>Git</productname>, you can make a copy of the entire code repository
+   on your local machine, so you will have access to all history and branches
+   offline. This is the fastest and most flexible way to develop or test
+   patches.
+  </para>
+
+  <procedure>
+   <step>
+    <para>
+     To begin using the Git repository, make a clone of the official mirror:
+
+<programlisting>
+git clone https://git.postgresql.org/git/postgresql.git
+</programlisting>
+
+     This will copy the full repository to your local machine, so it may take
+     a while to complete, especially if you have a slow Internet connection.
+     The files will be placed in a new subdirectory <filename>postgresql</filename> of
+     your current directory.
+    </para>
+
+   </step>
+
+   <step>
+    <para>
+     Whenever you want to get the latest updates in the system, <command>cd</command>
+     into the repository, and run:
+
+<programlisting>
+git pull
+</programlisting>
+    </para>
+   </step>
+  </procedure>
+
+  <para>
+   <productname>Git</productname> can do a lot more things than just fetch the source.
+   Our wiki, <ulink
+   url="https://wiki.postgresql.org/wiki/Working_with_Git"></ulink>,
+   has some discussion on working with Git. For more information, consult the
+   <productname>Git</productname> man pages, or see the website at
+   <ulink url="https://git-scm.com"></ulink>.
+  </para>
+  </sect2>
+  <sect2 id="get-source-tarball">
+   <title>Getting the Source via Tarballs</title>
+
+  <para>
+   The <productname>PostgreSQL</productname> source code for released versions
+   can also be obtained from the download section of our website:
+   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
+   Download the
+   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
+   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
+   file you're interested in, then unpack it:
+<screen>
+<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
+</screen>
+   This will create a directory
+   <filename>postgresql-<replaceable>version</replaceable></filename> under
+   the current directory with the <productname>PostgreSQL</productname> sources.
+   Change into that directory for the rest of the installation procedure.
+  </para>
+  </sect2>
+ </sect1>
+
+<sect1 id="install-make">
+  <title>Building and Installation with autoconf and make</title>
+
+ <sect2 id="install-short-make">
   <title>Short Version</title>
 
   <para>
@@ -50,12 +187,12 @@ su - postgres
 /usr/local/pgsql/bin/psql test
 </synopsis>
    The long version is the rest of this
-   <phrase>chapter</phrase>.
+   <phrase>section</phrase>.
   </para>
- </sect1>
+ </sect2>
 
 
- <sect1 id="install-requirements">
+ <sect2 id="install-requirements-make">
   <title>Requirements</title>
 
   <para>
@@ -343,45 +480,9 @@ su - postgres
    url="ftp://ftp.gnu.org/gnu/"></ulink>.
   </para>
 
-  <para>
-   Also check that you have sufficient disk space. You will need about
-   350 MB for the source tree during compilation and about 60 MB for
-   the installation directory. An empty database cluster takes about
-   40 MB; databases take about five times the amount of space that a
-   flat text file with the same data would take. If you are going to
-   run the regression tests you will temporarily need up to an extra
-   300 MB. Use the <command>df</command> command to check free disk
-   space.
-  </para>
- </sect1>
+ </sect2>
 
- <sect1 id="install-getsource">
-  <title>Getting the Source</title>
-
-  <para>
-   The <productname>PostgreSQL</productname> source code for released versions
-   can be obtained from the download section of our website:
-   <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
-   Download the
-   <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
-   or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
-   file you're interested in, then unpack it:
-<screen>
-<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
-</screen>
-   This will create a directory
-   <filename>postgresql-<replaceable>version</replaceable></filename> under
-   the current directory with the <productname>PostgreSQL</productname> sources.
-   Change into that directory for the rest of the installation procedure.
-  </para>
-
-  <para>
-   Alternatively, you can use the Git version control system; see
-   <xref linkend="git"/> for more information.
-  </para>
- </sect1>
-
- <sect1 id="install-procedure">
+ <sect2 id="install-procedure-make">
   <title>Installation Procedure</title>
 
   <procedure>
@@ -630,6 +731,7 @@ build-postgresql:
    rebuilding.  Without this, your changes in configuration choices
    might not propagate everywhere they need to.
   </para>
+  </sect2>
 
   <sect2 id="configure-options">
    <title><filename>configure</filename> Options</title>
@@ -844,7 +946,7 @@ build-postgresql:
      various <productname>PostgreSQL</productname> features that are not
      built by default.  Most of these are non-default only because they
      require additional software, as described in
-     <xref linkend="install-requirements"/>.
+     <xref linkend="install-requirements-make"/>.
     </para>
 
      <variablelist>
@@ -1672,9 +1774,7 @@ build-postgresql:
 
    </sect3>
 
-  </sect2>
-
-  <sect2 id="configure-envvars">
+  <sect3 id="configure-envvars">
    <title><filename>configure</filename> Environment Variables</title>
 
    <indexterm zone="configure-envvars">
@@ -1955,9 +2055,1600 @@ build-postgresql:
       adjustments, while <envar>COPT</envar> might be kept set all the time.
      </para>
     </note>
+   </sect3>
   </sect2>
  </sect1>
 
+ <sect1 id="install-meson">
+  <title>Building and Installation with meson</title>
+
+ <sect2 id="install-short-meson">
+  <title>Short Version</title>
+
+  <para>
+<synopsis>
+
+# create working directory
+mkdir postgres
+cd postgres
+
+# fetch source code
+# git clone https://git.postgresql.org/git/postgresql.git src
+
+# current instructions for testing (to be removed when merging)
+git clone -b meson https://github.com/anarazel/postgres.git src
+
+# setup and enter build directory (done only first time)
+meson setup build src --prefix=$PWD/install
+cd build
+
+# Compile source
+ninja
+
+# Install to the prefix directory specified above
+ninja install
+
+# Run all tests (optional, takes time)
+meson test
+
+# Initialize a new database
+../install/bin/initdb -D ../data
+
+# Start database
+../install/bin/pg_ctl -D ../data/ -l logfile start
+
+# Connect to the database
+../install/bin/psql -d postgres
+
+</synopsis>
+   The long version is the rest of this
+   <phrase>section</phrase>.
+  </para>
+ </sect2>
+
+ <sect2 id="install-requirements-meson">
+  <title>Requirements</title>
+
+  <para>
+   In general, a modern Unix-compatible platform or Windows should be able
+   to build <productname>PostgreSQL</productname> with meson and run it.
+   The platforms which have received specific testing at the time of release are:
+
+  <itemizedlist spacing="compact">
+   <listitem><simpara>Linux</simpara></listitem>
+   <listitem><simpara>Windows</simpara></listitem>
+   <listitem><simpara>OpenBSD</simpara></listitem>
+   <listitem><simpara>NetBSD</simpara></listitem>
+   <listitem><simpara>FreeBSD</simpara></listitem>
+   <listitem><simpara>macOS</simpara></listitem>
+  </itemizedlist>
+  </para>
+
+  <sect3 id="required-packages">
+   <title>Required packages</title>
+
+   <para>
+    The following software packages are required for building
+    <productname>PostgreSQL</productname>:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You can download the source code in two ways - via git or by downloading
+      the source code tarballs. For the former, you will need an installed version of
+      <productname>Git</productname>, which you can get from
+      <ulink url="https://git-scm.com"></ulink>. Many systems already
+      have a recent version of <productname>Git</productname>
+      installed by default, or available in their package distribution system.
+      If you download the source code tarballs, you will need
+      <application>tar</application> in addition to
+      <application>gzip</application> or <application>bzip2</application>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>meson</primary>
+      </indexterm>
+      You need to install <application>
+      <ulink url="https://mesonbuild.com/">meson</ulink></application> version
+      0.54 or later to be able to build <productname>PostgreSQL</productname>
+      with it. If your operating system provides a package manager, you can install
+      <application>meson</application> with that. If not, you
+      can download a <ulink url="https://github.com/mesonbuild/meson">meson release</ulink>
+      from github and run <literal>./meson.py</literal> from the git repository
+      itself. Lastly, Meson is also available in the python package index and can
+      be installed with <literal>pip</literal>.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least
+      C99-compliant). Recent
+      versions of <productname>GCC</productname> are recommended, but
+      <productname>PostgreSQL</productname> is known to build using a wide variety
+      of compilers from different vendors.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>flex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>lex</primary>
+      </indexterm>
+      <indexterm>
+       <primary>bison</primary>
+      </indexterm>
+      <indexterm>
+       <primary>yacc</primary>
+      </indexterm>
+
+      <application>Flex</application> and <application>Bison</application>
+      are needed to build <productname>PostgreSQL</productname> using
+      <application>meson</application>. Be sure to get
+      <application>Flex</application> 2.5.31 or later and
+      <application>Bison</application> 1.875 or later from your package manager.
+      Other <application>lex</application> and <application>yacc</application>
+      programs cannot be used.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>perl</primary>
+      </indexterm>
+      <application>Perl</application> 5.8.3 or later is needed to build PostgreSQL
+      using <application>meson</application> and to run some test suites.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+  <sect3 id="recommended-packages">
+   <title>Recommended packages</title>
+
+   <para>
+   The following packages are not required to build
+   <application>PostgreSQL</application> but are strongly recommended:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>readline</primary>
+      </indexterm>
+      <indexterm>
+       <primary>libedit</primary>
+      </indexterm>
+
+      The <acronym>GNU</acronym> <productname>Readline</productname> library
+      allows <application>psql</application> (the PostgreSQL command line
+      SQL interpreter) to remember each command you type, and allows you to
+      use arrow keys to recall and edit previous commands.  This is very
+      helpful and is strongly recommended. As an alternative, you can often
+      use the BSD-licensed <filename>libedit</filename> library, originally
+      developed on <productname>NetBSD</productname>. The
+      <filename>libedit</filename> library is GNU
+      <productname>Readline</productname>-compatible and is used if
+      <filename>libreadline</filename> is not found, or if
+      <option>libedit_preferred</option> is enabled as an
+      option to <filename>meson configure</filename>. If you are using a
+      package-based Linux distribution, be aware that you need both the
+      <literal>readline</literal> and <literal>readline-devel</literal> packages, if
+      those are separate in your distribution.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <indexterm>
+       <primary>zlib</primary>
+      </indexterm>
+
+      The <productname>zlib</productname> compression library is
+      used to provide support for compressed archives in
+      <application>pg_dump</application> and
+      <application>pg_restore</application> and is recommended.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Various tests, particularly the client program tests under
+      <filename>src/bin</filename>, use the Perl TAP tools. Running
+      these tests is recommended for development. These TAP tests
+      require the Perl module <literal>IPC::Run</literal> which is
+      available from CPAN or an operating system package.
+     </para>
+    </listitem>
+   </itemizedlist>
+  </para>
+  </sect3>
+
+  <sect3 id="optional-packages">
+   <title>Optional packages</title>
+
+   <para>
+   The following packages are optional.  They are not required in the
+   default configuration, but they are needed when certain build
+   options are enabled, as explained below:
+
+   <itemizedlist>
+    <listitem>
+     <para>
+      You need <productname>OpenSSL</productname>, if you want to support
+      encrypted client connections.  <productname>OpenSSL</productname> is
+      also required for random number generation on platforms that do not
+      have <filename>/dev/urandom</filename> (except Windows).  The minimum
+      required version is 1.0.1.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>LZ4</productname>, if you want to support
+      compression of data with that method; see
+      <xref linkend="guc-default-toast-compression"/> and
+      <xref linkend="guc-wal-compression"/>.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <productname>Zstandard</productname>, if you want to support
+      compression of data or backups with that method; see
+      <xref linkend="guc-wal-compression"/>.
+      The minimum required version is 1.4.0.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      You need <application>Kerberos</application>, <productname>OpenLDAP</productname>,
+      and/or <application>PAM</application>, if you want to support authentication
+      using those services.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the server programming language
+      <application>PL/Perl</application> you need a full
+      <productname>Perl</productname> installation, including the
+      <filename>libperl</filename> library and the header files.
+      The minimum required version is <productname>Perl</productname> 5.8.3.
+      Since <application>PL/Perl</application> will be a shared
+      library, the <indexterm><primary>libperl</primary></indexterm>
+      <filename>libperl</filename> library must be a shared library
+      also on most platforms.  This appears to be the default in
+      recent <productname>Perl</productname> versions, but it was not
+      in earlier versions, and in any case it is the choice of whomever
+      installed Perl at your site.  <filename>configure</filename> will fail
+      if building <application>PL/Perl</application> is selected but it cannot
+      find a shared <filename>libperl</filename>.  In that case, you will have
+      to rebuild and install <productname>Perl</productname> manually to be
+      able to build <application>PL/Perl</application>.  During the
+      configuration process for <productname>Perl</productname>, request a
+      shared library.
+     </para>
+
+     <para>
+      If you intend to make more than incidental use of
+      <application>PL/Perl</application>, you should ensure that the
+      <productname>Perl</productname> installation was built with the
+      <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal>
+      will show whether this is the case).
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Python</application> server programming
+      language, you need a <productname>Python</productname>
+      installation with the header files and
+      the <application>sysconfig</application> module.  The minimum
+      required version is <productname>Python</productname> 3.2.
+     </para>
+
+     <para>
+      Since <application>PL/Python</application> will be a shared
+      library, the <indexterm><primary>libpython</primary></indexterm>
+      <filename>libpython</filename> library must be a shared library
+      also on most platforms.  This is not the case in a default
+      <productname>Python</productname> installation built from source, but a
+      shared library is available in many operating system
+      distributions.  <filename>configure</filename> will fail if
+      building <application>PL/Python</application> is selected but it cannot
+      find a shared <filename>libpython</filename>.  That might mean that you
+      either have to install additional packages or rebuild (part of) your
+      <productname>Python</productname> installation to provide this shared
+      library.  When building from source, run <productname>Python</productname>'s
+      configure with the <literal>--enable-shared</literal> flag.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <application>PL/Tcl</application>
+      procedural language, you of course need a <productname>Tcl</productname>
+      installation.  The minimum required version is
+      <productname>Tcl</productname> 8.4.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To enable Native Language Support (<acronym>NLS</acronym>), that
+      is, the ability to display a program's messages in a language
+      other than English, you need an implementation of the
+      <application>Gettext</application> <acronym>API</acronym>.  Some operating
+      systems have this built-in (e.g., <systemitem
+      class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>,
+      <systemitem class="osname">Solaris</systemitem>), for other systems you
+      can download an add-on package from <ulink
+      url="https://www.gnu.org/software/gettext/"></ulink>.
+      If you are using the <application>Gettext</application> implementation in
+      the <acronym>GNU</acronym> C library then you will additionally
+      need the <productname>GNU Gettext</productname> package for some
+      utility programs.  For any of the other implementations you will
+      not need it.
+     </para>
+    </listitem>
+
+    <listitem>
+     <para>
+      To build the <productname>PostgreSQL</productname> documentation,
+      there is a separate set of requirements; see
+      <xref linkend="docguide-toolsets"/>.
+     </para>
+    </listitem>
+   </itemizedlist>
+   </para>
+  </sect3>
+
+ </sect2>
+
+ <sect2 id="configure-meson">
+  <title>Configuring the build</title>
+
+   <para>
+    The first step of the installation procedure is to configure the
+    source tree for your system and choose the options you would like. To
+    create and configure the build directory, you can start with the
+    <literal>meson setup</literal> command.
+   </para>
+
+<screen>
+<userinput>meson setup build</userinput>
+</screen>
+
+   <para>
+    The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal>
+    argument. If no <literal>srcdir</literal> is given Meson will deduce the
+    <literal>srcdir</literal> based on the current directory and the location
+    of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory.
+   </para>
+
+   <para>
+    Meson then loads the build configuration file and sets up the build directory.
+    Additionally, the invocation can pass options to Meson. The list of commonly
+    used options is in subsequent sections. A few examples of specifying different
+    build options are:
+
+<screen>
+#Setup build directory with a different installation prefix
+meson setup build --prefix=/home/user/pg-install
+
+#Setup build directory to generate a debug build
+meson setup build --buildtype=debug
+
+#Setup build directory with ssl (Use -D for project specific options)
+meson setup build -Dssl=openssl
+</screen>
+
+    Setting up the build directory is a one-time step. To reconfigure before a
+    new build, you can simply use the <literal>meson configure</literal> command
+   </para>
+
+<para>
+<screen>
+meson configure -Dcassert=true
+</screen>
+</para>
+
+<para>
+    <command>meson configure</command>'s commonly used command line options
+    are explained below. This list is not exhaustive (use
+    <literal>meson configure --help</literal> to get one that is).
+    The options not covered here are meant for advanced use-cases, and are
+    documented in the standard meson
+    <ulink url="https://mesonbuild.com/Commands.html#configure">documentation</ulink>.
+    These arguments can be used with <command>meson setup</command> as well.
+</para>
+
+   <sect3 id="configure-install-locations">
+    <title>Installation Locations</title>
+
+     <para>
+      These options control where <literal>ninja install (or meson install)</literal> will put
+      the files.  The <option>--prefix</option> option is sufficient for
+      most cases.  If you have special needs, you can customize the
+      installation subdirectories with the other options described in this
+      section.  Beware however that changing the relative locations of the
+      different subdirectories may render the installation non-relocatable,
+      meaning you won't be able to move it after installation.
+      (The <literal>man</literal> and <literal>doc</literal> locations are
+      not affected by this restriction.)
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term>
+       <listitem>
+        <para>
+         Install all files under the directory <replaceable>PREFIX</replaceable>
+         instead of <filename>/usr/local/pgsql</filename>. The actual
+         files will be installed into various subdirectories; no files
+         will ever be installed directly into the
+         <replaceable>PREFIX</replaceable> directory.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the directory for executable programs. The default
+         is <filename><replaceable>PREFIX</replaceable>/bin</filename>, which
+         normally means <filename>/usr/local/pgsql/bin</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for various configuration files,
+         <filename><replaceable>PREFIX</replaceable>/etc</filename> by default.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the location to install libraries and dynamically loadable
+         modules. The default is
+         <filename><replaceable>PREFIX</replaceable>/lib</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing C and C++ header files. The
+         default is <filename><replaceable>PREFIX</replaceable>/include</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for read-only data files used by the
+         installed programs. The default is
+         <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has
+         nothing to do with where your database files will be placed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         Sets the directory for installing locale data, in particular
+         message translation catalog files.  The default is
+         <filename><replaceable>DATADIR</replaceable>/locale</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term>
+       <listitem>
+        <para>
+         The man pages that come with <productname>PostgreSQL</productname> will be installed under
+         this directory, in their respective
+         <filename>man<replaceable>x</replaceable></filename> subdirectories.
+         The default is <filename><replaceable>DATADIR</replaceable>/man</filename>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+
+  <note>
+      <para>
+       Care has been taken to make it possible to install
+       <productname>PostgreSQL</productname> into shared installation locations
+       (such as <filename>/usr/local/include</filename>) without
+       interfering with the namespace of the rest of the system. First,
+       the string <quote><literal>/postgresql</literal></quote> is
+       automatically appended to <varname>datadir</varname>,
+       <varname>sysconfdir</varname>, and <varname>docdir</varname>,
+       unless the fully expanded directory name already contains the
+       string <quote><literal>postgres</literal></quote> or
+       <quote><literal>pgsql</literal></quote>. For example, if you choose
+       <filename>/usr/local</filename> as prefix, the documentation will
+       be installed in <filename>/usr/local/doc/postgresql</filename>,
+       but if the prefix is <filename>/opt/postgres</filename>, then it
+       will be in <filename>/opt/postgres/doc</filename>. The public C
+       header files of the client interfaces are installed into
+       <varname>includedir</varname> and are namespace-clean. The
+       internal header files and the server header files are installed
+       into private directories under <varname>includedir</varname>. See
+       the documentation of each interface for information about how to
+       access its header files. Finally, a private subdirectory will
+       also be created, if appropriate, under <varname>libdir</varname>
+       for dynamically loadable modules.
+      </para>
+     </note>
+    </sect3>
+
+    <sect3 id="configure-pg-features">
+    <title><productname>PostgreSQL</productname> Features</title>
+
+    <para>
+     The options described in this section enable building of
+     various <productname>PostgreSQL</productname> features that are not
+     built by default.  Most of these are non-default only because they
+     require additional software, as described in
+     <xref linkend="install-requirements-meson"/>. To specify PostgreSQL
+     specific options, the name of the option should be prefixed by -D.
+    </para>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>-Dnls=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Enables or disables Native Language Support (<acronym>NLS</acronym>),
+         that is, the ability to display a program's messages in a
+         language other than English. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To use this option, you will need an implementation of the
+         <application>Gettext</application> API.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplperl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Perl</application> server-side language. It
+         defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dplpython=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Python</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpltcl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <application>PL/Tcl</application> server-side language.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the TCL version to use when building PL/Tcl.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dicu=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for
+         the <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm>
+         library, enabling use of ICU collation
+         features<phrase condition="standalone-ignore"> (see
+         <xref linkend="collation"/>)</phrase>.
+         This requires the <productname>ICU4C</productname> package
+         to be installed.  The minimum required version
+         of <productname>ICU4C</productname> is currently 4.2.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+
+        <para>
+         By default,
+         <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm>
+         will be used to find the required compilation options.  This is
+         supported for <productname>ICU4C</productname> version 4.6 and later.
+         <!-- Add description for older ICU4C versions and when pkg-config isn't available-->
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="configure-with-llvm-meson">
+       <term><option>-Dllvm=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for <productname>LLVM</productname> based
+         <acronym>JIT</acronym> compilation<phrase
+         condition="standalone-ignore"> (see <xref
+         linkend="jit"/>)</phrase>.  This
+         requires the <productname>LLVM</productname> library to be installed.
+         The minimum required version of <productname>LLVM</productname> is
+         currently 3.9. It is set to disabled by default.
+        </para>
+        <para>
+         <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
+         will be used to find the required compilation options.
+         <command>llvm-config</command>, and then
+         <command>llvm-config-$major-$minor</command> for all supported
+         versions, will be searched for in your <envar>PATH</envar>.
+         <!--Add substitute for LLVM_CONFIG when llvm-config is not in PATH-->
+        </para>
+
+        <para>
+         <productname>LLVM</productname> support requires a compatible
+         <command>clang</command> compiler (specified, if necessary, using the
+         <envar>CLANG</envar> environment variable), and a working C++
+         compiler (specified, if necessary, using the <envar>CXX</envar>
+         environment variable).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlz4=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>LZ4</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzstd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <productname>Zstandard</productname> compression support.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dssl=<replaceable>LIBRARY</replaceable></option>
+       <indexterm>
+        <primary>OpenSSL</primary>
+        <seealso>SSL</seealso>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Build with support for <acronym>SSL</acronym> (encrypted)
+         connections. The only <replaceable>LIBRARY</replaceable>
+         supported is <option>openssl</option>. This requires the
+         <productname>OpenSSL</productname> package to be installed.
+         <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenSSL</productname> installation is sufficient
+         before proceeding. The default for this option is none.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dgssapi=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for GSSAPI authentication. On many systems, the
+         GSSAPI system (usually a part of the Kerberos installation) is not
+         installed in a location
+         that is searched by default (e.g., <filename>/usr/include</filename>,
+         <filename>/usr/lib</filename>), so you must use the options
+         <option>-Dextra_include_dirs</option> and <option>-Dextra_lib_dirs</option> in
+         addition to this option.  <filename>meson configure</filename> will check
+         for the required header files and libraries to make sure that
+         your GSSAPI installation is sufficient before proceeding.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dldap=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm>
+         support for authentication and connection parameter lookup (see
+         <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and
+         <xref linkend="auth-ldap"/></phrase> for more information). On Unix,
+         this requires the <productname>OpenLDAP</productname> package to be
+         installed. On Windows, the default <productname>WinLDAP</productname>
+         library is used.  <filename>configure</filename> will check for the required
+         header files and libraries to make sure that your
+         <productname>OpenLDAP</productname> installation is sufficient before
+         proceeding. It defaults to auto, meaning that it will be enabled automatically
+         if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dpam=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm>
+         (Pluggable Authentication Modules) support. It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbsd_auth=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with BSD Authentication support. (The BSD Authentication framework is
+         currently only available on OpenBSD.) It defaults to auto, meaning that it
+         will be enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystemd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support
+         for <application>systemd</application><indexterm><primary>systemd</primary></indexterm>
+         service notifications.  This improves integration if the server
+         is started under <application>systemd</application> but has no impact
+         otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more
+         information</phrase>.  <application>libsystemd</application> and the
+         associated header files need to be installed to use this option.
+         It defaults to auto, meaning that it will be enabled automatically if the
+         required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dbonjour=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with support for Bonjour automatic service discovery.
+         This requires Bonjour support in your operating system.
+         Recommended on macOS. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term>
+       <listitem>
+        <para>
+         Build the <xref linkend="uuid-ossp"/> module
+         (which provides functions to generate UUIDs), using the specified
+         UUID library.<indexterm><primary>UUID</primary></indexterm>
+         <replaceable>LIBRARY</replaceable> must be one of:
+        </para>
+        <itemizedlist>
+         <listitem>
+          <para>
+           <option>none</option> to not build the ussp module. This is the default.
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>bsd</option> to use the UUID functions found in FreeBSD, NetBSD,
+           and some other BSD-derived systems
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>e2fs</option> to use the UUID library created by
+           the <literal>e2fsprogs</literal> project; this library is present in most
+           Linux systems and in macOS, and can be obtained for other
+           platforms as well
+          </para>
+         </listitem>
+         <listitem>
+          <para>
+           <option>ossp</option> to use the <ulink
+           url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
+          </para>
+         </listitem>
+        </itemizedlist>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxml=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxml2, enabling SQL/XML support.  Libxml2 version 2.6.23 or
+         later is required for this feature. It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+
+        <para>
+         To detect the required compiler and linker options, PostgreSQL will
+         query <command>pkg-config</command>, if that is installed and knows
+         about libxml2.  Otherwise the program <command>xml2-config</command>,
+         which is installed by libxml2, will be used if it is found.  Use
+         of <command>pkg-config</command> is preferred, because it can deal
+         with multi-architecture installations better.
+        </para>
+
+        <para>
+         To use a libxml2 installation that is in an unusual location, you
+         can set <command>pkg-config</command>-related environment
+         variables (see its documentation).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibxslt=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Build with libxslt, enabling the
+         <xref linkend="xml2"/>
+         module to perform XSL transformations of XML.
+         <option>-Dlibxml</option> must be specified as well.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dreadline=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Allows use of the <application>Readline</application> library
+         (and <application>libedit</application> as well).  This option enables
+         command-line editing and history in
+         <application>psql</application> and is strongly recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dlibedit_preferred=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this to true favors the use of the BSD-licensed <application>libedit</application> library
+         rather than GPL-licensed <application>Readline</application>.  This option
+         is significant only if you have both libraries installed; the
+         default is false that is to use <application>Readline</application>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dzlib=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>zlib</primary>
+         </indexterm>
+         Enabls use of the <application>Zlib</application> library.
+         This enables
+         support for compressed archives in <application>pg_dump</application>
+         and <application>pg_restore</application> and is recommended.
+         It defaults to auto, meaning that it will be
+         enabled automatically if the required packages are found.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dspinlocks=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true by default and
+         setting it to false will allow the build to succeed even if <productname>PostgreSQL</productname>
+         has no CPU spinlock support for the platform.  The lack of
+         spinlock support will result in very poor performance; therefore,
+         this option should only be changed if the build aborts and
+         informs you that the platform lacks spinlock support. If setting this
+         option to false is required to build <productname>PostgreSQL</productname> on
+         your platform, please report the problem to the
+         <productname>PostgreSQL</productname> developers.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Datomics=<replaceable>true/false</replaceable></option></term>
+       <listitem>
+        <para>
+         This option is set to true and setting it to false will
+         disable use of CPU atomic operations.  The option does nothing on
+         platforms that lack such operations.  On platforms that do have
+         them, disabling atomics will result in poor performance.  Changing
+         this option is only useful for debugging or making performance comparisons.
+        </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-build-process">
+    <title>Build Process Details</title>
+
+     <variablelist>
+
+      <varlistentry>
+       <term><option>--auto_features=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         Setting this option allows you to override value of all 'auto' features.
+         This can be useful when you want to disable or enable all the "optional"
+         features at once without having to set each of them manually. The default
+         value for this parameter is auto.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--backend=<replaceable>BACKEND</replaceable></option></term>
+       <listitem>
+        <para>
+         The default backend meson uses is ninja and that should suffice for most use cases.
+         However, if you'd like to fully integrate with visual studio, you can set the
+         BACKEND to <command>vs</command>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C compiler.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term>
+       <listitem>
+        <para>
+        This option can be used to pass extra options to the C linker.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories that will be added to the list the compiler
+         searches for header files. If you have optional packages
+         (such as GNU <application>Readline</application>) installed in a non-standard
+         location,
+         you have to use this option and probably also the corresponding
+         <option>-Dextra_lib_dirs</option> option.
+        </para>
+        <para>
+         Example: <literal>-Dextra_include_dirs=/opt/gnu/include:/usr/sup/include</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+       <listitem>
+        <para>
+         <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+         directories to search for libraries. You will probably have
+         to use this option (and the corresponding
+         <option>-Dextra_include_dirs</option> option) if you have packages
+         installed in non-standard locations.
+        </para>
+        <para>
+         Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib:/usr/sup/lib</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option>
+       <indexterm>
+        <primary>time zone data</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <productname>PostgreSQL</productname> includes its own time zone database,
+         which it requires for date and time operations.  This time zone
+         database is in fact compatible with the IANA time zone
+         database provided by many operating systems such as FreeBSD,
+         Linux, and Solaris, so it would be redundant to install it again.
+         When this option is used, the system-supplied time zone database
+         in <replaceable>DIRECTORY</replaceable> is used instead of the one
+         included in the PostgreSQL source distribution.
+         <replaceable>DIRECTORY</replaceable> must be specified as an
+         absolute path.  <filename>/usr/share/zoneinfo</filename> is a
+         likely directory on some operating systems.  Note that the
+         installation routine will not detect mismatching or erroneous time
+         zone data.  If you use this option, you are advised to run the
+         regression tests to verify that the time zone data you have
+         pointed to works correctly with <productname>PostgreSQL</productname>.
+        </para>
+
+        <indexterm><primary>cross compilation</primary></indexterm>
+
+        <para>
+         This option is mainly aimed at binary package distributors
+         who know their target operating system well.  The main
+         advantage of using this option is that the PostgreSQL package
+         won't need to be upgraded whenever any of the many local
+         daylight-saving time rules change.  Another advantage is that
+         PostgreSQL can be cross-compiled more straightforwardly if the
+         time zone database files do not need to be built during the
+         installation.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term>
+       <listitem>
+        <para>
+         Append <replaceable>STRING</replaceable> to the PostgreSQL version number.  You
+         can use this, for example, to mark binaries built from unreleased Git
+         snapshots or containing custom patches with an extra version string,
+         such as a <command>git describe</command> identifier or a
+         distribution package release number.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term>
+       <listitem>
+        <para>
+         If you have the binaries for certain by programs required to build
+         Postgres (with or without optional flags) stored at non-standard
+         paths, you could specify them manually to meson configure. The complete
+         list of programs for whom this is supported can be found by running
+         <literal>meson configure</literal>. An example is included below.
+<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting>
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-layout">
+    <title>Data layout</title>
+
+    <para>
+     These options affect how PostgreSQL lays out data on disk.
+     Note that changing these breaks on-disk database compatibility,
+     meaning you cannot use <command>pg_upgrade</command> to upgrade to
+     a build with a different value of these options.
+    </para>
+
+    <variablelist>
+
+      <varlistentry>
+       <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>segment size</firstterm>, in gigabytes.  Large tables are
+         divided into multiple operating-system files, each of size equal
+         to the segment size.  This avoids problems with file size limits
+         that exist on many platforms.  The default segment size, 1 gigabyte,
+         is safe on all supported platforms.  If your operating system has
+         <quote>largefile</quote> support (which most do, nowadays), you can use
+         a larger segment size.  This can be helpful to reduce the number of
+         file descriptors consumed when working with very large tables.
+         But be careful not to select a value larger than is supported
+         by your platform and the file systems you intend to use.  Other
+         tools you might wish to use, such as <application>tar</application>, could
+         also set limits on the usable file size.
+         It is recommended, though not absolutely required, that this value
+         be a power of 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within tables.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 32 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+       <listitem>
+        <para>
+         Set the <firstterm>WAL block size</firstterm>, in kilobytes.  This is the unit
+         of storage and I/O within the WAL log.  The default, 8 kilobytes,
+         is suitable for most situations; but other values may be useful
+         in special cases.
+         The value must be a power of 2 between 1 and 64 (kilobytes).
+        </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+   </sect3>
+
+   <sect3 id="configure-devel">
+    <title>Developer Options</title>
+
+    <para>
+     Most of the options in this section are only of interest for
+     developing or debugging <productname>PostgreSQL</productname>.
+     They are not recommended for production builds, except
+     for <option>--debug</option>, which can be useful to enable
+     detailed bug reports in the unlucky event that you encounter a bug.
+     On platforms supporting DTrace, <option>-Ddtrace</option>
+     may also be reasonable to use in production.
+    </para>
+
+    <para>
+     When building an installation that will be used to develop code inside
+     the server, it is recommended to use at least the <option>--buildtype=debug</option>
+     and <option>-Dcassert</option> options.
+    </para>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term>
+       <listitem>
+        <para>
+         This option can be used to specify the buildtype to use; defaults
+         to release. If you'd like finer control on the debug symbols
+         and optimization levels than what this option provides, you can
+         refer to the --debug and --optimization flags.
+
+         The following build types are generally used:
+         <variablelist>
+          <varlistentry>
+           <term><literal>plain</literal></term>
+           <listitem>
+            <para>
+            No extra build flags are used, even for compiler warnings,
+            useful for distro packagers and other cases where you need to
+            specify all arguments by yourself.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debug</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated but the result is not optimized.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>debugoptimized</literal></term>
+           <listitem>
+            <para>
+            Debug info is generated and the code is optimized (on most compilers
+            this means <literal>-g -O2</literal>)
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>release</literal></term>
+           <listitem>
+            <para>
+            This enables full optimization and no debug info is generated. This is
+            the default.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--debug</option></term>
+       <listitem>
+        <para>
+         Compiles all programs and libraries with debugging symbols.
+         This means that you can run the programs in a debugger
+         to analyze problems. This enlarges the size of the installed
+         executables considerably, and on non-GCC compilers it usually
+         also disables compiler optimization, causing slowdowns. However,
+         having the symbols available is extremely helpful for dealing
+         with any problems that might arise.  Currently, this option is
+         recommended for production installations only if you use GCC.
+         But you should always have it on if you are doing development work
+         or running a beta version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term>
+       <listitem>
+        <para>
+         Specify the optimization level. LEVEL can be set to any of {0,g,1,2,3,s}.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--werror</option></term>
+       <listitem>
+        <para>
+         Setting this option asks the compiler to treat warnings as errors. This can
+         be useful for code development purposes.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dcassert</option></term>
+       <listitem>
+        <para>
+         Enables <firstterm>assertion</firstterm> checks in the server, which test for
+         many <quote>cannot happen</quote> conditions.  This is invaluable for
+         code development purposes, but the tests can slow down the
+         server significantly.
+         Also, having the tests turned on won't necessarily enhance the
+         stability of your server!  The assertion checks are not categorized
+         for severity, and so what might be a relatively harmless bug will
+         still lead to server restarts if it triggers an assertion
+         failure.  This option is not recommended for production use, but
+         you should have it on for development work or when running a beta
+         version.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dtap-tests</option></term>
+       <listitem>
+        <para>
+         Enable tests using the Perl TAP tools.  This requires a Perl
+         installation and the Perl module <literal>IPC::Run</literal>.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term>
+       <listitem>
+        <para>
+         Enable test suites which require special software to run. This option
+         accepts arguments via a whitespace-separated list. The following values
+         are currently supported:
+         <variablelist>
+          <varlistentry>
+           <term><literal>kerberos</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/kerberos</filename>.  This
+            requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ldap</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ldap</filename>.  This
+            requires an <productname>OpenLDAP</productname> installation and opens
+            TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>ssl</literal></term>
+           <listitem>
+            <para>
+            Runs the test suite under <filename>src/test/ssl</filename>.  This opens TCP/IP listen sockets.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>wal_consistency_checking</literal></term>
+           <listitem>
+            <para>
+            Uses <literal>wal_consistency_checking=all</literal> while running
+            certain tests under <filename>src/test/recovery</filename>.  Not
+            enabled by default because it is resource intensive.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+         Tests for features that are not supported by the current build
+         configuration are not run even if they are mentioned in
+         <varname>PG_TEST_EXTRA</varname>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>--errorlogs</option></term>
+       <listitem>
+        <para>
+        This option can be used to print the logs from the failing tests
+        making debugging easier.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Db_coverage</option></term>
+       <listitem>
+        <para>
+         If using GCC, all programs and libraries are compiled with
+         code coverage testing instrumentation.  When run, they
+         generate files in the build directory with code coverage
+         metrics.
+         <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/>
+         for more information.</phrase> This option is for use only with GCC
+         and when doing development work.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Ddtrace=<replaceable>auto/enabled/disabled</replaceable></option></term>
+       <listitem>
+        <para>
+         <indexterm>
+          <primary>DTrace</primary>
+         </indexterm>
+         Enabling this compiles <productname>PostgreSQL</productname> with support for the
+         dynamic tracing tool DTrace.
+         <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/>
+         for more information.</phrase>
+        </para>
+
+        <para>
+         To point to the <command>dtrace</command> program, the
+         environment variable <envar>DTRACE</envar> can be set.  This
+         will often be necessary because <command>dtrace</command> is
+         typically installed under <filename>/usr/sbin</filename>,
+         which might not be in your <envar>PATH</envar>.
+        </para>
+
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+   <sect3 id="configure-misc">
+    <title>Miscellaneous</title>
+
+     <variablelist>
+      <varlistentry>
+       <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term>
+       <listitem>
+        <para>
+         Set <replaceable>NUMBER</replaceable> as the default port number for
+         server and clients. The default is 5432. The port can always
+         be changed later on, but if you specify it here then both
+         server and clients will have the same default compiled in,
+         which can be very convenient.  Usually the only good reason
+         to select a non-default value is if you intend to run multiple
+         <productname>PostgreSQL</productname> servers on the same machine.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term>
+       <listitem>
+        <para>
+         The default name of the Kerberos service principal used
+         by GSSAPI.
+         <literal>postgres</literal> is the default. There's usually no
+         reason to change this unless you are building for a Windows
+         environment, in which case it must be set to upper case
+         <literal>POSTGRES</literal>.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+   </sect3>
+
+ </sect2>
+
+ <sect2 id="build-meson">
+  <title>Building the source</title>
+   <para>
+    By default, <productname>Meson</productname> uses the
+    <ulink url="https://ninja-build.org/"> Ninja build system</ulink>.
+    To build <productname>PostgreSQL</productname> from source using meson, you can
+    simply use the <literal>ninja</literal> command in the build directory.
+<screen>
+ninja
+</screen>
+     Ninja will automatically detect the number of CPUs in your computer and
+     parallelize itself accordingly. You can override the amount of parallel
+     processes used with the command line argument <literal>-j</literal>.
+   </para>
+
+   <para>
+     It should be noted that after the initial configure step
+     <command>ninja</command> is the only command you ever need to type to
+     compile. No matter how you alter your source tree (short of moving it to
+     a completely new location), Meson will detect the changes and regenerate
+     itself accordingly. This is especially handy if you have multiple build
+     directories. Often one of them is used for development (the "debug" build)
+     and others only every now and then (such as a "static analysis" build).
+     Any configuration can be built just by cd'ing to the corresponding directory
+     and running Ninja.
+   </para>
+
+   <para>
+     If you'd like to build with a backend other that ninja, you can use configure
+     with the <option>--backend</option> option to select the one you want to use and then
+     build using <literal>meson compile</literal>. To learn more about these
+     backends and other arguments you can provide to ninja, you can refer to the
+     meson <ulink url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
+     documentation</ulink>.
+   </para>
+ </sect2>
+
+ <sect2 id="install-files-meson">
+  <title>Installing the files</title>
+   <para>
+    Once Postgres is built, you can install it by simply running the
+    <literal>ninja install</literal> command.
+
+<screen>
+ninja install
+</screen>
+   </para>
+
+   <para>
+    This will install files into the directories that were specified
+    in <xref linkend="configure-meson"/>. Make sure that you have appropriate
+    permissions to write into that area. You might need to do this
+    step as root. Alternatively, you can create the target directories
+    in advance and arrange for appropriate permissions to be granted.
+    The standard installation provides all the header files needed for client
+    application development as well as for server-side program
+    development, such as custom functions or data types written in C.
+   </para>
+
+   <para>
+    <literal>ninja install</literal> should work for most cases
+    but if you'd like to use more options, you could also use
+    <literal>meson install</literal> instead. You can learn more about
+    <ulink url="https://mesonbuild.com/Commands.html#install">meson install</ulink>
+    and it's options in the meson documentation.
+   </para>
+
+   <para>
+    Depending on your platform and setup, you might have to perform a
+    few steps after installation. Those are outlined in
+    <xref linkend="install-post"/>.
+   </para>
+
+  <formalpara>
+   <title>Uninstallation:</title>
+   <para>
+    To undo the installation, you can use the <command>ninja
+    uninstall</command> command.
+   </para>
+  </formalpara>
+
+  <formalpara>
+   <title>Cleaning:</title>
+   <para>
+    After the installation you can free disk space by removing the built
+    files from the source tree with the <command>ninja clean</command>
+    command.
+   </para>
+  </formalpara>
+
+ </sect2>
+
+ <sect2 id="running-tests">
+  <title>Running tests</title>
+   <para>
+    If you want to test the newly built server, you can run the regression
+    tests. The regression tests are a collection of test suites to verify
+    that <productname>PostgreSQL</productname> runs on your machine in
+    the way the developers expected it to. To run them, simply type:
+<screen>
+<userinput>meson test</userinput>
+</screen>
+    You can repeat this at any later time by issuing the same command.
+   </para>
+
+   <para>Meson also allows you to list tests and run specific tests or suites.
+<screen>
+# List all tests
+<userinput>meson test --list</userinput>
+
+# Run a specific test
+<userinput>meson test recovery/001_stream_rep</userinput>
+
+# Run the main pg_regress and isolation tests
+<userinput>meson test --suite main</userinput>
+</screen>
+   </para>
+
+   <para>
+    To learn more about running the tests and how to interpret the results
+    you can refer to the documentation for interpreting test results.
+     <literal>meson test</literal> also provides a number of additional
+    options you can use which can be found in the
+    <ulink url="https://mesonbuild.com/Unit-tests.html#testing-tool">meson test documentation</ulink>.
+   </para>
+
+ </sect2>
+
+ </sect1>
+
  <sect1 id="install-post">
   <title>Post-Installation Setup</title>
 
@@ -2106,62 +3797,6 @@ export MANPATH
   </sect2>
  </sect1>
 
- <sect1 id="supported-platforms">
-  <title>Supported Platforms</title>
-
-  <para>
-   A platform (that is, a CPU architecture and operating system combination)
-   is considered supported by the <productname>PostgreSQL</productname> development
-   community if the code contains provisions to work on that platform and
-   it has recently been verified to build and pass its regression tests
-   on that platform.  Currently, most testing of platform compatibility
-   is done automatically by test machines in the
-   <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
-   If you are interested in using <productname>PostgreSQL</productname> on a platform
-   that is not represented in the build farm, but on which the code works
-   or can be made to work, you are strongly encouraged to set up a build
-   farm member machine so that continued compatibility can be assured.
-  </para>
-
-  <para>
-   In general, <productname>PostgreSQL</productname> can be expected to work on
-   these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
-   and PA-RISC, including
-   big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
-   It is often
-   possible to build on an unsupported CPU type by configuring with
-   <option>--disable-spinlocks</option>, but performance will be poor.
-  </para>
-
-  <para>
-   <productname>PostgreSQL</productname> can be expected to work on current
-   versions of these operating systems: Linux, Windows,
-   FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
-   Other Unix-like systems may also work but are not currently
-   being tested.  In most cases, all CPU architectures supported by
-   a given operating system will work.  Look in
-   <xref linkend="installation-platform-notes"/> below to see if
-   there is information
-   specific to your operating system, particularly if using an older system.
-  </para>
-
-  <para>
-   If you have installation problems on a platform that is known
-   to be supported according to recent build farm results, please report
-   it to <email>pgsql-bugs@lists.postgresql.org</email>.  If you are interested
-   in porting <productname>PostgreSQL</productname> to a new platform,
-   <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
-   to discuss that.
-  </para>
-
-  <para>
-   Historical versions of <productname>PostgreSQL</productname> or POSTGRES
-   also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
-   M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
-   BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
-   Tru64 UNIX, and ULTRIX.
-  </para>
- </sect1>
 
  <sect1 id="installation-platform-notes">
   <title>Platform-Specific Notes</title>
@@ -2170,7 +3805,7 @@ export MANPATH
    This section documents additional platform-specific issues
    regarding the installation and setup of PostgreSQL.  Be sure to
    read the installation instructions, and in
-   particular <xref linkend="install-requirements"/> as well.  Also,
+   particular <xref linkend="install-requirements-make"/> as well.  Also,
    check <xref linkend="regress"/> regarding the
    interpretation of regression test results.
   </para>
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 1d9509a2f66..214e1b1d551 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -7072,7 +7072,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
    explicitly tell the configure script to make the probes available
    in <productname>PostgreSQL</productname>. To include DTrace support
    specify <option>--enable-dtrace</option> to configure.  See <xref
-   linkend="install-procedure"/> for further information.
+   linkend="configure-options-devel"/> for further information.
   </para>
   </sect2>
 
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index f268265a838..7a1d220175b 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1855,7 +1855,7 @@ $ <userinput>kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</userinput
     <step>
      <para>
       Install the new version of <productname>PostgreSQL</productname> as
-      outlined in <xref linkend="install-procedure"/>.
+      outlined in <xref linkend="installation"/>.
      </para>
     </step>
 
diff --git a/doc/src/sgml/sourcerepo.sgml b/doc/src/sgml/sourcerepo.sgml
index 0ed7f8a3fea..f16be29a61a 100644
--- a/doc/src/sgml/sourcerepo.sgml
+++ b/doc/src/sgml/sourcerepo.sgml
@@ -20,9 +20,10 @@
    Note that building <productname>PostgreSQL</productname> from the source
    repository requires reasonably up-to-date versions of <application>bison</application>,
    <application>flex</application>, and <application>Perl</application>. These tools are not needed
-   to build from a distribution tarball, because the files that these tools
+   to build from a distribution tarball if building via make, because the files that these tools
    are used to build are included in the tarball.  Other tool requirements
-   are the same as shown in <xref linkend="install-requirements"/>.
+   are the same as shown in <xref linkend="install-requirements-make"/> and
+   <xref linkend="install-requirements-meson"/>.
   </para>
 
  <sect1 id="git">
-- 
2.37.3.542.gdd3f6c4cae

v17-0008-autoconf-Unify-CFLAGS_SSE42-and-CFLAGS_ARMV8_CRC.patchtext/x-diff; charset=us-asciiDownload
From a3876636373c64e4192e2fa571523da6431004c4 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 14:05:10 -0700
Subject: [PATCH v17 08/23] autoconf: Unify CFLAGS_SSE42 and
 CFLAGS_ARMV8_CRC32C

There's no need for two different set of flags, as we'll only ever run on a
one architecture at a time... Simplifies meson PGXS compatibility.
---
 src/port/Makefile      | 16 ++++++++--------
 config/c-compiler.m4   |  8 ++++----
 configure              | 19 +++++++++----------
 configure.ac           | 10 +++++-----
 src/Makefile.global.in |  3 +--
 5 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/src/port/Makefile b/src/port/Makefile
index b3754d8940a..711f59e32bd 100644
--- a/src/port/Makefile
+++ b/src/port/Makefile
@@ -88,15 +88,15 @@ libpgport.a: $(OBJS)
 thread.o: CFLAGS+=$(PTHREAD_CFLAGS)
 thread_shlib.o: CFLAGS+=$(PTHREAD_CFLAGS)
 
-# all versions of pg_crc32c_sse42.o need CFLAGS_SSE42
-pg_crc32c_sse42.o: CFLAGS+=$(CFLAGS_SSE42)
-pg_crc32c_sse42_shlib.o: CFLAGS+=$(CFLAGS_SSE42)
-pg_crc32c_sse42_srv.o: CFLAGS+=$(CFLAGS_SSE42)
+# all versions of pg_crc32c_sse42.o need CFLAGS_CRC
+pg_crc32c_sse42.o: CFLAGS+=$(CFLAGS_CRC)
+pg_crc32c_sse42_shlib.o: CFLAGS+=$(CFLAGS_CRC)
+pg_crc32c_sse42_srv.o: CFLAGS+=$(CFLAGS_CRC)
 
-# all versions of pg_crc32c_armv8.o need CFLAGS_ARMV8_CRC32C
-pg_crc32c_armv8.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C)
-pg_crc32c_armv8_shlib.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C)
-pg_crc32c_armv8_srv.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C)
+# all versions of pg_crc32c_armv8.o need CFLAGS_CRC
+pg_crc32c_armv8.o: CFLAGS+=$(CFLAGS_CRC)
+pg_crc32c_armv8_shlib.o: CFLAGS+=$(CFLAGS_CRC)
+pg_crc32c_armv8_srv.o: CFLAGS+=$(CFLAGS_CRC)
 
 #
 # Shared library versions of object files
diff --git a/config/c-compiler.m4 b/config/c-compiler.m4
index 000b075312e..eb8cc8ce170 100644
--- a/config/c-compiler.m4
+++ b/config/c-compiler.m4
@@ -597,7 +597,7 @@ fi])# PGAC_HAVE_GCC__ATOMIC_INT64_CAS
 # the other ones are, on x86-64 platforms)
 #
 # An optional compiler flag can be passed as argument (e.g. -msse4.2). If the
-# intrinsics are supported, sets pgac_sse42_crc32_intrinsics, and CFLAGS_SSE42.
+# intrinsics are supported, sets pgac_sse42_crc32_intrinsics, and CFLAGS_CRC.
 AC_DEFUN([PGAC_SSE42_CRC32_INTRINSICS],
 [define([Ac_cachevar], [AS_TR_SH([pgac_cv_sse42_crc32_intrinsics_$1])])dnl
 AC_CACHE_CHECK([for _mm_crc32_u8 and _mm_crc32_u32 with CFLAGS=$1], [Ac_cachevar],
@@ -613,7 +613,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <nmmintrin.h>],
   [Ac_cachevar=no])
 CFLAGS="$pgac_save_CFLAGS"])
 if test x"$Ac_cachevar" = x"yes"; then
-  CFLAGS_SSE42="$1"
+  CFLAGS_CRC="$1"
   pgac_sse42_crc32_intrinsics=yes
 fi
 undefine([Ac_cachevar])dnl
@@ -629,7 +629,7 @@ undefine([Ac_cachevar])dnl
 #
 # An optional compiler flag can be passed as argument (e.g.
 # -march=armv8-a+crc). If the intrinsics are supported, sets
-# pgac_armv8_crc32c_intrinsics, and CFLAGS_ARMV8_CRC32C.
+# pgac_armv8_crc32c_intrinsics, and CFLAGS_CRC.
 AC_DEFUN([PGAC_ARMV8_CRC32C_INTRINSICS],
 [define([Ac_cachevar], [AS_TR_SH([pgac_cv_armv8_crc32c_intrinsics_$1])])dnl
 AC_CACHE_CHECK([for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=$1], [Ac_cachevar],
@@ -647,7 +647,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <arm_acle.h>],
   [Ac_cachevar=no])
 CFLAGS="$pgac_save_CFLAGS"])
 if test x"$Ac_cachevar" = x"yes"; then
-  CFLAGS_ARMV8_CRC32C="$1"
+  CFLAGS_CRC="$1"
   pgac_armv8_crc32c_intrinsics=yes
 fi
 undefine([Ac_cachevar])dnl
diff --git a/configure b/configure
index 1caca21b625..80b28cb9310 100755
--- a/configure
+++ b/configure
@@ -645,8 +645,7 @@ MSGMERGE
 MSGFMT_FLAGS
 MSGFMT
 PG_CRC32C_OBJS
-CFLAGS_ARMV8_CRC32C
-CFLAGS_SSE42
+CFLAGS_CRC
 LIBOBJS
 ZSTD
 LZ4
@@ -17815,7 +17814,7 @@ fi
 #
 # First check if the _mm_crc32_u8 and _mm_crc32_u64 intrinsics can be used
 # with the default compiler flags. If not, check if adding the -msse4.2
-# flag helps. CFLAGS_SSE42 is set to -msse4.2 if that's required.
+# flag helps. CFLAGS_CRC is set to -msse4.2 if that's required.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mm_crc32_u8 and _mm_crc32_u32 with CFLAGS=" >&5
 $as_echo_n "checking for _mm_crc32_u8 and _mm_crc32_u32 with CFLAGS=... " >&6; }
 if ${pgac_cv_sse42_crc32_intrinsics_+:} false; then :
@@ -17850,7 +17849,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_sse42_crc32_intrinsics_" >&5
 $as_echo "$pgac_cv_sse42_crc32_intrinsics_" >&6; }
 if test x"$pgac_cv_sse42_crc32_intrinsics_" = x"yes"; then
-  CFLAGS_SSE42=""
+  CFLAGS_CRC=""
   pgac_sse42_crc32_intrinsics=yes
 fi
 
@@ -17889,13 +17888,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_sse42_crc32_intrinsics__msse4_2" >&5
 $as_echo "$pgac_cv_sse42_crc32_intrinsics__msse4_2" >&6; }
 if test x"$pgac_cv_sse42_crc32_intrinsics__msse4_2" = x"yes"; then
-  CFLAGS_SSE42="-msse4.2"
+  CFLAGS_CRC="-msse4.2"
   pgac_sse42_crc32_intrinsics=yes
 fi
 
 fi
 
-
 # Are we targeting a processor that supports SSE 4.2? gcc, clang and icc all
 # define __SSE4_2__ in that case.
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -17922,7 +17920,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 #
 # First check if __crc32c* intrinsics can be used with the default compiler
 # flags. If not, check if adding -march=armv8-a+crc flag helps.
-# CFLAGS_ARMV8_CRC32C is set if the extra flag is required.
+# CFLAGS_CRC is set if the extra flag is required.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=" >&5
 $as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=... " >&6; }
 if ${pgac_cv_armv8_crc32c_intrinsics_+:} false; then :
@@ -17959,7 +17957,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_armv8_crc32c_intrinsics_" >&5
 $as_echo "$pgac_cv_armv8_crc32c_intrinsics_" >&6; }
 if test x"$pgac_cv_armv8_crc32c_intrinsics_" = x"yes"; then
-  CFLAGS_ARMV8_CRC32C=""
+  CFLAGS_CRC=""
   pgac_armv8_crc32c_intrinsics=yes
 fi
 
@@ -18000,13 +17998,14 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" >&5
 $as_echo "$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" >&6; }
 if test x"$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" = x"yes"; then
-  CFLAGS_ARMV8_CRC32C="-march=armv8-a+crc"
+  CFLAGS_CRC="-march=armv8-a+crc"
   pgac_armv8_crc32c_intrinsics=yes
 fi
 
 fi
 
 
+
 # Select CRC-32C implementation.
 #
 # If we are targeting a processor that has Intel SSE 4.2 instructions, we can
@@ -18034,7 +18033,7 @@ if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" &&
       USE_SSE42_CRC32C_WITH_RUNTIME_CHECK=1
     else
       # Use ARM CRC Extension if available.
-      if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_ARMV8_CRC32C" = x""; then
+      if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_CRC" = x""; then
         USE_ARMV8_CRC32C=1
       else
         # ARM CRC Extension, with runtime check?
diff --git a/configure.ac b/configure.ac
index 10fa55dd154..f837a602d01 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2086,12 +2086,11 @@ fi
 #
 # First check if the _mm_crc32_u8 and _mm_crc32_u64 intrinsics can be used
 # with the default compiler flags. If not, check if adding the -msse4.2
-# flag helps. CFLAGS_SSE42 is set to -msse4.2 if that's required.
+# flag helps. CFLAGS_CRC is set to -msse4.2 if that's required.
 PGAC_SSE42_CRC32_INTRINSICS([])
 if test x"$pgac_sse42_crc32_intrinsics" != x"yes"; then
   PGAC_SSE42_CRC32_INTRINSICS([-msse4.2])
 fi
-AC_SUBST(CFLAGS_SSE42)
 
 # Are we targeting a processor that supports SSE 4.2? gcc, clang and icc all
 # define __SSE4_2__ in that case.
@@ -2105,12 +2104,13 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
 #
 # First check if __crc32c* intrinsics can be used with the default compiler
 # flags. If not, check if adding -march=armv8-a+crc flag helps.
-# CFLAGS_ARMV8_CRC32C is set if the extra flag is required.
+# CFLAGS_CRC is set if the extra flag is required.
 PGAC_ARMV8_CRC32C_INTRINSICS([])
 if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then
   PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc])
 fi
-AC_SUBST(CFLAGS_ARMV8_CRC32C)
+
+AC_SUBST(CFLAGS_CRC)
 
 # Select CRC-32C implementation.
 #
@@ -2139,7 +2139,7 @@ if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" &&
       USE_SSE42_CRC32C_WITH_RUNTIME_CHECK=1
     else
       # Use ARM CRC Extension if available.
-      if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_ARMV8_CRC32C" = x""; then
+      if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_CRC" = x""; then
         USE_ARMV8_CRC32C=1
       else
         # ARM CRC Extension, with runtime check?
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index d8ea2da583c..c87b6d97ca9 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -262,8 +262,7 @@ CFLAGS_SL_MODULE = @CFLAGS_SL_MODULE@
 CXXFLAGS_SL_MODULE = @CXXFLAGS_SL_MODULE@
 CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@
 CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@
-CFLAGS_SSE42 = @CFLAGS_SSE42@
-CFLAGS_ARMV8_CRC32C = @CFLAGS_ARMV8_CRC32C@
+CFLAGS_CRC = @CFLAGS_CRC@
 PERMIT_DECLARATION_AFTER_STATEMENT = @PERMIT_DECLARATION_AFTER_STATEMENT@
 CXXFLAGS = @CXXFLAGS@
 
-- 
2.37.3.542.gdd3f6c4cae

v17-0009-autoconf-Rely-on-ar-supporting-index-creation.patchtext/x-diff; charset=us-asciiDownload
From 87f4e70d0e4c843d444c2353ed610e298e79f718 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 14:16:20 -0700
Subject: [PATCH v17 09/23] autoconf: Rely on ar supporting index creation

This way we don't need RANLIB anymore, making it a bit simpler to for the
meson build to generate Makefile.global for PGXS compatibility.

FreeBSD, NetBSD, OpenBSD, the only platforms were we didn't use AROPT=crs, all
have supported the 's' option for a long time.

On macOS we ran ranlib after installing a static library. This was added a
long time ago, in 58ad65ec2def. I cannot reproduce an issue in more recent
macOS versions.
---
 src/makefiles/Makefile.aix     |  3 --
 src/makefiles/Makefile.cygwin  |  2 -
 src/makefiles/Makefile.darwin  |  2 -
 src/makefiles/Makefile.freebsd |  2 -
 src/makefiles/Makefile.linux   |  2 -
 src/makefiles/Makefile.netbsd  |  2 -
 src/makefiles/Makefile.openbsd |  2 -
 src/makefiles/Makefile.solaris |  2 -
 src/makefiles/Makefile.win32   |  2 -
 configure                      | 93 ----------------------------------
 configure.ac                   |  1 -
 src/Makefile.global.in         |  2 +-
 src/Makefile.shlib             | 11 ----
 13 files changed, 1 insertion(+), 125 deletions(-)

diff --git a/src/makefiles/Makefile.aix b/src/makefiles/Makefile.aix
index 56d7f22aff6..dd16a7a0378 100644
--- a/src/makefiles/Makefile.aix
+++ b/src/makefiles/Makefile.aix
@@ -2,9 +2,6 @@
 # symbol names to tell them what to export/import.
 MAKE_EXPORTS= true
 
-RANLIB= touch
-AROPT = crs
-
 # -blibpath must contain ALL directories where we should look for libraries
 libpath := $(shell echo $(subst -L,:,$(filter -L/%,$(LDFLAGS))) | sed -e's/ //g'):/usr/lib:/lib
 
diff --git a/src/makefiles/Makefile.cygwin b/src/makefiles/Makefile.cygwin
index 6afa9a06a1b..77593972638 100644
--- a/src/makefiles/Makefile.cygwin
+++ b/src/makefiles/Makefile.cygwin
@@ -10,8 +10,6 @@ endif
 # (see http://sources.redhat.com/cygwin/faq/faq.html#SEC110)
 LIBS:=$(filter-out -lm -lc, $(LIBS))
 
-AROPT = crs
-
 override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT)
 
 ifneq (,$(findstring backend,$(subdir)))
diff --git a/src/makefiles/Makefile.darwin b/src/makefiles/Makefile.darwin
index 45f253a5b43..7095f66e25c 100644
--- a/src/makefiles/Makefile.darwin
+++ b/src/makefiles/Makefile.darwin
@@ -1,5 +1,3 @@
-AROPT = crs
-
 # env var name to use in place of LD_LIBRARY_PATH
 ld_library_path_var = DYLD_LIBRARY_PATH
 
diff --git a/src/makefiles/Makefile.freebsd b/src/makefiles/Makefile.freebsd
index 0e77616b0f9..db74a21568c 100644
--- a/src/makefiles/Makefile.freebsd
+++ b/src/makefiles/Makefile.freebsd
@@ -1,5 +1,3 @@
-AROPT = cr
-
 export_dynamic = -Wl,-export-dynamic
 rpath = -Wl,-R'$(rpathdir)'
 
diff --git a/src/makefiles/Makefile.linux b/src/makefiles/Makefile.linux
index 1ffec9d1698..5a9451371ab 100644
--- a/src/makefiles/Makefile.linux
+++ b/src/makefiles/Makefile.linux
@@ -1,5 +1,3 @@
-AROPT = crs
-
 export_dynamic = -Wl,-E
 # Use --enable-new-dtags to generate DT_RUNPATH instead of DT_RPATH.
 # This allows LD_LIBRARY_PATH to still work when needed.
diff --git a/src/makefiles/Makefile.netbsd b/src/makefiles/Makefile.netbsd
index 421b735e407..4f8e9ec2521 100644
--- a/src/makefiles/Makefile.netbsd
+++ b/src/makefiles/Makefile.netbsd
@@ -1,5 +1,3 @@
-AROPT = cr
-
 export_dynamic = -Wl,-E
 rpath = -Wl,-R'$(rpathdir)'
 
diff --git a/src/makefiles/Makefile.openbsd b/src/makefiles/Makefile.openbsd
index 421b735e407..4f8e9ec2521 100644
--- a/src/makefiles/Makefile.openbsd
+++ b/src/makefiles/Makefile.openbsd
@@ -1,5 +1,3 @@
-AROPT = cr
-
 export_dynamic = -Wl,-E
 rpath = -Wl,-R'$(rpathdir)'
 
diff --git a/src/makefiles/Makefile.solaris b/src/makefiles/Makefile.solaris
index acdf44cc0f2..3de73ebc010 100644
--- a/src/makefiles/Makefile.solaris
+++ b/src/makefiles/Makefile.solaris
@@ -1,6 +1,4 @@
 # src/makefiles/Makefile.solaris
-
-AROPT = crs
 rpath = -Wl,-rpath,'$(rpathdir)'
 
 ifeq ($(with_gnu_ld), yes)
diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32
index d268b3ebafd..dc1aafa115a 100644
--- a/src/makefiles/Makefile.win32
+++ b/src/makefiles/Makefile.win32
@@ -10,8 +10,6 @@ endif
 
 override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT)
 
-AROPT = crs
-
 ifneq (,$(findstring backend,$(subdir)))
 ifeq (,$(findstring conversion_procs,$(subdir)))
 ifeq (,$(findstring libpqwalreceiver,$(subdir)))
diff --git a/configure b/configure
index 80b28cb9310..d338ae2cc8b 100755
--- a/configure
+++ b/configure
@@ -691,7 +691,6 @@ AR
 STRIP_SHARED_LIB
 STRIP_STATIC_LIB
 STRIP
-RANLIB
 with_gnu_ld
 LD
 LDFLAGS_SL
@@ -9465,98 +9464,6 @@ with_gnu_ld=$ac_cv_prog_gnu_ld
 
 
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
 
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
diff --git a/configure.ac b/configure.ac
index f837a602d01..66c60974ef9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1129,7 +1129,6 @@ AC_ARG_VAR(LDFLAGS_SL, [extra linker flags for linking shared libraries only])
 PGAC_PROG_LD
 AC_SUBST(LD)
 AC_SUBST(with_gnu_ld)
-AC_PROG_RANLIB
 PGAC_CHECK_STRIP
 AC_CHECK_TOOL(AR, ar, ar)
 if test "$PORTNAME" = "win32"; then
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index c87b6d97ca9..a5e2f36d217 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -283,6 +283,7 @@ ZIC = @ZIC@
 # Linking
 
 AR = @AR@
+AROPT = crs
 LIBS = @LIBS@
 LDAP_LIBS_FE = @LDAP_LIBS_FE@
 LDAP_LIBS_BE = @LDAP_LIBS_BE@
@@ -317,7 +318,6 @@ LDFLAGS_EX = @LDFLAGS_EX@
 LDFLAGS_SL += @LDFLAGS_SL@
 LDREL = -r
 LDOUT = -o
-RANLIB = @RANLIB@
 WINDRES = @WINDRES@
 X = @EXEEXT@
 
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index db466b3b845..fd0909b95df 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -251,17 +251,10 @@ all-static-lib: $(stlib)
 
 all-shared-lib: $(shlib)
 
-# In this rule, "touch $@" works around a problem on some platforms wherein
-# ranlib updates the library file's mod time with a value calculated to
-# seconds precision.  If the filesystem has sub-second timestamps, this can
-# cause the library file to appear older than its input files, triggering
-# parallel-make problems.
 ifndef haslibarule
 $(stlib): $(OBJS) | $(SHLIB_PREREQS)
 	rm -f $@
 	$(LINK.static) $@ $^
-	$(RANLIB) $@
-	touch $@
 endif #haslibarule
 
 # AIX wraps shared libraries inside a static library, can be used both
@@ -394,10 +387,6 @@ install-lib-pc: lib$(NAME).pc installdirs-lib
 
 install-lib-static: $(stlib) installdirs-lib
 	$(INSTALL_STLIB) $< '$(DESTDIR)$(libdir)/$(stlib)'
-ifeq ($(PORTNAME), darwin)
-	cd '$(DESTDIR)$(libdir)' && \
-	$(RANLIB) $(stlib)
-endif
 
 install-lib-shared: $(shlib) installdirs-lib
 ifdef soname
-- 
2.37.3.542.gdd3f6c4cae

v17-0010-aix-Build-SUBSYS.o-using-CC-r-instead-of-LD-r.patchtext/x-diff; charset=us-asciiDownload
From 13be39982f12f79fb7ec54d2202885d268fdf090 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 14:42:01 -0700
Subject: [PATCH v17 10/23] aix: Build SUBSYS.o using $(CC) -r instead of $(LD)
 -r

This is the only direct use of $(LD), and xlc -r and gcc -r end up with the
same set of symbols and similar performance (noise is high, so hard to say if
equivalent).

Now that $(LD) isn't needed anymore, remove it from src/Makefile.global

While at it, add a comment why -r is used.

Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/backend/Makefile   | 4 +++-
 configure              | 2 --
 configure.ac           | 1 -
 src/Makefile.global.in | 3 ---
 4 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/src/backend/Makefile b/src/backend/Makefile
index 181c217fae4..5b704bb3600 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -100,8 +100,10 @@ ifeq ($(PORTNAME), aix)
 postgres: $(POSTGRES_IMP)
 	$(CC) $(CFLAGS) $(call expand_subsys,$(OBJS)) $(LDFLAGS) $(LDFLAGS_EX) -Wl,-bE:$(top_builddir)/src/backend/$(POSTGRES_IMP) $(LIBS) -Wl,-brtllib -o $@
 
+# linking to a single .o with -r is a lot faster than building a .a or passing
+# all objects to MKLDEXPORT
 $(POSTGRES_IMP): $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(call expand_subsys,$^)
+	$(CC) -r -o SUBSYS.o $(call expand_subsys,$^)
 	$(MKLDEXPORT) SUBSYS.o . > $@
 	@rm -f SUBSYS.o
 
diff --git a/configure b/configure
index d338ae2cc8b..7eafefb062a 100755
--- a/configure
+++ b/configure
@@ -692,7 +692,6 @@ STRIP_SHARED_LIB
 STRIP_STATIC_LIB
 STRIP
 with_gnu_ld
-LD
 LDFLAGS_SL
 LDFLAGS_EX
 ZSTD_LIBS
@@ -9464,7 +9463,6 @@ with_gnu_ld=$ac_cv_prog_gnu_ld
 
 
 
-
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
diff --git a/configure.ac b/configure.ac
index 66c60974ef9..398eb422595 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1127,7 +1127,6 @@ AC_ARG_VAR(LDFLAGS_EX, [extra linker flags for linking executables only])
 AC_ARG_VAR(LDFLAGS_SL, [extra linker flags for linking shared libraries only])
 
 PGAC_PROG_LD
-AC_SUBST(LD)
 AC_SUBST(with_gnu_ld)
 PGAC_CHECK_STRIP
 AC_CHECK_TOOL(AR, ar, ar)
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index a5e2f36d217..8107643578b 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -289,7 +289,6 @@ LDAP_LIBS_FE = @LDAP_LIBS_FE@
 LDAP_LIBS_BE = @LDAP_LIBS_BE@
 UUID_LIBS = @UUID_LIBS@
 LLVM_LIBS=@LLVM_LIBS@
-LD = @LD@
 with_gnu_ld = @with_gnu_ld@
 
 # It's critical that within LDFLAGS, all -L switches pointing to build-tree
@@ -316,8 +315,6 @@ LDFLAGS = $(LDFLAGS_INTERNAL) @LDFLAGS@
 LDFLAGS_EX = @LDFLAGS_EX@
 # LDFLAGS_SL might have already been assigned by calling makefile
 LDFLAGS_SL += @LDFLAGS_SL@
-LDREL = -r
-LDOUT = -o
 WINDRES = @WINDRES@
 X = @EXEEXT@
 
-- 
2.37.3.542.gdd3f6c4cae

v17-0011-solaris-Check-for-Wl-E-directly-instead-of-check.patchtext/x-diff; charset=us-asciiDownload
From 1ad3acc1a0eeea1b5872b2fbf0aefcef58e5610c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 15:39:40 -0700
Subject: [PATCH v17 11/23] solaris: Check for -Wl,-E directly instead of
 checking for gnu LD

This allows us to get rid of the harder to support with_gnu_ld detection,
simplifying meson PGXS compatibility. It's also nice to delete libtool.m4.

Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
 config/c-compiler.m4           |  16 ++++
 config/libtool.m4              | 119 ----------------------------
 src/makefiles/Makefile.solaris |   2 +-
 aclocal.m4                     |   1 -
 configure                      | 140 +++++++++------------------------
 configure.ac                   |  10 ++-
 src/Makefile.global.in         |   2 +-
 7 files changed, 64 insertions(+), 226 deletions(-)
 delete mode 100644 config/libtool.m4

diff --git a/config/c-compiler.m4 b/config/c-compiler.m4
index eb8cc8ce170..d798c385c44 100644
--- a/config/c-compiler.m4
+++ b/config/c-compiler.m4
@@ -491,6 +491,22 @@ fi
 undefine([Ac_cachevar])dnl
 ])# PGAC_PROG_CC_LDFLAGS_OPT
 
+
+# PGAC_PROG_CC_LD_EXPORT_DYNAMIC
+# ------------------------
+# Checks if the compiler / linker supports -Wl,-E and set
+# pgac_cv_prog_cc_ld_export_dynamic if so.
+AC_DEFUN([PGAC_PROG_CC_LD_EXPORT_DYNAMIC],
+[AC_CACHE_CHECK([whether $CC supports -Wl,-E], [pgac_cv_prog_cc_ld_export_dynamic],
+[pgac_save_LDFLAGS=$LDFLAGS
+LDFLAGS="$pgac_save_LDFLAGS -Wl,-E"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
+               [pgac_cv_prog_cc_ld_export_dynamic=yes],
+               [pgac_cv_prog_cc_ld_export_dynamic=no])
+LDFLAGS="$pgac_save_LDFLAGS"])
+])# PGAC_PROG_CC_LD_EXPORT_DYNAMIC
+
+
 # PGAC_HAVE_GCC__SYNC_CHAR_TAS
 # ----------------------------
 # Check if the C compiler understands __sync_lock_test_and_set(char),
diff --git a/config/libtool.m4 b/config/libtool.m4
deleted file mode 100644
index f6e426dbdf1..00000000000
--- a/config/libtool.m4
+++ /dev/null
@@ -1,119 +0,0 @@
-## libtool.m4 - Configure libtool for the host system. -*-Shell-script-*-
-## Copyright (C) 1996-1999,2000 Free Software Foundation, Inc.
-## Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful, but
-## WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-## General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-##
-## As a special exception to the GNU General Public License, if you
-## distribute this file as part of a program that contains a
-## configuration script generated by Autoconf, you may include it under
-## the same distribution terms that you use for the rest of that program.
-
-# No, PostgreSQL doesn't use libtool (yet), we just borrow stuff from it.
-# This file was taken on 2000-10-20 from the multi-language branch (since
-# that is the branch that PostgreSQL would most likely adopt anyway).
-# --petere
-
-# ... bunch of stuff removed here ...
-
-# PGAC_PROG_LD - find the path to the GNU or non-GNU linker
-AC_DEFUN([PGAC_PROG_LD],
-[AC_ARG_WITH(gnu-ld,
-[  --with-gnu-ld           assume the C compiler uses GNU ld [[default=no]]],
-test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-dnl ###not for PostgreSQL### AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by GCC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case "$ac_prog" in
-    # Accept absolute paths.
-changequote(,)dnl
-    [\\/]* | [A-Za-z]:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-changequote([,])dnl
-      # Canonicalize the path of ld
-      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(ac_cv_path_LD,
-[if test -z "$LD"; then
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      ac_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some GNU ld's only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
-	test "$with_gnu_ld" != no && break
-      else
-	test "$with_gnu_ld" != yes && break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-else
-  ac_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$ac_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-PGAC_PROG_LD_GNU
-])
-
-AC_DEFUN([PGAC_PROG_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
-  ac_cv_prog_gnu_ld=yes
-else
-  ac_cv_prog_gnu_ld=no
-fi])
-with_gnu_ld=$ac_cv_prog_gnu_ld
-])
-
-# ... more stuff removed ...
diff --git a/src/makefiles/Makefile.solaris b/src/makefiles/Makefile.solaris
index 3de73ebc010..ba8e57988a9 100644
--- a/src/makefiles/Makefile.solaris
+++ b/src/makefiles/Makefile.solaris
@@ -1,7 +1,7 @@
 # src/makefiles/Makefile.solaris
 rpath = -Wl,-rpath,'$(rpathdir)'
 
-ifeq ($(with_gnu_ld), yes)
+ifeq ($(SOLARIS_EXPORT_DYNAMIC), yes)
 export_dynamic = -Wl,-E
 endif
 
diff --git a/aclocal.m4 b/aclocal.m4
index 1c19c60c596..d05f8f9e3a8 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -4,7 +4,6 @@ m4_include([config/c-compiler.m4])
 m4_include([config/c-library.m4])
 m4_include([config/check_decls.m4])
 m4_include([config/general.m4])
-m4_include([config/libtool.m4])
 m4_include([config/llvm.m4])
 m4_include([config/perl.m4])
 m4_include([config/pkg.m4])
diff --git a/configure b/configure
index 7eafefb062a..c8bf357e6f3 100755
--- a/configure
+++ b/configure
@@ -629,6 +629,7 @@ ac_subst_vars='LTLIBOBJS
 vpath_build
 PG_SYSROOT
 PG_VERSION_NUM
+SOLARIS_EXPORT_DYNAMIC
 PROVE
 DBTOEPUB
 FOP
@@ -691,7 +692,6 @@ AR
 STRIP_SHARED_LIB
 STRIP_STATIC_LIB
 STRIP
-with_gnu_ld
 LDFLAGS_SL
 LDFLAGS_EX
 ZSTD_LIBS
@@ -870,7 +870,6 @@ with_system_tzdata
 with_zlib
 with_lz4
 with_zstd
-with_gnu_ld
 with_ssl
 with_openssl
 enable_largefile
@@ -1581,7 +1580,6 @@ Optional Packages:
   --without-zlib          do not use Zlib
   --with-lz4              build with LZ4 support
   --with-zstd             build with ZSTD support
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-ssl=LIB          use LIB for SSL/TLS support (openssl)
   --with-openssl          obsolete spelling of --with-ssl=openssl
 
@@ -9364,105 +9362,6 @@ LDFLAGS="$LDFLAGS $LIBDIRS"
 
 
 
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5
-$as_echo_n "checking for ld used by GCC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case "$ac_prog" in
-    # Accept absolute paths.
-    [\\/]* | [A-Za-z]:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the path of ld
-      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${ac_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      ac_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some GNU ld's only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
-	test "$with_gnu_ld" != no && break
-      else
-	test "$with_gnu_ld" != yes && break
-      fi
-    fi
-  done
-  IFS="$ac_save_ifs"
-else
-  ac_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$ac_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${ac_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
-  ac_cv_prog_gnu_ld=yes
-else
-  ac_cv_prog_gnu_ld=no
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_ld" >&5
-$as_echo "$ac_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$ac_cv_prog_gnu_ld
-
-
-
-
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
@@ -19096,6 +18995,43 @@ fi
 
 fi
 
+# Check if linker on solaris supports -Wl,-E (gnu linker does, solaris linker
+# doesn't).
+if test "$PORTNAME" = "solaris"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wl,-E" >&5
+$as_echo_n "checking whether $CC supports -Wl,-E... " >&6; }
+if ${pgac_cv_prog_cc_ld_export_dynamic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  pgac_save_LDFLAGS=$LDFLAGS
+LDFLAGS="$pgac_save_LDFLAGS -Wl,-E"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pgac_cv_prog_cc_ld_export_dynamic=yes
+else
+  pgac_cv_prog_cc_ld_export_dynamic=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LDFLAGS="$pgac_save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_cc_ld_export_dynamic" >&5
+$as_echo "$pgac_cv_prog_cc_ld_export_dynamic" >&6; }
+
+  SOLARIS_EXPORT_DYNAMIC=$pgac_cv_prog_cc_ld_export_dynamic
+
+fi
+
 # Create compiler version string
 if test x"$GCC" = x"yes" ; then
   cc_string=`${CC} --version | sed q`
diff --git a/configure.ac b/configure.ac
index 398eb422595..d87c9af77f8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1126,8 +1126,6 @@ LDFLAGS="$LDFLAGS $LIBDIRS"
 AC_ARG_VAR(LDFLAGS_EX, [extra linker flags for linking executables only])
 AC_ARG_VAR(LDFLAGS_SL, [extra linker flags for linking shared libraries only])
 
-PGAC_PROG_LD
-AC_SUBST(with_gnu_ld)
 PGAC_CHECK_STRIP
 AC_CHECK_TOOL(AR, ar, ar)
 if test "$PORTNAME" = "win32"; then
@@ -2366,6 +2364,14 @@ else
   PGAC_PROG_CC_LDFLAGS_OPT([-Wl,--as-needed], $link_test_func)
 fi
 
+# Check if linker on solaris supports -Wl,-E (gnu linker does, solaris linker
+# doesn't).
+if test "$PORTNAME" = "solaris"; then
+  PGAC_PROG_CC_LD_EXPORT_DYNAMIC()
+  SOLARIS_EXPORT_DYNAMIC=$pgac_cv_prog_cc_ld_export_dynamic
+  AC_SUBST(SOLARIS_EXPORT_DYNAMIC)
+fi
+
 # Create compiler version string
 if test x"$GCC" = x"yes" ; then
   cc_string=`${CC} --version | sed q`
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 8107643578b..31294005235 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -289,7 +289,7 @@ LDAP_LIBS_FE = @LDAP_LIBS_FE@
 LDAP_LIBS_BE = @LDAP_LIBS_BE@
 UUID_LIBS = @UUID_LIBS@
 LLVM_LIBS=@LLVM_LIBS@
-with_gnu_ld = @with_gnu_ld@
+SOLARIS_EXPORT_DYNAMIC=@SOLARIS_EXPORT_DYNAMIC@
 
 # It's critical that within LDFLAGS, all -L switches pointing to build-tree
 # directories come before any -L switches pointing to external directories.
-- 
2.37.3.542.gdd3f6c4cae

v17-0012-meson-Add-PGXS-compatibility.patchtext/x-diff; charset=us-asciiDownload
From 87a596a60a5300dbd7fd9feacb4b69f1aae3c693 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 20:27:17 -0700
Subject: [PATCH v17 12/23] meson: Add PGXS compatibility

This works for some extensions on some operating systems, but could use plenty
of cleanups.
---
 src/meson.build | 269 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 269 insertions(+)

diff --git a/src/meson.build b/src/meson.build
index b515af15bfa..ef022c59615 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,3 +10,272 @@ subdir('bin')
 subdir('pl')
 
 subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to use a single buildsystem
+# across all the supported postgres versions. Once all supported PG versions
+# support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+  'PACKAGE_URL': pg_url,
+  'PACKAGE_VERSION': pg_version,
+  'PG_MAJORVERSION': pg_version_major,
+  'PG_VERSION_NUM': pg_version_num,
+  'configure_input': 'meson',
+
+  'vpath_build': 'yes',
+  'autodepend': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+
+  'host_cpu': host_cpu,
+  'host': '@0@-@1@'.format(host_cpu, host_system),
+  'host_os': host_system,
+  'build_os': build_machine.system(),
+  'PORTNAME': portname,
+  'PG_SYSROOT': pg_sysroot,
+
+  'abs_top_builddir': meson.build_root(),
+  'abs_top_srcdir': meson.source_root(),
+
+  'enable_thread_safety': 'yes',
+  'enable_rpath': 'yes',
+  'enable_nls': libintl.found() ? 'yes' : 'no',
+  'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no',
+  'enable_debug': get_option('debug') ? 'yes' : 'no',
+  'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+  'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+  'DLSUFFIX': dlsuffix,
+  'EXEEXT': exesuffix,
+
+  'SUN_STUDIO_CC': 'no', # not supported so far
+
+  # want the chosen option, rather than the library
+  'with_ssl' : get_option('ssl'),
+  'with_uuid': uuidopt,
+
+  'default_port': get_option('pgport'),
+  'with_system_tzdata': get_option('system_tzdata'),
+
+  'with_krb_srvnam': get_option('krb_srvnam'),
+  'krb_srvtab': krb_srvtab,
+
+  # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+  'STRIP': 'strip',
+  'STRIP_STATIC_LIB': 'strip -x',
+  'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+  # Just always use the install_sh fallback that autoconf uses. Unlikely to
+  # matter performance-wise for extensions. If it turns out to do, we can
+  # improve that later.
+  'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+  'CC': var_cc,
+  'CPP': var_cpp,
+  'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld', 'ld.mold'] ? 'yes' : 'no'),
+
+  'CFLAGS': var_cflags,
+  'CPPFLAGS': var_cppflags,
+  'CXXFLAGS': var_cxxflags,
+  'CFLAGS_SL': var_cflags_sl,
+  'CFLAGS_SL_MODULE': ' '.join(cflags_mod),
+  'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod),
+  'CFLAGS_SSE42': ' '.join(cflags_crc),
+  'CFLAGS_ARMV8_CRC32C': ' '.join(cflags_crc),
+
+  'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+  'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+  'LDFLAGS': var_ldflags,
+  'LDFLAGS_EX': var_ldflags_ex,
+  'LDFLAGS_SL': var_ldflags_sl,
+
+  # FIXME:
+  'BITCODE_CFLAGS': '',
+  'BITCODE_CXXFLAGS': '',
+
+  'BISONFLAGS': ' '.join(bison_flags),
+  'FLEXFLAGS': ' '.join(flex_flags),
+
+  'LIBS': var_libs,
+}
+
+if llvm.found()
+  pgxs_kv += {
+    'CLANG': clang.path(),
+    'CXX': ' '.join(cpp.cmd_array()),
+    'LLVM_BINPATH': llvm_binpath,
+  }
+else
+  pgxs_kv += {
+    'CLANG': '',
+    'CXX': '',
+    'LLVM_BINPATH': '',
+  }
+endif
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+  'BISON': bison,
+  'FLEX': flex,
+  'GZIP': gzip,
+  'LZ4': program_lz4,
+  'PERL': perl,
+  'PROVE': prove,
+  'PYTHON': python,
+  'TAR': tar,
+  'ZSTD': program_zstd,
+  'DTRACE': dtrace,
+  'LD': ld_program,
+  'install_bin': install_sh,
+}
+
+pgxs_empty = [
+  'PERMIT_DECLARATION_AFTER_STATEMENT',
+  'ICU_CFLAGS', # needs to be added, included by public server headers
+
+  # probably need most of these?
+  'RANLIB',
+  'LN_S',
+  'AR',
+  'AWK',
+
+  # hard to see why we'd need either?
+  'ZIC',
+  'TCLSH',
+
+  # docs don't seem to be supported by pgxs
+  'XMLLINT',
+  'XSLTPROC',
+  'DBTOEPUB',
+  'FOP',
+
+  # supporting coverage for pgxs-in-meson build doesn't seem worth it
+  'GENHTML',
+  'LCOV',
+  'GCOV',
+  'MSGFMT_FLAGS',
+
+  # translation doesn't appear to be supported by pgxs
+  'MSGFMT',
+  'XGETTEXT',
+  'MSGMERGE',
+  'WANTED_LANGUAGES',
+
+  # Not needed because we don't build the server / PLs with the generated makefile
+  'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+  'DTRACEFLAGS', # only server has dtrace probes
+
+  'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+  'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+  # possible that some of these are referenced explicitly in pgxs makefiles?
+  # For now not worth it.
+  'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD',
+
+  'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+  'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+  'UUID_LIBS',
+
+  'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+  'ICU_LIBS',
+]
+
+if host_system == 'windows' and cc.get_argument_syntax() != 'msvc'
+  pgxs_bins += {'WINDRES': windres}
+else
+  pgxs_empty += 'WINDRES'
+endif
+
+pgxs_dirs = {
+  'prefix': get_option('prefix'),
+
+  'bindir': '${exec_prefix}' / get_option('bindir'),
+  'datarootdir': '${prefix}' / get_option('datadir'),
+  'datadir': '${datarootdir}',
+  'docdir': '${prefix}' / dir_doc,
+  'exec_prefix': '${prefix}',
+  'htmldir': '${prefix}' / dir_doc_html, #?
+  'includedir': '${prefix}' / get_option('includedir'),
+  'libdir': '${exec_prefix}' / get_option('libdir'),
+  'localedir': '${prefix}' / get_option('localedir'),
+  'mandir': '${prefix}' / get_option('mandir'),
+  'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+pgxs_deps = {
+  'bonjour': bonjour,
+  'bsd_auth': bsd_auth,
+  'gssapi': gssapi,
+  'icu': icu,
+  'ldap': ldap,
+  'libxml': libxml,
+  'libxslt': libxslt,
+  'llvm': llvm,
+  'lz4': lz4,
+  'nls': libintl,
+  'pam': pam,
+  'perl': perl_dep,
+  'python': python3_dep,
+  'readline': readline,
+  'selinux': selinux,
+  'systemd': systemd,
+  'tcl': tcl_dep,
+  'zlib': zlib,
+  'zstd': zstd,
+}
+
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+foreach b, p : pgxs_bins
+  pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+foreach pe : pgxs_empty
+  pgxs_cdata.set(pe, '')
+endforeach
+
+foreach d, p : pgxs_dirs
+  pgxs_cdata.set(d, p)
+endforeach
+
+foreach d, v : pgxs_deps
+  pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+
+makefile_global = configure_file(
+  input: 'Makefile.global.in',
+  output: 'Makefile.global',
+  configuration: pgxs_cdata,
+  install: true,
+  install_dir: dir_pgxs / 'src',
+)
+configure_files += makefile_global
+
+makefile_port = configure_file(
+  input: 'makefiles' / 'Makefile.@0@'.format(portname),
+  output: 'Makefile.port',
+  copy: true,
+  install_dir: dir_pgxs / 'src')
+configure_files += makefile_port
+
+install_data(
+  'Makefile.shlib', 'nls-global.mk',
+  install_dir: dir_pgxs / 'src')
+
+install_data(
+  'makefiles/pgxs.mk',
+  install_dir: dir_pgxs / 'src' / 'makefiles')
-- 
2.37.3.542.gdd3f6c4cae

v17-0013-fixup-meson-Add-PGXS-compatibility.patchtext/x-diff; charset=us-asciiDownload
From 66bef54a05110ba0820dd1f81f558dd464c36503 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 15:48:19 -0700
Subject: [PATCH v17 13/23] fixup! meson: Add PGXS compatibility

---
 meson.build     |  5 +++++
 src/meson.build | 13 +++----------
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/meson.build b/meson.build
index 774a8c2e05f..6f580222e90 100644
--- a/meson.build
+++ b/meson.build
@@ -1770,6 +1770,11 @@ if cc.get_id() == 'msvc'
   ldflags_mod += '/NOIMPLIB'
 endif
 
+if host_system == 'sunos'
+  solaris_export_dynamic = cc.has_link_argument('-Wl,-E')
+else
+  solaris_export_dynamic = false
+endif
 
 
 ###############################################################
diff --git a/src/meson.build b/src/meson.build
index ef022c59615..8aa91940cec 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -76,7 +76,8 @@ pgxs_kv = {
   'CC': var_cc,
   'CPP': var_cpp,
   'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
-  'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld', 'ld.mold'] ? 'yes' : 'no'),
+
+  'SOLARIS_EXPORT_DYNAMIC': solaris_export_dynamic ? 'yes' : 'no',
 
   'CFLAGS': var_cflags,
   'CPPFLAGS': var_cppflags,
@@ -84,8 +85,7 @@ pgxs_kv = {
   'CFLAGS_SL': var_cflags_sl,
   'CFLAGS_SL_MODULE': ' '.join(cflags_mod),
   'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod),
-  'CFLAGS_SSE42': ' '.join(cflags_crc),
-  'CFLAGS_ARMV8_CRC32C': ' '.join(cflags_crc),
+  'CFLAGS_CRC': ' '.join(cflags_crc),
 
   'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
   'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
@@ -118,11 +118,6 @@ else
   }
 endif
 
-# FIXME: figure out which platforms we still need the linker "directly" -
-# can't be many?
-
-ld_program = find_program(cc.get_linker_id(), native: true, required: false)
-
 pgxs_bins = {
   'BISON': bison,
   'FLEX': flex,
@@ -134,7 +129,6 @@ pgxs_bins = {
   'TAR': tar,
   'ZSTD': program_zstd,
   'DTRACE': dtrace,
-  'LD': ld_program,
   'install_bin': install_sh,
 }
 
@@ -143,7 +137,6 @@ pgxs_empty = [
   'ICU_CFLAGS', # needs to be added, included by public server headers
 
   # probably need most of these?
-  'RANLIB',
   'LN_S',
   'AR',
   'AWK',
-- 
2.37.3.542.gdd3f6c4cae

v17-0014-meson-Add-xmllint-xsltproc-wrapper-script-to-han.patchtext/x-diff; charset=us-asciiDownload
From 7a61d5dc4796cf7472e6b59d90bab6f48514aa7c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 08:49:45 -0700
Subject: [PATCH v17 14/23] meson: Add xmllint/xsltproc wrapper script to
 handle dependencies automatically

---
 doc/src/sgml/meson.build          | 38 ++++++++++++++------
 doc/src/sgml/xmltools_dep_wrapper | 60 +++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 10 deletions(-)
 create mode 100644 doc/src/sgml/xmltools_dep_wrapper

diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
index ba2a261e7a4..e6781d0deae 100644
--- a/doc/src/sgml/meson.build
+++ b/doc/src/sgml/meson.build
@@ -2,7 +2,7 @@ docs = []
 alldocs = []
 doc_generated = []
 
-xmllint = find_program(get_option('XMLLINT'), native: true, required: false)
+xmllint_bin = find_program(get_option('XMLLINT'), native: true, required: false)
 
 
 version_sgml = configure_file(
@@ -60,14 +60,23 @@ doc_generated += custom_target('keywords-table.sgml',
 )
 
 # For everything else we need at least xmllint
-if not xmllint.found()
+if not xmllint_bin.found()
   subdir_done()
 endif
 
 pandoc = find_program('pandoc', native: true, required: false)
-xsltproc = find_program(get_option('XSLTPROC'), native: true, required: false)
+xsltproc_bin = find_program(get_option('XSLTPROC'), native: true, required: false)
 fop = find_program('fop', native: true, required: false)
 
+xmltools_wrapper = [
+  python, files('xmltools_dep_wrapper'),
+  '--targetname', '@OUTPUT@', '--depfile', '@DEPFILE@'
+]
+
+xmllint = xmltools_wrapper + [
+  '--tool', xmllint_bin, '--',
+]
+
 # Run validation only once, common to all subsequent targets.  While
 # we're at it, also resolve all entities (that is, copy all included
 # files into one big file).  This helps tools that don't understand
@@ -75,6 +84,7 @@ fop = find_program('fop', native: true, required: false)
 postgres_full_xml = custom_target('postgres-full.xml',
   input: 'postgres.sgml',
   output: 'postgres-full.xml',
+  depfile: 'postgres-full.xml.d',
   command: [xmllint, '--noent', '--valid', '--path', '@OUTDIR@', '-o', '@OUTPUT@', '@INPUT@'],
   depends: doc_generated,
   build_by_default: false,
@@ -86,18 +96,20 @@ alldocs += postgres_full_xml
 #
 # Full documentation as html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   xsltproc_flags = [
     '--stringparam', 'pg.version', pg_version,
     '--param', 'website.stylesheet', '1'
   ]
 
+  xsltproc = xmltools_wrapper + [
+    '--tool', xsltproc_bin, '--',
+  ]
 
-  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
-  # depfile
   html = custom_target('html',
     input: ['stylesheet.xsl', postgres_full_xml],
     output: 'html',
+    depfile: 'html.d',
     depends: doc_generated,
     command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -110,6 +122,7 @@ if xsltproc.found()
   html_help = custom_target('html_help',
     input: ['stylesheet-hh.xsl', postgres_full_xml],
     output: 'htmlhelp',
+    depfile: 'htmlhelp.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -121,6 +134,7 @@ if xsltproc.found()
   postgres_html = custom_target('postgres.html',
     input: ['stylesheet-html-nochunk.xsl', postgres_full_xml],
     output: 'postgres.html',
+    depfile: 'postgres.html.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -144,10 +158,11 @@ endif
 #
 # INSTALL in html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   install_xml = custom_target('INSTALL.xml',
     input: ['standalone-profile.xsl', 'standalone-install.xml'],
     output: 'INSTALL.xml',
+    depfile: 'INSTALL.xml.d',
     depends: doc_generated + [postgres_full_xml],
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
     build_by_default: false,
@@ -155,6 +170,7 @@ if xsltproc.found()
   install_html = custom_target('INSTALL.html',
     input: ['stylesheet-text.xsl', install_xml],
     output: 'INSTALL.html',
+    depfile: 'INSTALL.html.d',
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
@@ -177,11 +193,12 @@ endif
 #
 # Man pages
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   # FIXME: implement / consider sqlmansectnum logic
   man = custom_target('man',
     input: ['stylesheet-man.xsl', postgres_full_xml],
     output: ['man1', 'man3', 'man7'],
+    depfile: 'man.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -195,7 +212,7 @@ endif
 #
 # Full documentation as PDF
 #
-if fop.found() and xsltproc.found()
+if fop.found() and xsltproc_bin.found()
   xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
 
   foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
@@ -206,6 +223,7 @@ if fop.found() and xsltproc.found()
       input: ['stylesheet-fo.xsl', postgres_full_xml],
       output: [postgres_x_fo_f],
       depends: doc_generated,
+      depfile: postgres_x_fo_f + '.d',
       command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
                 '--stringparam', 'paper.type', detail,
                 '-o', '@OUTPUT@', '@INPUT@'],
@@ -230,7 +248,7 @@ endif
 # This was previously implemented using dbtoepub - but that doesn't seem to
 # support running in build != source directory (i.e. VPATH builds already
 # weren't supported).
-if pandoc.found() and xsltproc.found()
+if pandoc.found() and xsltproc_bin.found()
   postgres_epub = custom_target('postgres.epub',
     input: postgres_full_xml,
     output: 'postgres.epub',
diff --git a/doc/src/sgml/xmltools_dep_wrapper b/doc/src/sgml/xmltools_dep_wrapper
new file mode 100644
index 00000000000..52b94e3fcaf
--- /dev/null
+++ b/doc/src/sgml/xmltools_dep_wrapper
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+import argparse
+import re
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(
+    description='generate dependency file for docs')
+
+parser.add_argument('--targetname', type=str, required=False, nargs='+')
+parser.add_argument('--depfile', type=str, required=False)
+parser.add_argument('--tool', type=str, required=True)
+
+parser.add_argument('flags', nargs='*')
+
+args = parser.parse_args()
+
+if args.depfile:
+    depfile_result_list = []
+
+    command = [args.tool, '--load-trace'] + args.flags
+    # --load-trace flag displays all the documents
+    # loaded during the processing to stderr
+    res = subprocess.run(command, stderr=subprocess.PIPE,
+                         universal_newlines=True)
+    # if exit code is different than 0, exit
+    if res.returncode:
+        exit(res.returncode)
+
+    # get line start from targetname
+    line_start = ''
+    for name in args.targetname:
+        line_start = line_start + name + ' '
+    line_start = line_start.strip() + ': '
+
+    # collect only file paths
+    line_re = re.compile('^Loaded URL="([^"]+)"')
+    with open(args.depfile, 'w') as f:
+        for line in res.stderr.split('\n'):
+            if line == '':
+                continue
+            m = re.match(line_re, line)
+
+            # continue to show errors
+            if m is None:
+                print(line, file=sys.stderr)
+                continue
+
+            fname = m.group(1)
+            if fname.startswith('http:'):
+                continue
+            if fname.startswith('file://'):
+                fname = fname.split('file://')[1]
+            f.write(line_start + fname + '\n')
+
+else:
+    command = [args.tool] + args.flags
+    res = subprocess.run(command)
+    exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v17-0015-windows-Set-UMDF_USING_NTSTATUS-globally-include.patchtext/x-diff; charset=us-asciiDownload
From e405598656f0b96302db1073642671557d4be64d Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 11:06:20 -0700
Subject: [PATCH v17 15/23] windows: Set UMDF_USING_NTSTATUS globally, include
 ntstatus.h

We'd like to use precompiled headers on windows to reduce compile times. Right
now we rely on defining WIN32_NO_STATUS before including postgres.h in a few
select places - which doesn't work with precompiled headers.  Instead define
it globally.

When UMDF_USING_NTSTATUS is defined we need to explicitly include ntstatus.h,
winternl.h to get a comparable set of symbols. Right now these includes would
be required in a number of non-platform-specific .c files - to avoid that,
include them in win32_port.h. Based on my measurements that doesn't increase
compile times measurably.
---
 src/include/port/win32_port.h | 9 +++++++++
 src/include/port/win32ntdll.h | 6 ------
 src/port/open.c               | 2 --
 src/port/win32fdatasync.c     | 2 --
 src/port/win32ntdll.c         | 2 --
 src/port/win32stat.c          | 2 --
 6 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h
index 707f8760cab..67382245504 100644
--- a/src/include/port/win32_port.h
+++ b/src/include/port/win32_port.h
@@ -48,12 +48,21 @@
  * significantly.  WIN32_LEAN_AND_MEAN reduces that a bit. It'd be better to
  * remove the include of windows.h (as well as indirect inclusions of it) from
  * such a central place, but until then...
+ *
+ * To be able to include ntstatus.h tell windows.h to not declare NTSTATUS by
+ * temporarily defining UMDF_USING_NTSTATUS, otherwise we'll get warning about
+ * macro redefinitions, as windows.h also defines NTSTATUS (yuck). That in
+ * turn requires including ntstatus.h, winternl.h to get common symbols.
  */
 #define WIN32_LEAN_AND_MEAN
+#define UMDF_USING_NTSTATUS
 
 #include <winsock2.h>
 #include <ws2tcpip.h>
 #include <windows.h>
+#include <ntstatus.h>
+#include <winternl.h>
+
 #undef small
 #include <process.h>
 #include <signal.h>
diff --git a/src/include/port/win32ntdll.h b/src/include/port/win32ntdll.h
index 34cebddd542..6d13a18b395 100644
--- a/src/include/port/win32ntdll.h
+++ b/src/include/port/win32ntdll.h
@@ -14,12 +14,6 @@
 #ifndef WIN32NTDLL_H
 #define WIN32NTDLL_H
 
-/*
- * Because this includes NT headers that normally conflict with Win32 headers,
- * any translation unit that includes it should #define UMDF_USING_NTSTATUS
- * before including <windows.h>.
- */
-
 #include <ntstatus.h>
 #include <winternl.h>
 
diff --git a/src/port/open.c b/src/port/open.c
index 8c09c7c1f77..fd4faf604ea 100644
--- a/src/port/open.c
+++ b/src/port/open.c
@@ -13,8 +13,6 @@
 
 #ifdef WIN32
 
-#define UMDF_USING_NTSTATUS
-
 #ifndef FRONTEND
 #include "postgres.h"
 #else
diff --git a/src/port/win32fdatasync.c b/src/port/win32fdatasync.c
index 31d631c6962..a5431615ab2 100644
--- a/src/port/win32fdatasync.c
+++ b/src/port/win32fdatasync.c
@@ -11,8 +11,6 @@
  *-------------------------------------------------------------------------
  */
 
-#define UMDF_USING_NTSTATUS
-
 #ifdef FRONTEND
 #include "postgres_fe.h"
 #else
diff --git a/src/port/win32ntdll.c b/src/port/win32ntdll.c
index eb614077543..db3e5fa251f 100644
--- a/src/port/win32ntdll.c
+++ b/src/port/win32ntdll.c
@@ -13,8 +13,6 @@
  *-------------------------------------------------------------------------
  */
 
-#define UMDF_USING_NTSTATUS
-
 #include "c.h"
 
 #include "port/win32ntdll.h"
diff --git a/src/port/win32stat.c b/src/port/win32stat.c
index 26443293d78..5f3d0d22ff4 100644
--- a/src/port/win32stat.c
+++ b/src/port/win32stat.c
@@ -15,8 +15,6 @@
 
 #ifdef WIN32
 
-#define UMDF_USING_NTSTATUS
-
 #include "c.h"
 #include "port/win32ntdll.h"
 
-- 
2.37.3.542.gdd3f6c4cae

v17-0016-windows-adjust-FD_SETSIZE-via-commandline-define.patchtext/x-diff; charset=us-asciiDownload
From 6025cb80d65fd7a8414241931df9f003a292052f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 12:07:29 -0700
Subject: [PATCH v17 16/23] windows: adjust FD_SETSIZE via commandline define

This is a prerequisite to using precompiled headers.
---
 src/fe_utils/Makefile        |  4 ++++
 src/fe_utils/meson.build     |  1 +
 src/fe_utils/parallel_slot.c |  4 ++--
 src/bin/pgbench/Makefile     |  2 ++
 src/bin/pgbench/meson.build  |  2 ++
 src/bin/pgbench/pgbench.c    |  4 ++--
 src/tools/msvc/Mkvcbuild.pm  | 17 +++++++++++++++--
 7 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/fe_utils/Makefile b/src/fe_utils/Makefile
index 44bc7a1215d..40d4b1d8698 100644
--- a/src/fe_utils/Makefile
+++ b/src/fe_utils/Makefile
@@ -34,6 +34,10 @@ OBJS = \
 	simple_list.o \
 	string_utils.o
 
+ifeq ($(PORTNAME), win32)
+override CFLAGS += -DFD_SETSIZE=1024
+endif
+
 all: libpgfeutils.a
 
 libpgfeutils.a: $(OBJS)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index b6bf8e1ca21..3e226c260ac 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -24,6 +24,7 @@ fe_utils_sources += psqlscan
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
   include_directories: [postgres_inc, libpq_inc],
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   dependencies: frontend_common_code,
   kwargs: default_lib_args,
 )
diff --git a/src/fe_utils/parallel_slot.c b/src/fe_utils/parallel_slot.c
index 2be2903c9c6..767256757f2 100644
--- a/src/fe_utils/parallel_slot.c
+++ b/src/fe_utils/parallel_slot.c
@@ -12,8 +12,8 @@
  *-------------------------------------------------------------------------
  */
 
-#ifdef WIN32
-#define FD_SETSIZE 1024			/* must set before winsock2.h is included */
+#if defined(WIN32) && FD_SETSIZE < 1024
+#error FD_SETSIZE needs to have been increased
 #endif
 
 #include "postgres_fe.h"
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
index 6647c9fe97d..68e9f03e79f 100644
--- a/src/bin/pgbench/Makefile
+++ b/src/bin/pgbench/Makefile
@@ -18,6 +18,8 @@ LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
 
 ifneq ($(PORTNAME), win32)
 override CFLAGS += $(PTHREAD_CFLAGS)
+else
+override CFLAGS += -DFD_SETSIZE=1024
 endif
 LIBS += $(PTHREAD_LIBS)
 
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index a32eb51fe07..1a3ec5d1295 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -27,6 +27,8 @@ pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
   include_directories: include_directories('.'),
+  c_pch: pch_postgres_fe_h,
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   kwargs: default_bin_args,
 )
 bin_targets += pgbench
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index aa1a3541fe6..7da7c36fbe6 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -27,8 +27,8 @@
  *
  */
 
-#ifdef WIN32
-#define FD_SETSIZE 1024			/* must set before winsock2.h is included */
+#if defined(WIN32) && FD_SETSIZE < 1024
+#error FD_SETSIZE needs to have been increased
 #endif
 
 #include "postgres_fe.h"
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index ddb4f25eb12..4d1e4f4e4d4 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -35,6 +35,7 @@ my $libpq;
 my @unlink_on_exit;
 
 # Set of variables for modules in contrib/ and src/test/modules/
+my $contrib_defines        = {};
 my @contrib_uselibpq       = ();
 my @contrib_uselibpgport   = ();
 my @contrib_uselibpgcommon = ();
@@ -52,6 +53,7 @@ my @contrib_excludes       = (
 	'unsafe_tests');
 
 # Set of variables for frontend modules
+my $frontend_defines = { 'pgbench' => 'FD_SETSIZE=1024' };
 my @frontend_uselibpq =
   ('pg_amcheck', 'pg_ctl', 'pg_upgrade', 'pgbench', 'psql', 'initdb');
 my @frontend_uselibpgport = (
@@ -175,6 +177,7 @@ sub mkvcbuild
 
 	$libpgfeutils = $solution->AddProject('libpgfeutils', 'lib', 'misc');
 	$libpgfeutils->AddDefine('FRONTEND');
+	$libpgfeutils->AddDefine('FD_SETSIZE=1024');
 	$libpgfeutils->AddIncludeDir('src/interfaces/libpq');
 	$libpgfeutils->AddFiles('src/fe_utils', @pgfeutilsfiles);
 
@@ -1120,7 +1123,8 @@ sub AdjustContribProj
 {
 	my $proj = shift;
 	AdjustModule(
-		$proj,                  \@contrib_uselibpq,
+		$proj,                  $contrib_defines,
+		\@contrib_uselibpq,
 		\@contrib_uselibpgport, \@contrib_uselibpgcommon,
 		$contrib_extralibs,     $contrib_extrasource,
 		$contrib_extraincludes);
@@ -1131,7 +1135,8 @@ sub AdjustFrontendProj
 {
 	my $proj = shift;
 	AdjustModule(
-		$proj,                   \@frontend_uselibpq,
+		$proj,                   $frontend_defines,
+		\@frontend_uselibpq,
 		\@frontend_uselibpgport, \@frontend_uselibpgcommon,
 		$frontend_extralibs,     $frontend_extrasource,
 		$frontend_extraincludes);
@@ -1141,6 +1146,7 @@ sub AdjustFrontendProj
 sub AdjustModule
 {
 	my $proj                  = shift;
+	my $module_defines        = shift;
 	my $module_uselibpq       = shift;
 	my $module_uselibpgport   = shift;
 	my $module_uselibpgcommon = shift;
@@ -1149,6 +1155,13 @@ sub AdjustModule
 	my $module_extraincludes  = shift;
 	my $n                     = $proj->{name};
 
+    if ($module_defines->{$n})
+    {
+        foreach my $d ($module_defines->{$n})
+        {
+            $proj->AddDefine($d);
+        }
+    }
 	if (grep { /^$n$/ } @{$module_uselibpq})
 	{
 		$proj->AddIncludeDir('src\interfaces\libpq');
-- 
2.37.3.542.gdd3f6c4cae

v17-0017-meson-Add-support-for-building-with-precompiled-.patchtext/x-diff; charset=us-asciiDownload
From 82b37bddab83cafa4002c09415b946572ee216bf Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 23 Sep 2022 12:19:17 -0700
Subject: [PATCH v17 17/23] meson: Add support for building with precompiled
 headers

This substantially speeds up building for windows. A cross build from linux
targetting mingw goes from

real	0m30.772s
user	16m5.322s
sys	2m9.559s

to

real	0m13.747s
user	6m48.021s
sys	1m25.632s

The wins on windows are similar-ish (but I don't have a system at hand just
now for actual numbers). Targetting other operating systems the wins are far
smaller (tested linux, macOS, FreeBSD).

For now precompiled headers are disabled by default, it's not clear how well
they work on all platforms. E.g. on FreeBSD gcc doesn't seem to have working
support, but clang does.
---
 src/include/meson.build                    | 1 +
 src/include/pch/c_pch.h                    | 1 +
 src/include/pch/meson.build                | 4 ++++
 src/include/pch/postgres_fe_pch.h          | 1 +
 src/include/pch/postgres_pch.h             | 1 +
 src/common/meson.build                     | 2 ++
 src/port/meson.build                       | 2 ++
 src/backend/meson.build                    | 5 +++++
 src/backend/snowball/meson.build           | 1 +
 src/fe_utils/meson.build                   | 1 +
 src/bin/pg_dump/meson.build                | 1 +
 src/bin/pg_upgrade/meson.build             | 1 +
 src/bin/psql/meson.build                   | 1 +
 src/interfaces/libpq/meson.build           | 1 +
 src/pl/plperl/meson.build                  | 1 +
 src/pl/plpgsql/src/meson.build             | 1 +
 src/pl/plpython/meson.build                | 1 +
 src/pl/tcl/meson.build                     | 1 +
 contrib/bloom/meson.build                  | 1 +
 contrib/btree_gist/meson.build             | 1 +
 contrib/hstore/meson.build                 | 1 +
 contrib/pg_trgm/meson.build                | 1 +
 contrib/pgcrypto/meson.build               | 1 +
 contrib/pgstattuple/meson.build            | 1 +
 contrib/sepgsql/meson.build                | 1 +
 contrib/xml2/meson.build                   | 1 +
 src/interfaces/ecpg/ecpglib/meson.build    | 1 +
 src/interfaces/ecpg/pgtypeslib/meson.build | 1 +
 src/interfaces/ecpg/preproc/meson.build    | 1 +
 .cirrus.yml                                | 4 ++--
 meson.build                                | 1 +
 31 files changed, 41 insertions(+), 2 deletions(-)
 create mode 100644 src/include/pch/c_pch.h
 create mode 100644 src/include/pch/meson.build
 create mode 100644 src/include/pch/postgres_fe_pch.h
 create mode 100644 src/include/pch/postgres_pch.h

diff --git a/src/include/meson.build b/src/include/meson.build
index f2f7d03ff27..35c06c4856a 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -114,6 +114,7 @@ install_headers(
 
 subdir('catalog')
 subdir('nodes')
+subdir('pch')
 subdir('storage')
 subdir('utils')
 
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..2bcec49c3a2
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,4 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
+pch_postgres_fe_h = meson.source_root() / meson.current_source_dir() / 'postgres_fe_pch.h'
diff --git a/src/include/pch/postgres_fe_pch.h b/src/include/pch/postgres_fe_pch.h
new file mode 100644
index 00000000000..f3ea20912d3
--- /dev/null
+++ b/src/include/pch/postgres_fe_pch.h
@@ -0,0 +1 @@
+#include "postgres_fe.h"
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/common/meson.build b/src/common/meson.build
index 23842e1ffef..1c9b8a3a018 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -147,6 +147,7 @@ foreach name, opts : pgcommon_variants
     endif
     c_args = opts.get('c_args', []) + common_cflags[cflagname]
     cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'sources': sources,
@@ -159,6 +160,7 @@ foreach name, opts : pgcommon_variants
 
   lib = static_library('libpgcommon@0@'.format(name),
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       include_directories: include_directories('.'),
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
diff --git a/src/port/meson.build b/src/port/meson.build
index ced2e014db8..c2222696f1b 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -161,6 +161,7 @@ foreach name, opts : pgport_variants
     c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
     cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
       sources,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'c_args': c_args,
         'build_by_default': false,
@@ -172,6 +173,7 @@ foreach name, opts : pgport_variants
   lib = static_library('libpgport@0@'.format(name),
       pgport_sources,
       link_with: cflag_libs,
+      c_pch: pch_c_h,
       kwargs: opts + {
         'dependencies': opts['dependencies'] + [ssl],
       }
diff --git a/src/backend/meson.build b/src/backend/meson.build
index fefa40ddb64..676cb714d79 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -62,6 +62,7 @@ postgres_lib = static_library('postgres_lib',
   backend_sources + timezone_sources + generated_backend_sources,
   link_whole: backend_link_with,
   dependencies: backend_build_deps,
+  c_pch: pch_postgres_h,
   kwargs: internal_lib_args,
 )
 
@@ -81,6 +82,10 @@ if cc.get_id() == 'msvc'
 
   backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
   backend_link_depends += postgres_def
+  # Due to the way msvc and meson's precompiled headers implementation
+  # interact, we need to have symbols from the full library available. Could
+  # be restricted to b_pch=true.
+  backend_link_with += postgres_lib
 
 elif host_system == 'aix'
   # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 974401d187e..72959fa29d6 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -66,6 +66,7 @@ endif
 
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
+  c_pch: pch_postgres_h,
   kwargs: pg_mod_args + {
     'include_directories': [stemmer_inc],
   }
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index 3e226c260ac..fe0b801387c 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -23,6 +23,7 @@ fe_utils_sources += psqlscan
 
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
+  c_pch: pch_postgres_fe_h,
   include_directories: [postgres_inc, libpq_inc],
   c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   dependencies: frontend_common_code,
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 3527a25c288..e66f632b54e 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -13,6 +13,7 @@ pg_dump_common_sources = files(
 
 pg_dump_common = static_library('libpgdump_common',
   pg_dump_common_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq, zlib],
   kwargs: internal_lib_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index a7b927a45c7..212bc9ce6ef 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -24,6 +24,7 @@ endif
 
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 1264fc19fbd..a4c46bf5385 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -44,6 +44,7 @@ endif
 
 psql = executable('psql',
   psql_sources,
+  c_pch: pch_postgres_fe_h,
   include_directories: include_directories('.'),
   dependencies: [frontend_code, libpq, readline],
   kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 63ab2fbacc2..c7a767b1454 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -49,6 +49,7 @@ libpq_st = static_library('libpq',
   pic: true,
   include_directories: [libpq_inc, postgres_inc],
   c_args: ['-DSO_MAJOR_VERSION=5'],
+  c_pch: pch_postgres_fe_h,
   dependencies: libpq_deps,
   kwargs: default_lib_args,
 )
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 535660085dd..cd3894e6a73 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -45,6 +45,7 @@ endif
 
 plperl = shared_module('plperl',
   plperl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plperl_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [perl_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index c46c0a1da2a..27b2f5ef529 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -48,6 +48,7 @@ endif
 
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
+  c_pch: pch_postgres_h,
   include_directories: include_directories('.'),
   kwargs: pg_mod_args,
 )
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 40888386b5f..7bd683580e8 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -36,6 +36,7 @@ endif
 
 plpython = shared_module('plpython3',
   plpython_sources,
+  c_pch: pch_postgres_h,
   include_directories: [plpython_inc, postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [python3_dep, pg_mod_args['dependencies']],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index f09bb14c950..7a708776c99 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -22,6 +22,7 @@ endif
 
 pltcl = shared_module('pltcl',
   pltcl_sources,
+  c_pch: pch_postgres_h,
   include_directories: [include_directories('.'), postgres_inc],
   kwargs: pg_mod_args + {
     'dependencies': [tcl_dep, pg_mod_args['dependencies']],
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 16f3b83e4d2..163a93c98fb 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -15,6 +15,7 @@ endif
 
 bloom = shared_module('bloom',
   bloom_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += bloom
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index e98c91dacc8..bfb7865d213 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -33,6 +33,7 @@ endif
 
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gist
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 2bb26bb772b..a2a4ec36cb0 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -18,6 +18,7 @@ endif
 
 hstore = shared_module('hstore',
   hstore_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index c8c7c07b308..839d6c4a7f6 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -13,6 +13,7 @@ endif
 
 pg_trgm = shared_module('pg_trgm',
   pg_trgm_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index 7fc7bbc7ca1..cc782578b49 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -78,6 +78,7 @@ endif
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
   },
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 05e4cd46a5c..42d0b0e6ce9 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -12,6 +12,7 @@ endif
 
 pgstattuple = shared_module('pgstattuple',
   pgstattuple_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 8bef239e3c2..1ac0fa388ab 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -22,6 +22,7 @@ endif
 
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [selinux, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 89b0d677516..92ab3368428 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -15,6 +15,7 @@ endif
 
 xml2 = shared_module('pgxml',
   xml2_sources,
+  c_pch: pch_postgres_h,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index fd40ee86610..4985432d569 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -29,6 +29,7 @@ ecpglib_st = static_library('libecpg',
   include_directories: ecpglib_inc,
   c_args: ecpglib_c_args,
   pic: true,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code, libpq, thread_dep],
   link_with: [ecpg_pgtypes_so],
   kwargs: default_lib_args,
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 53cdad36422..0a5377a576a 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -25,6 +25,7 @@ ecpg_pgtypes_st = static_library('libpgtypes',
   include_directories: ecpg_pgtypes_inc,
   c_args: ecpg_pgtypes_c_args,
   pic: true,
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code],
   kwargs: default_lib_args,
 )
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 74876f039c9..3d42ee439ff 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -102,6 +102,7 @@ endif
 ecpg_exe = executable('ecpg',
   ecpg_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
+  c_pch: pch_postgres_fe_h,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/.cirrus.yml b/.cirrus.yml
index efb2d2c4832..aea25fd7525 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -602,7 +602,7 @@ task:
   # Use /DEBUG:FASTLINK to avoid high memory usage during linking
   configure_script: |
     vcvarsall x64
-    meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+    meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Db_pch=true -Dssl=openssl -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
 
   build_script: |
     vcvarsall x64
@@ -630,7 +630,7 @@ task:
 
   configure_script: |
     vcvarsall x64
-    meson setup --buildtype debug --backend vs -Dcassert=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
+    meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build
 
   build_script: |
     vcvarsall x64
diff --git a/meson.build b/meson.build
index 6f580222e90..5f09d2e079a 100644
--- a/meson.build
+++ b/meson.build
@@ -15,6 +15,7 @@ project('postgresql',
   meson_version: '>=0.54',
   default_options: [
     'warning_level=1', #-Wall equivalent
+    'b_pch=false',
     'buildtype=release',
   ]
 )
-- 
2.37.3.542.gdd3f6c4cae

v17-0018-tests-Rename-conflicting-role-names.patchtext/x-diff; charset=us-asciiDownload
From 698099f454ce05a0f25836a3fa4f45b68b546760 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 16:49:51 -0700
Subject: [PATCH v17 18/23] tests: Rename conflicting role names

These cause problems when running installcheck concurrently.
---
 src/pl/plperl/expected/plperl_setup.out       | 30 +++++++++----------
 src/pl/plperl/sql/plperl_setup.sql            | 30 +++++++++----------
 contrib/adminpack/expected/adminpack.out      | 20 ++++++-------
 contrib/adminpack/sql/adminpack.sql           | 20 ++++++-------
 .../passwordcheck/expected/passwordcheck.out  | 16 +++++-----
 contrib/passwordcheck/sql/passwordcheck.sql   | 16 +++++-----
 6 files changed, 66 insertions(+), 66 deletions(-)

diff --git a/src/pl/plperl/expected/plperl_setup.out b/src/pl/plperl/expected/plperl_setup.out
index 5234febefd6..5537a95ccc2 100644
--- a/src/pl/plperl/expected/plperl_setup.out
+++ b/src/pl/plperl/expected/plperl_setup.out
@@ -4,9 +4,9 @@
 -- Before going ahead with the to-be-tested installations, verify that
 -- a non-superuser is allowed to install plperl (but not plperlu) when
 -- suitable permissions have been granted.
-CREATE USER regress_user1;
-CREATE USER regress_user2;
-SET ROLE regress_user1;
+CREATE USER regress_plperl_user1;
+CREATE USER regress_plperl_user2;
+SET ROLE regress_plperl_user1;
 CREATE EXTENSION plperl;  -- fail
 ERROR:  permission denied to create extension "plperl"
 HINT:  Must have CREATE privilege on current database to create this extension.
@@ -16,18 +16,18 @@ HINT:  Must be superuser to create this extension.
 RESET ROLE;
 DO $$
 begin
-  execute format('grant create on database %I to regress_user1',
+  execute format('grant create on database %I to regress_plperl_user1',
                  current_database());
 end;
 $$;
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 CREATE EXTENSION plperl;
 CREATE EXTENSION plperlu;  -- fail
 ERROR:  permission denied to create extension "plperlu"
 HINT:  Must be superuser to create this extension.
 CREATE SCHEMA plperl_setup_scratch;
 SET search_path = plperl_setup_scratch;
-GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_user2;
+GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_plperl_user2;
 CREATE FUNCTION foo1() returns int language plperl as '1;';
 SELECT foo1();
  foo1 
@@ -38,15 +38,15 @@ SELECT foo1();
 -- Must reconnect to avoid failure with non-MULTIPLICITY Perl interpreters
 \c -
 SET search_path = plperl_setup_scratch;
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 -- Should be able to change privileges on the language
 revoke all on language plperl from public;
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user2;
 CREATE FUNCTION foo2() returns int language plperl as '2;';  -- fail
 ERROR:  permission denied for language plperl
-SET ROLE regress_user1;
-grant usage on language plperl to regress_user2;
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user1;
+grant usage on language plperl to regress_plperl_user2;
+SET ROLE regress_plperl_user2;
 CREATE FUNCTION foo2() returns int language plperl as '2;';
 SELECT foo2();
  foo2 
@@ -54,7 +54,7 @@ SELECT foo2();
     2
 (1 row)
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 -- Should be able to drop the extension, but not the language per se
 DROP LANGUAGE plperl CASCADE;
 ERROR:  cannot drop language plperl because extension plperl requires it
@@ -65,9 +65,9 @@ DETAIL:  drop cascades to function foo1()
 drop cascades to function foo2()
 -- Clean up
 RESET ROLE;
-DROP OWNED BY regress_user1;
-DROP USER regress_user1;
-DROP USER regress_user2;
+DROP OWNED BY regress_plperl_user1;
+DROP USER regress_plperl_user1;
+DROP USER regress_plperl_user2;
 -- Now install the versions that will be used by subsequent test scripts.
 CREATE EXTENSION plperl;
 CREATE EXTENSION plperlu;
diff --git a/src/pl/plperl/sql/plperl_setup.sql b/src/pl/plperl/sql/plperl_setup.sql
index a89cf56617e..0eac9156294 100644
--- a/src/pl/plperl/sql/plperl_setup.sql
+++ b/src/pl/plperl/sql/plperl_setup.sql
@@ -6,10 +6,10 @@
 -- a non-superuser is allowed to install plperl (but not plperlu) when
 -- suitable permissions have been granted.
 
-CREATE USER regress_user1;
-CREATE USER regress_user2;
+CREATE USER regress_plperl_user1;
+CREATE USER regress_plperl_user2;
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 CREATE EXTENSION plperl;  -- fail
 CREATE EXTENSION plperlu;  -- fail
@@ -18,18 +18,18 @@ RESET ROLE;
 
 DO $$
 begin
-  execute format('grant create on database %I to regress_user1',
+  execute format('grant create on database %I to regress_plperl_user1',
                  current_database());
 end;
 $$;
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 CREATE EXTENSION plperl;
 CREATE EXTENSION plperlu;  -- fail
 CREATE SCHEMA plperl_setup_scratch;
 SET search_path = plperl_setup_scratch;
-GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_user2;
+GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_plperl_user2;
 
 CREATE FUNCTION foo1() returns int language plperl as '1;';
 SELECT foo1();
@@ -38,25 +38,25 @@ SELECT foo1();
 \c -
 SET search_path = plperl_setup_scratch;
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 -- Should be able to change privileges on the language
 revoke all on language plperl from public;
 
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user2;
 
 CREATE FUNCTION foo2() returns int language plperl as '2;';  -- fail
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
-grant usage on language plperl to regress_user2;
+grant usage on language plperl to regress_plperl_user2;
 
-SET ROLE regress_user2;
+SET ROLE regress_plperl_user2;
 
 CREATE FUNCTION foo2() returns int language plperl as '2;';
 SELECT foo2();
 
-SET ROLE regress_user1;
+SET ROLE regress_plperl_user1;
 
 -- Should be able to drop the extension, but not the language per se
 DROP LANGUAGE plperl CASCADE;
@@ -64,9 +64,9 @@ DROP EXTENSION plperl CASCADE;
 
 -- Clean up
 RESET ROLE;
-DROP OWNED BY regress_user1;
-DROP USER regress_user1;
-DROP USER regress_user2;
+DROP OWNED BY regress_plperl_user1;
+DROP USER regress_plperl_user1;
+DROP USER regress_plperl_user2;
 
 -- Now install the versions that will be used by subsequent test scripts.
 CREATE EXTENSION plperl;
diff --git a/contrib/adminpack/expected/adminpack.out b/contrib/adminpack/expected/adminpack.out
index 76aafe6316a..6bcf2217f25 100644
--- a/contrib/adminpack/expected/adminpack.out
+++ b/contrib/adminpack/expected/adminpack.out
@@ -36,10 +36,10 @@ SELECT pg_read_file('test_file1');
 
 -- disallowed file paths for non-superusers and users who are
 -- not members of pg_write_server_files
-CREATE ROLE regress_user1;
-GRANT pg_read_all_settings TO regress_user1;
-GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_user1;
-SET ROLE regress_user1;
+CREATE ROLE regress_adminpack_user1;
+GRANT pg_read_all_settings TO regress_adminpack_user1;
+GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_adminpack_user1;
+SET ROLE regress_adminpack_user1;
 SELECT pg_file_write('../test_file0', 'test0', false);
 ERROR:  path must be in or below the current directory
 SELECT pg_file_write('/tmp/test_file0', 'test0', false);
@@ -53,9 +53,9 @@ SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4'
 SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false);
 ERROR:  absolute path not allowed
 RESET ROLE;
-REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_user1;
-REVOKE pg_read_all_settings FROM regress_user1;
-DROP ROLE regress_user1;
+REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_adminpack_user1;
+REVOKE pg_read_all_settings FROM regress_adminpack_user1;
+DROP ROLE regress_adminpack_user1;
 -- sync
 SELECT pg_file_sync('test_file1'); -- sync file
  pg_file_sync 
@@ -153,8 +153,8 @@ SELECT pg_file_unlink('test_file4');
 (1 row)
 
 -- superuser checks
-CREATE USER regress_user1;
-SET ROLE regress_user1;
+CREATE USER regress_adminpack_user1;
+SET ROLE regress_adminpack_user1;
 SELECT pg_file_write('test_file0', 'test0', false);
 ERROR:  permission denied for function pg_file_write
 SELECT pg_file_sync('test_file0');
@@ -167,6 +167,6 @@ ERROR:  permission denied for function pg_file_unlink
 SELECT pg_logdir_ls();
 ERROR:  permission denied for function pg_logdir_ls
 RESET ROLE;
-DROP USER regress_user1;
+DROP USER regress_adminpack_user1;
 -- no further tests for pg_logdir_ls() because it depends on the
 -- server's logging setup
diff --git a/contrib/adminpack/sql/adminpack.sql b/contrib/adminpack/sql/adminpack.sql
index 918d0bdc65e..5776c9af0d1 100644
--- a/contrib/adminpack/sql/adminpack.sql
+++ b/contrib/adminpack/sql/adminpack.sql
@@ -14,20 +14,20 @@ SELECT pg_read_file('test_file1');
 
 -- disallowed file paths for non-superusers and users who are
 -- not members of pg_write_server_files
-CREATE ROLE regress_user1;
+CREATE ROLE regress_adminpack_user1;
 
-GRANT pg_read_all_settings TO regress_user1;
-GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_user1;
+GRANT pg_read_all_settings TO regress_adminpack_user1;
+GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_adminpack_user1;
 
-SET ROLE regress_user1;
+SET ROLE regress_adminpack_user1;
 SELECT pg_file_write('../test_file0', 'test0', false);
 SELECT pg_file_write('/tmp/test_file0', 'test0', false);
 SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4', false);
 SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false);
 RESET ROLE;
-REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_user1;
-REVOKE pg_read_all_settings FROM regress_user1;
-DROP ROLE regress_user1;
+REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_adminpack_user1;
+REVOKE pg_read_all_settings FROM regress_adminpack_user1;
+DROP ROLE regress_adminpack_user1;
 
 -- sync
 SELECT pg_file_sync('test_file1'); -- sync file
@@ -59,8 +59,8 @@ SELECT pg_file_unlink('test_file4');
 
 
 -- superuser checks
-CREATE USER regress_user1;
-SET ROLE regress_user1;
+CREATE USER regress_adminpack_user1;
+SET ROLE regress_adminpack_user1;
 
 SELECT pg_file_write('test_file0', 'test0', false);
 SELECT pg_file_sync('test_file0');
@@ -69,7 +69,7 @@ SELECT pg_file_unlink('test_file0');
 SELECT pg_logdir_ls();
 
 RESET ROLE;
-DROP USER regress_user1;
+DROP USER regress_adminpack_user1;
 
 
 -- no further tests for pg_logdir_ls() because it depends on the
diff --git a/contrib/passwordcheck/expected/passwordcheck.out b/contrib/passwordcheck/expected/passwordcheck.out
index e04cda6bd95..2f917169eb6 100644
--- a/contrib/passwordcheck/expected/passwordcheck.out
+++ b/contrib/passwordcheck/expected/passwordcheck.out
@@ -1,19 +1,19 @@
 LOAD 'passwordcheck';
-CREATE USER regress_user1;
+CREATE USER regress_passwordcheck_user1;
 -- ok
-ALTER USER regress_user1 PASSWORD 'a_nice_long_password';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'a_nice_long_password';
 -- error: too short
-ALTER USER regress_user1 PASSWORD 'tooshrt';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'tooshrt';
 ERROR:  password is too short
 -- error: contains user name
-ALTER USER regress_user1 PASSWORD 'xyzregress_user1';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'xyzregress_passwordcheck_user1';
 ERROR:  password must not contain user name
 -- error: contains only letters
-ALTER USER regress_user1 PASSWORD 'alessnicelongpassword';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'alessnicelongpassword';
 ERROR:  password must contain both letters and nonletters
 -- encrypted ok (password is "secret")
-ALTER USER regress_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
 -- error: password is user name
-ALTER USER regress_user1 PASSWORD 'md5e589150ae7d28f93333afae92b36ef48';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md507a112732ed9f2087fa90b192d44e358';
 ERROR:  password must not equal user name
-DROP USER regress_user1;
+DROP USER regress_passwordcheck_user1;
diff --git a/contrib/passwordcheck/sql/passwordcheck.sql b/contrib/passwordcheck/sql/passwordcheck.sql
index d98796ac494..df0f9ac0d39 100644
--- a/contrib/passwordcheck/sql/passwordcheck.sql
+++ b/contrib/passwordcheck/sql/passwordcheck.sql
@@ -1,23 +1,23 @@
 LOAD 'passwordcheck';
 
-CREATE USER regress_user1;
+CREATE USER regress_passwordcheck_user1;
 
 -- ok
-ALTER USER regress_user1 PASSWORD 'a_nice_long_password';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'a_nice_long_password';
 
 -- error: too short
-ALTER USER regress_user1 PASSWORD 'tooshrt';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'tooshrt';
 
 -- error: contains user name
-ALTER USER regress_user1 PASSWORD 'xyzregress_user1';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'xyzregress_passwordcheck_user1';
 
 -- error: contains only letters
-ALTER USER regress_user1 PASSWORD 'alessnicelongpassword';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'alessnicelongpassword';
 
 -- encrypted ok (password is "secret")
-ALTER USER regress_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md51a44d829a20a23eac686d9f0d258af13';
 
 -- error: password is user name
-ALTER USER regress_user1 PASSWORD 'md5e589150ae7d28f93333afae92b36ef48';
+ALTER USER regress_passwordcheck_user1 PASSWORD 'md507a112732ed9f2087fa90b192d44e358';
 
-DROP USER regress_user1;
+DROP USER regress_passwordcheck_user1;
-- 
2.37.3.542.gdd3f6c4cae

v17-0019-meson-Add-installcheck-equivalent.patchtext/x-diff; charset=us-asciiDownload
From cb8bc48c3a3749bd49a55df50e9529c1c1eb111a Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 16:57:01 -0700
Subject: [PATCH v17 19/23] meson: Add installcheck equivalent

run all tests that support running against existing server:
$ meson test --setup running

run just the main pg_regress tests against existing server:
$ meson test --setup running main-running/regress
---
 contrib/basic_archive/meson.build             |  1 +
 contrib/pg_freespacemap/meson.build           |  3 +
 contrib/pg_stat_statements/meson.build        |  4 ++
 contrib/pg_walinspect/meson.build             |  3 +
 contrib/test_decoding/meson.build             |  5 ++
 src/interfaces/ecpg/test/meson.build          |  1 +
 src/test/isolation/meson.build                |  3 +
 src/test/modules/commit_ts/meson.build        |  3 +
 src/test/modules/snapshot_too_old/meson.build |  3 +
 src/test/modules/test_oat_hooks/meson.build   |  1 +
 src/test/modules/test_pg_dump/meson.build     |  2 +
 src/test/modules/worker_spi/meson.build       |  4 +-
 src/test/regress/meson.build                  |  3 +
 .cirrus.yml                                   | 15 +++++
 meson.build                                   | 57 +++++++++++++++++--
 15 files changed, 102 insertions(+), 6 deletions(-)

diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index c30dcfa5d41..d4ecaec47b8 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -25,5 +25,6 @@ tests += {
     'regress_args': [
       '--temp-config', files('basic_archive.conf'),
     ],
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index 904b37b6e9b..f802e297b67 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -33,5 +33,8 @@ tests += {
     'regress_args': [
       '--temp-config', files('pg_freespacemap.conf')
     ],
+    # Disabled because these tests require "autovacuum=off", which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index 854df138e76..bd0e42331eb 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -41,5 +41,9 @@ tests += {
       'pg_stat_statements',
     ],
     'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+    # Disabled because these tests require
+    # "shared_preload_libraries=pg_stat_statements", which typical
+    # runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index 4314a3182a2..351f184de83 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -28,6 +28,9 @@ tests += {
     'sql': [
       'pg_walinspect',
     ],
+    # Disabled because these tests require "wal_level=replica", which
+    # some runningcheck users do not have (e.g. buildfarm clients).
     'regress_args': ['--temp-config', files('walinspect.conf')],
+    'runningcheck': false,
   },
 }
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index 6376103c689..a1aaae2dc3f 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -43,6 +43,9 @@ tests += {
     'regress_args': [
       '--temp-config', files('logical.conf'),
     ],
+    # Disabled because these tests require "wal_level=logical", which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
   'isolation': {
     'specs': [
@@ -60,6 +63,8 @@ tests += {
     'regress_args': [
       '--temp-config', files('logical.conf'),
     ],
+    # see above
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index 94b26d10314..d4f1f1c0fcf 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -84,6 +84,7 @@ tests += {
     'test_kwargs': {
       'depends': ecpg_test_dependencies,
     },
+    'dbname': 'ecpg1_regression,ecpg2_regression',
     'regress_args': ecpg_regress_args,
   },
 }
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index ba27b8c1d44..8737392f23b 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -67,5 +67,8 @@ tests += {
       'priority': 40,
       'timeout': 1000,
     },
+    # checks pg_locks etc
+    'runningcheck-parallel': false,
+    'dbname': 'isolation',
   },
 }
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
index 60cb12164d2..fa86e70e880 100644
--- a/src/test/modules/commit_ts/meson.build
+++ b/src/test/modules/commit_ts/meson.build
@@ -6,6 +6,9 @@ tests += {
     'sql': [
       'commit_timestamp',
     ],
+    # Disabled because these tests require "track_commit_timestamp = on",
+    # which typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
index efd3f1f113b..5094b52949b 100644
--- a/src/test/modules/snapshot_too_old/meson.build
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -10,5 +10,8 @@ tests += {
       'sto_using_hash_index',
     ],
     'regress_args': ['--temp-config', files('sto.conf')],
+    # Disabled because these tests require "old_snapshot_threshold" >= 0, which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 8802bbbac55..e9d09d92c30 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -25,5 +25,6 @@ tests += {
       'test_oat_hooks',
     ],
     'regress_args': ['--no-locale', '--encoding=UTF8'],
+    'runningcheck': false,
   },
 }
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
index 41021829f3a..73f1fcf9428 100644
--- a/src/test/modules/test_pg_dump/meson.build
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -13,6 +13,8 @@ tests += {
     'sql': [
       'test_pg_dump',
     ],
+    # doesn't delete its user
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index a4a158c75b9..660d721eea9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -30,6 +30,8 @@ tests += {
     'sql': [
       'worker_spi',
     ],
-    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+    'dbname': 'contrib_regression',
+    'regress_args': ['--temp-config', files('dynamic.conf')],
+    'runningcheck': false,
   },
 }
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index 963c0f64ed5..a781fa2af1d 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -64,5 +64,8 @@ tests += {
       'priority': 50,
       'timeout': 1000,
     },
+    'dbname': 'regression',
+    # checks pg_locks etc
+    'runningcheck-parallel': false,
   },
 }
diff --git a/.cirrus.yml b/.cirrus.yml
index aea25fd7525..16a1396d869 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -121,6 +121,21 @@ task:
       meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
     EOF
 
+  # test runningcheck, freebsd chosen because it's currently fast enough
+  test_running_script: |
+    su postgres <<-EOF
+      set -e
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --quiet --suite setup
+      export LD_LIBRARY_PATH="$(pwd)/build/tmp_install/usr/local/lib/:$LD_LIBRARY_PATH"
+      mkdir -p build/testrun
+      build/tmp_install/usr/local/bin/initdb -N build/runningcheck --no-instructions -A trust
+      echo "include '$(pwd)/src/tools/ci/pg_ci_base.conf'" >> build/runningcheck/postgresql.conf
+      build/tmp_install/usr/local/bin/pg_ctl -c -o '-c fsync=off' -D build/runningcheck -l build/testrun/runningcheck.log start
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS} --setup running
+      build/tmp_install/usr/local/bin/pg_ctl -D build/runningcheck stop
+    EOF
+
   on_failure:
     <<: *on_failure_meson
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
diff --git a/meson.build b/meson.build
index 5f09d2e079a..5e7e95f352c 100644
--- a/meson.build
+++ b/meson.build
@@ -2866,6 +2866,18 @@ endif
 # Test Generation
 ###############################################################
 
+# when using a meson version understanding exclude_suites, define a 'default'
+# test setup that excludes tests running against a pre-existing install and a
+# 'running' setup that conflicts with creation of the temporary installation
+# and tap tests (which don't support running against a running server).
+running_suites = []
+install_suites = []
+if meson.version().version_compare('>=0.57')
+  runningcheck = true
+else
+  runningcheck = false
+endif
+
 testwrap = files('src/tools/testwrap')
 
 foreach test_dir : tests
@@ -2894,18 +2906,27 @@ foreach test_dir : tests
 
       test_output = test_result_dir / test_dir['name'] / kind
 
+      # unless specified by the test, choose a non-conflicting database name,
+      # to avoid conflicts when running against existing server.
+      dbname = t.get('dbname',
+        'regression_@0@_@1@'.format(test_dir['name'], kind))
+
       test_command = [
         runner.full_path(),
         '--inputdir', t.get('inputdir', test_dir['sd']),
         '--expecteddir', t.get('expecteddir', test_dir['sd']),
         '--outputdir', test_output,
-        '--temp-instance', test_output / 'tmp_check',
         '--bindir', '',
         '--dlpath', test_dir['bd'],
         '--max-concurrent-tests=20',
-        '--port', testport.to_string(),
+        '--dbname', dbname,
       ] + t.get('regress_args', [])
 
+      test_command_tmp_install = test_command + [
+          '--temp-instance', test_output / 'tmp_check',
+          '--port', testport.to_string(),
+        ]
+
       if t.has_key('schedule')
         test_command += ['--schedule', t['schedule'],]
       endif
@@ -2920,7 +2941,6 @@ foreach test_dir : tests
       env.prepend('PATH', temp_install_bindir, test_dir['bd'])
 
       test_kwargs = {
-        'suite': [test_dir['name']],
         'priority': 10,
         'timeout': 1000,
         'depends': test_deps + t.get('deps', []),
@@ -2931,10 +2951,28 @@ foreach test_dir : tests
         python,
         args: testwrap_base + [
           '--testname', kind,
-          '--', test_command,
+          '--', test_command_tmp_install,
         ],
+        suite: test_dir['name'],
         kwargs: test_kwargs,
       )
+      install_suites += test_dir['name']
+
+      # some tests can't support running against running DB
+      if runningcheck and t.get('runningcheck', true)
+        suite = test_dir['name'] + '-running'
+        test(suite / kind,
+          python,
+          args: testwrap_base + [
+            '--testname', kind,
+            '--', test_command,
+          ],
+          is_parallel: t.get('runningcheck-parallel', true),
+          suite: suite,
+          kwargs: test_kwargs,
+        )
+        running_suites += suite
+      endif
 
       testport += 1
     elif kind == 'tap'
@@ -2957,9 +2995,10 @@ foreach test_dir : tests
         env.set(name, value)
       endforeach
 
+      suite = test_dir['name']
       test_kwargs = {
         'protocol': 'tap',
-        'suite': [test_dir['name']],
+        'suite': suite,
         'timeout': 1000,
         'depends': test_deps + t.get('deps', []),
         'env': env,
@@ -2985,6 +3024,7 @@ foreach test_dir : tests
           ],
         )
       endforeach
+      install_suites += suite
     else
       error('unknown kind @0@ of test in @1@'.format(kind, test_dir['sd']))
     endif
@@ -2993,6 +3033,13 @@ foreach test_dir : tests
 
 endforeach # directories with tests
 
+if runningcheck
+  add_test_setup('default',
+    is_default: true,
+    exclude_suites: running_suites)
+  add_test_setup('running',
+    exclude_suites: ['setup'] + install_suites)
+endif
 
 
 ###############################################################
-- 
2.37.3.542.gdd3f6c4cae

v17-0020-meson-Add-postgresql-extension.pc-for-building-e.patchtext/x-diff; charset=us-asciiDownload
From 40facb419c2c3af1b9d1c14621a4cee032837ce3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 27 Aug 2022 09:52:03 -0700
Subject: [PATCH v17 20/23] meson: Add postgresql-extension.pc for building
 extension libraries

This should work with several other buildsystems.

TODO: Docs and example
---
 src/backend/meson.build | 96 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/src/backend/meson.build b/src/backend/meson.build
index 676cb714d79..156ac788508 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -185,6 +185,102 @@ pg_mod_args = default_mod_args + {
 
 
 
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = pg_mod_c_args
+pg_ext_libs = [backend_mod_code, thread_dep, ldflags, ldflags_mod]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+  if incdir.startswith('src/include')
+    subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+  else
+    subincdir = ''
+  endif
+  pg_ext_subdirs += subincdir
+
+  # Add directories in source / build dir containing headers to cflags for the
+  # -uninstalled.pc
+  pg_ext_vars_uninst += [
+    'build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+    'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir),
+  ]
+  pg_ext_cflags += [
+    '${build_inc@0@}'.format(i),
+    '${src_inc@0@}'.format(i)
+  ]
+
+  i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags += cflags
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'pkglibdir=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_mod=${pkglibdir}'
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+# referenced on some platforms, via mod_link_with_dir
+pg_ext_vars += 'bindir=${prefix}/@0@'.format(dir_bin)
+
+# XXX: Define variables making it easy to define tests, too
+
+# Some platforms need linker flags to link with binary, they are the same
+# between building with meson and .pc file, except that we have have to
+# reference a variable to make it work for both normal and -uninstalled .pc
+# files.
+if mod_link_args_fmt.length() != 0
+  assert(link_with_inst != '')
+  assert(link_with_uninst != '')
+
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format(link_with_inst)
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(link_with_uninst)
+
+  foreach el : mod_link_args_fmt
+    pg_ext_libs += el.format('${mod_link_with}')
+  endforeach
+endif
+
+# main .pc to build extensions
+pkgconfig.generate(
+  name: 'postgresql-extension',
+  description: 'PostgreSQL Extension Support',
+  url: pg_url,
+
+  subdirs: pg_ext_subdirs,
+  libraries: pg_ext_libs,
+  extra_cflags: pg_ext_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+  name: 'postgresql-extension-warnings',
+  description: 'PostgreSQL Extension Support - Compiler Warnings',
+  requires: 'postgresql-extension',
+  url: pg_url,
+  extra_cflags: cflags_warn,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+
 # Shared modules that, on some system, link against the server binary. Only
 # enter these after we defined the server build.
 
-- 
2.37.3.542.gdd3f6c4cae

v17-0021-meson-Add-LLVM-bitcode-emission.patchtext/x-diff; charset=us-asciiDownload
From f561374caeb318949bc065f6db8ecf3ec34d1bfc Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 24 Aug 2022 19:58:45 -0700
Subject: [PATCH v17 21/23] meson: Add LLVM bitcode emission

This needs a bit more love before being ready...
---
 src/backend/jit/llvm/meson.build | 21 +++++++++++++++
 src/backend/meson.build          | 46 ++++++++++++++++++++++++++++++++
 meson.build                      |  2 ++
 src/tools/irlink                 | 43 +++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+)
 create mode 100644 src/tools/irlink

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index 5fb63768358..5b339e33934 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -54,6 +54,19 @@ else
   llvm_irgen_command = clang
 endif
 
+llvm_irlink_kw = {
+  'command': [
+    irlink,
+    '--name', 'postgres',
+    '--lto', llvm_lto,
+    '--outdir', '@OUTPUT0@',
+    '--privdir', '@PRIVATE_DIR@',
+    '@INPUT@',
+  ],
+  'install': true,
+  'install_dir': dir_lib_pkg,
+}
+
 
 # XXX: Need to determine proper version of the function cflags for clang
 bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
@@ -77,3 +90,11 @@ llvmjit_types = custom_target('llvmjit_types.bc',
   depfile: '@BASENAME@.c.bc.d',
 )
 backend_targets += llvmjit_types
+
+# Figure out -I's needed to build all postgres code, including all its
+# dependencies
+pkg_config = find_program(['pkg-config', 'pkgconf'], required: true)
+r = run_command(pkg_config,
+  ['--cflags-only-I', meson.build_root() / 'meson-uninstalled/postgresql-extension-uninstalled.pc'],
+  check: true)
+bitcode_cflags += r.stdout().split()
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 156ac788508..a535543ee9e 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -289,3 +289,49 @@ subdir('replication/libpqwalreceiver')
 subdir('replication/pgoutput')
 subdir('snowball')
 subdir('utils/mb/conversion_procs')
+
+
+
+###############################################################
+# emit LLVM bitcode of backend code for JIT inlining
+###############################################################
+
+if llvm.found()
+
+  # custom_target() insists on targeting files into the current
+  # directory. But we have files with the same name in different
+  # subdirectories.  generators() don't have that problem, but their results
+  # are not installable. The irlink command copies the files for us.
+  #
+  # FIXME: this needs to be in a central place
+  #
+  # generators don't accept CustomTargetIndex as input or 'depends', nor do
+  # they like targets with more than one output. However, a custom target
+  # accepts them as input without a problem. So we have the below transitive
+  # target :(
+
+  transitive_depend_target = custom_target('stamp',
+    input: generated_headers + generated_backend_headers + generated_backend_sources,
+    output: 'stamp',
+    command: [touch, '@OUTPUT@'],
+    install: false)
+
+  llvm_gen = generator(llvm_irgen_command,
+    arguments: llvm_irgen_args + bitcode_cflags,
+    depends: transitive_depend_target,
+    depfile: '@BASENAME@.c.bc.d',
+    output: '@PLAINNAME@.bc',
+  )
+
+  bc_backend_sources = llvm_gen.process(backend_sources,
+    preserve_path_from: meson.current_source_dir())
+
+  postgres_llvm = custom_target('bitcode',
+    output: ['bitcode'],
+    input: bc_backend_sources,
+    kwargs: llvm_irlink_kw,
+  )
+
+  backend_targets += postgres_llvm
+
+endif
diff --git a/meson.build b/meson.build
index 5e7e95f352c..d24e04d1544 100644
--- a/meson.build
+++ b/meson.build
@@ -674,6 +674,8 @@ if not llvmopt.disabled()
 
     ccache = find_program('ccache', native: true, required: false)
     clang = find_program(llvm_binpath / 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+    irlink = find_program('src/tools/irlink', native: true)
   endif
 else
   llvm = not_found_dep
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..813bbf13398
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(
+    description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+    shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = []
+for input in args.INPUT:
+    file_names += [args.name + input.replace(args.privdir, '')]
+
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink',
+           '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v17-0022-meson-Add-support-for-relative-rpaths-fixing-tes.patchtext/x-diff; charset=us-asciiDownload
From 19f248fae1e67354683ef31c1497bacc5c7df25f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 17:24:47 -0700
Subject: [PATCH v17 22/23] meson: Add support for relative rpaths, fixing
 tests on MacOS w/ SIP

---
 meson.build                                   | 68 ++++++++++----
 .../relativize_shared_library_references      | 88 +++++++++++++++++++
 src/tools/relpath.py                          |  6 ++
 3 files changed, 145 insertions(+), 17 deletions(-)
 create mode 100755 src/tools/relativize_shared_library_references
 create mode 100755 src/tools/relpath.py

diff --git a/meson.build b/meson.build
index d24e04d1544..3bbcd78d319 100644
--- a/meson.build
+++ b/meson.build
@@ -160,6 +160,7 @@ portname = host_system
 
 exesuffix = '' # overridden below where necessary
 dlsuffix = '.so' # overridden below where necessary
+rpath_origin = '$ORIGIN'
 library_path_var = 'LD_LIBRARY_PATH'
 
 # Format of file to control exports from libraries, and how to pass them to
@@ -210,6 +211,7 @@ elif host_system == 'cygwin'
 elif host_system == 'darwin'
   dlsuffix = '.dylib'
   library_path_var = 'DYLD_LIBRARY_PATH'
+  rpath_origin = '@loader_path'
 
   export_file_format = 'darwin'
   export_fmt = '-exported_symbols_list=@0@'
@@ -242,8 +244,16 @@ elif host_system == 'netbsd'
   # LDFLAGS.
   ldflags += ['-Wl,-z,now', '-Wl,-z,relro']
 
+  # netbsd patched their meson in a broken way:
+  # https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=56959
+  # until there's a way out of that, disable rpath_origin
+  rpath_origin = ''
+
 elif host_system == 'openbsd'
-  # you're ok
+  # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+  # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+  # when invoked via PATH search).
+  rpath_origin = ''
 
 elif host_system == 'sunos'
   portname = 'solaris'
@@ -255,6 +265,7 @@ elif host_system == 'windows'
   exesuffix = '.exe'
   dlsuffix = '.dll'
   library_path_var = ''
+  rpath_origin = ''
 
   export_file_format = 'win'
   export_file_suffix = 'def'
@@ -2479,25 +2490,41 @@ bin_install_rpaths = []
 lib_install_rpaths = []
 mod_install_rpaths = []
 
-
-# Don't add rpaths on darwin for now - as long as only absolute references to
-# libraries are needed, absolute LC_ID_DYLIB ensures libraries can be found in
-# their final destination.
+# Add extra_lib_dirs to rpath. This ensures we find libraries we depend on.
+#
+# Not needed on darwin, even if we use relative rpaths for our own libraries,
+# as the install_name of libraries in extra_lib_dirs will point to their
+# location anyway.
 if host_system != 'darwin'
+  bin_install_rpaths += postgres_lib_d
+  lib_install_rpaths += postgres_lib_d
+  mod_install_rpaths += postgres_lib_d
+endif
+
+# If the host can form relative rpaths, use that to make the installation
+# properly relocatable
+if rpath_origin != ''
+  # PG binaries might need to link to libpq, use relative path to reference
+  bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_bin, dir_lib, check: true).stdout().strip()
+  bin_install_rpaths += rpath_origin / bin_to_lib
+
+  # PG extensions might need to link to libpq, use relative path to reference
+  # (often just .)
+  mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+    dir_lib_pkg, dir_lib, check: true).stdout().strip()
+  mod_install_rpaths += rpath_origin / mod_to_lib
+
+  test_use_library_path_var = false
+else
+
   # Add absolute path to libdir to rpath. This ensures installed binaries /
   # libraries find our libraries (mainly libpq).
   bin_install_rpaths += dir_prefix / dir_lib
   lib_install_rpaths += dir_prefix / dir_lib
   mod_install_rpaths += dir_prefix / dir_lib
 
-  # Add extra_lib_dirs to rpath. This ensures we find libraries we depend on.
-  #
-  # Not needed on darwin even if we use relative rpaths for our own libraries,
-  # as the install_name of libraries in extra_lib_dirs will point to their
-  # location anyway.
-  bin_install_rpaths += postgres_lib_d
-  lib_install_rpaths += postgres_lib_d
-  mod_install_rpaths += postgres_lib_d
+  test_use_library_path_var = true
 endif
 
 
@@ -2790,6 +2817,14 @@ above, or by running configure and then make maintainer-clean.
 endif
 
 
+# To make MacOS installation work without a prior make install, even with SIP
+# enabled, make rpaths relative after installation. This also makes the
+# installation relocatable.
+if host_system == 'darwin'
+  meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
 
 ###############################################################
 # Test prep
@@ -2855,10 +2890,9 @@ test_env.set('REGRESS_SHLIB', regress_module.full_path())
 # Export PG_TEST_EXTRA so it can be checked in individual tap tests.
 test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
 
-# Add the temporary installation to the library search path on platforms where
-# that works (everything but windows, basically). On windows everything
-# library-like gets installed into bindir, solving that issue.
-if library_path_var != ''
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if test_use_library_path_var and library_path_var != ''
   test_env.prepend(library_path_var, test_install_location / get_option('libdir'))
 endif
 
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..280bd48fd32
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+    if destdir is not None:
+        return f'{destdir}{path}'
+    else:
+        return path
+
+
+def collect_information():
+    shared_libraries = []
+    executables = []
+    shared_modules = []
+
+    meson_info_p = os.path.join(build_root, 'meson-info')
+    targets = json.load(
+        open(os.path.join(meson_info_p, 'intro-targets.json')))
+    installed = json.load(
+        open(os.path.join(meson_info_p, 'intro-installed.json')))
+
+    for target in targets:
+        if not target['installed']:
+            continue
+
+        filenames = target['filename']
+
+        if target['type'] == 'shared library':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+
+            shared_libraries.append(installed[filename])
+
+        if target['type'] == 'executable':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            executables.append(installed[filename])
+
+        if target['type'] == 'shared module':
+            assert(len(filenames) == 1)
+            filename = filenames[0]
+            shared_modules.append(installed[filename])
+
+    return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+    install_name_tool = [shutil.which('install_name_tool')]
+
+    for lib in shared_libraries:
+        libname = os.path.basename(lib)
+        libpath = installed_path(destdir, lib)
+        newref = f'@rpath/{libname}'
+
+        for patch in shared_modules + executables:
+            patchpath = installed_path(destdir, patch)
+
+            # print(f'in {patchpath} replace reference to {libpath} with {newref}')
+            if not os.path.exists(patchpath):
+                print(f"path {patchpath} doesn't exist", file=sys.stderr)
+                sys.exit(1)
+
+            cmd = install_name_tool + ['-change', lib, newref, patchpath]
+            subprocess.check_call(cmd)
+
+
+if __name__ == '__main__':
+    build_root = os.environ['MESON_BUILD_ROOT']
+    destdir = os.environ.get('DESTDIR', None)
+
+    print(f'making references to shared libraries relative, destdir is {destdir}',
+          file=sys.stderr)
+
+    shared_libraries, executables, shared_modules = collect_information()
+    patch_references(destdir, shared_libraries, executables, shared_modules)
+
+    sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
-- 
2.37.3.542.gdd3f6c4cae

v17-0023-meson-wip-headerchecks-cpluspluschecks.patchtext/x-diff; charset=us-asciiDownload
From ce64e8f3abbc2254acc53dcb6200c6a368197c51 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 26 Sep 2022 13:08:56 -0700
Subject: [PATCH v17 23/23] meson: wip: headerchecks cpluspluschecks

---
 src/include/meson.build            | 4 ++--
 src/meson.build                    | 7 +++++++
 src/tools/pginclude/cpluspluscheck | 4 ++--
 src/tools/pginclude/headerscheck   | 4 ++--
 4 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/include/meson.build b/src/include/meson.build
index 35c06c4856a..f20614573ce 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -42,9 +42,9 @@ config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
 
 var_cc = ' '.join(cc.cmd_array())
 var_cpp = ' '.join(cc.cmd_array() + ['-E'])
-var_cflags = ' '.join(cflags + cflags_warn + get_option('c_args'))
+var_cflags = ' '.join(cflags + cflags_warn + get_option('c_args') + ['-Wall'])
 if llvm.found()
-  var_cxxflags = ' '.join(cxxflags + cxxflags_warn + get_option('cpp_args'))
+  var_cxxflags = ' '.join(cxxflags + cxxflags_warn + get_option('cpp_args') + ['-Wall'])
 else
   var_cxxflags = ''
 endif
diff --git a/src/meson.build b/src/meson.build
index 8aa91940cec..788ea4d299e 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -272,3 +272,10 @@ install_data(
 install_data(
   'makefiles/pgxs.mk',
   install_dir: dir_pgxs / 'src' / 'makefiles')
+
+
+run_target('headerscheck',
+  command: [files('tools/pginclude/headerscheck'), '@SOURCE_ROOT@', '@BUILD_ROOT@'])
+
+run_target('cpluspluscheck',
+  command: [files('tools/pginclude/cpluspluscheck'), '@SOURCE_ROOT@', '@BUILD_ROOT@'])
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index b393f2a2eaa..aeaaaa67479 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -166,9 +166,9 @@ do
 	# Some subdirectories need extra -I switches.
 	case "$f" in
 	    src/pl/plperl/*)
-		EXTRAINCLUDES="$perl_includespec" ;;
+		EXTRAINCLUDES="$perl_includespec"; continue; ;;
 	    src/pl/plpython/*)
-		EXTRAINCLUDES="$python_includespec" ;;
+		EXTRAINCLUDES="$python_includespec"; continue; ;;
 	    src/interfaces/ecpg/*)
 		EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;;
 		src/backend/parser/*)
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 2a39856f88c..cc195ccc88f 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -149,9 +149,9 @@ do
 	# Some subdirectories need extra -I switches.
 	case "$f" in
 	    src/pl/plperl/*)
-		EXTRAINCLUDES="$perl_includespec" ;;
+		EXTRAINCLUDES="$perl_includespec"; continue; ;;
 	    src/pl/plpython/*)
-		EXTRAINCLUDES="$python_includespec" ;;
+		EXTRAINCLUDES="$python_includespec"; continue; ;;
 	    src/interfaces/ecpg/*)
 		EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;;
 	    src/backend/parser/*)
-- 
2.37.3.542.gdd3f6c4cae

#362Thomas Munro
thomas.munro@gmail.com
In reply to: Andres Freund (#361)
Re: [RFC] building postgres with meson - v13

On Tue, Sep 27, 2022 at 2:19 PM Andres Freund <andres@anarazel.de> wrote:

Subject: [PATCH v17 15/23] windows: Set UMDF_USING_NTSTATUS globally, include ntstatus.h

No Windows expertise here, but this looks reasonable. I originally
tried to contain UMDF_USING_NTSTATUS to small translation units for
fear of unintended consequences, but PCH requires you not to mess with
macros that affect the compilation of a header as seen by different
translation units, which is an incompatible goal. If this is passing
on MSVC and MingGW then +1 from me.

You mentioned WIN32_NO_STATUS in the commit message -- a mistake?
Digging out my old emails/notes... that's another way to be allowed to
include both ntstatus.h and windows.h/etc in the same translation
unit, but not the one we're using. I assume it's worse because you
have to define it and then undefine it, which sounds more antithetical
to the PCH dream. Admittedly UMDF_USING_NTSTATUS -- from the
"User-Mode Driver Framework" -- is a weird thing to be getting tangled
up with because we aren't writing a driver here, but it seems to be a
well known and widely used alternative, and is nicer because you only
have to define it.

Subject: [PATCH v17 16/23] windows: adjust FD_SETSIZE via commandline define

Right, we have to fix that across translation units for the same
reason. But why as -D and not in win32_port.h? I followed the
discussion from 9acda73118 to try to find the answer to that and saw
that Michael wanted to put it there, but wanted to minimise the blast
radius at the time:

/messages/by-id/20190826054000.GE7005@paquier.xyz

#363Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#362)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-27 17:29:27 +1300, Thomas Munro wrote:

On Tue, Sep 27, 2022 at 2:19 PM Andres Freund <andres@anarazel.de> wrote:

Subject: [PATCH v17 15/23] windows: Set UMDF_USING_NTSTATUS globally, include ntstatus.h

No Windows expertise here, but this looks reasonable. I originally
tried to contain UMDF_USING_NTSTATUS to small translation units for
fear of unintended consequences, but PCH requires you not to mess with
macros that affect the compilation of a header as seen by different
translation units, which is an incompatible goal. If this is passing
on MSVC and MingGW then +1 from me.

Yes, passes both.

You mentioned WIN32_NO_STATUS in the commit message -- a mistake?

Argh. An earlier iteration. Works on mingw, but making it work with msvc
required a lot more modifications IIRC.

Digging out my old emails/notes... that's another way to be allowed to
include both ntstatus.h and windows.h/etc in the same translation
unit, but not the one we're using. I assume it's worse because you
have to define it and then undefine it, which sounds more antithetical
to the PCH dream. Admittedly UMDF_USING_NTSTATUS -- from the
"User-Mode Driver Framework" -- is a weird thing to be getting tangled
up with because we aren't writing a driver here, but it seems to be a
well known and widely used alternative, and is nicer because you only
have to define it.

It's definitely weird. But it appears to be widely used...

Subject: [PATCH v17 16/23] windows: adjust FD_SETSIZE via commandline define

Right, we have to fix that across translation units for the same
reason. But why as -D and not in win32_port.h? I followed the
discussion from 9acda73118 to try to find the answer to that and saw
that Michael wanted to put it there, but wanted to minimise the blast
radius at the time:

/messages/by-id/20190826054000.GE7005@paquier.xyz

I guess a similar consideration. I was a bit worried about the references to
FD_SETSIZE in src/backend/port/win32/socket.c. Multi kB on-stack arrays in
postmaster seem like they could cause issues.

ISTM we really ought to move away from stuff using FD_SETSIZE on windows...

Greetings,

Andres Freund

#364John Naylor
john.naylor@enterprisedb.com
In reply to: Andres Freund (#356)
Re: [RFC] building postgres with meson - v13

On Tue, Sep 27, 2022 at 2:06 AM Andres Freund <andres@anarazel.de> wrote:

On 2022-09-26 15:18:29 +0700, John Naylor wrote:

Either way it doesn't exist on this machine. I was able to get a working
build with

/usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig

Hm - what did you need this path for - I don't think that should be

needed.

I just cargo-culted the pattern from Arm (before I figured out it was Arm)
and used the "find" command to look for the directories by name. I tried
again without specifying any of the three directory flags, and I can run
the tests getting:

Ok: 233
Expected Fail: 0
Fail: 0
Unexpected Pass: 0
Skipped: 2
Timeout: 0

...which is fine for me since I don't do much development on MacOS nowadays.

1) /opt/homebrew/ seems to be an "Apple silicon" path?

Yea, it's /usr/local on x86-64, based on what was required to make macos

CI

work. I updated the wiki page, half-blindly - it'd be nice if you could
confirm that that works?

Not sure if you intended for me to try the full script in your last
response or just what's in the wiki page, but for the latter (on commit
bed0927aeb0c6), it fails at

[1656/2199] Linking target src/bin/psql/psql
FAILED: src/bin/psql/psql
clang -o src/bin/psql/psql
src/bin/psql/psql.p/meson-generated_.._psqlscanslash.c.o
src/bin/psql/psql.p/meson-generated_.._sql_help.c.o
src/bin/psql/psql.p/command.c.o src/bin/psql/psql.p/common.c.o
src/bin/psql/psql.p/copy.c.o src/bin/psql/psql.p/crosstabview.c.o
src/bin/psql/psql.p/describe.c.o src/bin/psql/psql.p/help.c.o
src/bin/psql/psql.p/input.c.o src/bin/psql/psql.p/large_obj.c.o
src/bin/psql/psql.p/mainloop.c.o src/bin/psql/psql.p/prompt.c.o
src/bin/psql/psql.p/startup.c.o src/bin/psql/psql.p/stringutils.c.o
src/bin/psql/psql.p/tab-complete.c.o src/bin/psql/psql.p/variables.c.o
-L/usr/local/opt/readline/lib -L/usr/local/opt/gettext/lib
-L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl/lib
-I/usr/local/opt/readline/include -I/usr/local/opt/gettext/include
-I/usr/local/opt/zlib/include -I/usr/local/opt/openssl/include
-Wl,-dead_strip_dylibs -Wl,-headerpad_max_install_names
-Wl,-undefined,error -isysroot
/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk
-Wl,-rpath,@loader_path/../../interfaces/libpq -Wl,-rpath,/usr/local/lib
-Wl,-rpath,/usr/local/Cellar/zstd/1.5.2/lib src/fe_utils/libpgfeutils.a
src/common/libpgcommon.a src/common/libpgcommon_ryu.a
src/common/libpgcommon_config_info.a src/port/libpgport.a
src/port/libpgport_crc.a src/interfaces/libpq/libpq.5.dylib -lm
/usr/local/lib/libintl.dylib -ledit -lz
/usr/local/Cellar/zstd/1.5.2/lib/libzstd.dylib -lz -lz -lz
Undefined symbols for architecture x86_64:
"_rl_completion_suppress_quote", referenced from:
_psql_completion in tab-complete.c.o
_quote_file_name in tab-complete.c.o
_complete_from_files in tab-complete.c.o
"_rl_filename_dequoting_function", referenced from:
_initialize_readline in tab-complete.c.o
"_rl_filename_quote_characters", referenced from:
_initialize_readline in tab-complete.c.o
"_rl_filename_quoting_function", referenced from:
_initialize_readline in tab-complete.c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see
invocation)

--
John Naylor
EDB: http://www.enterprisedb.com

#365Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#355)
Re: [RFC] building postgres with meson - v13

On 26.09.22 18:35, Andres Freund wrote:

9f5be26c1215 meson: Add docs for building with meson

I do like the overall layout of this.

The "Supported Platforms" section should be moved back to near the end
of the chapter. I don't see a reason to move it forward, at least
none that is related to the meson issue.

The changes to the "Getting the Source" section are also not
appropriate for this patch.

We don't really support building from a tarball with meson yet (you'd need to
confiure, maintainer-clean, configure meson), so it does make some sense...

Okay, interesting point. I suggest that we write it as if that were
fixed, and for the time being insert a <note> (or similar) explaining
the above restriction. Otherwise we'll have to rewrite it again later.

#366John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#364)
Re: [RFC] building postgres with meson - v13

On Tue, Sep 27, 2022 at 2:41 PM John Naylor <john.naylor@enterprisedb.com>
wrote:

On Tue, Sep 27, 2022 at 2:06 AM Andres Freund <andres@anarazel.de> wrote:

On 2022-09-26 15:18:29 +0700, John Naylor wrote:

Yea, it's /usr/local on x86-64, based on what was required to make

macos CI

work. I updated the wiki page, half-blindly - it'd be nice if you could
confirm that that works?

Not sure if you intended for me to try the full script in your last

response or just what's in the wiki page, but for the latter (on commit
bed0927aeb0c6), it fails at

[1656/2199] Linking target src/bin/psql/psql
FAILED: src/bin/psql/psql

Per off-list discussion with Andres, the linking failure was caused by some
env variables set in my bash profile for the sake of Homebrew. After
removing those, the recipe in the wiki worked fine.

--
John Naylor
EDB: http://www.enterprisedb.com

#367Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#361)
Re: [RFC] building postgres with meson - v13

On 27.09.22 03:19, Andres Freund wrote:

Attaches is version 17. Other changes:

[23 attachments]

How shall we proceed here? The more progress we make, the more patches
appear. ;-)

Maybe close this commitfest entry now, and start new threads for each
subsequent topic.

#368Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#367)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-30 23:51:04 +0200, Peter Eisentraut wrote:

On 27.09.22 03:19, Andres Freund wrote:

Attaches is version 17. Other changes:

[23 attachments]

How shall we proceed here? The more progress we make, the more patches
appear. ;-)

Maybe close this commitfest entry now, and start new threads for each
subsequent topic.

I was thinking of starting at least the following threads / CF entries once a
few of the remaining things are resolved:

- PGXS compatibility, plus related autoconf simplification patches
- pkg-config files for building postgres extensions
- relative rpath support

I am a bit on the fence about whether it's worth doing so for:

- installcheck equivalent
- precompiled header support (would like it soon, because it reduces
compile-test times substantially)

and, for no really tangible reason, considered
- resource files generation
- docs
- docs dependency

to be part of this thread / CF entry.

Now that I think about it more, I am inclined to also push the docs changes to
a new thread, just for wider visibility.

I think it'd be ok to commit the docs dependency fix soon, without a separate
thread, as it really fixes a "build bug".

Greetings,

Andres Freund

#369Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#361)
Re: [RFC] building postgres with meson - v13

On Mon, Sep 26, 2022 at 06:19:51PM -0700, Andres Freund wrote:

From 680ff3f7b4da1dbf21d0c7cd87af9bb5ee8b230c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 20:36:36 -0700
Subject: [PATCH v17 01/23] meson: ci: wip: move compilerwarnings task to meson

This patch isn't finished, but this part looks like a rebase conflict:

-      make -s -j${BUILD_JOBS} clean
+      make -s -j${BUILD_JOBS} world-bin

Also, you wrote "rm -fr build" between building for gcc and clang, but
since they run in an "always" block, it'd be better to use separate
dirs, to allow seeing logs for the the all (failed) tasks, in case the
last one succeeds.

On Mon, Sep 26, 2022 at 06:19:51PM -0700, Andres Freund wrote:

From 6025cb80d65fd7a8414241931df9f003a292052f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 12:07:29 -0700
Subject: [PATCH v17 16/23] windows: adjust FD_SETSIZE via commandline
define

+++ b/src/bin/pgbench/meson.build
@@ -27,6 +27,8 @@ pgbench = executable('pgbench',
pgbench_sources,
dependencies: [frontend_code, libpq, thread_dep],
include_directories: include_directories('.'),
+  c_pch: pch_postgres_fe_h,
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
kwargs: default_bin_args,
)

This puts PCH into the preparatory commit.

Also, src/tools/msvc/Mkvcbuild.pm seems to use spaces rather than tabs.

--
Justin

#370Andres Freund
andres@anarazel.de
In reply to: Justin Pryzby (#369)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-10-02 12:25:20 -0500, Justin Pryzby wrote:

On Mon, Sep 26, 2022 at 06:19:51PM -0700, Andres Freund wrote:

From 680ff3f7b4da1dbf21d0c7cd87af9bb5ee8b230c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 20:36:36 -0700
Subject: [PATCH v17 01/23] meson: ci: wip: move compilerwarnings task to meson

This patch isn't finished, but this part looks like a rebase conflict:

-      make -s -j${BUILD_JOBS} clean
+      make -s -j${BUILD_JOBS} world-bin

I don't think so - it's the first task building with autoconf / in-tree. I
however shouldn't added ccache to CC, that was an accident. I think I'll
convert it to a vpath build, seems cleaner.

Also, you wrote "rm -fr build" between building for gcc and clang, but
since they run in an "always" block, it'd be better to use separate
dirs, to allow seeing logs for the the all (failed) tasks, in case the
last one succeeds.

Hm, when are logs important for CompilerWarnings? I don't think we even
collect any? Using a different builddir for the "sibling" tests (i.e. the two
gcc and the two clang tests) would increase the times a bit because we'd
regenerate the bison files etc.

I guess it'll look a bit cleaner to use a build-gcc and a build-clang, just to
get rid of the irregularity of needing that rm -rf.

On Mon, Sep 26, 2022 at 06:19:51PM -0700, Andres Freund wrote:

From 6025cb80d65fd7a8414241931df9f003a292052f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sun, 25 Sep 2022 12:07:29 -0700
Subject: [PATCH v17 16/23] windows: adjust FD_SETSIZE via commandline
define

+++ b/src/bin/pgbench/meson.build
@@ -27,6 +27,8 @@ pgbench = executable('pgbench',
pgbench_sources,
dependencies: [frontend_code, libpq, thread_dep],
include_directories: include_directories('.'),
+  c_pch: pch_postgres_fe_h,
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
kwargs: default_bin_args,
)

This puts PCH into the preparatory commit.
Also, src/tools/msvc/Mkvcbuild.pm seems to use spaces rather than tabs.

Oops, will fix.

Greetings,

Andres Freund

#371Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#370)
Re: [RFC] building postgres with meson - v13

On Sun, Oct 02, 2022 at 11:05:30AM -0700, Andres Freund wrote:

Also, you wrote "rm -fr build" between building for gcc and clang, but
since they run in an "always" block, it'd be better to use separate
dirs, to allow seeing logs for the the all (failed) tasks, in case the
last one succeeds.

Hm, when are logs important for CompilerWarnings? I don't think we even
collect any? Using a different builddir for the "sibling" tests (i.e. the two
gcc and the two clang tests) would increase the times a bit because we'd
regenerate the bison files etc.

I guess it'll look a bit cleaner to use a build-gcc and a build-clang, just to
get rid of the irregularity of needing that rm -rf.

The build logs are important when hacking on .cirrus.yml itself.

You're right that we don't normally save logs for CompilerWarnings; one or
another (unpublished) patch of mine adds that, and then also needed to change
to use separate dirs in order to debug building while experimenting with your
patch to use meson.

--
Justin

#372Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#371)
Re: [RFC] building postgres with meson - v13

On Sun, Oct 02, 2022 at 01:38:37PM -0500, Justin Pryzby wrote:

On Sun, Oct 02, 2022 at 11:05:30AM -0700, Andres Freund wrote:

Also, you wrote "rm -fr build" between building for gcc and clang, but
since they run in an "always" block, it'd be better to use separate
dirs, to allow seeing logs for the the all (failed) tasks, in case the
last one succeeds.

Hm, when are logs important for CompilerWarnings? I don't think we even
collect any? Using a different builddir for the "sibling" tests (i.e. the two
gcc and the two clang tests) would increase the times a bit because we'd
regenerate the bison files etc.

I guess it'll look a bit cleaner to use a build-gcc and a build-clang, just to
get rid of the irregularity of needing that rm -rf.

The build logs are important when hacking on .cirrus.yml itself.

You're right that we don't normally save logs for CompilerWarnings; one or
another (unpublished) patch of mine adds that, and then also needed to change
to use separate dirs in order to debug building while experimenting with your
patch to use meson.

FYI, this is what led me to make that suggestion.

https://cirrus-ci.com/task/5920691940753408

I had a patch laying around to change the "compiler warnings" task to
use debian "testing", which seems to have added some new flags in -Wall,
which caused me to add (for now) some compiler flags like -Wno-error=...

But when I added them to the task's CFLAGS, it broke "clang" (which
doesn't support the warnings) in an obscure way[0]Header "uuid/uuid.h" has symbol "uuid_generate" with dependency uuid: NO, and no logs
available to show why.

[0]: Header "uuid/uuid.h" has symbol "uuid_generate" with dependency uuid: NO
uuid: NO

So, I think it's worth reporting meson's build logs, even though no
tests are run here.

--
Justin

#373samay sharma
smilingsamay@gmail.com
In reply to: Peter Eisentraut (#353)
Re: [RFC] building postgres with meson - v13

Hi,

On Mon, Sep 26, 2022 at 6:02 AM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:

On 24.09.22 20:09, Andres Freund wrote:

On 2022-09-24 13:52:29 -0400, Tom Lane wrote:

... btw, shouldn't the CF entry [1] get closed now?

Unfortunately not - there's quite a few followup patches that haven't

been

[fully] reviewed and thus not applied yet.

Here is some review of the remaining ones (might not match exactly what
you attached, I was working off your branch):

9f789350a7a7 meson: ci: wip: move compilerwarnings task to meson

This sounds reasonable to me in principle, but I haven't followed the
cirrus stuff too closely, and it doesn't say why it's "wip". Perhaps
others could take a closer look.

ccf20a68f874 meson: ci: Add additional CI coverage

IIUC, this is just for testing your branch, not meant for master?

02d84c21b227 meson: prereq: win: remove date from version number in
win32ver.rc

do it

5c42b3e7812e meson: WIP: Add some of the windows resource files

What is the thinking on this now? What does this change over the
current state?

9bc60bccfd10 meson: Add support for relative rpaths, fixing tests on
MacOS w/ SIP

I suggest a separate thread and/or CF entry for this. There have been
various attempts to deal with SIP before, with varying results. This
is not part of the meson transition as such.

9f5be26c1215 meson: Add docs for building with meson

I do like the overall layout of this.

The "Supported Platforms" section should be moved back to near the end
of the chapter. I don't see a reason to move it forward, at least
none that is related to the meson issue.

Agreed that it's unrelated to meson. However, I think it's better to move
it in the front as it's generally useful to know if your platform is
supported before you start performing the installation steps and get stuck
somewhere.

Do you think I should submit that as a separate commit in the same
patch-set or just move it out to a completely different patch submission?

The changes to the "Getting the Source" section are also not
appropriate for this patch.

Given that many developers are now using Git for downloading the source
code, I think it makes sense to be in the Getting the source section. Also,
meson today doesn't cleanly build via the tarballs. Hence, I added it to
the section (and patchset).

Do you think I should move this to a different patch?

In the section "Building and Installation with meson":

- Remove the "git clone" stuff.

- The "Running tests" section should be moved to Chapter 33. Regression
Tests.

The autoconf / make section also has a small section on how to run the
regression tests. The "Running tests" section is meant to the be equivalent
of that for meson (i.e. brief overview). I do intend to add a detailed
section to Chapter 33 with more info on how to interpret test results etc.
Do you think the current section is too verbose for where it is?

Show quoted text

Some copy-editing will probably be suitable, but I haven't focused on
that yet.

9c00d355d0e9 meson: Add PGXS compatibility

This looks like a reasonable direction to me. How complete is it? It
says it works for some extensions but not others. How do we define
the target line here?

3fd5e13dcad3 meson: Add postgresql-extension.pc for building extension
libraries

Separate thread for this as well. This is good and important, but we
must also add it to the make build.

4b5bfa1c19aa meson: Add LLVM bitcode emission

still in progress

eb40f6e53104 meson: Add support for building with precompiled headers

Any reason not to enable this by default? The benefits on non-Windows
appear to be less dramatic, but they are not zero. Might be better to
enable it consistently so that for example any breakage is easier
caught.

377bfdea6042 meson: Add xmllint/xsltproc wrapper script to handle
dependencies automatically

Is this part of the initial transition, required for correctness, or
is it an optional optimization? Could use more explanation. Maybe
move to separate thread also?

#374Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#368)
4 attachment(s)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-30 15:35:26 -0700, Andres Freund wrote:

I was thinking of starting at least the following threads / CF entries once a
few of the remaining things are resolved:

- PGXS compatibility, plus related autoconf simplification patches
- pkg-config files for building postgres extensions
- relative rpath support

I am a bit on the fence about whether it's worth doing so for:

- installcheck equivalent
- precompiled header support (would like it soon, because it reduces
compile-test times substantially)

and, for no really tangible reason, considered
- resource files generation
- docs
- docs dependency

to be part of this thread / CF entry.

Now that I think about it more, I am inclined to also push the docs changes to
a new thread, just for wider visibility.

I think it'd be ok to commit the docs dependency fix soon, without a separate
thread, as it really fixes a "build bug".

I've not yet posted these different threads, but I've split up the meson tree
into subtrees corresponding to pretty much the above.

The meson tree now mainly merges those subtrees together. It still directly
contains the xml-tools dependency wrapper (to be merged soon) and the CI
changes (either later or never).

I've attached a revised version of the xml-tools dependency wrapper (0001):
Cleanups, minor error handling improvements, and bit of comment polishing. I'd
welcome review. But as it fixes a build-dependency bug / FIXME, I'm planning
to push it relatively soon otherwise.

0002 fixes libpq's .pc file (static dependencies didn't show up anymore) and
AIX compilation. AIX doesn't yet support link_whole (support was merged into
meson yesterday though). On the way it also improves comments and a bit of
generic infrastructure. The price for now is that the static libpq is built
separately from the shared one, not reusing any objects. I felt that the
complexity of reusing the objects isn't worth it for now.

Peter, it'd be great if you could have a look at 0002.

0003 mirrors the setup of libpq to the various ecpg libraries. This is a
prerequisite to adding resource files.

0004 adds the resource files

I think after that we could close the CF entry (and create a bunch of followup
entries, as discussed above). Although it somehow seems frivolous to start a
separate thread for "installcheck equivalent" :)

Greetings,

Andres Freund

Attachments:

v18-0001-meson-docs-Add-xml-lint-proc-wrapper-to-collect-.patchtext/x-diff; charset=us-asciiDownload
From b21850b49a9dd9f4a60eb9c243ba64be61e7e9c0 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 3 Oct 2022 18:26:24 -0700
Subject: [PATCH v18 01/22] meson: docs: Add xml{lint,proc} wrapper to collect
 dependencies

meson/ninja do not support specifying dependencies via globs (as those make it
significantly more expensive to check the current build state). Instead
targets should emit dependency information when running that then can be
cheaply re-checked during future builds.

To handle xmllint and xsltproc invocations in the docs, add and use a wrapper
that uses --load-trace to collect dependency information.

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/c5736f70-bb6d-8d25-e35c-e3d886e4e905@enterprisedb.com
---
 doc/src/sgml/meson.build          | 41 ++++++++++++++++-------
 doc/src/sgml/xmltools_dep_wrapper | 54 +++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 11 deletions(-)
 create mode 100644 doc/src/sgml/xmltools_dep_wrapper

diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
index ba2a261e7a4..65fd6131344 100644
--- a/doc/src/sgml/meson.build
+++ b/doc/src/sgml/meson.build
@@ -2,7 +2,7 @@ docs = []
 alldocs = []
 doc_generated = []
 
-xmllint = find_program(get_option('XMLLINT'), native: true, required: false)
+xmllint_bin = find_program(get_option('XMLLINT'), native: true, required: false)
 
 
 version_sgml = configure_file(
@@ -60,14 +60,23 @@ doc_generated += custom_target('keywords-table.sgml',
 )
 
 # For everything else we need at least xmllint
-if not xmllint.found()
+if not xmllint_bin.found()
   subdir_done()
 endif
 
 pandoc = find_program('pandoc', native: true, required: false)
-xsltproc = find_program(get_option('XSLTPROC'), native: true, required: false)
+xsltproc_bin = find_program(get_option('XSLTPROC'), native: true, required: false)
 fop = find_program('fop', native: true, required: false)
 
+xmltools_wrapper = [
+  python, files('xmltools_dep_wrapper'),
+  '--targetname', '@OUTPUT@', '--depfile', '@DEPFILE@'
+]
+
+xmllint = xmltools_wrapper + [
+  '--tool', xmllint_bin, '--',
+]
+
 # Run validation only once, common to all subsequent targets.  While
 # we're at it, also resolve all entities (that is, copy all included
 # files into one big file).  This helps tools that don't understand
@@ -75,6 +84,7 @@ fop = find_program('fop', native: true, required: false)
 postgres_full_xml = custom_target('postgres-full.xml',
   input: 'postgres.sgml',
   output: 'postgres-full.xml',
+  depfile: 'postgres-full.xml.d',
   command: [xmllint, '--noent', '--valid', '--path', '@OUTDIR@', '-o', '@OUTPUT@', '@INPUT@'],
   depends: doc_generated,
   build_by_default: false,
@@ -86,18 +96,20 @@ alldocs += postgres_full_xml
 #
 # Full documentation as html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   xsltproc_flags = [
     '--stringparam', 'pg.version', pg_version,
     '--param', 'website.stylesheet', '1'
   ]
 
+  xsltproc = xmltools_wrapper + [
+    '--tool', xsltproc_bin, '--',
+  ]
 
-  # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
-  # depfile
   html = custom_target('html',
     input: ['stylesheet.xsl', postgres_full_xml],
     output: 'html',
+    depfile: 'html.d',
     depends: doc_generated,
     command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -110,6 +122,7 @@ if xsltproc.found()
   html_help = custom_target('html_help',
     input: ['stylesheet-hh.xsl', postgres_full_xml],
     output: 'htmlhelp',
+    depfile: 'htmlhelp.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -121,6 +134,7 @@ if xsltproc.found()
   postgres_html = custom_target('postgres.html',
     input: ['stylesheet-html-nochunk.xsl', postgres_full_xml],
     output: 'postgres.html',
+    depfile: 'postgres.html.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -144,10 +158,11 @@ endif
 #
 # INSTALL in html, text
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   install_xml = custom_target('INSTALL.xml',
     input: ['standalone-profile.xsl', 'standalone-install.xml'],
     output: 'INSTALL.xml',
+    depfile: 'INSTALL.xml.d',
     depends: doc_generated + [postgres_full_xml],
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
     build_by_default: false,
@@ -155,6 +170,7 @@ if xsltproc.found()
   install_html = custom_target('INSTALL.html',
     input: ['stylesheet-text.xsl', install_xml],
     output: 'INSTALL.html',
+    depfile: 'INSTALL.html.d',
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
@@ -177,11 +193,12 @@ endif
 #
 # Man pages
 #
-if xsltproc.found()
+if xsltproc_bin.found()
   # FIXME: implement / consider sqlmansectnum logic
   man = custom_target('man',
     input: ['stylesheet-man.xsl', postgres_full_xml],
     output: ['man1', 'man3', 'man7'],
+    depfile: 'man.d',
     depends: doc_generated,
     command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
@@ -195,17 +212,19 @@ endif
 #
 # Full documentation as PDF
 #
-if fop.found() and xsltproc.found()
+if fop.found() and xsltproc_bin.found()
   xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
 
   foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
     postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+    postgres_x_fo_dep = 'postgres-@0@.fo.d'.format(format)
     postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
 
     postgres_x_fo = custom_target(postgres_x_fo_f,
       input: ['stylesheet-fo.xsl', postgres_full_xml],
-      output: [postgres_x_fo_f],
+      output: postgres_x_fo_f,
       depends: doc_generated,
+      depfile: postgres_x_fo_dep,
       command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
                 '--stringparam', 'paper.type', detail,
                 '-o', '@OUTPUT@', '@INPUT@'],
@@ -230,7 +249,7 @@ endif
 # This was previously implemented using dbtoepub - but that doesn't seem to
 # support running in build != source directory (i.e. VPATH builds already
 # weren't supported).
-if pandoc.found() and xsltproc.found()
+if pandoc.found() and xsltproc_bin.found()
   postgres_epub = custom_target('postgres.epub',
     input: postgres_full_xml,
     output: 'postgres.epub',
diff --git a/doc/src/sgml/xmltools_dep_wrapper b/doc/src/sgml/xmltools_dep_wrapper
new file mode 100644
index 00000000000..dd96f784268
--- /dev/null
+++ b/doc/src/sgml/xmltools_dep_wrapper
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+
+# A small wrapper around xmllint and xsltproc that collects dependency
+# information (in gcc's format) using --load-trace.
+
+import argparse
+import re
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(
+    description='generate dependency file for docs')
+
+parser.add_argument('--targetname', type=str, required=False, nargs='+')
+parser.add_argument('--depfile', type=str, required=False)
+parser.add_argument('--tool', type=str, required=True)
+parser.add_argument('flags', nargs='*')
+
+args = parser.parse_args()
+
+if args.depfile:
+    command = [args.tool, '--load-trace'] + args.flags
+
+    # list of targets that depend on the loaded files we see via --load-trace
+    line_start = ' '.join(args.targetname) + ': '
+
+    # --load-trace flag displays all the documents loaded during the processing
+    # to stderr
+    res = subprocess.run(command, stderr=subprocess.PIPE,
+                         universal_newlines=True)
+
+    line_re = re.compile('^Loaded URL="([^"]+)"')
+    with open(args.depfile, 'w') as f:
+        for line in res.stderr.splitlines():
+            m = re.match(line_re, line)
+
+            # continue to show errors
+            if m is None:
+                print(line, file=sys.stderr)
+                continue
+            # Absolute paths are printed as file://, relative paths as-is. We
+            # don't care about http://, as a) those will be printed even if
+            # resolved locally b) we couldn't have a dependency anyway.
+            fname = m.group(1)
+            if fname.startswith('http://'):
+                continue
+            if fname.startswith('file://'):
+                fname = fname.split('file://')[1]
+            f.write(line_start + fname + '\n')
+else:
+    command = [args.tool] + args.flags
+    res = subprocess.run(command)
+
+exit(res.returncode)
-- 
2.37.3.542.gdd3f6c4cae

v18-0002-meson-libpq-Revise-static-shared-library-setup.patchtext/x-diff; charset=us-asciiDownload
From 984bf68207a97c7bc055f3e2bbd79fd39918bd1b Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 29 Sep 2022 21:37:48 -0700
Subject: [PATCH v18 02/22] meson: libpq: Revise static / shared library setup

Improvements:
- we don't need -DFRONTEND for libpq anymore since 1d77afefbd1
- the .pc file contents for a static libpq were wrong (referencing
  {pgport, common}_shlib)
- incidentally fixes meson not supporting link_whole on AIX yet
- added explanatory comments

Previously I tried to avoid building libpq's sources twice, once for the
static and once for the shared library. We could still do so, but it's not
clear that it's worth the complication.
---
 src/interfaces/libpq/meson.build | 28 ++++++++++++++++++----------
 meson.build                      | 23 ++++++++++++++++++-----
 2 files changed, 36 insertions(+), 15 deletions(-)

diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bc047e00d62..34cb58c2617 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -39,26 +39,33 @@ export_file = custom_target('libpq.exports',
 
 # port needs to be in include path due to pthread-win32.h
 libpq_inc = include_directories('.', '../../port')
+libpq_c_args = ['-DSO_MAJOR_VERSION=5']
 
+# Not using both_libraries() here as
+# 1) resource files should only be in the shared library
+# 2) we want the .pc file to include a dependency to {pgport,common}_static for
+#    libpq_st, and {pgport,common}_shlib for libpq_sh
+#
+# We could try to avoid building the source files twice, but it probably adds
+# more complexity than its worth (AIX doesn't support link_whole yet, reusing
+# object files requires also linking to the library on windows or breaks
+# precompiled headers).
 libpq_st = static_library('libpq',
   libpq_sources,
-  pic: true,
-  include_directories: [libpq_inc, postgres_inc],
-  c_args: ['-DSO_MAJOR_VERSION=5'],
-  dependencies: libpq_deps,
+  include_directories: [libpq_inc],
+  c_args: libpq_c_args,
+  dependencies: [frontend_stlib_code, libpq_deps],
   kwargs: default_lib_args,
 )
 
-# not using both_libraries here, causes problems with precompiled headers and
-# resource files with msbuild
 libpq_so = shared_library('libpq',
-  dependencies: libpq_deps,
+  libpq_sources,
   include_directories: [libpq_inc, postgres_inc],
-  c_args: ['-DSO_MAJOR_VERSION=5'],
-  link_whole: libpq_st,
+  c_args: libpq_c_args,
   version: '5.' + pg_version_major.to_string(),
   soversion: host_system != 'windows' ? '5' : '',
   darwin_versions: ['5', '5.' + pg_version_major.to_string()],
+  dependencies: [frontend_shlib_code, libpq_deps],
   link_depends: export_file,
   link_args: export_fmt.format(export_file.full_path()),
   kwargs: default_lib_args,
@@ -70,10 +77,11 @@ libpq = declare_dependency(
 )
 
 pkgconfig.generate(
-  libpq_so,
   name: 'libpq',
   description: 'PostgreSQL libpq library',
   url: pg_url,
+  libraries: libpq,
+  libraries_private: [frontend_stlib_code, libpq_deps],
 )
 
 install_headers(
diff --git a/meson.build b/meson.build
index 253994931e8..c709643fe5e 100644
--- a/meson.build
+++ b/meson.build
@@ -2619,17 +2619,29 @@ backend_common_code = declare_dependency(
 
 subdir('src/common')
 
-frontend_shlib_code = declare_dependency(
-  compile_args: ['-DFRONTEND'],
-  include_directories: [postgres_inc],
+# all shared libraries should depend on shlib_code
+shlib_code = declare_dependency(
   link_args: ldflags_sl,
-  link_with: [pgport_shlib, common_shlib],
+)
+
+# all static libraries not part of the backend should depend on this
+frontend_stlib_code = declare_dependency(
+  include_directories: [postgres_inc],
+  link_with: [common_static, pgport_static],
   sources: generated_headers,
   dependencies: [os_deps, libintl],
 )
 
+# all shared libraries not part of the backend should depend on this
+frontend_shlib_code = declare_dependency(
+  include_directories: [postgres_inc],
+  link_with: [common_shlib, pgport_shlib],
+  sources: generated_headers,
+  dependencies: [shlib_code, os_deps, libintl],
+)
+
+# Dependencies both for static and shared libpq
 libpq_deps += [
-  frontend_shlib_code,
   thread_dep,
 
   gssapi,
@@ -2642,6 +2654,7 @@ subdir('src/interfaces/libpq')
 # fe_utils depends on libpq
 subdir('src/fe_utils')
 
+# for frontend binaries
 frontend_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [fe_utils, common_static, pgport_static],
-- 
2.37.3.542.gdd3f6c4cae

v18-0003-meson-ecpg-Split-definition-of-static-and-shared.patchtext/x-diff; charset=us-asciiDownload
From e5017149184a50c3131aeaec9c4b0cd2b7279c27 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 29 Sep 2022 21:39:14 -0700
Subject: [PATCH v18 03/22] meson: ecpg: Split definition of static and shared
 libraries

Required for correct resource file generation, as the resource files should
only be added to the shared library.

This also fixes a bunch of issues in the .pc files.

Previously I tried to avoid building sources twice, once for the static and
once for the shared libraries. We could still do so, but it's not clear that
it's worth the complication.

Discussion: https://postgr.es/m/20220927011951.j3h4o7n6bhf7dwau@awork3.anarazel.de
---
 src/interfaces/ecpg/compatlib/meson.build  | 39 +++++++++++++++++-----
 src/interfaces/ecpg/ecpglib/meson.build    | 33 +++++++++++++-----
 src/interfaces/ecpg/pgtypeslib/meson.build | 29 ++++++++++++----
 src/interfaces/ecpg/test/meson.build       |  2 +-
 4 files changed, 78 insertions(+), 25 deletions(-)

diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 5887cb92b52..b803000c708 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -1,11 +1,29 @@
-export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
-
-ecpg_compat = both_libraries('libecpg_compat',
+ecpg_compat_sources = files(
   'informix.c',
-  include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
-  c_args: ['-DSO_MAJOR_VERSION=3'],
-  dependencies: [frontend_code, thread_dep],
-  link_with: [ecpglib, ecpg_pgtypes],
+)
+ecpg_compat_so_sources = [] # for shared lib, in addition to the above
+
+ecpg_compat_inc = [include_directories('.'), ecpg_inc, libpq_inc]
+ecpg_compat_c_args = ['-DSO_MAJOR_VERSION=3']
+export_file = custom_target('libecpg_compat.exports', kwargs: gen_export_kwargs)
+
+# see src/interfaces/libpq/meson.build
+ecpg_compat_st = static_library('libecpg_compat',
+  ecpg_compat_sources,
+  include_directories: ecpg_compat_inc,
+  c_args: ecpg_compat_c_args,
+  dependencies: [frontend_stlib_code, thread_dep],
+  link_with: [ecpglib_st, ecpg_pgtypes_st],
+  kwargs: default_lib_args,
+)
+ecpg_targets += ecpg_compat_st
+
+ecpg_compat_so = shared_library('libecpg_compat',
+  ecpg_compat_sources + ecpg_compat_so_sources,
+  include_directories: ecpg_compat_inc,
+  c_args: ecpg_compat_c_args,
+  dependencies: [frontend_shlib_code, thread_dep],
+  link_with: [ecpglib_so, ecpg_pgtypes_so],
   soversion: host_system != 'windows' ? '3' : '',
   darwin_versions: ['3', '3.' + pg_version_major.to_string()],
   version: '3.' + pg_version_major.to_string(),
@@ -13,10 +31,13 @@ ecpg_compat = both_libraries('libecpg_compat',
   link_depends: export_file,
   kwargs: default_lib_args,
 )
-ecpg_targets += [ecpg_compat.get_shared_lib(), ecpg_compat.get_static_lib()]
+ecpg_targets += ecpg_compat_so
 
 pkgconfig.generate(
-  ecpg_compat.get_shared_lib(),
+  name: 'libecpg_compat',
   description: 'PostgreSQL libecpg_compat library',
   url: pg_url,
+  libraries: ecpg_compat_so,
+  libraries_private: [frontend_stlib_code, thread_dep],
+  requires_private: ['libecpg', 'libpgtypes'],
 )
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 2da029ec8ea..6fdf019149c 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -10,15 +10,29 @@ ecpglib_sources = files(
   'sqlda.c',
   'typename.c',
 )
+ecpglib_so_sources = [] # for shared lib, in addition to the above
 
-export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+ecpglib_inc = [include_directories('.'), ecpg_inc]
+ecpglib_c_args = ['-DSO_MAJOR_VERSION=6']
+export_file = custom_target('libecpg.exports', kwargs: gen_export_kwargs)
 
-ecpglib = both_libraries('libecpg',
+# see src/interfaces/libpq/meson.build
+ecpglib_st = static_library('libecpg',
   ecpglib_sources,
-  include_directories: ['.', ecpg_inc, postgres_inc],
-  c_args: ['-DSO_MAJOR_VERSION=6'],
-  dependencies: [frontend_code, libpq, thread_dep],
-  link_with: [ecpg_pgtypes],
+  include_directories: ecpglib_inc,
+  c_args: ecpglib_c_args,
+  dependencies: [frontend_stlib_code, thread_dep, libpq],
+  link_with: [ecpg_pgtypes_st],
+  kwargs: default_lib_args,
+)
+ecpg_targets += ecpglib_st
+
+ecpglib_so = shared_library('libecpg',
+  ecpglib_sources + ecpglib_so_sources,
+  include_directories: ecpglib_inc,
+  c_args: ecpglib_c_args,
+  dependencies: [frontend_shlib_code, libpq, thread_dep],
+  link_with: ecpg_pgtypes_so,
   soversion: host_system != 'windows' ? '6' : '',
   darwin_versions: ['6', '6.' + pg_version_major.to_string()],
   version: '6.' + pg_version_major.to_string(),
@@ -26,12 +40,15 @@ ecpglib = both_libraries('libecpg',
   link_depends: export_file,
   kwargs: default_lib_args,
 )
-ecpg_targets += [ecpglib.get_shared_lib(), ecpglib.get_static_lib()]
+ecpg_targets += ecpglib_so
 
 pkgconfig.generate(
-  ecpglib.get_shared_lib(),
+  name: 'libecpg',
   description: 'PostgreSQL libecpg library',
   url: pg_url,
+  libraries: ecpglib_so,
+  libraries_private: [frontend_shlib_code, thread_dep],
+  requires_private: ['libpgtypes', 'libpq'],
 )
 
 subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 96489d9f1d7..8e5d235810a 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -6,14 +6,27 @@ ecpg_pgtypes_sources = files(
   'numeric.c',
   'timestamp.c',
 )
+ecpg_pgtypes_so_sources = [] # for shared lib, in addition to the above
 
-export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+export_file = custom_target('libpgtypes.exports', kwargs: gen_export_kwargs)
+ecpg_pgtypes_inc = [include_directories('.'), ecpg_inc]
+ecpg_pgtypes_c_args = ['-DSO_MAJOR_VERSION=3']
 
-ecpg_pgtypes = both_libraries('libpgtypes',
+# see src/interfaces/libpq/meson.build
+ecpg_pgtypes_st = static_library('libpgtypes',
   ecpg_pgtypes_sources,
-  include_directories: ['.', ecpg_inc, postgres_inc],
-  c_args: ['-DSO_MAJOR_VERSION=3'],
-  dependencies: [frontend_code],
+  include_directories: ecpg_pgtypes_inc,
+  c_args: ecpg_pgtypes_c_args,
+  dependencies: frontend_stlib_code,
+  kwargs: default_lib_args,
+)
+ecpg_targets += ecpg_pgtypes_st
+
+ecpg_pgtypes_so = shared_library('libpgtypes',
+  ecpg_pgtypes_sources + ecpg_pgtypes_so_sources,
+  include_directories: ecpg_pgtypes_inc,
+  c_args: ecpg_pgtypes_c_args,
+  dependencies: frontend_shlib_code,
   version: '3.' + pg_version_major.to_string(),
   soversion: host_system != 'windows' ? '3' : '',
   darwin_versions: ['3', '3.' + pg_version_major.to_string()],
@@ -21,10 +34,12 @@ ecpg_pgtypes = both_libraries('libpgtypes',
   link_depends: export_file,
   kwargs: default_lib_args,
 )
-ecpg_targets += [ecpg_pgtypes.get_shared_lib(), ecpg_pgtypes.get_static_lib()]
+ecpg_targets += ecpg_pgtypes_so
 
 pkgconfig.generate(
-  ecpg_pgtypes.get_shared_lib(),
+  name: 'libpgtypes',
   description: 'PostgreSQL libpgtypes library',
   url: pg_url,
+  libraries: ecpg_pgtypes_so,
+  libraries_private: [frontend_stlib_code],
 )
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index f0ace641f0c..8904aa7fd90 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -22,7 +22,7 @@ testprep_targets += pg_regress_ecpg
 ecpg_test_exec_kw = {
   'dependencies': [frontend_code, libpq],
   'include_directories': [ecpg_inc],
-  'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+  'link_with': [ecpglib_so, ecpg_compat_so, ecpg_pgtypes_so],
   'build_by_default': false,
   'install': false,
 }
-- 
2.37.3.542.gdd3f6c4cae

v18-0004-meson-Add-windows-resource-files.patchtext/x-diff; charset=us-asciiDownload
From 151755ec9b348f8ccfa2e473d4ffdd81da4fc1f2 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 1 Oct 2022 11:54:05 -0700
Subject: [PATCH v18 04/22] meson: Add windows resource files

The generated resource files aren't exactly the same ones as the old
buildsystems generate. Previously "InternalName" and "OriginalFileName" were
mostly wrong / not set (despite being required), but that was hard to fix in
at least the make build. Additionally, the meson build falls back to a
"auto-generated" description when not set, and doesn't set it in a few cases -
unlikely that anybody looks at these descriptions in detail.

Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
---
 src/backend/jit/llvm/meson.build              |   6 +
 .../replication/libpqwalreceiver/meson.build  |   6 +
 src/backend/replication/pgoutput/meson.build  |   6 +
 src/backend/snowball/meson.build              |   6 +
 .../utils/mb/conversion_procs/meson.build     |   9 +-
 src/bin/initdb/meson.build                    |   6 +
 src/bin/pg_amcheck/meson.build                |   8 +-
 src/bin/pg_archivecleanup/meson.build         |  12 +-
 src/bin/pg_basebackup/meson.build             |  38 ++++++-
 src/bin/pg_checksums/meson.build              |  12 +-
 src/bin/pg_config/meson.build                 |  12 +-
 src/bin/pg_controldata/meson.build            |  12 +-
 src/bin/pg_ctl/meson.build                    |  12 +-
 src/bin/pg_dump/meson.build                   |  18 +++
 src/bin/pg_resetwal/meson.build               |  12 +-
 src/bin/pg_rewind/meson.build                 |   6 +
 src/bin/pg_test_fsync/meson.build             |  10 +-
 src/bin/pg_test_timing/meson.build            |  12 +-
 src/bin/pg_upgrade/meson.build                |   6 +
 src/bin/pg_verifybackup/meson.build           |   6 +
 src/bin/pg_waldump/meson.build                |   6 +
 src/bin/pgbench/meson.build                   |   6 +
 src/bin/pgevent/meson.build                   |   6 +
 src/bin/psql/meson.build                      |   6 +
 src/bin/scripts/meson.build                   |  10 +-
 src/interfaces/libpq/meson.build              |   6 +-
 src/interfaces/libpq/test/meson.build         |  25 ++++-
 src/pl/plperl/meson.build                     |   7 ++
 src/pl/plpgsql/src/meson.build                |   6 +
 src/pl/plpython/meson.build                   |   6 +
 src/pl/tcl/meson.build                        |   6 +
 contrib/adminpack/meson.build                 |  12 +-
 contrib/amcheck/meson.build                   |  17 ++-
 contrib/auth_delay/meson.build                |  12 +-
 contrib/auto_explain/meson.build              |  12 +-
 contrib/basebackup_to_shell/meson.build       |   6 +
 contrib/basic_archive/meson.build             |   6 +
 contrib/bloom/meson.build                     |   6 +
 contrib/bool_plperl/meson.build               |   6 +
 contrib/btree_gin/meson.build                 |  12 +-
 contrib/btree_gist/meson.build                |   6 +
 contrib/citext/meson.build                    |   6 +
 contrib/cube/meson.build                      |   6 +
 contrib/dblink/meson.build                    |   6 +
 contrib/dict_int/meson.build                  |  12 +-
 contrib/dict_xsyn/meson.build                 |  12 +-
 contrib/earthdistance/meson.build             |  12 +-
 contrib/file_fdw/meson.build                  |  12 +-
 contrib/fuzzystrmatch/meson.build             |  16 ++-
 contrib/hstore/meson.build                    |  24 ++--
 contrib/hstore_plperl/meson.build             |   6 +
 contrib/hstore_plpython/meson.build           |   6 +
 contrib/intarray/meson.build                  |   6 +
 contrib/isn/meson.build                       |   6 +
 contrib/jsonb_plperl/meson.build              |   6 +
 contrib/jsonb_plpython/meson.build            |   6 +
 contrib/lo/meson.build                        |   6 +
 contrib/ltree/meson.build                     |   6 +
 contrib/ltree_plpython/meson.build            |   6 +
 contrib/oid2name/meson.build                  |  12 +-
 contrib/old_snapshot/meson.build              |   6 +
 contrib/pageinspect/meson.build               |   6 +
 contrib/passwordcheck/meson.build             |   6 +
 contrib/pg_buffercache/meson.build            |  14 ++-
 contrib/pg_freespacemap/meson.build           |  14 ++-
 contrib/pg_prewarm/meson.build                |  16 ++-
 contrib/pg_stat_statements/meson.build        |  12 +-
 contrib/pg_surgery/meson.build                |  14 ++-
 contrib/pg_trgm/meson.build                   |  20 +++-
 contrib/pg_visibility/meson.build             |  14 ++-
 contrib/pg_walinspect/meson.build             |   6 +
 contrib/pgcrypto/meson.build                  |   6 +
 contrib/pgrowlocks/meson.build                |  14 ++-
 contrib/pgstattuple/meson.build               |  18 ++-
 contrib/postgres_fdw/meson.build              |   6 +
 contrib/seg/meson.build                       |   6 +
 contrib/sepgsql/meson.build                   |   6 +
 contrib/spi/meson.build                       |  48 +++++++-
 contrib/sslinfo/meson.build                   |  14 ++-
 contrib/tablefunc/meson.build                 |  14 ++-
 contrib/tcn/meson.build                       |  14 ++-
 contrib/test_decoding/meson.build             |   6 +
 contrib/tsm_system_rows/meson.build           |  14 ++-
 contrib/tsm_system_time/meson.build           |  14 ++-
 contrib/unaccent/meson.build                  |  14 ++-
 contrib/uuid-ossp/meson.build                 |  14 ++-
 contrib/vacuumlo/meson.build                  |  12 +-
 contrib/xml2/meson.build                      |  16 ++-
 src/interfaces/ecpg/compatlib/meson.build     |   6 +
 src/interfaces/ecpg/ecpglib/meson.build       |   6 +
 src/interfaces/ecpg/pgtypeslib/meson.build    |   6 +
 src/interfaces/ecpg/preproc/meson.build       |   6 +
 src/interfaces/ecpg/test/meson.build          |   5 +
 src/test/isolation/meson.build                |  13 +++
 src/test/modules/delay_execution/meson.build  |  13 ++-
 src/test/modules/dummy_index_am/meson.build   |  13 ++-
 src/test/modules/dummy_seclabel/meson.build   |  13 ++-
 src/test/modules/libpq_pipeline/meson.build   |  14 ++-
 src/test/modules/plsample/meson.build         |  13 ++-
 src/test/modules/spgist_name_ops/meson.build  |  13 ++-
 .../ssl_passphrase_callback/meson.build       |  13 ++-
 src/test/modules/test_bloomfilter/meson.build |  13 ++-
 src/test/modules/test_ddl_deparse/meson.build |  13 ++-
 .../modules/test_ginpostinglist/meson.build   |  13 ++-
 src/test/modules/test_integerset/meson.build  |  13 ++-
 src/test/modules/test_lfind/meson.build       |  13 ++-
 src/test/modules/test_oat_hooks/meson.build   |  13 ++-
 src/test/modules/test_parser/meson.build      |  13 ++-
 src/test/modules/test_predtest/meson.build    |  13 ++-
 src/test/modules/test_rbtree/meson.build      |  13 ++-
 src/test/modules/test_regex/meson.build       |  13 ++-
 src/test/modules/test_rls_hooks/meson.build   |  13 ++-
 src/test/modules/test_shm_mq/meson.build      |  19 +++-
 src/test/modules/worker_spi/meson.build       |  15 ++-
 src/test/regress/meson.build                  |   6 +
 meson.build                                   |  59 ++++++++++
 src/timezone/meson.build                      |   6 +
 src/tools/rcgen                               | 105 ++++++++++++++++++
 118 files changed, 1292 insertions(+), 131 deletions(-)
 create mode 100755 src/tools/rcgen

diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index 6ae7aaad015..25c5618e8a3 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -20,6 +20,12 @@ llvmjit_sources += files(
   'llvmjit_expr.c',
 )
 
+if host_system == 'windows'
+  llvmjit_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'llvmjit',
+    '--FILEDESC', 'llvmjit - JIT using LLVM',])
+endif
+
 llvmjit = shared_module('llvmjit',
   llvmjit_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
index 3fc786c80a0..4c653a05d36 100644
--- a/src/backend/replication/libpqwalreceiver/meson.build
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -2,6 +2,12 @@ libpqwalreceiver_sources = files(
   'libpqwalreceiver.c',
 )
 
+if host_system == 'windows'
+  libpqwalreceiver_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pqwalreceiver',
+    '--FILEDESC', 'libpqwalreceiver - receive WAL during streaming replication',])
+endif
+
 libpqwalreceiver = shared_module('pqwalreceiver',
   libpqwalreceiver_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
index ab956361a62..5df27d7b764 100644
--- a/src/backend/replication/pgoutput/meson.build
+++ b/src/backend/replication/pgoutput/meson.build
@@ -2,6 +2,12 @@ pgoutput_sources = files(
   'pgoutput.c',
 )
 
+if host_system == 'windows'
+  pgoutput_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgoutput',
+    '--FILEDESC', 'pgoutput - standard logical replication output plugin',])
+endif
+
 pgoutput = shared_module('pgoutput',
   pgoutput_sources,
   kwargs: pg_mod_args,
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
index 8c6f685cb32..974401d187e 100644
--- a/src/backend/snowball/meson.build
+++ b/src/backend/snowball/meson.build
@@ -58,6 +58,12 @@ dict_snowball_sources += files(
 # see comment in src/include/snowball/header.h
 stemmer_inc = include_directories('../../include/snowball')
 
+if host_system == 'windows'
+  dict_snowball_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_snowball',
+    '--FILEDESC', 'snowball - natural language stemmers',])
+endif
+
 dict_snowball = shared_module('dict_snowball',
   dict_snowball_sources,
   kwargs: pg_mod_args + {
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
index 1bc971d1945..1c18f2ac85a 100644
--- a/src/backend/utils/mb/conversion_procs/meson.build
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -29,8 +29,15 @@ encodings = {
 }
 
 foreach encoding, sources : encodings
+  source_files = files(sources)
+
+  if host_system == 'windows'
+    source_files += rc_lib_gen.process(win32ver_rc, extra_args: [
+      '--NAME', encoding])
+  endif
+
   backend_targets += shared_module(encoding,
-    sources,
+    source_files,
     kwargs: pg_mod_args,
   )
 endforeach
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 9f213274d2f..6ced9a31b80 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -7,6 +7,12 @@ initdb_sources += timezone_localtime_source
 
 #fixme: reimplement libpq_pgport logic
 
+if host_system == 'windows'
+  initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'initdb',
+    '--FILEDESC', 'initdb - initialize a new database cluster',])
+endif
+
 initdb = executable('initdb',
   initdb_sources,
   include_directories: [timezone_inc],
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
index 8e197eba5f3..25f5e7a0948 100644
--- a/src/bin/pg_amcheck/meson.build
+++ b/src/bin/pg_amcheck/meson.build
@@ -1,7 +1,13 @@
 pg_amcheck_sources = files(
-  'pg_amcheck.c'
+  'pg_amcheck.c',
 )
 
+if host_system == 'windows'
+  pg_amcheck_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_amcheck',
+    '--FILEDESC', 'pg_amcheck - detect corruption within database relations',])
+endif
+
 pg_amcheck = executable('pg_amcheck',
   pg_amcheck_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
index 87a0d980c4f..aaa2e76977f 100644
--- a/src/bin/pg_archivecleanup/meson.build
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -1,5 +1,15 @@
+pg_archivecleanup_sources = files(
+  'pg_archivecleanup.c',
+)
+
+if host_system == 'windows'
+  pg_archivecleanup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_archivecleanup',
+    '--FILEDESC', 'pg_archivecleanup - cleans archive when used with streaming replication',])
+endif
+
 pg_archivecleanup = executable('pg_archivecleanup',
-  ['pg_archivecleanup.c'],
+  pg_archivecleanup_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index d26fed9cd8a..2c934e0c26e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -17,24 +17,56 @@ pg_basebackup_common = static_library('libpg_basebackup_common',
   kwargs: internal_lib_args,
 )
 
-pg_basebackup = executable('pg_basebackup',
+pg_basebackup_sources = files(
   'pg_basebackup.c',
+)
+
+if host_system == 'windows'
+  pg_basebackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_basebackup',
+    '--FILEDESC', 'pg_basebackup - streaming WAL and backup receivers',])
+endif
+
+pg_basebackup = executable('pg_basebackup',
+  pg_basebackup_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_basebackup
 
-pg_receivewal = executable('pg_receivewal',
+
+pg_receivewal_sources = files(
   'pg_receivewal.c',
+)
+
+if host_system == 'windows'
+  pg_receivewal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_receivewal',
+    '--FILEDESC', 'pg_receivewal - streaming WAL and backup receivers',])
+endif
+
+pg_receivewal = executable('pg_receivewal',
+  pg_receivewal_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
 )
 bin_targets += pg_receivewal
 
-pg_recvlogical = executable('pg_recvlogical',
+
+pg_recvlogical_sources = files(
   'pg_recvlogical.c',
+)
+
+if host_system == 'windows'
+  pg_recvlogical_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_recvlogical',
+    '--FILEDESC', 'pg_recvlogical - streaming WAL and backup receivers',])
+endif
+
+pg_recvlogical = executable('pg_recvlogical',
+  pg_recvlogical_sources,
   link_with: [pg_basebackup_common],
   dependencies: pg_basebackup_deps,
   kwargs: default_bin_args,
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
index ee1f367bac3..d07ebc999b3 100644
--- a/src/bin/pg_checksums/meson.build
+++ b/src/bin/pg_checksums/meson.build
@@ -1,5 +1,15 @@
+pg_checksums_sources = files(
+  'pg_checksums.c',
+)
+
+if host_system == 'windows'
+  pg_checksums_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_checksums',
+    '--FILEDESC', 'pg_checksums - verify data checksums in an offline cluster',])
+endif
+
 pg_checksums = executable('pg_checksums',
-  ['pg_checksums.c'],
+  pg_checksums_sources,
   include_directories: [timezone_inc],
   dependencies: [frontend_code],
   kwargs: default_bin_args,
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
index 0ecbf2f9d28..4be2fdc84ae 100644
--- a/src/bin/pg_config/meson.build
+++ b/src/bin/pg_config/meson.build
@@ -1,5 +1,15 @@
+pg_config_sources = files(
+  'pg_config.c',
+)
+
+if host_system == 'windows'
+  pg_config_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_config',
+    '--FILEDESC', 'pg_config - report configuration information',])
+endif
+
 pg_config = executable('pg_config',
-  ['pg_config.c'],
+  pg_config_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
index 557e672beb7..7fc239dbe65 100644
--- a/src/bin/pg_controldata/meson.build
+++ b/src/bin/pg_controldata/meson.build
@@ -1,5 +1,15 @@
+pg_controldata_sources = files(
+  'pg_controldata.c',
+)
+
+if host_system == 'windows'
+  pg_controldata_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_controldata',
+    '--FILEDESC', 'pg_controldata - reads the data from pg_control',])
+endif
+
 pg_controldata = executable('pg_controldata',
-  ['pg_controldata.c'],
+  pg_controldata_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
index 6812e73e329..96f962fa762 100644
--- a/src/bin/pg_ctl/meson.build
+++ b/src/bin/pg_ctl/meson.build
@@ -1,5 +1,15 @@
+pg_ctl_sources = files(
+  'pg_ctl.c',
+)
+
+if host_system == 'windows'
+  pg_ctl_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_ctl',
+    '--FILEDESC', 'pg_ctl - starts/stops/restarts the PostgreSQL server',])
+endif
+
 pg_ctl = executable('pg_ctl',
-  ['pg_ctl.c'],
+  pg_ctl_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 785ec094dbd..3527a25c288 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -24,6 +24,12 @@ pg_dump_sources = files(
   'pg_dump_sort.c',
 )
 
+if host_system == 'windows'
+  pg_dump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dump',
+    '--FILEDESC', 'pg_dump - backup one PostgreSQL database',])
+endif
+
 pg_dump = executable('pg_dump',
   pg_dump_sources,
   link_with: [pg_dump_common],
@@ -37,6 +43,12 @@ pg_dumpall_sources = files(
   'pg_dumpall.c',
 )
 
+if host_system == 'windows'
+  pg_dumpall_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_dumpall',
+    '--FILEDESC', 'pg_dumpall - backup PostgreSQL databases'])
+endif
+
 pg_dumpall = executable('pg_dumpall',
   pg_dumpall_sources,
   link_with: [pg_dump_common],
@@ -50,6 +62,12 @@ pg_restore_sources = files(
   'pg_restore.c',
 )
 
+if host_system == 'windows'
+  pg_restore_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_restore',
+    '--FILEDESC', 'pg_restore - restore PostgreSQL databases'])
+endif
+
 pg_restore = executable('pg_restore',
   pg_restore_sources,
   link_with: [pg_dump_common],
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
index 7c5de134ac0..d503db97b71 100644
--- a/src/bin/pg_resetwal/meson.build
+++ b/src/bin/pg_resetwal/meson.build
@@ -1,5 +1,15 @@
+pg_resetwal_sources = files(
+  'pg_resetwal.c',
+)
+
+if host_system == 'windows'
+  pg_resetwal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_resetwal',
+    '--FILEDESC', 'pg_resetwal - reset PostgreSQL WAL log'])
+endif
+
 pg_resetwal = executable('pg_resetwal',
-  files('pg_resetwal.c'),
+  pg_resetwal_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index d8ec9e482d5..6cd970909a2 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -11,6 +11,12 @@ pg_rewind_sources = files(
 
 pg_rewind_sources += xlogreader_sources
 
+if host_system == 'windows'
+  pg_rewind_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_rewind',
+    '--FILEDESC', 'pg_rewind - synchronize a data directory with another one forked from'])
+endif
+
 pg_rewind = executable('pg_rewind',
   pg_rewind_sources,
   dependencies: [frontend_code, libpq, lz4, zstd],
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index 2c01831e11f..31d288ba6da 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -1,4 +1,12 @@
-test_fsync_sources = files('pg_test_fsync.c')
+test_fsync_sources = files(
+  'pg_test_fsync.c',
+)
+
+if host_system == 'windows'
+  test_fsync_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_fsync',
+    '--FILEDESC', 'pg_test_fsync - test various disk sync methods'])
+endif
 
 pg_test_fsync = executable('pg_test_fsync',
   test_fsync_sources,
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
index 0a3068f1657..0aed03ea32f 100644
--- a/src/bin/pg_test_timing/meson.build
+++ b/src/bin/pg_test_timing/meson.build
@@ -1,5 +1,15 @@
+pg_test_timing_sources = files(
+  'pg_test_timing.c'
+)
+
+if host_system == 'windows'
+  pg_test_timing_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_test_timing',
+    '--FILEDESC', 'pg_test_timing - test timing overhead'])
+endif
+
 pg_test_timing = executable('pg_test_timing',
-  ['pg_test_timing.c'],
+  pg_test_timing_sources,
   dependencies: [frontend_code],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 02f030e0ccf..a7b927a45c7 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -16,6 +16,12 @@ pg_upgrade_sources = files(
   'version.c',
 )
 
+if host_system == 'windows'
+  pg_upgrade_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_upgrade',
+    '--FILEDESC', 'pg_upgrade - an in-place binary upgrade utility'])
+endif
+
 pg_upgrade = executable('pg_upgrade',
   pg_upgrade_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
index 4c3b2bb5f97..b934a408443 100644
--- a/src/bin/pg_verifybackup/meson.build
+++ b/src/bin/pg_verifybackup/meson.build
@@ -3,6 +3,12 @@ pg_verifybackup_sources = files(
   'pg_verifybackup.c'
 )
 
+if host_system == 'windows'
+  pg_verifybackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_verifybackup',
+    '--FILEDESC', 'pg_verifybackup - verify a backup against using a backup manifest'])
+endif
+
 pg_verifybackup = executable('pg_verifybackup',
   pg_verifybackup_sources,
   dependencies: [frontend_code, libpq],
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index 95872652ffd..9605976870d 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -8,6 +8,12 @@ pg_waldump_sources += rmgr_desc_sources
 pg_waldump_sources += xlogreader_sources
 pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
 
+if host_system == 'windows'
+  pg_waldump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_waldump',
+    '--FILEDESC', 'pg_waldump - decode and display WA'])
+endif
+
 pg_waldump = executable('pg_waldump',
   pg_waldump_sources,
   dependencies: [frontend_code, lz4, zstd],
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index 6564e54029c..a32eb51fe07 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -17,6 +17,12 @@ exprparse = custom_target('exprparse',
 generated_sources += exprparse.to_list()
 pgbench_sources += exprparse
 
+if host_system == 'windows'
+  pgbench_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgbench',
+    '--FILEDESC', 'pgbench - a simple program for running benchmark tests'])
+endif
+
 pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
index 7a468879fd2..2e9aea4b0e1 100644
--- a/src/bin/pgevent/meson.build
+++ b/src/bin/pgevent/meson.build
@@ -6,6 +6,12 @@ pgevent_sources = files(
   'pgevent.c',
 )
 
+pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+  '--NAME', 'pgevent',
+  '--FILEDESC', 'Eventlog message formatter',])
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
 # FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
 pgevent_link_args = []
 if cc.get_id() == 'msvc'
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index 410788e4767..1264fc19fbd 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -36,6 +36,12 @@ sql_help = custom_target('psql_help',
 generated_sources += sql_help.to_list()
 psql_sources += sql_help
 
+if host_system == 'windows'
+  psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'psql',
+    '--FILEDESC', 'psql - the PostgreSQL interactive terminal',])
+endif
+
 psql = executable('psql',
   psql_sources,
   include_directories: include_directories('.'),
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index eaf250c7f73..837562c24e5 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -16,8 +16,16 @@ binaries = [
 ]
 
 foreach binary : binaries
+  binary_sources = files('@0@.c'.format(binary))
+
+  if host_system == 'windows'
+    binary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+      '--NAME', binary,
+      '--FILEDESC', '@0@ - PostgreSQL utility'.format(binary),])
+  endif
+
   binary = executable(binary,
-    files(binary + '.c'),
+    binary_sources,
     link_with: [scripts_common],
     dependencies: [frontend_code, libpq],
     kwargs: default_bin_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 34cb58c2617..533b2e6f773 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -16,9 +16,13 @@ libpq_sources = files(
   'libpq-events.c',
   'pqexpbuffer.c',
 )
+libpq_so_sources = [] # for shared lib, in addition to the above
 
 if host_system == 'windows'
   libpq_sources += files('pthread-win32.c', 'win32.c')
+  libpq_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq',
+    '--FILEDESC', 'PostgreSQL Access Library',])
 endif
 
 if ssl.found()
@@ -59,7 +63,7 @@ libpq_st = static_library('libpq',
 )
 
 libpq_so = shared_library('libpq',
-  libpq_sources,
+  libpq_sources + libpq_so_sources,
   include_directories: [libpq_inc, postgres_inc],
   c_args: libpq_c_args,
   version: '5.' + pg_version_major.to_string(),
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
index 16f94c1ed8b..017f729d435 100644
--- a/src/interfaces/libpq/test/meson.build
+++ b/src/interfaces/libpq/test/meson.build
@@ -1,13 +1,34 @@
+libpq_uri_regress_sources = files(
+  'libpq_uri_regress.c',
+)
+
+if host_system == 'windows'
+  libpq_uri_regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_uri_regress',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_uri_regress',
-  files('libpq_uri_regress.c'),
+  libpq_uri_regress_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
   }
 )
 
+
+libpq_testclient_sources = files(
+  'libpq_testclient.c',
+)
+
+if host_system == 'windows'
+  libpq_testclient_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_testclient',
+    '--FILEDESC', 'libpq test program',])
+endif
+
 executable('libpq_testclient',
-  files('libpq_testclient.c'),
+  libpq_testclient_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index 73b733dd50b..535660085dd 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -36,6 +36,13 @@ foreach n : ['SPI', 'Util']
 endforeach
 
 plperl_inc = include_directories('.')
+
+if host_system == 'windows'
+  plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plperl',
+    '--FILEDESC', 'PL/Perl - procedural language',])
+endif
+
 plperl = shared_module('plperl',
   plperl_sources,
   include_directories: [plperl_inc, postgres_inc],
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
index dd499fdd151..c46c0a1da2a 100644
--- a/src/pl/plpgsql/src/meson.build
+++ b/src/pl/plpgsql/src/meson.build
@@ -40,6 +40,12 @@ pl_unreserved = custom_target('pl_unreserved_kwlist',
 generated_sources += pl_unreserved
 plpgsql_sources += pl_unreserved
 
+if host_system == 'windows'
+  plpgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpgsql',
+    '--FILEDESC', 'PL/pgSQL - procedural language',])
+endif
+
 plpgsql = shared_module('plpgsql',
   plpgsql_sources,
   include_directories: include_directories('.'),
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 366b3b171ac..40888386b5f 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -28,6 +28,12 @@ plpython_sources += custom_target('spiexceptions.h',
 # FIXME: need to duplicate import library ugliness?
 plpython_inc = include_directories('.')
 
+if host_system == 'windows'
+  plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plpython3',
+    '--FILEDESC', 'PL/Python - procedural language',])
+endif
+
 plpython = shared_module('plpython3',
   plpython_sources,
   include_directories: [plpython_inc, postgres_inc],
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
index 9b6addd7fd5..f09bb14c950 100644
--- a/src/pl/tcl/meson.build
+++ b/src/pl/tcl/meson.build
@@ -14,6 +14,12 @@ pltcl_sources += custom_target('pltclerrcodes.h',
   command: [perl, gen_pltclerrcodes, '@INPUT@']
 )
 
+if host_system == 'windows'
+  pltcl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pltcl',
+    '--FILEDESC', 'PL/Tcl - procedural language',])
+endif
+
 pltcl = shared_module('pltcl',
   pltcl_sources,
   include_directories: [include_directories('.'), postgres_inc],
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
index fc2368d02cf..7efec0efbc0 100644
--- a/contrib/adminpack/meson.build
+++ b/contrib/adminpack/meson.build
@@ -1,5 +1,15 @@
+adminpack_sources = files(
+  'adminpack.c',
+)
+
+if host_system == 'windows'
+  adminpack_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'adminpack',
+    '--FILEDESC', 'adminpack - support functions for pgAdmin',])
+endif
+
 adminpack = shared_module('adminpack',
-  ['adminpack.c'],
+  adminpack_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += adminpack
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
index 1db3d20349e..fa807b72d98 100644
--- a/contrib/amcheck/meson.build
+++ b/contrib/amcheck/meson.build
@@ -1,7 +1,16 @@
-amcheck = shared_module('amcheck', [
-    'verify_heapam.c',
-    'verify_nbtree.c',
-  ],
+amcheck_sources = files(
+  'verify_heapam.c',
+  'verify_nbtree.c',
+)
+
+if host_system == 'windows'
+  amcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'amcheck',
+    '--FILEDESC', 'amcheck - function for verifying relation integrity',])
+endif
+
+amcheck = shared_module('amcheck',
+  amcheck_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += amcheck
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
index d2e01968f54..c4ffb0663bc 100644
--- a/contrib/auth_delay/meson.build
+++ b/contrib/auth_delay/meson.build
@@ -1,5 +1,15 @@
+auth_delay_sources = files(
+  'auth_delay.c',
+)
+
+if host_system == 'windows'
+  auth_delay_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auth_delay',
+    '--FILEDESC', 'auth_delay - delay authentication failure reports',])
+endif
+
 autoinc = shared_module('auth_delay',
-  ['auth_delay.c'],
+  auth_delay_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
index 249a8376faa..76f86617850 100644
--- a/contrib/auto_explain/meson.build
+++ b/contrib/auto_explain/meson.build
@@ -1,5 +1,15 @@
+auto_explain_sources = files(
+  'auto_explain.c',
+)
+
+if host_system == 'windows'
+  auto_explain_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'auto_explain',
+    '--FILEDESC', 'auto_explain - logging facility for execution plans',])
+endif
+
 auto_explain = shared_module('auto_explain',
-  files('auto_explain.c'),
+  auto_explain_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += auto_explain
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
index 9f0517f1701..3a389de9175 100644
--- a/contrib/basebackup_to_shell/meson.build
+++ b/contrib/basebackup_to_shell/meson.build
@@ -2,6 +2,12 @@ basebackup_to_shell_sources = files(
   'basebackup_to_shell.c',
 )
 
+if host_system == 'windows'
+  basebackup_to_shell_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basebackup_to_shell',
+    '--FILEDESC', 'basebackup_to_shell - target basebackup to shell command',])
+endif
+
 basebackup_to_shell = shared_module('basebackup_to_shell',
   basebackup_to_shell_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index b67cbef60bd..c30dcfa5d41 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -2,6 +2,12 @@ basic_archive_sources = files(
   'basic_archive.c',
 )
 
+if host_system == 'windows'
+  basic_archive_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'basic_archive',
+    '--FILEDESC', 'basic_archive - basic archive module',])
+endif
+
 basic_archive = shared_module('basic_archive',
   basic_archive_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 1fe7632bdbe..16f3b83e4d2 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -7,6 +7,12 @@ bloom_sources = files(
   'blvalidate.c',
 )
 
+if host_system == 'windows'
+  bloom_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bloom',
+    '--FILEDESC', 'bloom access method - signature file based index',])
+endif
+
 bloom = shared_module('bloom',
   bloom_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
index c20b667d75f..a68daab0dcd 100644
--- a/contrib/bool_plperl/meson.build
+++ b/contrib/bool_plperl/meson.build
@@ -6,6 +6,12 @@ bool_plperl_sources = files(
   'bool_plperl.c',
 )
 
+if host_system == 'windows'
+  bool_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'bool_plperl',
+    '--FILEDESC', 'bool_plperl - bool transform for plperl',])
+endif
+
 bool_plperl = shared_module('bool_plperl',
   bool_plperl_sources,
   include_directories: [plperl_inc, include_directories('.')],
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
index 15d6d31a6ee..fd4c76767a7 100644
--- a/contrib/btree_gin/meson.build
+++ b/contrib/btree_gin/meson.build
@@ -1,5 +1,15 @@
+btree_gin_sources = files(
+  'btree_gin.c',
+)
+
+if host_system == 'windows'
+  btree_gin_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gin',
+    '--FILEDESC', 'btree_gin - B-tree equivalent GIN operator classes',])
+endif
+
 btree_gin = shared_module('btree_gin',
-  files('btree_gin.c'),
+  btree_gin_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += btree_gin
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index c0a8d238540..e98c91dacc8 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -25,6 +25,12 @@ btree_gist_sources = files(
   'btree_uuid.c',
 )
 
+if host_system == 'windows'
+  btree_gist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'btree_gist',
+    '--FILEDESC', 'btree_gist - B-tree equivalent GiST operator classes',])
+endif
+
 btree_gist = shared_module('btree_gist',
   btree_gist_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
index ca60eded80b..26a101a19bd 100644
--- a/contrib/citext/meson.build
+++ b/contrib/citext/meson.build
@@ -2,6 +2,12 @@ citext_sources = files(
   'citext.c',
 )
 
+if host_system == 'windows'
+  citext_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'citext',
+    '--FILEDESC', 'citext - case-insensitive character string data type',])
+endif
+
 citext = shared_module('citext',
   citext_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index 72342b0c82c..041acf95a90 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -17,6 +17,12 @@ cube_parse = custom_target('cubeparse',
 generated_sources += cube_parse.to_list()
 cube_sources += cube_parse
 
+if host_system == 'windows'
+  cube_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'cube',
+    '--FILEDESC', 'cube - multidimensional cube data type',])
+endif
+
 cube = shared_module('cube',
   cube_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
index d35f7b5d49e..66eeb03b736 100644
--- a/contrib/dblink/meson.build
+++ b/contrib/dblink/meson.build
@@ -2,6 +2,12 @@ dblink_sources = files(
   'dblink.c',
 )
 
+if host_system == 'windows'
+  dblink_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dblink',
+    '--FILEDESC', 'dblink - connect to other PostgreSQL databases',])
+endif
+
 dblink = shared_module('dblink',
   dblink_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
index f00e8085619..6fff921adda 100644
--- a/contrib/dict_int/meson.build
+++ b/contrib/dict_int/meson.build
@@ -1,5 +1,15 @@
+dict_int_sources = files(
+  'dict_int.c',
+)
+
+if host_system == 'windows'
+  dict_int_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_int',
+    '--FILEDESC', 'dict_int - add-on dictionary template for full-text search',])
+endif
+
 dict_int = shared_module('dict_int',
-  files('dict_int.c'),
+  dict_int_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_int
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
index be53f55bb79..fabd505a7df 100644
--- a/contrib/dict_xsyn/meson.build
+++ b/contrib/dict_xsyn/meson.build
@@ -1,5 +1,15 @@
+dict_xsyn_sources = files(
+  'dict_xsyn.c',
+)
+
+if host_system == 'windows'
+  dict_xsyn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dict_xsyn',
+    '--FILEDESC', 'dict_xsyn - add-on dictionary template for full-text search',])
+endif
+
 dict_xsyn = shared_module('dict_xsyn',
-  files('dict_xsyn.c'),
+  dict_xsyn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += dict_xsyn
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
index 807f5cb7de3..78dc29c3da3 100644
--- a/contrib/earthdistance/meson.build
+++ b/contrib/earthdistance/meson.build
@@ -1,5 +1,15 @@
+earthdistance_sources = files(
+  'earthdistance.c',
+)
+
+if host_system == 'windows'
+  earthdistance_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'earthdistance',
+    '--FILEDESC', 'earthdistance - calculate distances on the surface of the Earth',])
+endif
+
 earthdistance = shared_module('earthdistance',
-  files('earthdistance.c'),
+  earthdistance_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += earthdistance
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
index f13efb6e38e..c4071faa669 100644
--- a/contrib/file_fdw/meson.build
+++ b/contrib/file_fdw/meson.build
@@ -1,5 +1,15 @@
+file_fdw_sources = files(
+  'file_fdw.c',
+)
+
+if host_system == 'windows'
+  file_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'file_fdw',
+    '--FILEDESC', 'file_fdw - foreign data wrapper for files',])
+endif
+
 file_fdw = shared_module('file_fdw',
-  files('file_fdw.c'),
+  file_fdw_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += file_fdw
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
index ec278a6211e..e6d06149cec 100644
--- a/contrib/fuzzystrmatch/meson.build
+++ b/contrib/fuzzystrmatch/meson.build
@@ -1,8 +1,16 @@
+fuzzystrmatch_sources = files(
+  'fuzzystrmatch.c',
+  'dmetaphone.c',
+)
+
+if host_system == 'windows'
+  fuzzystrmatch_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'fuzzystrmatch',
+    '--FILEDESC', 'fuzzystrmatch - similarities and distance between strings',])
+endif
+
 fuzzystrmatch = shared_module('fuzzystrmatch',
-  files(
-    'fuzzystrmatch.c',
-    'dmetaphone.c'
-  ),
+  fuzzystrmatch_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += fuzzystrmatch
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 07c59f40a97..2bb26bb772b 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -1,15 +1,23 @@
 # .. so that includes of hstore/hstore.h work
 hstore_inc = include_directories('.', '../')
 
+hstore_sources = files(
+  'hstore_compat.c',
+  'hstore_gin.c',
+  'hstore_gist.c',
+  'hstore_io.c',
+  'hstore_op.c',
+  'hstore_subs.c',
+)
+
+if host_system == 'windows'
+  hstore_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore',
+    '--FILEDESC', 'hstore - key/value pair data type',])
+endif
+
 hstore = shared_module('hstore',
-  files(
-    'hstore_compat.c',
-    'hstore_gin.c',
-    'hstore_gist.c',
-    'hstore_io.c',
-    'hstore_op.c',
-    'hstore_subs.c',
-  ),
+  hstore_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += hstore
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
index bbafa0221bd..a238fee6a26 100644
--- a/contrib/hstore_plperl/meson.build
+++ b/contrib/hstore_plperl/meson.build
@@ -6,6 +6,12 @@ hstore_plperl_sources = files(
   'hstore_plperl.c',
 )
 
+if host_system == 'windows'
+  hstore_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plperl',
+    '--FILEDESC', 'hstore_plperl - hstore transform for plperl',])
+endif
+
 hstore_plperl = shared_module('hstore_plperl',
   hstore_plperl_sources,
   include_directories: [plperl_inc, hstore_inc],
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
index 214b48519a9..6071aaeb4b3 100644
--- a/contrib/hstore_plpython/meson.build
+++ b/contrib/hstore_plpython/meson.build
@@ -6,6 +6,12 @@ hstore_plpython_sources = files(
   'hstore_plpython.c',
 )
 
+if host_system == 'windows'
+  hstore_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'hstore_plpython3',
+    '--FILEDESC', 'hstore_plpython - hstore transform for plpython',])
+endif
+
 hstore_plpython = shared_module('hstore_plpython3',
   hstore_plpython_sources,
   include_directories: [plpython_inc, hstore_inc, ],
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
index 1655bcbb3fd..b7cf1ce0cad 100644
--- a/contrib/intarray/meson.build
+++ b/contrib/intarray/meson.build
@@ -8,6 +8,12 @@ intarray_sources = files(
   '_intbig_gist.c',
 )
 
+if host_system == 'windows'
+  intarray_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', '_int',
+    '--FILEDESC', 'intarray - functions and operators for arrays of integers',])
+endif
+
 intarray = shared_module('_int',
   intarray_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
index cc30bbeb55c..db68a718313 100644
--- a/contrib/isn/meson.build
+++ b/contrib/isn/meson.build
@@ -2,6 +2,12 @@ isn_sources = files(
   'isn.c',
 )
 
+if host_system == 'windows'
+  isn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isn',
+    '--FILEDESC', 'isn - data types for international product numbering standards',])
+endif
+
 isn = shared_module('isn',
   isn_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
index 5c915d8ed94..071a7a98d2c 100644
--- a/contrib/jsonb_plperl/meson.build
+++ b/contrib/jsonb_plperl/meson.build
@@ -6,6 +6,12 @@ jsonb_plperl_sources = files(
   'jsonb_plperl.c',
 )
 
+if host_system == 'windows'
+  jsonb_plperl_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plperl',
+    '--FILEDESC', 'jsonb_plperl - jsonb transform for plperl',])
+endif
+
 jsonb_plperl = shared_module('jsonb_plperl',
   jsonb_plperl_sources,
   include_directories: [plperl_inc],
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
index de8e1105c6a..84dc1161e8b 100644
--- a/contrib/jsonb_plpython/meson.build
+++ b/contrib/jsonb_plpython/meson.build
@@ -6,6 +6,12 @@ jsonb_plpython_sources = files(
   'jsonb_plpython.c',
 )
 
+if host_system == 'windows'
+  jsonb_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'jsonb_plpython3',
+    '--FILEDESC', 'jsonb_plpython - jsonb transform for plpython',])
+endif
+
 jsonb_plpython = shared_module('jsonb_plpython3',
   jsonb_plpython_sources,
   include_directories: [plpython_inc],
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
index 9082d5713c7..61ae131f1cc 100644
--- a/contrib/lo/meson.build
+++ b/contrib/lo/meson.build
@@ -2,6 +2,12 @@ lo_sources = files(
   'lo.c',
 )
 
+if host_system == 'windows'
+  lo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'lo',
+    '--FILEDESC', 'lo - management for large objects',])
+endif
+
 lo = shared_module('lo',
   lo_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
index 9463fc2c5e5..421292cea9d 100644
--- a/contrib/ltree/meson.build
+++ b/contrib/ltree/meson.build
@@ -13,6 +13,12 @@ ltree_sources = files(
 # .. so that includes of ltree/ltree.h work
 ltree_inc = include_directories('.', '../')
 
+if host_system == 'windows'
+  ltree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree',
+    '--FILEDESC', 'ltree - hierarchical label data type',])
+endif
+
 ltree = shared_module('ltree',
   ltree_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
index 429d75006aa..acf5e4a6fc8 100644
--- a/contrib/ltree_plpython/meson.build
+++ b/contrib/ltree_plpython/meson.build
@@ -6,6 +6,12 @@ ltree_plpython_sources = files(
   'ltree_plpython.c',
 )
 
+if host_system == 'windows'
+  ltree_plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ltree_plpython3',
+    '--FILEDESC', 'ltree_plpython - ltree transform for plpython',])
+endif
+
 ltree_plpython = shared_module('ltree_plpython3',
   ltree_plpython_sources,
   include_directories: [plpython_inc, ltree_inc],
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
index 1dad5d8f6e7..1a248f19260 100644
--- a/contrib/oid2name/meson.build
+++ b/contrib/oid2name/meson.build
@@ -1,5 +1,15 @@
+oid2name_sources = files(
+  'oid2name.c',
+)
+
+if host_system == 'windows'
+  oid2name_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'oid2name',
+    '--FILEDESC', 'oid2name - examine the file structure',])
+endif
+
 oid2name = executable('oid2name',
-  ['oid2name.c'],
+  oid2name_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
index 8e7ee09a43a..77276c3715a 100644
--- a/contrib/old_snapshot/meson.build
+++ b/contrib/old_snapshot/meson.build
@@ -2,6 +2,12 @@ old_snapshot_sources = files(
   'time_mapping.c',
 )
 
+if host_system == 'windows'
+  old_snapshot_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'old_snapshot',
+    '--FILEDESC', 'old_snapshot - utilities in support of old_snapshot_threshold',])
+endif
+
 old_snapshot = shared_module('old_snapshot',
   old_snapshot_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
index 4af8153e4fd..3ec50b9445e 100644
--- a/contrib/pageinspect/meson.build
+++ b/contrib/pageinspect/meson.build
@@ -9,6 +9,12 @@ pageinspect_sources = files(
   'rawpage.c',
 )
 
+if host_system == 'windows'
+  pageinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pageinspect',
+    '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',])
+endif
+
 pageinspect = shared_module('pageinspect',
   pageinspect_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
index 7da47d02f1d..383d7df372a 100644
--- a/contrib/passwordcheck/meson.build
+++ b/contrib/passwordcheck/meson.build
@@ -9,6 +9,12 @@ passwordcheck_deps = []
 # passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
 # passwordcheck_deps += [cc.find_library('crack')]
 
+if host_system == 'windows'
+  passwordcheck_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'passwordcheck',
+    '--FILEDESC', 'passwordcheck - strengthen user password checks',])
+endif
+
 passwordcheck = shared_module('passwordcheck',
   passwordcheck_sources,
   c_args: passwordcheck_c_args,
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
index 2c69eae3ea2..dd9948e5f0b 100644
--- a/contrib/pg_buffercache/meson.build
+++ b/contrib/pg_buffercache/meson.build
@@ -1,7 +1,15 @@
+pg_buffercache_sources = files(
+  'pg_buffercache_pages.c',
+)
+
+if host_system == 'windows'
+  pg_buffercache_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_buffercache',
+    '--FILEDESC', 'pg_buffercache - monitoring of shared buffer cache in real-time',])
+endif
+
 pg_buffercache = shared_module('pg_buffercache',
-  files(
-    'pg_buffercache_pages.c',
-  ),
+  pg_buffercache_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_buffercache
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index f795014d7ca..904b37b6e9b 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -1,7 +1,15 @@
+pg_freespacemap_sources = files(
+  'pg_freespacemap.c',
+)
+
+if host_system == 'windows'
+  pg_freespacemap_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_freespacemap',
+    '--FILEDESC', 'pg_freespacemap - monitoring of free space map',])
+endif
+
 pg_freespacemap = shared_module('pg_freespacemap',
-  files(
-    'pg_freespacemap.c',
-  ),
+  pg_freespacemap_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_freespacemap
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
index bdca9af4f27..b7140cee34b 100644
--- a/contrib/pg_prewarm/meson.build
+++ b/contrib/pg_prewarm/meson.build
@@ -1,8 +1,16 @@
+pg_prewarm_sources = files(
+  'autoprewarm.c',
+  'pg_prewarm.c',
+)
+
+if host_system == 'windows'
+  pg_prewarm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_prewarm',
+    '--FILEDESC', 'pg_prewarm - preload relation data into system buffer cache',])
+endif
+
 pg_prewarm = shared_module('pg_prewarm',
-  files(
-    'autoprewarm.c',
-    'pg_prewarm.c',
-  ),
+  pg_prewarm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_prewarm
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index ac117d2fc1d..854df138e76 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -1,5 +1,15 @@
+pg_stat_statements_sources = files(
+  'pg_stat_statements.c',
+)
+
+if host_system == 'windows'
+  pg_stat_statements_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_stat_statements',
+    '--FILEDESC', 'pg_stat_statements - execution statistics of SQL statements',])
+endif
+
 pg_stat_statements = shared_module('pg_stat_statements',
-  files('pg_stat_statements.c'),
+  pg_stat_statements_sources,
   kwargs: contrib_mod_args + {
     'dependencies': contrib_mod_args['dependencies'],
   },
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
index ac71caa5276..7b5c5999f4b 100644
--- a/contrib/pg_surgery/meson.build
+++ b/contrib/pg_surgery/meson.build
@@ -1,7 +1,15 @@
+pg_surgery_sources = files(
+  'heap_surgery.c',
+)
+
+if host_system == 'windows'
+  pg_surgery_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_surgery',
+    '--FILEDESC', 'pg_surgery - perform surgery on a damaged relation',])
+endif
+
 pg_surgery = shared_module('pg_surgery',
-  files(
-    'heap_surgery.c',
-  ),
+  pg_surgery_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_surgery
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index a90628d23c6..c8c7c07b308 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -1,10 +1,18 @@
+pg_trgm_sources = files(
+  'trgm_gin.c',
+  'trgm_gist.c',
+  'trgm_op.c',
+  'trgm_regexp.c',
+)
+
+if host_system == 'windows'
+  pg_trgm_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_trgm',
+    '--FILEDESC', 'pg_trgm - trigram matching',])
+endif
+
 pg_trgm = shared_module('pg_trgm',
-  files(
-    'trgm_gin.c',
-    'trgm_gist.c',
-    'trgm_op.c',
-    'trgm_regexp.c',
-  ),
+  pg_trgm_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_trgm
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
index 933dc99ac4d..263a0d08b82 100644
--- a/contrib/pg_visibility/meson.build
+++ b/contrib/pg_visibility/meson.build
@@ -1,7 +1,15 @@
+pg_visibility_sources = files(
+  'pg_visibility.c',
+)
+
+if host_system == 'windows'
+  pg_visibility_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_visibility',
+    '--FILEDESC', 'pg_visibility - page visibility information',])
+endif
+
 pg_visibility = shared_module('pg_visibility',
-  files(
-    'pg_visibility.c',
-  ),
+  pg_visibility_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pg_visibility
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index d6b27877dd0..4314a3182a2 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -1,5 +1,11 @@
 pg_walinspect_sources = files('pg_walinspect.c')
 
+if host_system == 'windows'
+  pg_walinspect_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_walinspect',
+    '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',])
+endif
+
 pg_walinspect = shared_module('pg_walinspect',
   pg_walinspect_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index fe0851bf8e8..7fc7bbc7ca1 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -69,6 +69,12 @@ else
   pgcrypto_regress += 'pgp-zlib-DISABLED'
 endif
 
+if host_system == 'windows'
+  pgcrypto_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgcrypto',
+    '--FILEDESC', 'pgcrypto - cryptographic functions',])
+endif
+
 pgcrypto = shared_module('pgcrypto',
   pgcrypto_sources,
   link_with: pgcrypto_link_with,
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
index 1b41691a2a3..8092f0d4a64 100644
--- a/contrib/pgrowlocks/meson.build
+++ b/contrib/pgrowlocks/meson.build
@@ -1,7 +1,15 @@
+pgrowlocks_sources = files(
+  'pgrowlocks.c',
+)
+
+if host_system == 'windows'
+  pgrowlocks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgrowlocks',
+    '--FILEDESC', 'pgrowlocks - display row locking information',])
+endif
+
 pgrowlocks = shared_module('pgrowlocks',
-  files(
-    'pgrowlocks.c',
-  ),
+  pgrowlocks_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgrowlocks
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
index 8e828692d5c..05e4cd46a5c 100644
--- a/contrib/pgstattuple/meson.build
+++ b/contrib/pgstattuple/meson.build
@@ -1,9 +1,17 @@
+pgstattuple_sources = files(
+  'pgstatapprox.c',
+  'pgstatindex.c',
+  'pgstattuple.c',
+)
+
+if host_system == 'windows'
+  pgstattuple_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgstattuple',
+    '--FILEDESC', 'pgstattuple - tuple-level statistics',])
+endif
+
 pgstattuple = shared_module('pgstattuple',
-  files(
-    'pgstatapprox.c',
-    'pgstatindex.c',
-    'pgstattuple.c',
-  ),
+  pgstattuple_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += pgstattuple
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
index 378885ec93b..d3746ff135c 100644
--- a/contrib/postgres_fdw/meson.build
+++ b/contrib/postgres_fdw/meson.build
@@ -6,6 +6,12 @@ postgres_fdw_sources = files(
   'shippable.c',
 )
 
+if host_system == 'windows'
+  postgres_fdw_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'postgres_fdw',
+    '--FILEDESC', 'postgres_fdw - foreign data wrapper for PostgreSQL',])
+endif
+
 postgres_fdw = shared_module('postgres_fdw',
   postgres_fdw_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
index e476eab2a77..c6fbb22999b 100644
--- a/contrib/seg/meson.build
+++ b/contrib/seg/meson.build
@@ -17,6 +17,12 @@ seg_parse = custom_target('segparse',
 generated_sources += seg_parse.to_list()
 seg_sources += seg_parse
 
+if host_system == 'windows'
+  seg_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'seg',
+    '--FILEDESC', 'seg - line segment data type',])
+endif
+
 seg = shared_module('seg',
   seg_sources,
   include_directories: include_directories('.'),
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
index 60a95e17c2f..8bef239e3c2 100644
--- a/contrib/sepgsql/meson.build
+++ b/contrib/sepgsql/meson.build
@@ -14,6 +14,12 @@ sepgsql_sources = files(
   'uavc.c',
 )
 
+if host_system == 'windows'
+  sepgsql_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sepgsql',
+    '--FILEDESC', 'sepgsql - SELinux integration',])
+endif
+
 sepgsql = shared_module('sepgsql',
   sepgsql_sources,
   kwargs: contrib_mod_args + {
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
index 98008980ec2..e7d78189ef5 100644
--- a/contrib/spi/meson.build
+++ b/contrib/spi/meson.build
@@ -1,5 +1,15 @@
+autoinc_sources = files(
+  'autoinc.c',
+)
+
+if host_system == 'windows'
+  autoinc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'autoinc',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 autoinc = shared_module('autoinc',
-  ['autoinc.c'],
+  autoinc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += autoinc
@@ -9,8 +19,18 @@ install_data('autoinc.control', 'autoinc--1.0.sql',
 )
 
 
+insert_username_sources = files(
+  'insert_username.c',
+)
+
+if host_system == 'windows'
+  insert_username_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'insert_username',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 insert_username = shared_module('insert_username',
-  ['insert_username.c'],
+  insert_username_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += insert_username
@@ -22,8 +42,18 @@ install_data(
 )
 
 
+moddatetime_sources = files(
+  'moddatetime.c',
+)
+
+if host_system == 'windows'
+  moddatetime_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'moddatetime',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 moddatetime = shared_module('moddatetime',
-  ['moddatetime.c'],
+  moddatetime_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += moddatetime
@@ -38,8 +68,18 @@ install_data(
 # comment out if you want a quieter refint package for other uses
 refint_cflags = ['-DREFINT_VERBOSE']
 
+refint_sources = files(
+  'refint.c',
+)
+
+if host_system == 'windows'
+  refint_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'refint',
+    '--FILEDESC', 'spi - examples of using SPI and triggers',])
+endif
+
 refint = shared_module('refint',
-  ['refint.c'],
+  refint_sources,
   c_args: refint_cflags,
   kwargs: contrib_mod_args,
 )
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
index 53f752a08ac..136983e783d 100644
--- a/contrib/sslinfo/meson.build
+++ b/contrib/sslinfo/meson.build
@@ -2,10 +2,18 @@ if not ssl.found()
   subdir_done()
 endif
 
+sslinfo_sources = files(
+  'sslinfo.c',
+)
+
+if host_system == 'windows'
+  sslinfo_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'sslinfo',
+    '--FILEDESC', 'sslinfo - information about client SSL certificate',])
+endif
+
 sslinfo = shared_module('sslinfo',
-  files(
-    'sslinfo.c',
-  ),
+  sslinfo_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [ssl, contrib_mod_args['dependencies']],
   }
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
index f4230096c0c..d2ddc8d3b39 100644
--- a/contrib/tablefunc/meson.build
+++ b/contrib/tablefunc/meson.build
@@ -1,7 +1,15 @@
+tablefunc_sources = files(
+  'tablefunc.c',
+)
+
+if host_system == 'windows'
+  tablefunc_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tablefunc',
+    '--FILEDESC', 'tablefunc - various functions that return tables',])
+endif
+
 tablefunc = shared_module('tablefunc',
-  files(
-    'tablefunc.c',
-  ),
+  tablefunc_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tablefunc
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
index c3a025247d4..71261c3b0a2 100644
--- a/contrib/tcn/meson.build
+++ b/contrib/tcn/meson.build
@@ -1,7 +1,15 @@
+tcn_sources = files(
+  'tcn.c',
+)
+
+if host_system == 'windows'
+  tcn_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tcn',
+    '--FILEDESC', 'tcn - trigger function notifying listeners',])
+endif
+
 tcn = shared_module('tcn',
-  files(
-    'tcn.c',
-  ),
+  tcn_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tcn
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index dd7cb0101ad..6376103c689 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -2,6 +2,12 @@ test_decoding_sources = files(
   'test_decoding.c',
 )
 
+if host_system == 'windows'
+  test_decoding_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_decoding',
+    '--FILEDESC', 'test_decoding - example of a logical decoding output plugin',])
+endif
+
 test_decoding = shared_module('test_decoding',
   test_decoding_sources,
   kwargs: contrib_mod_args,
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
index b9cd42115a8..380abb49883 100644
--- a/contrib/tsm_system_rows/meson.build
+++ b/contrib/tsm_system_rows/meson.build
@@ -1,7 +1,15 @@
+tsm_system_rows_sources = files(
+  'tsm_system_rows.c',
+)
+
+if host_system == 'windows'
+  tsm_system_rows_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_rows',
+    '--FILEDESC', 'tsm_system_rows - TABLESAMPLE method which accepts number of rows as a limit',])
+endif
+
 tsm_system_rows = shared_module('tsm_system_rows',
-  files(
-    'tsm_system_rows.c',
-  ),
+  tsm_system_rows_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_rows
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
index 18015912ffb..e57a2702c60 100644
--- a/contrib/tsm_system_time/meson.build
+++ b/contrib/tsm_system_time/meson.build
@@ -1,7 +1,15 @@
+tsm_system_time_sources = files(
+  'tsm_system_time.c',
+)
+
+if host_system == 'windows'
+  tsm_system_time_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'tsm_system_time',
+    '--FILEDESC', 'tsm_system_time - TABLESAMPLE method which accepts time in milliseconds as a limit',])
+endif
+
 tsm_system_time = shared_module('tsm_system_time',
-  files(
-    'tsm_system_time.c',
-  ),
+  tsm_system_time_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += tsm_system_time
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
index 872b76e3223..438035132f8 100644
--- a/contrib/unaccent/meson.build
+++ b/contrib/unaccent/meson.build
@@ -1,7 +1,15 @@
+unaccent_sources = files(
+  'unaccent.c',
+)
+
+if host_system == 'windows'
+  unaccent_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'unaccent',
+    '--FILEDESC', 'unaccent - text search dictionary that removes accents',])
+endif
+
 unaccent = shared_module('unaccent',
-  files(
-    'unaccent.c',
-  ),
+  unaccent_sources,
   kwargs: contrib_mod_args,
 )
 contrib_targets += unaccent
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
index da6d1d75c12..28730f398f0 100644
--- a/contrib/uuid-ossp/meson.build
+++ b/contrib/uuid-ossp/meson.build
@@ -2,10 +2,18 @@ if not uuid.found()
   subdir_done()
 endif
 
+uuid_ossp_sources = files(
+  'uuid-ossp.c',
+)
+
+if host_system == 'windows'
+  uuid_ossp_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'uuid-ossp',
+    '--FILEDESC', 'uuid-ossp - UUID generation',])
+endif
+
 uuid_ossp = shared_module('uuid-ossp',
-  files(
-    'uuid-ossp.c',
-  ),
+  uuid_ossp_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [uuid, contrib_mod_args['dependencies']],
   },
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
index 7a632b87d1b..846de47dbd1 100644
--- a/contrib/vacuumlo/meson.build
+++ b/contrib/vacuumlo/meson.build
@@ -1,5 +1,15 @@
+vacuumlo_sources = files(
+  'vacuumlo.c',
+)
+
+if host_system == 'windows'
+  vacuumlo_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'vacuumlo',
+    '--FILEDESC', 'vacuumlo - removes orphaned large objects',])
+endif
+
 vacuumlo = executable('vacuumlo',
-  ['vacuumlo.c'],
+  vacuumlo_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 9c0b56f01f6..89b0d677516 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -2,11 +2,19 @@ if not libxml.found()
   subdir_done()
 endif
 
+xml2_sources = files(
+  'xpath.c',
+  'xslt_proc.c',
+)
+
+if host_system == 'windows'
+  xml2_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgxml',
+    '--FILEDESC', 'xml2 - XPath querying and XSLT',])
+endif
+
 xml2 = shared_module('pgxml',
-  files(
-    'xpath.c',
-    'xslt_proc.c',
-  ),
+  xml2_sources,
   kwargs: contrib_mod_args + {
     'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
   },
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index b803000c708..4d6454381b5 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -7,6 +7,12 @@ ecpg_compat_inc = [include_directories('.'), ecpg_inc, libpq_inc]
 ecpg_compat_c_args = ['-DSO_MAJOR_VERSION=3']
 export_file = custom_target('libecpg_compat.exports', kwargs: gen_export_kwargs)
 
+if host_system == 'windows'
+  ecpg_compat_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libecpg_compat',
+    '--FILEDESC', 'ECPG compat - compatibility library for ECPG',])
+endif
+
 # see src/interfaces/libpq/meson.build
 ecpg_compat_st = static_library('libecpg_compat',
   ecpg_compat_sources,
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 6fdf019149c..7e6e6fbf5c0 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -16,6 +16,12 @@ ecpglib_inc = [include_directories('.'), ecpg_inc]
 ecpglib_c_args = ['-DSO_MAJOR_VERSION=6']
 export_file = custom_target('libecpg.exports', kwargs: gen_export_kwargs)
 
+if host_system == 'windows'
+  ecpglib_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libecpg',
+    '--FILEDESC', 'ECPG - embedded SQL in C',])
+endif
+
 # see src/interfaces/libpq/meson.build
 ecpglib_st = static_library('libecpg',
   ecpglib_sources,
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 8e5d235810a..530dd2c602d 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -12,6 +12,12 @@ export_file = custom_target('libpgtypes.exports', kwargs: gen_export_kwargs)
 ecpg_pgtypes_inc = [include_directories('.'), ecpg_inc]
 ecpg_pgtypes_c_args = ['-DSO_MAJOR_VERSION=3']
 
+if host_system == 'windows'
+  ecpg_pgtypes_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pgtypes',
+    '--FILEDESC', 'pgtypes - library for data type mapping',])
+endif
+
 # see src/interfaces/libpq/meson.build
 ecpg_pgtypes_st = static_library('libpgtypes',
   ecpg_pgtypes_sources,
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 1be49c8c27f..74876f039c9 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -93,6 +93,12 @@ ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
 generated_sources += ecpg_kwlist
 ecpg_sources += ecpg_kwlist
 
+if host_system == 'windows'
+  ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ecpg',
+    '--FILEDESC', 'ecpg - embedded SQL precompiler for C',])
+endif
+
 ecpg_exe = executable('ecpg',
   ecpg_sources,
   include_directories: ['.', ecpg_inc, postgres_inc, libpq_inc],
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index 8904aa7fd90..94b26d10314 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -7,6 +7,11 @@ pg_regress_ecpg_sources = pg_regress_c + files(
   'pg_regress_ecpg.c',
 )
 
+if host_system == 'windows'
+  pg_regress_ecpg_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress_ecpg',])
+endif
+
 pg_regress_ecpg = executable('pg_regress_ecpg',
   pg_regress_ecpg_sources,
   c_args: pg_regress_cflags,
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index c7656fd4609..ba27b8c1d44 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -23,6 +23,12 @@ spec_parser = custom_target('specparse',
 isolationtester_sources += spec_parser
 generated_sources += spec_parser.to_list()
 
+if host_system == 'windows'
+  isolation_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_isolation_regress',
+    '--FILEDESC', 'pg_isolation_regress - multi-client test driver',])
+endif
+
 pg_isolation_regress = executable('pg_isolation_regress',
   isolation_sources,
   c_args: pg_regress_cflags,
@@ -34,6 +40,13 @@ pg_isolation_regress = executable('pg_isolation_regress',
 )
 bin_targets += pg_isolation_regress
 
+
+if host_system == 'windows'
+  isolationtester_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'isolationtester',
+    '--FILEDESC', 'isolationtester - multi-client test driver',])
+endif
+
 isolationtester = executable('isolationtester',
   isolationtester_sources,
   include_directories: include_directories('.'),
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
index cf4bdaba637..a0c3ab6afe7 100644
--- a/src/test/modules/delay_execution/meson.build
+++ b/src/test/modules/delay_execution/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+delay_execution_sources = files(
+  'delay_execution.c',
+)
+
+if host_system == 'windows'
+  delay_execution_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'delay_execution',
+    '--FILEDESC', 'delay_execution - allow delay between parsing and execution',])
+endif
+
 delay_execution = shared_module('delay_execution',
-  ['delay_execution.c'],
+  delay_execution_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += delay_execution
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
index 56ff5f48001..4ce82491135 100644
--- a/src/test/modules/dummy_index_am/meson.build
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_index_am_sources = files(
+  'dummy_index_am.c',
+)
+
+if host_system == 'windows'
+  dummy_index_am_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_index_am',
+    '--FILEDESC', 'dummy_index_am - index access method template',])
+endif
+
 dummy_index_am = shared_module('dummy_index_am',
-  ['dummy_index_am.c'],
+  dummy_index_am_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_index_am
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
index 21b7cf8f353..81b626e496c 100644
--- a/src/test/modules/dummy_seclabel/meson.build
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+dummy_seclabel_sources = files(
+  'dummy_seclabel.c',
+)
+
+if host_system == 'windows'
+  dummy_seclabel_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'dummy_seclabel',
+    '--FILEDESC', 'dummy_seclabel - regression testing of the SECURITY LABEL statement',])
+endif
+
 dummy_seclabel = shared_module('dummy_seclabel',
-  ['dummy_seclabel.c'],
+  dummy_seclabel_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += dummy_seclabel
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
index 8384b6e3b2a..de0e2d15626 100644
--- a/src/test/modules/libpq_pipeline/meson.build
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -1,7 +1,15 @@
+libpq_pipeline_sources = files(
+  'libpq_pipeline.c',
+)
+
+if host_system == 'windows'
+  libpq_pipeline_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'libpq_pipeline',
+    '--FILEDESC', 'libpq_pipeline - test program for pipeline execution',])
+endif
+
 libpq_pipeline = executable('libpq_pipeline',
-  files(
-    'libpq_pipeline.c',
-  ),
+  libpq_pipeline_sources,
   dependencies: [frontend_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
index 45de3f1990d..e1ea2c7a16f 100644
--- a/src/test/modules/plsample/meson.build
+++ b/src/test/modules/plsample/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+plsample_sources = files(
+  'plsample.c',
+)
+
+if host_system == 'windows'
+  plsample_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'plsample',
+    '--FILEDESC', 'PL/Sample - template for procedural language',])
+endif
+
 plsample = shared_module('plsample',
-  ['plsample.c'],
+  plsample_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += plsample
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
index 857fc7e140e..445296fee0b 100644
--- a/src/test/modules/spgist_name_ops/meson.build
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+spgist_name_ops_sources = files(
+  'spgist_name_ops.c',
+)
+
+if host_system == 'windows'
+  spgist_name_ops_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'spgist_name_ops',
+    '--FILEDESC', 'spgist_name_ops - test opclass for SP-GiST',])
+endif
+
 spgist_name_ops = shared_module('spgist_name_ops',
-  ['spgist_name_ops.c'],
+  spgist_name_ops_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += spgist_name_ops
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
index a57bd0693a3..a9eb4c564da 100644
--- a/src/test/modules/ssl_passphrase_callback/meson.build
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -3,8 +3,19 @@ if not ssl.found()
 endif
 
 # FIXME: prevent install during main install, but not during test :/
+
+ssl_passphrase_callback_sources = files(
+  'ssl_passphrase_func.c',
+)
+
+if host_system == 'windows'
+  ssl_passphrase_callback_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'ssl_passphrase_func',
+    '--FILEDESC', 'callback function to provide a passphrase',])
+endif
+
 ssl_passphrase_callback = shared_module('ssl_passphrase_func',
-  ['ssl_passphrase_func.c'],
+  ssl_passphrase_callback_sources,
   kwargs: pg_mod_args + {
     'dependencies': [ssl, pg_mod_args['dependencies']],
   },
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
index 945eb5a70c4..3cf6b05754f 100644
--- a/src/test/modules/test_bloomfilter/meson.build
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_bloomfilter_sources = files(
+  'test_bloomfilter.c',
+)
+
+if host_system == 'windows'
+  test_bloomfilter_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_bloomfilter',
+    '--FILEDESC', 'test_bloomfilter - test code for Bloom filter library',])
+endif
+
 test_bloomfilter = shared_module('test_bloomfilter',
-  ['test_bloomfilter.c'],
+  test_bloomfilter_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_bloomfilter
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
index 81ad5adc526..54d44f9b2b4 100644
--- a/src/test/modules/test_ddl_deparse/meson.build
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ddl_deparse_sources = files(
+  'test_ddl_deparse.c',
+)
+
+if host_system == 'windows'
+  test_ddl_deparse_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ddl_deparse',
+    '--FILEDESC', 'test_ddl_deparse - regression testing for DDL deparsing',])
+endif
+
 test_ddl_deparse = shared_module('test_ddl_deparse',
-  ['test_ddl_deparse.c'],
+  test_ddl_deparse_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ddl_deparse
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
index abf0a3b0430..b3b49c56122 100644
--- a/src/test/modules/test_ginpostinglist/meson.build
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_ginpostinglist_sources = files(
+  'test_ginpostinglist.c',
+)
+
+if host_system == 'windows'
+  test_ginpostinglist_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_ginpostinglist',
+    '--FILEDESC', 'test_ginpostinglist - test code for src/backend/access/gin//ginpostinglist.c',])
+endif
+
 test_ginpostinglist = shared_module('test_ginpostinglist',
-  ['test_ginpostinglist.c'],
+  test_ginpostinglist_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_ginpostinglist
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
index c32c469c69a..4bd75af4b5e 100644
--- a/src/test/modules/test_integerset/meson.build
+++ b/src/test/modules/test_integerset/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_integerset_sources = files(
+  'test_integerset.c',
+)
+
+if host_system == 'windows'
+  test_integerset_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_integerset',
+    '--FILEDESC', 'test_integerset - test code for src/backend/lib/integerset.c',])
+endif
+
 test_integerset = shared_module('test_integerset',
-  ['test_integerset.c'],
+  test_integerset_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_integerset
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
index a388de1156a..c5405b8f878 100644
--- a/src/test/modules/test_lfind/meson.build
+++ b/src/test/modules/test_lfind/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_lfind_sources = files(
+  'test_lfind.c',
+)
+
+if host_system == 'windows'
+  test_lfind_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_lfind',
+    '--FILEDESC', 'test_lfind - test code for optimized linear search functions',])
+endif
+
 test_lfind = shared_module('test_lfind',
-  ['test_lfind.c'],
+  test_lfind_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_lfind
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 5faf0459777..8802bbbac55 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_oat_hooks_sources = files(
+  'test_oat_hooks.c',
+)
+
+if host_system == 'windows'
+  test_oat_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_oat_hooks',
+    '--FILEDESC', 'test_oat_hooks - example use of object access hooks',])
+endif
+
 test_oat_hooks = shared_module('test_oat_hooks',
-  ['test_oat_hooks.c'],
+  test_oat_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_oat_hooks
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
index b59960f615e..1c17113347f 100644
--- a/src/test/modules/test_parser/meson.build
+++ b/src/test/modules/test_parser/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_parser_sources = files(
+  'test_parser.c',
+)
+
+if host_system == 'windows'
+  test_parser_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_parser',
+    '--FILEDESC', 'test_parser - example of a custom parser for full-text search',])
+endif
+
 test_parser = shared_module('test_parser',
-  ['test_parser.c'],
+  test_parser_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_parser
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
index 1cfa84b3609..9a5be43c9c0 100644
--- a/src/test/modules/test_predtest/meson.build
+++ b/src/test/modules/test_predtest/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_predtest_sources = files(
+  'test_predtest.c',
+)
+
+if host_system == 'windows'
+  test_predtest_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_predtest',
+    '--FILEDESC', 'test_predtest - test code for optimizer/util/predtest.c',])
+endif
+
 test_predtest = shared_module('test_predtest',
-  ['test_predtest.c'],
+  test_predtest_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_predtest
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
index 34cbc3e1624..f067e08d321 100644
--- a/src/test/modules/test_rbtree/meson.build
+++ b/src/test/modules/test_rbtree/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rbtree_sources = files(
+  'test_rbtree.c',
+)
+
+if host_system == 'windows'
+  test_rbtree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rbtree',
+    '--FILEDESC', 'test_rbtree - test code for red-black tree library',])
+endif
+
 test_rbtree = shared_module('test_rbtree',
-  ['test_rbtree.c'],
+  test_rbtree_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rbtree
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
index 867a64e57c3..cfb938d9f1e 100644
--- a/src/test/modules/test_regex/meson.build
+++ b/src/test/modules/test_regex/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_regex_sources = files(
+  'test_regex.c',
+)
+
+if host_system == 'windows'
+  test_regex_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_regex',
+    '--FILEDESC', 'test_regex - test code for backend/regex/',])
+endif
+
 test_regex = shared_module('test_regex',
-  ['test_regex.c'],
+  test_regex_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_regex
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
index 80d8adda332..3fb273b2934 100644
--- a/src/test/modules/test_rls_hooks/meson.build
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -1,6 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_rls_hooks_sources = files(
+  'test_rls_hooks.c',
+)
+
+if host_system == 'windows'
+  test_rls_hooks_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_rls_hooks',
+    '--FILEDESC', 'test_rls_hooks - example use of RLS hooks',])
+endif
+
 test_rls_hooks = shared_module('test_rls_hooks',
-  ['test_rls_hooks.c'],
+  test_rls_hooks_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_rls_hooks
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
index b663543d616..16c8fdb57f4 100644
--- a/src/test/modules/test_shm_mq/meson.build
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -1,10 +1,19 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_shm_mq_sources = files(
+  'setup.c',
+  'test.c',
+  'worker.c',
+)
+
+if host_system == 'windows'
+  test_shm_mq_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'test_shm_mq',
+    '--FILEDESC', 'test_shm_mq - example use of shared memory message queue',])
+endif
+
 test_shm_mq = shared_module('test_shm_mq',
-  files(
-    'setup.c',
-    'test.c',
-    'worker.c',
-  ),
+  test_shm_mq_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_shm_mq
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index 32acad883b2..a4a158c75b9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -1,8 +1,17 @@
 # FIXME: prevent install during main install, but not during test :/
+
+test_worker_spi_sources = files(
+  'worker_spi.c',
+)
+
+if host_system == 'windows'
+  test_worker_spi_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'worker_spi',
+    '--FILEDESC', 'worker_spi - background worker example',])
+endif
+
 test_worker_spi = shared_module('worker_spi',
-  files(
-    'worker_spi.c',
-  ),
+  test_worker_spi_sources,
   kwargs: pg_mod_args,
 )
 testprep_targets += test_worker_spi
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index 03de591b0c7..3dcfc11278f 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -17,6 +17,12 @@ host_tuple = '@0@-@1@-@2@'.format(host_cpu, host_system, host_tuple_cc)
 
 pg_regress_cflags = ['-DHOST_TUPLE="@0@"'.format(host_tuple), '-DSHELLPROG="/bin/sh"']
 
+if host_system == 'windows'
+  regress_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+    '--NAME', 'pg_regress',
+    '--FILEDESC', 'pg_regress - test driver',])
+endif
+
 pg_regress = executable('pg_regress',
   regress_sources,
   c_args: pg_regress_cflags,
diff --git a/meson.build b/meson.build
index c709643fe5e..25a6fa941cc 100644
--- a/meson.build
+++ b/meson.build
@@ -2564,6 +2564,65 @@ gen_export_kwargs = {
 
 
 
+###
+### windows resources related stuff
+###
+
+if host_system == 'windows'
+  pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+  win32ver_rc = files('src/port/win32ver.rc')
+  rcgen = find_program('src/tools/rcgen', native: true)
+
+  rcgen_base_args = [
+    '--srcdir', '@SOURCE_DIR@',
+    '--builddir', meson.build_root(),
+    '--rcout', '@OUTPUT0@',
+    '--out', '@OUTPUT1@',
+    '--input', '@INPUT@',
+    '@EXTRA_ARGS@',
+  ]
+
+  if cc.get_argument_syntax() == 'msvc'
+    rc = find_program('rc', required: true)
+    rcgen_base_args += ['--rc', rc.path()]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.res']
+  else
+    windres = find_program('windres', required: true)
+    rcgen_base_args += ['--windres', windres.path()]
+    rcgen_outputs = ['@BASENAME@.rc', '@BASENAME@.obj']
+  endif
+
+  # msbuild backend doesn't support this atm
+  if meson.backend() == 'ninja'
+    rcgen_base_args += ['--depfile', '@DEPFILE@']
+  endif
+
+  rcgen_bin_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_APP',
+    '--FILEENDING', 'exe',
+    '--ICO', pg_ico
+  ]
+
+  rcgen_lib_args = rcgen_base_args + [
+    '--VFT_TYPE', 'VFT_DLL',
+    '--FILEENDING', 'dll',
+  ]
+
+  rc_bin_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_bin_args,
+    output: rcgen_outputs,
+  )
+
+  rc_lib_gen = generator(rcgen,
+    depfile: '@BASENAME@.d',
+    arguments: rcgen_lib_args,
+    output: rcgen_outputs,
+  )
+endif
+
+
+
 # headers that the whole build tree depends on
 generated_headers = []
 # headers that the backend build depends on
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
index 16f082ecfa8..9e0934c000b 100644
--- a/src/timezone/meson.build
+++ b/src/timezone/meson.build
@@ -28,6 +28,12 @@ if get_option('system_tzdata') == ''
   if meson.is_cross_build()
     zic = find_program(get_option('ZIC'), native: true, required: true)
   else
+    if host_system == 'windows'
+      zic_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+        '--NAME', 'zic',
+        '--FILEDESC', 'zic - time zone compiler',])
+    endif
+
     zic = executable('zic', zic_sources,
                      dependencies: [frontend_code],
                      kwargs: default_bin_args + {'install': false}
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..0c84772163c
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,105 @@
+#!/usr/bin/env python3
+
+# Helper for building resource files when building for windows. Always
+# generates a .rc from the input .rc file. When building with msvc we
+# additionally generate a .res file with 'rc', when building with gcc, we use
+# windres to directly generate a .o.  Additionally we generate basic
+# dependencies if depfile is specified.
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('--srcdir', type=os.path.abspath,
+                    required=True)
+parser.add_argument('--builddir', type=os.path.abspath,
+                    required=True)
+
+binaries = parser.add_argument_group('binaries')
+binaries.add_argument('--windres', type=os.path.abspath)
+binaries.add_argument('--rc', type=os.path.abspath)
+
+inout = parser.add_argument_group('inout')
+inout.add_argument('--depfile', type=argparse.FileType('w'))
+inout.add_argument('--input', type=argparse.FileType('r'),
+                   required=True)
+inout.add_argument('--rcout', type=argparse.FileType('w'),
+                   required=True)
+inout.add_argument('--out', type=str,
+                   required=True)
+
+replacements = parser.add_argument_group('replacements')
+replacements.add_argument('--FILEDESC', type=str)
+replacements.add_argument('--NAME', type=str, required=True)
+replacements.add_argument('--VFT_TYPE', type=str, required=True)
+replacements.add_argument('--FILEENDING', type=str, required=True)
+replacements.add_argument('--ICO', type=str)
+
+args = parser.parse_args()
+
+# determine replacement strings
+
+internal_name = '"{0}"'.format(args.NAME)
+original_name = '"{0}.{1}"'.format(args.NAME, args.FILEENDING)
+
+# if no description is passed in, generate one based on the name
+if args.FILEDESC:
+    filedesc = args.FILEDESC
+elif args.NAME:
+    if args.VFT_TYPE == 'VFT_DLL':
+        filedesc = 'PostgreSQL {0} library'.format(args.NAME)
+    else:
+        filedesc = 'PostgreSQL {0} binary'.format(args.NAME)
+filedesc = '"{0}"'.format(filedesc)
+
+
+if args.ICO:
+    ico = 'IDI_ICON ICON "{0}"'.format(args.ICO)
+    if args.depfile:
+        args.depfile.write("{0} : {1}\n".format(args.rcout.name, args.ICO))
+else:
+    ico = ''
+
+
+data = args.input.read()
+
+data = data.replace('VFT_APP', args.VFT_TYPE)
+data = data.replace('_INTERNAL_NAME_', internal_name)
+data = data.replace('_ORIGINAL_NAME_', original_name)
+data = data.replace('FILEDESC', filedesc)
+data = data.replace("_ICO_", ico)
+
+args.rcout.write(data)
+args.rcout.close()
+
+if args.windres:
+    cmd = [
+        args.windres,
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '-o', args.out, '-i', args.rcout.name,
+    ]
+elif args.rc:
+    cmd = [
+        args.rc, '/nologo',
+        '-I{0}/src/include/'.format(args.builddir),
+        '-I{0}/src/include/'.format(args.srcdir),
+        '/fo', args.out, args.rcout.name,
+    ]
+else:
+    sys.exit('either --windres or --rc needs to be specified')
+
+sp = subprocess.run(cmd)
+if sp.returncode != 0:
+    sys.exit(sp.returncode)
+
+# It'd be nicer if we could generate correct dependencies here, but 'rc'
+# doesn't support doing so. It's unlikely we'll ever need more, so...
+if args.depfile:
+    args.depfile.write("{0} : {1}\n".format(
+        args.rcout.name, args.input.name))
+    args.depfile.write("{0} : {1}/{2}\n".format(
+        args.out, args.builddir, 'src/include/pg_config.h'))
-- 
2.37.3.542.gdd3f6c4cae

#375Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: samay sharma (#373)
Re: [RFC] building postgres with meson - v13

On 03.10.22 09:39, samay sharma wrote:

9f5be26c1215 meson: Add docs for building with meson

I do like the overall layout of this.

The "Supported Platforms" section should be moved back to near the end
of the chapter.  I don't see a reason to move it forward, at least
none that is related to the meson issue.

Agreed that it's unrelated to meson. However, I think it's better to
move it in the front as it's generally useful to know if your platform
is supported before you start performing the installation steps and get
stuck somewhere.

The way it is currently organized is that 17.2 says

"In general, a modern Unix-compatible platform should be able to run
PostgreSQL. The platforms that had received specific testing at the time
of release are described in Section 17.6 below."

So basically, it says, don't worry about it, your platform is probably
supported, but check below if you are interested in the details.

I don't see a reason to turn this around.

Do you think I should submit that as a separate commit in the same
patch-set or just move it out to a completely different patch submission?

The changes to the "Getting the Source" section are also not
appropriate for this patch.

Given that many developers are now using Git for downloading the source
code, I think it makes sense to be in the Getting the source section.
Also, meson today doesn't cleanly build via the tarballs. Hence, I added
it to the section (and patchset).

Section 17.3 already contains a link to section I.1 about using Git.

Do you think I should move this to a different patch?

If you wanted to pursue these changes, then yes, but I think they are
not clear improvements, as mentioned above.

I suggest focusing on getting the actual meson documentation finished
and then considering polishing the overall flow if desired.

#376Peter Eisentraut
peter.eisentraut@enterprisedb.com
In reply to: Andres Freund (#374)
Re: [RFC] building postgres with meson - v13

On 04.10.22 05:25, Andres Freund wrote:

I've attached a revised version of the xml-tools dependency wrapper (0001):
Cleanups, minor error handling improvements, and bit of comment polishing. I'd
welcome review. But as it fixes a build-dependency bug / FIXME, I'm planning
to push it relatively soon otherwise.

0002 fixes libpq's .pc file (static dependencies didn't show up anymore) and
AIX compilation. AIX doesn't yet support link_whole (support was merged into
meson yesterday though). On the way it also improves comments and a bit of
generic infrastructure. The price for now is that the static libpq is built
separately from the shared one, not reusing any objects. I felt that the
complexity of reusing the objects isn't worth it for now.

Peter, it'd be great if you could have a look at 0002.

0003 mirrors the setup of libpq to the various ecpg libraries. This is a
prerequisite to adding resource files.

0004 adds the resource files

These patches look ok to me.

#377Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#376)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-10-05 10:16:06 +0200, Peter Eisentraut wrote:

On 04.10.22 05:25, Andres Freund wrote:

I've attached a revised version of the xml-tools dependency wrapper (0001):
Cleanups, minor error handling improvements, and bit of comment polishing. I'd
welcome review. But as it fixes a build-dependency bug / FIXME, I'm planning
to push it relatively soon otherwise.

0002 fixes libpq's .pc file (static dependencies didn't show up anymore) and
AIX compilation. AIX doesn't yet support link_whole (support was merged into
meson yesterday though). On the way it also improves comments and a bit of
generic infrastructure. The price for now is that the static libpq is built
separately from the shared one, not reusing any objects. I felt that the
complexity of reusing the objects isn't worth it for now.

Peter, it'd be great if you could have a look at 0002.

0003 mirrors the setup of libpq to the various ecpg libraries. This is a
prerequisite to adding resource files.

0004 adds the resource files

These patches look ok to me.

Thanks for checking.

With that I'm closing the original meson CF entry. Wohoo!

I'll post two new threads, one about pgxs compatibility, one about precompiled
headers in a bit.

Greetings,

Andres Freund

#378shiy.fnst@fujitsu.com
shiy.fnst@fujitsu.com
In reply to: Andres Freund (#377)
RE: [RFC] building postgres with meson - v13

Hi,

I noticed that `pg_config --configure` didn't show the options given when
building with meson.

For example,
meson setup build -Dcache=gcc.cache -Ddtrace=enabled -Dicu=enabled -Dcassert=true -Dprefix=/home/postgres/install_meson/
meson compile -C build
meson install -C build

$ pg_config --configure

The options I specified (like dtrace) are not shown. I found they actually work
in compilation.
When specifying `-Ddtrace=enabled`, there is a log like this. And with
`-Ddtrace=disabled`, no such log.

[120/1834] /usr/bin/dtrace -C -h -s ../src/include/utils/../../backend/utils/probes.d -o src/include/utils/probes.h.tmp

Maybe it would be better if pg_config can output this information, to be
consistent with the output when building with `./configure` and `make`.

The output when building with `./configure` and `make`:
$ pg_config --configure
'--prefix=/home/postgres/install/' '--cache' 'gcc.cache' '--enable-dtrace' '--with-icu' '--enable-cassert'

Regards,
Shi yu

#379Andres Freund
andres@anarazel.de
In reply to: shiy.fnst@fujitsu.com (#378)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-10-13 09:24:51 +0000, shiy.fnst@fujitsu.com wrote:

I noticed that `pg_config --configure` didn't show the options given when
building with meson.

Yes, that was noted somewhere on this thread.

Maybe it would be better if pg_config can output this information, to be
consistent with the output when building with `./configure` and `make`.

The output when building with `./configure` and `make`:
$ pg_config --configure
'--prefix=/home/postgres/install/' '--cache' 'gcc.cache' '--enable-dtrace' '--with-icu' '--enable-cassert'

It'd be a fair amount of work, both initially and to maintain it, to generate
something compatible. I can see some benefit in showing some feature
influencing output in --configure, but compatible output doesn't seem worth it
to me.

Greetings,

Andres Freund

#380shiy.fnst@fujitsu.com
shiy.fnst@fujitsu.com
In reply to: Andres Freund (#379)
RE: [RFC] building postgres with meson - v13

On Fri, Oct 14, 2022 12:40 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2022-10-13 09:24:51 +0000, shiy.fnst@fujitsu.com wrote:

I noticed that `pg_config --configure` didn't show the options given when
building with meson.

Yes, that was noted somewhere on this thread.

Maybe it would be better if pg_config can output this information, to be
consistent with the output when building with `./configure` and `make`.

The output when building with `./configure` and `make`:
$ pg_config --configure
'--prefix=/home/postgres/install/' '--cache' 'gcc.cache' '--enable-dtrace' '--

with-icu' '--enable-cassert'

It'd be a fair amount of work, both initially and to maintain it, to generate
something compatible. I can see some benefit in showing some feature
influencing output in --configure, but compatible output doesn't seem worth it
to me.

I agree that there are some benefits to showing that, which helps to confirm the
build options. Although that can be confirmed from the compile log, but the log
may not be available all the time.

And it's ok for me that the output is not exactly the same as before.

Regards,
Shi yu

#381Tom Lane
tgl@sss.pgh.pa.us
In reply to: shiy.fnst@fujitsu.com (#380)
Re: [RFC] building postgres with meson - v13

"shiy.fnst@fujitsu.com" <shiy.fnst@fujitsu.com> writes:

On Fri, Oct 14, 2022 12:40 AM Andres Freund <andres@anarazel.de> wrote:

It'd be a fair amount of work, both initially and to maintain it, to generate
something compatible. I can see some benefit in showing some feature
influencing output in --configure, but compatible output doesn't seem worth it
to me.

And it's ok for me that the output is not exactly the same as before.

Yeah, the output doesn't have to be exactly the same. But it had better
show all the options influencing the compilation, or else we will be
looking for other ways to reconstruct that information.

regards, tom lane

#382Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#381)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-10-13 23:35:14 -0400, Tom Lane wrote:

"shiy.fnst@fujitsu.com" <shiy.fnst@fujitsu.com> writes:

On Fri, Oct 14, 2022 12:40 AM Andres Freund <andres@anarazel.de> wrote:

It'd be a fair amount of work, both initially and to maintain it, to generate
something compatible. I can see some benefit in showing some feature
influencing output in --configure, but compatible output doesn't seem worth it
to me.

And it's ok for me that the output is not exactly the same as before.

Yeah, the output doesn't have to be exactly the same.

Seems like we should have a different pg_config flag for meson options than
for configure, and perhaps separately an option to show the buildsystem?

Maybe --buildsystem -> autoconf|meson, --configure -> existing CONFIGURE_ARGS
for autoconf, empty otherwise, --meson-options -> meson options?

Greetings,

Andres Freund

#383Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#382)
Re: [RFC] building postgres with meson - v13

Andres Freund <andres@anarazel.de> writes:

Seems like we should have a different pg_config flag for meson options than
for configure, and perhaps separately an option to show the buildsystem?

Yeah, probably a good idea, given that shoving the options for one
buildsystem into the other isn't likely to work.

regards, tom lane

#384Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#361)
Re: [RFC] building postgres with meson - v13

From 680ff3f7b4da1dbf21d0c7cd87af9bb5ee8b230c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 20:36:36 -0700
Subject: [PATCH v17 01/23] meson: ci: wip: move compilerwarnings task to meson

---
.cirrus.yml | 92 +++++++++++++-------------
src/tools/ci/linux-mingw-w64-64bit.txt | 13 ++++
2 files changed, 59 insertions(+), 46 deletions(-)
create mode 100644 src/tools/ci/linux-mingw-w64-64bit.txt

diff --git a/.cirrus.yml b/.cirrus.yml
index 7b5cb021027..eb33fdc4855 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -465,6 +465,10 @@ task:
ccache_cache:
folder: $CCACHE_DIR
+  ccache_stats_start_script:
+    ccache -s
+    ccache -z

I realized that ccache -z clears out not only the global stats, but the
per-file cache stats (from which the global stats are derived) - which
obviously makes the cache work poorly.

Newer ccache has CCACHE_STATSLOG, and --show-log-stats, which I think
can do what's wanted. I'll update my ci branch with that.

#385Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#257)
Re: [RFC] building postgres with meson - v12

On Sun, Aug 28, 2022 at 01:37:41PM -0700, Andres Freund wrote:

You're running tap tests via a python script. There's no problem with
that, but it's different from what's done by the existing makefiles.
I was able to remove the python indirection - maybe that's better to
talk about on the CI thread? That moves some setup for TAP tests
(TESTDIR, PATH, cd) from Makefile into the existing perl, which means
less duplication.

I'm doubtful it's worth removing. You'd need to move removing the files from
the last run into both pg_regress and the tap test infrastructure. And I do
think it's nice to afterwards have markers which tests failed, so we can only
collect their logs.

Are you planning on putting something in place to remove (or allow
removing) logs for successful tests ? Is that primarily for cirrus, or
buildfarm or ??

It is wasteful to upload thousdands of logfiles to show a single
failure. That would make our cirrus tasks faster - compressing and
uploading the logs takes over a minute.

It's also a lot friendlier to show fewer than 8 pages of test folders to
search through to find the one that failed.

--
Justin

#386Andres Freund
andres@anarazel.de
In reply to: Justin Pryzby (#385)
Re: [RFC] building postgres with meson - v12

Hi,

On 2022-11-14 17:16:46 -0600, Justin Pryzby wrote:

On Sun, Aug 28, 2022 at 01:37:41PM -0700, Andres Freund wrote:

You're running tap tests via a python script. There's no problem with
that, but it's different from what's done by the existing makefiles.
I was able to remove the python indirection - maybe that's better to
talk about on the CI thread? That moves some setup for TAP tests
(TESTDIR, PATH, cd) from Makefile into the existing perl, which means
less duplication.

I'm doubtful it's worth removing. You'd need to move removing the files from
the last run into both pg_regress and the tap test infrastructure. And I do
think it's nice to afterwards have markers which tests failed, so we can only
collect their logs.

Are you planning on putting something in place to remove (or allow
removing) logs for successful tests ? Is that primarily for cirrus, or
buildfarm or ??

What I'd like to do is to add a 'collect-logs-for-failed-test's script and/or
target that moves those logs into a different folder. By default we'd then
collect all the files from that different folder in CI. I think that's better
than removing logs for successful tests.

I'd like to use the same script for the BF as well - we've had too many cases
where we had to adjust things in multiple places / code-bases.

Perhaps we could also use that test to print the list of relevant logfiles at
the end of a "local" testrun?

It is wasteful to upload thousdands of logfiles to show a single
failure. That would make our cirrus tasks faster - compressing and
uploading the logs takes over a minute.

It's also a lot friendlier to show fewer than 8 pages of test folders to
search through to find the one that failed.

Indeed.

Greetings,

Andres Freund

#387Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#328)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-22 04:29:15 -0400, Andrew Dunstan wrote:

Now I'll start on buildfarm support. Given my current commitments, this will
take me a while, but I hope to have a working client by about the beginning
of November.

Just checking: Any progress on this? Anything I can help with?

I'd like to move towards dropping src/tools/msvc at some point not too far
away, and we can't do so before having buildfarm support. I was just reminded
of this by looking at the windows-arm support patch...

Greetings,

Andres Freund

#388Andres Freund
andres@anarazel.de
In reply to: Peter Geoghegan (#360)
1 attachment(s)
Re: [RFC] building postgres with meson - v13

Hi,

On 2022-09-26 14:15:35 -0700, Peter Geoghegan wrote:

On Mon, Sep 26, 2022 at 1:27 PM Andres Freund <andres@anarazel.de> wrote:

Some feedback:
* I gather that "running" as it appears in commands like "meson test
--setup running" refers to a particular setup named "running", that
you invented as part of creating a meson-ish substitute for
installcheck. Can "running" be renamed to something that makes it
obvious that it's a Postgres thing, and not a generic meson thing?

Yes. The only caveat is that it makes lines longer, because it's included in
the printed test line (there's no real requirement to have the test suite and
the setup named the same,b ut it seems confusing not to)

Probably doesn't have to be too long. And I'm not sure of the details.
Just a small thing from my point of view.

Attached is an updated version of that patch. I left the name as 'running'
because a postgres- or pg- prefix felt to awkward. This just adds fairly
minimal documentation for the 'running' setup, while we now have some basic
docs for building with meson, we don't yet have a "translation" of
regress.sgml. Not sure how to structure that best, either.

I plan to commit that soon. This likely isn't the be-all-end-all, but it's
quite useful as-is.

Greetings,

Andres Freund

Attachments:

v2-0001-meson-Add-running-test-setup-as-a-replacement-for.patchtext/x-diff; charset=us-asciiDownload
From a50cc9ac3045b0ef1cfd3cc76b3ff5759bdb85ef Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 6 Dec 2022 19:24:44 -0800
Subject: [PATCH v2] meson: Add 'running' test setup, as a replacement for
 installcheck

To run all tests that support running against existing server:
$ meson test --setup running

To run just the main pg_regress tests against existing server:
$ meson test --setup running regress-running/regress

To ensure the 'running' setup continues to work, test it as part of the
freebsd CI task.

Discussion: https://postgr.es/m/CAH2-Wz=XDQcmLoo7RR_i6FKQdDmcyb9q5gStnfuuQXrOGhB2sQ@mail.gmail.com
---
 meson.build                                   | 91 ++++++++++++++++---
 contrib/basic_archive/meson.build             |  3 +
 contrib/pg_freespacemap/meson.build           |  3 +
 contrib/pg_stat_statements/meson.build        |  4 +
 contrib/pg_walinspect/meson.build             |  3 +
 contrib/test_decoding/meson.build             |  5 +
 src/interfaces/ecpg/test/meson.build          |  1 +
 doc/src/sgml/installation.sgml                |  6 ++
 .cirrus.yml                                   | 15 +++
 src/test/isolation/meson.build                |  1 +
 src/test/modules/commit_ts/meson.build        |  3 +
 src/test/modules/snapshot_too_old/meson.build |  3 +
 src/test/modules/test_oat_hooks/meson.build   |  1 +
 src/test/modules/test_pg_dump/meson.build     |  2 +
 src/test/modules/test_slru/meson.build        |  1 +
 src/test/modules/worker_spi/meson.build       |  4 +-
 src/test/regress/meson.build                  |  1 +
 17 files changed, 132 insertions(+), 15 deletions(-)

diff --git a/meson.build b/meson.build
index 39fc3ddab26..3cb50c0b172 100644
--- a/meson.build
+++ b/meson.build
@@ -2920,6 +2920,20 @@ endif
 # Test Generation
 ###############################################################
 
+# When using a meson version understanding exclude_suites, define a
+# 'tmp_install' test setup (the default) that excludes tests running against a
+# pre-existing install and a 'running' setup that conflicts with creation of
+# the temporary installation and tap tests (which don't support running
+# against a running server).
+
+running_suites = []
+install_suites = []
+if meson.version().version_compare('>=0.57')
+  runningcheck = true
+else
+  runningcheck = false
+endif
+
 testwrap = files('src/tools/testwrap')
 
 foreach test_dir : tests
@@ -2927,7 +2941,6 @@ foreach test_dir : tests
     testwrap,
     '--basedir', meson.build_root(),
     '--srcdir', test_dir['sd'],
-    '--testgroup', test_dir['name'],
   ]
 
   foreach kind, v : test_dir
@@ -2940,55 +2953,94 @@ foreach test_dir : tests
     if kind in ['regress', 'isolation', 'ecpg']
       if kind == 'regress'
         runner = pg_regress
+        fallback_dbname = 'regression_@0@'
       elif kind == 'isolation'
         runner = pg_isolation_regress
+        fallback_dbname = 'isolation_regression_@0@'
       elif kind == 'ecpg'
         runner = pg_regress_ecpg
+        fallback_dbname = 'ecpg_regression_@0@'
       endif
 
-      test_output = test_result_dir / test_dir['name'] / kind
+      test_group = test_dir['name']
+      test_group_running = test_dir['name'] + '-running'
 
-      test_command = [
+      test_output = test_result_dir / test_group / kind
+      test_output_running = test_result_dir / test_group_running/ kind
+
+      # Unless specified by the test, choose a non-conflicting database name,
+      # to avoid conflicts when running against existing server.
+      dbname = t.get('dbname',
+        fallback_dbname.format(test_dir['name']))
+
+      test_command_base = [
         runner.full_path(),
         '--inputdir', t.get('inputdir', test_dir['sd']),
         '--expecteddir', t.get('expecteddir', test_dir['sd']),
-        '--outputdir', test_output,
-        '--temp-instance', test_output / 'tmp_check',
         '--bindir', '',
         '--dlpath', test_dir['bd'],
         '--max-concurrent-tests=20',
-        '--port', testport.to_string(),
+        '--dbname', dbname,
       ] + t.get('regress_args', [])
 
+      test_selection = []
       if t.has_key('schedule')
-        test_command += ['--schedule', t['schedule'],]
+        test_selection += ['--schedule', t['schedule'],]
       endif
 
       if kind == 'isolation'
-        test_command += t.get('specs', [])
+        test_selection += t.get('specs', [])
       else
-        test_command += t.get('sql', [])
+        test_selection += t.get('sql', [])
       endif
 
       env = test_env
       env.prepend('PATH', temp_install_bindir, test_dir['bd'])
 
       test_kwargs = {
-        'suite': [test_dir['name']],
         'priority': 10,
         'timeout': 1000,
         'depends': test_deps + t.get('deps', []),
         'env': env,
       } + t.get('test_kwargs', {})
 
-      test(test_dir['name'] / kind,
+      test(test_group / kind,
         python,
-        args: testwrap_base + [
+        args: [
+          testwrap_base,
+          '--testgroup', test_group,
           '--testname', kind,
-          '--', test_command,
+          '--',
+          test_command_base,
+          '--outputdir', test_output,
+          '--temp-instance', test_output / 'tmp_check',
+          '--port', testport.to_string(),
+          test_selection,
         ],
+        suite: test_group,
         kwargs: test_kwargs,
       )
+      install_suites += test_group
+
+      # some tests can't support running against running DB
+      if runningcheck and t.get('runningcheck', true)
+        test(test_group_running / kind,
+          python,
+          args: [
+            testwrap_base,
+            '--testgroup', test_group_running,
+            '--testname', kind,
+            '--',
+            test_command_base,
+            '--outputdir', test_output_running,
+            test_selection,
+          ],
+          is_parallel: t.get('runningcheck-parallel', true),
+          suite: test_group_running,
+          kwargs: test_kwargs,
+        )
+        running_suites += test_group_running
+      endif
 
       testport += 1
     elif kind == 'tap'
@@ -3011,9 +3063,10 @@ foreach test_dir : tests
         env.set(name, value)
       endforeach
 
+      test_group = test_dir['name']
       test_kwargs = {
         'protocol': 'tap',
-        'suite': [test_dir['name']],
+        'suite': test_group,
         'timeout': 1000,
         'depends': test_deps + t.get('deps', []),
         'env': env,
@@ -3033,12 +3086,14 @@ foreach test_dir : tests
           python,
           kwargs: test_kwargs,
           args: testwrap_base + [
+            '--testgroup', test_dir['name'],
             '--testname', onetap_p,
             '--', test_command,
             test_dir['sd'] / onetap,
           ],
         )
       endforeach
+      install_suites += test_group
     else
       error('unknown kind @0@ of test in @1@'.format(kind, test_dir['sd']))
     endif
@@ -3047,6 +3102,14 @@ foreach test_dir : tests
 
 endforeach # directories with tests
 
+# repeat condition so meson realizes version dependency
+if meson.version().version_compare('>=0.57')
+  add_test_setup('tmp_install',
+    is_default: true,
+    exclude_suites: running_suites)
+  add_test_setup('running',
+    exclude_suites: ['setup'] + install_suites)
+endif
 
 
 ###############################################################
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
index c30dcfa5d41..08d72598e9d 100644
--- a/contrib/basic_archive/meson.build
+++ b/contrib/basic_archive/meson.build
@@ -25,5 +25,8 @@ tests += {
     'regress_args': [
       '--temp-config', files('basic_archive.conf'),
     ],
+    # Disabled because these tests require "shared_preload_libraries=basic_archive",
+    # which typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index 904b37b6e9b..f802e297b67 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -33,5 +33,8 @@ tests += {
     'regress_args': [
       '--temp-config', files('pg_freespacemap.conf')
     ],
+    # Disabled because these tests require "autovacuum=off", which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index 854df138e76..bd0e42331eb 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -41,5 +41,9 @@ tests += {
       'pg_stat_statements',
     ],
     'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+    # Disabled because these tests require
+    # "shared_preload_libraries=pg_stat_statements", which typical
+    # runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
index 4314a3182a2..351f184de83 100644
--- a/contrib/pg_walinspect/meson.build
+++ b/contrib/pg_walinspect/meson.build
@@ -28,6 +28,9 @@ tests += {
     'sql': [
       'pg_walinspect',
     ],
+    # Disabled because these tests require "wal_level=replica", which
+    # some runningcheck users do not have (e.g. buildfarm clients).
     'regress_args': ['--temp-config', files('walinspect.conf')],
+    'runningcheck': false,
   },
 }
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
index 6876792fd86..65dfd3f7d88 100644
--- a/contrib/test_decoding/meson.build
+++ b/contrib/test_decoding/meson.build
@@ -43,6 +43,9 @@ tests += {
     'regress_args': [
       '--temp-config', files('logical.conf'),
     ],
+    # Disabled because these tests require "wal_level=logical", which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
   'isolation': {
     'specs': [
@@ -61,6 +64,8 @@ tests += {
     'regress_args': [
       '--temp-config', files('logical.conf'),
     ],
+    # see above
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index 94b26d10314..d4f1f1c0fcf 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -84,6 +84,7 @@ tests += {
     'test_kwargs': {
       'depends': ecpg_test_dependencies,
     },
+    'dbname': 'ecpg1_regression,ecpg2_regression',
     'regress_args': ecpg_regress_args,
   },
 }
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 9c7f019392e..f64f3290447 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -2108,6 +2108,12 @@ ninja
     detailed information about interpreting the test results. You can
     repeat this test at any later time by issuing the same command.
    </para>
+
+   <para>
+    To run pg_regress and pg_isolation_regress tests against a running
+    postgres instance, specify <userinput>--setup running</userinput> as an
+    argument to <userinput>meson test</userinput>.
+   </para>
   </step>
 
   <step id="meson-install">
diff --git a/.cirrus.yml b/.cirrus.yml
index f31923333ef..0113799a6e2 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -195,6 +195,21 @@ task:
       meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
     EOF
 
+  # test runningcheck, freebsd chosen because it's currently fast enough
+  test_running_script: |
+    su postgres <<-EOF
+      set -e
+      ulimit -c unlimited
+      meson test $MTEST_ARGS --quiet --suite setup
+      export LD_LIBRARY_PATH="$(pwd)/build/tmp_install/usr/local/pgsql/lib/:$LD_LIBRARY_PATH"
+      mkdir -p build/testrun
+      build/tmp_install/usr/local/pgsql/bin/initdb -N build/runningcheck --no-instructions -A trust
+      echo "include '$(pwd)/src/tools/ci/pg_ci_base.conf'" >> build/runningcheck/postgresql.conf
+      build/tmp_install/usr/local/pgsql/bin/pg_ctl -c -o '-c fsync=off' -D build/runningcheck -l build/testrun/runningcheck.log start
+      meson test $MTEST_ARGS --num-processes ${TEST_JOBS} --setup running
+      build/tmp_install/usr/local/pgsql/bin/pg_ctl -D build/runningcheck stop
+    EOF
+
   on_failure:
     <<: *on_failure_meson
     cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
index e2ed400a80a..a999791876a 100644
--- a/src/test/isolation/meson.build
+++ b/src/test/isolation/meson.build
@@ -67,5 +67,6 @@ tests += {
       'priority': 40,
       'timeout': 1000,
     },
+    'dbname': 'isolation_regression',
   },
 }
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
index 60cb12164d2..fa86e70e880 100644
--- a/src/test/modules/commit_ts/meson.build
+++ b/src/test/modules/commit_ts/meson.build
@@ -6,6 +6,9 @@ tests += {
     'sql': [
       'commit_timestamp',
     ],
+    # Disabled because these tests require "track_commit_timestamp = on",
+    # which typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
index efd3f1f113b..5094b52949b 100644
--- a/src/test/modules/snapshot_too_old/meson.build
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -10,5 +10,8 @@ tests += {
       'sto_using_hash_index',
     ],
     'regress_args': ['--temp-config', files('sto.conf')],
+    # Disabled because these tests require "old_snapshot_threshold" >= 0, which
+    # typical runningcheck users do not have (e.g. buildfarm clients).
+    'runningcheck': false,
   },
 }
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
index 8802bbbac55..e9d09d92c30 100644
--- a/src/test/modules/test_oat_hooks/meson.build
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -25,5 +25,6 @@ tests += {
       'test_oat_hooks',
     ],
     'regress_args': ['--no-locale', '--encoding=UTF8'],
+    'runningcheck': false,
   },
 }
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
index 41021829f3a..73f1fcf9428 100644
--- a/src/test/modules/test_pg_dump/meson.build
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -13,6 +13,8 @@ tests += {
     'sql': [
       'test_pg_dump',
     ],
+    # doesn't delete its user
+    'runningcheck': false,
   },
   'tap': {
     'tests': [
diff --git a/src/test/modules/test_slru/meson.build b/src/test/modules/test_slru/meson.build
index ca4633c793e..74dacd11ac8 100644
--- a/src/test/modules/test_slru/meson.build
+++ b/src/test/modules/test_slru/meson.build
@@ -31,5 +31,6 @@ tests += {
       'test_slru',
     ],
     'regress_args': ['--temp-config', files('test_slru.conf')],
+    'runningcheck': false,
   },
 }
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index a4a158c75b9..660d721eea9 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -30,6 +30,8 @@ tests += {
     'sql': [
       'worker_spi',
     ],
-    'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+    'dbname': 'contrib_regression',
+    'regress_args': ['--temp-config', files('dynamic.conf')],
+    'runningcheck': false,
   },
 }
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index 72a23737fa7..fbca624948b 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -75,5 +75,6 @@ tests += {
       'priority': 50,
       'timeout': 1000,
     },
+    'dbname': 'regression',
   },
 }
-- 
2.38.0

#389Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#361)
Re: [RFC] building postgres with meson - v13

From 680ff3f7b4da1dbf21d0c7cd87af9bb5ee8b230c Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 21 Sep 2022 20:36:36 -0700
Subject: [PATCH v17 01/23] meson: ci: wip: move compilerwarnings task to meson

always:
gcc_warning_script: |
-      time ./configure \
-        --cache gcc.cache \
-        --enable-dtrace \
-        ${LINUX_CONFIGURE_FEATURES} \
-        CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang"
-      make -s -j${BUILD_JOBS} clean
-      time make -s -j${BUILD_JOBS} world-bin
+      mkdir build && cd build
+      CC="ccache gcc" CXX="ccache g++" \
+        meson setup \
+          -Dwerror=true \
+          -Dcassert=false \
+          -Ddtrace=enabled \
+          ${LINUX_MESON_FEATURES} \
+          ..
+      time ninja -j${BUILD_JOBS}

With gcc, autoconf uses -O2, so I think this should specify
buildtype=debugoptimized, or pass -Doptimization=2. Otherwise it ends
up in release mode with -O3.

#390Greg Stark
stark@mit.edu
In reply to: Peter Eisentraut (#159)
Re: [RFC] building postgres with meson -v8

On Wed, 11 May 2022 at 06:19, Peter Eisentraut
<peter.eisentraut@enterprisedb.com> wrote:

After that, these configure options don't have an equivalent yet:

--enable-profiling

Afaics this still doesn't exist? Is there a common idiom to enable
this? Like, if I add in something to cflags is that enough? I seem to
recall we had some hack to actually get each backend's gmon.out to not
step on each other's which needed an explicit flag to enable?

--
greg

#391Andres Freund
andres@anarazel.de
In reply to: Greg Stark (#390)
Re: [RFC] building postgres with meson -v8

Hi,

On 2023-04-14 11:58:42 -0400, Greg Stark wrote:

On Wed, 11 May 2022 at 06:19, Peter Eisentraut
<peter.eisentraut@enterprisedb.com> wrote:

After that, these configure options don't have an equivalent yet:

--enable-profiling

Afaics this still doesn't exist? Is there a common idiom to enable
this? Like, if I add in something to cflags is that enough?

Yes. Or, well, you might also need to specify it when linking.

I seem to recall we had some hack to actually get each backend's gmon.out to
not step on each other's which needed an explicit flag to enable?

I think that's enabled by default in gcc these days, if supported by the
platform?

TBH, I really don't see the point of this style of profiling. It doesn't
provide an accurate view of where time is spent. You're much better off using
performance counter driven profiling with perf et al.

Greetings,

Andres Freund

#392Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#294)
Re: [RFC] building postgres with meson - v12

Hi,

Small update for posterity:

On 2022-09-09 16:58:36 -0700, Andres Freund wrote:

I've run this through enough attempts by now that I'm quite confident that the
problem does not occur when the errormode does not include
SEM_NOOPENFILEERRORBOX. I'll want a few more runs to be certain, but...

Given that the problem appears to happen after _exit() is called, and only
when SEM_NOOPENFILEERRORBOX is not set, it seems likely to be an OS / C
runtime bug. Presumably it's related to something that python does first, but
I don't see how anything could justify crashing only if SEM_NOOPENFILEERRORBOX
is set (rather than the opposite).

These SEM_NOOPENFILEERRORBOX references should have been SEM_NOGPFAULTERRORBOX
- I guess after staring at these names for a while, I couldn't quite see the
difference anymore.

Greetings,

Andres Freund